[med-svn] [pyscanfcs] 01/08: Imported Upstream version 0.2.2

Alex Mestiashvili malex-guest at moszumanska.debian.org
Tue Jun 17 09:06:33 UTC 2014


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

malex-guest pushed a commit to branch master
in repository pyscanfcs.

commit c9db3861670afc57461acfceb40de0f579794317
Author: Alexandre Mestiashvili <alex at biotec.tu-dresden.de>
Date:   Thu Jun 12 09:51:42 2014 +0200

    Imported Upstream version 0.2.2
---
 .gitignore                                         |   62 +
 .gitmodules                                        |    0
 ChangeLog.txt                                      |   22 +
 MANIFEST.in                                        |    7 +
 PyScanFCS_doc.pdf                                  |  Bin 0 -> 452087 bytes
 README.md                                          |   25 +
 Readme.txt                                         |   14 +
 bin/pyscanfcs                                      |   18 +
 doc/Bibliography.bib                               |   82 +
 doc/Images/1color1focus.pdf                        |  Bin 0 -> 19382 bytes
 doc/Images/GUV.pdf                                 |  Bin 0 -> 65389 bytes
 doc/Images/GUV.svg                                 | 1697 ++++++++++++++++
 doc/Images/GUV_1_5guvb.png                         |  Bin 0 -> 46031 bytes
 doc/Images/PyScanFCS_Main.png                      |  Bin 0 -> 111063 bytes
 doc/Images/PyScanFCS_icon.png                      |  Bin 0 -> 9697 bytes
 doc/Images/PyScanFCS_icon.svg                      |  129 ++
 doc/Images/PyScanFCS_icon_dark.svg                 |  136 ++
 doc/Images/PyScanFCS_logo.svg                      |  136 ++
 doc/Images/PyScanFCS_logo_dark.pdf                 |  Bin 0 -> 9941 bytes
 doc/Images/PyScanFCS_logo_dark.png                 |  Bin 0 -> 4353 bytes
 doc/Images/PyScanFCS_logo_dark.svg                 |  143 ++
 doc/Images/SFCSmodi.pdf                            |  Bin 0 -> 38922 bytes
 doc/Images/SFCSmodi.svg                            |  688 +++++++
 doc/Images/alexA.pdf                               |  Bin 0 -> 22569 bytes
 doc/Images/alexA_orig.pdf                          |  Bin 0 -> 22482 bytes
 doc/Images/alexB.pdf                               |  Bin 0 -> 21416 bytes
 doc/Images/alexB_orig.pdf                          |  Bin 0 -> 21770 bytes
 doc/PyScanFCS_doc.tex                              |  155 ++
 doc/PyScanFCS_doc_content.tex                      |  216 ++
 misc/ExampleFunc_Exp_correlated_noise.txt          |   24 +
 misc/MakeTestDat_SFCS.py                           |  190 ++
 misc/README.md                                     |   12 +
 misc/binningc.pyx                                  |  201 ++
 misc/dat2csv.py                                    |  143 ++
 misc/setup.py                                      |   18 +
 pyinstaller-howto/PyScanFCS.icns                   |  Bin 0 -> 114820 bytes
 pyinstaller-howto/PyScanFCS.ico                    |  Bin 0 -> 270398 bytes
 pyinstaller-howto/PyScanFCS_linux.spec             |   18 +
 pyinstaller-howto/PyScanFCS_mac.spec               |   25 +
 pyinstaller-howto/PyScanFCS_win.spec               |   21 +
 pyinstaller-howto/README.md                        |   22 +
 pyinstaller-howto/macOSx_10.6.8_bundle_script.sh   |   24 +
 pyinstaller-howto/macOSx_script_starter.sh         |   12 +
 .../ubuntu12.04_amd64_bundle_script.sh             |   42 +
 .../windowsXP_32bit_bundle_script.bat              |    4 +
 pyscanfcs/PyScanFCS.py                             | 2123 ++++++++++++++++++++
 pyscanfcs/SFCSnumeric.pyx                          |  308 +++
 pyscanfcs/__init__.py                              |   35 +
 pyscanfcs/__main__.py                              |   34 +
 pyscanfcs/doc.py                                   |  183 ++
 pyscanfcs/edclasses.py                             |  100 +
 pyscanfcs/icon.py                                  |  191 ++
 pyscanfcs/misc.py                                  |  212 ++
 setup.cfg                                          |    5 +
 setup.py                                           |   74 +
 55 files changed, 7551 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..765c6b4
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,62 @@
+*.py[cod]
+
+# C extensions
+*.so
+
+# Packages
+*.egg
+*.egg-info
+dist
+build
+eggs
+parts
+bin
+var
+sdist
+develop-eggs
+.installed.cfg
+lib
+lib64
+
+# Installer logs
+pip-log.txt
+
+# Unit test / coverage reports
+.coverage
+.tox
+nosetests.xml
+
+# Translations
+*.mo
+
+# Mr Developer
+.mr.developer.cfg
+.project
+.pydevproject
+
+
+#Latex
+*.aux
+*.glo
+*.idx
+*.log
+*.toc
+*.ist
+*.acn
+*.acr
+*.alg
+*.bbl
+*.blg
+*.dvi
+*.glg
+*.gls
+*.ilg
+*.ind
+*.lof
+*.lot
+*.maf
+*.mtc
+*.mtc1
+*.out
+*.synctex.gz
+*.pdf
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..e69de29
diff --git a/ChangeLog.txt b/ChangeLog.txt
new file mode 100755
index 0000000..ec5bdc9
--- /dev/null
+++ b/ChangeLog.txt
@@ -0,0 +1,22 @@
+0.2.2
+ - Added button 'full time interval'
+ - This is the first version that uses the external module `multipletau`
+ - This is the first version that is available at PyPI
+ - Added setup files with Cython support
+ - MakeTestDat_FCS.py can be used to create test data
+ - Tested with Mac OSx
+0.2.1
+ - Updated help menu (documentation, wiki, update)
+ - Performed some artwork around PyScanFCS
+ - Output of bleaching correction data (#1)
+ - Code cleanup
+0.2.0
+ - Code cleanup
+ - Considerable speed-up in binning of .dat files
+ - Secured compatibility with PyCorrFit (.csv files)
+ - Fixed small file-naming bug
+0.1.9
+ - Code cleanup
+ - Moved to Python 2.7
+0.1.8
+ - Initital GitHub commit
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..963e634
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,7 @@
+include doc/*.tex
+include doc/*.bib
+include pyscanfcs/*.pyx
+include doc/Images/*
+include Readme.txt
+include ChangeLog.txt
+include PyScanFCS_doc.pdf
diff --git a/PyScanFCS_doc.pdf b/PyScanFCS_doc.pdf
new file mode 100644
index 0000000..db50648
Binary files /dev/null and b/PyScanFCS_doc.pdf differ
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..66425f8
--- /dev/null
+++ b/README.md
@@ -0,0 +1,25 @@
+![PyScanFCS](https://raw.github.com/paulmueller/PyScanFCS/master/doc-src/Images/PyScanFCS_logo_dark.png)
+=========
+
+This repository contains the source code of PyScanFCS - a tool for data evaluation
+in perpendicular line scanning fluorescence correlation spectroscopy (FCS).
+
+When a membrane is scanned perpendicularly to its surface, the fluorescence signal
+originating from the membrane itself must be separated from the signal of the
+surrounding medium for an FCS analysis. PyScanFCS interactively extracts the
+fluctuating fluorescence signal from such measurements and applies a multiple-tau
+algorithm. The obtained correlation curves can be evaluated using
+[PyCorrFit](https://github.com/paulmueller/PyCorrFit).
+
+It is possible to create test-data containing exponentially correlated data with
+[MakeTestDat_SFCS.py](https://github.com/paulmueller/multipletau/blob/master/MakeTestDat_SFCS.py).
+The obtained correlation curves can be fitted with
+[PyCorrFit](https://github.com/paulmueller/PyCorrFit) using the
+[appropriate model function](https://github.com/paulmueller/multipletau/blob/master/ExampleFunc_Exp_correlated_noise.txt).
+
+For further information, please visit the PyScanFCS homepage at
+[http://pyscanfcs.craban.de](http://pyscanfcs.craban.de).
+
+- [Download the latest version](https://github.com/paulmueller/PyScanFCS/releases)
+- [Documentation](https://github.com/paulmueller/PyScanFCS/raw/master/PyScanFCS_doc.pdf)
+- [Using Cython on Windows XP](https://github.com/paulmueller/PyScanFCS/wiki/Using-Cython-on-Windows-XP)
diff --git a/Readme.txt b/Readme.txt
new file mode 100644
index 0000000..a6e2f38
--- /dev/null
+++ b/Readme.txt
@@ -0,0 +1,14 @@
+PyCorrFit can be used for analyzing data from perpendicular line
+scanning FCS.
+
+For a full list of features and supported file formats visit http://pyscanfcs.craban.de.
+There are also precompiled binaries for various systems.
+
+This package provides the Python module `pyscanfcs` and its graphical user interface. The 
+graphical user interface is written in wxPython.
+
+Installation and usage:
+
+    pip install pyscanfcs  
+    
+    python -m pyscanfcs
diff --git a/bin/pyscanfcs b/bin/pyscanfcs
new file mode 100755
index 0000000..f1be3df
--- /dev/null
+++ b/bin/pyscanfcs
@@ -0,0 +1,18 @@
+#!/bin/sh
+# go to script directory (necessary for relative paths with pip)
+cd $(dirname "$0")
+# debian
+if [ -f "/usr/share/pyshared/pyscanfcs/PyScanFCS.py" ]
+then
+    python /usr/share/pyshared/pyscanfcs/PyScanFCS.py
+elif [ -f "/usr/local/lib/python2.7/dist-packages/pyscanfcs/PyScanFCS.py" ]
+# pip
+then
+    python /usr/local/lib/python2.7/dist-packages/pyscanfcs/PyScanFCS.py
+# pip and virtualenv
+elif [ -f "../lib/python2.7/site-packages/pyscanfcs/PyScanFCS.py" ]
+then
+    python ../lib/python2.7/site-packages/pyscanfcs/PyScanFCS.py
+else
+    echo "Could not find PyScanFCS. Please notify the author."
+fi
diff --git a/doc/Bibliography.bib b/doc/Bibliography.bib
new file mode 100644
index 0000000..8a3aa6f
--- /dev/null
+++ b/doc/Bibliography.bib
@@ -0,0 +1,82 @@
+% This file was created with JabRef 2.10b2.
+% Encoding: UTF-8
+
+
+ at InCollection{Mueller2014,
+  Title                    = {Scanning Fluorescence Correlation Spectroscopy ({SFCS}) with a Scan Path Perpendicular to the Membrane Plane},
+  Author                   = {M{\"{u}}ller, Paul and Schwille, Petra and Weidemann, Thomas},
+  Booktitle                = {Fluorescence Spectroscopy and Microscopy},
+  Publisher                = {Humana Press},
+  Year                     = {2014},
+  Editor                   = {Engelborghs, Yves and Visser, Antonie J.W.G.},
+  Pages                    = {635-651},
+  Series                   = {Methods in Molecular Biology},
+  Volume                   = {1076},
+
+  __markedentry            = {[paul:]},
+  Doi                      = {10.1007/978-1-62703-649-8_29},
+  ISBN                     = {978-1-62703-648-1},
+  Keywords                 = {Scanning fluorescence correlation spectroscopy (SFCS); Fluorescence correlation spectroscopy (FCS); Fluorescence cross-correlation spectroscopy (FCCS); Membrane diffusion; Giant unilamellar vesicles (GUV); Diffusion; Protein–protein interaction; Ligand binding},
+  Language                 = {English},
+  Owner                    = {paul},
+  Timestamp                = {2013.10.21},
+  Url                      = {http://pyscanfcs.craban.de}
+}
+
+ at Article{Mueller2014a,
+  Title                    = {PyCorrFit – generic data evaluation for fluorescence correlation spectroscopy},
+  Author                   = {M{\"{u}}ller, Paul and Schwille, Petra and Weidemann, Thomas},
+  Journal                  = {Bioinformatics},
+  Year                     = {2014},
+
+  __markedentry            = {[paul:6]},
+  Abstract                 = {Summary:
+We present a graphical user interface (PyCorrFit) for the fitting of theoretical model functions to experimental data obtained by fluorescence correlation spectroscopy (FCS). The program supports many data file formats and features a set of tools specialized in FCS data evaluation.
+
+Availability and Implementation:
+The Python source code is freely available for download from the PyCorrFit web page at http://pycorrfit.craban.de. We offer binaries for Ubuntu Linux, Mac OS X, and Microsoft Windows.
+
+Contact:
+paul.mueller at biotec.tu-dresden.de and weidemann at biochem.mpg.de
+
+Supplementary information:
+Supplementary information and a documentation are available at the PyCorrFit web page.},
+  Doi                      = {10.1093/bioinformatics/btu328},
+  Eprint                   = {http://bioinformatics.oxfordjournals.org/content/early/2014/05/13/bioinformatics.btu328.full.pdf+html},
+  Owner                    = {paul},
+  Timestamp                = {2014.05.14},
+  Url                      = {pycorrfit.craban.de}
+}
+
+ at Article{Ries2009,
+  Title                    = {Accurate Determination of Membrane Dynamics with Line-Scan FCS},
+  Author                   = {Jonas Ries and Salvatore Chiantia and Petra Schwille},
+  Journal                  = {Biophysical Journal},
+  Year                     = {2009},
+  Number                   = {5},
+  Pages                    = {1999 - 2008},
+  Volume                   = {96},
+
+  Doi                      = {10.1016/j.bpj.2008.12.3888},
+  ISSN                     = {0006-3495},
+  Owner                    = {paul},
+  Timestamp                = {2012.11.08}
+}
+
+ at Article{Wohland2001,
+  Title                    = {The Standard Deviation in Fluorescence Correlation Spectroscopy},
+  Author                   = {Wohland, Thorsten and Rigler, Rudolf and Vogel, Horst},
+  Journal                  = {Biophysical Journal},
+  Year                     = {2001},
+
+  Month                    = jun,
+  Number                   = {6},
+  Pages                    = {2987--2999},
+  Volume                   = {80},
+
+  Doi                      = {10.1016/S0006-3495(01)76264-9},
+  ISSN                     = {0006-3495},
+  Owner                    = {paul},
+  Timestamp                = {2012.09.08}
+}
+
diff --git a/doc/Images/1color1focus.pdf b/doc/Images/1color1focus.pdf
new file mode 100755
index 0000000..879ae32
Binary files /dev/null and b/doc/Images/1color1focus.pdf differ
diff --git a/doc/Images/GUV.pdf b/doc/Images/GUV.pdf
new file mode 100755
index 0000000..a6d60c8
Binary files /dev/null and b/doc/Images/GUV.pdf differ
diff --git a/doc/Images/GUV.svg b/doc/Images/GUV.svg
new file mode 100755
index 0000000..99f8b28
--- /dev/null
+++ b/doc/Images/GUV.svg
@@ -0,0 +1,1697 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="1024"
+   height="1139"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.2 r9819"
+   sodipodi:docname="Neues Dokument 1">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3823"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3826"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.35"
+     inkscape:cx="807.14286"
+     inkscape:cy="558.86179"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1267"
+     inkscape:window-height="850"
+     inkscape:window-x="331"
+     inkscape:window-y="65"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Ebene 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(760.57141,128.56638)">
+    <image
+       y="-128.56638"
+       x="-760.57141"
+       id="image3047"
+       xlink:href="data:image/png;base64,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
+er3K5XKanZ11H49hGGpsbFR3d7cSiYRWVlbU3t6uN9980+32v7S05I41fP755/XTn/5Uw8PDWlhY
+0NzcnHK53JpSCJ/Pp8OHD8vr9ercuXOqVqsqFAobTg6QrgdYbrXUw+mPAAAAbh09AADUhdX1ws7Y
+Mydt2unQ/9xzz+nYsWP66KOP9Ktf/UrhcFhtbW06evSo2tvbNTs7q2KxqOHhYV25ckW5XM4NIjgn
+l8FgcE3juNXp284/O5utUCjkNvBbXFxUNpt1N0XUN28/t9PT4F6LRCIaGBjQtWvXVK1W3cCApDXv
+y9XvTa/XK8Mw1NXVpVgspsXFRT300EP67ne/qzNnzujtt9/W0tKS5ufn1dbWpmAwqEgkon379qm9
+vV0//elP3Y19qVRSNptVMBhUR0eH2tvbNTQ0pP7+fs3NzenatWtuycFqlmXJ7/ffMCLxdmyl1wEA
+gK2GAACAbcfZrNxOSrizURkbG5Pf71c0GtXs7Kzy+bzC4bBKpZIikYgikYiSyaRSqZQ6Ozu1f/9+
+lctlHThwQJlMRouLi7p06ZKam5s1MjLi1vF/nscibd/UfNSWx+NRLBZTMplckyXiBJC8Xq8OHDig
+wcHBTZsUSn8YhxmPx1Uul+X1elWtVhUKhdTS0uKWLzglD8FgUI2NjTpx4oT279+vpaUlXblyRSdO
+nHDT8j/66CPF43GtrKxIkkqlkhoaGtyshfVZLc51vb7Xxe1c71ut0SUAAFsNPQAAbDvOZsWZM34r
+nHThcDisr3zlK3rppZe0uLjonkI6J4+5XE6hUEh+v9+tqX744YfV1tamixcv6tChQ5qamtLAwICK
+xeKaWufVNhobB9xtjY2NeuKJJ7S4uHhDd/5yuaxSqaSVlRV3ksBmnDIB27bl8Xjc/gL5fF7ZbFbd
+3d164YUXZJqmVlZW1NPTo46ODg0ODmpoaEjRaNSt3R8cHFRLS4s7XtIJKjhZL8lkcsOxm851XSgU
+1lzXt3O9b7VGlwAAbDVkAADYdlafFJqmKY/Hc8OJn8fjUTgcdmfbS9c3+T6fT93d3dq1a5cmJye1
+d+9eVSoVtbS0aO/evbpw4YJKpZImJiaUzWZVLBb14osvanR0VKOjozJN092glMtldXR0KB6Pa2Fh
+Yc2J5uqxcc4Yua3QxA47y2YZAHd6Er46E8C5bkzTVCgUUnNzs1KplLLZrDwejzwej7LZrEzT1L59
++/SlL31Jtm3r008/VVtbm3w+n+bn53XhwgVFIhE3SFEoFNaUHzg2O+m/k4wfAACwMTIAAGxppmnK
+7/ff0AXdad4XjUbV3t6+psZZkmKxmB5//HGVSiXl83k1Nzdr9+7d8vl8qlarbjaA1+tVKpVSU1OT
+UqmUzp49q0KhoHA4rIaGBiWTSV2+fFmTk5Nus7WDBw+6AYJAIKDl5eUb6plXT7fwer23nbGw/jlg
+44ONONMD1m/y7/QkfHXDwNV9Apzrz9nwFwoFFYtFt7t/Op3W8vKyHnjgAeVyOZ05c0ZTU1PKZrPq
+6enRww8/rNbWVpmmqaamJoXDYTdjIRQKufe92fVBHwwAAO4OMgAAbGmBQECdnZ1uvb70h9NN51Td
+2ZA43cmd+eV79uzR5OSkotGo/viP/1gnTpzQT37yE73zzjtqb2/X3/zN3ygSiejdd9/VwsKCqtWq
+zp49q1QqpWg0Ko/Ho56eHl2+fNk97Wxvb1c6ndbi4qJ7sr++Znm9z3OCSU0zamH9+84paZG0JrBg
+GIZM01QkElGhUFAsFlOpVJJlWXryySfV2dmpnp4e9fb2anl52c0wGB8f1z/90z9Jkh555BEtLi5q
+enranSSwnQJeNB0EAGwnBAAA1NzNOt5vtAH2+Xzq6elRNBrV6OiocrmcDMNQX1+fvvWtb+ndd9/V
++fPnVSgU5PP59LWvfU0vv/yy0um0fvjDH+r8+fPq6+uTaZrKZDIyTVNPPfWUlpaWNDk5qYmJCe3Z
+s0dXrlxRuVx2b985zb/Vzfjd2hiwwUAtrH/frS5r2ajhoHP9Wpalnp4evfTSSxobG9Pw8LB7uu8E
+6To7O3Xx4kW9+OKL+trXvub22PjBD36gjz76SOl0etNRgevXWMsAWa3vHwCA20UJAICaC4fDGhgY
+UCqVcuuOHU4q/eoTQScVOZ1Oy+/3KxQKKRqNKhwO68KFCxobG1OpVFI4HFZjY6MOHjwoSfrd736n
+M2fOKJFIKJPJqFgsanp6WplMRuVyWRcvXtT09LSbzuyM5XMaom20FofX61Vra6u7EXA2ButLF+7E
+djoNxc6x/n23uqxlNb/fr/b2djcAUK1WlcvlNDo6quHhYc3Pz7vTAOLxuBKJhGKxmHbv3q3XXntN
+qVRK7e3t2rNnj/bv3y/DMBSLxdysnlAoJJ/P507rcDISfD6fvF6vOjs7lcvlbpgqcDN3q0knTQcB
+ANsNAQAANWfbtjs67FY+kDsbkWKxqGKx6HYqdxruNTU1qbOzUydPntTRo0d19OhRHT9+XCMjI7p6
+9ap7upjP591O6UtLS24jtUAg4G7iOzo6bmlz0draqhdeeEGzs7Nux/U72Rhs1vMA2Ao2ej87fQgM
+w1BPT48CgYAymYxSqZRb9lKtVmWapgKBgAzDcIMGvb29unbtmj744APNzs6qt7dXjz32mJ588kn5
+fD61trbq4MGDikQi6uvr0/z8vPL5vFtK4Fz7xWLxtq4XJ5vhs8p3bgXXKQBgOyEAAKDmqtXqbX+A
+dzipxbZtKxgM6tlnn9XRo0e1srKi6elp9fb26vTp04pGo/r5z3+usbEx95TS+f/VJ/uhUEiHDh1S
+S0uL4vG4MpmM2+jMWetGisWiZmdntby87G4o7uTx+P3+OzrRxNbi9/vV1dV1w0i7nci5ljo6OvS9
+731PHR0dGhkZcUtwnGBWMBjUgQMH1N7e7jbPXFhYUHd3t0qlkiYnJ5VOpxWLxZTL5eTxeHTt2jWZ
+pqnBwUGNj4+717pt2+40gWAweNsb+c2yGQAA2OnoAQBgyzIMQ5ZluRv11Vaf4BWLRZVKJUWjUR0/
+flz5fN7dgESjUWWzWfX29mpqakorKyuybVumaSoYDLoBBCe12KlRbmxs1MjIiEzT1MDAgEZGRtyM
+g7uR7rvZY6OmeGfo6enR66+/rh/96EeanJys9XLui9VBj8XFxTWTBAzDUFNTk5544gm9/PLLSqVS
+yufzunbtmqrVqk6fPq1kMqldu3YpGAwqEonopZde0nvvvadPP/3UbSzY3d2tq1evampqSpZlKRwO
+q7W1VfF4XMvLy2sCewBudLO/qwDqAxkAALYMp6O4YRiSrjcXW52ma1mWQqGQLMtSW1ubjhw5onA4
+7H5/Y2OjXn/9dbW0tGh0dFRer1flclkNDQ06duyYO/6vWCwqEAho7969ikQi8vv9ymaz7geibDar
+RCKhQqGgcrnszj63bfuubco3S0G+WZ+BerBTTs4LhYLGxsa0sLCwrR/H7bBtW4lEQqlUas172rIs
++Xw+tbe3q1gsqr+/X3v37lWxWNRTTz2ljz/+WIODg4rH4zJNUwcOHFA+n9f4+Lii0ai6urq0b98+
+tbe3y+PxqFKpKJFIqK2tTW1tbVpaWnKnbNxJNgBQT+5m+QuA7YkAAID7xmnctdmHDqdG2OPxuJtx
+wzDcDXEwGNSePXvk9XrV3d2t6elpZbNZNTY2qq+vT+l0WtlsVmfPnnXTiU3T1MGDBxUIBDQ4OOim
+6FcqFaXTaa2srCiVSrnp9oZhqFKprKlddsoT7uamnBTkjXV1den111/X2NiYkslkrZdzx2zbVjKZ
+rPvX19lsFItFpdNpLS0taXBwUGfOnNH8/Lz6+/t17tw5jYyMKJ/PK5fLaWZmRisrKxoYGNBXv/pV
+PfLII+rq6lI+n9cHH3ygiYkJJZNJZbNZpVIpt3loIBBwpxDcj9NNJwOBk1RsJ/ztAUAAAMB94zTu
+KhaLN3z4cE7/nfrearUqr9erxsZG92QvEAi4p/KJREJer1cDAwMaGBiQx+NRPB7X8PCwpqen3e8r
+FotaWlrSyMiI4vG4u9F3NvalUsm9v7vZuf9WcPpyo3o8Od/JnM2G02zTuSa9Xq/b/O/q1atu40zb
+tt36/5aWFv3mN7/Ru+++q0gkopMnT7oBvFKppGKx6Jbx+Hw+HT9+3C01cBoQ3ks3m14CbGX87QHq
+Gz0AANw3hmG4afnOBxDn1D8cDiufz7ub/XQ6rWq1Ksuy5PV69dBDD6m1tVXLy8vavXu3rl69qmQy
+qWQyKdM0VS6X5fV6VSwWtby8LNu23frj29nMr599DuDuWt3nYvX16fx+8Hq98vv96ujocDOA9u7d
+qzfeeEPvvfeeZmdn3QaBpVJJExMTqlarCgQCMk3TnQhyrwNIlmUpGAy64w8BANgOyAAAcF8ZhqFI
+JOKOyfN6verv79fRo0e1sLCgpqYmPfTQQ4rH426DPul69kBTU5MymYxefvlldXR0yO/3a3x8XPl8
+Xslk0h0juPpnVgcaNgsErP5aPaTy3q0Z6MCdWN3nwnkvBoNBGYah5uZmtbS0yDAMvfjii3r11Vfd
+Ep6LFy/q/PnzunbtmsLhsJ5++mkdPXpUmUxGzc3NSqfT2rdvnyzLcstHIpHIXe3dsf5x3On0EgAA
+aoUAAID7xjAMRaNRHTlyRMViUYZhqFQqKZ1Oa35+XpVKRYcOHdL09LSSyaR7qhcKhbRnzx5Fo1FN
+TEzo1KlTOn36tMbGxlQqlZTJZFQqleTxeNTZ2Snbtt0yA2eTsVlq//1O+98KaAKFrcI0TTU0NKin
+p0epVEqZTEbpdFqZTEYTExP6+OOPderUKY2Pj6uhoUFDQ0Nun4hgMKje3l41NDQonU67gYFvf/vb
+mp6eVqlU0vHjx5XL5ZTNZuvm+gYA4GYIAGBb+awmctg6TNOUJHm9XjU3N8swDLW2trrj7QzDUE9P
+j/L5vJqbmyVJu3fv1t/+7d+6zbUqlYqam5u1vLyslZUVxeNxdXd3a2ZmRvPz8yoUCioWi27TL9u2
+lc1mlc/n12zonWyDjd43N/vaTkUTKGwlpVJJqVTK7dvhnNin02klk0lVKhUtLCxocnJShUJBu3fv
+1vj4uN5++20NDw9rz549GhkZ0eTkpBobG9Xb26tKpaL5+Xl1dHSoqalJCwsLKpfL8vv9a343OONA
+b7eR380yigAA2MoIAGBbuVkTOWwdq0/Vm5qa9Mwzz0iSvvzlL2t+fl7BYFDJZFKJREIHDhzQt771
+LZmmqYceekiPPvqo9u/fL8MwNDo6qiNHjmhsbEyLi4tKJpNaWVlRuVxWIBBw76unp0eZTEbFYnHT
+U+2bfVivxw/ynyfgYZrmDRupz4sNVf1aPXVDWvv7IxqN6tixY1paWlI6nXaDg5cuXVKxWJRpmvro
+o//P3p311nGfhx//znbm7Bu3Q4nURkayJCuSbCt27cjxksS1gzh24iBpi14URVEguWheQN9Ab/oK
+WqBXLdqmSZuiSxDAtVMntmO7dmzJliWZq7gdHp79nJkzc2bO/0L/mZBaKZnipucDGA5ocjiMqJnf
+7/k9yztMTEzQarXodDpYlsWlS5fIZrOMjY3R7XYpFov0ej0KhUIYaACIxWLs27cvzCJaj/sxa0gI
+IcTuIQEAsaP4vh92bhfbV3Cq3uv1cF2XpaUlSqUSxWIR13WpVqtUq1UymQwvvvgib731FgsLC8Ri
+MWZmZsjn8/z85z/n8uXLfPbZZ1QqlXDBDlezCr74xS9imiblcplarYZt2zddjAdZCK7r3lcn/YGN
+rvk3TZNCoYBlWWv+XO6WbKjEaqufH91ul3K5jG3bxONxbNumVquFYwDL5TKVSgXDMNB1nWg0GjYP
+/d73vkc0GmV6ehpd14nH42HDviDg4Pt+GDRY7+/e/Zg1JIQQYveQAIDYceTkf2cIau97vR7tdhuA
+PXv28Hu/93tomobrukQiEcrlMhcvXiSTyXDs2DG+/e1vc+jQIebm5uh0OszMzIQpwZFIhEKhQKPR
+oFQqUSqVsCzrto248vk8X/7ylykWi+G93E82uubf9/11/f++XrKhEtcKfq9838e2bTzPC4NNpmmG
+geAgqKcoCsPDwzz55JM8/fTTLC4u8tlnn/HJJ58QjUbJZrO88pJfPacAACAASURBVMorAMzPz4c9
+ATRNwzTNOw4OSqBKCCHETiUBACE+h+3eTf1e3d96r7v6ZDfoCVCpVDh9+jSPPfYYR48eZXx8nAsX
+LjA/P0+32+XAgQNYlsVPf/pTPvzwQxqNRtgxfPXG0/O8sNb/Zt87uD/XdSkWi9Rqtftyk7nRNf+r
+u7hvlO36d0hsH6uzAq79Xc5kMjzxxBNMTEzw7rvvUq1WmZ2dxXEcOp0Ojz/+OL7vMz8/T6vVIhaL
+Ydt2GBTTNA1N0+j1ekQiEYaHh+l0OuE40e38nBdCCLE9bdf3hwJsrzsSYgcJTlabzeaGpEJvtHt1
+f7e7rqIoKIoSdvgOTthM08Q0Tb7xjW/w4IMP8pOf/IRLly4xPz9Pp9MhGo0yMDBAJpMhHo9z7tw5
+ms3mTa9/q81/MGf8ftzwC7ETKYoSNvS8k8WSoihEo1FSqRSNRgPHcTAMI8xA6vV6DA8Pk8vlaLfb
+fO1rX+OBBx7g7//+75mamqLT6ZBKpfB9n6WlJQYGBnjllVf48Y9/zNzcHJqmbevnvBBCiO1pu+4T
+JANAiM9hu3dT34j7u1H0cvV1g6ZcqxftwYK5r6+Pxx57jGeffZb+/n7OnDlDLBbj8uXLvPPOO0Sj
+US5fvkyj0Qj7BdTrdVZWViiXy2vqcq9tEne7DcJ23vhHIhEGBga29e+OEJvtbktVgvr+Wq0WlqWo
+qhpu+F3XJRqNcvbsWS5duoRt25w9e5bR0VH6+vqwbZuFhQVs20bXdVqtFpOTkywvL4fPONd15e+q
+EEKIO7Jd9wmSASCEuCXDMMjlclQqlRs2X0wmk4yPj3P58mXa7TaJRIJcLsf+/fs5dOgQjUaDvr4+
+Wq0WBw4c4Pz58/zf//0fpVIJ0zTXFRW9mxP9O/0aVVU3LWhQKBR44YUXePXVV5mZmdnWwQohNsvn
+yQC49usURcEwjLB/SNAItFKpoGkaw8PD9Ho9LMui2Wziui6Dg4OMjIxw7ty5MCip6zqpVArLsuh0
+OtsujVMIIYS4UxIAEEIAv0urD1JmA6ZpMjAwwPLyMp1OJ/x4cPIf1PdbloWu6xw7dozHH3+cRx99
+lEgkwmuvvcZHH33EQw89RKfT4ec//zmlUimsv13vgvpuNujr/ZrNLhkIxllWq1XZVOxAd7tR3ck2
+M0C2UW729zooTwp6CgTPsuDv5ezsLJZlhZ9rmiaxWCzsRyKEEELsZBIAEEIArFkE1+v18GOO44Qp
+sKs3O8lkkuPHj1OpVJidnSUajTI0NBSO6kqn05w4cYLz588zNzfH3r17qVQqTE9P47pueO2t2FTc
+aDOzEzc4Ymts15q+e2Wn9tQI7jtIvwyeX4ZhkMlkqNVquK6LYRgUCgX27t1LvV5nZmaGVqsFXH0G
+BkHOIIXzVv1HhBBCiO1OegAIIYCri+X+/n4eeughKpUK6XSavr4+ms3mmpP/gK7r5HI5NE2jVqsx
+PDzMD37wAx555BGmpqao1+s8++yzJJNJTNPk6aefxrIsFhcXw1ncn2cRrShKOGHgTn/OG82cv19O
+csXnt11r+u6VnTamMcjQME2ToaEhMplM+MwBiMfjHDp0iHq9HvYM6Ovr40//9E85evTomgBAMpkM
+f+5g3ODq58d27fAshBBC3IxkAAghgN/VzCaTSSzLCuteW63WdQt/RVEYHR3lL/7iL6jVavzN3/wN
+juNw5swZyuUyrVYLx3FQFCUMIKRSKer1OvV6fUNGyAXpuuVyGcdx7uhr5bRfiN1L13XS6TTdbpdk
+Msnp06d58803KZfLwNVT/SBTKcjgiMfjjI+Po2kaV65cIZvNhht813VJp9OsrKywtLR0XTZBPB5f
+dy8Tee4IIYTYahIAEEJcZ3WNcyQSYWhoiFarhaqqdLtdXNdl//79HD9+HM/zePfdd4nFYrz88sv8
+5je/Ye/evbz66qvMz8+HC96gv8BG3qNhGNeVJggh7m/RaJQ9e/awuLiI67ph8HH1Bn11WQNAIpEg
+Ho/TaDRQFIXTp0/z5JNPYpomly9f5tSpU1QqFf7u7/4ufK6pqoppmvR6vduWR+zUMgohhBC7j5QA
+CCFuKEh3HRkZ4Qc/+AGapnH06FFGRkaIxWL82Z/9Gf39/RiGQSKRYGVlhcuXL3P58mUmJiZYWVmh
+2+3e0xTZ+yUFWwixfr7v02636XQ6eJ6HZVnXbbqDsobguZRKpXj44YcpFovYtk2n0+GTTz7hk08+
+QVVVstks+/btY3p6Gtu2wzKQoIlg8Cy62bNup5VRCCGE2L0kACDEfSw46U8kEjfsaK7rOnv27OGB
+Bx7g008/pVarkc/n6fV6jI+P8/bbb/Pb3/6WTCbD2NgYqVQK27ZZWloK+wbc7WxvIYS4G6s357f7
+vIDjOJRKJVqtFqlUin379lEqlVhcXKRSqTA1NYXv+2iaxv79+4lEImtGo8ZiMeLxOENDQ2G/AVVV
+pc+IEEKIbUcCADvUtQsLIe6Eruvk83n6+/vRdZ2DBw+GDbHgd2OykskkTzzxBI888gi6ruM4DplM
+hvHxcTqdDtFolHK5zLlz56jX64yOjnL27FlmZmaoVCrhSMH7qWGaEGLn8X0fy7LCk3rbtunv76fZ
+bOI4Ds1mE9/3SSQSpFIpRkZGWFpaotFoEIlEGB8fp7+/nwMHDrC4uEin07lhs1EhhBBiq+lbfQPi
+zkktofi84vE4Tz75JIcPH+Zf/uVf+Oyzz8K513C1SVYymcRxHF599VXee+89UqkUL7/8Mv39/bz7
+7ru8/fbbYUCgXC6ztLTE3Nwcw8PD2La9Zk76/TAqTQix9Vb3L7mbjXdQ11+tVmk0GgAMDg5SKpVY
+WVnhgQce4LnnnkNVVebn56nX63Q6HRqNBtVqlcnJSZrNJoqihBMGhBBCiO1EmgDuUNJNWHweuq6T
+zWaJx+MsLy+HNa3BfxsYGCCXy7GwsECj0UDTNFKpFM899xzJZJLXXnuNVqvFysoKiqKEtbbJZJKj
+R4+yvLzM3NxcmB67G5imycDAAMvLyzcciyiE2HpBydG1XfnX+868NoAQBNxN0+SBBx6gWCwSiUQA
+sCyLWCyG67o89dRT/PrXv+bKlSvYth1mTK3+nje7t6ChqWEY2LYt2VJCCCHuKSkB2KHkVEF8HkGT
+rFqtFi5Eg5OvTCbDE088gWVZ1Gq1cGZ2rVYLa2FnZ2dpNpu4rrvmlMvzPGq1GrVabVdt/gGGh4d5
+5ZVXmJ6epl6vb/XtCCFu4EYlR8Emfr3p+Ks37cH1YrEYBw8epNVqMTs7S7lcJp1OMzY2RrVaxXVd
+CoUCmqbRaDTC6QCr7yOdTnPq1CnK5TK2bYcfD4Kue/bsodFo7LpnpxBCiO1FAgBCCODqCffIyAjJ
+ZJJ9+/ZRKBRIpVKcOnWKp59+mvn5eeLxOLOzs1iWFZ6CXbtYdhznpidYq+dz77QMlk6nw/T0NMvL
+y3JCJ8Q2drOO/5/nmdPr9UilUjz66KNUq1Xq9TrJZJKxsTEmJyeZnJxkYWGBcrmMruscP36cbrdL
+q9UKv2+326VcLof9BFZfu9PphOUEEuAXQghxL0kAQIhd5HYj93RdJ5fLkc/ngasn9rquE4vFgKud
+rB988EFUVWViYoLx8XG+/vWvk8vlmJiYoF6vUywW0XWdsbExgBuO2LqZm52A7QSe51Gv12XzL8QO
+tJ5N9a0ClL7vU6vVmJmZYXl5GYBsNhuOBXQch1QqRSKRoNVq0Wq1qFara7IOguaCN3peep6H67qy
++RdCCHHPSQBAiF3kdiP3kskkTz75JI8//jjdbhfHcdi7dy8nTpygv7+fWCzG4uIily9fJplM8p3v
+fAfP8/inf/onfvOb3zA/Px/2C3Ach3q9fkfpqjc7ARNCiK22OkB5owZ+3W6XdruN67p4nodlWTiO
+Q7fbZf/+/Xzzm99keHiYhYUF0uk0juPQ39+P7/tEo1F0XV/TnPBWI1g3gmmaDA8Phz1ahBBCCJAA
+gBC7TjAi8manTMvLy1y6dIlyuczY2BgnT57k6NGjnDlzhkqlQjQaRVEUTpw4QS6X4/333+fcuXPM
+zc3hOE64iLVte12ztgNBdkIwI1sIIbaTIEDZbrfRdf26ngGrewn4vo9hGOzfv59kMsnJkydZWFjg
+3XffpVar0W63iUajfOELX0DTNA4dOkQul6NSqYRB00Qiwfj4OI1GIxzBupGkb4kQQogbkQCAELuE
+qqoYhkFfXx+GYdDpdNYEASKRCP39/dTrdSqVCr7vk8lksCyLiYkJ3nnnHeLxOF/72tdotVq8/fbb
+XLhwgYMHD1Iul1lcXERRFPL5fHhtwzDQdZ14PH7bU6xIJBJ+rQQAhBDbzeoU/Rv1DAgCq71eL5wW
+EPQ8mZ2dZWpqCsuyOHbsGIZhoKoq7XYb3/dpNpuYpkmlUsEwjPA69Xody7LuSQaA9C0RQghxIzIG
+UIhdIDiZ6na7aJq25oTKdV00TaOvr4/nn3+eV199ldnZWUZHR/nLv/xLEokEf/VXf8Unn3xCKpUK
+T6Tm5uZQVZVYLEaj0aDT6ZDJZGi1WliWha7r9Pf3YxgGR48e5e2336ZSqdz2Hq8djSWEEFspGMPn
+eR6GYazrGWUYBrlcjl6vR6vVwjAMkskkhmHwwgsvUCwWGR8fp1arkU6neeONN7hw4QLdbpdDhw4x
+OTkJcN1IQCGEEOJekwwAIXaJ4FQqGIFlmiaFQgHP80in0zSbTebn5+n1eiSTSfL5PH19fXiex1tv
+vYVt2+RyOU6fPs3IyAjdbpd0Ok2j0cDzPJLJJI8//jgLCwthZ2vHcYjFYjz88MNMTEzQbDZven/X
+ztcWQojtIMhOUhSFgYEBLMu67aZcURQURQl7AsDVDIJIJEI2m+XKlSvU63Wmp6e5ePEis7OztNtt
+UqkUuq7jOA7tdvuOyqiEEEKIjSAZAELsEkEDwOBE6dqsAM/zyOVyfOMb3yCfz5PL5dB1nY8//ph3
+332XWCxGPp9namqKZrNJq9UikUhw5MgRPM/j/PnzaJpGrVZb0/gvWPBWq9Xb1rGqqiqn/0KIbWW9
+GQDBM9a2bWKxGK1WK8ywyufzmKaJYRh897vfZXZ2lqWlJQ4fPkyz2eSjjz4iFovxzDPPkEwm+fDD
+D3n99ddZWlqi1+uFQQBFUeQZKYQQ4p7St/oGhBAbw/M8ms1mWOvp+z6e54Wn/IZhhCf67777LvF4
+nAceeICLFy+ysLAAwOTkJI1GIzz9arfbWJYFsObaqzmOQ7FYXNc9ysJWCLHdBFNNgFvWyieTSU6d
+OsXU1BQHDhzggw8+oFqt4nkelUoFVVXRNI2f/vSnYW3/zMwMhUKBWq3G4cOHGRsb4/z588DVJoDp
+dJpEIhHW6QfZAfKsFEIIca9IBoAQu0xw8t/r9Th06BBPP/008/PzRCIRMpkM7733HhMTE+zdu5ds
+Nkuz2WRiYgJN08JN/npPoYKTM5lfLYTY7YIMgE6nQyKRWJMNFZQ4mabJvn37mJ6eptPpEI/H0TSN
+SCTC0NAQw8PDGIYRjgqMRqPs37+f3/zmNywtLbGyshIGI+TZKoQQ4l5Qt/oGhBAbKxKJUCgU6Ovr
+44tf/CLLy8sUi0VM00TXdXRdx3VdSqUSvV6PUqmEbdtrNv+RSARVvf3jwTAM8vk8hmFswk8mhBAb
+L3jmKYpyy8/rdrtUq1Vc172udl/TNJLJJN1ul+npaVzXJRaLEY1GMQyDEydO8MQTTzA2NkapVCKV
+SrFnzx727t0bNmg9depUGLyVZ6sQQoh7RTIAhNhBVnfSD9JNFUVB13W63S6u62KaJn19fTiOg2ma
+uK5LNBqlv7+fpaUlyuUytm1jmiapVIq+vj6mp6dptVrhgna9tfqSASCE2OmCJoDlcvm2fUzgxg1N
+VVUlGo2GYwFN0+TAgQNEIpHwVD+YFLBv3z4qlQpLS0thxkCxWMSyLObm5nAcZ81zXcoBhBBCbCSZ
+AiDEDqGqKul0msHBwXAD39/fTyqVYmRkBMMwsG2bQqHAE088QaFQwHEc4vE4w8PDzM7O4nleWOPf
+7XYxDINjx45RqVTWBADuZDMv86WFEDtZr9ej0+ncUUf+azflwYl9r9fDdV08z6PValGpVGg0GjSb
+zbAkIJPJcOrUKSYmJvA8j4WFBUqlEolEAsdxyOVyxONxAAmuCiGE2HASABBihzBNk8HBQcrlcjg+
+yrIsWq0WzWaTRqMBQKvVwrIsHnjgARqNBoqiMDk5STQa5dlnn+XKlSs0m81wobq8vEytVpONvBDi
+vqQoSpj1dLebbd/36XQ6YQO/4PkaBANUVWXPnj2cPXuWjz/+mPPnz+O6LoVCAU3TUFWVWq1GLpfj
+ueee4+DBg6iqysrKypqpK0IIIcTnJSUAQuwQq9P/gXBslaIo5HI5stks/f39zM/P0+v1ePHFF3nn
+nXf49NNPqdfrGIZBNptdd5qrEELcD+60BOBmgiaAnU7nuoBqNBpldHQU13Upl8u0Wi1UVSUej1Mo
+FDh9+jRvvfUW6XSaZrNJu92m3W7TarUkOCuEEGJDSQBAiB1G0zTS6XQ40s8wDI4cOcLXv/516vU6
+Kysr/Nd//Re+74cLyc2oIV1v3wAhhNhONqqXSTweZ9++fczMzNBut9f8tyCAG3yP4J94PM6RI0dQ
+VZVqtUq9XqfVamHbdvg5QgghxEaSEgAhdph0Os3p06fp9XqkUim++c1v8o1vfINyucy///u/8/HH
+H4czqF3XJR6PhymoiqJgmuaaVNegA/bnWWwGi9vPk0IrhBBbZfUpu6ZppFIpPM+7o6BmUPcfbN5X
+6/V6YY+B1f/N931qtRq+73P27NmwbMt1XZLJJJqmEY/H0XX9uqaD1z7LhRBCiPWQAIAQm0hV1c+1
+WFMUhUwmw5kzZ9izZw9nzpzh0Ucf5T//8z/52c9+xszMDJqmkc/nyWQyABw+fJhms4lhGGiaxuDg
+IJZl0e12gd+lv7qui67rd7Wg7PV6+L4vGQBC7BCGYdDf3x/WrIvfSaVSHD9+nHa7fcPN/M0Edf93
+8vwMvsa2bRYWFsKGrOl0moceeohIJMLx48cZGxsLywJ838c0TQqFwppnuRBCCLEeEgAQYpNsxCm5
+pmkYhhF2lE4mkzQaDX71q18xMTERNqFqtVrU63Xa7TbVapVms4njOLiuG2YGGIYRbtw7nQ6qqn6u
+BaWcQgmxc/T39/PMM8+wuLhIq9Xa6tvZVjzPo91uE41Gb1jPf7eC0X7RaPS694DneTiOQzabJZlM
+MjY2xuLiIktLSwwODvLcc88BMD09TafTwff9Nc9yCeIIIYRYLwkACLFJ1ntKHoyTcl33us9VVZW+
+vj6ef/55XnrpJQzDYG5ujoGBAaanp2m1Wvi+H475Czb3wfcN0lCD7xGMvgpSXS3LwnEc2cwLscs5
+jsPi4iKVSkU2j9fwfR/btul0OiiKsib1/vNQVZVMJsPIyAjNZvO67v69Xg9d13n00Uf5/d//fer1
+OpOTkywvL/Phhx9y8eJFms0mcLWpoOM4YcaX4zjSLFAIIcS6SABAiE20nkVkPp/ny1/+MsViMWwk
+FaTrJhIJDMPgy1/+Mg8++CCRSIQPPviARqNBo9FYd8do3/fDjIDV93Ync7CFEDuX7/thwFBcr9fr
+4XneHfcBuBFN00gkEvi+j+d51Ot1Op3ODfsEOI5DsVjk3LlzzMzMYFkWzWaTSqWC53lomkYsFguD
+CI7j0Ol0ZFSgEEKIdZMpAEJssWs7UEejUQqFAsViEVVV8TyPRCLBc889RyQS4a233iIWizE8PBx+
+/vT0NMeOHeP111/nypUrsqgXQohtIplMMj4+ztTUFADNZvO2ZVbRaJQDBw4wODjI8vIys7OzqKqK
+rutomkan05ERgUIIIe6KZAAIscWCJnxBCmc0GmXv3r04jsO+ffuIRCJUq1UWFxexLIv9+/dz8OBB
+nn32WbrdLm+88QZTU1MsLCxQKpWkIZQQQmwjnufRaDRot9vrTtVXVZXh4WFeeuklHnnkEaanp8nl
+cuTzeVZWVnAcJ3zWq6oa/lsmAwghhLgdCQAIsUGCEXvB2L31LsCuTcdXVZVYLEYymQwbUNm2TavV
+wnEclpaWqNVqNJtNNE3jww8/pNlsoigKtm3L6b8QQtylIF1/o+r+4Xep/XcyKcX3fer1OhcuXOC9
+995jbm6OdrtNqVTC930OHjyIoigkk0kAXNclEomEjVx9379pc8DgHbORP6MQQoidQ0oAhNgguq5T
+KBQoFApcuHAhbNZ0JxRFYWBggG9961s8+OCDXLhwgV6vx3vvvcfKygpjY2OcO3eOarWKYRhEIhFq
+tRrdbhdN02RBJ4QQn0OQrn/58uW7eobfDVVViUajNw3gKooS/rvX65HP5/na176G67rE43Fee+01
+KpUKtm2j6zqO46DrOvl8nnK5jOM4a64Xj8fZt28fMzMzYZ8ZIYQQ9w8JAAixQRRFIRKJEIlEaLfb
+d1Wbqes6uVyOaDSKaZoAjI2NUa1WmZ6exnVdGo3GdbOmFUUJF4cSABBCiLsTNNmzLGvT6utvtyEP
++sR0u10UReHYsWP86Ec/4n//93958803sW2bVCrF5OQk7XabXq8X9gsIpsGsdruAgxBCiN1NSgCE
+2EDBLOf1bsKvrdnUdZ1YLEalUqFWq9FqtYjFYgwNDXHlyhXK5XK4CFRVNfw+mqbdcemBEEKItYJ0
+/c18jnqeR6vVwrbtG37foE9Mp9MhFotx8uRJVFXlF7/4BZOTk1iWRafTIZ/Ph++Svr4+stkslmXR
+6/XWvGd6vd51QWQhhBD3DwkACLGFYrEY+/fvp9VqoSgKY2NjfOUrX8GyLAzDIB6P89JLL3Hy5EnO
+nTtHuVwOT3cikUi4oAsCAEGd6XYVjDPc7vcphBCbZfWGXFEUdF1fszkP+sR0u10ikQipVIrf/va3
+XLlyBdd10TSNgYEBfvjDHwJXM8m+/vWv89hjj/Hpp5/iOE7YG0CaxAohhJAAgBBbKNgQa5qGaZo8
+88wzZDIZBgYGwtTNc+fO8dZbbzE3N7dm8ba6oVSwgNzuI6H6+/t55plnWFxcpNVqbfXtCCHEtqLr
+Oslk8rrU/SC7y/M8VlZWaDabZDKZsPlfJBIJp8cMDQ1RrVZ55513WFxcpNPpYFnWpmc2CCGE2J6k
+B4AQW0jTNIaHh/nSl77Em2++Sa/XI51O87WvfY0nn3yS+fl5/vqv/5orV66sWbgF6f87bTFnGAa5
+XI5KpRJOPRBCCHGVoii3beiqqiq5XI69e/dSLBY5cOAAtVqNer2O4zhEo1Fc1yWTyVCr1SiVSnie
+h6IoknklhBBCAgBCbJUgbR8glUpRqVQwDINUKsWhQ4fCaQIXL16k0+mEXxek/1+bRq+qqizuhBBi
+lwp6vwQlAoZh4Hke+/btCyfERCIRTNNkenoauPqeabVa9Hq9G743hBBC3H/0rb4BIe4XwcmOYRgY
+hoGiKDzwwAM4jhPWdY6NjZHJZFBVlTfeeINSqXTdSfmNmlTdLChwr2z29xNCiPudoigkEgmSySSl
+UolWq4WmaSwuLtJoNBgZGeHs2bP8z//8D91uF13XGRwcZG5uDtu2pQRACCEEID0AhNg0qqqSSCQY
+HR1lbGyM5eVlms0mx44d49vf/jbpdJpoNMo777zDxYsXsW2b4eFhWq3WmiCAqqoA13V1Xt0T4F4z
+TZNCoUCn0wlPoWRhKYQQ91a328W27TXvBNd1abVaWJZFtVplcnIS27YxTRNFUWi1Wvi+TyQSYXBw
+EMdxtn2/GCGEEPeOBACE2ERBs75IJEK1WqXT6dDtdnFdl/PnzzM7O8vs7GxY42maJuVyOVzsBSfv
+hmEwNDS0pqvzZm7Afd/Hsiw0TWN0dPS6IIUQQoiNFzQCvPZjvV6PTqdDqVQKR/91u92wfKyvr4+D
+Bw/yyiuvMDExQb1eB65mFQQTZe4n9+vPLYQQICUAQtxziqKE/xiGQbfbZXJykkgkwoEDBzhw4AAP
+PvggrVaLN998M5wH3Wg0UBQF27bDrw/S/wEWFxfD/73ZfN/Htm00TWNmZgbbtrfkPoQQQlwVjAsM
+BCNi+/r6OHv2LJqmMTU1RbvdDkvSNE0jl8tRLpe37H2yFQzDIJ/P33c/txBCgDQBFNvQ6sh8t9vd
+8anlmqYRi8Xodrv09/fT19fH9PQ0AwMDnDx5kk8//ZRWq0Wr1cLzPFqtVlhbH/zsUnMvhBDbSxDU
+dV1327ynVk8RAEgmk4yPj4flAauDy8lkklarhaIo2+pn2Azb8c9OCCE2i7rVNyDEtQzDYGBggFwu
+h6ZpW307n1sQ0EilUjz44INomsa+ffv43ve+x7PPPovneczMzFCv1+nr62NoaIh4PI6iKOi6Tjab
+RVVVaeAkhBDbSHCKbBjGVt9K+J6JRCIkk0k0TUNVVZLJJJlMhna7Tb1ep16vh8HlZrNJt9u94btF
+VVWi0WjYc2a3uVEzXSGEuF9IDwCx7fi+T6fTwbKsHduoSFXV6xYWtm3Tbrc5cOAAJ0+eZHh4mP/+
+7//m3LlzdDqdMOPBNE0ajQbdbpd0Os1DDz1EuVym0+lgmiawufX+Qgghrhek3F/b/+RGz/97LRKJ
+0N/fT6/XC3vDxGIxjh49Sn9/P+l0Gt/3cV2XRCJBJBLBdd2bZpQFjV5X95kRQgixO0gAQGxLnuft
+qFR3VVWJxWL4vr+mhCGY1ZzNZrEsK6ybr9Vq/PrXv+ajjz6i3W7T6/XCOv9msxmeTPi+T7vdxnVd
+VFVleHgYz/Pk5EIIIbaBa4PUQbnW6hKuzRAEzjudTjiVRdd1UqkUtm1z6dIlyuUy+Xye48ePY5om
+6XQa27bxPA/DMMJmgsH1LMuSd40QQuxCEgAQYgPEYjH27dsXdsO/dvPf6XTo9XocPnyY7373uzz0
+0ENMTk7iOM6a2n7P89b0PQius3fv3jB907btHRUcEUKIXfeItAAAIABJREFU+8Vmj2Rd7dpxrKZp
+0tfXx8LCAqVSKdzUW5YVjp+1LItms8nAwECY0RA0D4xGo3S7XXnfCCHELiMBACE2QNC8z7btNaco
+uVyOp59+mr6+Pvbs2cMf/MEf4DgOv/zlL4lEIpw6dYrBwUHm5ubCr73RtZvNJrZtSxNAIYTY5u72
+xFzTNBKJxHUb+bvl+34YOFYUhXw+H45v3bdvH8eOHSOZTGJZFplMhmw2G46dTSaTHDt2LBxXK4QQ
+YveQKQBC3CO6rtPf389DDz3Ed77zHXRdJ5lM8m//9m/MzMzw2Wef0e12cV2XarV6yzrLYJLATu6L
+IIQQ94JpmgwMDLC8vLyjN6tBx/7Lly/TbDY39NqqqqLrOt1uF03TwuaAwZjA4eFhcrkcv/jFL1hY
+WEBVVeLxeDidRgghxO6hb/UNCLEbBSOWzpw5Qzwe58c//jFzc3P0ej0WFhbCjb9lWes60Y/FYvds
+YSiEEDvZwMAAr7zyCj/+8Y+5cuXKVt/OXbMsi8uXL2NZ1oZeV1EUVFUNe8kYhhFmBmQyGTKZDKZp
+cvjwYT7++GMqlQqWZYWZA7qub1hWghBCiK0nGQBCbLBgdF80GqW/vx/btqnX6+Hiq16v0+l0UFU1
+XJTdbmElGQBCCHFjuyUD4F4I5t3H43GazSaRSIR9+/YxMzODqqocPXoUy7IolUqYphlu+uv1Ot1u
+N8xcC0YGCiGE2PkkACDEDaiquq6T+aDjc1CbrygKhUKBb37zm/i+zy9/+UsGBweJRCKk02lisRhv
+v/12uPjK5/OUy2Ucx9mEn0oIIcRucrt3laqqmKaJ53lhENo0TTqdDqlUitOnT3P+/Hnq9Tp9fX0A
+tNtt6vU6nueFU22CALRMBRBCiJ1PmgD+f1sxt1dsTzcb4xQsnFZ/PJiVbNs2uq6TSCT4whe+wJkz
+Z+jr6+PDDz9kamqK5eVlut0u7Xab2dnZMPX/RjOkhRBCiNtZz8jBYCpBkMLf6/XCrLNut0upVKLR
+aNDf3893v/tdHn74YVRVZWlpKfy8RCLBiRMnwma30ohWCCF2NgkAsHVze8X2dLMxTqZpsmfPHoDw
+xF5VVdrtNgCjo6OMj4/zyCOPUKlUOH/+PJ7nUSwW6XQ6uK7L3NwczWYz/D2TdH4hhBB3Y70jB1ev
+a4Ka/uBrg3K0WCxGq9Xi8OHD4WQaTdNwXZdut0u5XA5L2W50rRsFyIUQQmxP6lbfwHYQnMRKVFsE
+bvS74DgO1WqVQqGAaZphbaTv+0QiEUzTZHx8nCeffJJ8Ps/U1FSY6h+LxajVajSbTfk9E0IIsSFW
+v09U9fZLumACgKZp4dfEYjFisRi5XI5MJsPo6ChPPPEEX//618lms6iqesOT/9XXikQiFAoFIpHI
+xv6AQgghNpxMAfj/ZFO2ORRFQdO0HdlR2Pd9arUatm2HjaYcx0HX9TAoEGST7NmzB13XqVQqdLtd
+VFWl2+3uuJ9ZCCHE9ndtP5rVrm0i22w2w+yzSCTC2NgYx48fJxaL8Y//+I+k02k0TePSpUvhiFpd
+16/rWbP6Wr7vs7i4KP1shBBiB5AmgGJT7YSOwrdaSK2mKEr4TzKZZGRkhBMnTuA4DtPT08zMzFAu
+l+n1euu6nhBCCHG3btYQMJlM3nSMrKqqxONx4vE4cDWoffDgQSzL4sqVK7RarTDF3zAMAFzXlXeZ
+EELsYNIDQGyqoPHQdq59Dxr7WZZFr9cjnU4TjUZveIKv6zr9/f0MDQ3x0ksv8fjjjzM6Osr09DRT
+U1NhpkCwgJIMACGEEPfCtU1rV/eaaTQa4Ttt9eeYpkm326XRaNButxkYGODll19mbm4uDFoHaf69
+Xo9cLken09nW73AhhBC3JhkAQlxjdQZAPB7n1KlTAHzwwQc0m801Y5EGBwd54YUX6Ha7GIbBm2++
+ycrKCqVSKRyjBDsj80EIIcTOt94stmg0ysjICM1mk1KpFAa8BwcHiUajtNttHMdhfHycarXK5cuX
+sW07bAQoWQBCCLEzSQBAiFsImhwBYa1jJBJhdHSUgwcP0tfXxxe+8AUmJia4dOkSxWKRhYWF6+og
+d3LvAyGEEDvLzcoBrv0c0zTxPA/P88hkMhQKBWZnZ1FVlb6+Pmzbxvd9TNPEsizK5XLY+FbK2oQQ
+YmeSEgAhbiGYmQxXT/GDhdCePXuoVCpks1lefPFFBgYGMAyDQ4cOMTk5SavVCq8RdGaWhZIQQojN
+cLNA8+rRfatL8kzTZGBggFKpRLPZDEfXplIpAFqtFo1GI8x2k1IAIYTYuSQAIMRtGIbB8PAw+Xye
+ZrNJLBbjwQcfJBaL8eijj6JpGrOzs/z617/mww8/pFgshouiIBVTZiMLIXYLwzDI5/PSDG4HCsrR
+ut3umj873/dpt9vhuL8gOGCaJo899hjRaBTP89B1nXQ6zVNPPcXCwsKaYLcQQoidQQIAQtyCpmlE
+o1GazSa1Wi3MBohGo7zwwgsA/PM//zO//OUvqVarxONx6vV6+Hm9Xg/f97dskazrOtlsVhbqQogN
+k8/n+fKXv0yxWKTdbm/17Yg7cLNGvMHHg0B1ULZm2zalUgld13n00Uc5cuQIKysr1Ot1GfsnhBA7
+lAQAhLiFWCzG6OgotVoNy7LQNI1cLkc6naZWq/Hmm28yOzuL67ocPHiQwcFBFhYWsG07vMZWnvxn
+s1m+9KUvUSqVsCxry+5DCLF7uK5LsVikVqtJYHEHWs+fWZAp4LoujuPQaDTQdZ0jR46QSqU4ceIE
+ly5dotFobMIdCyGE2EjSBFCIVYL6yKDhEVwdC9jpdFBVlXw+j6qqaJrGiRMnaDQaeJ7HhQsX8DwP
+TdPCOsntIEjXrNfr2+aehBBCbG9BBoBhGAwNDbG0tEQ8Huf48eNMT0/j+z7FYjEcdSuEEGLnkACA
+EKsEm/x9+/Zx8eJFms0mcHUjfejQIV544QXm5uZ4++236XQ62LZNr9ej1WpJMyQhhBC7yuqRgoqi
+hAFx6WsjhBA7l7rVNyDEdtLr9ajValy8eDHMAFAUhUwmw5NPPsnDDz9MMpnkyJEjRCIRWq0W9Xpd
+Nv9CCCF2Hd/3w1GAnufRbrfp9XpEo1EikUg45UYIIcTOIU9uIVYJxv4FnZBVVQ1HHvV6Pfr6+njx
+xRcZHByk3W7jeV5YNqAoylbfvhBCCLHhNE0jmUyiaRqRSIQDBw5w4sQJxsfH6evrQ9O0rb5FIYQQ
+6yRNAIVYRdd1crkc2Ww23Pwnk0mOHTuG4zi89tprTE5O8utf/5pisYjv+xiGIZ32hRBC7FqJRILx
+8XEajQau6zIwMMAf/uEf8vu///u4rsvs7Kz0AxBCiB1C3+obEGI7icfjPP7444yMjPDb3/6W+fl5
+9u7dSyaT4cSJE/zrv/4r77///k3T/lVVRdd1PM+7JzWSiqJgGAau60r9pRBCiHtOURRc1+Wzzz7D
+sixM06Svry8cj7uwsBCOvhVCCLH9SRNAcd8KaheDBke+71+XATA2NsaLL77IysoKjuPwD//wD0xM
+TKzpqB90S/Y8D8Mw6O/vp9ls0mw2NzwjIBKJkM/nKZfLMn9ZCCHEPaWqKolEgkQiQbVaBcDzPOLx
+OJlMhkwmw+zsLPV6HbiaRdftdlFVlWQySbPZlAk0QgixRW52cCglAOK+FHQ2DkYcWZZFt9vF9306
+nQ69Xo8vfOELfOtb3+LChQv84he/4J133uHKlSs3POkINvrB1wfX2Gi+7+M4jpy2CCGE2DCKohCJ
+RMJ3maqqmKaJYRiMjIxgGAadToeBgQHa7Tbtdpt0Os3LL7/MzMwMALFYjMHBQQCi0SgnT56kXC5j
+2/aW/VxCCHE/Cw4OHcdZk7ksAQBx3/J9n263i2VZOI5Dr9fDNE0OHjzIyMgIuVyOTCbDyMgICwsL
+zMzM0Gg06PV6qKp60w2+53n3ND1fJg4IIYS4kWDjfqclaNcuEk3TpFAohJNuarUanU4Hz/PIZrPo
+uk46neapp55iaWmJQ4cOEY/HicVi9PX10ev1uHLlCrVaTXrjCCHEFrnZwaEEAMR9ZXXH/l6vR6/X
+o9vthgulvXv38sd//Mc0m03279/Pl770JbLZLDMzM+i6TqlUwnXd8KRE6vCFEEJsF8HGPchqW69r
+F4m+72NZFp1OB8dxwmsNDg7ywgsvEI/HmZqa4pNPPmF+fp7Z2VlKpVI4Sefxxx+nVqtRLpclaC2E
+EFvoRs9g6QEg7ivBqUWv18MwDCqVCt1uNwwI9Pf385WvfIULFy6gqiqZTIZqtUqxWASgXC6Hny+n
+GkIIIbaToLwt6Guz0deOxWJkMhksy6LRaBCNRhkdHWVmZgbLsjAMA0VROHz4MKdOneLnP/85Kysr
+9zwzTgghxPpJBoC4rwQn/slkkrNnz7K0tITjOAwODjI8PMzhw4d5+eWXURQlbHB04cIFisUirVYr
+PPWXhYwQQojt5tqstrsRZMpdew1N04jFYlQqFdrtNr7v43leuPFXVZWhoSFM08TzPD777DNqtRqx
+WCzssSOEEOLGru3Fci9t+hjA4AViWZakhYlNF6QnVqtV3n77ber1OtFolDNnzvD8889jmib1eh3L
+snjnnXdoNBpUq9Vw47+Vv7+qqsoCSgghxD2ladoNO/h7nkez2aTX6xGNRsN+AYqicPLkSWKxGM8/
+/zwff/wxi4uLvP7662GPHVnvCSHErRmGsWmTvjY9ABCLxRgfH+fy5cs0m83N/vZCAL9byHieh+/7
+rKys8D//8z/MzMzQarXQdR3LssKU/8BW/f7ey7ROIYQQIrD6/bhakF0QjUYpFAosLi5i2zau6+L7
+Pl/96leZmZnhgw8+YGpqimazia7rRKNR2u22BAGEEOIWXNelXC5vyqSvTS8B8DyPRqOBZVmSRi3u
+ueAkI5FIEIvFMAwDz/NIJpMcP36carUaNkuKx+PUajVM0+TQoUMUCgUWFhbWjDDaqt/fXq+H7/uy
++RdCCHHP3epdEzQIDKbnZLNZTp48ya9+9Sump6cpFApMTU1hWRbZbJYjR46gaVpYRgfccpKOEELc
+rzYrULrpAYBerxe+NIS412KxGEePHmV8fJy9e/eSzWbRNA24WmujqirDw8MMDw+jaRqdTofvfOc7
++L7Pm2++yfLy8pqF0O1+f29WO7kR5O+MEEKIrXZtnwHXdZmfn2dmZobl5WVKpRKGYRCLxYhEIgA8
+/fTTLC8vU6/X19S5yntNCCE2n0wBELuapmnE4/Fw9F8ul+MrX/kK1WqVVCpFX18fDz/8MIuLi7zx
+xhv86le/Ih6PY1kWKysrdzRGCa5OGbhR7aQQQgix2wSBdFVVwwk5g4ODPPXUU+i6juu6fPDBB5w5
+c4ZPP/2Ujz76iE6nI5N0hBBiC0kAQOxKiqKgaVo4eig4cThw4ACFQoF0Ok06nUZVVUzT5MKFC1y8
+eJGVlRV83w/HAt7qpH/19W/3cSGEEGK3UVWVeDxOLBbD8zxs2yafz6PrOolEgmq1SrlcJh6P47ou
+rVZLegEIIcQWkzGAYlcKTuKDU3jTNBkaGuL73/8+vV6Pxx57jFgsxkcffcS7777L5OQk9Xod3/fD
+hnu3Sk9cff1rTzHkVEMIIcT9wvM8IpEIR44coVwuU6/X0TQtzK4L+uYEU3RkJKAQQmwtCQCIXSmo
+UfQ8D9M0KRQKVKtVLl26xJUrV2g2m1SrVWzbxrIsXNel1+uRSCTodru3XaCsvr4QQghxv1o9Xrfd
+buO6Lo7jUK/X2bNnD3v27MHzPKLRKEePHqXVapHL5eh0OvIOFUKILSABALFrBRv4oGOxZVnYtk0y
+maRUKjE4OEi9XmdpaQnDMEgmk3zxi1+kVCphWda6ry+EEELcz3zfp9PphO/FoIzONE1eeeUVEokE
+jUaDSqWCaZq8/PLLTE1N0Wg0tvjOhRDi/iMBAHHf8H2fRCLB4cOH0XWdH/7whxw9epSLFy/Sbrex
+bZtEIkGxWMRxnK2+3RsKehZI92QhhBDbVSKRYGxsjPn5ec6dO8enn37K8vIyrVYL27axbZulpSXp
+mSOEEFtAAgBiS2zmDODV9fqu61KpVNB1nRMnTvDGG2/wwQcf0O12aTQaLC8vY9v2tl2MBOUMlmXJ
+lAEhhBDbkud5NBqNsNyu1WqhqioDAwOkUim++tWvsrKyQn9/P/V6Hdd17+n9rB49KIQQ9zsJAIhN
+t54mextp9cxi3/dxHIdYLMbQ0BC1Wo35+XlisVjYqOh297SZwYtrBeUMjuNs2yCFEEKI+1fQ7M+y
+rDU1/r7v4/s+6XSaubk5JicnKZVK+L5PoVDA87xwCs9GZ7pFIhHy+TyO40jfASHEfU8CAGLTBRvx
+zY7ERyIRFEUhlUoRiUQoFovMzMwwPDzMCy+8wOzsLLZt33LRsdnBi2utDmYIIYQQ200ikWB8fJxG
+o4HruqiqClx9f+7du5c/+qM/otvt8tlnn9FoNCgUCnz/+9+nXC7TbDbRNI2hoaENzXQLgv/3OtNA
+CCF2AgWQnYTY1YK6+WAiQLAweeSRR/j444+Zm5sjk8ngeR6GYXDlyhVs277l9SSNUAghhLje6gyA
+Xq9HJBLBdV1isRgjIyPouk6v16NYLKLrOqZpkk6nmZmZodls4vs+kUgEx3HkXSuEEPeABADErpdK
+pTh+/DjFYjGcBGBZFul0mlarFXb813UdTdPWdDIWQgghxPooioJhGGtG6aqqiqZppFIpHMchkUjw
+/PPPh4ECz/O4fPky77//PuVyWd6/Qghxj0kJgNj18vk8X/3qVxkYGOD48eNYlkW5XKZWq4Xd/jVN
+C5sESnq9EEIIceeCWvtOp3Ndrb3jOHQ6nbCHzRNPPMF7773HBx98wMTEBLVaTTb/QgixCSQAIHaV
+oNPvarqu09/fT6FQIJvN8tRTTzE1NRU2H1o9JUAWH0IIIcTduVGtfdA7J+hfoygKnucxMTFBo9Gg
+VqtRLpelPl8IITaJutU3IMRGMgyD/v5+EokEiqIAV8cR1et1bNumWCzy8ccfs7y8HJ5OeJ5Hs9mU
+zsBCCCHE59Dr9a6bUhMEBYKPJZNJHnzwQTzPI5VKcfLkSQYGBjAMI3xvCyGEuHckA0DsKr7v0+l0
+6HQ6YfOhoaEhTNOkVqvxf//3f1y6dIlWqxV+TvB1QgghhNh4wcm/ruu4rkulUsFxHB5++GGeeeYZ
+ACzLotFoSDBeCCHuMQkAiF1FURR6vR69Xg9N0xgfH+fP//zPefLJJymVSly+fJlCocDg4CC1Wg1N
+07ZspJ8QQghxvwjK7XzfR9M0XNdlYWGBYrHI4OAgBw8epFwu0263w+aA8m4WQoiNJwEAsasEtYYA
+2WyWM2fOkM1mef311/nVr35FqVSi0WjQbrfpdruMjo7SbrfRNA1AFhtCCCHEPdDr9eh2u6iqyuDg
+IJlMBtd1eeihh9izZw+5XI6BgQE8z+P48eOoqirleUIIcQ9IAEDsKoZh0NfXRzKZJJlMMjc3x9TU
+FB9++OGapn8jIyPUajVarRa+7zM8PEy3272udlEIIYQQG8P3fXzfp91u02w28X0fy7JwHIehoSH6
++/vJ5XLs2bOHI0eOMDMzQ71ev+V7Wdd1stksrutKOZ8QQqyDvtU3IMTnpSgKmqbheR4DAwP8yZ/8
+CZVKhffff59KpcLi4iKNRgO4OqLItm0uX76M4zhEIhFc16VUKtFut2XzL4QQQtwjiqKgqiqdTgfD
+MEin03z22WeUSiUMw2BiYoJut0uj0UBVVYrFYvheVlUVXdfXTBPo9Xqk02m+9KUv8Zvf/IZyubzF
+P6EQQmx/kgEgdrygrtDzPPL5PN/61rfIZDL09fVx9uxZGo0GCwsL4elA0JHYNE1GR0dpNpu0Wi2p
+NxRCCCHuQDB693Yn70EDQE3TwrG7nufR6XRwHIdoNMrQ0BDLy8v09fVRLBbJZDI0m006nQ6appHN
+Zslms3ieh+/7mKaJ7/thEL9er0sGgBBCrIMEAMSOFzT9i0ajYUO/TCZDPp/nP/7jP/jtb3+Lbdso
+ihL+d03TiEQi4XhAWTQIIYQQdyYSiZDP53Ec55a1+kGg3nXd8HN7vR6e52GaJocPH+bgwYPUajVM
+08TzPE6fPk2tVqNerxONRhkbG6NWqxGNRnEcB0VRwkCCZVnyHhdCiHWSAIBYtyCCvx1PyWOxGMeO
+HcMwDM6fP8/HH39MqVSiVCphWRamaYaLBt/3icVijI6OUq1WcRxnq29fCCGE2HGCjDrXdW/5eUED
+wOD0frVUKsXZs2d56KGHUFWVxcVFPM9jZWWFZrMZZhmsrKxQq9VwHAdN08L3uRBCiDsjAQCxbkEE
+v9vtbquXrmEYpFIpDMPgueeeo9VqsbKyQjwe56WXXiISiTA5OYlt22GTP8/zaLVa2La9LQMaQggh
+xE6w3i79164bFEXBNE0A6vU6pVKJixcvMjc3h2manD59mtHRUbLZLCMjI8zOztJut4lEImH53u0C
+D0IIIa6nADfd/SiKgmEYuK4rmySxptnedvp9yOfzPPbYYywtLfG9732PTCbDW2+9RblcZnJyksXF
+RarVanjysJ3uXQghhLgfRSIRhoaGMAyDQqHA6dOnmZ2d5Y033sBxHPr6+nBdNzx0qFar4RjBaDS6
+5eV7qqpuq8MQIcTuFIlE6O/vp1QqbVjW8i0DAEFtV7lcljTpu7BdN8y7QRCc8jyPaDRKJpMhmUzS
+6/XC39vBwUFef/11arUauq7jeZ4Es4QQQohtQFVVYrFY2BsgGo0CV0sCNE2j0+lQLBaJx+PYtk0k
+EqFarW6LU39VVYlEIlKGIIS45/bs2cOLL77Iz372M+bn5zfkmpIBcA8FKfPNZpNut7vVt7OrBJv8
+VqsVdgoeHBykVqtRrVYxTRPDMGg0GmiaFjYJlD8LIYQQYntYfVACMDIywo9+9COGh4eZnJzkb//2
+b4GrQYEHHniAV199lVKpFK5JdV0nHo+Hk3w2k2QACCE2w6ZnAIjPRzIA7h1N04jFYnS7XdLpNJ7n
+cfLkSTRN47333sP3fZrNJp7noSgKcPVlLX8WQgghxPYUjUbZt28f8XicaDRKo9EIs/0sy2JhYYF4
+PE48HqdarZJIJDhw4ADnzp2jXq9v9e0LIcSOIAEAsSMFGQCVSiXc5KdSKRRFwbKssG5QNvtCCCHE
+9he8123bJpFI8NRTT/HII4+QyWT4yU9+wi9/+UsUReHZZ5/l2LFjvPbaa7Tbbebn5ymVSpLdJ4QQ
+6yQBALEjqaqKruvhC98wDDRNw/d9stms9K0QQgghdpDBwUGeffZZXnvtNcrlMtlslsHBQQ4cOMD7
+77/P8vJy+I5PpVJ0u11arRa1Wk02/0IIcQckACC2jZuVTATp/pZl4ft+uPlXVZXh4WF0XSeRSGBZ
+FleuXMHzPDzPI5PJEI/HWVxcpNPp3PT7bpeOwkIIIcT9yjAMcrkc1Wo1DOBrmkY0GqXb7ZJIJGg0
+Gvw/9u60N67zvBv4/+znzMIZDoerKC7a12hxbMeW7Si2kyhB7TawgyRoCrR9EwRF3/QDFM9H6Edo
+3xRF4SJpWjQpUrRF2qS2Eyey7MiWLFEUxWXIGQ5nOTNnP+d5IZxjUqJ2UjND/n+AYJsiZw6t5b7v
+676WMAzR19eHEydO4ObNm1hcXGQAgIjoEUgA/l+nH4II+LxpYjzyJ5ZOp3HgwAE0m034vo9MJoN8
+Po/+/n784Ac/wMsvv4xjx47h3LlzWFpaQrVahaqqePXVV/HVr34VV69evW9toGEYmJiYQKvV6oru
+wkRERDuRJEnJ7f2dJXphGN7VzC+KInieB1EUoWkaPM+DqqoAgLW1NXiex078RESPiAEA6hpRFMH3
+/bs6+QZBgGazCcuyEEURoiiCJEloNBqYm5vDysoK3n//fTSbTciyjIWFBZimieXlZXzyySdYXl6+
+b3fgIAjQarXgOA57BhARET2k+GAehuFDrZ/ZbBbHjh1DvV6/b2ZeLJ5GpSgKstls0uMnDgrs27cP
+tm3DdV3IssxAABHRQ2AJAPWcTCaDQ4cOYW5uDvV6HaqqJjOEJUlKMgWAh5/EIAgCBEHg5oGIiOgh
+6bqOkZERlEol2Lb9wM+XJAnpdPqum/44kBAEwYbR04qioFgsJut4pVJJMvXi8kDHcSAIAgqFAvv/
+EBE9BGYAUM+QZRn5fB5hGMJxHAwODqLRaKDdbiMIAjiOA9d1oShKchtxr7KCO4miCFVVH/oWg4iI
+aLcLwxCWZcF13YdaO6Mo2jTbTtM0jI+PQ5KkDf14VFXF2NgY9u3bh8nJSaytrW3IBozT/8MwhOu6
+u7qMT9M0jI6OwnGc+2Y9ElFv24o/6wwAUE/QNA2HDx/GM888g3w+j3a7DUVRUKvVNiz4mqZhZGQE
+lmUlNYablRXcKYqiZBNBREREDxavsU8aOA/DEO12G+12e0MGn2EYGBkZQavVgqqqGB0dRSqVgqqq
+sG07ed8oinb9oXd0dBRvv/02bt68ed++R0TU27bizzoDANQTxsfH8f3vfx/Xrl3DwYMHIcsyPvvs
+MzSbzQ0bjzAMkzRERVGSiQAPgzf/RERET99mwXpRFCFJEtbW1pLmvl/+8pdx4cIFjI6OYmZmJikB
+ZPAecBwHN2/eRLlc3vXBEKKdbCv+rLMHAPWEoaEhvPrqq7h06RIymQwWFxdRKpU2Hf0jyzKKxSKy
+2SyWlpbQarV4uCciIuoxoigm67eu6xgYGEAmk4HneajX6zh48CBKpRIWFxchCAInAhARPQRmAFDX
+EAQhqcOP/1uSJCiKAlVVoes6BgcH8corr2B2dhaVSmXThT6uC7Rtm7cDREREPWp98N73fTSbTTSb
+TSiKAsdxoGkaTp8+jWq1ir6+vqT8j4iI7o0ZANQ1VFXd0MVXFEWkUilkMhmoqgrTNAHcHiNUqVTQ
+brcf2Nn/YSYAEBERUfeJ1/EoiqDrOvr6+hBFEXIPjzU2AAAgAElEQVS5HDKZDCzLQqvVwvLyMgAw
+A4CI6CEwAEBdI573G48AEgQhqQEURRFhGMIwDLRarU0j/KIoQtf1DR2EiYiIqDfFk3xc18X+/fvx
+/PPPo9VqYc+ePchms7hx4wZ+/etf49q1a3Acp9OPS0TUExgAoK4Xj7vQdR1nz57FL3/5S8zPzyMI
+AgiCAEEQEEURDMPAxMQE5ubm0G63O/3YRERE9ATWZwCkUikMDw9DVdVknCAAFItFXL16FfV6/a5s
+v/jygIiIPsceANTVBEHA3r178Rd/8ReYmprCuXPnIEkSms1m0twvm81ibGwMgiBsmBF8v9dc32uA
+iIiIusv6Mr4wDOF5HgRBwNmzZzE0NJRMAcrlcujr64NpmnBdN/l6URSTtZ5lgEREn2MAgLqaJEnI
+ZDJIpVKo1WoIggBTU1MYGRnB4uIiRFFEf38//uRP/gSGYWBmZgaWZd33NeNeA67rclQOERFRF1IU
+BQMDAxsaAxuGgVwuhz/6oz/C6dOnceTIEZw9exYHDhzAzZs3sba2lnx+FEUIw5DBfiKiO7AEgLqW
+JElIpVJIp9OYnp7G0NAQzp07h48//hjvvvsuTNPEqVOncPHiRei6Dtd1sbKyAs/z7vu6d/YaICIi
+ou4Qr9GiKGJkZASe58FxHPi+j9OnT2NgYADz8/OQZRmiKGL//v0olUr47LPPYNs2Go0GWq0WD/5E
+9NT0WrkRAwDUlSRJwsDAAA4cOABd13Hu3Dm8//77mJ2dxcrKSjIGKJVKodFoQBCEDRMEiIiIqPMe
+dWMcZ+mtra0BuH2TH//IZDJJZuBbb72FTz75BI1GA7ZtY2pqCgMDA/jtb3+Ljz/+GLZtb9e3RESU
+iMuNemkKidzpB+gWvBXuHrIsY3h4GIcPH8bY2Bi+/OUv4+LFi7h8+TIqlQocx4EoitA0DfV6Hb7v
+QxRF1Go1zv8lIiLqEo+zMfZ9H9VqFb7v3/U1tVoNgiAglUph7969OHv2LMIwxIcffoif/exn8DwP
+lUolaRLM/RwRbbcwDHvq8A8wAJBQFIU3yF1AURTs2bMHx48fh6qqsCwLiqJgZWUF7XYbuVwO1WoV
+nufBNE3W8BMREXWpR90YC4IAWZY3PfwDn48FXF1dxd/8zd8glUrBMAy0223Yto3JyUk0m83kPblH
+IKKnoZcO/wADAAnP85KDJXVONpvFiRMnMDc3h/7+fqysrODKlStYWlpCo9GAoijwfR9RFG247e/F
+6BsREdFO9yjr8oMuYzKZDE6fPo2LFy9ibm4uyQY0DAMnT56EKIpwHCcpGSAiortxCsA6jBR3XhiG
+sCwLruviwIEDaDQamJ+fR7PZBAAYhgHP8zbdUHCxJyIi6l1xMP9elzFxeYBpmgjDEIqiYHBwMBkF
+uLa2hkajgXa7jTAMIYripq/DccBEtJsxAEBdxTAMTE9PI5/P4/Dhw3AcB4IgwLZt2LaNIAg415eI
+iGiHiuv3RVG8a50PwxC2bW8Y9SdJEsbHx+E4Dp577jkoioLl5WX4vg9N0yBJ0l17Bo4DJqKtJEkS
+stlskqXc7RgAoK4SBAEajQZM00SlUsHa2hpqtVrS7E/TNExMTKDVarFcg4iIaAeKmwduFuyXJAnp
+dBpBECQZA6ZpJg0A2+02ACQXCPl8Ho7jbDjoPyjTgIjoUWSzWRw7dgz1eh2O43T6cR6IAQDqmDgF
+L4oiCIIATdOSBXp8fBxjY2PJ59VqtST1v9VqwbbtJPLfSxE3IiIiur8oihCG4aYp+ul0GgcPHoRp
+mnBdF6IoYnh4GOfPn8fExASKxSIOHTqEer2OtbU1WJa16R6BN/9EtFV830e9Xker1eqJ88jmxVFE
+T4GiKCgWi1AUBZqmYe/evRgYGIAkSZAkCf39/Th8+DDOnj2LbDaLVCoFAEltH3B7I3Ds2DGk0+lO
+fitERES0he5Vn29ZFq5fv56UCqTTaRw+fBgAcPjwYbz44ou4efMmRkdHkc1mkclkIEnS03x0Itpl
+4gzmXgksCgC6P0xBO0486scwDFiWBVVVMTU1hcHBQczOziKKIjiOA13XMT4+jmvXriGfz2Nubi5J
+7wM+TwVstVo984eOiIiIHp8gCBAEAVEUQVEUDA8PIwgCDA0NJR//4he/iI8++gjDw8O4dOkSXNdF
+pVLhqGci2vVYAkAPFB/WtzKlRRRFKIqS1OiNjo7i6NGjcF0X09PTOH78OK5du4ZqtYrl5WU0m02Y
+ppmk/sfiQEEvpNsQERHR1ojXfVEUk1LBlZUVlMtl5PN5fP/730cQBFheXkahUMALL7yAW7duJeWE
+3DcQ0W7FEgB6IEmStjyFLm7AE9/ay7IMRVGwsrKS3OanUink83n4vg9JkpLOv3FAQhCELXseIiIi
+6j2+76PRaMDzvKTWX1EUyLIMy7Lw+uuvw7Is/Nu//RtM08TIyAhUVe30YxMRdQwDAPRAQRDANM0t
+T7GPF+nJyUm8+OKLKJfLOHbsGL71rW/Btm2YpolqtQpBEDYs2NsRkCAiIqLeE0VRcvCPmwtbloUP
+PvgAN27cwOXLl5HP51Gv12GaJkqlElzX5WUCEe1acqcfgLpfvLhuBUEQIElS0rwnn8/jueeewyuv
+vIJCoYCxsTFYloVWq4VMJoO1tTX4vp8s2MD2BSSIiIjo6RNF8Z5N/+73Nbquw3VdKIoCQRCg63oS
+DPjHf/xH1Go1XLp0CZIkJSP/bNsGcDvzMJPJwDTNLdvjEBH1AjYBpKdq/YIbBAEURUGhUMDAwADa
+7Tb6+vqSEoBms4larcaFmYiIaIcSRRGqqsJ13UcKAqRSKUxMTGBlZQWFQgGyLGN8fByXLl2CKIqo
+1+sAAM/zkEqlkMlkNjQBlCQpaUTMCwUi2k0YAKCnan0GwPoGPoqiwPd9iOLtqhRd11EsFrG0tJRE
+64mIiGjneZwMAEmSoOs6PM+DJEkQBAGapkGSJJw6dQo3btxAFEUolUrJ53iehyiKIElSMj2gVCpx
+n0FEuwqnANC2EkXxrk67dy7yqVQKR44cQT6fTwIDtm2j3W7DdV126iUiItrBHmedj6IIQRBAlmW4
+rgvXdWHbdvLvzz//PL7zne+gVqthdXU16f4f9xFyXRetVov7DCLadRgAoG0Tp/U9aNzO6Ogo/uqv
+/grf/e534bouZmZm4Pt+slg/bZIkIZ1Ob8hSICIiou4SRRHCMLxrr5DJZHDixAnk83kcPXoUS0tL
+cBwnGRssCAJc100yAoiIdhNOAaBtE4/6i9Pt7tW5v9ls4je/+Q1c18Xk5CTy+TwGBgYgy53pUWkY
+Bg4cOADDMDry/kRERPRw7jz8a5qGw4cP48yZM7h06RJ+9KMfYXV1NekvJEkS+vr6OrbHICLqNP7t
+R9sqXpjjQ/W1a9dgmiaAz2/aLcvCP/3TP+G//uu/ks9vNpsda/5nWRauXbsGy7I68v5ERET0eIIg
+QKPRQLlcRrPZRCqVSm76BUGA7/uoVqvJVAAiot2GTQDpqdis225fXx9OnDiBmZkZmKaZLMa5XC7p
+/i/LMlP0iIiIaIPNmgoDt/sKHThwAIIgYM+ePSiVSrhx4wZSqRQqlQocx+ngUxMRdR57ANC2kmUZ
+fX198DwPtm3fdZAXBAF9fX0YHBxEGIawLCspHZBlGYVCAa7rckQPERERJeKxwr7vbygDiDv8Lyws
+wPM8nDt3LmkCyJF/RETsAUDbLJPJ4PTp08hkMhs+LkkS+vv7cezYMXzzm9+EYRhoNpsQRRHFYjEZ
+C8g0PSIiIrpTEAQwTfOuA73rulhcXES73Uaz2YRhGHj22Wdx5swZ5HI5CILQoScmIuoO7AFAW+Je
+qXimaeLixYtotVpQVTVJ50+lUpiamsLMzAyuXLmSjO3xfR+lUgmu6yaZAI/qceYJExERUe+Ioigp
+Fczlcmi1WkmXf9/3EUURHMfB6uoqRkdHN3xcFEXIsnxX9gAR0W7ADADaEpt1+ZckCZqmwbIsiKKI
+QqEARVEAALZtY3FxEYqiwHEcnDx5ErlcDlEUwbbtx16Q49GDosjf2kRERDtdX18fXnjhBYyNjUGS
+JIiiiEwmg/7+frTbbfzyl7/E6uoqms1mklGoqirGx8ehaRpkWWZWABHtKuwBQFsijqyvT8UzDAP7
+9u2DIAhot9uwLAu+70MURaRSKURRhGw2C+B2pkA6nX7i7v/3mglMREREO4/neSiXy0nJoCAIKBQK
+OHnyJNbW1rC6uorFxUXMzMyg3W5DURRomobh4WE0m01omsZMACLaVTgFgLaNJEnQdR2e5yVRd0VR
+kMvlcOzYMezbtw+vvfYaLl26hA8++ABf/OIX8fd///e4detWh5+ciIiIepEgCFAUBX19fQA+v2AA
+bmcL5PN5zM/Pw7Is2LYNAHeVLxIR7WTsAUBb5s4+AEEQoNVqJT8fd/XP5/NotVo4e/Ys5ubm8O//
+/u+4efMmrl69ipWVlSd6f0EQEEURF3IiIqJdKIoieJ6HtbW1JOPw1KlTSWDAsiwIggDXdaGqKhzH
+gSiK0DTtiUoQiYh6BTMAaMvEI3lM00QYhlBVNWnmB9w+oKuqCk3ToKpqUp9XrVY3HRH4JO//JGUE
+RERE1LvifkCe50FRFGQyGYRhmOwThoaGUK1WoaoqZmZmAAATExOYm5tDu93u8NMTEW0vZgDQllk/
+kkfTNIyMjKBUKiUpdqIoQtd1yLIMwzCwsrICy7KQSqXged4TH9rjDAPbthkAICIi2qWiKILrutB1
+HdPT07AsC1EUQZZlDA4O4vDhwzBNE7/85S/hOA4AYG5uLtmvEBHtZMwAoG0RR9/XZwBkMhl84Qtf
+gK7rSKVS+L//+z/U63UAG+vvHneM32bvSURERLtHnOofhiEmJyfxve99D41GA+Pj4/joo4/w3nvv
+QRAEyLKMmZkZWJbV6UcmInqqOCuNtkUYhkktnSzLyOfzkCQJ9Xodr776KlKpFMIwhKIoEAQBoigm
+/3zcMX7r35OIiIh2H0VRUCgUkEqlMDAwANM0oes6XNdFqVRCvV7H0NAQTp8+jXQ6DUmSkEqlOD6Y
+iHYNjgGkbRE31AnDEJlMBs8++yxUVcWtW7dw69Yt6LqedOFVVRWyLCdZABzjR0RERI8jbgIoSRLC
+MMQnn3ySNBoGgKWlJVSrVdTrdVQqFaiqiomJCbRarWRiERHRTsYeALTlBEFAKpXC4OAglpaW4DgO
+rl27hlqtBtM0sbCwAMMw4Ps+giBIau7i7v3s4E9ERESPK4oiTE5O4uTJk/jP//xPVKtVeJ4HXdeT
+G/99+/ahUqnAsizcunUr6QVARLTTMQBAW06SJKiqinK5jCAIYBgGarUaDMNIFt6VlRUEQZDc/D/o
+xv9x+wIQERHR7hCXEfq+j+XlZQwPD8NxHLRaLURRBFVVcfbsWbiui48++gj1ej3JPuTlAxHtFmwC
+uAsJggBJkjY03tuu10+n0zh69CgA4Pz586hUKmg2m8hkMvjVr34FTdPQbrcxPz9/z+g7m/sRERHR
+wxBFEVEUQRRF9PX1QVVVVKtV+L4PTdMwMDCA0dFRXLlyBe12G2EY8vBPRLsKewDsQvEcXN/3t+1A
+Hb+uJEkwDAOCIOD06dN4+eWXceTIEZimiaWlJZw/fx7PPPMMPv30UzSbzU1fi30BiIiI6GHEh/ko
+ipDJZHDu3DmsrKzAdV2kUik0Gg3U63UYhoF8Po9sNgtVVeF5HvcZRLQrMANgF9rqDIB45E6cyh+/
+piRJ2LdvH958800sLCxgbm4O7XYbmqahVqtBURRYlgXf91EqlVh/R0RERFtGURTkcrkk1T/OJsxm
+s3j55Zexf/9+RFGEubk5XLx4EQsLC2wESEQ7Hmee3GE3jIGJogi+729ZypuiKCgWi0in0xAEIfm4
+YRgYGBjAr3/966S+rt1uI5fLodVqYWVlBfV6HYuLizz8ExER0ZbyPA+VSgW+70NVVeRyuSQIsLS0
+hDNnzqDZbGJxcREnT55ENpvt9CMTEW07lgCsE9easx7s0YRhCMdx4DjOhv9vURTBtm3U63WIooiX
+XnopqcW7desWBEHAyZMnUa1Wk0kARERERE9i/ShiVVUxOjoKTdNgGAaiKIKiKAjDEMeOHcPIyAhm
+Zmbw8ccfY21tjWUARLTjMQCwDmvNH9/6cgJJkpJsgNHRURw9ehQrKyu4ePEirl69ivn5ebTbbbiu
+i2q1CtM0+f+ciIhoFxEEAbIsb/mFiyRJyOfzGBwcRLvdxsDAAL71rW+hXC5jYWEBrutCFEUEQYBM
+JgPHcfDee+9heXkZvu9v6bMQEXWjnZ/vvglN0zA+Pg5N0+76OR5En5xhGDhw4AAURUGtVkMul8Mz
+zzwD3/fRbDZh23ZShlCr1bjgEhER7TKSJCGTyUCSpC19XU3TMDIyglqtBtd1sbq6ih//+MeYm5uD
+7/vo6+vDyZMnkU6n8emnn6LdbidTi7b6WYiIutGuzAAYHR3F22+/jZs3b6LRaHT6cXaMuH9CEARo
+tVpJKYUoijBNE4IgJFkW8aFfUZRkIgHLLoiIiHaH+CIgCIItfd0gCGCaZrIPCYIA7XYb6XQauq5D
+0zQcP34cfX19qFQqWFpagizLGB4eRq1WYxNAItrxdmUAwHEc3Lx5E+VyecsXnt1qff+EMAwhCAL2
+7t2LI0eO4Dvf+Q5M08T169dRqVTgOA4EQYAgCCgUCjh27BjW1tZ6qhHgdqUuEhER7RbbkXUZRRE8
+z7urJ5HnefB9H6IoYmVlBaqqQlVVnDp1Cl//+tdh2zZu3LjRU3sRIqLHsStLABzHwfz8fEf+kpdl
+Gfl8HrIsP/X33k5hGMJ13WQxj+v7NU3DtWvXEIYhxsfHkyyBTCYDURTRaDTw2WefwbIsALcP1qqq
+bpgm0I22K3WRiIiInowoitB1HaIoJhcOcbaBLMvIZrN444038KUvfQme52F4eDiZFNDf37/j9mhE
+ROvtygyATurr68Pp06d3ZOf7O6PtruuiXC7j+vXrmJ+fx/z8PFzXRSqVgud5ScAgCIKkBEBVVRQK
+Bbiu29XZGduVukhERERPJu4DYFkWwjCEpmlQVRXDw8N45ZVXAAC//e1vUalUMDs7i3q9junp6eSy
+olwu77g9GhFRjAGAp8z3/Xt2vt9JaeXxQqsoCgYHBzE8PIxSqQTDMHD8+HG4rgvTNKEoCoaHh2FZ
+FnzfTzIJeqEGjw0jiYiIuk8YhrAsC67rIooiSJKE0dFRjI6OolarYX5+HktLS1AUBXv27MHS0hKG
+hoZw9epVXL16FfV6nWs8Ee1YAoDeP23uELIsI5PJwDTNnu+MPz4+jj/7sz/D4uIiFhYWYFkWfve7
+38G2bRiGAdu24bpukvK/vnyAiIiI6HGJoogoipILlbhPkaIo0HUd09PTaDabOHDgAA4cOICPPvoI
+165dw/LycjKpiIhop2KRUxeJO9f2elq5IAhwXRfXr1/H0tIS2u02XNeF7/twXReu6yafJ8syD/9E
+RES0JeLDfnz7D9zOCLBtG7Zto91uw7ZtCIIA27Zx8+ZNTExMoNFowLbtpMfPTriMISLaDDMAaMuI
+oghRFJFKpSCKIvL5PPr7+1Gv11GpVO4qe4jr/avVahIU6DRBECBJEoIg4A0AERFRj1EUBblcDvV6
+/b7lhH19fThx4gRmZ2eTywlJkqBpGo4ePYrf/e53qNVqT/HJiYieDvYA2CW2u79AHHHXdR0HDx5E
+FEUYGxtDsVjEjRs3UKvVkveWJAn5fB7pdBrNZnNDlL7T4jKMuB8BERER9Y58Po9nn30WlUolmTC0
+mbhPQK1Wg+u6mJ6exgsvvADXdTEzM8M+AES0Y+3KMYC70XaPrYub97Xbbdy8eRODg4M4dOgQBgYG
+Noz0k2UZw8PDeO655/D6668jlUp11QK7U8owiIiIdqNGo4H3338fjUbjvp8nSRJSqRSA2w2abdtG
+Pp/H3r17Yds20/+JaMdiCcAu8TRT2+P0O0VRkvm78djDbDaLkydPYnl5GYZh4Pr162i329v6PERE
+RETrre8VIAgCdF3HgQMHUCwW8dvf/nZD5iIR0U7CEoAeFne5fVhP46ZdlmWMjo7i4MGDEEURgiBg
+//79cBwHrVYLQRDAcRxUKhVUKpWuSv8nIiKinU3TNIyOjsK2bTiOA0EQoGkaDMPA3r17cf369aQB
+IPcnRLQTMQDQo+LIdRiGHV2gZFlGX18fZFmGruvo7+/H66+/jm984xt444034LouPvjgA6ysrMDz
+vA0Lb7vdvmdQIh4PuJ1Bi+3ui0BERETdQxRFTExM4K233sLs7GxSJhBFESRJQqPRSC4nuqk8kYho
+K3EMYI+Ka+47vUClUimcPXsWwO2ouqIoSZnBysoKZmdnUS6Xkyi74zhJx937HbwVRdn2CQEc9UNE
+RLR7yLKMIAjw4x//GOVyGcDtw38YhnAcJxkDeL89gSzLyOfzD7zIICLqVswA6GHdcHMdBAGCIMDB
+gwdRKBTwla98BZqm4YMPPsCPfvQjfPrpp0lAQFVVBEHwUIGLOMBxvxE+TyqKIvi+nzT8expZB0RE
+RNQZYRii3W6jWq0mh/y4/j+dTkMQBAwPD6Pdbt8zCJDP5/Hyyy9DluUNr0NE1CvYBJCemCzLSdO/
+oaEhNBoN1Ov1pLlff39/skh28+FaVdVtzzogIiKizogbIseXEqlUCtlsFrIso1arwbIsqKqKZrN5
+z4M9MwCIqNcxA4CeWBiGsG0bAJDJZLC0tATLspBKpeC6bjJOp9sXyaeRdUBERERb51Gy92RZRiaT
+gSAI2LNnD86cOYNz585BEAQsLCxAlmW4rosgCKDr+qaTk+IsAjYxJqJexQwA2hKiKMIwDOi6jr6+
+PtTrdbRareQwHXfZjXsBPI1xhERERLSzPWz2Xjw56c4MAMMw4DhOcuOfTqfh+z4KhQJmZ2c5qpiI
+dhxmANBj2ayDfhAEKBQK+P73v48wDLG4uAjf96GqKjRNw969e+E4DjRN64mMACIiIupuD5O9t35y
+Utz3J4oitNttNJtNCIKAQ4cOwfd9WJaFYrGI5eVltFotXlYQ0Y7DAAA9ljiNLooiGIaBIAggiiJS
+qRTm5+dRqVSSRVkQBLiuC9M0YVkWPM9DFEXQNK3jYwyJiIiot8WH+s3Edf/rMw/jPcz6y4ggCNBq
+tRCGYdLgjyWBRLQTMQBAjyXuoG8YBo4dO4YwDKHrOl5//XWMjY3h0KFDGB4exvLyMgzDgG3bsG07
+GbejaRpGRkZgWRY76BIREdG2iA/7nuclh/07pwAZhoH9+/dD0zRIkoRKpZLsWYiIdhoGAOixxQtp
+Op3Gvn37EAQBNE3Diy++CM/z8Lvf/Q7z8/NotVrwfX/DQhqGISzLYhMdIiIi2jZ3HvaBz6cXZbPZ
+ZB8SlwQoigJBEGDbNksViWhHYhNAeiJxc7+9e/fi5Zdfxs2bNxEEARzHwa1bt2CaJkzTTFL9edgn
+IiKiTurr68Mrr7yCQqGAn/70p/A8D6dOnYLneThx4gSq1Sr+4z/+A7VardOPSkS05bY9A+BRxrNQ
+75AkCYZhIIqipEbu1KlTeOONN7Bnzx4AQDabRT6fh2makCTpriwAIiIioqctCAKUy2XMzs6iXq9D
+FEW0Wi00m03MzMxgZmYGlmVBFEXuX4lox9n2AEA8niWeq0q9IR6Xcy+GYWBqagqe58FxHARBAMuy
+IMsyRkdHEQQBZmdncf36dWiaBkVRYFkWfw8QERFRR8VliKZpQpZljI2NYWxsDENDQ/A8D5VKBdls
+FtlsFrZtc+9CRDvKtpcACIIARVGSzu/U/eJxOa7r3jPyLUkSdF2H67rwfR8DAwP4gz/4AwDAwsIC
+PvvsM6yursKyLGiahlQqhVqtxo66RERE9NQ86BZ/ZGQE3/3ud1GpVLC4uIjnnnsO//AP/5BMAfA8
+D6qqsicAEe0Y4na/QRRFbPTWY+LxfcDtDA5BEO76nPjGX5IkyLKM/v5+jIyM4PLly6hUKiiXy2g2
+m/B9H+12G2tra+z2T0RERE9NfKEhivfe7larVbzzzjv43//9X/T392PPnj3QdR3tdhu2bUNVVUxM
+TEDX9af45ERE24dTAGhTURRBUZT7lm/Eo/xUVcWRI0ewurqKjz76CNVqFZZlbYiUM2pORERE22Wz
+0sV49PCD9iBxP6NcLgdRFFGr1bC2toZsNgvHcdBoNOA4Di+ziGhHYACA7inOBLhX2n4YhnAcB8Vi
+Ed/5zndw5MgRfPjhh8n4HFEUUSgUNszeJSIiop1FEATIstyxA3J80x9PHFrvQc+UTqdx+PBhSJKE
+KIpw5coVpFIphGGIZ599FuVyGZ7nsZExEe0YDADQfd2v8U081i+dTmNkZAR79uzBhx9+CNu20Wq1
+kjE7a2trsCyLCycREdEOJMsyMpkMfN/vSMD/YW/6NxMEAZrNJizLguM4WFtbg6IoWFtbw/z8PIIg
+wJEjR9ButwEgCRRwT0NEvYoBAHpskiRhYGAA4+PjKJfL+PWvf41sNouhoSEsLy/DNM1kIQ2CgI0g
+iYiIdqAoiuD7fke75T/u/iKKIgRBAF3XYds28vk83nrrLdRqNczPzyOXy+Ho0aOwbRuGYcAwDLTb
+bU4GIKKexQAAPbZ0Oo19+/bBcRycPHkSpVIJsiyjXC6jXC7DdV20Wq0kqs7DPxER0c7Uy6V+URRB
+EARks1k0Gg3Mzc1heXkZYRhienoaURShXC5DURRUKhXYts09DRH1LAYA6LGIooggCNBqtWCaJlZX
+V9FoNBBFEfbt24fl5eUk7T8IAi6URERE1BGapmFsbAyyLN9zMlUQBAiCAKIownVdmKYJAFhbW8PC
+wgIMw8Abb7yB69evo16vP+1vgYhoyzAAQI9sfbMdTdOwd+9eDAwMYGxsDLqu48qVK2g2m0z5JyIi
+oo4bHh7G9773PWiahsXFxWTU8XqCICCVSiA3iaIAACAASURBVKFYLKLZbEJRFAwPD8M0TZimiXa7
+jdnZWZTLZab/E1FPEwDwhEaPRBAECIKAKIqQy+Vw/PhxlMtl+L4P0zST1H92zCUiIqJO0zQNQ0ND
+aLVaqNfryU1/XPcfhiEEQYAkSdB1HYZhIJvNAri951lYWIBt2x3+LoiItobY6Qeg3hEvlqIoJj9U
+VUWxWMRzzz2H06dPQ9M0TE1NQdM0Hv6JiIio4xzHwa1bt1CtVpPbe13XMTExAV3XAXzeDBAAJicn
+IUkSpqam8MUvfhF79uyBqqoQBKFj3wMR0VZhCQA9NE3TMDIyAs/zoOs6ZFnG0aNH8dJLL+HMmTMo
+lUr45JNPUK1W0W63H9gQqNNzg4mIiGh3CsMQrVYLjuNAEASk02kMDw8jDEMEQYBUKoULFy4gDENk
+MhlUKhVYlpVkQBIR9SqWANBDkyQJ6XQ6mYWbTqfxhS98AaZpQhAE5HI5XLp0CUEQwDRN+L5/39eL
+5wY/zOcSERERbRVRFJNLiGw2i/379+Pll1/Gb37zG0xPT2Nubi5pBFgqlbCysgLf96EoClzX7emp
+B0S0uzEDgADcXggfFNFWFAX5fD6pl0ulUgiCAL7vY3Z2FouLi8nNvyRJCMPwvq/ZDXODiYiIaPdR
+FAWFQgGyLGNqagoLCwv49NNP0Ww2MT09jUqlgr6+Pnzta19LshuDIEAYhjz8E1FPYwCANnT1f5i0
+Ntd1kUqlcPbsWQwNDaFUKsH3fbRaLYRhiHQ6jaGhIbTb7Qfe7HMRJSIioqctDEO4rgvbtlGv19Fo
+NNBsNmGaJpaWluA4DlZWVtBsNtFoNGDbNjzP476FiHoeAwCEKIoeOqK9fvHzfR/lchmZTAb79u3D
+6uoqHMdJggH3mrVLRERE1GnxjX48FlBV1WQPY5omGo0GXNfFmTNnsLi4iFar1eEnJiJ6cuwBQI9F
+EATouo58Po90Og1RFDE3NwfbtpO6Ot/3GSknIiKiniCKIgRBQCqVgqqq0HUdtVoNhmGgXq/D87xO
+PyIR0ROTO/0A1JuiKILrulAUBc8//zwsy0Kj0cDKygpkWUahUEC1Wk2i6kRERETdLO5vdPDgQYyM
+jGBqago/+tGPUCqVmNFIRDsGSwDoibiuC0mScOLECdi2nYzIabVa8DyPCyYRERH1BFEUIYoi6vU6
+lpaWMDc3B1EUkU6nkU6nAdwufxRFEdlsFrIsIwgC7nWIqKcwAECPRZIkpFIpKIqCsbEx1Ot1NJtN
+7NmzB319fahUKrz9JyIiop6hKAr6+/vhui6y2SwA4LXXXsPRo0cxPT0N3/dRrVahaRqOHz+OdDqN
+er3OUcZE1FPYA4AeSzabxcGDB3Hr1i1MTEzgxIkTSKVSuHjxIq5evYparcbxfkRERNR1BEGAoih3
+ZSrGHx8ZGcHbb7+Nn/70pzBNE6qqJqWO7XYbgiAgnU4jCAJYlsV+R0TUU8ROPwB1L0EQoKoqBEHY
+8DFZlhGGIUzThGVZsCwL58+fh+u6uH79OtbW1nj4JyIioq6kKAoKhQIURdnw8bi/0fLyMt555x3M
+z89jbW0NqqqiXq/DNE2EYYggCNBoNJLxx6qqYmRkBKqqJq8litxiE1F34t9OdE+bLZCSJCGTyaBQ
+KOD8+fMYHR1FFEVoNBrwPA+u6zISTkRERF3L8zxUq9V7dvV3XRelUgnpdBp79+5NDvPrL0TWKxQK
+uHDhAgqFAoDbh39VVRkEIKKuxB4AdE/xbFzf96EoCoaGhhBFEWzbRi6Xw1e+8hW4rosoimBZFhYW
+FrC8vAzHcTak1ImiyAY5RERE1DU2y1SUJAnZbBZhGEKWZQwMDOAHP/gBjh8/jitXrqBer2+6n3Fd
+FwsLC6hWq0lTwDAMeSFCRF2JPQDooYyOjuIP//AP8d577+Hy5csAgOHhYQBAOp2GLMvo6+tDqVTC
+rVu3kgaAcRScmQFERETUzfr6+nDs2DF88sknaLfb6O/vx/DwMGzbRrlcRrPZZIkjEfU8ZgDQA0mS
+BE3TUK/X4bouTNOEbdtwHAe5XA5ra2sIwxCLi4uo1WoQBAGSJCGKIkbBiYiIqCf4vo96vQ7LspDN
+ZjExMYHZ2Vmsra2hWCzCsiwEQQBZlpnZSEQ9i8VJ9ECGYWBqagqGYeDrX/86JiYmIMty0hDQsiyU
+SiXUajX4vo/BwUEMDw8nCyQP/0RERNTt4uZ+giDAMAzMzs7CNE04joNSqQTXdZNeSJIkdfpxiYge
+C0sA6IFSqRQmJydRLpeh6zqq1Sosy0qmBKxP7xdFMWka6HkeD/9ERETUU+JxgL7vIwzDJLMxnozk
+ed5dIwSJiHoFMwDogeLutrquY2FhAe12O7nZt20bURRBFEUIgoAwDOE4DhzH4eGfiIiIek4URfB9
+H6qqIpvNYmBgAMViEdPT08lUAB7+iahXMQOANiWKYnKA1zQNg4ODKJfLcBxn089VVRVhGELXdbRa
+LTbJISIiop6lqirGx8cxNTWFAwcOYG5uDrOzs1haWkKz2Uz2SHG2ADMCiKhXbFsTQE3TMDo6Csdx
+eBjsMesP9FEUJTVxd/46xj0A4myAvr4+HD16NOkFkM1mIctyMhKHiIiIqBfEe5vJyUl84xvfwJkz
+ZwAAV65cSbIfgduBgkKhANd1ud8lop6wbQGA0dFRvP3227h58yYajcZ2vAVtk4ft3C/LMjKZDIIg
+gK7rUFUV5XIZpmnCMAwcP34c6XQa9Xodvu8/pafvfaqqYnh4mMEzIiKiDomiCJ7nwbZtAMC7776L
+d999F41GA5IkJZckURTBcRx4ntfhJyYiejjb1gOgXC7jnXfeQblc3q63oG30MPX7QRDANE1IkoTB
+wUFYloW1tTX4vg/LsnD58mXcuHEDrus+hSfeOYrFIt58800Ui8VOPwoREdGuFKf2a5oGWZYxNjYG
+13WhqiqCIICiKBgbG4Msy3Bdl5mORNQz2AOAHlncDTcIAgiCAF3XAQC2bbPx3xZQVRXFYhGVSoXB
+EyIiog5QFAWTk5M4ePAgrl+/jlarhVqtBtd14fs+RkdH8eabb+InP/kJFhcXO/24REQPjQEAemRx
+6r9pmtA0DdPT07hx40YyHUAQhGQiABEREVE3URQF/f39WFtbu2fqvqIoGBoaQjqdRq1WQxiGSKVS
+WF5ehuM4DNYTUc/iGEB6ZHHqfxRF0HUd/f39SKfTmJ6exuTkJDRNg6qqEEX+9iIiIqLOEgQBmqZB
+URQIgoD+/n68+uqr6O/vv+fXxOWMU1NTOH78OPL5PEZHR6GqKgDAdV0sLi7y8E9EPWfbmgDSzhQf
+6mVZxvj4OAYHB+E4DgYGBvCDH/wAhw4dwuXLl9FoNFgPR0RERB2nqiqGhoagqiocx4HjOFhaWkKt
+VgMAGIax6cQiQRBgGAY8z0tq/RuNxl0j/wRBgCiKXbvv6eZnI6Knb0eVADxoXj09mXg8oOu6GBoa
+wve+9z00Gg189tlnGBsbg2mauH79OmZmZuC6btIngIsOERERdYogCMl4Y9/3N+xLUqkUJiYmMDc3
+h3a7veFr9u7diz//8z/H4OBgcsHxd3/3d/j444+TfU4qlYLruhAEAa7rdl354/q9W7c9GxF1xo7K
+AODowe0VjweMogiu6+LmzZu4cuUK1tbWoOs6Pv74Y9Trddi2DVEUkclkkvF/mqYlX0tERET0NAVB
+sOkBOAgCtFot2La9YY8iyzIURcGVK1cwNzeHPXv24Fe/+hU+/PBDhGGIIAhgGAYOHToE27bRbre7
+8oD9sKOdiWj3YAYAPRZJkpDL5aBpGmq1GiRJgm3bEAQBwO0FVRRFBEEATdMwMjKCUqmUzNMlIiIi
+6lbxxKMwDJOGgPHo46GhIczOzsJxHBiGAcdx7sosICLqVjsqAEBPTyaTwYsvvoiJiQn85Cc/Qblc
+RhRFGyYExLf/cfqZ7/uQZTlZJJkRQERERJ2wfqTxvfYicelALpdDq9VCFEUYGRlBrVZDvV5HEARP
++amJiJ5c15UArK/Tou4S/9pEUQTf91GtVjE7O4tms5kc6uOfizMA4q/zfR+qqmJsbCwZFcgAABER
+EXVCfGHh+/6me05RFKHrOkZGRvDKK6/AdV2srq7CdV3k8/nkc9jriGj36fXGml0XAFBVFYVCAa7r
+MrLaZdb/2iiKAlmW0Wq10NfXB8/zkkUwDMPk1h+4PUs3rpdrt9uwLAtBEECWZQYBiIiI6Klbf2Gx
+GU3TsGfPHriuixs3bmB5eRmO42BoaAh/+qd/mlxmxJcgMVEU2feIaAeLzzi9/Ge86wIAYRjCdV14
+ntfpR6E7xL82oihi3759eOGFF5LFT1GUDR1m1zediX/Ei23872xKQ0RERJ0S70E2yz5VVRXFYjG5
++Y8vOSRJQq1Ww40bN5LeRusPAXHfI8uyNgQGiGhn2AlnmK4LAADgzX8XitP5wzCEqqro7+/HsWPH
+cOHCBbiui0wmA8uyYFlWshDe+c879WrUjIiIiHaOzbJP7xyfNz4+jlQqhXQ6jdnZWVSrVTiOc9de
+JgxDWJYF13W5zyHaoXr9z3ZXBgCou6xPdZEkCRMTEzh//jxkWcby8jIAwLZtZDIZrK6uwvO8nq+N
+ISIiot1hs+zTXC6Hl156CdlsFvV6HVNTU5icnIRt21hZWYHv+1AUJckKWH/pwYkARNTNOAWAHsr6
+A32hUMDp06fRarUQBAEsy8Ly8jJc14VpmoiiaEPUnIiIiKiXKIqCfD4P3/dh2zaKxSJ0XYdt21he
+XoYgCBgYGEC9XoeiKBumHxERdTNmANBDWR/Jdl0X5XIZjuOgUChAlmWsrq6iXq+zvp+IiIh6XhiG
+8H0fuVwOsixjYmICp06dSpoYt9ttCIKAdDoN0zTZu4qItoUkSchms1uaWcQAAD2QIAjQNA39/f3w
+PA++7yfN/CqVCiqVSvLxB9X9ExEREfWCoaEhfOtb30KxWMSXvvQlfOUrX8GXvvQlHDx4EB9++CEE
+QcD58+exsLCAVqvV6ccloh0om83i2LFjqNfrcBxnS16TJQB0F0EQIElS0vFWFEWMjY3hueeewy9+
+8QtUKhXouo49e/bAtm20223k83msrKwkI/8AJCUCRERERL0kHgOYzWZx9OhR5HI5fPjhh2g0GnAc
+B4uLi1AUBalUCtVqFa7rdvqRiWgHkiQJ6XR6S89VDADQXWRZRiaTSerZ4vE4cSMc3/exd+9e/OVf
+/iVu3ryJ//7v/8bi4iKiKMKpU6eS2v+PP/4Ypml2+tshIiIiuosgCFAUBZ7n3ZW5OD4+jm9/+9v4
+8Y9/DNM0oaoqVldXkxu4eNxfPAqQiKhXsASA7hJ3sF0fZQqCAO12O7ndF0URgiBgdXUVqVQKzWYT
+9XodlUoFy8vLKJfLaLfbdy2onA5ARERE3WCz8X/A7YsQTdNw69YtaJqGbDaLdDqdNASM+xxx3B8R
+9SK50w9A3ScOANyP67potVp48803Yds2PvvsM7iue98o+J0zdYmIiIg6xfd9VKvVuxr4ZTIZnDp1
+Cr7v44c//CFyuRz+9V//Fb///e8xPz+P2dlZOI7Dm38i6knMAKBHJooi0uk0DMPAjRs38Itf/CKp
+hYv7BtwLpwMQERFRp8X9jjbrrB2GIURRxIkTJzAyMgJZljE7O4uDBw/imWeeweXLl9FoNDr05ERE
+T4Y9AOiR6bqOZ599Ft/85jfx85//HO+++y4AYGJiAnNzc2i323d9TZz6zzQ5IiIi6rQ7+x2tF/c+
+6u/vR6FQwOHDh7G0tARRFLG6uppkAAC39ze82CCiXsISAHpkruvi008/RRiGKJVKSb+Aubm5TdPh
+1qf+MwBAREREnRYEAUzT3FD7L4oiFEWBLMtQFAWmaaJer6PZbMJxHIiiCF3XN3w+SxuJqNeInX4A
+6k2WZeHWrVuYnJxEKpW6q0ngemEYcnEkIiKirhH3OxIEAbquQxRFyLKM4eFh7N+/Hy+99BKKxSJ8
+30epVEKtVkMul8Nbb72FwcFBCIIAUeQ2moh6DzMA6JHpuo4DBw4gk8lA07QkAu77PmRZRqFQuGsm
+Lg//RERE1G1UVU3G+bmui5WVFURRhGeffRaCIKBeryMIAgiCAEEQ8M///M8ol8sQBAGpVAqZTAaV
+SmXDnoeIqJuxCSA9MkVRMDw8jH379uHChQuYm5tLxuEUCgVcuHABCwsLaLVanX5UIiIiontaP84v
+DEP4vg/LsjA3N4e5uTmIoojnn38emUwGURShXC4nowDjsYB3ThEgIupmDADQIwvDEK1WC77v49y5
+c7BtG4uLi6jX67AsC4uLizBNE4qiIAxD1v0TERFRV4pLAdbvVeJ9jm3bMAwDp06dwoEDB/C1r30N
+oiii0Wgk+6D1PQSIiHoBAwCUiLvePqhbv2EY2LdvHwzDQLlcxq1btzA0NITl5WW0Wi04joNCoYCx
+sTE0m00EQQBN0xgMICIioq4X74cEQYCiKFhdXUWtVkOj0Uj2SJVKhTf/RNST2AOAEoqiYGBgILnJ
+v9dhvb+/H3/8x3+M5557DktLS/jbv/1bfPLJJ7AsC6qqIggCVCoV1Ot1OI6zob5usykBRERERE9T
+3NHfcZy7bvEVRUGhUIBt2zhw4ABGRkYwNTWFZrOJmZkZXLt2jfsZIupZzACgRBRFyW2953mbNu6L
+F8xUKoVisYj3338f7777LoIggOd5yOVycBwHruvC8zxEUbShvo4ZAERERNRphmFgamoKvu/DcZy7
+9ieCIMCyLARBgKGhIVy5cgXtdjsZf2xZFhscE1FP4vwSSsQH9ThtfzOqqmLPnj2QZRnvvfceqtVq
+Mv5vYGAApmnC9/27XjdumAN8HkTolvE53fIcRERE9HQ4joNSqYR8Pg9VVTf8XJwBIIoi6vU6SqUS
+LMvC/Pw8jhw5gq9+9avI5XIdenIioicjAOCVLN2TIAiQJAlBECCKIoiiiFQqBcMwIEkSDMNAtVrF
+wYMH8eKLL+Kdd97B4uLifV9T1/WuKQmIRxjG3X97lSiKPf38RERET9u99gDrPz42NoYf/vCHqFar
++PnPf44oilCr1VAqlZIeADtlL0FEuwMDALvYwyxYsiwjk8ncdbMfz7/dv38/FhYW4Hkestls0hRH
+URQASMoABEHYkAHQTQtlrx+eu+3/JxERUS+Km//F4v3M9PQ0BgYGkhHHnuclUwCiKOqqiw0iogdh
+D4BdTNM0jIyMwLKsu9L2Y/F4nDtLAgRBQLFYxPnz5yEIAhYWFrC2tgbf96EoCkZGRpDJZNButxFF
+EVRVTaYAbDZyp5O65TkeV9xngYd/IiKix6eqKoaGhpBOp5FOp2FZFjzPg2EY+Pa3v41isQgAKBaL
+yZhA9joiol7DAMAu9rAL1mYHS1mWUSgUUCwWoaoq5ufnk6h3FEWwLGtDdJwH1O3FDQcREdGTCcMQ
+juOg3W6j3W7D932IoghZllGv16HrOn7/+9/j1q1baLVaANCVFxtERPfDEgB6LLIso1gsYmBgAK1W
+C6VSCVEUJfVw8YL4JO7sP0BERESdt5vW51QqhSNHjkBRFCwtLSEIAkiShNXVVSiKsmnzYyKibsYM
+AHosuVwO3/jGN/DlL38ZlmVBFEVMTk7C932EYbglkfC4/0D8mkRERNR5u2l9DsMQjUYDlUoFURTh
+tddew0svvYSrV69ibW3tnlOTiIi6Feef0SMTBAG6ruPYsWM4ePAgXNfFa6+9hjfeeAPHjx+HIAhb
+ciMQBAFM0+TiSkRE1EV2+vq8flxx/L26rotCoYCrV6/iX/7lX1CtVpn2T0Q9Se70A1D32izFT5Ik
+6LoOACiXy8hkMpifn8eVK1eg6zocx9myJjhxTR0RERF1j52yPguCAEVRkolF8cdUVcXIyAhWVlYA
+AI7jYHx8HH/913+N+fl5/OQnP+nkYxMRPRFmANA9SZKETCYDSZKSj2mahsnJSQiCgP/5n//Bu+++
+i3Q6jVarhdXVVYyMjEDTtC15f1Hkb08iIiLaHoqioFAoQFVVKIqCdDqNsbExAECpVIIoipiamkJf
+Xx80TUMmk0GpVEK5XN4RARAi2p3YA4DuabMRgGEYotVqQZIkvPTSS/jqV7+KkydPolqtolQqwXVd
+NJvNTccGiqL40JkB8Wz7eHQgERER0VYKwzDJWszlcpicnMSFCxcwOzuLWq2GIAgQBAGKxSKGh4ch
+SRJ+9rOfoVKpwLbtHd//gIh2Jk4BoEcSH+IVRcHo6Cj+P3t30hzHed4B/N/79OwYDIABCG4AuAhi
+uIuWRMmWbUaS5WxWKUqq7CSXHLKd8glS+Q7J0YdUUrnklKQqVU7ZThzJsVyKbEkmKZIQKYDYBjOY
+vaf37hxY3QZIAAQpgBgM/r8qlSUQaDYsiO/7Pu+zZDIZpFIpuK6LW7duwbbtuGQgSq1Lp9PodDoQ
+RRGO42x7wRRFcccW143S/IiIiIgEQYAsy1BVFfl8HtVqFa7rQhAEpFIpnDp1Cu+++y6uX7+Of/3X
+f0Wr1ToQExCIqD8xA4C2be2tvO/76Ha7kCQJzz33HI4fP47FxUW0Wq11/QJKpRIuX76MarUKwzCe
+aLHcyYVVVVUUCgU4jtO3TYuIiIjo6QRBANd10W63EYZhvN+JGv0FQYAbN27E2Y5ERPsVAwC0bdEC
+GIYhRFHE6Ogo3nrrLZw4cQKGYaDRaMRdcYFfZwusrKzANM1t375HkfidDABEaX6u6+7YM4mIiKj/
+rN3vyLKMEydO4M0334SqqqjX6xBFEYIgMAuAiPYlBgDoiUQLna7ruHz5Mr75zW/i7t27+MEPfoC5
+uTlYlhUHCFRVhW3b6HQ6TzQqZ7fmC/Pmn4iIiLYj2rOoqop0Oo2PP/4YtVoNL730EkqlEsIwRKPR
+YDNAItp3GACgpxIEAer1OlZWVjAyMoL79+9jZWUlPmRrmoZSqYRutxsf/iVJQiaTeWwwYKPmg0RE
+RETPkiAIEAQBzWYT7XYb4+PjyGaz+PDDD7GwsBBfehAR7ScMANBTEQQBADA5OYmvf/3r0DRtXQZA
+EAQwTTPurgsAmUwG09PTaDabsG17y+ezsy4RERE9K9Ho4zAM432LLMtIpVJx/yDTNDE3N4elpaV4
+QgADAES033AKAD2xtc0Ac7kccrlcXN/faDRgWRYSiUR8+x+RJAmpVAqGYfB2n4iIiHpGLpfDhQsX
+8Pnnn8cjjYMgiCcBZDIZFAoFtNttLC0twTRNBgCIaF9iBgA9seiGXxAESJKESqWCRqMR3/inUimc
+O3cOtVpt3U1/GIawbZuLJREREfWUZDKJqakp5PN5vPDCC/GkoyAIcPjwYbz00ktIJpO4fPkybNuG
+4zjryhUFQYAoinv8XRARPR4DAPRUwjCEIAjQNA3JZBJhGMYpcqIoQhRF1Ot1NschIiKinud5HkRR
+xJtvvomZmRnMzs6i2WxClmXUajXMzc1hfn4eMzMzCMMQp06dgmVZ6Ha7UBQFAKAoStzziJcdRNSr
+WAJATy2VSuHChQsYGxvDvXv3cP36dfi+j0QiAdd14/r/aJQOERERUa/SNA0jIyNwXRejo6O4c+dO
+nOofNTcul8sIwxDJZBKmaUIURQwNDWF5eRmO40AURaTT6XgCEhFRr2EAgJ5aLpfDxYsXYVkWRkdH
+8cEHH0AURYyMjOD27dsIggCyLKPdbrPmn4iIiHpelMqv63p8+Ad+3f/IcRwEQQBVVTE8PAzHcWAY
+BkzTXFceyf4ARNSrWKxET811XayurkLXdUxNTaFQKKDT6eDOnTtxA8BkMglJkvb6Vfc1QRAgy3I8
+eYGIiIh2RxiG8H0fnU5nXX2/LMvIZrPxelwoFPDWW29hfHwcnufx8E9E+wYDAPTUdF3HK6+8gj/9
+0z8F8KB+LpVKwTRNeJ4Hx3FQrVbhuu4ev+n+Fo0mYiCFiIho961ddxVFwdjYGC5duoS3334bIyMj
+kGUZ9Xod//Zv/4bbt2/H+xyu10S0H7AJID013/fR7XaRSCRQLpehKAru378P0zTjObpM/f/ywjCM
+bxcURUEQBHv9SkRERPuaKIqb3tKnUilMTU2h3W4jm83iu9/9Lt544w3cvHkTS0tLEAQBpmmi1WrF
+/Y6AX6/X3PsQUS9jAIC2tNUCuTYdbmRkBJIk4fPPP4cgCPB9f1sH1a2eT78WHf4LhUI8bYGIiIie
+XFTPv1mT4iAIYFkWHMdBMplEu93GysoKPvnkEywuLqLb7W66DjNIT0S9jk0AaVMPN7x5WBQhr1Qq
+EAQBruvCtm0MDQ2hWq2i1WptuRA+7vm0niAIUBQFrusyaEJERPQliKK46d5DVVUUCgUAwMWLF3H9
++nUoioKJiQncunUL5XI57vjPen8i2m+YAUCbikb4bbZABkGAVqsF0zThOA4EQUAul8Po6Cg0TUO7
+3YYgCHE5wJM+nx7Fm38iIqIvb6N9iSAIUFUVvu/Dtm0EQRCP+2u1WigWiyiVSuh2u7AsC8lkMi7R
+IyLaL9gEkLa01aLm+z5c10U+n0cikcDp06dx7NgxlEol+L4PURQxODiIZDIJUdz4R42LJhEREfWC
+qNROkqR4vN+dO3cgSRIGBwehKApu3LiBlZUVOI6zblIAEdF+wQAAfSmapmFiYgKDg4NYXFyEYRh4
+5ZVXcOXKFaiqina7jUwmA1mW9/pViYiIiDbleR5qtVrc1T8IAriui1KphHPnzqHb7aJWq8XZAZ7n
+PZJJsNmFBxFRr2APAHpqgiBgaGgI77zzDjRNw+3bt7GysgLXdVEul1GpVBAEAWRZZt06ERER9SRJ
+kpBKpeD7fjzJKLq4CMMQAwMDmJiYgGVZuHfvHhKJBCzLipsBRvsb9jYiov2AAQB6KoqiYGBgAJqm
+YWhoCIZhQBRFLC8vo9PpbBgVJyIiIuo16XQaZ86cQafTwczMDDzPQz6fhyRJ8DwPuVwOf/VXf4Uw
+DPGP//iPmJ6exsLCAj799FPU6/V1N+b+QQAAIABJREFUh/2tmgsSEfUCBgDoqRQKBVy7dg2GYeDn
+P/85Op0OisUiut0uGo0Ga+KIiIhoX1ibAeC6LnRdh+d5cX+jcrmMQ4cOoVKpYG5uDsViEUNDQ7h1
+6xba7TYvPIhoX+EUAHoqnudheXkZc3NzaDabyOVyuHbtGjKZDJaXl+F5HjRN23TGLhEREVEvCMMQ
+tm3Ht/3PP/882u022u02DMNANpvFV77yFXz66adotVpoNpuo1WowTXPT235BECDLMvdARNRzGACg
+bRNFMT7U+76PbrcL0zQhiiKy2SwEQUCn00GlUoEkSRgfH4/HADIQQERERL1EkiRkMpm4bFGWZei6
+jlqtBsdxIMsyDh06hFQqhevXr8eNjV3X3fLwDwCyLCOdTnNMIBH1HAYAaNs0TUOpVIJpmvA8D8CD
+oEAmk8G1a9fw7rvv4syZM7h79y5qtVq8cCqKwlE5RERE1FMymQymp6fRbDZh23Z8ay9JEoaGhpDP
+5+N6/6WlJXQ6HTiOA03T4Lrulgf7MAzheR73PkTUcxgAoG0LggCmacJxHIRhGHe7BRCP/Lt+/Tpy
+uRwWFxfRaDTQbDbRbDY5BYCIiIh6iud5aDabMAwDYRhC0zQcPXoUg4ODWFpaikf+jY2NYWhoCJVK
+Bd1uF67rbnqwF0Ux3u/w5p+IehGbANK2bTTeRhRFJBIJHD58GI1GA6ZpIpvNwjRNdLvdeFYuERER
+0ZMSBAGKojyTiwRRFJFMJqGqKlqtFjKZDK5evQrDMDA8PIwf/vCHqFarW349xwASUa8T9/oFaP9Q
+VRWlUim+9QceRLdt28b8/DxM08TAwABc18XU1BQOHToUp9Ilk0mIIn/ciIiIaPsURUGhUICiKDv6
+3CjdXxCE+GNBEMBxHKiqClEUkc/n8e1vfxvnzp3DRx99hGazueUzo6/n4Z+IehlLAGjbgiCA53lI
+p9OPZAGkUimcOHEC7777LhYXF3H37l20Wi1omgZFUTA+Pg7DMOC6bvw1LAkgIiKirUSH6mj/sFNk
+WUYmk0EYhnE6vyAIEEUxngggSRISiQQWFxdx8+ZNWJYFRVEeW/tPRNTLeCVL2xYEATRNw8svv4xc
+LgdVVTE6OopCoYBsNgvbtnH37l3oug7HcaDrOqanpyGKIubm5mDbNoBfp8gxI4CIiIi2EoZh3Hto
+J/m+D9M0oes6JEkC8GAqQCqVivsBAEClUonHG+9WNgIR0bPEDAB6Iq7rYmVlBc1mEwMDA/j2t7+N
+ZDKJbreLIAjw6quv4tatW1hdXcXAwACWl5fRbDbhOM665wRBwBQ5IiIi2jO+7z/S0C8MQ0iShLGx
+MaTTabz44ou4fPkyZmZmUK/XYVnWjmcjEBE9S2wCSE9NVVUUCgXYtg3LsiCKIsbGxrC8vIxutwtF
+UeJSgbWNcYAHCyzT5IiIiGivRan/siwjnU7HQYBz587h2rVrmJ2dxXvvvYeFhQU0m83HjvYTRZGX
+HETUsxgAoB0jCELcTCeVSmFgYACVSgWWZcW/DoAdcomIiKhniKIIXdfj8sSJiQnIsow/+qM/wq1b
+tzA8PAzbtvHBBx/g/fffR6fT2fJZ3OcQUS+T9/oFqH9Et/q6ruPChQu4du0afvzjH+PnP/95XCIg
+CAIXRSIiIuoJ0ZjBaP/SaDSwsLCAV199Fe12G++//z663S4AYGVlBaZpbvk8TgIgol7HLmy04yRJ
+gmma+MlPfoKrV69ibGwsbvgXhiEXRSIiIuoJiqJgYGAAvu+jWq3CdV1IkgRJkqCqKiRJwuzsLGZn
+Z1Gv1x+b/g+A+xwi6mnMAKBHCIIASZLg+/5T1embponr169DFEXMz8+j2+1icHAQ9XqdjXOIiIho
+T2xUm++6Lmq1GjzPQxAEyGazuHDhAs6ePYvR0VEYhgHHcSBJEnsXEVFfYAYAPUKSJKTT6XgsztN8
+bRAE8H0fsizj3Llz+OpXv4pMJrMLb0tERES0tc1GEEdjBgEgkUjAsiz89Kc/xb//+7+j0WgAAGRZ
+Rj6fhyzz3oyI9j82AaRHfJkMgGw2i7Nnz2Jubg7Ly8tQFAWapkGSJDQaDXieB0EQmB5HREREz9RW
+3fkTiQRKpRJqtRqy2SzCMMSpU6fwy1/+Eo1GA7IsIwgCqKoKy7K4jyGifUsC8Dd7/RLUex63sEmS
+hEwmA8/z4nE5yWQy/tpOpxMvkN1uF91uF77vxxH4IAiYSkdERETPzGb7jmhKkWmaKBaL+P3f/31Y
+loX79+/DNE14ngfP85BIJHDkyBEYhsGSRiLatxgAoKeSyWQwPT2NZrMJ27ah6zomJiYwODiIV199
+FcPDw2i1WkgmkxAEAUNDQ7BtG77v8/BPREREey4qB4gmAXieB0VRIEkSdF3H4uIiisUiHMeJ9zCG
+YcCyLO5jiGjfYg8AeiqGYeDGjRswDAMAYNs2lpaWkE6nMTY2hjfffBNTU1PodrsYGRnBu+++i6Gh
+IQAPFlpd1x+pwyMiIiJ6FqKMREEQ4j4Avu9DURRMTk5ifn4eq6urWF5eRqfTQRiG8H0/HmtMRLRf
+MQOAnkoYhrBtO46AR/9cr9dx69YtzMzMoF6vo9FooNVqYXl5GbZtw7IsqKrKFDoiIiLaU6IoIpvN
+QpIkeJ4HURSh6zomJyfRaDRgGAYymQwMw4DneXv9ukREO4IBANpRYRjCNE2EYYjf/M3fhGEYqNfr
+yOfzOHPmDMrlMgzD6LkUOlEUe+ZdiIiI6MkJggBZlre9nmcyGXzlK1+Bqqpot9tIpVIIggCff/45
+arUaNE1DvV6P9zVERP2AAQDaMbIsY2BgAJlMBr7vI5fL4d69e6jX6+h0OlhaWkKr1YLv+3Bdt2cW
+UzYmJCIi2v9kWUY6nYbnedtK0/c8D9VqFZVKBaZpQlEUTE1NwbIsuK6LZrPJlH8i6jsswqYdE9XR
+1et1uK6LRCKB6elpDA0NQRTFeAxgrwmCAI7jcIEnIiLax3zfR6fTge/7j/3cKFsg2gNEFwCJRAJn
+zpyJMxq5NyCifsMMANox2WwWZ8+eRaVSgWEY0HUdb7/9NsIwhCiKcWAgsjZSv9c373v9+xMREdGX
+t90Du6IoGB8fx8mTJ9HtdhGGIY4ePQpBEGBZFqrV6rpeR0RE/YIBANoxnuehVquh0+kAeBBFt20b
+n376Kebn5+MFFngQec/n83juuefQaDRg2/ZevjoREREdILIsQ9M01Go1pFIpZLNZvP766zh27Fh8
++N9uNgER0X4iAGBok3ZMlFKXz+fx9a9/HTMzMyiXywjDENVqFY7jAHiw8OZyOYRhiFar1ZOlAURE
+RNSfFEVBLpeDpml44403sLS0hDAMIcsy/u///g/tdhuqqnKPQkR9hxkAtKNUVUWpVIIsy0gmkzh0
+6BCGh4dRKBRQLpfjm/5o5i6b6xAREdGzFu1DfN9HGIYIwxCqqiKdTqNSqSCbzeK1115Do9FAp9Nh
+KQAR9Q15r1+A+ouiKBgdHUUYhrh58yby+TxSqRTq9Tp834ckSRBFEaIo9tQkACIiIjo4wjCE53mw
+LAtffPEFNE2Dqqp46aWXcO7cOaiqisnJSSwtLaFSqaDb7e71KxMR7QiWANCOkiQJyWQSAGCaJsbH
+x/G9730PH330ET777DMsLy8jnU5DVVWsrKzEJQFEREREmxFF8UtnDK4d+5vJZOKU/4sXLyKbzeKD
+Dz5AIpGA4ziwLAu6rqNer8cjjImI+gEDALSrNE1DqVRCu92GaZpwHCfOAFg7doeIiIhoI9HB/cuO
+7E0kEhgdHYXrurhw4QJs28bq6iqOHz+OXC6H2dlZHD58GD/+8Y9RLpeRy+VQq9V4WUFEfYUBANpV
+oihCUZQ43V+SpLjejoiIiGg7dioDIJlMIplMQhAEuK4Lx3Ggqiry+TxeeuklnDx5Et///vdx//59
+yLLMckUi6jtsAkg7ThRFAL+esTs9PQ0AsG0byWQSnudtuohHUwS42BIREVFkJ/YFYRjCdd14xJ/j
+OJBlGaZpIgxDFItFfPjhh/jiiy/gui7T/omoLzEAQDsqStMLwxD5fB7vvPMO3nnnHSiKgrt378L3
+/S1T+GRZRjqd3jJIQERERPS0ov2Frus4duwYfN+HbdtYXFzEwsICfN9HNpuFoijMWiSivsMAAO0o
+QRCgKAqy2Sxs24bjOGg2m/jpT38KSZJw8uRJrK6uxuMAHxZ15d0o6s7sACIiInpasiwjm83GlwxB
+EMTd/UdGRqAoCtrtNnRdx6VLl+IeAK7r7vGbExHtHAYAaEfJsoyjR4/i/PnzWFxcxP379zEzMwPT
+NHHp0iUoioK5ublNAwAAmB1ARETUwwRBiLvp7yfZbBbnz59HvV6H53kQRRHZbBa5XA6lUglXr17F
+7Owsms0marUaVlZWYFkWLx6IqK+wCSDtKEVRMDg4iDAM0Wg0oChKXHOXzWYRBAFarRaCIHiijr6i
+KLKJIBERUQ9QVRWFQmHfdciXZRn5fD7OJtR1HefOncPCwgJmZ2ehKAqazSZ0XUez2eTNPxH1JWYA
+0I4KwxCWZaHT6UBVVZw6dQpDQ0OwbRumacLzPLiuC1VVUSqV4o9tZe3cXjbkISIi2ltBEMBxnH11
+QBYEId5PXLx4Eb7v49y5cwjDECsrKyiXy7BtG4cOHcIrr7yCpaWluDyAiKifMABAOy660RcEAZqm
+YXh4GMViEblcDt1uF0EQwHVdmKYJx3EgCMKWN/phGMa1ekRERLT39ltAPiojjIIWp06dwp//+Z9j
+cnIS77//Pmq1GsbHxzExMYH79+9jcXHxsRcURET7kbjXL0D9J4qya5qG48ePY3x8HM1mE4cPH8bE
+xARGRkYgSRIsywLwIJUwGh24GR7+iYiI6GlFlwm2baNcLkNVVRiGgaGhIYyMjAAA5ufn8cEHH+DG
+jRvxHoWIqN+wBwDtOFVVUSwWUa/XkUgkoOt6/L/Ly8swDGNd7b8oijzgExER0a5JJpM4cuQI5ubm
+4DgOisUiTpw4gcnJSfzwhz/EwsIC9yJEdCAwA4B2XDqdxvnz56HrOhqNBlzXxTe+8Q28/PLL0DQN
+uVwOqVQqvvXngktERLT/aZqG8fFxaJq2168C4NfTCkRRhG3b8RQiWZYxMDAAAPjkk0+wurq6rnzx
+cVmJRET7GXsA0FPbbAyQ67qoVCpxt3/XdbGwsIDbt29DkiR861vfQhiGqNVqkCQJQRCwqz8REdE+
+Nzo6infeeQezs7NotVp7/TrxtALbtuMJQkEQYHBwEO+++y6++c1vYnx8HLdv34ZhGEin05BlmXsT
+IuprDADQU4sWVsdx1jUDCoIApmkiCAIIggBBENBut9HpdCBJElKpFO7duwdVVTE0NIRut8tGO0RE
+RPucbduYnZ1FpVLpiSaBYRjGzYYFQUA6nYYgCEgkErh79y6uX7+OxcVFdDod+L6PkydPQpZltFot
+7kuIqG8xAEBPbTtjgKKuu57nxQEBAPA8Dy+99BLq9To6nQ5c12WknYiIaB/zfR+tVuuZHP4FQYAs
+y4/sHaLLBcdx4HkeJEmKswBc10U+n8fly5dRqVTgeR4qlQpWVlbQ7XbRaDTQbDbhOA73JETUt1jk
+RE8tiqxvtkhG4/2iyDrw4ODfaDQgiiJGR0eRz+cxOjoKVVWf5asTERHRPiZJEtLpNCRJWvfxQqGA
+N998E4VCAcCDfUer1UIul0Mmk4Eoirh582bckNgwDFiWBdd1eSFBRAcCpwDQrhFFEaqqruv4LwgC
+JEmCJEkYGBiI0/8ty2IzQCIiItqWaD8R1fZHovLEWq0Wp/8PDQ3h1VdfxfLyMj7//HOMjY0hnU5j
+amoKt2/fxkcffYRutxtnLXY6HZYAEFHfYgCAdtXaEX9Rul4ikYBt29B1HZ7nwTRNAHgkWEBERET0
+OGsvHARBgKZpsG0bAJBKpaDrOgRBgGmaME0TyWQSiUQCiqLA8zxUq1W4rrtpUIGIqJ+wBwDtqrUL
+qCiKGBgYwMTEBADg0qVL0DQNzWYTyWQSExMT8DwPtm1z4SUiIqJt0TQNpVIJpmlCURQcOXIEhmFA
+lmUcPnwYtVoNjUYDsiyjVCpBURQkk0mYpolDhw7Fdf8ARxMTUf9jAICeKdd10W63oWkajh49inv3
+7qHb7WJkZAQjIyNIJpNoNBrwfR+KonAhJiIioi1F04eiqUSGYcSj/zqdDkzThCzLmJ6exh/8wR/A
+8zysrKwgCAJks1msrq7GAQAion7HEgB6pkRRRDKZxMjICPL5PGzbhmVZCMMQnufBMIw4/U5VVVSr
+VS7KRERE9NSisoBsNosjR47gypUraDab+O///m80Gg2YptkTYwuJiJ4Fea9fgA4WWZaRzWYRhiGu
+Xr2KYrGIYrGIhYUFfPjhh5iZmcH58+dRLpfxq1/96omb8KztOUBERET9a7trvqIoGB4ejrMMLcvC
+9PQ0bt26hUqlwsM/ER0o2w4AqKqKYrHIG1l6KpIkQdd1WJaFarUKURTxi1/8An/7t38Lz/Nw69Yt
+3L17F4Zh4P3334dpmuh0Ok90mN9o6gARERH1nydZ8wVBgCAI8DwPU1NTmJubgyRJKJfLcF33Gb0x
+EVFvELf7icViEb/zO7+DYrG4m+9DfUgQBGQyGZw4cQKJRAKO48B1XdTrdRiGAV3XUS6X0Ww2UavV
+4r9/0oh8EAQ8/BMRER0A0ZofhmE8ZUgQhHWfI8syCoUCwjBEvV7H4OAgpqamYFkW/vM//xPlcpl7
+BiI6cLbdBNC2bdy/fx/VapWpUvREZFmGruuo1WowDANhGELTNBQKBdy7dw9LS0v47LPP4LouWq3W
+l5q9y+kBREREB0PUV0gQBKRSKXiet+5An8/nceXKFayurkIURZRKJViWhcuXL8P3fSwtLTGrlYgO
+nG0HAHzfR7vd5uGfnlgYhnAcB6ZpxgtzEARQFAUTExP44IMPkEgk8NZbb6FcLqPdbjMiT0RERFtK
+pVKYmppCq9VCt9uN96hRRoDjOKhWq7AsCxMTE7h27RpGR0dx5coVZLNZ3LhxA81mk5cHRHSgcAwg
+PRMPH+jDMIRpmlhcXMTS0hI6nQ4AIJlMwrIsdLtdBgGIiIhoU9Hl1MNd/GVZRjqdhuM48XShkZER
+HD58GC+++CJarRb+4R/+AXfu3IHneRAEAaIoMhBARAcCpwDQnnFdF9VqFQCwurqK9957D7Isw7Is
+ZpoQERHRlnzfjy8QBEGAoijwPC/+uO/7EAQBhUIBL730Em7cuIHz589jYWEB9+/fj9P/BUFgE2Ei
+OjAEAPs+3CkIQjw7ntHb/SVasCVJgm3bcTOfMAz575SIiIi2RVVVFAoFNBoNSJKERCIBVVWxuroK
+SZJQKBTQbrdRKpWgqiru3bsH3/fXNRLk4Z+IDoK+KAGIUr0ebv5CvU+WZQwODqJUKkHTNCQSifjX
+MpkMJEmC53nx4qyqKv8dExER0TrRVABJkjAxMYFz587h4sWLWF5ehqZpSKfTkGUZoijihRdewNLS
+ElqtFsIwjP8iIjoI+iIAEIZhnPJF+0vUIFAURbz44osYHx/H/Pw8ut0uRFHE8PAwPM+D67pQFAWF
+QgGO4/DfNREREa3j+36c/r+0tIR79+4BAK5evYo/+ZM/wdmzZyGKIqanp3H37l1Uq1VeKhDRgdMX
+JQC0P0mShFQqBVmWEYYhBgcH0el0UK1W4XkeRFFEOp1GOp2OPybLMlzXZaSeiIjogBJFcVs1+4Ig
+YGRkBL/3e7+HZDKJZDKJH/3oR1heXka5XEa32+V+gogOHHGvX4AOjmgsjyAIAABN03D69GlcuXIF
+p06dwvnz55HNZlEsFqEoCoIgiAMCruvG6X1crImIiA4uVVXjWv61JElCNpuFJEkAAEVRcPjwYVy6
+dAmu6+I//uM/0O12US6XYRgG9xNEdCAxA4CemahXQ6fTged56zIAMpkM3nrrLSSTSYRhiH/5l3/B
+/Pw8U/OIiIhonc0yALLZLKanp3Hjxg10Oh2USiW88cYbMAwD169fx+LiIlzXhWmaCIKAzYaJ6EDq
+ix4AtD883KshDEPYtg3TNNHtdtHpdHD27FkIgoD5+Xk0Go14Lq8kSVygiYiIKN5PPLwv8DwPzWYT
+3W437hs0MzODu3fvIplMolarwTAMBEHABtJEdGDJe/0CdHBEC/ZGPM+DYRgoFou4ffs2VlZWAADF
+YhGNRgOapsG2bViWxYWaiIiIHuH7PlqtFoAH5QCu66JSqSAIAhiGAdM046BB1CyQTYWJ6KBhCQDt
+GlEUn+iwrus6JicnEYYhKpUKOp0Ostks6vU6JElCLpfD6uoqHMfZxbcmIiKi/UQQBCiKAkVRYFkW
+fN+HKIqQ5Qf3XOl0Gq7rwrZtNhImogOPTQBpV0T1eaK4vR8xQRAgiiIsy0Kr1cLU1BRyuRwGBwch
+yzIsy8Lq6ipc193lNyciIqK99HDT4MeRJAnFYhHHjx+Hrutxc0DXdeH7PtrtNhzHQTKZjBsEEhEd
+VOwBQLsiDEMEQbDtDIAoYBCGITRNg+u6UBQFq6ur6HQ6CIIAgiAgDEPIsoxsNsu6PSIioj70pPX5
+UU+hVqsF3/cxODgI4EGafxQM8H0/DggQER1kDADQrnlcil3U4C/i+z5kWcb58+cxPT2Nb3zjG+h0
+OqjVagiCAKlUCp7nIZ1O4/z586jVarAsa7e/DSIiInoKD6/z2/Vw0+DtiA740YXB8PAwbNuGLMvQ
+dT2+RAiCgCUARHSgMQBAeyK68V+7EEcLfrVaxfz8PGzbxtTUFHzfh2EYMAwDnufB8zzUarU4M4CI
+iIh6y0br/JN4mvU9Kh1QFAW+7yOVSiGfz6PZbMLzPOTzedi2zSwAIjrQ2ASQ9szDTQLXzvUVBAGZ
+TAbFYhFjY2OwbTsOCmiahkqlwmaAREREPexJmwFvRZIkaJoGx3Hg+/6GQQVRFJHP5zE6OopqtYps
+NotGo4EwDOPpAGwCSEQHHTMAaM+sXYAFQYCu6xgZGYHrusjn88hkMmi1WqjVauh2u3juuecwMTGB
+K1eu4IsvvkCn09nDtyciItp7T5tm/yzs5Hvpuo5jx47F3fyBB70CHv49PM+DaZqQJAmGYUCSJFy6
+dCmeLkREdNAxA4D2RLRhkSQJvu9DEAQkEgkAQCKRwNe+9jUkEgl8/PHH0HUd9+/fx9DQEJrNZjwm
+kBkARER0kK3NnOv3kriHMwAkSUI6nUan04Hnees+L5/PY2RkBKZpYmVlBZqmodVqrfs8IqKDihkA
+9MytHREYNfYLgiBu4OO6LiRJwquvvgpRFJHL5RAEAb7+9a/j888/x/z8PMIwhK7rm6YBEhER9bsn
+nbizn4VhGDf5i/55o0aB2WwWZ8+eRaVSQbvdjnsIHYT/j4iItoMBAHrmog2L7/vx4h017ok2Ms1m
+E7dv38adO3ewsLAASZJQq9UwOzsLy7KQSCRw5MiRuDFgL6dAEhER7ZaDsPZttsY/fKiXJAmlUgkX
+LlxAs9lEKpWKRwNqmsYJAEREYAkA7SFBEOKxPIqioFAooFarPZLaH2UBHDt2DIuLi6hWqwAATdNg
+2zbCMDwwKZBEREQHyePKHCRJisf86bqOo0ePolqtolKpIAxDWJYFRVFQKpWwuroKTdPQbDbhuu4e
+fDdERHuPGQC0Z9aOCAqCALZtb7ggi6IIRVEgiiKOHj2Ker0eNwDK5/NwHAee5zGqT0RE1GceV+aQ
+Tqdx9uxZDAwMIJPJwPd9zM3NwTCMuON/EAQwTRPpdBpXr17FysoKut3uM/5OiIh6AwMAtGfWLuph
+GG46l1fXdUxNTSGVSsH3fciyDFmWUSwW8eKLL2J5eRndbjfOJiAiIqL+sdXarmkaBgYGcP/+fTQa
+DaiqimazuW5PEfULcBwHKysraDabzBgkogOLAQB6Jjar39vugd3zPLTbbSQSCXz3u9/F8ePH4TgO
+rl+/jmq1GpcBsL6PiIjo4PB9H41GA6ZpQhRFFAoFuK6LXC4Hy7LiPkOKogAADMPY9MKBiOggYACA
+dt3aVP8nOZxHUwLGxsZQLBahaRra7TYGBwfh+z4+++wzeJ4HQRBg23Y8TWC7og2Boii8CSAiIupx
+UcPgtXuJMAwRhiFyuRyy2SxkWcbAwACmp6exvLwMx3GQy+WQz+ehKAps2+aaT0QHGpsA0jMhiuIT
+L7iqqmJ6ehpXr17FBx98gHa7jUqlEi/+uq7j7bffxuLiIn7wgx+g0Wg80fNlWUahUICqqlhZWXmk
++SARERH1DlmWkU6n0el04HkegAf7C03TkEwm44uCMAyhaRparRYSiQTOnDmDcrmMpaUlWJbFTEEi
+OtCYAUDPxMOLrSzLyGazW97ah2GIdruN+/fvAwBOnDgR9wpoNBpot9tYXFxEs9lEtVp94o6+YRjC
+cRyYpsluwERERD0uquWPUvgFQUA6ncbly5cxODiI1dVVtNtt2LaNbreLIAggCAJ830e1WoVpmjz8
+E9GBxwAA7YlsNovz58+jVqvBsqwNPyc6oBuGAc/zsLy8jCAIMD09DdM00Wq10Gw2Ua/X4TjOUy3q
+QRCwFpCIiGifiC4NFEXB0NAQTp48id/93d9Fu93GnTt34nU92hMEQQDDMJ56n0BE1G96ogTgadLD
+aX/bKI1vI6IoIpvNYmxsDIuLi0in03BdN57hqyhKvKgLgsCfIyIioj6mKAoKhQLS6TRef/115HI5
+/Nd//RdmZmbQaDTifkM87BMRbWzPAwBRgzjHcXh4o0eoqopisYhut4tOpwNRFOOAQSKRQCKRQKvV
+QhAE/DkiIiLqU6IoQlEU5HI5vP7662i1WgjDEOVyed3hH/h1k1/XdRkIICJ6yJ6XAKydBU/0sKgM
+YG00f2BgALIs48iRIzh79ixWVlZgmiZ/joiIiPapzcYFAw9u/UdGRjA2NoYwDFGr1WAYBhRFwc2b
+N9FoNNZ9raqqKBQKcByHZX563yCyAAAgAElEQVRERA+R9/oFAPDQRpuKfjZGR0fR6XQAAK+88go+
++eQTtFoteJ4HSZKQSqVgmuZevioRERE9hcdlg2YyGbz88ssIggCDg4MAgKWlJXzjG9+Abdv46KOP
+0O1248/3PA+1Wo0NfomINrDnGQBEjxMEAbrdLrrdLkzTRLlcRqPRQKfTgeM4KBaLGB8fj5sBEhER
+0bMnCEI8qvdJPC4b1PM8lMtlrK6u4uTJk3jttddw6NAhdLtdnDp1CnNzc6jVagAeZAsEQbBlfyEi
+ooNsz3sAED2pVCqF06dPQ9M0fOUrX8GJEyfw/e9/Hx9//DGj/URERHtkuw1+n0YUXCgWizh16hQu
+XLiAVquFDz/8EDMzM+h2u3GDwFqtxgsBIqJN9EQJANHjrJ0UMTg4iD/+4z/G2NgYPM/Dp59+iuXl
+5Uc2G5IkQdd1mKbJGkAiIqJd5vs+Op3Ojq25giBAVVVkMhnk83moqopUKoXBwUG89957aDabmJub
+i8cJu67L1H8iosdgBgD1vLW1gYIgIJvNYmhoCLIsQ5ZlDAwM4O7du1haWloXBEin05iamsLMzEzc
+P2DtM9l7goiIqHfJsoxSqYSLFy/ijTfewOnTpyFJEu7du4e///u/x71799Bqtdjtn4joCbAHAPW8
+qDYwDEMkEgkcOnQI8/PzWFpagmEYGBkZQalUwsrKCmzbjr/O9320222YprluYxAFFKJnEhERUW9Y
+20cgDEPYto2VlRXMzc0hlUphfn4e//RP/4QvvvgCw8PDcBwHtm1zPSeivhBlPu3mRSVLAGhfiP4j
+sCwrTvcLwxDJZBJXrlzB8PAw5ufnYRhGnHoYpSJu9KzNOg0TERHR7hAEAYqibHljL0lS3EcAADRN
+Q6PRwC9/+UtUKhUcO3YMy8vLaLfbMAyDh38i6ivPopeJuCtPJdol0USAIAggCAISiQQKhQK63S6O
+HDkCXde3/RwiIiJ6dqKNraIom37O2j4CyWQS09PTyGazSKVSWFlZwczMDM6cOYN8Pg/TNOF5HgMA
+RNQ3nkUvE5YA0L4liiIEQcD9+/fxq1/9Cvfu3WPDPyIioh4VZeA9bmMbBel930er1UI2m8XVq1fR
+7XbRaDQgiuIjZX9ERP1it88yzACgfSsMQ/i+j3w+j+Hh4bg7sCRJe/1qRERE9JAwDOE4zrZv7D3P
+g+u6OHbsGFKpFDKZDCRJ4s0/EdGXwAwA2teiRn/1eh3JZBKGYSAIAjb4IyIi2ockSUIymYQgCAiC
+ALquY2pqCrlcDmfPnoXnebAsC7Zts/6fiOgpMABA+1rU0V+SJJw+fRqZTAapVArtdnvdSEAiIiLq
+fbquY2JiAoIgwDTNuPfP6uoqXnjhBbz44ouYnJyE67ool8vxpCAiItoeAQBDp7RvCYIATdOQz+dx
+7NgxvPbaa/jlL3+Jn/70p3GdoSAI8H2ftwREREQ9SJbluPN/NOFHEAR0u10IggDgQcB/eHgYuq7D
+dV00m02YpolcLrer3bKJiPoNAwC07wmCgFwuh+effx5BEGB1dTX+tcXFRciyjE6nw4wAIiKiHhJl
+8Q0MDOC5557DRx99hEajgUQigUOHDsEwjPiwH63hUUAgDEOIoghZlrccK0hEROuxCSD1BcMw8Omn
+n+LOnTs4ceIEvvOd70BRFAwNDfVVeqAgCFBVNd4AERER7TeSJMUle6OjoygUCpiZmUEYhpBlOU7/
+P3LkCHzfX9cROwzD+LAfTRXg4Z+IaPvYA4D2PVEUoSgKTNOEZVlot9swTROapuF73/se6vX6uuaA
+G339ftk8qKqKQqEAx3E47pCIiPalVCqF06dPw/d9rK6uot1uQ9M0lEol+L6PYrGIMAxRr9fRbDYP
+7HoXBf375RKDiHoDAwC070U3/NGtgGmaaDQaGBgYiGsK8/k8HMdBt9tdt5BG6Yf7ZWrAdmcoExER
+9Srf99FqtdBqtWBZFgRBwPDwcNz5X5IkdDqdONh9UA/ADPoT0W5gDwDqC4IgxH8pigJRFFEqlWBZ
+FgzDAABYlrVhqqAoigd2c0FERLTXxsfH8Rd/8Reo1+v453/+Z7TbbYyOjiKTyWB1dRXz8/NbNvnr
+13U82tOwxwER7SRmAFBfkGUZ2WwWQRDAdV2oqoqxsbG4eVC324XneRBFEZqmrbvx32pRFUURuq5z
+igARER0omqZhbGwMvu/vaBNdQRAgy/K6NdW2bczMzOCTTz7B6uoqdF2Hruuo1WrIZDIQBAGSJG14
+EN5vmXxPijf/RLTTGACgvhAd+KPGQYqi4OzZs7h27RoMw0Cn04Hv+8hkMhgeHo4DAo+j6zqOHDkS
+dyImIiI6CEZHR/GHf/iHWF1dRa1W27Eb9mjkn+d5CIIgTvuv1+totVrQNA2/8Ru/gWw2i/n5eYRh
+iDNnzqBQKKBarT6SCRCVAT5c3vdwsJ+IiB5gAID6QhAEMAwDpmkCeBAQeP7553H16lXouo5Wq4VO
+p4NCoYBarYZut7utTYHv+zAMA5ZlcRNBREQHhm3b+OKLL7C0tLRl+v2TCsMwPvxLkhQH8CVJirMD
+2u02FhYW0G63YRgGqtUqlpeXYRjGhmvxwx+LGgqapskRwERED2EAgPpCtKEQBAHpdBq2bcPzPExN
+TeG9997DZ599BtM045v87dYLhmHYM7V3kiQhlUqtG4FERES0G6JGfbuR/RYd/tPpNDKZDF5//XWc
+OHECqVQKqVQKiqLEt/3RDf/DTXwf93zTNDkikIhoAwwAUF+JNgqqqkJVVYyOjqJcLsep/+12G8lk
+EplMJr7VVxRlXzQPSqVSOHnyJGzbZkYCERHtO4IgQBRFiKIISZIQBAFs24YgCHj55ZchSRLu3LmD
+arUaH/g3SvF/nOhSgOskEdGjOAWA+kKUNgg8SP+fnJyEIAg4efIkvvWtb+HYsWOYmZnB3/3d3+HO
+nTvwfR+u60KW5bgsYCdTHHeDJEnQdT3ObuDGhoiI9hNRFJFIJCDLMhKJBBRFQTqdRjqdhuu66Ha7
+EAQBCwsLME2T6xwR0S5gBgD1BVmWkc/nkUgk4DgOms0marUaZmdnMTs7iyAI8D//8z+4efMm2u12
+fIAOggCO4+yLBn9hGMJxnH2RrUBERLSWKIrxuut5HmzbRi6Xw9tvvw3TNHHnzh3Yto1Go8HDPxHR
+LmIAgPpCVKvvui4EQYBlWXAcB5ZloVKpoNFoYHJyEq1WC4ZhxGn/QRBwxA4REdEuirryq6qKfD4f
+B9+j3jznz59HpVKJywFs22awm4holzAAQH1j7YF+7cYhmhAQhiFUVYUkSSiVSgjDMP5c3jQQERHt
+HkmSMDU1hVdeeQWWZaFer8N1XdTrdczPz8PzPExPT2NychKmaaLT6TAIQES0C8S9fgGipyGKG//o
+RumFD3/M8zx4nrduJOD58+dx5MiRuHcAERER7bwwDCEIAoIgwM9+9jPcv38fsizHHf9938epU6fw
+yiuvoFarYXp6GplMZq9fm4ioL7EJIO07oihCVdUnqocXRRHJZBK6rkOSJBw/fhzDw8P42c9+hlqt
+Bl3XYRgGywGIiIh2QVQGEAQBRFHE6OgocrkcGo0GVldXkclkkEgkUC6XoWnaro0gJCI66LaVARB1
+WBcEYbffh+ixotrBJ0kNDIIAlmUhlUrh0qVL8S1ErVZDJpPB888/j1QqtYtvTURE1N822i9GTXpF
+UYRt25AkCZIkoVarQVEUXL16FUNDQ9B1Haurq/B9H7qub5rpR0REX862/nSVJAnpdBqSJO32+xBt
+y5Pc/Ed834fv+zhy5Agsy0Kz2QTwYMNy69YtdLvdXXlXIiKig2Cj/WI6ncb58+eRyWQgCAJc14Vp
+mmi1Wrh9+zY+/vhjAMDKygo6nQ6KxSLeeecdDA0N7dW3QUTU17ZVAiAIAiRJgu/7bJZG+8ZGpQKJ
+RAIjIyNot9vQNA2NRgOiKMKyLKb/ExERfQnRfjHqxxOGIWRZRiaTgeM4kGUZnufFY/6SySSOHz+O
+hYUFNJtNBEEATdMwNDQUTwUgIqKdxR4A1NdEUVyXLZBMJnHs2DF4nocXX3wRN2/ehKIouH79Olqt
+FgNcREREX0IUfHddF2EYxkGAXC4HURTjg/7AwAAEQYhHAW4WhBcEIW4UyKk9RERfHgusqK9tVCog
+yzKGh4cxOTmJ73znO/jLv/xLHD58OC4XiG4wVFVFNpvdsPSFtYlERETrReunoigQRRG6rqNQKGBw
+cBCmaaLdbiMIAoyNjeFb3/oWXnnlFYiiuGUGnqIoKBaLSKVS7EVFRLQDJAB/s9cvQfSshGEI0zRR
+Lpdx/fp1LC8v4/Dhw/jFL36BarWKMAwhiiISiQTy+TxOnTqFRqOxLg0xut3gTQQRER00oihuuvaJ
+oohcLodDhw6h0+lAlmW88MILeOGFF1AulyHLMhKJBCYmJrCwsICbN2+i0Whs2dcnCALYtg3btrnm
+EhHtAAYAqO9EXYg32ijIsoxsNotut4t6vY5mswnDMKCqKprNZnzQjzYctVoNhmGse1ZU2/gkUwiI
+iIj2u4cD4Butt67rotPpxOupaZrIZDJIJpMIwxCe52F1dTWu+99O/x32oCIi2jnMY6a+s9XUCs/z
+0Gw2oWkaJElCLpfD1772NUxNTSGfzyORSKBQKMQbmna7veHmZKPDP8dlEhFRP3t4DO/D6210wDcM
+I84GEAQB58+fx3e+8x2k02nYto1GowFZlqFpGkvqiIieMWYAUN+JNiAbHdzX/pqiKHAcBzMzM7hx
+4wZqtRqy2SyuXLkCwzDicUWb3fQLghDfhAAPsgvS6TQ8z2N2ABER9aWHM+K2Wm/DMESpVMLw8DAa
+jQbS6TRkWUan08HU1BQURdk00E5ERLuDUwBox0SdeqPOv71M13UcPXoU7XYbrVYLjuNgcHAQuVwO
+rVYLzWYTjuNs+b2oqopCoYBarQbHcTguk4iIDhRRFONgeBiGcXaAIAgQRRGHDh3CX//1X2NoaAjv
+v/8+fvzjH8MwDFSrVciyDNd1Yds2g+ZERM+QvNcvQP1DUZR1B+Je5vs+ms0mms0mPM/DyMgIXnvt
+NQDAj370IyiKAsuytjzIu66LWq0G13UB/PomhIiIqN9F/QBEUcT4+Dgcx8Hi4mI84i+ZTCKZTELX
+dSwuLuInP/kJ7t27B1mWYds2ut3uXn8LREQHEjMAaMfspwyAtbf1uq5jcnISnuehWCxiYWEBS0tL
+jw0AEBFtJpomYlkWbzepb0X1+5qmAXjQIyCTyeBrX/saJiYm8L//+7/wfR+SJOHWrVswDAPDw8NY
+Xl6GZVl7+epERAcWewDQjtpPdXzRptz3fbTbbZimifHxcaRSKZTL5Z7PYiCi3qXrOo4cOQLDMOIs
+oV6gaRpGR0dh2/a++vOaelNU5+95HgRBQKFQgKIoCMMQFy9exNDQEFKpFM6dO4cbN26g3W7Dsqx4
+QoCqqhyrS0T0jDEAQAdeGIZwXRee50FVVVy7dg0zMzNot9t7/Wq0ia1GPRL1At/3YRhGz2USjY6O
+4p133sHs7CxardZevw71EVmWkclk0Ol0UK1WsbS0hMXFRdy5cwe/+MUvUKlUoOs6giCA67qQJAmD
+g4MYHh5Gp9NhCR0R0TPCAAD1LVEUoWnahjcLaw+Qsiwjm81CFEXU63XMzMygWq1CURTkcrk4U0AQ
+hE2fR88WJy5Qr4sCi732Z4Vt25idnUWlUmEGAO2IaD1VFAVDQ0MIggDdbhe+76NUKmFxcTFeU9c2
+/YsyBxzHWTdakIiIdhcDANS3NE1DqVSCaZqP3CysPUAmk0lcuHAByWQS3W4Xq6urkCQJ4+PjuHjx
+IlqtFlzXhaIoOH78OFRVheu68H0fgiA88vvydnr3bTV6iog25/s+Wq0W/9uhHSGKIlKpFJLJJMIw
+RCaTQaPRgKZpOHr0KC5fvoyZmRkkEglMTEzAdV10Op11JXhRNgCD60REzwabAFLfijoUb3SzsLYJ
+oCRJSKfT8e3F/Pw8EokEkskkHMeJ+wMoioLnnnsOExMT+Oijj1AulzE8PAzHcVCtVuH7PhKJBFzX
+ha7r61Ia91ODRCIiou1IJBIYHR1FpVKJ10kAKBQK8DwPiqKgWq0CeBCUt20bjuOsWwcFQYAgCMwA
+ICJ6RpgBQH0ruiXe7MAdbTaCIIibEnU6HViWBVmWMTExAVVVoSgKDMOA53loNBpYXFxEvV5HqVTC
+n/3Zn+Hw4cOYm5tDEASYnJxEq9WK0x8jqqqiUCjAcRzevBER0VMRRbGngshBEMBxHCQSCaTTaZim
+CQDI5/PwPA+VSiXOmNuq8WQvfU9ERP2OAQAiPLiBEEUxzhZwXRfJZBK//du/jfn5eVSrVaTTaciy
+jHa7DVmWoaoq5ubm4mwAx3HQarVgmuYjm5xok9RL3cD7Va9tkImIdkKU1bZXqfKiKEIURSSTSaRS
+qbgMK5PJ4Ld+67dw9epVLC8vx5Mv2NiPiKg3MQBAhEebyoVhiG63i+XlZczOziIMQ5w+fRrPP/88
+Go0GstksarUalpaWYJpmfLP/cGrjWrz53317vUEmItotYRgiCII9SZWPmurKsoypqSkcP34c1WoV
+juMgn8/jq1/9ahxEdxwHyWQS7XabAQAioh4k7/ULEPUC3/fR6XTWHdLXThHQNA0TExPQdR2e56FW
+q/0/e3f6HMd9Hnj829f03IMZ3CcviKJIiqJIURIU2ZbkSLLkleM4jjauStVW7ZscL/Iuf0de5kUq
+L5NK5XBVvJuUvbV2RWs5dORIsiRSJAUSAnEOMPfdPX3MvmC6DYAACVIkCJLPp0pVKgmcaYCY7t/v
++T1HmPYYlAC02+0H+B0I+E2mhdSSCiEeRffj3na7HjWmaTI+Po7neaytrXHt2rVNz7x6vc7f/u3f
+4jgOnU4Hy7LCYIAQQoj9R33QFyDEfrBdv4BOp8PVq1exbZtYLMbY2Bi1Wg1d18NTDdu2WVhYwLbt
+B3XpYgvZ/AshxO4ZhkEulwsb+G01NDTEH//xH/Puu++SyWRot9t0Oh0ymQzxeJxsNkun06FQKFCp
+VG5Z6y+EEOLBkykAQtxCkFKuqirDw8N4nsfg4CCzs7MAJJNJSqUSruuiKEq46JGOxkIIIR4Gqqqi
+6/q2GQCqqpLNZjl48CDVapVSqUSr1WJoaIhz587x8ccf09/fH27+2+02vV5PnoFCCLGPSQ8AIW4h
+qLl0HIdGo4HnebTbbVqtFoODg7z99tssLy/jeR7xeDxs8id16EIIIfa7IMh9q/T/gYEBFhcXaTab
+jI2N0Wq18H2fSCRCq9ViYmKC8fFxotEo1Wr1tuNu97JRq6Io6Louz2IhhNhAAgBC3EawcIhGo0xP
+TxOLxfA8D03TKBQK5PN5LMvaNOIv2PzLwkMIIR5ej/pUEdM0GRkZodPpbNuwL+ir0uv1MAyDWq2G
+53mMj49z+PBhOp0OjuNQqVTodDpUq9VbNv7b60atWxv8CiGEkCaAQtyRbrdLo9FgfHyclZUVrl+/
+jmVZN9U7Bpv/ZDIpo5CEEOIhFGxWH+XGot1ul3w+Hzbs2+571jSNkZERstkss7OzDA4O8uabbzI4
+OMjy8jLlcjkchXu7Ubd73ah1uwa/QgjxuJMeAELskmEYYbOjwcFBNE3Dtu1Ni6eNFEVB0zQ8z3uk
+T5CEEOJRparqI7v530pRFBKJBCMjI7RaLRzHwbIsXNclmUyiKAqxWIxXXnmFo0eP8s///M9cunQJ
+x3FwHOex+TkJIcTDTgIAQuxSOp3m+PHjXLlyBc/zwn92e5ohAQEhhBD7ycbnkqZppNNpotEop06d
+Ih6PU61WWVpaYnBwMDzhf/LJJ7lw4UI4JUcIIcTDRXoACLENVVUxTRP4TQ8A13Wp1Wq0Wi1c18Uw
+DDzPI5FI0Ov1ME3zlnWNUosohNgvHvXadrE7uq6TSqXCUbjdbjfsZ9Pr9Th79ixjY2NMTk7yxhtv
+UCgU+I//+A8WFha2zXwTQgix/0kAQIhtmKbJ2NhYeMLf6/Xo9XrYto3v+8TjcZ544glM0+RrX/ta
+OBWg1WoBNxoGRqNR4Ddz6YMFltQiCiEepL1uxCb2r+DZFovFcBwnTPd/4YUXOHbsGAcOHCASiTAz
+M8NHH33EBx98wNLS0qZaf1VVMQzjkQtsa5pGIpGQrD0hxCNHAgBCbMP3fdrtNpZlbbuoCRoL5XI5
+fvu3f5uFhQXW1tawLItcLsfk5CRDQ0N4nken0wEgFothGAa6rsuCQgjxwATjTR+1DZu4O57n4bou
+iqKEzyVVVclms8zMzHD69GkWFxf56U9/iqZptFotLMui1+uhKAqmaZLNZjdNwnkUJBIJpqenaTQa
+ku0ghHikSABAiG0Ep/U7LZAVRcG2bZrNJlevXqXb7RKPx9E0jUwmQ7fbpVKp0G63cRyHSCTCgQMH
+GBoaIpFI0Gg0ZDKAEOKBkQCkCKiqiqqqJBIJXNelr6+Pl156iWq1yrlz59A0jb//+7/nypUrVCoV
+EolEWAqnqiq6rmNZFo7jPFK/V57n0Wg06HQ6j9T3JYQQ0gRQiDu0cUxSr9djcHCQP/iDP2BgYIBr
+164xNjZGs9lkaWmJSqXCxYsXqVQqRCKRsKP0TpkFQgghxF4Jnmeu6xKJRAA4efIk3/rWt1hdXUVR
+FFRV5eDBg8zPz/P++++zsLBAs9kMn2FBPwnZJAshxMNBf9AXIMTDJphjvDH9sd1u8+mnn3L9+nXK
+5TLtdpsTJ04wMDDA5cuX0TTtpk2/TAUQQgjxIAXPM8MwyGQyJBIJ3nnnHVZWVjh16hT9/f385V/+
+JZ988gmrq6sUCgU6nc6mZ5kEs4UQ4uEiJQBC3IVgw26aJuPj4+i6ju/7RCIRTNNkZWWFRqPBpUuX
+aLVa5HI5LMtC1/WwWZKmaTtOBVAUBV3XJTAghBDivk5tUBSFaDRKPB6n3W4Ti8V45513GBwcZG1t
+jaWlJebn57fd/AshhHj4SABAiK/A932azSYrKyusr69TLBbDNP/vfe97NJtNBgYGsG2bdrvNwMAA
+uVyOZrMZdlzermmSjAwUQggB939qg2EYHDlyhOeee461tTWKxSKe5/H3f//3/OpXv+LkyZMMDAzQ
+arWo1WqPVKM/IYR4HEkJgBBfge/7tFotPM8jk8lQKpVwHIdcLkelUiEWizE5Ocnc3ByqqlKtVolE
+ImHa/06NAIMpA7LQEkKIx1uQpn8/gsGaphGJRFhcXKTZbBKJRJiamuLzzz/n2rVrNJtNVldXw2D3
+xmdWEOwWQgjxcJEMALEvPWwp8L7v0+l0wmZJw8PDnDp1imPHjvEv//IvrK6ukkqliMViTExMYFlW
+OEZJVVVM0wxLA4LvWRZWQggh4N5NbVAUhUgkQiQSodfrhUHqZrNJNpvlt3/7t/mTP/kTnnjiCRYX
+F1leXqZardJqtTZ1+b/fWQlCCCHuHwkAiH1pP6XABwumW3U5Dk7zPc+jXq9TLpcpl8sUCgXW19fD
+k5NUKoWu6/T19aGqajhGaWRkhFwuR7vdlvGAQggh7gtd1+nv72dgYADLslBVlXq9jm3bdDodAA4d
+OsSPf/xjPvjgA5rN5rbPvV6vh+/7D/z5LIQQ4s5JAEDsSxs31A9aJBKhv78fz/Nuuznv9Xp0u106
+nQ7FYpFoNMqf/dmfkc1mqVarJBIJfuu3fot6vc709DTdbpdKpUKz2aTZbALIVAAhhBD3XDDSz/d9
+Go0Gvu+jKAqu65LL5cIxgD//+c/56KOPqNVqt9zgy3NKCCEeTuqDvgAhthMEAPbDAsN1XWq1GqZp
+omnarv5MkBYZnLTMzMwAsL6+TqFQYHJykitXrrC4uEi328WyLNrt9k2jAoUQQoi7oWka6XQ6fG4p
+ikI8HiedToeN/6amppicnOTll18mlUqxtLTEwsICzWZzx2dRkMWm69JGSgghHkaSASDEbfR6PTzP
+21UGQEBRFBRFoVAo8OGHH/Lpp5/y5Zdf4jhOOCmg1WpRLpeJRqPour5juUNQgiCBASGEELuVSqU4
+fvw4tVoNx3HQdT2s43/yySf5gz/4A773ve/R7XbJZDJcuHCBUql02+B7Op3m9OnTlMtlLMvaw+9I
+CCHEvSABACF2IWhKuNuGR7quk0gksCwLz/NYW1ujr6+Ps2fP0u12mZ2dZW1tDU3TOH78OKlUCsuy
+6Ha7N71+JBIhl8vR7Xb3RUmEEEKI/U1V1bC+v9VqoWkauVwOy7Lo7+/nBz/4AZ7nEYlE+NGPfsQH
+H3xAsVjE9300Tbvlc851Xcrl8i2zBIQQQuxfEgAQYhfutOFRUMLgui6O42CaJqZpMjY2Rq/Xo1qt
+Uq1WcRyHarVKp9NhZGSEZrOJ4zibXisYAbX1vwshhHi87TQxxzAMBgYG6PV6dDodPM/Dtm1830dV
+VZaXl5mfn6fRaPDxxx9TKpXQdR1VVUkkEriui6ZpRKPRmwLfvu9LuZoQQjzEJAAgxC7daT+CYNEU
+pPabpomqqnieF44MHBgYAMCyLJLJJI1GI2zStPH95ORfCCHEVjtNzPF9P+zs73le2AAwFotx8uRJ
+hoaGGB0dBWB2dhbP8xgZGQl70fR6PdLpNBMTE9sGpoUQQjy8FODBd1kT4hGnaRqxWAzTNJmYmKC/
+v5+hoSHOnj1LPp/n7/7u76hWq/R6PYaGhsjn8/i+T39/P5ZlUa/XJQgghBBiE0VR0DQtfD4oirLt
+yNqglAzgt37rt7AsC8MwKJVKfPLJJ2GGW3CyH7xuJBLBtm15/gghxCNEMgCE2AOGYZDJZHBdl2w2
+i2VZjI6Osri4yPDwMLOzszQaDbrdLu12G8dxGBgY4J133iGRSFCpVMhms7IQE0IIsUlw8q+qKvF4
+nEwmA9zIHAtS+gGi0SjNZpPV1VXa7Ta+7zM3N4fv+4yPj1Or1eh2u5teN2gaKIQQ4tEhAQAh9oii
+KHQ6HRqNBtlslu9+98rKOw4AACAASURBVLusra3xf/7P/2FxcRHXdYnFYuFEAIClpSWuX79OIpHg
+nXfeYXFxkUaj8YC/EyGEEPtROp3mpZdewvd9qtUq0WiU6elpVFXlmWeeoVKpYNs2zzzzDGNjY1iW
+hW3blEolOp2ObPaFEOIxICUAQuyBaDTKyMgI+XweTdM4deoUo6OjfPjhh6yurhKLxRgdHWVwcBDD
+MPj000+p1+tomoZt2xiGQX9/P8VicdMJjRBCCBEIss263S6tVguARCJBr9fDNE0ajQa9Xo+xsTGm
+p6dJp9O8//77FItFAGnsJ4QQjwHJABBiD/i+T6fTCUf5VSoV5ubmqFar9PX1cerUKX7nd34nPOHv
+9Xq0Wq1wLKDrujQajTD9X9M0EokEnuc9lCc2qqo+lNcthBD321e5PwZTY0zTxPd9DMPA8zzS6TSt
+Voter0c8HscwDBqNBhMTE3z55Zd0Oh0ikciuR90KIYR4eEkAQIhbuFcb1WATHzRn6na7dLtdEokE
+x44dY2lpiXK5zPj4OPV6nXa7TSQSodvtEovFwi7OsVgM3/eJxWJMT0+HfQMeJqqqykJTCCG2cSf3
+x6Cr/9avDZ4zfX19TE5O0u12URSFaDRKOp1meHiYYrFIuVxmaWmJWq2G7/vous7AwACGYUjtvxBC
+PMIkACDEDvZio+q6LtVqlXK5TD6fp16vMzk5yfT0NJlMBsuyeOKJJ6jVaiSTSc6ePUutVqPZbFKv
+1x/Kms1erxd2nBZCCPEbd3J/jMViHDp0CM/zsG1707MgCBK3222Gh4cZHR2lVCqh63pYVqYoCrVa
+Lew5k8vleOedd0gmk+Tz+YcuuCyEEGJ3JAAgxA72YqPa6/WwbTsMMiiKQrlcZnl5mXw+j+d5tFot
+Wq0Whw4dYmZmhnw+T7PZDLs4b2UYBoODg2QymX07NeBhC1oIIcRe2e390fd9PM9jeHiYRqOB4zio
+qophGPR6PTRNo7+/n76+PtbX11EUhZdffplcLseJEydoNpuUy+XwGeE4DktLSywsLITlAkIIIR49
+0gRQiH1CURR0XScSiTAxMYHrutTrdTzPQ9d1MpkMjuNQr9fJZDKsrq6GqZ2xWIxOp4PneeRyOf7b
+f/tvJJNJ/vEf/5H19fX7cq3B7GlZJAohxIOhaRrRaHTTvTibzdLtdjl69CitVov19XUcx8G2bZLJ
+ZPhMaTQadDodycYSQojHjAQAhNhnVFUlGo0SiUQYHR0llUpx6NAhBgcH+cd//EcKhQKGYeC6bhgw
+OHz4MFevXqXZbGIYBrlcDk3T7tvUAF3XSSaTNJvNMH1UCCHEV6dp2qagbkBRFBRFCbPFgo27ruvk
+cjkikQjFYjHMKEun0ySTSer1OsPDwywsLGwqG5NArhBCPJ4kACDEPhUEAhKJBEePHkXXdS5cuBCe
+9pRKpU3NAbcuFu8nWTgKIcT9kUwmmZ6eDoO68JvnAUC320XXdbrdbtjpf3BwkEQiweLiIpZlhX9G
+13V83ycSiWBZ1qbTfgnkCiHE4+mOewDouk46ncZ1XUkbE+I+6vV6OI6DZVnU6/WwcdPv/M7vcOjQ
+Iebn52m32+FUgb3eiMvnXwgh7j3P88L0/OC+bpomw8PDtFqtsEO/7/uoqsrQ0BBvv/023/zmN7l0
+6RK1Wg248QzxPA/f97ft6h9Mp9mPfWKEEELcP/qd/oFkMsnp06f59a9/TbVavR/XJIT4L4qioKoq
+jUYjHA14/vx5AGzbDtNBhRBCPBo8zwtP/uHGSX63293UmX/jyf7w8DCdTofZ2dk7ei4EAQAhhBCP
+lzvOAHBdl3K5TLPZlBNAIe6zIEXTcRx836e/v58333wz7PgcZAlIIEAIIR49wThaz/M2bdZVVSWT
+yaBpGuVymfn5eRYWFmg2m9ue9gshhBCBOw4A+L5/Ux2ZEOLe21pnn0gkeOqpp3jzzTfJ5/Pkcjmi
+0SiVSiVsCCWLPiGEeHQoioJhGPT39zMwMEA2m8WyLJLJJK+++iqJRIJyuYzrugwPD9Pr9bYdEauq
+qjwfhBBCAHdRAiCEuD+2bvg1TSOVStHtdnFdl2Qyyblz5/h//+//cf78eRzHAW5k5WiahmEYX7kX
+gKqqEtwTQoh9QlVVRkZGeOWVVzh69CjxeJy/+qu/Ynl5mdXVVdbX1zly5AjXr1+nUqlw9OhRms3m
+phLNIIsgaBoohBDi8SZTAITYJ7Z2ZFYUBV2/EaNzXTfs9GzbdrgonJycpFQqoWkai4uL5PP58Ovv
+dKG3dZG43aJxp/FUQggh7j1FUYhGo/T19ZHNZjl48CDLy8vMzc2FU2LOnDnD+++/T6VSIZFI3NTV
+P+glo2malAcIIYS48xIAIcT9sVNHZsMw8H0f13VpNpuoqsrJkyd56qmn+N3f/V3eeOMNWq0WV65c
+odPpkMvlwg37nSz0gq7SwZ81TZORkRE6nU64mEwkEkxPT9NoNMJmVEIIIe5ekP2ladq292zf9/E8
+D8uyUBQFgGazyeDgINFolNnZWUqlEo7j0O12MQwjfG4Er2cYBrlcjm63K8FbIYR4zEkAQIh9ZLtT
++43/LRjrVK1WcRyHV155haWlJf7pn/6JxcVF4MbpfzwexzRNut0uqqqSSqXC9P5bBQU2/j/f9+l0
+OpvKCrYbT7VR0JHatm1ZZAohxDaC7K7gHqqqKvF4nHg8Hp7Q67pOPB5ncHAQ0zQ5cOAAU1NTvP32
+2xQKBRYWFqhWq1QqFarVani/NQyD0dFRcrncpkwA3/fpdrth6ZgQQojHlwQAhNjnFEUhEomEm/de
+r4dlWbTbbZaXl/npT3/K3NwcvV6P/v5+XNel1WqFzToTiQSnT59G0zRs22ZgYGBXG/QgI2HjRr/X
+692yz8Dw8DDf+c53WFxcpNFo3NOfgxBCPAqCcq+NpVqe5+E4Dp7noSgKyWSSJ598kjfeeCOcArO4
+uMiFCxdYWloikUhgWdZNwdher0en06Fer990r5agrBBCCJAAgBD73tbU/IDjOKyvr2PbNpZl0ev1
+ME2TbDZLu93GNE0ymQy+71MoFCiXy2SzWb7zne+wtLREt9slGo3elBWw9XTqTti2zeLiIsViccfF
+ZlCPeievLx2shRCPip3KvRRFCbv+BxlYc3NzNBoNUqkUzWaT1dVVEokE3/72t6nValSr1ZuyxFzX
+vSl4K4QQQgSkCaAQD7GgdjQYEzg4OEipVML3fZ5//nmmpqb45JNPuHz5MrquMzg4yMTEBCsrK2ia
+RiQSYXZ2lna7Hb6eYRjE4/GbGkndq+s1DCPMRthNo0LpYC2EeJQEAc1gg65pGul0mkgkQrPZpL+/
+H8MwqFartFotEokErutiWVZY49/f30+tVtuxHEsIIYTYiWQACPGQ830fwzDo6+ujWq3SaDTCEYKl
+UomlpSVc1+WZZ57hW9/6Fq+//jpTU1N0Oh2++OILGo3GplrUYJzgvd78w43U10QicUeNqHbKgNhI
+MgSEEA+DIKAZZF4ZhsHBgwc5d+4chmFQKBSIRqO8/vrrYaD02WefpVQqhfdqz/NoNpt3VM//VTK7
+hBBC3B+6rpNOp+9qetdXIQEAIR4Bvu+HpQBBx+hKpUKpVMI0TVqtVpguury8jG3brK6ucv36dWzb
+Dl8n2Gx7nnfTQjGoW/U8L7xJ3enG+27TU2/1tVsX1EIIsV8F99jgXpXL5XjzzTeZnJxkcnKSVquF
+bdv09/dz8eJFOp1OGLBtNBphM9c7tV3fASGEEA9WOp3m9OnTlMtlLMvas/eVEgAhHmGRSIT+/n56
+vR7pdJrjx4/z0Ucf4TgOiqJQqVRwHIdoNEqn07nlqXx/fz8zMzOcP3+eUql029T8u12o3o29fC8h
+hPgqglr/oNt/f38/sViMEydO8MILL/DTn/6UK1euUCgUAEgmk+F9tq+vj3K5fMdjWINyse2Cu0II
+IR6MIDh7P8pub/m+e/ZOQog9F4/HeeGFF0in01iWxYULFyiVSvT393P48GHm5uao1+scOXKExcVF
+SqUSALFYDNu2w5uRYRhEIhFyuRy6fuO2EYyV2mnzHwQHFEXBNM27Gg242429bP6FEPfbvepHEkx2
+CUb+ra+vo6oqpVKJ2dlZIpEItVotvP9Wq1VUVcU0TarV6l0tEoPsKyGEEPuH67pUq9U9f18pARDi
+Eea6LpVKhUajweXLl1laWsJxHAzDwDCMsFt/MB6w0WgQiUR48skn6Xa7WJaFruvkcjkajQbz8/Ob
+uk7vdJK0sTlhNpvlyJEj4Viq3ZLUfiHEfmKaJiMjI3Q6HVzXxTRNRkdHbxncDPqx+L5PJBKhr6+P
+aDRKt9slFosxMTGBZVmoqopt25TLZarVKrZtb7rvBe99p7X/GwVBBLmnCiHE400CAEI8wnzfp91u
+Uy6XqdfruK5LNBpleHiYtbU1dF1namqK9fX1sBzAdV3a7Xa4IA16Ati2TavV2tXJl2EYZLNZAEZH
+R9F1nWKxeEcL1900/xNCiL0SjObrdrv0ej1GR0f5/ve/z/Xr16nX69v+mVQqxfHjx8Pu/jMzM4yP
+j1MsFhkdHeXMmTOsra0Rj8eJRCJhp/+tG/St7303tgYwhBBCPJ4kACDEQ+hOmu8FXaPhRk+AyclJ
+JiYm6Ha7DAwMkMlkKBaLuK7LwYMHyWazKIrCoUOHwsWmaZphOn8ikbhtHWlQHmDbNs1mk2KxiGVZ
+d7xwlVMqIcR+EaTRB/cl27a5fv06hULhpgwARVFQVRXXdanVauFklWazSbfbpV6vk8vluHbtGrFY
+jNdffx2AcrlMIpHAcZxNwc+t73037kUQQQghxP5jmiZjY2M4jrOrclsJAAjxAN3N+Lq7SY0PUlUn
+Jyf57ne/S6FQIJVK0W63eeaZZ8LX+8EPfsArr7yCpmk8//zzDAwM4HkehUKBbrdLPB5nenqaRqOx
+KZ1fVVVisdimwEDw747jhLWuQgjxqPA8j0ajsek0XVVVVFUlHo+jaVqYVZXJZMhmsyQSCeDGPfnI
+kSMUi0Wmp6e5du0a5XKZXq/HmTNnKBaLdDqde3q99yKIIIQQYv8ZHR3l3XffZXV1lWq1etv7vAQA
+hHhA7rbG/W5S44eHh/nBD37A4OAgQ0NDLC8vc/Xq1bDr6Ne//nWuXLnCJ598wuXLl1EUhVOnTpHL
+5VhfX2d9fZ1oNIpt21SrVTqdzqZrjsViTE1N0Wq1wjR/mTsthHiUaZpGPB4Pg53BPd00TSYnJ8P7
+a5ANkMlkqNfrKIrCgQMHWFxcxPM8jh8/zq9//WuWl5dpt9sUCgXq9bqUPwkhhNiVICNtbW1tVyVe
+MgZQiAdor8bXmabJ0NAQjuOg6zrdbpdIJEKlUkHTNA4cOBAuUrPZLJqm4bou+XyecrlMX18fx44d
+48MPP6RQKNx0oq9p2k2d/g3DIJFI7PloEyGEuBdud39OJpNMT0+HwVRFUTAMg3Q6jWma1Go1er0e
+sViMZ599lrfeeotf/OIX+L6PYRhUq1WuXbvG8ePH+fd///dwCosQQghxP0kGgBAP0F6djnueR71e
+p9lsUq/X6XQ6mzpZp9NpDhw4wDvvvIPneVy5coWrV6/iOA6dTgfLsiiVSiSTSTRNC0++DMPA8zwU
+RcHzPEzTRFEUcrkc4+PjJJNJ2u32LZv/BSOx7kUg5F6+lhDi8bWbDC3f97Esi3a7je/76LrO2NgY
+MzMzZDIZLMtC07SwWaDjOOTzeVZXV5mZmWFubo6lpSV0XWdtbe2OpqQIIYQQd0sCAEI8Irarw99J
+0BgwqAkNAgGffPIJtm0zMTHB2toamUwmzBSo1Wo0m008z+PgwYMcP36ceDxOrVbDNE10XWdychJF
+UXj11Vf5oz/6I86cOcPVq1cplUo7bsojkQi5XI5ut7urxiW3ci9fS4j9QEa3PRhBqdWtfua6rpNM
+JvE8j3Q6TTwe5+mnn6bX6zE7O4vrupw+fZqRkRG++OILnnnmGQ4fPszPfvYzPvjgA+bm5mg0GpTL
+5btqkiqEEELcDQkACPGI2K4Ofzd83w/nTyuKwjvvvBOeUh08eJB2u41t2xiGAdyoM6rX6+TzedbX
+12m323S73XCDX6/XqVQqNJtNPvvsMy5fvky73b7lKVq3293xmu9kA3S71xLiYSOj2x6cXq8X9jJR
+FGXb/+84DtlslpmZGer1Oo7jEIlESKVSdLtdyuUyqVSKy5cvMzs7i2VZXLt2jaWlJSzLwvd9aZIq
+hBBiT0kPACEeEaqqEo1Gw0Xl3TBNk4mJCXzfZ21tjYGBAU6dOhUGB2zbplQqUalU6Ha74Xtpmsbg
+4CBHjhzh4sWLNJtNUqkUyWQyzBwIrimok93tojcajTIyMkI+n8eyrLv6vh4Ge9UPQjxcglT0jUE2
+ce8pioKmaTdlUOm6Tjqdptvthqn+cCPbaGhoiGg0GgYIPM/jT/7kT3jmmWe4fPkyf/EXf8Ha2lo4
+DWBgYIB0Oo2qqnzxxRe02+0H9e0KIYR4jEkGgBCPiOA06m5OkoLaec/zaLVaeJ6H67pomsbKygpr
+a2s4jsP09DTf+MY3woaBlmWRyWSIxWIcPHiQtbU1bNsO//E876aAxK3S9Lcbi/g4zK6+24kQDwOZ
+BvHVyOi2vRGk87uuu+l+tXWUaRDAHBgY4L//9//O6dOnuXz5MoVCgfHxcV577TXa7TZLS0v88pe/
+DNP7Xdel3W5TLpepVCrYti1/p0IIIR4IyQAQQoSb8mazSSwWC9Ndz5w5w0cffYTv+xw6dIhvf/vb
+YfrqF198ged5vPzyy8zNzdHf30+hUKBSqYSBAEVR6PV6mxa6O2UAPO4nnY9qBkCwsZJpEGI/25gB
+EPRT6XQ6m4KUmqaRyWTI5XLU63Wi0SgAtVqNI0eO8PLLLzM7O8u1a9ewLIt8Pi+N/YQQQuw7kgEg
+hAhPuQAsywo7/xeLRXq9Hi+99BJPP/00n3/+OdevX+d3f/d3aTQazM/Ph7WsTz75JMlkklarRavV
+Ck/sNU276aRruwZ9QdOtrZvgx+UE+VH9/oITbGnKKParoM9IkGmRSCSYnp6m0Whs2sDHYjFOnDjB
+oUOHWF5eZn19Hdu2w+kn2WwWwzC4evUq7Xb7K5VjCSGEEPeLBACEEJumAmiaFm7YOp0OjuNQKpVw
+HIfnn3+eWq3Gm2++SSQS4cKFC2EjwPX1dYrFIvl8PqyV1TRt27TaW13HVjul5oqHh/y9if1sa6NF
+z/PCiScbmwDquk6j0WB9fT28V46NjXH48GEWFxf58ssvqdfr2LZNo9GQZqRCCCH2pX0XANiuBlgI
+sTcikchNHceDGvxCocDKygp9fX2Mjo5y9uxZCoUCnudh2zbtdhvTNDfV6289/b2bkWZBEEFO04R4
+OO335/rWPiPBtfb392MYBqlUil6vx8jICIqihA3/otEo9XqdbreLqqqUy2XK5TLtdls6+wshhNi3
+9lUA4FFuhCXEw+BWDfeCgMBTTz1FrVbj8OHDnDx5km9961soihI2ukokEptqZzdu2rcbaaZpGolE
+4qbu24G+vj6ee+45isUinU7nfn3rQoj74H4814Ma/Z3uGRvLhnYTfAia+/X19aFpWvhnLcvCcRyS
+ySSmaYYN/aLRKNVqlWaziaZpnDt3jmeffZb5+XkajYYEKoUQQuxr+yoAsFMNsBD3yuNST363btdx
+vNfr0Wg0+Oyzz3jvvfe4cuUKL774IqdPn+bQoUN4nkckEqFWq2FZFoqiEIvFiMVi9PX1hc3gglnZ
+wUJ+u3rbgOM4FItF6vX6plGCwaZCCLF/3Y/neiwWY2pqilartW2afVA25Ps+uq6HwYfgfrNdMKKv
+r4+XX34ZwzBIJpMANJtNkskkr7/+OkePHuXatWvUarUwSBoEOdfW1rh69SqVSmXbySZ3mvUkhBBC
+3E8yBUA8VqQj+a3tNAs7EKTjB5kC8XicU6dOcerUKT755BOuXbtGr9cjlUqxvr6O67pMTU3R19fH
+E088QTwe57333qNcLtPX10e9XqdSqWAYxk0dt28lmFpQLpely7YQjxlVVYlGozuWBW28jymKEn5N
+PB5namqKxcXFcExpcPqv6zqZTCZ8Tdd1cRwHXdfJ5XKoqkqtViOVSqGqKsViEYBMJkOtVgsDEVun
+mUSjUUZGRsjn81iWtXc/JCGEEGIHEgAQj5XbbXAfd7cLkESjUQ4fPkwkEmFubi7s8D8yMsLy8jKe
+55FIJOj1eiSTSUqlUnjS39/fTzwep1Qq0Wq1sCyLbrd7U63sbv6OdholKO69R3U8odif7uc9Oggc
+uK5LPB4P+5b09/fTarVwXTfMKggyBnRdD7Oistksb7/9NpFIhB/96EfUarWbAgBbN/yP+3hTIYQQ
++8++KgEQYi/IImxntxvZ5vs+7XabZrMZLpQVRaHdbhOPx5menubs2bM0Go0wRT+TyaAoCkePHuXA
+gQP09fVRrVapVqvhe25MzzVNk4MHD4b1t7B9Gu3DMlbuYS47kb4sYq/di6kfO/UICMadBif8mqZx
+6tQp3n33XUzTZGBgIMxs6na7GIbB5OQk3W6XWCyGZVksLy+H6f6u624qBYDtGwreqqxKCCGE2GsS
+ABBCbHKrRXewiE2n0+G/j46OkkwmOXnyJIODgzQaDaampkin0zQaDQzDIJFIEI1GOXDgAB988AFL
+S0thVoDruriuSywW48CBAyQSCV599VXW19ep1Wr0er2weaBt23dduvGgOpE/zGMMpS+L2Gu3C0Lu
+xnY9AjRNI51Ok0qlSKVSdLtdTNPE8zwuX77M/Pw8lUoFRVH4+te/zurqKr1ej8nJSTzP48SJExSL
+RUqlEs1mM/xM+L6/qSeJbPiFEELsd1ICIIQI3SrdOzgNDtJn+/v7WVtbCxe6sVgMRVGIRqO8/fbb
+zMzM8Otf/5qxsTGGh4f5q7/6KwqFAsvLy9i2TTKZZGhoCIDFxUUcxyEWi6HrOqlUikajQaPRwPO8
+MHUX2NU4wK1pxFvTcPeyFETKTu6MlByIr2pjqn8kEqHT6RCLxXj22WcZGhpieHiY9957D9u2KZVK
+mKZJLpdjcHCQS5cuoWlaeMIfjUbxPI9sNhtmPm0NTkhPEiGEEA8TyQAQQgC3T/feOMLPcRza7Ta2
+beM4Dq7r0ul0wn/W1tbI5/N89tlnLCwsMDk5SaVSwXEcbNvGMAwGBwd54403iMfjLC4uhin/3W6X
+er0eLt6Da3EcB8/zdrU53HrqvvUke69P5WVDuztSciA22pq1s9vpH0GqfyqV4rnnnsOyLDqdDr7v
+h3X7mqaxsrJCLBYjlUoxODjIysoK7XY7HDca3NtM0ySRSHD69GlM06TZbN6U9h/0MxFCCCH2OwkA
+CCGA26d7B7Wtvu8Tj8exLGvbNN2gT4BlWWSzWWq1GrZtc/nyZXq9HrFYjJmZGQ4fPszy8jLXrl2j
+1WqRzWbJZDLha0ciEQ4cOIBt26iqiqIou04L3i6NeGst8FdNMxb3npQciMB2waDgpH1r3T0QdvGP
+x+Mkk8kwo+jkyZNomobjOJw5c4Zerxf2IYlGo7z11lscO3aMeDxOsVjEsqxwVGmv1yMajXLs2DGe
+euopfu/3fo+TJ09y+fJlqtXqpnuK3EuEEEI8LKQEQAhxR4IO/IZh3DRKK0h1N02TY8eOMTY2xsWL
+F7Esi4GBAd59911+8YtfcPbsWWZmZvA8j/Pnz/OrX/2K48ePE4lEqNVq/OhHP6LdbnPw4EHy+Tzt
+dptoNHrTdILgWjRNw7btB7Zx3O9p/vv9+oTYztZykO2mf2iaRiwWI51Oc+bMGVKpFJ7n8bOf/YxO
+p0MqlULTNPr7+zl8+DCzs7N84xvf4NSpU1y9epXz58/TarWo1+sUCoUwqyl4bSBsTprL5fB9n+Xl
+ZSzLks+SEEKIh9JjGQCQGlMhvpp4PB5uzuv1Op7noWlaOEJQ07SwXKDZbGKaJpFIhJdffhnHcZib
+m2NoaIjTp09z+vRp/uZv/oZms8n6+jrNZpNisRgGEoKu3aqq3rSB1XWdgYEBkskkS0tLO87ZVhRl
+0zzwe+124xMftP1+feLx9lWeyYlEgieffBK4sVE/cuQIV65cIZ/Ph3X7AwMDvPnmmxSLRX74wx+G
+WQCKorCyskKn0wnLi4L7y3afmSCQFo/Ht+0FIIQQQjwMHrsSAKkxFeKr832fVquFZVlomhambQdp
+9X19fbzwwgtcv36der2O4zh0Oh0WFxdZXFxkdXWV5eVlGo0Gr776Kv39/Zimyeeff04+n6fX65FM
+JtF1nWw2i67rADd11+71enS7XZrNZjh2a6tg0W4Yxn373O/3koL9fn3i8XUvnslBM796vY7v+7zw
+wgs899xznDlzhv7+fhzHoVqtUigUuHbtGvV6PQxittvtMIi50U6fmWQyyfHjx8PSpvvtQU0vEUII
+8ejSH/QF7LWgWY9kAAhx9zzPo9VqhSfrQfd/27bp9XrUajXef//9cIxfcIJWr9fD13Ach4WFBf7h
+H/4BRVH4+OOPKRQK+L5PIpHg2LFjGIbBuXPnWFlZ4fr161y6dAlVVcOU/3a7HXbdDtKDI5HIpv4E
+iqKg6/p9Hc218Xu8lQeVir/b6xNirwXP5Ft9HoKu/kGZz8bPkOu6lMtl4EaPANu2+cY3vsH09HSY
+9bOwsMDHH3/Mhx9+CBA29NN1HU3TUBTlpvfc6TPTarX4/PPPabVa9+gnsLOt00uEEEKIe+GxywAA
+JJouxD0UNPbbOHc7aAR4q0Vr0NhveXmZarXK+vo6fX194UI/qPu3bTt87UajwdmzZzl79iyqqlIq
+lfB9n2QySTweJ5vNMjo6SqPR2NSRO8hQeNCffV3XSafT4c9ICHGDpmk7fj433l+C7KAgoBds3oPx
+oQcPHsQwDBYWFpibmyMSifBv//Zv/PM//zMXL14M7w2lUgnbthkeHqZYLO76NL/X64WBzvtNmmIK
+IYS4Hx67DAAhjlrpMgAAIABJREFUxL1nWRYLCws71uBvJxKJMDg4yPr6Oo7jcOzYMV5//XXy+Ty/
+/vWvSaVSvPvuu1y/fp0XXniBfD7PyMgIvu8TjUbp9XrhZuCFF15AURTW1tZYXFzEcRwURQkX6UH/
+gNu53/1BgpKFBx2IEI+mh63ZY5DevrF/yHan7rZts7CwEGYANJvNsC9IPB7H933S6TS5XI5Go8FP
+fvITfN9nZGSEf/u3f2NycpJyubypc//6+jq1Wg3TNPfkNP9uyeZfCCHEvfZYNgEUQjx4wWm4bds8
+/fTTvPvuu8zPz3P9+nWOHj3K5OQkU1NTjI+Po6oqCwsLXL58mX/9139leXmZZrNJuVwmm83y5ptv
+srS0xGeffUatVkPX9TBtNhgdVi6Xw3KB7exFum1QLhEEL4S4lx6mZo8bP2+appHJZKjVapsyd7Z+
+bWB4eJhYLEa32w3/yeVy/Pmf/znDw8PMzs7yi1/8go8//phisUhfXx/5fH5PavaFEEKI/e6xLAEQ
+Qjx40WiU8fFxNE3j6aef5vLly3z44YfEYjE++ugjPv30U7rdLo7j8Hd/93e89957nD9/nrW1NQzD
+wHVdOp0OlmWxvLzM8vIytm2HjbuCTXwkEmFgYGBXm6K9KBOQjb+4X+5ns8f70Ywu+LylUilOnTpF
+uVzelEUUZAkBjI+Pc+zYMfr7+/mf//N/8u677zI+Ps7a2hr1eh1N00ilUuRyOZrNJpZlUalUqFar
+RKNRWq3Wvg+KCCGEEHtBAgBCiHsuaLx3qw1DkMrbbDZZXl7m6tWrqKrKSy+9xJUrVyiXy4yNjXHx
+4kUymQxwo4ng2NgYTzzxRHiSPjQ0RDweJxaLMTw8TL1e33TSH0ws2E2jsY0jwGSjLh5G9yN75U47
+9d/u86/rOplMhkgkguu6YR2/ZVmbPqeDg4O88847uK7LgQMH+KM/+iNM06RUKtFsNrl06RLPPfcc
+8XicgYEBPv30U0qlEr/4xS/I5/Pk83mq1equPv9CCCHE40ICAEKIey5IRXZdd9sNSbBB6Ha7uK5L
+u93GcRwsy+L69euUy2V0XWd+fp6rV68yPz9PPp8nnU5jmiZTU1Osra1x5swZ/vAP/5A33niDTCZD
+vV5ndXUVx3HQNC3c1N+uJnrjBieoR97p2oV43Oy2GZ2u6+RyOUzTJBqN7tjsMplMcu7cOQYHBymX
+y6RSKc6dO4dpmhSLxbAMoNvt0ul0eP311/n+97/P0NAQS0tLmKaJ7/t89NFHfPjhh3Q6HUZGRrhw
+4QJzc3PhZIFqtUqn08FxHNn8P8ZUVQ1/Z+T3QAghJAAghLgPbpeKHNTl27a96WuC8YLxeJxTp06x
+vLxMvV4PT/Cy2SyHDx8mm83S6XRYWVnho48+YnFxkU8//ZQvv/wyXOCZpkk8Hsc0zZveKziBDN4T
+fpOOfD/TqIV4WO1m49TX18err77KwMAA1Wo1bNa3UdCtv1arsbq6SrvdxrZtarUa6+vrm8b8ua5L
+tVqlUCiEwcFcLsfQ0BD/+Z//ycjICF988QWe5zE7OxtmBrTbbWq1Gp1OR4J4AtM0GRkZodPpSBmI
+EEIgAQAhxH2y08I76LRv2/ZNDb+CLuaO41AulzdtIII04fX1ddrtNm+++Sb1ep3l5WVmZ2eJRqNk
+s1mOHDlCLBYjFosxOjrKgQMHePXVV3Fdl2azieM4pFIpnnvuObrdbvgevV4vPCkKRozdK0F98r1+
+XfHo24+nl6qqEovFbsqscV0Xy7LCz2ChULip8WY6nWZmZoZMJkO1WiWVSmEYBgMDA+i6zsjICAcO
+HAinAwTBgGg0imEYzM/Pc/78eX75y18yOztLsVikVqvRaDTCr3UcRzJ4RMj3fTqdjpSBCCHEf5EA
+gBBizwSp9sHp3lZB6UC326Xdbm9awCeTSZ588kkajQamabKyskK73SaVSrG0tESv10PXdUqlEidO
+nOCll15ibGyMRqPB+vo6r732Gs1mk/X1dSzLolQqUa1WcV033GikUinGx8fvecOwVCrF8ePHqdVq
+0olc3JH9eHoZi8WYmpqi1WrdFMTrdDosLS2xsrISbsS3Bgl83+fEiRNYlsWpU6fCjJ5kMommabzw
+wgtMTEyQzWYZGhpidHSUS5cu8fnnn1MqlTh27Bhzc3MUCgVc1w1/Lg/TCESxd4KsLvm9EEKIGyQA
+IITYU1tPMjc237tV+r3rumFX72KxSLVaDTcGhUIhTP0Nan9N0+TYsWO0222KxSKXLl3Ctm0Mw8Bx
+HBqNRtgrIOgtkM1mUVWVWq2G53l31PlcVdUd/5/rutRqNVqtlixCxR15EKeXt8s6CK5pa38NwzDo
+6+sL0++DTdfGz4aqqiQSCfr6+jh06BBf+9rXiMfjPPXUU5w8eRJVVWk0GqyurrK0tESn02FmZoYL
+Fy6Qz+dpNpusrKxQqVQ23ScMwyCbzd5UViSEEEKIzRRAVqNCiD2haRqJRIJWqxVusINZ4Ds1C9zp
+VG/rzPNIJMLQ0BC6rtNqtZiZmeFb3/oWFy9e5IsvvmB4eJjvfve7FItFfvzjH/Pee+9RrVbD1wqu
+Dwg3LoZh3HRt211T8H04joOqqhiGcd83IoqihMEMCSqIeykajTIyMkI+n980lu92XxP87gcb/iDb
+JfhsAAwPD/P7v//7eJ7HF198Qa1WQ1EUDh06xNLSEgsLCzSbTeLxOE8//TQff/wxqqpSLBZvmT2j
+6zp9fX1YlkW73UZV1U33ByGEEELcIBkAQog9szUV/nbdxXVdJ51Oo2naTSmcQcO+rd37K5UKjUaD
+fD7PxYsXKZfLNBoNnnnmGaamprh27VpYQlCr1YAbp4fBNXieh2maAJtOMIMT0e2mBARBgV6vRzqd
+ZmJiIuw3cL8EjRS73e5jd+KpKEr49y6+muBnmclkwq79u8k62Pg1mqaRyWTCz0hfX9+mHh+appHN
+ZkkkEgwODvL222/j+z61Wo1MJkMul8P3fYaHhymXy6yurtJqtWg2m3S7XRKJBJqmhfeM7UYMxuNx
+jh07Rjwep1arEY/HOX36NOVyeccgxldxJ9lBQgghxF7Y7fpIAgBCiD2zXSr8rRbRQSOwwcHBm2qg
+dV1ncHAwrPMP6o07nQ6e52FZFpVKhVarxcDAAIqicOTIEc6fP8/PfvYzVlZWAMhmswwPD+M4Dul0
+mm63i2EYRKPR8N8PHz7M0NAQjUYjzAjQdT1MkQ7Sjy3LwrZtms1muFnZyVfdQASjzu5nkGG/epyD
+H/fCxt89VVUZGhriueeeo1AohL+3WwNuiqIQjUbDQEHQx6PX64Vj/QYGBigUCrRaLRRFCf9uMpkM
+r7zyCqZpUq1WWVlZYXl5mRdffJFjx47RaDTI5XIcOXKESqXC6uoqvV6PiYkJZmZm+P3f/31isRhf
+fvklruuGAbjg/mAYRjhBpFgsYlnWto1E7+XPL1hgSRBACCHEfrHb9ZEEAIQQe6bX6912Y7xVsKnf
+ehoZvFa9Xse27fAU0rZtfN8PNzlB74BgekAwVtBxHI4fP865c+dYX1+nXq+H7+O6bvh+Bw8e5H/8
+j/9BqVQK31fXdU6cOIGqqkSjUWzb3lTzHHzdxsyCje7VBuJx3fw+zsGPr2q73z3btllfX6fZbG4K
+bG2k6zoTExOcOXOG9fV1Op1O+P88z6NcLoe9OFzXxTAM0uk0/f39ZLNZYrEY8XicmZkZvv3tb5NM
+JvE8j5/97Ge8//77LCwsoOs6ly5dwrIsut0uuVyOb37zm/zyl7/k/fffp1wuh4EHz/NQFIVkMklf
+Xx+u6xKNRsP3930fy7LuS5bI7TKXhBBCiAdht+sj6QEghHio7NQXIKiJD7IEIpFI2BsAbizajxw5
+wmuvvcbJkyf53//7f/PWW2+RTCb567/+a65fv06z2aSvrw/DMOj1ejiOw9DQENPT03zxxRe88cYb
+fPTRR1y6dInXXnuNVquFpmn8+Mc/plgshiUJAwMD1Ot1kskk5XL5plFot+ptAL85od0vp4u369Ug
+9rdg9Cbc+ndPURQURdkxaJVOp8nlcqysrNDr9RgcHKRYLIa9L9LpdPgZOHHiBMeOHePEiROYpsmB
+Awfodrtks1kWFha4cuUK//f//l+uX7/O6uoqvu+TSqVot9vha2SzWSKRSBhY2HpdiqKgqmr4/QQj
+RPfL50YIIYTYj/QHfQFCCHEnghr8rc29er3epo32xoyBoaEh1tbWuHbtGnBjtFo+n+ev//qv0TSN
+q1evYts2Bw8e5E//9E85duwYvu8zPz/P559/HkZTf/jDH1IqlajVavyv//W/8H2faDRKOp3GcZxw
+dGFQAhCkYCmKclOwYqeT1o0NBffLhiYSidy2KdxubdyMivtva/AmCJTpun5TQOdWQadggz82Nka1
+WmVsbIzvfe97/OQnP6FUKlGpVFBVlZMnTzI9Pc1zzz2Hoij09fXxq1/9ClVVmZ6e5ssvv2RlZQVF
+UUin02GzTM/zqFQqwI3ft6mpKaanp3n//fdpNBqoqkomkwGg2WyGAYzgz8LjmxEjhBBC3AkpAdgj
+qqoSi8VkRrEQX9HWUYE7NTwJPmee54Wp/Y7jhDXIo6OjNBoNZmdnabVaGIbB1NQUi4uLpNNpkskk
+Q0NDDAwMUCwWmZ6exnVdbNsmmUyGNcaJRIIf/OAHeJ6H4zi0Wq0w9Xhjk8Ktn/udUoiD9GJd1++q
+zj0ILuw0avFu3KtRdFI7fWduN45vN7ZLV9c0LWzUd6vfreCEPXgdy7Iol8uoqsrRo0exLIsXX3yR
+l156Cdd1yefzKIrCG2+8wdWrV/nhD3/Iz3/+c7788kuWlpa4fPky//AP/8Cnn35KPB7nww8/pFAo
+bDuj3bIsVlZWqNfreJ5HIpHgmWeeYXh4mFKpdFNWjRCPo0gkwvDwsIy/FELcEQkA7JFYLMbU1FRY
+eyyEuHsbNzO3a3iytaGZ53k0Gg2KxSLFYpFut0symcT3fer1OqZpMj4+zuDgID/84Q/55S9/ybVr
+18hms5w4cYJEIsEf/uEf8uSTT7K0tIRt26ysrLC0tEQikaDZbIan3MHma+tmPLiunQQnsRs7qe+G
+oiiYpkkikQg7ut+LTfd2TeHu9nWkdvoG0zQZHR295cLdNE1GRkZuaoB5p7YLPu30u7UxrT6ZTIYj
+Mjf+vQW9N0zTDE/85+fnqVQqFItF6vU6a2trlMtlUqkUX//613nrrbeoVqt8/PHHlEolotEoa2tr
+wI1snWBsH9yYFqLrOtVqNfy+Pc+jWq2GvTwkgCTEjbGa3/nOd1hcXKTRaDzoyxFCPCQkALBHgg7F
+lmXJwkWIe+huGsIFDcKCTXKQjpxIJPj+979PpVLh2rVraJrGa6+9xoEDB7hy5QqXLl0ikUjQ39/P
+8PAwpmkyMTFBLBZjZWWFVCqF4zgcOnSITqcTzi0PRgRutxnfmsGgaRqpVArXdXf1PW083dd1nUQi
+QafTCf/sftt0P0r3v6+SWTE6Osr3v/99rl+/Tr1e3/ZrbpV58VVGIQap8xtfS9d1FEUBbgTVotEo
+R44codlshl32k8kk4+PjmKbJkSNH+NM//dOwROXw4cOcPHmSXq/HN7/5zTC4YVkWZ86coVAo8JOf
+/ARN02i1WsRiMWKxGKVSCcuySCaTHD9+HM/zOHz4MMVikXa7vemabdu+4yaiQjzKbNtmcXGRYrEo
+GQBCiF2TAMAeCRqKycJFiHvvqy58PM/Dtm1arRazs7N89tlndDodfu/3fo8nnniCeDzO3Nwc+Xye
+t956i3K5zI9+9KOw3r/X61EqlSgWi0QiEZ566qlw0xaLxcKRgsFGPEjBdl0XTdM2ZTCkUimOHz9O
+tVoNAwg72RpQCO4zW+81ct+59+42syLYbFuWxfz8PIVCYcff31tlXpimydDQ0D1J/dV1nXQ6jaqq
+YXmN4zjhxIxut4uu64yOjhKJRHjxxRf55je/ydNPP82lS5f4+c9/ztNPPx2+1k9/+lM+/vhjZmdn
+w1P/8+fPMz8/T7Vapd1uh5kywSl/MCK0Xq/ft/F9Qjxqgow22fwLIe6ETAEQQoj/Epyga5rGs88+
+SyQSIZ/P0263wwZlL774Io7jcPHiRSzLYnBwkK997WuUSiUuXLhALBaj1+sRj8fJZDI0m00+/fRT
+2u02mUyGWq1GMpnk+eef54MPPqBaraLrerhp1zSNRCJBq9XacVEXnNQG/y4bpQfjbhoa6rq+bRPL
+O2UYBtlslkqlEmZ7mKbJ8PAwtVqNRqNxy2sLykWSySTxeBzDMCgWi5v+XDAVIDithxuZC7lcDtd1
+ef3115mYmODf//3fyWaz5HI5FhcXef/99/nyyy/pdDqbfkYbmwyqqoqu6+HIPiGEEELsDckAEEKI
+/5LJZHj++edpt9vkcjk++eQT5ubmKJVK/P/27izGzvO8D/j/LHPmzMLZyOG+SSRFkaKWyDJkybXk
+1nElOXFTuHaa1E7hBL4qkKYoUCANkJteFb1p0RS9StwNbYIkBQoUSFAljV3bcCQ7hDctJEVRpEgO
+h9tw9uXM1ovkfJ7hJlKiNCTP7wd8gA75zZn3nDMi+f7f533e6enpVCqVbNy4MZVKpZhkbdiwoTim
+rFar5ZlnnsmePXuybdu2vPXWWxkaGsrS0lK2bNmSL3zhC8Xe6JWTrZXNQZulzjdaVW4eqbZ+/fos
+LCzcUmO+D9oEkOt7P+/p1U0sr3arn1Xz52RlM8xdu3blX/yLf5GpqakMDQ1ddwtJM2AqlUrZtGlT
+PvGJT+TTn/50HnvssYyOjhbfe2BgINu3b8+2bdvy5JNP5oknnkij0ciuXbuSJCMjIzlx4kTa2tqy
+b9++fOMb38g3vvGNvPHGG7l8+XLxGpunYKzcrtB8jZriAsBHzzGAJPlpCejCwsJNVx6hFUxMTOR7
+3/tecaxf09TUVA4fPpyOjo6Uy+W0tbXlxIkTaW9vz7PPPps9e/Zk165dOXnyZM6cOZPz589n165d
+6e7uTqVSyYEDB4pmTc2TBwYGBlIqlTI5OZmpqan3XA0dHBzMP/kn/yTt7e35gz/4gxw+fDgzMzM3
+vP9Gx8DZkrQ2mgHA9Vz9Wd3K8zQn183nLJfLqdfrq6pEVj7/+vXr8+ijj+b111/P+Ph4jh07llOn
+TmVgYCDr16/P3/pbfyuvvvpqDh06lM9//vNZWlrK/Px8jh49WvQJOHToUMrlcv7kT/4k3/nOd3Lq
+1KkcOXIko6Oj6enpSWdnZ7q7u3PhwoXitTSDquZ4P+iJEgDA+2MLAEmSvr6+PPvssxkZGSnKleFe
+1uxmXiqVbnmlsVqtprOzM9PT01lYWCgm+SuP9FteXk5/f3+SZPfu3XnttdcyPT2d/v7+tLe3p1qt
+Fg0Al5aWsnv37oyNjaVUKuXBBx/Mrl278s1vfjMjIyPp6+vLww8/nMceeyyHDx/OX/3VX2VpaSkL
+Cwvp7u7O2NhY5ufni4nh/Px8arVatm3bllKplMuXL2d+fj6NRqMopb7e61xZht08NWFkZOSWjlK7
+lcCgWc79fkKF91NGf79a2YG/ufe/VCqtKp2/2srPs1wu58CBAzl48GBefvnljIyMpKOjoyjFHxwc
+zM6dO7N37978+Mc/zuzsbF544YUsLy/n6aefzrp16zI9PZ1/9+/+XSqVSl588cV8+9vfzuLiYqrV
+anFE5vz8fKanp3Px4sXMzs6mUqkUYVkzJCiVSjec5PvMAWDt2AJAkmRhYSEXL17M+fPnMzMzY2WG
+e165XE5nZ2c6OzuLbv/vpXk8WvPetra2bNy4MbVaLaVSKdu3b19VITMyMpKZmZksLi5maWkpU1NT
+RQOz5eXlDA4OZmRkpAgCduzYkba2tjQajWKFdsOGDXn88cczMTGRCxcuZPv27anX63nppZcyMzNT
+9AjYvHlzsTXg8uXLGR0dTVdXV3bu3FmEHDdqGHd1Q8DbOV5w5TGLy8vLRSDS1NxL3t/ff8OjGG9k
+ZSO9ZtBws8nu/eJmHfybVSHNxnvd3d3Fz2+lUklHR0dxvGN3d3fa29uL42WXlpZy+fLlnD17NuPj
+4+nq6spDDz2U+fn5dHd359lnn83c3FyOHDmSCxcupFqt5uGHH87HPvax/OVf/mX++I//OD/4wQ9S
+KpUyPT2dv/zLv8wbb7yR0dHRrF+/Pu+8807Onj2bc+fO5dKlS5mbm0u5XM7s7GzxWppbWm72c3C/
+f74AcDcTAJDkp8dNOWKJ+8ni4uJtT0pXagYCzWP1mp3JBwYG0t3dnXK5nHK5XEyENmzYUEyGNm/e
+nC996Us5c+ZMxsfHs7S0lI0bN+bKlSs5c+ZMRkZGsm/fvvzcz/1cfvKTn6Rer2dpaSkjIyNZWFjI
+E088ka1bt+bMmTOZmZkpgofOzs5Uq9XUarXs2bMnQ0NDxWSvVCqtCgGaK8orH99ORUTy08BgYWEh
+1Wp11YkFyU9X/2dnZ7OwsHBNQPBez92sWmhra8vmzZvT19dXhCrNjvlr9WdSc6J+p0OJlaFK83WW
+y+UkP32/k7/eh98MVvr7+1OpVLJjx45i1f3AgQPZunVrLl68mEqlkp07dxY/f8vLy9m0aVN6e3uz
+d+/e9Pb25syZM2k0GpmZmUlHR0cGBgbS1dWVxx9/PH/+53+e73//+8WRYpcvXy728jcajVy+fDmT
+k5OrtifcbUdMAgDvTQAA3LeaE5QPorm639wLvbS0VEyytm/fnosXLxZ78Gu1WjF5nZuby6lTpzI8
+PJyFhYXUarW88847OXHiRC5dulSEBL29vSmVSnnsscfy/PPPp7+/P9PT05mdnc1PfvKTYuI5NTWV
+er2eJ554IuvXr8+lS5cyPj6e0dHRdHZ25pOf/GTa29uzvLycnp6eYuwrtzBUKpV0dnYWAcDKiWdz
+ol0qlVKpVFKpVLK8vJxyuZyurq6sX78+AwMDGR0dLbYiJD9d8W2+xptVAlxv5Xtl88O+vr689NJL
+effddzMxMVGsgN+sU3xzvLcTPNyqWq2W9evX3/Q4vuu9tmZVxPr166/Zz9/8DObm5lKr1VKpVIpA
+p1arZd26dZmbmyvCj1qtlt7e3vz8z/98hoeHi89lZmYms7OzKZfLxST/c5/7XC5dupStW7dmaWkp
+jzzySH75l385P/MzP5P9+/enra0tX/nKV7Ju3bpMTU1leno6o6OjKZVK+e53v5vLly8XRwCu3M5x
+dWXMSgJjALi3CAAAruNGZdrNyeDc3FxGR0eLxn1Xd2VfXFzM+Ph4MZFqPp6ZmUmpVMqWLVvy5JNP
+5sEHH8zLL7+c1157LSMjI9m0aVM2btyY0dHRDA0N5cqVK6vOeS6XyxkfH8+VK1cyPT2darWabdu2
+FZP2AwcO5Nlnn83s7GwuXbq0qvlatVpNR0dHMSld2TCuq6ureK0dHR3p7OzMwsJCOjs789hjj+Uz
+n/lMPvnJT+b1119Po9HIli1bigqL5nM1KwFu1Avg6pXvZkf6ZsgyMzOTd999N5cuXSpCiveqVmiW
+wvf19a16/++E5sp/c1J+s+e+eqvE1q1b8+lPfzrnzp3L1NRUcV9XV1f27NmTRqORPXv2pLOzs2iK
+t3v37jzzzDOp1Wqp1+vZtWtXnnnmmSwsLGRycjL1ej2/9mu/lomJiaxbty67du3KE088kS984QvZ
+vXt3Xn755bS3t+fFF1/M8PBwzp07l3K5nL/4i7/Id77znbS3t+fhhx/O66+/nlKplEceeSRJiv38
+Y2NjRa+LG/WTAADubZoAAlzH7TbLu9Xnmp+fT39/f1566aX8zM/8TN5555380R/9USYmJrJ+/fps
+2rQpo6OjmZubS7Vazfnz59NoNNLW1pZSqZTBwcFMTk4WDQe3bt2a3/7t386uXbty+vTp/M7v/E7O
+nTtXrKJ3dHQUK+jNRn3NSWqlUkl7e3sajUbRfK75WpuVAX19fenq6kp/f3+mpqZy+vTpon/B/Pz8
+qm0H79WwrrnPvzme7u7u7N27N8ePH8/k5OQ19zcDiiSr9plf/ZwrG+c1V+BvNJbbOQWhee/NGtpd
+77U1J9G9vb25cuXKqn4LzQqAZhVFM3yZnJxMZ2dnHnnkkXz2s5/NN7/5zQwNDRXNJd96663s3r07
+//Sf/tO0tbUVlRw/+MEP8md/9me5cuVK3nnnnSTJrl27is++vb09ExMTuXjxYtrb27N///6sX78+
+J06cyKFDh3Ly5Mn8wi/8Qk6dOpX/8T/+Ry5fvpxSqXTNe918T5X7A8C9TQUAwHU0jy671WZ5t/Jc
+zWPbyuVyzp49mx/96Ec5evRo0VBtenq6KO2v1+tF74Hmmep9fX355Cc/mYWFhTz77LP5+Mc/nj17
+9uT555/P3r17s7CwkP/zf/5Pjh8/ntnZ2fT19eXAgQPp6uoqKhdWnkHfPOWgUqkUE/7mJHrltoG9
+e/dm7969ef311zM1NZVyuZz5+flUKpUMDAxkfn4+1Wr1lnoLVCqVrF+/vpioz87OrlohT/66Ed6G
+DRvS19dXBA/NzvHN5y+Xy0VDvOb3bW5LaJbgN0OAZtl8snqlvhmK3GjM1Wo1XV1d15S/ryzPXzmm
+ZqO+5nvdrA5pvs/NcTUDl5mZmXR2duYTn/hElpaWMjExkeSvV+S7u7vz1FNP5bHHHsu+ffvy4x//
+OKdOncorr7yS73//+5mamsrs7Gz27t2bY8eOpbe3t6isePjhh/PAAw/k0KFDOXLkSGq1WkZHR7O4
+uJizZ89meHg4Q0NDOXHiRM6cOZPXX3+9qEC53md49TYLlQEAcO8SAADcwPstJ19Z2t5cLW9OrJqT
+w2ZDta1bt2ZsbKw4GaCtrS3lcjn9/f3p6elJd3d30eW9s7Mz27dvz1tvvZXjx4/nrbfeKioU+vv7
+09/fn+Xl5YyPj6e9vT0PPvhgGo1Gsdd7bm4uHR0dKZVKRRPDbdu2pa+vL+vXr0+tVlt1ykFz1bda
+rebkyZMBNVx7AAAgAElEQVTFqnVfX1+SZG5uLrOzs2lra8u+ffuKCX1zItwMHlZO2rdu3ZrPfOYz
+mZiYSFdXVzo7O4v+BoODg0mSdevW5cUXX8zmzZuLMGPTpk2ZmZkpzrvv6OjI3r17i69vVkM0tyUk
+SWdnZ5aXl1d10k/+urS/Wq0m+euS/JU9BpoBTbVaTW9v76qmfM2QpFQqZd26ddm4cWPm5ubS3t6e
+xcXFYjvCykqEWq2WarWa/v7+1Gq1PPLIIxkdHc3s7GzxszA+Pp5169Zl9+7deeGFF3Lx4sVia8bF
+ixfzzjvvZHh4uNibPzk5mR/+8Ic5duxY1q1bV0zmr1y5kkqlkjNnzuT06dN54403MjQ0lNHR0UxP
+TxenPzS3sExPT6fRaGRsbKxoVHk9zQDjZr0YAIB7gwAA4A7r6urK3r17i5Xtq1dNm/+9uLiYiYmJ
+4ujNjo6O7Ny5MxMTE5mYmChWqJs9ABqNxqq+ANPT0xkfH8/IyEiOHj2aUqmUl19+OYcPH06Soqng
+0aNHkyQzMzOpVCp5+OGH8/zzz2dsbCyVSqUoF79w4UJxT2dnZ7Zt21Y0Npybm8v+/fuzsLCQ9vb2
+ogndwsJCOjo68uijj2bfvn0ZGhrK/Px8enp6sm/fvszOzhaT3fb29gwMDOSdd95ZdVzi/Px8ent7
+8/f//t9PR0dHzp8/n8nJyRw9ejRXrlxJvV7P1NTUqlNKmnvzP/3pT+f06dOZmprK8vJypqeni4nq
+yol4s+S/WYGwffv2jI2NZXp6elVFRPPoyM7Oznz84x9PtVrN6OhokqS9vX3V801PT6e9vT2PPfZY
+pqam0tPTUwQpMzMzqVar2bhxY5aWljI9PZ1169blySefzMjISPr6+tLT01P0Pmhvb09vb28GBgby
+6quv5ujRo6lUKtm3b1/a2trS0dGRU6dOpbOzM88++2zefvvtnD17NmfPnk1vb2+OHTuWy5cvZ2Zm
+ppjQj4+PFyFUs/KjVqtdE6asVC6Xi9e58r1eWRUCANy7BAAAd1hzYt+cXN5o1XR5eXnV3vLFxcWi
+tHt+fr4oj29OXleeQFCtVrNu3boMDg7mH/yDf5CBgYH8z//5P/Pqq69mfHw827ZtyzPPPJPDhw/n
+/PnzGRsbK1bgX3zxxRw4cCD1ej2f//zni2P+5ufn097enh07dmT79u352te+ln379qWjo6NoPLh/
+//585jOfyenTp3PlypViYlgul7N79+4MDQ1lYGAgmzZtyqVLl4qy8uSvg5CpqalcuXIljUYjtVot
+Bw8eTLVazfT0dMbGxrJz587Mzc1laGgoIyMjqdfreeSRR4r3s1KppKenJ+VyOT09PUVJe7Vaza5d
+u4qjCJvbHVZ28C+Xy0VFQ71ez+zs7Kr+Cr29vdm5c2f6+/uLYGZoaCizs7Npb29PrVZLZ2dnEQDM
+z8+no6MjDz74YNra2vKzP/uz+cVf/MUMDg7mrbfeKqojBgYGkiSbNm3KwMBABgcH8w//4T/MgQMH
+iq0TTz31VK5cuZJjx45lYmIi58+fz7lz53LkyJG8/vrrOXHiREZHRzM5OZmzZ89mdHR01daQc+fO
+FccDrvyZu/qovmbgcKOeBu3t7dm8efM1AcHNtkn09PSoDgCAe4QAAOAOWzmxv50V0+Zq+Mo95UmK
+hm/JT8vQV+4zb64ov/rqq8URgxMTE3nzzTczPj6evr6+TE1Npa+vL6Ojo8WkuaenJw888EB+7ud+
+Ls8991w2bNiQDRs25LnnnsvQ0FAqlUoGBwdTKpXy5JNP5vLly3n33XfTaDSya9euzM7OZnJysphg
+NxvWvfDCC3nxxRfTaDRy4cKF9PT0FEcFLi4upl6vp6urK9VqNVNTUymVStm4ceOq7vnNkvqlpaVc
+vHixqBbYsGFDHn/88SwtLeVjH/tYNmzYkDNnzqRcLmf79u05dOhQtmzZktnZ2aJzf3PLw9atW7Nh
+w4Zif3zzuLyenp5Uq9U89NBDaW9vz86dO9PZ2Zk9e/bk7NmzxcS/Wq3mkUceyeTkZDZs2JAtW7Zk
+w4YNxckN77zzThqNRg4fPpwzZ84UpyI0+yg88MADeeihhzI9PZ1vf/vb+eEPf5hKpZJ33303w8PD
+6e/vz7p163L69OlMTExkdnY24+PjRfjRrGpoVjs0j328ePFi8WsrJ/srf65W/vfNjjR8r4Dgaj09
+PXniiScyMjKS2dnZW/5ZBwDWhgAAYI01V6WvN+FqbieYmJjIwsLCqqMJm93pL126lJMnT2ZqaioD
+AwOZm5sr9q0fOnQo586dy/j4eDo7OzM6OpqJiYkMDAxk//79Rcn48PBw3n777Rw5ciRHjhwpVv6/
++93v5sEHH8ynPvWpPP7447l06VI2b96cl156KTt37szQ0FDRcG9paSkPPfRQdu/enb/9t/921q1b
+l7GxsTz77LNZWFhIT09PtmzZkgcffDBbtmzJY489lvXr1+eBBx7ImTNnMj4+nnPnzmVkZCQ7d+7M
+V7/61QwODhZ75Lu6uorJffMEgUOHDuXYsWN54IEH8vnPfz779+/PX/3VX2X79u3FZLmrqysPP/xw
+vvjFL+app57KwMBAnnvuubzwwguZm5vL0aNHs379+jz00EN57rnn0tPTk76+vpw8eTKzs7N58skn
+s2/fvqLioa+vL1/96lfzpS99KU8++WRmZ2dz5MiRDA0N5Uc/+lFOnjyZcrmcBx54II1GI319fenr
+68trr72WN954IxcvXsypU6dy/vz5TE1NZWxsLDMzM7l48WKGh4dvepTiSpVKJb29vcXPRnLjlfpb
+9V4BwdUWFhaK7RwqAADg7ucYQIA1Vq1W093dXaymr1SpVNLR0ZGZmZli/3lzL3uzQWCz2dzGjRvz
+6U9/On/yJ3+S4eHh1Gq1rF+/PmNjY1lYWEh3d3fRT6Crqyvr1q1LkuI55+bmMjMzk46OjnzqU5/K
+5ORkTp8+nWeeeSbnz5/Prl270tvbm3q9nuPHj2fTpk25ePFiNmzYkKNHj+att97KunXr0tPTk9/4
+jd/I6dOn82d/9mc5efJkduzYkV/91V/Njh078uabb+YHP/hBHn/88aJ8/8SJExkYGMjx48fzk5/8
+JM8//3yeeeaZTE9PZ3h4OL29vXnrrbdy+fLlbNq0KT09PTl9+nSS5PTp09myZUvR3X5oaCg9PT1F
+9/sHH3ww+/fvzyc+8Yl861vfyokTJ7J9+/b8/M//fP7rf/2vmZ2dzcGDB7O8vJyPf/zjee2113Lh
+woX88Ic/TE9PT3GU38LCQtatW5d169alUqlk8+bNuXTpUpaXl3Pp0qVcvny5OGZxy5Yt+dKXvpQ/
+//M/z9mzZ9PV1VUcsdes9Ojq6sqBAwdy4sSJdHZ2Znh4OHNzc9cct9fswt9sJFkul1Or1YqTGG4l
+LGhWUwAArU0AALDGrp7g3c7XNM+Rn5mZSblcTm9vb3EywMrj2xYXF9Pd3Z3x8fFVIUPzqLv5+fmi
+i3+tVsuOHTty5cqVlMvlVCqVInzo7+/P/Px8xsbGsmPHjtTr9UxOTmZsbCyDg4O5fPlyxsbGcvDg
+waIc/Y033khvb2++/OUv57Of/Wzefffd/O///b/T1taWF154IYuLi+no6Mjg4GDefffd/Mf/+B9z
+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
+wAMP3PbXf/3rX181+f/617+ehx56KO3t7dm3b1++/vWvF7/X2dmZ3/u937sj4+bet+z66K9yubxc
+r9eXy+Xymo/F5XK5XC6Xy+Vyre11tZvd+9xzz6269y/+4i+ue983vvGNVfd96lOf+tDG9V73Xe/3
+P/vZzy7/6Z/+6fLo6Ojy/Pz88ttvv738b/7Nv1nu7+9fTrJcKpWWv/KVryx/5zvfWZ6cnFyemZlZ
+fu2115Z/+7d/e7mjo2PNP7N79FrzAbTsZfLvcrlcLpfL5XK5ktsLAH7nd35n1b1f+cpXrnvfr/zK
+r6y679//+3//oY3rdgOAf/Wv/tU1v9b09ttvL+/atWv5f/2v/3XDe771rW8tV6vVNf/c7rVLDwAA
+4J5XLpdbuqkTcO9bvqonwM16ALzyyit5+umni8cHDx7Mm2++ec19Bw8ezOuvv77q65555pkPZVzv
+dd/Vv/9exsbG0tvbe9N7fv3Xfz3/4T/8h9t63lZnEzoAcE9rntCjtw7QKq7uGXDmzJnr3nf27Nmb
+ft1aWlhYyK//+q+nr68vAwMD+f3f//1Vv9/b25vFxcX8s3/2z9Lb25sNGzbkD//wD1fd80u/9Esf
+5ZDvCyoAAIB7ngoA4F53OxUAs7OzaW9vLx5Xq9UsLi5ec1+1Ws38/HzxeG5uLvV6/UMZ1+1WAPzr
+f/2v8y//5b8sHj/66KP58Y9/vOqef/tv/23++T//58XjPXv25Pjx48Xj0dHR9Pf338KroElUDgDc
+80z+gVZ2o0n5ex0luJb++3//76sev/POO9fc89/+239b9fjEiROrgoT32iLAtQQAAAAAt2kttx2N
+jY2terzyOMCb/fro6OiHNqbbtXIlP0mmp6evuefIkSOrHi8vL68KAO7mgONuJQAAAAC4DWvde+Tq
+1fLt27df974dO3bc9OvW0uzs7KrH16vkmpmZuebX9Hv5YLx7AAAAt2FpaSmNRmPNth99//vfX/X4
+qaeeuu59V//61V/3ftRqtWt+bWU/Au5uAgAAAIDbtJa9R/7oj/5o1eNf+7Vfu+aeUqmUr33tazf9
+uvfjescIPvvss9f8mpX6u5NPBQAA4B7yrW99a9Vq/vPPP5+vf/3r2bt3b9ra2rJ37978p//0n/LJ
+T36yuOd73/tevv3tb3/g7/27v/u7+cxnPpOOjo50dHTkZ3/2Z/O7v/u719z3d//u382ePXs+8Pfj
+znIMIAAAwEfs6mPx3svVDe8OHTqU733ve+no6HjPr52ens7TTz+d11577ba+Z3L747xac9y3cpzg
+nbqHG1MBAAAAcI957bXX8rnPfS4XLly46X0XLlzI5z73ufc1+b8dv/d7v3fN6QTcfQQAAAAA96Bv
+fvObefjhh/Nbv/VbefXVVzM+Pp6lpaWMj4/nlVdeyW/91m9l//79+X//7//dse/55S9/OT/60Y8y
+NzeXqampvPLKK/nH//gf52tf+1p+4Rd+IYcPH06j0cilS5fyx3/8x3fs+3Jn2AIAAADAdSm5v7+o
+AAAAAIAWIAAAAACAD1mpVEq1Wl3TKgoBAAAAAHzIKpVKuru7U6lU1mwMegAAAABwXXoA3DmlUimV
+SiWLi4sf+HjF9z2GCAAAAADgvmcLAAAAcMeVy+V0dnamXDblgLuF/xsBAIA7rl6vZ+fOnanX62s9
+FOBv2AIAAADcceVyOfV6PbOzs1laWlrr4QARAAAAAEBLsAUAAAAAWoAAAAAAAFqAAAAAAID7WqlU
+Sq1WS6lUWuuhrCkBAAAAAPe1tra2DAwMpK2tba2HsqY0AQQAAOC+ViqV0tbWlvn5+Swvt+4UWAAA
+AAAALcAWAAAAAGgBAgAAAABoAQIAAAAAaAECAAAAAGgBAgAAAO4KlUol/f392bVrV9rb29d6OAD3
+HQEAAAB3hfb29nzsYx/Ll7/85QwODq71cADuO44BBADgrlCpVNLT05Oenp4MDw9nbm5urYcEcF8R
+AAAAAEALsAUAAAAAWoAAAO5S5XI59Xo95bL/TQHgbuPvZ+Be5E8uuEvVarVs3rw5tVptrYfCGiqV
+SqlWqymVSms9FAD+RrlcTq1WEwIA9xw9AOAu1fzHRaPRyNLS0loPhzVSrVbT3d2dycnJLCwsrPVw
+APgb5XLZ38/APUcAAHAXK5VKqVQqWVxczPKyP64BAHj/BAAAAADQAmxcAgAAgBYgAAAAAIAWIAAA
+AACAFiAAAADuiEqlkp6enlQqlbUeCgBwHQIAAOCO6OrqysGDB9PV1bXWQwG4Z5TLpmR8dJwCAAD3
+qEqlkq6urkxNTWVxcXGth3PXjQfgblcul1Or1dJoNLK0tLTWw6EFiJsA4B51t624Ly4uZnx83OQf
+4BYtLS2Z/PORUgEAAPcoK+4AwO0QAHxEyuWyZA8AAIA1YwvAR6C5t0eDDwAAANaKCoCPiAoAAAAA
+1qk715sAAAJNSURBVJIl6Y+IyT8ftnK5nM7OTpUmAADAdZkpwH2iXq9n586dqdfraz0UAADgLmQL
+ANwnyuVy6vV6ZmdnVZwAAMQ2XLiaAAAAALjvNBtxNxoNIQD8DQEAAABwX1IBAKsJAAAAAKAFaAII
+AAAALUAAAAAAAC1AAAAAAAAtQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwNX+P0majTC/dOmvAAAAAElFTkSuQmCC
+"
+       height="1139"
+       width="1024" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3050"
+       d="m 16.94483,725.1105 4.375,-4.375 -262.625,-262.65625 -4.375,4.375 262.625,262.65625 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ffff00;fill-opacity:1;stroke:none;stroke-width:6.19999981;marker:none;visibility:visible;display:inline;overflow:visible;enable-backgro [...]
+  </g>
+</svg>
diff --git a/doc/Images/GUV_1_5guvb.png b/doc/Images/GUV_1_5guvb.png
new file mode 100755
index 0000000..de90a10
Binary files /dev/null and b/doc/Images/GUV_1_5guvb.png differ
diff --git a/doc/Images/PyScanFCS_Main.png b/doc/Images/PyScanFCS_Main.png
new file mode 100755
index 0000000..39e815e
Binary files /dev/null and b/doc/Images/PyScanFCS_Main.png differ
diff --git a/doc/Images/PyScanFCS_icon.png b/doc/Images/PyScanFCS_icon.png
new file mode 100644
index 0000000..71cef06
Binary files /dev/null and b/doc/Images/PyScanFCS_icon.png differ
diff --git a/doc/Images/PyScanFCS_icon.svg b/doc/Images/PyScanFCS_icon.svg
new file mode 100644
index 0000000..09e01ab
--- /dev/null
+++ b/doc/Images/PyScanFCS_icon.svg
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="280"
+   height="280"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="PyScanFCS_icon.svg"
+   inkscape:export-filename="/home/paul/repos/PyScanFCS/doc-src/Images/PyScanFCS_icon.png"
+   inkscape:export-xdpi="82.285713"
+   inkscape:export-ydpi="82.285713">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.7"
+     inkscape:cx="124.96118"
+     inkscape:cy="162.72456"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1280"
+     inkscape:window-height="724"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:snap-bbox-midpoints="true"
+     inkscape:snap-page="true" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Ebene 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-72.322502,-192.61096)">
+    <path
+       style="fill:#008000;fill-opacity:1;stroke:#008000;stroke-width:7;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="M 311.48369,277.09272 204.86694,383.70947"
+       id="path3251"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#303dc7;fill-opacity:1;stroke:#008000;stroke-width:11.25699711;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path2985-1"
+       sodipodi:cx="161.6244"
+       sodipodi:cy="424.0473"
+       sodipodi:rx="44.446712"
+       sodipodi:ry="36.36549"
+       d="m 206.07112,424.0473 a 44.446712,36.36549 0 1 1 -88.89343,0 44.446712,36.36549 0 1 1 88.89343,0 z"
+       transform="matrix(-0.39772727,0.39772727,0.48611113,0.48611113,67.93977,108.3684)" />
+    <path
+       style="fill:#008000;fill-opacity:1;stroke:#008000;stroke-width:7;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="M 281.77566,239.95464 175.15891,346.57139"
+       id="path3251-2"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#c48d0a;fill-opacity:1;stroke:#008000;stroke-width:11.25699711000000036;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-linecap:round"
+       id="path2985-39"
+       sodipodi:cx="161.6244"
+       sodipodi:cy="424.0473"
+       sodipodi:rx="44.446712"
+       sodipodi:ry="36.36549"
+       d="m 206.07112,424.0473 a 44.446712,36.36549 0 1 1 -88.89343,0 44.446712,36.36549 0 1 1 88.89343,0 z"
+       transform="matrix(-0.39772727,0.39772727,0.48611113,0.48611113,134.78589,-25.323827)" />
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#ffffff;stroke-width:10.85546588999999962;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-opacity:0.44705883;stroke-dasharray:none"
+       d="m 285.74092,472.65887 c 0,-117.84659 -95.53354,-213.38014 -213.380134,-213.38014"
+       id="path3820-53-8"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#ffffff;fill-opacity:0.17254902;stroke:none"
+       id="path3820-53"
+       sodipodi:cx="112.14286"
+       sodipodi:cy="46.627132"
+       sodipodi:rx="125"
+       sodipodi:ry="125.71429"
+       d="m 23.754512,135.52056 a 125,125.71429 0 0 1 -10e-7,-177.786851 l 88.388349,88.893423 z"
+       transform="matrix(-1.2070603,1.2070603,1.200202,1.200202,151.72372,281.28578)"
+       sodipodi:start="2.3561945"
+       sodipodi:end="3.9269908" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#008000;fill-opacity:1;stroke:#008000;stroke-width:11.25699711;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path2985-3"
+       sodipodi:cx="161.6244"
+       sodipodi:cy="424.0473"
+       sodipodi:rx="44.446712"
+       sodipodi:ry="36.36549"
+       d="m 130.19583,449.76159 a 44.446712,36.36549 0 0 1 0,-51.42857 l 31.42857,25.71428 z"
+       transform="matrix(-0.45053893,0.45053893,0.55065872,0.55065872,-84.400016,162.32279)"
+       sodipodi:start="2.3561945"
+       sodipodi:end="3.9269908" />
+  </g>
+</svg>
diff --git a/doc/Images/PyScanFCS_icon_dark.svg b/doc/Images/PyScanFCS_icon_dark.svg
new file mode 100644
index 0000000..e6f896d
--- /dev/null
+++ b/doc/Images/PyScanFCS_icon_dark.svg
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="280"
+   height="280"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="PyScanFCS_icon_dark.svg"
+   inkscape:export-filename="/home/paul/Teufel/PyCorrFit/source-doc/Images/Icon.png"
+   inkscape:export-xdpi="82.285713"
+   inkscape:export-ydpi="82.285713">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.9899495"
+     inkscape:cx="25.089203"
+     inkscape:cy="75.496274"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1280"
+     inkscape:window-height="724"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     inkscape:snap-bbox="true"
+     inkscape:bbox-paths="true"
+     inkscape:bbox-nodes="true"
+     inkscape:snap-bbox-edge-midpoints="true"
+     inkscape:snap-bbox-midpoints="true"
+     inkscape:snap-page="true" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Ebene 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-72.322502,-192.61096)">
+    <path
+       style="fill:#008000;fill-opacity:1;stroke:#008000;stroke-width:7;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="M 311.48369,277.09272 204.86694,383.70947"
+       id="path3251"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#303dc7;fill-opacity:1;stroke:#008000;stroke-width:11.25699711;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path2985-1"
+       sodipodi:cx="161.6244"
+       sodipodi:cy="424.0473"
+       sodipodi:rx="44.446712"
+       sodipodi:ry="36.36549"
+       d="m 206.07112,424.0473 a 44.446712,36.36549 0 1 1 -88.89343,0 44.446712,36.36549 0 1 1 88.89343,0 z"
+       transform="matrix(-0.39772727,0.39772727,0.48611113,0.48611113,67.93977,108.3684)" />
+    <path
+       style="fill:#008000;fill-opacity:1;stroke:#008000;stroke-width:7;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="M 281.77566,239.95464 175.15891,346.57139"
+       id="path3251-2"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#c48d0a;fill-opacity:1;stroke:#008000;stroke-width:11.25699711000000036;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-linecap:round"
+       id="path2985-39"
+       sodipodi:cx="161.6244"
+       sodipodi:cy="424.0473"
+       sodipodi:rx="44.446712"
+       sodipodi:ry="36.36549"
+       d="m 206.07112,424.0473 a 44.446712,36.36549 0 1 1 -88.89343,0 44.446712,36.36549 0 1 1 88.89343,0 z"
+       transform="matrix(-0.39772727,0.39772727,0.48611113,0.48611113,134.78589,-25.323827)" />
+    <g
+       id="g4141"
+       transform="matrix(-1.1327836,0,0,1.1327836,439.83036,-28.869856)">
+      <path
+         sodipodi:nodetypes="cc"
+         id="path3820-53-8"
+         d="m 136.02725,442.7401 c 0,-104.03275 84.33521,-188.36796 188.36796,-188.36796"
+         style="fill:none;stroke:#000000;stroke-width:9.58300018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-opacity:0.44510384;stroke-dasharray:none"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g4137">
+        <path
+           sodipodi:type="arc"
+           style="fill:#000000;fill-opacity:0.17210681;stroke:none"
+           id="path3820-53"
+           sodipodi:cx="112.14286"
+           sodipodi:cy="46.627132"
+           sodipodi:rx="125"
+           sodipodi:ry="125.71429"
+           d="M 23.754512,135.52056 C -25.061023,86.426074 -25.061023,6.828192 23.754511,-42.266291 l 88.388349,88.893423 z"
+           transform="matrix(1.0655701,1.0655701,-1.0595157,1.0595157,254.33511,273.79955)"
+           sodipodi:start="2.3561945"
+           sodipodi:end="3.9269908" />
+        <path
+           sodipodi:type="arc"
+           style="fill:#008000;fill-opacity:1;stroke:#008000;stroke-width:11.25699711;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           id="path2985-3"
+           sodipodi:cx="161.6244"
+           sodipodi:cy="424.0473"
+           sodipodi:rx="44.446712"
+           sodipodi:ry="36.36549"
+           d="m 130.19583,449.76159 c -17.35752,-14.20161 -17.35752,-37.22696 0,-51.42857 l 31.42857,25.71428 z"
+           transform="matrix(0.39772727,0.39772727,-0.48611113,0.48611113,462.78069,168.78126)"
+           sodipodi:start="2.3561945"
+           sodipodi:end="3.9269908" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/doc/Images/PyScanFCS_logo.svg b/doc/Images/PyScanFCS_logo.svg
new file mode 100644
index 0000000..b4ea67f
--- /dev/null
+++ b/doc/Images/PyScanFCS_logo.svg
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="780.68671"
+   height="225.25037"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="PyScanFCS_logo.svg"
+   inkscape:export-filename="/home/paul/repos/PyScanFCS/doc-src/Images/PyScanFCS_logo_dark.png"
+   inkscape:export-xdpi="23.914993"
+   inkscape:export-ydpi="23.914993">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.49497475"
+     inkscape:cx="210.95552"
+     inkscape:cy="-143.06918"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1053"
+     inkscape:window-height="751"
+     inkscape:window-x="69"
+     inkscape:window-y="24"
+     inkscape:window-maximized="0"
+     inkscape:snap-page="false" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Ebene 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-92.794701,-195.37628)">
+    <path
+       style="fill:#008000;fill-opacity:1;stroke:#008000;stroke-width:6.15693188;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 303.18808,248.61415 -93.77601,93.77602"
+       id="path3251"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#303dc7;fill-opacity:1;stroke:#008000;stroke-width:11.25699711;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path2985-1-2"
+       sodipodi:cx="161.6244"
+       sodipodi:cy="424.0473"
+       sodipodi:rx="44.446712"
+       sodipodi:ry="36.36549"
+       d="m 206.07112,424.0473 c 0,20.08411 -19.89947,36.36549 -44.44672,36.36549 -24.54724,0 -44.44671,-16.28138 -44.44671,-36.36549 0,-20.0841 19.89947,-36.36549 44.44671,-36.36549 24.54725,0 44.44672,16.28139 44.44672,36.36549 z"
+       transform="matrix(-0.34982568,0.34982568,0.42756474,0.42756474,88.976173,100.2107)" />
+    <path
+       style="fill:#008000;fill-opacity:1;stroke:#008000;stroke-width:6.15700006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 277.05804,215.94892 -93.77601,93.77601"
+       id="path3251-2"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#c48d0a;fill-opacity:1;stroke:#008000;stroke-width:11.25699711;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path2985-39"
+       sodipodi:cx="161.6244"
+       sodipodi:cy="424.0473"
+       sodipodi:rx="44.446712"
+       sodipodi:ry="36.36549"
+       d="m 206.07112,424.0473 c 0,20.08411 -19.89947,36.36549 -44.44672,36.36549 -24.54724,0 -44.44671,-16.28138 -44.44671,-36.36549 0,-20.0841 19.89947,-36.36549 44.44671,-36.36549 24.54725,0 44.44672,16.28139 44.44672,36.36549 z"
+       transform="matrix(-0.34982568,0.34982568,0.42756474,0.42756474,147.77146,-17.379861)" />
+    <text
+       xml:space="preserve"
+       style="font-size:99.3436203px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:0.80392157;stroke:none;font-family:Sans"
+       x="346.30048"
+       y="348.86331"
+       id="text3793-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3795-8"
+         x="346.30048"
+         y="348.86331"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#ffffff;fill-opacity:0.80392157;font-family:Courier New;-inkscape-font-specification:Courier New">PyScanFCS</tspan></text>
+    <path
+       inkscape:connector-curvature="0"
+       style="fill:none;stroke:#ffffff;stroke-width:9.54805183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-opacity:0.44705882;stroke-dasharray:none"
+       d="m 280.54573,420.62665 c 0,-103.65336 -84.02765,-187.681 -187.681,-187.681"
+       id="path3820-53-8"
+       sodipodi:nodetypes="cc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#ffffff;fill-opacity:0.17254902;stroke:none"
+       id="path3820-53"
+       sodipodi:cx="112.14286"
+       sodipodi:cy="46.627132"
+       sodipodi:rx="125"
+       sodipodi:ry="125.71429"
+       d="M 23.754512,135.52056 C -25.061023,86.426074 -25.061023,6.828192 23.754511,-42.266291 l 88.388349,88.893423 z"
+       transform="matrix(-1.0616841,1.0616841,1.0556517,1.0556517,162.66933,252.30221)"
+       sodipodi:start="2.3561945"
+       sodipodi:end="3.9269908" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#008000;fill-opacity:1;stroke:#008000;stroke-width:11.25699711;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path2985-3-0"
+       sodipodi:cx="161.6244"
+       sodipodi:cy="424.0473"
+       sodipodi:rx="44.446712"
+       sodipodi:ry="36.36549"
+       d="m 130.19583,449.76159 c -17.35752,-14.20161 -17.35752,-37.22696 0,-51.42857 l 31.42857,25.71428 z"
+       transform="matrix(-0.39627679,0.39627679,0.48433833,0.48433833,-45.01607,147.66691)"
+       sodipodi:start="2.3561945"
+       sodipodi:end="3.9269908" />
+  </g>
+</svg>
diff --git a/doc/Images/PyScanFCS_logo_dark.pdf b/doc/Images/PyScanFCS_logo_dark.pdf
new file mode 100644
index 0000000..d6eea8f
Binary files /dev/null and b/doc/Images/PyScanFCS_logo_dark.pdf differ
diff --git a/doc/Images/PyScanFCS_logo_dark.png b/doc/Images/PyScanFCS_logo_dark.png
new file mode 100644
index 0000000..858b1d8
Binary files /dev/null and b/doc/Images/PyScanFCS_logo_dark.png differ
diff --git a/doc/Images/PyScanFCS_logo_dark.svg b/doc/Images/PyScanFCS_logo_dark.svg
new file mode 100644
index 0000000..2c6a06a
--- /dev/null
+++ b/doc/Images/PyScanFCS_logo_dark.svg
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="780.68671"
+   height="225.26022"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="PyScanFCS_logo_dark.svg"
+   inkscape:export-filename="/home/paul/repos/PyScanFCS/doc-src/Images/PyScanFCS_logo_dark.png"
+   inkscape:export-xdpi="23.978889"
+   inkscape:export-ydpi="23.978889">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.49497475"
+     inkscape:cx="374.09863"
+     inkscape:cy="378.53931"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1053"
+     inkscape:window-height="751"
+     inkscape:window-x="69"
+     inkscape:window-y="24"
+     inkscape:window-maximized="0"
+     inkscape:snap-page="false" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Ebene 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-92.794698,-195.37628)">
+    <path
+       style="fill:#008000;fill-opacity:1;stroke:#008000;stroke-width:6.15693188000000013;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 303.18808,248.61415 -93.77601,93.77602"
+       id="path3251"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#303dc7;fill-opacity:1;stroke:#008000;stroke-width:11.25699711;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path2985-1-2"
+       sodipodi:cx="161.6244"
+       sodipodi:cy="424.0473"
+       sodipodi:rx="44.446712"
+       sodipodi:ry="36.36549"
+       d="m 206.07112,424.0473 a 44.446712,36.36549 0 1 1 -88.89343,0 44.446712,36.36549 0 1 1 88.89343,0 z"
+       transform="matrix(-0.34982568,0.34982568,0.42756474,0.42756474,88.976173,100.2107)" />
+    <path
+       style="fill:#008000;fill-opacity:1;stroke:#008000;stroke-width:6.15700000000000003;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       d="m 277.05804,215.94892 -93.77601,93.77601"
+       id="path3251-2"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#c48d0a;fill-opacity:1;stroke:#008000;stroke-width:11.25699711;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path2985-39"
+       sodipodi:cx="161.6244"
+       sodipodi:cy="424.0473"
+       sodipodi:rx="44.446712"
+       sodipodi:ry="36.36549"
+       d="m 206.07112,424.0473 a 44.446712,36.36549 0 1 1 -88.89343,0 44.446712,36.36549 0 1 1 88.89343,0 z"
+       transform="matrix(-0.34982568,0.34982568,0.42756474,0.42756474,147.77146,-17.379861)" />
+    <text
+       xml:space="preserve"
+       style="font-size:99.3436203px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:0.80473376;stroke:none;font-family:Sans"
+       x="346.30048"
+       y="348.86331"
+       id="text3793-9"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan3795-8"
+         x="346.30048"
+         y="348.86331"
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:0.80473376;font-family:Courier New;-inkscape-font-specification:Courier New">PyScanFCS</tspan></text>
+    <g
+       id="g4141"
+       transform="matrix(-0.99635309,0,0,0.99635309,416.0769,-20.49882)">
+      <path
+         sodipodi:nodetypes="cc"
+         id="path3820-53-8"
+         d="m 136.02725,442.7401 c 0,-104.03275 84.33521,-188.36796 188.36796,-188.36796"
+         style="fill:none;stroke:#000000;stroke-width:9.58300018;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-opacity:0.44510384;stroke-dasharray:none"
+         inkscape:connector-curvature="0" />
+      <g
+         id="g4137">
+        <path
+           sodipodi:type="arc"
+           style="fill:#000000;fill-opacity:0.17210681;stroke:none"
+           id="path3820-53"
+           sodipodi:cx="112.14286"
+           sodipodi:cy="46.627132"
+           sodipodi:rx="125"
+           sodipodi:ry="125.71429"
+           d="M 23.754512,135.52056 C -25.061023,86.426074 -25.061023,6.828192 23.754511,-42.266291 l 88.388349,88.893423 z"
+           transform="matrix(1.0655701,1.0655701,-1.0595157,1.0595157,254.33511,273.79955)"
+           sodipodi:start="2.3561945"
+           sodipodi:end="3.9269908" />
+        <path
+           sodipodi:type="arc"
+           style="fill:#008000;fill-opacity:1;stroke:#008000;stroke-width:11.25699711;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+           id="path2985-3-0"
+           sodipodi:cx="161.6244"
+           sodipodi:cy="424.0473"
+           sodipodi:rx="44.446712"
+           sodipodi:ry="36.36549"
+           d="m 130.19583,449.76159 c -17.35752,-14.20161 -17.35752,-37.22696 0,-51.42857 l 31.42857,25.71428 z"
+           transform="matrix(0.39772727,0.39772727,-0.48611113,0.48611113,462.78069,168.78126)"
+           sodipodi:start="2.3561945"
+           sodipodi:end="3.9269908" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/doc/Images/SFCSmodi.pdf b/doc/Images/SFCSmodi.pdf
new file mode 100755
index 0000000..c2dab01
Binary files /dev/null and b/doc/Images/SFCSmodi.pdf differ
diff --git a/doc/Images/SFCSmodi.svg b/doc/Images/SFCSmodi.svg
new file mode 100755
index 0000000..9b3722f
--- /dev/null
+++ b/doc/Images/SFCSmodi.svg
@@ -0,0 +1,688 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="794.63782"
+   height="481.30579"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.48.3.1 r9886"
+   sodipodi:docname="SFCSmodi.svg">
+  <defs
+     id="defs4">
+    <marker
+       inkscape:stockid="TriangleOutL"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="TriangleOutL"
+       style="overflow:visible">
+      <path
+         id="path3907"
+         d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="scale(0.8,0.8)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <linearGradient
+       id="linearGradient8256">
+      <stop
+         style="stop-color:#00ba00;stop-opacity:1;"
+         offset="0"
+         id="stop8258" />
+      <stop
+         style="stop-color:#0002ba;stop-opacity:1;"
+         offset="1"
+         id="stop8260" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient8248"
+       osb:paint="solid">
+      <stop
+         style="stop-color:#00ba00;stop-opacity:1;"
+         offset="0"
+         id="stop8250" />
+    </linearGradient>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend"
+       style="overflow:visible">
+      <path
+         id="path3767"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart"
+       style="overflow:visible">
+      <path
+         id="path3764"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(0.8,0,0,0.8,10,0)"
+         inkscape:connector-curvature="0" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lstart"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lstart-7"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3764-2"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(0.8,0,0,0.8,10,0)" />
+    </marker>
+    <marker
+       inkscape:stockid="Arrow1Lend"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="Arrow1Lend-8"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3767-7"
+         d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8256-5"
+       id="linearGradient8262-4"
+       x1="368.18979"
+       y1="106.17594"
+       x2="367.97479"
+       y2="105.96272"
+       gradientUnits="userSpaceOnUse"
+       spreadMethod="pad" />
+    <linearGradient
+       id="linearGradient8256-5">
+      <stop
+         style="stop-color:#00ba00;stop-opacity:1;"
+         offset="0"
+         id="stop8258-6" />
+      <stop
+         style="stop-color:#0002ba;stop-opacity:1;"
+         offset="1"
+         id="stop8260-2" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient8256-0">
+      <stop
+         style="stop-color:#00ba00;stop-opacity:1;"
+         offset="0"
+         id="stop8258-2" />
+      <stop
+         style="stop-color:#0002ba;stop-opacity:1;"
+         offset="1"
+         id="stop8260-8" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="matrix(0,1,1,0,210.12401,-210.23255)"
+       y2="105.96272"
+       x2="367.97479"
+       y1="106.17594"
+       x1="368.18979"
+       spreadMethod="pad"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient8279-5"
+       xlink:href="#linearGradient8256-5-3"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient8256-5-3">
+      <stop
+         style="stop-color:#00ba00;stop-opacity:1;"
+         offset="0"
+         id="stop8258-6-8" />
+      <stop
+         style="stop-color:#0002ba;stop-opacity:1;"
+         offset="1"
+         id="stop8260-2-0" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient8256-0-3">
+      <stop
+         style="stop-color:#00ba00;stop-opacity:1;"
+         offset="0"
+         id="stop8258-2-6" />
+      <stop
+         style="stop-color:#0002ba;stop-opacity:1;"
+         offset="1"
+         id="stop8260-8-8" />
+    </linearGradient>
+    <linearGradient
+       y2="105.96272"
+       x2="367.97479"
+       y1="106.17594"
+       x1="368.18979"
+       spreadMethod="pad"
+       gradientTransform="matrix(0,1,1,0,210.12401,-210.23255)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient8325-8"
+       xlink:href="#linearGradient8256-5-3-0"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient8256-5-3-0">
+      <stop
+         style="stop-color:#00ba00;stop-opacity:1;"
+         offset="0"
+         id="stop8258-6-8-0" />
+      <stop
+         style="stop-color:#0002ba;stop-opacity:1;"
+         offset="1"
+         id="stop8260-2-0-6" />
+    </linearGradient>
+    <marker
+       inkscape:stockid="TriangleOutL"
+       orient="auto"
+       refY="0"
+       refX="0"
+       id="TriangleOutL-6"
+       style="overflow:visible">
+      <path
+         inkscape:connector-curvature="0"
+         id="path3907-2"
+         d="m 5.77,0 -8.65,5 0,-10 8.65,5 z"
+         style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+         transform="scale(0.8,0.8)" />
+    </marker>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8256-5-3"
+       id="linearGradient3196"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,1,1,0,222.21151,29.31482)"
+       spreadMethod="pad"
+       x1="368.18979"
+       y1="106.17594"
+       x2="367.97479"
+       y2="105.96272" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8256-0-3"
+       id="linearGradient3198"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(0.3375,234.04737)"
+       spreadMethod="pad"
+       x1="368.18979"
+       y1="106.17594"
+       x2="367.97479"
+       y2="105.96272" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient8256"
+       id="linearGradient3257"
+       gradientUnits="userSpaceOnUse"
+       spreadMethod="pad"
+       x1="368.18979"
+       y1="106.17594"
+       x2="367.97479"
+       y2="105.96272"
+       gradientTransform="translate(-221.64758,250)" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.70710678"
+     inkscape:cx="342.78914"
+     inkscape:cy="257.07818"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1280"
+     inkscape:window-height="724"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     showguides="true"
+     inkscape:guide-bbox="true" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Ebene 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-43,4.4307861)">
+    <rect
+       style="fill:#800080;fill-opacity:0.29220779;fill-rule:nonzero;stroke:none"
+       id="rect4120-6"
+       width="546.69019"
+       height="446.89148"
+       x="290.65952"
+       y="29.983521" />
+    <rect
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+       id="rect4120-4"
+       width="296.62952"
+       height="232.89148"
+       x="557.18524"
+       y="26.42926" />
+    <rect
+       style="fill:#de8d00;fill-opacity:0.29220779;fill-rule:nonzero;stroke:none"
+       id="rect4120"
+       width="261.62952"
+       height="446.89148"
+       x="576.0083"
+       y="29.983521" />
+    <g
+       id="g8628"
+       transform="matrix(-1,0,0,-1,708.175,743.84474)" />
+    <g
+       id="g6527"
+       transform="translate(37.740791,0)">
+      <path
+         transform="matrix(-0.93322207,0,0,0.98183377,399.5998,-81.219299)"
+         sodipodi:open="true"
+         sodipodi:end="1.5760323"
+         sodipodi:start="0"
+         d="m 370.72598,125.04214 c 0,65.83123 -55.8542,119.198 -124.75384,119.198 -0.21774,0 -0.43547,-5.5e-4 -0.65321,-0.002"
+         sodipodi:ry="119.198"
+         sodipodi:rx="124.75384"
+         sodipodi:cy="125.04214"
+         sodipodi:cx="245.97214"
+         id="path2989"
+         style="fill:none;stroke:#ff0800;stroke-width:3.13407779;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="arc" />
+      <path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.35262775;marker:none;visibility:visible;display:inline;overflow:vi [...]
+         d="M 118,92.71875 40.34375,170.34375 42,172.03125 119.65625,94.375 118,92.71875 z"
+         id="path3759"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#181ae7;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.35299993;marker-start:none"
+         d="m 106.1881,106.17409 0,13.30847 16.63559,-29.944061 -29.944063,16.635591 13.308473,0 z"
+         id="path6520"
+         inkscape:connector-curvature="0" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="41.798828"
+       y="199.72546"
+       id="text6659"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6661"
+         x="41.798828"
+         y="199.72546">a) 1 color - 1 focus</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:30px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="179.0206"
+       y="63.341625"
+       id="text8487"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="179.0206"
+         y="63.341625"
+         id="tspan8491">1t</tspan></text>
+    <path
+       sodipodi:type="arc"
+       style="fill:none;stroke:#ff0800;stroke-width:3.13407779;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path2989-6"
+       sodipodi:cx="245.97214"
+       sodipodi:cy="125.04214"
+       sodipodi:rx="124.75384"
+       sodipodi:ry="119.198"
+       d="m 370.72598,125.04214 c 0,65.83123 -55.8542,119.198 -124.75384,119.198 -0.21774,0 -0.43547,-5.5e-4 -0.65321,-0.002"
+       sodipodi:start="0"
+       sodipodi:end="1.5760323"
+       sodipodi:open="true"
+       transform="matrix(-0.93322207,0,0,0.98183377,439.95222,168.7807)" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="41.183598"
+       y="449.72546"
+       id="text6659-4"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6661-2"
+         x="41.183598"
+         y="449.72546">b) 2 colors - 1 focus</tspan></text>
+    <path
+       inkscape:connector-curvature="0"
+       id="path3759-1"
+       d="m 158.35242,342.71875 -77.65625,77.625 1.65625,1.6875 77.65625,-77.65625 -1.65625,-1.65625 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.35262775;marker:none;visibility:visible;display:inline;overflow:visi [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path6506"
+       d="m 146.54052,356.17409 0,13.30847 16.63559,-29.94406 -29.94406,16.63559 z"
+       style="fill:url(#linearGradient3257);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.8821022pt;marker-start:none"
+       sodipodi:nodetypes="ccccc" />
+    <text
+       xml:space="preserve"
+       style="font-size:30px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="181.41"
+       y="312.3772"
+       id="text8487-7"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="181.41"
+         y="312.3772"
+         id="tspan8491-4">1t</tspan></text>
+    <path
+       sodipodi:type="arc"
+       style="fill:none;stroke:#ff0800;stroke-width:3.13407779;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path2989-6-8"
+       sodipodi:cx="245.97214"
+       sodipodi:cy="125.04214"
+       sodipodi:rx="124.75384"
+       sodipodi:ry="119.198"
+       d="m 370.72598,125.04214 c 0,65.83123 -55.8542,119.198 -124.75384,119.198 -0.21774,0 -0.43547,-5.5e-4 -0.65321,-0.002"
+       sodipodi:start="0"
+       sodipodi:end="1.5760323"
+       sodipodi:open="true"
+       transform="matrix(-0.93322207,0,0,0.98183377,988.5235,-80.37555)" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3759-1-7"
+       d="m 706.92369,93.5625 -77.65625,77.625 1.65625,1.6875 77.65625,-77.65625 -1.65625,-1.65625 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.35262775;marker:none;visibility:visible;display:inline;overflow:visi [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path6506-4"
+       d="m 695.11179,107.01784 0,13.30847 16.63559,-29.94406 -29.94406,16.63559 13.30847,0 z"
+       style="fill:#001aff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.8821022pt;marker-start:none" />
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="591"
+       y="199.07898"
+       id="text6659-4-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6661-2-1"
+         x="591"
+         y="199.07898">e) 2 colors - 1 focus</tspan><tspan
+         sodipodi:role="line"
+         x="591"
+         y="224.07898"
+         id="tspan6802">    alternated excitation</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:30px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="731.24896"
+       y="63.282497"
+       id="text8487-8-0"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="731.24896"
+         y="63.282497"
+         id="tspan8491-2-5">2t</tspan></text>
+    <path
+       inkscape:connector-curvature="0"
+       id="path6504-7"
+       d="m 685.40847,116.72115 0,13.30847 16.63559,-29.94406 -29.94406,16.63559 13.30847,0 z"
+       style="fill:#00ba00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.8821022pt;marker-start:none" />
+    <path
+       sodipodi:type="arc"
+       style="fill:none;stroke:#ff0800;stroke-width:3.13407779;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path2989-1-0-8"
+       sodipodi:cx="245.97214"
+       sodipodi:cy="125.04214"
+       sodipodi:rx="124.75384"
+       sodipodi:ry="119.198"
+       d="m 370.72598,125.04214 c 0,65.83123 -55.8542,119.198 -124.75384,119.198 -0.21774,0 -0.43547,-5.5e-4 -0.65321,-0.002"
+       sodipodi:start="0"
+       sodipodi:end="1.5760323"
+       sodipodi:open="true"
+       transform="matrix(-0.93322207,0,0,0.98183377,990.9139,172.13132)" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path3759-4-4-6"
+       d="m 701.31409,338.06936 -77.65625,77.62501 1.65625,1.6875 77.65625,-77.65626 -1.65625,-1.65625 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.35262775;marker:none;visibility:visible;display:inline;overflow:visi [...]
+    <path
+       inkscape:connector-curvature="0"
+       id="path3759-4-3-5-0"
+       d="m 638.17013,422.164 77.65625,-77.62501 -1.65625,-1.6875 -77.65625,77.65626 1.65625,1.65625 z"
+       style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.35262775;marker:none;visibility:visible;display:inline;overflow:visi [...]
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="596"
+       y="445.07898"
+       id="text6659-4-7-4"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6661-2-5-4"
+         x="596"
+         y="445.07898">f) 2 colors - 2 foci</tspan><tspan
+         sodipodi:role="line"
+         x="596"
+         y="470.07898"
+         id="tspan6767">   alternated excitation</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:30px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="732.19366"
+       y="317.60361"
+       id="text8487-8-0-6"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="732.19366"
+         y="317.60361"
+         id="tspan8491-2-5-4">4t</tspan></text>
+    <path
+       inkscape:connector-curvature="0"
+       id="path6506-4-2"
+       d="m 696.18791,344.96218 0,13.30847 16.63559,-29.94406 -29.94406,16.63559 13.30847,0 z"
+       style="fill:#001aff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.8821022pt;marker-start:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path6504-7-2"
+       d="m 686.48459,354.66549 0,13.30847 16.63559,-29.94406 -29.94406,16.63559 13.30847,0 z"
+       style="fill:#00ba00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.8821022pt;marker-start:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path6506-4-1"
+       d="m 707.62294,350.96218 0,13.30847 16.63559,-29.94406 -29.94406,16.63559 13.30847,0 z"
+       style="fill:#001aff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.8821022pt;marker-start:none" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path6504-7-9"
+       d="m 697.91962,360.66549 0,13.30847 16.63559,-29.94406 -29.94406,16.63559 13.30847,0 z"
+       style="fill:#00ba00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.8821022pt;marker-start:none" />
+    <path
+       style="fill:none;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1Lend-8)"
+       d="m 255.97265,388.38892 128.33988,0 0,0.35355"
+       id="path8749"
+       inkscape:connector-curvature="0" />
+    <path
+       sodipodi:type="arc"
+       style="fill:none;stroke:#ff0800;stroke-width:3.13407779;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path2989-1"
+       sodipodi:cx="245.97214"
+       sodipodi:cy="125.04214"
+       sodipodi:rx="124.75384"
+       sodipodi:ry="119.198"
+       d="m 370.72598,125.04214 c 0,65.83123 -55.8542,119.198 -124.75384,119.198 -0.21774,0 -0.43547,-5.5e-4 -0.65321,-0.002"
+       sodipodi:start="0"
+       sodipodi:end="1.5760323"
+       sodipodi:open="true"
+       transform="matrix(-0.93322207,0,0,0.98183377,716.45371,-77.37753)" />
+    <g
+       id="g6568"
+       transform="translate(309.19766,-183.77316)">
+      <path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.35262775;marker:none;visibility:visible;display:inline;overflow:vi [...]
+         d="M 117.65625,272.33368 40,349.95868 l 1.65625,1.6875 77.65625,-77.65625 -1.65625,-1.65625 z"
+         id="path3759-4"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#181ae7;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.35299993;marker-start:none"
+         d="m 105.84435,285.78902 0,13.30847 16.63559,-29.94406 -29.944063,16.63559 13.308473,0 z"
+         id="path6520-3"
+         inkscape:connector-curvature="0" />
+    </g>
+    <g
+       id="g6568-8"
+       transform="translate(318.88626,-175.81078)">
+      <path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.35262775;marker:none;visibility:visible;display:inline;overflow:vi [...]
+         d="M 117.65625,272.33368 40,349.95868 l 1.65625,1.6875 77.65625,-77.65625 -1.65625,-1.65625 z"
+         id="path3759-4-3"
+         inkscape:connector-curvature="0" />
+      <path
+         style="fill:#181ae7;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.35299993;marker-start:none"
+         d="m 105.84435,285.78902 0,13.30847 16.63559,-29.94406 -29.944063,16.63559 13.308473,0 z"
+         id="path6520-3-8"
+         inkscape:connector-curvature="0" />
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="312.89648"
+       y="199.72546"
+       id="text6659-1"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan6661-3"
+         x="312.89648"
+         y="199.72546">c) 1 color - 2 foci</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:30px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+       x="457.31204"
+       y="67.60611"
+       id="text8487-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         x="457.31204"
+         y="67.60611"
+         id="tspan8491-2">2t</tspan></text>
+    <g
+       id="g8704"
+       transform="translate(50.08078,12.226837)">
+      <text
+         sodipodi:linespacing="125%"
+         id="text6659-4-7"
+         y="437.49863"
+         x="262.8157"
+         style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           y="437.49863"
+           x="262.8157"
+           id="tspan6661-2-5"
+           sodipodi:role="line">d) 2 colors - 2 foci</tspan></text>
+      <path
+         transform="matrix(-0.93322207,0,0,0.98183377,670.08665,161.14925)"
+         sodipodi:open="true"
+         sodipodi:end="1.5760323"
+         sodipodi:start="0"
+         d="m 370.72598,125.04214 c 0,65.83123 -55.8542,119.198 -124.75384,119.198 -0.21774,0 -0.43547,-5.5e-4 -0.65321,-0.002"
+         sodipodi:ry="119.198"
+         sodipodi:rx="124.75384"
+         sodipodi:cy="125.04214"
+         sodipodi:cx="245.97214"
+         id="path2989-1-0"
+         style="fill:none;stroke:#ff0800;stroke-width:3.13407779;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="arc" />
+      <g
+         transform="matrix(0,1,1,0,-20.45544,20.45544)"
+         id="g8632">
+        <path
+           transform="matrix(-1,0,0,-1,708.175,743.84474)"
+           style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.35262775;marker:none;visibility:visible;display:inline;overflow: [...]
+           d="m 392.0875,332.26612 -77.65625,77.625 1.65625,1.6875 77.65625,-77.65625 -1.65625,-1.65625 z"
+           id="path3759-1-3"
+           inkscape:connector-curvature="0" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path6506-7-8"
+           d="m 328.3856,397.50291 13.30847,0 -29.94407,16.6356 16.6356,-29.94407 z"
+           style="fill:url(#linearGradient3196);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.8821022pt;marker-start:none"
+           sodipodi:nodetypes="ccccc" />
+      </g>
+      <path
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.35262775;marker:none;visibility:visible;display:inline;overflow:vi [...]
+         d="m 380.3375,326.76612 -77.65625,77.625 1.65625,1.6875 77.65625,-77.65625 -1.65625,-1.65625 z"
+         id="path3759-1-3-8"
+         inkscape:connector-curvature="0" />
+      <path
+         sodipodi:nodetypes="ccccc"
+         style="fill:url(#linearGradient3198);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.8821022pt;marker-start:none"
+         d="m 368.5256,340.22146 0,13.30847 16.63559,-29.94406 -29.94406,16.63559 z"
+         id="path6506-43-8"
+         inkscape:connector-curvature="0" />
+      <text
+         sodipodi:linespacing="125%"
+         id="text8487-8-8"
+         y="305.57703"
+         x="411.84955"
+         style="font-size:30px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+         xml:space="preserve"><tspan
+           id="tspan8491-2-2"
+           y="305.57703"
+           x="411.84955"
+           sodipodi:role="line">2t</tspan></text>
+    </g>
+    <text
+       xml:space="preserve"
+       style="font-size:30px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#800080;fill-opacity:1;stroke:none;font-family:Sans"
+       x="326.5"
+       y="18.362183"
+       id="text9339"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan9341"
+         x="326.5"
+         y="18.362183"
+         style="font-size:25px">calibration-free</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:30px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#de8d00;fill-opacity:1;stroke:none;font-family:Sans"
+       x="620.13837"
+       y="18.450195"
+       id="text9339-8"
+       sodipodi:linespacing="125%"><tspan
+         sodipodi:role="line"
+         id="tspan9341-5"
+         x="620.13837"
+         y="18.450195"
+         style="font-size:25px">crosstalk-free</tspan></text>
+  </g>
+</svg>
diff --git a/doc/Images/alexA.pdf b/doc/Images/alexA.pdf
new file mode 100755
index 0000000..178baa7
Binary files /dev/null and b/doc/Images/alexA.pdf differ
diff --git a/doc/Images/alexA_orig.pdf b/doc/Images/alexA_orig.pdf
new file mode 100755
index 0000000..21c31c9
Binary files /dev/null and b/doc/Images/alexA_orig.pdf differ
diff --git a/doc/Images/alexB.pdf b/doc/Images/alexB.pdf
new file mode 100755
index 0000000..a7401bd
Binary files /dev/null and b/doc/Images/alexB.pdf differ
diff --git a/doc/Images/alexB_orig.pdf b/doc/Images/alexB_orig.pdf
new file mode 100755
index 0000000..3303d76
Binary files /dev/null and b/doc/Images/alexB_orig.pdf differ
diff --git a/doc/PyScanFCS_doc.tex b/doc/PyScanFCS_doc.tex
new file mode 100755
index 0000000..fc2da2e
--- /dev/null
+++ b/doc/PyScanFCS_doc.tex
@@ -0,0 +1,155 @@
+\documentclass[a4paper,12pt]{scrartcl}
+
+%Wir arbeiten mit PDF-Latex.
+%Bei Texmaker unter Werkzeuge > PDFLaTeX (F6)
+
+\usepackage[utf8x]{inputenc}
+
+%Für deutsche Schriften:
+%\usepackage[ngerman]{babel}
+%\usepackage{sistyle}
+%\SIstyle{German}
+%\usepackage{icomma} % Komma als Dezimaltrenner (im Mathe Modus)
+		    % Standardmäßig läßt LaTeX im Mathe Modus immer etwas 
+		    % Platz nach einem Komma, für 3,45 etc. ist das falsch.
+		    % Mit icomma gilt:
+		    % Wenn auf das Komma ein Leerzeichen folgt, soll auch
+		    % eins kommen, wenn nicht, schreibe es als Operator:
+		    % z.B. $f(x, y) = 3,45$
+
+%Für englische Schriften:
+\usepackage[english]{babel}
+\usepackage{sistyle}
+
+
+\usepackage[top = 2cm, left = 2.5cm, right = 2cm, bottom = 2.5cm]{geometry}
+
+\usepackage{amsmath}
+\usepackage{amssymb}
+\usepackage{array}
+
+\usepackage{cite} %Für Zitate und Quellen
+\usepackage{url}
+\urlstyle{tt}
+
+%\usepackage{longtable} % mehrseitige Tabellen
+%\usepackage{multirow} %Zusammenfassen von Spalten/Zeilen
+
+
+
+\usepackage{subfig} % Vereinen von Bildern in gesamte Figure
+
+%Schönere Unterschriften für Bilder und Tabellen
+%Setze captions mit Kommas und Beschriftungen
+\DeclareCaptionLabelFormat{mycaption}{#1 #2}
+\DeclareCaptionLabelSeparator{comma}{, }
+\captionsetup{font=small,labelfont=bf,labelformat=mycaption,labelsep=comma}
+\setcapindent{0pt} % Zeileneinzug ab zweiter Zeile
+
+\newcommand{\mycaption}[2]{\caption[~#1]{\textbf{#1:} #2}}
+
+\usepackage{tabularx}
+\usepackage{textcomp} % Sonderzeichen
+\usepackage{wrapfig}
+
+\usepackage[svgnames]{xcolor} %Farben wie DarkBlue
+
+%%
+%%
+%% Definitionen für schöne Links innerhalb des Dokuments
+  %%% graphicx: support for graphics
+  \usepackage[pdftex]{graphicx}
+
+
+  \pdfcompresslevel=9
+
+  %%% hyperref (hyperlinks in PDF): for more options or more detailed
+  %%%          explanations, see the documentation of the hyperref-package
+  \usepackage[%
+    %%% general options
+    pdftex=true,      %% sets up hyperref for use with the pdftex program
+    %plainpages=false, %% set it to false, if pdflatex complains: ``destination with same identifier already exists''
+    %
+    pdfstartview={XYZ 0 0 1.0} , %% Startet das PDF mit 100% Zoom, also Originalgroesse
+    %%% extension options
+    backref,      %% adds a backlink text to the end of each item in the bibliography
+    pagebackref=false, %% if true, creates backward references as a list of page numbers in the bibliography
+    colorlinks=true,   %% turn on colored links (true is better for on-screen reading, false is better for printout versions)
+    linkcolor=DarkBlue,		%% Aendern der Linkfarbe
+    urlcolor=DarkBlue,		%% Aendern der Url-Linkfarbe und andere serioese Farben
+    anchorcolor = black,
+    citecolor = DarkGreen,
+    filecolor = black,
+    urlcolor = DarkBlue,
+    breaklinks=false,
+    %
+    %%% PDF-specific display options
+    bookmarks=true,          %% if true, generate PDF bookmarks (requires two passes of pdflatex)
+    bookmarksopen=true,     %% if true, show all PDF bookmarks expanded
+    bookmarksnumbered=false, %% if true, add the section numbers to the bookmarks
+    %pdfstartpage={1},        %% determines, on which page the PDF file is opened
+    %pdfpagemode=None         %% None, UseOutlines (=show bookmarks), UseThumbs (show thumbnails), FullScreen
+  ]{hyperref}
+  %%% provide all graphics (also) in this format, so you don't have
+  %%% to add the file extensions to the \includegraphics-command
+  %%% and/or you don't have to distinguish between generating
+  %%% dvi/ps (through latex) and pdf (through pdflatex)
+%  \DeclareGraphicsExtensions{.pdf}
+%%
+%%
+
+%\newcommand{\kommentar}[1]{\marginpar{\textcolor{red}{#1}}}  % Kommentarkommando
+%\newcommand{\fehler}[3]{\SI{(#1}{}\SI{\pm #2)}{#3}} % Fehlerkommando
+
+%Ort für mögliche Bilddateien (Unterordner)
+\graphicspath{{bilder/}{messwerte/}{auswertung/}}
+
+%Neue Befehle
+\newcommand{\hyref}[2]{\hyperref[#2]{#1~\ref{#2}}} %Schönerer link statt "link zu Bild \ref{im:bild}" -> "\hyref{link zu Bild}{im:bild}"
+
+\newcommand{\mytilde}{\raisebox{-0.9ex}{\~{ }}}
+
+% Tell latex how to break the program names
+\hyphenation{Py-Corr-Fit Py-Scan-FCS}
+
+\usepackage{doi}
+
+
+\begin{document}
+
+\noindent
+\begin{tabularx}{\linewidth}{Xr}
+ \textbf{PyScanFCS \newline Data evaluation for perpendicular line scanning FCS} \newline \textit{Software Guide} &
+     \raisebox{-2em}{\includegraphics[angle=0,width=40mm]{Images/PyScanFCS_logo_dark.pdf}} \\
+ \\
+ Paul Müller & \\
+ Biotechnology Center of the TU Dresden & \\
+ \today & \\
+\end{tabularx}
+
+\vspace{2em}
+
+\tableofcontents
+
+\newpage
+
+\graphicspath{{Images/}}
+\include{PyScanFCS_doc_content}
+
+
+\section*{Acknowledgements}
+\addcontentsline{toc}{section}{Acknowledgements}
+I thank Eugene Petrov and Fabian Heinemann (MPI Biochem, Martinsried, Germany) for discussions on the implementation of the multiple-$\tau$ algorithm. I thank André Scholich (TU Dresden, Germany) for initial proof reading of the manuscript. The idea of a kymograph and the Fourier analysis method are adopted from a Matlab script written on the same issue by Jonas Ries.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Literaturverzeichnis
+
+\pagestyle{plain}             % nur Nummerierung in der Fußzeile
+
+\bibliographystyle{plainurl}  % Zitierstil: alphadin = [Nam88] apt-get install bibtex-extras
+\bibliography{Bibliography}      % BibTeX-Datei name.bib ohne .bib hier einfgen
+%\nocite{*}                    % Listet alle Eintrge der Datei auf, wenn aktiv
+
+
+\end{document}
diff --git a/doc/PyScanFCS_doc_content.tex b/doc/PyScanFCS_doc_content.tex
new file mode 100755
index 0000000..de6262e
--- /dev/null
+++ b/doc/PyScanFCS_doc_content.tex
@@ -0,0 +1,216 @@
+
+\section{Introduction}
+
+\subsection{Preface}
+PyScanFCS processes photon arrival times recorded in perpendicular scanning FCS setups using the Flex02-01D/C correlator from \url{http://correlator.com}.
+\\
+\\
+The PyScanFCS software provided is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published 
+by the Free Software Foundation, either version 2 of the License, 
+or (at your option) any later version.
+\\
+\\
+An exemplary usage of PyScanFCS - delivering a proof of principle from calibration to data fitting - was shown in \cite{Mueller2014}.
+
+\subsection{Prerequisites}
+In order to use the PyScanFCS software, the following equipment is needed:
+
+\subsubsection*{Hardware}
+\begin{itemize}
+\item A confocal laser scanning microscope (CLSM). For single-color one-focus SFCS, the CLSM should be capable of continuously scanning along a single line. For more sophisticated measurements, features like ``Multitrack mode'' for dual-color measurements and frame scanning for two-focus SFCS are required (LSM510, Zeiss, Germany).
+
+\item One or two avalanche photo diodes (APD) for single or dual color detection. In addition, matching filters and beam splitters. The detection channels are referred to as channels A and B throughout this documentation.
+
+\item A photon stream recording device connected to the APDs. In the tested setup a Flex02-12D/B correlator from correlator.com\footnote{Note that for some reason the photon history recording mode does not work with the Flex02-01D/C correlator. Keep that in mind while troubleshooting your setup. When using a different device, the data has to be converted accordingly. The data format is described in \hyref{section}{sec:datformat}.} was used in photon history recording mode. The device cre [...]
+\end{itemize}
+
+\subsubsection*{Software}
+PyScanFCS can be downloaded from \url{http://pyscanfcs.craban.de}.
+\begin{itemize}
+\item \textbf{Windows}
+For Windows XP or Windows 7, stand-alone binary executables are available from the download page. 
+\item \textbf{Linux}
+There are executable binaries for widely used distributions (e.g. Ubuntu).
+\item \textbf{Sources}
+The program is written in python 2.7. On any operating system, PyScanFCS can be run from source. In general, the following packages need to be available:
+\texttt{\\
+cython ($\geq$ 0.1.6)\\
+python-matplotlib ($\geq$ 1.0.1) \\
+python-multipletau ($\geq$ 0.1.4) \\
+python-numpy ($\geq$ 1.6.2) \\
+python-pyfits \\
+python-scipy ($\geq$ 0.10.1) \\
+python-wxgtk2.8 (2.8.12.1) \\
+}
+\\
+There are two ways to make PyScanFCS run from source.\\
+\textbf{Recommended way:} Install via pip
+\texttt{ pip install pyscanfcs}
+and run the package directly
+\texttt{python -m pyscanfcs}.
+\\
+\textbf{Second way:}
+Obtain the source directly from GitHub (\url{https://github.com/paulmueller/PyScanFCS}).
+
+
+\paragraph*{Cython}
+PyScanFCS needs Cython to perform some CPU intensive operations. Before running PyScanFCS from source, a C compiler needs to be installed (\url{http://docs.cython.org/src/quickstart/install.html}).
+\begin{itemize}
+\item[ ] \textbf{Windows}. The common MinGW compiler can be used. Instructions on how to install MinGW can be found in the Cython documentation: \url{http://docs.cython.org/src/tutorial/appendix.html}. On machines running Windows 7 x64 with the x64 version of python, the Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 must be used: \\
+\url{http://wiki.cython.org/64BitCythonExtensionsOnWindows}.
+
+\item[ ] \textbf{Ubuntu}. The following packages need to be installed:
+\\
+\texttt{build-essential\\
+python-dev} 
+\item[ ] \textbf{MacOS}. Use Apple's XCode, available from \url{http://developer.apple.com}.
+\end{itemize}
+Cython can be obtained from \url{http://www.cython.org/}. After unpacking of the archive, Cython is installed by executing \texttt{python setup.py install} within the unpacked directory\footnote{Cython can also be installed via PyPI with \texttt{pip install cython} (\url{http://pypi.python.org/pypi}).}.
+
+For older version of Ubuntu, some of the above package versions are not listed in the package repository. To enable the use of PyScanFCS on those systems, the following packages need to be installed separately:
+
+\begin{itemize}
+\item[ ] \textbf{matplotlib}. The tukss-ppa includes version 1.0.1. After adding the repository (\texttt{apt-add-repository ppa:tukss/ppa}), matplotlib can be installed as usual.
+\item[ ] \textbf{numpy}. The package from a later version of Ubuntu can be installed: \url{https://launchpad.net/ubuntu/+source/python-numpy/}
+\item[ ] \textbf{scipy}. The package from a later version of Ubuntu can be installed: \url{https://launchpad.net/ubuntu/+source/python-scipy/}
+\end{itemize}
+
+\end{itemize}
+
+Correlation curves created by PyScanFCS can be processed using \texttt{PyCorrFit}\footnote{\url{http://pycorrfit.craban.de}}.
+
+\section{Data acquisition modes}
+\begin{figure}[t]
+\centering
+\includegraphics[width=0.8\linewidth]{SFCSmodi.pdf}
+ \mycaption{acquisition modes in PyScanFCS}{The six figures \textbf{a-f} show possible scenarios for scan path and excitation settings. The alignment of the scan paths (black) is shown for membrane of a giant unilamellar vesicle (red). The arrow tips define the different colors used for each scan (blue excitation, green excitation, or both at the same time). Multiple arrow tips indicate the sequential scanning of one line with two colors. The time necessary to perform a complete scan in  [...]
+\end{figure}
+In order to achieve all possible measurement modes depicted in \hyref{figure}{fig:scanmodi}, the CLSM needs to be set up properly. The scan paths should be checked for straightness e.g. by bleaching a layer of eGFP\footnote{Often, hysteresis effects occur during high speed scanning and scan paths are not straight. Switching to slower bidirectional scanning or setting up a ``multitrack mode'' might solve these problems.}. In 2fSFCS, the distance between the lines can be determined in a si [...]
+\begin{figure}[]
+\centering
+% 2012-08-27-SFCS_DiO-DOPC-GUVs --> GUV5b
+\subfloat[SFCS: GUV scan path][GUV scan path in SFCS]
+{\includegraphics[width=0.34\linewidth]{GUV.pdf}} \qquad
+\subfloat[SFCS: Kymograph][Kymograph produced by PyScanFCS]
+{\includegraphics[width=0.55\linewidth]{1color1focus.pdf}} 
+ \mycaption{1 focus 1 color measurement with PyScanFCS}{ \label{fig:1c1f_example} Example of a GUV scanned using one focus and one laser line. \textbf{a)} The equator of a GUV with the scan path (yellow). \textbf{b)} A kymograph generated by PyScanFCS. The scan cycle time is \SI{1.527}{ms} (vertical) and the measurement time is \SI{500}{s} (horizontal). Each scan cycle is binned into 70 bins. Note that the resolution in direction of the measurement time is adapted to the scan cycle resol [...]
+\end{figure}
+This section describes the acquisition modes that PyScanFCS supports. Correlation functions are labeled according to \hyref{figure}{fig:example_kymograph}. \hyref{Figure}{fig:scanmodi} shows advantages and disadvantages in terms of time resolution, calibration and crosstalk.
+\paragraph{a) one color - one focus}
+One spot of the membrane is scanned continuously using one laser line. The signal is detected using one APD and PyCanFCS can be used to calculate one autocorrelation curve ($AC_{A1}$).
+\paragraph{b) two colors - one focus}
+The setup is the same as in (a), except that two laser lines are used and the signal is detected by two APDs. This mode can be applied for multiple dye studies. There are four possible correlations: $AC_{A1}$, $AC_{B1}$, $CC_{A1B1}$, $CC_{B1A1}$
+
+\paragraph{c) one color - two foci}
+The CLSM is set up to perform a line scan along two lines with a distance $d$ apart. For detection, only one APD is required. The distance $d$ needs to be determined beforehand. In addition to two autocorrelations, two cross correlation curves are obtained. The cross correlation curves contain information about the shape and size of the focus traversing the membrane. Thus, no calibration measurement with a reference dye is necessary to determine extents of the scanning focus.
+Possible correlations: $AC_{A1}$, $AC_{A2}$, $CC_{A1A2}$, $CC_{A2A1}$
+
+
+\paragraph{d) two colors - two foci}
+Like (b), this is a dual-color extension. Two laser lines are used for scanning and two APDs are used for detection.\\
+Possible autocorrelations: 4\\
+Possible cross-correlations: 12
+
+\paragraph{e,f) dual color with alternating excitation}
+To avoid cross-talk between the two color channels, as it likely happens in the \textit{b) two colors - one focus} or \textit{d) two colors - two foci}  modes, the CLSM can be setup to sequentially scan the membrane with two laser lines. This way, only one laser line is used to excite the sample at a time and the fluorescence of two dyes can be separated, effectively circumventing crosstalk. The scan cycle time  doubles when using alternating excitation and hence the binning time is twic [...]
+Possible correlations (1 focus): $AC_{A1}$, $AC_{B2}$\\
+Possible correlations (2 foci): $AC_{A1}$, $AC_{B2}$, $CC_{A1B2}$, $CC_{B2A1}$
+
+\begin{figure}[h]
+\centering
+\subfloat[][A: Red channel]
+{\includegraphics[width=0.45\linewidth]{alexA.pdf}} \qquad
+\subfloat[][B: Green channel]
+{\includegraphics[width=0.45\linewidth]{alexB.pdf}} 
+ \mycaption{alternating excitation with PyScanFCS}{ \label{fig:example_kymograph} The kymograph yields a scanning time for one line of \SI{1.527}{ms}. One can clearly see the trace A2, which originates from crosstalk from the green dye to the red channel or from the red dye being excited by the green laser. There is no crosstalk from the red dye to the green channel, which in this case helps identify the traces.}
+\end{figure}
+
+\section{Working with PyScanFCS}
+\subsection{Data file formats}
+\begin{itemize}
+
+\item \textbf{\mytilde .csv files} each contain a correlation curve. Further information is available in the \texttt{PyCorrFit} documentation (\url{http://pycorrfit.craban.de}).
+
+\label{sec:datformat}
+\item \textbf{\mytilde .dat files} are created by the software \texttt{Photon.exe} that ships with the correlators from correlator.com. The format stores the photon arrival time differences between two photon events. Data format is as follows\footnote{Note, that Windows uses the little endian byte order. This might lead to problems when using PowerPC.}:
+	\begin{itemize}
+	\item The value of the first byte (uint8) identifies the format of the file: 8, 16, or 32 bit.
+	\item The value of the second byte (uint8) identifies the system clock, usually \SI{60}{MHz}.
+	\item The rest of the file contains the times between two photon arrivals. The time unit is 1/(system clock) (here \SI{16.\overline{66}}{ns}).
+	\item 8 bit format is not supported.
+	\item 16 bit format. Each word (2 bytes, uint16) represents a photon event. For low intensities, values of \texttt{0xFFFF} may occur. In this case, the following four bytes (uint32) represent a photon event.
+	\item 32 bit format. Each dword (4 bytes, uint32) represents a photon event. 32 bit files can be created from 16 bit files using \texttt{Photon.exe}. PyScanFCS saves \mytilde .dat files in this format.
+ 	\end{itemize}
+\item \textbf{\mytilde .fits files} - The \textbf{f}lexible \textbf{i}mage \textbf{t}ransport \textbf{s}ystem is used by PyScanFCS to save already binned \mytilde .dat files. Those files contain additional fits-keys:
+	\begin{itemize}
+	\item \texttt{SysClck} - system clock in MHz
+	\item \texttt{Total} - total measurement time in system clock ticks
+	\item \texttt{Tcycle} - acquired scan cycle time in system clock ticks
+	\item \texttt{Tbin} - binning of the photon events in system clock ticks
+	\item \texttt{Binshift} - bins added to beginning of the entire 2D data array before plotting
+
+	\end{itemize}
+	Because these files can become quite large, it is not recommended to store the data in this file format. Also, information is lost due to the binning. It is possible to save a \mytilde .fits file with only a few photon events binned (small file size), which contains the correct plotting parameters (cycle time, bin shift). This file can later be opened prior to opening the corresponding \mytilde .dat file. This way, e.g. the scan cycle time does not have to be found again.
+
+\item \textbf{\mytilde .int files} are created during binning. They are straight 16 bit files that contain binned events from a \mytilde .dat file.
+
+\item \textbf{\mytilde .txt files} are generated optionally, if the user wants to save the generated traces. The file contains photon numbers, separated by a new line. The binning time, as well as the corresponding intensities can be calculated from parameters given in the file.
+
+\item \textbf{\mytilde .zip files} are bundles of correlation curves ( - stored as \mytilde .csv files). They can be imported for fitting by \texttt{PyCorrFit}. \mytilde .zip files are automatically stored in the working directory (location of \mytilde .dat or \mytilde .fits files).
+
+\end{itemize}
+
+
+
+\subsection{The user interface}
+\begin{figure}[h]
+\centering
+\includegraphics[width=0.95\linewidth]{PyScanFCS_Main.png}
+ \mycaption{user interface}{The left panel displays all parameters. The right panel shows the kymograph of the measurement. \label{fig:SFCSMain}}
+\end{figure}
+\hyref{Figure}{fig:SFCSMain} shows the main user interface with the following content:
+\begin{itemize}
+\item The \textbf{menu bar} with standard operations, such as loading or saving a file. The \textbf{cache menu} is a convenience tool. It displays all previously binned \mytilde .dat files.
+
+\item \textbf{Pre-binning}: This sets up all parameters that are used to bin a \mytilde .dat file:
+	\begin{itemize}
+	\item[-] the binning resolution of the scan cycles
+	\item[-] the number of events from a \mytilde .dat file to process
+	\item[-] the bin width of a scan cycle (not used if the scan cylce time is known)
+	\item[-] a bin shift can be used to help selecting traces
+	\end{itemize}
+The bin shift parameter adds a number of empty bins to the beginning of the binned array. This will shift the vertical (scan cycle time) position of the visible trace.
+
+\item \textbf{Total-binning}: Bin the entire file using the scan cycle time found.
+
+\item \textbf{Mode}: Selects which mode to use. The modes are described above. Optionally save traces as \mytilde .txt files inside the working directory.
+
+\item \textbf{Data}: Displays current file information and found scan cycle time. The scan cycle time may be doubled, quadrupled, halved or quartered. This may help, if the automagic algorithm did not find the correct scan cycle time.
+
+\item  \textbf{Find line scan time}: Performs a fourier transform of the binned data\footnote{The user is advised to not use too many events. This might result in a system lock-up.}. If the check box is activated, the program will automatically find the correct maximum in fourier space and write back the corresponding scan cycle time. If the check box is not activated, a window will pop up for the user to define an interval where to search for a maximum. When a scan cycle time has been f [...]
+
+\item  \textbf{Image selection}: Selects which tool to apply to the binned image in the \textbf{kymograph}. This does not work, if any other tool (e.g. magnifier) from the kymograph toolbar is active.
+	\begin{itemize}
+	\item[-] scan cycle correction: This is used, if the scan cycle time found is not exactly correct (tilted lines in the kymograph). To correct the scan cylce time, the user draws a line along the trace in the kymograph. Afterwards, the kymograph can be recalculated using \textbf{Pre-Binning} or \textbf{Total-binning}.
+	\item[-] Select region 1: Lets the user draw a rectangle around a trace that should be used for correlation. Region 1 is always displayed in yellow.
+	\item[-] Select region 2: Depending on the \texttt{mode}, the user may select a second region for additional auto- and cross-correlation. Region 2 is always displayed in cyan.
+	\item[-] Full measurement time: Maximizes the measurement time selection (horizontal in the kymograph) for the regions.
+	\end{itemize}
+	
+\item \textbf{Correlation}: Calculates the traces and perform the multiple-$\tau$ algorithm according to the selected \textbf{mode}. 
+	\begin{itemize}
+	\item[-] Span: The trace is calculated from the maximum of each scanned line. This corrects for spacial fluctuations perpendicular to the surface of the probed membrane. If the binning is too fine, or the scan cycle time is not exactly correct, this number can be increased to include more neighboring bins for the calculation of the trace.
+	\item[-] No. of trace slices: Sometimes, dirt contaminates the trace. The trace can be split and the correlation curves can be calculated separately from each slice. \texttt{PyCorrFit} is able to average over user selected curves, yielding cleaner statistics.
+	\item[-] Bleach filter: Fits an exponential function to the selected trace and performs a bleaching correction according to \cite{Ries2009}. Note that this bleaching correction is only valid for an approximately linear decay in the fluorescence signal. The bleaching data is exported to the zip file that also contains the correlation data. They are named
+	\begin{center}
+	\texttt{PyScanFCS\_bleach\_profile\_TYPE\_RANDOM.csv}
+	\end{center}
+	where  \texttt{TYPE} is the type of the curve (e.g. \texttt{Region\_A1}) and \texttt{RANDOM} is just a random number.
+	\item[-] Countrate filter: Approximates the count rate of the fluorescence signal from the membrane. Because the laser focus is \textit{scanned} through the membrane, the average signal from the measurement does not equal the actual count rate within the membrane. The algorithm fits a Gaussian to the average intensity profile and uses the standard deviation to calculate the residence time of the focus inside the membrane.	This residence time is then used to calculate the approximate cou [...]
+	\item[-] M.-$\tau$ parameter m: This is a parameter of the multiple-$\tau$ algorithm. $m$ is the number of points of the correlation curve that are calculated by the multiple-$\tau$ algorithm in the first loop. Afterwards, the intensity trace is binned by combining two neighboring bins. Then, sequentially $m/2$ data points are calculated after each binning of the trace. A thorough description is given in \cite{Wohland2001}. $m=16$ is a good measure.
+
+	\end{itemize}
+\item The \textbf{kymograph plot} shows the binned \mytilde .dat files. The Pixel resolution in the direction of measurement time is adjusted to match the resolution of the scan cycle time (bins per scan cycle). This is implemented by slicing the array and showing only a few slices in measurement time ``direction''. So far, no disadvantages compared to averaging have been observed. The plotting area contains a useful toolbar.
+\end{itemize}
+
diff --git a/misc/ExampleFunc_Exp_correlated_noise.txt b/misc/ExampleFunc_Exp_correlated_noise.txt
new file mode 100755
index 0000000..18eb078
--- /dev/null
+++ b/misc/ExampleFunc_Exp_correlated_noise.txt
@@ -0,0 +1,24 @@
+# Exponentially correlated noise
+# This is a test function used to check times of exponentially
+# correlated noise.
+
+# Fraction
+Purity = 0.5
+
+# Exp time
+tauexp [ms] = 2.0
+
+# You may choose to substitute certain parts of the correlation function
+# with other values for easy reading. This can be done by using the
+# prefix "g". You may use all common mathematical functions,
+# such as "sqrt()" or "exp()". For convenience, "pi" and "e" may also
+# be used. If you are paranoid, you always use float numbers with a dot "."
+# to be sure the program doesn't accidently do integer division.
+
+gTrip = Purity/(1-Purity)*exp(-tau/tauexp)
+
+# The final line with the correlation function should start with a "G"
+# before the "=" sign.
+
+G = gTrip
+
diff --git a/misc/MakeTestDat_SFCS.py b/misc/MakeTestDat_SFCS.py
new file mode 100755
index 0000000..e18dfdc
--- /dev/null
+++ b/misc/MakeTestDat_SFCS.py
@@ -0,0 +1,190 @@
+#!/usr/bin/python
+"""
+    This program creates a .dat file with photon arrival times as
+    it is produced by the FLEX correlators from correlator.com
+    in photon history recorder mode by "Photon.exe".
+    The generated files can be used to test multiple tau algorithm and
+    workflow of SFCS analyzation programs.
+"""
+
+import numpy as np
+import multipletau
+import csv
+
+def MakeDat(linetime, noisearray, dtype, filename):
+    """ Create a .dat file (like Photon.exe).
+        System clock is fixed to 60MHz.
+        linetime [s]
+        noisearray integer array (uint16 or uint32)
+    """
+    NewFile = open(filename, 'wb')
+    if dtype == np.uint32:
+        newformat = np.uint8(32)
+    elif dtype == np.uint16:
+        newformat = np.uint8(16)
+    else:
+        raise ValueError
+    newclock = np.uint8(60)
+    NewFile.write(newformat)
+    NewFile.write(newclock)
+    noisearray = dtype(noisearray)
+    # Create matrix. Each line is a scan.
+    data = list()
+    timeticks = linetime*newclock*1e6 # 60MHz
+    for i in np.arange(len(noisearray)):
+        # Create a line
+        N = noisearray[i]
+        if N == 0:
+            line=np.zeros(1, dtype=dtype)
+            # Only one event at the far corner
+            line[0] = 2*timeticks
+            line.tofile(NewFile)
+        else:
+            line = np.ones(N+1, dtype=dtype)
+            # events are included between two far events
+            line[0] = line[-1] = timeticks-int(len(line)/2)
+            line.tofile(NewFile)
+    NewFile.close()
+
+
+def OnSaveDat(filename, data):
+    # Save the Data
+    """
+    Save experimental data as 32bit format.
+
+    Raw data file format:
+     1. The file records the difference in system clock ticks (1/60 us)
+        between photon events.
+     2. The first byte identifies the format of the file: 32 bit
+     3. The second byte identifies the system clock: usually 60MHz.
+     4. The time unit is 1/system clock.
+     5. 32 bit format. 4 bytes represent a photon event, 
+        time = 4 bytes/system clock
+    """
+    # Make a reasonable 32bit filename
+    NewFile = open(filename, 'wb')
+    newformat = np.uint8(32)
+    newclock = np.uint8(60)
+    NewFile.write(newformat)
+    NewFile.write(newclock)
+    data = np.uint32(data)
+    data.tofile(NewFile)
+    NewFile.close()
+
+
+def GenerateExpNoise(N, taud=20., variance=1., deltat=1.):
+    """
+        Generate exponentially correlated noise.
+    """
+    # length of mean0 trace
+    N_steps = N
+    dt = int(deltat)
+    # time trace
+    t = np.arange(N_steps)
+    # AR-1 processes - what does that mean?
+    # time constant (inverse of correlationtime taud)
+    g = 1./taud
+    # variance
+    s0 = variance
+    
+    # normalization factor (memory of the trace)
+    exp_g = np.exp(-g*dt)
+    one_exp_g = 1-exp_g
+    z_norm_factor = np.sqrt(1-np.exp(-2*g*dt))/one_exp_g
+    
+    # create random number array
+    # generates random numbers in interval [0,1)
+    randarray = np.random.random(N_steps)
+    # make numbers random in interval [-1,1)
+    randarray = 2*(randarray-0.5)
+    
+    # simulate exponential random behavior
+    z = np.zeros(N_steps)
+    z[0] = one_exp_g*randarray[0]
+    for i in np.arange(N_steps-1)+1:
+        z[i] = exp_g*z[i-1] + one_exp_g*randarray[i]
+        
+    z = z * z_norm_factor*s0
+    return z
+
+
+def ReduceTrace(trace, deltat, length):
+    """
+        Given a `trace` of length `len(trace)`, compute a trace of
+        length smaller than `length` by averaging. 
+        
+        
+        Parameters
+        ----------
+        trace : ndarray, shape (N)
+            Input trace that is to be averaged.
+        deltat : float
+            Time difference between bins in trace.
+        length : int
+            Maximum length of the new trace.
+
+
+        Returns
+        -------
+        newtrace : ndarray, shape (N,2)
+            New trace (axis 1) with timepoints (axis 0).
+
+    """
+    step = 0
+    while len(trace) > length:
+        N = len(trace)
+        if N % 2 != 0:
+            N -= 1
+        trace = (trace[0:N:2] + trace[1:N:2]) / 2
+        step += 1
+    # Return 2d array with times
+    T = np.zeros((len(trace), 2))
+    T[:,1] = trace/deltat/1e3 # in kHz
+    T[:,0] = np.arange(len(trace))*deltat*2**step
+    return T
+
+
+def SaveCSV(G, trace, filename):
+    """ Save correlation and trace tuple array G and trace to a .csv file
+        that can be opened with FCSfit.
+    """
+    # Save Correlation function
+    csvfile = filename
+    openedfile = open(csvfile, 'wb')
+    openedfile.write('# This file was created using testmultipletau.py\r\n')
+    openedfile.write('# Channel (tau [s])'+" \t," 
+                                     'Correlation function'+" \r\n")
+    dataWriter = csv.writer(openedfile, delimiter=',')
+    for i in np.arange(len(G)):
+        dataWriter.writerow([str(G[i,0])+" \t", str(G[i,1])])
+
+    openedfile.write('# BEGIN TRACE \r\n')
+    openedfile.write('# Time ([s])'+" \t," 
+                                     'Intensity Trace [kHz]'+" \r\n")
+
+
+    for i in np.arange(len(trace)):
+        dataWriter.writerow([str(trace[i,0])+" \t", str(trace[i,1])])
+
+
+    openedfile.close()
+
+# Line time to be ound by SFCS analyzation software
+linetime = 0.000714
+# Time of exponentially correlated noise
+taudiff = 7. # in ms
+
+noisearray = GenerateExpNoise(200000, taud=taudiff/linetime/1e3)
+noisearray += np.abs(np.min(noisearray))
+noisearray *= 30./np.max(noisearray)
+noisearray = np.uint32(noisearray)
+
+# Create 32bit and 16bit binary .dat files
+data = MakeDat(linetime/2, noisearray, np.uint16, "test_"+str(taudiff)+"ms_16bit.dat")
+data = MakeDat(linetime/2, noisearray, np.uint32, "test_"+str(taudiff)+"ms_32bit.dat")
+
+# Create reference .csv file to check results
+G = multipletau.autocorrelate(noisearray, deltat=linetime, normalize=True)
+newtrace = ReduceTrace(noisearray, deltat=linetime, length=500)
+SaveCSV(G, newtrace, "test_"+str(taudiff)+"ms_reference.csv")
+
diff --git a/misc/README.md b/misc/README.md
new file mode 100644
index 0000000..b16a90b
--- /dev/null
+++ b/misc/README.md
@@ -0,0 +1,12 @@
+PyScanFCS - misc
+===========
+
+These are functions that are either implemented somehow in PyScanFCS or that can be used to test PyScanFCS.
+
+- **binningc.pyx**: converts 16 bit ~.dat file format to 32 bit ~.dat file format (For further information, see the documentation of PyScanFCS at http://fcstools.dyndns.org/pyscanfcs)
+- **dat2csv.py**: using a photon stream from a ~.dat file, it calculates the correlation curve and saves it as a ~.csv file for PyCorrFit http://fcstools.dyndns.org/pycorrfit
+- **setup.py**: compiles binningc.pyx using Cython
+
+Testing the PyScanFCS:
+- **MakeTestDat_SFCS.py**: create a exponentially correlated noise in a ~.dat file that can be loaded with [PyScanFCS](https://github.com/paulmueller/PyScanFCS) (http://fcstools.dyndns.org/pyscanfcs)
+- **ExampleFunc_Exp_correlated_noise.txt**: external model function for fitting of exponentially correlated noise using [PyCorrFit]https://github.com/paulmueller/PyCorrFit) (http://fcstools.dyndns.org/pycorrfit)
diff --git a/misc/binningc.pyx b/misc/binningc.pyx
new file mode 100755
index 0000000..cc33516
--- /dev/null
+++ b/misc/binningc.pyx
@@ -0,0 +1,201 @@
+# -*- coding: utf-8 -*-
+""" Binning Data for Multiple Tau Algorithm
+    Paul Müller, Biotec - TU Dresden
+
+    As fast as you can get with python, binning the photon arrival times
+    created by Photon.exe from correlator.com.
+
+    See at the end of the file, which .dat file will be opened.
+    In console, we ask for binning time in µs and an .int file
+    is created.
+"""
+
+#import codecs, sys, win32console
+import sys
+import numpy as np                  # NumPy
+# See cython documentation for following stuff
+# "cimport" is used to import special compile-time information
+# about the numpy module (this is stored in a file numpy.pxd which is
+# currently part of the Cython distribution).
+cimport numpy as np
+# We now need to fix a datatype for our arrays. I've used the variable
+# DTYPE for this, which is assigned to the usual NumPy runtime
+# type info object.
+DTYPEuint32 = np.uint32
+DTYPEuint16 = np.uint16
+# "ctypedef" assigns a corresponding compile-time type to DTYPE_t. For
+# every type in the numpy module there's a corresponding compile-time
+# type with a _t-suffix.
+ctypedef np.uint32_t DTYPEuint32_t
+ctypedef np.uint16_t DTYPEuint16_t
+
+# Negative indices are checked for and handled correctly. The code is
+# explicitly coded so that it doesn’t use negative indices, and it (hopefully) 
+# always access within bounds. We can add a decorator to disable bounds checking:
+cimport cython
+#@cython.boundscheck(False) # turn of bounds-checking for entire function
+#def function():
+
+# Vector to use as a list
+#from libcpp.vector cimport vector
+
+
+
+#Current
+ at cython.boundscheck(False) # turn of bounds-checking for entire function
+def OpenDat(filename):
+    # Open a data file
+    """
+    We open a .dat file as produced by the "Flex02-12D" correlator in photon
+    history recorder mode.
+    The file contains the time differences between single photon events.
+
+    Returns:
+    This function makes the filename publicly available, bins a couple
+    of events to get 1e+6 points and plots them into the plotting area
+    (plotarea), using the Bin_Photon_Events() function.
+
+    Raw data file format (taken from manual):
+     1. The file records the difference in system clock ticks (1/60 us)
+        between photon event.
+     2. The first byte identifies the format of the file 8 : 8 bit, 16: 16 bit
+     3. The second byte identifies the system clock. 60MHz.
+     4. The time unit is 1/system clock.
+     5. 16 bit format. Each WORD (2 bytes) represents a photon event, 
+        time = WORD/system clock, unless the value is 0xFFFF, in which case, 
+        the following four bytes represent a photon event.
+     6. 8 bit format: Each BYTE represents a photon event unless the value is 
+        0xFF, in which case, the BYTE means 255 clock ticks passed without a 
+        photon event. For example 0A 0B FF 08 means there are three
+        photon events. The time series are 0x0A+1, 0x0B+1, 0xFF+8+1.
+
+    """
+    cdef np.ndarray[DTYPEuint16_t] Data
+    cdef np.ndarray[DTYPEuint32_t] datData
+    cdef int i, N
+    # open file
+    File = open(filename, 'rb')
+    # 1st byte: get file format
+    # should be 16 - for 16 bit
+    format = int(np.fromfile(File, dtype="uint8", count=1))
+    if format == 8:
+        # No 8 bit format supported
+        print 'Error 8 bit format not supported.'
+        return None
+    # 2nd byte: read system clock
+    system_clock = int(np.fromfile(File, dtype="uint8", count=1))
+
+    # There is an utility to convert data to 32bit. This makes life easier:
+    if format == 32:
+        datData = np.fromfile(File, dtype="uint32", count=-1)
+        return  system_clock, datData
+    # In case of 16 bit file format (assumed), read the rest of the file in
+    # 16 bit format.
+    # Load bunch of Data
+    Data = np.fromfile(File, dtype="uint16", count=-1)
+    File.close()
+
+    # Now we need to check if there are any 0xFFFF values which would
+    # mean, that we do not yet have the true data in our array.
+    # There is 32 bit data after a 0xFFFF = 65535
+    print "Searching for 32bit events."
+    occurences = np.where(Data == 65535)[0]
+    N = len(occurences)
+    print "Found "+str(N)+" 32bit events."
+    # Make a 32 bit array
+    datData = np.uint32(Data)
+
+    for i in occurences:
+        # The following two events represent the actual event
+        # Convert 2*16bit uint to 1*32bit uint:
+        datData[i] = np.uint32(Data[i+1]) + np.uint32(Data[i+2])*65536
+
+    print "Added new 32 bit array. Finishing..."
+
+    # Now delete the zeros
+    zeroids = np.zeros(N*2)
+    for i in range(N):
+        zeroids[i*2] = occurences[i]+1
+        zeroids[i*2+1] = occurences[i]+2
+    
+    datData = np.delete(datData, zeroids)
+
+    del Data
+    return system_clock, datData
+
+
+ at cython.boundscheck(False) # turn of bounds-checking for entire function
+def BinData(np.ndarray[DTYPEuint32_t] data, double t_bin, filename):
+    cdef int N = len(data)
+    BinData = []
+    time_c = 0.0                 # time counter
+    cdef int phot_c = 0                        # photon counter
+    cdef int maxphot = 0
+    cdef int j, i, emptybins, bin
+
+    dtype=np.uint16
+
+    newfilename = filename[:-4]+".int"
+
+    print "Creating file "+newfilename
+
+    NewFile = open(newfilename, 'wb')
+    TempTrace = list()
+
+    for j in range(100):
+        percent = str(j)
+        sys.stdout.write("\r Counting photons: "+percent+"%")
+        sys.stdout.flush()
+
+        for i in range(N/100):
+            i = i+N/100*j
+            time_c += data[i]
+
+            if time_c >= t_bin:
+                # Append counted photons and
+                # reset counters
+                #NewFile.write(dtype(phot_c))
+                TempTrace.append(phot_c)
+                time_c -=  t_bin
+                phot_c = 0
+                # Empty bins between this and next event:
+                emptybins = int(time_c/t_bin)
+                TempTrace += emptybins*[0]
+                time_c -=  emptybins*t_bin
+                # Equivalent to:
+                # time_c = int(time_c)%int(t_bin)
+            phot_c +=  1
+        NewFile.write(dtype(TempTrace))
+        TempTrace = list()
+
+
+    # Now write the rest:
+    for i in range(N/100*100,N-1):
+        time_c += data[i]
+        if time_c >= t_bin:
+            # Append counted photons and
+            # reset counters
+            #NewFile.write(dtype(phot_c))
+            TempTrace.append(phot_c)
+            time_c -=  t_bin
+            phot_c = 0
+            # Empty bins between this and next event:
+            emptybins = int(time_c/t_bin)
+            TempTrace += emptybins*[0]
+            time_c -=  emptybins*t_bin
+            # Equivalent to:
+            # time_c = int(time_c)%int(t_bin)
+        phot_c +=  1
+    NewFile.write(dtype(TempTrace))
+    TempTrace = list()
+
+
+
+    sys.stdout.write("\r Counting photons: 100%")
+    sys.stdout.flush()
+    sys.stdout.write("\r \r\n") # clean up stdout
+    NewFile.write(dtype(TempTrace))
+    NewFile.close()
+
+    return True
+
diff --git a/misc/dat2csv.py b/misc/dat2csv.py
new file mode 100755
index 0000000..dc3d512
--- /dev/null
+++ b/misc/dat2csv.py
@@ -0,0 +1,143 @@
+# -*- coding: utf-8 -*-
+""" Binning Data and performing Multiple Tau Algorithm
+    Paul Müller, Biotec - TU Dresden
+
+    As fast as you can get with python, binning the photon arrival times
+    created by Photon.exe from correlator.com.
+
+    See at the end of the file, which .dat file will be opened.
+    In console, we ask for binning time in µs and an .int file
+    is created.
+"""
+
+#import codecs, sys, win32console
+import argparse
+import csv
+import sys
+import numpy as np                  # NumPy
+import os
+import struct
+import tempfile
+import time
+import zipfile
+
+
+# c compiled modules
+import binningc
+import multipletauc
+
+parser = argparse.ArgumentParser()
+parser.add_argument('-w', '--tbin', type=float,
+                    help='Width of bins in us')
+parser.add_argument('input', metavar='INPUT', nargs='?', 
+                    type=str, help='Input .dat file')
+parser.add_argument('output', metavar='OUTPUT', nargs='?',
+                    type=str, help='Output .csv file')
+
+args = parser.parse_args()
+p_tbin = args.tbin
+p_infile = args.input
+p_outfile = args.output
+
+if p_infile is None:
+    # Use a standard file
+    filename = "./A488_50nMA.dat"
+    #filename = "./w01-11A.dat"
+    #filename = "./03_100s_pos4.dat"
+else:
+    filename = p_infile
+
+#system_clock = None
+# Also resets system_clock:
+a=time.time()
+system_clock, event_data = binningc.OpenDat(filename)
+print "Finding Events: "+str(time.time()-a)+"s"
+
+print "System clock: "+str(system_clock)+" MHz"
+
+if event_data is None:
+    print "Problem acquiring data."
+    exit()
+
+if p_tbin is None:
+    t_bin = float(raw_input("Enter binning time in us:"))
+else:
+    t_bin = p_tbin
+
+bintime = 1.*t_bin*system_clock
+
+
+# Creates binned file
+a=time.time()
+binningc.BinData(event_data, bintime, filename)
+print "binning time: "+str(time.time()-a)+"s"
+
+## Perform multiple tau algorithm
+# bintime from µs to s
+deltat = t_bin/1e6
+
+# File created by BinData:
+newfilename = filename[:-4]+".int"
+
+#trace = np.array(np.fromfile(newfilename, dtype="uint16", count=-1), dtype="float64")
+
+
+# Calculate autocorrelation
+a=time.time()
+G_list = multipletauc.ACFromFile(newfilename, deltat, m=128)
+print "multiple-tau time: "+str(time.time()-a)+"s"
+Trace_list = multipletauc.BinTracesFromFile(newfilename, deltat, length=700)
+print "Got traces."
+
+if p_outfile is None:
+    zipfilename = filename[:-4]+".zip"
+else:
+    zipfilename = p_outfile.strip(".zip")+".zip"
+
+Arc = zipfile.ZipFile(zipfilename, mode='w')
+returnWD = os.getcwd()
+tempdir = tempfile.mkdtemp()
+os.chdir(tempdir)
+
+for j in np.arange(len(G_list)):
+
+    # Write G to file
+    G = G_list[j]
+    if p_outfile is None:
+        csvfile = filename[:-4]+"_"+str(j)+".csv"
+    else:
+        csvfile = p_outfile.strip(".csv")+"_"+str(j)+".csv"
+
+    openedfile = open(csvfile, 'wb')
+    openedfile.write('# Created with dat2csv\r\n')
+    openedfile.write('# Paul Mueller - BIOTEC, TU Dresden\r\n')
+    openedfile.write('# Info:\r\n')
+    openedfile.write('#  Binning Time: '+str(deltat)+'s \r\n')
+    openedfile.write('#  Source file: '+filename+'\r\n')
+    openedfile.write('#  Source segment: '+str(j+1)+' of '+str(len(G_list))+'\r\n')
+    openedfile.write('# Channel (tau [s])'+" \t," 
+                                     'Correlation function'+" \r\n")
+
+    dataWriter = csv.writer(openedfile, delimiter=',')
+
+    for i in np.arange(len(G)):
+        dataWriter.writerow([str(G[i,0])+" \t", str(G[i,1])])
+
+    # Write Trace
+    T = Trace_list[j]
+    openedfile.write('#\r\n# BEGIN TRACE\r\n#\r\n')
+    openedfile.write('# Trace time [s]'+" \t," 
+                                     'Intensity trace [kHz]'+" \r\n")
+
+    for i in np.arange(len(T)):
+        dataWriter.writerow([str(T[i,0])+" \t", str(T[i,1])])
+
+    openedfile.close()
+    Arc.write(csvfile)
+    os.remove(csvfile)
+os.chdir(returnWD)
+os.removedirs(tempdir)
+
+
+
+
diff --git a/misc/setup.py b/misc/setup.py
new file mode 100755
index 0000000..f465519
--- /dev/null
+++ b/misc/setup.py
@@ -0,0 +1,18 @@
+# This file is used to compile libraries from cython code.
+# Run "python setup.py build_ext --inplace" to create those
+# libraries.
+# For more information visit cython.org.
+
+from distutils.core import setup
+from distutils.extension import Extension
+from Cython.Distutils import build_ext
+
+ext_modules = [Extension("binningc", ["binningc.pyx"]),
+              ]
+
+setup(
+  name = 'Binning Stuff',
+  cmdclass = {'build_ext': build_ext},
+  ext_modules = ext_modules
+)
+
diff --git a/pyinstaller-howto/PyScanFCS.icns b/pyinstaller-howto/PyScanFCS.icns
new file mode 100644
index 0000000..027bd47
Binary files /dev/null and b/pyinstaller-howto/PyScanFCS.icns differ
diff --git a/pyinstaller-howto/PyScanFCS.ico b/pyinstaller-howto/PyScanFCS.ico
new file mode 100644
index 0000000..48ad982
Binary files /dev/null and b/pyinstaller-howto/PyScanFCS.ico differ
diff --git a/pyinstaller-howto/PyScanFCS_linux.spec b/pyinstaller-howto/PyScanFCS_linux.spec
new file mode 100644
index 0000000..3e5c658
--- /dev/null
+++ b/pyinstaller-howto/PyScanFCS_linux.spec
@@ -0,0 +1,18 @@
+# -*- mode: python -*-
+a = Analysis(['PyScanFCS/pyscanfcs/PyScanFCS.py'],
+             pathex=['pyinstaller-2.0'],
+             hiddenimports=[],
+             hookspath=None)
+a.datas += [('doc/ChangeLog.txt', 'PyScanFCS/ChangeLog.txt', 'DATA'),
+            ('doc/PyScanFCS_doc.pdf', 'PyScanFCS/PyScanFCS_doc.pdf', 'DATA')]
+pyz = PYZ(a.pure)
+exe = EXE(pyz,
+          a.scripts,
+          a.binaries,
+          a.zipfiles,
+          a.datas,
+          name=os.path.join('dist', 'PyScanFCS'),
+          debug=False,
+          strip=None,
+          upx=True,
+          console=True )
diff --git a/pyinstaller-howto/PyScanFCS_mac.spec b/pyinstaller-howto/PyScanFCS_mac.spec
new file mode 100644
index 0000000..fdfb388
--- /dev/null
+++ b/pyinstaller-howto/PyScanFCS_mac.spec
@@ -0,0 +1,25 @@
+# -*- mode: python -*-
+a = Analysis(['pyscanfcs/PyScanFCS.py'],
+             pathex=['PyInstaller-2.1'],
+             hookspath=None)
+a.datas += [('doc/ChangeLog.txt', 'ChangeLog.txt', 'DATA'),
+            ('doc/PyScanFCS_doc.pdf', 'PyScanFCS_doc.pdf', 'DATA')]
+pyz = PYZ(a.pure)
+exe = EXE(pyz,
+          a.scripts,
+          exclude_binaries=True,
+          name='PyScanFCS',
+          debug=False,
+          strip=None,
+          upx=True,
+          console=False )
+coll = COLLECT(exe,
+               a.binaries,
+               a.zipfiles,
+               a.datas,
+               strip=None,
+               upx=True,
+               name='PyScanFCS')
+app = BUNDLE(coll,
+             name='PyScanFCS.app',
+             icon='pyinstaller-howto/PyScanFCS.icns')
diff --git a/pyinstaller-howto/PyScanFCS_win.spec b/pyinstaller-howto/PyScanFCS_win.spec
new file mode 100644
index 0000000..9ed128b
--- /dev/null
+++ b/pyinstaller-howto/PyScanFCS_win.spec
@@ -0,0 +1,21 @@
+# -*- mode: python -*-
+a = Analysis(['C:\\Python27\\PyScanFCS\\pyscanfcs\\PyScanFCS.py'],
+             pathex=['C:\\Python27\\pyinstaller-pyinstaller-6ca4af8'],
+             hiddenimports=[],
+             hookspath=None)
+a.datas += [('doc\\ChangeLog.txt', 'C:\\Python27\\PyScanFCS\\ChangeLog.txt', 'DATA'),
+            ('doc\\PyScanFCS_doc.pdf', 'C:\\Python27\\PyScanFCS\\PyScanFCS_doc.pdf', 'DATA')]
+pyz = PYZ(a.pure)
+exe = EXE(pyz,
+          a.scripts,
+          a.binaries,
+          a.zipfiles,
+          a.datas,
+          name=os.path.join('dist', 'PyScanFCS.exe'),
+          debug=False,
+          strip=None,
+          upx=True,
+          icon='C:\\Python27\\PyScanFCS\\pyinstaller-howto\\PyScanFCS.ico',
+#          console=False )
+          console=True )
+
diff --git a/pyinstaller-howto/README.md b/pyinstaller-howto/README.md
new file mode 100644
index 0000000..8a7302f
--- /dev/null
+++ b/pyinstaller-howto/README.md
@@ -0,0 +1,22 @@
+PyScanFCS - creating binaries with PyInstaller
+=========
+
+Usage
+-------------------
+
+All cython (~.pyx) files must be compiled before scripts in this directory
+can be run. In the PyScanFCS/src/ directory execute:
+
+    python compile\_cython.py build\_ext --inplace
+
+Download PyInstaller v.2.0 from http://www.pyinstaller.org/
+To create a single binary file, go to the unpacked pyinstaller directory and execute
+
+    python pyinstaller.py /Path/To/PyCorrFit.py
+
+Alternatively, there are ~.spec files and scripts for Windows XP / Ubuntu12.04 in this directory for bundling binary files.
+
+Note
+-------------------
+
+For more details, consult [PyCorrFit/pyinstaller-howto](https://github.com/paulmueller/PyCorrFit/tree/master/pyinstaller-howto).
diff --git a/pyinstaller-howto/macOSx_10.6.8_bundle_script.sh b/pyinstaller-howto/macOSx_10.6.8_bundle_script.sh
new file mode 100755
index 0000000..418446b
--- /dev/null
+++ b/pyinstaller-howto/macOSx_10.6.8_bundle_script.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+BASEDIR=$(dirname $BASH_SOURCE)
+cd $BASEDIR
+BASEDIR=$(pwd)
+cd "../"
+
+# We need to run PyScanFCS in a separate Terminal to prevent this error
+# from occuring:
+#
+# UnicodeDecodeError: 'ascii' codec can't decode byte 0xcf
+# in position 0: ordinal not in range(128)
+#
+# tags: pyinstaller app bundling wxpython
+
+python ./Pyinstaller-2.1/pyinstaller.py -y ./pyinstaller-howto/PyScanFCS_mac.spec
+
+# move aside the binary and replace with script
+
+mv ./dist/PyScanFCS.app/Contents/MacOS/PyScanFCS ./dist/PyScanFCS.app/Contents/MacOS/PyScanFCS.bin
+
+cp ./pyinstaller-howto/macOSx_script_starter.sh ./dist/PyScanFCS.app/Contents/MacOS/PyScanFCS
+
+chmod +x ./dist/PyScanFCS.app/Contents/MacOS/PyScanFCS
diff --git a/pyinstaller-howto/macOSx_script_starter.sh b/pyinstaller-howto/macOSx_script_starter.sh
new file mode 100644
index 0000000..f907864
--- /dev/null
+++ b/pyinstaller-howto/macOSx_script_starter.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+#
+# We need to run PyScanFCS in a separate Terminal to prevent this error
+# from occuring:
+#
+# UnicodeDecodeError: 'ascii' codec can't decode byte 0xcf
+# in position 0: ordinal not in range(128)
+#
+# tags: pyinstaller app bundling wxpython
+
+cd $(dirname "$0")
+open -a Terminal.app ./PyScanFCS.bin
diff --git a/pyinstaller-howto/ubuntu12.04_amd64_bundle_script.sh b/pyinstaller-howto/ubuntu12.04_amd64_bundle_script.sh
new file mode 100755
index 0000000..1c77f23
--- /dev/null
+++ b/pyinstaller-howto/ubuntu12.04_amd64_bundle_script.sh
@@ -0,0 +1,42 @@
+#!/bin/bash
+
+# **************** Change Variables Here ************
+# Directory structure:
+# ./PyScanFCS           # git repository
+# ./pyinstaller-2.0/    # Pyinstaller files
+# ./Uploads             # Binary and zip files
+PyInstaller="pyinstaller-2.0/"
+Uploads="Uploads/"
+# Progname.py should be in the Progdir
+Progname="PyScanFCS"
+# We require a ChangeLog.txt and a source directory in the Progdir
+# BASEDIR/PyScanFCS/pyinstaller-howto
+BASEDIR=$(dirname $BASH_SOURCE)
+cd $BASEDIR
+BASEDIR=$(pwd)
+cd "../../"
+StartDir=$(pwd)"/"
+Progdir=${StartDir}${Progname}"/"
+# We require a Progname_doc.tex in the source-doc directory
+DocDir=${StartDir}${Progname}"/doc/"
+PyInstallerDir=${Progdir}${PyInstaller}
+Specfile=${BASEDIR}"/"${Progname}"_linux.spec"
+echo $Specfile
+
+echo "********************************"
+echo "* Creating "${Progname}" binary *"
+echo "********************************"
+
+cd $StartDir
+
+if [ -f $Specfile ]
+then
+    # added following line (remove build directory beforehand!)
+    # a.datas += [('doc/ChangeLog.txt', '/PATH/TO/PyCorrFit/ChangeLog.txt', 'DATA')]
+    python ${PyInstallerDir}pyinstaller.py -F $Specfile
+else
+    python ${PyInstallerDir}pyinstaller.py -F ${Progdir}"src/"${Progname}".py"
+fi
+
+# make executable
+chmod +x ${Progdir}"pyinstaller-howto/dist/"${Progname}
diff --git a/pyinstaller-howto/windowsXP_32bit_bundle_script.bat b/pyinstaller-howto/windowsXP_32bit_bundle_script.bat
new file mode 100644
index 0000000..c2c0754
--- /dev/null
+++ b/pyinstaller-howto/windowsXP_32bit_bundle_script.bat
@@ -0,0 +1,4 @@
+cd C:\Python27\pyinstaller*
+del /q /s ..\PyScanFCS\pyinstaller-howto\build
+del /q /s ..\PyScanFCS\pyinstaller-howto\dist
+python pyinstaller.py ..\PyScanFCS\pyinstaller-howto\PyScanFCS_win.spec
diff --git a/pyscanfcs/PyScanFCS.py b/pyscanfcs/PyScanFCS.py
new file mode 100755
index 0000000..9d5f8fb
--- /dev/null
+++ b/pyscanfcs/PyScanFCS.py
@@ -0,0 +1,2123 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+""" 
+    PyScanFCS
+
+    Data processing for perpendicular line scanning FCS.
+
+    (C) 2012 Paul Müller
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License 
+    along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+# Generic modules
+import tempfile
+import zipfile
+import csv
+import sys
+import webbrowser
+
+## On Windows XP I had problems with the unicode Characters.
+# I found this at 
+# http://stackoverflow.com/questions/5419/python-unicode-and-the-windows-console
+# and it helped (needs to be done before import of matplotlib):
+import platform
+reload(sys)
+sys.setdefaultencoding('utf-8')
+
+import os
+import wx                               # GUI interface wxPython
+#import wx.lib.agw.pyprogress as PBusy   # Busy Dialog
+
+import matplotlib
+matplotlib.use('WXAgg')
+
+import matplotlib.cm as cm              # Color maps for plotting
+from matplotlib.figure import Figure
+from matplotlib.backends.backend_wxagg import \
+    FigureCanvasWxAgg as FigureCanvas, \
+    NavigationToolbar2WxAgg as NavigationToolbar
+
+from matplotlib.widgets import RectangleSelector, Button
+from matplotlib.patches import Rectangle
+
+import matplotlib.pyplot as plt
+
+from wx.lib.agw import floatspin        # Float numbers in spin fields
+
+#import wxmplot                          # wxmplot-0.9.7.zip (PyPI)
+
+import numpy as np                            # NumPy
+import pyfits
+from scipy.fftpack import fft
+from scipy.fftpack import fftfreq
+#import struct
+
+import edclasses
+import misc
+# SFCSnumeric needs scipy.optimize
+# We import it here, so that pyinstaller packs it into the executable.
+# Pyinstaller does not neccessarily know that SFCSnumeric needs it.
+from scipy import optimize
+import SFCSnumeric
+import multipletau
+
+import doc      # Documentation/some texts
+
+class plotarea(wx.Panel):
+    def __init__(self, parent, grandparent):
+        wx.Panel.__init__(self, parent, -1, size=(500,500))
+        # plotting area
+        self.grandparent = grandparent
+        self.figure = Figure()
+        self.canvas = FigureCanvas(self, -1, self.figure)
+        self.axes = self.figure.add_subplot(111)
+        #self.canvas.mpl_connect('button_press_event', self.on_pick)
+        self.pdata = np.linspace(0,100,100)
+        self.pdata.shape = (10,10)
+        self.image = self.axes.imshow(self.pdata, interpolation='nearest',
+                                      cmap=cm.gray, vmin=0, vmax=100)
+        self.colorbar = self.figure.colorbar(self.image)
+        #self.colorbar.set_ticks(np.arange(np.max(self.pdata)+1))
+        self.colorbar.set_label("Photon events", size=16)
+        self.toolbar = NavigationToolbar(self.canvas)
+        # Set selector:
+        self.rs = None
+        self.UseLineSelector()
+        # Layout:
+        self.vbox = wx.BoxSizer(wx.VERTICAL)
+        self.vbox.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
+        self.vbox.Add(self.toolbar, 0, wx.EXPAND)
+        self.SetSizer(self.vbox)
+        self.vbox.Fit(self)
+        
+        # Labels
+        self.axes.set_ylabel("Scan cycle time [ms]",size=16)
+        self.axes.set_xlabel("Measurement time [s]",size=16)
+
+        
+
+    def OnSelectPlot(self, eclick, erelease):
+        self.grandparent.OnSelectPlot(eclick, erelease)
+
+    
+    def UseLineSelector(self):
+        lineprops = dict(color='red', linestyle='-',
+                         linewidth = 2, alpha=0.5)
+        del self.rs
+        self.rs = RectangleSelector(self.axes, self.OnSelectPlot, drawtype='line',
+                                    lineprops=lineprops)
+    def UseRectangleSelector(self):
+        del self.rs
+        rectprops = dict(facecolor='white', edgecolor = 'red',
+                       alpha=0.2, fill=True)
+        self.rs = RectangleSelector(self.axes, self.OnSelectPlot, drawtype='box',
+                                    rectprops=rectprops)
+        
+
+
+
+
+class FFTmaxDialog(wx.Dialog):
+    def __init__(
+            self, parent, frequency, amplitude, size=wx.DefaultSize, pos=wx.DefaultPosition, 
+            style=wx.DEFAULT_DIALOG_STYLE,
+            useMetal=False,
+            ):
+        title="Find maximum of Fourier Transform"
+        wx.Dialog.__init__(self, parent, -1, title, pos, size, style)
+
+        # Dialog conent
+        # Text result
+        self.pnt = parent
+        self.ampl = amplitude/np.max(amplitude)
+        self.freq = frequency*self.pnt.system_clock*1e3
+        self.label = wx.StaticText(self, 
+        label=" Click into the plot twice to define the interval where to search for the \
+maximum. \n The data achieved will automatically be updated within the main program.\
+\n You may close this window, when you are finished.")
+        # plotting area
+        self.figure = Figure()
+        self.canvas = FigureCanvas(self, -1, self.figure)
+        self.axes = self.figure.add_subplot(111)
+
+
+        self.axes.set_xlabel('Scan cycle [ms]')
+        self.axes.set_ylabel('FFT signal')
+        # We need x to be like that, because it represents the index of self.ampl
+        #x = np.arange(len(self.ampl))
+        self.freq[0]=1
+        x = 1/self.freq
+
+        self.image = self.axes.plot(x, self.ampl, '.', color="black")
+        self.axes.set_xscale('log')
+        self.axes.grid(True, which="major")
+        self.axes.grid(True, which="minor")
+        self.axes.yaxis.grid(False)
+        self.toolbar = NavigationToolbar(self.canvas)
+        self.canvas.mpl_connect('button_press_event', self.on_pick)
+        
+        #ipshell()
+        #self.image.set_extent((self.freq[0], self.freq[1], np.min(self.ampl), np.max(self.ampl)))
+        # Make the square or else we would not see much
+        #self.plotarea.axes.set_aspect(1.*Tx/Ty)
+
+
+        # Layout:
+        self.vbox = wx.BoxSizer(wx.VERTICAL)
+        self.vbox.Add(self.label, 0, wx.EXPAND)
+        self.vbox.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
+        self.vbox.Add(self.toolbar, 0, wx.EXPAND)
+        self.SetSizer(self.vbox)
+        self.vbox.Fit(self)
+
+        self.counter = 0
+        self.ymax = np.max(self.ampl)
+        self.ymin = np.min(self.ampl)
+        self.interval = [0, 0]
+        self.red = False
+
+        # Set window icon
+        try:
+            self.MainIcon = doc.getMainIcon()
+            wx.Frame.SetIcon(self, self.MainIcon)
+        except:
+            self.MainIcon = None
+
+
+    def on_pick(self, event):
+        if ( event.inaxes == self.axes and
+             self.toolbar.mode == "" ):
+            # Let us draw some lines
+            if self.counter == 0:
+                self.line1 = self.axes.vlines(event.xdata, self.ymin, 
+                                              self.ymax, color='black')
+                self.canvas.draw()
+                self.counter = 1
+            elif self.counter == 1:
+                self.line2 = self.axes.vlines(event.xdata, self.ymin, 
+                                              self.ymax, color='black')
+                self.canvas.draw()
+                self.counter = 2
+            elif self.counter == 2:
+                self.line1._visible = False
+                self.line1 = self.axes.vlines(event.xdata, self.ymin, 
+                                              self.ymax, color='black')
+                self.canvas.draw()
+                self.counter = 3
+            elif self.counter == 3:
+                self.line2._visible = False
+                self.line2 = self.axes.vlines(event.xdata, self.ymin, 
+                                              self.ymax, color='black')
+                self.canvas.draw()
+                self.counter = 2
+            # Transform time domain xdata to index for self.ampl
+            newborder = 1/event.xdata
+            # The time domain should have large enough discretization.
+            self.interval[0] = np.argwhere(
+              (self.freq >= newborder)*(newborder > np.roll(self.freq,1)))[0][0]
+            self.interval[0], self.interval[1] = self.interval[1], self.interval[0]
+
+            if self.counter >= 2:
+            # Calculate maximum interval
+                if self.red == True:                    
+                    self.redline._visible = False
+                    self.canvas.draw()
+                self.red = True
+                [start, stop] = [int(np.min(self.interval))-1, int(np.max(self.interval))+1]
+                idx = np.argmax(self.ampl[start:stop])+start
+                # We now have the maximum, but we actually want to have some
+                # kind of a weighted maximum. For that we take k data points next
+                # to the maximum and weigth them with their relative amplitude.
+                k = 10
+                timeweights = list()
+                timeweights.append(1/self.freq[idx])
+                Pie = 1
+                for i in np.arange(k):
+                    weighta = 1.*self.ampl[idx+i+1]/self.ampl[idx]
+                    weightb = 1.*self.ampl[idx-i-1]/self.ampl[idx]
+                    timeweights.append(weighta/self.freq[idx+i+1])
+                    timeweights.append(weightb/self.freq[idx-i-1])
+                    Pie = Pie + weighta + weightb
+                    print sum(np.array(timeweights))/Pie, weighta, weightb
+
+                timeweights = np.array(timeweights)
+                #print timeweights
+                ltime = sum(timeweights)/Pie
+
+                self.pnt.t_linescan = ltime*self.pnt.system_clock*1e3
+
+                #amplitudes = self.ampl[idx-k:idx+k]
+                #frequencies = self.freq[idx-k:idx+k]
+                self.redline = self.axes.vlines(ltime, self.ymin, self.ymax, color='red')
+
+
+                ### Tried with gaussian fit
+                #amplitudes = self.ampl[start:stop]
+                #frequencies = self.freq[start:stop]
+                #argmax = np.argmax(amplitudes)
+                ## Get gaussian function and optimal parameters
+                ## popt = [freq, ampl, sigma]
+                ## gauss(popt, frequencies)
+                #popt, gauss = SFCSnumeric.FitGaussian(amplitudes, frequencies, argmax)
+                #self.pnt.t_linescan = 1./popt[0]
+                #lenplot = 1000
+                #ids_plot = np.linspace(start,stop,lenplot, endpoint=False)
+                #freq_plot = np.linspace(frequencies[0],frequencies[-1],lenplot, endpoint=False)
+                #a = np.argmax(gauss(popt, freq_plot))
+                #self.pnt.t_linescan = 1./freq_plot[a]
+                #self.redline =  self.axes.plot(ids_plot, gauss(popt, freq_plot), '-', color='red')
+
+
+                self.canvas.draw()
+                # Plot the results
+                # Set check box to True: "use cycle time"
+                self.pnt.BoxPrebin[6].SetValue(True)
+                self.pnt.Update()
+                self.pnt.OnBinning_Prebin()   
+
+
+class MyFrame(wx.Frame):
+    def __init__(self, parent, id, version):
+        self.version = version
+        wx.Frame.__init__(self, parent, id, "PyScanFCS " + self.version)
+        self.CreateStatusBar() # A Statusbar in the bottom of the window
+
+        ## Properties of the Frame
+        if sys.platform == "darwin":
+            initial_size = (1036,622)
+        else:
+            initial_size = (1024,595)
+        #initial_size = (1024,768)
+        self.SetSize(initial_size)
+        self.SetMinSize(initial_size)
+
+        # Set this, so we know in which directory we are working in.
+        # This will change, when we load a data file.
+        self.dirname = os.curdir
+        self.filename = ''
+
+        self.MakeMenu()
+
+        ## Create the initial windows
+        # When the user opens a file via file menu, the first 1e+6 datapoints
+        # will be generated (binned) and plotted. We do not need to do this, 
+        # but it makes the program more transparent. Then we will need to find
+        # the repetition time (time needed to scan one line) and bin the whole
+        # thing accordingly and plot again.
+
+        self.sp = wx.SplitterWindow(self, style=wx.SP_3DSASH)
+        self.buttonarea = wx.Panel(self.sp)
+        self.plotarea = plotarea(self.sp, self)
+        self.pdata = np.linspace(0,1,100)
+        self.pdata.shape = (10,10)
+        #self.plotarea = wxmplot.ImagePanel(self.sp)
+        #self.plotarea.display(self.pdata)
+
+        self.sp.SplitVertically(self.buttonarea, self.plotarea, 450)
+
+        self.MakeButtons()
+
+        self.Layout()
+
+        self.Show()
+
+        # Initial data values:
+        # Time values are system clock ticks
+        # System clock in MHz
+        self.system_clock = None
+        self.T_total = None
+        self.t_linescan = None
+        self.t_bin = None
+        self.datData = None
+        self.intData = None
+        self.bins_per_line = None
+        self.percent = 0. # correction factor for cycle time
+
+        # A square displayed upon selection:
+        self.square = None
+        self.squareB = None
+        # Coordinates of the square [(x1, x2), (y1,y2)]
+        self.XY_Trace_square = [ (None, None), (None, None) ]
+        self.XY_Trace_squareB = [ (None, None), (None, None) ]
+
+        # List of absolute filenames that contain bleaching info
+        self.file_bleach_profile = list()
+        
+        # We try to work with a cache to save time.
+        self.cache = dict()
+        # Each element of the cache is a filename connected to some data
+        # cachetest = self.cache["testA.dat"] = dict()
+        # cachetest["bins_per_line"] = self.bins_per_line
+        # cachetest["linetime"] = self.t_linescan
+        # cachetest["data"] = self.intData
+        self.Update()
+        # Set window icon
+        try:
+            self.MainIcon = doc.getMainIcon()
+            wx.Frame.SetIcon(self, self.MainIcon)
+        except:
+            self.MainIcon = None
+
+
+    def AddToCache(self, Data, cachename, background=False):
+        if self.cache.keys().count(cachename) == 0:
+            # Add the menu entry
+            menu = self.cachemenu.Append(wx.ID_ANY, cachename, kind=wx.ITEM_RADIO)
+            if background == False:
+                # If True, do not activate new menu.
+                menu.Check(True)
+            # OnSelectCache plots the selected Cache element
+            self.Bind(wx.EVT_MENU, self.OnSelectCache, menu)
+        acache = dict()
+        acache["data"] = 1*Data
+        acache["bins_per_line"] = self.bins_per_line
+        acache["linetime"] = self.t_linescan
+        acache["dirname"] = self.dirname
+        self.cache[cachename] = acache
+
+
+    def Bin_All_Photon_Events(self, Data):
+        """ Bin all photon events according to a binsize t_bin.
+        """
+        eb = self.BoxPrebin[10].GetValue()  # 10 spin: bin shift
+        # Now show an informing dialog
+        style=wx.PD_REMAINING_TIME|wx.PD_SMOOTH|wx.PD_AUTO_HIDE|wx.PD_CAN_ABORT
+        dlg = wx.ProgressDialog("Binning Data", "Counting photon events..."
+        , maximum = 100, parent=self, style=style)
+
+        # The box contains bins per line
+        self.bins_per_line = int(self.BoxPrebin[8].GetValue())
+        # t_bin in clock ticks
+        t_bin = self.t_linescan/self.bins_per_line
+        dtype = np.uint16
+        filename = "Binned_total.int"
+        SFCSnumeric.BinPhotonEvents(Data, t_bin, filename, dtype, dlg, binshift=eb)
+
+        binneddata = np.fromfile(filename, dtype=dtype)
+        if np.max(binneddata) < 256:
+            binneddata = np.uint8(binneddata)
+
+        return binneddata
+
+
+    def Bin_Photon_Events(self, n_events=None, t_bin=None):
+        """
+        Given an array of time differences *Data* [µs] between photon events, 
+        calculate the photon events that take place every *t_bin* in system 
+        clocks, where n_events is the number of events to use.
+        """
+        eb = self.BoxPrebin[10].GetValue()  # 10 spin: bin shift
+
+        self.t_bin = t_bin
+        # Now show an informing dialog
+        style=wx.PD_REMAINING_TIME|wx.PD_SMOOTH|wx.PD_AUTO_HIDE|wx.PD_CAN_ABORT
+        dlg = wx.ProgressDialog("Binning Data", "Counting photon events..."
+        , maximum = 100, parent=self, style=style)
+        Data = self.datData[:n_events]
+
+        # The box contains bins per line
+        self.bins_per_line = int(self.BoxPrebin[8].GetValue())
+
+        dtype = np.uint16
+        filename = "Binned_partial.int"
+        retval = SFCSnumeric.BinPhotonEvents(Data, t_bin, filename, dtype, dlg, binshift=eb)
+
+        binneddata = np.fromfile(filename, dtype=dtype)
+        if np.max(binneddata) < 256:
+            binneddata = np.uint8(binneddata)
+
+        return binneddata
+
+
+    def CorrectLineTime(self, event):
+        percent = np.float(self.linespin.GetValue())    
+        if self.t_linescan is not None:
+            # Set the new linetime
+            self.t_linescan = np.float(self.t_linescan)*(1.+percent/100.)
+            self.percent = percent
+            self.UpdateInfo()
+
+
+
+    def GetTotalTime(self):
+        """ 
+        Sums over self.datData to find out the total time of the measurement.
+        Sets variable self.T_total
+        """ 
+        # Need to set float variable here, because uint32 are not
+        # large enough. T_total in system clocks.
+        self.T_total = np.sum(self.datData, dtype="float")
+        self.Update()
+
+
+    def GetTraceFromIntData(self, intData, coords, title="Trace"):
+        """
+            region is a number describing the region the trace comes from (1 or 2)
+        """
+        ## Get the data
+        # Make sure we have the corners of the square
+        for atuple in coords:
+            if atuple[0] is None or atuple[1] is None:
+                return
+        [(x1,x2), (y1,y2)] = coords
+
+        # Convert times to positions in 2D array
+        x1 = np.floor(x1/self.t_linescan)
+        x2 = np.ceil(x2/self.t_linescan)
+        y1 = np.floor(y1/self.t_bin)
+        y2 = np.ceil(y2/self.t_bin)
+        bins_in_col = y2-y1
+        bins_in_row = x2-x1
+
+        ## Get some needed data
+        # bin time for on line in s (used for multiple tau algorithm)
+        bintime = self.t_linescan/self.system_clock/1e6
+        # Number of bins next to the maximum to use for the trace
+        num_next_max = self.Spinnumax.GetValue()
+
+        # We have to swap x and y, because we want to access
+        # the array linewise later.
+        traceData = np.zeros((bins_in_row, bins_in_col))
+
+        # We start from x1 (lowest time available) and
+        # successively fill the traceData array:
+        pos = x1*self.bins_per_line
+        for i in np.arange(len(traceData)):
+            traceData[i] = intData[pos+y1:pos+y2]
+            pos = pos + self.bins_per_line
+
+        ## Get the actual trace
+        # Calculate trace from maximum
+        traceDataMaxids = np.argmax(traceData, axis=1)
+        newtraceData = np.zeros((len(traceDataMaxids), num_next_max*2+1))
+
+        for i in np.arange(len(traceData)):
+            # We add to the new trace data array, such that the maximum of
+            # each line is at the center of the array.
+            maid = traceDataMaxids[i]
+            # The array to be written to newtraceData
+            nsli = np.zeros(num_next_max*2+1)
+            nsli[num_next_max] = traceData[i][maid]
+            for k in np.arange(num_next_max)+1:
+                if maid+1-k >= 0:
+                    nsli[num_next_max-k] = traceData[i][maid-k]
+                if maid+1+k <= len(traceData[i]):
+                    nsli[num_next_max+k] = traceData[i][maid+k]
+            newtraceData[i] = nsli
+        del traceDataMaxids
+
+
+        if self.CheckBoxCountrateFilter.GetValue() is True:
+            # "temporal detection profile"
+            # We use this to find out how much time we spent in the membrane
+            detprof = np.sum(newtraceData, axis=0)
+
+            # Countrate correction:
+            x = np.linspace(-num_next_max, +num_next_max, len(detprof))
+            popt, gauss = SFCSnumeric.FitGaussian(detprof, x, np.argmax(detprof))
+            # Time in bins, that the focus effectively was inside the membrane:
+            # Go two sigmas in each direction. This way we have an averaged
+            # cpp in the end.
+            MembraneBins = 4*popt[2]
+            LinetimeBins = self.bins_per_line
+
+            #tracemean = np.mean(newtraceData)
+            self.TraceCorrectionFactor=LinetimeBins/MembraneBins
+
+            if self.MenuVerbose.IsChecked():
+                x2 = np.linspace(popt[0]-4*popt[2], popt[0]+4*popt[2], 100)
+                plt.figure()
+                plt.subplot(111)
+                plt.plot(x, detprof, "-", label="Measured profile")
+                plt.plot(x2, gauss(popt,x2), "-", label="Gaussian fit")
+                plt.legend()
+                text = "sigma = "+str(popt[2])+ " bins\n" +\
+                       "residence time in bins: "+str(MembraneBins)+"\n" +\
+                       u"residence time [µs]: "+str(MembraneBins*bintime*1e6/
+                                                    self.bins_per_line)
+                coords = (MembraneBins, np.max(detprof)/2.)
+                plt.text(coords[0],coords[1],text)
+                plt.xlabel("Bin position relative to maximum in cycle time")
+                plt.ylabel("Sum of counted photons (whole trace)")
+                plt.title(title + " - Determination of residence time in membrane")
+                plt.show()
+        else:
+            self.TraceCorrectionFactor=1.
+
+
+        # We could multiply newtraceData with self.TraceCorrectionFactor right
+        # here, but we are not doing it, because it might introduce numerical
+        # errors. This does not change statistics. In order to get the correct
+        # countrate, we correct the traces, when they are binned for saving
+        # in .csv files.
+        newtraceData = np.sum(newtraceData, axis=1)
+        traceData = newtraceData
+
+
+        # Bleach filter?
+        if self.CheckBoxBleachFilter.GetValue() is True:
+            ltrb = len(traceData)
+            ## Perform bleaching correction
+            # fitted function:
+            # f_i = f_0 * exp(-t_i/t_0) + offset
+            # parms = [f_0, t_0, offset]
+            # Corrected function:
+            # F_c = F_i/(f_0*exp(-ti/(2*t_0))) + f_0*(1-f_0*exp(-t_i/(2*t_0)))
+            # We don't want to subtract an offset from the trace?
+            # The offset is actually background signal.
+            popt, expfunc = SFCSnumeric.FitExp(np.arange(len(traceData)),
+                                               traceData)
+            [f_0, t_0] = popt
+
+            newtrace = SFCSnumeric.ReduceTrace(traceData, bintime,
+                                               length=500)
+
+            # Full trace:
+            ti = np.arange(ltrb)
+            expfull = np.exp(-ti/(2*t_0))
+            # see formula above:
+            traceData = traceData/expfull + f_0*(1-expfull)
+
+            #### TODO:
+            # Does this do anything?
+            newtracecorr = SFCSnumeric.ReduceTrace(traceData, bintime,
+                                                   length=500)
+            
+            fitfuncdata = expfunc(popt, np.arange(ltrb))
+            newtracefit = SFCSnumeric.ReduceTrace(fitfuncdata,
+                                                  bintime, length=500)
+
+            # Bleaching profile to temporary file
+            # Create a temporary file and open it
+            filename = tempfile.mktemp(".csv",
+                                  "PyScanFCS_bleach_profile_{}_".format(
+                                               title.replace(" ", "_")))
+            outfile = open(filename, 'wb')
+            outfile.write("# This is not correlation data.\r\n")
+            outfile.write("# {} - bleaching correction\r\n".format(title))
+            outfile.write("# I = ({:.2e})*exp[-t / (2*({:.2e})) ]\r\n".format(f_0,t_0))
+            outfile.write("# {}\t{}\t{}\t{}\r\n".format(u"Time t [s]",
+                    u"Measured trace [kHz]", u"Exponential fit I [kHz]",
+                    u"Corrected trace [kHz]"))
+            dataWriter = csv.writer(outfile, delimiter='\t')
+            # we will write
+            xexp = newtrace[:,0]
+            yexp = newtrace[:,1]*self.TraceCorrectionFactor
+            yfit = newtracefit[:,1]*self.TraceCorrectionFactor
+            ycorr = newtracecorr[:,1]*self.TraceCorrectionFactor
+            data = [xexp, yexp, yfit, ycorr]
+            for i in np.arange(len(data[0])):
+                # row-wise, data may have more than two elements per row
+                datarow = list()
+                for j in np.arange(len(data)):
+                    rowcoli = str("%.10e") % data[j][i]
+                    datarow.append(rowcoli)
+                dataWriter.writerow(datarow)
+            outfile.close()
+            self.file_bleach_profile.append(filename)
+
+            if self.MenuVerbose.IsChecked():
+                def view_bleach_profile(e=None):
+                    ## Open the file
+                    if platform.system().lower() == 'windows':
+                        os.system("start /b "+filename)
+                    elif platform.system().lower() == 'linux':
+                        os.system("xdg-open "+filename+" &")
+                    elif platform.system().lower() == 'darwin':
+                        os.system("open "+filename+" &")
+                    else:
+                        # defaults to linux style:
+                        os.system("xdg-open "+filename+" &")
+                # Show a plot
+
+                #fig, ax = plt.figure()
+                #ax = plt.subplot(111)
+                fig, ax = plt.subplots()
+                plt.subplots_adjust(bottom=0.2)
+                plt.title(title + " - bleaching correction")
+                plt.xlabel("Measurement time t [s]")
+                plt.ylabel("approx. Intensity I [kHz]")
+                plt.plot(xexp, yexp, '-', 
+                         label = "Measured trace", color="gray")
+                plt.plot(xexp, yfit, '-', 
+                         label = "Exponential fit", color="red")
+                plt.plot(xexp, ycorr, '-', 
+                         label = "Corrected trace", color="blue")
+                xt = np.min(xexp)
+                yt = np.min(yexp)
+                text = "I = ({:.2e})*exp[-t / (2*({:.2e})) ]".format(f_0,t_0)
+                plt.text(xt,yt,text, size=12)
+                plt.legend()
+                plt.show()
+                
+                # We would like to have a button for the view_bleach_profile
+                # function. Unfortunately, this does not work:
+                #axgb = plt.axes([0.75, 0.05, 0.15, 0.05])
+                #buttonbleach = Button(axgb, 'view data')
+                #buttonbleach.on_clicked(view_bleach_data)
+                view_bleach_profile()
+        return traceData
+
+
+    def MakeButtons(self):
+        minsize = (150,-1)
+        dropminsize = (175,-1)
+        ## Pre-binning
+        prebox = wx.StaticBox(self.buttonarea, label="Pre-binning")
+        presizer = wx.StaticBoxSizer(prebox, wx.VERTICAL)
+        # Checkbox for later using the cycle time
+        precheck = wx.CheckBox(self.buttonarea, label="Use cycle time")
+        precheck.Bind(wx.EVT_CHECKBOX, self.Update)
+        precheck.IsChecked = False
+        presizer.Add(precheck)
+        # Text bins per line
+        prebplt = wx.StaticText(self.buttonarea, -1, "Bins per scan cycle:")
+        presizer.Add(prebplt)  
+        # Bins per line
+        self.prebpl = wx.SpinCtrl(self.buttonarea, -1, min=1, max=50000,
+                                  value="70")
+        self.prebpl.SetMinSize(minsize)
+        presizer.Add(self.prebpl)  
+        # Text bins
+        pretext = wx.StaticText(self.buttonarea, -1, "No. of events to use:")
+        presizer.Add(pretext)  
+        # Spin bins
+        prespin = wx.SpinCtrl(self.buttonarea, -1, min=100,
+                              max=500000000, value="1000")
+        prespin.SetMinSize(minsize)
+        presizer.Add(prespin)    
+        # Text tbin
+        pretextt = wx.StaticText(self.buttonarea, -1, u"Bin width [µs]:")
+        presizer.Add(pretextt)
+        # Spin tbin
+        prespint = edclasses.FloatSpin(self.buttonarea, value="5.0")
+        prespint.SetMinSize(minsize)
+        presizer.Add(prespint)  
+        # Text binfshift
+        preshifttextt = wx.StaticText(self.buttonarea, -1, "Bin shift:")
+        presizer.Add(preshifttextt)   
+        # Spin shift bins
+        prespinshift = wx.SpinCtrl(self.buttonarea, -1, min=0,
+                                   max=500000000, value="0")
+        prespinshift.SetMinSize(minsize)
+        presizer.Add(prespinshift)   
+        # Button
+        prebutt = wx.Button(self.buttonarea, label="Calculate and plot")
+        self.Bind(wx.EVT_BUTTON, self.OnBinning_Prebin, prebutt)
+        presizer.Add(prebutt)
+        self.BoxPrebin = list()
+        self.BoxPrebin.append(prebox)       # 0 box
+        self.BoxPrebin.append(pretext)      # 1 text: enter # events to use
+        self.BoxPrebin.append(prespin)      # 2 spin: how many bins to bin
+        self.BoxPrebin.append(pretextt)     # 3 text: enter bind width 
+        self.BoxPrebin.append(prespint)     # 4 spin: bin time
+        self.BoxPrebin.append(prebutt)      # 5 button
+        self.BoxPrebin.append(precheck)     # 6 checkbox: use linetime
+        self.BoxPrebin.append(prebplt)      # 7 text: bins per line
+        self.BoxPrebin.append(self.prebpl)  # 8 spin: bins per line
+        self.BoxPrebin.append(preshifttextt)  # 9 text: bin shift
+        self.BoxPrebin.append(prespinshift)  # 10 spin: bin shift
+
+
+        ## Total-binning
+        binbox = wx.StaticBox(self.buttonarea, label="Total-binning")
+        binsizer = wx.StaticBoxSizer(binbox, wx.VERTICAL)
+        # Some informative text
+        bintext = wx.StaticText(self.buttonarea, -1, "Bin entire file.")
+        binsizer.Add(bintext)
+        # OK button
+        binbutt = wx.Button(self.buttonarea, label="Calculate and plot all")
+        self.Bind(wx.EVT_BUTTON, self.OnBinning_Total, binbutt)
+        binsizer.Add(binbutt)
+        self.BoxBinTotal = [binbox, bintext, binbutt]
+
+
+        ## Mode
+        modebox = wx.StaticBox(self.buttonarea, label="Mode")
+        modesizer = wx.StaticBoxSizer(modebox, wx.VERTICAL)
+        # Some informative text
+        bintext = wx.StaticText(self.buttonarea, -1, "Type of measurement.")
+        modesizer.Add(bintext)
+        # Dropdown mode selection
+        Modelist = ["1 colour 1 focus", "2 colours 1 focus", "1 colour 2 foci",
+                    "2 colours 2 foci", "Alternating excitation"] 
+        self.ModeDropDown = wx.ComboBox(self.buttonarea, -1, "", (15, 30),
+                         wx.DefaultSize, Modelist, wx.CB_DROPDOWN)
+        self.ModeDropDown.SetMinSize(dropminsize)
+        self.ModeDropDown.SetSelection(0)
+        self.Bind(wx.EVT_COMBOBOX, self.Update, self.ModeDropDown)
+        modesizer.Add(self.ModeDropDown)
+        # Save trace checkbox
+        self.CheckBoxSaveTrace = wx.CheckBox(self.buttonarea, -1,
+             label="Save raw traces")
+        self.CheckBoxSaveTrace.SetValue(False)
+        modesizer.Add(self.CheckBoxSaveTrace)
+        
+        
+        ## Data
+        infobox = wx.StaticBox(self.buttonarea, label="Data")
+        insizer = wx.StaticBoxSizer(infobox, wx.VERTICAL)
+        sclock = wx.StaticText(self.buttonarea, -1,
+                               "System clock [MHz]: \t \t")
+        insizer.Add(sclock)
+        totalt = wx.StaticText(self.buttonarea, -1,
+                               "Total time [s]:  \t \t")
+        insizer.Add(totalt)
+        linet = wx.StaticText(self.buttonarea, -1, "Scan cycle [ms]:")
+        insizer.Add(linet)
+        linetdropdown = wx.ComboBox(self.buttonarea, -1, "", (15, 30),
+                         wx.DefaultSize, [], wx.CB_DROPDOWN)
+        linetdropdown.SetMinSize(dropminsize)
+        insizer.Add(linetdropdown)
+        self.Bind(wx.EVT_COMBOBOX, self.OnLinetimeSelected,
+                  linetdropdown)
+        self.Bind(wx.EVT_TEXT, self.OnLinetimeSelected, linetdropdown)
+        # Do not change order of BoxInfo!!
+        self.BoxInfo = [sclock, totalt, linetdropdown, infobox, linet]
+        
+        
+        ## Scan cycle periodicity
+        lscanbox = wx.StaticBox(self.buttonarea,
+                                label="Scan cycle periodicity")
+        lscansizer = wx.StaticBoxSizer(lscanbox, wx.VERTICAL)
+        # Magic checkbox
+        lscanmagic = wx.CheckBox(self.buttonarea,
+                                 label="Find automagically")
+        lscanmagic.SetValue(True)
+        lscansizer.Add(lscanmagic)
+        # OK button
+        lscanbutt = wx.Button(self.buttonarea,
+                              label="Find periodicity (FFT)")
+        self.Bind(wx.EVT_BUTTON, self.OnFindLineScanTime, lscanbutt)
+        lscansizer.Add(lscanbutt)
+        self.BoxLineScan = [lscanbox, lscanmagic, lscanbutt]
+
+
+        ## Image selection
+        # Add radio buttons that change behavior of mouse in Plot
+        userbox = wx.StaticBox(self.buttonarea, label="Image selection")
+        usizer = wx.StaticBoxSizer(userbox, wx.VERTICAL)
+        self.RbtnLinet = wx.RadioButton (self.buttonarea, -1,
+                   'Scan cycle correction % +/-: ', style = wx.RB_GROUP)
+        self.linespin = floatspin.FloatSpin(self.buttonarea, digits=10,
+                                      increment=.001)
+        self.linespin.SetMinSize(minsize)
+        self.linespin.Bind(wx.EVT_SPINCTRL, self.CorrectLineTime)
+        self.RbtnSelect = wx.RadioButton (self.buttonarea, -1,
+                                          'Select region 1')
+        self.RbtnSelectB = wx.RadioButton (self.buttonarea, -1,
+                                           'Select region 2')
+        self.RbtnLinet.SetValue(True)
+        self.Bind(wx.EVT_RADIOBUTTON, self.OnRadioSelector,
+                  self.RbtnSelect)
+        self.Bind(wx.EVT_RADIOBUTTON, self.OnRadioSelector,
+                  self.RbtnSelectB)
+        self.Bind(wx.EVT_RADIOBUTTON, self.OnRadioSelector,
+                  self.RbtnLinet)
+        # version 0.2.2: Add button "full measurement time"
+        fullmeasbutt = wx.Button(self.buttonarea,
+                              label="Full measurement time")
+        self.Bind(wx.EVT_BUTTON, self.OnSetFullMeasTime, fullmeasbutt)
+        usizer.Add(self.RbtnLinet)
+        usizer.Add(self.linespin)
+        usizer.Add(self.RbtnSelect)
+        usizer.Add(self.RbtnSelectB)
+        usizer.Add(fullmeasbutt)
+        self.BoxImageSelection = [userbox, self.RbtnLinet,
+         self.linespin, self.RbtnSelect, self.RbtnSelectB, fullmeasbutt]
+
+
+        ## Correlation
+        corrbox = wx.StaticBox(self.buttonarea, label="Correlation")
+        corrsizer = wx.StaticBoxSizer(corrbox, wx.VERTICAL)
+        # Add switch for 
+        # how many bins next to a maximum should be used for the trace
+        corrsizerText1 = wx.StaticText(self.buttonarea, 
+                     label="Span +/-:")
+        corrsizer.Add(corrsizerText1)
+        self.Spinnumax = wx.SpinCtrl(self.buttonarea, -1, min=0,
+                                     max=50000, value="3")
+        self.Spinnumax.SetMinSize(minsize)
+        corrsizer.Add(self.Spinnumax)
+        # Add switch for slicing of trace
+        corrsizerText3 = wx.StaticText(self.buttonarea, 
+                     label="No. of trace slices:")
+        corrsizer.Add(corrsizerText3)
+        self.Spinslice = wx.SpinCtrl(self.buttonarea, -1, min=1,
+                                     max=50000, value="10")
+        self.Spinslice.SetMinSize(minsize)
+        corrsizer.Add(self.Spinslice)
+        # Trace
+        # Switch for bleaching correction
+        self.CheckBoxBleachFilter = wx.CheckBox(self.buttonarea, -1,
+             label="Bleach filter")
+        self.CheckBoxBleachFilter.SetValue(True)
+        corrsizer.Add(self.CheckBoxBleachFilter)
+        # Switch for countrate correction
+        self.CheckBoxCountrateFilter = wx.CheckBox(self.buttonarea, -1,
+             label="Countrate filter")
+        self.CheckBoxCountrateFilter.SetValue(False)
+        corrsizer.Add(self.CheckBoxCountrateFilter)
+        # Add switch for m
+        # m is the parameter that defines the number of channels
+        # after which the the intensity trace is binned (neighboring
+        # pixels are combined) for calculation of the
+        # correlation function on a semi-logarithmic scale. 
+        corrsizerText2 = wx.StaticText(self.buttonarea, 
+                     label=u"M.-τ parameter m:")
+        corrsizer.Add(corrsizerText2)
+        self.Spinm = wx.SpinCtrl(self.buttonarea, -1, min=16, max=50000,
+                                 value="16")
+        self.Spinm.SetMinSize(minsize)
+        corrsizer.Add(self.Spinm)
+        ## Multiple Tau
+        # Get Autocorrelation function
+        taubutt = wx.Button(self.buttonarea, label="Get correlation")
+        self.Bind(wx.EVT_BUTTON, self.OnMultipleTau, taubutt)
+        corrsizer.Add(taubutt)
+        self.BoxMultipleTau = [self.CheckBoxBleachFilter, corrbox,
+              corrsizerText3, corrsizerText1, self.Spinnumax,
+              corrsizerText2, self.Spinm, self.Spinslice, taubutt,
+              self.CheckBoxCountrateFilter]
+
+
+        ## Set sizes
+        firlist = [presizer, binsizer, modesizer]
+        firmin = 100
+        for abox in firlist:
+            firmin = max(abox.GetMinSize()[0], firmin)
+        for abox in firlist:
+            abox.SetMinSize((firmin, -1))
+        seclist = [corrsizer, usizer, lscansizer, insizer]
+        secmin = 100
+        for abox in seclist:
+            secmin = max(abox.GetMinSize()[0], secmin)
+        for abox in seclist:
+            abox.SetMinSize((secmin, -1))
+
+
+        ## Put everything together
+        self.firvert = wx.BoxSizer(wx.VERTICAL)
+        self.firvert.Add(presizer)
+        self.firvert.AddSpacer(5)
+        self.firvert.Add(binsizer)
+        self.firvert.AddSpacer(5)
+        self.firvert.Add(modesizer)
+        self.secvert = wx.BoxSizer(wx.VERTICAL)
+        self.secvert.Add(insizer)
+        self.secvert.AddSpacer(5)
+        self.secvert.Add(lscansizer)
+        self.secvert.AddSpacer(5)
+        self.secvert.Add(usizer)
+        self.secvert.AddSpacer(5)
+        self.secvert.Add(corrsizer)
+        self.firhorz = wx.BoxSizer(wx.HORIZONTAL)
+        self.firhorz.AddSpacer(5)
+        self.firhorz.Add(self.firvert)
+        self.firhorz.AddSpacer(5)
+        self.firhorz.Add(self.secvert)
+        self.buttonarea.SetSizer(self.firhorz)
+
+
+    def MakeMenu(self):
+        ## Setting up the menus.
+        filemenu = wx.Menu()
+        self.cachemenu = wx.Menu()
+        prefmenu = wx.Menu()
+        helpmenu = wx.Menu()
+
+        # wx.ID_ABOUT and wx.ID_EXIT are standard IDs provided by wxWidgets.
+        # filemenu
+        menuOpenDat = filemenu.Append(wx.ID_OPEN, "&Open photon events .dat file", 
+ "Opens a correlator file (.dat) that contains photon arrival time differences")
+        menuOpenFits = filemenu.Append(wx.ID_ANY, "Open .&fits file", 
+                              "Opens a previously binned intensity file (.fits)")
+        self.menuSaveDat = filemenu.Append(wx.ID_ANY, "&Save 32 bit .dat file", 
+              "Saves photon arrival time difference data in 32 bit file format")
+        self.menuSaveFits = filemenu.Append(wx.ID_SAVE, "&Save .fits file", 
+                                 "Saves binned intensity data into a .fits file")
+        filemenu.AppendSeparator()
+        menuExit = filemenu.Append(wx.ID_EXIT,"E&xit", "Terminate the program")
+
+        # prefmenu
+        self.MenuVerbose = prefmenu.Append(wx.ID_ANY, "Verbose mode",
+                            "Enables/Disables output of additional information.",
+                            kind=wx.ITEM_CHECK)
+        # Check by default
+        self.MenuVerbose.Check()
+
+        menuDocu = helpmenu.Append(wx.ID_ANY, "&Documentation",
+                                    "PyCorrFit documentation")
+        menuWiki = helpmenu.Append(wx.ID_ANY, "&Wiki",
+                          "PyCorrFit wiki pages by users for users (online)")
+        menuUpdate = helpmenu.Append(wx.ID_ANY, "&Update",
+                                    "Check for new version"+
+                                     " (Web access required)")
+        helpmenu.AppendSeparator()
+        menuSoftw = helpmenu.Append(wx.ID_ANY, "&Software used",
+                                    "Information about software used by this program")
+        menuAbout = helpmenu.Append(wx.ID_ABOUT, "&About",
+                                    "Information about this program")
+
+        # Creating the menubar.
+        self.menuBar = wx.MenuBar()
+        self.menuBar.Append(filemenu,"&File") # Adding the "filemenu" to the MenuBar
+        self.menuBar.Append(self.cachemenu,"&Cache") 
+        self.menuBar.Append(prefmenu,"&Preferences")
+        self.menuBar.Append(helpmenu,"&Help")
+
+        self.SetMenuBar(self.menuBar)  # Adding the MenuBar to the Frame content.
+        
+        ## Set events
+        #File
+        self.Bind(wx.EVT_MENU, self.OnMenuExit, menuExit)
+        self.Bind(wx.EVT_MENU, self.OnOpenDat, menuOpenDat)
+        self.Bind(wx.EVT_MENU, self.OnOpenFits, menuOpenFits)
+        self.Bind(wx.EVT_MENU, self.OnSaveDat, self.menuSaveDat)
+        self.Bind(wx.EVT_MENU, self.OnSaveFits, self.menuSaveFits)
+
+        # Help
+        self.Bind(wx.EVT_MENU, self.OnMenuAbout, menuAbout)
+        self.Bind(wx.EVT_MENU, self.OnMenuUpdate, menuUpdate)
+        self.Bind(wx.EVT_MENU, self.OnMenuSoftware, menuSoftw)
+        self.Bind(wx.EVT_MENU, self.OnMenuDocumentation, menuDocu)
+        self.Bind(wx.EVT_MENU, self.OnMenuWiki, menuWiki)
+
+
+
+
+    def OnBinning_Prebin(self, event=None):
+        """ Do prebinngin using *Bin_Photon_Events()* """
+        n_events = self.BoxPrebin[2].GetValue()
+        if self.BoxPrebin[6].GetValue() == False:
+            # from µs tp system clock ticks
+            t_bin = self.BoxPrebin[4].GetValue() * self.system_clock
+            ## If, reset previously achieved things. # - Why?
+            # self.t_linescan = None
+            self.Update()
+        else:
+            # Calculate t_bin through number of bins per line and cycle time
+            self.bins_per_line = self.BoxPrebin[8].GetValue()
+            t_bin = 1.0 * self.t_linescan / self.bins_per_line
+        # First we need to reset the linetime correction to zero
+        self.linespin.SetValue(0)
+        # Calculate binned data
+        self.intData = self.Bin_Photon_Events(n_events=n_events, t_bin=t_bin)
+
+        # Add to cache
+        self.AddToCache(self.intData, self.filename)
+
+
+        # Then Plot the data somehow
+        self.Update()
+        self.PlotImage()    
+
+
+    def OnBinning_Total(self, event=None):
+        if self.BoxPrebin[6].GetValue() == False:
+            # from µs to system clock ticks
+            t_bin = self.BoxPrebin[4].GetValue() * self.system_clock
+            # If, reset previously achieved things
+            self.t_linescan = None
+            self.Update()
+        else:
+            # Calculate t_bin through number of bins per line and cycle time
+            self.bins_per_line = self.BoxPrebin[8].GetValue()
+            t_bin = 1.0 * self.t_linescan / self.bins_per_line
+        self.t_bin = t_bin
+        # First we need to reset the linetime correction to zero
+        self.linespin.SetValue(0)
+        # Calculate binned data
+        self.intData = self.Bin_All_Photon_Events(self.datData)
+
+        # Add to cache
+        self.AddToCache(self.intData, self.filename)
+
+        # Then Plot the data somehow
+        self.PlotImage()
+
+
+    def OnFindLineScanTime(self, event):
+        """
+        Find the time that the confocal microscope uses to capture a line
+        of data. This is done via FFT.
+        """
+        # Fourier Transform
+        cnData = fft(self.intData)
+        N = len(cnData)
+        # We only need positive/negative frequencies
+        amplitude = np.abs(cnData[0:N/2]*np.conjugate(cnData[0:N/2]))
+        #n_bins = len(self.intData)
+
+        # Calculate the correct frequencies
+        rate = 1./self.t_bin
+        frequency = fftfreq(N)[0:N/2] * rate
+
+        if self.BoxLineScan[1].GetValue() == True:
+            # Find it automagically
+            # The first big maximum is usually the second maximum
+            idx = np.argmax(amplitude[10:])+10
+            # The first maximum is what we want ERROR
+            idx2 = np.argmax(amplitude[10:idx-30])+10
+            # Sometimes the first one was ok.
+            if 0.1*amplitude[idx] > amplitude[idx2]:
+                idx2 = idx
+            # We now have the maximum, but we actually want to have some
+            # kind of a weighted maximum. For that we take k data points next
+            # to the maximum and weigth them with their relative amplitude.
+            k = 10
+            timeweights = list()
+            timeweights.append(1/frequency[idx2])
+            Pie = 1
+            for i in np.arange(k):
+                weighta = amplitude[idx2+i+1]/amplitude[idx2]
+                weightb = amplitude[idx2-i-1]/amplitude[idx2]
+                timeweights.append(weighta/frequency[idx2+i+1])
+                timeweights.append(weightb/frequency[idx2-i-1])
+                Pie = Pie + weighta + weightb
+
+            timeweights = np.array(timeweights)
+            ltime = np.sum(timeweights, dtype="float")/Pie
+            self.t_linescan = ltime
+            # Plot the results (not anymore, we do a low_prebin)
+            #self.PlotImage()
+            # Set Checkbox value to True: "use cycle time"
+            self.BoxPrebin[6].SetValue(True)
+            self.Update()
+            self.OnBinning_Prebin()
+        else:
+            # Pop up a dialog with the fourier transform of the function
+            # (log -plot) and let user decide which maximum to use.
+            dlg = FFTmaxDialog(self, frequency, amplitude)
+            dlg.Show()
+
+
+    def OnLinetimeSelected(self, e=None):
+        Dropdown = self.BoxInfo[2]
+        Text = Dropdown.GetValue()
+        test = Text.split(".", 1)
+        for item in test:
+            if not item.isdigit():
+                return
+        Value = np.float(Text)
+        #sel = Dropdown.GetSelection()
+        elements = list()
+        for factor in [0.25, 0.5, 1.0, 2.0, 4]:
+            elements.append(str(np.float(Value*factor)))
+        Dropdown.SetItems(elements)
+        Dropdown.SetSelection(2)
+        #self.dropdown.SetSelection(0)
+        # Translate selected time to clockticks
+        # Value = self.t_linescan*1e-3/self.system_clock
+        if self.system_clock is None:
+            sysclck = 60
+        else:
+            sysclck = self.system_clock
+        # Avoid making str to float conversion errors?
+        # Use the second element, which is in the middle. (!!)
+        self.t_linescan = np.float(elements[2])*1e3*sysclck
+        self.BoxPrebin[6].Enable()
+        #self.Update()
+
+
+    def OnMenuAbout(self, event):
+        # Show About Information
+        description = doc.description()
+        licence = doc.licence()
+        info = wx.AboutDialogInfo()
+        #info.SetIcon(wx.Icon('hunter.png', wx.BITMAP_TYPE_PNG))
+        info.SetName('PyScanFCS')
+        info.SetVersion(self.version)
+        info.SetDescription(description)
+        info.SetCopyright('(C) 2012 Paul Müller')
+        info.SetWebSite('http://pyscanfcs.craban.de')
+        info.SetLicence(licence)
+        info.AddDeveloper('Paul Müller')
+        info.AddDocWriter('Paul Müller')
+        wx.AboutBox(info)
+
+
+    def OnMenuDocumentation(self, e=None):
+        """ Get the documentation and view it with browser"""
+        filename = doc.GetLocationOfDocumentation()
+        if filename is None:
+            # Now we have to tell the user that there is no documentation
+            self.StatusBar.SetStatusText("...documentation not found.")
+        else:
+            self.StatusBar.SetStatusText("...documentation: "+filename)
+            if platform.system().lower() == 'windows':
+                os.system("start /b "+filename)
+            elif platform.system().lower() == 'linux':
+                os.system("xdg-open "+filename+" &")
+            elif platform.system().lower() == 'darwin':
+                os.system("open "+filename+" &")
+            else:
+                # defaults to linux style:
+                os.system("xdg-open "+filename+" &")
+
+
+    def OnMenuExit(self,e):
+        # Exit the Program
+        self.Close(True)  # Close the frame.
+
+
+    def OnMenuSoftware(self, event):
+        # Show About Information
+        text = doc.SoftwareUsed()
+        wx.MessageBox(text, 'Software', wx.OK | wx.ICON_INFORMATION)
+
+
+    def OnMenuUpdate(self, event):
+        misc.Update(self)
+
+
+    def OnMenuWiki(self, e=None):
+        """ Go to the GitHub Wiki page"""
+        webbrowser.open(doc.GitWiki)
+
+    def OnMultipleTau(self, e=None):
+        """ Perform a multiple tau algorithm.
+            We sneak in a plt.plot here and there
+            so the user can take a look at the results.
+        """
+        # Reset the bleaching profile
+        self.file_bleach_profile = list()
+        wx.BeginBusyCursor()
+        ## Dirty, but makes it shorter. We need the namespace:
+        def SaveAC(Gtype, traceData):
+            for i in np.arange(num_traces):
+                usedTrace = traceData[i*NM:(i+1)*NM]
+                # Get the tail for the last trace
+                if i == num_traces -1:
+                    usedTrace = traceData[i*NM:]
+                # Calculate AC function and trace with human readable length
+                G = multipletau.autocorrelate(usedTrace,
+                                    m=m, deltat=bintime, normalize=True)
+                if self.MenuVerbose.IsChecked():
+                    plt.figure(0)
+                    plt.plot(G[:,0], G[:,1], "-")
+                ## Correction that finds the correct countrate
+                # self.TraceCorrectionFactor is 1.0, if the user
+                # did not check the "countrate filter"
+                usedTrace = usedTrace*self.TraceCorrectionFactor
+                trace = SFCSnumeric.ReduceTrace(usedTrace,
+                                                bintime, length=700)
+                # Save Correlation function
+                csvfile = filenamedummy+"_"+Gtype+"_"+str(i+1)+".csv"
+                self.SaveCSVFile(G, trace, csvfile, i+1, num_traces, Type=Gtype)
+                Arc.write(csvfile)
+                os.remove(csvfile)
+
+        def SaveCC(Gtype, tracea, traceb, swaptraces):
+            for i in np.arange(num_traces):
+                usedTa = tracea[i*NM:(i+1)*NM]
+                usedTb = traceb[i*NM:(i+1)*NM]
+                # Get the tail for the last trace
+                if i == num_traces -1:
+                    usedTa = tracea[i*NM:]
+                    usedTb = traceb[i*NM:]
+                G = multipletau.correlate(usedTa, usedTb,
+                                    m=m, deltat=bintime, normalize=True)
+                if self.MenuVerbose.IsChecked():
+                    plt.figure(0)
+                    plt.plot(G[:,0], G[:,1], "--")
+                ## Correction that finds the correct countrate
+                # self.TraceCorrectionFactor is 1.0, if the user
+                # did not check the "countrate filter"
+                usedTa = usedTa*self.TraceCorrectionFactor
+                usedTb = usedTb*self.TraceCorrectionFactor
+                tra = SFCSnumeric.ReduceTrace(usedTa,
+                                              bintime, length=700)
+                trb = SFCSnumeric.ReduceTrace(usedTb,
+                                              bintime, length=700)
+                # In order to keep trace1 trace1 and trace2 trace2, we
+                # need to swap here:
+                if swaptraces == True:
+                    tra, trb = trb, tra
+                # Save Correlation function
+                csvfile = filenamedummy+"_"+Gtype+"_"+str(i+1)+".csv"
+                self.SaveCSVFile(G, tra, csvfile, i+1, num_traces, 
+                                 Type=Gtype, secondtrace=trb)
+                Arc.write(csvfile)
+                os.remove(csvfile)
+
+
+        ## Get some needed data
+        # bin time in s (for the correlation function)
+        bintime = self.t_linescan/self.system_clock/1e6
+        # m value for multiple tau algorithm
+        m = self.Spinm.GetValue()
+        # Number of traces to slice the big trace into
+        num_traces = self.Spinslice.GetValue()
+        # Number of bins next to the maximum to use for the trace
+        num_next_max = self.Spinnumax.GetValue()
+        # Whether full traces should be saved in separate files
+        save_trace = self.CheckBoxSaveTrace.GetValue()
+
+        # Define zip file name
+        # filenamedummy is a non-wildcard filename
+        wildcards = ["A.dat", ".dat", "A.fits", ".fits"]
+        filenamedummy = self.filename
+        for card in wildcards:
+            lwc = len(card)
+            if self.filename[-lwc:] == card:
+                filenamedummy = self.filename[:-lwc]
+        zipfilename = os.path.join(self.dirname, filenamedummy)+".zip"
+
+        OURMODE = self.ModeDropDown.GetSelection()
+        # 0: 1 colour 1 focus   A
+        # 1: 2 colours 1 focus  A+B
+        # 2: 1 colour 1 foci    A
+        # 3: Quad               A+B
+        # 4: Pie                A+B
+
+        if OURMODE != 0 and OURMODE != 2:
+            # Bin the second file or check for a .fits file
+            if self.filename[-6:] == "A.fits":
+                # Open fits file and load second intData
+                filename = self.filename[:-6]+"B.fits"
+                fits = pyfits.open(os.path.join(self.dirname, filename))
+                series = fits[0]
+                intData2 = series.data
+                # Set proper 1D shape for intdata
+                length = self.intData2.shape[0] * self.intData2.shape[1]
+                intData2.shape = length
+            elif self.filename[-5:] == "A.dat":
+                # Check if we have B.dat in the cache
+                # 
+                # Open B.dat file
+                filename = self.filename[:-5]+"B.dat"
+                try:
+                    bcache = self.cache[filename]
+                    if (bcache["dirname"] != self.dirname or 
+                        bcache["bins_per_line"] != self.bins_per_line or 
+                        bcache["linetime"] != self.t_linescan):
+                        # We are in the wrong directory
+                        raise KeyError
+                except KeyError:
+                    # Open B.dat and add to cache
+                    filenames = os.path.join(self.dirname, filename)
+                    style = wx.PD_APP_MODAL|wx.PD_ELAPSED_TIME|wx.PD_CAN_ABORT
+                    dlg2 = wx.ProgressDialog("Processing 2nd file", 
+                           "Finding 32 bit events...", parent=self, style=style)
+                    system_clock, datData2 = SFCSnumeric.OpenDat(filenames, dlg2)
+                    dlg2.Destroy()
+                    # Bin to obtain intData2
+                    intData2 = self.Bin_All_Photon_Events(datData2)
+                    # Add to cache
+                    self.AddToCache(intData2, filename, background=True)
+                else:
+                    intData2 = 1*bcache["data"]
+                    
+            else:
+                # We should not be here.
+                print "No A.dat or A.fits file opened. Aborting."
+                return
+
+        # Start plotting?
+        if self.MenuVerbose.IsChecked():
+            plt.figure(0)
+            axc = plt.subplot(111)
+
+        # Create .zip archive
+        Arc = zipfile.ZipFile(zipfilename, mode='w')
+        returnWD = os.getcwd()
+        tempdir = tempfile.mkdtemp()
+        os.chdir(tempdir)
+
+        ### 1 color 1 focus
+        if self.ModeDropDown.GetSelection() == 0:
+            traceData = self.GetTraceFromIntData(self.intData, self.XY_Trace_square)
+            # Variable *SaveAC* will need.
+            NM = int(np.floor(len(traceData)/num_traces))
+            traces = [traceData]
+            ## Get autocorrelation functions of splitted trace
+            Gtype = "AC_A1"
+            SaveAC(Gtype, traceData)
+
+        ### 2 colour 1 focus
+        elif self.ModeDropDown.GetSelection() == 1:
+            traceData1 = self.GetTraceFromIntData(self.intData, 
+                                        self.XY_Trace_square, title="Region A1")
+            NM = int(np.floor(len(traceData1)/num_traces))
+            traceData2 = self.GetTraceFromIntData(intData2,
+                                        self.XY_Trace_square, title="Region B1")
+            ## Get autocorrelation functions of splitted trace
+            traces = [traceData1, traceData2]
+            # Save Autocorrelation
+            for j in np.arange(len(traces)):
+                traceData = traces[j]
+                if j == 0:
+                    Gtype = "AC_A1"
+                else: # j==1
+                    Gtype = "AC_B1"
+                SaveAC(Gtype, traceData)
+            # Save Cross correlation
+            for j in np.arange(len(traces)):
+                if j == 0:
+                    Gtype = "CC_A1B1"
+                    tracea = traces[0]
+                    traceb = traces[1]
+                    swaptraces = False
+                else: # j==1
+                    Gtype = "CC_B1A1"
+                    tracea = traces[1]
+                    traceb = traces[0]
+                    swaptraces = True
+                SaveCC(Gtype, tracea, traceb, swaptraces)
+
+
+        ## 1 Colour 2 Foci
+        elif self.ModeDropDown.GetSelection() == 2:
+            traceData1 = self.GetTraceFromIntData(self.intData, 
+                                        self.XY_Trace_square, title="Region A1")
+            NM = int(np.floor(len(traceData1)/num_traces))
+            traceData2 = self.GetTraceFromIntData(self.intData,
+                                       self.XY_Trace_squareB, title="Region A2")
+            ## Get autocorrelation functions of splitted trace
+            traces = [traceData1, traceData2]
+            # Save Autocorrelation
+            for j in np.arange(len(traces)):
+                traceData = traces[j]
+                if j == 0:
+                    Gtype = "AC_A1"
+                else: # j==1
+                    Gtype = "AC_A2"
+                SaveAC(Gtype, traceData)
+
+            # Save Cross correlation
+            for j in np.arange(len(traces)):
+                if j == 0:
+                    Gtype = "CC_A1A2"
+                    tracea = traces[0]
+                    traceb = traces[1]
+                    swaptraces = False
+                else: # j==1
+                    Gtype = "CC_A2A1"
+                    tracea = traces[1]
+                    traceb = traces[0]
+                    swaptraces = True
+                SaveCC(Gtype, tracea, traceb, swaptraces)
+
+        ## Quad
+        elif self.ModeDropDown.GetSelection() == 3:
+            traceData1 = self.GetTraceFromIntData(self.intData,
+                                       self.XY_Trace_square, title="Region A1")
+            NM = int(np.floor(len(traceData1)/num_traces))
+            traceData2 = self.GetTraceFromIntData(self.intData,
+                                       self.XY_Trace_squareB, title="Region A2")
+            traceData3 = self.GetTraceFromIntData(intData2,
+                                       self.XY_Trace_square, title="Region B1")
+            traceData4 = self.GetTraceFromIntData(intData2,
+                                       self.XY_Trace_squareB, title="Region B2")
+            ## Get autocorrelation functions of splitted trace
+            traces = [traceData1, traceData2, traceData3, traceData4]
+            Gtypes = ["AC_A1", "AC_A2", "AC_B1", "AC_B2"]
+            # Save Autocorrelation
+            for j in np.arange(len(traces)):
+                traceData = traces[j]
+                Gtype = Gtypes[j]
+                SaveAC(Gtype, traceData)
+
+            # Save Cross correlation
+            Gtypes = ["A1", "A2", "B1", "B2"]
+            for j in np.arange(4):
+                for k in np.arange(4):
+                    if j != k:
+                        Gtype = "CC_"+Gtypes[j]+Gtypes[k]
+                        tracea = traces[j]
+                        traceb = traces[k]
+                        if j < k:
+                            swaptraces = False
+                        else:
+                            swaptraces = True
+                        SaveCC(Gtype, tracea, traceb, swaptraces)
+
+        ## PIE
+        elif self.ModeDropDown.GetSelection() == 4:
+            traceData1 = self.GetTraceFromIntData(self.intData,
+                                       self.XY_Trace_square, title="Region A1")
+            NM = int(np.floor(len(traceData1)/num_traces))
+            traceData2 = self.GetTraceFromIntData(intData2,
+                                       self.XY_Trace_squareB, title="Region B2")
+            ## Get autocorrelation functions of splitted trace
+            traces = [traceData1, traceData2]
+            # Save Autocorrelation
+            for j in np.arange(len(traces)):
+                traceData = traces[j]
+                if j == 0:
+                    Gtype = "AC_A1"
+                else: # j==1
+                    Gtype = "AC_B2"
+                SaveAC(Gtype, traceData)
+
+            # Save Cross correlation
+            for j in np.arange(len(traces)):
+                if j == 0:
+                    Gtype = "CC_A1B2"
+                    tracea = traces[0]
+                    traceb = traces[1]
+                    swaptraces = False
+                else: # j==1
+                    Gtype = "CC_B2A1"
+                    tracea = traces[1]
+                    traceb = traces[0]
+                    swaptraces = True
+                SaveCC(Gtype, tracea, traceb, swaptraces)
+
+        # Add bleaching profile files
+
+        for bleach_file in self.file_bleach_profile:
+            olddir = os.getcwd()
+            os.chdir(os.path.dirname(bleach_file))
+            try:
+                Arc.write(os.path.basename(bleach_file))
+            except:
+                pass
+            os.chdir(olddir)
+        
+        os.chdir(returnWD)
+        os.removedirs(tempdir)
+        Arc.close()
+
+        if self.MenuVerbose.IsChecked():
+            plt.figure(0)
+            plt.semilogx()
+            plt.ylabel('Correlation')
+            plt.xlabel('Lag time [s]')
+            plt.show()
+
+        ## Save all the traces
+        if save_trace == True:
+            for i in np.arange(len(traces)):
+                filename = filenamedummy + "_"+str(i)+".txt"
+                filename = os.path.join(self.dirname, filename)
+                openedfile = open(filename, 'wb')
+                openedfile.write('# This file was created using PyScanFCS v.'+\
+                                  self.version+"\r\n")
+                openedfile.write("# Source file: "+filenamedummy+"\r\n")
+                openedfile.write("# linetime [s]: "+str(bintime)+"\r\n")
+                openedfile.write("# bins per line: "+
+                                  str(self.bins_per_line)+"\r\n")
+                openedfile.write("# bins used per line: "+
+                                  str(2*num_next_max+1)+"\r\n")
+                for j in np.arange(len(traces[i])):
+                    openedfile.write(str(traces[i][j])+"\r\n")
+
+        wx.EndBusyCursor()
+
+          
+
+    def OnOpenFits(self,e):
+        # Open a data file
+        """Import experimental data from a file."""
+        dlg = wx.FileDialog(self, "Choose a fits file", self.dirname, "", 
+              "FITS files (*.fits)|*.Fits;*.FITS;*.fits",
+              wx.OPEN)
+        # user cannot do anything until he clicks "OK"
+        if dlg.ShowModal() == wx.ID_OK:
+        
+            # Workaround for Ubuntu 12.10 since 0.2.0
+            (self.dirname, self.filename) = os.path.split(dlg.GetPath())
+            #self.filename = dlg.GetFilename()
+            #self.dirname = dlg.GetDirectory()
+     
+            fits = pyfits.open(os.path.join(self.dirname, self.filename))
+            series = fits[0]
+            self.imgData = None
+            self.intData = series.data
+            self.datData = None
+
+
+            # Set all variables
+            head = series.header
+
+            self.system_clock = head['SysClck']
+            try:
+                self.T_total = head['Total']
+            except KeyError:
+                self.T_total = None
+            try:
+                self.t_linescan = head['Tline']
+            except KeyError:
+                # Old "line scanning time" has new name: "scan cycle time"
+                self.t_linescan = head['Tcycle']
+            self.t_bin = head['Tbin']
+            try:
+                eb = head['Binshift']
+            except KeyError:
+                pass
+            else:
+                self.BoxPrebin[10].SetValue(eb)
+
+            self.bins_per_line = len(self.intData[0])
+            self.prebpl.SetValue(self.bins_per_line)
+
+            # Plot
+            # Set proper 1D shape for intdata
+            length = self.intData.shape[0] * self.intData.shape[1]
+            self.intData.shape = length
+            self.Update()
+            self.PlotImage()
+
+
+
+    #Current
+    def OnOpenDat(self,e):
+        # Open a data file
+        """
+        We open a .dat file as produced by the "Flex02-12D" correlator in photon
+        history recorder mode.
+        The file contains the time differences between single photon events.
+
+        Returns:
+        This function makes the filename publicly available, bins a couple
+        of events to get 1e+6 points and plots them into the plotting area
+        (self.plotarea), using the Bin_Photon_Events() function.
+
+        Raw data file format (taken from manual):
+         1. The file records the difference in system clock ticks (1/60 us)
+            between photon event.
+         2. The first byte identifies the format of the file 8 : 8 bit, 16: 16 bit
+         3. The second byte identifies the system clock. 60MHz.
+         4. The time unit is 1/system clock.
+         5. 16 bit format. Each WORD (2 bytes) represents a photon event, 
+            time = WORD/system clock, unless the value is 0xFFFF, in which case, 
+            the following four bytes represent a photon event.
+         6. 8 bit format: Each BYTE represents a photon event unless the value is 
+            0xFF, in which case, the BYTE means 255 clock ticks passed without a 
+            photon event. For example 0A 0B FF 08 means there are three
+            photon events. The time series are 0x0A+1, 0x0B+1, 0xFF+8+1.
+
+        """
+        # File Dialog
+        dlg = wx.FileDialog(self, "Choose a data file", self.dirname, "", 
+              "DAT files (*.dat)|*.dat;*.daT;*.dAt;*.dAT;*.Dat;*.DaT;*.DAt;*.DAT",
+              wx.OPEN)
+        # user cannot do anything until he clicks "OK"
+        if dlg.ShowModal() == wx.ID_OK:
+            # Workaround for Ubuntu 12.10 since 0.2.0
+            (self.dirname, self.filename) = os.path.split(dlg.GetPath())
+            #self.filename = dlg.GetFilename()
+            #self.dirname = dlg.GetDirectory()
+            filename = os.path.join(self.dirname, self.filename)
+            style = wx.PD_APP_MODAL|wx.PD_ELAPSED_TIME|wx.PD_CAN_ABORT
+            dlg2 = wx.ProgressDialog("Processing file", "Finding 32 bit events..."
+            , parent=self, style=style)
+            self.system_clock, self.datData = SFCSnumeric.OpenDat(filename, dlg2)
+            dlg2.Destroy()
+            self.GetTotalTime()
+            self.Update()
+
+
+    def OnRadioSelector(self, e=None):
+        # Define what style of selector will be used in plot.
+        if self.RbtnLinet.Value == True:
+            self.plotarea.UseLineSelector()
+        else:
+            self.plotarea.UseRectangleSelector()
+        self.Update()
+
+
+    def OnSaveFits(self,e):
+        # Save the Data
+        """ Save binned data as a 2d array (image) """
+        if self.filename[-4:] == ".dat":
+            newfilename = self.filename[:-4]+".fits"
+        else:
+            newfilename = ""
+        dlg = wx.FileDialog(self, "Choose a data file", self.dirname, newfilename, 
+              "FITS files (*.fits)|*.Fits;*.FITS;*.fits",
+           wx.SAVE|wx.FD_OVERWRITE_PROMPT)
+        # user cannot do anything until he clicks "OK"
+        if dlg.ShowModal() == wx.ID_OK:
+            # Workaround for Ubuntu 12.10 since 0.2.0
+            (self.dirname, newfilename) = os.path.split(dlg.GetPath())
+            #newfilename = dlg.GetFilename()
+            #self.dirname = dlg.GetDirectory()
+            # Creating image array
+            M = len(self.intData)
+            Ny = self.bins_per_line 
+            Nx = int(M/Ny)+1
+            # Plotting data will have some zeros at the end
+            plotdata = np.zeros(Nx*Ny)
+            # Check for maximum in self.intData
+            maxint = np.max(self.intData)
+            if maxint < 256:
+                plotdata = np.uint8(plotdata)
+                plotdata[0:M] = np.uint8(self.intData)
+            else:
+                plotdata[0:M] = self.intData
+            plotdata.shape = (Nx,Ny)
+            hdu = pyfits.PrimaryHDU(plotdata)
+            hdulist = pyfits.HDUList([hdu])
+            header = hdulist[0].header
+            # Add some constants:
+            cards = []
+            cards.append(pyfits.Card('SysClck', self.system_clock,
+                                "System clock [MHz]"))
+            if self.T_total is not None:
+                cards.append(pyfits.Card('Total', self.T_total,
+                               "Total time in system clock ticks"))
+            if self.t_linescan is not None:
+                t_linescan = self.t_linescan
+            else:
+                t_linescan = self.t_bin*len(self.imgData)
+
+            cards.append(pyfits.Card('Tcycle', t_linescan,
+                               "Time for each linescan in system clock ticks"))
+            cards.append(pyfits.Card('Tbin', self.t_bin,
+                               "Time for each bin in system clock ticks"))
+            eb = self.BoxPrebin[10].GetValue()
+            cards.append(pyfits.Card('Binshift', eb,
+                               "Empty bins before actual binning of data"))            
+  
+            for c in cards:
+                c.verify()
+                header.update(c.key, c.value, c.comment)
+            # clobber=True: Overwrites file.
+            hdulist.writeto(os.path.join(self.dirname, newfilename), clobber=True)
+
+
+    def OnSaveDat(self,e):
+        # Save the Data
+        """
+        Save experimental data as 32bit format.
+
+        Raw data file format:
+         1. The file records the difference in system clock ticks (1/60 us)
+            between photon events.
+         2. The first byte identifies the format of the file: 32 bit
+         3. The second byte identifies the system clock: usually 60MHz.
+         4. The time unit is 1/system clock.
+         5. 32 bit format. 4 bytes represent a photon event, 
+            time = 4 bytes/system clock
+        """
+        # Make a reasonable 32bit filename
+        if self.filename[-5:] == "A.dat":
+            newfilename = self.filename[:-5]+"_32bit_A.dat"
+        elif self.filename[-5:] == "B.dat":
+            newfilename = self.filename[:-5]+"_32bit_B.dat"
+        else:
+            newfilename = self.filename[:-4]+"_32bit.dat"
+        dlg = wx.FileDialog(self, "Choose a data file", self.dirname, newfilename, 
+              "DAT files (*.dat)|*.dat;*.daT;*.dAt;*.dAT;*.Dat;*.DaT;*.DAt;*.DAT",
+           wx.SAVE|wx.FD_OVERWRITE_PROMPT)
+        # user cannot do anything until he clicks "OK"
+        if dlg.ShowModal() == wx.ID_OK:
+            # Workaround for Ubuntu 12.10 since 0.2.0
+            (self.dirname, newfilename) = os.path.split(dlg.GetPath())
+            #newfilename = dlg.GetFilename()
+            #self.dirname = dlg.GetDirectory()
+            NewFile = open(os.path.join(self.dirname, newfilename), 'wb')
+            newformat = np.uint8(32)
+            newclock = np.uint8(self.system_clock)
+            NewFile.write(newformat)
+            NewFile.write(newclock)
+            self.datData.tofile(NewFile)
+            NewFile.close()
+
+
+    def OnSelectPlot(self, eclick, erelease):
+        # Define what will happen upon clicking on the plot.
+        if self.RbtnLinet.Value == True:
+            self.OnSelectLineTime(eclick, erelease)
+        else:
+            self.OnSelectRegion(eclick, erelease)
+        self.Update()
+
+
+
+    def OnSelectCache(self, e=None):
+        for item in self.cachemenu.GetMenuItems():
+            if item.IsChecked():
+                cachename = item.GetLabel()
+        cache=self.cache[cachename]
+        self.BoxPrebin[8].SetValue(cache["bins_per_line"])
+        self.bins_per_line = cache["bins_per_line"]
+        linetime = cache["linetime"]
+        if linetime is not None:
+            self.BoxInfo[2].SetValue(str(linetime/self.system_clock/1e3))
+        self.t_linescan = linetime
+        self.intData = 1*cache["data"]
+        self.filename = cachename
+        self.dirname = cache["dirname"]
+        filename = os.path.join(self.dirname, self.filename)
+        style = wx.PD_APP_MODAL|wx.PD_ELAPSED_TIME|wx.PD_CAN_ABORT
+        dlg2 = wx.ProgressDialog("Processing file", "Finding 32 bit events..."
+        , parent=self, style=style)
+        self.system_clock, self.datData = SFCSnumeric.OpenDat(filename, dlg2)
+        dlg2.Destroy()
+        self.GetTotalTime()
+        self.Update()
+        self.PlotImage()
+
+
+    def OnSelectLineTime(self, eclick, erelease):
+
+        y1 = eclick.ydata
+        y2 = erelease.ydata
+        Tx1 = eclick.xdata
+        Tx2 = erelease.xdata
+
+        if Tx1 == Tx2:
+            return
+
+        # Since x and y ahve different scales, we need to
+        # multiply the y-part with 1e3 to get ms instead of s.
+        #
+        # See in PlotImage below:
+        #Tx = self.t_bin*Nx/self.system_clock/1e3
+        #Ty = Tx*Ny/1e3
+        #
+        x1 = 1e3*Tx1
+        x2 = 1e3*Tx2
+
+
+        if x1 > x2:
+            y2, y1 = y1, y2
+            x1, x2 = x2, x1
+
+        # Calculate correction factor
+        delta = (y2-y1)/(x2-x1)
+        # Calculate how much percent that is
+        percent = delta*100.
+
+        self.linespin.SetValue(np.float(percent))
+        self.percent = percent
+        self.CorrectLineTime(event=None)
+
+
+    def OnSelectRegion(self, eclick=None, erelease=None, fullMT=False):
+        """ Internally sets the region in the kymograph
+            
+            `eclick` and `erelease` are matplotlib events on a plot
+            
+            if `fulMT` is True and `eclick` and `erelease` are None,
+            then the x-values are overridden and old y-values are used.
+        """
+
+        if eclick is None and erelease is None and fullMT is True:
+            # try to get data from two sources:
+            if self.RbtnSelect.Value == True:
+                try:
+                    (y1,y2) = self.XY_Trace_square[1]
+                    # Line_time [ms] - convert to ms from (us and clock ticks)
+                    y1 /= 1e3 * self.system_clock
+                    y2 /= 1e3 * self.system_clock
+                except:
+                    pass
+            else:
+                try:
+                    (y1,y2) = self.XY_Trace_squareB[1]
+                    # Line_time [ms] - convert to ms from (us and clock ticks)
+                    y1 /= 1e3 * self.system_clock
+                    y2 /= 1e3 * self.system_clock
+                except:
+                    pass
+            if (y1, y2) == (None, None):
+                (y1, y2) = self.plotarea.axes.get_ylim()
+            # Get absolute x values
+            (x1, x2) = self.plotarea.axes.get_xlim()
+        else:
+            x1 = eclick.xdata
+            x2 = erelease.xdata
+            y1 = eclick.ydata
+            y2 = erelease.ydata
+
+        # Sort values
+        if x1 > x2:
+            x1, x2 = x2, x1
+        elif x1 == x2:
+            x2 = x1+1
+        if y1 > y2:
+            y1, y2 = y2, y1
+        elif y1 == y2:
+            y2 = y1+1
+
+        # Set the values of the corresponding spin controls
+        # To Do
+
+        # We have to distinguish between yellow and cyan square.
+        # self.square: yellow square
+        # self.square2: cyan square
+        if self.RbtnSelect.Value == True:
+            square = self.square
+            oldsquare = self.squareB
+            square_color = "yellow"
+            oldsquare_color = "cyan"
+            oldcoords = self.XY_Trace_squareB
+        else:
+            square = self.squareB
+            oldsquare = self.square
+            square_color = "cyan"
+            oldsquare_color = "yellow"
+            oldcoords = self.XY_Trace_square
+
+        # We should also plot it
+        if square is not None:
+            # Remove the old same coloured square
+            square.remove()
+        square = Rectangle( (x1,y1), abs(x2-x1), abs(y2-y1), 
+                                alpha = 0.1, color=square_color)
+        self.plotarea.axes.add_patch(square)
+
+
+        # Adjust the old square:
+        if oldsquare is not None:
+            oldsquare.remove()
+            oldsquare = None
+        if oldcoords[1] == (None,None):
+            (yn1, yn2) = (y1, y2)
+        else:
+            (yn1, yn2) = oldcoords[1]
+            yn1 *= 1e-3/self.system_clock
+            yn2 *= 1e-3/self.system_clock
+        
+        if self.ModeDropDown.GetSelection() > 1:
+
+            oldsquare = Rectangle( (x1,yn1), abs(x2-x1), abs(yn2-yn1), 
+                                alpha = 0.1, color=oldsquare_color)
+            self.plotarea.axes.add_patch(oldsquare)
+
+        self.plotarea.canvas.draw()
+
+        # Convert values to array indices and make public.
+        # Total_time [s] (convert to us and then to clock ticks)
+        x1 = (x1*1e6 * self.system_clock) 
+        x2 = (x2*1e6 * self.system_clock)
+        # Line_time [ms] (convert to us and then to clock ticks)
+        y1 = (y1*1e3 * self.system_clock) 
+        y2 = (y2*1e3 * self.system_clock)
+
+
+        if self.RbtnSelect.Value == True:
+            self.square = square
+            self.XY_Trace_square = [ (x1, x2), (y1,y2) ]
+            self.squareB = oldsquare
+            if oldsquare is not None:
+                self.XY_Trace_squareB[0] = (x1, x2)
+            
+        else:
+            self.squareB = square
+            self.XY_Trace_squareB = [ (x1, x2), (y1,y2) ]
+            self.square = oldsquare
+            if oldsquare is not None:
+                self.XY_Trace_square[0] = (x1, x2)
+
+
+    def OnSetFullMeasTime(self, e=None):
+        """ Sets the full range of the measurement time
+        """
+        self.OnSelectRegion(fullMT=True)
+
+
+    def PlotImage(self):
+        """
+            Plot self.intData. If not enough information about
+            e.g. cycle time is given we have to guess the dimensions
+            of the plot.
+        """
+        M = len(self.intData)
+        self.bins_per_line = Ny = self.BoxPrebin[8].GetValue()
+        Nx = int(np.floor(M/Ny))
+        # This checkbox is False, if we do not want to use t_linescan
+        # to set the length of a line.
+        if self.BoxPrebin[6].GetValue() == False:
+            # from µs to system clock ticks
+            t_bin = self.BoxPrebin[4].GetValue() * self.system_clock
+        else:
+            t_bin = self.t_linescan / self.bins_per_line
+        # This is a fast way of slicing our 1D intData array to a shorter
+        # plottable 2D array.
+        if Nx > Ny:
+            # Number of lines we have to jump over
+            P = Nx/Ny
+            Nx = P * Ny
+            plotdata = np.zeros((Ny,Ny))
+            MAX = Nx*Ny
+
+            for bin in np.arange(Ny):
+                # Take every P'th element in Nx direction
+                plotdata[bin] = self.intData[bin:MAX+bin:Ny*P]
+
+
+        else:
+            # We are lucky
+            plotdata = self.intData[:Nx*Ny]
+            plotdata.shape = (Nx,Ny)
+            plotdata = plotdata.transpose()
+
+
+        self.plotarea.image.set_data(plotdata)
+        # Set labels x [ms] and y[s]
+        Ty = self.t_bin*Ny/1e3/self.system_clock
+        Tx = Ty*Nx/1e3
+        self.plotarea.image.set_extent((0, Tx, Ty, 0))
+        # Make the square or else we would not see much
+        self.plotarea.axes.set_aspect(1.*Tx/Ty)
+
+        vmin = np.min(plotdata)
+        vmax = np.max(plotdata)
+        self.plotarea.colorbar.set_clim(vmin, vmax)
+        self.plotarea.colorbar.vmin = vmin
+        self.plotarea.colorbar.vmax = vmax
+        self.plotarea.colorbar.update_normal(self.plotarea.image)
+        self.plotarea.colorbar.set_ticks(np.arange(vmax+1), update_ticks=True)
+        self.plotarea.canvas.draw()
+
+        self.imgData = plotdata
+
+
+    def SaveCSVFile(self, G, trace, csvfile, num=1, num_traces=1, Type="AC",
+                    secondtrace=None):
+
+        openedfile = open(csvfile, 'wb')
+        openedfile.write('# This file was created using PyScanFCS v.'+\
+                         self.version+"\r\n")
+        openedfile.write("# Source file \t"+self.filename+"\r\n")
+        openedfile.write("# Source slice \t"+str(num)+" of "+str(num_traces)+"\r\n")
+        openedfile.write('# Channel (tau [s]) \t Correlation function \r\n')
+        if Type[:2] == "CC":
+            openedfile.write("# Type AC/CC \t Cross-Correlation "+Type[2:]+"\r\n")
+        else:
+            openedfile.write("# Type AC/CC \t Autocorrelation "+Type[2:]+"\r\n")
+        dataWriter = csv.writer(openedfile, delimiter='\t')
+        for i in np.arange(len(G)):
+            dataWriter.writerow([str(G[i,0])+" \t", str(G[i,1])])
+        openedfile.write('# BEGIN TRACE \r\n')
+        openedfile.write('# Time ([s]) \t Intensity Trace [kHz] \r\n')
+        for i in np.arange(len(trace)):
+            dataWriter.writerow([ str("%.10e")%trace[i,0], str("%.10e")%trace[i,1] ])
+
+        if secondtrace is not None:
+            openedfile.write('#\r\n# BEGIN SECOND TRACE \r\n')
+            openedfile.write('# Time ([s]) \t Intensity Trace [kHz] \r\n')
+            for i in np.arange(len(trace)):
+                dataWriter.writerow([ str("%.10e")%secondtrace[i,0], 
+                                      str("%.10e")%secondtrace[i,1] ])   
+
+        openedfile.close()
+
+
+    def Update(self, e=None):
+        self.UpdateInfo()
+        ### Box Prebin
+        #self.BoxPrebin.append(prebox)       # 0 box
+        #self.BoxPrebin.append(pretext)      # 1 text: enter # events to use
+        #self.BoxPrebin.append(prespin)      # 2 spin: how many bins to bin
+        #self.BoxPrebin.append(pretextt)     # 3 text: enter bin width 
+        #self.BoxPrebin.append(prespint)     # 4 spin: bin time
+        #self.BoxPrebin.append(prebutt)      # 5 button
+        #self.BoxPrebin.append(precheck)     # 6 checkbox: use linetime
+        #self.BoxPrebin.append(prebplt)      # 7 text: bins per line
+        #self.BoxPrebin.append(self.prebpl)  # 8 spin: bins per line
+        if self.datData is not None:
+            self.menuSaveDat.Enable(True)
+            for item in self.BoxPrebin:
+                item.Enable()
+            for item in self.BoxInfo:
+                item.Enable()
+            if self.t_linescan is not None:
+                for item in self.BoxBinTotal:
+                    item.Enable()
+            else:
+                for item in self.BoxBinTotal:
+                    item.Disable()
+        if self.t_linescan is not None:
+            # This means a linetime has been found
+            self.BoxPrebin[6].Enable()
+            #self.BoxPrebin[6].SetValue(True)
+        else:
+            self.BoxPrebin[6].Disable()
+            self.BoxPrebin[6].SetValue(False)
+        checked = self.BoxPrebin[6].GetValue()
+        if checked == True:
+            self.BoxPrebin[3].Disable()
+            self.BoxPrebin[4].Disable()
+        else:
+            self.BoxPrebin[3].Enable()
+            self.BoxPrebin[4].Enable()
+        # If no data is present, do not enable anything
+        if self.datData is None:
+            self.menuSaveDat.Enable(False)
+            for item in self.BoxPrebin:
+                item.Disable()
+            for item in self.BoxBinTotal:
+                item.Disable()
+            for item in self.BoxInfo:
+                item.Disable()
+
+
+        ### Box scan cycle time / Image Selection / Save Fits
+        if self.intData is None:
+            self.menuSaveFits.Enable(False)
+            for item in self.BoxLineScan:
+                item.Disable()
+            for item in self.BoxImageSelection:
+                item.Disable()
+        else:
+            self.menuSaveFits.Enable(True)
+            for item in self.BoxLineScan:
+                item.Enable()
+            for item in self.BoxImageSelection:
+                item.Enable()
+
+        ### Modes
+        if self.ModeDropDown.GetSelection() > 1 and self.intData is not None:
+            self.RbtnSelectB.Enable()
+        else:
+            self.RbtnSelectB.Disable()
+
+
+        ### MultipleTau Box
+        if self.square is None:
+            for item in self.BoxMultipleTau:
+                item.Disable()
+        else:
+            for item in self.BoxMultipleTau:
+                item.Enable()
+
+
+    def UpdateInfo(self):
+        # Initial data values:
+
+        if self.system_clock is not None:
+            self.BoxInfo[0].SetLabel("System clock [MHz]: "+str(self.system_clock))
+            if self.T_total is not None:
+                # This means a file has been opened
+                self.BoxInfo[1].SetLabel("Total time [s]: "+
+                                 str(self.T_total*1e-6/self.system_clock)[0:10])
+        if self.t_linescan is not None:
+            # This means a linetime has been found
+            self.BoxInfo[2].SetValue(str(self.t_linescan*1e-3/self.system_clock))
+            self.OnLinetimeSelected()
+
+
+## VERSION
+version = doc.__version__
+__version__ = version
+
+print doc.info(version)
+
+## Start gui
+def Main():
+    app = wx.App(False)
+    frame = MyFrame(None, -1, version)
+    app.MainLoop()
+
+
+if __name__ == "__main__":
+    Main()
diff --git a/pyscanfcs/SFCSnumeric.pyx b/pyscanfcs/SFCSnumeric.pyx
new file mode 100755
index 0000000..a47806c
--- /dev/null
+++ b/pyscanfcs/SFCSnumeric.pyx
@@ -0,0 +1,308 @@
+# -*- coding: utf-8 -*-
+""" 
+    PyScanFCS
+    
+    Binning Data for Multiple Tau Algorithm
+
+    As fast as you can get with python, binning the photon arrival times
+    created by Photon.exe from correlator.com.
+
+    See at the end of the file, which .dat file will be opened.
+    In console, we ask for binning time in µs and an .int file
+    is created.
+    
+    (C) 2012 Paul Müller
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License 
+    along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+#import codecs, sys, win32console
+import sys
+import numpy as np                  # NumPy
+from scipy import optimize as spopt # For least squares fit
+
+# See cython documentation for following stuff
+# "cimport" is used to import special compile-time information
+# about the numpy module (this is stored in a file numpy.pxd which is
+# currently part of the Cython distribution).
+cimport numpy as np
+# We now need to fix a datatype for our arrays. I've used the variable
+# DTYPE for this, which is assigned to the usual NumPy runtime
+# type info object.
+DTYPEuint32 = np.uint32
+DTYPEuint16 = np.uint16
+DTYPEfloat32 = np.float32
+# "ctypedef" assigns a corresponding compile-time type to DTYPE_t. For
+# every type in the numpy module there's a corresponding compile-time
+# type with a _t-suffix.
+ctypedef np.uint32_t DTYPEuint32_t
+ctypedef np.uint16_t DTYPEuint16_t
+ctypedef np.float32_t DTYPEfloat32_t
+
+# Negative indices are checked for and handled correctly. The code is
+# explicitly coded so that it doesn’t use negative indices, and it (hopefully) 
+# always access within bounds. We can add a decorator to disable bounds checking:
+cimport cython
+#@cython.boundscheck(False) # turn of bounds-checking for entire function
+#def function():
+
+# Vector to use as a list
+#from libcpp.vector cimport vector
+
+
+
+ at cython.cdivision(True)
+ at cython.boundscheck(False) # turn of bounds-checking for entire function
+def BinPhotonEvents(np.ndarray[DTYPEuint32_t] data, double t_bin, filename, dtype, dlg, binshift=None):
+    """ Bin all photon arrival times in a numpy.uint32 array *data*, using 
+        the binning time float *t_bin* and saving the intensity trace as
+        the file *filename*. *dlg* is a python object that suports 
+        dlg.Update, like a progress dialog.
+    """
+    cdef int N = len(data)
+    BinData = []
+    cdef double time_c = 0                 # time counter
+    cdef int phot_c = 0                        # photon counter
+    cdef int maxphot = 0
+    cdef int j, i, emptybins, bin
+
+    dtype=dtype
+
+    print "Creating file " + filename + " ("+str(dtype.__name__)+")"
+
+    NewFile = open(filename, 'wb')
+    
+    # Add number of empty bins to beginning of file
+    if binshift is not None:
+        NewFile.write(dtype(np.zeros(binshift)))
+        
+    TempTrace = list()
+
+    for j in range(100):
+        percent = str(j)
+        if dlg.Update(j+1, "Counting photon events...")[0] == False:
+            dlg.Destroy()
+            return False
+
+        for i in range(N/100):
+            i = i+N/100*j
+            time_c += data[i]
+
+            if time_c >= t_bin:
+                # Append counted photons and
+                # reset counters
+                #NewFile.write(dtype(phot_c))
+                TempTrace.append(phot_c)
+                time_c -=  t_bin
+                phot_c = 0
+                # Empty bins between this and next event:
+                emptybins = int(time_c/t_bin)
+                TempTrace += emptybins*[0]
+                time_c -=  emptybins*t_bin
+                # Equivalent to:
+                # time_c = int(time_c)%int(t_bin)
+            phot_c +=  1
+        NewFile.write(dtype(TempTrace))
+        TempTrace = list()
+
+
+    # Now write the rest:
+    for i in range(N/100*100,N-1):
+        time_c += data[i]
+        if time_c >= t_bin:
+            # Append counted photons and
+            # reset counters
+            #NewFile.write(dtype(phot_c))
+            TempTrace.append(phot_c)
+            time_c -=  t_bin
+            phot_c = 0
+            # Empty bins between this and next event:
+            emptybins = int(time_c/t_bin)
+            TempTrace += emptybins*[0]
+            time_c -=  emptybins*t_bin
+            # Equivalent to:
+            # time_c = int(time_c)%int(t_bin)
+        phot_c +=  1
+    NewFile.write(dtype(TempTrace))
+    del TempTrace
+    NewFile.close()
+
+    return True
+
+
+def FitExp(times, trace):
+    """Fit an exponential function to the given trace.
+       Base is times.
+       Returns the functions plus paramtetera
+    """
+    # Set starting parameters for exponential fit
+    expfunc = lambda p, x: p[0]*np.exp(-x/p[1])
+    # parms = [ampl, decaytime]
+    parms = np.zeros(2, dtype=np.float32)
+    ltr = len(trace)
+    border = np.int(np.ceil(ltr/50.))
+    parms[0] = 1.*trace[:border].mean()
+    parms[1] = times[-1]/np.log(parms[0])
+    # Fit function is an exponential
+    # Function to minimize via least squares
+    # f_min = lambda p, x: expfunc(np.abs(p), x) - trace
+    def f_min(p,x):
+        p = np.abs(p)
+        return expfunc(np.abs(p), x) - trace
+    # Least squares
+    popt, chi = spopt.leastsq(f_min, parms[:], args=(times))
+    return np.abs(popt), expfunc
+
+
+def FitGaussian(amplitudes, frequencies,  argmax):
+    # Set starting parameters for gaussian fit
+    # parms = [freq, ampl, sigma]
+    parms = np.zeros(3, dtype=np.float32)
+    parms[0] = frequencies[argmax]
+    parms[1] = amplitudes[argmax]
+    parms[2] = abs(frequencies[1]-frequencies[2])*2.
+    # Fit function is a gaussian
+    gauss = lambda p, x: np.exp(-((x-p[0])/p[2])**2 / 2) * p[1]/(p[2]*np.sqrt(2*np.pi))
+    # Function to minimize via least squares
+    f_min = lambda p, x: gauss(p, x) - amplitudes
+    # Least squares
+    popt, chi = spopt.leastsq(f_min, parms[:], args=(frequencies))
+    return np.abs(popt), gauss
+
+
+
+ at cython.cdivision(True)
+ at cython.boundscheck(False) # turn of bounds-checking for entire function
+def OpenDat(filename, dlg):
+    # Open a data file
+    """
+    We open a .dat file as produced by the "Flex02-12D" correlator in photon
+    history recorder mode.
+    The file contains the time differences between single photon events.
+
+    Returns:
+    This function makes the filename publicly available, bins a couple
+    of events to get 1e+6 points and plots them into the plotting area
+    (plotarea), using the Bin_Photon_Events() function.
+
+    Raw data file format (taken from manual):
+     1. The file records the difference in system clock ticks (1/60 us)
+        between photon event.
+     2. The first byte identifies the format of the file 8 : 8 bit, 16: 16 bit
+     3. The second byte identifies the system clock. 60MHz.
+     4. The time unit is 1/system clock.
+     5. 16 bit format. Each WORD (2 bytes) represents a photon event, 
+        time = WORD/system clock, unless the value is 0xFFFF, in which case, 
+        the following four bytes represent a photon event.
+     6. 8 bit format: Each BYTE represents a photon event unless the value is 
+        0xFF, in which case, the BYTE means 255 clock ticks passed without a 
+        photon event. For example 0A 0B FF 08 means there are three
+        photon events. The time series are 0x0A+1, 0x0B+1, 0xFF+8+1.
+
+    """
+    cdef np.ndarray[DTYPEuint16_t] Data
+    cdef np.ndarray[DTYPEuint32_t] datData
+    cdef int i, N
+    # open file
+    File = open(filename, 'rb')
+    # 1st byte: get file format
+    # should be 16 - for 16 bit
+    format = int(np.fromfile(File, dtype="uint8", count=1))
+    if format == 8:
+        # No 8 bit format supported
+        print 'Error 8 bit format not supported.'
+        return None
+    # 2nd byte: read system clock
+    system_clock = int(np.fromfile(File, dtype="uint8", count=1))
+
+    # There is an utility to convert data to 32bit. This makes life easier:
+    if format == 32:
+        datData = np.fromfile(File, dtype="uint32", count=-1)
+        return  system_clock, datData
+    # In case of 16 bit file format (assumed), read the rest of the file in
+    # 16 bit format.
+    # Load bunch of Data
+    Data = np.fromfile(File, dtype="uint16", count=-1)
+    File.close()
+
+    # Now we need to check if there are any 0xFFFF values which would
+    # mean, that we do not yet have the true data in our array.
+    # There is 32 bit data after a 0xFFFF = 65535
+    if dlg.Pulse("Searching for 32bit events.") == False:
+        # Stop and end import of data
+        dlg.Destroy()
+        return
+    occurences = np.where(Data == 65535)[0]
+    N = len(occurences)
+    if dlg.Pulse("Found "+str(N)+" 32bit events.") == False:
+        # Stop and end import of data
+        dlg.Destroy()
+        return
+    # Make a 32 bit array
+    datData = np.uint32(Data)
+    datData[occurences] = np.uint32(Data[occurences+1]) + np.uint32(Data[occurences+2])*65536
+
+    if dlg.Pulse("Added new 32 bit array. Finishing...") == False:
+        # Stop and end import of data
+        dlg.Destroy()
+        return
+
+    # Now delete the zeros
+    zeroids = np.zeros(N*2)
+    zeroids[::2] = occurences + 1
+    zeroids[1::2] = occurences + 2
+    
+    datData = np.delete(datData, zeroids)
+
+    del Data
+    return system_clock, datData
+
+
+def ReduceTrace(trace, deltat, length):
+    """
+        Given a `trace` of length `len(trace)`, compute a trace of
+        length smaller than `length` by averaging. 
+        
+        
+        Parameters
+        ----------
+        trace : ndarray, shape (N)
+            Input trace that is to be averaged.
+        deltat : float
+            Time difference between bins in trace.
+        length : int
+            Maximum length of the new trace.
+
+
+        Returns
+        -------
+        newtrace : ndarray, shape (N,2)
+            New trace (axis 1) with timepoints (axis 0).
+
+    """
+    step = 0
+    while len(trace) > length:
+        N = len(trace)
+        if N % 2 != 0:
+            N -= 1
+        trace = (trace[0:N:2] + trace[1:N:2]) / 2
+        step += 1
+    # Return 2d array with times
+    T = np.zeros((len(trace), 2))
+    T[:,1] = trace/deltat/1e3 # in kHz
+    T[:,0] = np.arange(len(trace))*deltat*2**step
+    return T
+
+
+
diff --git a/pyscanfcs/__init__.py b/pyscanfcs/__init__.py
new file mode 100644
index 0000000..0719dbe
--- /dev/null
+++ b/pyscanfcs/__init__.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+"""
+    When a membrane is scanned perpendicularly to its surface, the
+    fluorescence signal originating from the membrane itself must be
+    separated from the signal of the surrounding medium for an FCS
+    analysis. PyScanFCS interactively extracts the fluctuating
+    fluorescence signal from such measurements and applies a
+    multiple-tau algorithm. The obtained correlation curves can be
+    evaluated using PyCorrFit.
+
+    Copyright (C) 2011-2012  Paul Müller
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License 
+    along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import multipletau
+
+from . import doc
+from . import SFCSnumeric
+
+__version__ = doc.__version__
+__author__ = "Paul Mueller"
+__email__ = "paul.mueller at biotec.tu-dresden.de"
+__license__ = "GPL v2"
diff --git a/pyscanfcs/__main__.py b/pyscanfcs/__main__.py
new file mode 100644
index 0000000..8dd4dec
--- /dev/null
+++ b/pyscanfcs/__main__.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+"""
+    When a membrane is scanned perpendicularly to its surface, the
+    fluorescence signal originating from the membrane itself must be
+    separated from the signal of the surrounding medium for an FCS
+    analysis. PyScanFCS interactively extracts the fluctuating
+    fluorescence signal from such measurements and applies a
+    multiple-tau algorithm. The obtained correlation curves can be
+    evaluated using PyCorrFit.
+
+    Copyright (C) 2011-2012  Paul Müller
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License 
+    along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+from . import doc
+from . import PyScanFCS
+
+## VERSION
+version = doc.__version__
+__version__ = version
+
+PyScanFCS.Main()
diff --git a/pyscanfcs/doc.py b/pyscanfcs/doc.py
new file mode 100755
index 0000000..3866c37
--- /dev/null
+++ b/pyscanfcs/doc.py
@@ -0,0 +1,183 @@
+# -*- coding: utf-8 -*-
+"""
+    PyScanFCS
+
+    Module doc
+
+    (C) 2012 Paul Müller
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License 
+    along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+import csv
+import matplotlib
+import numpy
+import os
+import platform
+import scipy
+import sys
+import wx
+
+# The icon file was created with
+# img2py -i -n Main PyScanFCS_icon.png icon.py
+import icon
+import multipletau
+
+
+def GetLocationOfChangeLog(filename = "ChangeLog.txt"):
+    locations = list()
+    fname1 = os.path.realpath(__file__)
+    # Try one directory up
+    dir1 = os.path.dirname(fname1)+"/../"
+    locations.append(os.path.realpath(dir1))
+    # In case of distribution with .egg files (pip, easy_install)
+    dir2 = os.path.dirname(fname1)+"/../pyscanfcs_doc/"
+    locations.append(os.path.realpath(dir2))
+    ## freezed binaries:
+    if hasattr(sys, 'frozen'):
+        try:
+            dir2 = sys._MEIPASS + "/doc/"
+        except:
+            dir2 = "./"
+        locations.append(os.path.realpath(dir2))
+    for loc in locations:
+        thechl = os.path.join(loc,filename)
+        if os.path.exists(thechl):
+            return thechl
+            break
+    # if this does not work:
+    return None
+
+
+def GetLocationOfDocumentation(filename = "PyScanFCS_doc.pdf"):
+    """ Returns the location of the documentation if there is any."""
+    ## running from source
+    locations = list()
+    fname1 = os.path.realpath(__file__)
+    # Documentation is usually one directory up
+    dir1 = os.path.dirname(fname1)+"/../"
+    locations.append(os.path.realpath(dir1))
+    # In case of distribution with .egg files (pip, easy_install)
+    dir2 = os.path.dirname(fname1)+"/../pyscanfcs_doc/"
+    locations.append(os.path.realpath(dir2))
+    ## freezed binaries:
+    if hasattr(sys, 'frozen'):
+        try:
+            dir2 = sys._MEIPASS + "/doc/"
+        except:
+            dir2 = "./"
+        locations.append(os.path.realpath(dir2))
+    for loc in locations:
+        thedoc = os.path.join(loc,filename)
+        if os.path.exists(thedoc):
+            return thedoc
+            break
+    # if this does not work:
+    return None
+
+
+def description():
+    return u"""PyScanFCS is a data displaying and processing
+tool for perpendicular line scanning FCS utilizing 
+correlator.com correlators. PyScanFCS is written in Python."""
+
+
+def info(version):
+    """ Returns a little info about our program and what it can do.
+    """
+    textwin = u"""
+    Copyright 2011-2012 Paul Müller, Biotec - TU Dresden
+
+    Data processing for perpendicular line scanning FCS.
+    """
+    textlin = """
+    © 2011-2012 Paul Müller, Biotec - TU Dresden
+
+    Data processing for perpendicular line scanning FCS.
+    """
+    if (platform.system() != 'Linux'):
+        texta = textwin
+    else:
+        texta = textlin
+    one = "    PyScanFCS version "+version+"\n\n"
+    lizenz = ""
+    for line in licence().splitlines():
+        lizenz += "    "+line+"\n"
+    ret = one + lizenz + texta
+    return ret
+
+
+def getMainIcon(pxlength=32):
+    """ *pxlength* is the side length in pixels of the icon """
+    # Set window icon
+    iconBMP = icon.getMainBitmap()
+    # scale
+    image = wx.ImageFromBitmap(iconBMP)
+    image = image.Scale(pxlength, pxlength, wx.IMAGE_QUALITY_HIGH)
+    iconBMP = wx.BitmapFromImage(image)
+    iconICO = wx.IconFromBitmap(iconBMP)
+    return iconICO
+
+
+def licence():
+    return u"""PyScanFCS is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published 
+by the Free Software Foundation, either version 2 of the License, 
+or (at your option) any later version.
+
+PyScanFCS is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of 
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+See the GNU General Public License for more details. 
+
+You should have received a copy of the GNU General Public License 
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+"""
+
+
+def SoftwareUsed():
+    """ Return some Information about the software used for this program """
+    text= "Python "+sys.version+\
+           "\n\nModules:"+\
+           "\n - matplotlib "+matplotlib.__version__+\
+           "\n - multipletau "+multipletau.__version__+\
+           "\n - NumPy "+numpy.__version__+\
+           "\n - SciPy "+scipy.__version__+\
+           "\n - wxPython "+wx.__version__
+    if hasattr(sys, 'frozen'):
+        pyinst = "\n\nThis executable has been created using PyInstaller."
+        text = text+pyinst
+    return text
+
+
+# Standard homepage
+HomePage = "http://pyscanfcs.craban.de/"
+
+# Changelog filename
+ChangeLog = "ChangeLog.txt"
+StaticChangeLog = GetLocationOfChangeLog(ChangeLog)
+
+
+# Check if we can extract the version
+try:
+    clfile = open(StaticChangeLog, 'r')
+    __version__ = clfile.readline().strip()
+    clfile.close()     
+except:
+    __version__ = "0.0.0-unknown"
+
+
+# Github homepage
+GitChLog = "https://raw.github.com/paulmueller/PyScanFCS/master/ChangeLog.txt"
+GitHome = "https://github.com/paulmueller/PyScanFCS"
+GitWiki = "https://github.com/paulmueller/PyScanFCS/wiki"
diff --git a/pyscanfcs/edclasses.py b/pyscanfcs/edclasses.py
new file mode 100755
index 0000000..8702e65
--- /dev/null
+++ b/pyscanfcs/edclasses.py
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+"""
+    PyScanFCS
+
+    Module edclasses
+    Contains classes that we edited.
+    Makes these classes more useful for us.
+
+    (C) 2012 Paul Müller
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License 
+    along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+import numpy as np
+from wx.lib.agw import floatspin        # Float numbers in spin fields
+import wx 
+
+class FloatSpin(floatspin.FloatSpin):
+    def __init__(self, parent, digits=10, increment=.01, value=1.0):
+        floatspin.FloatSpin.__init__(self, parent, digits=digits,
+                                     increment = increment, value = value)
+        self.Bind(wx.EVT_SPINCTRL, self.increment)
+        #self.Bind(wx.EVT_SPIN, self.increment)
+        #self.increment()
+
+    def increment(self, event=None):
+        # Find significant digit
+        # and use it as the new increment
+        x = self.GetValue()
+        if x == 0:
+            incre = 0.1
+        else:
+            digit = int(np.ceil(np.log10(abs(x)))) - 2
+            incre = 10**digit
+        self.SetIncrement(incre)
+
+
+class ChoicesDialog(wx.Dialog):
+    def __init__(self, parent, dropdownlist, title, text):
+        # parent is main frame
+        self.parent = parent
+
+        super(ChoicesDialog, self).__init__(parent=parent, 
+            title=title)
+        # Get the window positioning correctly
+        #pos = self.parent.GetPosition()
+        #pos = (pos[0]+100, pos[1]+100)
+        #wx.Frame.__init__(self, parent=parent, title=title,
+        #         pos=pos, style=wx.DEFAULT_FRAME_STYLE|wx.FRAME_FLOAT_ON_PARENT)
+
+        #self.Filename = None
+        ## Controls
+        panel = wx.Panel(self)
+
+        # text1
+        textopen = wx.StaticText(panel, label=text)
+        btnok = wx.Button(panel, wx.ID_OK)
+        btnabort = wx.Button(panel, wx.ID_CANCEL)
+
+        # Dropdown
+        self.dropdown = wx.ComboBox(panel, -1, "", (15, 30),
+              wx.DefaultSize, dropdownlist, wx.CB_DROPDOWN|wx.CB_READONLY)
+        self.dropdown.SetSelection(0)
+        # Bindings
+        self.Bind(wx.EVT_BUTTON, self.OnOK, btnok)
+        self.Bind(wx.EVT_BUTTON, self.OnAbort, btnabort)
+
+        # Sizers
+        topSizer = wx.BoxSizer(wx.VERTICAL)
+
+        topSizer.Add(textopen)
+        topSizer.Add(self.dropdown)
+
+        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
+        btnSizer.Add(btnok)
+        btnSizer.Add(btnabort)
+
+        topSizer.Add(btnSizer)
+
+        panel.SetSizer(topSizer)
+        topSizer.Fit(self)
+        self.Show(True)
+
+    def OnOK(self, event=None):
+        self.SelcetedID = self.dropdown.GetSelection()
+        self.EndModal(wx.ID_OK)
+
+    def OnAbort(self, event=None):
+        self.EndModal(wx.ID_CANCEL)
+
diff --git a/pyscanfcs/icon.py b/pyscanfcs/icon.py
new file mode 100644
index 0000000..b0b5ae7
--- /dev/null
+++ b/pyscanfcs/icon.py
@@ -0,0 +1,191 @@
+#----------------------------------------------------------------------
+# This file was generated by /usr/bin/img2py
+#
+from wx.lib.embeddedimage import PyEmbeddedImage
+
+Main = PyEmbeddedImage(
+    "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")
+getMainData = Main.GetData
+getMainImage = Main.GetImage
+getMainBitmap = Main.GetBitmap
+getMainIcon = Main.GetIcon
+
diff --git a/pyscanfcs/misc.py b/pyscanfcs/misc.py
new file mode 100644
index 0000000..6e874d2
--- /dev/null
+++ b/pyscanfcs/misc.py
@@ -0,0 +1,212 @@
+# -*- coding: utf-8 -*-
+"""
+    PyScanFCS
+
+    Module misc
+
+    (C) 2012 Paul Müller
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License 
+    along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+
+import codecs
+from distutils.version import LooseVersion # For version checking
+import numpy as np
+import os
+import platform
+import sys
+import tempfile
+import urllib2
+import webbrowser
+import wx                               # GUI interface wxPython
+import wx.html
+import wx.lib.delayedresult as delayedresult
+
+import doc                          # Documentation/some texts
+# The icon file was created with
+# img2py -i -n Main PyScanFCS_icon.png icon.py
+import icon                         # Contains the program icon
+
+
+class UpdateDlg(wx.Frame):
+    def __init__(self, parent, valuedict):
+        
+        description = valuedict["Description"]
+        homepage = valuedict["Homepage"]
+        githome = valuedict["Homepage_GIT"]
+        changelog = valuedict["Changelog"]
+        pos = parent.GetPosition()
+        pos = (pos[0]+100, pos[1]+100)
+        wx.Frame.__init__(self, parent, wx.ID_ANY, title="Update", 
+                          size=(250,180), pos=pos)
+        self.changelog = changelog
+        # Fill html content
+        html = wxHTML(self)
+        string =             '' +\
+            "<b> PyScanFCS <br></b>" +\
+            "Your version: " + description[0]+"<br>" +\
+            "Latest version: " + description[1]+"<br>" +\
+            "(" + description[2]+")<br><p><b>"
+        if len(homepage) != 0:
+            string = string + '<a href="'+homepage+'">Homepage</a><br>'
+        if len(githome) != 0:
+            string = string + '<a href="'+githome+'">Repository</a><br>'
+
+        if len(changelog) != 0:
+            string = string + \
+                     '<a href="'+changelog+'">Change Log</a>'
+        string = string+'</b></p>'
+        html.SetPage(string)
+        self.Bind(wx.EVT_CLOSE, self.Close)
+        # Set window icon
+        ico = getMainIcon()
+        wx.Frame.SetIcon(self, ico)
+
+
+    def Close(self, event):
+        if len(self.changelog) != 0:
+            # Cleanup downloaded file, if it was downloaded
+            if self.changelog != doc.StaticChangeLog:
+                os.remove(self.changelog)
+        self.Destroy()
+
+
+class wxHTML(wx.html.HtmlWindow):
+    def OnLinkClicked(parent, link):
+         webbrowser.open(link.GetHref())
+
+
+def removewrongUTF8(name):
+    newname = u""
+    for char in name:
+       try:
+           uchar = codecs.decode(char, "UTF-8")
+       except:
+           pass
+       else:
+           newname += char
+    return newname
+    
+
+def getMainIcon(pxlength=32):
+    """ *pxlength* is the side length in pixels of the icon """
+    # Set window icon
+    iconBMP = icon.getMainBitmap()
+    # scale
+    image = wx.ImageFromBitmap(iconBMP)
+    image = image.Scale(pxlength, pxlength, wx.IMAGE_QUALITY_HIGH)
+    iconBMP = wx.BitmapFromImage(image)
+    iconICO = wx.IconFromBitmap(iconBMP)
+    return iconICO
+
+
+def findprogram(program):
+    """ Uses the systems PATH variable find executables"""
+    path = os.environ['PATH']
+    paths = path.split(os.pathsep)
+    for d in paths:
+        if os.path.isdir(d):
+            fullpath = os.path.join(d, program)
+            if sys.platform[:3] == 'win':
+                for ext in '.exe', '.bat':
+                    program_path = fullpath + ext
+                    if os.path.isfile(fullpath + ext):
+                        return (1, program_path)
+            else:
+                if os.path.isfile(fullpath):
+                    return (1, fullpath)
+    return (0, None)
+
+
+def Update(parent):
+    """ This is a thread for _Update """
+    parent.StatusBar.SetStatusText("Connecting to server...")
+    delayedresult.startWorker(_UpdateConsumer, _UpdateWorker,
+                              wargs=(parent,), cargs=(parent,))
+
+def _UpdateConsumer(delayedresult, parent):
+    results = delayedresult.get()
+    dlg = UpdateDlg(parent, results)
+    dlg.Show()
+    parent.StatusBar.SetStatusText("...update status: "+results["Description"][2])
+
+
+def _UpdateWorker(parent):
+        changelog = ""
+        hpversion = None
+        # I created this TXT record to keep track of the current web presence.
+        try:
+            urlopener = urllib2.urlopen(doc.HomePage, timeout=2)
+            homepage = urlopener.geturl()
+        except:
+            homepage = doc.HomePage
+        try:
+            urlopener2 = urllib2.urlopen(doc.GitHome, timeout=2)
+            githome = urlopener2.geturl()
+        except:
+            githome = ""
+        # Find the changelog file
+        try:
+            responseCL = urllib2.urlopen(homepage+doc.ChangeLog, timeout=2)
+        except:
+            CLfile = doc.GitChLog
+        else:
+            fileresponse = responseCL.read()
+            CLlines = fileresponse.splitlines()
+            # We have a transition between ChangeLog.txt on the homepage
+            # containing the actual changelog or containing a link to
+            # the ChangeLog file.
+            if len(CLlines) == 1:
+                CLfile = CLlines[0]
+            else:
+                hpversion = CLlines[0]
+                CLfile = doc.GitChLog
+        # Continue version comparison if True
+        continuecomp = False
+        try:
+            responseVer = urllib2.urlopen(CLfile, timeout=2)
+        except:
+            if hpversion == None:
+                newversion = "unknown"
+                action = "cannot connect to server"
+            else:
+                newversion = hpversion
+                continuecomp = True
+        else:
+            continuecomp = True
+            changelog = responseVer.read()
+            newversion = changelog.splitlines()[0]
+        if continuecomp:
+            new = LooseVersion(newversion)
+            old = LooseVersion(parent.version)
+            if new > old:
+                action = "update available"
+            elif new < old:
+                action = "whoop you rock!"
+            else:
+                action = "state of the art"
+        description = [parent.version, newversion, action]
+        if len(changelog) != 0:
+            changelogfile = tempfile.mktemp()+"_PyScanFCS_ChangeLog"+".txt"
+            clfile = open(changelogfile, 'wb')
+            clfile.write(changelog)
+            clfile.close()            
+        else:
+            changelogfile=doc.StaticChangeLog
+        results = dict()
+        results["Description"] = description
+        results["Homepage"] = homepage
+        results["Homepage_GIT"] = githome
+        results["Changelog"] = changelogfile
+        return results
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..861a9f5
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,5 @@
+[egg_info]
+tag_build = 
+tag_date = 0
+tag_svn_revision = 0
+
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..da6f729
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python
+# To create a distribution package for pip or easy-install:
+# python setup.py sdist
+from setuptools import setup, find_packages, Extension
+from Cython.Distutils import build_ext
+import numpy as np
+
+from os.path import join, dirname, realpath
+from warnings import warn
+
+# The next three lines are necessary for setup.py install to include
+# ChangeLog and Documentation of PyCorrFit
+from distutils.command.install import INSTALL_SCHEMES
+for scheme in INSTALL_SCHEMES.values():
+    scheme['data'] = scheme['purelib']
+
+
+# Get the version of PyCorrFit from the Changelog.txt
+StaticChangeLog = join(dirname(realpath(__file__)), "ChangeLog.txt")
+
+try:
+    clfile = open(StaticChangeLog, 'r')
+    version = clfile.readline().strip()
+    clfile.close()     
+except:
+    warn("Could not find 'ChangeLog.txt'. PyScanFCS version is unknown.")
+    version = "0.0.0-unknown"
+
+
+EXTENSIONS = [Extension("pyscanfcs.SFCSnumeric",
+                        ["pyscanfcs/SFCSnumeric.pyx"],
+                        libraries=[],
+                        include_dirs=[np.get_include()]
+                        )
+              ]
+
+name='pyscanfcs'
+
+setup(
+    name=name,
+    author='Paul Mueller',
+    author_email='paul.mueller at biotec.tu-dresden.de',
+    url='https://github.com/paulmueller/PyScanFCS',
+    version=version,
+    packages=[name],
+    package_dir={name: name},
+    data_files=[('pyscanfcs_doc', ['ChangeLog.txt', 'PyScanFCS_doc.pdf'])],
+    license="GPL v2",
+    description='Scientific tool for perpendicular line scanning FCS.',
+    long_description=open(join(dirname(__file__), 'Readme.txt')).read(),
+    scripts=['bin/pyscanfcs'],
+    cmdclass={"build_ext": build_ext},
+    include_package_data=True,
+    ext_modules=EXTENSIONS,
+    install_requires=[
+        "cython",
+        "matplotlib >= 1.1.0",
+        "multipletau >= 0.1.4",
+        "NumPy >= 1.5.1",
+        "pyfits",
+        "SciPy >= 0.8.0",
+        "wxPython >= 2.8.10.1"
+        ],
+    keywords=["fcs", "fluorescence", "correlation", "spectroscopy",
+              "perpendicular", "scanning", "multiple", "tau"],
+    classifiers= [
+        'Operating System :: OS Independent',
+        'Programming Language :: Python :: 2.7',
+        'Topic :: Scientific/Engineering :: Visualization',
+        'Intended Audience :: Science/Research'
+                 ],
+    platforms=['ALL']
+    )
+

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/pyscanfcs.git



More information about the debian-med-commit mailing list