jpylyzer-1.18.0/ 0000775 0000000 0000000 00000000000 13147265102 0013472 5 ustar 00root root 0000000 0000000 jpylyzer-1.18.0/.gitignore 0000664 0000000 0000000 00000003155 13147265102 0015466 0 ustar 00root root 0000000 0000000 # If you're thinking of un-ignoring any of these artefacts in a lower
# level .gitignore please think again. The none eclipse / maven options
# below are recommended candidates from http://help.github.com/ignore-files/
#
# As a general rule please don't commit:
# IDE generated files, it upsets the IDEs of others
# Compiled / built files (exes, jars, etc.), it's a source repository
# Test data larger than a few KB, we'll go for bigger test files in the testbed
#
# Remember, we'd like to keep the git repo light and small enough for people to
# download quickly and easily.
#
# Any questions then get in touch:
#
# Carl Wilson Open Planets Foundation
# carlwilson@GitHub carl( AT )openplanetsfoundation.org.
# Eclipse Files #
#################
.externalToolBuilders
.settings
.classpath
.project
*.md.html
bin
.pydevproject
# Netbeans Files #
#################
nbactions.xml
# project build directories #
#############################
target
build
dist
pyi-build
# Compiled Source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so
*.pyc
# PyInstaller bits #
####################
# *.spec
# Vagrant bits #
####################
.vagrant/
# Packages #
############
# Better to unpack and commt the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.war
*.zip
*.dsc
*.deb
*.changes
*.egg-info
# Logs and databases #
######################
*.log
*.sql
*.sqlite
# Vue Backup Files #
######################
.~*.vue
# OS Generated files #
######################
.DS_Store*
ehthumbs.db
Icon?
Thumbs.db
.directory
# Files from gh-pages #
#######################
/_site
jpylyzer-1.18.0/.opf.yml 0000664 0000000 0000000 00000000153 13147265102 0015056 0 ustar 00root root 0000000 0000000 name: jpylyzer
vendor: SCAPE
maintainer:
name: Johan van der Knijff
email: johan.vanderknijff@kb.nl jpylyzer-1.18.0/.travis.yml 0000664 0000000 0000000 00000000426 13147265102 0015605 0 ustar 00root root 0000000 0000000 language: python
python:
- "2.7"
- "3.2"
- "3.3"
before_install:
- sudo -H pip install pyinstaller
install:
- dpkg-buildpackage -tc -uc -us
script:
- python -m unittest discover
after_success:
- sudo dpkg -i ../jpylyzer_1.10.1_amd64.deb
- jpylyzer --version
jpylyzer-1.18.0/BUILD_HOWTO_LINUX.md 0000664 0000000 0000000 00000001010 13147265102 0016602 0 ustar 00root root 0000000 0000000 # How to build stand-alone Linux binaries
To build stand-alone Linux binaries, simply run the *build-with-pyinstaller.sh* script from the jpylyzer root directory:
./build-with-pyinstaller.sh
This will create the binaries under *pyi-build/dist*. The build script requires PyInstaller. If PyInstaller is not installled, it can be installed using:
(sudo) pip install pyinstaller
(If you don't know if you have PyInstaller just run the build script, which will display a message id it cannot find PyInstaller.)
jpylyzer-1.18.0/BUILD_HOWTO_WINDOWS.md 0000664 0000000 0000000 00000002537 13147265102 0017054 0 ustar 00root root 0000000 0000000 # How to build the Windows binaries
## Prerequisites
Windows binaries are now built under Linux using [Wine](https://www.winehq.org/). Make sure you have a recent version of Wine installed. Also check if (a recent version of) the *winbind* package is installed. If not, install it using:
sudo apt-get install winbind
## Building the binaries
In your console window, go to the root of the jpylyzer directory. Then run:
./buildwin.sh
The script first checks for the presence of (portable) 64 and 32 versions of Python 2.7 under *Wine*, and installs them if they are not found. Note that the installers need some manual input. Most importantly, make sure you enter the following installation paths:
* `C:\Python27_64` for the 64-bit version;
* `C:\Python27_32` for the 32-bit version.
The script also automatically installs PyInstaller ifit is not there already.
Once the above dependencies are installed, 64 and 32 bit binaries are built automatically. The (zipped) binaries can be found in the *dist* directory.
## Troubleshooting
If the output of the build script includes this error:
err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
Fix this by installing *winbind* (see the top of this page).
jpylyzer-1.18.0/LICENSE 0000664 0000000 0000000 00000004341 13147265102 0014501 0 ustar 00root root 0000000 0000000 Copyright:
KB / National Library of the Netherlands, Open Preservation Foundation
License:
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see .
On Debian systems, the complete text of the GNU Lesser General Public License
version 3 can be found in "/usr/share/common-licenses/LGPL-3".
The Debian packaging is:
Copyright (C) 2012 Open Planets Foundation
and is licensed under the GPL version 3, see above.
Python Six (which is included in the jpylyzer source):
Copyright (c) 2010-2015 Benjamin Peterson
Python Six License:
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
jpylyzer-1.18.0/MANIFEST.in 0000664 0000000 0000000 00000000077 13147265102 0015234 0 ustar 00root root 0000000 0000000 recursive-include example_files *
recursive-include doc *.html
jpylyzer-1.18.0/Makefile 0000664 0000000 0000000 00000000157 13147265102 0015135 0 ustar 00root root 0000000 0000000 build:
./build-with-pyinstaller.sh
install:
mv pyi-build/dist/jpylyzer $(DESTDIR)
clean:
rm -fR pyi-build
jpylyzer-1.18.0/README.md 0000664 0000000 0000000 00000011347 13147265102 0014757 0 ustar 00root root 0000000 0000000 # jpylyzer
## About
*Jpylyzer* is a JP2 [(JPEG 2000 Part 1)][2] image validator and properties extractor. Its development was partially supported by the [SCAPE][4] Project. The SCAPE project is co-funded by the European Union under FP7 ICT-2009.4.1 (Grant Agreement number 270137).
## Jpylyzer homepage
## Cd Status
- [](https://travis-ci.org/openpreserve/jpylyzer "Jpylyzer Travis-CI integration build") Travis-CI
- [](http://jenkins.opf-labs.org/job/jpylyser/) OPF Jenkins
## Downloads
* [User Manual][1] - exhaustive documentation of all aspects of *jpylyzer*
* [Windows binaries][5] - stand-alone Windows binaries that allow you to run *jpylyzer* without any *Python* dependencies
* [Debian packages][6] - i386 (32 bit) architecture
* [Debian packages][7] - Amd 64 (64 bit) architecture
## Command line use
### Usage
usage: jpylyzer [-h] [--verbose] [--recurse] [--wrapper] [--nullxml]
[--nopretty] [--version] jp2In [jp2In ...]
### Positional arguments
`jp2In` : input JP2 image(s), may be one or more (whitespace-separated) path expressions; prefix wildcard (\*) with backslash (\\) in Linux.
### Optional arguments
`-h, --help` : show this help message and exit;
`-v, --version` : show program's version number and exit;
`--verbose` : report test results in verbose format;
`--recurse, -r` : when analysing a directory, recurse into subdirectories (implies `--wrapper`)
`--wrapper, -w` : wrap the output for individual image(s) in 'results' XML element.
`--nullxml` : extract null-terminated XML content from XML and UUID boxes (doesn't affect validation)
`--nopretty` : suppress pretty-printing of XML output
## Output
Output is directed to the standard output device (*stdout*).
### Example
`jpylyzer.py rubbish.jp2 > rubbish.xml`
In the above example, output is redirected to the file 'rubbish.xml'.
### Outline of output elements
1. *toolInfo*: tool name (jpylyzer) + version.
2. *fileInfo*: name, path, size and last modified time/date of input file.
3. *isValidJP2*: *True* / *False* flag indicating whether file is valid JP2.
4. *tests*: tree of test outcomes, expressed as *True* / *False* flags.
A file is considered valid JP2 only if all tests return *True*. Tree follows JP2 box structure. By default only tests that returned *False* are reported, which results in an empty *tests* element for files that are valid JP2. Use the `--verbose` flag to get *all* test results.
5. *properties*: tree of image properties. Follows JP2 box structure. Naming of properties follows [ISO/IEC 15444-1 Annex I][2] (JP2 file format syntax) and [Annex A][3] (Codestream syntax).
## Debian packages build process
The [Vagrant directory](vagrant) of this repo contains instructions on how to build Debian packages using [VirtualBox](https://www.virtualbox.org/) and [Vagrant](https://www.vagrantup.com/). A Vagrantfile and provisioning scripts are included for a number of target platforms, which should make the process of building the packages fairly easy.
## Steps in preparing a jpylyzer release
(Outline only, this section is under development and needs more detail!).
1. Make changes to code
1. Update version number in *jpylyzer.py*, and *sonar-project.properties* (do we really need last file?)
1. In case of changes to command-line interface, update [jpylyzer.pod](debian/jpylyzer.pod) file in *Debian* folder.
1. Create new entry in changelog using `dch -i`; then manually update version number, and create list of changes.
1. Update [User Manual](doc/jpylyzerUserManual.md) if necessary
1. Commit all changes
1. Add tag and commit
1. Create and upload PyPi packages by running [`package-pypi.sh`](./package-pypi.sh)
1. Build Linux packages using [instructions here](vagrant)
1. Build Windows binaries using [instructions here](./BUILD_HOWTO_WINDOWS.md)
1. Go to [*Latest Release*](https://github.com/openpreserve/jpylyzer/releases/latest) and click on the *Edit* button
1. Upload Linux/Windows packages to the release by dragging them to the *Attach Binaries* field at the bottom
1. Website: update *binVersion* in *_config.yml* (this updates the links to all packages to the correct version)
1. Website: write short release note
1. Commit changes to website
1. Spread the word!
[1]: http://jpylyzer.openpreservation.org//jpylyzerUserManual.html
[2]: http://www.jpeg.org/public/15444-1annexi.pdf
[3]: http://www.itu.int/rec/T-REC-T.800/en
[4]: http://www.scape-project.eu/
[5]: https://bintray.com/openplanets/opf-windows/jpylyzer_win32/
[6]: https://bintray.com/openplanets/opf-debian/jpylyzer_i386/
[7]: https://bintray.com/openplanets/opf-debian/jpylyzer_amd64/
jpylyzer-1.18.0/build-with-pyinstaller.sh 0000775 0000000 0000000 00000002274 13147265102 0020452 0 ustar 00root root 0000000 0000000 #!/bin/bash
# Bash script to build jpylyzer using PyInstaller
# Script base name (i.e. script name minus .py extension)
scriptBaseName=jpylyzer
# First check for PyInstaller
command -v pyinstaller >/dev/null 2>&1 || {
echo >&2 "PyInstaller is required to build the executable.";
echo >&2 "Please install PyInstaller with:";
echo >&2 " (sudo) pip install pyinstaller"
exit 1;
}
# PyInstaller cannot be run as root
originalUserId=$(id -u);
userId=$originalUserId
if [ $originalUserId == 0 ]
then
uname=$(getent passwd 1000 | cut -d: -f1)
sudo -u $uname "pyi-makespec --strip --onefile --paths=$scriptBaseName --name=$scriptBaseName --specpath=pyi-build ./cli.py"
sudo -u $uname "pyinstaller --strip --clean --paths=$scriptBaseName --distpath=pyi-build/dist --workpath=pyi-build/build ./pyi-build/$scriptBaseName.spec"
else
# So making stripped binaries for debian packaging
pyi-makespec --strip --onefile --paths=$scriptBaseName --name=$scriptBaseName --specpath=pyi-build ./cli.py
pyinstaller --strip --clean --paths=$scriptBaseName --distpath=pyi-build/dist --workpath=pyi-build/build ./pyi-build/$scriptBaseName.spec
fi
./pyi-build/dist/$scriptBaseName --version;
jpylyzer-1.18.0/buildwin.sh 0000775 0000000 0000000 00000007613 13147265102 0015655 0 ustar 00root root 0000000 0000000 #!/bin/bash
# Build 64 and 32 bit Windows binaries using Wine and WinPython. If the required Wine environment
# (WinPython + PyInstaller) cannot be found it is set up quasi-automatically (the WinPython installer
# needs some manual input)
# Precondition: 64-bit version of Wine is already installed.
# WinPython download URLS
downloadURL64bit=https://sourceforge.net/projects/winpython/files/WinPython_2.7/2.7.13.1/WinPython-64bit-2.7.13.1Zero.exe/download
downloadURL32bit=https://sourceforge.net/projects/winpython/files/WinPython_2.7/2.7.13.1/WinPython-32bit-2.7.13.1Zero.exe/download
# PyInstaller spec files that defines build options
specFile64bit=jpylyzer_win64.spec
specFile32bit=jpylyzer_win32.spec
# Script base name (i.e. script name minus .py extension)
scriptBaseName=jpylyzer
# Wine debug variable (suppresses garbage debugging messages)
WineDebug="-msvcrt"
#WineDebug="fixme-all"
installPython(){
# Installs Python. Arguments:
# - $1: bitness (32 or 64)
# - $2: download URL
echo "Downloading installer"
wget $2 -O pyTemp.exe
echo ""
echo "Installing Python. This requires some user input"
echo ""
echo "Follow installer instructions. For Destination Folder replace default path with C:\Python27_"$1
echo ""
WINEDEBUG=$WineDebug wine pyTemp.exe
echo "Removing installer"
rm pyTemp.exe
}
installPyInstaller(){
# Installs pyInstaller if it is not installed already. Argument:
# - $1: python (full path of python interpreter)
echo "Checking for pyinstaller"
WINEDEBUG=$WineDebug wine $1 -m pip show pyinstaller
if [ $? -eq 0 ]; then
echo "Pyinstaller already installed"
else
echo "Installing pyinstaller"
WINEDEBUG=$WineDebug wine $1 -m pip install pyinstaller
fi
}
buildBinaries(){
# Builds Windows binaries.
# Read arguments:
bitness=$1
pyRoot=$2
pyInstallerWine=$pyRoot"/Scripts/pyinstaller.exe"
pythonWine=$3
specFile=$4
# Working directory
workDir=$PWD
# Directory where build is created (should be identical to 'name' in 'coll' in spec file!!)
distDir=$workDir"/dist/win"$bitness"/"
# Executes jpylyzer with -v option and stores output to
# env variable 'version'
# Also trim trailing EOL character and replace '.' by '_'
WINEDEBUG=$WineDebug wine $pythonWine -m $scriptBaseName -v 2> temp.txt
version=$(head -n 1 temp.txt | tr -d '\r' |tr '.' '_' )
rm temp.txt
echo "Building binaries"
WINEDEBUG=$WineDebug wine $pyInstallerWine $specFile --distpath=$distDir
# Generate name for ZIP file
zipName=$scriptBaseName"_"$version"_win"$bitness".zip"
echo zipName
echo "Creating ZIP file"
cd $distDir
zip -r $zipName $scriptBaseName
cd $workDir
echo "Deleting build directory"
rm -r $workDir"/build"
rm -r $distDir/$scriptBaseName
}
echo "64 bit Python"
if [ -d $HOME"/.wine/drive_c/Python27_64" ]; then
echo "Python (64 bit) already installed"
else
echo "Python (64 bit) not yet installed, installing now"
echo ""
installPython 64 $downloadURL64bit
fi
# Get path to Python root
pyRoot64=$(ls -d ~/.wine/drive_c/Python27_64/python-*)
# Python interpreter
python64=$pyRoot64"/python.exe"
# Install PyInstaller (if not installed already)
installPyInstaller $python64
echo "32 bit Python"
if [ -d $HOME"/.wine/drive_c/Python27_32" ]; then
echo "Python (32 bit) already installed"
else
echo "Python (32 bit) not yet installed, installing now"
echo ""
installPython 32 $downloadURL32bit
fi
# Get path to Python root
pyRoot32=$(ls -d ~/.wine/drive_c/Python27_32/python-*)
# Python interpreter
python32=$pyRoot32"/python.exe"
# Install PyInstaller (if not installed already)
installPyInstaller $python32
echo "Building binaries, 64 bit"
buildBinaries 64 $pyRoot64 $python64 $specFile64bit
echo "Building binaries, 32 bit"
buildBinaries 32 $pyRoot32 $python32 $specFile32bit
jpylyzer-1.18.0/cli.py 0000664 0000000 0000000 00000000302 13147265102 0014606 0 ustar 00root root 0000000 0000000 #! /usr/bin/env python
#
"""CLI wrapper script, ensures that relative imports work correctly in a PyInstaller build"""
from jpylyzer.jpylyzer import main
if __name__ == '__main__':
main()
jpylyzer-1.18.0/doc/ 0000775 0000000 0000000 00000000000 13147265102 0014237 5 ustar 00root root 0000000 0000000 jpylyzer-1.18.0/doc/README.md 0000664 0000000 0000000 00000007545 13147265102 0015531 0 ustar 00root root 0000000 0000000 # Notes on jpylyzer User Manual
## Syntax
The jpylyzer User Manual uses the [Markdown Extra](http://michelf.ca/projects/php-markdown/extra/) syntax with some Pandoc-specific extras. This Markdown version differs in a number of ways from [GitHub Flavored Markdown](https://help.github.com/articles/github-flavored-markdown), and as a result the Markdown file doesn't render correctly when viewed in Github. This is no reason for any concern.
For the rendering of the equation objects (which are in [MathML](http://en.wikipedia.org/wiki/MathML)) there is a dependency on [MathJax](http://www.mathjax.org/)
## Exporting to HTML
Run the script [mdToDeliveryFormats.sh](mdToDeliveryFormats.sh) to export the Markdown file to the folllowing delivery formats:
1. Jekyll template with HTML that can be used to replace the on-line manual on the jpylyzer homepage (file [userManual.html](https://github.com/openpreserve/jpylyzer/blob/gh-pages/userManual.html))
1. Self-contained HTML without any external dependencies (style sheets, images etc. are all embedded in one single file; this replaces the former PDF version).
Script requires [Pandoc](http://johnmacfarlane.net/pandoc/) and [Xmllint](http://xmlsoft.org/xmllint.html).
Note on the command-line switches used in the script:
* `-s` creates a stand-alone file
* `--toc` automatically generates a table of contents
* `--toc-depth=2` specifies that table of contents contains Chapter (level 1) and Section (level 2) headings (so level 3 and higher are left out).
* `--ascii` generates output in ascii format (not sure if this is really needed?)
* `-N` activates automatic chapter/section/subsection numbering
* `-w html5` sets the output format to `html 5`
* `-c jpylyzer.css` defines style sheet
You will need a fairly recent version of *Pandoc* to make this work, as older versions do not support `markdown_phpextra` as an input format. Note that it is important to use html5 as the output format, because the Markdown file contains [MathML](http://nl.wikipedia.org/wiki/Mathematical_Markup_Language) content that is not supported in previous html versions.
## Export to other delivery formats
Could be included at later stage. So far I have briefly investigated te following.
### PDF
First attempt, after some experimentation:
pandoc -s --toc --toc-depth=2 -N --chapters --latex-engine=xelatex -o jpylyzerUserManual.pdf jpylyzerUserManual.md
This results in a PDF, but it has a number of issues:
* Equations are mangled
* Some of the tables don't fit on the page (cell contents aren't wrapped)
* Size of images isn't quite right.
### EPUB3
pandoc -S -N --chapters -w epub3 --epub-stylesheet jpylyzer.css -o jpylyzerUserManual.epub frontMatter.md jpylyzerUserManual.md
This produces a file that is valid EPUB 3 according to [epubcheck](https://github.com/idpf/epubcheck).
Issues:
* Equations are mangled
* TOC numbering isn't quite right.
Because of the many issues with the PDF and EPUB export I'll be sticking to HTML for now.
## Stylesheet
The stylesheet *jpylyzer.css* is based on John MacFarlane's [pandoc.css](http://johnmacfarlane.net/pandoc/demo/pandoc.css), with some adaptations.
## Figures
The directory `figuresSVG` contains the Figures in [SVG](http://en.wikipedia.org/wiki/Scalable_Vector_Graphics) format. If you ever need to change/modify any of the figures in the manual, try editing the SVG (e.g. in [Inkscape](http://www.inkscape.org/)), then export the updated image to PNG. Note that the SVGs were derived from an MS Powerpoint file, and I'm not 100% sure as to how easy it is to edit them.
For best results in Inkscape:
* select all the Figure elements by drawing a rectangle around them;
* then use *Export Bitmap* from the *File* menu;
* set the *Export area* to *Selection*, and *Width* to a value between 350 (smaller figures) and 400 (larger ones);
* export result to directory *images*, using the same base name as the SVG.
jpylyzer-1.18.0/doc/figuresSVG/ 0000775 0000000 0000000 00000000000 13147265102 0016263 5 ustar 00root root 0000000 0000000 jpylyzer-1.18.0/doc/figuresSVG/boxStructure.svg 0000664 0000000 0000000 00000045505 13147265102 0021526 0 ustar 00root root 0000000 0000000
jpylyzer-1.18.0/doc/figuresSVG/codestreamOutput.svg 0000664 0000000 0000000 00000201324 13147265102 0022355 0 ustar 00root root 0000000 0000000
jpylyzer-1.18.0/doc/figuresSVG/codestreamStructure.svg 0000664 0000000 0000000 00000131466 13147265102 0023066 0 ustar 00root root 0000000 0000000
jpylyzer-1.18.0/doc/figuresSVG/jp2FormatStructure.svg 0000664 0000000 0000000 00000131124 13147265102 0022573 0 ustar 00root root 0000000 0000000
jpylyzer-1.18.0/doc/figuresSVG/outputStructure.svg 0000664 0000000 0000000 00000157126 13147265102 0022301 0 ustar 00root root 0000000 0000000
jpylyzer-1.18.0/doc/images/ 0000775 0000000 0000000 00000000000 13147265102 0015504 5 ustar 00root root 0000000 0000000 jpylyzer-1.18.0/doc/images/boxStructure.png 0000664 0000000 0000000 00000032704 13147265102 0020731 0 ustar 00root root 0000000 0000000 ‰PNG
IHDR Ž ^“ sBIT|dˆ pHYs N N¿Ÿ¤( tEXtSoftware www.inkscape.org›î< IDATxœíwœTEòÀ¿,$› OQQ1£"(0õx†S¼3ž?³ÑóND=3§ž¨¨ˆ¢ EELË¡( V%Ãê÷GÕÛy;ìîÌ»;»K?Ÿù̼î~ýªßÌt½®î®`
Õjù€fY–ò$¨tî~´ kƒŸ€—€+€iÀààeàSà>à6/÷p)°xAUŠÈ`Šªž,"ß ³UõHùÈWÕEd"ÐHU»ŠÈ›@{UÝYDFªj[y8hî2v™ÿê×ì
œüp8°w1mx<ƒ¶=äåÒmÛrU=LD¦ µKѶû€i¶í<àQêý›
TQTUku€O€IY–§<Ù8øø,˲”'Ç;K€o€g€À
ÿ<X矿–ùço°ŽôàkàWÿü9¦tŸÅ~#€€©~½W™þùuàgÿ<XïŸßêùç÷€þyÖa«oÖÙ?ë×ýÜåøÕåzÆå,®mdضi¥lÛjÿ<¨Uж}â÷"¶Õr:wîLÇŽ *_~ù%3gÎD°§›aªzu¶…*/Ddpp¹ªÞ›myÊŽ=ÕÖPÕðÔZ…‘vÀìAƒÑ¿ÿ,KfäÈ‘Œ5ŠÙ$P¦t÷÷²*E ,XºH ]‚©^üèï[¼VuçwÙ HEP Õ‹ ªHÕga¶RHõ¢€ˆVÕgy¶RHõ"zjÍϪ²`çl¤"(êÅ ª&`«>?e[€@ AT/zC0aU~ɶ @*‚©^DOë²*E ,è”mTR½˜ ª«²-H`³ù9u‘@ »R½8@Dg[ÀfH ÒHõb™¿oȪ²`×l¤¢Vê"†ˆlˆªþ˜¢\s aRòJUÔOT"ÒHçÉ=_UøS~³ä<`aýP}ôTÕ•Ù¸¸ˆÔ¶6¨ê¼bʰ=°Îïc= °DU—uŽŸWÃÏ‹£À"U][&
¨\,N]¤ú²råJ–//¼¦N:4nܘš5kyN~~>K–,)”V£F
š7oNáY¹