pax_global_header00006660000000000000000000000064125041064500014507gustar00rootroot0000000000000052 comment=dddb05bffdd56175c49d5d235909062da4c53455 images-actives-html5.git/000077500000000000000000000000001250410645000155655ustar00rootroot00000000000000images-actives-html5.git/.gitignore000066400000000000000000000002011250410645000175460ustar00rootroot00000000000000.idea nbproject/ *.pyc src/converter/.coverage .coverage node_modules bower_components build doc/**.log *.aux *.out *.pdf *.toc images-actives-html5.git/CHANGELOG.md000066400000000000000000000267631250410645000174140ustar00rootroot00000000000000Version 1.1 - 23/03/2015 ------------------------------- - bugfix : chrome et chromium ne gérait pas correctement document.onload - popBlue et popYellow : les popup s'affichent si la description ou le titre sont présents - buttonBlue : le titre est désormais blanc - tous les thèmes : respect de la superposition des détails au moment du survol ou du focus - ajout des tests fonctionnels sur audioBrown, popBlue, popYellow, buttonBlue - Correctifs sur la documentation + ajout d'une section sur firefox OS Version 1.0 - 13/02/2015 ------------------------------- - bugfix : game1clic ne fonctionnait pas sur écrans retina et amoled - amélioration : le focus sur un détail est verrouillé même lorsque le pointeur sort de la zone Version 1.0-beta6 - 09/02/2015 ------------------------------- - nouveau : xia gère les ellipses et les cercles au sens SVG - bugfix : une image était hardcodée dans les thèmes de jeu - refactorisation de la documentation - mise à jour de la documentation - nouveau : documentation traduite en portugais - amélioration : images de fond supprimées et remplacées par des fonds bicolores. - amélioration : le moteur de wiki est compatible xhtml (préparation pour les exports epub3) - amélioration : ajout d'un logger qui s'adapte à la console voulue - amélioration : amélioration notoire des effets de zoom qui sont plus fluides et plus rapides - nouveau : changement de l'interface de XIA en ajoutant des logos plus significatifs - nouveau : simplification de l'interface paramètres - mise à jour des tests fonctionnels - amélioration : les thèmes de jeu ont été légèrement retouchés pour améliorer l'expérience utilisateur - bugfix : suppression des contours des détails s'ils sont mentionnés comme "none" dans inkscape Version 1.0-beta5 - 19/01/2015 ------------------------------- - bugfix : gestion des noms avec caractères accentués dans les sessions windows - amélioration : suppression des zones transparentes inutiles sur les images - gameDragAndDrop : si le clic est désactivé, le lien direct fonctionne encore - développeurs : les fichiers hook.js peuvent être édités pour ajouter des fonctionnalités - bugfix : suppression des détails qui contiennent des paramètres invalides - pikipiki : insensible à la casse - MAC OS X : PIL est utilisé de base. - Amélioration : toutes les metadatas sont prises en compte - IA 1 : prise en compte du facteur zoom sur les fichiers .xia - Amélioration : les contours des détails sont définis dans le svg et ne sont donc plus rouges par défaut. - bugfix : les chemins réseaux n'étaient pas gérés correctement Version 1.0-beta4 - 21/11/2014 ------------------------------- - XIA est compatible avec les ressources issues de IA1 - Le mode "lier les images" d'inkscape n'a désormais plus d'incidence sur XIA - bugfix : les mots de passe du module quiz peuvent comporter des caractères accentués - Les vidéos et les sons s'arrêtent à la fermeture des popups - Si la description d'un détail est vide, la popup liée n'est plus visible - AccordionBlack : l'accordéon laisse apparaître un ascenseur vertical s'il est trop long - Le moteur de zoom dans les images interactives est plus fluide et plus rapide - gameDragAndDrop : la balise existe maintenant aussi de manière globale. De plus, si elle est sur "on", toutes les zones de drop sont aimantées pour tous les détails. - bugfix : les transformations du plan appliquées sur des groupes imbriqués fonctionnent désormais comme prévu. - Mise en place des nouveaux logos xia - gameclic : grosse amélioration de la vitesse de détection des zones de survol - Export fichier unique disponible - Export firefox os en option - moteur de wiki : les liens relatifs sont autorisés dans les hyperliens - Système de double-scoring disponible dans gameclic - mise à jour de la documentation - développement des tests fonctionnels en cours Version 1.0-beta3 - 29/10/2014 ------------------------------- - XIA est disponible en mode console. - LibreOffice Draw : XIA peut lire les sorties svg issues de libreoffice draw (sauf pour le thème gameDragAndDrop) - Système de "double-scoring" disponible sur game1clic - hotfix : amélioration de la gestion de la mémoire dans les thèmes des images interactives - Dans gameDragAndDrop, les zones de drop peuvent maintenant déclencher l'ouverture d'une nouvelle page au moment du drop. - Chemins relatifs disponibles dans les liens entre crochets - Les listes à puces sont désormais "formattables". - hotfix : bug sur le module quiz avec un mot de passe. Version 1.0-beta2 - 23/10/2014 ------------------------------- - XIA est compatible Inkscape 0.47 en tant qu'extension - Mise à jour de la documentation + internationalisation - Système de réponse générique avec mot de passe possible - Correctif : bug dans kinetic bloquant pour IE11 sur gameDrag&Drop Version 1.0-beta1 - 12/10/2014 ------------------------------- - Correctif : les bandes sons ne s'arrêtaient pas lorsqu'on changeait de détail - Mise à jour des documentations + refactorisation du code - Ajout de la documentation en anglais - Reconstruction de la procédure de build - Correctif : les tests unitaires ne passaient plus à cause d'un chemin erroné - Suppression de la dépendance avec bootstrap dans les thèmes accordion - Ajout d'informations plus explicites dans les infos-bulles Version 1.0-alpha9 - 05/10/2014 ------------------------------- - Correction d'une regression sur les détourages dans game1clic - Echappement des titres quand ils contiennent des double quotes Version 1.0-alpha8 - 01/10/2014 ------------------------------- - Séparation du package debian et du code source - Ajout de la fonctionnalité info-bulles sur les 2 thèmes de jeu - Les zones de drop dans gameDragAndDrop sont cliquables si leur titre est une url - soumis à évaluation : limitation de la largeur des jeux gameDragAndDrop à 1000 pixels de large max pour éviter des problèmes de performance sur des grands écrans. - Refactorisation du code des thèmes de jeu. - Refactorisation du code pour respecter la "debian policy" Version 1.0-alpha7 - 29/09/2014 ------------------------------- - Doc : mise à jour des docs de prise en main - Bouton de bascule ajouté sur les messages de succès dans les thèmes game\* - hotfix : les balises vidéos plantaient les zooms - hotfix : les détails "chemin" hors image de fond crashaient l'application html5 - Ergonomie : amélioration du visuel de la popup d'introduction Version 1.0-alpha6 - 25/09/2014 ------------------------------- - Doc : mise à jour des docs de prise en main - Correctif : reprise du manifest firefox OS - Ergonomie : sur gameDragAndDrop, les images n'ont plus besoin d'être sur fond blanc - Ergonomie : sur popBlue, lors d'une clic sur un détail, le pointeur ne se transforme plus en loupe. - Ergonomie : sur gameDragAndDrop, les zones de drop sont par défaut insensibles au clic - Correctif : gameDragAndDrop -> régression sur les popup Version 1.0-alpha5 - 23/09/2014 ------------------------------- - Correctif : Modification de l'internationalisation pour MAC OS X - Ergonomie : Suppression de l'oeil sur tous les thèmes - Ergonomie : Ajout d'une popup de démarrage sur game1clic et gameDragAndDrop pour permettre l'affichage de consignes (champ description des metadonnées) - Correctif : xia ne gérait pas (sic) les groupes de détails imbriqués ! - Correctif : xia plantait sur des images de taille bien précise. - Ergonomie : il est désormais possible d'afficher un pointeur de sélection au survol d'un détail dans game1clic (onmouseover=pointer) - Optimisation : amélioration du système de détourage automatique pour définir la zone de hit de chaque détail - Correctif : Les propriétés des détails étaient propagées aux groupes qui les contenaient (propagation de off par exemple)...à surveiller, risque de régression. Version 1.0-alpha4 - 15/09/2014 ------------------------------- - Ajout de l'internationalisation - Changement de nom de l'application - relooking des boutons de l'interface de génération des IAs - Ajout d'une fenêtre "paramètres" qui sera enrichie par la suite. Actuellement, elle ne propose qu'une seule option. Vous pouvez contrôler la qualité de l'image rendue. - Réduction du Critical Rendering Path - Minification des CSS et des JS. - Désormais, les images de fond dans inkscape n'ont plus besoin d'être alignées dans le coin supérieur gauche. La gestion des calques a également été améliorée. - Ajout d'une nouvelle fonctionnalité dans les images actives : les LIENS DIRECTS. Pour cela, il suffit de mettre un lien absolu ou relatif dans le titre du détail. - Tous les fichiers utiles pour créer une app Firefox OS sont désormais installés par défaut dans chaque IA générée - Via les metadonnées opengraph, les IA générées peuvent être affichées dans les réseaux sociaux (Facebook, twitter...) - Grosse amélioration du drag and drop sur le thème gameDragAndDrop - Les images dans game1clic réagissent uniquement sur les pixels opaques (comme pour gameDrag&Drop) - Mise en cache des images pour accélérer le traitement dans gameDragAndDrop et game1clic - ajout d'un lanceur executable pour Windows Version 1.0-alpha3 - 02/07/2014 ------------------------------- - Ajout d'une popup durant la génération d'une image active - L'image de fond n'est plus estompée durant la lecture de la description générale - L'image de fond est embarquée même si elle est liée dans Inkscape - pikipiki : ajout des liens hypertexte - Conservation des chemins vers source et destination pour génération des images actives - Améliorations importantes du packaging - Images persistantes si elles ont un fond blanc - Masquage des fichiers cachés lors de la recherche d'un fichier svg dans le filesystem - tests unitaires ajoutés - tests fonctionnels sur les thèmes ajoutés - Ajout de la gestion des metadonnées - popup disponible dans les thèmes pour afficher les metadonnées - Ajout des thèmes popBlue, popYellow, audioBlue, buttonBlue - Ajout des bordures sur les détourages Version 1.0-alpha2 - 30/04/2014 ------------------------------- - L'outil standalone est packagé pour debian (François Lafont) - Grosse optimisation du moteur html5 pour qu'il gère les images actives de grande taille (pb signalé par Patrice Raynaud et Isabelle Perucho) - Un nouveau thème "AccordionCloud" est disponible (Wahid Mendil) - Pour ajouter un nouveau thème à partir d'un existant, il suffit de dupliquer un thème dans le répertoire iaConvert/themes - Les chemins utilisés sont désormais persistants - Ajout de la notion de puce: Par convention, une image définie avec un fond blanc est considérée comme une puce. De plus, un détourage sur fond blanc devient persistant. (signalé par Marie Persiaux) - Les images liées ou incorporées dans InkScape sont traitées de la même façon (pb signalé par Isabelle Perucho sur MAC OS X 10.6) - Un splash screen s'affiche durant la génération (feature demandée par Louis-Maurice De Sousa) - Réglage d'un problème de zindex sur les détails (pb signalé par Isabelle Perucho) - expérimental : ajout du fullscreen en cliquant sur le titre d'une image active - Effet de zoom optimisé pour éviter le memory leaking sur Firefox et Iceweasel - Prise en compte des images dans les descriptions (demandé par Aurélie Chauvet) - Prise en compte des iframes dans les descriptions (demandé par Marie Persiaux pour vidéos youtube - fonctionne aussi avec les vidéos de la scolawebtv) - Prise en compte des liens wiki de la forme [http(s)://link key_word] (demandé par Serge Raynaud) images-actives-html5.git/Gruntfile.js000066400000000000000000000135721250410645000200720ustar00rootroot00000000000000module.exports = function(grunt) { var vendorsPath = 'build/share/vendors'; var jqueryPath = 'bower_components/jquery/dist/jquery.min.js'; var labjsPath = 'bower_components/labjs/LAB.min.js'; var kineticPath = 'bower_components/kineticjs/kinetic.min.js'; var bootstrapPath = 'bower_components/bootstrap/dist/js/bootstrap.min.js'; var locales = ["en_US", "fr_FR"]; var themesArray = [ "accordionBlack", "accordionCloud", "audioBrown", "popBlue", "popYellow", "buttonBlue", "game1clic", "gameDragAndDrop" ]; var jsfiles = [ "iaobject.js", "hooks.js", "iascene.js", "iframe.js", "main.js" ]; var _ = require('lodash'); var mos = _.map(locales, function(locale){ return 'build/share/i18n/' + locale + '/LC_MESSAGES/xia-converter.mo'; }); var pos = _.map(locales, function(locale){ return 'build/share/i18n/' + locale + '/LC_MESSAGES/xia-converter.po'; }); var xiajs = _.map(themesArray, function(theme){ return 'build/share/themes/' + theme + '/js/xia.js'; }); var jsfilestoconcat = _.map(themesArray, function(theme){ var map = _.map(jsfiles, function(jsfile){ return 'src/share/themes/' + theme + '/js/'+jsfile; }); return map; }); var jsfilestoremove = _.map(themesArray, function(theme){ var map = _.map(jsfiles, function(jsfile){ return 'build/share/themes/' + theme + '/js/'+jsfile; }); return map; }); // Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), clean: { build: ['build'], js: jsfilestoremove }, chmod: { options: { mode: '744' }, yourTarget1: { // Target-specific file/dir lists and/or options go here. src: ['build/xia.py'] } }, copy: { main: { expand: true, src: '**', dest: 'build/', cwd : 'src', }, jquery: { files: [ {dest: vendorsPath + "/jquery.min.js", src: jqueryPath} ] }, labjs: { files: [ {dest: vendorsPath + '/LAB.min.js', src:labjsPath} ] }, kinetic: { files: [ {dest: vendorsPath + '/kinetic.min.js', src:kineticPath} ] } }, pot: { options:{ text_domain: 'xia-converter', // Produces messages.pot dest: 'build/share/i18n/', // directory to place the pot file keywords: ['gettext', '__', 'translate'], // functions to look for encoding: 'UTF-8' }, files:{ src: [ 'build/**/*.py' ], expand: true, } }, dirs: { lang: 'build/share/i18n', }, potomo: { dist: { files: _.object(mos, pos) } }, shell: { options: { failOnError: true }, msgmerge: { command: _.map(locales, function(locale) { var po = "build/share/i18n/" + locale + "/LC_MESSAGES/xia-converter.po"; var po_src = "src/share/i18n/" + locale + "/LC_MESSAGES/xia-converter.po"; return "if [ -f \"" + po + "\" ]; then\n" + " echo \"Updating " + po + "\"\n" + " msgmerge " + po + " build/share/i18n/xia-converter.pot > .new.po.tmp\n" + " exitCode=$?\n" + " if [ $exitCode -ne 0 ]; then\n" + " echo \"Msgmerge failed with exit code $?\"\n" + " exit $exitCode\n" + " fi\n" + " cp .new.po.tmp " + po + "\n" + " mv .new.po.tmp " + po_src + "\n" + "else \n" + " cp build/share/i18n/xia-converter.pot " + po + "\n" + " cp build/share/i18n/xia-converter.pot " + po_src + "\n" + "fi\n"; }).join("") } }, jshint: { all: ['Gruntfile.js', 'src/**/*.js', '!src/**/jquery-1.11.1.js', '!src/**/LAB.js', '!src/**/kinetic.js'] }, nose: { options: { verbosity: 2, with_coverage: true }, src: ['tests'] }, uglify: { kinetic_xia: { files: { 'build/share/themes/game1clic/js/kinetic-xia.min.js': ['src/share/themes/game1clic/js/kinetic-xia.js'], 'build/share/themes/gameDragAndDrop/js/kinetic-xia.min.js': ['src/share/themes/gameDragAndDrop/js/kinetic-xia.js'], } } }, concat: { options: { separator: ';', }, jsfiles: { files: _.zipObject(xiajs,jsfilestoconcat) }, } }); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-contrib-clean'); grunt.loadNpmTasks('grunt-potomo'); grunt.loadNpmTasks('grunt-pot'); grunt.loadNpmTasks('grunt-shell'); grunt.loadNpmTasks('grunt-chmod'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-nose'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.registerTask('default', ['clean:build', 'copy:main' , 'pot', 'shell:msgmerge', 'potomo', 'chmod', 'concat:jsfiles', 'clean:js']); grunt.registerTask('minify', ['uglify:kinetic_xia']); grunt.registerTask('copy_vendors_js', ['copy:jquery' , 'copy:kinetic', 'copy:labjs']); grunt.registerTask('full', function(){ grunt.task.run('default'); grunt.task.run('copy_vendors_js'); grunt.task.run('minify'); }); grunt.registerTask('debianbuild', function(){ grunt.task.run('default'); grunt.task.run('minify'); }); grunt.registerTask('dev', function(){ grunt.task.run('default'); grunt.task.run('copy_vendors_js'); }); grunt.registerTask('tests', ['jshint']); }; images-actives-html5.git/README.md000066400000000000000000000023561250410645000170520ustar00rootroot00000000000000# XIA This tool is used to generate pedagogical html5 resources. Thanks to it, you can generate three kinds of resources : - first ones : Images actives. It is simple images on which we can make a focus on some details by zooming and adding descriptions. - second ones : games using what we call the "1 click with scoring". - third ones : games using what we call the "drag and drop with scoring" and "drag and drop without scoring" # Build application in Debian Jessie ```sh apt-get install -y libjavascript-minifier-perl gettext python cd project python setup.py buildstandalone ``` # obsolete - keep it just for a while First, install nodejs : apt-get install nodejs nodejs-legacy npm nodejs-legacy is used to be able to call nodejs just with "node". Finally, install grunt and lodash (used in this project): npm install -g grunt-cli npm install lodash npm install -g bower App pre-install (launch just once): cd project npm install bower install App install : (must be used each time we want a new release) cd project grunt full Application is then built in project/build # How to deploy on gitlab-ci [Doc](https://gitlab.crdp.ac-versailles.fr/pascal.fautrero/scripts/blob/master/gitlab-ci/xia/README.MD)images-actives-html5.git/bower.json000066400000000000000000000010031250410645000175700ustar00rootroot00000000000000{ "name": "XIA", "version": "1.0", "authors": [ "Pascal Fautrero " ], "description": "XIA is a svg to html5 converter to generate interactives resources", "license": "GPL3.0", "homepage": "http://images-actives.crdp-versailles.fr/beta", "ignore": [ "**/.*", "node_modules", "bower_components", "test", "tests" ], "dependencies": { "jquery": "~2.1.1", "bootstrap": "~3.2.0", "labjs": "*", "kineticjs": "~5.1.0" } } images-actives-html5.git/doc/000077500000000000000000000000001250410645000163325ustar00rootroot00000000000000images-actives-html5.git/doc/README.MD000066400000000000000000000005511250410645000175120ustar00rootroot00000000000000# Generate .pot file from text po4a-gettextize -f latex -m documentation.tex -M UTF8 -p en_EN.pot # Generate translation po4a-translate -f latex -m documentation.tex -M UTF8 -p fr/documentation-fr_FR.po -l documentation-fr.tex # Update translations when source document changes po4a-updatepo -f latex -m documentation.tex -M UTF8 -p fr/documentation-fr_FR.po images-actives-html5.git/doc/documentation-en_EN.pot000066400000000000000000001574261250410645000227300ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2014-10-16 10:58+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: Plain text #: ./preambule.tex #: :43 msgid "\\def\\purpledane{violet}" msgstr "" #. type: hypersetup{#1} #: ./preambule.tex #: :53 msgid "" "pdftitle={Xia}, pdfauthor={Énuma Logiciel Libre}, pdfsubject={Xia}, " "pdfkeywords={Xia, logiciel libre, html5, Inkscape}, colorlinks= true, " "linkcolor = greendane, urlcolor = bluedane" msgstr "" #. type: title{#1} #: ./preambule.tex #: :58 msgid "Xia" msgstr "" #. type: title{#1} #: ./preambule.tex #: :58 msgid "Create HTML5 \"images-actives\"" msgstr "" #. pour unifier les indications relatives aux manipulation à effectuer dans les logiciels #. à modifier au besoin #. type: newcommand{#4} #: ./preambule.tex #: :66 msgid "\\texttt{\\textcolor{reddebian}{#1}}" msgstr "" #. L'environnement alerte #. type: newcommand{#4} #: ./preambule.tex #: :70 msgid "\\textdbend" msgstr "" #. type: tikzpicture #: ./preambule.tex #: :78 msgid "\\node{\\virageDanger};" msgstr "" #. Style pour la boîte alerte #. type: Plain text #: ./preambule.tex #: :81 msgid "" "\\tikzstyle{boitealerte}=[draw=red,rounded corners,inner xsep=1em,inner " "ysep=1ex]" msgstr "" #. Style pour la boule alerte #. type: Plain text #: ./preambule.tex #: :84 msgid "\\tikzstyle{boulealerte}=[circle,ball color=red,text=white]" msgstr "" #. On sauve dans \boiteBrouillon le contenu #. Fin. Attention lrbox stocke du contenu sur 1 ligne (pas de paragrpahe) #. La boîte peut être utilisée via \usebox{\boiteBrouillon} #. type: lrbox #: ./preambule.tex #: :105 ./preambule.tex #: :139 documentation.tex:2 msgid "{\\boiteBrouillon}" msgstr "" #. type: tikzpicture #: ./preambule.tex #: :105 msgid "" "\\node [boitealerte] (cadre) " "{\\hspace{0.5\\LargeurBouleAlerte}\\usebox{\\boiteBrouillon}};\\node " "[boulealerte] (alerte) at (cadre.west) {\\virageDanger};" msgstr "" #. L'environnement astuce #. type: newcommand{#4} #: ./preambule.tex #: :108 msgid "\\large\\leftthumbsup" msgstr "" #. type: tikzpicture #: ./preambule.tex #: :115 msgid "\\node{\\pouceOK};" msgstr "" #. type: Plain text #: ./preambule.tex #: :117 msgid "\\tikzstyle{bouleastuce}=[circle,ball color=teal,text=white]" msgstr "" #. type: Plain text #: ./preambule.tex #: :119 msgid "" "\\tikzstyle{boiteastuce}=[draw=teal,rounded corners,inner xsep=1em,inner " "ysep=1ex]" msgstr "" #. type: tikzpicture #: ./preambule.tex #: :139 msgid "" "\\node [boiteastuce] (cadre) " "{\\hspace{0.5\\LargeurBouleAstuce}\\usebox{\\boiteBrouillon}};\\node " "[bouleastuce] (astuce) at (cadre.west) {\\pouceOK};" msgstr "" #. L'environnement links #. type: newcommand{#4} #: ./preambule.tex #: :142 msgid "\\large\\leftpointright" msgstr "" #. type: tikzpicture #: ./preambule.tex #: :149 msgid "\\node{\\mainDroite};" msgstr "" #. type: Plain text #: ./preambule.tex #: :151 msgid "\\tikzstyle{boulelinks}=[circle,ball color=\\purpledane,text=white]" msgstr "" #. type: Plain text #: ./preambule.tex #: :153 msgid "" "\\tikzstyle{boitelinks}=[draw=\\purpledane,rounded corners,inner " "xsep=1em,inner ysep=1ex]" msgstr "" #. type: tikzpicture #: documentation.tex:2 msgid "" "\\node [boitelinks] (cadre) " "{\\hspace{0.5\\LargeurBouleLinks}\\usebox{\\boiteBrouillon}};\\node " "[boulelinks] (links) at (cadre.west) {\\mainDroite};" msgstr "" #. type: section{#2} #: documentation.tex:10 msgid "Introducing Xia" msgstr "" #. type: subsection{#2} #: documentation.tex:12 msgid "What is Xia ?" msgstr "" #. type: document #: documentation.tex:20 msgid "" "Xia is a free software developped by teachers from the french academy of " "Versailles. It is released under " "\\href{http://www.gnu.org/copyleft/gpl.html}{GPLv3} license. Xia converter " "takes a svg file as input and outputs an \"image-active\" in html5. Beyond " "the already known templates export of Images-Actives software " "(\\href{http://images-actives.crdp-versailles.fr/spip.php?article11\\&lang=fr} " "{accordion, buttons, etc.}), Xia allows to generate interactive activities : " "drag and drop games, discrimination, selection, etc." msgstr "" #. type: document #: documentation.tex:24 msgid "" "First sections of this documentation (see section \\ref{basic_imageactive}) " "are dedicated to make a very simple \"image-active\": cropped details with " "comments only made of plain text. Then, you will learn how to create an " "enriched \"image-active\" (see section \\ref{enriched_IA}). Final sections " "(section \\ref{games_IA}) will teach you to create games." msgstr "" #. type: astuce #: documentation.tex:31 msgid "" "All examples are on line (links and downloads available at the beginning of " "each section). At the end of each section, a heading \"Abstract\" presents " "the essential guide lines to remember when creating an \"image-active\"." msgstr "" #. type: subsection{#2} #: documentation.tex:33 msgid "General process" msgstr "" #. type: document #: documentation.tex:39 msgid "" "Unlike \"ImagesActives\", Xia is only needed at the end of the process. As " "we can see on figure \\ref{workflowxia}, most of the work is done with a " "vector graphics editor. We recommend using the free open-source and " "muliplatform software \\href{http://www.inkscape.org/}{Inkscape}, which is " "really easy to use (Inkscape will be used in this document)." msgstr "" #. type: figure #: documentation.tex:68 msgid "" "\\tikzstyle{box} = [draw, text width=.6\\textwidth, align=center] " "\\tikzstyle{ia} = [draw, text width=.8\\textwidth, fill=reddebian!80, " "rounded corners, inner ysep=2mm] \\tikzstyle{xia} = [draw, text " "width=.8\\textwidth, fill=bluedane!80, rounded corners, inner ysep=2mm]" msgstr "" #. type: tikzpicture #: documentation.tex:68 msgid "" "\\node[box] (open) {Open an Image in Inkscape}; \\node[box,below of=open] " "(create) {Create details in image}; \\node[box,below of=create] (meta) {For " "each detail, edit metadata}; \\node[box,below of=meta] (save) {Save " "project}; \\node[left of=create,xshift=-.37\\textwidth, rotate=90] (scape) " "{\\textbf{Inkscape}};" msgstr "" #. type: scope #: documentation.tex:68 msgid "\\node[fit = (open)(meta)(save)(scape), ia] (ink) {};" msgstr "" #. type: tikzpicture #: documentation.tex:68 msgid "" "\\node[box,below=1cm of save] (createia) {Create an \"image-active\" in " "html5}; \\node[left of=createia,xshift=-.37\\textwidth, rotate=90] (xia) " "{\\textbf{Xia}};" msgstr "" #. type: scope #: documentation.tex:68 msgid "\\node[fit = (createia)(xia), xia] (ink) {};" msgstr "" #. type: tikzpicture #: documentation.tex:68 msgid "" "\\draw[-stealth] (open) -- (create); \\draw[-stealth] (create) -- (meta); " "\\draw[-stealth] (meta) -- (save); \\draw[-stealth] (save) -- (createia);" msgstr "" #. type: caption{#2} #: documentation.tex:68 msgid "Creation process of an \"image-active\" with Xia" msgstr "" #. type: subsection{#2} #: documentation.tex:70 msgid "Installing Inkscape and Xia" msgstr "" #. type: document #: documentation.tex:76 msgid "" "Having Inkscape and Xia installed on your computer is the only thing you " "need to read this documentation. You will find any relevant information " "about the installation of these softwares on their websites\\footnote{See " "the site \\href{http://www.inkscape.org/}{Inkscape} and \\href " "{http://images-actives.crdp-versailles.fr/beta/}{Xia}.}." msgstr "" #. type: section{#2} #: documentation.tex:78 msgid "" "Creating your first \"image-active\" using Inkscape and Xia: \\emph{Basic " "features}" msgstr "" #. type: subsection{#2} #: documentation.tex:80 msgid "Building the svg source file to generate an \"image-active\"" msgstr "" #. type: links #: documentation.tex:83 msgid "" "Explore the " "\\href{http://images-actives.crdp-versailles.fr/beta/demo/tuto/xia1}{\"image-active\"} " "created for this section of the documentation." msgstr "" #. type: links #: documentation.tex:86 msgid "" "Download the " "\\href{http://images-actives.crdp-versailles.fr/beta/demo/tuto/xia1/svg/xia1.svg}{svg} " "source file." msgstr "" #. type: document #: documentation.tex:93 msgid "" "Manipulations described in this section will help you to create a \"basic\" " "\"image-active\" featuring:" msgstr "" #. type: itemize #: documentation.tex:93 msgid "Zoom-in enabled details" msgstr "" #. type: itemize #: documentation.tex:93 msgid "Comments on details only made of plain text" msgstr "" #. type: document #: documentation.tex:96 msgid "Once you have chosen the image you will work with, open it with Inkscape:" msgstr "" #. type: document #: documentation.tex:98 msgid "\\chemin{File $\\rightarrow$ Open}" msgstr "" #. type: document #: documentation.tex:100 msgid "" "When asked by the software if you wish to \"\\chemin{Link}\" or " "\"\\chemin{Incorporate image}\", choose \"\\chemin{Incorporate}\"." msgstr "" #. type: document #: documentation.tex:108 msgid "" "Among the many details that you can learn by accessing the dialog window " "\\chemin{document Metadata} (\\chemin {File} menu), three will be included " "in the \"image-active\" once generated : title, creator, rights. It is " "strongly recommended to type in this information (see what it looks like " "once generated on figure \\ref{titre_ia})\\footnote{The fields \"author\" " "and \"rights\" appear in the window \"About\", symbolized by a clickable " "button shaped like the letter \"i\"}." msgstr "" #. type: caption{#2} #: documentation.tex:118 msgid "" "The title entered in the metadata of the document appears above the " "\"image-active\" and gives its name to the web page. The creator and rights " "appear in the pop up associated with the \"i\" button on the right of the " "title of the \"image-active\"." msgstr "" #. type: document #: documentation.tex:121 msgid "" "You can save the image in svg format in the earlywork, through \\chemin{File " "$\\rightarrow$ Save as\\ldots}." msgstr "" #. type: document #: documentation.tex:125 msgid "" "For more clarity, you should remove the current extension of the image in " "the field \\chemin{Name} of the dialog window. Finally, in the dropdown " "menu, choose the Inkscape svg file format:" msgstr "" #. type: document #: documentation.tex:127 msgid "\\chemin{SVG Inkscape (*.svg)}." msgstr "" #. type: document #: documentation.tex:136 msgid "" "Several Inkscape tools can be used to clip the details that will become " "active in the animation generated by Xia. Among these:" msgstr "" #. type: itemize #: documentation.tex:136 msgid "\\chemin{Create rectangles and squares}" msgstr "" #. type: itemize #: documentation.tex:136 msgid "\\chemin{Create circles, ellipses and arcs}" msgstr "" #. type: itemize #: documentation.tex:136 msgid "\\chemin{Draw freehand lines}" msgstr "" #. type: itemize #: documentation.tex:136 msgid "" "\\includegraphics[scale=0.5]{./images/bezier} \\chemin{Bezier curves and " "straight lines}" msgstr "" #. type: document #: documentation.tex:144 msgid "" "Without going in the detail of how these tools work\\footnote{For this, " "refer to " "\\href{http://inkscape.org/doc/shapes/tutorial-shapes.fr.html}{Inkscape " "manual} or \\href{http://en.flossmanuals.net/inkscape/}{Floss manual}.} note " "that the tool \"\\chemin{Draw Bezier curves and straight lines}\" allows to " "crop \"click by click\" (work points are called \"nodes\"). You close the " "figure by clicking on the start node. You can draw \"\\chemin{Bezier " "curves}\" by keeping the mouse button pressed after creating a node, then " "moving the cursor to bring up the control handles to shape the curve segment " "as desired." msgstr "" #. type: alerte #: documentation.tex:149 msgid "" "If you set a left open shape in Inkscape (for example a line), Xia will " "automatically close it by connecting a straight line between the beginning " "and the end of it." msgstr "" #. type: alerte #: documentation.tex:157 msgid "" "The order of creation of details in Inkscape will be the same in the html5 " "\"image-active\" (for example: the first created detail in Inkscape will " "appear at the top of the \"image-active\"). If you wish to change the " "sequence without having to create the details once more, see section " "\\ref{couche_XML}." msgstr "" #. type: document #: documentation.tex:160 msgid "" "Once you have cut out a detail, you can select it with the tool " "\\chemin{Select and transform object} to resize it, move it\\ldots" msgstr "" #. type: astuce #: documentation.tex:165 msgid "" "If you have some difficulties to select the details you have drawn, apply a " "colour background to them. Choose whatever colour you like, except for black " "and white (see why in section \\ref{white_black_background})." msgstr "" #. type: document #: documentation.tex:170 msgid "" "You can access to the \\chemin{Object properties} (see illustration " "\\ref{objet_properties}) by right-clicking on the cut-out detail. Thus you " "also access to the dialog window in which you add the text to be associated " "with the detail in the \"image-active\"." msgstr "" #. type: caption{#2} #: documentation.tex:177 msgid "" "The \"\\chemin{Object properties}\" allows to enter the text that will " "become a comment on the detail in the \"image-active\"" msgstr "" #. type: document #: documentation.tex:181 msgid "" "The two fields to be filled in this window are \\chemin{Title} and " "\\chemin{Description}. The title filled in here will be that of the detail, " "description will be its comment." msgstr "" #. type: document #: documentation.tex:185 msgid "" "The process described above must also be done with the background image : " "the title and description indicated here will serve as an introduction to " "the \"image-active\" (title and comment not related to a particular detail)." msgstr "" #. type: subsection{#2} #: documentation.tex:187 msgid "Generating the \"image-active\" with Xia" msgstr "" #. type: document #: documentation.tex:191 msgid "" "When all the details are clipped and their metadata indicated, Xia can be " "launched (see figure \\ref{xia_interface}). You must select the svg source " "file with the top left icon, choose the export quality (on a scale from 1 to " "4), and then choose a template and the destination folder of the " "\"image-active\"." msgstr "" #. type: document #: documentation.tex:195 msgid "" "Clicking on one of the template icons generates a series of files and " "folders. Open the \\chemin{index.html} file in a webbrowser to see the " "html5 image-active." msgstr "" #. type: alerte #: documentation.tex:202 msgid "" "This file will not display anything if used alone. All the other files and " "directories generated during the export process must be stored in the same " "folder (see figure \\ref{xia_files}) as the \\texttt{index.html} file so " "that the animation works properly. \\textbf{It is therefore essential to " "dedicate a specific directory for each exported image}." msgstr "" #. type: figure #: documentation.tex:238 msgid "" "\\tikzstyle{every node}=[draw=black,thick,anchor=west] " "\\tikzstyle{auto}=[draw=reddebian,fill=reddebian!30, text height=2.5mm] " "\\tikzstyle{manual}=[draw=bluedane,fill=bluedane!30, text height=2.5mm] " "\\tikzstyle{manualT}=[fill=bluedane!30,draw=bluedane, rectangle,text " "width=5cm, rounded corners] " "\\tikzstyle{autoT}=[fill=reddebian!30,draw=reddebian, rectangle,text " "width=5cm, rounded corners]" msgstr "" #. type: tikzpicture #: documentation.tex:238 msgid "" "[grow via three points={one child at (0.5,-0.7) and two children at " "(0.5,-0.7) and (0.5,-1.4)}, edge from parent path={(\\tikzparentnode.south) " "|- (\\tikzchildnode.west)}] \\node [manual] {my\\_project/} child { node " "[auto] {index.html}}\t\t child { node [auto] {deploy.html}}\t\t child { node " "[auto] {manifest.webapp}}\t\t child { node [auto] {css/}} child { node " "[auto] {data/}} child { node [auto] {font/}} child { node [auto] {img/}} " "child { node [auto] {js/}} child { node [manual] {videos/} child { node " "[manual] {video.mp4}} child { node [manual] {video.ogv}} child { node " "[manual] {video.webm}} }; \\node[manualT] (textM) at (10,-2) {These files " "and folders have been manually created by the \"image-active\" designer. The " "folder \\textcolor{bluedane} {videos} was also manually created, in order to " "host videos inserted in the comments of the \"image-active\" using relative " "links.}; \\node[autoT] (textA) at (10,-6) {Files and folders generated by " "Xia from the svg source file.}; \\draw[-stealth] (textM.west) -- (4,0); " "\\draw[-stealth] (textM.west) -- (5.5,-7); \\draw[-stealth] (textA.west) -- " "(4,-3);" msgstr "" #. type: caption{#2} #: documentation.tex:238 msgid "Files of an \"image-active\"" msgstr "" #. type: figure #: documentation.tex:254 documentation.tex:538 msgid "\\tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded corners]" msgstr "" #. \draw[help lines] (0,0) grid (5,5); #. icons #. type: tikzpicture #: documentation.tex:254 msgid "" "\\node (bBlue) {\\includegraphics[scale=.35]{./images/buttonBlue}}; " "\\node[left= .8mm of bBlue, opacity=.5] (aBrown) " "{\\includegraphics[scale=.35]{./images/audioBrown}}; \\node[right= .8mm of " "bBlue, opacity=.5] (guClic) " "{\\includegraphics[scale=.35]{./images/game1clic}}; \\node[below= .2mm of " "bBlue.south] (pBlue) {\\includegraphics[scale=.35]{./images/popBlue}}; " "\\node[left= .8mm of pBlue, opacity=.5] (gDDrop) " "{\\includegraphics[scale=.35]{./images/gameDragAndDrop}}; \\node[right= .8mm " "of pBlue] (pYellow) {\\includegraphics[scale=.35]{./images/popYellow}}; " "\\node[above = .2mm of guClic.north] (aCloud) " "{\\includegraphics[scale=.35]{./images/accordionCloud}}; \\node[above = .2mm " "of aCloud.north] (aBlack) " "{\\includegraphics[scale=.35]{./images/accordionBlack}}; \\node[left = .2mm " "of aBlack] (params) {\\includegraphics[scale=.35]{./images/params}}; " "\\node[left = .2mm of params] (files) " "{\\includegraphics[scale=.35]{./images/xia_open}};" msgstr "" #. comments #. type: tikzpicture #: documentation.tex:269 msgid "" "\\node[box, text width=2.5cm,above left = 5mm of files] (filesC) {Select the " "svg source file}; \\node[box, above = 5mm of params] (paramsC) {Select the " "quality of the export}; \\node[box,above right = 5mm of aCloud.north east] " "(aBlackC) " "{\\href{http://geoffrey-gekiere.ac-versailles.fr/xia1/accordionBlack}{accordionBlack}\\\\ " "Large comment zone, suitable for the insertion of multimedia resources; to " "be used with vertical images (portrait)}; \\node[box, right = 5mm of guClic] " "(aCloudC) " "{\\href{http://geoffrey-gekiere.ac-versailles.fr/xia1/accordionCloud}{accordionCloud}\\\\ " "Narrow comment zone, with more space for the image itself ; to be used with " "horizontal images (landscape)}; \\node[box, below right = 5mm of pYellow] " "(pYellowC) " "{\\href{http://geoffrey-gekiere.ac-versailles.fr/xia1/popYellow}{popYellow}\\\\ " "No lateral comment zone ; a first click on the detail reveals it, and a " "second one simultaneously unveils the comment and the zoom function zooms in " "the detail}; \\node[box, left = 25mm of bBlue] (bBlueC) " "{\\href{http://geoffrey-gekiere.ac-versailles.fr/xia1/buttonBlue}{buttonBlue}\\\\ " "No lateral comment zone ; comments appear above the image (suitable for long " "comments) ; the users access the comments through icons placed above the " "\"image-active\"}; \\node[box, below left = 5mm of pBlue] (pBlueC) " "{\\href{http://geoffrey-gekiere.ac-versailles.fr/xia1/popBlue}{popBlue}\\\\ " "No lateral comment zone; a first click on the detail reveals it, and a " "second one pops up the comment (no zoom)};" msgstr "" #. arrows #. type: tikzpicture #: documentation.tex:278 msgid "" "\\draw[-stealth] (aBlackC.west) -- (aBlack.north east); \\draw[-stealth] " "(aCloudC.west) -- (aCloud.east); \\draw[-stealth] (pYellowC.north west) -- " "(pYellow.south east); \\draw[-stealth] (bBlueC.north east) -- (bBlue.north " "west); \\draw[-stealth] (pBlueC.north east) -- (pBlue.south west); " "\\draw[-stealth] (filesC.south east) -- (files.north west); \\draw[-stealth] " "(paramsC.south) -- (params.north);" msgstr "" #. type: caption{#2} #: documentation.tex:283 documentation.tex:557 msgid "Xia's templates" msgstr "" #. type: document #: documentation.tex:287 msgid "" "In fact, since Xia is also an Inkscape plugin, you can generate your project " "directly in Inkscape: just click on \\chemin{Plugins $\\rightarrow$ Various " "$\\rightarrow$ Xia Édu}, and choose your template and destination folder." msgstr "" #. type: subsection{#2} #: documentation.tex:289 documentation.tex:498 documentation.tex:781 msgid "Abstract" msgstr "" #. type: enumerate #: documentation.tex:300 msgid "" "An \"image-active\" is first built in Inkscape (svg format). Xia only " "converts the svg source file into an html5 animation ;" msgstr "" #. type: enumerate #: documentation.tex:300 msgid "" "The title of the \"image-active\" must be indicated in the \\chemin{Metadata " "of the document} ;" msgstr "" #. type: enumerate #: documentation.tex:300 msgid "" "The text of the details is filled in the \\chemin{Object properties}, in the " "\\chemin{Title} and \\chemin{Description} fields ;" msgstr "" #. type: enumerate #: documentation.tex:300 msgid "" "The general description of the \"image-active\" must be indicated in the " "\\chemin {Object properties} of the background image." msgstr "" #. type: section{#2} #: documentation.tex:302 msgid "Enriched \"image-active\"" msgstr "" #. type: links #: documentation.tex:305 msgid "" "Explore the " "\\href{http://images-actives.crdp-versailles.fr/beta/demo/tuto/xia2}{\"image-active\"} " "created for this section of the documentation." msgstr "" #. type: links #: documentation.tex:308 msgid "" "Download the " "\\href{http://images-actives.crdp-versailles.fr/beta/demo/tuto/xia2/svg/xia2.svg}{svg} " "source file." msgstr "" #. type: document #: documentation.tex:312 msgid "" "In this section, the goal is still to create a \"traditional\" " "\"image-active\" (ie. in which a detail matches with a comment), but the " "content of the comments will be enriched with formatted text or multimedia " "resources." msgstr "" #. type: subsection{#2} #: documentation.tex:316 msgid "Formatting text" msgstr "" #. type: document #: documentation.tex:318 msgid "" "In order to insert formatted text, the tags described in figure " "\\ref{xia_text_tags} should be used." msgstr "" #. type: figure #: documentation.tex:352 msgid "" "\\tikzstyle{descrip}=[font=\\sffamily, anchor=north west, text width = " "4.3cm] \\tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded " "corners, anchor=north west]" msgstr "" #. type: tikzpicture #: documentation.tex:352 msgid "" "\\node[anchor=north west] (bold) " "{\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, below = " "-7mm of bold] (boldT) {This text is ***bold***}; \\node[box, right = 3.5cm " "of bold] (bolR) {This text is in \\textbf{bold}}; \\node[anchor=north west, " "below = .2cm of bold] (italic) " "{\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, below = " "-7mm of italic] (italicT) {This text is in **italics**}; \\node[box, right = " "3.5cm of italic] (italicR) {This text is in \\textit{italics}}; " "\\node[anchor=north west, below = .2cm of italic] (texttt) " "{\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, below = " "-7mm of texttt] (textttT) {This text is in \\verb!{{{typewriter}}}!}; " "\\node[box, right = 3.5cm of texttt] (textttR) {This text is in " "\\texttt{typewriter}}; \\node[anchor=north west, below = .2cm of texttt] " "(link) {\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, " "below = 7mm of link.north] (linkT) {A link to " "\\verb![https://www.wikipedia.org/Wikipedia]!}; \\node[box, right = 3.5cm of " "link] (linkR) {A link to \\href{https://www.wikipedia.org/}{Wikipedia}}; " "\\node[anchor=north west, below = .8cm of link] (bullets) " "{\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, below = " "-7mm of bullets] (bulletsT) {Making a list \\\\ $\\ast$ of bullets \\\\ " "$\\ast$ out of \\\\ ~$\\ast$ 2 levels}; \\node[box, right = 3.5cm of " "bullets.south east] (bulletsR) {Making a list \\begin{itemize} \\item of " "bullets \\item out of \\begin{itemize} \\item2 levels \\end{itemize} " "\\end{itemize} }; \\node[anchor=north west, below = 2cm of bullets] (line) " "{\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, below = " "7mm of line.north] (lineT) {Drawing \\\\ - - - - \\\\ a line}; \\node[box, " "right = 3.5cm of line] (lineR) {Drawing \\\\ \\hrulefill \\\\ a line};" msgstr "" #. type: caption{#2} #: documentation.tex:352 msgid "Tags to format text" msgstr "" #. type: subsection{#2} #: documentation.tex:354 msgid "Inserting multimedia resources into details" msgstr "" #. type: document #: documentation.tex:364 msgid "" "Inserting multimedia resources into details comments is quite easy: just " "paste the resource url (relative or absolute link) or iframe tag of the web " "service you want to use. Xia will automatically create a multimedia player " "in the comment as long as the resource (image, sound or video) matches its " "supported formats:" msgstr "" #. type: item[#1] #: documentation.tex:364 msgid "Images" msgstr "" #. type: description #: documentation.tex:364 msgid "jpg, jpeg, png, gif" msgstr "" #. type: description #: documentation.tex:364 msgid "[Audio] ogg, mp3" msgstr "" #. type: description #: documentation.tex:364 msgid "[Video] ogv, webm, mp4" msgstr "" #. type: document #: documentation.tex:368 msgid "" "The link has to be inserted into the \\chemin{Description} field of the " "\\chemin{Object Properties}:" msgstr "" #. type: item[#1] #: documentation.tex:368 msgid "Absolute link" msgstr "" #. type: description #: documentation.tex:368 msgid "If the resource url is" msgstr "" #. \begin{center} #. \end{center} #. type: description #: documentation.tex:372 msgid "\\verb|http://web.crdp.ac-versailles.fr/02546.ogg|" msgstr "" #. type: description #: documentation.tex:375 msgid "" "just type it in the \\chemin{Description} field of the \\chemin{Object " "Properties} in Inkscape" msgstr "" #. type: item[#1] #: documentation.tex:381 msgid "Relative link" msgstr "" #. type: description #: documentation.tex:381 msgid "" "If the multimedia file is located in the \"image-active\" folder or in a " "folder (see figure \\ref{xia_files}) within this one, just indicate its " "location, keeping in mind that the \"image-active\" folder has to be " "considered as the root folder. For example, if the \\verb|video.ogv| file " "is located in a \\verb|videos| folder located itself in the \"image-active\" " "exportation folder, just indicate:" msgstr "" #. \begin{center} #. end{center} #. type: description #: documentation.tex:385 msgid "\\verb|videos/video.ogv|" msgstr "" #. type: description #: documentation.tex:388 msgid "in order to create the player." msgstr "" #. type: document #: documentation.tex:393 msgid "" "Since video formats supported by Xia are not natively supported by every web " "browsers, it is recommanded to export videos into the 3 supported formats, " "and to upload them into a single folder (from there, the only difference " "between these files is their extension (ie. .ogv or .mp4 or .webm).\\\\" msgstr "" #. type: document #: documentation.tex:402 msgid "" "Even if a particular format is indicated in the description (following the " "previous example : \\verb|videos/video.ogv|), if the browser is unable to " "read the resource, it will automatically attempt to read the files of the " "same name possessing a different extension (ie. \\verb|video.mp4| then " "\\verb|video.webm|)." msgstr "" #. type: document #: documentation.tex:406 msgid "" "The last option is to insert an iframe tag. It will be interpreted and the " "reader will appear in the comment, giving access to the resource." msgstr "" #. type: subsection{#2} #: documentation.tex:408 msgid "The \"audioBrown\" template: sounds instead of text" msgstr "" #. type: document #: documentation.tex:411 msgid "" "The \"audioBrown\" template is specifically dedicated to the creation of " "images-actives in which details are associated with sounds instead of text." msgstr "" #. type: document #: documentation.tex:421 msgid "" "The method to insert sounds using absolute or relative links is described in " "section \\ref{enrichissement_multimedia}. If you wish the sound to play " "automatically as the user clicks on the comment, just add \\verb|autostart| " "right after the url \\footnote{The \"\\texttt{autostart}\" tag also works " "with the other Xia templates.}:\\\\" msgstr "" #. type: center #: documentation.tex:421 msgid "\\verb|sons/son_detail_1.ogg autostart|" msgstr "" #. type: subsection{#2} #: documentation.tex:424 msgid "Inserting images into your \"image-active\"" msgstr "" #. type: document #: documentation.tex:427 msgid "" "Png images can be added to the background. To do so, select \\chemin{File " "$\\rightarrow$ Import} in Inkscape to incorporate your new image." msgstr "" #. type: document #: documentation.tex:431 msgid "" "The imported image will only appear in the html5 animation if you have " "applied white background in Inkscape. Choose white in the horizontal colour " "palette at the bottom of Inkscape interface (see illustration " "\\ref{remplissage_blanc})." msgstr "" #. type: caption{#2} #: documentation.tex:439 msgid "" "In Inkscape, select the embedded png then apply a white background by " "selecting the color from the horizontal colour palette to make it " "automatically visible." msgstr "" #. type: document #: documentation.tex:442 msgid "" "By indicating a url in the \\chemin{Title} of \\chemin{Object properties} " "field, the embedded image becomes a clickable icon linking to a web page." msgstr "" #. type: subsection{#2} #: documentation.tex:444 msgid "Displaying a question and unveiling an answer" msgstr "" #. type: document #: documentation.tex:447 msgid "" "You can create an \"\\textit{Answer}\" clickable icon, momentarily " "preventing the user to read the end of the comment." msgstr "" #. type: document #: documentation.tex:450 msgid "" "To do so, just indicate, in the description, the line\\\\ \\verb|Answer:| or " "\\verb|answer:| followed by the text you wish to be shown." msgstr "" #. type: subsection{#2} #: documentation.tex:453 msgid "Controlling details behavior : automatic display and disabled zoom" msgstr "" #. type: document #: documentation.tex:461 msgid "Default behavior of details in an \"image-active\" consists in:" msgstr "" #. type: itemize #: documentation.tex:461 msgid "" "highlighting details only on mouse over or with a click on the comment " "detail title" msgstr "" #. type: itemize #: documentation.tex:461 msgid "zoom in effect when clicking again on the active detail" msgstr "" #. type: footnote{#2} #: documentation.tex:461 msgid "Except for the popBlue template." msgstr "" #. type: document #: documentation.tex:473 msgid "" "Both of these default behaviors can be modified if you apply a white or " "black background to cropped details (see section \\ref{insertion_images} and " "illustration \\ref{remplissage_blanc}):" msgstr "" #. type: item[#1] #: documentation.tex:473 msgid "Detail with a white background" msgstr "" #. type: description #: documentation.tex:473 msgid "" "In the generated image, details will be immediately visible as a flat area " "of opaque color, hiding the background image; once selected, it reveals the " "background (the zoom effect is still active)." msgstr "" #. type: description #: documentation.tex:473 msgid "" "[Detail with a black background] Users still have to click on the detail to " "unveil it, but the zoom effect is disabled." msgstr "" #. type: document #: documentation.tex:477 msgid "" "Logical consequence : you can not apply a white and a black background all " "together on the same detail. The \"image-active\" can not be immediately " "displayed \\textit{and} have the zoom effect disabled." msgstr "" #. type: subsection{#2} #: documentation.tex:479 msgid "Controlling order of details display in the lateral comment zone" msgstr "" #. type: document #: documentation.tex:481 msgid "" "By default, in the \"image-active\", the details appear vertically following " "the order in which these details have been created (the first detail created " "in Inkscape corresponding to the detail placed up in the sidebar of the " "\"image-active\")." msgstr "" #. type: document #: documentation.tex:483 msgid "" "We will work with the \\chemin{Edit $\\rightarrow$ XML Editor} to change " "this default order." msgstr "" #. type: document #: documentation.tex:488 msgid "" "A priori complex to manage, this dialogue window is in fact quite easy to " "use : by selecting the input in the XML editor, the corresponding detail " "will be highlighted on the image and the only thing left to do is to drag " "the files to the desired location (see figure \\ref{ordre_couches})." msgstr "" #. type: caption{#2} #: documentation.tex:496 msgid "" "The Inkscape XML editor allows to control the display order of the details " "in the \"image-active\". Note the highlighting of an element in the editor " "and on the background image by a single mouse click." msgstr "" #. type: enumerate #: documentation.tex:509 msgid "You can enrich and shaping text using tags" msgstr "" #. type: enumerate #: documentation.tex:509 msgid "" "A multimedia enrichment is possible through a simple link (relative or " "absolute) to a file whose format is recognized by Xia" msgstr "" #. type: enumerate #: documentation.tex:509 msgid "Adding images to the background image is possible by importing them" msgstr "" #. type: enumerate #: documentation.tex:509 msgid "" "It is possible to modify the default behavior of a detail by changing its " "color background (white, black)" msgstr "" #. type: enumerate #: documentation.tex:509 msgid "" "The order of the details in the \"image-active\" depends on the order of " "their creation in Inkscape. Nevertheless, the Inkscape XML editor allows to " "change this order" msgstr "" #. type: section{#2} #: documentation.tex:513 msgid "Creating games with Xia" msgstr "" #. type: document #: documentation.tex:516 msgid "" "Until now, this document was only about creation of traditionnal " "\"image-actives\": background image enriched with cropped details associated " "with texts." msgstr "" #. type: document #: documentation.tex:522 msgid "" "This kind of \"image-active\" can be used in class in various situations " "(students progressively discovering a document, or creating an image-active " "on their own), but Xia introduces new features, such as the creation of " "games and activities, in which the final user has much more to do than " "simply clicking on details in order to read the comment." msgstr "" #. \draw[help lines] (0,0) grid (5,5); #. icons #. type: tikzpicture #: documentation.tex:538 msgid "" "\\node[opacity=.5] (bBlue) " "{\\includegraphics[scale=.35]{./images/buttonBlue}}; \\node[left= .8mm of " "bBlue] (aBrown) {\\includegraphics[scale=.35]{./images/audioBrown}}; " "\\node[right= .8mm of bBlue] (guClic) " "{\\includegraphics[scale=.35]{./images/game1clic}}; \\node[below= .2mm of " "bBlue.south, opacity=.5] (pBlue) " "{\\includegraphics[scale=.35]{./images/popBlue}}; \\node[left= .8mm of " "pBlue] (gDDrop) {\\includegraphics[scale=.35]{./images/gameDragAndDrop}}; " "\\node[right= .8mm of pBlue, opacity=.5] (pYellow) " "{\\includegraphics[scale=.35]{./images/popYellow}}; \\node[above = .2mm of " "guClic.north, opacity=.5] (aCloud) " "{\\includegraphics[scale=.35]{./images/accordionCloud}}; \\node[above = .2mm " "of aCloud.north, opacity=.5] (aBlack) " "{\\includegraphics[scale=.35]{./images/accordionBlack}}; \\node[left = .2mm " "of aBlack] (params) {\\includegraphics[scale=.35]{./images/params}}; " "\\node[left = .2mm of params] (files) " "{\\includegraphics[scale=.35]{./images/xia_open}};" msgstr "" #. comments #. type: tikzpicture #: documentation.tex:545 msgid "" "\\node[box, text width=2.5cm,above left = 5mm of files] (filesC) {Select the " "svg source file}; \\node[box, above = 5mm of params] (paramsC) {Select the " "quality of the export}; \\node[box, right = 5mm of guClic] (guClicC) " "{\\href{http://geoffrey-gekiere.ac-versailles.fr/xia1/accordionCloud}{game1clic}\\\\ " "text to fill and change url}; \\node[box, left = 25mm of bBlue] (aBrownC) " "{\\href{http://geoffrey-gekiere.ac-versailles.fr/xia1/buttonBlue}{audioBrown}\\\\ " "text to fill and change url}; \\node[box, below left = 5mm of pBlue] " "(gDDropC) " "{\\href{http://geoffrey-gekiere.ac-versailles.fr/xia1/popBlue}{gameDragAndDrop}\\\\ " "text to fill and change url};" msgstr "" #. arrows #. type: tikzpicture #: documentation.tex:552 msgid "" "\\draw[-stealth] (guClicC.west) -- (guClic.east); \\draw[-stealth] " "(gDDropC.north) -- (gDDrop.south); \\draw[-stealth] (aBrownC.north east) -- " "(aBrown.north); \\draw[-stealth] (filesC.south east) -- (files.north west); " "\\draw[-stealth] (paramsC.south) -- (params.north);" msgstr "" #. type: subsection{#2} #: documentation.tex:559 msgid "First game principle: selecting, finding elements in the image" msgstr "" #. type: document #: documentation.tex:563 msgid "" "\\textit{The game principle described in this section consists in selecting " "details on a background image. When the user has reached the goal described " "in the instructions, a message appears in a final pop up.}" msgstr "" #. type: links #: documentation.tex:568 msgid "" "Explore the " "\\href{http://images-actives.crdp-versailles.fr/beta/demo/tuto/xia3}{\"image- " "active\"} created for this section of the documentation." msgstr "" #. type: links #: documentation.tex:571 msgid "" "Download the " "\\href{http://images-actives.crdp-versailles.fr/beta/demo/tuto/xia3/svg/xia3.svg}{svg} " "source file." msgstr "" #. type: document #: documentation.tex:574 msgid "" "This kind of game is almost the easiest way to create an \"image-active\". " "You only have to crop the details that the final user will have to select." msgstr "" #. type: document #: documentation.tex:581 msgid "" "The instructions must be completed in the metadata of the document. Xia will " "look into the informations filled in the \\chemin {Description} field of the " "metadata of the document (see section \\ref{preparation_svg}), and create an " "instruction «~pop up~» that will show up at the opening of the game. The " "player will just have to read the instructions and close the pop up to play " "the game." msgstr "" #. type: document #: documentation.tex:591 msgid "" "When the user completes the game, a message automatically appears. This " "message has to be filled in the \\chemin{Description} field of the " "\\chemin{Object Properties} of the background image \\footnote{When creating " "a traditional \"image-active\", this field creates the introduction text, " "not related with any detail (see section \\ref{preparation_svg}).}. Two " "informations are needed in order for this message to pop up : the exact " "number of details that have to be selected\\footnote{This number does not " "have to match the number of details on the image).} and the message itself." msgstr "" #. type: tabular #: documentation.tex:607 msgid "Goal" msgstr "" #. type: tabular #: documentation.tex:607 msgid "Enter the number of correct answers needed to complete the game" msgstr "" #. type: tabular #: documentation.tex:607 msgid "Display a message" msgstr "" #. type: tabular #: documentation.tex:607 msgid "Tag" msgstr "" #. type: tabular #: documentation.tex:607 msgid "\\texttt{}|" msgstr "" #. type: tabular #: documentation.tex:607 msgid "\\texttt{}" msgstr "" #. type: tabular #: documentation.tex:607 msgid "Example" msgstr "" #. type: tabular #: documentation.tex:607 msgid "\\multicolumn{2}{|l|}{\\texttt{6}}" msgstr "" #. type: tabular #: documentation.tex:607 msgid "\\multicolumn{2}{|l|}{\\texttt{Congratulations!}}" msgstr "" #. type: tabular #: documentation.tex:607 msgid "\\multicolumn{2}{|l|}{\\texttt{You have completed the game!}}" msgstr "" #. type: caption{#2} #: documentation.tex:607 documentation.tex:723 msgid "Sum up of tags" msgstr "" #. type: astuce #: documentation.tex:614 msgid "" "Text inserted inside the \\verb|| tag can be " "enriched. Images, videos or sounds can be inserted. It is also possible to " "insert a link, allowing users to play another game, in order to \"chain\" " "activities up by degree of difficulty." msgstr "" #. type: wrapfigure #: documentation.tex:619 documentation.tex:728 msgid "{r}{45mm}" msgstr "" #. type: document #: documentation.tex:621 msgid "Choose the template \\chemin{game1clic} to generate the \"image-active\"." msgstr "" #. type: subsubsection{#2} #: documentation.tex:624 msgid "" "\\emph{Advanced \"image-active\" creation tips\\ldots} Showing the player's " "score" msgstr "" #. type: document #: documentation.tex:638 msgid "" "It is possible to display graphical elements automatically when the user " "selects the correct answer. These elements can be png imported images or " "shapes directly designed in Inkscape. But as Xia considers as a clickable " "detail any shapes designed using Inkscape tools, you will have to transform " "these shapes in bitmap, using the \"bitmap copy\" Inkscape tool. For " "example :" msgstr "" #. type: enumerate #: documentation.tex:638 msgid "Draw a star with yellow sides on a yellow background with the Inkscape tools" msgstr "" #. type: enumerate #: documentation.tex:638 msgid "" "Select this star, and click on the \\chemin{Edition $\\rightarrow$ Make a " "bitmap copy}" msgstr "" #. type: enumerate #: documentation.tex:638 msgid "Delete the first star" msgstr "" #. type: document #: documentation.tex:648 msgid "" "When the graphical elements are imported (png files) or created (bitmap copy " "of shapes created manually), just apply the following carasteristics to " "these elements:" msgstr "" #. type: center #: documentation.tex:648 msgid "\\chemin{Interactivity > OnClick} = \\verb|off|" msgstr "" #. type: document #: documentation.tex:648 msgid "" "Then, group the clickable detail to its graphical element (by successively " "clicking on the detail and the graphical element with the \\Shift keystroke " "on), then select \\chemin{Group} in the Inkscape \\chemin{Object} menu." msgstr "" #. type: subsubsection{#2} #: documentation.tex:650 msgid "" "\\emph{Advanced \"image-active\" creation tips\\ldots} Showing the player's " "mistakes" msgstr "" #. type: document #: documentation.tex:655 msgid "" "Games based on the details selection principle are obviously very " "interesting educational games\\ldots but it is also quite obvious to guess " "how some students may be tempted to cheat to achieve such games (for " "example, by frenetically clicking everywhere on the image, until the final " "message pops up)." msgstr "" #. type: document #: documentation.tex:658 msgid "" "This is why it may be interesting to be able to highlight the user's " "mistakes during the game." msgstr "" #. type: document #: documentation.tex:670 msgid "" "To do so, you will anticipate the user's probable mistakes, and put explicit " "graphical elements symbolizing these errors on the background image. This " "graphical element may be an imported image (png file) or a shape directly " "designed with the Inkscape tools, then converted into bitmap (see how to do " "that in the section \\ref{détail_progression}). These elements will have to " "include the following caracteristics:" msgstr "" #. type: center #: documentation.tex:670 msgid "\\chemin{Interactivity > OnClick} = \\verb|disable-score|" msgstr "" #. type: document #: documentation.tex:670 msgid "" "When applied with a \\verb|disable-score| tag, a detail still remains " "clickable, but does not add a score to the counter that delivers the final " "success message pop up." msgstr "" #. type: subsection{#2} #: documentation.tex:672 msgid "Second game principle: classyfying, ordering, ranking" msgstr "" #. type: document #: documentation.tex:676 msgid "" "\\textit{The second kind of game that can be created with Xia consists in " "dragging and dropping graphical elements on the background image. If all the " "elements have been dropped on their corresponding drop zone, a pop up " "message appears, confirming the achievement of the game}" msgstr "" #. type: links #: documentation.tex:680 msgid "" "Explore the " "\\href{http://images-actives.crdp-versailles.fr/beta/demo/tuto/xia5}{image- " "active created for this section of the documentation}." msgstr "" #. type: links #: documentation.tex:684 msgid "" "Download the \\href " "{http://images-actives.crdp-versailles.fr/beta/demo/tuto/xia5/svg/xia5.svg}{svg} " "source file." msgstr "" #. type: document #: documentation.tex:698 msgid "This is how you can create a game based on the drag and drop principle :" msgstr "" #. type: enumerate #: documentation.tex:698 msgid "In Inkscape:" msgstr "" #. type: itemize #: documentation.tex:698 msgid "Choose a background picture" msgstr "" #. type: itemize #: documentation.tex:698 msgid "" "Create the graphical elements the users of the \"image-active\" will have to " "drag and drop (ie. images or group of words)" msgstr "" #. type: itemize #: documentation.tex:698 msgid "" "Using metadata, make each label match its drop zone (actually being cropped " "details)" msgstr "" #. type: enumerate #: documentation.tex:698 msgid "In Xia" msgstr "" #. type: itemize #: documentation.tex:698 msgid "Export the svg source file using the \"gameDragAndDrop\" template" msgstr "" #. type: document #: documentation.tex:706 msgid "" "Two methods can be used to create the drag and drop \"graphical-elements\". " "A very simple way is to use a screenshot tool, in order to create png files, " "and then import them in Inkscape. It is also possible to create these " "elements directly in Inkscape, by creating a text, grouping it with a shape, " "and finally making a bitmap copy of this group (see how to do that in " "section \\ref{détail_progression})\\footnote{\\ldots do not forget to delete " "the original text and shape once the bitmap copy has been created.}. The " "graphical elements then have to be associated with their drop zone " "\\footnote{\\textbf{One} object can only match \\textbf{one} drop zone.}." msgstr "" #. type: document #: documentation.tex:709 msgid "" "You will find in this table the metadata to be filled in the \\chemin{Object " "Properties} of the drag and drop graphical elements and the corresponding " "details in order to make them match :" msgstr "" #. type: tabular #: documentation.tex:723 msgid "Graphical element (drag and drop objects in the game)" msgstr "" #. type: tabular #: documentation.tex:723 msgid "Cropped detail (drop zone)" msgstr "" #. type: tabular #: documentation.tex:723 msgid "ID Field" msgstr "" #. type: tabular #: documentation.tex:723 msgid "\\verb|Detail_Title|" msgstr "" #. type: tabular #: documentation.tex:723 msgid "Description Field" msgstr "" #. type: tabular #: documentation.tex:723 msgid "\\verb|Detail_Title|" msgstr "" #. type: document #: documentation.tex:735 msgid "" "Make the graphical elements match the drop zones by making the \\chemin{ID} " "field of the drop zone match the \\chemin{Description} field of the drag and " "drop graphical element. The only subtlety consists in the " "\\verb|| tags which have to be filled in the \\chemin " "{Description} field." msgstr "" #. type: document #: documentation.tex:737 msgid "" "Choose the template \\chemin{gameDragAndDrop} to generate the " "\"image-active\"." msgstr "" #. type: subsubsection{#2} #: documentation.tex:741 msgid "How to add a \"magnet\" effect in the gameDragAndDrop template" msgstr "" #. type: document #: documentation.tex:744 msgid "" "If you indicate \\verb|on| in the \\chemin{Description} " "field of the drop zone, a magnet effect will then be active when the player " "drops the graphical element onto its matching drop zone." msgstr "" #. type: subsubsection{#2} #: documentation.tex:746 msgid "Two ways to give the players a little help: tooltips and links on drop zones" msgstr "" #. type: document #: documentation.tex:754 msgid "" "It is possible to display tooltips of details on mouse-over. To do so, " "create the tooltip with a png imported file or a bitmap copy of a text " "created in Inkscape\\footnote{Or a bitmap copy of a shape grouped with some " "text\\ldots}, and apply to this tooltip a specific \\chemin{ID} in its " "\\chemin{Object Properties}. Then, just apply the tag " "\\verb|specific_ID_of_the_tooltip| in the " "\\chemin{Description} field of the \\chemin{Object Properties} of the detail " "(see figure \\ref{tooltip_example}). Note that the tooltip tool is also " "available in the game1clic template." msgstr "" #. type: caption{#2} #: documentation.tex:761 msgid "" "When the user moves the mouse over the yellow square, the tooltip \"Test\" " "displays" msgstr "" #. type: document #: documentation.tex:764 msgid "" "Another method consists in inserting links in the \\chemin{Title} field of " "the \\chemin{Object Properties} of the drop zones. These drop zones become " "clickable in the html5 animation." msgstr "" #. type: subsection{#2} #: documentation.tex:766 msgid "Third game principle: collisions" msgstr "" #. type: document #: documentation.tex:770 msgid "" "\\textit{The game principle described in this section consists in moving " "objects within bounds you defined. Typically, the \"collisions\" game " "principle can be used to create mazes or gem puzzle.}" msgstr "" #. type: document #: documentation.tex:774 msgid "" "In order to create this kind of game, add the tag " "\\verb|on| to the background image. All the details " "will then become solid and will prevent objects (png imported files or " "bitmap copies of shapes created in Inkscape) from being moved through them." msgstr "" #. type: document #: documentation.tex:781 msgid "" "The \"collision\" game is in fact a gameDragAndDrop game, since the goal " "remains to drag one or several objects and drop them somewhere on the " "image. The requisite tags for this template are therefore the same as in " "the gameDragAndDrop template \\footnote{\\texttt{} on the " "objects, \\texttt{} on the background image: see section " "\\ref{gameDragAndDropsection}.}, but you will apply the " "\\verb|off| tag to the drop zone's " "\\chemin{Description} field." msgstr "" #. type: document #: documentation.tex:783 msgid "" "This tables sum up the tags that have to be indicated when a game is " "created:" msgstr "" #. type: tabular #: documentation.tex:825 msgid "\\multicolumn{3}{|l|}{\\chemin{game1clic} template}" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:880 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:825 documentation.tex:825 documentation.tex:825 documentation.tex:825 documentation.tex:880 documentation.tex:880 documentation.tex:880 documentation.tex:880 documentation.tex:880 documentation.tex:880 documentation.tex:880 msgid "\\emph{Role}" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:880 msgid "" "Sets the amount of correct answers needed to pop up the end message of the " "game" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:825 documentation.tex:825 documentation.tex:825 documentation.tex:825 documentation.tex:880 documentation.tex:880 documentation.tex:880 documentation.tex:880 documentation.tex:880 documentation.tex:880 documentation.tex:880 msgid "\\emph{Element}" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:825 documentation.tex:880 documentation.tex:880 documentation.tex:880 msgid "Background picture" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:825 documentation.tex:825 documentation.tex:825 documentation.tex:825 documentation.tex:880 documentation.tex:880 documentation.tex:880 documentation.tex:880 documentation.tex:880 documentation.tex:880 documentation.tex:880 msgid "\\emph{Where ?}" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:825 documentation.tex:825 documentation.tex:880 documentation.tex:880 documentation.tex:880 msgid "\\chemin{Object properties $\\rightarrow$ Description}" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:825 documentation.tex:825 documentation.tex:880 documentation.tex:880 documentation.tex:880 documentation.tex:880 msgid "\\emph{What ?}" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:880 msgid "A number corresponding to the required score" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:880 msgid "\\multicolumn{3}{|l|}{\\texttt{} }" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:880 msgid "Pops up the end message of the game" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:880 msgid "A personalized message if necessary enriched with multimedia or html links" msgstr "" #. type: tabular #: documentation.tex:825 msgid "\\multicolumn{3}{|l|}{\\texttt{off}}" msgstr "" #. type: tabular #: documentation.tex:825 msgid "Makes a cropped detail unclickable" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:825 documentation.tex:825 msgid "Detail" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:825 msgid "" "\\chemin{Object properties $\\rightarrow$ Interactivity $\\rightarrow$ " "Onclick}" msgstr "" #. type: tabular #: documentation.tex:825 msgid "\\multicolumn{3}{|l|}{\\texttt{disable-score}}" msgstr "" #. type: tabular #: documentation.tex:825 msgid "" "Makes a cropped detail clickable, but when clicked, does not add a point to " "the score game counter" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:880 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:880 msgid "Displays a tooltip when moused-over" msgstr "" #. type: tabular #: documentation.tex:825 documentation.tex:880 msgid "Make sure to match the ID of the element used as tooltip" msgstr "" #. type: caption{#2} #: documentation.tex:825 msgid "game1clic tags" msgstr "" #. type: tabular #: documentation.tex:880 msgid "\\multicolumn{3}{|l|}{\\chemin{gameDragAndDrop} template}" msgstr "" #. type: tabular #: documentation.tex:880 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "" #. type: tabular #: documentation.tex:880 msgid "Indicates the corresponding drag and drop element and drop zone" msgstr "" #. type: tabular #: documentation.tex:880 msgid "Graphical element to move" msgstr "" #. type: tabular #: documentation.tex:880 documentation.tex:880 documentation.tex:880 documentation.tex:880 msgid "\\chemin{Object Properties $\\rightarrow$ Description}" msgstr "" #. type: tabular #: documentation.tex:880 msgid "Make sure to match the ID field of the drop zone" msgstr "" #. type: tabular #: documentation.tex:880 msgid "\\multicolumn{3}{|l|}{\\texttt{on}}" msgstr "" #. type: tabular #: documentation.tex:880 msgid "Adds a \"magnet\" effect" msgstr "" #. type: tabular #: documentation.tex:880 documentation.tex:880 msgid "Drop zone" msgstr "" #. type: tabular #: documentation.tex:880 msgid "\\multicolumn{3}{|l|}{\\texttt{on}}" msgstr "" #. type: tabular #: documentation.tex:880 msgid "Activates the \"collisions\" game principle" msgstr "" #. type: tabular #: documentation.tex:880 msgid "\\multicolumn{3}{|l|}{\\texttt{off}}" msgstr "" #. type: tabular #: documentation.tex:880 msgid "Creates a drop zone in a \"collisions\" game" msgstr "" #. type: tabular #: documentation.tex:880 msgid "Drop zone, Graphical element to move" msgstr "" #. type: caption{#2} #: documentation.tex:880 msgid "gameDragAndDrop tags" msgstr "" #. type: document #: documentation.tex:883 msgid "\\listoffigures \\listoftables" msgstr "" images-actives-html5.git/doc/documentation-fr.tex000066400000000000000000001661201250410645000223400ustar00rootroot00000000000000% This file was generated with po4a. Translate the source file. % \clearpage \documentclass[a4paper,12pt]{report} \usepackage[utf8]{inputenc} \usepackage[english,french]{babel} \usepackage[T1]{fontenc} \usepackage{lmodern,textcomp} \usepackage{graphicx} \usepackage{caption} \usepackage[pdftex]{hyperref} \usepackage{fancyvrb} \usepackage{tikz} \usetikzlibrary{shapes.geometric,backgrounds,fit,positioning,trees} \usepackage{wrapfig} \usepackage{manfnt} \usepackage{keystroke} \usepackage{dingbat} \usepackage{xcolor} \usepackage{geometry} \usepackage{xia} \clearpage \title{Xia\\ Créer des images interactives au format HTML5\\ \begin{center} \includegraphics[scale=0.5]{./images/xia-logo} \end{center}} \begin{document} \selectlanguage{french} \maketitle \tableofcontents \renewcommand{\figurename}{Illustration} \renewcommand{\tablename}{Tableau} \renewcommand{\listfigurename}{Liste des illustrations} \section{Présentation de Xia} \subsection{Qu'est-ce que Xia?} Xia est un logiciel libre développé par des enseignants de l'académie de Versailles. Il est distribué sous la licence \href{http://www.gnu.org/copyleft/gpl.html}{GPLv3}. Le logiciel xia-converter a pour fonction de transformer un fichier svg en une animation interactive html5. Xia permet de générer des jeux et activités interactives: jeux de glisser-déposer, sélection, discrimination, etc. Les premières parties de cette documentation (voir la partie \ref{basic_imageactive}) sont consacrées à la réalisation d'une image interactive simple: détails détourés et commentaires en texte sans mise en forme. Par la suite, vous apprendrez à créer des images interactives enrichies (voir la partie \ref{enriched_IA}). Dans les dernières parties (partie \ref{games_IA}), vous découvrirez comment créer des jeux. \begin{tip} Tous les exemples utilisés sont visibles en ligne (les liens pour visualiser les animations et télécharger les fichiers sources sont indiqués en début de chaque section). À la fin de chaque partie, une rubrique «~En résumé~» rappelle les points essentiels à retenir pour créer une image interactive. \end{tip} \subsection{Processus général} Xia n'est nécessaire qu'à la fin du processus. Comme on peut le voir sur l'illustration \ref{workflowxia}, la plus grande partie du travail est réalisée avec un logiciel de dessin vectoriel. Nous recommandons l'utilisation du logiciel libre et multi-plateforme \href{http://www.inkscape.org/}{Inkscape}, très simple à utiliser (c'est ce logiciel qui sera utilisé dans ce tutoriel)\footnote{Il est cependant également possible d'utiliser LibreOffice Draw.}. \begin{figure}[htp] \centering \tikzstyle{box} = [draw, text width=.6\textwidth, align=center] \tikzstyle{ia} = [draw, text width=.8\textwidth, fill=reddebian!80, rounded corners, inner ysep=2mm] \tikzstyle{xia} = [draw, text width=.8\textwidth, fill=bluedane!80, rounded corners, inner ysep=2mm] \begin{tikzpicture} \node[box] (open) {Ouvrir l'image dans Inkscape}; \node[box,below of=open] (create) {Créer les détails}; \node[box,below of=create] (meta) {Pour chaque détail, compléter les métadonnées}; \node[box,below of=meta] (save) {Sauvegarder le projet}; \node[left of=create,xshift=-.37\textwidth, rotate=90] (scape) {\textbf{Inkscape}}; \begin{scope}[on background layer] \node[fit = (open)(meta)(save)(scape), ia] (ink) {}; \end{scope} \node[box,below=1cm of save] (createia) {Créer une image interactive en html5}; \node[left of=createia,xshift=-.37\textwidth, rotate=90] (xia) {\textbf{Xia}}; \begin{scope}[on background layer] \node[fit = (createia)(xia), xia] (ink) {}; \end{scope} \draw[-stealth] (open) -- (create); \draw[-stealth] (create) -- (meta); \draw[-stealth] (meta) -- (save); \draw[-stealth] (save) -- (createia); \end{tikzpicture} \caption{Processus de création d'une image interactive avec Xia} \label{workflowxia} \end{figure} \begin{tip} Si vous possédez des projets créés avec le logiciel ImagesActives (fichiers possédant une extension .xia), vous pouvez changer l'extension de ces fichiers en .zip, les dézipper, récupérer le fichier svg se trouvant dans le répertoire ainsi obtenu et ouvrir celui-ci avec Inkscape. Si vous utilisez GNU/Linux, explorez le .xia et récupérez le fichier svg. \end{tip} \subsection{Installer Inkscape et Xia} L'installation d'Inkscape et de Xia sont les seuls prérequis pour la poursuite de la lecture de cette documentation. Vous trouverez les informations nécessaires à l'installation d'Inkscape sur le site web du projet\footnote{\href{http://www.inkscape.org/}{http://www.inkscape.org/}.} \begin{alert} Installez impérativement Inkscape en premier, puis Xia, sous peine de ne pas être en mesure d'accéder à Xia directement dans Inkscape.\\ Si vous travaillez sous Windows, utilisez la version portable de Xia pour accéder au logiciel en dehors d'Inkscape. \end{alert} \begin{description} \item[GNU/Linux] Dans un terminal:\\ \texttt{\$ sudo echo "deb http://repository.crdp.ac-versailles.fr/debian xia main" | sudo tee /etc/apt/sources.list.d/xia.list}\\ \texttt{\$ wget -q http://repository.crdp.ac-versailles.fr/crdp.gpg -O - | sudo apt-key add -}\\ \texttt{\$ sudo apt-get update \&\& sudo apt-get install xia} \item [Mac OS X] Téléchargez et installez le paquet:\\ \href{http://xia.dane.ac-versailles.fr/download/xia.pkg}{http://xia.dane.ac-versailles.fr/download/xia.pkg} \item [Windows] Téléchargez et installez l'extension Inkscape (\href{http://xia.dane.ac-versailles.fr/download/setup.exe}{http://xia.dane.ac-versailles.fr/download/setup.exe}) ou Xia en version portable (\href{http://xia.dane.ac-versailles.fr/download/xia-windows.zip}{http://xia.dane.ac-versailles.fr/download/xia-windows.zip}). \end{description} \section{Création d'une première image interactive avec Inkscape et Xia: \emph{Fonctionnalités de base}}\label{basic_imageactive} \subsection{Création du fichier source au format svg en vue de la génération de l'image interactive}\label{preparation_svg} \begin{links} Visualisez l'\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1}{image interactive} créée pour cette partie de la documentation. Téléchargez le fichier source au format \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/svg/xia1.svg}{svg}. \end{links} Les manipulations décrites dans cette partie de la documentation vous permettront de créer une image interactive «~basique~», comprenant: \begin{itemize} \item Détails zoomables \item Commentaires uniquement constitués de texte non mis en forme \end{itemize} Une fois l'image choisie, ouvrez-la dans Inkscape \softmenu{Fichier $\rightarrow$ Ouvrir} Quand Inkscape vous demande de choisir entre \softmenu{Lier} ou \softmenu{Incorporer l'image}, choisissez \softmenu{Incorporer}. Les informations renseignées dans les \softmenu{Métadonnées du document} (menu \softmenu{Fichier}) seront conservées dans l'animation générée: titre, créateur, droits, \ldots. Il est donc fortement conseillé de renseigner ces informations. Le rendu est visible sur l'image ci-dessous\footnote{Les champs "auteur" et "droits" apparaissent dans la fenêtre "À propos", symbolisée par une icône clicable en forme de lettre "i".}:\\ \begin{center} \includegraphics[width=\textwidth]{images/ia_title}\\ \end{center} Le titre renseigné dans les métadonnées du document apparaissent au-dessus de l'image interactive et donnent son nom à la page web l'affichant. Le créateur et les droits associés apparaissent dans la pop up accessible via l'icône «~i~» située à droite du titre de l'image interactive. Vous pouvez sauvegarder votre projet au format svg dès le début du travail, en allant dans le menu \softmenu{Fichier $\rightarrow$ Enregistrer sous\ldots}. Vous pouvez, par souci de clarté, supprimer l'extension d'origine de votre image dans le champ \softmenu{Nom} de la fenêtre de dialogue. Enfin, dans le menu déroulant, choisissez le format de fichier Inkscape svg: \softmenu{SVG Inkscape (*.svg)}. De nombreux outils d'Inkscape peuvent être utilisés pour détourer les détails qui deviendront actifs dans l'animation générée par Xia. Parmi ceux-ci: \begin{itemize} \item \includegraphics[scale=0.5]{./images/square} \softmenu{Créer des rectangles et des carrés} \item \includegraphics[scale=0.5]{./images/circles} \softmenu{Créer des cercles, des ellipses et des arcs} \item \includegraphics[scale=0.5]{./images/line} \softmenu{Dessiner des lignes à main levée} \item \includegraphics[scale=0.5]{./images/bezier} \softmenu{Tracer des courbes de Bézier et des segments de droite} \end{itemize} Sans rentrer dans le détail du fonctionnement de ces différents outils\footnote{Pour cela, lire le \href{http://inkscape.org/doc/shapes/tutorial-shapes.fr.html}{manuel d'Inkscape} ou \href{http://en.flossmanuals.net/inkscape/}{le manuel Floss}.}, sachez que l'outil \softmenu{Tracer des courbes de Bézier et des segments de droite} permet de détourer "clic par clic" (les points de construction du polygone sont alors appelés des «~nœuds~»). Vous pouvez refermer votre polygone en cliquant sur le premier nœud de ce même polygone. Vous pouvez dessiner des \softmenu{Courbes de Bézier} en gardant le clic de votre souris enfoncé après avoir créé un nœud, puis en déplaçant le curseur pour faire apparaître les poignées de contrôle afin de modifier la forme de la courbe. \begin{alert} Si vous laissez une forme ouverte dans Inkscape (une courbe par exemple), Xia refermera automatiquement celle-ci en joignant son point de départ et d'arrivée. \end{alert} \begin{alert} L'ordre de création des détails dans Inkscape sera respecté dans l'image interactive au format html5 (par exemple, le premier détail détouré dans Inkscape apparaîtra en haut dans le modèle accordéon ou en numéro 1 dans le modèle boutons). Si vous souhaitez changer cet ordre sans avoir à recréer tous les détails, lisez la rubrique \ref{XML_layer}. \end{alert} Une fois les détails détourés\footnote{La couleur du contour des détails dans l'animation générée par Xia sera la même que celle choisie dans Inkscape.}, vous pouvez les sélectionner avec l'outil \softmenu{Sélectionner et transformer des objets} afin de les redimensionner, les déplacer, etc.\ldots \begin{tip} Si vous avez des difficultés pour sélectionner un détail que vous avez détouré, appliquez-lui une couleur de fond. N'importe quelle couleur fera l'affaire, sauf noir et blanc (pour comprendre pourquoi, lisez la rubrique \ref{white_black_background}). \end{tip} Vous pouvez accéder aux \softmenu{Propriétés de l'objet} par un clic-droit sur le détail détouré. À partir de là, vous accédez à une fenêtre de dialogue vous permettant d'ajouter le texte qui sera associé au détail dans l'image interactive:\\ \begin{center} \includegraphics[width=0.5\textwidth]{./images/object_properties}\\ \end{center} Les deux champs devant nécessairement être renseignés dans cette fenêtre sont les champs \softmenu{Titre} et \softmenu{Description}. Le titre deviendra celui du détail, la description son commentaire. N'oubliez pas de cliquer sur le bouton \softmenu{Définir} avant de fermer la fenêtre des \softmenu{Propriétés de l'objet}. Le processus décrit ci-dessus doit également être effectué avec l'image de fond: le titre et la description de celle-ci serviront d'introduction générale à l'image interactive (il s'agit d'un titre et d'un commentaire qui ne sont pas reliés à un détail particulier). \subsection{Génération de l'image interactive avec Xia} Quand tous les détails sont détourés et leurs métadonnées renseignées, Xia peut être lancé (voir l'illustration \ref{xia_interface}). Vous devez sélectionner votre fichier svg avec l'icône située en haut à gauche\footnote{Cette icône n'apparaît pas sous cette forme quand Xia est lancé depuis les extensions d'Inkscape. En effet, dans ce cas Xia considère que vous souhaitez générer l'animation depuis l'image actuellement ouverte dans Inkscape. Vous ne pouvez donc pas sélectionner d'image source.}, choisir la qualité de l'export (voir l'illustration \ref{xia_export_options}), et enfin choisir un modèle d'export et un répertoire d'enregistrement de l'image interactive. En cliquant sur l'une des icônes des modèles d'export, vous générez une série de fichiers et de répertoires. Ouvrez le fichier \softmenu{index.html} dans un navigateur web pour voir votre image interactive au format html5. \begin{alert} Ce fichier ne peut être séparé des autres pour que l'image interactive fonctionne. Tous les autres fichiers et répertoires générés durant le processus d'exportation doivent obligatoirement être localisés dans le même répertoire (voir l'illustration \ref{xia_files}) pour que le fichier \texttt{index.html} fonctionne correctement. \textbf{Il est donc impératif de dédier un répertoire spécifique à chaque image interactive générée}. \end{alert} \begin{figure}[htp] \tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded corners] \begin{tikzpicture} \node (bBlue) {\includegraphics[width=2cm]{./images/buttonBlue}}; \node[left= .3mm of bBlue, opacity=.5] (aBrown) {\includegraphics[width=2cm]{./images/audioBrown}}; \node[right= .3mm of bBlue, opacity=.5] (guClic) {\includegraphics[width=2cm]{./images/game1clic}}; \node[below= .2mm of bBlue.south] (pBlue) {\includegraphics[width=2cm]{./images/popBlue}}; \node[left= .3mm of pBlue, opacity=.5] (gDDrop) {\includegraphics[width=2cm]{./images/gameDragAndDrop}}; \node[right= .3mm of pBlue] (pYellow) {\includegraphics[width=2cm]{./images/popYellow}}; \node[above = .2mm of guClic.north] (aCloud) {\includegraphics[width=2cm]{./images/accordionCloud}}; \node[above = .2mm of aCloud.north] (aBlack) {\includegraphics[width=2cm]{./images/accordionBlack}}; \node[left = .3mm of aBlack] (params) {\includegraphics[width=2cm]{./images/params}}; \node[left = .3mm of params] (files) {\includegraphics[width=2cm]{./images/xia_open}}; \node[left = 1mm of aCloud, opacity=.3] (xialogo) {\includegraphics[height=2.1cm]{./images/xia}}; \node[box, text width=2.5cm,above left = 5mm of files] (filesC) {Sélection du fichier source svg}; \node[box, above = 5mm of params] (paramsC) {Définition des options d'exportation (voir l'illustration \ref{xia_export_options})}; \node[box,above right = 5mm of aCloud.north east] (aBlackC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/accordionBlack}{accordionBlack}\\ Zone de commentaire large, recommandé pour l'insertion de ressources multimédias; à utiliser avec des images verticales (portrait)}; \node[box, right = 5mm of guClic] (aCloudC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/accordionCloud}{accordionCloud}\\ Zone de commentaires étroite, laissant davantage de place à l'image en elle-même ; à utiliser avec des images horizontales (paysage)}; \node[box, below right = 5mm of pYellow] (pYellowC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/popYellow}{popYellow}\\ Pas de zone latérale de commentaire ; un premier clic sur le détail le met en évidence, et un second fait apparaître le commentaire et enclenche la fonction zoom}; \node[box, left = 25mm of bBlue] (bBlueC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/buttonBlue}{buttonBlue}\\ Pas de zone latérale de commentaire ; les commentaires apparaissent au-dessus de l'image (recommandé pour les commentaires longs) ; les utilisateurs accèdent aux commentaires via des boutons situés au-dessus de l'image interactive}; \node[box, below left = 5mm of pBlue] (pBlueC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/popBlue}{popBlue}\\ Pas de zone latérale de commentaire; un premier clic met en évidence le détail, un second fait apparaître le commentaire (pas de zoom)}; \draw[-stealth] (aBlackC.west) -- (aBlack.east); \draw[-stealth] (aCloudC.west) -- (aCloud.south east); \draw[-stealth] (pYellowC.north west) -- (pYellow.south east); \draw[-stealth] (bBlueC.north east) -- (bBlue.north west); \draw[-stealth] (pBlueC.north east) -- (pBlue.south west); \draw[-stealth] (filesC.south east) -- (files.north west); \draw[-stealth] (paramsC.south) -- (params.north); \end{tikzpicture} \caption{Les modèles d'export de Xia} \label{xia_interface} \end{figure} \begin{figure}[htp] \tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded corners] \begin{tikzpicture} \node (exp_qual) {\includegraphics[scale=.5]{./images/exp_qual}}; \node[right= .2mm of exp_qual] (exp_firefox) {\includegraphics[scale=.5]{./images/exp_firefox}}; \node[right= .2mm of exp_firefox] (exp_1file) {\includegraphics[scale=.5]{./images/exp_1file}}; \node[box, text width=2.5cm, left = 5mm of exp_qual] (exp_qualC) {Sélectionner la qualité de l'export sur une échelle de 1 à 4}; \node[box, above = 5mm of exp_firefox] (exp_firefoxC) {Activer ou désactiver la création des fichiers pour l'export FirefoxOS (par défaut: désactivé)}; \node[box, text width=10cm, below = 5mm of exp_1file] (exp_1fileC) {Dans le cas d'un export avec fichier unique, vous aurez besoin d'une connexion internet pour accéder à la ressource. Le moteur de rendu de Xia est hébergé sur les serveurs de l'académie de Versailles, et est mis à jour automatiquement. Avec cette configuration, vous ne pouvez pas personnaliser le fond et les icônes (par défaut: désactivé)}; \draw[-stealth] (exp_qualC.east) -- (exp_qual.west); \draw[-stealth] (exp_firefoxC.south) -- (exp_firefox.north); \draw[-stealth] (exp_1fileC.north) -- (exp_1file.south); \end{tikzpicture} \caption{Les options d'export de Xia} \label{xia_export_options} \end{figure} \begin{figure}[htp] \tikzstyle{every node}=[draw=black,thick,anchor=west] \tikzstyle{auto}=[draw=reddebian,fill=reddebian!30, text height=2.5mm] \tikzstyle{manual}=[draw=bluedane,fill=bluedane!30, text height=2.5mm] \tikzstyle{firefoxOS}=[draw=orange,fill=orange!30, text height=2.5mm] \tikzstyle{manualT}=[fill=bluedane!30,draw=bluedane, rectangle,text width=5cm, rounded corners] \tikzstyle{autoT}=[fill=reddebian!30,draw=reddebian, rectangle,text width=5cm, rounded corners] \tikzstyle{autoT}=[fill=reddebian!30,draw=reddebian, rectangle,text width=5cm, rounded corners] \tikzstyle{firefoxOST}=[fill=orange!30,draw=orange, rectangle,text width=5cm, rounded corners] \begin{tikzpicture}[grow via three points={one child at (0.5,-0.7) and two children at (0.5,-0.7) and (0.5,-1.4)}, edge from parent path={(\tikzparentnode.south) |- (\tikzchildnode.west)}] \node [manual] {mon\_projet/} child { node [auto] {index.html}} child { node [firefoxOS] {deploy.html}} child { node [firefoxOS] {manifest.webapp}} child { node [auto] {css/}} child { node [auto] {data/}} child { node [auto] {font/}} child { node [auto] {img/}} child { node [auto] {js/}} child { node [manual] {videos/} child { node [manual] {video.mp4}} child { node [manual] {video.ogv}} child { node [manual] {video.webm}} }; \node[manualT] (textM) at (10,-2) {Ces fichiers et répertoires ont été créés manuellement par le créateur de l'image interactive. Le répertoire \textcolor{bluedane} {videos} a également été créé manuellement, dans le but de stocker les vidéos insérées dans les commentaires de l'image interactive, à l'aide de liens relatifs.}; \node[autoT] (textA) at (10,-8) {Ces fichiers et répertoires sont générés par Xia durant le processus d'export.}; \node[firefoxOST] (textFOS) at (10,-6) {Fichiers générés en cas d'activation de l'export Firefox OS};\draw[-stealth] (textM.west) -- (4,0); \draw[-stealth] (textM.west) -- (5.5,-7); \draw[-stealth] (textA.west) -- (4,-4); \draw[-stealth] (textFOS.west) -- (5.5,-2); \end{tikzpicture} \caption{Fichiers d'une image interactive avec l'export Firefox OS activé} \label{xia_files} \end{figure} En réalité, puisque Xia est également une extension d'Inkscape, vous pouvez générez vos projets directement depuis ce logiciel: cliquez sur \softmenu{Extensions $\rightarrow$ Divers $\rightarrow$ Xia Édu}, et choisissez directement la qualité, le modèle d'export, et le répertoire de destination. \begin{tip} Si vous utilisez GNU/Linux ou Mac OS X, vous pouvez générer vos animation html5 en utilisant le terminal avec la commande \texttt{xia-converter}. Les paramètres à utiliser sont \texttt{-i} pour indiquer le fichier en entrée, \texttt{-o} pour indiquer le répertoire d'export, et \texttt{-t} le thème choisi.\\ \emph{Avec GNU/Linux}\\ \texttt{\$ xia-converter -i monfichier.svg -o dossier\_export/ -t accordionBlack}\\ \emph{Avec Mac OS X}\\ \texttt{\$ cd /Applications/xia.app/Contents/Resources/}\\ \texttt{\$ python xia.py -i monfichier.svg -o dossier\_export/ -t gameDragAndDrop}\\ Le thème accordionBlack sera choisi s'il y a une erreur de syntaxe dans le paramre \texttt{-t}. \end{tip} \subsection{L'export Firefox OS: comment ça marche?} L'utilisateur devra se servir du navigateur web de Firefox OS, et accéder à la ressource via le fichier \texttt{deploy.html}. Firefox OS lancera alors un processus dans lequel l'animation sera transformée en application html5. \subsection{En résumé} \begin{enumerate} \item Une image interactive est construite dans Inkscape (au format svg). Xia ne fait que convertir ce fichier source svg en animation html5; \item Le titre de l'image interactive doit être renseigné dans les \softmenu{Métadonnées du document}; \item Le texte des détails est renseigné dans les \softmenu{Propriétés de l'objet}, dans les champs \softmenu{Titre} et \softmenu{Description} des détails détourés; \item La description générale de l'image interactive doit être renseignée dans les \softmenu{Propriétés de l'objet} de l'image de fond. \end{enumerate} \section{Images interactives enrichies}\label{enriched_IA} \begin{links} Visualisez l'\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia2}{image interactive} créée pour cette partie de la documentation. Téléchargez le fichier source au format \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia2/svg/xia2.svg}{svg}. \end{links} Dans cette section, l'objectif demeure la création d'une image interactive «~simple~» (autrement dit, dans laquelle un détail fait apparaître un commentaire). Cependant, le texte des commentaires sera enrichi par une mise en forme ou des ressources multimédias. \newpage \subsection{Mise en forme du texte} Afin de mettre en forme le texte, les balises indiquées dans l'illustration \ref{xia_text_tags} seront utilisées. \begin{figure}[htp!] \tikzstyle{descrip}=[font=\sffamily, anchor=north west, text width = 4.3cm] \tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded corners, anchor=north west] \begin{tikzpicture} \node[anchor=north west] (bold) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = -7mm of bold] (boldT) {Ce texte est en ***gras***}; \node[box, right = 3.5cm of bold] (bolR) {Ce texte est en \textbf{gras}}; \node[anchor=north west, below = .2cm of bold] (italic) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = -7mm of italic] (italicT) {Ce texte est en **italique**}; \node[box, right = 3.5cm of italic] (italicR) {Ce texte est en \textit{italique}}; \node[anchor=north west, below = .2cm of italic] (texttt) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = -7mm of texttt] (textttT) {Bout de texte \verb!{{{brut}}}!}; \node[box, right = 3.5cm of texttt] (textttR) {Bout de texte \texttt{brut}}; \node[anchor=north west, below = .2cm of texttt] (link) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = 7mm of link.north] (linkT) {Un lien vers \verb![https://www.wikipedia.org/ Wikipedia]}; \node[box, right = 3.5cm of link] (linkR) {Un lien vers \href{https://www.wikipedia.org/}{Wikipedia}}; \node[anchor=north west, below = .2cm of link] (relativelinks) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = -7mm of relativelinks] (relativelinksT) {Un lien vers un \verb![./foo/bar.pdf fichier local]!}; \node[box, right = 3.5cm of relativelinks] (relativelinksR) {Un lien vers un \href{./foo/bar.pdf}{fichier local\footnote{Lien qui ne fonctionnera pas ici!}}}; \node[anchor=north west, below = .8cm of relativelinks] (bullets) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = -7mm of bullets] (bulletsT) {Faire une liste \\ $\ast$ de puces \\ $\ast$ sur \\ ~$\ast$ 2 niveaux\footnote{Insérez un \Spacebar (espace) avant les $\ast$}}; \node[box, right = 3.5cm of bullets.south east] (bulletsR) {Faire une liste \begin{itemize} \item de puces \item sur \begin{itemize} \item 2 niveaux \end{itemize} \end{itemize} }; \node[anchor=north west, below = 3cm of bullets] (line) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = 7mm of line.north] (lineT) {Tracer \\ - - - - \\ un trait}; \node[box, right = 3.5cm of line] (lineR) {Tracer \\ \hrulefill \\ un trait}; \end{tikzpicture} \caption{Balises de mise en forme du texte} \label{xia_text_tags} \end{figure} \begin{alert} Les liens vers les fichiers locaux doivent obligatoirement être des liens relatifs: \verb![./dossier/fichier.pdf]! pour un fichier pdf contenu dans le répertoire d'export, et \verb![../dossier/fichier.pdf]! pour un fichier pdf contenu dans un répertoire parent. \end{alert} \subsection{Insérer des ressources multimédias dans les commentaires}\label{multimedia_enrichment} L'insertion de ressources multimédias dans les commentaires est chose assez aisée: copiez-collez l'url de la ressource (qu'elle soit absolue ou relative) ou le code iframe du service web utilisé pour héberger votre ressource, et Xia créera automatiquement un lecteur multimédia, pour peu que celle-ci (image, son, vidéo) fasse partie des formats supportés: \begin{description} \item[Images] jpg, jpeg, png, gif \item [Audio] ogg, mp3 \item [Video] ogv, webm, mp4 \end{description} Le lien doit être inséré dans le champ \softmenu{Description} des \softmenu{Propriétés de l'objet}. \begin{description} \item[Lien absolu] Si l'url de la ressource est \verb|http://web.crdp.ac-versailles.fr/02546.ogg| il suffit alors d'écrire cette url dans le champ \softmenu{Description} des \softmenu{Propriétés de l'objet} dans Inkscape. \item[Lien relatif] Si le fichier de la ressource multimédia se trouve dans le répertoire d'export de l'image interactive, ou dans un répertoire contenu dans celui-ci, indiquez simplement le chemin vers le fichier, en considérant le répertoire d'export comme répertoire racine. Par exemple, si le fichier \verb|video.ogv| se trouve dans le répertoire \verb|videos| se trouvant lui-même dans le répertoire de l'image interactive, indiquez: \verb|./videos/video.ogv| pour créer le lecteur. Le \verb|./| signifie que le répertoire \verb|videos| se trouve dans le répertoire d'exportation. On peut aussi utiliser \verb|../| pour indiquer que la ressource se trouve dans le répertoire parent. \end{description} \begin{tip} Ainsi, même si un format particulier est renseigné dans la description (si l'on suit l'exemple précédent, ce serait \verb|videos/video.ogv|), si le navigateur web est incapable de lire la ressource, il tentera automatiquement de lire les fichiers possédant le même nom mais une extension différente. Même si un format spécifique est renseigné dans la description (si l'on suit l'exemple précédent: \verb|videos/video.ogv|), si le navigateur est incapable de lire la ressource, il cherchera automatiquement à lire les fichiers du même nom mais possédant une extension différente (c'est à dire, \verb|video.mp4| et \verb|video.webm|). \end{tip} La dernière possibilité consiste à insérer un code iframe. Celui-ci sera interprété et le lecteur du service web apparaîtra, donnant accès à la ressource. \subsection{Le modèle «~audioBrown~»: le son à la place du texte}\label{audioBrownsection} \begin{links} Visualisez l'\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia4}{image interactive} créée pour cette partie de la documentation. Téléchargez le fichier source au format \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia4/svg/xia4.zip}{svg} (archive contenant le fichier source au format svg et les sons associés). \end{links} Le modèle «~audioBrown~» est spécifiquement dédié à la création d'images interactives dans lesquelles les détails sont associés à des sons plutôt qu'à du texte. Pour insérer des sons, vous utiliserez des liens absolus ou relatifs en suivant la méthode décrite dans la section \ref{multimedia_enrichment}. Si vous souhaitez que le son soit joué automatiquement à la sélection du détail, ajoutez la balise \verb|autostart| après l'url de la ressource \footnote{La balise \texttt{autostart} fonctionne également avec les autres modèles d'export de Xia.}:\\ \begin{center} \verb|sons/son_detail_1.ogg autostart| \end{center} \subsection{Insérer des images dans votre image interactive}\label{insertion_images} Des images au format png peuvent être ajoutées à l'image de fond. Pour faire cela, sélectionnez \softmenu{Fichier $\rightarrow$ Importer} dans Inkscape afin d'incorporer votre image. L'image importée n'apparaîtra dans l'animation html5 qu'à une condition: que vous lui ayez appliqué un fond blanc dans Inkscape. Choisissez la couleur blanche dans la palette horizontale en bas de l'interface d'Inkscape:\\ \begin{center} \includegraphics[width=0.6\textwidth]{images/white_fill}\\ \end{center} En indiquant une url dans le champ \softmenu{Titre} des \softmenu{Propriétés de l'objet}, cette image incorporée deviendra un lien cliquable. \subsection{Faire apparaître une question et dévoiler une réponse} Vous pouvez créer une icône cliquable, qui empêche temporairement un utilisateur de lire la suite du commentaire. Vous pouvez même demander à l'utilisateur d'indiquer un mot de passe pour lire la suite du commentaire. Pour cela, utilisez dans la description les balises indiquées dans l'illustration \ref{xia_answer_tags}. \begin{figure}[htp!] \tikzstyle{descrip}=[font=\sffamily, anchor=north west, text width = 4.3cm] \tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded corners, anchor=north west] \begin{tikzpicture} \node[anchor=north west] (answer) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = -7mm of answer] (answerT) {[[Puis-je vous poser une question? (code=12345): Bien sûr que c'est possible.]]}; \node[box, right = 3.5cm of answer] (answerI) {\includegraphics[scale=.5]{./images/answer_code}}; \end{tikzpicture} \caption{Balises permettant de créer un bouton empêchant temporairement la lecture de la suite du commentaire.} \label{xia_answer_tags} \end{figure} Utilisez la balise \texttt{[[ (...) ]]} pour indiquer que vous souhaitez créer une icône, séparez le texte de la question de celui de la réponse avec la balise \texttt{:}, et ajoutez un code en insérant \texttt{(code=mot\_de\_passe)} avant la balise \texttt{:}\footnote{Le code n'est pas obligatoire. Souvenez-vous que vous pouvez utiliser tous les caractères que vous souhaitez dans le code, sauf le \texttt{)}.}. \subsection{Contrôler le comportement des détails: affichage immédiat et désactivation du zoom}\label{white_black_background} Par défaut, le comportement des détails d'une image interactive est le suivant: \begin{itemize} \item mise en valeur des détails au survol de la souris ou par un clic sur son titre dans les commentaires \item effet de zoom lors d'un second clic sur le détail actif\footnote{Sauf dans le cas du modèle popBlue.} \end{itemize} Ces deux comportements par défaut peuvent être modifiés si vous appliquez un fond noir ou blanc aux détails détourés (voir la section \ref{insertion_images}): \begin{description} \item[Détail avec un fond blanc] Dans l'image interactive, ces détails seront visibles immédiatement, sous la forme d'un aplat de couleur opaque, cachant l'image de fond; une fois sélectionné, ce fond sera visible (le zoom demeure actif). \item [Détail avec un fond noir] Les utilisateurs devront cliquer pour activer le détail, mais l'effet de zoom est désactivé. \end{description} Conséquence logique: comme un détail ne saurait avoir simultanément un fond noir et un fond blanc, un détail ne peut donc être à la fois immédiatement visible et avoir le zoom désactivé. \subsection{Contrôler l'ordre d'affichage des détails dans la barre latérale des commentaires}\label{XML_layer} Par défaut dans une image interactive, les détails apparaissent verticalement en suivant l'ordre dans lequel ils ont été créés dans Inkscape (le premier détail créé dans Inkscape correspond à celui placé en haut dans la barre latérale de l'image interactive). Pour changer cet ordre par défaut, nous utiliserons l'\softmenu{Éditeur XML}, situé dans le menu \softmenu{Édition}. A priori complexe, cette fenêtre de dialogue est en réalité assez simple à utiliser: en sélectionnant une entrée de l'éditeur XML, le détail correspondant à celle-ci sera mis en évidence sur l'image. Il ne reste plus qu'à glisser-déposer l'entrée à l'endroit désiré:\\ \begin{center} \includegraphics[width=\textwidth]{images/layerorder}\\ \end{center} L'éditeur XML d'Inkscape permet de contrôler l'ordre d'affichage des détails dans l'image interactive. Remarquez la mise en évidence d'un élément sur l'image de fond par simple sélection dans l'éditeur. \subsection{En résumé} \begin{enumerate} \item Vous pouvez enrichir et mettre en forme le texte en utilisant des balises \item L'enrichissement multimédia est possible par simple lien (relatif ou absolu) vers un fichier dont le format est reconnu par Xia \item On ajoute des images sur l'image de fond en les incorporant et en leur appliquant un fond blanc. \item On peut modifier le comportement par défaut des détails en leur appliquant une couleur de fond (blanc ou noir) \item L'ordre des détails de l'image interactive dépend de l'ordre de leur création dans Inkscape. Cependant, on peut utiliser l'éditeur XML d'Inkscape pour modifier cet ordre \item Il est possible d'empêcher les utilisateurs d'accéder au commentaire en insérant une icône cliquable et / ou un mot de passe \end{enumerate} \newpage \section{Créer des jeux avec Xia}\label{games_IA} Jusqu'à maintenant, cette documentation n'a traité que de la création d'image interactive «~traditionnelle~»: une image de fond, des détails détourés associés à des commentaires. Ce type d'image interactive peut être utilisé en classe dans des situations très variées (les élèves découvrent progressivement une image, ou créent eux-mêmes une image interactive), mais Xia va plus loin avec de nouvelles fonctionnalités. On peut désormais créer des jeux, des activités, dans lesquelles l'utilisateur final a bien davantage à faire que de simplement cliquer sur des détails et lire du texte. \begin{figure}[htp] \tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded corners] \begin{tikzpicture} \node[opacity=.5] (bBlue) {\includegraphics[width=2cm]{./images/buttonBlue}}; \node[left= .3mm of bBlue] (aBrown) {\includegraphics[width=2cm]{./images/audioBrown}}; \node[right= .3mm of bBlue] (guClic) {\includegraphics[width=2cm]{./images/game1clic}}; \node[below= .2mm of bBlue.south, opacity=.5] (pBlue) {\includegraphics[width=2cm]{./images/popBlue}}; \node[left= .3mm of pBlue] (gDDrop) {\includegraphics[width=2cm]{./images/gameDragAndDrop}}; \node[right= .3mm of pBlue, opacity=.5] (pYellow) {\includegraphics[width=2cm]{./images/popYellow}}; \node[above = .2mm of guClic.north, opacity=.5] (aCloud) {\includegraphics[width=2cm]{./images/accordionCloud}}; \node[above = .2mm of aCloud.north, opacity=.5] (aBlack) {\includegraphics[width=2cm]{./images/accordionBlack}}; \node[left = .3mm of aBlack] (params) {\includegraphics[width=2cm]{./images/params}}; \node[left = .3mm of params] (files) {\includegraphics[width=2cm]{./images/xia_open}}; \node[left = 2mm of aCloud, opacity=.3] (xialogo) {\includegraphics[height=2cm]{./images/xia}}; \node[box, text width=2.5cm,above left = 5mm of files] (filesC) {Sélection du fichier source au format svg}; \node[box, above = 5mm of params] (paramsC) {Définition des options d'exportation (voir l'illustration \ref{xia_export_options})}; \node[box, right = 5mm of guClic] (guClicC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia3}{game1clic}\\ Sélectionner des détails sur une image de fond \\ Tutoriel dans la rubrique \ref{game1clicsection}}; \node[box, left = 25mm of bBlue] (aBrownC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia4}{audioBrown} \\ Création d'images interactives dans lesquelles des détails sont associés à des sons \\ Tutoriel dans la rubrique \ref{audioBrownsection}}; \node[box, below left = 5mm of pBlue] (gDDropC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia5}{gameDragAndDrop}\\ Glisser et déposer des éléments sur l'image de fond \\ Tutoriel dans la rubrique \ref{gameDragAndDropsection}}; \draw[-stealth] (guClicC.west) -- (guClic.east); \draw[-stealth] (gDDropC.north) -- (gDDrop.south); \draw[-stealth] (aBrownC.north east) -- (aBrown.north); \draw[-stealth] (filesC.south east) -- (files.north west); \draw[-stealth] (paramsC.south) -- (params.north); \end{tikzpicture} \caption{Les modèles multimédias et ludiques de Xia} \label{xia_interface2} \end{figure} \subsection{Premier principe ludique: sélectionner, trouver des éléments dans une image}\label{game1clicsection} \textit{Le principe ludique décrit dans cette partie de la documentation est le suivant: le joueur doit sélectionner des détails dans une image, quand il a sélectionné les éléments indiqués dans la consigne, un message de fin apparaît.} \begin{links} Visualisez l'\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia3}{image interactive} créée pour cette partie de la documentation. Téléchargez le fichier source au format \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia3/svg/xia3.svg}{svg}. \end{links} Ce type de jeu est presque le type d'image interactive la plus facile à créer. Vous devez uniquement détourer les détails que le joueur devra sélectionner. Les consignes doivent être indiquées dans les métadonnées du document. Xia cherchera les informations relatives aux consignes dans le champ \softmenu{Description} des métadonnées du document (voir la section \ref{preparation_svg}: \softmenu{Fichier $\rightarrow$ Métadonnées du document}), et créera une pop up affichant ces consignes à l'ouverture du jeu. Le joueur pourra les lire, fermer la fenêtre puis jouer. Quand un joueur termine le jeu, un message apparaît automatiquement. Ce message doit être renseigné dans le champ \softmenu{Description} des \softmenu{Propriétés de l'objet} de l'image de fond. Vous trouverez tous les détails sur l'endroit et la manière d'indiquer ces informations dans le tableau \ref{tag1_sumup}. \begin{table} \begin{tabular}{|l|p{2in}|p{2in}|} \hline Objectif & Renseigner le nombre de réponses correctes permettant de terminer le jeu & Afficher un message\\ \hline Balise & \texttt{}| & \texttt{}\\ \hline Exemple & \multicolumn{2}{|l|}{\texttt{6}}\\ & \multicolumn{2}{|l|}{\texttt{Bravo!}}\\ & \multicolumn{2}{|l|}{\texttt{Vous avez terminé le jeu!}}\\ \hline \end{tabular} \caption{Résumé des balises du jeu game1clic} \label{tag1_sumup} \end{table} \begin{tip} Le texte inséré dans la balise \verb|| peut être enrichi avec des images, des vidéos, du son. On peut aussi imaginer ajouter un lien vers un autre jeu, ce qui permettrait aux utilisateurs d'enchaîner les jeux par degré de difficulté. \end{tip} Une fois votre fichier svg préparé, choisir le modèle d'export \softmenu{game1clic} pour générer le jeu. \subsection{Second principe ludique: classer, organiser, hiérarchiser}\label{gameDragAndDropsection} Le second type de jeu pouvant être créé avec Xia est basé sur le principe du glisser-déposer. Des étiquettes déplaçables sont déposées sur l'image de fond. Quand tous les éléments ont été placés sur leur zone de dépôt, un message apparaît, annonçant la fin du jeu. \begin{links} Visualisez l'\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia5}{image interactive} créée pour cette partie de la documentation. Téléchargez le fichier source au format \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia5/svg/xia5.svg}{svg}. \end{links} Voici comment créer un jeu basé sur le principe du glisser-déposer: \begin{enumerate} \item Dans Inkscape: \begin{itemize} \item Choisir et importer une image de fond \item Créer les éléments que les utilisateurs de votre image interactive auront à déplacer et à déposer (autrement dit: des images, des mots ou groupes de mots: voir ci-dessous les explications) \item Créer la fenêtre surgissante de consignes en éditant les informations du champ \softmenu{Fichier $\rightarrow$ Métadonnées du document $\rightarrow$ Description}\footnote{Exactement comme dans le jeu game1clic} \item En renseignant les métadonnées, faites correspondre chaque élément à une zone de dépôt (ces zones de dépôts étant en réalité des détails détourés) \end{itemize} \item Dans Xia \begin{itemize} \item Exporter le fichier source au format svg avec le modèle \softmenu{gameDragAndDrop} \end{itemize} \end{enumerate} Deux méthodes peuvent être utilisées pour créer les éléments que les joueurs auront à glisser et déposer. La première, très simple, consiste à utiliser un utilitaire de capture d'écran capable de créer des petites images au format png, puis d'importer celles-ci dans Inkscape. Il est également possible de créer ces éléments directement dans Inkscape. Par exemple, en créant un texte, en regroupant ce texte avec une forme puis en faisant une copie bitmap de cet ensemble (\softmenu{Édition $\rightarrow$ Créer une copie bitmap}). Les éléments à déplacer doivent être associés à leur zone de dépôt \footnote{\textbf{Un} objet ne pouvant être associé qu'à \textbf{une} zone de dépôt.}. Pour faire cela, il faut «~jumeler~» les éléments à glisser-déposer avec leur zone de dépôt en faisant correspondre le champ \softmenu{ID} de la zone de dépôt au champ \softmenu{Description} de l'élément à glisser déposer. La seule subtilité tient dans la balise \verb|| devant être indiquée dans la \softmenu{Description}. Vous trouverez dans le tableau \ref{tag2_sumup} un résumé des balises à renseigner dans les \softmenu{Propriétés de l'objet} des éléments à déplacer et des zones de dépôts afin de les faire correspondre les unes aux autres. \begin{table} \begin{tabular}{|p{1.in}|p{2.5in}|p{1.5in}|} \hline & Élément à déplacer (objets à glisser et déposer) & Détail détouré (zone de dépôt)\\ \hline Champ ID & & \verb|Titre_du_détail|\\ \hline Champ description & \verb|Titre_du_détail| & \\ \hline \end{tabular} \caption{Résumé des balises à utiliser dans le jeu gameDragAndDrop} \label{tag2_sumup} \end{table} Une fois votre fichier svg préparé, choisir le modèle \softmenu{gameDragAndDrop} pour générer le jeu. \subsection{Troisième principe ludique: les collisions} \textit{Le principe ludique documenté dans cette section est le suivant: le joueur doit déplacer des éléments vers des zones de dépôt, mais les déplacements de ces éléments ne peuvent avoir lieu que dans certaines limites. Le jeu de type «~collisions~» peut ainsi être utilisé pour créer des labyrinthes, des taquins.} \begin{links} Visualisez l'\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia6}{image interactive} créée pour cette partie de la documentation. Téléchargez le fichier source au format \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia6/svg/xia6.svg}{svg}. \end{links} Pour créer ce type de jeu, ajoutez la balise \verb|on| à l'image de fond. Une fois cela fait, tous les détails deviennent «~solides~», et bloquent le déplacement des objets qu'il faut déplacer (images au format png importées, ou copie bitmap de formes dessinées avec Inkscape). Le jeu de type «~collisions~» est en réalité un jeu de type gameDragAndDrop, puisque la résolution passe par le dépôt d'un ou plusieurs éléments à certains endroits de l'image. Les balises nécessaires dans ce type de jeu sont donc les mêmes que dans le jeu gameDragAndDrop \footnote{\texttt{} sur les objets, \texttt{} et \texttt{} sur l'image de fond: voir la section \ref{gameDragAndDropsection}.}, mais il faudra penser à appliquer la balise \verb|off| sur les zones de dépôts, dans le champ \softmenu{Description}. Une fois votre fichier svg préparé, choisir le modèle \softmenu{gameDragAndDrop} pour générer le jeu. \subsection{\emph{Astuces pour la création de jeux interactifs}: effet aimant, infobulles, double compteur de score\ldots} \subsubsection{Montrer la progression dans le jeu (thème game1clic)}\label{playersscore} Il est possible de faire s'afficher des éléments graphiques quand le joueur sélectionne une réponse correcte. Ces éléments peuvent être des png importés ou des formes directement dessinées dans Inkscape. Comme Xia considère qu'une forme dessinée avec les outils d'Inkscape est un détail, il faudra transformer ces formes en utilisant l'outil «~copie bitmap~». Par exemple: \begin{enumerate} \item Dessinez une étoile aux bords jaunes et au fond jaune avec les outils de dessin d'Inkscape \item Sélectionnez cette étoile, et cliquez sur \softmenu{Édition $\rightarrow$ Créer une copie bitmap} \item Supprimer l'étoile créée avec les outils de dessin \end{enumerate} Une fois les éléments importés (format png) ou créés (copie bitmap des formes dessinées manuellement), appliquez-leurs les caractéristiques suivantes: \begin{center} \softmenu{Interactivité > OnClick} = \verb|off| \end{center} Ensuite, groupez le détail cliquable et son élément graphique (en cliquant successivement sur le détail et l'élément en maintenant la touche \Shift enfoncée), puis en sélectionnant \softmenu{Grouper} dans le menu \softmenu{Objet} d'Inkscape. \subsubsection{Montrer les erreurs du joueur (thème game1clic)} On voit clairement l'intérêt pédagogique des jeux basés sur le principe de la sélection\ldots mais on voit également rapidement comment des élèves peuvent être tentés de contourner le dispositif ludique pour terminer les jeux sans avoir à réfléchir (par exemple, en cliquant frénétiquement partout sur l'image, jusqu'à trouver par hasard tous les détails répondant à la consigne). C'est la raison pour laquelle il peut être intéressant de mettre en valeur les erreurs commises par le joueur. Pour cela, il faudra prévoir les erreurs pouvant être commises, et placer sur l'image des éléments graphiques symbolisant l'erreur (croix rouge, etc.). Ces éléments pouvant être des images au format png importées ou des formes dessinées dans Inkscape, puis copiées en bitmap (voir la rubrique \ref{playersscore}). Ces éléments devront posséder les caractéristiques suivantes: \begin{center} \softmenu{Interactivité > OnClick} = \verb|disable-score| \end{center} Une fois la balise \verb|disable-score| appliquée, le détail demeure cliquable, mais sa sélection n'ajoutera pas un point au compteur surveillant le score pour délivrer le message de fin. \subsubsection{Comment ajouter un effet «~aimant~» (thème gameDragAndDrop)} Si vous indiquez \verb|on| dans le champ \softmenu{Description} de la zone de dépôt, un effet aimant sera activé quand le joueur déposera l'élément sur celle-ci. \subsubsection{Liens sur les zones de dépôt (thème gameDragAndDrop)} Vous pouvez insérer un lien dans le champ \softmenu{Titre} des \softmenu{Propriétés de l'objet} de la zone de dépôt. L'utilisateur peut cliquer sur cette zone ou y déposer l'étiquette correspondante pour suivre le lien. \subsubsection{Infobulles (thèmes game1clic et gameDragAndDrop)} \begin{links} Visualisez l'\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia7}{image interactive} créée pour cette partie de la documentation. Téléchargez le fichier source au format \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia7/svg/xia7.svg}{svg}. \end{links} Il est possible de faire s'afficher des infobulles lorsque la souris survole certains détails. Pour cela, créez l'infobulle avec une image au format png importée ou une copie bitmap (voir rubrique \ref{playersscore}) d'un texte créé dans Inkscape\footnote{Ou une copie bitmap d'une forme groupée avec du texte\ldots}, et appliquez à cette infobulle une \softmenu{ID} spéicifique dans les \softmenu{Propriétés de l'objet}. Ensuite, indiquez la balise \verb|ID_de_l_infobulle| dans le champ \softmenu{Description} des \softmenu{Propriétés de l'objet} du détail censé déclencher l'apparition de l'infobulle (par exemple, dans l'image ci-dessous: au survol de la souris, le carré jaune fait apparaître l'infobulle "Test"):\\ \begin{center} \includegraphics[width=0.5\textwidth]{images/tooltip_example}\\ \end{center} Notez que cette fonctionnalité est également disponible avec les thèmes game1clic et gameDragAndDrop.\\ \subsubsection{Double compteur de score (thèmes game1clic et gameDragAndDrop)} En indiquant \verb|score2| dans le champ \softmenu{onclick} (\softmenu{Propriétés de l'objet $\rightarrow$ Interactivité}) du détail, et en utilisant les balises\\ \texttt{} et \texttt{} dans les \softmenu{Propriétés de l'objet} de l'image de fond, on peut créer un système de double comptage des points, dans lequel l'utilisateur peut sélectionner deux types de détails différents. Ainsi, vous pouvez créer un jeu où 3 détails comportent la balise \texttt{score2} (cette balise correspondant à des erreurs), et indiquez dans les \softmenu{Propriétés de l'objet} de l'image de fond:\\ \texttt{4\\ Bravo!\\ 3\\ 3 erreurs... Ça fait beaucoup...\\ Concentrez-vous et recommencez!...}\\ \newpage \subsection{En résumé} Ces tableaux résument les balises pouvant être utilisées dans le cadre de la création de jeux avec Xia: \begin{table}[thp] \begin{tabular}{|p{.5cm}|p{2cm}|p{10cm}|} \hline \multicolumn{3}{|l|}{Modèle \softmenu{game1clic}} \\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Rôle} & Permet de régler le nombre de bonnes réponses nécessaires pour faire apparaître le message de fin du jeu\\ & \emph{Élément} & Image de fond \\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Description} \\ & \emph{Quoi?} & Le nombre de bonnes réponses nécessaires à la résolution du jeu\\ \hline \multicolumn{3}{|l|}{\texttt{} }\\ \hline & \emph{Rôle} & Fait apparaître le message de fin du jeu \\ & \emph{Élément} & Image de fond \\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Description}\\ & \emph{Quoi?} & Message que vous pouvez enrichir avec des ressources multimédias ou un lien hypertexte\\ \hline \multicolumn{3}{|l|}{\texttt{off}}\\ \hline & \emph{Rôle} & Rend un détail insensible au clic \\ & \emph{Élément} & Détail \\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Interactivité $\rightarrow$ Onclick}\\ \hline \multicolumn{3}{|l|}{\texttt{disable-score}}\\ \hline & \emph{Rôle} & Rend un détail détouré cliquable, mais sa sélection n'ajoutera pas de point au compteur de score \\ & \emph{Élément} & Détail \\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Interactivité $\rightarrow$ Onclick}\\ \hline \multicolumn{3}{|l|}{\texttt{score2}}\\ \hline & \emph{Rôle} & Ajoute un point au deuxième compteur de score \\ & \emph{Élément} & Détail \\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Interactivité $\rightarrow$ Onclick}\\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Rôle} & Affiche une infobulle au survol de la souris \\ & \emph{Élément} & Détail \\ & \emph{Quoi?} & Assurez-vous que ce champ est identique à l'ID de l'élément servant d'infobulle\\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Description}\\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Rôle} & Régler le nombre de bonnes réponses nécessaires à l'apparition du second message (jeu à double score)\\ & \emph{Élément} & Image de fond \\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Description} \\ & \emph{Quoi?} & Le nombre de bonnes réponses nécessaires à la résolution du jeu\\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Rôle} & Fait apparaître le second message de fin du jeu (jeu à double score) \\ & \emph{Élément} & Image de fond \\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Description}\\ & \emph{Quoi?} & Message que vous pouvez enrichir avec des ressources multimédias ou un lien hypertexte\\ \hline \end{tabular} \caption{Balises à insérer pour un jeu de type game1clic} \end{table} \begin{table}[thp] \begin{tabular}{|p{.5cm}|p{2cm}|p{10cm}|} \hline \multicolumn{3}{|l|}{Modèle \softmenu{gameDragAndDrop}} \\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Rôle} & Permet de régler le nombre de bonnes réponses nécessaires pour faire apparaître le message de fin du jeu\\ & \emph{Élément} & Image de fond \\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Description} \\ & \emph{Quoi?} & Le nombre de bonnes réponses nécessaires à la résolution du jeu\\ \hline \multicolumn{3}{|l|}{\texttt{} }\\ \hline & \emph{Rôle} & Fait apparaître le message de fin du jeu \\ & \emph{Élément} & Image de fond \\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Description}\\ & \emph{Quoi?} & Message que vous pouvez enrichir avec des ressources multimédias ou un lien hypertexte\\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Rôle} & Indique la correspondance entre l'élément à déplacer et la zone de dépôt \\ & \emph{Élément} & Élément à déplacer \\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Description}\\ & \emph{Quoi?} & Assurez-vous que ce champ est identique à l'ID de la zone de dépôt\\ \hline \multicolumn{3}{|l|}{\texttt{on}}\\ \hline & \emph{Rôle} & Ajoute un effet «~aimant~» \\ & \emph{Élément} & Zone de dépôt \\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Description} \\ \hline \multicolumn{3}{|l|}{\texttt{on}}\\ \hline & \emph{Rôle} & Active le jeu de type "collisions" \\ & \emph{Élément} & Image de fond \\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Description} \\ \hline \multicolumn{3}{|l|}{\texttt{off}}\\ \hline & \emph{Rôle} & Crée une zone de dépôt dans un jeu de type "collisions"\\ & \emph{Élément} & Zone de dépôt\\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Description} \\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Rôle} & Affiche une infobulle au survol de la souris \\ & \emph{Élément} & Zone de dépôt, éléments à déplacer \\ & \emph{Quoi?} & Assurez-vous que ce champ est identique à l'ID de l'élément servant d'infobulle\\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Description}\\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Rôle} & Régler le nombre de bonnes réponses nécessaires à l'apparition du second message (jeu à double score)\\ & \emph{Élément} & Image de fond \\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Description} \\ & \emph{Quoi?} & Le nombre de bonnes réponses nécessaires à la résolution du jeu\\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Rôle} & Fait apparaître le second message de fin du jeu (jeu à double score) \\ & \emph{Élément} & Image de fond \\ & \emph{Où?} & \softmenu{Propriétés de l'objet $\rightarrow$ Description}\\ & \emph{Quoi?} & Message que vous pouvez enrichir avec des ressources multimédias ou un lien hypertexte\\ \hline \end{tabular} \caption{Balises à insérer en vue d'un export gameDragAndDrop} \end{table} \section{Foire aux questions et trucs et astuces pour le logiciel Inkscape} \subsection{FAQ} \textbf{Je ne vois pas Xia dans le menu extensions d'Inkscape. Pourquoi?}\\ $\rightarrow$ Avez-vous installé Inkscape avant Xia? Si ce n'est pas le cas, ré-installez Xia. Si vous utilisez la version portable de Xia, le fait que rien n'apparaisse dans le menu extension est tout à fait normal. \textbf{L'icône «~Fichier source~» n'apparaît pas quand je lance Xia depuis le menu extension d'Inkscape. Pourquoi?}\\ $\rightarrow$ En lançant Xia depuis les extensions d'Inkscape, il n'y a pas d'icône «~Fichier source~», puisque Xia considère que l'animation html5 que vous souhaitez générer est celle sur laquelle vous travaillez dans Inkscape... Choisissez donc uniquement les options d'exportation et le modèle. \textbf{J'ai installé Inkscape mais je ne le retrouve pas dans mes programmes. Où se cache-t-il?}\\ $\rightarrow$ Xia se trouve dans le dossier des «~Applications~» de Mac OS X. Sur un sytème GNU/Linux, le paquet Xia porte le nom «~xia-converter~». Sur Windows, Xia ne fonctionne que comme extension d'Inkscape. Si vous souhaitez utiliser le logiciel seul, utilisez la version portable. \textbf{J'ai ajouté du texte sur mon image avec l'outil «~Créer et éditer des objets textes~», mais je ne le vois pas apparaître dans mon image interactive. Pourquoi?}\\ $\rightarrow$ Si vous ne faites pas de copie bitmap du texte, Xia considèrera que le texte créé avec l'outil «~Créer et éditer des objets textes~» est un détail, et pas une image à affichier. \subsection{Astuces Inkscape} \begin{itemize} \item Ajoutez des couleurs de fond à vos détails. Les détails seront ainsi plus faciles à sélectionner et modifier, et cela n'aura aucune conséquence sur l'animation html5 (sauf si vous choisissez le blanc ou le noir comme couleur de remplissage). \item Si vous voulez créer un détail à partir de plusieurs, vous pouvez les «~Grouper~» (\softmenu{Objet} $\rightarrow$ \softmenu{Grouper}, ou \Ctrl + \keystroke{G}) ou les «~Unir~» (\softmenu{Chemin} $\rightarrow$ \softmenu{Union}, or \Ctrl + \keystroke{+}). \item Quand un détail est créé, il est toujours possible de les modifier: ajout ou suppression de nœuds, déplacement, etc. Il suffit de double-cliquer sur un détail et d'utiliser les outils de modification:\\ \begin{center} \includegraphics[width=0.8\textwidth]{./images/modifynodes}\\ \end{center} \item Certains raccourcis claviers vous feront gagner énormément de temps! \begin{enumerate} \item \fbox{\Shift + \Ctrl + \keystroke{a}} pour accéder aux outils d'\softmenu{Alignement et de distribution} \item \fbox{\Shift + \Ctrl + \keystroke{o}} pour accéder aux \softmenu{Propriétés de l'objet} \item \fbox{\Alt + \keystroke{b}} pour créer une copie bitmap d'une forme dessinée dans Inkscape \item \fbox{\Ctrl + \keystroke{g}} pour grouper différents objets ou détails et \fbox{\Ctrl + \Shift + \keystroke{g}} pour les dégrouper \end{enumerate} \end{itemize} \listoffigures \listoftables \end{document} images-actives-html5.git/doc/documentation.tex000066400000000000000000001565771250410645000217520ustar00rootroot00000000000000\include{preambule} \title{Xia\\ Create HTML5 interactive images\\ \begin{center} \includegraphics[scale=0.5]{./images/xia-logo} \end{center}} \begin{document} \selectlanguage{english} \maketitle \tableofcontents \renewcommand{\figurename}{Figure} \renewcommand{\tablename}{Table} \renewcommand{\listfigurename}{List of figures} \section{Introducing Xia} \subsection{What is Xia ?} Xia is a free software developped by teachers from the french academy of Versailles. It is released under \href{http://www.gnu.org/copyleft/gpl.html}{GPLv3} license. Xia converter takes a svg file as input and outputs an interactive image in html5. Xia allows to generate animations and interactive activities : drag and drop games, discrimination, selection, etc. First sections of this documentation (see section \ref{basic_imageactive}) are dedicated to make a very simple interactive image: cropped details with comments only made of plain text. Then, you will learn how to create an enriched interactive image (see section \ref{enriched_IA}). Final sections (section \ref{games_IA}) will teach you to create games. \begin{tip} All examples are on line (links and downloads available at the beginning of each section). At the end of each section, a heading "Abstract" presents the essential guide lines to remember when creating an interactive image. \end{tip} \subsection{General process} Xia is only needed at the end of the process. As we can see on figure \ref{workflowxia}, most of the work is done with a vector graphics editor. We recommend using the free open-source and muliplatform software \href{http://www.inkscape.org/}{Inkscape}, which is really easy to use (Inkscape will be used in this document)\footnote{It is also possible to use LibreOffice Draw.}. \begin{figure}[htp] \centering \tikzstyle{box} = [draw, text width=.6\textwidth, align=center] \tikzstyle{ia} = [draw, text width=.8\textwidth, fill=reddebian!80, rounded corners, inner ysep=2mm] \tikzstyle{xia} = [draw, text width=.8\textwidth, fill=bluedane!80, rounded corners, inner ysep=2mm] \begin{tikzpicture} \node[box] (open) {Open an Image in Inkscape}; \node[box,below of=open] (create) {Create details in image}; \node[box,below of=create] (meta) {For each detail, edit metadata}; \node[box,below of=meta] (save) {Save project}; \node[left of=create,xshift=-.37\textwidth, rotate=90] (scape) {\textbf{Inkscape}}; \begin{scope}[on background layer] \node[fit = (open)(meta)(save)(scape), ia] (ink) {}; \end{scope} \node[box,below=1cm of save] (createia) {Create an interactive image in html5}; \node[left of=createia,xshift=-.37\textwidth, rotate=90] (xia) {\textbf{Xia}}; \begin{scope}[on background layer] \node[fit = (createia)(xia), xia] (ink) {}; \end{scope} \draw[-stealth] (open) -- (create); \draw[-stealth] (create) -- (meta); \draw[-stealth] (meta) -- (save); \draw[-stealth] (save) -- (createia); \end{tikzpicture} \caption{Creation process of an interactive image with Xia} \label{workflowxia} \end{figure} \begin{tip} If you have "image active" project files (with a .xia extension), you can change their extension to .zip, unzip them, get the svg file located in the unzipped folder, and open it with Inkscape. If you are using GNU/Linux, just explore the .xia file and extract the svg file. \end{tip} \subsection{Installing Inkscape and Xia} Having Inkscape and Xia installed on your computer is the only thing you need to read this documentation. You will find any relevant information about the installation of Inkscape on its website\footnote{\href{http://www.inkscape.org/}{http://www.inkscape.org/}.} \begin{alert} Make sure to install Xia after Inkscape. Otherwise you will not be able to access Xia directly in Inkscape.\\ If you work on a Windows system, use the portable version to access Xia outside of Inkscape. \end{alert} \begin{description} \item [GNU/Linux] In a terminal:\\ \texttt{\$ sudo echo "deb http://repository.crdp.ac-versailles.fr/debian xia main" | sudo tee /etc/apt/sources.list.d/xia.list}\\ \texttt{\$ wget -q http://repository.crdp.ac-versailles.fr/crdp.gpg -O - | sudo apt-key add -}\\ \texttt{\$ sudo apt-get update \&\& sudo apt-get install xia} \item [Mac OS X] Download and install the package:\\ \href{http://xia.dane.ac-versailles.fr/download/xia.pkg}{http://xia.dane.ac-versailles.fr/download/xia.pkg} \item [Windows] Download and install the Inkscape extension (\href{http://xia.dane.ac-versailles.fr/download/setup.exe}{http://xia.dane.ac-versailles.fr/download/setup.exe}) or the portable version (\href{http://xia.dane.ac-versailles.fr/download/xia-windows.zip}{http://xia.dane.ac-versailles.fr/download/xia-windows.zip}). \end{description} \section{Creating your first interactive image using Inkscape and Xia: \emph{Basic features}}\label{basic_imageactive} \subsection{Building the svg source file to generate an interactive image}\label{preparation_svg} \begin{links} Explore the \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1}{interactive image} created for this section of the documentation. Download the \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/svg/xia1.svg}{svg} source file. \end{links} Manipulations described in this section will help you to create a "basic" interactive image featuring: \begin{itemize} \item Zoom-in enabled details \item Comments on details only made of plain text \end{itemize} Once you have chosen the image you will work with, open it with Inkscape: \softmenu{File $\rightarrow$ Open} When asked by the software if you wish to "\softmenu{Link}" or "\softmenu{Incorporate image}", choose "\softmenu{Incorporate}". The information filled in the \softmenu{document Metadata} (\softmenu {File} menu) will be included in the interactive image once generated : title, creator, rights, \ldots. It is strongly recommended to type in this information. You can see what it looks like once generated on the image below\footnote{The fields "author" and "rights" appear in the window "About", symbolized by a clickable button shaped like the letter "i"}:\\ \begin{center} \includegraphics[width=\textwidth]{images/ia_title}\\ \end{center} The title entered in the metadata of the document appears above the interactive image and gives its name to the web page. The creator and rights appear in the pop up associated with the "i" button on the right of the title of the interactive image. You can save the image in svg format in the earlywork, through \softmenu{File $\rightarrow$ Save as\ldots}. For more clarity, you should remove the current extension of the image in the field \softmenu{Name} of the dialog window. Finally, in the dropdown menu, choose the Inkscape svg file format: \softmenu{SVG Inkscape (*.svg)}. Several Inkscape tools can be used to clip the details that will become active in the animation generated by Xia. Among these: \begin{itemize} \item \includegraphics[scale=0.5]{./images/square} \softmenu{Create rectangles and squares} \item \includegraphics[scale=0.5]{./images/circles} \softmenu{Create circles, ellipses and arcs} \item \includegraphics[scale=0.5]{./images/line} \softmenu{Draw freehand lines} \item \includegraphics[scale=0.5]{./images/bezier} \softmenu{Bezier curves and straight lines} \end{itemize} Without going in the detail of how these tools work\footnote{For this, refer to \href{http://inkscape.org/doc/shapes/tutorial-shapes.fr.html}{Inkscape manual} or \href{http://en.flossmanuals.net/inkscape/}{Floss manual}.} note that the tool "\softmenu{Draw Bezier curves and straight lines}" allows to crop "click by click" (work points are called "nodes"). You close the figure by clicking on the start node. You can draw "\softmenu{Bezier curves}" by keeping the mouse button pressed after creating a node, then moving the cursor to bring up the control handles to shape the curve segment as desired. \begin{alert} If you set a left open shape in Inkscape (for example a line), Xia will automatically close it by connecting a straight line between the beginning and the end of it. \end{alert} \begin{alert} The order of creation of details in Inkscape will be the same in the html5 interactive image (for example: the first created detail in Inkscape will appear at the top of the interactive image). If you wish to change the sequence without having to create the details once more, see section \ref{XML_layer}. \end{alert} Once you have cut out a detail\footnote{The colour of the border will be the same in Inkscape and in the animation generated by Xia.}, you can select it with the tool \softmenu{Select and transform object} to resize it, move it\ldots \begin{tip} If you have some difficulties to select the details you have drawn, apply a colour background to them. Choose whatever colour you like, except for black and white (see why in section \ref{white_black_background}). \end{tip} You can access to the \softmenu{Object properties} by right-clicking on the cut-out detail. Thus you also access to the dialog window in which you add the text to be associated with the detail in the interactive image:\\ \begin{center} \includegraphics[width=0.5\textwidth]{./images/object_properties}\\ \end{center} The two fields to be filled in this window are \softmenu{Title} and \softmenu{Description}. The title filled in here will be that of the detail, description will be its comment. Do not forget to click on the \softmenu{Define} button before you close the \softmenu {Object Properties} dialog window. The process described above must also be done with the background image : the title and description indicated here will serve as an introduction to the interactive image (title and comment not related to a particular detail). \subsection{Generating the interactive image with Xia} When all the details are clipped and their metadata indicated, Xia can be launched (see figure \ref{xia_interface}). You must select the svg source file with the top left icon\footnote{When launched as an Inkscape extension, the top left icon has a different look, and can not be selected, since Xia assumes you want to create the html5 animation from the image you are working on in Inkscape.}, choose the export options (see figure \ref{xia_export_options}), and then choose a template and the destination folder of the interactive image. Clicking on one of the template icons generates a series of files and folders. Open the \softmenu{index.html} file in a webbrowser to see the html5 interactive image. \begin{alert} This file will not display anything if used alone. All the other files and directories generated during the export process must be stored in the same folder (see figure \ref{xia_files}) as the \texttt{index.html} file so that the animation works properly. \textbf{It is therefore essential to dedicate a specific directory for each exported image}. \end{alert} \begin{figure}[htp] \tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded corners] \begin{tikzpicture} %\draw[help lines] (0,0) grid (5,5); %icons \node (bBlue) {\includegraphics[width=2cm]{./images/buttonBlue}}; \node[left= .3mm of bBlue, opacity=.5] (aBrown) {\includegraphics[width=2cm]{./images/audioBrown}}; \node[right= .3mm of bBlue, opacity=.5] (guClic) {\includegraphics[width=2cm]{./images/game1clic}}; \node[below= .2mm of bBlue.south] (pBlue) {\includegraphics[width=2cm]{./images/popBlue}}; \node[left= .3mm of pBlue, opacity=.5] (gDDrop) {\includegraphics[width=2cm]{./images/gameDragAndDrop}}; \node[right= .3mm of pBlue] (pYellow) {\includegraphics[width=2cm]{./images/popYellow}}; \node[above = .2mm of guClic.north] (aCloud) {\includegraphics[width=2cm]{./images/accordionCloud}}; \node[above = .2mm of aCloud.north] (aBlack) {\includegraphics[width=2cm]{./images/accordionBlack}}; \node[left = .3mm of aBlack] (params) {\includegraphics[width=2cm]{./images/params}}; \node[left = .3mm of params] (files) {\includegraphics[width=2cm]{./images/xia_open}}; \node[left = 1mm of aCloud, opacity=.3] (xialogo) {\includegraphics[height=2.1cm]{./images/xia}}; %comments \node[box, text width=2.5cm,above left = 5mm of files] (filesC) {Select the svg source file}; \node[box, above = 5mm of params] (paramsC) {Define the options of the export (see figure \ref{xia_export_options})}; \node[box,above right = 5mm of aCloud.north east] (aBlackC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/accordionBlack}{accordionBlack}\\ Large comment zone, suitable for the insertion of multimedia resources; to be used with vertical images (portrait)}; \node[box, right = 5mm of guClic] (aCloudC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/accordionCloud}{accordionCloud}\\ Narrow comment zone, with more space for the image itself ; to be used with horizontal images (landscape)}; \node[box, below right = 5mm of pYellow] (pYellowC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/popYellow}{popYellow}\\ No lateral comment zone ; a first click on the detail reveals it, and a second one simultaneously unveils the comment and triggers the zoom function}; \node[box, left = 25mm of bBlue] (bBlueC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/buttonBlue}{buttonBlue}\\ No lateral comment zone ; comments appear above the image (suitable for long comments) ; the users access the comments through icons placed above the interactive image}; \node[box, below left = 5mm of pBlue] (pBlueC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/popBlue}{popBlue}\\ No lateral comment zone; a first click on the detail reveals it, and a second one pops up the comment (no zoom)}; %arrows \draw[-stealth] (aBlackC.west) -- (aBlack.east); \draw[-stealth] (aCloudC.west) -- (aCloud.south east); \draw[-stealth] (pYellowC.north west) -- (pYellow.south east); \draw[-stealth] (bBlueC.north east) -- (bBlue.north west); \draw[-stealth] (pBlueC.north east) -- (pBlue.south west); \draw[-stealth] (filesC.south east) -- (files.north west); \draw[-stealth] (paramsC.south) -- (params.north); \end{tikzpicture} \caption{Xia's templates} \label{xia_interface} \end{figure} \begin{figure}[htp] \tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded corners] \begin{tikzpicture} %\draw[help lines] (0,0) grid (5,5); %icons \node (exp_qual) {\includegraphics[scale=.5]{./images/exp_qual}}; \node[right= .2mm of exp_qual] (exp_firefox) {\includegraphics[scale=.5]{./images/exp_firefox}}; \node[right= .2mm of exp_firefox] (exp_1file) {\includegraphics[scale=.5]{./images/exp_1file}}; %comments \node[box, text width=2.5cm, left = 5mm of exp_qual] (exp_qualC) {Select the quality of the export on a scale from 1 to 4}; \node[box, above = 5mm of exp_firefox] (exp_firefoxC) {Activate or Deactivate the creation of the FirefoxOS files (default: deactivated)}; \node[box, text width=10cm, below = 5mm of exp_1file] (exp_1fileC) {In the unique file configuration, you will need an internet connection to access the resource. The xia engine used in the unique file configuration is hosted on Versailles academy servers and is automatically updated. In this configuration, you can not control the background image and icons (default: deactivated)}; %arrows \draw[-stealth] (exp_qualC.east) -- (exp_qual.west); \draw[-stealth] (exp_firefoxC.south) -- (exp_firefox.north); \draw[-stealth] (exp_1fileC.north) -- (exp_1file.south); \end{tikzpicture} \caption{Xia's exportation options} \label{xia_export_options} \end{figure} \begin{figure}[htp] \tikzstyle{every node}=[draw=black,thick,anchor=west] \tikzstyle{auto}=[draw=reddebian,fill=reddebian!30, text height=2.5mm] \tikzstyle{manual}=[draw=bluedane,fill=bluedane!30, text height=2.5mm] \tikzstyle{firefoxOS}=[draw=orange,fill=orange!30, text height=2.5mm] \tikzstyle{manualT}=[fill=bluedane!30,draw=bluedane, rectangle,text width=5cm, rounded corners] \tikzstyle{autoT}=[fill=reddebian!30,draw=reddebian, rectangle,text width=5cm, rounded corners] \tikzstyle{firefoxOST}=[fill=orange!30,draw=orange, rectangle,text width=5cm, rounded corners] \begin{tikzpicture}[% grow via three points={one child at (0.5,-0.7) and two children at (0.5,-0.7) and (0.5,-1.4)}, edge from parent path={(\tikzparentnode.south) |- (\tikzchildnode.west)}] \node [manual] {my\_project/} child { node [auto] {index.html}} child { node [firefoxOS] {deploy.html}} child { node [firefoxOS] {manifest.webapp}} child { node [auto] {css/}} child { node [auto] {data/}} child { node [auto] {font/}} child { node [auto] {img/}} child { node [auto] {js/}} child { node [manual] {videos/} child { node [manual] {video.mp4}} child { node [manual] {video.ogv}} child { node [manual] {video.webm}} }; \node[manualT] (textM) at (10,-2) {These files and folders have been manually created by the interactive image designer. The folder \textcolor{bluedane} {videos} was also manually created, in order to host videos inserted in the comments of the interactive image using relative links.}; \node[autoT] (textA) at (10,-8) {Files and folders generated by Xia from the svg source file.}; \node[firefoxOST] (textFOS) at (10,-6) {Files generated with Firefox OS export activated}; \draw[-stealth] (textM.west) -- (4,0); \draw[-stealth] (textM.west) -- (5.5,-7); \draw[-stealth] (textA.west) -- (4,-4); \draw[-stealth] (textFOS.west) -- (5.5,-2); \end{tikzpicture} \caption{Files of an interactive image with FirefoxOS export activated} \label{xia_files} \end{figure} In fact, since Xia is also an Inkscape plugin, you can generate your project directly in Inkscape: just click on \softmenu{Plugins $\rightarrow$ Various $\rightarrow$ Xia Édu}, and choose your template and destination folder. \begin{tip} If you use GNU/Linux or Mac OS X, you can generate your html5 animation using the terminal with the command \texttt{xia-converter}. The parameters are \texttt{-i} to indicate the input file, \texttt{-o} to indicate the exportation folder, and \texttt{-t} to indicate the template.\\ \emph{GNU/Linux}\\ \texttt{\$ xia-converter -i myfile.svg -o export\_folder/ -t accordionBlack}\\ \emph{Mac OS X}\\ \texttt{\$ cd /Applications/xia.app/Contents/Resources/}\\ \texttt{\$ python xia.py -i myfile.svg -o export\_folder/ -t gameDragAndDrop}\\ The template accordionBlack will be chosen if a syntax error is made in the \texttt{-t} parameter. \end{tip} \subsection{Firefox OS export: how does it work?} Once you have generated the interactive image with the Firefox OS option, you have to modify the content of \texttt{deploy.html} and \texttt{manifest.webapp}. \begin{verbatim} {

XIA installation package

} \end{verbatim} \begin{verbatim} { "name": "XIA", "size" : define_package.zip_size_here, "version" : "1.0", "release_notes" : "generated with XIA", "launch_path": "/index.html", "package_path" : "http://my-webserver.com/package.zip", "developer": { "name": "Académie de Versailles" }, "icons": { "16": "/img/xia16.png", "48": "/img/xia48.png", "64": "/img/xia64.png", "128": "/img/xia128.png" } } \end{verbatim} Zip the files and upload them to a web server. The user will access the ressource with the Firefox OS browser through the \texttt{deploy.html} file. Firefox OS will then launch a process in which the animation will download the zip file and install the interactive image as a html5 application. \subsection{Abstract} \begin{enumerate} \item An interactive image is first built in Inkscape (svg format). Xia only converts the svg source file into an html5 animation ; \item The title of the interactive image must be indicated in the \softmenu{Metadata of the document} ; \item The text of the details must be filled in the \softmenu{Object properties}, in the \softmenu{Title} and \softmenu{Description} fields of the cut out details ; \item The general description of the interactive image must be indicated in the \softmenu {Object properties} of the background image. \end{enumerate} \section{Enriched interactive image}\label{enriched_IA} \begin{links} Explore the \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia2}{interactive image} created for this section of the documentation. Download the \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia2/svg/xia2.svg}{svg} source file. \end{links} In this section, the goal is still to create a "traditional" interactive image (ie. in which a detail matches with a comment), but the content of the comments will be enriched with formatted text or multimedia resources. \newpage \subsection{Formatting text} In order to insert formatted text, the tags described in figure \ref{xia_text_tags} should be used. \begin{figure}[htp!] \tikzstyle{descrip}=[font=\sffamily, anchor=north west, text width = 4.3cm] \tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded corners, anchor=north west] \begin{tikzpicture} \node[anchor=north west] (bold) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = -7mm of bold] (boldT) {This text is ***bold***}; \node[box, right = 3.5cm of bold] (bolR) {This text is in \textbf{bold}}; \node[anchor=north west, below = .2cm of bold] (italic) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = -7mm of italic] (italicT) {This text is in **italics**}; \node[box, right = 3.5cm of italic] (italicR) {This text is in \textit{italics}}; \node[anchor=north west, below = .2cm of italic] (texttt) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = -7mm of texttt] (textttT) {This text is in \verb!{{{typewriter}}}!}; \node[box, right = 3.5cm of texttt] (textttR) {This text is in \texttt{typewriter}}; \node[anchor=north west, below = .2cm of texttt] (link) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = 7mm of link.north] (linkT) {A link to \verb![https://www.wikipedia.org/ Wikipedia]!}; \node[box, right = 3.5cm of link] (linkR) {A link to \href{https://www.wikipedia.org/}{Wikipedia}}; \node[anchor=north west, below = .2cm of link] (relativelinks) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = -7mm of relativelinks] (relativelinksT) {A link to a \verb![./foo/bar.pdf local file]!}; \node[box, right = 3.5cm of relativelinks] (relativelinksR) {A link to a \href{./foo/bar.pdf}{local file\footnote{This will not work on your computer!}}}; \node[anchor=north west, below = .8cm of relativelinks] (bullets) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = -7mm of bullets] (bulletsT) {Making a list \\ $\ast$ of bullets \\ $\ast$ out of \\ ~$\ast$ 2 levels\footnote{Insert a \Spacebar (space) before the $\ast$}}; \node[box, right = 3.5cm of bullets.south east] (bulletsR) {Making a list \begin{itemize} \item of bullets \item out of \begin{itemize} \item2 levels \end{itemize} \end{itemize}}; \node[anchor=north west, below = 3cm of bullets] (line) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = 7mm of line.north] (lineT) {Drawing \\ - - - - \\ a line}; \node[box, right = 3.5cm of line] (lineR) {Drawing \\ \hrulefill \\ a line}; \end{tikzpicture} \caption{Tags to format text} \label{xia_text_tags} \end{figure} \begin{alert} Links to local files must be relative links: \verb![./folder/file.pdf local file]! for a pdf file contained inside the export folder, and \verb![../folder/file.pdf local file]! for a pdf file contained in a parent folder. \end{alert} \subsection{Inserting multimedia resources into details}\label{multimedia_enrichment} Inserting multimedia resources into details comments is quite easy: just paste the resource url (relative or absolute link) or iframe tag of the web service you want to use. Xia will automatically create a multimedia player in the comment as long as the resource (image, sound or video) matches its supported formats: \begin{description} \item [Images] jpg, jpeg, png, gif \item [Audio] ogg, mp3 \item [Video] ogv, webm, mp4 \end{description} The link has to be inserted into the \softmenu{Description} field of the \softmenu{Object Properties}. \begin{description} \item[Absolute link] If the resource url is %\begin{center} \verb|http://web.crdp.ac-versailles.fr/02546.ogg| %\end{center} just type it in the \softmenu{Description} field of the \softmenu{Object Properties} in Inkscape \item [Relative link] If the multimedia file is located in the interactive image folder or in a folder (see figure \ref{xia_files}) within this one, just indicate its location, keeping in mind that the interactive image folder has to be considered as the root folder. For example, if the \verb|video.ogv| file is located in a \verb|videos| folder located itself in the interactive image exportation folder, just indicate: %\begin{center} \verb|./videos/video.ogv| %end{center} in order to create the player. The \verb|./| means that the \verb|videos| folder is located in the exportation folder. You can also use the \verb|../| tag to indicate that the resource is located in a parent folder. \end{description} \begin{tip} Since video formats supported by Xia are not natively supported by every web browsers, it is recommanded to export videos into the 3 supported formats, and to upload them into a single folder (from there, the only difference between these files is their extension, ie. .ogv or .mp4 or .webm). Even if a particular format is indicated in the description (following the previous example : \verb|videos/video.ogv|), if the browser is unable to read the resource, it will automatically attempt to read the files of the same name possessing a different extension (ie. \verb|video.mp4| then \verb|video.webm|). \end{tip} The last option is to insert an iframe tag. It will be interpreted and the reader will appear in the comment, giving access to the resource. \subsection{The "audioBrown" template: sounds instead of text}\label{audioBrownsection} \begin{links} Explore the \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia4}{interactive image} created for this section of the documentation. Download the \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia4/svg/xia4.zip}{svg} source file (zip file containing the svg source file and the sounds). \end{links} The "audioBrown" template is specifically dedicated to the creation of interactive images in which details are associated with sounds instead of text. The method to insert sounds using absolute or relative links is described in section \ref{multimedia_enrichment}. If you wish the sound to play automatically as the user clicks on the comment, just add \verb|autostart| right after the url \footnote{The "\texttt{autostart}" tag also works with the other Xia templates.}:\\ \begin{center} \verb|sounds/detail_1_sound.ogg autostart| \end{center} \subsection{Inserting images into your interactive image}\label{insertion_images} Png images can be added to the background. To do so, select \softmenu{File $\rightarrow$ Import} in Inkscape to incorporate your new image. The imported image will only appear in the html5 animation if you have applied white background in Inkscape. Choose white in the horizontal colour palette at the bottom of Inkscape interface:\\ \begin{center} \includegraphics[width=0.6\textwidth]{images/white_fill}\\ \end{center} By indicating a url in the \softmenu{Title} of \softmenu{Object properties} field, the embedded image becomes a clickable icon linking to a web page. \subsection{Displaying a question and unveiling an answer} You can create clickable icon which will momentarily prevent the user to read the end of the comment. You can even ask the user to enter a password to read the end of the comment. To do so, just indicate, in the description, the tags described in figure \ref{xia_answer_tags}. \begin{figure}[htp!] \tikzstyle{descrip}=[font=\sffamily, anchor=north west, text width = 4.3cm] \tikzstyle{box}=[draw, text width=6cm, fill=lightgray!50, rounded corners, anchor=north west] \begin{tikzpicture} \node[anchor=north west] (answer) {\includegraphics[scale=.5]{./images/Description}}; \node[descrip, below = -7mm of answer] (answerT) {[[Can I ask you a question? (code=12345): Yes, indeed I can.]]}; \node[box, right = 3.5cm of answer] (answerI) {\includegraphics[scale=.5]{./images/answer_code}}; \end{tikzpicture} \caption{Tags to insert a button which will momentarily prevent the user to read the end of the comment} \label{xia_answer_tags} \end{figure} Use the double brackets tag \texttt{[[ (...) ]]} to indicate you wish to create the icon, split the text between the question and the answer with the \texttt{:} tag, and add a code by inserting \texttt{(code=insert\_password)} just before the \texttt{:} tag\footnote{The \texttt{(code={...})} is not mandatory. Remember that you can not insert the \texttt{)} character in the password.}. \subsection{Controlling details behavior : automatic display and disabled zoom}\label{white_black_background} Default behavior of details in an interactive image consists in: \begin{itemize} \item highlighting details only on mouse over or with a click on the comment detail title \item zoom in effect when clicking again on the active detail\footnote{Except for the popBlue template.} \end{itemize} Both of these default behaviors can be modified if you apply a white or black background to cropped details (see section \ref{insertion_images}): \begin{description} \item [Detail with a white background] In the generated image, details will be immediately visible as a flat area of opaque color, hiding the background image; once selected, it reveals the background (the zoom effect is still active). \item [Detail with a black background] Users still have to click on the detail to unveil it, but the zoom effect is disabled. \end{description} Logical consequence : you can not apply a white and a black background all together on the same detail. A single detail can not be immediately displayed and have the zoom effect disabled. \subsection{Controlling order of details display in the lateral comment zone}\label{XML_layer} By default, in the interactive image, the details appear vertically following the order in which these details have been created (the first detail created in Inkscape corresponding to the detail placed up in the sidebar of the interactive image). We will work with the \softmenu{Edit $\rightarrow$ XML Editor} to change this default order. A priori complex to manage, this dialogue window is in fact quite easy to use : by selecting the input in the XML editor, the corresponding detail will be highlighted on the image and the only thing left to do is to drag the files to the desired location:\\ \begin{center} \includegraphics[width=\textwidth]{images/layerorder}\\ \end{center} The Inkscape XML editor allows to control the display order of the details in the interactive image. Note the highlighting of an element in the editor and on the background image by a single mouse click. \subsection{Abstract} \begin{enumerate} \item You can enrich and shaping text using tags \item A multimedia enrichment is possible through a simple link (relative or absolute) to a file whose format is recognized by Xia \item Adding images to the background image is possible by importing them and applying them a white background \item It is possible to modify the default behavior of a detail by changing its color background (white, black) \item The order of the details in the interactive image depends on the order of their creation in Inkscape. Nevertheless, the Inkscape XML editor allows to change this order \item It is possible prevent the user to access the comments by inserting a clickable icon and / or a password \end{enumerate} \newpage \section{Creating games with Xia}\label{games_IA} Until now, this document was only about creation of traditionnal "interactive images": background image enriched with cropped details associated with texts. This kind of interactive image can be used in class in various situations (students progressively discovering a document, or creating an interactive image on their own), but Xia introduces new features, such as the creation of games and activities, in which the final user has much more to do than simply clicking on details in order to read the comment. \begin{figure}[htp] \tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded corners] \begin{tikzpicture} %\draw[help lines] (0,0) grid (5,5); %icons \node[opacity=.5] (bBlue) {\includegraphics[width=2cm]{./images/buttonBlue}}; \node[left= .3mm of bBlue] (aBrown) {\includegraphics[width=2cm]{./images/audioBrown}}; \node[right= .3mm of bBlue] (guClic) {\includegraphics[width=2cm]{./images/game1clic}}; \node[below= .2mm of bBlue.south, opacity=.5] (pBlue) {\includegraphics[width=2cm]{./images/popBlue}}; \node[left= .3mm of pBlue] (gDDrop) {\includegraphics[width=2cm]{./images/gameDragAndDrop}}; \node[right= .3mm of pBlue, opacity=.5] (pYellow) {\includegraphics[width=2cm]{./images/popYellow}}; \node[above = .2mm of guClic.north, opacity=.5] (aCloud) {\includegraphics[width=2cm]{./images/accordionCloud}}; \node[above = .2mm of aCloud.north, opacity=.5] (aBlack) {\includegraphics[width=2cm]{./images/accordionBlack}}; \node[left = .3mm of aBlack] (params) {\includegraphics[width=2cm]{./images/params}}; \node[left = .3mm of params] (files) {\includegraphics[width=2cm]{./images/xia_open}}; \node[left = 2mm of aCloud, opacity=.3] (xialogo) {\includegraphics[height=2cm]{./images/xia}}; %comments \node[box, text width=2.5cm,above left = 5mm of files] (filesC) {Select the svg source file}; \node[box, above = 5mm of params] (paramsC) {Define the options of the export (see figure \ref{xia_export_options})}; \node[box, right = 5mm of guClic] (guClicC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia3}{game1clic}\\ selecting details on a background image \\ How-to in section \ref{game1clicsection}}; \node[box, left = 25mm of bBlue] (aBrownC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia4}{audioBrown} \\ creation of interactive images in which details are associated with sounds \\ How-to in section \ref{audioBrownsection}}; \node[box, below left = 5mm of pBlue] (gDDropC) {\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia5}{gameDragAndDrop}\\ drag and drop graphical elements on the background images \\ How-to in section \ref{gameDragAndDropsection}}; %arrows \draw[-stealth] (guClicC.west) -- (guClic.east); \draw[-stealth] (gDDropC.north) -- (gDDrop.south west); \draw[-stealth] (aBrownC.east) -- (aBrown.west); \draw[-stealth] (filesC.south east) -- (files.north west); \draw[-stealth] (paramsC.south) -- (params.north); \end{tikzpicture} \caption{Xia's games and multimedia templates} \label{xia_interface2} \end{figure} \subsection{First game principle: selecting, finding elements in the image}\label{game1clicsection} % \begin{wrapfigure}{r}{45mm} % \centering % \includegraphics[scale=0.7]{./images/game1clic} % \end{wrapfigure} \textit{The game principle described in this section consists in selecting details on a background image. When the user has reached the goal described in the instructions, a message appears in a final pop up.} \begin{links} Explore the \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia3}{interactive image} created for this section of the documentation. Download the \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia3/svg/xia3.svg}{svg} source file. \end{links} This kind of game is almost the easiest way to create an interactive image. You only have to crop the details that the final user will have to select. The instructions must be completed in the metadata of the document. Xia will look into the informations filled in the \softmenu{Description} field of the metadata of the document (see section \ref{preparation_svg}: \softmenu{File $\rightarrow$ Metadata of the document}), and create an instruction «~pop up~» that will show up at the opening of the game. The player will just have to read the instructions and close the pop up to play the game. When the user completes the game, a message automatically appears. This message has to be filled in the \softmenu{Description} field of the \softmenu{Object Properties} of the background image. Two informations are needed in order for this message to pop up : the exact number of details that have to be selected\footnote{This number does not have to match the number of details on the image.} and the message itself (see table \ref{tag1_sumup}). \begin{table} \begin{tabular}{|l|p{2in}|p{2in}|} \hline Goal & Enter the number of correct answers needed to complete the game & Display a message\\ \hline Tag & \texttt{}| & \texttt{}\\ \hline Example & \multicolumn{2}{|l|}{\texttt{6}}\\ & \multicolumn{2}{|l|}{\texttt{Congratulations!}}\\ & \multicolumn{2}{|l|}{\texttt{You have completed the game!}}\\ \hline \end{tabular} \caption{Sum up of tags in a game1clic game} \label{tag1_sumup} \end{table} \begin{tip} Text inserted inside the \verb|| tag can be enriched. Images, videos or sounds can be inserted. It is also possible to insert a link, allowing users to play another game, in order to "chain" activities up by degree of difficulty. \end{tip} Once your svg source file is created, choose the template \softmenu{game1clic} to generate the interactive game. \subsection{Second game principle: classyfying, ordering, ranking}\label{gameDragAndDropsection} % \begin{wrapfigure}{r}{45mm} % \centering % \includegraphics[scale=0.7]{./images/gameDragAndDrop} % \end{wrapfigure} \textit{The second kind of game that can be created with Xia consists in dragging and dropping graphical elements on the background image. If all the elements have been dropped on their corresponding drop zone, a pop up message appears, confirming the achievement of the game.} \begin{links} Explore the \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia5}{interactive image} created for this section of the documentation. Download the \href {http://xia.dane.ac-versailles.fr/demo/tuto/xia5/svg/xia5.svg}{svg} source file. \end{links} This is how you can create a game based on the drag and drop principle : \begin{enumerate} \item In Inkscape: \begin{itemize} \item Choose and import a background picture \item Create the graphical elements the users of the interactive image will have to drag and drop (ie. images or group of words: see below for a how-to) \item Create the instruction pop up in \softmenu{File $\rightarrow$ Metadata of the document $\rightarrow$ Description}\footnote{Exactly as in the game1clic template.} \item Using metadata, make each label match its drop zone (actually being cropped details) \end{itemize} \item In Xia \begin{itemize} \item Export the svg source file using the \softmenu{gameDragAndDrop} template \end{itemize} \end{enumerate} Two methods can be used to create the drag and drop "graphical-elements". A very simple way is to use a screenshot tool, in order to create png files, and then import them in Inkscape. It is also possible to create these elements directly in Inkscape, by creating a text, grouping it with a shape, and finally making a bitmap copy of this group (\softmenu{Edition $\rightarrow$ Make a bitmap copy}) The graphical elements then have to be associated with their drop zone \footnote{\textbf{One} object can only match \textbf{one} drop zone.}. In order to do that, make the \softmenu{ID} field of the drop zone match the \softmenu{Description} field of the drag and drop graphical element. The only subtlety consists in the \verb|| tags which have to be filled in the \softmenu {Description} field. You will find in the table \ref{tag2_sumup} an abstract of the metadata to be filled in the \softmenu{Object Properties} of the drag and drop graphical elements and the corresponding details in order to make them match. \begin{table} \begin{tabular}{|p{1.in}|p{2.5in}|p{1.5in}|} \hline & Graphical element (drag and drop objects in the game) & Cropped detail (drop zone)\\ \hline ID Field & & \verb|Detail_Title|\\ \hline Description Field & \verb|Detail_Title| & \\ \hline \end{tabular} \caption{Sum up of tags in the gameDragAndDrop template} \label{tag2_sumup} \end{table} Once your svg source file is created, choose the template \softmenu{gameDragAndDrop} to generate the interactive game. \subsection{Third game principle: collisions} \textit{The game principle described in this section consists in moving objects within bounds you defined. Typically, the "collisions" game principle can be used to create mazes or gem puzzle.} \begin{links} Explore the \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia6/}{interactive image} created for this section of the documentation. Download the \href {http://xia.dane.ac-versailles.fr/demo/tuto/xia6/svg/xia6.svg}{svg} source file. \end{links} In order to create this kind of game, add the tag \verb|on| to the background image. All the details will then become solid and will prevent objects (png imported files or bitmap copies of shapes created in Inkscape) from being moved through them. The "collision" game is in fact a gameDragAndDrop game, since the goal remains to drag one or several objects and drop them somewhere on the image. The requisite tags for this template are therefore the same as in the gameDragAndDrop template \footnote{\texttt{} on the objects, \texttt{} and \texttt{} on the background image: see section \ref{gameDragAndDropsection}.}, but you will apply the \verb|off| tag to the drop zone's \softmenu{Description} field. Once your svg source file is created, choose the template \softmenu{gameDragAndDrop} to generate the interactive game. \subsection{\emph{Advanced interactive games creation tips}: Magnet effect, tooltips, double-scoring\ldots} \subsubsection{Showing the player's score (game1clic template)}\label{playersscore} It is possible to display graphical elements automatically when the user selects the correct answer. These elements can be png imported images or shapes directly designed in Inkscape. But as Xia considers as a clickable detail any shapes designed using Inkscape tools, you will have to transform these shapes in bitmap, using the "bitmap copy" Inkscape tool. For example : \begin{enumerate} \item Draw a star with yellow sides on a yellow background with the Inkscape tools \item Select this star, and click on the \softmenu{Edition $\rightarrow$ Make a bitmap copy} \item Delete the first star \end{enumerate} When the graphical elements are imported (png files) or created (bitmap copy of shapes created manually), just apply the following carasteristics to these elements: \begin{center} \softmenu{Interactivity > OnClick} = \verb|off| \end{center} Then, group the clickable detail to its graphical element (by successively clicking on the detail and the graphical element with the \Shift keystroke on), then select \softmenu{Group} in the Inkscape \softmenu{Object} menu. \subsubsection{Showing the player's mistakes (game1clic template)} Games based on the details selection principle are obviously very interesting educational games\ldots but it is also quite obvious to guess how some students may be tempted to cheat to achieve such games (for example, by frenetically clicking everywhere on the image, until the final message pops up). This is why it may be interesting to be able to highlight the user's mistakes during the game. To do so, you will anticipate the user's probable mistakes, and put explicit graphical elements symbolizing these errors on the background image. This graphical element may be an imported image (png file) or a shape directly designed with the Inkscape tools, then converted into bitmap (see section \ref{playersscore}).. These elements will have to include the following caracteristics: \begin{center} \softmenu{Interactivity > OnClick} = \verb|disable-score| \end{center} When applied with a \verb|disable-score| tag, a detail still remains clickable, but does not add a score to the counter that delivers the final success message pop up. \subsubsection{How to add a "magnet" effect (gameDragAndDrop template)} If you indicate \verb|on| in the \softmenu{Description} field of the drop zone, a magnet effect will then be active when the player drops the graphical element onto its matching drop zone. \subsubsection{Links on drop zones (gameDragAndDrop template)} You can insert links in the \softmenu{Title} field of the \softmenu{Object Properties} of the drop zones. The user can then open the link by clicking on it or by dropping its corresponding detail on it. \subsubsection{Tooltips (game1clic and gameDragAndDrop templates)} \begin{links} Explore the \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia7}{interactive image} created for this section of the documentation. Download the \href{http://xia.dane.ac-versailles.fr/demo/tuto/xia7/svg/xia7.svg}{svg} source file. \end{links} It is possible to display tooltips of details on mouse-over. To do so, create the tooltip with a png imported file or a bitmap copy (see section \ref{playersscore}) of a text created in Inkscape\footnote{Or a bitmap copy of a shape grouped with some text\ldots}, and apply to this tooltip a specific \softmenu{ID} in its \softmenu{Object Properties}. Then, just apply the tag \verb|specific_ID_of_the_tooltip| in the \softmenu{Description} field of the \softmenu{Object Properties} of the detail that is supposed to make the tooltip appear (for example, in the image below: on mouse-over, the yellow square makes the tooltip ``Test'' appear):\\ \begin{center} \includegraphics[width=0.5\textwidth]{images/tooltip_example}\\ \end{center} Note that the tooltip tool is available in the game1clic and in the gameDragAndDrop templates.\\ \subsubsection{Double scoring (game1clic and gameDragAndDrop templates)} If you indicate \verb|score2| in the \softmenu{onclick} field (\softmenu{Object Properties $\rightarrow$ Interactivity}) of the detail, and if you use \texttt{} and \texttt{} in the \softmenu{Object Properties} of the background image, you create a double scoring game. In this kind of game, the user can select two different categories of details, two messages can pop up at the end, depending on the category and number of details the user has selected. For example, you can create a game with 3 details tagged with \texttt{score2} (corresponding to mistakes), and indicate in the \softmenu{Object Properties} of the background image:\\ \texttt{4\\ Hurray!\\ 3\\ Three mistakes... that is a bit too much... Concentrate more and do it again}\\ \newpage \subsection{Abstract} These tables sum up the tags that have to be indicated when a game is created: \begin{table}[thp] \begin{tabular}{|p{.5cm}|p{2cm}|p{10cm}|} \hline \multicolumn{3}{|l|}{\softmenu{game1clic} template} \\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Role} & Sets the amount of correct answers needed to pop up the end message of the game\\ & \emph{Element} & Background picture \\ & \emph{Where ?} & \softmenu{Object properties $\rightarrow$ Description} \\ & \emph{What ?} & A number corresponding to the required score\\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Role} & Pops up the end message of the game \\ & \emph{Element} & Background picture \\ & \emph{Where ?} & \softmenu{Object properties $\rightarrow$ Description}\\ & \emph{What ?} & A personalized message if necessary enriched with multimedia or html links\\ \hline \multicolumn{3}{|l|}{\texttt{off}}\\ \hline & \emph{Role} & Makes a cropped detail unclickable \\ & \emph{Element} & Detail \\ & \emph{Where ?} & \softmenu{Object properties $\rightarrow$ Interactivity $\rightarrow$ Onclick}\\ \hline \multicolumn{3}{|l|}{\texttt{disable-score}}\\ \hline & \emph{Role} & Makes a cropped detail clickable, but when clicked, does not add a point to the score game counter \\ & \emph{Element} & Detail \\ & \emph{Where ?} & \softmenu{Object properties $\rightarrow$ Interactivity $\rightarrow$ Onclick}\\ \hline \multicolumn{3}{|l|}{\texttt{score2}}\\ \hline & \emph{Role} & Makes a detail add a score to the score2 counter \\ & \emph{Element} & Detail \\ & \emph{Where ?} & \softmenu{Object properties $\rightarrow$ Interactivity $\rightarrow$ Onclick}\\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Role} & Displays a tooltip when moused-over \\ & \emph{Element} & Detail \\ & \emph{What ?} & Make sure to match the ID of the element used as tooltip\\ & \emph{Where ?} & \softmenu{Object properties $\rightarrow$ Description}\\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Role} & Sets the amount of correct answers needed to pop up the second end message in a double scoring game\\ & \emph{Element} & Background picture \\ & \emph{Where ?} & \softmenu{Object properties $\rightarrow$ Description} \\ & \emph{What ?} & A number corresponding to the required score\\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Role} & Pops up the second end message in a double scoring game \\ & \emph{Element} & Background picture \\ & \emph{Where ?} & \softmenu{Object properties $\rightarrow$ Description}\\ & \emph{What ?} & A personalized message if necessary enriched with multimedia or html links\\ \hline \end{tabular} \caption{Complete game1clic tags} \end{table} \begin{table}[thp] \begin{tabular}{|p{.5cm}|p{2cm}|p{10cm}|} \hline \multicolumn{3}{|l|}{\softmenu{gameDragAndDrop} template} \\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Role} & Sets the amount of correct answers needed to pop up the end message of the game\\ & \emph{Element} & Background picture \\ & \emph{Where ?} & \softmenu{Object properties $\rightarrow$ Description} \\ & \emph{What ?} & A number corresponding to the required score\\ \hline \multicolumn{3}{|l|}{\texttt{} }\\ \hline & \emph{Role} & Pops up the end message of the game \\ & \emph{Element} & Background picture \\ & \emph{Where ?} & \softmenu{Object properties $\rightarrow$ Description}\\ & \emph{What ?} & A personalized message if necessary enriched with multimedia or html links\\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Role} & Indicates the corresponding drag and drop element and drop zone \\ & \emph{Element} & Graphical element to move \\ & \emph{Where ?} & \softmenu{Object Properties $\rightarrow$ Description}\\ & \emph{What ?} & Make sure to match the ID field of the drop zone\\ \hline \multicolumn{3}{|l|}{\texttt{on}}\\ \hline & \emph{Role} & Adds a "magnet" effect \\ & \emph{Element} & Drop zone \\ & \emph{Where ?} & \softmenu{Object Properties $\rightarrow$ Description} \\ \hline \multicolumn{3}{|l|}{\texttt{on}}\\ \hline & \emph{Role} & Activates the "collisions" game principle \\ & \emph{Element} & Background picture \\ & \emph{Where ?} & \softmenu{Object Properties $\rightarrow$ Description} \\ \hline \multicolumn{3}{|l|}{\texttt{off}}\\ \hline & \emph{Role} & Creates a drop zone in a "collisions" game\\ & \emph{Element} & Drop zone\\ & \emph{Where ?} & \softmenu{Object Properties $\rightarrow$ Description} \\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Role} & Displays a tooltip when moused-over \\ & \emph{Element} & Drop zone, Graphical element to move \\ & \emph{What ?} & Make sure to match the ID of the element used as tooltip\\ & \emph{Where ?} & \softmenu{Object properties $\rightarrow$ Description}\\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Role} & Sets the amount of correct answers needed to pop up the second end message in a double scoring game\\ & \emph{Element} & Background picture \\ & \emph{Where ?} & \softmenu{Object properties $\rightarrow$ Description} \\ & \emph{What ?} & A number corresponding to the required score\\ \hline \multicolumn{3}{|l|}{\texttt{}}\\ \hline & \emph{Role} & Pops up the second end message in a double scoring game \\ & \emph{Element} & Background picture \\ & \emph{Where ?} & \softmenu{Object properties $\rightarrow$ Description}\\ & \emph{What ?} & A personalized message if necessary enriched with multimedia or html links\\ \hline \end{tabular} \caption{Complete gameDragAndDrop tags} \end{table} \section{Frequently asked questions and Inkscape tips} \subsection{FAQ} \textbf{I can not see the Xia extension in Inkscape. Why is that?}\\ $\rightarrow$ Have you installed Inkscape first? If not, you have to re-install Xia. If you use the portable version, Xia does not appear in the extension menu. \textbf{The "source file" icon does not appear when I launch Xia from the extension menu of Inkscape. Why?}\\ $\rightarrow$ When you launch Xia as an Inkscape extension, there is no "Source File" button, since Xia assumes you want to create the html5 animation from the image you are working on in Inkscape. Just choose the exportation options and the template. \textbf{I have installed Xia but I can not find it. How can I launch it?}\\ $\rightarrow$ Xia can be found in the "Applications" of Mac OS X. On a GNU/Linux system, the Xia package is called "xia-converter". In Windows, Xia is only an Inkscape extension. If you wish to launch Xia outside of Inkscape, use the portable version. \textbf{I have added some text on my image with the Inkscape text tool ("Create and Edit text objects"), but it does not appear on my interactive image. Why?}\\ $\rightarrow$ Unless you make a bitmap copy of the text, Xia will consider the text created with the "Create and Edit text Objects" as a detail, and not an image. \subsection{Inkscape tips} \begin{itemize} \item Don't hesitate to fill your details with different colors. The details will be easier to select and modify, and it will not have any consequences on the html5 animation (unless you choose black or white as filling colors) \item If you want to create one detail out of several, you can "Group" them (\softmenu{Object} $\rightarrow$ \softmenu{Group}, or \Ctrl + \keystroke{G}) or "unify" them (\softmenu{Path} $\rightarrow$ \softmenu{Union}, or \Ctrl + \keystroke{+}). \item Once a detail is created, it is always possible to modify it: you can add or remove nodes, move them, etc. Just double-click on the detail, and use the modifying tools:\\ \begin{center} \includegraphics[width=0.8\textwidth]{./images/modifynodes}\\ \end{center} \item Some keyboard shortcuts are real time savers! \begin{enumerate} \item \fbox{\Shift + \Ctrl + \keystroke{a}} to access the \softmenu{Alignment and Distribution} tools \item \fbox{\Shift + \Ctrl + \keystroke{o}} to access the \softmenu{Object Properties} \item \fbox{\Alt + \keystroke{b}} to create a bitmap copy of a shape designed in Inkscape \item \fbox{\Ctrl + \keystroke{g}} to group different objects or details and \fbox{\Ctrl + \Shift + \keystroke{g}} to ungroup them \end{enumerate} \end{itemize} \listoffigures \listoftables \end{document} images-actives-html5.git/doc/fr/000077500000000000000000000000001250410645000167415ustar00rootroot00000000000000images-actives-html5.git/doc/fr/documentation-fr_FR.po000066400000000000000000003770531250410645000231650ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # geoffrey , 2014, 2015. # Geoffrey , 2015. # msgid "" msgstr "" "Project-Id-Version: fr_FR\n" "POT-Creation-Date: 2015-03-22 14:47+0100\n" "PO-Revision-Date: 2015-03-22 14:49+0100\n" "Last-Translator: Geoffrey \n" "Language-Team: fr <>\n" "Language: \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Gtranslator 2.91.6\n" #. type: title{#1} #: documentation.tex:7 msgid "Xia" msgstr "Xia" #. type: title{#1} #: documentation.tex:7 msgid "Create HTML5 interactive images" msgstr "Créer des images interactives au format HTML5" #. type: selectlanguage{#1} #: documentation.tex:12 msgid "english" msgstr "french" #. type: renewcommand{#2} #: documentation.tex:16 msgid "Figure" msgstr "Illustration" #. type: renewcommand{#2} #: documentation.tex:16 msgid "Table" msgstr "Tableau" #. type: renewcommand{#2} #: documentation.tex:16 msgid "List of figures" msgstr "Liste des illustrations" #. type: section{#2} #: documentation.tex:19 msgid "Introducing Xia" msgstr "Présentation de Xia" #. type: subsection{#2} #: documentation.tex:21 msgid "What is Xia ?" msgstr "Qu'est-ce que Xia?" #. type: document #: documentation.tex:27 msgid "" "Xia is a free software developped by teachers from the french academy of " "Versailles. It is released under \\href{http://www.gnu.org/copyleft/gpl." "html}{GPLv3} license. Xia converter takes a svg file as input and outputs " "an interactive image in html5. Xia allows to generate animations and " "interactive activities : drag and drop games, discrimination, selection, etc." msgstr "" "Xia est un logiciel libre développé par des enseignants de l'académie de " "Versailles. Il est distribué sous la licence \\href{http://www.gnu.org/" "copyleft/gpl.html}{GPLv3}. Le logiciel xia-converter a pour fonction de " "transformer un fichier svg en une animation interactive html5. Xia permet de " "générer des jeux et activités interactives: jeux de glisser-déposer, " "sélection, discrimination, etc." #. type: document #: documentation.tex:31 msgid "" "First sections of this documentation (see section \\ref{basic_imageactive}) " "are dedicated to make a very simple interactive image: cropped details with " "comments only made of plain text. Then, you will learn how to create an " "enriched interactive image (see section \\ref{enriched_IA}). Final sections " "(section \\ref{games_IA}) will teach you to create games." msgstr "" "Les premières parties de cette documentation (voir la partie " "\\ref{basic_imageactive}) sont consacrées à la réalisation d'une image " "interactive simple: détails détourés et commentaires en texte sans mise en " "forme. Par la suite, vous apprendrez à créer des images interactives " "enrichies (voir la partie \\ref{enriched_IA}). Dans les dernières parties " "(partie \\ref{games_IA}), vous découvrirez comment créer des jeux." #. type: tip #: documentation.tex:38 msgid "" "All examples are on line (links and downloads available at the beginning of " "each section). At the end of each section, a heading \"Abstract\" presents " "the essential guide lines to remember when creating an interactive image." msgstr "" "Tous les exemples utilisés sont visibles en ligne (les liens pour visualiser " "les animations et télécharger les fichiers sources sont indiqués en début de " "chaque section). À la fin de chaque partie, une rubrique «~En résumé~» " "rappelle les points essentiels à retenir pour créer une image interactive." #. type: subsection{#2} #: documentation.tex:40 msgid "General process" msgstr "Processus général" #. type: document #: documentation.tex:47 msgid "" "Xia is only needed at the end of the process. As we can see on figure " "\\ref{workflowxia}, most of the work is done with a vector graphics editor. " "We recommend using the free open-source and muliplatform software " "\\href{http://www.inkscape.org/}{Inkscape}, which is really easy to use " "(Inkscape will be used in this document)\\footnote{It is also possible to " "use LibreOffice Draw.}." msgstr "" "Xia n'est nécessaire qu'à la fin du processus. Comme on peut le voir sur " "l'illustration \\ref{workflowxia}, la plus grande partie du travail est " "réalisée avec un logiciel de dessin vectoriel. Nous recommandons " "l'utilisation du logiciel libre et multi-plateforme \\href{http://www." "inkscape.org/}{Inkscape}, très simple à utiliser (c'est ce logiciel qui sera " "utilisé dans ce tutoriel)\\footnote{Il est cependant également possible " "d'utiliser LibreOffice Draw.}." #. type: figure #: documentation.tex:75 msgid "" "\\tikzstyle{box} = [draw, text width=.6\\textwidth, align=center] " "\\tikzstyle{ia} = [draw, text width=.8\\textwidth, fill=reddebian!80, " "rounded corners, inner ysep=2mm] \\tikzstyle{xia} = [draw, text " "width=.8\\textwidth, fill=bluedane!80, rounded corners, inner ysep=2mm]" msgstr "" "\\tikzstyle{box} = [draw, text width=.6\\textwidth, align=center] " "\\tikzstyle{ia} = [draw, text width=.8\\textwidth, fill=reddebian!80, " "rounded corners, inner ysep=2mm] \\tikzstyle{xia} = [draw, text " "width=.8\\textwidth, fill=bluedane!80, rounded corners, inner ysep=2mm]" #. type: tikzpicture #: documentation.tex:75 msgid "" "\\node[box] (open) {Open an Image in Inkscape}; \\node[box,below of=open] " "(create) {Create details in image}; \\node[box,below of=create] (meta) {For " "each detail, edit metadata}; \\node[box,below of=meta] (save) {Save " "project}; \\node[left of=create,xshift=-.37\\textwidth, rotate=90] (scape) " "{\\textbf{Inkscape}};" msgstr "" "\\node[box] (open) {Ouvrir l'image dans Inkscape}; \\node[box,below of=open] " "(create) {Créer les détails}; \\node[box,below of=create] (meta) {Pour " "chaque détail, compléter les métadonnées}; \\node[box,below of=meta] (save) " "{Sauvegarder le projet}; \\node[left of=create,xshift=-.37\\textwidth, " "rotate=90] (scape) {\\textbf{Inkscape}};" #. type: scope #: documentation.tex:75 msgid "\\node[fit = (open)(meta)(save)(scape), ia] (ink) {};" msgstr "\\node[fit = (open)(meta)(save)(scape), ia] (ink) {};" #. type: tikzpicture #: documentation.tex:75 msgid "" "\\node[box,below=1cm of save] (createia) {Create an interactive image in " "html5}; \\node[left of=createia,xshift=-.37\\textwidth, rotate=90] (xia) " "{\\textbf{Xia}};" msgstr "" "\\node[box,below=1cm of save] (createia) {Créer une image interactive en " "html5}; \\node[left of=createia,xshift=-.37\\textwidth, rotate=90] (xia) " "{\\textbf{Xia}};" #. type: scope #: documentation.tex:75 msgid "\\node[fit = (createia)(xia), xia] (ink) {};" msgstr "\\node[fit = (createia)(xia), xia] (ink) {};" #. type: tikzpicture #: documentation.tex:75 msgid "" "\\draw[-stealth] (open) -- (create); \\draw[-stealth] (create) -- (meta); " "\\draw[-stealth] (meta) -- (save); \\draw[-stealth] (save) -- (createia);" msgstr "" "\\draw[-stealth] (open) -- (create); \\draw[-stealth] (create) -- (meta); " "\\draw[-stealth] (meta) -- (save); \\draw[-stealth] (save) -- (createia);" #. type: caption{#2} #: documentation.tex:75 msgid "Creation process of an interactive image with Xia" msgstr "Processus de création d'une image interactive avec Xia" #. type: tip #: documentation.tex:81 msgid "" "If you have \"image active\" project files (with a .xia extension), you can " "change their extension to .zip, unzip them, get the svg file located in the " "unzipped folder, and open it with Inkscape. If you are using GNU/Linux, just " "explore the .xia file and extract the svg file." msgstr "" "Si vous possédez des projets créés avec le logiciel ImagesActives (fichiers " "possédant une extension .xia), vous pouvez changer l'extension de ces " "fichiers en .zip, les dézipper, récupérer le fichier svg se trouvant dans le " "répertoire ainsi obtenu et ouvrir celui-ci avec Inkscape. Si vous utilisez " "GNU/Linux, explorez le .xia et récupérez le fichier svg." #. type: subsection{#2} #: documentation.tex:84 msgid "Installing Inkscape and Xia" msgstr "Installer Inkscape et Xia" #. type: document #: documentation.tex:88 msgid "" "Having Inkscape and Xia installed on your computer is the only thing you " "need to read this documentation. You will find any relevant information " "about the installation of Inkscape on its website" msgstr "" "L'installation d'Inkscape et de Xia sont les seuls prérequis pour la " "poursuite de la lecture de cette documentation. Vous trouverez les " "informations nécessaires à l'installation d'Inkscape sur le site web du " "projet" #. type: footnote{#2} #: documentation.tex:88 msgid "\\href{http://www.inkscape.org/}{http://www.inkscape.org/}." msgstr "\\href{http://www.inkscape.org/}{http://www.inkscape.org/}." #. type: alert #: documentation.tex:94 msgid "" "Make sure to install Xia after Inkscape. Otherwise you will not be able to " "access Xia directly in Inkscape.\\\\ If you work on a Windows system, use " "the portable version to access Xia outside of Inkscape." msgstr "" "Installez impérativement Inkscape en premier, puis Xia, sous peine de ne pas " "être en mesure d'accéder à Xia directement dans Inkscape.\\\\ Si vous " "travaillez sous Windows, utilisez la version portable de Xia pour accéder au " "logiciel en dehors d'Inkscape." #. type: item[#1] #: documentation.tex:107 msgid "GNU/Linux" msgstr "GNU/Linux" #. type: description #: documentation.tex:107 msgid "" "In a terminal:\\\\ \\texttt{\\$ sudo echo \"deb http://repository.crdp.ac-" "versailles.fr/debian xia main\" | sudo tee /etc/apt/sources.list.d/xia." "list}\\\\ \\texttt{\\$ wget -q http://repository.crdp.ac-versailles.fr/crdp." "gpg -O - | sudo apt-key add -}\\\\ \\texttt{\\$ sudo apt-get update \\&\\& " "sudo apt-get install xia}" msgstr "" "Dans un terminal:\\\\ \\texttt{\\$ sudo echo \"deb http://repository.crdp.ac-" "versailles.fr/debian xia main\" | sudo tee /etc/apt/sources.list.d/xia." "list}\\\\ \\texttt{\\$ wget -q http://repository.crdp.ac-versailles.fr/crdp." "gpg -O - | sudo apt-key add -}\\\\ \\texttt{\\$ sudo apt-get update \\&\\& " "sudo apt-get install xia}" #. type: description #: documentation.tex:107 msgid "" "[Mac OS X] Download and install the package:\\\\ \\href{http://xia.dane.ac-" "versailles.fr/download/xia.pkg}{http://xia.dane.ac-versailles.fr/download/" "xia.pkg}" msgstr "" "[Mac OS X] Téléchargez et installez le paquet:\\\\ \\href{http://xia.dane.ac-" "versailles.fr/download/xia.pkg}{http://xia.dane.ac-versailles.fr/download/" "xia.pkg}" #. type: description #: documentation.tex:107 msgid "" "[Windows] Download and install the Inkscape extension (\\href{http://xia." "dane.ac-versailles.fr/download/setup.exe}{http://xia.dane.ac-versailles.fr/" "download/setup.exe}) or the portable version (\\href{http://xia.dane.ac-" "versailles.fr/download/xia-windows.zip}{http://xia.dane.ac-versailles.fr/" "download/xia-windows.zip})." msgstr "" "[Windows] Téléchargez et installez l'extension Inkscape (\\href{http://xia." "dane.ac-versailles.fr/download/setup.exe}{http://xia.dane.ac-versailles.fr/" "download/setup.exe}) ou Xia en version portable (\\href{http://xia.dane.ac-" "versailles.fr/download/xia-windows.zip}{http://xia.dane.ac-versailles.fr/" "download/xia-windows.zip})." #. type: section{#2} #: documentation.tex:111 msgid "" "Creating your first interactive image using Inkscape and Xia: \\emph{Basic " "features}" msgstr "" "Création d'une première image interactive avec Inkscape et Xia: " "\\emph{Fonctionnalités de base}" #. type: subsection{#2} #: documentation.tex:113 msgid "Building the svg source file to generate an interactive image" msgstr "" "Création du fichier source au format svg en vue de la génération de l'image " "interactive" #. type: links #: documentation.tex:116 msgid "" "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1}" "{interactive image} created for this section of the documentation." msgstr "" "Visualisez l'\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1}{image " "interactive} créée pour cette partie de la documentation." #. type: links #: documentation.tex:119 msgid "" "Download the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/svg/xia1." "svg}{svg} source file." msgstr "" "Téléchargez le fichier source au format \\href{http://xia.dane.ac-versailles." "fr/demo/tuto/xia1/svg/xia1.svg}{svg}." #. type: document #: documentation.tex:126 msgid "" "Manipulations described in this section will help you to create a \"basic\" " "interactive image featuring:" msgstr "" "Les manipulations décrites dans cette partie de la documentation vous " "permettront de créer une image interactive «~basique~», comprenant:" #. type: itemize #: documentation.tex:126 msgid "Zoom-in enabled details" msgstr "Détails zoomables" #. type: itemize #: documentation.tex:126 msgid "Comments on details only made of plain text" msgstr "Commentaires uniquement constitués de texte non mis en forme" #. type: document #: documentation.tex:129 msgid "" "Once you have chosen the image you will work with, open it with Inkscape:" msgstr "Une fois l'image choisie, ouvrez-la dans Inkscape" #. type: document #: documentation.tex:131 msgid "\\softmenu{File $\\rightarrow$ Open}" msgstr "\\softmenu{Fichier $\\rightarrow$ Ouvrir}" #. type: document #: documentation.tex:133 msgid "" "When asked by the software if you wish to \"\\softmenu{Link}\" or " "\"\\softmenu{Incorporate image}\", choose \"\\softmenu{Incorporate}\"." msgstr "" "Quand Inkscape vous demande de choisir entre \\softmenu{Lier} ou " "\\softmenu{Incorporer l'image}, choisissez \\softmenu{Incorporer}." #. type: document #: documentation.tex:140 msgid "" "The information filled in the \\softmenu{document Metadata} (\\softmenu " "{File} menu) will be included in the interactive image once generated : " "title, creator, rights, \\ldots. It is strongly recommended to type in this " "information. You can see what it looks like once generated on the image " "below\\footnote{The fields \"author\" and \"rights\" appear in the window " "\"About\", symbolized by a clickable button shaped like the letter \"i\"}:\\" "\\" msgstr "" "Les informations renseignées dans les \\softmenu{Métadonnées du document} " "(menu \\softmenu{Fichier}) seront conservées dans l'animation générée: " "titre, créateur, droits, \\ldots. Il est donc fortement conseillé de " "renseigner ces informations. Le rendu est visible sur l'image ci-dessous" "\\footnote{Les champs \"auteur\" et \"droits\" apparaissent dans la fenêtre " "\"À propos\", symbolisée par une icône clicable en forme de lettre \"i\".}:\\" "\\" #. type: document #: documentation.tex:149 msgid "" "The title entered in the metadata of the document appears above the " "interactive image and gives its name to the web page. The creator and rights " "appear in the pop up associated with the \"i\" button on the right of the " "title of the interactive image." msgstr "" "Le titre renseigné dans les métadonnées du document apparaissent au-dessus " "de l'image interactive et donnent son nom à la page web l'affichant. Le " "créateur et les droits associés apparaissent dans la pop up accessible via " "l'icône «~i~» située à droite du titre de l'image interactive." #. type: document #: documentation.tex:152 msgid "" "You can save the image in svg format in the earlywork, through " "\\softmenu{File $\\rightarrow$ Save as\\ldots}." msgstr "" "Vous pouvez sauvegarder votre projet au format svg dès le début du travail, " "en allant dans le menu \\softmenu{Fichier $\\rightarrow$ Enregistrer sous" "\\ldots}." #. type: document #: documentation.tex:156 msgid "" "For more clarity, you should remove the current extension of the image in " "the field \\softmenu{Name} of the dialog window. Finally, in the dropdown " "menu, choose the Inkscape svg file format:" msgstr "" "Vous pouvez, par souci de clarté, supprimer l'extension d'origine de votre " "image dans le champ \\softmenu{Nom} de la fenêtre de dialogue. Enfin, dans " "le menu déroulant, choisissez le format de fichier Inkscape svg:" #. type: document #: documentation.tex:158 msgid "\\softmenu{SVG Inkscape (*.svg)}." msgstr "\\softmenu{SVG Inkscape (*.svg)}." #. type: document #: documentation.tex:167 msgid "" "Several Inkscape tools can be used to clip the details that will become " "active in the animation generated by Xia. Among these:" msgstr "" "De nombreux outils d'Inkscape peuvent être utilisés pour détourer les " "détails qui deviendront actifs dans l'animation générée par Xia. Parmi ceux-" "ci:" #. type: itemize #: documentation.tex:167 msgid "\\softmenu{Create rectangles and squares}" msgstr "\\softmenu{Créer des rectangles et des carrés}" #. type: itemize #: documentation.tex:167 msgid "\\softmenu{Create circles, ellipses and arcs}" msgstr "\\softmenu{Créer des cercles, des ellipses et des arcs}" #. type: itemize #: documentation.tex:167 msgid "\\softmenu{Draw freehand lines}" msgstr "\\softmenu{Dessiner des lignes à main levée}" #. type: itemize #: documentation.tex:167 msgid "" "\\includegraphics[scale=0.5]{./images/bezier} \\softmenu{Bezier curves and " "straight lines}" msgstr "" "\\includegraphics[scale=0.5]{./images/bezier} \\softmenu{Tracer des courbes " "de Bézier et des segments de droite}" #. type: document #: documentation.tex:175 msgid "" "Without going in the detail of how these tools work\\footnote{For this, " "refer to \\href{http://inkscape.org/doc/shapes/tutorial-shapes.fr.html}" "{Inkscape manual} or \\href{http://en.flossmanuals.net/inkscape/}{Floss " "manual}.} note that the tool \"\\softmenu{Draw Bezier curves and straight " "lines}\" allows to crop \"click by click\" (work points are called \"nodes" "\"). You close the figure by clicking on the start node. You can draw " "\"\\softmenu{Bezier curves}\" by keeping the mouse button pressed after " "creating a node, then moving the cursor to bring up the control handles to " "shape the curve segment as desired." msgstr "" "Sans rentrer dans le détail du fonctionnement de ces différents outils" "\\footnote{Pour cela, lire le \\href{http://inkscape.org/doc/shapes/tutorial-" "shapes.fr.html}{manuel d'Inkscape} ou \\href{http://en.flossmanuals.net/" "inkscape/}{le manuel Floss}.}, sachez que l'outil \\softmenu{Tracer des " "courbes de Bézier et des segments de droite} permet de détourer \"clic par " "clic\" (les points de construction du polygone sont alors appelés des " "«~nœuds~»). Vous pouvez refermer votre polygone en cliquant sur le premier " "nœud de ce même polygone. Vous pouvez dessiner des \\softmenu{Courbes de " "Bézier} en gardant le clic de votre souris enfoncé après avoir créé un nœud, " "puis en déplaçant le curseur pour faire apparaître les poignées de contrôle " "afin de modifier la forme de la courbe." #. type: alert #: documentation.tex:180 msgid "" "If you set a left open shape in Inkscape (for example a line), Xia will " "automatically close it by connecting a straight line between the beginning " "and the end of it." msgstr "" "Si vous laissez une forme ouverte dans Inkscape (une courbe par exemple), " "Xia refermera automatiquement celle-ci en joignant son point de départ et " "d'arrivée." #. type: alert #: documentation.tex:188 msgid "" "The order of creation of details in Inkscape will be the same in the html5 " "interactive image (for example: the first created detail in Inkscape will " "appear at the top of the interactive image). If you wish to change the " "sequence without having to create the details once more, see section " "\\ref{XML_layer}." msgstr "" "L'ordre de création des détails dans Inkscape sera respecté dans l'image " "interactive au format html5 (par exemple, le premier détail détouré dans " "Inkscape apparaîtra en haut dans le modèle accordéon ou en numéro 1 dans le " "modèle boutons). Si vous souhaitez changer cet ordre sans avoir à recréer " "tous les détails, lisez la rubrique \\ref{XML_layer}." #. type: document #: documentation.tex:192 msgid "" "Once you have cut out a detail\\footnote{The colour of the border will be " "the same in Inkscape and in the animation generated by Xia.}, you can select " "it with the tool \\softmenu{Select and transform object} to resize it, move " "it\\ldots" msgstr "" "Une fois les détails détourés\\footnote{La couleur du contour des détails " "dans l'animation générée par Xia sera la même que celle choisie dans " "Inkscape.}, vous pouvez les sélectionner avec l'outil " "\\softmenu{Sélectionner et transformer des objets} afin de les " "redimensionner, les déplacer, etc.\\ldots" #. type: tip #: documentation.tex:198 msgid "" "If you have some difficulties to select the details you have drawn, apply a " "colour background to them. Choose whatever colour you like, except for black " "and white (see why in section \\ref{white_black_background})." msgstr "" "Si vous avez des difficultés pour sélectionner un détail que vous avez " "détouré, appliquez-lui une couleur de fond. N'importe quelle couleur fera " "l'affaire, sauf noir et blanc (pour comprendre pourquoi, lisez la rubrique " "\\ref{white_black_background})." #. type: document #: documentation.tex:203 msgid "" "You can access to the \\softmenu{Object properties} by right-clicking on the " "cut-out detail. Thus you also access to the dialog window in which you add " "the text to be associated with the detail in the interactive image:\\\\" msgstr "" "Vous pouvez accéder aux \\softmenu{Propriétés de l'objet} par un clic-droit " "sur le détail détouré. À partir de là, vous accédez à une fenêtre de " "dialogue vous permettant d'ajouter le texte qui sera associé au détail dans " "l'image interactive:\\\\" #. type: document #: documentation.tex:212 msgid "" "The two fields to be filled in this window are \\softmenu{Title} and " "\\softmenu{Description}. The title filled in here will be that of the " "detail, description will be its comment. Do not forget to click on the " "\\softmenu{Define} button before you close the \\softmenu {Object " "Properties} dialog window." msgstr "" "Les deux champs devant nécessairement être renseignés dans cette fenêtre " "sont les champs \\softmenu{Titre} et \\softmenu{Description}. Le titre " "deviendra celui du détail, la description son commentaire. N'oubliez pas de " "cliquer sur le bouton \\softmenu{Définir} avant de fermer la fenêtre des " "\\softmenu{Propriétés de l'objet}." #. type: document #: documentation.tex:216 msgid "" "The process described above must also be done with the background image : " "the title and description indicated here will serve as an introduction to " "the interactive image (title and comment not related to a particular detail)." msgstr "" "Le processus décrit ci-dessus doit également être effectué avec l'image de " "fond: le titre et la description de celle-ci serviront d'introduction " "générale à l'image interactive (il s'agit d'un titre et d'un commentaire qui " "ne sont pas reliés à un détail particulier)." #. type: subsection{#2} #: documentation.tex:218 msgid "Generating the interactive image with Xia" msgstr "Génération de l'image interactive avec Xia" #. type: document #: documentation.tex:225 msgid "" "When all the details are clipped and their metadata indicated, Xia can be " "launched (see figure \\ref{xia_interface}). You must select the svg source " "file with the top left icon\\footnote{When launched as an Inkscape " "extension, the top left icon has a different look, and can not be selected, " "since Xia assumes you want to create the html5 animation from the image you " "are working on in Inkscape.}, choose the export options (see figure " "\\ref{xia_export_options}), and then choose a template and the destination " "folder of the interactive image." msgstr "" "Quand tous les détails sont détourés et leurs métadonnées renseignées, Xia " "peut être lancé (voir l'illustration \\ref{xia_interface}). Vous devez " "sélectionner votre fichier svg avec l'icône située en haut à gauche" "\\footnote{Cette icône n'apparaît pas sous cette forme quand Xia est lancé " "depuis les extensions d'Inkscape. En effet, dans ce cas Xia considère que " "vous souhaitez générer l'animation depuis l'image actuellement ouverte dans " "Inkscape. Vous ne pouvez donc pas sélectionner d'image source.}, choisir la " "qualité de l'export (voir l'illustration \\ref{xia_export_options}), et " "enfin choisir un modèle d'export et un répertoire d'enregistrement de " "l'image interactive." #. type: document #: documentation.tex:230 msgid "" "Clicking on one of the template icons generates a series of files and " "folders. Open the \\softmenu{index.html} file in a webbrowser to see the " "html5 interactive image." msgstr "" "En cliquant sur l'une des icônes des modèles d'export, vous générez une " "série de fichiers et de répertoires. Ouvrez le fichier \\softmenu{index." "html} dans un navigateur web pour voir votre image interactive au format " "html5." #. type: alert #: documentation.tex:239 msgid "" "This file will not display anything if used alone. All the other files and " "directories generated during the export process must be stored in the same " "folder (see figure \\ref{xia_files}) as the \\texttt{index.html} file so " "that the animation works properly. \\textbf{It is therefore essential to " "dedicate a specific directory for each exported image}." msgstr "" "Ce fichier ne peut être séparé des autres pour que l'image interactive " "fonctionne. Tous les autres fichiers et répertoires générés durant le " "processus d'exportation doivent obligatoirement être localisés dans le même " "répertoire (voir l'illustration \\ref{xia_files}) pour que le fichier " "\\texttt{index.html} fonctionne correctement. \\textbf{Il est donc impératif " "de dédier un répertoire spécifique à chaque image interactive générée}." #. type: figure #: documentation.tex:258 documentation.tex:297 documentation.tex:665 msgid "" "\\tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded corners]" msgstr "" "\\tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded corners]" #. \draw[help lines] (0,0) grid (5,5); #. icons #. type: tikzpicture #: documentation.tex:258 msgid "" "\\node (bBlue) {\\includegraphics[width=2cm]{./images/buttonBlue}}; " "\\node[left= .3mm of bBlue, opacity=.5] (aBrown) " "{\\includegraphics[width=2cm]{./images/audioBrown}}; \\node[right= .3mm of " "bBlue, opacity=.5] (guClic) {\\includegraphics[width=2cm]{./images/" "game1clic}}; \\node[below= .2mm of bBlue.south] (pBlue) " "{\\includegraphics[width=2cm]{./images/popBlue}}; \\node[left= .3mm of " "pBlue, opacity=.5] (gDDrop) {\\includegraphics[width=2cm]{./images/" "gameDragAndDrop}}; \\node[right= .3mm of pBlue] (pYellow) " "{\\includegraphics[width=2cm]{./images/popYellow}}; \\node[above = .2mm of " "guClic.north] (aCloud) {\\includegraphics[width=2cm]{./images/" "accordionCloud}}; \\node[above = .2mm of aCloud.north] (aBlack) " "{\\includegraphics[width=2cm]{./images/accordionBlack}}; \\node[left = .3mm " "of aBlack] (params) {\\includegraphics[width=2cm]{./images/params}}; " "\\node[left = .3mm of params] (files) {\\includegraphics[width=2cm]{./images/" "xia_open}}; \\node[left = 1mm of aCloud, opacity=.3] (xialogo) " "{\\includegraphics[height=2.1cm]{./images/xia}};" msgstr "" "\\node (bBlue) {\\includegraphics[width=2cm]{./images/buttonBlue}}; " "\\node[left= .3mm of bBlue, opacity=.5] (aBrown) " "{\\includegraphics[width=2cm]{./images/audioBrown}}; \\node[right= .3mm of " "bBlue, opacity=.5] (guClic) {\\includegraphics[width=2cm]{./images/" "game1clic}}; \\node[below= .2mm of bBlue.south] (pBlue) " "{\\includegraphics[width=2cm]{./images/popBlue}}; \\node[left= .3mm of " "pBlue, opacity=.5] (gDDrop) {\\includegraphics[width=2cm]{./images/" "gameDragAndDrop}}; \\node[right= .3mm of pBlue] (pYellow) " "{\\includegraphics[width=2cm]{./images/popYellow}}; \\node[above = .2mm of " "guClic.north] (aCloud) {\\includegraphics[width=2cm]{./images/" "accordionCloud}}; \\node[above = .2mm of aCloud.north] (aBlack) " "{\\includegraphics[width=2cm]{./images/accordionBlack}}; \\node[left = .3mm " "of aBlack] (params) {\\includegraphics[width=2cm]{./images/params}}; " "\\node[left = .3mm of params] (files) {\\includegraphics[width=2cm]{./images/" "xia_open}}; \\node[left = 1mm of aCloud, opacity=.3] (xialogo) " "{\\includegraphics[height=2.1cm]{./images/xia}};" #. comments #. type: tikzpicture #: documentation.tex:273 msgid "" "\\node[box, text width=2.5cm,above left = 5mm of files] (filesC) {Select the " "svg source file}; \\node[box, above = 5mm of params] (paramsC) {Define the " "options of the export (see figure \\ref{xia_export_options})}; \\node[box," "above right = 5mm of aCloud.north east] (aBlackC) {\\href{http://xia.dane.ac-" "versailles.fr/demo/tuto/xia1/accordionBlack}{accordionBlack}\\\\ Large " "comment zone, suitable for the insertion of multimedia resources; to be used " "with vertical images (portrait)}; \\node[box, right = 5mm of guClic] " "(aCloudC) {\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/" "accordionCloud}{accordionCloud}\\\\ Narrow comment zone, with more space for " "the image itself ; to be used with horizontal images (landscape)}; " "\\node[box, below right = 5mm of pYellow] (pYellowC) {\\href{http://xia.dane." "ac-versailles.fr/demo/tuto/xia1/popYellow}{popYellow}\\\\ No lateral comment " "zone ; a first click on the detail reveals it, and a second one " "simultaneously unveils the comment and triggers the zoom function}; " "\\node[box, left = 25mm of bBlue] (bBlueC) {\\href{http://xia.dane.ac-" "versailles.fr/demo/tuto/xia1/buttonBlue}{buttonBlue}\\\\ No lateral comment " "zone ; comments appear above the image (suitable for long comments) ; the " "users access the comments through icons placed above the interactive image}; " "\\node[box, below left = 5mm of pBlue] (pBlueC) {\\href{http://xia.dane.ac-" "versailles.fr/demo/tuto/xia1/popBlue}{popBlue}\\\\ No lateral comment zone; " "a first click on the detail reveals it, and a second one pops up the comment " "(no zoom)};" msgstr "" "\\node[box, text width=2.5cm,above left = 5mm of files] (filesC) {Sélection " "du fichier source svg}; \\node[box, above = 5mm of params] (paramsC) " "{Définition des options d'exportation (voir l'illustration " "\\ref{xia_export_options})}; \\node[box,above right = 5mm of aCloud.north " "east] (aBlackC) {\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/" "accordionBlack}{accordionBlack}\\\\ Zone de commentaire large, recommandé " "pour l'insertion de ressources multimédias; à utiliser avec des images " "verticales (portrait)}; \\node[box, right = 5mm of guClic] (aCloudC) " "{\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/accordionCloud}" "{accordionCloud}\\\\ Zone de commentaires étroite, laissant davantage de " "place à l'image en elle-même ; à utiliser avec des images horizontales " "(paysage)}; \\node[box, below right = 5mm of pYellow] (pYellowC) " "{\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/popYellow}" "{popYellow}\\\\ Pas de zone latérale de commentaire ; un premier clic sur le " "détail le met en évidence, et un second fait apparaître le commentaire et " "enclenche la fonction zoom}; \\node[box, left = 25mm of bBlue] (bBlueC) " "{\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/buttonBlue}" "{buttonBlue}\\\\ Pas de zone latérale de commentaire ; les commentaires " "apparaissent au-dessus de l'image (recommandé pour les commentaires longs) ; " "les utilisateurs accèdent aux commentaires via des boutons situés au-dessus " "de l'image interactive}; \\node[box, below left = 5mm of pBlue] (pBlueC) " "{\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/popBlue}{popBlue}\\" "\\ Pas de zone latérale de commentaire; un premier clic met en évidence le " "détail, un second fait apparaître le commentaire (pas de zoom)};" #. arrows #. type: tikzpicture #: documentation.tex:282 msgid "" "\\draw[-stealth] (aBlackC.west) -- (aBlack.east); \\draw[-stealth] (aCloudC." "west) -- (aCloud.south east); \\draw[-stealth] (pYellowC.north west) -- " "(pYellow.south east); \\draw[-stealth] (bBlueC.north east) -- (bBlue.north " "west); \\draw[-stealth] (pBlueC.north east) -- (pBlue.south west); \\draw[-" "stealth] (filesC.south east) -- (files.north west); \\draw[-stealth] " "(paramsC.south) -- (params.north);" msgstr "" "\\draw[-stealth] (aBlackC.west) -- (aBlack.east); \\draw[-stealth] (aCloudC." "west) -- (aCloud.south east); \\draw[-stealth] (pYellowC.north west) -- " "(pYellow.south east); \\draw[-stealth] (bBlueC.north east) -- (bBlue.north " "west); \\draw[-stealth] (pBlueC.north east) -- (pBlue.south west); \\draw[-" "stealth] (filesC.south east) -- (files.north west); \\draw[-stealth] " "(paramsC.south) -- (params.north);" #. type: caption{#2} #: documentation.tex:287 msgid "Xia's templates" msgstr "Les modèles d'export de Xia" #. \draw[help lines] (0,0) grid (5,5); #. icons #. type: tikzpicture #: documentation.tex:297 msgid "" "\\node (exp_qual) {\\includegraphics[scale=.5]{./images/exp_qual}}; " "\\node[right= .2mm of exp_qual] (exp_firefox) {\\includegraphics[scale=.5]{./" "images/exp_firefox}}; \\node[right= .2mm of exp_firefox] (exp_1file) " "{\\includegraphics[scale=.5]{./images/exp_1file}};" msgstr "" "\\node (exp_qual) {\\includegraphics[scale=.5]{./images/exp_qual}}; " "\\node[right= .2mm of exp_qual] (exp_firefox) {\\includegraphics[scale=.5]{./" "images/exp_firefox}}; \\node[right= .2mm of exp_firefox] (exp_1file) " "{\\includegraphics[scale=.5]{./images/exp_1file}};" #. comments #. type: tikzpicture #: documentation.tex:307 msgid "" "\\node[box, text width=2.5cm, left = 5mm of exp_qual] (exp_qualC) {Select " "the quality of the export on a scale from 1 to 4}; \\node[box, above = 5mm " "of exp_firefox] (exp_firefoxC) {Activate or Deactivate the creation of the " "FirefoxOS files (default: deactivated)}; \\node[box, text width=10cm, below " "= 5mm of exp_1file] (exp_1fileC) {In the unique file configuration, you will " "need an internet connection to access the resource. The xia engine used in " "the unique file configuration is hosted on Versailles academy servers and is " "automatically updated. In this configuration, you can not control the " "background image and icons (default: deactivated)};" msgstr "" "\\node[box, text width=2.5cm, left = 5mm of exp_qual] (exp_qualC) " "{Sélectionner la qualité de l'export sur une échelle de 1 à 4}; \\node[box, " "above = 5mm of exp_firefox] (exp_firefoxC) {Activer ou désactiver la " "création des fichiers pour l'export FirefoxOS (par défaut: désactivé)}; " "\\node[box, text width=10cm, below = 5mm of exp_1file] (exp_1fileC) {Dans le " "cas d'un export avec fichier unique, vous aurez besoin d'une connexion " "internet pour accéder à la ressource. Le moteur de rendu de Xia est hébergé " "sur les serveurs de l'académie de Versailles, et est mis à jour " "automatiquement. Avec cette configuration, vous ne pouvez pas personnaliser " "le fond et les icônes (par défaut: désactivé)};" #. arrows #. type: tikzpicture #: documentation.tex:312 msgid "" "\\draw[-stealth] (exp_qualC.east) -- (exp_qual.west); \\draw[-stealth] " "(exp_firefoxC.south) -- (exp_firefox.north); \\draw[-stealth] (exp_1fileC." "north) -- (exp_1file.south);" msgstr "" "\\draw[-stealth] (exp_qualC.east) -- (exp_qual.west); \\draw[-stealth] " "(exp_firefoxC.south) -- (exp_firefox.north); \\draw[-stealth] (exp_1fileC." "north) -- (exp_1file.south);" #. type: caption{#2} #: documentation.tex:317 msgid "Xia's exportation options" msgstr "Les options d'export de Xia" #. type: figure #: documentation.tex:357 msgid "" "\\tikzstyle{every node}=[draw=black,thick,anchor=west] \\tikzstyle{auto}" "=[draw=reddebian,fill=reddebian!30, text height=2.5mm] \\tikzstyle{manual}" "=[draw=bluedane,fill=bluedane!30, text height=2.5mm] \\tikzstyle{firefoxOS}" "=[draw=orange,fill=orange!30, text height=2.5mm] \\tikzstyle{manualT}" "=[fill=bluedane!30,draw=bluedane, rectangle,text width=5cm, rounded corners] " "\\tikzstyle{autoT}=[fill=reddebian!30,draw=reddebian, rectangle,text " "width=5cm, rounded corners] \\tikzstyle{firefoxOST}=[fill=orange!30," "draw=orange, rectangle,text width=5cm, rounded corners]" msgstr "" "\\tikzstyle{every node}=[draw=black,thick,anchor=west] \\tikzstyle{auto}" "=[draw=reddebian,fill=reddebian!30, text height=2.5mm] \\tikzstyle{manual}" "=[draw=bluedane,fill=bluedane!30, text height=2.5mm] \\tikzstyle{firefoxOS}" "=[draw=orange,fill=orange!30, text height=2.5mm] \\tikzstyle{manualT}" "=[fill=bluedane!30,draw=bluedane, rectangle,text width=5cm, rounded corners] " "\\tikzstyle{autoT}=[fill=reddebian!30,draw=reddebian, rectangle,text " "width=5cm, rounded corners] \\tikzstyle{autoT}=[fill=reddebian!30," "draw=reddebian, rectangle,text width=5cm, rounded corners] " "\\tikzstyle{firefoxOST}=[fill=orange!30,draw=orange, rectangle,text " "width=5cm, rounded corners]" #. type: tikzpicture #: documentation.tex:357 msgid "" "[grow via three points={one child at (0.5,-0.7) and two children at " "(0.5,-0.7) and (0.5,-1.4)}, edge from parent path={(\\tikzparentnode.south) " "|- (\\tikzchildnode.west)}] \\node [manual] {my\\_project/} child { node " "[auto] {index.html}}\t\t child { node [firefoxOS] {deploy.html}}\t\t child " "{ node [firefoxOS] {manifest.webapp}}\t\t child { node [auto] {css/}} child " "{ node [auto] {data/}} child { node [auto] {font/}} child { node [auto] " "{img/}} child { node [auto] {js/}} child { node [manual] {videos/} child " "{ node [manual] {video.mp4}} child { node [manual] {video.ogv}} child { node " "[manual] {video.webm}} }; \\node[manualT] (textM) at (10,-2) {These files " "and folders have been manually created by the interactive image designer. " "The folder \\textcolor{bluedane} {videos} was also manually created, in " "order to host videos inserted in the comments of the interactive image using " "relative links.}; \\node[autoT] (textA) at (10,-8) {Files and folders " "generated by Xia from the svg source file.}; \\node[firefoxOST] (textFOS) at " "(10,-6) {Files generated with Firefox OS export activated}; \\draw[-stealth] " "(textM.west) -- (4,0); \\draw[-stealth] (textM.west) -- (5.5,-7); \\draw[-" "stealth] (textA.west) -- (4,-4); \\draw[-stealth] (textFOS.west) -- (5.5,-2);" msgstr "" "[grow via three points={one child at (0.5,-0.7) and two children at " "(0.5,-0.7) and (0.5,-1.4)}, edge from parent path={(\\tikzparentnode.south) " "|- (\\tikzchildnode.west)}] \\node [manual] {mon\\_projet/} child { node " "[auto] {index.html}}\t\t child { node [firefoxOS] {deploy.html}}\t\t child " "{ node [firefoxOS] {manifest.webapp}}\t\t child { node [auto] {css/}} child " "{ node [auto] {data/}} child { node [auto] {font/}} child { node [auto] " "{img/}} child { node [auto] {js/}} child { node [manual] {videos/} child " "{ node [manual] {video.mp4}} child { node [manual] {video.ogv}} child { node " "[manual] {video.webm}} }; \\node[manualT] (textM) at (10,-2) {Ces fichiers " "et répertoires ont été créés manuellement par le créateur de l'image " "interactive. Le répertoire \\textcolor{bluedane} {videos} a également été " "créé manuellement, dans le but de stocker les vidéos insérées dans les " "commentaires de l'image interactive, à l'aide de liens relatifs.}; " "\\node[autoT] (textA) at (10,-8) {Ces fichiers et répertoires sont générés " "par Xia durant le processus d'export.}; \\node[firefoxOST] (textFOS) at " "(10,-6) {Fichiers générés en cas d'activation de l'export Firefox OS};" "\\draw[-stealth] (textM.west) -- (4,0); \\draw[-stealth] (textM.west) -- " "(5.5,-7); \\draw[-stealth] (textA.west) -- (4,-4); \\draw[-stealth] (textFOS." "west) -- (5.5,-2);" #. type: caption{#2} #: documentation.tex:357 msgid "Files of an interactive image with FirefoxOS export activated" msgstr "Fichiers d'une image interactive avec l'export Firefox OS activé" #. type: document #: documentation.tex:361 msgid "" "In fact, since Xia is also an Inkscape plugin, you can generate your project " "directly in Inkscape: just click on \\softmenu{Plugins $\\rightarrow$ " "Various $\\rightarrow$ Xia Édu}, and choose your template and destination " "folder." msgstr "" "En réalité, puisque Xia est également une extension d'Inkscape, vous pouvez " "générez vos projets directement depuis ce logiciel: cliquez sur " "\\softmenu{Extensions $\\rightarrow$ Divers $\\rightarrow$ Xia Édu}, et " "choisissez directement la qualité, le modèle d'export, et le répertoire de " "destination." #. type: tip #: documentation.tex:374 msgid "" "If you use GNU/Linux or Mac OS X, you can generate your html5 animation " "using the terminal with the command \\texttt{xia-converter}. The parameters " "are \\texttt{-i} to indicate the input file, \\texttt{-o} to indicate the " "exportation folder, and \\texttt{-t} to indicate the template.\\\\ " "\\emph{GNU/Linux}\\\\ \\texttt{\\$ xia-converter -i myfile.svg -o export" "\\_folder/ -t accordionBlack}\\\\ \\emph{Mac OS X}\\\\ \\texttt{\\$ cd /" "Applications/xia.app/Contents/Resources/}\\\\ \\texttt{\\$ python xia.py -i " "myfile.svg -o export\\_folder/ -t gameDragAndDrop}\\\\ The template " "accordionBlack will be chosen if a syntax error is made in the \\texttt{-t} " "parameter." msgstr "" "Si vous utilisez GNU/Linux ou Mac OS X, vous pouvez générer vos animation " "html5 en utilisant le terminal avec la commande \\texttt{xia-converter}. Les " "paramètres à utiliser sont \\texttt{-i} pour indiquer le fichier en entrée, " "\\texttt{-o} pour indiquer le répertoire d'export, et \\texttt{-t} le thème " "choisi.\\\\ \\emph{Avec GNU/Linux}\\\\ \\texttt{\\$ xia-converter -i " "monfichier.svg -o dossier\\_export/ -t accordionBlack}\\\\ \\emph{Avec Mac " "OS X}\\\\ \\texttt{\\$ cd /Applications/xia.app/Contents/Resources/}\\\\ " "\\texttt{\\$ python xia.py -i monfichier.svg -o dossier\\_export/ -t " "gameDragAndDrop}\\\\ Le thème accordionBlack sera choisi s'il y a une erreur " "de syntaxe dans le paramre \\texttt{-t}." #. type: subsection{#2} #: documentation.tex:376 msgid "Firefox OS export: how does it work?" msgstr "L'export Firefox OS: comment ça marche?" #. type: document #: documentation.tex:379 msgid "" "The user has to use the Firefox OS browser and access the animation through " "the \\texttt{deploy.html} file. Firefox OS will then launch a process in " "which the animation will become a html5 application." msgstr "" "L'utilisateur devra se servir du navigateur web de Firefox OS, et accéder à " "la ressource via le fichier \\texttt{deploy.html}. Firefox OS lancera alors " "un processus dans lequel l'animation sera transformée en application html5." #. type: subsection{#2} #: documentation.tex:381 documentation.tex:623 documentation.tex:955 msgid "Abstract" msgstr "En résumé" #. type: enumerate #: documentation.tex:392 msgid "" "An interactive image is first built in Inkscape (svg format). Xia only " "converts the svg source file into an html5 animation ;" msgstr "" "Une image interactive est construite dans Inkscape (au format svg). Xia ne " "fait que convertir ce fichier source svg en animation html5; " #. type: enumerate #: documentation.tex:392 msgid "" "The title of the interactive image must be indicated in the " "\\softmenu{Metadata of the document} ;" msgstr "" "Le titre de l'image interactive doit être renseigné dans les " "\\softmenu{Métadonnées du document};" #. type: enumerate #: documentation.tex:392 msgid "" "The text of the details must be filled in the \\softmenu{Object properties}, " "in the \\softmenu{Title} and \\softmenu{Description} fields of the cut out " "details ;" msgstr "" "Le texte des détails est renseigné dans les \\softmenu{Propriétés de " "l'objet}, dans les champs \\softmenu{Titre} et \\softmenu{Description} des " "détails détourés;" #. type: enumerate #: documentation.tex:392 msgid "" "The general description of the interactive image must be indicated in the " "\\softmenu {Object properties} of the background image." msgstr "" "La description générale de l'image interactive doit être renseignée dans les " "\\softmenu{Propriétés de l'objet} de l'image de fond." #. type: section{#2} #: documentation.tex:394 msgid "Enriched interactive image" msgstr "Images interactives enrichies" #. type: links #: documentation.tex:397 msgid "" "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia2}" "{interactive image} created for this section of the documentation." msgstr "" "Visualisez l'\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia2}{image " "interactive} créée pour cette partie de la documentation." #. type: links #: documentation.tex:400 msgid "" "Download the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia2/svg/xia2." "svg}{svg} source file." msgstr "" "Téléchargez le fichier source au format \\href{http://xia.dane.ac-versailles." "fr/demo/tuto/xia2/svg/xia2.svg}{svg}." #. type: document #: documentation.tex:404 msgid "" "In this section, the goal is still to create a \"traditional\" interactive " "image (ie. in which a detail matches with a comment), but the content of the " "comments will be enriched with formatted text or multimedia resources." msgstr "" "Dans cette section, l'objectif demeure la création d'une image interactive " "«~simple~» (autrement dit, dans laquelle un détail fait apparaître un " "commentaire). Cependant, le texte des commentaires sera enrichi par une mise " "en forme ou des ressources multimédias." #. type: subsection{#2} #: documentation.tex:408 msgid "Formatting text" msgstr "Mise en forme du texte" #. type: document #: documentation.tex:410 msgid "" "In order to insert formatted text, the tags described in figure " "\\ref{xia_text_tags} should be used." msgstr "" "Afin de mettre en forme le texte, les balises indiquées dans l'illustration " "\\ref{xia_text_tags} seront utilisées." #. type: figure #: documentation.tex:448 msgid "" "\\tikzstyle{descrip}=[font=\\sffamily, anchor=north west, text width = " "4.3cm] \\tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded " "corners, anchor=north west]" msgstr "" "\\tikzstyle{descrip}=[font=\\sffamily, anchor=north west, text width = " "4.3cm] \\tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded " "corners, anchor=north west]" #. type: tikzpicture #: documentation.tex:448 msgid "" "\\node[anchor=north west] (bold) {\\includegraphics[scale=.5]{./images/" "Description}}; \\node[descrip, below = -7mm of bold] (boldT) {This text is " "***bold***}; \\node[box, right = 3.5cm of bold] (bolR) {This text is in " "\\textbf{bold}}; \\node[anchor=north west, below = .2cm of bold] (italic) " "{\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, below = " "-7mm of italic] (italicT) {This text is in **italics**}; \\node[box, right = " "3.5cm of italic] (italicR) {This text is in \\textit{italics}}; " "\\node[anchor=north west, below = .2cm of italic] (texttt) " "{\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, below = " "-7mm of texttt] (textttT) {This text is in \\verb!{{{typewriter}}}!}; " "\\node[box, right = 3.5cm of texttt] (textttR) {This text is in " "\\texttt{typewriter}}; \\node[anchor=north west, below = .2cm of texttt] " "(link) {\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, " "below = 7mm of link.north] (linkT) {A link to \\verb![https://www.wikipedia." "org/ Wikipedia]!}; \\node[box, right = 3.5cm of link] (linkR) {A link to " "\\href{https://www.wikipedia.org/}{Wikipedia}}; \\node[anchor=north west, " "below = .2cm of link] (relativelinks) {\\includegraphics[scale=.5]{./images/" "Description}}; \\node[descrip, below = -7mm of relativelinks] " "(relativelinksT) {A link to a \\verb![./foo/bar.pdf local file]!}; " "\\node[box, right = 3.5cm of relativelinks] (relativelinksR) {A link to a " "\\href{./foo/bar.pdf}{local file\\footnote{This will not work on your " "computer!}}}; \\node[anchor=north west, below = .8cm of relativelinks] " "(bullets) {\\includegraphics[scale=.5]{./images/Description}}; " "\\node[descrip, below = -7mm of bullets] (bulletsT) {Making a list \\\\ $" "\\ast$ of bullets \\\\ $\\ast$ out of \\\\ ~$\\ast$ 2 levels" "\\footnote{Insert a \\Spacebar (space) before the $\\ast$}}; \\node[box, " "right = 3.5cm of bullets.south east] (bulletsR) {Making a list " "\\begin{itemize} \\item of bullets \\item out of \\begin{itemize} \\item2 " "levels \\end{itemize} \\end{itemize}}; \\node[anchor=north west, below = 3cm " "of bullets] (line) {\\includegraphics[scale=.5]{./images/Description}}; " "\\node[descrip, below = 7mm of line.north] (lineT) {Drawing \\\\ - - - - \\" "\\ a line}; \\node[box, right = 3.5cm of line] (lineR) {Drawing \\\\ " "\\hrulefill \\\\ a line};" msgstr "" "\\node[anchor=north west] (bold) {\\includegraphics[scale=.5]{./images/" "Description}}; \\node[descrip, below = -7mm of bold] (boldT) {Ce texte est " "en ***gras***}; \\node[box, right = 3.5cm of bold] (bolR) {Ce texte est en " "\\textbf{gras}}; \\node[anchor=north west, below = .2cm of bold] (italic) " "{\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, below = " "-7mm of italic] (italicT) {Ce texte est en **italique**}; \\node[box, right " "= 3.5cm of italic] (italicR) {Ce texte est en \\textit{italique}}; " "\\node[anchor=north west, below = .2cm of italic] (texttt) " "{\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, below = " "-7mm of texttt] (textttT) {Bout de texte \\verb!{{{brut}}}!}; \\node[box, " "right = 3.5cm of texttt] (textttR) {Bout de texte \\texttt{brut}}; " "\\node[anchor=north west, below = .2cm of texttt] (link) " "{\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, below = " "7mm of link.north] (linkT) {Un lien vers \\verb![https://www.wikipedia.org/ " "Wikipedia]}; \\node[box, right = 3.5cm of link] (linkR) {Un lien vers " "\\href{https://www.wikipedia.org/}{Wikipedia}}; \\node[anchor=north west, " "below = .2cm of link] (relativelinks) {\\includegraphics[scale=.5]{./images/" "Description}}; \\node[descrip, below = -7mm of relativelinks] " "(relativelinksT) {Un lien vers un \\verb![./foo/bar.pdf fichier local]!}; " "\\node[box, right = 3.5cm of relativelinks] (relativelinksR) {Un lien vers " "un \\href{./foo/bar.pdf}{fichier local\\footnote{Lien qui ne fonctionnera " "pas ici!}}}; \\node[anchor=north west, below = .8cm of relativelinks] " "(bullets) {\\includegraphics[scale=.5]{./images/Description}}; " "\\node[descrip, below = -7mm of bullets] (bulletsT) {Faire une liste \\\\ $" "\\ast$ de puces \\\\ $\\ast$ sur \\\\ ~$\\ast$ 2 niveaux\\footnote{Insérez " "un \\Spacebar (espace) avant les $\\ast$}}; \\node[box, right = 3.5cm of " "bullets.south east] (bulletsR) {Faire une liste \\begin{itemize} \\item de " "puces \\item sur \\begin{itemize} \\item 2 niveaux \\end{itemize} " "\\end{itemize} }; \\node[anchor=north west, below = 3cm of bullets] (line) " "{\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, below = " "7mm of line.north] (lineT) {Tracer \\\\ - - - - \\\\ un trait}; \\node[box, " "right = 3.5cm of line] (lineR) {Tracer \\\\ \\hrulefill \\\\ un trait};" #. type: caption{#2} #: documentation.tex:448 msgid "Tags to format text" msgstr "Balises de mise en forme du texte" #. type: alert #: documentation.tex:454 msgid "" "Links to local files must be relative links: \\verb![./folder/file.pdf local " "file]! for a pdf file contained inside the export folder, and \\verb![../" "folder/file.pdf local file]! for a pdf file contained in a parent folder." msgstr "" "Les liens vers les fichiers locaux doivent obligatoirement être des liens " "relatifs: \\verb![./dossier/fichier.pdf]! pour un fichier pdf contenu dans " "le répertoire d'export, et \\verb![../dossier/fichier.pdf]! pour un fichier " "pdf contenu dans un répertoire parent." #. type: subsection{#2} #: documentation.tex:457 msgid "Inserting multimedia resources into details" msgstr "Insérer des ressources multimédias dans les commentaires" #. type: document #: documentation.tex:467 msgid "" "Inserting multimedia resources into details comments is quite easy: just " "paste the resource url (relative or absolute link) or iframe tag of the web " "service you want to use. Xia will automatically create a multimedia player " "in the comment as long as the resource (image, sound or video) matches its " "supported formats:" msgstr "" "L'insertion de ressources multimédias dans les commentaires est chose assez " "aisée: copiez-collez l'url de la ressource (qu'elle soit absolue ou " "relative) ou le code iframe du service web utilisé pour héberger votre " "ressource, et Xia créera automatiquement un lecteur multimédia, pour peu que " "celle-ci (image, son, vidéo) fasse partie des formats supportés:" #. type: item[#1] #: documentation.tex:467 msgid "Images" msgstr "Images" #. type: description #: documentation.tex:467 msgid "jpg, jpeg, png, gif" msgstr "jpg, jpeg, png, gif" #. type: description #: documentation.tex:467 msgid "[Audio] ogg, mp3" msgstr "[Audio] ogg, mp3" #. type: description #: documentation.tex:467 msgid "[Video] ogv, webm, mp4" msgstr "[Video] ogv, webm, mp4" #. type: document #: documentation.tex:469 msgid "" "The link has to be inserted into the \\softmenu{Description} field of the " "\\softmenu{Object Properties}." msgstr "" "Le lien doit être inséré dans le champ \\softmenu{Description} des " "\\softmenu{Propriétés de l'objet}." #. type: item[#1] #: documentation.tex:472 msgid "Absolute link" msgstr "Lien absolu" #. type: description #: documentation.tex:472 msgid "If the resource url is" msgstr "Si l'url de la ressource est" #. \begin{center} #. \end{center} #. type: description #: documentation.tex:476 msgid "\\verb|http://web.crdp.ac-versailles.fr/02546.ogg|" msgstr "\\verb|http://web.crdp.ac-versailles.fr/02546.ogg|" #. type: description #: documentation.tex:479 msgid "" "just type it in the \\softmenu{Description} field of the \\softmenu{Object " "Properties} in Inkscape" msgstr "" "il suffit alors d'écrire cette url dans le champ \\softmenu{Description} des " "\\softmenu{Propriétés de l'objet} dans Inkscape." #. type: item[#1] #: documentation.tex:485 msgid "Relative link" msgstr "Lien relatif" #. type: description #: documentation.tex:485 msgid "" "If the multimedia file is located in the interactive image folder or in a " "folder (see figure \\ref{xia_files}) within this one, just indicate its " "location, keeping in mind that the interactive image folder has to be " "considered as the root folder. For example, if the \\verb|video.ogv| file " "is located in a \\verb|videos| folder located itself in the interactive " "image exportation folder, just indicate:" msgstr "" "Si le fichier de la ressource multimédia se trouve dans le répertoire " "d'export de l'image interactive, ou dans un répertoire contenu dans celui-" "ci, indiquez simplement le chemin vers le fichier, en considérant le " "répertoire d'export comme répertoire racine. Par exemple, si le fichier " "\\verb|video.ogv| se trouve dans le répertoire \\verb|videos| se trouvant " "lui-même dans le répertoire de l'image interactive, indiquez:" #. \begin{center} #. end{center} #. type: description #: documentation.tex:489 msgid "\\verb|./videos/video.ogv|" msgstr "\\verb|./videos/video.ogv|" #. type: description #: documentation.tex:494 msgid "" "in order to create the player. The \\verb|./| means that the \\verb|videos| " "folder is located in the exportation folder. You can also use the " "\\verb|../| tag to indicate that the resource is located in a parent folder." msgstr "" "pour créer le lecteur. Le \\verb|./| signifie que le répertoire \\verb|" "videos| se trouve dans le répertoire d'exportation. On peut aussi utiliser " "\\verb|../| pour indiquer que la ressource se trouve dans le répertoire " "parent." #. type: tip #: documentation.tex:506 msgid "" "Since video formats supported by Xia are not natively supported by every web " "browsers, it is recommanded to export videos into the 3 supported formats, " "and to upload them into a single folder (from there, the only difference " "between these files is their extension, ie. .ogv or .mp4 or .webm). Even if " "a particular format is indicated in the description (following the previous " "example : \\verb|videos/video.ogv|), if the browser is unable to read the " "resource, it will automatically attempt to read the files of the same name " "possessing a different extension (ie. \\verb|video.mp4| then \\verb|video." "webm|)." msgstr "" "Ainsi, même si un format particulier est renseigné dans la description (si " "l'on suit l'exemple précédent, ce serait \\verb|videos/video.ogv|), si le " "navigateur web est incapable de lire la ressource, il tentera " "automatiquement de lire les fichiers possédant le même nom mais une " "extension différente. Même si un format spécifique est renseigné dans la " "description (si l'on suit l'exemple précédent: \\verb|videos/video.ogv|), si " "le navigateur est incapable de lire la ressource, il cherchera " "automatiquement à lire les fichiers du même nom mais possédant une extension " "différente (c'est à dire, \\verb|video.mp4| et \\verb|video.webm|)." #. type: document #: documentation.tex:510 msgid "" "The last option is to insert an iframe tag. It will be interpreted and the " "reader will appear in the comment, giving access to the resource." msgstr "" "La dernière possibilité consiste à insérer un code iframe. Celui-ci sera " "interprété et le lecteur du service web apparaîtra, donnant accès à la " "ressource." #. type: subsection{#2} #: documentation.tex:512 msgid "The \"audioBrown\" template: sounds instead of text" msgstr "Le modèle «~audioBrown~»: le son à la place du texte" #. type: links #: documentation.tex:515 msgid "" "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia4}" "{interactive image} created for this section of the documentation." msgstr "" "Visualisez l'\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia4}{image " "interactive} créée pour cette partie de la documentation." #. type: links #: documentation.tex:519 msgid "" "Download the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia4/svg/xia4." "zip}{svg} source file (zip file containing the svg source file and the " "sounds)." msgstr "" "Téléchargez le fichier source au format \\href{http://xia.dane.ac-versailles." "fr/demo/tuto/xia4/svg/xia4.zip}{svg} (archive contenant le fichier source au " "format svg et les sons associés)." #. type: document #: documentation.tex:522 msgid "" "The \"audioBrown\" template is specifically dedicated to the creation of " "interactive images in which details are associated with sounds instead of " "text." msgstr "" "Le modèle «~audioBrown~» est spécifiquement dédié à la création d'images " "interactives dans lesquelles les détails sont associés à des sons plutôt " "qu'à du texte." #. type: document #: documentation.tex:532 msgid "" "The method to insert sounds using absolute or relative links is described in " "section \\ref{multimedia_enrichment}. If you wish the sound to play " "automatically as the user clicks on the comment, just add \\verb|autostart| " "right after the url \\footnote{The \"\\texttt{autostart}\" tag also works " "with the other Xia templates.}:\\\\" msgstr "" "Pour insérer des sons, vous utiliserez des liens absolus ou relatifs en " "suivant la méthode décrite dans la section \\ref{multimedia_enrichment}. Si " "vous souhaitez que le son soit joué automatiquement à la sélection du " "détail, ajoutez la balise \\verb|autostart| après l'url de la ressource " "\\footnote{La balise \\texttt{autostart} fonctionne également avec les " "autres modèles d'export de Xia.}:\\\\" #. type: center #: documentation.tex:532 msgid "\\verb|sounds/detail_1_sound.ogg autostart|" msgstr "\\verb|sons/son_detail_1.ogg autostart|" #. type: subsection{#2} #: documentation.tex:535 msgid "Inserting images into your interactive image" msgstr "Insérer des images dans votre image interactive" #. type: document #: documentation.tex:538 msgid "" "Png images can be added to the background. To do so, select \\softmenu{File $" "\\rightarrow$ Import} in Inkscape to incorporate your new image." msgstr "" "Des images au format png peuvent être ajoutées à l'image de fond. Pour faire " "cela, sélectionnez \\softmenu{Fichier $\\rightarrow$ Importer} dans Inkscape " "afin d'incorporer votre image." #. type: document #: documentation.tex:542 msgid "" "The imported image will only appear in the html5 animation if you have " "applied white background in Inkscape. Choose white in the horizontal colour " "palette at the bottom of Inkscape interface:\\\\" msgstr "" "L'image importée n'apparaîtra dans l'animation html5 qu'à une condition: que " "vous lui ayez appliqué un fond blanc dans Inkscape. Choisissez la couleur " "blanche dans la palette horizontale en bas de l'interface d'Inkscape:\\\\" #. type: document #: documentation.tex:550 msgid "" "By indicating a url in the \\softmenu{Title} of \\softmenu{Object " "properties} field, the embedded image becomes a clickable icon linking to a " "web page." msgstr "" "En indiquant une url dans le champ \\softmenu{Titre} des " "\\softmenu{Propriétés de l'objet}, cette image incorporée deviendra un lien " "cliquable." #. type: subsection{#2} #: documentation.tex:552 msgid "Displaying a question and unveiling an answer" msgstr "Faire apparaître une question et dévoiler une réponse" #. type: document #: documentation.tex:557 msgid "" "You can create clickable icon which will momentarily prevent the user to " "read the end of the comment. You can even ask the user to enter a password " "to read the end of the comment." msgstr "" "Vous pouvez créer une icône cliquable, qui empêche temporairement un " "utilisateur de lire la suite du commentaire. Vous pouvez même demander à " "l'utilisateur d'indiquer un mot de passe pour lire la suite du commentaire." #. type: document #: documentation.tex:559 msgid "" "To do so, just indicate, in the description, the tags described in figure " "\\ref{xia_answer_tags}." msgstr "" "Pour cela, utilisez dans la description les balises indiquées dans " "l'illustration \\ref{xia_answer_tags}." #. type: figure #: documentation.tex:571 msgid "" "\\tikzstyle{descrip}=[font=\\sffamily, anchor=north west, text width = " "4.3cm] \\tikzstyle{box}=[draw, text width=6cm, fill=lightgray!50, rounded " "corners, anchor=north west]" msgstr "" "\\tikzstyle{descrip}=[font=\\sffamily, anchor=north west, text width = " "4.3cm] \\tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded " "corners, anchor=north west]" #. type: tikzpicture #: documentation.tex:571 msgid "" "\\node[anchor=north west] (answer) {\\includegraphics[scale=.5]{./images/" "Description}}; \\node[descrip, below = -7mm of answer] (answerT) {[[Can I " "ask you a question? (code=12345): Yes, indeed I can.]]}; \\node[box, right = " "3.5cm of answer] (answerI) {\\includegraphics[scale=.5]{./images/" "answer_code}};" msgstr "" "\\node[anchor=north west] (answer) {\\includegraphics[scale=.5]{./images/" "Description}}; \\node[descrip, below = -7mm of answer] (answerT) {[[Puis-je " "vous poser une question? (code=12345): Bien sûr que c'est possible.]]}; " "\\node[box, right = 3.5cm of answer] (answerI) {\\includegraphics[scale=.5]" "{./images/answer_code}};" #. type: caption{#2} #: documentation.tex:571 msgid "" "Tags to insert a button which will momentarily prevent the user to read the " "end of the comment" msgstr "" "Balises permettant de créer un bouton empêchant temporairement la lecture de " "la suite du commentaire." #. type: document #: documentation.tex:577 msgid "" "Use the double brackets tag \\texttt{[[ (...) ]]} to indicate you wish to " "create the icon, split the text between the question and the answer with the " "\\texttt{:} tag, and add a code by inserting \\texttt{(code=insert" "\\_password)} just before the \\texttt{:} tag\\footnote{The " "\\texttt{(code={...})} is not mandatory. Remember that you can not insert " "the \\texttt{)} character in the password.}." msgstr "" "Utilisez la balise \\texttt{[[ (...) ]]} pour indiquer que vous souhaitez " "créer une icône, séparez le texte de la question de celui de la réponse avec " "la balise \\texttt{:}, et ajoutez un code en insérant \\texttt{(code=mot\\_de" "\\_passe)} avant la balise \\texttt{:}\\footnote{Le code n'est pas " "obligatoire. Souvenez-vous que vous pouvez utiliser tous les caractères que " "vous souhaitez dans le code, sauf le \\texttt{)}.}." #. type: subsection{#2} #: documentation.tex:579 msgid "Controlling details behavior : automatic display and disabled zoom" msgstr "" "Contrôler le comportement des détails: affichage immédiat et désactivation " "du zoom" #. type: document #: documentation.tex:587 msgid "Default behavior of details in an interactive image consists in:" msgstr "" "Par défaut, le comportement des détails d'une image interactive est le " "suivant:" #. type: itemize #: documentation.tex:587 msgid "" "highlighting details only on mouse over or with a click on the comment " "detail title" msgstr "" "mise en valeur des détails au survol de la souris ou par un clic sur son " "titre dans les commentaires" #. type: itemize #: documentation.tex:587 msgid "zoom in effect when clicking again on the active detail" msgstr "effet de zoom lors d'un second clic sur le détail actif" #. type: footnote{#2} #: documentation.tex:587 msgid "Except for the popBlue template." msgstr "Sauf dans le cas du modèle popBlue." #. type: document #: documentation.tex:597 msgid "" "Both of these default behaviors can be modified if you apply a white or " "black background to cropped details (see section \\ref{insertion_images}):" msgstr "" "Ces deux comportements par défaut peuvent être modifiés si vous appliquez un " "fond noir ou blanc aux détails détourés (voir la section " "\\ref{insertion_images}):" #. type: item[#1] #: documentation.tex:597 msgid "Detail with a white background" msgstr "Détail avec un fond blanc" #. type: description #: documentation.tex:597 msgid "" "In the generated image, details will be immediately visible as a flat area " "of opaque color, hiding the background image; once selected, it reveals the " "background (the zoom effect is still active)." msgstr "" "Dans l'image interactive, ces détails seront visibles immédiatement, sous la " "forme d'un aplat de couleur opaque, cachant l'image de fond; une fois " "sélectionné, ce fond sera visible (le zoom demeure actif)." #. type: description #: documentation.tex:597 msgid "" "[Detail with a black background] Users still have to click on the detail to " "unveil it, but the zoom effect is disabled." msgstr "" "[Détail avec un fond noir] Les utilisateurs devront cliquer pour activer le " "détail, mais l'effet de zoom est désactivé." #. type: document #: documentation.tex:600 msgid "" "Logical consequence : you can not apply a white and a black background all " "together on the same detail. A single detail can not be immediately " "displayed and have the zoom effect disabled." msgstr "" "Conséquence logique: comme un détail ne saurait avoir simultanément un fond " "noir et un fond blanc, un détail ne peut donc être à la fois immédiatement " "visible et avoir le zoom désactivé." #. type: subsection{#2} #: documentation.tex:602 msgid "Controlling order of details display in the lateral comment zone" msgstr "" "Contrôler l'ordre d'affichage des détails dans la barre latérale des " "commentaires" #. type: document #: documentation.tex:606 msgid "" "By default, in the interactive image, the details appear vertically " "following the order in which these details have been created (the first " "detail created in Inkscape corresponding to the detail placed up in the " "sidebar of the interactive image)." msgstr "" "Par défaut dans une image interactive, les détails apparaissent " "verticalement en suivant l'ordre dans lequel ils ont été créés dans Inkscape " "(le premier détail créé dans Inkscape correspond à celui placé en haut dans " "la barre latérale de l'image interactive)." #. type: document #: documentation.tex:608 msgid "" "We will work with the \\softmenu{Edit $\\rightarrow$ XML Editor} to change " "this default order." msgstr "" "Pour changer cet ordre par défaut, nous utiliserons l'\\softmenu{Éditeur " "XML}, situé dans le menu \\softmenu{Édition}." #. type: document #: documentation.tex:613 msgid "" "A priori complex to manage, this dialogue window is in fact quite easy to " "use : by selecting the input in the XML editor, the corresponding detail " "will be highlighted on the image and the only thing left to do is to drag " "the files to the desired location:\\\\" msgstr "" "A priori complexe, cette fenêtre de dialogue est en réalité assez simple à " "utiliser: en sélectionnant une entrée de l'éditeur XML, le détail " "correspondant à celle-ci sera mis en évidence sur l'image. Il ne reste plus " "qu'à glisser-déposer l'entrée à l'endroit désiré:\\\\" #. type: document #: documentation.tex:621 msgid "" "The Inkscape XML editor allows to control the display order of the details " "in the interactive image. Note the highlighting of an element in the editor " "and on the background image by a single mouse click." msgstr "" "L'éditeur XML d'Inkscape permet de contrôler l'ordre d'affichage des détails " "dans l'image interactive. Remarquez la mise en évidence d'un élément sur " "l'image de fond par simple sélection dans l'éditeur." #. type: enumerate #: documentation.tex:635 msgid "You can enrich and shaping text using tags" msgstr "" "Vous pouvez enrichir et mettre en forme le texte en utilisant des balises" #. type: enumerate #: documentation.tex:635 msgid "" "A multimedia enrichment is possible through a simple link (relative or " "absolute) to a file whose format is recognized by Xia" msgstr "" "L'enrichissement multimédia est possible par simple lien (relatif ou absolu) " "vers un fichier dont le format est reconnu par Xia" #. type: enumerate #: documentation.tex:635 msgid "" "Adding images to the background image is possible by importing them and " "applying them a white background" msgstr "" "On ajoute des images sur l'image de fond en les incorporant et en leur " "appliquant un fond blanc." #. type: enumerate #: documentation.tex:635 msgid "" "It is possible to modify the default behavior of a detail by changing its " "color background (white, black)" msgstr "" "On peut modifier le comportement par défaut des détails en leur appliquant " "une couleur de fond (blanc ou noir)" #. type: enumerate #: documentation.tex:635 msgid "" "The order of the details in the interactive image depends on the order of " "their creation in Inkscape. Nevertheless, the Inkscape XML editor allows to " "change this order" msgstr "" "L'ordre des détails de l'image interactive dépend de l'ordre de leur " "création dans Inkscape. Cependant, on peut utiliser l'éditeur XML d'Inkscape " "pour modifier cet ordre" #. type: enumerate #: documentation.tex:635 msgid "" "It is possible prevent the user to access the comments by inserting a " "clickable icon and / or a password" msgstr "" "Il est possible d'empêcher les utilisateurs d'accéder au commentaire en " "insérant une icône cliquable et / ou un mot de passe" #. type: section{#2} #: documentation.tex:639 msgid "Creating games with Xia" msgstr "Créer des jeux avec Xia" #. type: document #: documentation.tex:642 msgid "" "Until now, this document was only about creation of traditionnal " "\"interactive images\": background image enriched with cropped details " "associated with texts." msgstr "" "Jusqu'à maintenant, cette documentation n'a traité que de la création " "d'image interactive «~traditionnelle~»: une image de fond, des détails " "détourés associés à des commentaires." #. type: document #: documentation.tex:648 msgid "" "This kind of interactive image can be used in class in various situations " "(students progressively discovering a document, or creating an interactive " "image on their own), but Xia introduces new features, such as the creation " "of games and activities, in which the final user has much more to do than " "simply clicking on details in order to read the comment." msgstr "" "Ce type d'image interactive peut être utilisé en classe dans des situations " "très variées (les élèves découvrent progressivement une image, ou créent eux-" "mêmes une image interactive), mais Xia va plus loin avec de nouvelles " "fonctionnalités. On peut désormais créer des jeux, des activités, dans " "lesquelles l'utilisateur final a bien davantage à faire que de simplement " "cliquer sur des détails et lire du texte." #. \draw[help lines] (0,0) grid (5,5); #. icons #. type: tikzpicture #: documentation.tex:665 msgid "" "\\node[opacity=.5] (bBlue) {\\includegraphics[width=2cm]{./images/" "buttonBlue}}; \\node[left= .3mm of bBlue] (aBrown) " "{\\includegraphics[width=2cm]{./images/audioBrown}}; \\node[right= .3mm of " "bBlue] (guClic) {\\includegraphics[width=2cm]{./images/game1clic}}; " "\\node[below= .2mm of bBlue.south, opacity=.5] (pBlue) " "{\\includegraphics[width=2cm]{./images/popBlue}}; \\node[left= .3mm of " "pBlue] (gDDrop) {\\includegraphics[width=2cm]{./images/gameDragAndDrop}}; " "\\node[right= .3mm of pBlue, opacity=.5] (pYellow) " "{\\includegraphics[width=2cm]{./images/popYellow}}; \\node[above = .2mm of " "guClic.north, opacity=.5] (aCloud) {\\includegraphics[width=2cm]{./images/" "accordionCloud}}; \\node[above = .2mm of aCloud.north, opacity=.5] (aBlack) " "{\\includegraphics[width=2cm]{./images/accordionBlack}}; \\node[left = .3mm " "of aBlack] (params) {\\includegraphics[width=2cm]{./images/params}}; " "\\node[left = .3mm of params] (files) {\\includegraphics[width=2cm]{./images/" "xia_open}}; \\node[left = 2mm of aCloud, opacity=.3] (xialogo) " "{\\includegraphics[height=2cm]{./images/xia}};" msgstr "" "\\node[opacity=.5] (bBlue) {\\includegraphics[width=2cm]{./images/" "buttonBlue}}; \\node[left= .3mm of bBlue] (aBrown) " "{\\includegraphics[width=2cm]{./images/audioBrown}}; \\node[right= .3mm of " "bBlue] (guClic) {\\includegraphics[width=2cm]{./images/game1clic}}; " "\\node[below= .2mm of bBlue.south, opacity=.5] (pBlue) " "{\\includegraphics[width=2cm]{./images/popBlue}}; \\node[left= .3mm of " "pBlue] (gDDrop) {\\includegraphics[width=2cm]{./images/gameDragAndDrop}}; " "\\node[right= .3mm of pBlue, opacity=.5] (pYellow) " "{\\includegraphics[width=2cm]{./images/popYellow}}; \\node[above = .2mm of " "guClic.north, opacity=.5] (aCloud) {\\includegraphics[width=2cm]{./images/" "accordionCloud}}; \\node[above = .2mm of aCloud.north, opacity=.5] (aBlack) " "{\\includegraphics[width=2cm]{./images/accordionBlack}}; \\node[left = .3mm " "of aBlack] (params) {\\includegraphics[width=2cm]{./images/params}}; " "\\node[left = .3mm of params] (files) {\\includegraphics[width=2cm]{./images/" "xia_open}}; \\node[left = 2mm of aCloud, opacity=.3] (xialogo) " "{\\includegraphics[height=2cm]{./images/xia}};" #. comments #. type: tikzpicture #: documentation.tex:676 msgid "" "\\node[box, text width=2.5cm,above left = 5mm of files] (filesC) {Select the " "svg source file}; \\node[box, above = 5mm of params] (paramsC) {Define the " "options of the export (see figure \\ref{xia_export_options})}; \\node[box, " "right = 5mm of guClic] (guClicC) {\\href{http://xia.dane.ac-versailles.fr/" "demo/tuto/xia3}{game1clic}\\\\ selecting details on a background image \\\\ " "How-to in section \\ref{game1clicsection}}; \\node[box, left = 25mm of " "bBlue] (aBrownC) {\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia4}" "{audioBrown} \\\\ creation of interactive images in which details are " "associated with sounds \\\\ How-to in section \\ref{audioBrownsection}}; " "\\node[box, below left = 5mm of pBlue] (gDDropC) {\\href{http://xia.dane.ac-" "versailles.fr/demo/tuto/xia5}{gameDragAndDrop}\\\\ drag and drop graphical " "elements on the background images \\\\ How-to in section " "\\ref{gameDragAndDropsection}};" msgstr "" "\\node[box, text width=2.5cm,above left = 5mm of files] (filesC) {Sélection " "du fichier source au format svg}; \\node[box, above = 5mm of params] " "(paramsC) {Définition des options d'exportation (voir l'illustration " "\\ref{xia_export_options})}; \\node[box, right = 5mm of guClic] (guClicC) " "{\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia3}{game1clic}\\\\ " "Sélectionner des détails sur une image de fond \\\\ Tutoriel dans la " "rubrique \\ref{game1clicsection}}; \\node[box, left = 25mm of bBlue] " "(aBrownC) {\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia4}" "{audioBrown} \\\\ Création d'images interactives dans lesquelles des détails " "sont associés à des sons \\\\ Tutoriel dans la rubrique " "\\ref{audioBrownsection}}; \\node[box, below left = 5mm of pBlue] (gDDropC) " "{\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia5}{gameDragAndDrop}\\" "\\ Glisser et déposer des éléments sur l'image de fond \\\\ Tutoriel dans la " "rubrique \\ref{gameDragAndDropsection}};" #. arrows #. type: tikzpicture #: documentation.tex:683 msgid "" "\\draw[-stealth] (guClicC.west) -- (guClic.east); \\draw[-stealth] (gDDropC." "north) -- (gDDrop.south west); \\draw[-stealth] (aBrownC.east) -- (aBrown." "west); \\draw[-stealth] (filesC.south east) -- (files.north west); \\draw[-" "stealth] (paramsC.south) -- (params.north);" msgstr "" "\\draw[-stealth] (guClicC.west) -- (guClic.east); \\draw[-stealth] (gDDropC." "north) -- (gDDrop.south); \\draw[-stealth] (aBrownC.north east) -- (aBrown." "north); \\draw[-stealth] (filesC.south east) -- (files.north west); \\draw[-" "stealth] (paramsC.south) -- (params.north);" #. type: caption{#2} #: documentation.tex:688 msgid "Xia's games and multimedia templates" msgstr "Les modèles multimédias et ludiques de Xia" #. type: subsection{#2} #: documentation.tex:690 msgid "First game principle: selecting, finding elements in the image" msgstr "" "Premier principe ludique: sélectionner, trouver des éléments dans une image" #. type: document #: documentation.tex:699 msgid "" "\\textit{The game principle described in this section consists in selecting " "details on a background image. When the user has reached the goal described " "in the instructions, a message appears in a final pop up.}" msgstr "" "\\textit{Le principe ludique décrit dans cette partie de la documentation " "est le suivant: le joueur doit sélectionner des détails dans une image, " "quand il a sélectionné les éléments indiqués dans la consigne, un message de " "fin apparaît.}" #. type: links #: documentation.tex:704 msgid "" "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia3}" "{interactive image} created for this section of the documentation." msgstr "" "Visualisez l'\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia3}{image " "interactive} créée pour cette partie de la documentation." #. type: links #: documentation.tex:707 msgid "" "Download the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia3/svg/xia3." "svg}{svg} source file." msgstr "" "Téléchargez le fichier source au format \\href{http://xia.dane.ac-versailles." "fr/demo/tuto/xia3/svg/xia3.svg}{svg}." #. type: document #: documentation.tex:710 msgid "" "This kind of game is almost the easiest way to create an interactive image. " "You only have to crop the details that the final user will have to select." msgstr "" "Ce type de jeu est presque le type d'image interactive la plus facile à " "créer. Vous devez uniquement détourer les détails que le joueur devra " "sélectionner." #. type: document #: documentation.tex:717 msgid "" "The instructions must be completed in the metadata of the document. Xia will " "look into the informations filled in the \\softmenu{Description} field of " "the metadata of the document (see section \\ref{preparation_svg}: " "\\softmenu{File $\\rightarrow$ Metadata of the document}), and create an " "instruction «~pop up~» that will show up at the opening of the game. The " "player will just have to read the instructions and close the pop up to play " "the game." msgstr "" "Les consignes doivent être indiquées dans les métadonnées du document. Xia " "cherchera les informations relatives aux consignes dans le champ " "\\softmenu{Description} des métadonnées du document (voir la section " "\\ref{preparation_svg}: \\softmenu{Fichier $\\rightarrow$ Métadonnées du " "document}), et créera une pop up affichant ces consignes à l'ouverture du " "jeu. Le joueur pourra les lire, fermer la fenêtre puis jouer." #. type: document #: documentation.tex:721 msgid "" "When the user completes the game, a message automatically appears. This " "message has to be filled in the \\softmenu{Description} field of the " "\\softmenu{Object Properties} of the background image." msgstr "" "Quand un joueur termine le jeu, un message apparaît automatiquement. Ce " "message doit être renseigné dans le champ \\softmenu{Description} des " "\\softmenu{Propriétés de l'objet} de l'image de fond." #. type: document #: documentation.tex:726 msgid "" "Two informations are needed in order for this message to pop up : the exact " "number of details that have to be selected\\footnote{This number does not " "have to match the number of details on the image.} and the message itself " "(see table \\ref{tag1_sumup})." msgstr "" "Vous trouverez tous les détails sur l'endroit et la manière d'indiquer ces " "informations dans le tableau \\ref{tag1_sumup}." #. type: tabular #: documentation.tex:742 msgid "Goal" msgstr "Objectif" #. type: tabular #: documentation.tex:742 msgid "Enter the number of correct answers needed to complete the game" msgstr "" "Renseigner le nombre de réponses correctes permettant de terminer le jeu" #. type: tabular #: documentation.tex:742 msgid "Display a message" msgstr "Afficher un message" #. type: tabular #: documentation.tex:742 msgid "Tag" msgstr "Balise" #. type: tabular #: documentation.tex:742 msgid "\\texttt{}|" msgstr "\\texttt{}|" #. type: tabular #: documentation.tex:742 msgid "\\texttt{}" msgstr "\\texttt{}" #. type: tabular #: documentation.tex:742 msgid "Example" msgstr "Exemple" #. type: tabular #: documentation.tex:742 msgid "\\multicolumn{2}{|l|}{\\texttt{6}}" msgstr "\\multicolumn{2}{|l|}{\\texttt{6}}" #. type: tabular #: documentation.tex:742 msgid "\\multicolumn{2}{|l|}{\\texttt{Congratulations!}}" msgstr "\\multicolumn{2}{|l|}{\\texttt{Bravo!}}" #. type: tabular #: documentation.tex:742 msgid "\\multicolumn{2}{|l|}{\\texttt{You have completed the game!}}" msgstr "\\multicolumn{2}{|l|}{\\texttt{Vous avez terminé le jeu!}}" #. type: caption{#2} #: documentation.tex:742 msgid "Sum up of tags in a game1clic game" msgstr "Résumé des balises du jeu game1clic" #. type: tip #: documentation.tex:749 msgid "" "Text inserted inside the \\verb|| tag can be enriched. " "Images, videos or sounds can be inserted. It is also possible to insert a " "link, allowing users to play another game, in order to \"chain\" activities " "up by degree of difficulty." msgstr "" "Le texte inséré dans la balise \\verb|| peut être enrichi " "avec des images, des vidéos, du son. On peut aussi imaginer ajouter un lien " "vers un autre jeu, ce qui permettrait aux utilisateurs d'enchaîner les jeux " "par degré de difficulté." #. type: document #: documentation.tex:752 msgid "" "Once your svg source file is created, choose the template " "\\softmenu{game1clic} to generate the interactive game." msgstr "" "Une fois votre fichier svg préparé, choisir le modèle d'export " "\\softmenu{game1clic} pour générer le jeu." #. type: subsection{#2} #: documentation.tex:754 msgid "Second game principle: classyfying, ordering, ranking" msgstr "Second principe ludique: classer, organiser, hiérarchiser" #. type: document #: documentation.tex:764 msgid "" "\\textit{The second kind of game that can be created with Xia consists in " "dragging and dropping graphical elements on the background image. If all the " "elements have been dropped on their corresponding drop zone, a pop up " "message appears, confirming the achievement of the game.}" msgstr "" "Le second type de jeu pouvant être créé avec Xia est basé sur le principe du " "glisser-déposer. Des étiquettes déplaçables sont déposées sur l'image de " "fond. Quand tous les éléments ont été placés sur leur zone de dépôt, un " "message apparaît, annonçant la fin du jeu." #. type: links #: documentation.tex:768 msgid "" "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia5}" "{interactive image} created for this section of the documentation." msgstr "" "Visualisez l'\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia5}{image " "interactive} créée pour cette partie de la documentation." #. type: links #: documentation.tex:772 msgid "" "Download the \\href {http://xia.dane.ac-versailles.fr/demo/tuto/xia5/svg/" "xia5.svg}{svg} source file." msgstr "" "Téléchargez le fichier source au format \\href{http://xia.dane.ac-versailles." "fr/demo/tuto/xia5/svg/xia5.svg}{svg}." #. type: document #: documentation.tex:787 msgid "" "This is how you can create a game based on the drag and drop principle :" msgstr "Voici comment créer un jeu basé sur le principe du glisser-déposer:" #. type: enumerate #: documentation.tex:787 msgid "In Inkscape:" msgstr "Dans Inkscape:" #. type: itemize #: documentation.tex:787 msgid "Choose and import a background picture" msgstr "Choisir et importer une image de fond" #. type: itemize #: documentation.tex:787 msgid "" "Create the graphical elements the users of the interactive image will have " "to drag and drop (ie. images or group of words: see below for a how-to)" msgstr "" "Créer les éléments que les utilisateurs de votre image interactive auront à " "déplacer et à déposer (autrement dit: des images, des mots ou groupes de " "mots: voir ci-dessous les explications)" #. type: itemize #: documentation.tex:787 msgid "" "Create the instruction pop up in \\softmenu{File $\\rightarrow$ Metadata of " "the document $\\rightarrow$ Description}" msgstr "" "Créer la fenêtre surgissante de consignes en éditant les informations du " "champ \\softmenu{Fichier $\\rightarrow$ Métadonnées du document $\\rightarrow" "$ Description}" #. type: footnote{#2} #: documentation.tex:787 msgid "Exactly as in the game1clic template." msgstr "Exactement comme dans le jeu game1clic" #. type: itemize #: documentation.tex:787 msgid "" "Using metadata, make each label match its drop zone (actually being cropped " "details)" msgstr "" "En renseignant les métadonnées, faites correspondre chaque élément à une " "zone de dépôt (ces zones de dépôts étant en réalité des détails détourés)" #. type: enumerate #: documentation.tex:787 msgid "In Xia" msgstr "Dans Xia" #. type: itemize #: documentation.tex:787 msgid "" "Export the svg source file using the \\softmenu{gameDragAndDrop} template" msgstr "" "Exporter le fichier source au format svg avec le modèle " "\\softmenu{gameDragAndDrop}" #. type: document #: documentation.tex:792 msgid "" "Two methods can be used to create the drag and drop \"graphical-elements\". " "A very simple way is to use a screenshot tool, in order to create png files, " "and then import them in Inkscape. It is also possible to create these " "elements directly in Inkscape, by creating a text, grouping it with a shape, " "and finally making a bitmap copy of this group (\\softmenu{Edition $" "\\rightarrow$ Make a bitmap copy})" msgstr "" "Deux méthodes peuvent être utilisées pour créer les éléments que les joueurs " "auront à glisser et déposer. La première, très simple, consiste à utiliser " "un utilitaire de capture d'écran capable de créer des petites images au " "format png, puis d'importer celles-ci dans Inkscape. Il est également " "possible de créer ces éléments directement dans Inkscape. Par exemple, en " "créant un texte, en regroupant ce texte avec une forme puis en faisant une " "copie bitmap de cet ensemble (\\softmenu{Édition $\\rightarrow$ Créer une " "copie bitmap})." #. type: document #: documentation.tex:799 msgid "" "The graphical elements then have to be associated with their drop zone " "\\footnote{\\textbf{One} object can only match \\textbf{one} drop zone.}. In " "order to do that, make the \\softmenu{ID} field of the drop zone match the " "\\softmenu{Description} field of the drag and drop graphical element. The " "only subtlety consists in the \\verb|| tags which have to " "be filled in the \\softmenu {Description} field." msgstr "" "Les éléments à déplacer doivent être associés à leur zone de dépôt " "\\footnote{\\textbf{Un} objet ne pouvant être associé qu'à \\textbf{une} " "zone de dépôt.}. Pour faire cela, il faut «~jumeler~» les éléments à glisser-" "déposer avec leur zone de dépôt en faisant correspondre le champ " "\\softmenu{ID} de la zone de dépôt au champ \\softmenu{Description} de " "l'élément à glisser déposer. La seule subtilité tient dans la balise \\verb|" "| devant être indiquée dans la \\softmenu{Description}." #. type: document #: documentation.tex:802 msgid "" "You will find in the table \\ref{tag2_sumup} an abstract of the metadata to " "be filled in the \\softmenu{Object Properties} of the drag and drop " "graphical elements and the corresponding details in order to make them match." msgstr "" "Vous trouverez dans le tableau \\ref{tag2_sumup} un résumé des balises à " "renseigner dans les \\softmenu{Propriétés de l'objet} des éléments à " "déplacer et des zones de dépôts afin de les faire correspondre les unes aux " "autres." #. type: tabular #: documentation.tex:816 msgid "Graphical element (drag and drop objects in the game)" msgstr "Élément à déplacer (objets à glisser et déposer)" #. type: tabular #: documentation.tex:816 msgid "Cropped detail (drop zone)" msgstr "Détail détouré (zone de dépôt)" #. type: tabular #: documentation.tex:816 msgid "ID Field" msgstr "Champ ID" #. type: tabular #: documentation.tex:816 msgid "\\verb|Detail_Title|" msgstr "\\verb|Titre_du_détail|" #. type: tabular #: documentation.tex:816 msgid "Description Field" msgstr "Champ description" #. type: tabular #: documentation.tex:816 msgid "\\verb|Detail_Title|" msgstr "\\verb|Titre_du_détail|" #. type: caption{#2} #: documentation.tex:816 msgid "Sum up of tags in the gameDragAndDrop template" msgstr "Résumé des balises à utiliser dans le jeu gameDragAndDrop" #. type: document #: documentation.tex:818 documentation.tex:845 msgid "" "Once your svg source file is created, choose the template " "\\softmenu{gameDragAndDrop} to generate the interactive game." msgstr "" "Une fois votre fichier svg préparé, choisir le modèle " "\\softmenu{gameDragAndDrop} pour générer le jeu." #. type: subsection{#2} #: documentation.tex:820 msgid "Third game principle: collisions" msgstr "Troisième principe ludique: les collisions" #. type: document #: documentation.tex:824 msgid "" "\\textit{The game principle described in this section consists in moving " "objects within bounds you defined. Typically, the \"collisions\" game " "principle can be used to create mazes or gem puzzle.}" msgstr "" "\\textit{Le principe ludique documenté dans cette section est le suivant: le " "joueur doit déplacer des éléments vers des zones de dépôt, mais les " "déplacements de ces éléments ne peuvent avoir lieu que dans certaines " "limites. Le jeu de type «~collisions~» peut ainsi être utilisé pour créer " "des labyrinthes, des taquins.}" #. type: links #: documentation.tex:828 msgid "" "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia6/}" "{interactive image} created for this section of the documentation." msgstr "" "Visualisez l'\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia6}{image " "interactive} créée pour cette partie de la documentation." #. type: links #: documentation.tex:832 msgid "" "Download the \\href {http://xia.dane.ac-versailles.fr/demo/tuto/xia6/svg/" "xia6.svg}{svg} source file." msgstr "" "Téléchargez le fichier source au format \\href{http://xia.dane.ac-versailles." "fr/demo/tuto/xia6/svg/xia6.svg}{svg}." #. type: document #: documentation.tex:836 msgid "" "In order to create this kind of game, add the tag \\verb|on| to the background image. All the details will then become solid " "and will prevent objects (png imported files or bitmap copies of shapes " "created in Inkscape) from being moved through them." msgstr "" "Pour créer ce type de jeu, ajoutez la balise \\verb|on| à l'image de fond. Une fois cela fait, tous les détails " "deviennent «~solides~», et bloquent le déplacement des objets qu'il faut " "déplacer (images au format png importées, ou copie bitmap de formes " "dessinées avec Inkscape)." #. type: document #: documentation.tex:843 msgid "" "The \"collision\" game is in fact a gameDragAndDrop game, since the goal " "remains to drag one or several objects and drop them somewhere on the " "image. The requisite tags for this template are therefore the same as in " "the gameDragAndDrop template \\footnote{\\texttt{} on the " "objects, \\texttt{} and \\texttt{} on the " "background image: see section \\ref{gameDragAndDropsection}.}, but you will " "apply the \\verb|off| tag to the drop zone's " "\\softmenu{Description} field." msgstr "" "Le jeu de type «~collisions~» est en réalité un jeu de type gameDragAndDrop, " "puisque la résolution passe par le dépôt d'un ou plusieurs éléments à " "certains endroits de l'image. Les balises nécessaires dans ce type de jeu " "sont donc les mêmes que dans le jeu gameDragAndDrop " "\\footnote{\\texttt{} sur les objets, \\texttt{} et \\texttt{} sur l'image de fond: voir la " "section \\ref{gameDragAndDropsection}.}, mais il faudra penser à appliquer " "la balise \\verb|off| sur les zones de dépôts, dans " "le champ \\softmenu{Description}." #. type: subsection{#2} #: documentation.tex:847 msgid "" "\\emph{Advanced interactive games creation tips}: Magnet effect, tooltips, " "double-scoring\\ldots" msgstr "" "\\emph{Astuces pour la création de jeux interactifs}: effet aimant, " "infobulles, double compteur de score\\ldots" #. type: subsubsection{#2} #: documentation.tex:849 msgid "Showing the player's score (game1clic template)" msgstr "Montrer la progression dans le jeu (thème game1clic)" #. type: document #: documentation.tex:862 msgid "" "It is possible to display graphical elements automatically when the user " "selects the correct answer. These elements can be png imported images or " "shapes directly designed in Inkscape. But as Xia considers as a clickable " "detail any shapes designed using Inkscape tools, you will have to transform " "these shapes in bitmap, using the \"bitmap copy\" Inkscape tool. For " "example :" msgstr "" "Il est possible de faire s'afficher des éléments graphiques quand le joueur " "sélectionne une réponse correcte. Ces éléments peuvent être des png importés " "ou des formes directement dessinées dans Inkscape. Comme Xia considère " "qu'une forme dessinée avec les outils d'Inkscape est un détail, il faudra " "transformer ces formes en utilisant l'outil «~copie bitmap~». Par exemple:" #. type: enumerate #: documentation.tex:862 msgid "" "Draw a star with yellow sides on a yellow background with the Inkscape tools" msgstr "" "Dessinez une étoile aux bords jaunes et au fond jaune avec les outils de " "dessin d'Inkscape" #. type: enumerate #: documentation.tex:862 msgid "" "Select this star, and click on the \\softmenu{Edition $\\rightarrow$ Make a " "bitmap copy}" msgstr "" "Sélectionnez cette étoile, et cliquez sur \\softmenu{Édition $\\rightarrow$ " "Créer une copie bitmap}" #. type: enumerate #: documentation.tex:862 msgid "Delete the first star" msgstr "Supprimer l'étoile créée avec les outils de dessin" #. type: document #: documentation.tex:872 msgid "" "When the graphical elements are imported (png files) or created (bitmap copy " "of shapes created manually), just apply the following carasteristics to " "these elements:" msgstr "" "Une fois les éléments importés (format png) ou créés (copie bitmap des " "formes dessinées manuellement), appliquez-leurs les caractéristiques " "suivantes:" #. type: center #: documentation.tex:872 msgid "\\softmenu{Interactivity > OnClick} = \\verb|off|" msgstr "\\softmenu{Interactivité > OnClick} = \\verb|off|" #. type: document #: documentation.tex:872 msgid "" "Then, group the clickable detail to its graphical element (by successively " "clicking on the detail and the graphical element with the \\Shift keystroke " "on), then select \\softmenu{Group} in the Inkscape \\softmenu{Object} menu." msgstr "" "Ensuite, groupez le détail cliquable et son élément graphique (en cliquant " "successivement sur le détail et l'élément en maintenant la touche \\Shift " "enfoncée), puis en sélectionnant \\softmenu{Grouper} dans le menu " "\\softmenu{Objet} d'Inkscape." #. type: subsubsection{#2} #: documentation.tex:874 msgid "Showing the player's mistakes (game1clic template)" msgstr "Montrer les erreurs du joueur (thème game1clic)" #. type: document #: documentation.tex:879 msgid "" "Games based on the details selection principle are obviously very " "interesting educational games\\ldots but it is also quite obvious to guess " "how some students may be tempted to cheat to achieve such games (for " "example, by frenetically clicking everywhere on the image, until the final " "message pops up)." msgstr "" "On voit clairement l'intérêt pédagogique des jeux basés sur le principe de " "la sélection\\ldots mais on voit également rapidement comment des élèves " "peuvent être tentés de contourner le dispositif ludique pour terminer les " "jeux sans avoir à réfléchir (par exemple, en cliquant frénétiquement partout " "sur l'image, jusqu'à trouver par hasard tous les détails répondant à la " "consigne)." #. type: document #: documentation.tex:882 msgid "" "This is why it may be interesting to be able to highlight the user's " "mistakes during the game." msgstr "" "C'est la raison pour laquelle il peut être intéressant de mettre en valeur " "les erreurs commises par le joueur." #. type: document #: documentation.tex:893 msgid "" "To do so, you will anticipate the user's probable mistakes, and put explicit " "graphical elements symbolizing these errors on the background image. This " "graphical element may be an imported image (png file) or a shape directly " "designed with the Inkscape tools, then converted into bitmap (see section " "\\ref{playersscore}).. These elements will have to include the following " "caracteristics:" msgstr "" "Pour cela, il faudra prévoir les erreurs pouvant être commises, et placer " "sur l'image des éléments graphiques symbolisant l'erreur (croix rouge, " "etc.). Ces éléments pouvant être des images au format png importées ou des " "formes dessinées dans Inkscape, puis copiées en bitmap (voir la rubrique " "\\ref{playersscore}). Ces éléments devront posséder les caractéristiques " "suivantes:" #. type: center #: documentation.tex:893 msgid "\\softmenu{Interactivity > OnClick} = \\verb|disable-score|" msgstr "\\softmenu{Interactivité > OnClick} = \\verb|disable-score|" #. type: document #: documentation.tex:893 msgid "" "When applied with a \\verb|disable-score| tag, a detail still remains " "clickable, but does not add a score to the counter that delivers the final " "success message pop up." msgstr "" "Une fois la balise \\verb|disable-score| appliquée, le détail demeure " "cliquable, mais sa sélection n'ajoutera pas un point au compteur surveillant " "le score pour délivrer le message de fin." #. type: subsubsection{#2} #: documentation.tex:896 msgid "How to add a \"magnet\" effect (gameDragAndDrop template)" msgstr "Comment ajouter un effet «~aimant~» (thème gameDragAndDrop)" #. type: document #: documentation.tex:899 msgid "" "If you indicate \\verb|on| in the \\softmenu{Description} " "field of the drop zone, a magnet effect will then be active when the player " "drops the graphical element onto its matching drop zone." msgstr "" "Si vous indiquez \\verb|on| dans le champ " "\\softmenu{Description} de la zone de dépôt, un effet aimant sera activé " "quand le joueur déposera l'élément sur celle-ci." #. type: subsubsection{#2} #: documentation.tex:901 msgid "Links on drop zones (gameDragAndDrop template)" msgstr "Liens sur les zones de dépôt (thème gameDragAndDrop)" #. type: document #: documentation.tex:905 msgid "" "You can insert links in the \\softmenu{Title} field of the \\softmenu{Object " "Properties} of the drop zones. The user can then open the link by clicking " "on it or by dropping its corresponding detail on it." msgstr "" "Vous pouvez insérer un lien dans le champ \\softmenu{Titre} des " "\\softmenu{Propriétés de l'objet} de la zone de dépôt. L'utilisateur peut " "cliquer sur cette zone ou y déposer l'étiquette correspondante pour suivre " "le lien." #. type: subsubsection{#2} #: documentation.tex:908 msgid "Tooltips (game1clic and gameDragAndDrop templates)" msgstr "Infobulles (thèmes game1clic et gameDragAndDrop)" #. type: links #: documentation.tex:912 msgid "" "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia7}" "{interactive image} created for this section of the documentation." msgstr "" "Visualisez l'\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia7}{image " "interactive} créée pour cette partie de la documentation." #. type: links #: documentation.tex:915 msgid "" "Download the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia7/svg/xia7." "svg}{svg} source file." msgstr "" "Téléchargez le fichier source au format \\href{http://xia.dane.ac-versailles." "fr/demo/tuto/xia7/svg/xia7.svg}{svg}." #. type: document #: documentation.tex:925 msgid "" "It is possible to display tooltips of details on mouse-over. To do so, " "create the tooltip with a png imported file or a bitmap copy (see section " "\\ref{playersscore}) of a text created in Inkscape\\footnote{Or a bitmap " "copy of a shape grouped with some text\\ldots}, and apply to this tooltip a " "specific \\softmenu{ID} in its \\softmenu{Object Properties}. Then, just " "apply the tag \\verb|specific_ID_of_the_tooltip| in the " "\\softmenu{Description} field of the \\softmenu{Object Properties} of the " "detail that is supposed to make the tooltip appear (for example, in the " "image below: on mouse-over, the yellow square makes the tooltip ``Test'' " "appear):\\\\" msgstr "" "Il est possible de faire s'afficher des infobulles lorsque la souris survole " "certains détails. Pour cela, créez l'infobulle avec une image au format png " "importée ou une copie bitmap (voir rubrique \\ref{playersscore}) d'un texte " "créé dans Inkscape\\footnote{Ou une copie bitmap d'une forme groupée avec du " "texte\\ldots}, et appliquez à cette infobulle une \\softmenu{ID} spéicifique " "dans les \\softmenu{Propriétés de l'objet}. Ensuite, indiquez la balise " "\\verb|ID_de_l_infobulle| dans le champ " "\\softmenu{Description} des \\softmenu{Propriétés de l'objet} du détail " "censé déclencher l'apparition de l'infobulle (par exemple, dans l'image ci-" "dessous: au survol de la souris, le carré jaune fait apparaître l'infobulle " "\"Test\"):\\\\" #. type: document #: documentation.tex:932 msgid "" "Note that the tooltip tool is available in the game1clic and in the " "gameDragAndDrop templates.\\\\" msgstr "" "Notez que cette fonctionnalité est également disponible avec les thèmes " "game1clic et gameDragAndDrop.\\\\" #. type: subsubsection{#2} #: documentation.tex:935 msgid "Double scoring (game1clic and gameDragAndDrop templates)" msgstr "Double compteur de score (thèmes game1clic et gameDragAndDrop)" #. type: document #: documentation.tex:944 msgid "" "If you indicate \\verb|score2| in the \\softmenu{onclick} field " "(\\softmenu{Object Properties $\\rightarrow$ Interactivity}) of the detail, " "and if you use \\texttt{} and \\texttt{} in the \\softmenu{Object Properties} of the background image, you " "create a double scoring game. In this kind of game, the user can select two " "different categories of details, two messages can pop up at the end, " "depending on the category and number of details the user has selected." msgstr "" "En indiquant \\verb|score2| dans le champ \\softmenu{onclick} " "(\\softmenu{Propriétés de l'objet $\\rightarrow$ Interactivité}) du détail, " "et en utilisant les balises\\\\\n" "\\texttt{} et \\texttt{} dans les " "\\softmenu{Propriétés de l'objet} de l'image de fond, on peut créer un " "système de double comptage des points, dans lequel l'utilisateur peut " "sélectionner deux types de détails différents." #. type: document #: documentation.tex:952 msgid "" "For example, you can create a game with 3 details tagged with " "\\texttt{score2} (corresponding to mistakes), and indicate in the " "\\softmenu{Object Properties} of the background image:\\\\ " "\\texttt{4\\\\ Hurray!\\\\ 3\\\\ Three mistakes... that is a bit too much... " "Concentrate more and do it again}\\\\" msgstr "" "Ainsi, vous pouvez créer un jeu où 3 détails comportent la balise " "\\texttt{score2} (cette balise correspondant à des erreurs), et indiquez " "dans les \\softmenu{Propriétés de l'objet} de l'image de fond:\\\\ " "\\texttt{4\\\\ Bravo!\\\\ 3\\\\ 3 erreurs... Ça fait beaucoup...\\\\\n" "Concentrez-vous et recommencez!...}\\\\" #. type: document #: documentation.tex:957 msgid "" "These tables sum up the tags that have to be indicated when a game is " "created:" msgstr "" "Ces tableaux résument les balises pouvant être utilisées dans le cadre de la " "création de jeux avec Xia:" #. type: tabular #: documentation.tex:1019 msgid "\\multicolumn{3}{|l|}{\\softmenu{game1clic} template}" msgstr "\\multicolumn{3}{|l|}{Modèle \\softmenu{game1clic}}" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "\\multicolumn{3}{|l|}{\\texttt{}}" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\emph{Role}" msgstr "\\emph{Rôle}" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "" "Sets the amount of correct answers needed to pop up the end message of the " "game" msgstr "" "Permet de régler le nombre de bonnes réponses nécessaires pour faire " "apparaître le message de fin du jeu" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\emph{Element}" msgstr "\\emph{Élément}" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "Background picture" msgstr "Image de fond" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\emph{Where ?}" msgstr "\\emph{Où?}" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\softmenu{Object properties $\\rightarrow$ Description}" msgstr "\\softmenu{Propriétés de l'objet $\\rightarrow$ Description}" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\emph{What ?}" msgstr "\\emph{Quoi?}" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "A number corresponding to the required score" msgstr "Le nombre de bonnes réponses nécessaires à la résolution du jeu" #. type: tabular #: documentation.tex:1019 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "\\multicolumn{3}{|l|}{\\texttt{} }" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "Pops up the end message of the game" msgstr "Fait apparaître le message de fin du jeu" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "" "A personalized message if necessary enriched with multimedia or html links" msgstr "" "Message que vous pouvez enrichir avec des ressources multimédias ou un lien " "hypertexte" #. type: tabular #: documentation.tex:1019 msgid "\\multicolumn{3}{|l|}{\\texttt{off}}" msgstr "\\multicolumn{3}{|l|}{\\texttt{off}}" #. type: tabular #: documentation.tex:1019 msgid "Makes a cropped detail unclickable" msgstr "Rend un détail insensible au clic" #. type: tabular #: documentation.tex:1019 msgid "Detail" msgstr "Détail" #. type: tabular #: documentation.tex:1019 msgid "" "\\softmenu{Object properties $\\rightarrow$ Interactivity $\\rightarrow$ " "Onclick}" msgstr "" "\\softmenu{Propriétés de l'objet $\\rightarrow$ Interactivité $\\rightarrow$ " "Onclick}" #. type: tabular #: documentation.tex:1019 msgid "\\multicolumn{3}{|l|}{\\texttt{disable-score}}" msgstr "\\multicolumn{3}{|l|}{\\texttt{disable-score}}" #. type: tabular #: documentation.tex:1019 msgid "" "Makes a cropped detail clickable, but when clicked, does not add a point to " "the score game counter" msgstr "" "Rend un détail détouré cliquable, mais sa sélection n'ajoutera pas de point " "au compteur de score" #. type: tabular #: documentation.tex:1019 msgid "\\multicolumn{3}{|l|}{\\texttt{score2}}" msgstr "\\multicolumn{3}{|l|}{\\texttt{score2}}" #. type: tabular #: documentation.tex:1019 msgid "Makes a detail add a score to the score2 counter" msgstr "Ajoute un point au deuxième compteur de score" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "\\multicolumn{3}{|l|}{\\texttt{}}" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "Displays a tooltip when moused-over" msgstr "Affiche une infobulle au survol de la souris" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "Make sure to match the ID of the element used as tooltip" msgstr "" "Assurez-vous que ce champ est identique à l'ID de l'élément servant " "d'infobulle" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "\\multicolumn{3}{|l|}{\\texttt{}}" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "" "Sets the amount of correct answers needed to pop up the second end message " "in a double scoring game" msgstr "" "Régler le nombre de bonnes réponses nécessaires à l'apparition du second " "message (jeu à double score)" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "\\multicolumn{3}{|l|}{\\texttt{}}" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "Pops up the second end message in a double scoring game" msgstr "Fait apparaître le second message de fin du jeu (jeu à double score)" #. type: caption{#2} #: documentation.tex:1019 msgid "Complete game1clic tags" msgstr "Balises à insérer pour un jeu de type game1clic" #. type: tabular #: documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\softmenu{gameDragAndDrop} template}" msgstr "\\multicolumn{3}{|l|}{Modèle \\softmenu{gameDragAndDrop}}" #. type: tabular #: documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{} }" msgstr "\\multicolumn{3}{|l|}{\\texttt{} }" #. type: tabular #: documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "\\multicolumn{3}{|l|}{\\texttt{}}" #. type: tabular #: documentation.tex:1088 msgid "Indicates the corresponding drag and drop element and drop zone" msgstr "" "Indique la correspondance entre l'élément à déplacer et la zone de dépôt" #. type: tabular #: documentation.tex:1088 msgid "Graphical element to move" msgstr "Élément à déplacer" #. type: tabular #: documentation.tex:1088 msgid "\\softmenu{Object Properties $\\rightarrow$ Description}" msgstr "\\softmenu{Propriétés de l'objet $\\rightarrow$ Description}" #. type: tabular #: documentation.tex:1088 msgid "Make sure to match the ID field of the drop zone" msgstr "Assurez-vous que ce champ est identique à l'ID de la zone de dépôt" #. type: tabular #: documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{on}}" msgstr "\\multicolumn{3}{|l|}{\\texttt{on}}" #. type: tabular #: documentation.tex:1088 msgid "Adds a \"magnet\" effect" msgstr "Ajoute un effet «~aimant~»" #. type: tabular #: documentation.tex:1088 msgid "Drop zone" msgstr "Zone de dépôt" #. type: tabular #: documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{on}}" msgstr "\\multicolumn{3}{|l|}{\\texttt{on}}" #. type: tabular #: documentation.tex:1088 msgid "Activates the \"collisions\" game principle" msgstr "Active le jeu de type \"collisions\"" #. type: tabular #: documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{off}}" msgstr "\\multicolumn{3}{|l|}{\\texttt{off}}" #. type: tabular #: documentation.tex:1088 msgid "Creates a drop zone in a \"collisions\" game" msgstr "Crée une zone de dépôt dans un jeu de type \"collisions\"" #. type: tabular #: documentation.tex:1088 msgid "Drop zone, Graphical element to move" msgstr "Zone de dépôt, éléments à déplacer" #. type: caption{#2} #: documentation.tex:1088 msgid "Complete gameDragAndDrop tags" msgstr "Balises à insérer en vue d'un export gameDragAndDrop" #. type: section{#2} #: documentation.tex:1090 msgid "Frequently asked questions and Inkscape tips" msgstr "Foire aux questions et trucs et astuces pour le logiciel Inkscape" #. type: subsection{#2} #: documentation.tex:1092 #, fuzzy #| msgid "Xia FAQ" msgid "FAQ" msgstr "Foire aux questions" #. type: document #: documentation.tex:1096 msgid "" "\\textbf{I can not see the Xia extension in Inkscape. Why is that?}\\\\ $" "\\rightarrow$ Have you installed Inkscape first? If not, you have to re-" "install Xia. If you use the portable version, Xia does not appear in the " "extension menu." msgstr "" "\\textbf{Je ne vois pas Xia dans le menu extensions d'Inkscape. Pourquoi?}\\" "\\ $\\rightarrow$ Avez-vous installé Inkscape avant Xia? Si ce n'est pas le " "cas, ré-installez Xia. Si vous utilisez la version portable de Xia, le fait " "que rien n'apparaisse dans le menu extension est tout à fait normal." #. type: document #: documentation.tex:1103 msgid "" "\\textbf{The \"source file\" icon does not appear when I launch Xia from the " "extension menu of Inkscape. Why?}\\\\ $\\rightarrow$ When you launch Xia as " "an Inkscape extension, there is no \"Source File\" button, since Xia assumes " "you want to create the html5 animation from the image you are working on in " "Inkscape. Just choose the exportation options and the template." msgstr "" "\\textbf{L'icône «~Fichier source~» n'apparaît pas quand je lance Xia depuis " "le menu extension d'Inkscape. Pourquoi?}\\\\ $\\rightarrow$ En lançant Xia " "depuis les extensions d'Inkscape, il n'y a pas d'icône «~Fichier source~», " "puisque Xia considère que l'animation html5 que vous souhaitez générer est " "celle sur laquelle vous travaillez dans Inkscape... Choisissez donc " "uniquement les options d'exportation et le modèle." #. type: document #: documentation.tex:1109 msgid "" "\\textbf{I have installed Xia but I can not find it. How can I launch it?}\\" "\\ $\\rightarrow$ Xia can be found in the \"Applications\" of Mac OS X. On " "a GNU/Linux system, the Xia package is called \"xia-converter\". In " "Windows, Xia is only an Inkscape extension. If you wish to launch Xia " "outside of Inkscape, use the portable version." msgstr "" "\\textbf{J'ai installé Inkscape mais je ne le retrouve pas dans mes " "programmes. Où se cache-t-il?}\\\\ $\\rightarrow$ Xia se trouve dans le " "dossier des «~Applications~» de Mac OS X. Sur un sytème GNU/Linux, le " "paquet Xia porte le nom «~xia-converter~». Sur Windows, Xia ne fonctionne " "que comme extension d'Inkscape. Si vous souhaitez utiliser le logiciel seul, " "utilisez la version portable." #. type: document #: documentation.tex:1116 msgid "" "\\textbf{I have added some text on my image with the Inkscape text tool " "(\"Create and Edit text objects\"), but it does not appear on my interactive " "image. Why?}\\\\ $\\rightarrow$ Unless you make a bitmap copy of the text, " "Xia will consider the text created with the \"Create and Edit text Objects\" " "as a detail, and not an image." msgstr "" "\\textbf{J'ai ajouté du texte sur mon image avec l'outil «~Créer et éditer " "des objets textes~», mais je ne le vois pas apparaître dans mon image " "interactive. Pourquoi?}\\\\ $\\rightarrow$ Si vous ne faites pas de copie " "bitmap du texte, Xia considèrera que le texte créé avec l'outil «~Créer et " "éditer des objets textes~» est un détail, et pas une image à affichier." #. type: subsection{#2} #: documentation.tex:1118 msgid "Inkscape tips" msgstr "Astuces Inkscape" #. type: itemize #: documentation.tex:1140 msgid "" "Don't hesitate to fill your details with different colors. The details will " "be easier to select and modify, and it will not have any consequences on the " "html5 animation (unless you choose black or white as filling colors)" msgstr "" "Ajoutez des couleurs de fond à vos détails. Les détails seront ainsi plus " "faciles à sélectionner et modifier, et cela n'aura aucune conséquence sur " "l'animation html5 (sauf si vous choisissez le blanc ou le noir comme couleur " "de remplissage)." #. type: itemize #: documentation.tex:1140 msgid "" "If you want to create one detail out of several, you can \"Group\" them " "(\\softmenu{Object} $\\rightarrow$ \\softmenu{Group}, or \\Ctrl + " "\\keystroke{G}) or \"unify\" them (\\softmenu{Path} $\\rightarrow$ " "\\softmenu{Union}, or \\Ctrl + \\keystroke{+})." msgstr "" "Si vous voulez créer un détail à partir de plusieurs, vous pouvez les " "«~Grouper~» (\\softmenu{Objet} $\\rightarrow$ \\softmenu{Grouper}, ou \\Ctrl " "+ \\keystroke{G}) ou les «~Unir~» (\\softmenu{Chemin} $\\rightarrow$ " "\\softmenu{Union}, or \\Ctrl + \\keystroke{+})." #. type: itemize #: documentation.tex:1140 msgid "" "Once a detail is created, it is always possible to modify it: you can add or " "remove nodes, move them, etc. Just double-click on the detail, and use the " "modifying tools:\\\\" msgstr "" "Quand un détail est créé, il est toujours possible de les modifier: ajout ou " "suppression de nœuds, déplacement, etc. Il suffit de double-cliquer sur un " "détail et d'utiliser les outils de modification:\\\\" #. type: itemize #: documentation.tex:1140 msgid "Some keyboard shortcuts are real time savers!" msgstr "Certains raccourcis claviers vous feront gagner énormément de temps!" #. type: fbox{#1} #: documentation.tex:1140 msgid "\\Shift + \\Ctrl + \\keystroke{a}" msgstr "\\Shift + \\Ctrl + \\keystroke{a}" #. type: enumerate #: documentation.tex:1140 msgid "to access the \\softmenu{Alignment and Distribution} tools" msgstr "pour accéder aux outils d'\\softmenu{Alignement et de distribution}" #. type: fbox{#1} #: documentation.tex:1140 msgid "\\Shift + \\Ctrl + \\keystroke{o}" msgstr "\\Shift + \\Ctrl + \\keystroke{o}" #. type: enumerate #: documentation.tex:1140 msgid "to access the \\softmenu{Object Properties}" msgstr "pour accéder aux \\softmenu{Propriétés de l'objet}" #. type: fbox{#1} #: documentation.tex:1140 msgid "\\Alt + \\keystroke{b}" msgstr "\\Alt + \\keystroke{b}" #. type: enumerate #: documentation.tex:1140 msgid "to create a bitmap copy of a shape designed in Inkscape" msgstr "pour créer une copie bitmap d'une forme dessinée dans Inkscape" #. type: enumerate #: documentation.tex:1140 msgid "" "\\fbox{\\Ctrl + \\keystroke{g}} to group different objects or details and " "\\fbox{\\Ctrl + \\Shift + \\keystroke{g}} to ungroup them" msgstr "" "\\fbox{\\Ctrl + \\keystroke{g}} pour grouper différents objets ou détails et " "\\fbox{\\Ctrl + \\Shift + \\keystroke{g}} pour les dégrouper" #. type: document #: documentation.tex:1143 msgid "\\listoffigures \\listoftables" msgstr "\\listoffigures \\listoftables" #~ msgid "{r}{45mm}" #~ msgstr "{r}{45mm}" #~ msgid "" #~ "Since video formats supported by Xia are not natively supported by every " #~ "web browsers, it is recommanded to export videos into the 3 supported " #~ "formats, and to upload them into a single folder (from there, the only " #~ "difference between these files is their extension (ie. .ogv or .mp4 or ." #~ "webm).\\\\" #~ msgstr "" #~ "Tous les formats vidéos supportés par Xia ne sont cependant pas supportés " #~ "nativement par tous les navigateurs web. Il est recommandé d'exporter les " #~ "vidéos dans les 3 formats supportés par Xia, et de les déposer dans un " #~ "seul et même répertoire (la seule différence entre ces trois vidéos étant " #~ "donc leur extension).\\\\" #~ msgid "" #~ "\\emph{Advanced interactive image creation tips\\ldots} Showing the " #~ "player's score" #~ msgstr "" #~ "\\emph{Astuces pour la création d'image interactive «~avancée~»\\ldots} " #~ "Montrer la progression du joueur" #~ msgid "" #~ "\\emph{Advanced interactive image creation tips\\ldots} Showing the " #~ "player's mistakes" #~ msgstr "" #~ "\\emph{Astuces pour la création d'image interactive «~avancée~»\\ldots} " #~ "Mettre en évidence les erreurs du joueur" #~ msgid "" #~ "Two ways to give the players a little help: tooltips and links on drop " #~ "zones" #~ msgstr "" #~ "Deux façons de donner des indices aux joueurs: les infobulles et les " #~ "liens sur les zones de dépôt" #~ msgid "\\def\\purpledane{violet}" #~ msgstr "\\def\\purpledane{violet}" #~ msgid "" #~ "pdftitle={Xia}, pdfauthor={Énuma Logiciel Libre}, pdfsubject={Xia}, " #~ "pdfkeywords={Xia, logiciel libre, html5, Inkscape}, colorlinks= true, " #~ "linkcolor = greendane, urlcolor = bluedane" #~ msgstr "" #~ "pdftitle={Xia}, pdfauthor={Énuma Logiciel Libre}, pdfsubject={Xia}, " #~ "pdfkeywords={Xia, logiciel libre, html5, Inkscape}, colorlinks= true, " #~ "linkcolor = greendane, urlcolor = bluedane" #~ msgid "\\texttt{\\textcolor{reddebian}{#1}}" #~ msgstr "\\texttt{\\textcolor{reddebian}{#1}}" #~ msgid "\\textdbend" #~ msgstr "\\textdbend" #~ msgid "\\node{\\virageDanger};" #~ msgstr "\\node{\\virageDanger};" #~ msgid "" #~ "\\tikzstyle{boitealerte}=[draw=red,rounded corners,inner xsep=1em,inner " #~ "ysep=1ex]" #~ msgstr "" #~ "\\tikzstyle{boitealerte}=[draw=red,rounded corners,inner xsep=1em,inner " #~ "ysep=1ex]" #~ msgid "\\tikzstyle{boulealerte}=[circle,ball color=red,text=white]" #~ msgstr "\\tikzstyle{boulealerte}=[circle,ball color=red,text=white]" #~ msgid "{\\boiteBrouillon}" #~ msgstr "{\\boiteBrouillon}" #~ msgid "" #~ "\\node [boitealerte] (cadre) " #~ "{\\hspace{0.5\\LargeurBouleAlerte}\\usebox{\\boiteBrouillon}};\\node " #~ "[boulealerte] (alerte) at (cadre.west) {\\virageDanger};" #~ msgstr "" #~ "\\node [boitealerte] (cadre) " #~ "{\\hspace{0.5\\LargeurBouleAlerte}\\usebox{\\boiteBrouillon}};\\node " #~ "[boulealerte] (alerte) at (cadre.west) {\\virageDanger};" #~ msgid "\\large\\leftthumbsup" #~ msgstr "\\large\\leftthumbsup" #~ msgid "\\node{\\pouceOK};" #~ msgstr "\\node{\\pouceOK};" #~ msgid "\\tikzstyle{bouleastuce}=[circle,ball color=teal,text=white]" #~ msgstr "\\tikzstyle{bouleastuce}=[circle,ball color=teal,text=white]" #~ msgid "" #~ "\\tikzstyle{boiteastuce}=[draw=teal,rounded corners,inner xsep=1em,inner " #~ "ysep=1ex]" #~ msgstr "" #~ "\\tikzstyle{boiteastuce}=[draw=teal,rounded corners,inner xsep=1em,inner " #~ "ysep=1ex]" #~ msgid "" #~ "\\node [boiteastuce] (cadre) " #~ "{\\hspace{0.5\\LargeurBouleAstuce}\\usebox{\\boiteBrouillon}};\\node " #~ "[bouleastuce] (astuce) at (cadre.west) {\\pouceOK};" #~ msgstr "" #~ "\\node [boiteastuce] (cadre) " #~ "{\\hspace{0.5\\LargeurBouleAstuce}\\usebox{\\boiteBrouillon}};\\node " #~ "[bouleastuce] (astuce) at (cadre.west) {\\pouceOK};" #~ msgid "\\large\\leftpointright" #~ msgstr "\\large\\leftpointright" #~ msgid "\\node{\\mainDroite};" #~ msgstr "\\node{\\mainDroite};" #~ msgid "\\tikzstyle{boulelinks}=[circle,ball color=\\purpledane,text=white]" #~ msgstr "\\tikzstyle{boulelinks}=[circle,ball color=\\purpledane,text=white]" #~ msgid "" #~ "\\tikzstyle{boitelinks}=[draw=\\purpledane,rounded corners,inner xsep=1em," #~ "inner ysep=1ex]" #~ msgstr "" #~ "\\tikzstyle{boitelinks}=[draw=\\purpledane,rounded corners,inner xsep=1em," #~ "inner ysep=1ex]" #~ msgid "" #~ "\\node [boitelinks] (cadre) " #~ "{\\hspace{0.5\\LargeurBouleLinks}\\usebox{\\boiteBrouillon}};\\node " #~ "[boulelinks] (links) at (cadre.west) {\\mainDroite};" #~ msgstr "" #~ "\\node [boitelinks] (cadre) " #~ "{\\hspace{0.5\\LargeurBouleLinks}\\usebox{\\boiteBrouillon}};\\node " #~ "[boulelinks] (links) at (cadre.west) {\\mainDroite};" #~ msgid "How do metadata display in the html5 animation" #~ msgstr "Affichage des métadonnées dans l'animation html5" #~ msgid "" #~ "You can access to the \\chemin{Object properties} (see illustration " #~ "\\ref{objet_properties}) by right-clicking on the cut-out detail. Thus " #~ "you also access to the dialog window in which you add the text to be " #~ "associated with the detail in the interactive image." #~ msgstr "" #~ "Vous pouvez accéder aux \\chemin{Propriétés de l'objet} (voir " #~ "l'illustration \\ref{objet_properties}) par un clic-droit sur le détail " #~ "détouré. À partir de là, vous accédez à une fenêtre de dialogue vous " #~ "permettant d'ajouter le texte qui sera associé au détail dans l'image " #~ "interactive." #~ msgid "The \"Object Properties\" of the detail in Inkscape" #~ msgstr "«~Propriétés de l'objet~» du détail détouré" #~ msgid "" #~ "The \"\\chemin{Object properties}\" allows to enter the text that will " #~ "become a comment on the detail in the interactive image" #~ msgstr "" #~ "Les \\chemin{Propriétés de l'objet} permettent de renseigner le texte qui " #~ "deviendra le commentaire du détail dans l'image interactive" #~ msgid "" #~ "The imported image will only appear in the html5 animation if you have " #~ "applied white background in Inkscape. Choose white in the horizontal " #~ "colour palette at the bottom of Inkscape interface (see figure " #~ "\\ref{remplissage_blanc})." #~ msgstr "" #~ "L'image importée n'apparaîtra dans l'animation html5 qu'à une condition: " #~ "que vous lui ayez appliqué un fond blanc dans Inkscape. Choisissez la " #~ "couleur blanche dans la palette horizontale en bas de l'interface " #~ "d'Inkscape (voir l'illustration \\ref{remplissage_blanc})." #~ msgid "How to apply a white background to the details" #~ msgstr "Appliquer un fond blanc aux détails" #~ msgid "" #~ "In Inkscape, select the embedded png then apply a white background by " #~ "selecting the color from the horizontal colour palette to make it " #~ "automatically visible." #~ msgstr "" #~ "Dans Inkscape, sélectionnez le png incorporé et appliquez-lui un fond " #~ "blanc en sélectionnant cette couleur dans la palette horizontale, afin de " #~ "le rendre visible une fois l'image interactive générée." #~ msgid "The Inkscape XML Editor and the display order of the details" #~ msgstr "L'éditeur XML et l'ordre d'affichage des détails" #~ msgid "Tooltip" #~ msgstr "Infobulles" #~ msgid "" #~ "When the user moves the mouse over the yellow square, the tooltip \"Test" #~ "\" displays" #~ msgstr "" #~ "Lorsque la souris survole le carré jaune, une infobulle «~Test~» apparaît" #~ msgid "" #~ "Two messages can pop up, depending on the category of details the user " #~ "will select." #~ msgstr "" #~ "Deux messages de fin peuvent donc apparaître, en fonction des types de " #~ "détails sélectionnés." #~ msgid "Sum up of tags" #~ msgstr "Résumé des balises à utiliser" #~ msgid "" #~ "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia3}" #~ "{\"image- active\"} created for this section of the documentation." #~ msgstr "" #~ "Visualisez l'\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia3}" #~ "{\"image-active\"} créée pour cette partie de la documentation." #~ msgid "" #~ "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia5}" #~ "{image- active created for this section of the documentation}." #~ msgstr "" #~ "Visualisez l'\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia5}" #~ "{\"image-active\"} créée pour cette partie de la documentation." #~ msgid "toto" #~ msgstr "tata" #~ msgid "in order to create the player." #~ msgstr "pour créer le lecteur multimédia." #~ msgid "" #~ "To do so, just indicate, in the description, the line\\\\ \\verb|Answer:| " #~ "or \\verb|answer:| followed by the text you wish to be shown." #~ msgstr "" #~ "Pour fair cela, indiquez simplement dans la description, sur une ligne\\" #~ "\\ \\verb|Réponse:| ou \\verb|réponse:|, suivi du texte qui sera dévoilé." images-actives-html5.git/doc/images/000077500000000000000000000000001250410645000175775ustar00rootroot00000000000000images-actives-html5.git/doc/images/Description.png000066400000000000000000000036621250410645000225770ustar00rootroot00000000000000PNG  IHDR=ZsBIT|dtEXtSoftwaregnome-screenshot>DIDATx{PT]֕Aeh( tl5 iZtLW|c46>aEk6t:cN&u : n@7<7˭sϞ{.8{QVV7M4_ΤI A7@D:7XJ!#"RȈ2"b)XJ!#"RȈV0ɧ_AN536v w1`@ZtHf[[=|ÿOfF..Z̭۷;=|~*eYUCB&{wzt2U <Q}zѮufr%:DeaOc2׬bzٷwjMQ̟3hN9K\nHINb!pENSSSCAڔ4x&h6e*Ə?1Y<m|5ۼ F?55*ɢ"wJa3 mTΝ?[O|wVt7%!0lPLӤN'(|52ƶ\ X$:mĬ:*j/_ԵqKuu^}b1 4q:ܚo4p~_doeK޸c98e\\.99s3v2cY3"ve…ϡc:WEyB z]8@jrjemwC?c O ^"9)i/t޽ŀ Հ1(wݻ.~o%$%$$)wk#hT>,.~w{l v膀_;菵..fiDFF21۰gRv&%>dQ4;ǹ'n8䡡CY~=/\j']S<WKJؚÏ!6[á?*`fо]taǓJJ=<1qB`$"-됿{ 0pƒBȲկ޾WE 8p SS|Ļ|VReʒf^%ww>?߰ f#%i$+. \mˆ[s~ͳLͬ,bcXj% sݝό9l(fD_~?1_y쒈XJ!#"RȈ:Hkw4K)dDR BFD,Ofw_pi;e\G7?]}74>mwqwC;+ZYӸ|[禥pv{M\!m?j4'hl;64_Gv\,Hu=AUH'针XJ!#"RȈ2"b)XJ!#"RȈ2"b)XJ!#" )d= $" dDRɈ4K)dDRLGJ#BFD,%F2"bB^"."-HFD,v:F~ER.4]KuꒈHKŸ.y&iɈ$"҅_[£IENDB`images-actives-html5.git/doc/images/accordionBlack.png000066400000000000000000000064641250410645000232150ustar00rootroot00000000000000PNG  IHDRK~PLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@BBBCCCDDDEEEFFFGGGHHHIIIJJJLLLMMMPPPRRRSSSUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaacccdddeeefffgggjjjkkklllmmmpppqqq*bKGDH pHYs  tIME3x>tEXtCommentCreated with GIMPW IDATx͜c۶aɶ.oID$IG{k6v8:ge.뒶6s ޒRˊ^\9C(|\!IvM+f_#:!eIX!Eݳp w9`%$K+ks c3%;`] ?d_YCV(!Oz%a`*!MB6,d\A SPJJ8^#TYPDus%N]v^>/+u`<^EY#+o.DV退IJD 2Ms9z' ]˘'KtHRW'>]K! =$ ¶:RuM'3^bs +2lqudwfX󹍁iyUz-jh*RHyV-v6$WbT<+_ф"0ɮ|qnW +{;s&-6| ZD[?8@pakn$TiL +TtZR5 S@.B`Z^v#vڍ q*XZW۱ä}Xٳ?Y|CܡIvİv׵Kĺc+e"XXfdn{9sS t2Օqpo>@~X74l&&Ttn?ѷZ@.^I,,Q"6}]-2}]1EV~lD#}}-Xbrh~.+ʜұbz}]"֔wtj CGykMZ>(v&ڢ֙Y[TisJ09AVk0mfֶZ[[Yd]sjg3z=B6:Q*0MYx@yXNXXR XX>/[}"6;F| b^U|3 >?Xыd,}=SZ ÃCbP= ׌iEQQe95~Gչ]~]@'BQEUS~ V VwU̖*aޗk͋z#rxG^^uP#ʣz*(_VkGL^^9X[TftYJCxTF;{r~by .ŗ8@i!4*=T>sxؓ Vh[;fO<,*+<]XG.Vʲ0>Qj2XA((_ib' ΅[NLAnd*?H`o&XAݢ8Lʭ|*?F`ߩyAWp Vr6AdD”>#)S0婬1BuS {",).wJ@M74anq>#*ytb!xX#?;X8ˋ%JԼ&Aܵ7nW}w RaS{ONOpl+[fQ* 3N ~AEk3JPFF|H\}#CK-^$P OuBp,zke/?Wt_ Tw+rgg򙳵l|זj"PQ9X[\&Յv'5 S 3@J 5b9pdJ)o\&鱲ԘJ5YZIIENDB`images-actives-html5.git/doc/images/accordionCloud.png000066400000000000000000000124251250410645000232410ustar00rootroot00000000000000PNG  IHDR<qsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxMuJJֆ`֫_s!Cr}s9DA| `1KD'@|1A-y%hUV3Ub7MN3vbWaX|E#'m˩9*˩9*˩9*˩9*˩9*˩9*˩9*˩9*˩9*˩9*˩9*˩9*˩9*n Z'\bAU cMY`\Lz:THΓKrz(f,_ =G"pѡ•*KIvo>N'!b'sީ b8 w'wTm0\^.{Kyؽ.R5[u?t2˂뷾x /^ c*l3WַK Q1V7^ܟ8ic'µx+^rp5JLȹINj1/\rW,8J7_0\pS#4,8n(\"\G靚Lʸ:[.(+SMUeKp.=.EtsyF鯤6H|ؗ7; Q(,6{Hj@y@$5B,"ܾ}t6ŧsDD*ʙht.Se:K` *ä zd+^\U.o>ķ?Հ1L/NIk\J.}\z~7d eWc @uKx6^ٓSaҢ~X nǞ齣s{5gt,_ \B$ҵ-}vg?8DtF!}QWceΟBRSlK/v aW,OgR*\ߟHr3Z&3dVJk~|%9x` xԄ]P.k6R*\69Zp eFYASzltUp6hN4[ ́phF6 _ׂJ#߰T_rpR.--x/e[+kde8+e2L\3R1ehlOMC.LK"fx) .e8B/π+vx[jQ&s#;uxnI3l9Dye<`2 gp( 3|&nVI7cHd{&._x^Vk\z<"Lg!Lٷlsm].>Bov'| p^u$\Pk2ӝWȥ'q̏Ҟ0?'͕(mb2pۻ o3tZ{ k,HudRpZry'# lpٜ.s˰b=p1棷3J)`\_,ԖNPb>@ vlD\J.y޿ E6HboUc"2w@B14z Heh?yXKBQ\Fba{͆W1T*,m•*ȋkyNwB; .ƖPMiUiGiy=Cnh \K7!kY85eSF? 6Q-ؼ,7FY2lc s%f[@N[jl(W]A` =)t3͟Hk, fp7ږ-܌ vV9a#e0\bfmd._B%x'K\hFbRFX<֕g)Emڿԃ,k{"׌н1۪^'[X&>5ʵ)x.m2jj0Q#sCwFS!ڌae6JWK- 1Ee/Oۤ{~gn xo f|)1N^z+\"\E_M{ @`F S x1=JSq˘_豌֚DXFbKe>? u66Q^i+mn/ZJ{m<0_OƫNqK•:spp`I͝kA߽Wk??rW .\Hk ɪj7&"llu|SO?OW &%~3w4o[(d\E6doiFyܻq1Pݟ?a4fWݠ{p-奈SC{WBqudڛRՅxS䊻"ϵF{\ʮQp2”guq>?Ń yw@NK< 2RӐґς+jMLõF{2nw G7oV-_J ޝmQV~|> tSԘ0ΓZe=U,s;UC/m1|P{I?oYO=x\rδWoovٌXY]Kv>^Ɇ_C~owӉ}Դ6.X .v\FMFۛ[t*IY /O2BpjK WkcqPos?PB{W*K;eմ[@&6N_ֺ7>Ngqw sWp%y=E^VZl:fB+{Ȁx\xP)µJ^2L`PEJxݓۍC|BAK6Y=hi,IӦ.F,뭃1~ɨ6YxU{ &ylH)7ã ϵ*UM HB4ռ!{-5Qyˋڍ /ZL=#}i5lZ|^H*cI.lO|_^9r.m$杆eԬtw2.Čc48,{ಗ:mRްZ6\(.ܨ] .M;sjY13}q}pܰ0\V+5:O|,.æ CsP(rZ}pcn#~HޙFZG-+1VTe(kJm4ಀ(i\nb9J'HK_Ϯs)fSTJDlujpJS^3\ޑMĈnT͌/^Z_ab찉QӌlWi("FhmuX5 ~yϥ&7۽~%=ݺ?89#|3EDEE#Mm Xjj0L xZ[ s8&4|~|YĴǰ) Pj1v ^\QN'xx22[ʓ"@\'j@-4QVgRA8w?J' *?G6YN@!T՟2t1e IZ^Rۦ*sd36,o;5II+LR. ;lN/n̎4;)~yuK wA}fpe}[=OeA(Pn#˙;OU?K%IENDB`images-actives-html5.git/doc/images/answer_code.png000066400000000000000000000132151250410645000226000ustar00rootroot00000000000000PNG  IHDRPmxIsBITOtEXtSoftwaregnome-screenshot> IDATxyxT3sL@!l"V}]RyZikT-EjZ[׺U "'dd{y&!3 >F5t#]QLriA1qH?972#]++v_XM@N= Maik3*yҗ<mƧq@*[zv?G*W 3 ҡ׏h}M[+‘Ǩ;Bm;9I֑hյ^c#TBF턌i] Ө'$ o[俼ZזX4qG>IdeʏcL>5֌KF5^6Z_-'M-ٟg0])!7W?$#ljqޮIGN{g鄤Af^T kF \T k`O oW}^$0ew|iw[Zmyh:geIuel^nr*}[(~p[/*5d>'̘2|Fj+0fe o],?_9 Knv6WWxkOU p??UPlJJՊ m[Szo[DKmnOɹwqKpu*lLJc r>֞s+J_k{|km_mWϋXQ}ϼ^w]O\῔j˕['2{um18a[[W`;c`bR;_Z{u1VXp~,4ic6?53[HA|<\.45XqѽNw2)U[bUCUvG1a$X.i|=y`.g%O:ϙ;2:TRY[f/l_velΔlx̿",,λPuݻ~8GڜW%2V.;v2[ksJӴ[G[>wW)js&s/kL_AǻP~lŔ,o۱lϻ/[T6l۫ļXCהMVfZef/ALw:Q]&t۫x:޺kԷ8殨;qV:QũIRr{*4O~rYۿu_2w9X2{w_"Q?ZlYu}D]ާWo۾9/V ͙`xY{ѕv_þjz򕪪z䉺/2xv;4D=kBR|`,[_ChJ6^\uK)2μ6wklﮈU39Hn(=o]پKU\e0gf4x1qJ=#]ydf{ ~V榽?)B/02i*3;*3{``nݺpnu78`(4XzA<\.dOm;i 7_0Sgt;?7'Fv)eׁl߲-ߓFRY; 8Ǽ12 },-?ˏ N BS=hspёrRMї`6D?eK\(U,_4/15m3-'͌)z0;_y7!;I[7q)a\n8Qa^*+58\0f"@rR-2p8OŧrΏ얳vk w}X {vO)-<8o]R|\Xi0cg1o>Qt\za--ޛZ4\Dn:Kk?j 0?|"`u+UMp+X ʬ2ty̘ܽW`Lon/3?~wZgbaκmtd'Wy`6-Qjɇ wm-pRoM,m6'ͯv"%Si˯|zf2>9 և>5}遽BsK/yz,m&_L[+y96XC3\ܝ:E0 uho1[3Whv`FZ23'z׭[N\|W3E$yf37MWL:xwLv[^zꕩ) 6ݷdjcT%SxS lɧK'͌A _ze^'"Hgy3=EcW-/ZNVuorDQxt._^ $ qw6m{+-0ML V\r+,VwNv,\>į]:-"\:Y/fGK[?y.4D=ov̇o~ɉZQ%j5'O&𳘽lޣ]ʼ% qqJ [`Np&$%@ 8]v4jķp-M'_yj$$'Aw>S9Ng+嶍/7k3^y3D#* 0v46B; I u@ ׏zS0^'}]d/@L,"#@},>CL bbVCQpxk1o3.2P--t 9GX~}/fGF2?Z枆vA_n0P OFzDC풋_2/jdOn@vf[ O540PYq;rNB8h3n7=c_t =:587<91vQˆU^pe\4z]`5@(9q@ xHWfT[e@'A%@5L$;Pߢ{.Bw8$LG2D\I X׀PjԁuQ$FAU2(vVB.՝BOH'$P@(  xBdc*>a^V{=)ɐpIԿsvmSɉSll#yN=vdF.gOW%4`ZP2iX O9-dydwNԪU)mn{ eagj7፭sK(eLoh0N#ݚ23Bmg({@ڎ^Ӹ&1pSVCyܟU|gKAtHOX_I ]@f;fD1*$"BTqWK>:j9eB=25 <#OL s4oy`n\r36( v6E.0zM0NՈ^ p]mVVZ' L&"=atC-1Ajݛ{F9cƊJ_9kvuGOȰ+Zz4)! {ϜLb`nveV) v'-^ӈ@ܲVS곺4*UbxDG[<(.vBaWkŘl׾=!ts&Iѡv8fX&+*݄ .P xB@I!9qvg^r Ep'N z,aC]bpHZMhaaLVLU sxB Ċe,~/'dIa~<1P xB]`7_׿in\6UU*a2{!6Y~Ё~(mgDOȰ \KR'ȌɌ-JIJUz8'deh;Οv+SΞN?2b4ؗen!:d9XݿPT+'d؅3uUcjKGͽ_Ĥ:'p{j~͒󧕗 _d/q:|$Q\Ip(-=hu$dHIH~ 1k( YQRI>Uj<f6,ɉj}}J|fƝhz lϳ } {7SĞFX 9όc+= pCqk{3*>~311sUL0ΌU`"п> g0IϠў#o<8WR+Ƅ<R@5AHo883;[?Dqz.ZM:jXkޑ3@fdRſkZ2S 0|SCiwjҋ$%1vQe$IPiF%dt6 N\.t`\ ugJ#;^o̚Olc+.F "E;w62nX`s1|uE3 w{ H*Ĥ_d/uuc^vD")t qq ;vAD "7;eVIn7.}zJĄjSbćx|_]iGH'$P@(  xB*B! @|7!r# (N ѭGoS 0URKP P8^.X62^ж1ֻ9̡y$D0CW]J/o,~Odx|%UZVy#ofտYQf e-Z2z,:)%۾O/A PKUrE\6ڴ.Ãv t8[gpRPEJȬ5oAN]MieLxdڴ8$Z`juX[FM=k_~O7a:1nSo !)HU`i@)^/\}#.4]K臨w>珖<=gĭw2W , wϙ\;(k"MSa!Yݷ-yj:ѝP(r8MEtdO?,xZjjj#GUIɣof릯LvcнVx"Px-4هawS_|N>-GKP<\>ϚZ_m tCѷzZ7Hu(oIC1x(oݑp˹txZ>4G-/)!G9Su̝rRCBH]n*ʱw3#Pd89z^H.ݒٴLڝ\\v˄52EISEwΜK^56cnDm8ex%M~'0w2<_锰cBχ?O6w5ϗ`0hIi4z;ڵ;^fĘzw;# HDic)%pJ(|>~s-ujhAoH !'tޓWv3rXTYrɍz@̺fd(dsTző.*瞲{!Q`5|.B6 IW_OϧwmB'-y/qb?!Í-ǀ`w8.t]m>_Cy}T4uΐ##vo–M;Wtˑ="p9,GҦW4 %\r5b$!r\ZU21KYGBHBHGg,wZwwbBH)%epțz}tNmɟw2:^AEc^H=]{tMy˟ 4 . CŤҽ'ee:qP"p 4X˖N>kX; ߬]ޝ?<.gVVҔ$k 771jTJVEMN !֣W+3Yyog:>=.Z`nĘly9u_==v4D)7ZoӾiC>9XF0NTvnbRڬꅌQrmVأ`x#,!wZڮ#yU,tH .)%uuW[3N=s Ph^5YQ 4v`i XPijpI u/EGQ}`)ߓ~D0 rK{c, bɛ@iN & `(rlZH@ vLKh0酢6y:ke,ߟ*MM .) ɐܞ}imjUg%a;uy |T4{CuP柬S)45TٶW@]u%yV iDuUI-[ŬZY {p Jz[icI;XԆAkuhb$UŬuvQy#sYYKJScJWN]g; +D#{Iv.XJ~9aܕoqQPi\9Vo;pij ݸ !K+`B S.]:t۽m"V{ZvUJ|z$ܕk&gjŲ7cNdɿwǏE mr.=܁<(#`% K<ʣç/ Cۦx lރ+ * rwh~?Gd}2.}H:ݒG  }ɖ׮j}Zʯܽ1Q`~BTiSNBt+X7Igg)wD.axK8aS` ֍᭠`*8.z>|  o.žd_WZi/%!0i8zIԨ AބB# WSfRIKjTěYuj=x@X/FD7}9؎Wʈ։gkrKrJ .Kݒ'+B}{.3-,|b!>̔WJ {C ܦ4xb1(іh%Mk'N[Rb*cꕬzH7 T:=6]C垝!|)i Tsź8oᔡXlϘk-WOM~ jnb\1B^л4$~n@d[|*nԎGtgXlVAN_B9Ne5O=;)JyfXIou{x+?-#: 5OwmR;ꪤmkj DlU{viPnd-jXBE]ףos)%/qF1 Vl!) ^ج6<- hmJʸO ,PM|H+ Rh4\)ړ h_@ٵ샓wt"1)y19bgQE 4Ҥ*M•RKKF=`oqۯo%lr'ʎ!*7m~U,FK ѯE5\h2b5ϕOpMc-i?|WWۨm'yyEp%|AUҬn=z>Y<01#8ub}W=DB\m^1&Ay1?\(#e'=[/5m[uZLd_!O%E WhKޝ?4$zc,ya=b.\ UTO99ކv)Ў+POL[!%%_Tm\zO*H0 Yn`#@Xs,߽i^I> ~zbe'.V *M g=Ȼ{єYnמ Lܤ&WR#mp y3zK,yaxF{J'*Ɠ8W `*T,izi~o>ęPJoBgtp蹊*o$)&eQpe!"*Jk1pkQl)))qʠ WO1mӁ.BQ%]0 v9Kׅ*+JیQ,*f*\ԗ@˅* d-"\*g:\Bz]r .+> UpuCSK@@lʮd=Ij<Yz?9u8ȒǦvJzuCSؽ}+uUG\GJ}Gː+FҪc)&:&0FOJdZ86`zZ`1mX]eiKO>J{7@J&iT> }e+Sz+^w},zlZӚN[L.nܵOߐzxnTUM&e3С%~ԥlݸ.'}n S+>HNpQ[kO*.K.FWj e@)Rݎ:ҭG/<x-on|y#P02Hi41WRv \ @(d놵lݰ6MOR4M .*g2 xpjv2\P5yHsvE.TMCOĪ6IENDB`images-actives-html5.git/doc/images/bezier.png000066400000000000000000000022251250410645000215660ustar00rootroot00000000000000PNG  IHDR&$jsBITOtEXtSoftwaregnome-screenshot>(IDATX_L[Umi)p;tLEXV( bM3\pjXgE,:}` L ʈl@Xi)0*V(i齇5d-.3&|s~sj_VFn#[$Iz1C IIf0 7wzKfE>6`vܭ MAb緵f77_vt~J ѣ&Ef@gpIab!,"~ę& e{JpJ7\\!$!$nro O}qn+^܁έg&Ƿ$~~~PgCϧyD̲*B듷O`H.[UUkx(8Lp] $P]I-,i!+*0li```cA53-=݊eIHP%`h}v:adL)2Y"<(WQق @vؼn$ɺ{RBg#a w~B,~gV%&_a\|`A47`lёpD}cDz%K7ꛯtM1(3<4h4+gl^ޓ$LM)93+ܷ<֟uI:V2\4 ʊ}颢"ŲaFOFSQ,Xl-ֶ'UgKK Lh3jCw2?ϽwlX|>pŋ<ӟ8DB'*QRmRjLTJ'd0T799Bbʞo\NVT:;(,"傝is@CGFG߬=Nu167;;<2RD>Vpx< ={ CYYY~?h66664D"}@ޥ6DQ}jj* ''׾S 0'QpU&٤׻P( tO͊PeFFϧB׉_6 " m}EX9v1TIENDB`images-actives-html5.git/doc/images/buttonBlue.png000066400000000000000000000167131250410645000224400ustar00rootroot00000000000000PNG  IHDR<qsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<HIDATxyսǿgg`X-# EAKk%QQ! B &$NsI/ˋk#YA ܀1")3,3]Q۽Uzuw]SԭD^pEP>KkBO` D!XQV@*` D!XQV@*` D!XQV@*` D!XQV@*` D!XQV@*` D!XQV@*` Dv 8+>›rWo'`%Z~B 0|M]9~LX8=&SKZHYx[0$C& @|O9"o,c| ,Űhs+5F)b)O.0J 1fp%F ,Cya>kiV|tzqW?Ar ,kAQ\;s"?{2.< lg(GVO_T|3p 8cHĞG[w3oijOIpYxM/,㑅Wi-jhƢG><|֏NϙP勯AMUg+k}WCO}4Ndi?k'rwugLĚô/T'e7EAČjG#@ZZ}__I>ϟuMhm}5 @b# . L 'p$3"p+3oyx[1~}}rVg5%&!k#W3 UZ_X~u T/5M8$rw'_|/P93h O=̾QQSo\&ÒT N,=o2.E_}+0j` eLjhG>ɵS.GMU b1:/jP-"¯g,_j X|e1Xr[]4 >!,J_eErUOv|gJ~IpgQ+,.5bXt@s{X6/, /&EUƏ9St-,,*c/5gNC* r[#Y>f$W~fa>$qv1Ɛ8KMMOٵ56a) fxL&9hu:1\Aۨf>a+{B&:C` XΌU#Yf2Y˨He^ޘI'!QmLF,ҡRb S[2ƱƓVlǨ &g'}J-j0Է`Pԋ:T H=Q/rOX4 ;DPbo+~ r C 4.;\=C=86oy]ˀ2mEIhb㮽PnnP Zw߰cG5D.=+`QrG e % uq(f[luvmXI)g_q I*;Nj Tpw׾KqS^H|'*C$p8YC >lس>XTY sܽr5% ,z`:$:7 %G}Z&٫lQfҠg:np]k7`*R[Z',0vצ{s}S  ]=1WیW7 ~;U wPYE(طT44ᓺ\0u" {o;VFL ɀ,z wS #OH$ lF )cFg[gz$pӚNN8Qm9v mJa=}b.5`CwwV@$ޫʴ_rvuQg-,|$;;@\B-r94tӯmV7o/ol>7pDbLEW,QdyGGW6`䐁t(O~vDqOVh**;TIJAMJs(ZVϙfMnjS08 /mފZHZZx/Vb-.E6ΙgMǩ#QXoڎm{omxjn 6s<ξ/9TV ȋ`heZ;:֡&WPUP1+I'Q<ƀKٛeŅk:hO ^ZAEx X{{@j?'N*D1wP PJ$@#SI6Jq9ɃYPjCgw,_H\LKQd(`5wFeJ#yT:8 H*OXQp\?'DA* RR*1mנ2 ⓑ'{p@B@jA|%iI L9XTnoS=,vH+xqg:C )hPtVu(hpI}DTXv#hvi$x+ iC%4å% /.#0ukTLAp9h3\F\$Ts(X`*6 cTz`9E*v\:$!#BWJW325%7 l9t I=E+b|2-tU G4WA5a?5R1V{!w,$ \]7Glf1WR}VCXz?6Mb$E&$iSѠcOr*@a΄H4mD6r* 8t`_{6MB/*Ӡ?ۭ>da2Q9?XSN%WRr.! q#VX- q2aPELz{ wVhZdcRA>/oZy]6;XT.0vRjpZ>^T *ɐ pʐJ,Eu4Xc5+ 0(_|LK.PP)ry2oFחX,X:TTI. Y(epw\>u<NDZiGx_;[۫6D=<[s\8Ad,3̘' OB;»{jI|+" R,}[3Z]^5sK><|~}c8~S&cŒk1q`Ͼ,{j-;.cKDr6C)hq8.{zIfb] p&Ub =C,(|*zWPU(~ߜ ,nKpބK5EDi_=q+_݂=md[zv ,=.'﬑V;^݌1n9=Yw,|w19mލ?RKu9\^ڢc 53`Ʃ5(b+ K~kofF(­iM(rquɵ쩸1fƶ[۱zV; 0Us-nkx!!3p * 1]kn(g fmTW5+FĔn%B0EknAK{ ^\7 *޳lT`/e,8GE( o{>¥J\Tc JQh^OZܖֵ,;mj/FpIDA-㩯 c[)/|ZYdH柶] U!'mR\*[$75/#?JhO; ij7V!/Wd#`sO'P+ j;due ^T7g~TDtfHiq&?,&Q"]L-Y`enk #\C@d;m!^}z P@N@Ua*p О zIܻL42e.ȓiDy5a][?VHXs(GŴTO`{}`n R 6t^czʇ3.ݕ*\&nϱ$f/IU٦Kנ՞-&ɣ=S !M)q2~mS8 .=a kb. {3HJ=Ó4՞#\yW66pDc]FS,AXa&y{v{sAuڈ!xQ`}~- Rqɞ)G#<˲Bq ((/,pW2@3HvWjp9҄KP·b9;=7N;v8.h&}`"{)y}~pH*P:Ђͭ, i@* pnu%bnl(B5_;4̬FF,f'cݝ7a!Iۈx|7He$ljp w{+X "2~e K p=uN=,%;j+Kf .ct G'n_?@l^{@ZP6RAC*(g5nvdW=Oj`v$"q>uiܶRTy0 li/oAWo,-;a:fLq_wu9f^<wXpJaP`Bub,~b/Jp_~xxEkKU^}RIFيonŶ M 0HXbx5HpY]994JaqFbÍɏ/YC5Tkkh) .fzg43UP*)«?9!Tل߽s&|k r1R84Mrˋ;AP!ypᲜ.o$9ۣŠR2{4ƺ;\To]|P)¥&8p)C|W4\}FG{r+HUP3\^\40* I\a GOu+*X3H { 5*xq 탕#m3U{~ 9 5MD?fƺG{$w Ͷ95ySli~dY*2\c]N˃=Pÿ;Ni]/^Seͥ5up8af;v <-VmlJ~ۣy9 懇)㌴5%FD|aUqA>g7\yv{RLPZe_wc{uWZ̑oƲU/#(Q?uI0@jJ׊M;pϞG1Ǐ%=ʔmmC0~{Ӝ3*H_]UE$ SF̚j6r uưH=yAꔔpsg?yP" -&@*H IoTQIENDB`images-actives-html5.git/doc/images/circles.png000066400000000000000000000016471250410645000217410ustar00rootroot00000000000000PNG  IHDR&!:ZNAsBITOtEXtSoftwaregnome-screenshot>:IDATH_HSQݮw*iÍ,Ia=[Pf>k,H 'K&e%9'LP濹sa[뼆9\.-{HQJ)Ia|T*ծ]g32J$'=Vkyy0qq}IIz9#h3:ܜ#))$=twgff"BR`EeͫR16&˲%ƲѨV@X` ČtUIX;f#b ጐu}}}5IC!--MV љ aW߱luuҬ,$p9^rDҭ!,יh.PbB0{ `ɩ)^Ky:ɻv!W~^tzA?$_Zccc<#QTؒZOo gΨ(\g'&P~#KIENDB`images-actives-html5.git/doc/images/exp_1file.png000066400000000000000000000071131250410645000221630ustar00rootroot00000000000000PNG  IHDR<qsBIT|dIDATxkoFo!B9*m?6٨RծZl( ƞ]ƧL9{a2+&L,%0bXa L,%0bXa L,%0bXa L,%0bXow(v+#Y&FR]]]a8r#B!SV|/$I( H&\|&Z,YQ,ŐNm" 2 B٬ldY x6rPFͮX$R={ v9yw_\|(R8]=O$I58.8(`0zb CU=z= OXT`0vbYmwX(Ry4MJ%¶ϊj<ϣVO5 pssB * U k0LTbV OqssiaXnB@@d 6A臇\^^}B!A$I[\/VBX!INacjZ0PVȵX,fW}kJRf 8;;;vTӷRiR)BP,t@M:ILFs.[nZ( hQpXŰ׈ʈʘ$IX,\.G=KbiEQ{i2d[[[OKRd2U8^,T2Ud2H$l6VꘌodOf`0`\QwKe븻S_ǤG5Ҳ\ qXZʤW.YQ.j@as-Qb=>>NGRb/_ pXZɈ\L*kpXvrԖJ\2hn-kЍ}**Z*&=&V*ebr[jۨT*+m86+R:q666dNF!A0vzhZ ouV*V2M+ bww_9}& !akk t:xxx5tRip8gϞ!J-|yDDBD,'Ta{{?d^iu 2)W ]Aúonnq$Kt:sL(Gzh[FjZzYqB("ɤ x<Q.}ԟ{%ƥ#ﱻK(uRϟ? J~~njjk?-ꫯJh4_ڐ(˗/SB-1]nTNI)fo&ꫬ?VK HBf<-*[*`W~zoh>n8C.C<y\*3JeL!unj:Qnw͕J96J-~n.R)1'|uub8Qnȓ/6(YZ,TNIM\~DQǏK0ě7oGu3!ZJnZJ[6x^Z>}cN ~ǹ+*RŖmtK+ \8 Q[JԸq*&qF [XH^zn|yr^KMKzIJ{}azm-Q'4KiGblj"u+rBKeD.ڏWVjNNNfLARQע,eW-V*+p# ^hbj prr2seBnoo>6Diκzh4PuH;e\p'''vG4!Gs?V*;ebe?-zsE*Z@o^c/w9VE sH$oe(3ϥ@kh{b}ZUEۗA酟&W4Ip~~ه>Y)"NOOe մ!ui8M.U;T*h"~%"`0>I(l*S@`KszBn4&㬯ϔta$] /n-+;$EkQ+˲eje!?tFz_ʃ8nv;yrm| 8==]+@˗Կj[@7HZ$->iW^!R?75`wVE{75npx7ş>}$Ixėq<<> !I!$I$IM1Vv0O?)wXr9|jkNL:T*8??$$ RɷR:7M( -ɲ?X<9z~P(p8t:mhpՂ(h4'78^U@9b<#`ssHHD?? 0 Qpww`0}0wkw(72VbbA-k.X|,=)9%Vʼ.0ciX)c10ZΟ<-^A@6TK&{!Ty)T×!*-U&T˱LIȧwJ+`8b0TUirrPU|m888Hlalb60u]aFbq||xd2bqmi~Bltl6PDB:W* $`%zEBvI*`yה(Qggg&56l/|6Z Vk.//,DK{}0mlwֺmQ,Q(nudz ĽMKn*W ?\.r4MCPlFGx<9nb \__h[rr9TUT*0!JJ^N43 .b===-*Mrzhݩ\.\.wwwW4Rݠe]j54PRzU*NNNRI 777щwj4;hpph;a[*gTB.fY". 5G^/ʲ,t:tݥ߷, exNc{{{J>GܹDBT$ŁX<<< mt:x:Wdk8v1mrÅ;DNRVXwwwK;"(8::bkzzRA&& Cl-UTUp8 JMrڥ4KhN3lrEV2ǵ#(h6&\+JΥV"jE_Tj mTFb1p;VaZFw?o"²N @A\)-nooihFrKwV5McSt8Bh4yx4RtB5vƨ]Z 14R,w^,Ti(D,VKiXBjVyzssǹe~aUrNXARm+:E^Rh/9hWX*d2Y#Q KUUfim0ŚL&s}fi*JFir9Z򫫫91\YCHU.VJ!lPUfsT[YN9̉5LD+V/L&4P*(R":5LKڋrM&e4 V -q\^^naYd}L<I5c&(4 fsTv;RڂR2N"UVIJ/F!TmnGnY`0 [齿_hpu]i`4+! e%M-:EH;@u4m۸h4ZyL?g˲f Nt#8-uVkeUtZ< `DGaakNOO#eY8??]:>>fJ˪e fʒ\AD1 #0=pqq2 !;n7J1RԱ, v;TB9:@ֽțNq$ 0Uf8??%(VGǏ{s\BYk2,)q*cUց^BtCmx}eV\X MPV',8 ,/Rعlc{`63(RR˲Gm6t]GXizyv\yrz}~ ܪtv.RQV(i)XߏCߏ]I_eYY4Tש1\__'[߯uYpB E]Rz=}T*HwY`I'berE=.#qӮ:l6sgت8ĪXm`狳uWw]K %I'K%N$5A%ʦJtd0[n&o蓑+݄+.}5)6q'u$ }m24@5 >rQx嗊v+۶SSt҈eYsDEw]YW4M7طrZJBMb0.TeuKY[: /fJk篴.˗/K"X <#,BqM7nlB.˲;}\_}^x}cч8'nlJM_E>GPl/q7Ã&^T}Gw'O7 \ ,~ k0Xچ\mc4AQr9hNijN߹ J7l#:Q욤PU_fɵuuuUU*!kKA ۖKQs@6_zO?1IM,73yWWWh6k&{c()v2t]w=wGȡExM0 Ru]O(n-bx-mrpŚL&x5!?e~ëW`Y2LDPn]K$ׯ_;񿳖\tt:xD)ݾaǻ=vn~qٽqݙlS/AٖFH%( Fp]^x!#K B,A( K B,A( K B,A( K B,A( K B,A(Q &g6}>u76a\Ǚ W_d17ukzR{ٷtL/`~# FC5ɾm_cocs~50bŌd_f 5?]7Q4c]ǂ\˞+n}{Nӓ(C4c/Dwbwk=dz7џؙ9M4ZUaLؿ1>IO=o汫3:hJg8~s b+mi9$";=ɭw8ȩo nzdb˯ҟ%gG/r/ouGv˪0:(F4S;別*p=RaeH׽-kWs?B 5/QM6+Awz2Q%Pdtg,^.'HڒI[6.֜O=4M4ݞT,M&XWZU`Nqoם&O/>G*Gme|QNSj՟TӋ/y4Uc=wD?dߏ~bM,g ]0vvdזI(}X$<Д^b&nΗѝa߶qrђ}تm_-&n(j U0R{$:YRB7ѹܸK%i{?5׽Γ>vHU_ ~:?m|sߢ_d{kks|l VS^o5XaJw8G/󳩿kx U?| ?;#o6OMSWvQ_6xسm3 g6VNFK'}'rfa*V\:9cߩsjTlJ]{ed>\Ⱦű~1@jTe=Eμn8fb9^In|ҷ䪕'dXCXq)c>u5c9_?x/9GxC+ܰXqj)7~v7hs93U }W~sτl*TcW-۾v`{15C_㜚~wo)E 9aNc ŊT.gO.+Ǹ}p/UM*Oԗ}[KJ%~c0U%j+Rt\ôkbgU0{!PK՛MI7НEwbqvdgDEUXT6࡝tLvy LGSj6u&?h=\:AWdyW#jrZT*N4M,9Yبf'(;ݕJ|lێ<,\{r ţ[R]P P+@JJWH%P,bI r޷\)SL]}s&|ڹ+"H5?h*kzGOXBuf\ojңDX?,XJki!W)(Q~ˑkW69Fp/*u\5PPA j %T#v|T&A\.,ׁr{RLU%䪄 О Hᶷ XVGUk  jÚ\~zBz(9~rAr)K96\B^lyZ%x\r/Ivwe熵$?_d$Pճ\]Oz,Wr(jَWyVetB~*$$I~<zIQV ZQ-VӜ|wC`d59xP8aծfrQrZÔo)Jv@ȵirՏˡ)n\P&%Wt\r|BdJSTBU?*g0E%\$מw0E%”'w 3/m۟m;{~Juo1%، ۟lm4i}! h%HsHC T뛮9Z(ZLjЪTnb Y17'eד֑?3yO#4d2l\Q.'Fg\*8Kd\4a6Wy{8ϸ(n"uaɸHFBDѡwzZ?\lNc  >.Vaefdrŗ~9jF6U8%n^:Ym˨U(jCmz:PM±? 5$mb[\3' ɳbFrU[fUDz\X9BA .rU=f65i`TUc jkeYXQe$%6c~^\m0tЯ2ieǨS/\~lݴ_\tWYWGP*Wl: /6V5YW.𗫜z\n۳g8xe/;UXkT&RNJҜj_.<}^-,>ym+~Rܶ' 7OגE?lr?\\A4zXY;.(XŸ^{T.=jjrzXY,(*R'C Z\s:t-Il./6cAe3`;:Z)Q&!W5˲7߰Q̵K2dmguO?toq *xf4wTOrl}JIENDB`images-actives-html5.git/doc/images/game1clic.png000066400000000000000000000166321250410645000221420ustar00rootroot00000000000000PNG  IHDR<qsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxyT՝?M #q%1N'qd;f|&q&yљd2oq$y5fh#"D  Mյuם?]kU>v9=60 G(i+h|ˑ-rrd",Gˑ-rrd",Gˑ-rrd",Gˑ-rrd",Gˑ-rrd",Gˑ-rrd",Gˑ-rrd",Gˑ-rrd",Gˑ-rrdǺi ;&qP7d hoWOj&3`pn]n.ș-G\ ZpIPV\Kyq-%u22wC'qyqZ%CT9wrүRVReRYVKeYiGNc8xj#;B$YY-3oڍ̞"d>ޓt|-{`}:-M,Ck#Tץ%Ϯ%vy G#Aa5eSӶW2u"DdFع5gۏa 8ge42֧)*,?w8{}0p<&3r2+[v5Mu3Z>[;=gͮP)۠<)UIDhΞGs2 cÔWfLA֧W|sl6rX~[W3uec]u"S`=n>wwƺ*@pokVK΀r3P[2ɨ&NĂiT_^d`;N;p#'s\oŅ4TϦf6͵s9 |t"7zPT4r٬1GQ6}SW}}9[]-+d\N;xc֔+ciJ{ۧwp-[][zr(P2e.*j'^ց ¯J#tu%N?´mu_||C~*Ntm;a7n4{&'^d55܋B +e4o7DI͗e G{E񟿻׎QySH.IL;a6KsʮpjdY0v>m*g^n{}KYq7,) )-@~^g}E(t  uo8MCʹۧD׶ B Y22ϼq/n_w$LpoqՂ\76~)˸K7Kk!ϰs~]a-Feh[T f~9K(&i]§}K܅cF,8aYfMW85ܯ@ @9m+lL{NʨeXs'E.n:nC3odtRLF=ya>I1usM?y's0;(+asLI0+Za .w_oeF]8CsKhPA~rϞr 4w|_p&ZSU5i-)-R=R[,wawx~3[#TϋMD$3 IRѤYOxk9߿:9>‚bϼ1&TOSV+`B}KȂj[~Ԩoe*aXp }gw *u&xe|m wޑRRMmZ\e+t{TH95T24NCSen1;Nj|ELkgWktvعwui)~@m=*J''"f\ k]4M2 5s5 !ܱ!^gN( ;`H½0 2ڿsD*,Ofa[SA >ڤknEQA%Q;eejLi;CHV-$TVaA Kɜ <0UF e*keu?a;5wڵiBi,|[/ GNngxֵZXR\sH‚bn^ .{+lξhk2r5D]n4؞sl><>n !%CyTX,W?{@`sr>Nw理I4MTc̱ls ! Ks"̖kVIʣnFhgҖofzfYvw73 \.sUWJ^.I+X^߰RA Z.1b$Q]ޖuҴ q2ŀKHMuZ&˔V!tqQ*o 8պh4%!Š0u,3dACUvrY.YKF) ~7aVBPA/z->"4(P`Fpp 24܃7DIQ%)/*ifU}X(iPYI;Br&;:ð0j:!ŅUUS^RKK.|3ZqnjTc B.)<}ٽ Vrxx C/۹fWXNJgKg&}~7^K5*K_TzK^O_9헫x_{gz;Dk[EJp#{Oͥ:ecWX>wX9|q|p4M3ӞCosss=BR{>@'Z!ݧƖG+ xgTsN%Ă|^=}TJ]?*g>]麺ւ܁7;A?nK(.|~^ΦD\qtT)nyCm~HSKHW{"vw,^+0(TvQ&p AgnFG&|=j3GpC|b'K)/z5t(*XuRz9~ڸ>Q?s{ G. {O-R+@`ޡvy%X>ۤº[W4I%{xn ۟=Iܾ i3p=;FILxKq(-e5b rG^޿|kVTϒ)\,Mp_8ck۞s0i BY@bz?T#\mPZooiȻ}]twOuX^isl<ីyCll@J?w*,\ڴH;"vp.jwtz!`K]qK?PV\Okӥ&CPC]<z]p"qcSG"Fn&f:>ztyW CFeh̖v~(yP7Cn&`8T$?YG3\Yd$r>̛~amO hB }dž+!dt[ȚzTQnKGKB J8**j(,Ⱦ9zGY e9HX$@N[B8:/̎‡QgGhJם @N|%HUǤaY`5HJJ;ɮ$F *ƈDڗX6&b>b4J=b4K"+,?aJ_u=DF\mPX1B1FBS$C=TesNosiBTZ?PmkAo87оr¼Jץ+CWЩ}-yGE& ?g׹|pU|6=sgń̺m߳}Ә5DP K(y-jR.FWP5p’DEi5y Ɖ5az_iɿ*f+kWZӈM#ChinѼct:Fd*H={6-y?a㮟RY֠uv d_zʑ)\0̓8d*"O N9z ;OP;aaB.+ޘ\#So$!2]w<]s'|Ey GP.DV(*ųo Ն]sקdZ҄ M3\ 1jtݖ\V1e$ W+rm"\q UX/ozww==< 9L}L\B )ٚ"H _`' PVRE4~ Mp&[wm|MZ/M~:(-W0M~1[.]~[*:V$r7\#\Q#4s T.fNTL#u Iԁ*eI:"C5uA7K-ŕTi UlպuY]z#@Fw |de# ݕ;BAIqUeیeb>J.+~@e$ˇjcCz# AI>gKz܁& )ez#DIQ9mNJpSo$I8Pe@뭺#2 1(bw%W*.,7Lu~F Y jE.+K1 !(.,Yd7X,O7_q ץ\aQ/8T=_Odp2>骸a&fXm]"\Br*  j®͵sm)oRݥ,_ך03q7XOeR?hrC0V{G7& ߘ|^@PTXPApZˡStMJXSl<jQSf?xꝸǰ^ff\f5 \=$ KTaLta)X)rږ?{9J1LN T *~YnQoF_g}!4w&p1Q?bBpBG7ٵ7#<֮ xUQ"!#ӥu1dcHn"tus A m7*$.+ "+£( r WI 䚙d2gLwױ1}TuWTtw<~[oU}U-~Z4ʕ&S.X +G`rD.X +G`rD.X +G`rD.X +G`rD.X +G`rD.X +G`rD.X +G`rD.X +G`rD.X +G-ωEzSJ nKAlFYIM9)sh <ԍ:eeߍ|  Z p]U"jZQZ6VDW*#J,P=ux^B #W֧[շWB }:Ϣ~,nFC Ъ"?q&sODTS~gxR8 ӯAIN*C#Wk`j_()Uy #s- nǿ-B]tU[ӺèsT*:P,"A{QA*}x2Mov Us~wCiT 6^GM;ttPI OM}T4ϴTnai䴊 ,82%t67y<:Dξ)޾}jv5xؙTϥ3/l;K(@Og|HtU1mEWƠI]T/8 OUrF;NQCw$M:+m^r>:D׸k0B}<}2Wtه4lZϾOUށedI zw#zu #O_eضIH~&-Hмn)ReRCMw!zVQ{ +$@4WuY)iڲwa?\:Uiu}IInYDEYL_x%cڇi^d_/2UL?.@ʆ&ЬWR14.'Zzf|ۯsFK1+iK:4d]%f h %/&Կ;^0wz8@ռO'~<1;` KԷirT=:ի knBS"w.Egf @Čv8,(X0HO ")Klݚi#/4) ؿht7<H<r Sΰ/ε]oFWoyy\f 6 Ñ/~57c &lsH]ot1zHiK.dh#];_BVI U~| Ss?@ ֵ%""MoC{^U^6ufT)4OiBr=$<][}YW;Dwgѐ!`*!*Dt|瞘W{5ӏ`S j~!LJTFq׸=ΩhN%QIS =P:3veU_o.+O0!{ۖe1x.]8瘼)WѶ:G}g~B ZM;ޣCˉMڙmi;X/c`(5Ux/ UʹE|)tUa{3#@BeTM;o8E"o f&\U ]7Kӡ`n졺}! mkT2 12"?\VvwlUr({4VFHhF9#\)5S٭@, Q%2 &{j/sJL*ULR!GBKj=]HӸ f48*HNu@5E73xLY&]`|jP1t6iB8OG8ЏF[ӄ _u _' VP7XA%2\"^ }*o Ah8sE!!*UMՓh;YKhBہ,ڃĹHYmo=_ʺko={ : I)/ zݧt2]o' ?dbx'tr8Z.m嫘)0L(#/T-]?KpZ.f6|Z)]XA5S2FioV2-R~h#\^Of?Jݿ6ǫ`HZ!c\dTn>1%5ٺdY{6QrxRҺױƓІ$>v*#Xqp H7ُ߆9ܲ?;q f^7 N6r ׍4%nX`J*QN%$fݲna_@q}}^gk}ؒ &`Š!. s}M,̥|E=s^~sũ@VzZxmJ׮+wJ+S}è@^[^g/\_DgaH2!piAv{>}n6~%e:T6J/d`+p{+qiiQ%^!*%~K'Ftt~Ե"iH.v&܉PF9jXƾXM1͠팟Ӿ]{%UEw7iUH!h\:i ,rrN>@ߎ@5ɕ EFsy*X+1\F;T{Ӷ:BaoB碱%0L_=7aݎ;@3{9Ĩe{Ķ$K*0H78 }鈼aLEy)5'.3\`jo`PR @BX8kCWY=}>*e 6ݔ^& 4te}L$X&D7AzV*(x/ =uWh|{@&2Hw.*' zWh[>NFs -Vnb_nP+#e"57,>aԡ K>p#T`%.<].8KIr fM2?Y &)T`AH&U/TRNC'2Ht}17mۂ\PAcEp(PAj }F*Hҭ:m_0OK5 XedbYtvٛ] MLG"U5g uA?VnP h.~Aw>B@s B?_aH .3ru T13xT̻7Ǟ c^CڿmpWb,8qi_sI 3{0,{!Pyg,rѹxۏӲ 6I (]ii<je;XQ{P GIWR2y0wǠj;"f~.RYzSnP޼۷nK7븜6|0H7i܆Q#r*g.'7IeWg!N7ky^횾t .0KܕpSWP4eV_1OݦȞL)0]TRuI@mCӗy=)Sʰ<R\z#Z߁nT~dW(PS:zυj2̼|j\lq=X*{ey'Hjk΅~e}°2Ϳu`X68i/!\zy@2sOyZcwFݒx$|>zrI/IH .ya_.o(zfBT')d9!Ϳgl906Y r( OyAw2ĿW|"4^u@}#T1v<ۏC(»c ny6zbOF`2ymM+=)'ISi?OB/^ JwlM͹ 'UF/jۉIA1u@UJұ4ti˅41,-H75,w8UBUtJI$3t م% OGPҟNȈ:I>$ pUpcYIENDB`images-actives-html5.git/doc/images/ia_title.png000066400000000000000000001770041250410645000221100ustar00rootroot00000000000000PNG  IHDRUsBIT|dtEXtSoftwaregnome-screenshot> IDATxy|ř>fF.[$۲l l1+Y&l6\@.+lvLH6|xE&YvrɺlKl3GOjzgze?鮮z꩚zzUWWsLcs]ס: H2O$YRFJ I(PUB$pS7 mn?.^tzo >n4MKXQ>_C\ƙD}g{9Nɣu2S~-IR^ngć~9O=H1D֯rN{tdÉ?$ Jɞ" !۠<۠f":bZD!^f|vc&k>յ J]=TE4EAHvtn21Q7f@ 9_]׸+o<&__' ?8ĭ; @"H{j10xXvʃ!krC6=2Bl<0zc{(kܦf+g:+nz{h*dY&: 5t]xJm=RO,h]3ƐH$~ Qgڿ73UדZ$|.A*x0H=lu{MmI!tɢiҽ|>|>_iuκy^-l־]\׻&)o5x[qVW^tTF69 k8t=<^85]nrk>錨'&[(=#[ޤksZ}ZɤB#z(sA:t}3րW_pӵ9D*Ɋfs+u9u8iZ*Xʘ7xI"cɃt=su,IZ$ 7kܭQ eh1Qyg`7V7s*D߯ǚ]#HtKSU33u0 #iuledѵSk(u/4O3C)ڶV?3z>0mU(C˵?شl==1vY#stק a";`uk`N|O=UHܞ9=ȧb ߧ^*$kbVNJԌ"º_6ӍyT׹ZiNy*t]3%-:be< oliDU6b(o," =Μ*]g=u}RvcPU>/P77EpUHħ2>_9!cW캶vK  SQ1i(+twd:V\KWkKׅLnFXsu1>aֹ{&w2b7UB~Pq&:wybSFFF2eVvz2gGÊ*i-:'ٜ*4@w2 Fj>cyv"lh+hYFǝvafd%4*g{r]+g-jNe^*7AA1y.Im̚PE{kF>v388>M@#F̔uEn1KV@=q$de3:gfҏ73G-/Z{ٌ\uٞXxiv˧3IAAHs`ϛoPoQwh?@U"ְ,ɛe)NS>-n8ML f#Ҕ!iA/ {Vi1睖{wλNuu򬉟톣gQ,ү*)vܼ"ƍLWfAAJKK9g2M[ӌi'@0H^rv8=ԨA쵀$^}oC=eߓ]z9B9~$:'sN^8zg)awbeɗ.q*nMauvϨN2y CAA'+dĂs|6>(z:IJCbV Y$gdz^?$!5HTB/S(ʾǣ('z,hWB/*0lRI2sF2BΝ3<K.ł PSS B!0z{{qQcرc>!)3Js$fK~0 '@)>=P>EgAn|+C=y, z fA"ɲVdb#0R;Fݭax0tpՇe?z,`XK)݃[4 ֝P =TӠU͇4<` .+{A 0|~,MɡB 8N`!~ AuBL@biH$eqiHr]`( 1 Df! DhVȃ'%3WC 8p3c:IR "`Ъ <-;[ۯs.[\ cCSSS={`֭eAAc# Xt)/^Z" ~>rri`0(//G}}=>l\q8z(k.##''@z?qPjːwL39 _nZwrd9k @ ,gh;cDwͪ3(._#$),892,59o݁ӓt$Ol}Nn@w F )NKI1 r@ fe^ }5i@|bȱ3-uG527aˠ*P:|C[FQRO7iyx29s]S؂8[l} Y7cQ^^UU Ċ<AA0|,]MMMXp!PSS`tnSUՙP8Ʋepg{={1-J]3Bеy%!rvڜtGCs_tAio4@Ir4SDJˈ{24D夷5{91 %ulN_2&e]gsb̧.g&4xr=qBA$AA7$IBee%psE ҶwCII rJw-[{n:'hyK9cYv> S&w 0 "IVnz`bQK P6c`%1Ue x4,ш8{STPQZR<&}*iFТd:km6{/r*ټh$()7#VU_P ù \F2ҪUR{Fi[zTc]= I0$9OʤOɆQCOY],-솞۾n/]N[ 5[6&)+AADnEAEEV^;r ><-P&!g&cg>;k֬Aee%% ýdMo (ޱR!@EfPhZp!Syzbҧ:M3Ͳ侣"lt&ڧ(rYEtɇRAl:}V'u{9w@=?sJm!w9H{2|rnzc0\+k! byxZٖ!ǴlSmykpɰ<}vmSZwښ(O4l߾}}}i{uvvvBӴg  "1,X7nĆ 0k,v>q[<|>.]}kXl|I470Y()E{ބuL0+` L8MܫqN=t0@U? ^J)娗-Â%3c~@zWU42"+.JMtNƠhHPˈן3MH4m(C}iLȇnԊ$pV"^Eށ<ԛ C1;TUUK/ó>w}X,w&Dq5t`djJhU'->;w):=nؽLb19u)wh?|шOcxU"d8Sj*I|{t#dCB=?umb49}]a>W_!kXV5F8.|+̅-ѝIYoPzO/ʟw^(Afu0%LAAK֭C]]]^ΆB 2n:Ȳ 9|IPf5c(.E|P{͘hi! C CNsjW7(WY00ԺN;ѪU[߿-'lkJ6Fx*j=#0ADt VpΑ&/ZA0s4+}G!"+.,M]3u+)ಒ>]VG ߃s_Fb;rҖ|Nmq'QHC nL!IA$I(++ƍqE Iqi8vPQQsa ;UTWWgVٵXn8}Q8qbRfZ (G;RГ\(à+5 /ieId4YFgIGm.AGy1$iiq{'U%Pfbhׯ]oiG`[ f\)uZwf%K*FEIFk;gON咜fe 6uqx7҂ˋD"hmmo͛7k"-s*lذk֬YUWH}?A7@<fՎN襳\ o#iceYF3'u1=2pdwxLX)q22i {af)9F049F=VyX8z%, S5tR9^X O ҽ1%J9R,y REt鹐{ ^=w4+wYuƏ$!b)<`FU|K+=5S2Әu-:Z6 `/8JrruPGU?xzpYzrb4xrZe- Nxd#}jn5QWvh){F=|n y&  L.]s9~?<x},G9soXwh?X\#& A>~\RENGjF``Z"mJJ3 (:LOg#LA<_^}9v8`C=nn&efa<{ gPd՟сqjVZZʭBũ)1}ָM-hb ae,fK"c(ʹpBMl@FՈ:Eԥdxl\]w~LEaڵi^|Ettt\16 -7AAL[oUW]ŋgU#۱m6D"F , Xd chiiAkk+N81)IP\\UVţ1Mjkk+~i 'c/f׍S9NXQN$:~Кٮә^wΙ+˗/ SCUU`eRn  Jyy9*|CJyƋsDќCk\FFq ttt/kpYQZZ `,ca``oƄT^+wI| NRyyN"'v@׵y޼a!喇生X΋28i. niR"W^y%~鼯sb232iUMM jjjrAATΝZA!χj|9n4 $I9 lP(z455qv(..FMM Ν'NUoH>ۧLei7>JXeG7%і2e_f4־O%fd3Xrn9SVb~npc6SL봵'NퟍBdX 97/dHAAgy&JKK%IBee%`Ljv,$c @ eHVTT9oZZZ3<3gcE‰x9tl$ :EAcc#QVV)P(Kw(}e4҃XƦ7p>Oa[   iH>˜$IBEE/^ hiiA4R)|I؈ŋgH)**‚ r'# 0jDΑ EQ'L0   ra``@5sȲւs. g5(c0 < .DiiiJKH$n>|xl%bBI澒k04 đ\2{'&L(   [p4&q j!! ~:8|մ$ (ØcǎCCCczN1V Ùg,G    b:m$Id!MMMHÁFs9Oc`vtt`Ν^7$I2%^ } DAA1 5'y睇*@Q466eeLSU5RŠ Z ̓ϐyxxhmmTϱ0I7THI 1)qƁKΚP   'u1EQ0g455AUUtuu466bŨHfJ ,^҂h4aJ*466b޼y|okk+݋QJ0ap( EQ 1ILc00gnÄ EAA1l~?͛492>eYNlllDEEQUUTVVC5UUUXx1Q\\x۶mΝ;1222gEIh8$ 88` 1IPVY5BAAAL,0 Ȳ& D"Ǐs2$PVVu}CUUUش JXj*l}}=JKK3C4ݻ[lA[[8k%XR ‘p()-k`ltJtS/p   1)z k$ P\\-[ HdɅ$IDSSchii$I81o959a`̜>r\hQA#  ($vqD6 (>555Xz5"҂x-Bii)c#1,yI5$@|e 0 I 0t08sh7AAA)$Iesa؇Xۍh~!HG_$ɬ O' p   "+VYկ~5!278dYsJ, LbTS   ( Ta$oǀ,-B sd&#X30AAAqJEF$D4,I$ @e qMGQqTLAAAL15K!2$Ρ5 , I2 "IHL>&AAA@IQH9 ns`8s%  8Q$ 6",Г$s95rAAAEb2@c$fnȚAAAq ,i& &0;NX^)Af޽())wX~T0m,]w blH``CbMeg <`f:㭇kEWH$뮻_W}}6k{ש0&v҂hhhGyy9;<|k2t1i?x?9Eq6[$)0 C4 b`(s00%͛%b`|'AɬOދE+E\yw;nYLש_r&=n\{ؾ};{oo#+X s.?B^wO<.,_*~cӦM@gg'z!g?wߝJrJkxq1ܹ믿sŋ^eV?W_}7pn6tvvW_}5Z ҭY7rց }:n#I n78th-bѢE͏ clZ xZ{|?OfL3AM!|!\}x饗 2ο X~qkk+n+:,@CCCZ6,_6ܱc<̴t=կb׮]YEfXj /v/p!|[J[v-?Y$oo0L"9i9U2Z ?O?4V^@ |+_PZkTgg'*B!̙37tN8|K.`sϥٹs' B!B!lذ;w$Ν;q嗧3yӾnVrk{Յzzڵ _~9JJJPVVkr{c ---kQQQ1Mnm^ݦ9%~ذaJKKQRR+{6v"v~z!vm$\|Ŏ:Υ7|+_EP[[[noV^iS?g>xW_E]]] ɭ[bpp6lH y8$^---Ye*WYo/8aOڱn ӟ. A2[MX2+3Cp`@%AUW]ox7ۋ;#-u?[qm "뮴_{===x7mX~=>OhkkM7݄ *oss3.2\wuhiiI 7l؀ i_?ƥ+.x.kZZZR<|Sƍǭn wu9gy&:7x._=nkayKw"v~ࢋ.)^&r7[ny477h^iS_|VrqSO=eYN;v1d ]5u #1 LbພLac0ta7#yLxe9]CoooSX,555xwN㪩o ?z(֭[ݻwvmkk+?|tuuer] ]סj.kuwwv\z (..Ψk>m /zu:d?~fJ;ڊիWȑ#9ߝ(D;yoqq1cW.]r%D"{q;F f<ѣGjzy?c=v'ķm4qxgMWoxO} ~{ʸf`I3+#xn|ڟȻߖI;#qj;zߖ(yw_s>T3nc {"`lԐ4fb g>`0͛7#dˆYf|={l:e̞=;ͫfՅٳg{^Dᵞ^4{ltwwgs S=SBC,K;;=q UUUc XaÆ _VVVz---8x /ⷿ-nᆼҌP`{O¢E2 I\׹bŊ+WL[g,ׯߟfHόE{/203 g,/y <$#9uU9t݀aIR禧Ҙy%emnObwVc#ba 1 0n>s#`8cQ5<6z?V6V SAL*-[@CCCjjx /0#|K>_zx3}P"_|1?dp"6ZK.1ʢހ)i|Ɉxꫯ9?{a%\2001= .ɔ sIiH\?9Iu{u|8:S}08 'F`U=<К3C3t͇5֎+ gEe`6Yp=܃o}[CGGG^;qkA]];<೟lZW^y%t]Ǻu+ _y䑬;uPZZ+1q/k~\xB'? Y /{^Fu(ׯǷ-G?Byy9^u\xwݿك믿+Vm S WYn?+V`dd?СCXdɸ@.H5"DK$ )iTr1phE'ItE-GA@VDlM-@dު@װnQ_:+ɭVȠ$N-yks1u]xߏ%KKw҉y%[nwߍm۶ ~;op| /MӰtR|Lcs=k֬~kO=èǦMpWfՍ[λR|k.}xW矏GXl٘k]W>uF./} _DpEGImcwq^y .6mBSSSVmc'iwg @mm-֯_ik᳟{ӟ0w\\}xR[zI3z>C(++>sN;Q[[ϵ_WO~-Ywy'nT`0uGUf/l޼=^z%=zeeeXz5ᄡT}Ylڴ [n,Xb/ꫯ('@8Ɲwޙ1՜k&+5Sy2x2+8΁=BҘH>h1% N>'3`QDSeAOc@z fLLPWW <8b$װ~)]Ou6sA;TK:q!39Wi9/2V\C]tLsb!_#r01[#'|A8cPFӆZWj]6T9(Vp^EiUjNٚηv<[7ۋ!HC1ْ3!,6sϨ5Bw]qaڑ7x#FqСS􋊿9sƯ[>(ek .:$J]"-#< 6`ժU8y$ Ot͎l8$Ü/HajAZDAAC%BlM'P2QA(oC۲փNtʜy{ym̏իW??0|Yѳi&'?l1Ex\q3`ڵ4h1cW_l"5"6A*B xf0|NijO |~pA3~"j+@.nDbApR_ՂG->>ZOؔ Ǎ7ވxr`ҽcy>K,1۷SLA\\0i$۷/M7݄{~p EBBf̘cǎ'??w}+111kcĈŘ1c;`ԨQBϞ=|rTUUxL8+S[R?iӦ!..iii7oJKK>'6R; Vg0av;1ydlٲ%(yO?_'=\JB Zӻnׯ޽o'% L tT[[fonE/B(nEmy 2FBdt/9 *HֆX |.;y :,q)PbDAZ XJ:g)D3Tvw1:UYz5ϟł^|گt%I /xI?~&OoF~~>fΜٳg7ꫯ"999zڵkQXXc޼yxᇱn:BNN`ݺux7o7i@y͛AI_f rss}' Ck̟?Ç]w哾n:,Z`Mק~뮻p)dff8qÆ yٳgѷo__a3gNAz ӦM3~;'OlP ܹs1yd̟?G朜ZM=waѣG3τ\O5 Bl߾| YSSqӱe}غu+233x-= f¹'5⡇K/#FoĴiZԱt}%΂[^>}"zBwK7vTSW"WÐ3`ET`Irwcg8j^!BBZ8A!%<7y jl*| 9 CnF( .κq@J p ŐˉO `l 8Lٴi|I˚dggHOO c2==;wD=|ҋ1f8p &&=܁(**BFFC`94KSU5(oMTR(++CRRЀkT(_ꫯЭ[kءC0g޽L袋~z :4z㪫yB;v,/^{7oFϞ=[_`R(}s@m&{ґcTTT{g&Lʕ+.&=}99I0}+ub\dFf:ѱ\.3z읦f%sf& s7EB}a[Z/cưX*Ө#"@@x8G_oCC HEH75k x5.#g"umPIk 4uْAiY$ޘ{12Aaaڴi>}:-Z䓾l2ǂ'Jom7RSS  66/"uoXsBIk}+ub\ƤBH) 4\0~N-$bCUaH64D Ó'oAߖrߧѱ1F^]Ơ)Q_fDz${JnB*B*EU8[QJtȘ$8d4><^ "{Oj:|yhhhI+++ ܔ|E(**jϱB(2+̟?v۷oG}})oS_ڹHΒQRR*-ZիW0,.]xG-BSBxDZgسg`I(V[IgAvO=z-3=t*M褵0LdRJ0 ("!4 /#SQ UIM'9Y @3h,c%G0 TPs+^u'%D<'& B8ꯑŨ/>hH= !yIL7gF@4;Q H 0x[1( G@>ʫ.]/r}, msNzzz3OMx4>qDӫ7}ϒP &Hyk,v؁Gy={3=zl=DMD:=z4nꓖ%o n8s 6oތse\hJrcڴix1h +Xx1<ޓPF8 !9,]UUƚC-.褵0LI3)3eewnY锞JF5=RҺRJZWJBɊ>п|CCM ZHHa֋Sl֛0҅$TH*^)U I63|15RMC?5 ^<5 ~+>=5 ^ٽtLmzaָ袋hΝ-Xnf:~8UUU͛iĉ<}hǎp8h˖-EDD4p@?I%%%TYYI6mLz뭷\ϧlZz5>}JKKiÆ 4xf Ef+[ &mĉtR*((:t-XYz())^{F!zjS-݋`uw^ӧ}T]]M4tPZreP$ǢEh„ xfȑ#iԨQ-i˸ЖvR]]MÇ5kSOwm~#Pz(}[@tjڱcUVVRMM ޽ƍG/'+uLlØLtJN2(-I7ɔ3&?;Kc hϻI+ )HHiv˨|<x~IUm 1鲿GV hHoڱ37lv̙34w\ڵ+v:u*;vY>"_zEVKoy4sLJHH N_~9mܸ״˾}hd)66&L@{`enJrNZqq1͟?RSSjҀhÆ ~eC\\x㍔GRfrFRt(=6Z; Eg;vQFQTTeggO1Y)mr4RBs"~ μ ] M*nBaTPalJÐħ'rpUVS Z]\gV– Y7?>?_[juǗBr*] ft6&<.6mڄݻ#55K,ҥK_EcdÆ ㏑ =b1 $"[56Fk2ƉH]񯝝gr(ӛgy*@ Jre>N5>@}zǜu)s52R=^t = p;Pw*'@y((y-m },缜0 0 0Lq.s@c P]'Y5\Uک3.$q" zC-(;M)F};~Y~ғ*A^3ZI>*P,<<@H WM9)?ɍOłDeP@z# Z#ceaa9P  dL.;՚lpRWz HsAA0h,儴D!GO U te.]Ntfǐ4k^V4 C8Q7 KB*H I`fCP^G~3 0 0 Ü Nk'{VԜЉwZDe%iNafZp(גy t %&/I cHR*@:tg=:/uX=1$ۙs 0 0 0-#e#xIcFR~IJ0`&a@T T+NV[ (aGƬkAVzw-89 5dp$$iaiO֬YUUu>,D$&&bXj&aΜ9HHH@bb"̙b}w0f$$$ &&Ǐ͛#Z7ai 1 J)%^aKH@z-LVܳMzoBJ0bh q'e/5O- \g%8S/>AFł_gw YҲƲ.13 0G3≑hD"fAB٥Hu퉘@:-UA**JOˍPb@tJ1jغf#ah{5 GÈci.!( %*ΐ $' y2 0#//Cm>l07޽{}R4 =aaEu* à$ptH)8H㱽'vI=x$ _;A F-#kZ]5jqP@.Ç)M#Q4pP-\99 cSJӱk0_vDu0 tꫯ|f&`Ϟ=HOO7Ϙ1/2Ə_̙37x#6oތ qWC a&%%V6 6 QQQߞjbP@J Џۛ{e),u ":qL'B.QfzPPAc@֨`E _jD١kN~Mb^ Ns?BثAѻbg0%d 1G,l40 t2wy'.\w}(//ǻヒn wy?)k<f'x>!CN Ne ܑ%IN:N 2>h<Nw9 ǹJsV WPcBʦeHsHjOVWl&Hg>~ Gbnxp5`%`a +}݇G}>(z^zGc={g"77=z@=w^|Zflܸ7nD޽+W40 ø23rAQ$<$ueL M! ܱ3B;sOvu! |\ 5n9zr?C?r6t^j4'*~·B]aHE5`bj/=GLV_@B."~(aaa>1X:NK)$ )}n83A Cbs[Z[j{j})2n9N{# ? 8ߢdHl}C悫 uQ×F 04 K\۩TXu6<E@'0 0 0 s.½7Ru@Jxfh ֹVt1Wag'5HG Z3q͸R]GC}(. \qcRQ D=~B*P mQ @.H7CF)9H8~CwA-hk4&tbl+aaa&HoFuhDuhf 1vti{m&P,R0{B tcT-tj(+V}8x1뱸@w:`5>! / I"٪᮫3EG 0 0 0큔RBQ#4$e^\ 6{u:2hCwAڢk_8h,t0$>cw N!;3k Hw{h I.'sB%OCMl'iCۯn6CaaaI\g &A"N4Kt=Ў:OƴbX(AXbm4* \7r0< !}z K߀ayBqHoP㒡;!GE 53.)ЉؐdaaA (UQaZr M2v;ɯveYe V{+A* :d9br t2 8#)sI]ӠbCBG\HZP@h\&lC$CiPos8X<Ý- t:Hq>>noHi !FI=)$ ^ayo聜HSDӧHS~gg%ÈrBw:;]NK| ^>wF\T0 VoA 5!v𶓟e˖gϞlHLLUW]z{ zvٖ^#f!Sbݺup8-bkvY[[o˗/?gK#Eu w|y?Omrޖq\\x?pVo9,}kσ`h{X{.H׵3ۅ>4EegI½G8H:\uݳ?P__v~IoȅbSWIg-4u␮BBZ᪩@ j*kNEKr7{ ALPc zC-@axPYb/שk>-[C=#Gj.~ߠ\ "I{_\uuu(**®]zjbƍׯ_'Ky~RYh222__,U`~<u k$ygg^ 麡bh~},3f ,Ysͳ{n_|q*#hj?Wj rƙR!B"v2BkL0j(t@8L8NЖΧƆAVa\tG=H i9^Kb=h0BHW,t13#ʼn'0}t|'kv|֭?~<-qժUx'7 !!%;9&o012V͛qFLJ'|ƍ 麝1N\:B?m݆@Ufyz<7nH1y~d#ndRԤ;{9+!nJE,Q @y{!HנWUQ WU)tgHsBwUU WihuUƌ&|̜9gn7r<Ϛ5 v pa̘1&M‘#GڬowN:{q>?O+4;zj,ZE): VꫭctӉɓ'g5oK/Eqqq:emM>`Əz 8uje(9 X2,=DlbbbP^^Ty/]w哾b |xʹ`O͛7 o͚5_ܹs1yd̟?? '''.oMSرcqI3-..GE.]̴ݻն3j(!}䣦iiinS=?S\wuSN!33'ĉ6lX/cgϞE߾}Bk7cn:,ZM#1k,+V޽{nݺ2O>G{^6mס}mNm5ځ?'P]駟3deeaϞ=޽{DrW_/ƍ<ӧc˖-uVdffXvϋ`3~li ޲tM3fo`ݺuxw֫)`ntX{Xzꫯn^pn]vOgl[L[ 2WsϤkP\ ybN)5]Ǘ;-<Щq6#x~w rOUCXlНPf2y 6 at r908ÎÒqM,#&&gϞf *zz:v܉=z`ȑ(,,4ӂyI tb30}W֭[bLZ2$%%i 6a׿5zLqUWAJ?ujd4EQW`ڀ'-^ܢ"ddd]zd/))ArrOނ5 N (|ALLLEP澶T@۶^ XGD۷/6l؀Ç6l؀5k,H+>}cǎŋsaٳgk.<[ڂĉqAl6 8 ^]3PZ0lg?:j=,P4Mbhq0>RTT4tض>;#1y%tBF>dmm-8! ++4&ʰsN1b=V`L|8uTUEff&FyEZF*y!H2GJ;Ed$xhK!t_AעV@^> IDAT ؃$@@HLjXL8 {'[=[ {>UUEMMMAqqqp:fZ0b[Vtt4jkkrkkk[.c2ܺK#<~gΜ!C0sLg?biQ`im0ܵk.]\gΜ9_Wؼy3@%z`^)5V@W֭p}̡  Á2qqqlp:سg 4/Dqq1,Y!i& >\rQٳSNE||YުU"== رcVkb2m> c'<-Z"A:b4x}n#y\xmN?.,`HTX)qLTH" IIxmEӔ^7t2v&M‡~t_<"%%%SRRPVV"j|QRR[+;uX\w`3gNs=ӧۣM?>v;oߎzF`Ks=yoya[[XX];BG\*ÛH=AkD.v^uѣ}{&X=PeB'oރǞ={obϞ=>H7~^=Ŋ+cw]yiԳ#ir:b=,"1[Á5#m=ˡ **Y#%_:/iiiPU 5j5vލ/Ftt46CΆbAll,⊀{=y%(Rt=S FrWى6oߍMqiC]XᱱaUD+蝠bd wcҰzf_fNAvͧ =s=r7n17_r'Nħ~,>СCG֭[}>ipxt̚5 >M gy}3=ٔ;vGAϞ=eIaX^1a[?裰7Ą Qv~THldggcذax7vZ̙3/YzG_Ȝ3mۚ+..ƴicРAxWxb׷(?BGC0Gg?[)S`i1o8/zv3 踱"P^\i>мxw t񨨨0 55'OBB/^l~?y$zЫW/{r322|ԣ7-=2R)-=RӻR״Fi)5RGDM6Ѱa護ޢgR}}=:t{1̤{y}^x̤C\@'Pee%mڴ233魷2ݻC~!UWWSnn. :V\s,ڱc9ڲe eee,;ܺK@'N}Q}}=ѯ~+1c9r$5|eQAAqѥ^Jh=I8q"-] :D ,h^Oٴzj:}4҆ haFI*޽;DLGjL)z#jvL=CKK_ƎK=zoH`Byt7ǩ6oL'N[]]MÇ5kSOwݢ,t8|3~li dVg{<ёcE(a+{s%}ػN 6GZK$Ci7[#kƏOB>}:͚5nVZ`-Z/^LK,K/^L˖-,^>i )J50 SMckj2uMMdJIB]Rؘ<ٿ?͝;RSSfQϞ=iҥ,޽{iҤIdnӤItOKiDƃa̙@v.rڸqcrwAF(Φ'xY_zEVKove.ҷnJӧOdZԫW/Z|9UVV6)W^y%9ڢ@@t }5CTTTO?-!*)))4hϵ݋R3L[j-[Liw$+HDn0 0 0 ôP]]Gׯ{r۷oǥ^j6l[|C}}={|6lXDi)t2Bx 2I] c:vHxfaa.0  <~0 t`ِT8UUUؿ?Ξ=(`Ȑ!fI8OL4M&`M$62A8k: 0 0 0n{kTT!i`ZaXe@JcL7g iYN,t" 1[aaa1^$'A;aaa9R6.a51ܶz|6:iaaa Q ^3YG #pCB\%0 0 0 H pRBJcӦqz0 0 0 Ü;@kt#ǍN:vQ2 0 0 0(3I ҸpGJ A@aaaޱ%"|g5M "*"!¡AaaaH@ I I4<)0 0 0 P=)DcII)1{I-JaaavlfΝ;W_}5[t,XkfϞ/Nȑ#SFYYvڅB@ZZJtY5''^{-@&f8U ^I20A񯝻#&޽{Gz 0 0 0Ç#z!CݺuCLL `ٰsN$''#''(//Ƕm۰`(k"33DFFcXV=ڼ~ee%y :ԴŎ?={`ԩfUVaٲe~KB}$0 0 0L{afzꅤ$ z>lX,+'|޽D(]vrssSnR^] H_e 0 0 0Lf-=..>i'OD>}۽{fgKAHcQJ AuxƒR Ë+yaaaa}QsYЀ^{+&:Vt7W#7aaaڵ+,K30RDEE[n 4Dg;BH@UULp#[ 0 0 0Lp88uTtezq7n :*Hi,et T]'KN v%JNݻ;Snaaa%۷o;ldgSp/i8щrc$a}8}t 0 0 0 cgb:oUϹgREʢkZ&Ž%6 DɃ y~ԉ `;FڃHl-YrII]R8\ᜳwUZ璗-J^g]sշWi1 N T"ZEFy6@9)ZEAazѣGzFŨ+$?pwL"Rj2@_}pS5|߁?λtI'tI'tI'򗿌,1;;~k-/1??MRolٲ%bO_zvڅ={K.9k۷o_}C!.l1qw੧ZN>c;W}΄!Fr=B $Gx%pX"B=N:餓N:餓N:餓y "z=l޼Px7cܹSSS+p 7_`rnn7x#`Ŷmp=S]n݊[^^yLMM4m!p@D\3o& 9wd'tI'tI'to|+_g>>}:2^\s @Q8}4oNܹ>\r Y\n݊`9g;>,AO<Ī*;k*+SpW1q<1F҈0CiC;{17S:餓N:餓N:餓N~]eii _կ~D%,,,*[SSS(eYi<SEd&w~O?4~cyy[lUW]={"kM6aǎx#Se˖U (kRH`  ,ɻG_/{QI'tI'tI't$M?yq{=AsV@5k A`SZSW/e>|\N:餓N:餓N:=+N·-{˿K>}eYرc0DPi&\y啑,[l|cǎ;NL/})`w8rM_k|Mg޽۶]N:餓N:餓N:餓uip)>|/"~a<,ɓKP18~86lYxQvk-cn|qwcÆ F8pvy^m?oںuS$B+|40SI !p dD{4gλhJ|lCG[ "dW1gP2$+. &8i_I _\R*:ա]0J F{A!ݸX-2~~ەVYYǻF(M5%f͟-u !&/YB>'w.ZOcϷ K(Um6+ku6sRҚ}kGB֚8/NLߝk/mTޢ!koքOCab8(,ֶ ڍMy^-$:8Ќ2RBH5n"# cd qGkeҺ䝗[cǎM|v*!,,,kxQcI߱ii@D)k,//ix뭪*LOOuqaqqu]ʲ N8 yC1'>bӦMl-gRhXI}kZ%FXiTU5<-l{5(9[=Is)g﹌jw~ݼys|jmXk[Z'"ѣG[iS{(2X^^UUa͸+#~7|!lذr vo^Ç1033ݻwo?#iw}-XϤ{LF)~{c҇&)*>F s|8# Ln4$CҝkD 5 &`A8,lT1"jNUW(-7'-Fc:t TEm d%FUNm1v_v@@ҁ+,o5MώkYVP?oR0nO|spZpI|C];e_mŬld{_o5h0Zі|tJy=ӻr'O}{ޑ՛g@04J,ǣeV# 8 yP޿)85 #+2ro/{7PbUUSOqC8~ (!V0byPK; nՒ^d09]N~eqq!^쪼+7޸h{:\$TU}QH}R1xJ"`6 `X0 N3%:UMC,[$(v WTM))y8Q% k6 Z'{Ur1jڨ*r:>3 -q $׌Y+EߑUUۓ]"\*; ?+7؅q6h.3]ֿ-nDW4D s9o:oLچDK9ĺ$ ь1Kn9/ĭC;ɒQ~5C((|5v9>Ȧk6_34f@&ujR 3m73{ڿ)}a]M~ yJc0+0 45E<"%Jcڧ`l IDAT $2N,Pr_2_A6=3^]',yjH}-^bWm 1\'\,X',s(ǙL`2;r/<( R,,Gh+д  ouN Px-C`sZlsN5#2 {b@&0䙠 &NRdXXɱsLS[-!AJ3bQULƱH jmR}-,`9Hɞs?&gm,?dS>Wm7[T|r1sT}@+m Zxbkh|\^l&J4b)I2C.g5- Ē~om3dK- oR47%P<>< ,ڿr dӏIdn~>!αoˋ"}"W4v zAUЛ! 0Eg٦?m2p$4Ҥ inrA^ 0&GPx/5b{LpaÆ tޗ]v]*k_꫸/Z=&՘q@9wL] )rEr*3E 7C6hBT0"$0S OgY@RN割5b_O@`*IUeYOA` i5 5 >1XJXmRxN5%!1HcQb m1yeڋ$ckT1 U&0cF#) 30F#(cьRo=(,i 8r~葳X+5όɳ!Bk2[XК4lnx א6H-rǹ32b+b־t<-(=[bdot3ܒiwܢuAa@ UI+ @2AJ+x67rm6FYɪdVÛPUk x Ad@Qʢn8*9d~w]%7tŮB't2A>\*${9LgќJ^L)XLJHb7"5:Y`J),c$KEa6DOMb I(׈! 䚡PTv 2$A Va J]ԙD։{HH:j262_Tao3B-ZT[yE40Us gTڳ+9Ѷ3> 8(b wAR&e_y %W4LƁq ZuM0+@wyYDRcvP=*eIg,&~;qqlZVշ~;y4b5XQ(8&Fh%`w2Ӝ4,$PdǡHs~εX/gu jc@{ Jx6`,QQU=la? gmOfHk4aB7 )4jM:K9ʂ`-PXk< \aœHuI'2uX$/6,*`9uSG z}ooTH0FƇ IZOu{H?QRzϧ$# UUaLC8Ϧ,<XqY>5g`8Q'$ #!a%DPk\ ;UAUU$J)"c"AjqȔ&`9R^+e}MTc8t \M%hE?gGs0%L_~j;@1PX\dݔtG".L- P,^?]$masPd~`pRhrδC e(8طPUSݸH@`}X ɁW5sƄѓ{;J@:9m\fr' c62[{'"j&)PmJP4 an6e30Dꕠڭ!Ŀ1fCDs;ߌP Q[` !%I  kPzX.p(ʊlCܫ( Vzڝ.=r2mTlY (|T -#XƱ򢊝-`jJ%9 L+l„ 34*s<3< Z`o3+7+? e\1\33-UځA%HGH=Yݖh:׵>^[隰0A7 |0 ~8?c8lʢA4e=POJ.. b S"b]fD&2N9$_(q2j:} 1GtsГ ד?;b[Mq:5~`|F6f,|hԞL{EҴB1cyzf+KAٯPXk^!"Z% 3S,Ы, Jٯ-O,3J*} D{4ľ'͓WGU`@Y`Q%al=YMVKP!;.K04g]wJZ !9XԾQ.bmC+ $jaZ6kjW(w HsP@}jEȻd.Iu$cP0c>kA`fYZfdf@yC!CTd391Xv$7x(9ሡCx=ȾEӸT9)@@6r@PZM*l P`C?B5z}FgqiH9 +c#˾jc`Z  FFUzShGQXV d44s#XE!H(oP (E|B_kx 5s%'/>lEa( fgߢH;q'&y/I"ZQo'? sᦛn]ۓopꪫpu׽U{bZ֬X[&1r|_F4믿g۷O>d[nwzs=Gy㲭!DqQYd>*J:hGa x/HZ;RKDpމYE-)ZMßXֈrDp +0`3ai8<±Ƞ*,*kLЖ8 i ]TJ*jj8BL0sH֍Vyr$z>Ulkr!16ȕWj[U֜ʁ](*`V*ytq}ib}WL},@SsZjaA:^v&JҚuB(i@]\r%# 2eYp;upi} |> cFxkے3K ސ0kl LY}Jc$7`{jzX;@N3dM9ꦖ}+[|Gk/:dM2C^e&<$j]`)+jw!v36 WtcPn:Y@GS֡Oc`1aSS=,..b |5̌YaCgFZ`~hTc-1xͣ0- f@7i^` 86'0j,q.[\4{/v.|_ϵ_ǩSp7_ZʙO<~齸nr9O8\ |c}{o+(Z]s=زe &n6}^xkffg >FxQYI Sٌ*kaΨyQ|D1EfX)' o͊ CBQؘJ5E`N1BYoPU=u\qM>Y1>Q'=HhB"{ep4}'`- <i.R& eY65m:)0s#Ѣ.%@Z폀Wos.$?&ʀoٸŞ$Y f4d16+U H:%}:</( EQl hCi< 8|jcL2n#&K {uV3i"4`Y%!EQ gk s 3[A;P39b`+k܈-5-`ղߵ (!O5]O"'0֦)9Hʖf)x;8=OaJDl>SY*0\^BW/QT%"!H'WPj#yFw8Kh!zˋK0A $rĩ9g'8!PHNA'F')bW{-W_}5~kLOO_ZjsbpM޽^[7j,$8 |Nzۑ[oC=|#C=n)I/ &_|E*6CQ)*ZٙffAO[ h|)>i C`pfo)"QOiAS}#^(%m8z8[GAS k%A1lvp!d4 ri7P@46&7A} QLqJcm+PGxRvLR4VjҮ&lF197WF6"ֱr *PP6O4KI#@(奲=}6#t]f­aԵh4`sFH#҉Q}PB@ DZia-?)Q5LZNP90N)$ > 9}7Ec}J]Ŵ30T@bJk4 CS-̪ `?1)[h36 ͘6Xˬ)]Eil@1FŎ9 =:xðP+,{kTjԮƆl׼91EsTU]$]Ʋki-```H&WD("2I^q]y5_?#S~ɓشi=yZ]gùϳ{&Zm۰o>lڴ 7s\ 8~K_ٟY/~籌h'|k.ٳ\rw7СCxq5?9yWG`0X魷p8nF5,Ȍr2AWMjXy99G >Jy"{=4.3 1(eQɓ0p`ú׫0~'pG+(` - sʜF3rAnh&ZNgfguQzOtoc8"+DSJʶXM{$SUe}ԬH@09*ID{5 !d d\FҊ*RWa 1+˂ʄXKNE(P>ʲ:s,?++ٸF{lTߕ' %Z攎s7mU_9ս@@p& гm0]rYlE( afzJFq؜_5d.v¹SSS̫ ^~( fl\v$fW ٟҠGn ʲ%A+r뭷2޽{b8⮻޽{q)K8qDv -necW\q[oO?4ۗF"vmxꩧbP ">y֭ooa߾}صk^~e<k (k.<ظq#y|M8BZ'N`0`Ϟy\z0 DL&}j 8x81 k2a;x@}kTSSpP (TI"@RUTTayiC < X73S >[hbL!I k%BT9D0$qBUe ,I**;c+gXR-0hAF K[@ L߹"~v†g$*|U [uPFщca?{ %AbBi-Jk%G9fTޣnFunP59p 뮻per-KQU.r|sk}>3Bgō7ވnӘ~ݻ/Bonn7x#fffP%mk[n>,݋]v*l޼ЇZ{gq7 fffpos=w_=.rz=_~;x}H۬lzl/ IDAT݅޽{qWczz:՞={VՅZ7kYkm޷Zu~u?Z}Z^*n³>O:$M7݄)XkuVs=kޏ>N|;mݶ*zuᥗ^j]s_Ƶ^ W؟(4Q[kHxH#~Tj:Fh)h3NM@Ϙ́͜ ĸc9 8,p>+\i.ׅ1Fv  U 1Q7. 5Bj^?ߵFE^[(O%3{5:bF \ kѫ*UhUU h, s.!{SBׇ샪Zc5 Ci @k@{. Y9fJYj?mY #/in Ϲ#&5稸>iZcTmhm>Yk1pEL{p T׌b'x`uQ$]v`HR2Xl#4!\=nH ҐATMܗ4-i5HYPb;yZYɸ^a1fgg|wMMMa8N,cgZiD}{:Kp7ވoذzc4sֵM6777ݻwx+wj\vekׯ_7xcbwڵb:vzWcowiݬemgzju8y>_gnn.Ő8H<~/޿nݺ)ꪫϯze]i.kغu+fggQDfA-9!``PPIMM 2|Kz}D,Qu Bw>'k,} I z"xC. Iy }D֗);SlH AG Tʣ, z)h`4AM#(4뉯eȃLe3ri`-q_0tU~DWlt6jpdhHtY#&v|0c:$/ k1Gc@"hjCuЃA.+@&SXrhd2k6Es[{[X6oF"lw!C^ҹ(oC涔c zc+v_Rb!;e^C`_LM\U1Yw.*ITUIw<8x V|7قjLzLmc8|3s~wO=~`yy[lW^T1ǟyx`0{fff0 V\?gu)K3<~ZBj255X]u3IΧ$\Z7i.{\>'?UW]={iN=zǏ'?I|/~ \qkK/a۶m^z)^8=}.X8)2*szʲO agLI`SӇChc@/b}6Dq fq)VcP V<5刚\º>J+gm)@p51$S)Bld rDJ `+"wŒ&ޣ, iB"sJDL2ZD{FRo& }fx^_b[3H1M(N2"0+Px.f9QL 錄 )V?4CTH;+C2n|u]>.˒SXsp%"˯sH:|uAx4"4ƴ0y\ hC(KrSuǠ€s"Hz }/P@|x[kjౕ7lf,L݄ \5u%s{ LCS*I8TN!f/b,1אu"b$^aMn-/˂|A8o콤;bj%sЛꑔҳ5kH6n, f͔sdɻBGiZ+˯;6n܈O}S_9s۩k~xx^1 p!?Ç[Cguֵ///IaU^Ps`|<fgg[ e.& pr n&Zߗ˅R)SpMujŜ8pя~φЇ@DFqk2;}c46'3ѧMA#dꇓ!RJh3J=Vº(HQ`5݁^(IJV䋢Iٙ>֯FWp@ѧ'M]2DFe-d@RYP2hT!sb?*P*VM!*9sY$n!h;|.w咗  2d:{b]Q6,,s\MlJFˁKH|t7FQ7VA#qmԺn0d2GF|"8No1XC]? SFkHHKfxH*b*KjJ i4 C,--cyyQmG C(UY!BUV( &ʿK,Ei f# (728-ZJR{4D$ l9 =c%YBUUtѝ؆I wM2[gnu/i2͗ `*DYz^Y=XM!o 飪H?q \ ׌2 soQ@*QUc:y7Lzf-׎9oׯgsxցw>uxutm׮]8|9o|/~X)\s5?뚿;vCZ׎?}k;w^[k;w䝜Ŋ{.֎Ikصk|h<pW_};wlXXXh]t6W_ƍc. 7nā&?;;[W_K/k&`c?#̡(`6T #5s*M*@AziF#qX^biqT4hh4\i ) ٣*!ESxЃlt.0zuLUԿ7JjY?-q1r?`?(R6b6=`Nrs6 󍺐dH^\\BYSԴ쩺$)${/. |Ca9FOU2gH71t'۷o#<ӧO{ysbii O= < '>9'sW]l ¸V|G#i2䐢?FmS](KTUQ]GDY='UY: pG-J5r刑(W^GԵUY!x͛P6p#`Za!-N86c/, k`un Q`ͺa L*:IW66(jXE0Q Os #|_[xV^̗8AGH,,|~f|ޝiz}jzͦv0#L  9hNaQVUmEQ{%Ρج2u ֨Lob?Y|fN~i`ppM>gTU_8wbFk>1G+@eAÆ Q# #0+r_5N+=d.EiRFY;PKФR@QhuO2_w8[,?0%S|=t\KOZ+zŘ+x[u^SNáCǦMp뭷bCÇ1033ݻwooh W#GGѣG155={@ǏGLʎ;p]wagẃW~ <#ܿ?w-c:ƓBرcʹxjutZL[;?R$ɟ_K?4 v܉~;'|D3L??uupt%67 `$j a1Yqow0jxm nRL(R6N` 8Bb݌!ƥmN-{eKeaҭشqᱰ 78-[ay k࠷ hb0/LDɄWn%ѓ{h{U9ςCHԯ+@-&Tl+ TP8[ E.[ )JsW7M#W.΋_PeD/NFq.ڲ6 r G -P .ehT 8C -+B &Z̠f*dm6>=/37DfcF+ձ}b}oeχR5r?F"땘?Kށ {ð,h{ƧI$K\b"52J9\7*Մ AWs"*!J:R:\\gTXeAd(  e̾.1ߩjhDDwd.m!o=Qr a!dїH>gy^5U%9d򦾲0/hRSc)BdP5hCQRWz95${!OcFTw!)g$7d4,#KdEMyOY4Ñ/ۜZA@/}B@S11xqrJH|a(F D&ӋsQ f(%pxqJjJ5h$GP\9Gи;)}Π8!)[[ŅCI3yb +IrP0m 37RM8nv+Nß)PE,G=<֯_aAٷy]t=* , >:?%e8KqYcPk!pP ly)K@#m 6Swαzf|rt+m۶u@N:bHLeI,U5+ʲd"xTU]]ʢDUq&5(iQ,'ginpzbb ֡iFh2Fu ,.,`8pȦ5^pȊ.WӲLQV7x L)6|,%j rS;q_%eDbnI$V`qIXҺ离"i➼r`|$R>ҜBdи`XcT7h3l* х} ;om3 _&y/b 4j دRGtUQ_Y<5cmXN'mT88<2kǕMk@7 Sr|݄#eHJY5 .iiHye>"į:\d9sPM 61xD|Ajx98IO/`s9 !`j[X}I׈9V'.cT]$n|F}p_a3~߲褓D[#ɯYZ4;|Pܐs o9̼DK6P&&3RY"5RBU6DrTe^ӧ^U`z~¨, ,//%=7XX { 3rШ( 1¤QŶ YDs@4>@A$RVւM bFL /@,GAdcRν/OȀ؏fsj;2P>&kcvj<,4=2/:\# uc"Dϲi`'emrhr*,yxPJc$,Iֶ0~<'SL [ GKf ơ`l8 |D>A ;V.Y}I)nH\@$|AlȄ4. ȧ^!l޺/ u{o5m౸ 1%>!|>鬌G[`PH`yp9uӠxP_+@X8zq]ւWoEQ+Ѡ󡵶:7Q>_*tr3oW-&19k$Bf!SȮeJeB)=' f9D#bNX 4&ΔlQh(d(KqFlظEY`vvF8ZXXp85MSi{=q4{.'e&s[۠͘= ;\|(!*W@# $ $W)BIDAT_Kejit|BLYfb||FC֙LڦX~HqFTQN9u.``m "6 c&9bT/g!Qs%:b=8A tAk 0P"er HBG !sWjj`МđU`8±c'0 ZSWB)q5},JT=SdIR2C(uNǃ,:jG?wy "Ǻ=Кgib: Xt(MkLNrh2՟`071U $Ze`k0\\9Ak`mh\*J5dPH,9e2^uc8r^YmN:餓N:@R(sb-+6cyZf H@ f<# ,9XNSƯn)[A<^xB&nC˂Gj3Xۻ8Uu$E/1Kv$ mYL(,' rAϑ"o8qI $D-?$R$g/Rá4Z rff};K9AXYYdR܂d{CJr:EUhw:29|J1C Wyf\"aGMj XsRo=,nYk i\̵CyXiKsFRtlHw^u;e  'Wϔj61,1TQfDr6s{cS]R`BgepCr -v5DX_&wF 4諲\!h1H] g7)8 *;{@8WcpH}@ߡpyU _8+ZT ZE[KH (Cn;4hz˚"'!aTg./Bg?T9;+!:lF?L}'`#VxzHRq)/V-喞VUE; s<,'GFu qAxecnߤqppñ=Ev^KYR|Abk#.C. ұW¨$,}9Zj8NP}k-. H n^XGYs`ً-waK_x%L'S 03jFA]W|$!p´X縻e٘1sR,-*cSΕs5Nʘؙ ST[ A;[O_d=dW'klaIm'0M)9S+k@JȺ8IbT1Ԥs+>igIG>S]IdmF=ԎAT4S2i_7 ;59qȫLaL2VY3eीS*򘌧phhpWQEP5u.2(F4eFȢ[u\H^:=KfbCru>XK-VK6ICYY`QucQ:뤠c,GYN0Oppp ;Od[c+uÀVV U7h-Anpy?gvn}8jw` Ϙ}U< G&?p"<4'Xtb%|_S N3]]G@E('i:RWIwsV%IkdaS|%{}Z+V0@B6z7irZb:Xd9 ̲ dYpWc=L#@@*T(E!cGt/e)T~`2u#Âu1gqYte͓;P$Rj?k*)FOM&BU mx00.p wkkȬEfs-e>%_-,CLGc֠alStm"lTz/i mz ,+IA}R|'?2fZEF}#W,Yue^j|ALTHq6ȵC@F`#0&:: 'V6RٗWAyVH.=ӑ2zՎ&s#̲\HV*w\RTrEE~QΰO \PuJ pMD@B_,6Cν%}&6 em +0gv0O<;:Ԩܿ,k1L0`CfU-{J #>h``l!K.9߻^cDӢC!x (9;A [h^qR &:11(i SL+!ϲ^oh :hGpdXUW؊%q&ވ?% cPY}.!"_~}(_+v:x-IضwhdP QNHj?@UW(ٓsȲ ɔ}y,Z2|-ڎKYR,YKsM_of38Wˍʳ!l=Nِj & }j 20R3-!E`$UXE6"q!z{WS`<b:-y֡vR*gnM6y!B7 6f#9{   "n1DJn줓yc9ːN 4<@BaS.95bN$iCByi )Ĉ=Dy2Vk,qzX<* 4Q2a5JȹͨG+QhۨF,(l*.d1f L; bR&>$kc{E@YZZbpv\[_`!TYf:@]kj}ebg!@@ZUުȳLNaZ( b}} @Z]%DehۘNư6\r'Np6VW8Z`0,Z6Bp)=Ed:[]$'bR@*PH,C0}y7 >Sܺu yԩSr IdwwW^۷|2^|Gkoo}n߾ c 666cc\2_p-Fsu_½{vqY?O2t|Z꫸rܹ<dLկwE*._Gqw܁1'O&N>XtcɣqܹfnR%vOƅ +<\EeQ{y}4z-mz'O'?ICr=Vzjތ AQٜ~K$'Pʛ7p{Yl[LJTUF9qXk_n"1nD^E `4rTkXULf1zgX3g#grF(4rf.eWt΀>D(n4KF0ad#9$c\7Wš -MAܞ+*4 e|j"̰mQX Wcsjɠ@(qfU,)cCB'wh9pډ쥎A{E{FSbzQp+N(m?|'6ַ(F!Z13_0|,Vn v%S/ęF^%-Xn' z#-YQ⼰zl@@[CﶰiYQ^Oj"|];LSz+]n" *E kkkh[GU9ԮE!e ,B`0*Q9Ά/ˑK.=w3}yooo/^ĕ+Wpy\~oƙ3gӟMy8{,Zֱc:88g;OMZ-oxk-^pAtŋa_9sv[?o>>cG?{g7xS4x5X"wǙ"OgtN>?׮]{8{'OjDҥKt>C;x4M$ծ%T61LC;؉&}ɼTx+tyLS7lReJ~f *LKI޽K>ihN@f 1N*v-XqF hlJTmDXە +gFK<2 b0@dY/}kfxhsI^Dd&bbH@dPIg ʘ^cb"?jm!f0s~g%e"y.[&m! $nSP⸴23:ͅNMBp\Ai9 uphu UAǕ9`0o5%^YIH„ɆvTLkdyT28TUZ5-GIkmL> O>]**K"r+h?pjpHmWTSF"-/J#! qxBEriY*h-rH {: Д2G)62{4^p*uͷD!ړ8D Ǫu]SuT)S~0s21VP2Wl/k~O֒XĉcávK;ޡJ xdEb[<>"N<Ȑ&`JG.)+? j@gh ۗ5YE;3Sƒ:2>ڦ8FVU*ZNwE^NuR}ǻ.Q|KgFf @g[{ &ATeΚ>ys9rXyx8Vq=˹mll࣏>7tϵfg;;;sgbgg,y\7sA&shn'9t3*a粩=IuJk)`{L;=m$$/ ^E5:Nsꁽ@1Dրx   DQ~_"a6 '|8AoND[*L0O^oq~񛐌QAl^BțsW`I@,yޕuf^v4S@RPfE>M!q0NtX.x-Ƃ<dB*2kk@$MtѺ{^ 1W09VT(*5UW3l?.xU3Κ,TX6 85:Rz޿nUL[qIey̓gF6>ScKx7p…F4ʓ%/jv? IDATxIeٕ4F6L2IEVd*OlȐ=x'`@AbIffknsZLb"e^^>6*t]u]u].w t]u]u|z뺮wctu]u]׽뺮u]u]u뺮뺮{g=Fw]u]u;1뺮뺮Y]u]u]z뺮wctu]u]׽뺮u]u]u뺮뺮{g=Fw]u]u;1뺮뺮Y]u]u]z뺮wctu]u]׽뺮u]u]u뺮뺮{g=Fw]u]u;1뺮뺮ޙ]o?9>| 31')HxM5VjꊈRJ)D$"G%:N]/ 5PKF "0xO{clH7WcW>p>.qg?/a`fA&8>BfRէ2(n2'*OnSRKJi꛿OĵV 1SJjn,aJ)Dek.C2푍ꬍ1Zl OHTU~j1ԊUTcJ*bֵ?ID˅jƼƷDkmN)h1ƨބ**GCD RrRKlXZ*"zMb|J)bܞK!ldXUrai:OH;6 )J=yI* 9m[U !"sJYDSN1MTEbk0 ˲T\%mjDŜ"XUUD$H)1 ̜䓠뺮@V%Yњ/~.ƸG|2Pk<뺖_=|IfT,ny"̔SʎvYD}ɋ?ů>o~nWr=XaZ+YY.H=&rK Ty|z;L;hUPDr9wc\cI)m!B4NtSI%o7s[$12cZDTc P,\SLD#o۱XHAM4Mzɚ?.Ij51Fj%fp)㪪-LG"2 8էwu=ݶ!zyAH-T>mEDAQDRJu8_ͥUEƔu.$@߶^ PsjDDc2LDc,5JR2D⺮׷W1g{Z$aH'Y6W/?kI8\WRιBaew1n3x#)kPJ]Z h)G"۶^==='2lK!T|0u-EѷߟRJ!cHXJOӏ뺮{/1;8(hk;oʲ\ȘO>O0ϧVQec4YV6Ƭ77ty>3ns(B \- (XJa/^]_{_Eq/!Lhqy_[l-B lT>+fiړ!R:ƜˠPJ)cRI@jhRrBHv?۲1qRJSE`7r"9l),"R$jLm_TE`PװH[9-IZΛra*H`\iZkJi0 )S&vv΍{"ZcUq$1FD,"ZDub4RU+YLhs@6CDDLDIH%KZc>՗Dŋ*²l!Z8.K~zzRiާH`.m[z<.Ύ@E:)2 >~5\]ݨx> JZkouww˯ !0sMU11fɡ "#k-y9ne0 'U)ٟC뺮/Kޖ$m lOgoT~ [W,|Z/1Vk46L[ސ(C֖RX%mΒ2熒sÏa1mƄK~ a+RykѲ% ) "8RB*%b.>how/J.Y_}}~y|ׯ_Z?H)=<<|0 /^XN'X;se8zad-;W[S9N_+RQcp| Usځ/ZUy᰿{X 8c̺j TJ0y7BcVU&_b֪j_ÖQu7a EaM%mF뺮GKf"Pdc^??z?#d.իWڎ:}AfDtޓa f%KJI*{dBn*Ai % &Yi򃯵OZ "朷m1nGfEZTDk )ZT9ʀkXkwoS.Ԝ3 1)(a%%HޝNǫ+x]a_ H^ZB@VUnmk)ZXkp-ZF*Zr.8z>9gg0Ep(-훗@lȤ{iߺ&E뜨 裡뺮WK9WP6G/_|x+5O!zwwm1r۶/^1zB$"6l!PJy+ArYr FTh%z5?{6 I<N\jQu݈P*v۩-$ZDUhY-@{!ˏNϏ "ĘpG7Ny[.KJɻ9B$bf y̘r0/bՂvq9ZVI5*=_.NH90u6ƨMΥb1twwg-Ҧn+'D4ƪ(8oKb"9JL,aݶOϏ?=>>|/plDX5s)yYVrin.s hke9"qv9zcct_ݴ'r--oɧYJͳ2M"K` !#ZAU LofUQARjuq?maq\B!x;ZwcL) "Ƽ]U<6:&v4[BJ9K.l[lhUhYІ~0sDsn==?onnTeY79#<RJ繽kmZl:; C;qg"ZΗ6Fݽ^ѷ1:DDD)ss^., y#bYHui777˲JD!mDn֔2g睪,9<9L9(R1~kZ{(251䜩UV HYâ*޻~W~pVDاW_1s-:h w!l뺎U{3NrY6&raZ42C}8t]u}OOO4>gwRo&뎏k:%>t}wcܶou91>gXdqp*}<1xr`>|q}s/_~G.[e ..kTcsC.@輯VBb#Zuڰg1UXKڡ9gou}||T7!d&2 DK8˗޹>7WWUŋ1V"Ѳ=hgOQmE✫Es[k k)푉i$$h9KRAD1E!5s(khssNĪH%ö!cb a[u.1v~ǜrigU۩̪*RKvnkkmJkEgDƵ{Ui Uj>MC5tjexlCp:/r{~~nswΩJ֚R2O"UoZĪD),P'o궜TR9cr$|6uk D9OƠXD!20璵\w8ZkZW!*eYz|,f6֗1m81IRrvhM뷽CLJRJQUs|x02L躮yw|8_|z)|OOO"Q.t:K9KXU &UeY%|on*jpswY/2sPw뺶o IDATH92Vh]mU4èjmTGkƒZ|> 3r)T_Ƙ6lBFZqhf,B-Rj<9B**1%M4Nk^@Dk޿fj )1sZJZiB2m{u+,\ 5˥4Z\%ŔR[?n= C$( ~6}b4H""-Kc"qےITG7,ےr4X "PJiM%Odavtj;kI9!U.YsaoR)Hq%akاJQ%TTE͙2_xB;LӤ)kTh/TkMXB 4\ZJZcrɹc䜕b !Ўe1SJ*X朳J{l1VvR-aoJ):k1C R+1;B6epI9v]-Zjsޖ "M[Zk=WWUyz~TVs&rXkۘm^;IqhOG"b !hUffCYcL[)o4$۝x1qs-L#b[m)uR xL9 ڜbX΃KF6$-hæMn?kH]k, l۲ۍؚ]M^Er R-X1 (o~o7WWki3#Vkhݫs{–r0b:~]1sN("Mz3뺮=K\.??|7WW~~;_.?*RU5Kq}L@9オD?t}}sE$˖S-U gWEEy攽obv"%,RCj-޻v,Hm6_)HhywDEBKuYcIUQ#{Hʚ6fx)b%cI)Zj-kmQacs[9ǶɬJU֚aOOO.m !lͥB9YۆRS1kr!lmB@[ZUT/BlSPZlwqm7Gknk1ö́ruu0/\rZsN1n8ǼMnpHJa2&g`&BږKL83!!!(V5i7 deSE1Z([!TK0Tu7|۶58 DmA|"ʹ"6r=Bm < C0 -c|iUAC!DOƘR jtu]ޗ]'|,ioa/б>CZE98"_?25,"Pr~pn0;cvW7Wp}srv$Qn?b;]<᰿\N Ed|I|J(֮%("֙UTDeafgmNoHNE|U̥KFJVP`cL9gFTu]49QYDiR۶ oW-Nu]qd֐af WWvݤ;$Ҏ@v%n]g"sΊ1Z~~>ºFX*d ѷ;mU;mUιck@[n֎[Gc[oW9i嬪)Ɠ@8NG-UUD2SōqFf^M P²2;kG*kqoy4MbنuWWחroCܤ) ⷋV};TRU墪L|Zq|^J)ĵ]W,˒S֮R4T|d櫫RڌHDJJ1'R՚>7뺮~a_ۛ>p>?_|Oö}_=>ϵ~RZn/aN{O@sѢB*d(y朢?!S[S11[vǶJ8oPhYVmƘ3[aC8D48mvFӴ5w^=8̌mËt:-D# ꛡUiQu޵pN[W8ʵctƵ%R4MM)mc4x@DeM1m-9s.m"Z;+`jmy<>Kdsnu qh[k}_0 1Ɯ0 9om5λu]:kvXqngUHx<ǧǟ7_>~ZT0_y"z^cL|ٲ\*2<{qsUi&dw!*yQJDrkXSUV~9綏3Ԯ ϩRʹh:s5%Kc̆۾CkMN%,Rg!u]u}ѵ'7wky___|gWZkDdǔns{)qfMe[ژA2)ǧqj)D,8M 8s:?eacaтֲLD%h%u5Z Q3uuހ m1hbtZ$2 iĜQ!v;RAU1 h)5`%"+ӭ5dAVcL))1FfhȆ1Ӳ,ځy!l|uua@sƘZ33CfiQ,%wi6csx<*a -mv2Ms6rrIz35ċ~.r!skN޶#u3D*)<ϳ1Z1fTA#crW_/ v>Zf%y>#gm)%[?z뺮ޗB^x{{?NK)~za={#O R%E &2J"MUi^O#º%-`ahyJef@D-a)oﳫsvYZlP[ &JѴmB1eYjqʹ䜬s>MhCd]B{<tÚsJDrdfo|iV c͈ns!$ުm\i!eYklv0 4 bL mۺîkW ޭݞq6zp8|;}0y\M#ۡ9m) }#"Ae<=<4G~2Cy{ǻyw{{em!]]OO$o~J0iXd=/4TJ}6G6KI97Q[qmTuUe%ۭ/|>vm5bSJM)Y19B ƘRrJY 뺮mKvmf͹T8xon?o_?\t""p!Z" !X_ߎᅵw*i(3˺^?^{^?ܫ)BJ>v554i-/a vOjmԤZ.R0S-VMJU"45nVEJsN)Zr @{])UHkADA= ԚEDMU-&̥T@nWfVSbNUb -ҺL #A)XifҘYUbԚs"#l1pw Rٚ L<XCLGsk-Ơz9g]ky+ERds~Gb!#63 3jji9QQ/:v{ߔR V"^| /^x_/?~?F4 RZ cuunT֥QBϢىNՐ /5ZV&!b5S3ZEzK73Z T!px+w .NFӸ?њ\ 0Z qx1?|}>w1xۛ'71M,**pvcJn !v8VwYLZQfϞ҈*fʌ=l[kR6'[͐Ƀ=55ARrh܇j}W\q  aQ\E!}Ŕ^~UjC9իGw4H5e]fd3sl yt("2]r-j*Zs!BG,w9y[O۠Wzc1ӛyD"=iBU5;_/G YvqcT/ie]= CZj-8޻@D$g0w+EzoCYĀ7m_Z[%r^U5qzynvN/N7-<_w4?9])yݏRy=*8GM Mj?x~'nhؿ@qZ{74) o<|oc50@@Btl_~?}/}w"4M햙9m>z> s `p.Һmwg&8 ^}_.B:Aċ@o W\qWCwECj59`FG<uYfwK.jl1![ڌ ff%gnv̀<@mrF0V?|ǹnnn^~O+_khL=?ha={[B5fHL@HhbNM㦬MV@|J92Ӝ<"\CY%DfX˥j7N9x:X+x1`y BK)X y@-%;w(T!-^##;瀴!~[k^"ibAUH(t<SbΝGfTg~_?S_ymSUP0APkj@rU5yJ`Ym@Pj5$ç˿_T 唒sL! &Z18X(uY04JR견=l{iW^Ty>"&r{j{v\k&2{!]﮸+]фH뼰G&rH}d Qlw~W<;OUsMEwτ1TUYyb)vN= 1s,D lY=F2ϦJޡ3wПsz*\.Z%003H3L}&"ڹ8\HZ)fL pQY19Dzzb׿B1#Z RȈ@DЙk"M0B`:=¹3`jfG`J@)8}T1WN{s o' @DT^Uwk7 @^O*UgGhby>Zkn/O/8*03412#!vyKP It6hoD"`eSW'?/џ|1M㼬@56nZ 2 CZr%"V"cDD\|ZE$DlJ]/PS3{nf95,zF_qW\qoǻBs1ǬR&m9j0ZۗἬo|+_l)&Z9!\'HXj)sYR[SUH))cwOo;3jp:>*ǾȺ;"DxbDLuTZ Aonv!3vpg8vh!Rٳ*DvH3@ԕ&](Ѫո8`>/<Hq#w1zB[E-7)aދJG\ YDRJ:r<%rzgk-C6l<s^c !UxiT9N)z{*3 IDATj?όO=[bt<#Z/!G`!<zb ι7k-4РZKh4?s_keg<1!39UD@fLva"@HTk+3eYcΥ+tm0"9\/]@2vsCPAJ9^RiH h <޻vcH@7Mߚ--5ZﻚN|*\qW\q;wFB/knxAx8'Oe!4*1я>/~wW~=w)AL;&\[^1C)naU0 }jڳ,RJC3k([}w~Qŋw)^re9֌;STxJ33Bw{d6T">N}{NC@֊jcF31$Lf>pR*Z8ͦkaJH%("甂sJDTk^"井G|ǔR95}oSkkR ]9>NgϺϺ.˺h$X~n4vx4UqΑ#bZֹGqK_~8- 4SkH"OKp)4/ʺt<織Zr-&@E@̊\b>*Ey{-Hl њT@s| y Pͨ9/9g䲄J)}ʳ6Z{gH_Uv3X_ s]ٶ+wʿLG̬b`qs@d>KL q3 /^/<4m7;Ue"ݎeY\ƔsZW K)\JH\>Ek)œy9jOYye{ ol=Ք.DDd(*9g~mҖiU5bb"3u-"Z ]A|[.@Q Y%9* q""j-+RJ݉k D/)*RLU3~ZhkŖWFD1Ⲭ}ݖUpLmLk5F)x!1?W~s/L`P IweDM#2ZB2" p@EE$$ KD _EU " mMDc XksyGXk!&+7"7=mC̠a›K*7]D֖ JpUQ0$̗W\qW\s^e8nӧOqрLsr(hD`3hMcEsx'Ѽ5mfqx< Z p=ʭ?s.}5:^R˚0 boQc:j&DsjZ[v}4+өlrfc+5uYrʐ0 fЫUguBL7߳~kTUe9BDԚZȹy*3RVS >~wݷX=1x~R?jeC9ܯ7~Zp =y@tɍӲ{FZjH``~omԊ |3lּ&qCԊHC\R[s՚l߇a8ϝNoMc*""r5}4Uq)@| Xٿ+VW\qW\]})?MSr)Ze]CJ<ӓOqO?>_=Rue^e&HZT P҅,ۛ݋/j!: 9{w7u3 ! Lh12@dVi{=qSkFDq^LQ%=ݔrY]D"7J-Z6$-߮t|MLo K޴yY)NW;=oIJ,sjM];K6FD֪EvacU#2֚=ڔ%H{+="K>ϑt5Kiøߟ9eOv~ۛ8 1 -LSLon>zx8˪L1uѷ^a 6#Pk3w_'~OuD]h7UݡnhY~?MSpXs+UyQռ1=5&˚E5 8LW|dy9S "BLfV1cuNKfS+?3DhڷLOwR탧Nu0\Ԧ:DŽ"BB6bHȄ㴙cxGS#Zk˲,ڶmJCpq3%"vD!C+ /AZkEf}XAj{9bIDK)DDEy6梋=2֐. BXU.-}C+o9jSUd"U#”0BVAnx3ɹĔS糈8sབྷsTcO7!̂ιaey{`7xt]?ɓ֊α":vT UPZWWI++^+4z-9mFeB9RUj{}zVm!/b"&!C!y]8X[ۭ9;lr)yOSO06 R~oS}.nW<@51i2_;y !sڍ 8vp>'bD23BZs%.\NJݜ\J!oҤgP* l{[bbf1sU"44 cO=oz{9b]R)֚.u; >l̠Zw4iLjk/(1(ͺL9N)*"www_D̹tOүdsY{ɲ,ι^XsVkHDZZqs8Lwc=yZ:Ƹly*|nH<8+]ƻ29df1%vibv"˼̵|wwN=E:Ƚg/6ӭ*?}_4nɴs9Q>ѥ*MZz0"hz&Sj%oMc_nޱnfo5Tx-"]KG;=ŘsDG\ʲfК  jkU55`;K)ޡ6{4jz>u>G瞯*h@tMMaMS@yZ)rε! ]^e眻ptX˙Al"nFw%"z5|Jz"!"8#%[asm>ei<MR˼Եipktc&z08b0qѧ%V[-Q{@Dsk5QՒskMMDj){f3ベ޸K!x3C@Ӑb MZ߬`[}?R}r۹XjLλRrw=ZX*;g^H_kl6|>:;wRr e{`絠`fV1js΁QٽJ] eU۵K+"C& qZ(&ڜ'D4@55ֆqp!0J^Z ̵3qϏ0EǨRԞcZ {TLs4FjMzamoCZi$=Tk;9Wk\qaEDjmM$ cgɥb|ݻ|>0w΍SjUK1EŜO>tg1_wD퓛qS>qpô0V7KNͧ=!* 2u^Rj^1ןs ޓjDlxP@! p]fL0%,a3l\e󴙼&*<Uk&qg_qJCmBpLt7c0aav77[:wk4!H_ T&5>.`wcAp! i?6K\jmu=M8ؤh%5絵.ދ4DĎDE7}>9Eݕw~=.|>蚽cVf$3y{ttߚ>"5\/ݓ.Rk-%s^DI/Ӝ,"fJ)1/:Z?̧s-jղy]LEcS$uYZmS%R|У .u@3!煈Gw;"]着98 ^xYJ&qay1zDHkkY#Q>FWmؤRyl++ѧ)/ Ĵ&5Ry<`Y\~&(DwwÐHuaQ=yāZx^8mtV5Hb⽗Ҷ]qNr -_j*çn1T1~TGu{C\@oMk-ؤ#Jr1z'+!Kȧu~utl&؊ X\r2ݦ!=<6g?@,d6#C[4j!E~K " _DS5,kͧIԉHʁ tcm^2^Bjؚ? U{a3 "3RjbYe-浉\G +ǻByHNUab 5va-iJ)ߵl9pTL3;V l!p:qSwDZm5 "U"?5Tk͟ikZrC \Uջv `#0>[Y{[I6ia>8d$4-DgbQ3זXV(`UjrITAժo{ƿ/~?j8@a̪ʌDԝvNZCp"fv){k%cXϧw4M"Қ>PLzfӛ-9fHD1QU;23Eo}í' =15aVId>r cb겮HÁwJ&ΣDeYV3s&*&qqr|gl;  "i߄i٫O 4 9Vsj) #r*ДsI-0iMAU|)Z5`dPDce>75sα++}+|_蒵'zO3fsJvO_l M?{oLq8|8/HDk^j}L{9nzz ƴj-1?hkg~laL5/k^j+4ZmԬ&zB!qy>ux8)naquhfp8ACf~eORIΫsnnosΧin_o%Me1N7Dd饤Rnh``fiLeqg/^{OVTyr{T٬U}z/~nZV yrԊǹp'ۿp^Y+C֊jE4x1ܼ{wOj7a>=KkE 2yfj+H x>:OR9JsVΧb~'?+ĻCo~/lH9<fR:/peY:`|\Ip|X;Dx贬Ϩw!xс\Tǃb8)i醐{w@ď>|=l7ÐbStYR(vqVқ:@"F~P!O2vt ޒwzcD c\y8&R˚U ]fdۅx~m{:m6!x8;/g&Xzu--WBZ. N'iV@[eVU{#*&K^̋RUZ+hWJ q]js^ "1C8zܬ fĭgsHZund'#f_oJ_'\bZS3:?N\99c9DijJ`d?4n-{"<LmkOܭ˒;FKk*br^eϞMSa>{%7u?Nk9{8>&L6`qdP)F6*mU5 TJ" IRll#;lsblc3yLşcoiWkmi=Zu=s:a/ 9O{@WTۮ 1" a() 颸+ݦ(( dݜUZ2|m(*|3OΎQ`T@Ae)inRPe.,Č DdiB Ui&fYVMm ipTF`:#"CxeHZL2+&#!Ŵ^o@pgooo\L\Of:3&Sdfnn\eY$kI |PΉ-[lٲA(z^;͙>^KP!͋40L]}jemE] $dR)+B@}hvnhyw1ۙNŅ;6ǧ&C}5ӿ "cƻ'QH(la@TZs;vs:fHF D%B4h-F֧gf6McZ  B!*$0"Q6膾ȍ1PYq٬O dHe|5f:},)0{bxO{="e63>{޹>ee 9mZ[%ATJ)q4;)pߵnCtoJJ1i hMb2LQ (B!)m/a T04DyUڰy B 5EIw0GC8Q[&$THeY~\-7Q@[W=DHcY }@j;޲e˖-[4̊1%Uw"vr,s=^|y4Kum/˙ ;E5>RdB]UYܽ{#tqzI׶GGgy^,ټ'{{_x^~Ï% <5sJ,1M)޽eY"VY+c$38hPm`  "C>D:HBM:`,)֙5,MV;N)*bi{ )s]ɳ<v-"(cl ( p#9cf3kN)J)DZ)Q cGcm]]8DҐ)%c͹sRj4R:BJ)f/Ɉ9wAgKgEQ6cg%n ǶlMYU]Y۴F7oA7VId6kM`*9",FU@̨DSkcLUN%Yw;m53y G׻@"4"Φi2{ve[u]Wǧi}vyRڬ8=9dVotŧQ'Ö-[lL#*t(!JTRi -]?YL&:f$[kCJ'. }^٬~'z{G^DW].?;o.3,km9 r5]%cܘ{bѶ?ts{geYyqsz߹Z|!/In2pzBhH(FL"uVV1Q;#BJbRenVy^yUѽ;qg>NEf"RfhIUtF#p &87Q!+򒓬W !qa >([o-[l<(haLgyyrTo:7U^O|'|rJcs<81,䙱z:WSI JH"2>9;>-ըeH-1v&?!F7 1azJ)kEH\4]ߕ@fyy4F"fq/2yB YY Xf9.DKC >ZefF1 b@8%(B)BN!3fRfB*/=3ӲWH( sgW8he"/'CC*֜q(&њ8%ha@D"ZE881C !c9dmN1)F3 J11ncEwy?NOU--Ho6+wھ$ iR"rw'ˊU w Ͽ4[T٩)h<#b1C2"{]7^}՗^I)>9>$>`Qe} =|(Sķ3?]ܘ1`}ׅ10@!4MO,kfv,˺d=HJYJI)l@`vv]ey#AUURލAeؘ3AMO1_V~>%fjJ1!$L@J)ZnyȋbBZeI&cL.VS^N\j2&/_8=>tÐeLBƢ" BR Af]u]{,(\(¹{>E w۞y|bc@c*n^f9صaZ)R`@ ,sZi@e3,Y5tjɲ Y0AJ,{[lٲe˟Aш}i]ӅS6y٫UUWƬ,<`UHbÄc1FNiTZ5jI11b1_m48zRUU^_9aamXc13f&BkmYVzr#1:c1DY[#"hZzmck[2T{Bg0Q慠)ټqՊ{]=@YǽԚI]%)MbOWι몪RJc1FD٬fgg>-WK$L&u]'mM? XUU.bhbL)e{l 8687ZKQum4|p"!xޫ@@~7P~';g"ٙg0 $;/"#1?0d쩷<}ʥ_}M  ׶F"F4=Pܾyh14PyVmȧ( 5VD ʅkd[7w]8AbFͺ\Q2nj(}?xͦ+?=]$%ެ/] }YVE> ! dY7$ڪ sng^DL==5Ơzlٲe˖?̓"3±/{mOΟ;b$ERQ""@HrT\$EZg ̘n޾Sجj! &/vwWg.K:::ʋl3Edr꯽O._.18n7]@Dvd[YY$l!c.RJZk@]TfMUuԜn2,K $Eqtҭ֫rBMsxA cRZ@8>3ʼDe2'~>?|Bxì JIY(5&lk$$N,һ".(JR*Eؘl|Z+EEQsJ*GBڬͦ%"8ک"32MSD<9=JgYWJѯ&!E8u D{G{}z#2@pV:TEbvaEF!@p)zFcxl4vuw6f2^:vo7k(ӳ|!-p }[y' ĔXA"}PS9&B(`u\l 8ĈD@B*`Zyc1b:lٲe˖EF{ěwOwyӓ>x2[=9`,&Ϫl^~16u5Vg+1EIE\˪w>Eޯt;.qХ잵vxWʲdfkmY<Eo~Z|KH}ˣ_zbU~D@n}2sQ\L/^ ywg.??'?~"Go $G{ng{""""">kO=q17'~)͇֛F$_x'ApbFB>x# ?!o.BzqR˿p1_wF<"A^sBD<( d2K* k,E1z3kI)%$)b߸}@|E^#bgȣW?=[)MIR!Y"b{,&3 a w>;[nYxD2%1MGfec\nNΝP죯0,/8;=.'5"N7 lV6B?wh|Nctgs[/~;Dj4I|g> E_?\< 館xE}J=\yՉ'?K_Yna?nh֌c|$3FqӞ,ק˾>H#x#!4 EѶmϝb<1y*M\?U)"yQ|lZ8>ʯ{eYqrfyϕ"۷cԋ<BMD:%RDu=kc&ߵ fO~(ɹ@:%jJAN&<\kcϟ?\ǟ|y6Fu)Nfjyb,bִڝ݇\|ɩQ!ly*mfM^yJ CY Aj ]~ T`Z+( IJX}2f b< b[c΍rι|Yy^X5M' Ya%lVW4prrb5ƈXWTqScL)*ԀGoٲe˖-]>>='z{?O(ӧ]Y1+˗-l߳ R P ys`}pb\ΆG;*Z7._,fY1ycQ/f;(͔(1*$"DcB%PD@283TIcRKU1äʵ-xgj3 > 'Gu(,Jzc52|GnJ`IlJ 7@[< T^O}]xiw !|;5ksS߽)ɴ64Ef1,21ޯȚ#"3NyGQֹ]h\u]W͛7μ:T*J)ŘAaonJl^J)2Sf94HػTP!عe]׊aG{D4/,Ο+_9z[W!n|kX'l'Kث/Δn?' ˛G7OoV@sĚ"+t͕+I%tDնdx[s};?cZ,6Orqj!ReĜA $\B$eUбxH_3pnDLfYJt6JUR!FZ z:ޭ21 QY,.&"B{j{f4#G{-[lblx@xPd(m)ޅ nK_~9&zcmr^u4|>L&chE`fc-jf PؒH4*tV3|ɌjڴW 3c1$$cLUT " ZkmH3FD:"U&눈4u IDATZeu=I ryxtc>|l}Ȍ̻,*EZxZe3F  MFi!aeFj~,l Lvvʼ4Ƿ*?C:t=4"x׵|o~>p۶y{D9?zLj""8|Z(z|9_Uu͚ko}lJ)MM|we;Q9 , SĜfKeGVkBf&(8,sEs;{wч2!9imHQim֊U1&W2z˖-[|W%KEFCҫ/zu6Oy"wΧfbsn6V+\Y BBZunaO-";7U]5)+Mwן*L1fQ]J<( ut^絈R7&N +ZR: h '~pw$P} $wvۼXVC7?ݐy1NXE)L'UVxHLbn}tNx/E{ӓM2, n;_سO_?[s:0):f$;FCϜʺhM] һNF."k5"5MSUU劙|ɆVJ0 2:zǫB !xD},!cBz7Fk[hmowC0j{mf*)tGkwҵ}In/]yhg/Flٮ׫ӳm3#|Qgu}Dq͌Gn_zA i,q`z(Y}Qe=% @ *aB]̋LDڮύA$o]5mZ tial3NCs&Sb 3 XO&1ڈ$[lٲe׍7(XoA'meZ"/'e5Iq;)bqxn۶6SZʑPk08C(#]bL\$=MVuݴ )Nٮ#:}eVJ[)?‹+56x: $H "*E(.%Q)k'R/}sW/=Ԣ5$zO?0; vwI=;ݜ!Įw1ˌ6{kM>|ݯjG 1æ\Pw£3˷z[gsk5#tsCJi2?EQt]RL8yP+9J)H٢,Eke]-֘17(ͦ <88Z]דaYYt:{Rz6Dk#@ (YJ1Fbc`E+!2˗}m/uUFeYN*4ƒGwj”"Ot1%6UU]/YXٕG_xxw9ڸa0Ջ۷v5+0>g4FeIPiL!(h5 :S쇞5s;1{^j߹u{:';%ITD"E cYhT §#i.rzNlٲe˖?C|2?c7__ktƭG?d9߽gWU5@J{Sf34mmQ:ϭZ ׮^efr-")vg:>>bcg!@fR+Eo֯<=XmLNy1YemM"wu-=a3+@+A$uà&Z8tn:ZUn-~Bpn \y1+-˝Y6?:\kӮwd/ΙHjҴC~ F?{== ;{b7i}\v]_՘'m_!5p1,˵2)5}jCHJ#) a(2tl1>3H kvM#J0#sλ+e @1 #Xkscw@tڝ=_}/ȡ_}7^ܽ.&m5r*%w ?MCZY.ڭ[HisͲM~Ie˶oB 1=.&$f򕋧7=tGB2)Y2b$ {̹5J)t*%RClt\#(<"P )E()z Hx1~-[lg< o~ՒJL="3$Y?ղ(LJ^/*CUM xU6|^.Ƕꪪ@0FOJ)eM> >z^F a9gkrTU =)1Ƣ(c2tXS8i̦_ھH鲜TUIIև'YE#!g91dR1EU'] YVf:M|;S)k&;,Y NN'&O* ";7hmR@@Dͦ GZ볳qؙ<&l2!(}n\sΝs1n:i=Yggm)2JYts"fzgut= \7_Yf.-^XgY'.^ zfeۖ;{g+u<b )yBnwU9ZpBE#(M')qD@dҠǞ]Lq2R9'GD Ic`NI~`CQ[NI8#<&lٲe˟zzlZmmQ쉠Ka3`D|=_g1UUY( Zk}=af"Xcm4zvb}T~h{.?{8'"4r<~@6Ϙ#"d~Fp*HJֆP0sJcB([S0׀\H("sC؍O)*M$!fhQ2Khˍwk|민|zva2S ⺲TBQ|nUW>ҶnŷO~>ayxۯeiĹEZ? ! YĶ]y1000teY׫=958?h&tX#"llR !dRj!^k3VD\V{WyY CU]kݰݫu=l1#.{e{w8wn_L%Hye]wvf n= 'kLTެ _{Z[Vq65۷t:8BU'n-isx8Mqok=Dc΅&% @10ZkN&BPD, )IJE2+B$%A e@AIQ!c7pYMhB'}[lٲe˿UZ5z~#|O5MI?(2RGELa@SJڮ&] ϘG!"RBJp"RJI0 }jVM0 F۔bdaB s1?_~w^{Ud," 6 Q&tvD‹/X"(`C@~Z/>[-h@p: fbYw)f+/):997(ȳLճ9T"AAjd.VRy/蓏*g$BDG7&"Ђ1R{0R\P Ը*g.2fFӛ*cc87hM޻EH),s U,J ` @Ik}YkbCr,b5{DxB^}  Z219"b]߀fk΢ãiS׻\4HnܺmgssNW6I> }yM/L)rL x!FH!6j܋ yfKDs|xPATј# ]LE!LQ"}u=lٲe˟=v=7uR^<uWDKf}|ɧ ܢ\UUJYYZb  ""(Ce gMy!M!&o35[-NVeY)uQc `XRj<)EN)Fr7o}zRm]y 3pFEADP&IQO,3EVjHG0L '򅣓;']Q73~Dt*x8t{onY{8=wyJ%U !LAAh@pt""Hw4 HQf$ʔT*Iӝϰw\?vz [|z=^zZtSEw[muZN$]Ywyn߷W~ǒܦ2\dB9--DNDJqssi&_tu]ys6FDBD9׈qEiqc*xbi !݉V]NU1 v] (t<#"R[ue)ZbTL]FVN 8;7K.i8&A-V{ix)ewk$U]) 꺿 FU}ؼG6fJr>̢!4g;C4Qp.!x(\Hֹ%\btIkY4TUY&:PKd^d 1ZRf:yK@3sq̘1cƌy8Ɂ^8`œn x7:9C,xc 79n5c$~_Jc,f ?1HB@Uix]$vm cXUeׯoy$>x)VVVJ! K 9 Ad BpI q.e93DAJ!b0*mY@'kD@bc@@$(C퍱)\'y`DeA)jum63k_tQof45+455i+Zyv':$'iR=ln! HD1"J) FBF1.Rdc>A!cphfA)Ry]I+R)WJ+-+k chQZa:Su&V.%RT&0cY#WT9N{nn(NPH]&&:obD:8`TVA_(QE1,ʲZZ[98Ir!"geU3&y8x`~ڱ)8{V>hҙ:X R0 c}yb1H!j竺J& }, x"xA8!E""獵q}:OĘ1cƌyڍ^^ 5 MmOV9(7Zkt\m\.-epсn@m%.+)C`U-[y.&U()ڹz˖-# %J ]e%m<*dǀ#:Ѓ<8L:``00?mWE5\rue\w?}&!P#X@ZkBt9GȀMB<R491*[@Jh!5g0ZY\;3y$w#{nG/|IyaV/`~+o'?ϓ]hP qNc TE#!90@ !wRIBw(D_vZkp0$#Cg}$ƀ.KD]ܸiB;)iy[p8<4> ]y_nPPT֮*r>0Ř0P3yVTE_w[_Xsl ôritM2(IA@-1AYyu] _[G6p҉âdoݸ% uaPnϝGEk L- "*>HyUN;TP il I"bTj%1xbB(dܻIZK \ZTe#c(H`N3f̘ܯQr8M=)e6'=ōf@6 Ij-- y+.Q Xkct ܜ-ra7f^O69m5vvJ7BV+s 蜷.X8zS:v-z4`D>y;21*IH`\;n͆ "cBצ6'I c4$Yt "!DF$M6S#"gT`ԌB:.Q嘜0 ޳)SY LigHzxߖnTUTjLr4!`g1a$Hd#ª2 y"c8Z}&ER fuNH"pB*.T:B#'!X#][N;\tF \ԥ{D B$R+5e< ~,Rq$hwv9rq=Τ;@(C":k2.g|ڄ1cƌq;R&͂@pq)e p4` )ƭ[vmGuk{B$iQQ,/Ybi*_!QmLukǎ,4I(t:1;}ۖ5kKǏBeiO߿{ٸqceW8\svRHΤԖ1R , $h !H)91c,Gi.ut2F$:C#De2Xk .81699Y ˵kJ)GHt8<;&,)GZYe qvY{iaP@XpȱDEs@du_iJ*NսAhXZFDO EdEƜnu}h4\i*xu&9$[z'l~i0kA&(kk9IA":gD)I9PVUI z" 72ŧL,?mSe~oݾX'̭];i:-q)cr-l|3f̘1c_[$YOOO7G9!4Mgg`ȼ.QQJIoMn?x"Qt[1Ie)JT ѤTi%BD,"Zk$Cč7K{ɳl8vZ]Ƹ1%3+: 'Ἓ=6ۙlOJ'N^,=MOv1Bs[MW9驈poAf"sp"@dĐ1&8.-]XOJ3r~=U5vL&%y >z"ֆJM]nߕn/uabE]["8g3QU.[ԈnY9+T纥)2K4.║1cƌ3f}aEWظqjV'!4W9 0=E9:wCD2p2ŕTX'M0ƴZ-,t43[Ws1FFQ>D)q4tta`ڙu3S>yAEF!1dMp1zY_^j G 9CbT)\(DO@h*.Piy>1L.,,Svfy .Ҕ \$!\eYB19iXhX9[UZj#e_MS &g&ŁW,UJi⽳ROt;EYg^O|+,WgYJZ7sqO9GeZk Rȅj{Hi֢eٚaz0L]:ݛRF1rfbH$"T1I0荫*2X.2+#v;IU>U kVumHCQ'k,qY`RBWEAȐE)DBpomr!Z!EbҘLpt{-2ƙ. aTH0kt+Ճ3f̘1ctHdbbHj P avn)W11ΠEݵ3fxNkU9 zm]V)2xg2Z"=$)Q.9 Mb2Ə`OyYY1F!ya" H+e n,i-aQ M$r!˟[S[C`YXS{Ƹw{\A RC#Ȭu1Bz;]}5u͛6m[gk/8.BFrdk0u{3zïږ#oݧ>k>~ږ1#+e%ڇ>IxёI;-g˅E@`ʳ.+Sn#ՕOBJy3ٳSSS۶m#ݻwcN[/q+>f?x) ,HEc StU5$S]Ɛ1_TB1IJt  s4MYX pΆ1uS}.->p** w{SIXkB @ $H+]"iF 1zﭵu][kCD1 cڔu]Z[3|Xk&pƉ*F̃p$HO1я}}хmzwwCb co|c㷿snno__|E/{KޟuVªп$>Ԭ#W^?+@jy}哞Չ'3w]py/+^#G}͛1$V;owoٲy3KjŇ>|}/O}K-[6u}꽭~N}/83wu/,#y*STUf;w\f͆ N?Fo:}GCj%h": ,ZDcL"ra^p0f%}R=98ر7f}wZi5 j3 J2ƤZf^QBƘ6˲V+g/055y#Cp޵Vg+_1)xq̺c 45"c2c.x!*ͽ> 2t6oZw#'LgYiBUVKnTѰ? h!4P?@cϼjzzy7:|/z>k{z7گʯ7j~~V ¶Z?}m|4OVCKv7fo_ M(/~usk6}`g L[_mI6:<9{{I; ݷv;p٥_Myy :=)><ݷ}PbmrkG]\\7u][b 9֮:~|!DMDߟR{}#ZSU`#5J))eso#sJ 뇵־4Am:'|3owOs4BedDtBs&qum Q\!R6gΙs.M%g bRp!B&*3d:Q sΤJ);;*DoJ}D'SRKTjq$MSPp.B#c qC QY;s"62.׭q֮K/%^rֹgk{g3.--eh$I:1Zk-*mټ~W>z؛~^ԧ]/7Ͽz%_Cɟ%_qۚ_ᆟz=)O+.xO6߯^^ =IW]|~m>5'u^Ǭ$1F>-p? Wj̘SDַz׾5Xz?rH:u4z}w%흋~Q,y-ϳ\0+.?SYNK)!F1 Y8.rwJ "`()Ű?`ȵT1 }3X^, <,FUil9,uwԛ8vdqy͆y=)OVRz͛66oZuk6__%}+7M<_z+ãG]n~ V?/6o}x_v;xys_#'>Cm^xe}ox/oQmk^{)u딒6ihSv:)V===I^?2y52.(dGAR\.qcglSI g"sDQ"H[뀤3lbp8l'2D# !#D*cBnJ͈`]؛ _kUS0Zq$Mf.c_yPZI}g$QĦ0 @Ӹ?뷅Zht8U]{c{B$.o& `ݙ\˟vUl$.-ő{'<{wsG;gcs=z|_:Xa𡩮JDfBbyR]WI2j8&*Rra:Z2:.@(z[Ah\v&k嵱Edhߡ]yk8!"r@rn󖛇28!<:xdѥvA9U1D !VUMc #>px5O&gg{9<29֯_gW}zOɃ~yc{7?9G.|:gj4jƗ?Ggp$8 ""C:YA3)U, !tݦ˲R&IbRwB  CĢ G։Rp`!}UUH9C.Z 2՞r(YAW5τk)Q) JKy<1qS?׼U'ipW󶷾g}Y >sW_|K7cW={f{OݦX^^7Dg_?~;}ijDtLLMMv; ^SSRJ}ә>v|v/9%miZ//zK__&7 ظ+͉hŰ˺ͫo%۶nĵYY{Νo}sɋ^x4~]}Wk7f 2SR7th4zS6m:|7~~0 7. Q,TSS:͈P0Z\˦\ijǎzKIJ(IGMLAt,F412 6v+gD`\H =+n3|~GʷC?wOevvp8zo`޽=ӧ/w^MDoz˯n[zĻݯLmo7/xxǴw/-sɣG;o3Yάic8?tue=+_Z\o_y˯痗G5H ++3nMWg5z]u]o'^wQX__}8rHWўMj1Ϝ:gt5\!$*swI33W+%Njڛ2f!$ Wxs7[}sW{?yٵkW(KG3u5RxBsg#I'xꂷ,IBBȽ{jcs8 7ZWBc؟O?>thqn/ɓַu^?hZ?˿{x Ї.u/ogďw;cxE^xx`euUJ[nW1ۿo޷ʛYgUO{O~#\W7{oeuu®;^ZBW9_o}#>ɋ^xTowo?~č/ٳ;gzqʄ13mMeǏKŤ/rrɯ$oxڮO\Y4g(&ވ'zSlkwA;s%.{[qX% fH+zgĀE$v:meuλlF'}觟F"ưjC>˲(cs+T_/{ӷvemTS2Q,681?w_;1$Ku90DA3%y *DSJ[b]xr4o>Q{4W껄|Rr'/9A.?ԏWu?z8RII%/bݫIN#z{JI41Gw?5_1㔯7F=segΜ9w\vNj54M$HJ9Q{}bGJv檊e$ι|[o}zAS/8N8ch"gTcua0 1PWyflo Vw=pƫ2v]UXƜsu3k9kxIsbu]Yk'}eY&Q`uyr[;v3;.yb!xDƀ8@+0N{4! ^` CK`I,D^#Vð.Dtغ,=P&y#A]e]3;홧?b̄ͽ}qud3;)1:$MF@"˲(8D0aC!Nh4RjjIt^Җڳ#.u6"`Ý֝yڵ}YO9Dp(rD!<CDjwϾ*F EtޫH$i$e̲!1 v76:ݪ!M*y+j^O|\AD $GlyID :@B@ D,xDĀ!&B4,1BK̙o}[77Ұc`<$VFO{yKoۭk;\ѷo?Yp቞Ujl8Wj1h7I39yΪ4!yU Na!0檪({D9ˁ(6C!G'>> qjQr4Jֈ?S?=! y!\0`*k]kpckpđb .l]Kq%8'<@ #pGPƱ2P0,TPi8̶PCJI&޵bN(u>bZhum±.C-ekyS㞓wG <|x n,E!JɈsۍ((F9\\\t^[8v8"pUGQfQ^2BJJ&(Y5g A9k(R1hks. SG|ȼeQv84^]-^7yy_9e[ko,I)x靳e xEaJ ȘBwffsc{cs]Ŋq*Q\F()),sYac#Bc LpEQ4)[%Rqlއ:뜓R*y9k]US4, =z~!B@ R$ h){|wb֦֒Qh}6.i,`#?(|&B8Xt{h-f3/ x85O?g_{S1,fQD_,B)d8og Y'QXYhLr:NQq4[-~csY4DoJ{wݷbSq|ʲmlv>[o怌I']]OR9F+Q 0.GND@1кj8x "SζK3w}h?z$0U1LSL2e?GzILj0?3p;~ٱJ 8x*q&5q0Iql@AEQVIb:/`TEl&Ii58KG . k+Ҹ!=+J:IY .=l8qS4(H 2_o{ oB Ƙ1>\D.˪Dbȇ,r%Jl$X4?VcJgd7pN ]wk_G5mY]0/jBx o4HuY .ygAi-,:r_V@F~$l-P˛o={/1ϋk%cTy^ .. k1&ϋ-fggce]gY6D4ƌO{恃r8(a?$I+gʔ)SLk;ˋq,!{9u*GS2d1;_{7L #hXOJI-CE Olh֘, 8j8.b@Am9s#!B9 'Νz|TfYC*-U|'yc֮=}fԛz{Sc#(rcb\xxv"&4k F*qPJdƬs6d0>۟ RQ, 8rL(Yk˲xn:֎Ժ!Q,Ozh1r>@n9] ! '-|sggO(KMT{} Ωl虙4IH5I+dQnUݭ!LY2ܞKuU cJqDx(k\~uH3r`GGI+罶F@$} 㑌uTW ?e~ V\n XJ%7=+MV&&km\P"\{1+*[3,`U g7Vֺ sGg?L!tuJMjA j0 9SYqYrm]Bk)x蒌U"ޚY(v{Ph;RŲjTKǴ5qC 6Q-2@ȁyNBJ"hy@zODAp!1CBnX$zH_n{o^o=vx}wߗo6xTfCw604I2嫛F\xʔ)_'\-ftU[Otˁǂ Ė9)^&ˤH sS[묈#8rTv@`2yDbT2Joz^`S'gY-ʅ4KKQ!Qċ!jt5Hwh0DR4)E+5UQ (|niӍO:va| gfJg~u;O,\w]JHwvbgFLf+ E $ƨ0iXUx)Ř-NБi|{n"V]z8ڌD{4 )Fykt9*j7&rBȢ(֌19oF\ÑRI mcͭ]'`]䡬̨oUgΟ9Јd9ㄓO2{DDd @"RJR@>0A(Xyȵ Ho9LJ>qd׍sQ4bcF d˻zn;'2eʔ)S.(CJd޸0ƹ~1 ,q^ fTx]g:8|hL$BZY"8 u3`r=/xsmg=ļ`]<f38ݭN#kEuH+fʔ)SLsр!8GK=:ȝ>Re 8 '," Y;Y⟨G@[[[iZ묳ZhdVM@,Ɋ8\띵@ཧ+P29Hh!xdhRBQ%I<8p֕;}vkΎC'8opSb_vR8Ɗ;\Җ\ڔa~Yu=rEi,s/k yY#rN$j).FePLJ¡JrTFZ<۲@Hq"sq!Nu 3\ +R)9B$IRuUURʢ(^דR1&Xq5QH%;*jFqfጙZWyVW,,vD&wC#OH ABc\rΑդ |4|Oq{-pzgg!><2eʔ)S|Źz d"֩S3Ž{|"$d 붜Gdå,G;}kۭ]8(N]yѽ --V{cj, 9t=F9Ma BYK8Ib$ !GO99)Q&QZ%s !hXRXS[=źQһص焊bo]9.a@IJ냧Y…`HH)07%$ 9g!s6r,l e#V?ȏ~o$<|ӧjuYSu^oZZ#\,kSo3<̔)SL2 1yDFHUQ//d͖@jv{+.DA]q *TE\I83!r0l6Gge h4fggfWWw/BB)hچ9 " H0EJFr3&UBrWy >=N^(.KF<&[R"!z@50j5c,IlOünH%뜐1#<Fn**jWrCϘNFR(]Y+z4^J$:@@ 2H2aD蠩FƑ+־Юٞ)MEq {T"[wug(9c㝢.d2 x~aF#o5z.)SL2eWn tK"(BD@08Uy]UdU%.鶸ZqPQ位" H_F蛞" B>Ý$g4K~3ߖ.)*]#J%Y\L/RQ]Ճqp?|xc\rW85qo~ґ]N[3K]sG y2|/Yp8g̈8rX9E 5J0?6Ggw;r98G(\qO:!s">4n4Oa\tEx4<xZy&;FÙvw>wj!<ԊRL=g3#B(=?43K)ɳ'GL(y6lTD.eiRVv1nMM cDaң_sիWoٲeݺuxH[ӟԧ!ts-[y晏w^#deP$ ds*^ ˺Y{T֓4FP0,<[`\nTHq; zֱjNҊ~v#ʛnuT\cwnxʩeJhvO.],/[CESVG֝Kyτb9Ȯy>:t2S "kݮP2n'W6¥]`cuط?UW,N[% Wvm]lsWKVe!x`Aa ²s:,giVQ(DucPJDgƘ4+@VPIK!9'-h,uO',QCDGd$t$myƺN8Mh՜EgHNy1βP*%$B U{b=CZI;&9kN?i SFQ܈j{7X6hh\E_D&ܶD`t\Ow:٬8T=y]wݛfD>*˲z$Ѷ~'#4?ɉYy~w;8\U?~x3ϯO."b.:KQ RijuT0:: IݹkѤۭ*QI:3;hْlJD,2 D&ڑZ* .3t^I@B0{nx IBR+8k3NJe.iV\~"4yhS6% -(Ry]jͥgIE]p:zIy/:(.`dτN$гW q,i[ ZXx`y3Cv;fΌѫN 3BDA<aT 0;d0 v;g +J)YFZB4nA͊Y;=3ۿtԊi @-n_h?#"ӮBrD3'@ ){[?g3"t,Yz㦛nD$(.{M:WҩPՇ9zv8ϳL0=B}c{_:uĕG;#8\L5 ^y~y?'! UL^п[`yyyh%VR&AIY(-|gUv{>pŗʢ၁f d팝kɳq)R"`Bv Hzm1 %9755Y)1ƘP*%@"+6Xʷ[\V$YbrpҥK;t-lsW-p65*% 5=|>Z[F;<? ! Za+e4gFgIUdK':Ӗ.=ퟘ4QWk}饗нWvKy“-!BABhfEdК6jUTJ!ZsY.*(v'f-^T"M]E(*B ),Ue!L7yz]+eYZ7? nݽCCC( 1ؿ|؞.!aE1Cv|vp.5R.\P--hM節)KfqHlFhQO?40^.e(iRdBZ=q!]TvӾK3R7ϽGGGw%/cWz~齐^'A{o=oy[o};~ _xW<$gm߾d/~K)Xtvˣ#r"3gmۘπ*>n۶mW^gyqQGJythy=<OE@yёJŒ5y( ڞi#gYjm. "!RaNOMI]mρVG%,xmy  {9Y (P DL$D|f-@B01m%4&D! "}CËi*Q(lZJ̽2 :-[/yK뮻_x1o|'> !_#UVC#<###{߿ٲerښ=o߾}||<KNT*9fgg [ksιuO_,>"'l?{vo~pk??~W^u%'_/}vΝ^ CY ͤhmr[ܳmq`b|ʓ}[6oVY=lܱ'B!as^y|;.9\pRlnذAJ955)<y'XlgB,@D9"ںue˘yѢE<˭Z!cчo" C^u]|__|œs'f'{vo߶h'`###_/tw^yU33w+OLMN_׼{xo?}Z;d7ް{

`ޗJ%kDpuaTu -JF 0:*qTK0Zysz W\ZCR'{FU$v`#$'BK#A$A Xj933;9+}n`J,/yֳYPsMw]@j(ܧ~ PJkW|ז۶UzjQRQE idYA/{FQ̜1ZkBiY0#4M9efwraQ@{m&xֆF*`ARJ4G@M̽tyOD(YI OU%g(H@LLdDV'949b@$0I'2R\xOW{߻ڿi('~w[?yg>}yΝ= my ^xAO_|=7sM7tM79ay;O R*DtTJi%r%H/]6]`/_vge4M*RNu 1m!bTL'IA6zGZZfV! mB" ƘTc,3{`UK"[tN=541\'.8}xpC\;IPpl''8pu:]"K2j5QZ4HElMW]wR$ y?ZrI'Ɍ#֯ JY|ϚSYwv6۷|yaohtURl[|vO?g|3WY=80xu(ji*И((" ;eiOw%@q)$Flv [#䁩f3N<4⩧,)%<=3".@XxORi[D(0"eFEDf֥:@({d0(=Ya O<ܳQӎѺiiV-8rta= x'޽{_K_zӟ~gU旽ecW_=sZ_.{[rGeh} 7e/s{7l}u{u]w)G;cDccl߾QwDrn։J59VPU4+;ݗÕOt " !O}Se`you{A2OOMz0lT*@Da侐Z2DiZ艘T:cm, H(IÕZ$T t 1K 򃣣wݽ/(JM 퉼,s@.I\4Ӭ+Da-왬19Ofal$ def,`Dqop[6%o4zKg;vlh ! ! z,>~~GzS,B$jsD<+ 'FIYǥc]ۋDEa`BLJaȳ:igvx9r2[IBJi$]B[gHH!@H<{ J(%)v`'gD(&D@@d fA0DMĥ8s3Ueb@0"F!p ~/^|-,Z{nܸqxxx׮]=znv܋^?9rj=6ܣ2tNxe]v%4tg/߸qc/|=q쎌}?~ؕ{q~g<hZ:66|`xx/|q7a\~WܹU~ͷ>8x`/w^bh~>›oDto1g!OA,D@td).=2 E#v=[dzْ%ayAYRjEb`٧VU*I$V5V%'\|VveҴL! X+^(QC_`mkCffTY$Gð/^ܓnwxx{$\폇QAGHvt1[  }k/}Kׯ_Ozc3ƸxTO:?a'0xWw^qEQ6l U~omݺ-o}k{q{J?7.ٿjuƍ= %/9.fN[ks#~ߝ1T IDATw׻؋x44&׮];88xxǍ7xxMe^F3ϯ=OH 9hR1@` $x m8ph֞UBv"b^wy#cTB~*"'\a0RR9WpEa8T*Nwjj -H$ cq@)Bn^z@ 7-v]ַ\BT/?uPV"J`d:"*҈InJ( "+p摉t E.Iy`*Q' vLǡٻo_Gl%AQfݢe'/س{_ᅋ͢/_`Af[3˖۝|>ppʏ}D4M$K%)#՞6YXGy{ =y}mUKV)Usyɋ"rQ @j˭+\(U/[L""JHQiF!ȳd=%Ya'` W%]xd$와_8.'1(<ϋwzr#9^|3=o^ڵk ιW~ן?cuxxhOy/|Moz 7w?ַuk׾mo;I#Ǹo7CQs|X8h#Ȳlt)q?w7СCƘk722_'BOL<4GhZmBۮO2N@uEPZ_꠺X,;7Eq;]YRf\ RjZYV׫}{ujމ]}SN=[>,ːL+E2S=0RE`3I {ﬖ/K;10N=IԮU+E ]84Z!-'wfc DGg|f(C.T8*A@b5t5OYgv„HLM'OJi& QZRLK'?ɋ.ws?k9>=׾3gݻ~~_~^{gv^x,ӞFD9sM7I)sJy:Fqm\(*mѰ+ᵯ=: `X?0ŷvۦMc9% '@CQ2+25561"1Eq3<,2`fD( $ doS3O +-rlN-vޓ&4a͎8shQ:@%}Ɖ}_I亝0boŋKqўnFqZYQ011(!+ G(!!#Qfm愊$ "^Bd "LLD@q( r5[*E䂅Y J)ɏ\~{7[ϟwvg?~AEJFA~ oxÚ5k֯_}sG1:a E?ˤc\gflׯQ5ͻ>yD-nug}|}Ovdd|j81ǜn czzzzzh\\>}Z@ힰq3<#79AhR eF3>z{zE9{j4Q3W-/n+DJEKG|#y7=1Bh3QkC'';m:q\Nwjbr\aV>{Տ~-f9g;84EPL{WJ:kYkB:ffv;>O`YjRD;2fI&Ēl3r2%.O,uE{UMPqP;,#"R4MfvN'ϊRiw+rQN˰^[W?޺cdM 4 :)*&L=~tS󣛛Z9kɅ l A}16iON50j6gf19+QZJD)  c "3t43L(RλB@@$1kmvZ< (|g{km7> =%w_]v7<.򫯾)NðQ!beJF{>믿o~:g+k<9[PcF2swp\&k|;ޱӟ=)5k}k|/Z3N{R>rUc/(D<3{>ZV~ޕ]~ '$kER2LfR 0E !#b=Jk@V%m "$j551pq@& InߺU+O;Vnck@\Vj~sA/XU.)HK^@3#>+ZKmݢ(Edi:]\?Dl#_ gAJ!PE@k`Lc̓-2ϵpwߔYRR*5-OECA#M 80EE;p6TW4f hLGQ]%]mlddKL)SCf*7{PKmJō{>Y:yAA*P1RF\rc'y2 ыF/qa 7O:"wh<_qe 6pWٟY|w>7`۞=c7:}3^"/}ֻ9xG>Rot%íۖvo޽{?qf|//ʴZ]Ym]Z:p<ʔ)[.:)A3cT%/-j.4jjnf(P6xm(,qd3ZVs,wqS^vÏ{Or9˿l;gȃ"U&r83Vpཏgq18o}O^vGO3(BtByn>ѓǎn|2Zlq8`Jb%J5]XUiٺﱪ[ƘV*jKD]x8Xm$C-"qi,'֌ݻ:PQ7QtQ;wn4!<)Q@r믽Kp늃{dS>ƭFE%QȚe;ǎJJRnÉTbfI5pP %^vZs KIYiX d @&BȊ@phR#Ў!K\#HDJ8v5 N'Wrho/q۴shm5u-Pke#r7;S!v[3q;J~_?s;Bz/e.b8cw>8ˋ wrgʫ[ou<5'^|"C2e"'|~o&oUY>h:5"laaF@m&Ji`9gQ((Ƙl}/>ч8F7ih\]E10?ޝn۵`BhP׵Z[;l82~ޯMoT3 e@$7?N8Ofg6wu) iFFjZUYyyι(4Z{V}UU̡qj|޴!ITD,kng7^%v(~jo~۷3X6668|Cb^4/ IDATI غe˱g{?E'l[}[J)  ,3;0qAk}K wy}_}ߝS}Gߐ~p߇)&%viʔ) Pdtl,R#cSd< B]m//(۰¾ش? ,)u"RCt>O8|oV ' rZ 8"k(#9ׂ9dJQڔÉEGÇECp 9 &ܼ8_33sD&A8($Yi5)8V0shwNӴ"&I {DlZƘ'ItjΖe633jsGD펑xU/~?pYe&ĶPr@cp5{ϲ,"3+ʲj@3hR!0w X)B DRP@P^@.P EFqlAląė1▹|8语0 e۞k\{v{;6+¾&h\)SL2/JG&5יY͞xwyҶ j B桯? #nYNZʙgƃb^)j" BpΡ,oKcvMӴ,"4M(ZWUR󜙵Z<ϣ(vHֶZDsu]WJQG֚8eIohavޖ6,,VA|Uc iRvy AhM^p@E* P>qDF 0Sjcۆv.nk_ηKX9p5۝43z6U6}]2zʔ)SL˅" #`޽cA"PyE2ؘEb'I@騪EY$TuSJ$G4xX6Xmz33C= FCĶ0pSDdi"REYܻСCL$|^5+ht۷oQճ'۩!mhZuvyiH5\9WeEE/7-&$Iy]5iZEUUNpYs^REQXkp5@0|U1{Wұ߳sgZٲ!"jɹHӴI@Ģ(HQG1 y((VC0jc1@p^A* 5&|!/J=cםoE18e12&Vmmlj6gVWaZijC98`Zc!SL2eʔW3RY^LZhe|ȣ.6d&0P$YEFs60/,x>߿?cC^Ęxa~Mx^G@`"=`k088i*VL?~7s[qlmٲ橧9v[n۶nwhiu`|=73FcLZӔo9_$44%ɫ< 9[UUBkڦ'ֺ(iȲKdD 3gRJ&U jaa6LsffRZ)E\輯jӔҔչ8E. RlV(^1 и^3 wA@UlJ#qG1Թ4Ύ͋XRe|Yf!m"", څ׹*( :zʔ)SL˅]˭۶ef"|}QimxPƑ QDBi@Dp1p4@5cij>o۶-[+}p VBG'WEQJ Pť_{{ϽH5akEȈL^tg^8ٕxvz sAZ)"B9`ADT9nd#cLc:kM(j2sGDcJ)e٤zpJZGQl Vy1eYJd\ciSݽcG^{܍ FB E8)BWUeiҧ̬,L$tՊ+"tF)k_X4Vh*VdbTdR\e\`QD̡J1JY !dyƙˋd8$"~HO2eʔ)S..uÉe޾ww@ugL޽$p.ƹxFD* PI3{0x 7RgվcO,Vzw.ڿ'C LV lc]6ݙn|-NAD$V BQ6:}Ï naacG|cO}iK*(uVkJ)k-F˹f^`44MYޔY69뺮˲$Vurw:ZSLcZ!J]R+'O}.Ex⩣s9 W0V B;MiPi!8P> A|@*jt LU#hB@qdj2A bB͹ E$F҉':{kq6YȚWj2eʔ)S\\(2Z"V fgƍhUڋ&T`W5!* #pp{DXkXMMF;w./{v=ᵵ׿Ȏ(Rd Α%o /!:K" {]s5Ei"B`#Tf{'e:ʘ.ڴu=_걣ǣwuUId|\WeeVukwE1" o6rZCJ)TEeGLFAieYe! )b8\;pپkfC[zgN{ ̤Hi(fJ)$C7ó֖e1shdUmi#!pp&JA00ZHUu| :"Wjez<EF6 1(ċ J irvm]BP;.ʍ:(`ڕvYoLF^IcΔ)S=\v L)S|g\(2zE{=Q xǾ_}K;wZPʴ5aB`TJ BPIZD)ӤQF]_jfeHXվvx3s0/8MP"{sw ,9p~o|]~׹`ae2=aE7P& A罍{>{ʲFnCD(cKYU(bfjyj;4ml:cfv< 1M4Myx֭M÷ZcT쳬诬w:uNko8]>G/W<֎b5qV8ҔQofC@cY;<"vFJÀH`qeD '[ $@GhBUWUC'Mڊ&kV!i:P: uY޹vHJuӝ+37IDQI~2o߹۪p_~e^_u[nf]~5vg}% Vy]ŭt0زe(4@ZkJ6rEd- NW5cHyN(!$`HUvg: X,%O{o 1,̇{پ>#ʍDe*7褬DRm khv$"%"6h؀M*,Ƙ43Bƣ* 6`<c:s-dYUO{|4\RM3۸[={Ϟ.|ȼڲm~0)S¹”)Sq u]n[".ɤJ4" 4"@Y533iD8MV}IuUJ]u='xرnMU"c XP*4 $1"t!M??x;E k$G Ǘڋ^_=&ivT..k=_Y__>Ex2,!44Mn"Z"My"jhl7f"j[AB]խvP+xϾ?#^q&8^ں{kw7un[2!᢮I'YɆ$Q* ٕزZ#"/|\립8^BpD  ':@@Hͼƪ33-9GJ l. PV[$Y-,mRtiwʮ~]9s-qNWLy S)S|\(2zvvn߾KW7o]Q@ XVJ<0dIc\Ve>3@[84T5HKH&C\jʲJFJyԓ.>pBI6ڵgǮSgV.@d@fٵg_[;;IQ~ٙhz_D+T\Uv*{>74MŹ@T(0ƌ8Iy>hY= `0\[z7keuueqa~;sx|gϮBcG  bafAlbkLqA*s$!R׊bm4@`@@d@ ^r! 5v(M 'y'@F)1*kg Pyv6\fO?–F^qy 6.oϵ2NtLy51SL6Pd4-mBp駞\ܼe7̀K`@@R]}GP|5:uJW_o uQLpev9D6oLBR&A W@]*诬;}{( _VUg*ʫ_\,Z٦& ,dűߺmn{zW r*Z@TMJ$IUUqQWf 5}ҭVq0xsy "P v%#^w W^~vnWFa= {9FBZY$w  V+(]鏋Fe=aUyU&sI{JC90NhXTM Q($dmp4LzZ7JYt!j66 {,MW^՛4M"z!l޹eֹ<+|L2CS^VzWnz뼟޷|5shtD JMLh4J<bHi I"BP:e$ R  v^6Ic$dF [0ndY( h! g,2Ÿ7@ADfP O>\vycPXaS_ (JӅҪ+# m5- XE MJ#i|Dvѹ|CI4M1λ8ld|w﮲{mMr,qOF̾,WL+̍M:2u]ii"@dA$AFh#5bA1`GAQ@QVHDDJUh; WJ y^J,gk F 40tft~m 42UTEO^0=^\(2nI2ؤ̕W]sc 7Gqk +]]jۅ nIsEޱm vE+Cp,WϜ=vl4Nznd:ID}":u ʶҤ D, -nqvvsBYjLjh&&Ob @(՘H= @b啅N܍hڛ$ٸLB3P}y馭۷ᠬd"X:paJ^3$nV-9vmvԩOo{Y>) 6uL0=^+=am!)FQtԳD$ `@:Gy {BB@Z!"!jad8E fJ+c ":"&mdmQԘUS_#BQ}_%F"E$2D5ݼx FIE$"m!$ۨ{Z7MsCld)E7}MJa<7%IREBDF["O4g¢w&@#YQ*ck45{aTRյ,ˢp8&`C!kf aE@Xj_"bka@BQ(Z~kyD"U HcޅZ.#m((i':!Nm;.(SMRd\+8ǎ[ZZ?3g|p>t_wG=߻ѫ IDAT;>~oλ~GK/}~wd+LW߇BF 1"e߽g_|o^ 8xTqٿN(z'MouǾ=,E[ڴxԩCW^;3ۋl}p,DBY7xѣ/dj7cb_sTճ"ڼe'uV)TUmtXc42q 8 D߲ink&n]R*If<i!4EQ&|~~*˲333$+$iUU LHϴh|UOm@٤X_3K;.jϟX߲mhENff]UGZpC8¤j\p=c6 Z! Bft $+BHXAH"F$фEjfeL.֊E<`YqQ (d$TYl۾yVJkٹ UqkYYضCaK?GzW?LfяO׾ng>/~UO<;}{Zxǯog?w]^׼xG6%q|/Oyu1=^\(2:b!iuHݻ:uj dl8@>,XϜ:m]ڬ2p0zsQR:B` h V#(EQKvǏo޺NHF뫫gOU6F|MK;ޓU,>BҊhaaъ2@)a@sLQ\pepc1qUu;w8SAپsދod%,p2'}G~lU}ߎNZZZZ-?O]G;庲h۷y?yY뮻m㎵-[,XFyoy[vL&}~~ԩ}Cԧ^{zusTPl, }P6 ⒋//g: >@w${Ƙ.ڣȒ@֪ȇޗcY7mYʫ y1 !5kV^_Pd42\POBn{Zy PA!F qUU|Ucq Y„l- Ԥt%*,L<׽wsgxG\tEg6LQoe˖|-h;O9Wy6oܝ;;e_6u\W矷%w.~ #oLmj0u:ZqB5Wdr G,=|dCIbsգ iM)Bq|reBA 'I.2˄HRB !0fq L(-e S OLTU*sAբV(DwRb = %`Z@`nwnduZg\CݸZŮpB ])Z8FYkV#LB(DJB82DP!~&Je<:RǑL#Du<f8M3@)%|ǎMrr7w=s0* $|8RW^xڒ|!?QK֢F AB%к@0#9QNıhjk2 "'$!!5DPm td]Ʊit Z#S#(gʚs̛{PWsK}VmǺ3Y ttdG~"IF+Vk"&^eIOVwzg?/|(ڳg̛7o޼y0gΜ>zժUz꾾KZko[neҥlٲI gWZ:}}U=77lpW{_3>sW|3K,9{1hDVɻHy%Sa~K\qk֬o1?O<139ڵ?#/1^*uwPdqml5zMLq&߻Bx߶jU;S?4M/_T y1S%rhk1JE qg͘ !z=Lc0h,Zq64MSB MBU %QJI[Y2CeL ̙7okQF)kkQ|:,P<mch-lojhJ&VJHP$I0 R^JlWSYk=d20s7 /x۩գۥ9Vp]=CWZALAqG*]VYpQIS6g8n6~$}}K:bP)}ܡ~g&CF@p/<[/(kg?rN^&1z!Fwψ}Y&0Vk (r )(4Jw=k,9=kCpU?k&l)WZvN_#D{<}C_?я>3Or-s=K/mvp?_|1!RZs羺3ZԢE^:u(:;;-[vnڴidd5or%7o[kT*9m۶3m~LizןuYOӯL=pr{͛{х|͓vQG \.}]/}ss͛1s&n޼)˽`zI{: .`bb=6oޟ/utt]wt?#me ]SF+%p/Ӗ7kksh@D9gwLXعs?0:4$l*E]]q՚֖k ŌJ#%EZB gIH1 hs,= #?!asΧ!4`4T5*C;䎛߾o[xo];V-Gci҈9XmcuvnA& PdŽl6ylc 0Έ1iZ(;AA vRZ 4-^2obbdw{u5.\\3XtΚy[vaJLp PNNaXeB.LsDN%q5Zǭ纔1&FL66Pg\Zj @8﹌804 AJ0^Z {/ǹ.<.>s {ᵻ߹/nܱ֊Aij5'_Rt5<ógϾ .'|=5k֬+W>'|{z+Vزe˺u~_+ws|ڵBZB͛_:uXUѯ._R(B,[lՓW>餓/0|;-r5׬^xLp?n-~ňxG?R?_?kzzYgt8]sz_s6_y6oڈ?|YO}{u=?{޽p)Ks{~sDZ'w^tEgyn׏?vх饗W.\o?/T)@DuREKa(EkPF @$T\hm+s=wܒ#݌gQ2AFhOooFkGIs2ybQ/K%cĂՈ@TRcV!ΝӇ:Go}M K =: F@vDB(@(EB,HXi$P*8 K!~׆ `-*4W Rc4u<3ъ`pY,fKT:zM;:ԊIy|}:cDM7cki@1hܷ}sǾ^}u]w!̘1# o>:c@+׾6gΜ3mbxw_y_fϞAZEQ$w/~˗/f))eWNV+W.'&&}k\rɩ+Vtuuyk֬UV>]w}ٲeMA4SvkXH'?cW\1<oo϶'vک$ڊI٧[ן+λ[l+3j'oEƍ1u\gSfJ8g}ۏo[~9>r٩&O8;G_޾c9s`dzUL088f3tPq@tu =R2-Ә;krw)Z)eAQFZiJkXw3aZ *U+G LR4h BXDPQv.8k% \lX{s[v<\zwH#Iڤ4}Rn5Jikm%FNh4 8mG* #ء݂2Ι)#vՇjE=kzȷ¨ N){yvxomOzS6ae6l=~bc۸F9Ȧ.(B ZerƕԜ;&E,I,pN`\ pa,(P) R 2Զ%҂x.Yߋ5|yu+C;6+f>e{ftȉ"%"29jDGX,~3ԧ>>\fWV5o޼oۓa_|\syo]x0?5\}h,]}߿wѱ|I뮻yڷ-݋/mWr!7tʕ+ڃ>nZd:lٲcMd~gST?5[~2#_y+"޽{gΜ'`޽Q3_i /zwwW$Ir8\G7wQ.W@f6z/Zӫ dєR!(|:/󌱮nD$iJB?9s^4S;6ؚ5OM6˿/Xuݾ ^K/NWT Q)n@03~,ZDDk%B- ;3f̝[nT}彔 עrVkF@LL e:BXkwJq x IDATL;J&M)ZdDc4*+iy`lE5?]5<6~Gܽ ( 1b#5YIz^ԉ̙I<02229f(1֮Ԍq΍ќ{ZvCm"Vk.`qZ+BPSΙ< JJ ,;Jl6!ueR;*@!窟1H(gG{ʩt=uی9'}~u63O_?3n+1ycTP[Ȅ.AsS"8u8} B$RΚREI|Wp%ˉ/1ij =i"in&PԖpJITRQQ,f`b|ި љBGFydǣ(wJ$I"'-12B0DkLE d@yw/>Orʩ+b@HG?3յ펛͖fgSץRS !ECC;3uw@h X@0V;ήgR:"QiZt|xw^[s_K:@)$ Ð_R.B07opn f sh,Cp/3ё7ĥiެlټO{ysrw?388X,bPrl6]BpY[TguheJ)M;u6eDi " 06)R(uw q\ZQo(rtt,2~ 򬠌aB0Iz. nJSD0B2ZKYOZ-[7/8g~-S0@C @iRɄ!Pjԫsk NPg$90PmDJ!RTV(!i\h`2j.[j6σa BŇ_5s{{;{wT#{F_xe]ݝ5a.z#9Q ]f5 !(AAR #uӼ^WofJ-6[tjfXb[TV `i\#o]r\>3^ST.^Zm<*[U (vq}@cQ^bmTFYR@qġ #;FƇG[߽s$30KR &KY4c^" f5iP5SAJ~n?uzΟQ@LB |g=cYohˎq1z.j@<]]6C9ݻwz+jA@6̜98S.t惨ժu<=kۃG_ry6k<)jSYs=+>fOv+]4w]ܤRrХԧL*)]~ԔB`m6ιQg4Ct;lǒԆ" 7;\˘ӌ6${n%u=Rʇ$V,KҜBoؐ;w=Td;c1ʈd!ц$i85>JL3iv7T ѭVõ֒B4ⶴFyb,& 3@8PN\whg lݹm˖=ph6=O0ikx(dchU7׭Kh]b'r0N(*z&i q)c`QkM9oZsu'=lK;ӮP pJYZ\+[٬1&U8Fi!QNP֜ac,n޾>ett1cD+ fqT+:;;ZRVK(3ƃ Pϭכ˕|>G 9fs˅2UCwo-[-[z,^xtX|˱{2“q3Gw y]oa `blQٳܨUb6'(X 2BƤp@,%2Hh)#֚ pTkE2Mi cB 2j[AZlu~6!80 G)- Z G,IPpcp`S&ih6"l4ӼNN34+S%2m]r9FZ5 N9 H11 v} ." Bz n8N!ۓ&IR(VynřLFMJ8 Ԍ2*5͙}3ʍ|qn޴u=f<(W2MfOt]竁?t1]|9+SJ>}8,FK)oٲyddud|l,F+ w=n2 `6Md qR3I6Wm;km[n1FR&e2$u/BWLϥLeP cL2FQٵ}]X5?{Mf4>cVil5a5?y?kʡBN9b, Tpb-JZ%.Pkd` 4Z':!#t!+][JYk6mWg{Ni.#|ϋf+!fMAd:wȱ3F+k֕I !(<%K0_(D[TPN 0C$9$`LpmmjD\H Vbp/PڤU0)Dji*eeTKwu5 MֺݽǢE΅m ݌3^&W>_[.[lhhhr{o;F041Uhq۶<Lu!/$Q1F$v}Ydw@8:sƥ=Pܱ2-'ifsk\<j3gXk6F-x|RUEƠ+ֱQ;}Gd7 (D! C=JeLVըnxqc=cu]á.zKj35cFZÁ |;p; /d4^=21hg\Qڨ86ƸRJcQQJRƘl6yxHZp RJ.5F4NZf ,&pΥJ)Jv Gq]Ï?Aϝ|܉q(62%':K_7VpXu[n$Q֚ AHi&I-" @(C]. IDAT DxFVJ3Zh]N0I,0Sʺ[(8-s]sR(!3NeJ%h$fG]a\ uJm,Z RVR#2'-馛o{$'9Re~{0ɝzu@>裏>~78>> 'ܗ\rG>/,X044rUVKM7tW|L34ӼNLlHYƆ+]LU]X٨VZQ-_Žx3%JM`r=}\Vju* vx[d`Ĵi t `)7meik9 sprB!j?lڐD9c{kRO=UظtaS~>|ŊKλxq.8X̚ Q#?_^_/~{oZ4%b۫ [Ю{vDr>t;rM"jd<7 {TUF9p9uC2hj(QP B##IQ%#t3بV. -7ߙ;쨹y܉'<𳛟v~rQӕĔ)erf37rnO%Ɲy22:pNjVZę FDpˆH%燆Y"0p,cQnjNs,VnHM2ME pԳCLt(j)m X(Qʠ2hEFu69i;x*ﯧr5-DA!qD,XWPi`P@08ʠ")~Oǹ DG2_>9kO:^q뭷.]7> /p'>/_~W{_җ@Jo|cŽEsBoo}˖-kZj``9mwI)/ŋ~ԧ.&@ַ7 |{ݍxokpk׮xGvvvbO?@k|<3_fҥK=˗yk׮}œN1SLFK!Zc}ꉣLVEpVyG *%Ş0W{6-BjCPm4tvUZ2; mer9'S2 g7m܆H+UlFEBA+k)3Bis;}LZV\:aG,vDZ_܃Ξ6s9rF̘=`Ѐ8-Z0F<21͝ IJ^KX !ҒXPiD㺎 p\G[e ZZuFZ3<8HF"17lj^U:}iӆ_;->4 s ,Ӛ0 >}݇k}L+e) aŀ ! H+[ %l"afuCcc*J%B3FJI 1Hgcl| Q hðؔrYmLAj#R&H)@@)Zb#_p](\s8Ry~6c,kebFT(gR뺞iZk !hez&IPXkҳfDf3.#DX٨|3!c,:{̙^p[7-Z=f1jVԵ IKBEYq˲00 :< "Qb@d}716ayRf?4CۇwA #!b値4!D|BZV45*C0E6BLC]ǃ>x?駟)A5k֬Y`ƌr]wuYgZ4zwqǁ͕&\p_[oO~2m483?Ͼd7|]wps6yy}<}7xK/Ovɤniʕ͆ZN$ pΛ;LsY|?>]SL1!{KQ" z?XzMkKas/60sպ06 R 9P4c !3gNx1+w޸iځnz⾇\1q`Ѣ|k^F`qwY3^ڸÖ>#mZ~b֛nf^)덉ڃ<\8)Ig|з Bn#-JӺ;M+ø !:~۷o'8#eZUm۶}[Wj Q !(%N8 hvImiBpţCcr|B( |?|83_|ŝMwq;Ӟ|>;|J̙3_GFF(:c-ZhѢSO=ulllr]ou-[uFFFv6X[ni77GZZZ8/䜗_~sҲӫŖ7w|osSyZ":su)^"{K6b[a0>>!޴iˇd[!Rc7l#+ „6b q3:zs!4FHJN&ZP cZ7Bϥ-2Y=h]o1`1jk*JbցZ }ݽm;g{ y~GYձu+/8pA,8H0 k<벎'i>wbt:2THE!EX mk ڼe֭[9c|oom<q uFɔZ3 Z`pRBNc,K)EFqy*[6Jlݶif{{z%R8z}xpGԨyHmlDk4giZXЈqв80<1>Uac8% ټ.sˍYZZV YTo莝x5'n:3^؍? Yիocr1lٲ+WZu3`tqp o~K.dժU{잯}-zԮS<3sٳ<ȇzhr AJc;w>#L֬Yܹo~󛯻7a\soo=;jW^ys|\pA󿞝#9ꨣ&ov'JS W:ioxytۖ<+X B!:ew w-Cx9!," UJQ)2ZP2r ᔱ$M0Qb.Z,`kL( d4M!)dFC{[%Ԁp%;QoG "]~wY\݃1ӟ7x9<#[nԧ_~ַZ .oF('?6pҟMڞ=\tE_wא6:M$MO}fuReM>R`FkMnUR *[R1F Ahm҄)5\k9߶c($Yp- l m5oe 83<<) VL.AGW{} v[GG!Rd\Phlub|hVٳz[Z9@3bH7`` :ƨC?62jxN S1utvA 4Anݺ|>fHZhk۶me}l 8>#4RJ0HJY9gfʍ0FiZm-ACZc!Ƥ8Uq"An-d(2Idh{ &J)gT[ aG֫z_=a΋Z cl JI)PJ1B(s<% !\5H 2"nJl6X[j"z$("0a\k@g]/K'YRhDHd 1H X@[i]Ɖ#Zvw^)Jg=w0 g͚uN~8?OMK.q]s.o\sfY*>;X,^{%l:CN? /pҥr \q?ӧϙ3#|K/O~FlE~7߼}w];Jl|.\.w>?`څe˖onSL?r|gwuuqW_}uZmoo'B_<{o6t}sL>=+WyGW^yed 7pý޻dɒWvvG>h&f\ґ#R cޕ* `40F*0"XE sY\n*[n !Z*;v|gK{yPmؠj5t[޺T+~$Y@dtl_=}v+owyTO>߯뮹]grSO B=Ed(Ԁ6!Lu0jg\#a 6QjYcVmBSR>883߆^z߸qSV7w{v]w)NꫯO}dC)?g``O^p#<˃ ~1|][k;.誫&]-[7M===ʻ|իWJN:siv?uY3fh*>zg\G;o~_4zw{ޯ_`y{wOqe˖o}[RtrO?y٭[JRT,|.}B0B(D`\QCbƻw jsRiEBBirΛRj5ZƹYd,@82:2<:pQ 屡-7[E</1p"VLmx.dƘ10)p@V[(ys~xӊ:K|ea[Chkk*1Rc,X8N\![hR&8\"S FH)bqP6Ta8\iuE8Om+ʵ ºmZk`C}ibljV)l,44ի(մd۶m.Ÿ_~zw^x??"Iꪫ>KrΛ=r~q~+Vhkkt6lXvUW]u?S1w{… :M6}_]ŵR\w's=8ܙ?[oUJz-{{K]Qw]3F#NSXҀ06HNSD" V)kQ*aJzܨi# !|H0ѤkZ3/=o{ ǟ|ʾKԌv?~ ?f]Cb L6 MhtΞoRu/?O 6`pxGy跏bĭ4L&mGj9$@PZCB߫ޞޮUYp IDATӴoy!=]Չ4q05cNFquxm[`J-2bR5l1qy&`lt21+Skm*$g{ӡo)ۺ{K-3DA`pdbd2JU(6o>m xzG5j=h(rX3F,c0F'Q(L9at[[Js; ebP*Mx `ZrP:.0k11tj VF }]+Ead4hdxP[ e3:Xc^9gU*BC)(!$R͚5Zo2:'BB8A=cp4Qd2gT1Z%0k1ʤ)eŢ?e{2YTDB fF -*d z mg1B;FF+aC(k jm`H$ SL %0BIPf3B1   /p3f?'M1oEs&Bv_ җ}Ns=X,~_?v6o޼}k'v?KGGGs& ,ܙ!|Js=wB]wK{pdŊv]w5)[t-T*:jrβe˺yW/;}###轖%F*-&JgwhQ &ƌjAI0r\FR V #F .84$RWcL9W6l9|ꍏN>{ })tXbA"ǍJHR ٵ:LTBOW}=[vp-ld DjlBG:Jr[B0 F@Eq5ǬU/xG.";f,W ^'Q֘ZTCi#nv{b !aJ f|clkAƠihTeZ[d eXXm;62XQjbғ%AHE&3! R]NAns;,Ɛ6ɢ7w/o?mp /7#*NREP 0, (3`xkQY9arR0Ө4F0f%0" EE#/e@$8`R21i!@6BXz..qfVI#ʚdypG,4SLj/ZS>رcl{ܹHMEQ>}|̙SA{q)^O>~ _~/˧rJӔiSs˖-~4,+=Sꪻ^{W\qΛ7 6vm'xbSn444t-|3٥:y_QJP(,4tEkڤ޲/v4ܸycR#Cz!G:aZ[ry0`+ h lfhp;n6a8s;7lɶ)1c֬99W(Dž.Qoب뺮.ԵgI*P(à 0;딊QJL:DeSPmӹxg",&fc"2^QII A, hka[HgN*Y3$ERu*%شZàܨbkT)BfAbLPm40KB92(I)8K<|?ID1󳍉sDCYGo|]G쿏s:[1"HM|>DžQm00@`Mgщz&Pڂ0%Fa0.9<3pd1RXJ ETbF0jX/EFdUև)/o8 _|q__w 6L6mG'+VϞ=_{G J=0 /?+V8#ӌ1tPGGǂ o"EzW/X`J&{pWcddC{{{>n?_߸{K8Zz?Wȉ87jDGo?q]01Y w=Z0̘C0!2>nË(҆s.#aN^K2Bm("lJlD$Q6Д8N"F[d5Hm-pRB0&fm`)yM۶y܉0ד(d J5ҪRFqvArNN4NgN;EOd捅\1Z}e ZHDxJΌQk@YvY&GIq\NX)j&gڴtt5RYzΞ\!c&I{9XK bae \k3Zd)"I$˕)z~ύyv˥|ERrق9+-ƇA=m|3VJd- ,]Wz-~|Muh[6`C8:()e*|o4KY"nim3f4<֨K$$Fa* Z&I/A%i3h'ڦKT-J|zڊ#mE-GO=; Rc  Ye2Q!9ƜYȇ/̾\Wrb, \;h6FWĩB]l  ej-Zє2HNi:  h)F^aiKZ9*MF=JPߣ=p%rT2%VkA]&)b4 5h IXVi`u=cd1FK%S!FF><4TTm662^j1ȱ5P (xQbQj#21@FLŃ[N Ҙ9g.9p?ԖAkBIay0FZ$aBZDaL`%2Io~"b_v- *4Ao>Ƹ(W3B#`AIsASiSL1Sz뭓(C[V)SdY%mFs}kis)˜)hm6B# &J(H4W 5266;P7MSFюҪwOb7mag !{pdLǾzl%ycc +RhmZ 2wZmDj%; CM׿ƹ?uUժTbAŊRg}2./Qok28>_e!nܞv?v`?#畷i?mh-.fgFx[?~/q]w>^>C5ƀ5{󃠮6|? ŬùRJm-2Z+m&Ju<"DGIjlkqjt\='PF q\+8hm'FH#"cRXP6ZFCKiEVu\~'FOJi԰S%Z86qѨ l&ohk' 8FqR>-{q!EM D~VZgg}vS]}t-(< 2)ĒŋO?N?5[ L @TX8P lJ#ҙL'rڙg8s8n,JuwtbzTybVS*'T:u"BY:2f |gMם 8^yaD%2B*yU .zE󈱘N3Hp<1PJR7h6\! " PSY0ohOO?M222rI'u>}yc|tMz?~+OڲeKMvڵ_xSR~7x?G}toChe-ZwqFɄTDTcCn$P@@vmٹqӎm K:H cmܹ]ݳcJII5`<=~K/̘9ޞq]ukifrى /|q]  up&i=ݿ槒S)"i' E\WRI")61h d- ىd!AL,M~mk/OV]n)Ӓ'ݖd;{QRb[KC Q@5D" DM[4L`j=te˗Ϛ=IuQ!)Q T! c0J* 5( Jŋ(~v3<>99+us sfh~hca4,MdT>rj4Ոf0#@DRL蚅0q=F ; !PRa&D(TȤ8eN#FA2v\H53'(VH @!c`oQG398og?[ۭ a>slҦ^8Uyr!r!gResm&n?n;y|``u[o .;g{侗yO- IDAT=re]֪E-( @4M7m6LL-!g::'w!1bJAj 5h˛yz:1cQŬ@@BE@4H)ȗM@*ӓW2T  )%F(b!_@)BI@H)B I.1Dcj&RG )(@@XJR"i-$WBaVi?sqtMW?gu/_/~O?}U\rɗ%`}k_[|yϫ4 avy͝;wҥ7ꪅ .Zonf}_]|… ?j5뮻ӁSHoO2-#^PBff 4Ɯ1`L7 t)%&DJ;_kpqnk婉-<пT˥GL3k^/yn000wl|*Lq.` $:A$34Oq8 (D֧K6mٌNig[. Lp׏z -Je\Re'-NAJ`J؉|e "W;via$dRXQ,W*nקBzQ.8:(0jzɦLǍW>sի+J Jnm &H ]0ki?~t||Ӌ/S ]u@#J=BI4E RkTW#!0D`(Լ K%P q(d"fɜ4c[o?00pŊ{O]r%'|wfX83wuuax=4M}x衇ꪫ5|3r={\xW^y뮻sι+-׿sk2+믿O~_K^f>l6{뭷^tE7o4_C=to߾:_w0ߨ?^&Sr^~}&' '|e-XcٱcUW]Wu͛7]l?J)/?4 /#ȏ38c՗^zyhѢ3@J.MӠTJp$ٳkF]ȸi O$-]I+N$S &R11&J! LH.41q;NTg; 2a AIiҩ;gZf2oØH\z<]AB 0hjBӎ7VT^7'H@a6gQ1βl" 씕b:Ֆ$i%4qG[f`w^\jH 8Oڶ|c?z)'hz'ԫ_+ 9(J(` d1?SO:-֭Drm\QFwW{FF -F|8^+ )R. p3/~0 Iږ^Co1a`-ha1ŕA4$$0 !R"#@J" 1AƂ8~ތ7u<_.o}|3f4?88x!qvڮ%KH)oo}[+Wjk6%Λ9s^`>(Dž7t .9餓/^<00O~2 ñ1O~|;W۷Zx?|boҐeY?bwvvwy.x#N9唫[tW=SR+_ʑGJ֬Y/}idH$>O?۶mۛԷE-9`fB# (LI6* ZcX%Ρ88M@Cb4] PI Xӈ PUәfh !0!H JIY$H 8B8|ta3/B65=0t&( 8|^PvF J~HEH Ť"c$UPz)2)JٳvN0‐Ft 2W4==!51 8,֑JG^xnK{ipK.ƙp].7 I#jRkDHAŸLK $s"~GH @RǂRI.EJricAawwvOr7\wݦ#=aͱa'FǗ.\:9]z%Ǚ?wT^\f8cBH S?%=tgΒXK씍I'ү"!BX-bG ‹b H5G`)1R@3Hp$y_7F/[׾K.YpSv~SN9e_|ʕ+3OzEW:3BJ󼡡id2 }Oޟna׮]jcsOuIC7p׿~vG H[[ۑGOOwdS& >>{%(3f[r޼yME7| 7}soˁo>آEe6ZpEQGe2D"Q,F,FΎ 8gQ새bRJ. (c1F0~E~14@("qS9WID) #9IJ$-B(P3]70t]OR0)ͤ#!8cqE3!T BBW aJt#V o~186M0L6S,aҐIIdS6 b |z|l~V+I.{ڋ)utwuHP !(愽joEs[^p8tJh4֫N#F@ľx~d{wq',=s. *ںO!BPȧ{Js E+P#T :MYAbWI!R!A(E!)C.aGQ8"H#+l TX\_篹|``6O_{ׯ?#>6 8Sn3h4駟3c=6e˖/sYnݮ] Bh˖-u g5CsHSo~=qݡG}t/Xu/ G?avm]s5k׮Ͽ1)ӿs9g||mOwi{n%&ضeRڜDdH*E4M)JY;tzz^ |WLe`BbJ~섮Ar24J6EH i b]Þ4mֺ[;c1!iL$DQH$ynS__^/;s1nI)(PRBBH $`L1PIu!|E=U<2Ž=;JӮnFYDS F5WWHmYd܆๳:)i߹e񵿗\LVB #Ժ`)%Aq"%Bba#>kxj/Lv*SEIĹkT2R" j)u,04jRkɱ?{'60'Z38;ֳe۞lHt=K>UQ̄a )#ƹ0-j8gDBR-$ST Hd2)M|b$qQtQǩ(w?,N+L*Z)im` JfֽQ,/[n…]ve<;]Twזm'p§>Gydlll˖-{5 MYȽ8hg||k1Me]㏏u g5/n@|߯T*r^ۿۓN:i;JJ +֭[uYMwFq^o4裏s=wN8e]?5klذ?qI{p:BaB5p-΅a 2٬;}ԱAvE0"Y1nQ%BJ1B0:%T"?VҤN) `]  WJQ BZ!v#"AX)1OI (b%[@"S뺝Jjy& !a$T4* JіR%ӖzS%;iqח~ B6Û۸fҹ 7m|͚=}}J sчJX0W~ @?%Q J5SNQV(K2}]@i\ÐZ.kbBrBc)5&8ʴ^z4FV?s=9`GmgCL<Ͽ.hB[a9# T)c@O[zw!6uMH !P("K.$WH $1 #4@JI)BB |uHYo\.w_r%y3fhYVgя~3 4?s+~o}[]vYT5k֚5k/l6p'?|MN+&wRʥKy}lEO>뮻.;w~#8uG#sJ![z>-mVDo蕴| dI*tjzksBpww'h4u4-Ӵdqsa>M4L=1 0sFG{ŠN@^ܺstm{'Rew>vݿӞͥ4M+Y3 B ypͅ՗1:71>knLq"Iu)LRA"Cl@#$.@a.$$t(]4MBs.ՉTffi7E!!I`׮{LU+JFu}h0!4Dgr٬H2+n`۳th[G%/(f QBLF,5ݤ >^.[PJm{Zs^aHkzNgBhj"bQqy8.pd2IgN$ @D*cӞ$'ly>YED,M̵dݘh^tU?{Ɯanݵ3׎;R7qP 6}{ ~~ МDݴu|ڍC;*Ψ:U+e"ȴ2qMGG5j0&{&NOZM ]!b۹Tlh.cRkĘ'#u':tcpzNo|'7grң a!D Й81 ŖJMؖƖ[iƘ9g^ JIC|ZT!$ J@q$+&8(D !@HLIl'+GFFȒ IDAT;ݣ-|Ef%V!}4-#թtJgN=C@Шפ5v՜FtzժAG~<]IS1]T@ZȲf!͢H*Paj"*r:& X5Aȷ܊1jŊATc ɱݻ_|[ 4Mm/g3S*OF'bvJόRB:MO_?3kg¶;.Y208Pߓ[W{Ȳ%آw}oZVY!cntB<^8,y(ΙzïQ8faZ^$'45b庋;CT d1 `%Ņfa3Ylv7cծTgw]rcxt4N#SsB0X 0c|R`e #&$B PBJEJI@(FJ4 $-?(B0qF6'Ք4HwlGCӽh@dE龴xj{wzhM~@ TBau۶BFtRq&XK$W$Gh4܄i-^ J¬YJy1X7vBa6R!(,(~L+k`,%-j{r_el>U,DH$RLƶ+1U<ϲl[Νzgg?zI'$4L0 =Q&ǞZkiuj368U] 0NVwW+2T]Q:yrHǒ1jR"DI25GzrCm١)-7sٌ~駞}e+Wt K esW ƶm 5NݫAO/\La $iLS״Rcjq3_t]'X,y{(%C;HS/Z*J|&یfF"2eS0!BHGsu4u&JMB'gJ`.%  ^[SODT-5ǁ͛7=j%>lzݽ_җf̘Ⱦ9-A0 Ij:Q 8i! NM3vF"fSӥIDrJd\*sml\j: Ð1F˚FTJ &R RJ䴉J@2a:N%DzQtze?^^|i^lߵ#b|`jd2i18<- [`}[tɼ9WB TF3=16cێm[Gvhga@ ;gBSiƉѪaMkD+ )Z=:0)p$'Ա.oԣ*:< PoP oܺcy(ۅQ#7-|j Ol(9taF> 08< 2"Mf{}B7 GQ<21]lRB0,dJ#iJ!%W 11sB8LasB!9'hWR!A18F ]  RƜ Fh5̚5kq{*kwK-5`'sܾ ^dkmg@ BkĩW8L&tH#j'HF5 ~h4 q%lӰ tТILpGA08N%cLL%0!$Ȧ5E!&#-iU.daOd2{W+Jn^KuM +LeۋX7ьNgmmPR9f%/=R◷Aql*9G{*՞LNkۆ߱6nz7wŽ^g ?S Ljْkcbd㏉kMKŅ +atu&ӍF#.*nhB p4u *; N&npMbJ4IP* 2dXJƂ M+lPmjl6vaJi\IǼmF' R(3'Y|NN׽ wwōXT!RcQ.ۖCs-3Qgq)Fcۖ\./=d'8%7ۑP J5 |T*5u+|b4J۶m kvN3{ġ;B?1EiiT~ 2!,8VqLЈ! %$DG,)$$ B rVl&I:)BkWd3CH)h-ZhѢ\0!@328gQ@* Eۆo3sYJFDm{y.!HeYQMU)Љ ׉C?JJ!ӣcDblfA=޵{S%%P)pPj{V=k`?HpE1h8,[l/x;AY30qL5 P@DTٲXL"?֬g̘=O:ь_l/n޼JgҤeLJ 馑L˖R& F{Gn̙]33mmC3 NI_xjlo)Rd|D)ߋI0&Mu7/]}w9kE7ӖHئPPݤHsA.0uSPR 4ӊ)P!*@@Tizj)ScrillOjBf Jd[ۅs> Bcx?2uB@!*@q,#O`R&S !TRA6;P` 5HJ@6$I@ D)VӢE-Zx9P)DP! j9͘iT)ţQCqtua9F8d34$ G c,LO|4n/U 4 pl[jQl%@7JL~td\޳蝛_ӥ)سu䗿si+ja^pjgW>aA)Y!A$`b-1e\ ct R=KVJcAOqn0%)qBGnn7L6>gvH tP}劑[?)Ş-:4l9nF$LRKP$d)baGGG.'[7nxK.4 8X1@u@sTHr  XB %cm_\׭T*O?8r9"M$MƖg@>?488{\ðK z*inYRu0.F(CJ8ҋ3Z/U՗6́ /|衇ZL{G??66v?x^!Yz꩛ni͚5auQ_9֦;n3г>{5׬Y /袋n_*h9 ֭_w ٶv f+#Qk9^ZJ>y;b !S)%?xsE$ǖ-mK%U4l%dnWܳo*֋G}d݂UѨ׬yl|ȖKr%E "đ&! !rΎBPh Rkk]!]Eʩ?U(MLQ¤ XkK(8s]3fRwx|޹ZV& "0JLh^g,hBь19RR 3!Q!o}C2 Zk-"r4Nurx+ooV\J/_@+?)'x_n;wZsy~_vƍ/_V^~s|dwf͚ʆ: 308X{nx˙绞e h-6 p$;zekT*d D5q~:#SquD)5[An#RO.?6'?55oavkvqj},ޟ<6rK/9pPjb\p]O*/Z8M=1Z0nHmlk:VW'67ÕzcX_[J#"c(R=ܳ]75 tɜÍ7VX0ftFMTV{_~xcaVMjzDQ 3s]R1|)e__oBKǥV%ǀ7hRĪ8M/pl{Zӈ-WKͰhִG}eypHP:21TMMQ989=]h‘zݕ)x\oZXe kJGrH)`hc8.Q(mMDZRDIqoovqO Bcr:Oes1sLYnnx|Lo7M9s;sWy~o;Wу>xw\rҥn30 3,it&ں\d!Gd*!6Jt@HRIu(fL UKHĈ6<2n*niD9oۼmtdG/g69JHt= ?-8uϿ0<6~[*Ø e7وnY]]o?-uB>s6'䋫lEg\.X D.50Ï~3zgXdžHGw2+ukW Nru>ۈ)]YJ;}]~ߜB&J\_҈%LJX a"bקA:ŤL*M7m1\,K$QlX\$?zi7ի5kBY}̝b@l&IQʄ f='&j1Q`$恫ŰXxiogwx&ӍDqXtZӎlo6T7\fً-=Z)t1"2Ɣ֭cb$eWA 繈8=] !q,*e@Hy$IoqW\qE^җ /g\{_Wg. Y)u?߹sgkS+uUf7͟gûVJ]s5w}wǧvUW]=PDdɒWfa K&Ãds}{ojr|5mNɃ󖥂V*W52x2ZJ@k8 %n6z-̴ӔwOJa o hR}⨥ q= \( \ǪaKg JwVc c9fpNe~p˖mccc}}ro=\dwn<|ԉ'ɥH&b=92z qaGR+97\fYRIH/Hdl|KRWʊP Ng2! N)cFUk%a3,o'³dž8F" 19||zҚ1s" S Ǧ"8(5)!EV*t iVXp c\2ɶU IDATjk֡FhQFA4 _ZKH.52s_k2D[빁_m5ZẔQueHN"RJC)&2ƌ1Bq6R[Z`;T+3gwc=vצK/׿qXw7zzz({Nk~x/z'?[/?7pC-[wj_fT*}֮]_rWbž}CztO|X~Q81` (P 4=}vD% :9u3륐F3n1j!܆DI8RKL8qL>UV !d(*Vㅉ5RyJK%h MF ~xqRJJ@(/J%&Qq/l0vj\ F eqɤ.H'l&K7qk2Jc$R0F1RVbmSʭ !s I4kF?Cg/}|٦f9:: ͛7o s1wuE]t}q[o'?G'|>ϴ^hu]~8̞=n[ӟG>/|:W<^_;?ѯ|+Z6A/w_|<0 3qќ ?4ܾmZ[bR3_J͈1` X$jrr,W, g4B=Jye6QAA*+D* fHr.?tAC*#t֘#;'^xamZ421Egra-aPtvruZ2=n*}sO?% t&J;F p*ර}9_ڷp0,}gL8ݳ{a!,Oo߸nTS }\b-ja#_z8#$ AHbuDA-׾ӫ7nfF&5Ns΁z#jAPB9!HhU@S4`9aWZcZkI@YV$Hb1 &)BZh @H !9coo}[ozӛ[ѯ! . Zo/֜-R*VXkϓO>{ժU*ond2<Eqfx8Xh&b"z|bRNbA^W'&gءvɦuq!8Z6:6N 3ƬZҥf/^F-)*z\Q.Vq c @p8x0e MXIZMLīT6S9ᛷرuSOʴ 2g-ټ楍ϭL况^9,^r 'X(…ED@H+,9uWZǛQ*\.+2>b5h)@ 5 uϯ[ŗuӅƮq 2TR)WH&L[H `-ilB#46ۦ Nd&1[ Q( \PeԖ/5J9C ((%DCd=ݞǑ&d:BbhMGg{ wΟ =֭_xn&҈LjATPJ !BFA(BcE1Z˅ AP R* !US(O~7|?Z]w5\s-\fM&9s/<쳿ﯾjd2իW!7n뮻nzz\ۿە+W>㣣j |?3Gݸq *fO<+ϟ)lk~x߼+OX,+JX pWobqӦM? .h}@6m%{cs=__y39k`O/&{SNy{?/w׈e6:T=ݽnZ*\w*]TXԉjڲuooѪ<],tqϱh%2M)P; FXרSlѵu&uw/'ֿ`^rnVoǛw=:2H%.u\>qECBE$@SO@IfR<&:2c8,;$H˥P?$\D|1TlEX$QJ$QZF#l4(e.|ߥ* sΖ-[fx{߾e_Żu,\mo{ۣ>:66w#ի/K,٫Ub_[*7|B/+J}}}Otg ַs=Z3s\&IӾ{8Z&x+ h6͝dlb,˥2)cX 6ӵFYd|m=Bl- (MAU%AGaBYnFXRVV+aHʄƑҬL.2Y]Lf-*I 2lA`cCo/[+Uֽܹs-(ݬչdh4zso4Z$]V J>e˖o~RVi7y]taW^y;>O]q7x#è+^|sK.?p_Wz衇^VY/avww}ݯpgo/p_.{(p~d||e.\SSS7WFOjdqޜy]=ÄSP%"1p$J|?t2&EVr<T}  `-cB%vhtX Sġ@Bt5%k"4VGJP`mX"%.׷ut9 FZnЦdFiը8&pBMA 9ZF(61V6ɦT͑VSJ+Ǖh'\/h>v;J?e #`X6lyG*Z^uZ(&ake*DhLpZ#P59Z_]In̺i{N0Zd^/Tp$*FF(<ˈ`r`ht}&8R8*tJ.=u2F2VVkFTLZl YZ:F>6d1`R41kJ֚2 B)UՒ$Yju]{ 3~[S{~j{ὧUbE?O|Yf27GGG[O._ŋ_~[r 7BeԸ˕rQ$j_<32} j}9Ekh/ezꩻ?RD###bwvp.pݣ쿓&2rk9"b^3 4j ] u)tn VQuXK;)9(GIPh'$j}ONO\dܜ#e HPgV E%Z@+J)#hB0Yϩ5J[A!P ⎢u<#?Qk_|DjB)B!T+C% !FJs-eh-1 &,˝`:Oih1"IbjM.糍?КŽݳ:/XTRS.ḖMQ4]XZZQ#Պm B T6 6=h'椂;?==1YDŽ92Jvg_ڐ&${~f=m&.rfi'p,^JHjT&t.=16L}=gL*Wq) r#34='FkoFh8N[gI̊0Jwus ns8&\pnTE $xեaT'@.jNO-]61>2"f2)D\hmʵEkUH3} X)#'xs?=Z 3{UF{Z%0{nm۶J%PJlGQ499ԨqQǭ,/[5eڳ}_NO|!^=]>a?N;i@PRࠔr @&c!@ĤR0!DVBpaAD@P~ɧm*(ytHeSAtF^^6T&AҙFONI.r4U\&AN(XEnkOwuڄa\KTQ I:: Bs8뺭]וR:9' bL jP,]lҹ]=edu_&{쿓fOӷz뷿M6~Rj4ZJpl&)uWz^.KRmmma i!J Fkk:c6F7*ʓS^ZOXjQPhɉ+3p%B + Q hͳQ "ZBR q^ Zk-EjY(așF4ZV.٠I:(_k&T\ߺmdKv& ڂ2E@` XZRF%|*`VSPLL :(QRJ:JѹLJr 0J}I.'"8I"HQh5]]ut,\RftXJJlDJ PB:{8B0I6m9\cL$ZK"^ hm1nQy:xb8XK("IL8XK(0NWC9@KGTw30_qs=wq<ЇN:餛oyU7C9.;ӿ/ GC[b{%\t}vڧ?V 7pQG\O>voVY^^uꩧXzuܗ_|e]bŊu2O<.Zy睷iӦ;v_'Oe_g,[;x9{;s8X ~rwWh8 ̞54 ؎LO+UTgSZ !͝ǽ@sigQd!|V#4T,N\8ak5Z&@*$%MC)SBEJBH06PF!([mSBElwa玐w̆̓OZuE5+&$ e-&*UL>U,clu;8X)E{ƟۍtVrN$ᜧډrbcmr$ت赈_@ "A#Z2a($tmr00`8.SQ,rmZ4#P$k)%BJ)e š\8RnxxHu (IQԲ4@VeEBuQpέ5ڵk_1FJZk)eRknwI)R~nۥdPuC\pLNJ3"˥ : 30 34Zʼn f7î.*I$ U:Y{$s)DXc ygWZBhGD|Fc4cB jkA8cB4h„䆐(j"ga P)"!B1Hٽ=8u/vs{{:|R=*O+fhӞS6pi> =mQJ7dTirSUq3QXJI&3]mNQ,AZ Ar 3,JZ#ڦ\Owx 0iuD5aNZOX o6>BƆXif=) QZRZQS8>m{<Τ,ю-Kkө0^5,s*xg6g`2DGw^:B)%Z4-K)GRR,[ )ʥRJ8"X NBҹ "LF_={G{K8hcLAkmlzh(כIgaf3KjuIDJ!cqfRf"cf"PqRf~.%hZ\0"$  !$ F+DP$@3km' EK(%ZتF@h#ZI>Ք༁.م\Ǟ\nP}7UR(ΎJ%Ip֭kP);'+hpihgu'_;0=*vw!." *〢0=.82(3"QQ-{ҝ]kOBbTyGuNݺUssP\9rǹj hBc2Ȁr{rV$iDmBVi]0FTQHpv5dрI$v`FB mJ#dFb1' 4U"Y80WDmT Qb0t vڶk FLJ@ђB(c۶ !LG),k-B T¶TB!qsR 0!DF2%hJ(2!5Ƙ}ei,2,g_q9b"M-6k1v'cjSR1gљFk/ڶoÀcEƚb I*]/SNL45HD6 DAE Q!)Zb!Aqy$T>FVZI Rj52F@1$ IAHD%9ݡ-;CyhO 19YXppHW MSq;R hԊd$ :`廸L z綮yjhѼ^v1`11f -JfD -Y-Z,AgFBp.&ҶoбZT[p Ɣ!1clY,WS@9KB0Un5ƸL&[pRZL o߱n'R60T'fD/BH8sBqZ\^Pʹ뺖eiZ'IΪe{RV+lf Ḓ5Ӂ$ڲeKoo7} (NiZ1pbi!+{}_y>kgTc& _F{ >Yfc_NJa9c4M3GYJI)Z;ylXJՅaFkQ6mPPΤR3 8L d ?0T2 0ȶqB^B~vQm1Y1cB BXyM (2Q1>:e8>:t>c;awpgwg~o`ipT,_4d׹`e{{:oZ:zԒ9Jǟ%i+R(" (1N9OcLDY8(chr ͰVl8B1&IE*DJ14MIJ-UlQE1T*mqa6m@@Ma2^o=a L!DHRhRJFMw=jv, I!D&)i `IK%#hQK%cF,`C+81(єBR?zWs9gtttƍ/a_0ǓU%^zghG}^jՒ%K<3E_=о]O?}Ň~7͙fyWwq/>蠃f2,,3iFG"׷SĢ%9rinY[96eudlBDa=}7<Ȥ2Q&BAuO)9L5@vJJ]VJ)*DD1QL$6 4B؀R9N]n!1@!^O;&K9;֔Rn[٘Ď*e-;:MqG(vzl4Da~6䦞6&S+p͓F-84:pb; lNRE=M_Dih*XXwJW-l, Ovmf|)!BCَ"PNA2J- lH?:yf+;+I|anD36b2on7l['QhA3*nQ-mM,4 0 [IRqbn6GB P,͝m/\)EF)&$$$Rgytl ϽCFT*\Hj'qi0Qh_)k׮}YL xu㣎:K.QJ?<묳~f>wy/O}SG^t<̏|#_W{O}S~ lۗ^zҥKlOz:2ƾFcL<ϓB$IRJ˱Tije(yE)J|aMc:NeNNLjM ŌMP)9(eI-Qʼn1q+ZJ"I+O&CIs( ʸ0J$F %ڳ8'F`6!hPl]?+n Bc"$bmۊ`,Vm(SBM!JT)9(l4 Zȶ8j+_U{ys_=KVJelNR J&i(RH]6Fv2MBJ4Mr(*J1t8vE9zN'48ۖ=ffQ. 1urTy[`B~0o^E)6!.vqٔRj !(Ȕ h06B,I8bh6$dA@)E4 #J)A8JJirq 98~6Ѕd_>{o~Y fK6_S""_hQ6?r5!r!ds̹曧zzzs}?N8lzkFwtt\ve3/UI3,9W:Bs  a"1ຮ ՈEoڰ'ӑx~rڧOO!ZCaPl:CH $ 4Q)Ԉ3q|IX+_[뭡fqV5v:hyN`]r1-hZ1h Vc7I --f%~xS=/[bneѰXx$m6So߸a [lٺeM6O?ѡvmd8,)s^u`eszt{0Nlغul햭A,˭MYgw:xɼ9X Pg66F>:h՗\rLJ$I;ofj~iE+-[kRvmЇ.(K?7xK{*~KZ98&ɚl̡bJaũueՅ=|&I-lh@Hd{yaBMFQLZemv(\eɲWt~KJ?ʹ]9s+y*qYbmRLR-0-֋E7o=zzUu#H+!n>PU*E~yˆ՞ t yܒQ~jqmrsKU&B>U*W|;6a;rqYg7QZ u ؞ky$.t{Dt|>Dy IDATEx-R(J.[rq٬E1km0ƕcB`cRJ NIӔ+E`1ISeqՃqݜ1c<凶 hi"J)˶2@XW؍^f'??я^\,X %O???d .첟'B)wݫ#;wҥK/?R1?Ovtt#8bܹg}8I'jժ|qgw… =l{}{$UJ}g>3o޼J~UippC{=gj;k]]]o|n~vg.X OwswZq.0v_ݍoorKOOy睷7r>|+Wˏ8∁o}k[Yfeg_q9N$J(2ɩi!b1P(#D脈d-seK)M(!gRJc0fB!OZ# sFpY:;:[bZqn-vz9#M 6M-!,uŜS)\^ԌD)"[< ©Vx!+]-:ɖt7 o~bݓO?nhF e6`5cIuv 5$J,3+{s|ӡJ$E{{"MQc##\h 'ƣ(K( ,{-sk $R`Fk~, 0N(9%Ӹ\,pNP((vtt y?b`|gGҁ, G'8CRZ9жmkBQ1<[0^.:u]ƘR*SJAH Z~`B Ij4j4jibLJŎ4i*AH$R 2OZ+}:}_?[nnRz){>(kϟ088B,]t//p8'''_.;ɭdwu'bŊ8fX,z||< ÓO>89wW38'? '?93vvvg wypw|'t$Iᄋʼnw6jAF|ӛo| B3|֯_l(_M7~/c{7,ʾFJ1@|/kAƀ+efD1DeYVme<`U>WԘ 2qanTh~zӏ0@E,,):; zkak6]Yλܲ@h=4:ull?Skl$1&yr1R!)LrvS)Wr@_ɱU*"-kTh+ VYrq`P"SlF  |-T|W7a+لZisΉZ)}d5P #fYiRD2F=99o?򋕒&-N#ڞY\$"NF0 !ld1F0>#JP-W 7ƴh۶I>W,q uι&2˜W1eU՗K~?syGm۶gJ%c'`Uz޶aÆ!{oy[֮]qVpO<{yWXݷ=T xI^eEE2՛7o뮻fk~Tս47}XKLzm򇱻"$SSS3Y/bRBάr]QVgyYn/}ōv\D8N$ 0c@Ry,PZP(,_|A5%DJY*Q)%4B]!1&(RP|riXnK9 +ԡJ(k[h/\V,xyBdnk"a j@5cQ'Z*0F+JRہP *Ӧqv9Exޥ[%ڝ@HqhJ+ a0AbZ9R726 IŦ(t8E}G#X}e !NcT,vW;8W(X啋 !I4%0NTJ9(`%KKEJ۲FS"=DZ9/ӣcӶm'CjB+¨1h+u' Id+Zky+XG){Օ0gE"cc``4 ZJn0rݜ1X+IJl9Ȥ_njӟ#ϝq1۶O;/ɦweݺuV+[uyBW^yn*c7::|e/uOOx0008u]"E@PǮ - Z6==nݺ~'tR>ϊ44h6Z- Ψj6l[wyo~g⊷m\nkApW'tF///yd&%[o8묳2 v\f7G}/sQTz7\iWk#}l&q)ٲ-A"Pfa :Yk4 f&-Ddj(NA\!0 ôR[9YxjJ0_>ic;y 5$ ĶWvcb2UĤ-D6܂4UHEJ40J?$UR>_ĺdcZtRQZ @% FS@t Q@b.^G~ݞFq ip%Igݣz;N_ F! vWs"pK$Y t4ZM\4M=;O1Rh@i@ <96]):md\ bڎ ˍZ;NTHL K# (NlBAeJRJe@( ֎gIBo2˲v\ d=˲$*"2DZ2aa1aJ&"^ΉT)5\r^h"v^nrK.>կf7p8pW\veG}4-oy??e_q_.v}1ʸ O?>sf_;Νã_|?co}KV%׾//Xh1*q73#7O/~1yI']{7tӞ7M*hw;::N:餙Ŭp]w 3ZիWWe˖]uU3z_ fg3clْ庺^麼I$f 3ugye^8~'=HI* 7"j|W_}>2gjo9\޽g? (IvsFBlɲh@;,m5߾-OmCE.QIl0Z,mab# ]+OK<11aY,]ȎzkVkL%sj4J"ndGEl2zadRQq- * 9E˱fӍ{xt{ J[Qr;_I Ѵ\cwuB~#Uxy*q qhB @@K Z44psrtzx0Ƕw._; .,b6+uF/\u])SO>%OôT,@ ;}of&4twW;W﷤\d]ghbrK$&fYoJRVMpڛ6 5@r%VvCmfv Ѐ1!`XDcqERdi60 sy/9+iǖe5)-p脴=`!gK E/d-Nd*izz[y|;П5kּqJo)8~nνx/~;_qGq){ .;βe֮]~ڵW\qDQtUW}z-%\r/Eo뮻'xW^UB/~$1}. ٹcjj~Bwll젃׿9C{c[neÝ|Yg?Ї>4sM74888cx⫮j{(mvUW !、{u}?E_W瞻Fʜ۳eRP(yuDZ,1F)%`3u?E5dP @\BaΜ|sllUkcp}ծ"bp'2('1r(Qpj2$ 6b)a^Ӱf[3ltQW~ɼ\3I)$ ڛ c)WzFTr}%QiC1b25JHJֈ`AUkH){ђtj2nM{3IZ-AR`Z#sh آ4 sB{8tpŒ<`IێZqӦ# m1D smr1cpP*UNIVkLOturZaqlp gVnyet*m7lߞDLuTeYp)11\)#2rυA262li0b,#TSxwPRJ$BJMypqГO>yg;w\v䥗^z?+W'>d& }m{mEþFDfivt )1 FV/oaw_aq8B2`RB#DmӰ8x MMZLV^V1qLێPd4&ݮWt1sP0 2 aTTh~ Bcy*US$R(RD RAd!J?-&Ģ,'!QSJ)\L'7.Ţ̳aJAh1[2bU(vʫV0`^OoW\B: 9]] 4yXۭPK_)?npsrmI2;&fD|$iBw()D{@E +"2XCtrdeBa VJ m0Bq[~Y6*)ŵVL(1֌8 B( B亮a* C&fWɮ.!ċFpFYr/bg3 {zpi];L㎵k3hn%JIArz_ŋgI^+ntHxAHzKk=Ib'Bѩo}r[ Q!m$JXNVH kɞ2^0N6 j՛c;i'' nh9ZJ@(%RaҩLBHTBm 4s'jٰyh+60j*CƆS_R "EZF&Z%`" 1an.zmbbh]ںa#]\<>z^|ƀe9Ru]P(AZ;-qba S -LAo ضmnLN ܊ :۷lJhf=:ҀWhE899R۾1&s781Ƅu$J,Gw&rKqιyƘ4r\, !Z+6RJ)gyBBHc"!+8H* ׎=, B+Lt&xWBp~'&&2Q=H, #Kc={eiZW^y__e_wgg,XUTG%J2#ӱ;̈́g?ka{]D!wօCM7ZW:8m_(q (FY IDAT)NXssSO=h\JA] )"Mѡ֮0Voj#pG@F J)%Oe[ELm O[,=l?lllQ&L"(h0!L*xy>h­-GԦ&XȲ #R6J,7RABJ3bd6ipnSL(Hc,~tqmm5&F7+Mjljv.gSo-V˯ϝjWO'I *N@FS1裯=H4w<.#vB1(KN6h rT&R!$DR(FsrI FԔ1u]&8sFk|g'xuo8ȶT!F 1ZQ ? 9-fU޽R ̽F0(RJB̀;#wh49hT*Vˀ gsJ1(e1}z|ŊRWW6m9|_0p-@uM1RI!@œ 湍4缷⼘GBRcTFKqD,t*ޛGYUyLt+2B`DUmh}TlZŠ(e?mX 6Fb H@dk3i\̛ FYwϭu>:%ʚqmh;B6vMqb Y6 4äTRJm7;A4'Z[,]mfrJ)Ƙ:0 ,!}DkV2, Q32Xk5(NeZ2>,`vΛVʢl&dI&y:޺}1+C#ڨz$R)d2j9! m)9l׶ -*j z^%@Ο?80%2KBܯvdDXARn-RQ 8`DV/d>D =2+g\/N48g),T J)`&IS2cVSNLOWVU${n#6mޜ$6g||Wkݨ79BN괈;˕q˖d1!$SJsj3ȨLFʸ\4$t͜˻g-N. j Wm%mLKsAຮ뺎pR bZkm$r=kf$Zrx2o5Zp]Ok& Jq|>߲zqZ2MeHMޭ':ɾXbE/M6VrūT{v·T=,9+C%v*U'8Yi6iUml#DiX'2 ԉVg 'j™<ꦜ)HFiVW&  $ yTί j2h 7' `SNmv  TT╚R}䌈99Q `"tFlڇQHTJ]U y[1wxu۫fw*9 *V=#'?w 浻t۰ʑFV$BCh5۔]#4V&ٜL#3[яc}][xyg5u~y[SS2m}mi6c3V *aB17eA&d*cvEa4o kN,C@B XE ]2bA42Ӹ ՙs S&^Fh q#[@bA곮 Z EŽ7{bS ht ã08AeFk"e/h?sYxy]v}kK.{3x E"( dI&+8ThFYsD^l6+hRjkqVQrfF{x@#F$h8ZSiu 8+³ʂPJUqSu(XvuVV8qfE`XKB(@ƪ0#l1mo6ppc[u׎Ю8thؓk|h918~D}Ӯfb-׮C^'svn\[YfӺ[[,bB0#cm;nF1VkfJ剁=ܭwk(HYnd:]y/?l%4jJA&;>:5jD0=BuRgrWk H,0\H ]fm#٬'v]b RI423-$ B1fll,MӖtD"jucLZ @T)TRU+zB8R4JDrA.HBFpD"ˌ3Z=>/ N~+{ywɆ >7+Vnoۭ[Js=wҥoO=={U+ $L2_RasL5d#C]Pq R h-)d1C:Zů;GEud/B eFiϴNXD #!(2ZK/gk *Uw"UFK @Z'Q- ~,hUf ΎFUh:Fq Cdh$r21V刚0LjBznzv̒R|Iy#;HR* I'vXSTkݒ4AgoaRn3~o-M1>6:<8R֛yީ} ]8ؿp0$XC2}jr6sY(q>0Vlk1 85qB6}ʩ=]fH}_(RYzq]tt<ϧVL&;csR )%cnVUJiyh\;d2Z- (VL6716Q?Wqoy[ZfG?\r/G?z-Tr^z bį ͢I&ǡ=646>!UPʄ( 2I86J1B Zc^+kKVj qJ!`($Viby0`-"hBB@-AdPk$h @j$5VkUhMCk{ۋ;GƌќJH2űfM ss$Ti3R3NN}D&Ȥ:2)e$U ЩQ mAJ*k1𽾞n2ȸ #}O9o{)o=N})yOHZ 밅(#&6yG9B5u&RJ4ZNbv508kp"Le4U[][Zt]8Z-ZZ} &wZ|.giX91F82tvvrƭ%@%aB!(ebˑ8Ϟn[|}ݷ[T͚5`c9泟,|_޳%\R^{1'ZO]ige;uQ7xW\qGywqGUԧ,Y߿|7}PJ}_V'^ߐ셡)S~8{[Ndɒ~۶mO:νY|^> .Xnݾ|6,dI^46:Wܴݛ(|^8)( @(hAc(e9PnYz.9%H6T:e\;=D3:Q9Ljc\ dW&SIJ)`̢VV N2u`Eb6JaHAi`pt|ReJc^c̘=Ɯ)A8o>WIP)g(Z=/犽nilPyU4 ^R'v8NwdK0`!;Ls%1j]T|ã6- %3߲l1zfd" 5!Wj9wg7<1YU3:~)[6mePW@> T@!m^;mJ[ l6]%R&JFAutv&i$e[Upl6IF#F4N0x|6ϩP}qȆ Jv!ryӎZ 6֪iش2Zf]'z&AhD&O8_7nŋn]r%w܊+3<SNyGip;/3q۬)S0c,#06>a+ɴ96()\~iQ2kpt`:V:h#!3]'R)h8(fe: ͸3ƶqyPJZ[KdL6#dk:hRJ)6>^VJC2D)+]45Z`kq␸PuZcq Q%񴔑QG{~!H CGQb!M'p :J=ܠ9_8bZyM6-_~b* IDATj&ڵm{r%X1*.k׭jLbC2QZ7SMT=;\!;Q18yBX&RiD+afp&3TJL#td%xf@-!H(jG*ͻ߾ha-(vh2}@A)"NAҸ:Qum Xu٬pFbXyJ9sg311 Wk9wι#ztU#(8J^.;:HZ#CvMw&f%ZH9Of)m8BD!ب'sҵG}G>kv՗\rG֝wgqŋ/KYg]t~:R.09s_:=7[K[ouJRJe.FFF(:ȈRj/u뭷^wu/7:ttttI_򖷌j_Bg}g^r%5>ӟ~;/W^yg3L;['?ɗaw!ǁXb_CA3>$zhm w?%:TJ)JyM5RqĺxOُ{^oyLƓ2" 4@}&B(Rq;8F5ZIB "eL"'ZV5X- !"EDQ$hh AACEG.7Q;k@fΙ7e(fYa L8aA6S b`xxpddx:QF) O}m7o^Xea- XZh*QKQ#5 $ _N!?}Y >~@(A&pcRa_T򞱔剉{onߵ},Xe˖+sk?|夓NڟU b׮]^x=s]O2ɡϡFSƤIQA."kA+[ z\{_1ȗrBd}.(fyJh-_j50b(B,Ƥ2p.4 @0#w\W8hc(oIYQ""hQ!DJ,ke ZrVK4F.\B82R#M@Q>0>HMMe͂yFdɒ/W,wq]vviT{]w>ϵDGuTWWav7,W]uԩSo馍7N>>I'ww/Z8E-^vuſd$O=;$w9\v\z16*M |Qf9/6#O}ݝ =/1M,Jc0k.J*640~HBJºKz8S &6!z5E`c^&Z2cI:"c iԣ(j42\-;ܕH)e~k- Z@c h+*1Q_ϟWq.[^֮]}˖-hWS,q;કo}Q.|׬YsWY&7_=4ͫjŊx)\q|4[~ڵUVI'[~ޫ>Sou7VZժ;w{zhhhhԩ_3gNKNOꪫ]xᅻO?nݺo}[?}ŸWZqx㍿+_o}[B^{Ĕ^yㅟݱcGT*Jb1r |w]W9W})wFGqqxvs\lP2Cztϙ3 *2zFZ0FXb@gsxKjTso(@I,07#HZrVrtaE 3'`hn4%hb`,sF-#h)2H=loT#1 4l踞V'{x;b[ۼ=7UX,fM(v;8֢*Vv9]r '<RmAF,[VͨT,2J0Db tw1nPČ |` s_zJ@8͓Jգ *h D#/ w P\Jj)h5ulT:#RVsDXAjV@LrVBu e""U'$@92UQ3h ,7ꊓ"C/V5sZѡD|WW.O<ԩS_.X^k٢K.OWi\n ^~壣oc}kpu=7|ӷl|8>㯼ʝ;w~?z_mpO=( җ4mڴ]vك>W-ژf/򫮺o>WZ;}  o뭤?qK:s_1V_e˖[neƌ*g^m1w]4zO=uTB6#JT۷mٹ}o;d?(l& B( -Z#m6Ⱥ.OThn6\lrϚ5gס%h0fg3Q )TuEQOm|$4H$NZ +*d#aL#01V1HE:ֺZj<::yf?ʵJyiO>K* 0ws4##sN~)6Z;:V(JںbF;V~Fnɔ2N1OrE[;46a mZC>gnjwe+WMvM|c΂@(B!ѡH17uZWGrbPir/㺝]^>F Zrzlr9uӠ5%2F~I)mUR$-kAkMD)ёqƔ2ZᣫZ+z;ںRis4D0!PkAeAƧ#H'\&IFZlY)h4? 7ܰg+Ak?[ԱdY@Jӟ7M++7tM}{/Z{ɢE ?u]wo/=~lLs9-Ut-ƻkp|Sk }}}˖-?}j̟U;9gqƹ?FFFg̘a} 5ƽ2{$I^.{Ғ+f[qѢE-?<66//~l%bܗk؋vx5ܫwt t7PIJ(nI81u-[j˗~i Sz5 t &4pME-ԵP6xw}aA$fcFD HZudtgEK;򨣗xQ-\rlim̡Z`weZGZ4C(T&RR J)s% R@f4aiBBR)+u\/ uۣQ< @լ5 ^u`.Z|،YS;:|q\Fz@qvO<x`˖-9s :WS,elQNj%#!o۶1j{evuu\_jϊ6:Xx[޲iӦ;w?-Ÿ_^E9_tvv*6m^{Ĕ<*3@VQVGqDtcQqNUq"c I)<7 1J)c)nHP RRWpNSRma""5ZmZ 5P"!s*kkZT@),4=7|!^xyf4Nіr\* B˺ԡ\'|![(%Ḉ`WƧݲq릍[='[ wߴkXekgvwxܾXWU&aR4`ˢ4~<\!(ZFcttTJ Q0qʉ͸,qt*=q`RJc}Ba:NKy!:i\~$Q4 mutƙ$q]2##l.vwwOV,L6ds660dXT !TjF)šR5$EDQ*}>#CCC%#]};qWr|UWuYBjWW3gy^[sy&&&^"nƇzhpppÆ ozhDʅ}{ډ˗D/a+޴W|SN袋V\9::^{Ĕ<*y\r|Z~ /<0MMƅZcU*eh#Ri c6Gq6FY(ӅbbT81?|!`,i8 ^G8֬ 1@ƤR$L"N)Fɘ8"f{ƶeD\6(uw~MK>jzv1:!tt{ψFX=Qcfy+y/ZSW 2\س6Hk}D&J0QJ [ӥBQzoO*iWE 0Q$0\08`Cq ~)n+B%B}<@H[&s͝g|;Ӻ muI+(P;)j7wm; B,$Μ1Yezb{9( m.DpІ`Ƒ?߫W BF^*c(B8!&Zmj#L&(ÞCAJiJX%p1!X)eAq.!!LU]}m{1Z5mz^QL$X05VJ!!31&J cB)[hȯSLéc/iy7^wu+V~gx@OO?O|7 Ǐ@39Jre]yr[n9cWXqeB]Ɨ+$M IDATL9|͟箼Jc̊+nfK>L'_27"7Σ/׃Cq;߽5Oo8̨̙FUu$N(_h6" 39#YkMPB(sc I4I'vU]㻄31pňılhJkc9r!XTؔQZg? clcBcp)̚0$I UB8alhcw/?aW[-/n<᧽FF}L{wrPV Gl 2^H Xg!n[lO,X epuW,`j"Xf٦-;DLSyr=/ J R ˎŽ+iʤTm48fYkHk9]VVk~6QFO݉ǝl4.FcR6$I;BRJ0B,ˤTY&VeR)Ռ/x3M1ś.Cqmx?ݛ)E~ӟ.X ?+9N/Bjި/_FsLa#MO!Du|ѶP(!8wB ,}_HE c͓eUgZaT,EL &eXδM*,xpQMDny'CI#c4qDL"+ k3e(֑zvfϘ;4jTO;#~m)mˎmM:twP`5 段1q:gŭh[0,Z12?y9Ƙ Z " -2+8L p,Z) RTe,n5̞}Hgw;δ;nk T{T42yKg{F+lo %IDIQTR=#[[d(+ I1@,`㸱s0. AHjQڌ/D"Bj|ߍ([]p6cbTei|i4VRBFRJ)DZ0&CBY&,)lWUdz)reP^o(*JGIBH'Y3# 00A>93\uՄbLlE_mAkE@8aVR$ csx>0FhX#F[@p&ES0` >ٳʁ_g5#/4$Vj9zPqӌ `@B mqryEK?!bpvA 㺼R)N1Sk=)`0 Y2w#` Fj$Re5bFQ6::1e)" `fiD6:6:4yJ:_ meF(6Ӣ8e *EFLakl-  m/lD-T}pL )Ҩl(JXvAk-$Z1Nt&29"\* 0kZ!-IU Fs6k`RX8 q 0@ŝLjăqhv%G8њ 4Pư$Zێ;č.,"qLǢhxbtݕ$k2R  RJiAhm5D2RV,;3<ߕA./]҂"ƄYv`=}`ds`%5 mV(;Ȏq|ߝy/~{ ,6ƺP \*iA:Vڨ4)i"0_" `̌ !7O Rι-ZG-14PKav1sLLA!4 ƴ9ƧQT ;vMA4hȬCfH%1FhweFܺ5ӌM/nX~wm>kF VsOlC#!̱ VLhos(Me1RiUJ| i|'c X;]]0Ƃ ]4ei93}AF?[WQ\ l0Ӧw.\tDJ%Vh4$6Zj-d0:M4F+ h!3ƈRV6@IRsn) Ȼ;/Bc\,d#cL>ai4FSkc Xc6F?MGޓw!mv'{\sM~rڵgva}7_W>LuW-H)/}=C`s^s5 .\`'>|&\}K,5k։'x}N:)gʕ̜9SNoGvϲ.]{0o~g/|{,&d޼yԧN<ٳgmo{Hz?~Æ RI|?,XpE1sGpcI\O?~'t҇>Tw?я-Z-Zh"x{߻hѢG(FuL1M7!F1/>S~)sD$q&d4(iro Pe!?%3zF4X#Sg͙sq']g_|}YG?\gV|M8m',?7p߃?{쩧*F`c ,1 iugW!3%fՌ[͖L3k,c>O~駟|;?5k|xGyo}[?OGFF&w݃+/~x`͚5ww?[<> DSL1# (kμb;–pGBI-*Ƙ kZjq$ 8 CBBQuBne$FZb5`H&Sc, qDZ50ab%1i*%Zk) ㇞}n^?nV!G͛VpqdVѨV]Ű1<7{qYG)m[ 5臉TYQVfZm4[R鎮N t?>/~_|8ٳgϞ=9昻K/]rӗ,Yb%K@>tGoѢEϟ?n8쳿QJwW?}5kKzeM<3^J뮻3gN^<@ >_c_ . .?'ڵk[ߚܽbJ;|'g̘{?Bn;//=*w|Hq}{׿}k)QSLpt̲4[FDYQi[Qy\i*$8ęFcr-8===ȴ2q89$RASj,8jkdYYjI1Z,`6VY=ZuxهtQIHL]p*Msmc&p8ejXۺ}VCmx:єFimtp'AƇB!",ʼb%#,`$vl۱q>٣̜uTGuXTQiJb(s9Nx<,\)[(U:+yy}3Ea~ޡ46wf#?إJ!ڻ{H p5#;hN00Fp0 =ɫz8W,SLr?>6`\%Gq\oԵ62BƘ`g͚#O?_馛~,_sm4pg k֬y衇rtX^zzڸqe]v>۶m#Rfe{{;Bhƍ{_:PQǫU$~u\x˗/K&z{Wggr_.؍e?oݺp@uwYg]<%}k׮]ܿGa5ѡo7>'<.hƎoVZ?x\_P]`1F8pLIX(V*A$߫8< .?O $X,qW^ys2;Kܲen?׭[h46lO/&]󞞞|+)A_f3*guUW]>]`(~8㌿zG7n8tMg}v!r'`9V* O RmҦ㵷WΝ;'#SLkN9UV};Ȝzv`u |YXʲLܨUOA!MS3cl>ϟ f"sjܻCk]'8NPE[ EĂJQ@g:aơ݃1Ҫx~W3\aF`ta$@)Xm`%L]͛7bMkwٌӛٺi4I{ؾ}6닛àPO4MQ hlqDM_W:wCu a$`F6129w<mxZmiz.cqH$.a}Π7SO㜶u4mm\3koQgϜ2BI@(-&۶m߶4`eM(@KA@( #GGF3gv!E:έ14BX0QFTEQ46:.ˣuV0 J)y.Ƹ^OyqI)aɝs[Wlׯ5nT*W_}W\|_hٷrˤ2sЇ>|믿ukF)>L .r?O|>}cGc|;'J.+-ܒY?7x_7%Kj?MqgqGwy/Y_7|>+bŊo}k_򗯺ꪱYf͝;SN^|^{'x뭷\]v|ɟym=Dq)`ǎw^'k^ C}k G[l~u߽?Ϗ_7ӻez,+|ZQs)M)VAAZm4clF.+Rm}q~K1i8ʡ DJufdJbxxp!|׹Owmӗ-r-Ei-8Y/RId(hR(D͜6T6<}dD [r2[=p).c 6:P(t)ʌY2Z7mB(Bƀݶrl+-c֠bފr dQj5z^ Cf\X9.C`MsJPoo7x '@rJk뮻X,#˵k^SO=uܹ^xw)M<_.W^}nEIOInn߾RT*r\, B.͎)Hk>F"Bۍ1JHyn4kZP.Z5¨j i00BIH% |m]=72!D` 6K))a&q,94R1V$I(#*j1F0JRJJ,#"Ȅ(B(a9`  ui_ixU"zbF)s8MTeAEdi4(JZI i]*?;./쎌 h Y`L&2w Uc/_|a҂%q\y>e)f#(,c!p$(ەFmQ$DE;~iR/Hc^޸GW FR>V6u5GNM$(2cimmekU7]mk+^وY<0 b:s!#eˆ1XmB fcƘ}Jiu:2uJ)ݵkHE)Nqctu`Bԧl !VZuM7?o>^QԱwqs\022jժɑIi 8`ʽ4?ᄐyuםvi_W׽e["Xbbr,hLH^43.#aeiGZ8b pN4s#QZ.0f#[)49 -LPuB *R;P%82.+ ().x$nɴ񋛶y{+E_bM)YQ~M9eo&!B@JkYwᡡ]c4bk!fG/nWcQE"h 挻^X+~±Vs˗A&3d4tMk|heC0Q4T*Bk ƶwu%Ix~/ccVRFh﬙=Cf4ݘiggP#>'⋻-a(Qfṳi2(`mRJQdY8..||'qQ(%󈃰QYCFւ"38.XZ]6Z*RR`ɍ,(,ˬib(dѾ븮7<< V~AZ+G A|cސ?0O<ĵ^sO~ЇM1+:ueޜַ.~$###vp)I3͑c̤{i1f׮]{8Z~Z~{`pܟH^ `Fv`,+f1֊R{q]cF1VsHC\jUhvSJ8RJZkQ©B(c;gz$%,`]Hgq ]-2!%L1J)i,h0Βu@eclv0Mj;bua^6֚F6S YKGQ6GepȡPD$]#MQReJ J0w1N,褲Pi$IP=Lic,b]̇ih ̌㖖-[oi=#cftqϭoFX̡Gu{vhhGTH!󽠣kC1$i40NKbX CbQIȂB*j5ǔF˥PkVQJ %!@L#DLB B$t$Iyr'4M=}?߳sJ)^~[zYFFiLqLJ-2BHD iR|K?u/_#;A5Pܝ?ץJnA/}[o=sy\ JI;O;v~vEGq7c-]Bmٲ%4|2E8`.Vu%q䬳:Sl76Yh>EI8@HxUzbtYk\Z1![ 3f Yeu&cȚ4 b%5cZQ^ZЮ{zzf`Nqńs!42h2Rh (j4]?<ڮx;a LDI$eY-ɒ,ɵY+ui*mguNNؕ]MmkdK%SD8O Ab$gs8  Rν>w~绿?0ǯ֙i%) ,v+kZQ"E̢,BTPhFvN7ѥHx[zdU1?=qT|cs~nn]YuGR%Z[nS5ŕKpHʺ+Ooz-I*jێL &պRk=v$NӔN9$:I(9EQ(ʲZ1ΘvwbϮ/厷|˭[|n~6pby/#\rsO?ЃZɉ )%%qj8RF1ֵsv8esp%;.۱{ncs.X+F}XRupBqʝ!DeKtS02\QMM*/eY\{d:Y)hRFY$n'Ҧ  bcƌկ,.n9Ls&gD,#/Ưʯ|<%y̵I ^Qgrks`^$\D~x8QGdHGi! ^R<r B,mYk3B!DY| m @)ABզ(< Hђ#|ofj4sǎʺR|?0ο}|o/N.W7^qe|"M۝Ow4[BJ0!IDGġsCB\k=""+%q@KwC j1]+}ʠ~ >6ιr4YkqmMlZ7Kw4⽵xo$5H|RJkHhmFs%Pӟ\Ș1c.B/+8Yy7tOw?c9lnj9.>@zN~WNB;3_s^G}{6\:sXs^\,wk,-66>?ڵ{H"ǭ*)RDfN U !w8ʲbiecֹZ+u DT `st=$Q$,gF#J\&dKaų'OUɊ$<(w:=y=aJRJ++',|0$"J]Ӟ(k=kiB7^-Mlm=_rmS<8f&nKdnn11`Y( 2j8+rcx<Jaj휫L4'?zro #zkGPFn>ov$/~\ҥ'Gow>eETE]%c򔪤" \)D5˪p0rnt[׳JIv'Ø!bBSepU1hJ)b8?\__kZy^%uKMWUjeʢGLh=ƌsa, /?OjJcW_O}y=f5k뎜|0b0X85=-nnUi'O&tbzbǏzq )#BpN= LNୱXc4saMwJ NƲ3+G5#xvN"1 {~Ϋv˷o|TuUA:,%|ik.T))J IDATDpZ#u+L$)MoEFY >voCˋ 33WVV wof@LU š.rvdQ%uFr F  iUUѠCU<;)DB)aZkglz( 70̡+.٩U[|7\$k9)Xֽ۱둇qd:=;1}ru֦ytcrFw(dj- xD!(͝kor}гCV@wlJ*OYYdB V!Q*#bUh2҄#{xˌ3Uʯ;wcf0 c|09ҏ*K lX +++@ !9BYm||pyw< \ \Z3*FA\@K2՝|ҹ7u:nd* vZ:p0\3&*!L-ZrN\ZjTd7͆KmHr4`zhӘO:05cfF Sy$RpgE:KS!e09,ZeLv]" .HBxkXXZZf7poۑ2m^8* ۹w_ Lu57sw]k" gZdq>vv'jc!xNƜhJD^hML\cf7Y%Q ZV+,Kk-!BZRڈ1v=77OX( KU[0F "7c̘?~цcƼR>}}ŲB CyK.˒8"WDcePi$H(5&h UXD9g.Rh8, ,J$e(k t$h'oYt17it}~$f(bD򤓕k+_"붺h_Ԣ$$b!21tUAb R$8Lĵ2[z[$$FS 4}{z>65/Gu  %H8u֫v:S 9CJ7FJfTe1X\\۹e EA02>pW~ j ,$xd6?pTZUUFÓ'WʪTueK8uQQHvO9P0 q %"xRg~-;'Zm6;Yt/jcwngR(ֵBOz3D&u$NxbtbʬaDEL6cK:ө8vy;2"1UA^l=#vu$5eO{]y-W+U>~_:Wkâ zpj -k׊. .8-F5kX qcm;ƒ7FAp\۝NO,}۳+ӀyL|[Ota sZR+9( tԜX& ե`-vnٳgvϞK.K]sfe+.2U]<Ѻ*rgrW~/~ӭ_uλezh4DY]>!xIB0 +kr:mgW]s2%4b,"y8@_ujKyl~`-y2=u!S2;;/|ajjژ1cXg/!eE)`x`UU5!`S0MS)eYdy1A K heUY#"0BֺQ94$ED)9Rvz'Nf21i-Ak34 V:/8"9dud]W(jRS}F4c\Rʹ .%!đTynI$ SWl9;3Z ƕ㌝ZKTS1xVZn*iK)%wQF#ȡ^$-/~#.o0yDq2#0"gc%I*a`:8q\ov9o$ĩb.1G Zkd:t]ZK)R6rͺf{/J)B)kmJWr΅κu9,W8ߘH:LSmΙ޾~%x{'[ng}|\H,G:񲣎8vҗtzm,癦s^c̘1Xg7Z|eiQ >`JHYUb DRTIfu"QURjtGUD 6lY4c{9^qe}qow<.@̸cv/-Ynx@)QYUi&r6AGq;mL)(rJMoz(@p2hFЧ-悈,Nڭ*_9|B29%* riM5S1nY&H9MF,7^E1BZojK)Jޚ(:I]k5N 21!rFJe).^GQlj'~_BN-ח5cAoVsfn~3_nϜȿԺ _ʘ1c\K6z8n0@) NEe$e .8{θYG!gL+} 炵_ת+U˲ #R uDpζZ`y#:%nߘCpFW;c RVb)$@B 8jgi !@0$[GrBY$AJ8G` IZ]m r%;{_RVv΅OcMoBHEx;kDdS!!sUY%Ir)`z=4xh# )_>(LF& "d:cg#)7ޙ&g|\y#p! Gqep$Ѯ;^{禛L|SC)1i11*`0\E4%,x ru'N\xNaOoWIeWtR$H7ݧ7ǎ SALk(ƒF@,i,)DĒ2_+p̘1c^K6^y.oˈ$Zϲ, IUUqƌ6UY6[kzǀ"#, z)+/]o+sG63 ާT0FarB6Sb|iz 2&@Shss&2DcCU4m:iQ4B)m4!pB (B]is!M3,:G)ȹ`%Z@p;u\HNfgO =O*s5וofz[*>ʛ1_~]?0gᓄ&moV4G?ud}ҧ .dbV #7^%K|v|k}ni?fnN Gs_dK;vxU;Z=;:[v9{wn!|#'Jb._|t/"K869b6(:ylZ~-Ձz}S{Xc'[>4zG罷~:3fmw?v|k+'΍3 G_j_5k6VOykn>rxps6v:D^__ֿ^3,_1Ń+Ҽau[zѻo'.kNgu/5)/53',^~ǿtl#׌0CN7YzÃ3H _+/'3f̘q'N$2* KQepmV%I#Hzz YYUUY:gggJ)pNs!2y^JPʇ!kS,?" Χ?䳷]pt ^6J5qq>}ళ`FpEm*ʩ*J"O<0`ݭaHFepjSպ5 qȱC2IOg1&LLL8JqJh܉raTӔ9'~W_ ˨)1xAQrIlDQdZ{o&dj1u(Bz(!NUV+Z  =uZJdd7|B%ƨJDIYYe]s_Ϸo qkye $86ڪ.VTERUU3eYEQx jZ9q< d )c9oV6gnZD^JjȔemm#WHm΅A3.FM~ٿ|IPJllzu6/ْ*Q#;K5ʷ[ʓkg6kC}C+?u?`Ň̉[mvD'aMƩ=ٷxt of\0N ;4]^i#4C~'obO~*sxo}аgRœ Κ$]`]Scgu5 cƌy XOZ[]DF֚ AĪ J ANw.(u$>XIΙ1 (G@ "jm6QD8V;  (@J)o޹Ѝf2MN*J`ԥѨ9BPX"&daJUL2ЛEeiBp0!"qa4^ȵYKıL,IZRʑpƁ9A@leyYg=< ʘB@HcQ׵V$IŰ6Ba H)4n&Q> B2Bs s`" =1ծv(׿ɽWOt7\6ߺ}iS ?2aO?:XPf s(UvB')r%ͻ")%x:0„lZXkl"AޅKXDSJybR:$i&*{9爈8ǾGl۶uB c1MP %QwU?S~.JwzOx7X(:g7Q,]"RFi$!Fobkk2ڌIcsɸHӔsBιFau !ZVH5(/k @PR9R^.ݏ_^٬v)ܛ.n[ 36Mܦ?릹תQe;o=Ndbܷx߾o*lWJN;7x IDAT>\?8Ai[1{˾{6ޅLr_aSϏy鸝3c\;O3WDDtZ-}Gc=l96k';%Z!3G疊ݲe\F,%3kR33'Qq䎫<6t>N+/B\=4{@}w 3f̘WŒ&,|j~t7 3ɑW$UҼg TQUYm(MJ \=Rm4gZ$NQ\( 1kUY dI6fI{W< ILBʆj,]qٕR("(]StҸش:8{0DL'FU6G@Xgbzee3JDDA\&M^&3'vM8Y"yX V+cBP`eYKnR2 緥?S6J"*@ Pp֎p-)@c!p RJ[58U}>؝َ_>;ƑKwxVOXÝv3;RlYRFSnljMJ ~txu8^}abMO{f7u8?֫sf}׊٣'?ċ?+or7% >_;шuO3?}yS=zdp9of]7!Z~ 皔 =sl?]s5iD/_~bu&_skW1c\8qxY~oyMY=w=ЭQ[#z^33eU$QD)!__Xke1cq(.@F*NKç>sW}W_S&FviY/x?$i5i~n(Gmk&*2X~8 0,4R٠&! ,bΨwVkiMPaccPiS'ڷo׆ٮϞy|9)gI2^. /?O~gw1ckcǎz^vvjMy5TX^x n;u/ʬNrΥ`A有cM8N$T圥9gB8+nJH){n+MJ9cNjS!`U)hc}>Z=__UmvJ(aUMSeG(%olוf:3ƭyF%M@9VG oFO>͕H%%%R(,AHf|4^c?}KցCJy7&Ndbb…t'fC)9!1ZYDRyfg3QjU՜rd8Q"81J)_+}'Aݰ3朜Dz1c|_pYgLړ&P\@.!qc$k!92GUUqn\g&Uٸ3|)O]vNDDB& 2Yk/? k=xHTYq$h@ofJy)hP\Y]]['q!`(>htQEYm \ׅ'$ :kք@p!a@ 0JhmE${kZ'evM)@V,j,"6q8߮o҄!X6Շޏ|g\ScB H`g"+'O.,@ByJ)Z#BXvu]bܷ.29#!1Z7f!BT]FQ$sdHD=)"HFPR$}@De6%Kڊ[[_5b1cƌ3f9XajnOc=@dZ!apg4/׼u<\Jpje !8ctI]uWn5K 1!L]W,suYm<{䛯ٱۺ˧RG(]Ll1gps1Lm xj۱Z dͩY0oXv5'W6h1 =8ΰݕ\@UJ!qzW>e^sֵZeN%z$Bt8-:GVVi&VRƌ*(qriLRȵR&2ScJƘ,VhH3 ~#?o'n21 z!֔^>삹?tSN2A n:?sW8'j˲YVEQ3R)e^TH.a1Ngie1۶-mGLjVrNTTR6WgXdF @*"0u7.m*~3 sϓcƌ3fq@0te Aic/pΏF(BcK|+9Rg8ea DbJ`>>;usvsJId R&uUqaÀ@"RDQĹ̎-/#e,dHP$9Ge"()ﶻ+k'Tk79F@Ji.`ő<$އ·1i7 !T!a댱VUת(8 vAJiC;Swl:W g4d]iJ*x[y$MyG]Z[C B(ddMmaL;١#']ZߨGs6,J)n}&!Zk1&PkmYI: .G YgmwzV3(y%uu~s p3"B(J$D> o@UL@@"*r}0hPQB@iμϞjeah@h<9OkTuηVZKpZKVJcLqh^deyx`.>SFo߫El>}qhkc̅_7B*\'J'\8I}ϳaL0w]>~{FQHAy2=PTXAua9<9ߌ,sSƄ.N뎎N=yg>I:`R$wY@Y֫,H[0_mA]Ɣ3fb`lŊԤR !ASg֚l7`QX4KsaL4G8e p)As8N1rcb</7%33Ux""rw'[511^ϴf={8=gCh՚B^uW ܹy;P9R:88k.GyeYIPJ)"c4$17V/=_A]/EhVZcDT p\j[`@`c 8K)F3LJcB% e-.$}ӧOEFO+KJX 0Z)c !̹HlaR*g[B,s]^Jq$eCL=<PFֻ㻷%'nͲٙw L/Q4)5\ bkm69XBE9e<ˊ4"ZٹF`N*#h¸LayGQ444jҮ(EyXt+Vb*EB(d!RJ qȹ Gj|H,2EZytc}_RJ k1}qx`F%iT^#Ŧ:ϳ<XRRF)G)C xR9 8I,Nwo#=<[{yjCs<[s`"2IRA.0&M th9€Ҁ(!!<6iB#^vwa3ߖɺ&5ddѓizu>hϷy"Qs@[gØHe"?),8"@\y͹iB0. UXc NN0* %Qڕ )8 JIg$c*|QM.Uaeu!I¥Rq0N5;M$R&ppD`5I=s|W>re#˳j,o6[b"/reEN`G%'0B^gf{NbPn),XQ"Qfq!clj4cdsD ZBX[&62d>}EF[0 MrUA%0AvVAEQW B3uzyf)I(FֆQ#P1n>wtPnlHL5\ES. H A83mf ZVQSgBAa `$.B;zZHKӐ !貐cڢP6!׉1FV&CkM3B VRG~UYiAJTFi9di"s!!4RjM]9l|[QZ[VNpN;FqJ`18=[vZg/ $@o) $Is\LPR!#1s˖ ZlRbCщRqs޽9|`8v&"|)*KAnwʕȳLX4s%L0}ӧO>}6sIfuEj<ޠ2~*Zp ߣ Wzo#AȘ"@IM}QI:;m00-[+e r#D|/3J08&i9gzi+d bx'U`$Q@?@q-Ϲ۷3dxOxjWO>}*miI̴jȒ'Fs=^)c1i^?B5qi@ATEʬ0RSDP3FE,su{?>gFݖVV` "rPӛG+~"7i5ʬHҬj/:9i&i 2ܣ@1 3ʪQma錳ViR*(t\'Ibb19ƒvJ1Z1v ȸj4wF+ E!qbdyc͚@օsPkJJKιs.k;b KGh՞/0AU[k\Y1YL")` m^Xo|v㎓N:Cyӛ޴۷K}>@<搻ݻBS('?>})9Xd4` Rm $YY ՆsKx853rh2\kJLq/aS4R !0줱Ԇ"9f)d r`tab9x>i@C3 %VZr9 ?+ Fc$i1:<8h1ڨB~Y%"_Xo63Uphlfqq~^| IDAT:+T(RHgI: S[14gI^Pd={jX9l`S.hA̲,MSk-<ϳ,|߫TBΉ1fqNk,T 8g1@5/<"j'?0'po_}`HIz; :I Qb((2JkxH,,QT;Ө7CNⴗ5qBĄQi!|$q2& 圲6ި Aqi!v=Kz~rr1BCֆZ lllxd360wfK c3:YB#|R&Ri?uj7NesJjIPmtlHx !ZۭRch *&09cVsNZep`} 6(` 䧽?sM|^ȅoι'ecw͵޻ZBsM} c\kK08c1FAY|׃{rr4[7?85=K)DUE>T0 I)]x|O>NiuH?!%-g[6mzB_ -[n޽nݻ_V*'j=U]=qܹs~~5,bqq"t:2os['jO>}! r.L/YHuR{:8ݫWOb&$IB;i^-dXuAj =?M6N.?`ks6'd,"$(=LS(+ԙZ ~T#VS"|T^G !xY>,(ya'zݙ[.z] b1`Bc !Z:24`h琥w:-!'x};Aku!s#`@R:Y>R?zR)W(Ji5tcyFʲ#~`k-Zwvkcnu$SkFsL=3;Ec9BkR: ƨ ufjp@%~)kC77o~pA|W\qG?.0 ?)>+_Yjouu^W~Zr)W^yr-Vkbb}{'|M7J>jժ>cO<%oܳgϾ|2| _99Ýsvo 'd!<|38;czzzbb+8:><|Ć,?|j=y'?{g R]v7(6n|^?d#%333~j?':7xҁaÆrN3<#rcӧO>`PaldȼՇ_{Ⱥݻ롁*!JE 2y ¬AN/MeF9N!A^ߵ*k }׽U+;6s3aseIgE* Z3_X/vP;Ϊ(5D)#9yI/u8gp8Z4IУ(%km`1ufŅYea 4j>g: UT.|W_}5{_o}kEQuY}{Ohu<3?OK_u]wǎ,yymVƘ}{WX100𖷼eI/>dSJ@qE}_߿oxӧO':Y>FLYsjZ$1ggw$Enppڨ@=SzIQA[m!eJB_FEo|̦/XFd,JHi: X ce[D8i460+/7%ISSLqXkh-{]m)\QkVB aBkSgn6!™2&ΊL[aI1ƤS GgggVdujsssP j5ƈz=$AA^$ q7M&sލck($(YD`kP:E UJ)&)/|L_oe0 }VpzT1_16M3BB0+ø)JE&paSY(cPjI,'QH29@,!9UEPJi(t.u@Ddz7M]vُ~ ._neGy{_믿sWW!$ի֮]跿O|>`;y=RCyGO(lqyI+d޽{ !1ι4MO='Ǵ?11E=NOhun /^//ʠ}w>[>}0Ą'<͢0*T*A[d)+;y[kB]`V3 YU\%uըN)5 (NvkP5:7~[a]Yncj'_poBN9< [l"5'uv毠p'W\W }_0>3gunݛ{1H{к-ztvwBn,i{7M; O~enǿ`֪Hsgwگ6Ro:7Bt9!ĆVBJ){p=ժtfgesWmMrt"Gݫ.BJ_u /r :/BsQ փJ0íVkf~RkWF9pH΢2r=󢐕J$βZǹPX Yp2rtFϽ5ٴiSZ}_w}mv饗@Zu]_nݺU122m۶s=+n8c :;OhuN?;w<ʴ'6l׿z0 mxۗm۶~ 4">~^܇1zx=Yr-ӝs_g-8QSD@timsu+W.b)i= מc -31`׋mqҡcA6BcRZ;Ev{agYEα?]wvttu2~K1ߏ4|<,* v_xT 85l+,vF7(bd(T"nW~E0LjX 7LQPKq'u#_~(g)eE-w]8=}K:KQl覟ݛGtx6Kar/RcDP (}a}MRamB}9J)B* ÆS<%ya2RkMUDΌuW!NqNT5sC|bskpp\PJqdc9/VcpZk̆ sa a73ǭ^[iQ{0 ;N5lr8vKNQPv2R2Y Q\Q4'o{<^bdd=yyO}WU?g=k||< CBH)r{챥1׾.WZKfʳ>{ɟzLMM]zLve?//}7f\r)l|/ڬ#-Ar__^fM{ٸq#w????99vW1أ4>B!'Zm(xK4G{}17rŇ.q"7~ Gt/{}~v;~u xU" sfoHT yVG0z} $ML4my>M 5`JYtV°Zc䊉 [Ψ={~KmA͋|v~n0B^ aGxQJm.1aģ'sa(:Em #F3/ Cj01V!81pƨA)Qwo9vEYA!,~Ig!#r7TZBc!1Lk=??_ ynqΕ c\&so-Xk$R*)RR1VYZ謵J)(!RJ3uq !@)&c`Ͳ{垔RBDZ{;1̼QsdZyQRE8HSmB)ڢiRBz$qfЛŏSC/h4_p[o#H$k֬$Ϋ_׿/R.b\s͟ɟ,;_Wmo>>묳ch4= /^_wua?\q^zy:ꨇ<9xz!>Or)Gqk_Glc /Zcأ*<W_}UW]tE +W\n])s]}hK/;餓wC)@o/~-oz;Nx65oֺ^DbO ~j p!6[~я)y$AI؟u3ι2Rߜs|e$`uƔI\|"Xc|d5Z̤af=;Wߺsfj/65,3 fi:3 붫zaLE8)3,QJ0%BH///eCuc F2N GJi-C)I|q5}}w|Qk׮Fh4zZ((K e27zII2Zбa4Xn%vP֭_?48Yq\g({6oyQ,Մ͛ R*D0%X[0HY7#ccyQ^8z`VRn烃+3:c SWY덾kl|K_opSn8Lj.GXu䪕kf~~ϾwK׹eHTbeY/:\ljNRA`s8gqNι𒙙$G>Ko~`y 'D ;xwJ"TDp_j8::RŘ99cQEQ~nܦV+a5EM*c1A@0& qG<q1a[;:gu֝3 Z[zs؟/}mw3qÆ ͧvݻ=C F7~)}!$ ."(ha4j=CFV^m?{hb4A΁@b"'E~#\=b/fPe!F*cl1RE~`(ʼZJbi Fq!4 0Aq)r8 `'̋j1Zg /Ӟ,͍R!bxVa0F#l1a3"0OϘkpF8pc"0&3m !) y갼ERJXcH'e$Ba}?sc5BEapp1fF) -K] ]VFR1)e$h+'z$i)3jm1s RNA(ʎSZ$ktp+-jmPs! 1)BeH!$kMa:""zVZ뢰~2(RJƘvec$SJ-J _ucw A RFg+,"swJd|M8Oq¡0?gts#8s~/xEaFUA$bAjCN=;Z)}=+*Ę}MW~aBNLӺE(-DcfM>')'U؈ :DQPL¡it @@P8|E},( qeʑunmLSJiQZM|:" 9R &QĐY1'N9"ںakǞcx_aB@i_{~Ŝ['Ji af};LDRJYcBHeY&fJD13{Y)c,K>Ź~-b+9JG!Y[clQ^YRo>E#SJ[_wXH+Ev)^)+"L"LHinR,|Stƌ?hcr!kt1njG~hux`3QnjÀzW^ԧ>/.r*[OdՉ'ml~vQ֣˟?c~荛GA7hX[XS:)l(:QzÆ HT(I{חgN' 71M?*i=w1V`MsfL);=E6EqM㦩UctzZ>g;3&;U(T~%Jwy-%uQ *$YP@ A[VVsb>qqfI1Z{~} !uMB*( =*=3sN)Xu508mo픣^kBhn&8L:3WU~ 6L&֐7M,KT+M>ieϻއ&s"Dxs1=US"sCIiY^*]ai%)"C,!1cO"(?AW~~CvCϘ]7p3u'.jj[wM ?1a4DD.dA(8mޥνiu 88Ƨ%۸uk|U: kgj~=bZ "hG˜cJ,JicvQQR$Mʘ3df!2dZ#@[w'q8J$v:T^i݄Fil|=42+R%,(" @H Pk1'QDNqw~ HJizϟ9⍦iX#"\QBDfitR3sUW!Vna!Bp)ZiDl>]H]P޷B6do5J>GZ>(˲ ("'g@frN"lAT4y> "l Hƌ?(Y}mذ1 mɇgZ8?H#+Z9FR- DhlCa"i:i#43fT۽k=Ϗ{Ѓ?>l};FɌa}m8@OkFш¬t@z"VetMEڅrJ9OȔonٲ#cQu*Ѕ>GFgu/4||-LF K#Z4F҄"sJXn"&BSǕ_P!g"@1d&é`)( Rs^)"-h%&!VBDX@@XhdV,ĸӻJU\3?5g?O?y kQ9X12Єc8B2VC"@h&cdRł$RcbHqz̘1㾡u`p̜S=<">`O"?TܵsWp8F6att^=X) M~ɡΈX='zvvBH˷/~VD$!z1]ZFR%i&DY]Z&6ld6Q7g:[8"h:5qU E !a@*ni6-+Hz\Y) r " O!%gOP[6|_zUS#19*uB09=6%u@-]a#%R)(ˆ4-,ܹKD^1RY!"B!>T +qjv#9"S։ѧ隀kv"ff5s>0gcU5ֈ64M̼}v-S9sa4t)]|QbNE}Ì3~_Wwkw?Xgb3dbdf33sfD)vu7k~7t=&^@*FFHȀ@JDjmD4lOIu]Yô|n7! =D)&z @É'-!d2)%\(r]uUhTbI $UCwVbHO]',BFELOs^۹\wkyޕng(:݋5!D `N)KNh&3'M 7~1& ~  j~ss1zJ]"FNJ!!6 @DƠJrNE2g v2s""f "8g֙z<3 J)H"sle"P KK;VcygRMJ@цc^11Y[$Y27,Һ:[L}_>n ٶmۙgyw-o; +_wk0/]{=?x2""A :k_8cga wǗv8a" nXo(:Vlʢ߫}--IIJki&+ƍRJ{An[u5i6liq~18NlQv,F읛_{6k|rNpŐ,I@Yyd9xfә-*qc zYu;>Ԥn1Luex- IrsbAdHP8l\QeRƸox멧!0)4Z#Rtƨclmܭ"ϜBjeiiUOWE-F}!8rq6hRXJsOFs1j<~ߚtVuUUMcV)sJ6n &N&}R*uUU7D(ZpԺ˲ UU!1&,!J<֝nk]UՓ$c:~F"ċN8=.}ku]qy'{~~{| Z^^~vQ>OK..;c~7sp ꪷ]wQϼ/=8 1N{,̘q xح?9WuPk%Xuuܜ=Uスw҃6s+fRu nܶ;Cڷn?A` r9g_(2)bNY)l۪REYE7m(COp89W|)5J! -Gå*(N'zݰizr!֭7FChoc"PuN|_mޱK[__[W#1$$Zƣ@~,aa!(ou:z:w -`ZuBfWtbL@*8 0sFN|W4ƸywYe5IJ†^$5@1TNiڼeӞ=6l+ֺ?X7NǣQSJιl]|k*wΥX1&H"RFksijfiS}23ni ǘCL++Np8~ ֓~a-CЇ>O^zdx[> v׮]gqW͛7kosƃFyc7=O=p?7ȞcYhת& '0|ⓟ;At:eY9AuRul4@A` [)% y%vqNAEL9'g gI)PjcNb)[mw={4j # 2[uEg- 7jiP0dM;WWw.->eF9#)DZ 0s#|V.__Xeb>9>rD!0gHQܴnvEDcsk?smZ1gDhxcL)ό̡eXPJuF]a5YkMBneMz1:}e){"@+hϗVOf[B 9g9VVRN)##w7"37MWD8("Xk"+xl&GI.=q'_W+oC? g=kmyc|^?|ݴ/غumN8ᵯ}zI'kb~r)/{VWWu]5yc{I'/1~=3nݺ+۶m[;G? ⋷W^>C4ۺo??{ғiӦ{/~_CG]:ꨣ|>q{#>E/zэ7?Tմ ^3 &-kw|S^/^/ygD4*9LbjpCS+$fs, 0~u:gܻk7%FK{vv;w߹ʇ:,6ebvNk%e Y);ص\o۾s-\w IDAT k֡kxL!g%T\ڵ3N;vZ/gۭu)q @"$$d9 QJ)V1D" tm̉9N&gJ `l^DsctmEA1km`iqq*K.KWUϾ?WWk;^.uy[ +_k_{//vZx|_}[}Moz1iO{UW]վ;;}_o|5\|`m~>=묳׾7qe}߸ʃZYYy;WI/| vڳߟ3~v8L3QnjpZ{lu"r=_37`P@ئTsrFxZ؃ "0^VeDVp MA+͜q(]H/ΕJs~]H~T7V+8L8bxbSu]eik)Ǩ5YrK˫h7g^gu5b0svZ#0BXPD"Ub5eQ֨rNUUi{d2u"4dc$Xc,"$VSJ)$"֬Y}sLQqϝ0sQm\u;]L 71$L!hEs!VW&JaJئs9s+n;ZmtY)nP6u]u|VJ!v]QҍŒp}ꪫO䵯} _{lꮻ?c=xG>W\qŖ-[N?tfK>~&b[Od>O\kNsK.>^i.k#o3#H{'pQGm*˲,{C1^׼/?}3|{.*;O~v}s󜗼%g~ ϘSŒrmؼ/(8$5LSt-kTe/deIiFx\TUX_uGt:Ek%9eLFku$eWM_QBZa&rJq7m{Wn_޸4@NoZ" 2t; UbR 8-,WdfsCt2򴞔*4$$ jqpi Q+1HfadvPCL- 4s sk/>KKKEQsf"֊$LM"b=g a-lYD(+jKYiZ3xdNho)1@4׫#mPUFa1UՄY!3BۑݶҜ4M+jƘѐSn9^t:n|7J)R(­KIN9gn}3Pupmgu{W_}yr)k>mo{ӟ~i%/yԣ{|"t:=լvUUӞ{;R[lW{[g/=V^zO|ٮ_3|[q}Ԟ={wd~_|`0x+^#Nxƌt֤Œr:hk#B(BM n%v|qDV|j4ՕӎٲPg!L(w:%ɨPm٨Gdى|BqQʬ]b]B1ZA^=o2X +خ@4]H9M)tzΚi2⸍Rf`X6vMjA,!ў100mYn-;J=T-Aad,[ZPr3) H *}=_ dmC)b Ys9 ffSjCRH)#`O9DĬ%Mӊsp(!4)DN)@!)$TH9M" g1d,F!U 8R!ueAM*!%)rddBq/\\\ c9|{裏~/} Oxshx3n~g[`0Z_jb/~ 6 "pݺuxM7ފ:l[}n_~o{N<ă\w]yc>_xW\qŁ3f̘10 ,3 dA30 S^唻&Y&ͳb8i {);۵ejO /66\϶]߱i&MJNY;~#OSYNHUIl|cn9>N pl_6Es I)MCj9D]S'm'pTyu:6! ZX|M2+jS$EP;TxuyΠg cBZR ,H9e-d:3eY8Pv"rt6=??߶9$bXvy1&t:H+hC sEQ!d9FgCN5` 鸮3u5ab-]g  P)«(bVڰ긮++ Jιi"e:Žݣcƍqמr)ykڕy{;vtV~_G=c~7~Ͽ+o7,--}#v:>>u]7tS+3 gu֋_+rm֭O|񸪪Ϣ(~WϿu eY.@~볭jyyyiis94袋gzi|Ԏ; /| 7}=O1̘1cƌEǔ5%""#[{ G?iRQ;KFgcJX\U9SM&ڪ3EsduUӽNב;$bڄb}NdE9efD@$W͎ݻEՌ`:,x=16|hmTF+y,,0H"$A6DEPiթH(J&MZ;-,,<_?t:=i==y/{^xEQUJ)Hg=YmLy o|o߻w1s ' W z??R+SNdM#sHP( ?!u߸#so5 6iш*Y_خ& 奊ӯ=Gz(seYl޲ӵ`ZTvεwwGF"pdΒuӄjD9R`9 dH)EtSJDk5 ٍkƔjBD,3J}s ЕRu]ch27Yk6v\SkSF! ޽{39Cq2mOIO~o 7g<[o}'2cơb=c!BDRp1EQcn`E*ZikWWI=AIU5?G"ұ ss{,u@Ifɬr1I0+BHNNQ$])qqnz50|FiR]!Pʵw ֚ UU{dnm2'lnSǽ޸q&@`:f/'MQ@` aqaoݔ3N,ZD3Dq'(9ǘVZ+4F+EH5JiCI}HƘ$)3kc:+6nn昉h~(""=Uk6i ;191hrY5RrMS>EbnbF)mxx<z3f<h`ƌtڈm=zjyiϞ{&}{ns?wZ0 [!!pDhºAͩ}>ԓU̩zfO&HY9 @IeKIgRN{WVVMӦvS UIJE" hQ̓bLVmQnMsNYx!\lӤSjFqP^Yq ٺ~װv4r:4u $cP,&.y$řHmc IR+âg۳ k c)rZ 1Nk]Vm \(U]%ǦQ;Zx\]D5Ƙtj >P>1FcL~6os:Gk&ȝs9ct.b4^mOK8N U֮F"M Y4*A %CS/x<!|+_yp?ku÷o{ۿ@OgƌË[xة>p60\]ٳg?QۆPN|so?Ji;v[6n}V0z0?mGJh0 zi<&LQޱi:cuBfyR"39ENWOD|B a:n7stV4V\t|X -OQW&4Y5!J) IED*qU*I@a,)&Q:lYLv+Lo~a}u;9^z If!@fJyPI]HD"3u ti`7rE "ʪjRJ!cLnT Vs4SdUJ { 5Ζ'Z,8R @"91N[Uu4ppmbieƘ"7^YNWtz%5sgmQH4!jsVU5#"B2 2`L1eH)Oi݄d2Murs5\p۷o?cy{=3HBz7y-W{ȣVm۶ȣfa !$ 9g0"۾G1IM0?)$8, XRB{Pt -.u n #zxDrwfue(O)Ci:`H,\1 *;P)X ArUF+B"5V * vzs:T<iݮ:u@qF$p̖[NaaNEFR(n;v< ~ZUQeYFIoH(fYbL+"AXa2-T2sP1s 1DSPDJ+]&Ƃ1F$SH%sLDZ͆뉰5cfu]ЖBc'gtnЭ|{%Yk}bT DJhY6tF dh8Ox\7>6OC6 Ox>z3f.g_zɧWϘ3i+>SO;}E|Ӭ߰!s>HGS88|{| !([_)h׋)ڻrO>!ݫ9u`0tXw:^{y4:*۔2(r6>=-$NH 9G9Keu Nyz㪹2Edb8}4 q _Q,X'A)9gM'c&B:xB0Vg,(Adv?{odua9NU$$JDa#lGw{~e8aGsGGeRkZII@oUsrZYU;$AE07ɓgʬo:4U! TJ HHU]EUmgffFĜ;Zv1Y)&mfu]TR5fcj4+9bsCLOgNlf~ѣi}۾k/mURJ)x1:f8:q9C}AcCcfԊcͨqjߍCǛ!bPhL k333?/ ?y'Ι_BLE|*3 ?@˳K*1|*M)&\vK_|6:l޾7u`=h53>}9vňad;pU7U :0Pyî[R̯$l Ɯ *(!vu,k^ BT7WY0}tQ|]s"ٷEAծK hdd jp4͞)m){W{KEeGDRZY)JD;3-Lvy71R9W׵Ri<v{f&r!DO ]0@S9o.ԋv剨뺜s?"D3nXv""rs"EfKRq18N){41, କaEigff.)0><~/j=qIe8obf ~[ouppp||rڕ}£Nj`U]?<ڵkD0bluvUXTU-Xt0'*#fEy(G%rٿymҽG]J}.>Z2l] oOܼv=x7 Cι !n' }*(dm߷Mh],h03`R sSa8,\mGS=Xq(Vo<%1]1qK)Wic#$6ÐzH^)mۜǓ4DR\)DDDCzYeI8MLr9% P׵sN4H>t;qHinݖXRJjWJ)9D SDcg(Byղ1334Sԙ ?cg.Qp?+.V=I§VPmi0|#/nfvW˓}x.:5Y  @ IDATPK('wբ$q]uV:rm"nC3PN\P qj$D>8Lu ,x?Y0Ei ه;_W㠞k-8*o}Gw+oc]Y`EKJW$rX"xL-;{Z @VL_06M@@%l^j)S RU D(uNJU0"Q G]6RJ̍IDs2&"c*Z("VWN5l㐸?:ꎏ(TZhE#+g[  &5c@*:xJ|zmb|ΓV5?[.u/|_<{Lq\Zq0,X'rwʲXqHu끆a[ c21YB4CQu"*Y3"$F33dA dF"T$Ƹ[5CW؁i$Hi@PseGZ .s:eXa Ԡ#jfĀzoͯ4 d{xxи:T!gf9U1{M@V+)Gcf&oƄDZ7Z!Z"9h&"L~Z{m"lwۘnP@1RD"<N*z#UaRNIr*fA)E*LãeKl8gSVsYdY'DFi%nsڻwOPH~rhW,;iNs^r\ 2U8KpL.cRK޻E2b8cq0n dD25a45I".$>So&'44>+fD V˥!"*8tlRVm]r\b?]? %\Y`bZLɘ !f)F@(*U )T]17rhC uyU"E]4"%T +2d-%!*dLs"YUL9EK0`T+M[wm*3!d@D"222%eJR&d `:V4gfffR>|Jh0h,2=Ig:@z_+xSjR[Vk퇆Z-Lqy !')Noud"U1žk4u0Ef6#"1PU53*FH,@[E\y i?~Zj1zɦJ0,ښ], M}xrLer`JcP\`,%"(LY}NUJ)d.f}P51YNCjfXb^}>TU!RIEDc,{c&38RJ4᜻yfsM,M ΓZBUKiYVŔtg" c]98w3G\xQ P"c;Δ4\yj33?g?aՍ/hPOad (hBpN@r^\!`bα1hQCk#jADZ3j*7X!)aIDTHAi  Ddb)Y0{00z`ǎ8~?;dPia$ %Nl& wPfb*X'G }/^Y/UL)wX^wcnmvm;QQ#PtLћUmfaB,e~g9̌@XRq]?6CF65 U]r@dC[ݦpl):rU)&QQ  !DncݶLu~2^)9ٕ}?e84u%"Ҭ l1]眥( x iB1dnS14O%  %(aT@pk?zAR\yffgx73<1g v| R*bf*GM<("''NjmUx^Xgϑ&40@5tZ+:IEi|5 @W^y ]R#"Wo}ѣqLQw㸋r!g,i1E$_Wf!)ђڭ 1F(h  PGelĬ(*]Wޅʭ-3IjWWuS;+Q]_~qgaNٗI9+U¼](1G~{Ojc 4Mɤ-u hAι$E98 )%\,dRTՊc8f;0<9ٚa8FUu\* zt %+"Mk0|R8e_XFa@m_zq$}V~!9{@ff>0͕ff~BH.^ݿ*%a7w>׮]pGׯ82Jh' SJ1@LAp1 xǻb|坯[,=Jv~vu?w;V(,ZUUx||\D ~1<Ȗл1"85ΪVTE5gⱈG 4!4M I :T3%s %=:9veEJ򻄣wԮj_C>hѣ ~8)䄲!#!]dۏHIFo~l*sU7oFfBUťR 9aX6M9;E$BDyC\jxrt %0 "히L"@`OwQU DP5~gL6_DV{LU<&şw==u.C|I|43z?IK//o''߫?77n?i ZZ @TMEMĒJ $?z6D"Ujy-cyDO(x.1nvWUkTgrիjEɹjc!H,#( 9vS=3C*FH=$G'G K0@HV$:D1t;׶6^_-EЇx[.f2H)]?%;'%;qmubsvHw=bGKCBC@UCrW58 r`oo\%f+jfcѩaJ)ƘR1ÈHHDsf(.1;"9ƈDL QO[ NM^4ċ"AvZ>\N7p6GjOu~j>_8_kgf>L333ı{^YpмM4#3yFfSTSL (4/|o^yob]gݷ|:R» 4A> d#3@D"'xɿ7r<2"S gf>ךɡهKT7zvۓ{W D|?w/}n*)2Õ+W .1OӮ.'0u* 6E^T^>q̇ݨ],WGf^kʫ_׿{|oǦm nw_|?k[/2rYdŻ4xzgߦ,x~&kY9W^Mf1[)#yWd)8"""f6uUUhţ9"y%-tSsaRJbN#ºmLDTYT57 P뵔r!""PURy8 Z!lnWİӨ&U'W{pXrAr EϏQF3uhx6nުj4;ѽB!6CΌ b*֒G.>GfΑ>s1px\Fܚg+78v>[V5QGꪪIR{9jp,-QJ.CTR,lLnz9*4LsiN!1%&RyZ+ _]KK\$"ˆfW55tI(* )Mfr$R!dsN=2Rr5<ݪ=DI::@$RxT*H(D}SӿE {ix i"n{O=qq3k2`&"λ>48M=,/t)^m뽶"sd8vЗG90@B0V(#ŵèq.N@k* 90B*2 "j` $ F@XHSljD4A-ܥYeH^t?OQuJ4vf3 yOʧfb+f. ϫӚE{l?y9O.4\%1r45֕#Sɢ(R`\bDT2O!窽 |rQ 6d0G+J-{،i"4y 87ż!2 9To2.]h z&l >n~wYsJQD2&UD`0 ğy}1+晙gri{=\Zs^3蟈uSl1csL5/f'"d`1 Xd;欐N 6=m\ŕ!UK.Y!LH<Py!Ǥ@ %caqLȁi,E'vF fH @D<[y)ZՕ/ybIiKQRRo ߸4rh7Ó>) TWmjL+S2@)^,>ڞ²%'Q#(Z "bAVrff@fdw?a\'!T^__?9AiNgff~A"g<~jWKZ2""N݇.[M1)6HI 89ҵ>wfF@ɜg3Քr=IrUZWK-e1vt:22M`c bf`b1K)!# 0$&\2#Ԯ>TeDRAt޳@`H JH1 IDATQ=I"n؏u%ꙙ_dDgFff.)?|{Hl!r[ш0LISӓRxOS"yFBTW~fhIBb>[F"#)@"8waH910$*H4mBlE,#Y5, 6yf\1Z)VW# \Jdu2懏YvH/zumup -VGrMU1,@ Έ xsY{sCֻ>NbXh -iT2rN Įqb_rYS뽽n)@4TDC$n6 c΀HS "^Db\WHTa@r݇QRτ|2_B3W>s>W>23cro}c軋˽oxw^/aߴsMp$) 6d !?}q_?z'3O1zqw]_ ,7RcE$ODȱ;T9zպe۝ߕtRQ 謝s9LČڃGU > O8\Av2 4"nay3w DFPxdffffff"P$O7)|" r3ʠl~LIlYy0ȥI)%m33$ U;%+&"9Ku 9̨45ԓڤ O&fT2s1rZVua[4U{}]b=2k^{ɞ!HHE#"Hږa@ Bd $?7 &$Zdf sH g {z}%2ֻ|9~5Ѵ `}@ qso,-GYw"sȊ2ёa`!Ti(;MD 1 R^onxT&`L B L D$4)2f  IT sAI@6_'CA@PXSq~!đHQSSSSSS3iѕy[dΗ9/B!@ B:wj/۾,{2]妉9KN[keIKXSnғ!Ċ,/Ara` 4#B```D!XVuEkGvg{+T?|(j1P"I 3h(%U5 02v^~wig˼n̦SLJEEQ":fV/vw$N)x`'wt*T ƂcPGKTT~8mlYz${DE@!|4I9=_ ,?$BcMM_~7jjj/!|EF\I5N6ժ1Bf ޭ{;H}r!4TkDtSF0UhR:Ƙso,&RU}D@JeUKL% W;d'!8T!H"Av[eYnHE`dB$2@ i!4Ne 1iQ H6qBQR’2fi*X馒,uK6Nm/.2Y.9[+oOKŵ͖:) VX[lO.N>Q%+CBH@>q ;X]7pN=]SSo?C<-2ZrUቦ D@ A+,h4MCM,̲ػiqG,S(D(x=Ań "BJWDĆ2HA!g/ʼnB&J FLѰH]`ϗMB֋$ѩӴ[?wr)IT)A !:N@{Hb^ٱqܧ"bڬ-d<9 a:Vb^X"G t+V5ZX>%}txAX_[N"1 T9""(ɝ'o5T#::-?@P4P9,ϝJkm@@3L xJɉ&ID<{y2t(EPQeƪV@2<45555555B-2 |  8X[g w|ݳg66V8Fd2Zi5f" #5sA!+E^_{ Q"%Y)!B$ġQ# !:D+\w!awͺ=]PD!ٌbwuvܽ{zs/W273ʟAD8Y@ukA0YiHQGF-87 (V08@qTժ"2#BzPX?Ӛ?<-2O܈><<+Cgή<앢7n\#Dj6,/kn"$΂ff;P 1BbryH(`b-,^X3T AuxP)EG:F*8dQ!0 "=:$G˹YȰEzsu1/{G4LTQdS"*XidQ\f-Q¥TFx P)h.}ɉ)h2+\fH?Ldf#S4NΞgSq~j=ˉwsg| qWƓ{T]"^yE1jF Dv5Ji P128Qgy~ݢ:@[@RL#yw555555f-@9\yeeY^"Bfcil4w_;wPRsB@XX)eُSP`EF%iK[f##mR/( D D"ޟbi-eeФ b+tsrAd2Q 5˅VM)lEJ=Dh"q37qB67`}h7bY D=(K5+n< {X{/^t g~杻ir҇w>~K|xqxc?qo)'2Wq}YP>sa҆jx P]DveY:D1hG, tzǂA$$9ho`I8f,/.i,l0T8>|Efa0<^X=:\t<j%m2nZV,oVϝ;wh beI֨3e|HqUwwmg]eV{<8T%ό\L;+,h4}·&E991_kSŐܵy\}3/pX' N1?hS2Q̟sUR#(Z@` oW& Q8@e@{ omL PBBa᪙vu|yZd4)U NJ)Da(2E/ %B8>^?;x}CB|}IIx4}h(Bb}p! ^$mI3ȁA"2$$%̌"cfBRxZk("U7 pRD穂J) =?jhs<|9m6 oזnR^k4u^`R W1A)XR0feFDc4b>bw[n޵+yR{Gwg¿j~'>{_tϾϾob@b "UJz>i>~ 0Ji-fD(mw2h $ ic`F" x޽cP\Y( =<:Ir"ȌDArpy>4Isdd BAl6z^у>{( {a&euq0$ЇFF#ɲZJE&6 plL"GQxJ|b`BDafAj0w(FiQ",f6 2%LBI;"6 ' {'s///Fb֎M +(4M<[Aʴ ^XX_?PJ$FFm|6m(V;w܅N7Du^>ڠyvSȽ{;}?o}~o_y嫙uvZ9ݫ]*7l0Jj k|L)V=+ AX(v+9yqBH)cLd HQl҉R`fs<<'@hWkjjjjjj~ O!(gt "U~^fA@ ~2)o޸v3WY<.+N(MySn'x<()݌HF"R\r"D}%dTHD* .x(,a| :|xDQ^<˂űxfÕh8iR-% .B`˦c7͜s4Y[YPQpp'i:MEx6gYh鴛嶹v ~8+ϽK?o};7;?Nq/ s$ kKa;}pzwo폮\<lHD@D^$"DU´6{pǹrsuHig29J7\[^o>w"ƭ?K IDAT/ūBx~ &9uf}%IaPE!l(㇣7G+q@v#-ARJ K~d`:Mg@Hs{uG<-2_fH/=e8_D"G wwvқ_ևi'@!!d,&nwE7A(B &qόYBF:@όDPoE܇";QkMcURF'0"LwcRƻrh4i}S|L[$%$$ýͅB*,F#Eq3sPhPbOww&JiGѤ(<(V*i޸~杛=~M%>!?/|s˳nwKKK,2+G=6P;=:{|5mw/}Xh_ 9Ps>Y1U"q@+vqmʜ &;SQ16r\Sd8fA"6\gYӐ(`VhN2jWGMMMMMMi8.;|<GA8xWD̥uڤ"t0 # 6^'mQ|JfNBHK"c{0ȉh9{覵6shuQF^x&'D\ DZG t,">O22b6[v;j((1-g?oy4+|8`]0")\K{J+nh{e rڎyBc4KDYX޾p4 .!5fw V$O$HSR43cCH:{%2 @EݱB92h K!P@bκɳ/-n_<:gLã(A,hօO!R6ipb:$> ډ$K۷n\lsf,l(,kdѥQ+O$HJ= `"" TuxMMMMMͧEFin,VbsPJ=~^u{dH_l7$m]Y1eD Z[>M9!%ˆ r ! )"b>" h(  h%^80 (1 I3{("xf.KQj6V;.544FGkj/RZ+gC;GQ7?ȲbٺoEnte>w: ޕlk2-5O~o}xW/_ \dI8fiVgn/ b+Hy  h@%$ PaHU.x$h49><:> .x }`$XA#@B 49>$q1:zū.{xmTisP-B*B$Cd^BY%H5555555xjd.9 3"z4Iy6Kcˍŕ 9*MϏG…`,%iu,<X)M(w9j豍0ƀZ) m (")R|Z+RBPј8N觿SW\Y]YB9CWaCs6ܿM[ S͐L3+ZsmA) Q|νW.ά2d 5`f*Ј[7ۯk߼[+J2EQLQiA" 㴳[IKDYՠhQsaŅ(&B;AdhʼnhTA4ыX ( Z@3 CQ30*@lBXϟ?o>\J[Jt:8M;I-H?l$Tq9%7^OmxWSSSSS)i!0E:ʽ<s)3D@h81 Vs|z,?{/0K8jeq ${OL"bQPL @ $4$ׄx^H˝n]Ya'\ɨF;3u?k?Ͽ\}|o붉lI3M9G_兵ͭ٭>AVPtQŬ gxx  &T1NF[YV4F Jhf, D H>`@V0EWRje,+Kf QP 2"*b,$YbM^ ZEH4Ue6-B`TGHyn3nIe(X9R)*OTUQ;0#隚O=OfBtVY;?`(-cvV#>ų@juHǧ6W'{lE)1+fAE7(D8i &9 Q(+ڢ.ϭ-K ,<+E_ۭ_L"j=tz_7u[xv߹sѱ 1/7S:iyP+k+h+A4֖"}yDͦ:yȖE5pb™U'ʳ|*tw;ϜRFZn"(r.1X2AJ{M(*fS@G$$8)!D(:d<3/^}gFeHl[YTѠB"Kq)Nڲ6iFx6PG'2zHmȚO-OHaDdbN-=s~M-9]SXL!/+%vi*u;lQ"(BQX0+r"Mf4YYvlCSQ/=X#兵ͦ(@Xcՙ2!+ kjjjjj><52"B bfD$fX *AT(A!ol./(rtR76 ?V+/mo[^>i,maM4"+@qHӬ(AYxq^ZeFЎud,w"I {?sM%;Rxeqt"IQGn]Atd05Jo;oʏ~΍K+Ͼ;X t+}ؘl,7^8qLdE 7UۧiZqw> ]n8 )н~+[:2ϦFawv&۟{vw> ~~د~7[l61pdtfEJ/H}ɀh$LLdf dMwyCa foaD#l(Hua˽C,`RD )cbTJ= #Vd: )y yxWh=I1qvEFN3Ɲ4ܻx&k Y&q뜽r<2a4xe}Oꗿ~vs[AEDPZzRa{co׮)Ji;$io}}aYh>clw[k+80v3W߸u/7G.Js&tꕫw,.AT=;k˽{q R(&N-'6)[[ݘG9k#$cMƸiDr32 KƠT aNE)9X/3.o.W%Dsf`@\'I6)iEQfyivOEDE\x\ǣ7i6EEars(5RYh8D&t:Aw xr @G@*",}pht09> {Y$MuԳ蚚O7O۷o]yEyWJYJ7#u݁snii0M7-Jg#\kE6ϦN')k48'A)ÌFm]ee 8jt0n=2 i;Qb\[[;͊,D$*b:uf3af+}Q Oш GַZ\jrdPOH#1Bg Ed!*0jĝnJQA1{ ""x@ beQ<&%iQhuE7cBWC毈5555555V_<eYXwmшB ,@4;w e|wST2ug)(рeVGY.IiV6JD4*.tMu8dU\`;3TG _SAZ[n epcgEyi8)l+Lfpuilp8mlfm]uy&Ң'cϬ.^x.j46zgVB9Rg\8;{ԩn?c}w̳퇻ݝ!ZXZ[<>GF<`xgя|V vߜO~^}VڝMDO2Ffӆ<&* l ZF!5Y),Bm,DA"BТ i4)ݣgXrƳY Z_Y}߸k'8Úd`~;>;Ei TzPI%O" fA%@%i-g_}wo>rt݆nM%cs_f,!V{1+fb6T78IEԍ#DU[KLxP4-qEQcJx?٧f/VuKŊKnه8/sϥU$-i E+8hΜ;WWϟzޝ3E" )),EǪ{iP<,Sѭa~?[6ZQp֩m+۽~-m,-MK7}|5瑉"^M*!͌ayP$%1.6[ ^p|9#$-AH1ꅅצY24"p;7cebm DcVV(Up e"PqNWVF4nv/^|w~:DX zO-OFD"o8do1Y4iGGܹgLzՉ&wr?J" %(-i/"$"Dq`eirL&B/-"rYul }|aC途Nl~g!+d;wq4O^ue ʒ ԎŅn6--66/]`gV2;|6bBՆNJ5߄GO^rFq~1!+bK[NOZ<t@D$VJEYX{lΦeK[\>L7n}@{OW77R2lTN 7$ˏ7p::}fg^Rav:Klh# [cg`?ۗ[:/GG_ٳ[lGodem\H-0~9aII')x-#@՛ d%Jv[FOQ䋢A8u{Q5"궛m,90 Jқl|{P,aDZ @A[MMMMMMMcxs"9,IBPGi/}[N-_G)hؼwzQҜ̆J7zM0E9vwڭ8I|4xfR*Ҕ(R: gLgkk6p9 >BwrUUL5yJaTDqh_EAQضjvhV[v; NQP !!CnrϴzJ *a}?Rԩ}ΩٵSA!]*qB5:duƳCWݻRഴð}C2~)'~UKe@ '3+Ie^涇' ^v0VdK[҅MMMFC˺UKK2Q3N;SNߕ-O<~ک/Db }рJqlJg-t-JYJ)2  c#cSu 'AT,r~hPׅdYt]+),>GQ1ZJs)#& 2Gd!S]ʞl l)ȕ _~hR*Ôe9eȘـ"f0XDB@JjQfnfNޣ2vB,1z^g d`j&3ru7PG~-OkMe1+Ba"v 2 "+L*-Oi+ "ä-6BFlBLVi56Geut]'KJ(s9x̚] w*\|aۿtš眸S]J82׿>#QWn|%e{rUK{Ƿ)fRޔJ&AP³gJJCŨ vAhL!$S$ap1Ac$T !Pр`X1Pjeͨ-۞?j`&ҮmsȀ.Qɼa?+i/xaDD HCL;r;wMjS40Ql,WE~vrS'ЕiH`E6X-vLd ┛BP-|G۽T\ˀ]ǂ8v8 :,e}CF-]t"3 #Be?XJ"#/]tiO8U'S-gm&zzCݽGLc&wol~.]mko+}u @W{C1#(6bb^cLeRɬtBې$=ֈ 1/^˕R>OT*KQ/Y6ьad@{}NkKNB=42Fly͉'|Ƿ3X%Llbä ^Ef]zR= Gw_=SN,k.E2.7:雞+XǶQbm P) D@%ӆ,;"&D0!eSAM@ Ե I20*P1繥0jT(m8mb@dTʂ1:jmo64+M[`m1瓗|ɋ*`dFf _>GB!m*FFH專 jx$ dY)@s1}>HqV/_Gh@lQ.0v)SɒG&#r`jґRAE؎ `AD:L\v=@RΤ2Vnd{gۖ-lM=L6{"#==˶m;dϗU`TPS\ KSE5 *`"Lh"R%!#33%P@VvΎ+-˗Rl<廟y8^_{x/?raMi@!ce;TWr "j84h4(ɨ!F1vP؎k840*2h5YD:fÞ" C-F#Fd]96>_,ۚ|hq] }ƊKVBD1j"$cRI @F{ZQ>VD6j$׏֯YIy吂(rmrƳÖLvdmeZڛ # سWܕe(2avܔ/G놁ɡ׭LJ5$|em^u#C:<6YJe@-=:8'mTb`bLa)t>*0GQPhłe1b 2ͨ8X#(q1(L@*dD&} ԶK8B1&DJ)Z)ZfS@0̆c7ڽއYdioW{GrlD3Bˁq֖tn&FB~{rcbz( M̀B\Ȩ'14<~ԑǮ\bdtM\r}K,TKO?ɡB{Gkvbvû b+tXRX.D ֲ Ȥ(jf[j!Q09c_+bC?ѭ/9:>$6mK׷i 8)d&g9l!b@ DdcHPȈ;"+$T~6/| 4>,{֭[l Vj*|GHrȖӞԶZ)UΙS "VʲB!֤1zXn$W-ޮ=H(6]۲.C|m"QL&2&Udl[!1Ul _(ANgg[K.RPT& i7BF)'N1-۶--/.ײ0h<׎}mRQ2QIABŀL\퇭F>6hv#F?mʲ?n=Z6kmAcČJiĕy#0A 10MIs+G0:+ݱu30Z!  -ns eC!B̤yctPSL/HnGZHDثR!@cߒe}}rid۞\5[}ױixd"0 FήBtD&-=k2WF:ښ^w Ockv0 z)ܲu[MhhdʁV~8FZv\RV/`⮎bXCBtRiQ~mx#" P:ɭ&k.ȸvջ2`91+c`LEFjdVf.1"QZņbPkB0 *^İ5Q0c 4)ET:48ڦ c@UxZo6WzƽbDj!B4mjʩ}^!OgejֹȀkݻ΁%cTaU ( hBy6Z#TVCÈ)c~/K홲Oۺt^Q*5JGqN,.M"zLѶc).#PJAXZlҼ!ff 3-"&XG ]NcT@UrpTmY}T!V8b>/ĀTcRu)0<m'2&@" PM;BqhjH)7u `RN٩ez4. *01DQ~*a8 rt{++=Y*aY6Gair,7\cHV`YPZjͶa1xiIo蘓C5c(nhZ,ʥ2n*W~4xO]{fԌn6J4'i6թhJ=f#1@!*]9o c}}}wuGGgܚ~;Y1L&A I-5hV  "ǑQV2>ɢ<*B,1!<$ {wC*Ipu W,A J9e\!m#-LjIo{[LQv94ûʺ:7Y.u9(ǾvR@aAВv[.BRrar3Q*SW.ΝCR!Jם*M"*.Z5)NF7o`JKsY!'s 7j W`&Un*վb.M4ɤ9d@FJ)@:!"R+ #;b@ XQuEca !ٮYbt҃43ajjfT J(Fњmȣ[,]9-tl IadONd} K|J;V6(M,d6`b%m;< ]Q+Nynj_JũC#r.j5>Qv'm߻mh'V$iA' \x+0(BE* EJ+TUۮkO>>shW6+tORV2++SX`!ruŁݥR&6L ).WBZB<1b%y8d/JM'"6vIeUN8um-l{uZ[Zwnmcyrֶp0ݺd*oqG -V1X=dSqF0s09@Xi  11`x:Y( -ٶ0̏l+Cek(4#2 @rr>`"USS^EqpMwVCeşտ%= !bt}qd+T*g"dC$Qm +Id16C2EL""-b%6f.KSxhonKyvl3Zֈz0fɶ#BJ^ʆ懞uwks{6ef*HQ৳0)w֔oFTזBأ֓ 2JIPdhV&ΕS8,2Rچ+01PeTT H\̷eCpT.D@S^A1:J?3እ]ug!0䁝;󹒥2dP3aP#;pGO|วvT8"+>\?j3Ti.BX@ԺR']L[xV=JDL`,tw00+ M=uZ\{#űtNQyr]xb971 23VJQ N+WwDnֶe0Tu'Oc>w޻1F@1^*=425<2y F{Vh!mUXPkK6wQ_ !,11gfZ3s2z3[un$ ful DȈcH5im[ۖ3kC0T׶tex-M1#\'Q\ F8bdԿd>J53h1Fz}z}-B^qӞU4bpq: *@2Qhb2T6 Hz![k[{|??o![-BLIFhk/v.~ XjU@"b TZ+P !`D5fۑn cp</A+Փ:2t:㹶RjTѱ(:: ,[a˔tAJAz-c!=1M~2P,Qc]-I" gšcDD {oKyB!DYb43c>椿IvUB"ݴD'knn'_w*A@ry b#ڎ @4$jtEEsN`j(6Jk۱Yr-+0 blk@TIېj-~H)^Wdl(՘qg&G')[O8v~-FV <$H@9bV-c@FFkzJ(oԞQk"2c"]$BgfIwolj#o<Ȳ𰳠.EkXwZ2ErE200XJ!3VR3@`dT9ә$E" H*D ܳ ̪֒$6622i{U6bH j:L2[;+1=ُ>63' .|B43Wvw۶N>6l8BΜʔȨm$lF`dB`PX*]`@oK}3' 4܀Y(y=!g ]-ll^#UmV7a\ٶk}vƆ 3Sm,qޏ^F&Y`KHɗ=y#?|ǦMJP֜Rϝj0;M/ϝ T]/pȄYQ0$w$ :ӞI1 bT@' fD\)J~_YsP}?T3~ucw̳K+=37K +dV I (2UtTUkloEm ˯Z,daJGP\%0w/\1:"\W!ib4ƐP b6D`CZBT&*X*La x`{o,fJa@zkOIj2uʃEUHqIN27U@H`#@ܹ3jZlLIX}ޞK9+Q_% @bFJ QJg;VOb>c3F\i#W勤Ia dd4PfcP;B C;gϹd,کMrPMl(X,sx%F7|;_xCsfN 0q#aÆ~{_ׁ"Z)KUbi j||rO(bM?q6=ge[V7ȼS۱o}TzO{ыn/^to߫I3q, !ľ41:)x&ġMljG7?22؋p6@Ww)>Xï3Z2@Wwc=v[1׾¡&B!GhB)o}O;}{qk֬K%[[[3۷y|=I7`"fŐ'uSƘ!͛7_y啞}ҳ+!)CK ?}dUC7`"f*E~X:Fȇk\3膚oUzGu?0|%}[ߪN} uuxMP(= GszW.ڞUBqkMV~ۛ6~MohƧOg'vcr˿~+wkz!f)I0C.-pO_Z?lx(׽]E/wUA~ͯ x񋯽/V,`ڵk׮c׿WX 7owM_l;00m?#7^96A)կ~g?ƍ`Ŋs7i͜]?~.Y_W7ݴs/~Ketϗ-[ ڳYQ:sʕn+_[/}>Wjx釉ou'K^bmB%FYb8lpmnXz~}Vsd'Y&u͚D4::ڗ7nO=Rtٍ f[lǎe%Iy3ϱ $i3hc?ۻM0|smA~ι=slO~|m۶@E lɼObzꅷJ!uMSA t/uk?*ublif###۷oҥK?98Nn"-[_|Iu__W??3?J_m$9la8۸x-lݍ7onX~O9^wʕ###O<1뮫>Zw]䖋/Кի7rF=j f͛7-o{w /%E=ղ{wBgy;c5KV@YڵkuZG:\_Up]wSO]v~p O|^̯yy_◾|Տ`sy]яzxt^?|Tr]׼}? .߶m7<+_7md2Jkq77͛_& wtt}=IDm֗}_Z`mhBvlyw;y֚7G˧o5+.us,x?׾絇pWp5<` eCCC|sޢh.w󗿼e˖- 9cc oB(ef)p]sgOBYԛ _>ӟ>xvyo|uzs܆g-oNR_W?vխGuԎ+W-pe322r?ktvvq_O>y/z ^B/?7ⓟ,k֬ׯ|9Juw^k׮UVygufҼO;9`3:_ӛ8&|S~KߚN:ZlM###ǟ[n9c^m]_׾N?]_埿/s1$5'pE!GG}lkxzGm7y{[֋.~m[8 Y?k\}׻Eʺǧ?˿Z`{A-7$M/҃!c1qGQVApWR5|g?M7|E6<x9/q"8lx̓,ft:J98Zkvuфfa$oy睗^*<<<}6p~fpw/_`BqSU Xtu$/&Nh"Jz }T*\.755555599y[*~;uws_گQ|! ꫯy{<-B;յB4dL>J)]u' ==o{e]Z0iӦ=۷o_z?{pEB\qtCZbs%_%Z˒ǚ5k>V gqƝwl:حB&+N稍>-̒O 3+ZL|9jINz-B!)KL\0Iҵ0]~;T~mh!|$IN 1c9h!bj1~eB̠6$7SڣOuǖe$CKWB5tH_nX 7Gꀺ%F 1ZtZ&ZhB!b5tHגt}n}'-\? IZSJB! !gs BY&V%C !ЌỊ 4ʟy!PkE53pHB!$ : Bm>i!=KB!X<=OLb~q}hQ!BtIDATHoLgǟ+Z5 k4sH0K&d*3 dA_l7EBSn(fc,2id1hn/N4pLȲ~sy< l`  A6C lTud"I2$$$!$}7WB9uby{?PuM JĤOH%z3gs|a W"]X$(8v"83} W_/?tG^oV/ F2NSP'$3 II{f9y[PGz>6"8ό{^t6]IjON$Q=8-;MuUᵶI${ݥfe0G1#8e.:^=f`DpкK&ıفSNAUv+.-YB]R~(ME͘abzp_[M~_$6Z&"11MifiWWOy@( []?;:ܮW!\~gX~i{{ L ~~~5Ց6o lOF;\Ul:_C l䅦ݻw{zjjk/ϡ@>r$<AeK˒":} LӋ˪V=>V=꜠hw倁֧ ۾mۓ c|/pV\KBV<9/6uʓiiixzݽ+E=-N#]rBI O|<\QTʦ4M]ɌìԢTZ,+̌H$}Z(IDATxitՙUիtkk[e-![1 11 a8 KȜ01 !KfLab/%˲wKZzж,cj[3o>٥[u>>so }}}1bĈ#F)x+#F1b%f޽{t40ebÅxb9F1bĘB s1bĈ1MEy֮]ܹsٸqd\^'6b0hȲ@jƒӍil޽FL& E]e*ԥ]hEUA@4AJ &E#\3qcFc=F{q*#7QP{桨(n };L V79Dr:-fv4!III*!;{r˅8p[nEQf3]w%%%X,AkCzvEvN^Wv$)"]$%%u^ `0D*"I҄5з-U <@_H{{tu3)9pT228t( g) deai';8˅sی''g5<@}czl6[غv{󑒢QT`0o <6OT8, ˆ9882s>ĉIwǔOfG_ Sꫯf8Nڨ%K~].a߿5\.͛7x ܹ***|lذoa{n:fsؚq>@N3x|Fy&.CC3f< x[ ٵkx<zG%#*UU#h!0gN]]!'p z/E455( NMz4449s&$E*q^ ,c0HKKT݋q i \OKK N}}}/x{ "ʼn'ʚr@Tۛ|GM'JwwG04lj5XVsg? wqVd ,\x>:AQE^}G͋_Gf" x4`~{5k֌|mmmȲ̩SxGGʼ$''G*q^x.X&;;{1inNMdyh ++81F͚5 1XOA eSe9u0F.ӦM#7W)dӄ:eN"##@ʬYXg̘fdgz%Npb1렳B^^>>v f͊T .O?̟?7A pI.YM!kH42YQUCg S͍}Kccyt;!744p\.V@ AOz%IOWDKK O=z}HW hh&2t<7@gP|q*։= cFf,̘F\ʇU|>oErr.> 9|á:8F(4n*3fF ==!͖DZ#^o(nh̘1}\) &(:]c"ӦMjr;<===la(@i5u.D|Jyg+| h",f5#!o3o< IHP'Uw2HLL$55VqlI}}=$&&}:Dgg'Kz<ژ>}z؆ //CBQQQXLqqqغ%%%Q^^V]..cLY9p,ZTAyy2:'[n%11%K˂Ӹ՜(&i\ѨpHR|zYY"`'1YF._ʐg𐓿ç.[EذaN 6zYn7mmmE/\~?[nݻ@]]]DnpQUu֍KJn&HXgxl6HDq:jpF0^KvvvغYYY(BggQUF|+IMM 555SVVzp a/M69rX, FE]OmF=g.y4]РeْקQ[?. MgjjjXr%dDQ.6n7ߌ۝O)׏~o?{{ؼSn7*Aˣ͛7j*|V^a4p}n\.+V(m0(//O>?gɒ%݉ [fp?\̙sdYm۶dΝ5tAv;Qb4HGn_V$==Y'}Y YyrĦx8>Ȁ6j n*_CNgeChQmAAPA"kg6vUU/Kbpɻٳy'D\ ַ룴G]h4rwʌ3xNJ:Nٶʕ+˻d č7Ⱦ}شi~p秴4ϧTWh܂ݞwyII}}[njIL m.<"SPSd^]OSS? 3srgvfbYt);v`hmj#?XBNN֤iY,-ZDff&;vvdr J 撕ekxȳuLlhd2QYY 4[pilB?zN;ߟE[dދIOO[nBzz;í> s #_ >ӣQUNZ***fCGyy.CCe'!#Ceժ$ Cg~򓟰ft:ivٷoo#~ д2kyi<#q>2;ƑJ]'C>ӣ!~UݻiD??_?qVULtu-fG |W_5(땔<~f7 ʕ|{>f̈~79rD?SNK38|xQ\N#??'z %jkIe ,HIa}YLRRM =q 3`#V8p@ )Ic uu;wzuu:E`ժ "]]iimqx(VYYGQw +lc L}Fe"{J45AAAUjkAӸ ]]"[q|Xژd#G$n-HWƁ:U>"I'$RQ1Eش)"{0oLX,89p~~k3))?\̜99QRb%//N2=Gnn ݗ+3+/}fb2sTW[(.VٳGB\17=zttt{w"JK31TU#>.ϟڵ_'G}*݃ !gDKj`uwx'*NgwVĜ3gθc:֭ǣDaʙ[RŘfֳ}BSӅ\ "~ә@B1?3Φ޽&eZ%ϟ7nnd>x<$RZZ~\~֬|L0+nAPR2 ?NN~^S޽{t5,0ebÅxb{eLj#FSa#F11#F1bL!b11bĈc 1Lj#FSa#F1|Ӯ }IENDB`images-actives-html5.git/doc/images/object_properties.png000066400000000000000000004761661250410645000240530ustar00rootroot00000000000000PNG  IHDRk7~ pHYs  tIME 1hB IDATxwxg Q@EYP@X X A $@HR!3? I)'19{׭ C' gw>\skyo6{_n-((>|$^N( B 1&@+e+w/Hȷdz4$jDFU=@+Gr21G|~M_ӧmL>( N6?y%k7۝_.\*.G}.$4Ed2fee%&&fddڶm`4`fsUUuy7?Y{ "Ҵ?~@`ui >?i7c$\N5:6;6YŻ{kZ 6>σRk#M5_9V+ Wkl%&տJ]vǭl8KK/]*Ǭ-$ Yf#;i?p oܹs<)P` #qҬY3xyyW.ڵkE1''gNjΝ;o ovvvW' >b(Uq&yZ4Fiȶѝco?sX'JdFZN s>~ǞQV5lk?}Sv1w>>+Νwޱz͚Oǟ>@F.CQЎkˋr To+u(CJ\y%"fQ cg*֥@BT~ pzv]vZ&6prXB(IWU3|8` hotuhbLooo]48gM81++ky[׮'DGGW;Hy1a+Vԯ{PyLSDv( B)`ԘэiY-ÆO/LѐbYC~ߐ%߀2l8g?Y ,ho?nX K͛{;SC_!(.>߄Ǭ$@a6~ajfƳV:=!Yh]M}dIIIM"+,7P k0HhlX5M=yİC# [hb].!3#xڱfBj\cϿM6}j֐F<@B`T55%e!"hâkȲ|iicn .*{eAk@*_ʷ|5o ҉C۴m+ "Fex[EٺMۆ;4UYk!CoܥkBe*eٮݺ {:6@o_;ix&¸,9_bc0Uu_NHh XKoc@1c~v\Y)Z"?+$˥nbX֪Ι(J4CHK抉S*h"YUUUSSvۺo;Mk'}ΒO>o߾z DzT`B(fJJٳ?޽{) r ) (t8\.Wsk,;tu&pHpo40 EQ_שb ~ٽs*+"1(2 t //^1bĿ~xNUZv,[nhѢ۷SBugMrk։Y'N47_mz4* Q,Kc,]<1cm!=d1MC'3]wu&ݳ?+¨z@UUQs|dž l6`h ѬSDH@|֟UMۧȑ# kܖpm6&j_mݲE?qp2"=i :BGhb\.8KukS׭[?.xI|o$:w&ܱr'cǎf;w6lX~m۶)SW=$<<|@jHꫯ ҧOaÆر9jn!G}!ؿq=z}>T@bb⭷ڷoߩSVro-IMM討;V,>Q2eʔ={Μ9Rzv1+СC}]6w1{z~wb1HQ~Neٳ󎗗8{섄,_|UV;j_jH6lؖ-[~g}ye(Z zzL:fOƍ/,1غ"nj}oa~{(bb|sfXf?dFF~Ҏ26nwH_.U' :tժUFݤz)js0̓ R[nJdd{fs;R?nz[:fԯO<1ks<ۮ]x@d̙z w7;vlXX؊+_ݤCEYlي+ իW\YVngggãΝ;ׯRT5 O8a2}Yf㏷v?;Č9rawKEEF! 0ƧHi ΋xԩ={VM_ӻ;~yk'|TXXxw\ɓ'6Ι3'11z7o;zhzSoE0-zYC%9O6g5jT 9;633sFq̘1 C:utD \mv޽5j݆v7,r P4YthYzŋ[,ykA۶Ru_{{_~yappp-1~vΜGy$gzBҘo /DDDۻwZ?ЃիWẄ́e٧~:--Dapp+Rii ׇaPbUnI|_~f2wܣG&%%Y,z"{7o޼8rUU%"ܘ6mZ-kZu]v第z7@QAOpuz.ge)CU'e[Y;v8Gؕ|KEm F׼.22r'N}*vĭ[V6V=A=uթ?|ѵQ@_֭[ϻXfMlllΑYWcMvl۶l}&{R&7!ܲ4X^z Ym[UJ9Jϕ_Vmݞ:u믿޻wokԣBB=~ĉE;VO>-5Ȼ[5J`vr /^{X4eg?oݢx 3z+KƵO_}=ܛo٪Uwqǹs222^y啢"Y{=@O?tǎΝرc͙WFq&q@ƪzd2mܸQ?nܸR6m=z(;vܺukPP-u:nXo+8ۯt?@`++3ӹo_#(Zm8_ Fca#GWԠKvխߌT~UkZu{)))7nB{_׉ck2Ǝd9oss!cƌҥ5‚n]V?7mӺL׀_k_ܶm~zٺL~n:w\Wx{:0ӕ+[nz,-m뉵AtIqQMym>z(nlR5S}n4GhdOS5mԘ髣=JISKKC3t$U2JI>عkп\QUimYfU7_A)e 1qq[~-))z5 !r8BLi6΢f[G1@kpHȲeΛβe~z"T{iqQ^X \&Ol|PpXee;r:`Q# r1={'xΟ;']e|<}{vpGۘvϞEH) h>vk i P1[K\.W.?VͳPʍTsZ=zt_+ZUUil1g?|0i;iGS/0[,vmןWFR 0}S7``,I.?ꦈȨ1&T#Th4 =jX2+#lۛ=uk@!3tUzUG֣gM%`U5llh*7(۵?{6N<1l??|% Hg5vneKl|,uQ' %ҎLm[6_Vu]q-#F<)-)h$ IDAT.Z l6W|"H'<,Gmoi}+|%+׹-ҜMqu{% +? b2gZ1Ƣ @yŰ龫s(&ݣWf9zvT``````U,WqL8iƯbՊj5K]j @Y/nVbcGRkx߱1Nڷ'0(8}"M X#e}J>dZt^u8FT aM)l6.!+3s[dEn1R'#C4U-t#;v#ZL߻obqӏ$ 8ܺmM7ܥ[A~o۶v?@ԲRW`P7rrC >Lq|Iq16S53v[߸Q^֔7@ PKK =Dz ߾fBBC|񙻡RLYY ٫WttrH(ѥ[|#1fs:t>qGS'ݭ(j/p򶭛!znh1jlfFS'S4ݡSޱsI808 0:tHI>2h[]&cv cuJT}%^^,S Bi<=5Ol&@yeh ?"K(u…,vB lذS 5U={̬̉N]VjJHa"MFHe 8j$am6{?Ȩ.:[i4CN'@hPr<ߥ[vcTUmH'&@)0 {q%@ $"@D@ n ̌ !RB7Wj̙SN`[@YN3J -֜< BDGkժE:tB_}R9gWjM`„'Ol/p"n4CBuU*Ҵf^F#G٣G=J!BNNNNnya6lGw]wM㥅 O>ҷ##[UmM:w߾[o0rȃܠ5jV|aBXeZٽsCI;vlRҍRnp >UmM=,iFS RPr52bx#l6ϝ;gM7h)7`j4Juń7^WUmܹUxFvƶPP7Pwe0͛ !qKQJA$4w{Tnݺ۫jh1? ^zcxZ}ݔ)S=pxxxBAy7& _G)<;ǭr\``P߸:-sſ>?wt3v]Tҳw_I2ӫCf+w{05KpWzwzAee喕]j֣gPp}mOUh9涊)6l0\xx˯,!y7³fҥsѤy_-I)[4cz!M|ha/QDHJrѥK1{`9 ZE lݼ1Ud}qܿ{^U/*ۯt?@`++X5>֜,_LY\ti2,$4hok4hmΥkR"A,YҐup^oo]ODPg{ݩM=ٜY$c|4%`T6zzҒCnaX&5єñqf)A}x@Ҿ)hD\3 :{`iסmL.:{ 2iJΝw߻7%rTU57MUFc-ؗ^^V6r7҇Z=?e*EmjէLp!ǃۮKiסkzs[2[,v:%>ybب1~~r%,մF<G߿=8.6~@}r/\8}.";w?_)紣G2_m|E[E0[' X, 1WtbcUoĆF"MB=i߾~x0ODn΅i˜ TUן+,OtQxՊ1d678oӮmLcGSE Muͳ[ztwޱx7.] Ck b=z.%svf5\DKI 5(o{ۄ;-kx`+/n0G!4smN<ѐ0F6LnsHj`pq0oO`PpL7Og]Ͳjgw#&Z\.hi_IO;ڭG/a#Z%ݭgoUUTNtdTI{5[,ee.2GS[_ Zv-@e/:y%+  2G9t+mN]ZVZj MnǗj3s+3=n%I5׳*to__?XHIh4=`А9$4<0((6~cG'b ?z8inEQz8yVU7*>yΞ>0w~,s<߱sI808 gZX1̈Qc33Ϟ:|iooԜv:$ 49Qz1+eR;W7"!nr\.?NrD 6t5**"c@N D4 &@ $"@D@ D4 &@ $"p#A='x 6'h<{Ny{N D4 &@ $"@D@ D4 &@ $"@D@ hM, F1 `;v ni2Bj3<t: 0`֬YD4 &B~O=TZZځ,XY!ϟ%⫇~Rŋ/>_ti0yxbARRRL&L\W6Wk׮]`AhhhD6lĉQQQ/ҦMV+4 &/\t_ۘ!$&&vI !ܲe |Xfs=S?sC׿#L61bD04 ͅ2iҤN:akar\aaaIII4M[ofp24 2ΐ ypرm۶i…*N:'MTq#G&%%$]vW4&$$233ω}ԩS.\OL>&tL>}6<$I;PUU⽿a-}Uyyyy=K,aYvΜ9D4 5e…d%22r޽êYhd7n\ǎ;~xNNΓO>\[o{z<֭[ }8iҤLpuq KJJ:zOM)`j$I믗/_lٲoFe}k޽fs.]>DUU### a@AA'Nxz;m۶QQQU7-\^ЩS'Im&1vUuSAAB(&&F*,,[Ag̘W_;j> žAML>}J7!!!ӧO_Ϝ9Ct՛AO0aBVVVvvW_}ukUUkAHO#I 4" .yo߾WHNN^jծ] ɓ̙S\\\\\ϟ?bDFFݻR[gѢE&iܸq:uj~~~]_>==t :BE\.Wvvvzzz=M 033cǎU7ɲwޮ]aÆ.]nݺeL"sBeӦM111D1 D4 ZbŊ&P > g!Ϟnl7(JC &@ $"@D@ h&@ $"@D@ hM@ $"KVV{CooYFc@@vQc!\>yfUL6mhMGQQQaaΝ;&MTוΟ?{3;P~O=TZZځ,X@<S&N1޺u;EQM65ѫ^^4mDDieB zYL^TM5>EjSU(jxSfsٰ]'0a,4U3ya5iү VaXQvS 9""||ڷr鼜\@4B&04MȲ00\Yz0B! !1jaZ,,c4Ee`0 c00dIEk4(a,ceBKSeYhjfX$IDi=ge1JjMӪ kn1R(44MC)(J_PQrx༼:IFrr,/!%%ŽDtttÝv T\o?[%w) hzP_ j Ebder).'p;EQ3fr,Hb潽JNXFUXbR!`l^^ahRdEE5h rTHАsr.]g.;n쐼<˄x14CӴi`L! yyՁjr5dAi4UUU!RdEQz%ʲ,Z F>>@EQXWIP$f4ie!,DPU4Y)FZ5<Y"U-8(d24oPi)i H!0 4!1< ($0ƺtJXBQ kF3%%% 1cƖ-[JKK/_wSRR{<~+V$&&駟ƍ' ֯_/m{&_\j<:l6?k׮e3f8N4%&&N0b,8" dRq1k|%ŗTKSTawR|`0m|02E db9NqC3,CQ/MS2;MYUWSfxAQՒB`2" ry^CP@h4-f5//WE0 q}f a???Mi:($h5+;#YQ BHkX9eX,əi(!MCgJiY8i9UU ,/!4MSURMA !!FeY,.=cI i  RE$jX *q0IDc@14 Y5Qi8"+$˲Bӌi,s!1eUl MEii ͲvTUqrIz)dBHC!axY!E D 𜆡a0¢(!(@ڳU%00l6i&..nɒ%3O?p…hÑh߾}MӴ+Wmڴ<33fhC;vl۶mݴpŋvIpw'&&,˄ ~ᇻ{Ϟ=,3Żna ^}ogO.+-dUtDž ܩs֭!q'rII AoE,2,gyfhc98a5Y._+삣̞= /ai+rLUUeaH14*M06[xV^RvY%(8EATdIUMs BV\RRz(IYFCR1qoQ,KӔiEi1(bLfh6EZi2!E}qu$)Ab l  <(K$b aj$ɂ$(iciJ%ܦJ7R* ^8yt^~>B)dE1L(!hzy b !oi @CZ hdV8EQG IDATcQ1ƪʲ=#J Ґ(˒$  pKdE0@#$ yE@b aUC`eY8NE,T QEs!K(+/\CHCXWO!`01 qF !#(ʲʲ !MQ" \E7xޤfs6vȸxl].uڴi'\paĈ#F8$ߧoVN>+в,XP^^~ΩU@۷72vM$4E i-).T(:'?3xYVViZQQQYYŋ!<! @xbhEEU$YDQ$Ime$Xf#ϳ,c293C`4(2ͼd irMU! I(7xxah6AeITi, ".3-o}`00 ò,EQfE b8NUUHA* !D@Hi*VdU)e8Ie9!0CBv%FQ BpYȐMR5RfhMvreY1f8PXd e0UM+RyؕGWW^yŝڵ+77b4q޻lڴf7()S999Kn .yo߾WHNN^j{VrN%%%r&'K[n4Eh3[,F9,<]ΜѨ@q2>~"sl Qt .HSerA5MSK(I.A 4CCM&ĺ$*ϳ4M EiHXj ]fLVdQ5iE% A5 &$6]$~X\///EQDQTE4M*F?LA0(aXQEIR5*&aPn9] F!fXa1AN(I,#YC !0hexozyYox1:E!(6Y- "Ęhax24".)d6kMd2%%%=|Ill1c+} zUTeO>s=W)}ԩr}?~{ݤ4%o̿d10[}&N]j!,--xX###XS pB}Hb.Y ③.;u R4mDqgiRv;*JMM_:<2*4<2<^K/W @ a MScTMri Mrl6˗ \ڳX,,⫱'EQNo{KT[Y h% ޛ[e~o9]36+pCm,5l)Dhl%dfB 5q't 힚bB,ʬ̼lwnf*Doddܸs=]y+[7z7CZ;H)0@D{x9 R9`Jlu*)W-#c1h%e溮!T-iاr!9窪1eߏ/e9wo?wܧ^>;jf )kȶѦrH"ݪVٳgsLD2eRT~>s*=ij,t!HHbԍsZ"A`!,j9kkB+FE@$ 3+c Rd͙:)%0HޘV3sVǴiB"+W 5ꪪRdB1&΅(D`ާT_*,)#"Y H6FR#8w"VΚP8TY*ϭI9-WKM}˭Lfz"b]))c9]?13ΦHBM׭vTZO!3o6)Zk"90# !zAbh\J)\n_+c,<3 BH}8v};\.6 u8 Hιj !VUU׵sCAp^DT@QUDB,z1#=_I9KFypx0Qi:\>P~ެEoD)ZpJi꺮!sFGw!Zl?pwk9uO^n]\r=v~]{10 <DZ#!^u8߯B}CvӋrq2C._NR9Uչ[sW99{j Y?y }Uw1$k2ik:sVnc4KBJUB@胈uc)*5{Gf{C2qcޙU$"PΩc>„,"4I?7c!gk1C7HU\:lMbll=lV[ǘs.:OEd>d"B,ONIS!Dtpy"m Zʚt^ԳZk*eHQa" Pi bIY+m͙g]|ELTk5 CIt24yE98ǔED,)%kmNlCS*LDHy^|61Fΐ20: 1Jhm}?R1R""i)sЏLFsf]4/_nfLy*BBޗ9Wuqٔ|okXH41rr"œS%EdBD8"prN4h6<̴W:u“ֹS[[[8.R8:q,j̕c3(%La2oDu] fQ|MI)8)m9="VU%1K R9e˨:VU-,ڜ3\HJruAt+"g5Ra,Z]'1@$ez]W9gfI> {@,3Qm8>J)}LiM'f908g*}CPJe)aĜs4HzNNIS9^[o{쑇x'ig]]5ыŢHKQDr" uUs✳NS 4D!DN)12q0b7OfJ)H)Z=vc¦irL1FbLI#1FQR*Rș@DJ[kTQ33#|N1IZ.h*4CtJ1)WPkN)Bpca2t]g)r"*Ѝ̜$9<.Dg˰Z哣fR1s ٍ1?tw8l67\{u٫ڞ]]=כ[YD"'k  :q)%Eθl@[[[1fD2(mER愌ښ< @Ӷ*D窹Rۻ{{>zScd8䜜)­9;1TZ?JUwr IDP(!R܇& 9n >im >sN9'k1& +mb΃Zmkf1f]Up:5WdC1tc,#&}6:8CQ7)Rs8rKBrcdnӝ8ͧ!̼^?_sիYVf]W?h1ܹsxdy6im71B4Z's9( 1Z㪶a_ܩ[l&v{,ȳtYq63WK!*"c%7z)qzc#"WL&X]@SXy:5&XJc l6Ҫ̓&!Eq]1j\e1F2Db5c #3M#a*Wp8VUwu]+TסV#J];xd2L!"aB@&)ҫef&Yk= h>T>^;g:Φ{g~뮹vsn^sγ$cUUUUuݠF VI0 !ŦicιnIiCsp"ןZ[80jIau]׵R*E W .ɐKkcPJK:Lڶ\.%ZXJiG?m'/^ZRX>"j TƘ(Ƙ9g&EU݄ JuV1BBbf8\{mǧah{{;t3EDֺ8/0sBu2hqtS):|:2|뭷mζsxcaѨ1UUŘs|t;iDЯ1>D +nrJDim/)\,;{|?//tppR\= |>l6Ec|x0lmﳤ̡60ֆ#I$zOJga)4mZzq쇱aGqR f SJF[(l"bfpq͉Ǿ;8zﻮ7!&c0֚R TUXuZ+R1fBJ)]RWUs.ֵ;sn2og^{ql:RE}PĔcHw8ͧ2C?cbL1$WWڭOťr\VDf8X8?V`;fuXRfKڦ̚ZΏzۃ~ӭ7[7M\UUe\3D8 h5Ɛ"  /uNW<Ɣae>iP+6M;nܬSXaP{p$Y +(mkf)Ԧ9,RTF b.17ιaJi#b"DL)}ι80m*QB#Q",$RI3"ոJYShv2QM#Pd)æL!~ y5"D$X )6Sd69{UXbJu)0[j/#R@cE)Q(DƘRPX8IS*|mKRiA 1F+"C)f8D3Bsfafqs !Jۍ1˲ RCt# 9g<9+E)ehA !y)'p'SǶpi,Kd&3l]7h 1ƜjW/QMcWͅ>p#}B3Mﺸ̜5hZ.󝭭Z@~̜Pz>msnཫ*F=qgk\<|W"\{]Baɐs6f:"D!Q)[UMhRѶF*qQ)(B&œ#1Z#v5")a1QѺ{m 咭P圛~\!d2]W&ՓA#ZcR)lF9QQ?,v]R8 1 HHK/(tr46鴭B$D0H4gYTRXՖTѬ9ș$@HuUkm60G}I⥕eAHs#l,om P$CXkX>emo4M8皦Z{8$c1a1Z+DD2!ޥ8TWx(>L^tİ$N2ͧ!k-KJP>ӧN'ٖh@8WՎzd gwgtZX)JiS..> T׵O'8}U̜R/_jZx3tB"Ycqpx3d jSNu]WGA')B@B,pSLMYfƔG@R2#iDDI*̜:l 9'"<&?cR ` Ygf.mۖN6UYs2|~*e0 D Ue U10*8|Z$42RHeSmӧ%v} E'0COSH( MSLԇKÕsu;n.CΒ7(5hB1:&sW[P/BTN:]N)9 QtH˃W\O[EΨRM"%MkAh P5h]E1_ZUl)Cqy<)ʲsJa^VrA\d6Ƹ^Zc0FmÜSZ3;8ͧ8vrڄѧ1^Y+gvva ]0)R_}grKn]Y!p3ZU*TΊD!t::3kˎc2_JX26$KQIy4DM+ Q:V{_7#^UNͤ3g\wbJt.ˍ6ZiDq:mbL0""RbJ2)JB(nj :S9)|z?C'ȅX1EW^%B+2D& G""̜Ft+4x0"E$rr>R!FUl_ W܅KFlіCUUaR29kʪ)ƐYKriP{U@cl>+xi)G g0J "a(dL±ұUs1 V+m2=/fR\be=+:H Ե4v*",ld>ErZlSNJiN h>-QkPN6UU!Gv(U MYM3˦N?^\~?q&H-ekk-c}!Oۻr2`qڶ唗Fk":HUW/7ȉT/")ͰV1B`cP*e8eN3Fri3!㴚hgӹ5NQhB(ӼRDJlITqi ӺT 1(A%(1?#Bxӛ뽽//?3NOSBjD"mtF[uB1)Ē]|yǃf>=\[kcr>3e PkEHFDHXAVQVKT^I^hxF\ ~RJ0}9MӪvu]0100(MHdΆ>i(8ƈ"b,sUBLH@D8pBe5@uC$GFJJHG#{Z;dŖ8wӑ׆:T)"f!ª,Y!rUB)g#s>Қ}Oŋ|{GGw݅9M7tſz;=yߗ< ×~问7wq"~>k뮻~~쪫^' cդ!> Zk ]_U1td2)NӘ3Ax08H I}_|Vb~:2轈0)'!f)j˖"(\.)ҕC?jmd)F YkZka.%-3sNA+ ]׵IDiʸÆ gy7BSa)ΧHy̅NTM% ,Fgf D((@ S,,.GPF Bf !V*>x3_׿4<qUFڶUJ眇q>0`ޚLtSEbeSg&9u5fHf ȜrN!$PDWz ~۶esѲj4M`jSEDtD)#'J,^G019Wi|0@JHS)䜙AsbETZ%łmn27/,Q"T5D(9s.XG6J#tZյ+/9 35\y*N]oov۶|+qZ|}x[[[__[>Nۿ̙3ڛo~3y\Nyk_{5}~y~71^K۶{N:t^'grcNە[qTFmF[0S6U:cpl>۞>+u.hiCiSSfVZpLCf' V9X眶fF1DS }s sE )¨gJ8qpJ^rywwk]H!g1}BrΚuJdN" +Kz1RZuSc , M}Xum9V~lʱFS*"gʊ;g%@ ~_e/|OO=x+;o_qWUGtMe<E//}Kwy?DZ=y;9N_W}[ϑ|Gy;}kٳsO)b>kIZ]Q4ms{(jD.<С&Wf5'/|X/އ;8ǬHVUθM휭*_+s*I߱9VU<]%\> j5֦ KYj>KsQrc11gc,K)~4))ҐA£Q+lUrdbt;LR*ĘrqY@$)G1x?z?KY"u4ʎ_D猱jӭKP6tKi}kko>moggʇax__|̙%g5''oᆽϹ;3N@f\5ZSۻמjk2X>F2 O"UbXg]U)?> 5bpA1ɜшPj*L<Z\{OEHsm9e+Yll/sQ(k5H!{y\wuSuSi%V):6qX٦c j=(LMY])t:iq`Ut:Z#")(X#رAI(s>ݠoO: 梇~Xk}5|wq{{{}pa=uԻ77/_}Oui(ΛV )B92(ƮJ(3r-5iM,8iV,|X]2CJ)X2LD^o??}1̱4:e zIʟwYx]WRB,w &IUUmڑ$c)sRZk)s9{L,zQ@bJ+$9zs+#蕿J: ̬:gVES)A|_甎[e_Oۦ7__<6+mUU#O,9s&I%}MM~*\%-}s<x_\/_NL^kc{GyF&qʞ:7ۚ>yt>>}j\ئ5RCb:kyѾ5O[395MZRLڔR6/_n^3kd(h1tc,80AVGsqRʜɕHX.'('QsXO icjM8#%VuU) )E.۝gZ1T18g6̙So}߿Lۺb F?B%XXgެ}! S~PDMӌhSi^tŋ~9y7==G7|=C~\~Wٹ{> _◾z׻Ο?X,u=o|o\ZV]׵mu_u<}{{S oxsw}}{~䞟t-[^'&<ۿyo>닗B2ZfaXV{{{h:C,Xև#bQ}_>![WXV !zc*^7{Vˋƴ-m[D4 C1*CaJvl4GDE9<&]uLcYYՖӤmLJ)}7&r$R>$rVUYr>RԺdbɵ/?އaBoR9RѤmr(eA (\;UUN&EU)ӧO/_~׻EW~o喻kX|E/zяȏoկ~ի^׽~[<9wu׳׼5"_yk^|ɗ|ɥKx_yy{/-oy ^mmr7|7|vG4sϷ|˷/W~گVO{-3l>M_U/f32qws3nz֭ӭZmVpN~?\5)BMPrdc[{{]?4aVUU};ks)s)l6 >!w}Bݝi~.\_?||}͙ju?N Yx_"H]?f]xq8z'sSRZ׵qDs.n*#ə:'JVJRDneaZ̕u9C;iH!ʦ봱Z+?}j4gz_ܟ̙fBJGb+W2䘈T{OHH ,R990.eFm'9x;ns}*$+%m=l50?V &tu[7AQVZڧHE9m\!D!v~|g6t`1fa)v6?/Hy}C>|p/TH(YoQimOC5!*#`1*Ƹ:8\^>,Wz3CueFi [&m]+DdFd28ԕ1F6"ƥVj@lT~3!"(#zo RW>޴^/C0 hOg 3iZ!HuZPD$a6s'p%4fkR0xA̕J[JkJ;L!M3wgT{"c2jGrgϬ}]|zL&}'|k2y!'Ng,/ܚ2u)̬u.<4 "ie%_4c**bD1u]+ b)RȤdԤSfrUZ;kX77Z9)sRi i*|\bp$b.FDZ{RJZ|^XCJ)TJ`w Pl8g0e\J1$cdCBǟIRɜP_%IjL}T<~7Z??. 'd1*E 8nC[okx?}}졩?}v1uk?mUTP5 9{vuXFZr2E-9\:YXMu]c7V|og'ɬ'VZB۴DIҚŰv6Uu`ޙ9D6 AuW \.SUJ)$)DB !l'm Q҆b.1ƔN@$N2ͧ&D1Qf ! ümgM{G?'_pG|>'"ױڶms#G5*S.\p0Rʤm5JUrJTI+mi… UU=?FRtJi24lqΕ0 ewj~Ggm7Rs:_SQD ͺ|9#0䴩+E7SC/^~Ǒ4 >)$&kTglsL  SrR {o~\/F馮 ?S\mГVtNs̒.kX98ͧ>iBU뮺ZB}On(0u-e8 qNJ+H1js[[[1cVdh1b`{l{{;誯Dz]$B(&8ϯꪮ6M%{"cцwwwsλmj %d6gRݸ0~ BavNrM{c;UzD0Al)]^>QDt7W)ƦR_|/~X.Ƙqc>.M',Z۶--dS edY)*x&IOq f8ZW[S>Oո^mۡʘb4McUUJG(ŔRqޛiRM\SmJ@"d )d('/>@.?7-z=}Ù߷˕Qȋws}\̲% ހ,7{?ӓÀg|,ڦ|?<!o" ~S'>Mf==޻8iFrͷ_|@)X,ǷwkGo8>"#+O0މ`D᭷g0&FD&g#FXFZ—~U_ß̥T_K3{{RB!t"nf6/\cUcF:31_T@ IDAT|Ϸ67@"J+-޳wͷ(m# {;'NҨr"<,J#۶Q '7tXD޷19(ҹۛ]vڵBȮsɹ㧗x<3VwM)M{OTY UQH%tf|?SG.õ\XB9Rc4RHZɮut7m[k7?SdbKGY"ƨ 1Yfb٧‡и˂VG#)#D<\X.òoA9A_LH{[G_qץ77?ËOk"ƺm۶m,;v-( B9]eȹ;[…MK dYeIL;XE(Wjw_} :oӨ4^?7qK&_G˹NE\`Xi kbhgBK D8ƍh~P3H)G<駞A=_c3U󪪖x< !^qX6b.7Pjj2 IU}jlr=^(eYiQJP`rJ)PDQJFY6BAHJڪ$aww}/~WFU~ځ`ϝ>~_}zo3έ֜hm<y)bVoZ59T $p1pba>t4Z!@jՋ[qz`cx绦BS)"xԵx_.x @u]gYG} !(4_8p}矹h4>}Sy"5Χ9׏^:Fl6sE14JIJŲʕAHuddyWRnٻrvJ[ykk*zբk`k6Aȳ2XjBJR`+;Ӷs7olĈ P>{_qru3kɢ,?ĹS.m_sAZ F) eZ\Z"fƧXǢO?vW+xc}eowlc e^`ፃW6|}緾(D (}JkRQfQU^R Q,^j65M4_z/\i=+8&IѯF++[7ouݛŔsR TJH!T9-9]=mǘ+ct…e]UBp8IШ0Rz{f۶Z%2R?ē^lR T( D'P|kz]HLR`^~b> ?GrChF>Ե_;xuuunr0\޷m[e };iSJMe++hA1ZYJʕk)SΞwnnuz_e?Uڶ*YcTRz٦Ef TYfR(@<}e}jm93xKh}gg2Bp B`bR!DY1V&ϋ`2jKmKcsWRͭK00&qjzIcmLdb:8fiQ B3=(VGv5CWk ImOjQ ^8X-Lt?V[_}6u픔VL,֚5ׇ'3mE彏1E~|`M[?~ĩyVƺ+ˡ[c9sT1F/\ >|\UZ @C!sMYk)POAY&HY>hycd2:3c5} @2)gLDDemMs鉽PvBe)Nw&󭽽W\X3   @NN)V*yZRYnmaUfH*XEQ)vo1%9ޛ^8SxM3$ $ WUjEWZ^{|o]GWF[s,ʅuWK%b`!eQjq{ϝ;ッxBWE}hy]$b6(6 !{G!b,]f9>De}p.]|yoow)rNeY DY=yb ƪ<Ϙf4T\k @D))0DJDmy^ח]YF@r& IqD"RiH\tYL JϺm](ɧ_ݫµh|ן9]g._ust1]Kexml2% (M;uƾ& #W:/Բ7ŒCbbHkH* `{{{ss//G~W~W7~)K˗x@1h&͝;/  @TeJi9cl RMRiĿ !AXb8slYVy^4m"7Vl6˲y^c C><Ϥ]faL)RJ1'W^!Y^ AY˶k_y!xk Q@f `f9pE븻ܵVXm icΜ9< #nN{i5mh:q/R=tz1Wۉb8])^xl8U*y:Pǟ_[V\gRZ Θ! m&QIJJ}gTe>[β%~{{~wm~ᯑ3M"Rhk9ub1~t:V=Qy?CHj̽xqlHlC]oY m>|ԩ,z55VZ#j@B`u k%$$*%J)fIԻ|Qϗm$F5& H( %!"` MbÍdk2[gl|ew%,h;n;.}7VKa>}ڕdivvvS,rmc#Y -X+SYZJً(`!!@P@JQ)!gg~|c׿o e{]w}{Jm a3@bd>u!.LZSjC dl蘣@?8tK I "tauýF\YVUyaA5r!BprN-KSWדM\(@0$Ck  ښ+m GN.Ůu!g._;s@(@(Qa۬ȌQD)P"H(#pG amv[m<}s?>u婫x}gV[[С'?Go=_~ɼƝydMzQӚU׿?w)>ײFn*eP ))@u])N)1 gru>9.]]hz?_~~ꧾ|eoWoW\Is0Xhc Z|\N7#0j)ԨDDAMn=W6ײ-(eJv8}ҪrTJak#1veX }|v c%`|_ٟT,*c) qo:;tHS@(,\YJ")44gdDDH0+UHeo}GaUHNA'8eY~- ˆ(e iH, u!(22kZxL!aGo|m;̍kFY%Tm\τB%Ɣ.M X;zY^//?ӧOOO(iV~`6~^7hz.B -߂KQo&祔uS$/ARie!Q|O8?plۛlnn*e I _߼N૑%mvX?HM݅H]a͟}ct%[Q""B){6) &RR\g b";qje7u!*J(dQ2` a l䣟y ;]O}Yǟ|O]8"BBBjֶOC 躮]OByG/]ׯ_5y_%.ZUw}m׬ P2 9R GYJ.r3+֪ѱ({X+gX g68JĞ9H!f(tr;h]zw}w*pʕ{oۏ}c},/+>h b>M11E@1,A)eޕ*(,yalJ2HRjsKb[{k=zZSOEUUeYDWϚRKa=l6r(J"/2wm뫣~AJ)17VE[g&q=z^vQ[@!B+e'Nf8|xpjY^Yky$2E%|!WY4mX.b'WXRDW{fJ!ycg߻7?qy!0z1_쫙}>ٻheyQ)e"j]|>1=U24e%F"Nэqm KX6Y͢.7)v2Yb;_૾{SOO?O};^}=)-,ۮuZs]ʲbF)rH)@RR~p}s~"b*!r4jKٶYVU1۝ͦ)&2Uf"˼(xkks{w*mŠuͱGln]sV Qsm6}Egg$ԯwI)@MӬuSJ[k(FǜE`."13b).eH51 "0 JD)`>>tԷ7k}=yeix<=_szfZ+)Χq[t6Xo g4P1RYL)BS]֍o5KijXv_n_[2uۦI1 MS 1"7*TR<`Tcd4ۛE6.X6mmm}iFKFO㕱Zkl2B }Ih߶mQ dDكհ XX=yAz9 1yڮQZGún_o;E۾_Z}\u}0yEQ mMgdF& lэٔ|c ]O=Ib#u t`eܶR) cT "$  IYLvRIfI}/#cKp(]k./閗TĘ۬\[ĉVB+[䣵q:~{^ɻ.ڍjpϥ#8(1M9/N!č7b%QeH)ͧ;Y[ BQJ3!.;"9He.869:88qumL+[f*T\*bp dͭ,ںCQk՗(QUUĎE/=QDFpT a QBJRP$ $hBH1"P!m6MY T wn'>y}QBX LB@`F0 (mB@0jeB.~|Yc9ov'{5] IDAT 2S#)eQPb;FʁD'pǙj8|䑧(\SO>XY6*ΌRYqZs h-Q$1|Q%)] q~gzuo|Ch\y\Cl3kH T;)W 3UN7!LVVV{">qPmUg{׹b9\I>I&.FUuDjEI1YԭT#o{~G*_-Wۣ'J(""9*)=NBa4_zD*KRZbDYʂ|.k#!@cԜb"k͌р!08FoPu>}C[$ۼuS'ۺmQ+YucdDAL)EXm,0ğφDRK1~d}"=uMQHJ{9&L1ܦA2H!#su¨""VeEb-}"ɏ~!y^he$%@5sF"cP2#b!%da?Ǘ&З" &X 7ZDJ(a>Xv{ݍǿ50ϟY8p(հ<Ϭ@)h!Z7X9(Rfz5"!`P ?om^vDt`ͭM!l\̉(D(l^wSϽp[4(@"؀"JhZk!sOsn># R*dy;Y ⠪]ÒdߑgmVS>wش.]x7:_։S=7mbkb)SWϦZWy3C]>ľ`3 u4hf*<_~LeAA Bc3"K[" $!?cF'GÃu-(Z+D,noF^>C)$DFgYKg˅,/+fwh!RˌZ]_I11]]/(! X>uxc{#`RHB|$r"GJ傁8(@ ޻r0BDJcJIk~8ŨS"HIhSTΟ={ǹ3' EG&4.V EpQs"GVi3 ) !8 +(4FQ59)dqc?h!P7,eYJ Rޅآ DӸpĞ52"+-S(YURZ;ʲ5yw]4M看],1Yn}p޻k0{u_]| iv<Iaι}"nfCDΞ~sgm<"f!R"!"kSJu]=:Zp/`R`c J) !(+M9)*Jֺ뚐H*Rt}Ij쎻k=^ׅh59Hx=*1H%4&@(PtQXBLkSUZF}ɹiue95eYJ{yvJ >|R R @)ɓ'fW\["%Ib숉cbR B R0ŋgpK.H̉oum9'η:X2}Sd&˶+ox_Kѯl~O\x?.AYkϟ??Z9 zsDV YB%x R3O}朻E085B*Ҡ*뭮`A$2rwFCs=wv)fY7dUqO?iַ3{93S]@(XT2 ! }O6oQΚ% 1|!k"Nt;=uϥmss*` ۶|÷}߸'!"*3NA0DnfŶTz?u]]=Q:p{4L /Ƙ /\n0):} MD&%Ǐ?q$>2m;JTVRJ.#yu5u,+cVw/=Qheu=w}a6fb[ZM)x4$* sͫԣWw=. s˲2n0{ɲ Lc4uhKɬٹ|tϽ[ &jQBާBRK(EI ;c$a>y:' d2kF2D c.Y%$JTu]3xk*c5u-XL8̖$ Dpvͱc+;;{u@h4$BR@("Ccn@:m  1{W%_#% 'H<Rt:3;v89 Dȕd?Dw W34;Vvw_.YȈ(x4lM5PUXݦiy4_zXch|&Yܓ_׭:E=̲\#B͈R p\8hX;pе>&A rܚMÕF.l֓_l.Gk;e:00C^1 Bt׵UNqk{iV)!8G-k)#hV 'ԨE >1zfJ(xѥQjR"Wj#aj4WV]$Y*ʹkM׆矻:bR/rNx<_~ι` mе޻,"/J)!T}*fzsWG/5RF(5Ͳm(HD)D#)8k@H&V4mkm8JyܓgŋKpxyA.l1NiB `z<(c"8 9 11Fqkgqz,f̓lrߚxs;ֽuk(d[&dp"JTA@nmJmXPbT[ԅj73qǑ D}vSw>o}VyWߦDQy0BPiba*[G74#̓wc$ ܥ._Q1ʫr0%F}cSUe8Z xJ)&T[<|x)Ȫ>/6{|.]XZcaRp(D4- WRN)?׌[z1i1j# !R%hgotESBu]3*Uփu`;@<OE 2®FJ@F5S(z#1,f4 K2`pHk4uu%C.GcXc~;Hѣ _|b;n1F`uř5IQB!B﹵hHg[#)R7ց`iuǕ1Vx罳R#.-4q2]N$SN?,FccTac6Y-au!6t> {cK'WWzi@SA, h20w@1 W+wzh9XG˼&ޠuQ7BJi CnPg}&glXie8>/xJ)(DJ)FY "{QL Q je(G` |1 腫wW:W.^y^H6IURsb򼜚p %A7gVEQ{.n[1 8u:c1c-g[%xի^O=sKz׽uW\ڏ}c~L_>еp0=hLI9YZYz<ҒTJH3)eE" )Bu:ju$J"!(x2Gp8^X8zhޭ;CktzEϽ:m{eYy dtF8-o"p , TRh󪬍1 [ĉ#;jeę(tkm(&FZ6ȔB "k&xywܱ%Xۧy|Ө` `4Cek^kk$1R"ڽj&^9% iU.e=+bc2]'ͯ.- (@ZCHI0ZycL9%{L0&{d]cLTB|K_:~G9vq~ _»ӧOw]VK<lr@'Ϭ.}7<~F/%/T^$Dag!!kMgf&&ˋt.Zm~lRULX2txr򦓗_ zFOjFv Q%qUpcu0NU1!;g={䱒2+mMu`!(=J nk2y>6x3. )2c:N,tm /)D\LpJ}(]N,`. P5`j6-D`dkRQ׈ӸԌ<ܪj}yk!6}[V#1RnqQD<s.ˊ pMqhRsgsn{y@)3E'_WUUկ~J3dzoDjWXk9XQ"\ Ahw0AbV F$Li3Ɇ3\4ߋ- EA `Ɲhڢ# Jolg8IP 9Frgg{4z]j92%uUVX$>9<=;?~Sd$?3?s0 O-57YZkVRƓ"L;x GC 3P*ˑFZE1"pnvv_+T8b9T= IDAT5704{NJ.R&haAR͘:us9{ӟ~'oE>'|/}OOO/=… g?O|ͯyk9['|a׾ʲ\XX8s?gwv Y8K7tS\g>sCҕ3瞹2c6NǗ`$Jp2XMgpΨG|}onW{|m*[K--/=T-lRdyEVGkcu0AJUu]#,El68rZkwJ-O<~ŋ?>B'Bn#$j+BٳsB秇~_W-o~ŠgoO}/& SI+eUƠ[c"q*Kg4(F\3C!sFo@9W֦ku]I>qk/;kZރw1;)a39!DY6emA^` G#S.xܨ 0Bl;FP)i˜Uy#3ԣ{E8N$"F F VQʨԺ*d9.v7v'I9)Í+(kŃ`o/<+$B>Y1:Z۫,KQb* JiSOmtU}6w:3g<7[h4+W|# mo{;kkkg6{ӛg??? .s=ɤ( ַ~gߊ;RƷmO|[:&w^c<7Οߞv旗 rqM0 -A0 p0l6ss 3)je&/>Y"*UU[0u0(*&rj0ٲ΄a9Mɋo>;bZKʉY =WέW_?yewsyͫ9͋^o8|ܙȫb,Kh76Ý$vrlcMל^~tkh&NS/ʖEב <|K?}fΩ4FBĻCZkCʲ=n}f؛;C;x|뭷cXO;_Ov?Od?;ӄ7 -zwr-7|;ΏGw9rɓ~_w'ԧ׼e,B[Y?Wȧ0XK(5R (!Z.1Z`xeB(r~4^^^NxR*% /ruͲIYa >?nGz[tͩkڭn;:o?xn8%Jcelckksssgkw?mSY]ٻ/_qu,M đH{U QmDI; Z͹+W֎񦕧=9_ {`(E9j$3 2I<_YZ W.?0F1{u F)sUIŐ19\b4 Pn8;m,˴2&91fA4%Bh<)w5[}ׁ|򓟼WWW߂w jL+Lfn}gʣ^2J9{(&835GUuHlnE i󋋭vPTr%I…V dJũx^UJw.x PWWg JĘ(`.fxdѽ_Ů$X ˥2jovx9#5ۛ G+l{+/^|{?Y|+Xl'\Gpb`a-V4 BV8M8#nT'?}iw{g۸BBD`´u1 C/n+UuFUYa'2&&#JYfSJCin8i~H9x=B@ (VW-.lnGCcOpd#j4}7_tdS:]-XC?'|PUveV5%4 4"#R+zo;BRjmAzJ84M5(^Fo!GO{kN-! ^k-Tup^ 5jJV# xjE5zjwVn3= `SU~Koߗ!рR.k`uecluׄF…_/ne$xG7@Ak~R:aZp䬷yQR,',VU1%1s>PRzDJ`̈́QMYQDĢݽlyy9O@*(25ػG_}뉥^S / N&qDSm] N/GQ \0'줔u I)q1kUa(QFk bLf95hi$RSLʨѪ PJYcc̹bL01c㊲ C_e^60ә81 R1h % !+˜N&qL0!Ĺ@#LFCsNM{dYMy Ne[qϧ9i$(r2bTX6pF i־,U^UJ 69H*mDaD="L1nsx+%!043Qd)̵R&"UZMlݟ_^9\nJ^mv8, Y;PB Nm31UU [v?0(3J@D^_w>}O<{xTQHCI@?xq7@bTJ?^noaucRUTK)xrv"ݯʨN'A \)9@vN*QvicXKxcqΟZY9~ZZOl[{;đ,rz\[(DUMak^ʻV ?tJAhpKgYh$iU)uUg BBH|Ep]+#M=z%M=D1q#[{ drgtА@r=4NKAȻckyx XF1f\0%8$0uEE h(*W)T͛v2 cmvVgE5kQcz qʜK Xo'Pa:96mF,OOإQ^'Rַgm7]Cy?k:wRӪg[Z.7 IDAT4 JYSjJh&UO5}7{tJڑGT3R; 9#LK#AUGΚ3WD!RH8cLFa%`!lnn?};Ve+!$D%qt0&=T*1J |Qi~33eYA`z)LX )r"6Y1)V:@n KDBݰ5E@ J\J±t $p , DWj %b_i0vs|qs+T yM2kmVw.^Q-GcՑ WVVn~wx/nF!q8&$&vxx76Nfs!D2s>pV6ҔJ-vJ9K!M9cuSac{F&!q`0|8I[k=bj 0k7(κ8g1wQ.(c޺i 5F{oAP4=#6 WPGSc&,,P>ϛ#$:FFj ;BYU(mssvz領t-L-V"k'u4j [80"-kh6y3L4Ze3j;aTJ#BO"(nj%e&fjt.]ɵIsyB;vr}{ p;Ǿ4Pxqʸ{ƥ #M {ƍo_c!L`2A!jȭ͍ѓyJh%`P-Ea#siaES 79eQl !,K)%,)cRJ)gEc,5QBsaqUVo3a/,k<¶s8'a1+bCĭޤ,&Z>dr0f{u^gkioŽH@ @%R"Z-Se.u&k:xsM@rKp`W\1T8Ԏ) }3< " &d~r^HD rul2GEY QZF+[ZaKy.]aB"㺴 =f(;ٵ{(wCW!ZǹH9{^ K`rrdave{d,!%*.e)3s4GyYxD6l4 F\ylo0,.-0KSo4844m`saT#8^ F&Q?H@(D%<U}jϞ湃OGk֑֕"sQZ,-Yk驌=?׾4RoS&gcskCS->՗ ߅~ԜE-8O_GyĘŗ.Ȫ|9Dv7g~[~ť^jz¿##k4 q D• i|ݎ81kLK4Ro`^WY'ݵ.2VJXՊl./.-o BЫעU}4uaٖח?~ڂ3p C> ڙ1"Y_Οvkou;pCem% w 򣷍߱v"hDB[? 1ǎ'>k{+(UVJԱO?<}pÎ]7sE΃ZGDgLR= ɭQ@9ȷFFn=x0ؿ$I8ru9]vz0zG* QDQ0?njml2_}Ўwص4׿m봔y,-ώx,hI9y0,VFZ-eѻD Ʌy@EQ<0_^ˬ;##yq"AFwqc" . RByɹc=dZ[X1fi*TY6jZ3YYI]IY[VfY|l\=vOdѓ2`8,Q A.GWN͗M"J+sc|\XvUn*6 |8Z-?M cx΍1gxi9T4rinuG_[`0@sO}S_p|a،?XODc{௞)!\Z);o?B6!b8OVz;&O3|Օ^fލE2..O#h.PF245"PKlOaު b7I$rz$ [[Y*,V9uRHŘγ,P}NLNN :-[lމ Ο tꑉ [6/gaw}˭Ci.\Ʊg 1C1x H1r%zjLKHssI Hy ˒1 =wk-hx]C (yTl!_2uƺ[j_ynY8tQmg*WǷA\k]ٛ/}3ySYgNtwv! uzdߛgwt3k˕Q9Vd ᕏ3WW敯+y? cŌkq?/-}K>SL"D^Oʲt Yuhy"եAvN;8}%R9g)Vsι(B#RQ9lj>K0 ;"ntE$ cuI{[7m-ARֻ> Ç^:~谿0WFƦSQaq".^Xh NohIy(%!xU8 Q FPrB<1u#Ycayz 8FK,(({Ζn.FlM{:qr]cAr%u꫗G߽SR"Á9Lnjƛj[KK0(dPrWG!$7vt>3'K*/DԨr5IuuiD(V_j1 "X=߼u%lg=o>?LW\/ͭH' Kg`\x\+"V -H{Ҍ'"dP,h 2f!,ms/yliJ3!sg@Lz!x6דIfcd8"ʔD^k νziuaս7xg. ["}?{Z3̆VCh7g¸,kݥzIHe06V2 0P:׈XDJ˲4F+ƘDJf) :MD à4FJˇ][۾}{ؘ|m}`1Yp%NiwvO}"w ?۹sk=3l cIY˙Ã;ǯ }sÉE3DtWO\qD ͛Xc駟g>G__.@ 7iՁF$`CU/Fjz޽Y7|]I  > C<0]6~;X_}M";vXew}>#!:ب;qlLm9csnM~Wk]kZK{z3n%@:E^[]ҥKΟmG#5^9j5)@VK(,˲,1&8DdȬeYz =" !sD1isΥi9jyw:$I6o|͛7{eTemmmdd4 C1(,X %LnxB⡋ANůVS}3IsNޑw$&8z˲0ڼSWvO&rgNtVCŞ>v؈bz)sC: \H[f!񧏯uRkDRVhwn1mw|mWZOTi16O[7#DT2uV|*AQ 8v<!c0 `s{Wmc9uueeY:1b"b$R]vEQiӦ˗/HI(VVVf$cari/SwΧ^|dHif|{j3 C$ycSq3wnZ$ҝ]K5h#t7ok{LB~a)[Wڷ-snKМ[[7[RCԯx\-m۶"J)_cG__yͣDpf!}mϟVJ72 o=m)h:b`|$iॳYS:ϰUW*c%,X\B,hl"wZѦLbv:;O^x|(TYQeyVfYVZ̃BL0FEQ3`(Te3iѵG`\+W>;ztݿuzAR )ZȤ9kc7/e=٬xeo\޸q?GyK_qsΥ ѸU7W~b7o^:}'ׯyEuh & ~zŹ˝@EuO?4X]py"KE (dp.,.Ea LEI"s<1A8oq&f qGw=*Iur0ƘRr(9pVI*uV;n;o{ z7d8[ͷ#l860ZY=g%j XLr.rDP~kzcBJ0J Z[?w+RJc0!qs=:>./NMM%q!pk-*X}F-¼gv~ᅗxyYk; ;w,.̟;u|Vnt>t@,2s1dns^YZ" T >tETbAp8N,K2 0 <EQeߏ㸪/˒1&PJQ{kI.Ec${`OX[F_;}rDD;B:1ΜwDk~ޑ{+/ƅ|!>M<Ӻ:fSiZg!\Z^7vϜ (@'H4%"r G#!p= 8B-|QbB3ol* [ۭv]xy#ZkIC)Z)dټ]w=+a""8!8'pϟ8qwMn:~}o:͛6jSeAHds2eֺk"+J8R F+C:^{PJYrZ(cI\fzZSJ IDATElեBpD:B.,]]8'9KNk/]B=pspgן.3enwD_~fm+_k[vߺLg?#GL֎,Bo? :hfV.Hy;~ZNM%qʜUys$xu-5Cd;W"s;c !L/-oh6l/w7oƯuښ,Ϸnvԉ`!GH)1L10v"*u۷# 7쮮9kNz#/=7RٹarW^>sߵF:f]yiƕֆ{2c cHY׋*4sAFZe zVyYeDz{μ=qvnl. 82oqƅ@$=gsN&~ܑ_~z{mz}}{jά4qa9ᖙ/;6>iPv#Oچy䜼g dGQ+fs(^o(nϿ(Ȱ̮]n09&YqY%'ڭKxp$/;}>KntQ#GOp{IVW./-- D j4ꌱ@AऔdyM{c,W.yιˮRFF{vLw{/Rq^"JIT 8R ι6Mj.l郷+|FT50ήbf5QHU v QȾw.ЩuYh.̟۴Qnm 8xƩ@T "@$81D2e*07c< κ Ē爫N9ֱՕkwLtYֽwNL,,6r<d $XCS_.%μo-plJ.29neg[OY^tmzMo~[e.$6nj5 2!ABHp4y#Ж[kGF+=0R< U9v9YFAG Xcf[n{}l՛ޖnlm.ыs+jl: oQg Ʃu_Һ|_^[ƴk7p &c2ʫ@ BlxC( g {3,(K͹-._>=Cdξq̙sP\H"ZCJ&0Ҕ$Ys>އ_O|P/YkΟ>5 ՒX]=K0Qaƫ- ϯ.Y<]\\J7A$WQ588ZW*bz*y@^%t:D$IUR/`%đӥNj bSoZ2q4ZairЈatks 2 uPXuKv{dfMi%B@ |w-g5FL~j׶MW!@D [:h1ll3 QBrq H nk]r33aPjv0˂q3L:Sqw:kCJ] C q%A uos! ƄRn[ "cޓ<2IB2NNM{VVWW; KF7,Kc&y"Qe UeU-t0ƪf$U]JYVGι*p6[]"}ӞlmonjƖJnǎƁg}~㎣/ dyĄR{ <FxߺO@8qAת~I= =\fp ҹw!2r8c\aĥCD#xZH*na*y<>[4Mֈuy1" j @0 d0::/}ٳk6CLm4L6:'{lRc|*MNT0q`( pPpRV*д A@"iZƖnܰi~n4Z͔VƙJU1sEQuJQe\V,UdZQAgiQDQRx-1&FR[(8 櫫τ.;ԾkHpf g͑Ce|9;g{26JꌋZ= 2@@8w xRL^<~anY圪@J]SHĀ  RpB q45/"Z-bmN兹(Ԉ?6Llشe%dwې[$x!xF8lV`MF+ @ER:ti >^Ԭ F*8:rUvJ%Mƹ\yaBv:TRH.Nsťvo6}}w;/ç/LA'F}}˺΋B"}atɐ+b7k4|ٙ7oc"`1V2e1puZ˳\2&޺3Ÿ|!d@6Oj;?75XWhkw*XudH޵5KSU"W#%¢(f}҅@[-O°DaR?p`2ȶoρ9CVM/ª"&^zieewMl*b|߶[o=gKBp!NWڪ(,s _Vo)` Ð08-q Ι pC=jv=6:y,ܰ^W:G,0~[~=ʙu.[|iu}zL󝗊?T #_@Bf"Jk}gs ktP =i.GB&6nTpsB"g s;Cy!o"xGXhD:)CєP 0g 8k};N8}ؾ<{Dj3#E@I.,1(˲zWOqϲj z(`0T<ψ|gASJ%ɸ\I1tPz;qC`i1Lě>cbuieav~{rG@k<v7W֧g^HG+%EaUE~]1g 80D8-,./<8F_ ir03pYDZYIPL* v#p3ƆaS^a8qt?ygݿxFzsQ |4jJx^9';_yOܼq7>s#<:P/)hJ=#H圛NSkNěWkk[Rb @7cD ~@I-OX na^,[/߻ usϿ7o-X~so[ֹCx~Ū G?h˪Dr, 55cĹwNګ/u^rTM)J82"1#87pUUM\ 2BiUyJR\qQE_ wO>6@`wwpL c2QLCy3N~}_{ 5PJ!\]5`BZ*IJI!bz?nք1`_xVbaP%%Z)}YF16/˺^a9tGNB\zCJyqᇪֲQ.[P9G~kRia44 ML082.sH,FP¤0=8L!$u%]mΊE墸 Ř"J2" QU]L&dGF(&"`TE3uR'Ow?0T܎`nfgU%9gP6*ٴY N4=I9?xhɓoGioz3j< "ߺuIDNJIxaHHg#9;?8YYoǃ(=F1B( ƨֲJvchY`yW/_*ǃ|`~W٥ePjg0s}L9Z^=?F/]|m=;ViZfVXð(s"lɚC IDAT#Pgj;3$TuIwnZfYO$#g&( C% BuRB5J5J:0I{J!Dt:Hoܼ~쑃 Z6FKp# p!`l!p3a{./_eY"9X U]޹sgnZ4WUI)ZOZ0t 3MVR)FCyZ8N,_^Z&Btq}5;m/|n?s7ޜd=xlyν0}ͻoeYxvncO-/?'`/֛z~zfKg}{N qi>"O6%E 43 +U dY: #^#Ҽ,,jFXJyy!g>lcLcDeYGq{{gw<]<`Ø?ؿcB 扺,8`;`EIYXTo|*-PYio7gS0(mXn'SeYdC(c0إMJMLԈ'Z,Ļk(ºnT#vsZW8h7hvv EQ?|;ߺSGO~2fڷ_rȩ<\޽q[u }ݾkCڃ$ο>rXn .HY?џxcgWOOi^׮\;G֙0ʲNwsiš;VcVx'Mlp)n'{#:Ny GF0F*S9!jdh .^~imtD-@*WF(`X[_Dnݸ׿u{0M"2[g~_]<)ˍNQ D(T;(18ùuZkLiQ2s"J`JPI]7q&(ʎ|RƘRAҌysuaomq#\{3+,/ʼvpw&qz3W/\z;};}3s?уog"Ji8!Ϋ!>G_TeiSi=-kM)_25fÈÁ'XiݼxϿ!~!$ʪ*+RN1vu8lZNO j7ił.,`XǙV!\֍DYgs 2 /Ykz{5 >߇~0ŷ._M3=3߳~;$w} K:yB(NZO{7=`pOiIYu;I_e+,Ȫ$DqOWrA4\_>xhozJK)G1F*+ QAE"gf8Xr (y֔#b)ª8N:'Oaf`''Du|*g7at-;~7UycIw]J5%hg{K97?n"i% T0GqUBhTכtA0)Tk2.»BhJ4? V1B)y{$Rf޸ʅ߸џyı':ΣNvf#*oٗﮬ_r 0("n;t̓ zPgu׾9zБ#0 =^^O>߼kdY3EqTUnk<˦+P9 f\7kB(BR)hjQ%I'a*fƨ.du.&iڨ0 "ӌ1Fa < < |ߣHi՘PXoL{+_lom 7kwGѩ3'?t i׿ucUeڭsÙ>;U8=t襋o]x}Z募;R@?`XYȘU|i~CW./e;uᓽ=#fuvzMmc߮F*eJF1l#T9cʊld+ٳP!8!ZkCƸ2(*$lIT:ghfvz{}9{c#2hU:gʦw>{5[VRZ[Q5=s++)"nLct;":DGF:/ ᾖྥd:<#3S&4 ?OEQ6M߷297\EO{9{}+_`E=Ԗ*}쉶BuC1"T'@UjFT DT-K9ʄ pTU51S@Mӌ ( #cu3! u8,X 'ʜUFK#kB<$A zocݝw=}cy,ܺzCg$|?3oT5jb+"/̼v H׮\e^Z\Xd(gh{{#-iܤyVUjiyUU ]揵Z;Ps~]ldS;f0 8!ݝH_X|[8N`20Ox:;0{P_ƵN'CJ)hoa4!Q ֛n%ӍԮ޹75=WݹQSV:[Pi*GV68B$I<pxqaZɲqE^ԪGƆs0dI9u Xݼs" n5Ƿ.~kw/|4I")ȊltWΝ{C?zow݋7}xuQ^o[\\85p l\_şs+٭> ,Df(fg㭭9֛qJ$!giZU1Fpr{Yc1&cD9F! [cnطoVi TJ؛RBYUHn턏>jEo߾u{Eɻz}u:Zkk|z/{P_}n=S K˓SO>oi:$iMHoܻeعg{^y¹g.ĉOwO?"k.gE(#=cgBQ:,.,vBԨBjaQΔծ֔"uc$XZI2;3n;Q? %ERl74Mkbg!X &n>TR=&p$i;/u$R?//g\KWB"=~ҽ/}k~~3c%}4M;R+V߾h(,ʮbI;7WV33[RS 3& tS;JdS#!N( a)QȉгY;2J2/Q{gSˊ veqh 䅘aN.;f/ollKR}= Ĕs,E^O^KW^yP#gN=rw{cO'O9y9L3>rG>|$i}y_?>,{ %e>ήcLBU04x7$?ttC|YY!2o%kkRJ {3RʲQQ!iC94_0Eر];WVoʣPҀEk(~0B/}}G|liy4;Ti *;sw>}Ӥn-Y %zxyl8 ڡ]~secCTVM5UUg؉itu@0 Rjmq.+ycmOagq2ʱ3Q:3w/ 9pr/t]E}eB4p*p!B`f~~֟|/~c~iig8mp0(NKa<28MwW_y1O:xIckvt.9 0*#W"y^<,JJi?r1Β$1ƨZ^(Ƙy4$doh5Z0&i6un(-Ё^xɋc.-.NeA8,(PY0Ang?ػGRʲrJV;;;_7>_o5՝~sAc.3o0J xA,jm8Wk7xó>ٝYZc+yVdwiT߸yky~w^MfMYZm(ffyeB(vAZ( fF+u}NTAof0FZ~.t|0@u絬 /ͪN'*FPJ R(}?tH)}[mmmB4S[kݠ{(h *Sy:n1&,,vSDV;>i N3_XX\~қL{s?؁ڝ۷g\V~7vv6?}3JiglX5݅S 0enƀ ]V3 \fCH\v-G$EVGÝ6f4ey]WE>}C(\^^Rw!B<˅RJsᰪ+-umFhJSF{^oBt@)RjOx{#ASWu߿]m`8bR`Fs+/kvWigQc1NkCQPʍqqp hݨ<[@T3v N=W&>X#q037so?}'VI%G9J@C)rFUF]agVk?n2un|c9g3yOe.!L)SXFq4望'OK{A|Lݞ,H)R'0\Z^ʲ1fq7m,UCe h1!k#`t&/2h4`Ztovzv3;Б~p~}u5د~#ovۛ0)B8yĭ$N(Z7ߔ2éPwWJh޼vstgj̔O1sREe(1}y0则F3&\eiښ 8om߿w8Z]_>ceY`ZI99kJN„rcE~Yfq>4^UU;;}!x0ЪMDh/-훛]0V0AJ (Z6qn:CO%AVr<dx4C?fwKhKւ hkji&#猳2f0" 1j5MU/; =azf$^BgFZ6<`2Qgs!G05uYH ӂ3 Ou>?ק#˳iG~8B?@馶; ucg- (R"L,!P?~tu? vR2J uΚ` ZJ kC[Y ʸ1: M &Asp8$L(%Y5B TС#4eTVMmra:F*Z&/q B+[Vu ?y*ƦIs0Cc)Z3 bb!%rTUZER;Uj~y!&>/DI܋KU>y|i3ۛjXW'Yɦւ&B[09n Ћgzg<<guݏ"mP) '"[D;"uվ&+uYb@8R$b&;0PO^Ĺϙ@rF2/qu !Q B'IF2J0Bdft儠0z8폳`~hT!MRK묱n$ VQ空.릟~rV?.I+8iwQe PB`,!:PJ; R1;P΅!D 1ZɆna]d2Kt\`ƙ58r;ĞZ`BUU[c˲jf"f}ġ>{k/X׍: [@ gqS)M09 .#'Wuu'=I(wdSQ8#RBHMZ T 4qtGi1$I0Y BXJřPF !,&R9MSK(ٌú,) N1 Y2HGYf&\8!p]Ղqaߔ)' ?<}v?[t<Jx#l 2~8;t^,+ƭ( 770dđՅ= |CGGmYU;'Ӭ mɳ!aɦGE`PJ8k(e]5w+x0ލ=|`)0[43ZpZ @P0̘ Y;/˺ekV;MʹvmA?ZZu]FQ`(eUUC8䰳HJpQB0&I9pR)_o_^jY?GG.Ӵ.+LA5" GqwJ;VJ=FvSp7?k}KO>vlƝ 9nZG(DaxժQ^:m&231fai(P4!mT+݀DHG)BV !j%p<Qq@`l1VڢZ"p"c X/n^#H"c$PJ޽݊[`5: |pZF*DxZYά {, * fBx2pSVգ0ᇎ,c33m"D777#?][qV)&cOQѮޣc8T6.`;1Eo]qJ7$cOR6rg?G4}DJȷNn [O<~p1ZeYd$K{@+cs.: zorz~(c0|O;03DWo^N ! S: !«d s!bx:p(E t8Dep84ZeNy!E{ss8B1xw…0 ;=^C|rʉ'(f4HFELpPײiTtU=1y~].'F5TxF5cRdA0T5 ~f5 k)&aHզ >Z ?sOT+crڑTV\JqYcm̵7?C 2 vqu>e9YWEń0nl9AC!u5%1lVYfr*[{YvUwkǓnݷtOhMF"X" ,zB؂ǣpGQPI`dH0 $4hf$MN _[]+7V.)oJa73JQDzL>M.-:n \eEA1$;纜8I(6Z C۷o2ZG#$$~iX\S:Y\An*1^tsɒHqx㍾o֡CB>γ~ѣG׷\__MiĈ :2#jc4B1&@ 0Nnͯ_0}8э(h哓q;vuݍ+xˣ3lrfL S`"NSFJ`uN6Fy923SLF4PBe%q0ss+K}qV&`pDZLke^ie8a)Բl#50>t,F&c8I̲$Mrձ8ev\˜ @T(_Y[Z!2KJQDFC@2ӵ-0aufS+eQ>Q$IgO6A*"_$! Fq i* (6gqq&QQqkܷ5UyM/eW%XhH+ PTccLX{m/{k_wFmFr4?|c!c(<{{߻qF /R\;Ssm۶z|)@!~ggG?wn۶q;w~W{챉~zk6-͟VӀv)O5HD!ZkƥKaOny`!l! kfNtL:uA A;v lfd0FkBfTkqV塗9։bA],VVVdF!]He~+]Ж|WFVk~QdZ[J i-\/lv4FȔj۱==FTzzk?ԭxv4aHGݞBiaiBy ѳOI4 Q(a$\eakKMdkm{k B`J55aD L1FjOoZݷo_f}/<F1??С{7-[_cϯگ_;v{=r&cn# r1q+-&cecMΫٳN}bEǏ~_!}aNo* !c;V:8l1ض0BܲZkLgNalA5;hcm¹SGgCCF};q&:zģ;rjdt/)!@+ eq1+zŸTskq %(jlY:tA"d,r\St9s718^WDxȥnJkFھal2nWk+{+_S)bDs0fp?L |ni~pl1! &0 &ƞ}ejZվo'/--ac#G|#xb!Og8?j>A^vZKmRlD)a%!0d~v> ntHhms8g^\6'6ZeYQA0Ƙ5AYR18/> ZIrQߍ+gYǩFivt؄c*fFքsjY0 2 l05ip^jVZVPЀ$8kHTHQ*@y_TJB'G .DR묯8:>tpbIC9 R[Koe/T QaLQKLA @h:CHQQLt:J.\0?8uƻkffҥ_~q]w/۳,$MKg MD01R9_~eP )әUj[O?96V{m!0F$JH*RAnf1JRdaZKeV.KeJiZ.$IX(gWU( %NJ\<#sFa0&B(B.DT  ``lᝐSdSTpmW\QJ@N@R44C}{߯ʯٳĉ?iEmG9rϐbY 󿥈C/cZ*8ibOI6"kA34,dk82=SC_Cm#a1dbJ)@ac/<1!QКztG2P9ES'3ivly"c L)Zq,~qR`ZkBc`BB[0E0p9(d_!דWLe<{vڶ`3*}%n8&$@@APF !l"548|ulBic$Irl1 `4]Y]YX^k_M]OG!q&,c٩C?"ro$K#@B,˒ZqJFQ M9q<33 :zK"ƀR)t14HG IDATcJ IAil!"Mss̶$ Pt/)%8HRe(hRonW xZ92tQFQjZ:3N<O vN@ DrW%ڲl(Bp00L)I5;- g\+.+8F~i>"e "F!daT-Twi~p.L?iO/Vz;I;~銶 6?H0h0%B8Ov 5dh˰偡֙?uᛈAN`h)4)w]ifl*eDzVYfBZiBܾ,K0B-۪,>w-6hysyӶTE$Sdp'w+Z\=iPn͓,D"*JLC>O݂0d 6s1FrbNsr"A|uz+`ĭѾS7///7xcY(B!rb"3W6!QZ-X F l YͲ8gcLL_𢛿G9GRRsKI*-rr1a$4"ER#La,L9CE6Zb F&եg=u,Nl:{T\kd!)3 ȄLͮ7j@+G=:QrK޾ruҥrtl<_$8J/fkY@2 C8}򂖙|l;.y7j[18q̲6D[یSBjղ̶,wME&i^vKSBIw:uB3R8cxF <ٷowA6gVVRXk`L42^z("3@$`9. 0 ( 41)`57|WF냿;CK|073+c6-s׿S'O,,3M03Q760:,$_J$q̕N"lߩP+ <άDi֫”ZW>ؓ^c\%3 °e|GVk5W[ ۀ bL1ױrv`XrǦNnkS6I:$N%#J̤iF H$ etZŌf%/xBZQ7禀@ 0&Dq۵,e\r-KڵwyiyeeeiB,`-8IF# z#]\-V*4ƈ܊)'"\]YUaJƄw1lՠi5cr B>D vP,$ʴboN823gQ5>{q QL)[fkpXX6/ S\}pi`lxG\8t%_vS>_rKxT&F"nwY\IjeY !2+MlX$IbnYa˂LAIm[,=p@$HcnyP#ѾkזZqc ARh4 e9F%2R\d,W)N'NHPIH$q L CK=y2>ñvcI1uAuFWzSvI`6SG׾W.R$-JBVׁ)]}pmkk$I0s̺y)_rkq-..clm;}6) Lމ1?s՟WńQyr i6}~:hvLs=6*O~o{KH B\;$àU(l4`T@(BdaB-6iy J@*)kR4!M#1rqŋOlc4NICkIc[< 0 ArqcZ9'6W%i@dK%/O1-p~}n(c]{oֽ&E*Pݮ/lhh[ }׽Ue9MJ0s$L(grᱭ[fmZo̙3`LXhWyt㶕ZVo_yrbbeeu`l7>a9s*98msvj,v\*W*= qe$N Z@$"n; 2#I18!0,g3 dtbWml̩*S(^yM[=G˿}{SH~7èhfh7[q,--^7n*&6I2#(0u$JqD*24Ko߻R+)FRߠRinWkırfQVǜp6.]8_r݅ٹOlqbqkҊ **Z o[o"ҵ0i۶NLar/V{QX,Z8pp~n3H)8}ꉣ[WGjR z#TjfW쿱1s:0j!-lIsb#|+j+\Ѡ àywW/.^|BNHHB$Ml>xK-Ch"-f]Zytk4A`\4N8e|&˖Z%4 J4S'>A*n0&]sĉ[]\ ;5bs9˧t뮼9X~w/?fz ,I6:sp՞ѱC3 4xS;vt=l QHKM|~uoᾪxJR3{Oqr)_pWgݵ Qwf3 ^+GeW]546 ewxRSANZͯxmstr+{Z2 (L$R~˦6=8lv`v jrO)h5=c}馛r#VG!_4vNz[aJiQ LR:NZIb8S`(Jh!mmL449}_jyn0 K^R1L 8;SǏ?1gE2UH&2|jU˅Sc9dz*LD)-ّ[C}hep 2mgN/2 r#@J1\4^>G8:ϟ[_h6V7WʥjS*GY0JR[vC%$Jӟ0[>O"ϟ?4'ܿO?3~_~ޓ$͟/TZo?38S'+r^(o]Rh4y҈ THS8(L?.8Cվ|+RJ!j˯}Kn?k7AI.ME +ӗZeo/4RJ#B,R(?2ک7L_83<24tM٫^~5N>'ben~uzv=er/d(Ƅ(1g$#DqsaM駎-/vJ)JibƺVBVn-l<7M3<2lYny{>m*&K&: `fΩSv:͑ 0$AJFuulA\AujA $ Τ\݌c0f{vOY\j7ګk雋+kO?L*oy(Oϔ; %8ɔ(a~[yх>c[k֥E3ژ&G\75m;.¬ᱞAQ1wL=`q9 %euVw}tM=Sɲg$R<6Z?C/{՞˿o>OLLq?Jwy?l6GGG?O/cǎ=vy/OG}7}s۳g&l0bH%*NZ-+陑 bH2qBM}_Z^)<;;}BI zw(͢8Հ0 3љd4ۍbV(df e IDAT2h.8W,;AT)EP-U*ET 'N;L-WZɹMyLcB^cWR*)뫫Q*!8>|5R\!m3 @>ҩN{3q @QԵ l2ZQ|;LjD Dj d(: DVJJ* !BN1: ƹ\B77җ﮻;7>G9r$Ͽ]{oSSSNtc]wwm=#owrӟ_N;^|SJG[ѣG|߽{&l Nzώݭvq=n9~#Dl@R蹛diZ*W (Fp)Kf3Ü1FK\0:مXDfQ7 w.\h%r@ATֈdZaC/Nn @c b UB߷l@iQYFbVⰹ&biDe}CCÅ={nt&ᡡ0㓻wOQ I!^Җ3Z)!JcԠe mI uowKyvW("qBfL8R c1j̲;QT,Ȱd1B6fR 1b8B@0cҠ eBrv-w?|oowS^:'?o|pwym8ַ}{8wqW_b~7~?MLLA0??۷o߾}';v{=r&cn}A;LϜIԟ+#)md&JPRJu,mˆǙa¼2*idR}.^:ٙZ#N1`1R.p l%ugPr4RkeS31(Zߙkõ]6-Dp/߉}7?kﳇ}_x,@4w}YF+0b9lum 4(p<κE!)AC LBI8oڥq FF#|($TRKx F%&)!W[;3+k0 F2E@fn54$>uB补<8ڸ{ښoͻw[wrWwQ\I0B ll: 1:H[wI>=zgi6/o&$Iя~w~Ν;?S?__|R&I|aa;F#8|]=Ç4RO}kCag8%<#Wӝ(!!N¨.8n04!)MAT!tƝ^MT)AkFt7SP $_'1*(Qh *,#"DR9O_5M3ieYUUBJπJ8$(ח+7Jg㲲Ah|(L;OKN ɖիW7񰈣fvue9MGĶr8 IZb񥹅VY.Jt3\ncvAx8v~:" P x- :JĄԁZ;$~?a8>g}vo'>񉝝Ǐ={v_4{ooʯJ?OFگk?,N:O:/ 3c=裏~8i?b^?wsmҝo%G~YH.]tohϼqe@{[@r6Qp@I|hkiR vs_o_*-$N&+IXSʑ' ^f jfϊ ć~__ܟ[YQUL;;xir2#DY= d%F j%JXEթgˑo\eLSʼn3K+^6\|xR$JW׮sX0 1c,c(M$뢣呅\3yC m$s N&k;qHm͆}6-]U7/_ygԪ@TPa%ua  mDN܃pwΟ?od$A9 F.8R*5VZ+]% YyZ! ֕_w޺TB %W*'` zGޓ`&&6Fkb ࿿\`Z3^K&WY+eTQ "(A@ ۊwl1(#tJJ (,㙮ݹssB8N93!x2!'bF {L RӸ$ZIsqe-h4A!)m* V%XHu;?uZ dFcA Hc=w<|h9.mUA6(veg*TTR )D66ݢ$A<ԂL+0 5F҇L=ȓR֕NB !۲iLͪB;DZk!rE楹nʒR׎QJB; H @ A F@'?PBV`]vP@JWJu](T K sh:wfD,J@33"@ Q#Pz{- cj (F'1!9Ȧsi֓ bmV{2CV Ѳ45[gBzq*%XSUDD9ulTBAhni"/f3b)Q99WUyܖhw+RwFahQ$Z* PDQ3!%?p?B̄B`:~Jfs'`F&bY "$FD!JV1{3Qp @xu1s(pݺsoۨYz $101@BHb(e'M$9ja락QPYj1Q]]%DHhA `pUZ"3Ip?]Ov*l:mƘ4Mt=#@NRKJol6C`eu[.AH@H**KT%j7b(*h{ d-ZGL *IȪC˯\xau2׾\!sJi\FB^Dzƍa9mFxRLM޾/kUyVZn<9:eR{d(;B$")%JlrSooRp9˳Ft AJRir]yan.mR Z(ƘXsui!#c 39Vז! Gathu=-rdeYhFUQHVlB{0dbgk޽}{0J@䘤Vd $uI$ J+if(@ <៿?("HD(h]qW^yӫs]rN酯I`= LHH-cg{`4a8iWeID֓1zY]%qeBJ4vFcH@\߉LA232k)9;gB()h<ޣ*J[VCER{O))Q00B`d&)@"!PcvO!`^^Uyu]ԑc6|EAz0'T0M3Y~UOE]hZ|ҐR[Ga6=;ڳ'PjSuH&AJBA' 'I3&p1K/lvxK;'\_OOMr: sz[n|c2]ȫţI;~W_#T%<20#IU39s[U:C"%i-U#3.q VT0l&=m.H(\R(%IQ bfF):%k3?sd/gYe[gǣ]E Z084A#&%{KaTs޸džxk߾޻/_`ϟ A~˷7?^7_vWUR0ĚI $OEQ,z^hgq4\]+޻ER=ȥW.^.N6YF=i#FcDJ`Հ(UXJ)jG`B;Mg")yPXJ P:RD]^'t:seY4ȡY;ȇ e-)ځCa&\Jwam\l]H4sȹz:ˡ-+d.Eݟ u=lW#!{9wx˗|Թss$ *nG˽v^oNiÅEmd< E t=K}MH18β(nĉ%_Vy]Rc҈:f`B/L7o RM6yD8[.4{|x lҡCBRL 8\y  nTՑV?̼IGY77_x*fmi{8wͲN;,kvik: eJWT=Qt/ ǣգ)$i1: WKƨȲPyG;TJR=zl8MYU̐ y8ϊ8JWnllTA'$ X 3Ό1@2;!ˢd"2aD,%I0 lY ۹^H̽~Y*˭.u!tosk<1ej[1s#M:#ax'Y|vQ ++V2 N$jCmՕv|aيAy%!@o7Q6n du(>~ч^kkP>hQbq1Z!ںZ%Q,Firl4)Zx82Ґ#ug70lmU #+9X+P7Jh֞O=yֽAbR8oӌ(eUUleH)$Ikl6ϝ;U /!9nsE+^# $VF뺦0UD$r#tWڹVzrlww]L^-9'!P$ILG)[Bt f*'暫ΖE  }疃Cz2ds@Y֚1 F?]jap%;;E9iu(-]f}V,[B Wx47oܗ[]4^RFQ' 84ҁ (ix0 6֖LVլD] kM:``2ɼ04 E"0́QU̼afngNȩ hyTZ@I {G5@LvxabQO[~:" @BZaB"dΡ5b!5LwaM+i,TY eyjx;Vlw][q#lunc|js}'b!:ݞDgYZ{ (FF&L ;^Wҭ󓺮/t/|c?*K^}Ɠ߭S1ߺs_E!K_{~'zړ2<ė>gR^z~_w$otA (h~+kZ1IV5dZj58f !TM nߺk%ϝʅ2a8 u՚ --"\qd{\X% ј`ކTJDpowl/~sKO:w?r޼~pp/wL[CNy,Mκ<h6ڧ;~7^J=~M&o}g4g~y ߤi}BtA=gJ) 4iZQ%q,wv6Qzοzgu37ڻqf6H J[!%2u2i!ׅTѤ<⨆v/T5[Q-ODR r@$qÐsTLLBX1# f44&wfWB(`sEĎ3g@PIF|]:@ 9ǀ Te|ĀΑ*GVSw46ijFru1p?׎DE&nx8|EIؘj|ml7Zlv?~7޸aDe47nw[v<DAGjwO"߻ ;~BE;ן~jݽ|,o?/U;{im|ٟGݯ ƒ-QUG8ukΑVf4xoFBd*4K}+_u'ߘe`,B4\e\$cZ/uWOI uRr1.Xfw.1b:ɲ@P 뽭jgB(bWh6U߭d<~{ɵG?/O'b׮s?[ ȳoT'Oq}+_~bVq?[,ɄAef3Ml6Ӊ5H/oVW-6az͸M;Jݛ(%UmXBtb5HP+*;PϪCpF't.\xC BF.v(AH(([h:MڋҴn| ɽ[wx:LGyX2lNZ9h HYWsWoKVGQhkONFAuLǃW//uz-f BD L0ilh4fv$j@Fson_vego-.zeg-ŅzϣD@)vk}e{k+gxsBoju]@$y>{ⅷM\zewg;s B|Cߍ cz}ԣOٸX]JO=׾WLҴl-3g^}ť}G;V?}BC87q/:gFOoIw3}+?};q@1jaqnw4v; , RgszW{~4Qѕ`=q<0A wn%r9D@ HI<1˽NeVq2)y&D--. \GȬ4V[]io6"2JH AHʢpQHY6.1-xd3ޒ''Ig@G0ݺjnQde |q0l~~[cyp߭ڻ~ϻ~?(|~;9w~9ߦl}WEQ>~J dT6NON)4v:+q m“'Ϯ߾ 5sƖO9q: @ ,{PѰIjHdI(XWJz,shzIUYRJuEB8,BQr]מ/ 0[T͋/S)0a8jEC+\e9ZO G2Jݕe&& PU h`3KGOI|O:oGvN֖+-C`1T;;ܽ{<_ZXtuHTCJV QX{{{!F1sɋ|l,˳Z9|F;7<3ϝg 6(HPT)$R""!)Bjӑ(;;qR&I<セ=iO?NIUBGzγ^w4M$);J zN /)f -dS\n+ `~q!Nr4f9" CFq]՝|+·JYjb8`si6GlFӭ|ck{<fjPU^oXv>[E1|,Et D!Khi,_^[j'ZYT6yYn0ɓfvu;ݞTi<˲hz着k׷ʕf7Ϙ #e&Ӛ 33wH6g_xuid i@~ cUUq!2؝ JxD k{oTjFҬ偬w[o\ 9oIřvdP5 U*qDƘFڬFqġ`d)W @ {1\(vE·et(LYjHɀ)Qzd)|04Iۛ[ֶì)P0dƀIfgՋ;S":/CGO0YYyrs3s8DD( yq媪ssssܼv<!4LL{"bƍ~׿̝w b5F 7I#!IU2NFwi1֮3BFJ d#-F—9z*(T nf3(1LSo#!܃o|+H(* $3PS禆|,@M `E#KBM$I0T-L1O1hOšqBs@2BI.˼QasZ{=t7@#$h;08MZSo?M.À5ՀeMԛQD ,jmN׷o$s7;qw^V` AeC1ܑz酳s3D0ؚ0UiO.6>9yK>6XN̾B03zgNkAxv =DfX AI:k54uc:z'1E>$=ܑ\-.IYeD*U).rc'Q#kFu3 FXnEJynKRR*ixB @@D&g@D$Tu#0u5dHJS6Ƶݒ0Zv.] x7R}Ђ81^+7ɅGn*l=یdk,ti: ./:6Ws7vXUaT윷7h=w.[-[+zg;e70&FD{'OzÇb8I{,Sk[3)qiYhwG=|=ѼټʹYo餷6^Ȣ @!8c"VJl&ix@mt{{};OahO2z 㱵s0[帠zn4vrP8O!z`ٰҮHidMM<K F@΃u89Htwo/c艓#$5TBYv$X] "G k$.-G[ s{n;,O D=!qZx⧧ JtV;aU'Is,AqQff;v{1AS\|奼,IJF#B8@hAh=ѼB7׾ Yۢ$G3||pٙRQ晐IBTz6I- Oc"{0PAFCUМƥFٳ=DΙ)FQ:8D4֚ B.ރsDvԱc-1ļT0P (kSu(UdUW`RxQDp{m„1g@HH" Cosn=9kṙkgf襔-׽F5!xJٜ~}c1t΀uIፍ`4)%v@f2xek}uBZ9YqG<rsg_1@[dJ(EaƒPAU6Ӥ3Eƈv꼨VW7W,Kq)&8zzL'?0Pou[Ip_[-+ dD(wFo9STkKi2Lh2z`@ u--yKelvj.wx օ3Twn}ϭqH 9lY$g!ֻS)b!LzPR8r>`'W.޺ijݥK|MebRfR#y9W l8'i5{naaq?M1ΚR D^UiL]~^ƍ`+<{tvw%du֔ &&Zܞ'?sBH+Ukm=cB@It  DƔ9°ϑ`gg42IrR<"M]JE\vzKP2mJ<\xEN%H063;{u.͆qjT\>Y653r8#ZYn״*0N#kc}IA^^ߚiEQj-U6zءט[;G DQ5ϿX^40,,J쬍_\r[F+76hayfWS3oFSǏ_~Sdgܘީ4)M3/=~Н! qIee:7W`?uYbg"rʅG?ybs{oyࡷ{yakWkg,3֠@]y(Mok{\Y ,.⩩F;˚qFB2J ,4Z3 !zB:Vi%;M#*$chc$!c:*PF<n@ȹNqEob\r)LYg= #Ii(L.]4;=NܟOwugGEQyQ^l%glgiZ䉷"_Θ|ݧAgm;426uojpl G]RҨ0Җ!2ե+s3Nkո5=rh4X[k= cD6N~`g$sȒf u0+Ϟ_3=D&Swry U`&cHW|{m50{ؑniNա@0iJGtO:&W*5s4" )W$zbTmy$H!;!xVx3 `H G \ ~p{uiǶՃs;u`:ltWAmzβ#{ۭ֔iz5ͨfHb"dr#P7'&tL1!x 9:s6k :r[+YNbms[ѱ3w$\;8RA dVH: WsF3Ş'7#Gϼk聗Ο vi˱ژK׮X:q;H4M|,eE{N4N@T&N&4kM&#GyH/cH$ ْ 6rGHWP,@J)7(Nb r.mWs"H$QjkTa=8gՃ嫗8w6Im<%CџL W76dy[ [ݚr֨4'qQTVtMhs&Jdd0i'@`ӷޯmm{.pKպr@<swW.tdk&$4Sn9 8 v'NOom3S;”ꍊQt i=Ѽ?i:S;g04pne}u{ggaa;NOϴ'iT׹snEdB0]];` 0j]cNF*$`DdicژV,ʔ H轷""9v2{"3$R0ɸxHB'#c4NFݸ"n60[ZIvršqn)l5ZGLتkLCβD94O+EQY 9|o0¸PcKӟdi|NL?n~!n;!%nFVhdaى;Ѹ,S7+9|/^cַ~ӟS_|1I'Nگ#<Ν;u?[n*DӚj2xrT]A;{2>xh7 xDb0NޓDWee(vh4:LB*1 0VW@r]3WX Vk:i"QU((Q(w޹;Tm;`E7H#e -8v+m;n;|0PYҘr}m49}{ꩅCN; cCv`[1UQWye,걫z4,}HRg7/Ea4{q@{Cs3[fCsQYy4鍣cA( BY'qȐ1D@H1ꪘ; ҇ͥK)#7__9sLf_~dii}{3v֞H4R !8 2z0{m&*q)qɑ' ';C"p֎뎨Ҵ3xkd}祊b/vx~pW7[kG Y G#eH)bsss~aAHND(!8qX]غ8`@7sc=?R&zY?|Sz=OSSS{rǿ" 2/DŌK}-,sy^61杋sNcq9c>EYk3m#T9T.JO߭@>?3O<7Տ|#ܹs{MT7nw}(^ZZַu|{23p71mqQ*1Uz0JPeY0 v32Ƙ:c)eZy>&``yij9WR(鹬d+$1.'@ft, 'wD4F[rxPŵIiș#o]OyQ}sG; sq QG~mx~Q1w\hoMv6F;jOQq_{!kw֡VO+q5rnv޻d2=! G@s#y[j'h4 FFkn \lt+vۭ}1K/>++^pvvӒ4g>󙕕G}ӟÇ>_8S_N}I9s?[kbhr!9h;v( (0.DdJ)y&1ΙR{@R&"xg=9.㔵ko-9=!pńBD20 @YXŸDULs.Dqw6!xZ!g6Gl%p08tp8R:s:idꅋdO&AQ\U+.9΃N;AZn^YByasn7P{ܭVBzF7 r+K%ڭV#;: Vow@Єg#`Z[_p˗nVt:=Qy~}MOOOOO]oY9ydY{JNSixUxhD'jڜZdG$ƘUJF#6z7uRTѓG>  ê$HY"`bX5s^.h m(MR&h@ DRz㭔bUևi*)yrۙy*GWo\T.;W٨(x;hdL p> 1T I `C.*i!C@dFC FqθDȈ#Wu.^[%'8ri;αb,n7ugwF.UGpP [i0f_/o^P؈)\z⮛a]K.1s__>7 Ws^y0 bhgh6'y *x${8 è WR Fƍ-,B +Y$D"6D Pv iZKHIS shg*yk$Qf;wE!)O䊻3 x "a|[/=t| J_;SXn!kzy.]mMWeȬ,m!ͩN#% 0 Ba0!!9yȘuFJi;9fW6sPr gYa^ü8ww4Cywcy(vuO=_>70Vv%i:tl4>oond=yoƉ';??{9O'>{?￿(^xɓ=Pyq7U /_~?qbh:︔B;:%#UT#=pf9o=V9"'$9GD6јJ)3;ѸFeIK O$Tڄ Gߎuvl=QeLѤobgx{b'qIMm -IMD_[z}y}=kԗStd o~uwz>FLu1b5f*88x٢{pgne:0* 2K$YTiuo;L2[Yb43yWfd֙,`$&c0I0mk=Kl7IQ>$ěVt?{eٙ3g}wݻg>O~7779rԩ]vG~[3㧟~7~7~w`EOG? Ї>>#O>=8?'db TAWWWQ4C?躮|8FQdԕb\rשI!A UAjZtww}3oN8zڵL%όwOՓb"HR. Jia`;n=5{X4=e]}ܓ_~{9SSQ<Qcdgaoo-6 .VN=}(|WWR hS&cK<yc1>JRt<}]׻gL!BJ}VVZP;(JI@QDE2&ںAJe y"s\V7qꙅϾt8 lCѵJEo0Hg> F`{3;kh&d0׎Qc}1C `C \byc^Z[YN:{g26ۥwIF@NI7rsku]戌'(z;+W6䥔|ٗgW^!խv؉%k˯{3{^ya76 i=Ѽ٢h*(8Is8N񌉪,=HIIADZ !"D܍,^ܷ$#4ƕO53j!8@emz$Z[ $O{8/{9x86TYjzb5`ڵnw+;N\.àue8n\GG8Sw`R$G#uŢQ,4;jg0 ZVK;-旾8 Rk=XquT-$:1So~.=c3MV33=}vqGQoˏvS?óW_믱v gE{=yuLj]dU` mc(Ͷ!B^WT&IBeY24k֑0\0D NG^{DF> TdQDy%#f #. $c_խgNuh'K`XζIw*" l#&7ۗ.vICp5Pxf ~ %ף'ƺi~^okeOҍxsX ZJ~dm(3T$i6;hLQj^O$U쵕;~DeQ_ܷ|cw޽'ޙ?2I=7{ˑT@6Ym*DӚJl2Ue^׵#7(*]1>u@!cZ[v^jڪ1~Q9Ad{LO=9NlѠ,!!YKCɒS\ʹ[f;qԑóVBI} 0rd({> p^]~Z4;e2*w=--.??ӝ߯#+|^q{.ֻbk6u];UFΉ24ɪűpwV%ceQJ)D RFOwM̨0{X>lN{_>S8ΰ!)fX8XH ERN HAˉۉ$HJ$Z(vͰL7y9gqF iR*.ϾZ{jmON'%12 C-e6(}H#RJó/^~䁻V 7OG4Riׁ*׻=ŋyXN+],vww2qجI^wjκ+W\xjP\p*li׮/.ԇӶb>O?w~{6cAJ*^Y]Y^^H%&SJ{i,:˄"%yβROn?\\Eo\~g#]l~^xcmJ|Hic)*} )[[i'j|lVхVe1l֖U5U{(\Z^)˲ʃtJD ak?S ׹YK%\ߖ&5(!&ᐳbz4*o?6uF’$33Uy';w,ӾCT{w62hRA~z;Y=uEYu0̲Gؕ:k7k.cH='eᠼxpƌN~vn$Ģ/(WJ!C%`lNjyR=iu҅Fi_VӃK+fٞ^lN٥3JB=KGt#&9?o^ZZJ)J gu cDº޻9!v]ǐJ +ƘiZ\*Db@1RJ!) q)ʍ?wϮ-/M0BYEsͩ,+HSqӽx֎omDq /(3þ4)D1KCD1|Q+yo~Ս1ZXH)tfƋ㪪,sϋ,FR")j]B 3suBD,R‰^:5 1!}s_pBv]ڕo>ŗΟ{=?‘Q(.,ˊ<:&өRzNb*{/BhAd2RR "]I%G`TJ ®饔RI!G`%$#X!k;MjAˉч~wvז++K ށrf 1$N!,Ufھ9%Im uMtug뷮qm.{ޭkvv5֚ JY#:[]dypxoDAY;վuKϿַ>dC LёHiA_~}oo}oSaUUMĘm۶,y!Yke@ G$h6h}vR5'gR9'!&۾F \6)#`"@% m ^z[q°{7aYdE*5J*g]|PyH<>knޭ( gNm.?9 $M1b"t'O}#W,"KyOu=m” F`蜋1BծʼDž!%T.${<~]3/٘F~S7;_}of] I#):‘kW`n{T4*ƔeJ$Z FA|xx5)e6!x4O)%@EB␀m.YyI`A$|bm̅=aFL.1xk}/R"IT3HHd>LBi"ѐmc!չ~^ܚ^ޭ,z1 mc2lg=LhNRֵ]Loj2W68"TroZ)@m1t]7 @)5m{?\,l:6l<\$B;/p~6ȿ~w_zW^c<ϋ]*es;I!+rʌbww666KK]W3f6q}'S4ĬH 2RJu3LbV͓'6IY@$FBHkR*1$"6YxkRd?T +eVePhCt0 q4-,,)tl,g Ԣ?X_?sL0xkǎ0+˽7o8s3zkgaa3#r8um"SZj-뺮uMpl4͉1E1B,nܸjZ۶sV*)RNj9u}C<]zOom?ߺG̥_λuW.^<#Y?2$ygMVsWn}wݶijXĠЁrԶ}<.M״ ?VeN:yHhLN **z9>7>/ʨ0|`pioM.ݼ}8;+BԵ ?baaH4\[[OfcbƔ&+AV1*3ޗec)cTJ)+&m~x'='q?]x׿zч]wGrt#f7&y>s.2ݕkׂ )}߶mۺ,3!if^"L4M %yQPRBPTY\Q9BRJ!E$(;NZ$O>tra|rqm5%ֶ(8vbpx8ͫ\mMynڦaB+u:+ΦY.-{\-'vqv} VLXs7'?|KĠ\XnnFyQK#pޕy. t]7Vu‚1iڦi)<#IJ,9yB!Y߶.%={>WӿK?Y/:?Ǟ7>_8#)7]7 R;Ű\\Y$HBH) QtE11fY{)$M>{n?lOG{?_Th J lv7k^YY}wdy/|8KNJyၐr0kɧ>?쑢9RKk jLu0[[[ hw1"ֲ\5&Jınx\5"v]c$"f{53Fp .7"Dfd!aJ O\vly|vi F3Kt2=;RwchaܶJVʢיn7;+Ҹ{ k$aԴ=}:qM^~mx}w/^\^:jVH* U 6) 9WZHCDm۹ 4ZZi[DN!dۿysoyyq\w?/yCxQHI51&-t{S/j0L1?o}OPlb?{Kˀ0=<,P4 ~9R6DȜI/plm:LQ*@&?CeBȄHpĔAo&syQ!_Sl^xG?ğL8XHs#ÿCp}I5Ie& Göd!RE}0]#m[}$ B^aL5:C⺞ !2s-|՗A"G ! Y٧_N/:2v:XYra]%r7D )fM]9# J"!RkqtnLQP6vO[OjK}fce/]v}ma!9I.UR%ND46|2-%n QJ82Ģ,gv8^>կ>}3ȂYB7~;xlPHʥBhb?,G%yW/_)|ڼ˾n^+<O?})o{?F_G#>=SN_vS<~m}O:/)O|++?ľ> IDAT>?FڶmXaum?f7949P꭛Q۴]B 3t2YX v,B κABع}t.H8H)B6DdR{'Ŕ)$!"C.3.=tvS[2K $+4ڦZ1Q46cu1No^\ n} a{SLpZz{vxzYmxXc/|xjm̴3(ٶ>֚1ƦiRey@0/̲u=ԫPdy;[;H2!z>A{uA$ HL~SKn㮷xeUwǿZv;mۦm`0o?=^\RFS㝈GMGJ{)p<B0!B" jdl JɮmH0sR >mZFs6˲ &1R3B_}UI<krU:1٨R ƮGοg>Kw{nyeHclg{k? 1ƾ%F) F{?QQ\Uċ BuJJ|׶')eオS*9{$,ˌCH!ԣAq8;$(k7o?~0ig&⽚8-8uHmWUv>+] Y}?N!XD*RG!Bh"CRRYw3ݙE-wcۆKJ(@<0neŵ+;I)&ZF+TB4 s1"Golg{,N&_ʗ~'O Ac}YU?/᳟?Fp۟yɕuԟɆ8B|j#2}yc "ynQJAb:k$"˵R=̹ܙZc !$1ǔ!I}퉰DH>rR#< 3ں}F<1*̲;Ѧ d^YZJ1ڮH}d ѽ:)s7@ EJrRgN?e"26~:mw.s:܊QBy\{O)͟&DªV%!۶pպi ;^%y৞zB{kOںtGq`xm)}O|uV6Q{,s@Qm<╗^jvl]}$>O_xa:]|ﺥ~rxo<~w#?47n] n0Y[7B#)%etӶAiZE!$$$^GʪmۮkʪLV]Z)muSө09߯n_l:Jyw߾ֳ' pr/"χÑKF˯~J`"K; qO(0epov1Myҕ(*W^=/.<+<*-D>ʫvH+BA Q:w6U6%XemHpO#2s.0OI!i")s{.2M,F]l2DRDȘ$)&BVf!}[Ͼ73յ[{x]yg׏mzWmߗU5mlwo>pʝw/}6OG|}&_ |{wߞ_8_y|B14?g{#s4_nwg'@RH!  A0#[bDTy)q0QJzo-j92*b:Â9@#baYk#7ǙTlGeebw{koo~TN'fMZ( cBYfvFBt2Wn\ʋ kuK%,*51PIșp.#31}FUUa1;doqq|xx HLJɶnJ>l3-۶7*w@DƉٿ?k̄HEY0t.,o&<‘#Ɋz2qJ2:󠛔b!CB1b B0s۶};|#DvMT}4mYR@~/=rYKɅ&̅{xv *+Bı,rwE1E{;ͼ$0ύ{KJKmp8Lg z6kX[] [D[B ר$EDML&Ӄæi Ά8%F1sZKHŖ"Pܗgf[zϽk q1έZr ) )QF#)#G#C`jk7v;&+kJ)%k-cye煑 b BRRk~^mYXX0B(Ѡ(`8Jgɩ:>`$X7n6}")oA "ݺz#o+kK77r)aiCׯmOT]߄hqeu L5}T:%99;fj* q}]B(B I1I@ )#⠺CJh4 )`:7oMv2vv';Ek}Ӵɴy))$cxU!:樔RRLHМ;I*%CpYãUI>#)7h!)K.QiM$dEUYT<#D׵u=뺖EΜ12|u0Yn\߽ssam\m:#SjS(M uu@R @mw{'0*kVL#!H^Jr؅BQfY7mk;j7C*rLs 1 <1I$ 8(gw.H)"8QZ|~s6Q:~n#0!(Xu۶!qpO3FcS`~q!%FD$!DJ)1f,˘:-<9J)kRj^f8o ?#8rB%>ɵkK\I&(.2S]_/rۈH P,˔0Օ[7v!2ˌH &&S(^s}w$:7,x8ݞN˃Յŭ=̑Q!$<.@BJbbf@)IiBHGMIL)= {{{R`i<ORl."6s> %EsBwS};wA9Fζ[[;@ 뵒1x(Mo̜{7gaf>+}R2;G@DFkk'ֲ, I|yo<A1f`NDbOgDhmyYJ0c4ۮuD ux"I./A5#`]eYfyuk+0_^,!|wPIiya  )U,)8ݸ99| ĈA*>" RyBb׻{SDfHPTU^UKKRʕy!Ǒ!6h$󉹩mn03$'!(A1‚gfPVSvm@Ss<9EA `5wY\\.re^+Du^d?cn>K&SJgma?YsIo^[Y^Y?:&ζ[7%0!*IYǣRϿ|ĉ5BHy&Iyw] D1&)(HHd!FʘW b\Z\pkf,, A4NʪED!(%C!eHJ jJ廻u=Y]IZI)R1ypL cǖ]RHص]bRJ*%JD4'1!:VJH"F lW2һ$H *ڶR`f6F{!a:/],430Ta51R#ÂSeE>eJ)Bv:r LHN9aQT)%k. By2׻1$9b"$㷾O{zB<Τ]? )c"vdiwB jA4i85k-'B,0DBl6y9"c$0(+&W_8)"!!`J0@Un-IAD!"I),0{cBybޅpHRʦi BODD@M&9x?x@"'#ctkk^x L pfHr~3)I`, |tp9svcuu!L^:0ϋEPJmWE]7"&F䔒"'}7Bc!5,\Hp1پ59 JA ^kEBpʨ)h,!dSm[E /. Cωj^cYB4e߷U5W(s)9YJSZK!!ƘeY)FB5(2S1r8JUxS &Ǽ11mee!kwBR )J"/bDB ʲ N:GT9)8۾7ڶ1u XUȐ^58݃0Fy%<B@s39g 1t+cL}z4YNaG߻i}g| کo녅dckW'ә1 9yBek }ʢJJ$9ٛLǎ/& 5 b0nŮva5=-_s[z32m . BA`lP淶 , )>0s$f>88ޚLgVJI/ Bz9;ʲZ.R& 11Ř`U1FOJ)ǐ Ak\.qd ߶{#@+c1Sd)i|fA!ݻ'`yHaB 3a4{zmO=qQkh)S? dbm{<`E;/T)e.DFRͳǐOݗBis9@ sv]o6i(Q$Γ1̇ȣLhXSk|q,D !e$Ҳ{v| ;T]X.Ҁ3ƪJC;gcZ'VRQ]JjbfYk1f"僃zhZcjI=s䪪zϳOv>{[0?#O=juYrٳ!L {~wq ny20ƼBT1Z-dPk6K_v, IDATGy]@(|]޸qr:c1Laٝ;/6g'/;wqn7$l6V)4 z4ӓBbU)e ayfkcbR)fu3&C %g[O!si۶:DpM_J)^6F+ 9O\teRQXR%8Q>笔2u )zv%|u!E G~jD }9`!LƘ4gu[;)ljQ_GqZ<~T R ewv-jqrq pΦ9$!ĭ9)I!B1X̉7y۲VF3M܌6mz۾aoitt@kY= Hdc%<3fJDqRW5LJ/vi8RUҜ:3ȃ2g RwM\I!~L2ΘBƹJ g;K92Ƅ:a ,|yl[C\`\}?Oܼ;;ȸ<2X94=/7=X/uDRӾ޾<9RF;=V\-k&L8ycsJB1F+<]P&P *+`Iކf}Q]RJSo~uq:6@.*b #AVPb!#c2ȸp>(-ԕzQ \\l9n` x g9 ]9CZhR3" JIguD}Go^~lcYܹ|]z7.)v@J3d: d+ BTdxȏDDJsƱm[.s)2N/_>t.\o@W >a2nLW\ӒǪ!g y Kv~x'bt#R(-RJ{Ɲ6펏FuR r (^ܟUSU;SmcZi$giF)eYJٶ-,SHso{MӜsnڊ1MHnQL q)#c(0%ku#G=PxqͷxΣJ8+]CnJF(sR],BԕRjSM]%".d]7Rj!.RBWjyXvoꟼMa-Y2L6M^0նK@F˘@!Z=Q"RSLAkS$)ǜ4!Xy&Viڻwm_J /8o2וlj"SʖR@D(!1(glL^0^i3C*YI9uc`*)2E)4<۩V)P`fss99gƘQVJVY,US%!y%ȌO~,߾{Gf74ǟ|ɧ)FSȁNO6oܾ?=FՇMzrnڵjնJk1D68)ivjZ.Wz^|)\CiMreE8 S (+kq쭛G)EU!xJ1pqq1MEifO?0 ιbUWuKHvbڶmUUJy0C9_iX B:%g\.`9ȥ4\Ru]M7M~vaB9眲> E@v!| 4[bc)&ĪRLiNW5pr9Q%r-B u\tw޸C~F_r7֍uC(r2DWJAuST]WB2l|qSiM+l,x:aJ3?W^吏ݗ;' G7oܬZJZg>wɲ=LP#VRuzN)zOO^֝;wo~|~?9L @4Ƙp.6<]S/nĽxyf)uZgL9'F"igkMrn71i?'rY+R d,b-y4"Be~up]N)']_x1:)2ڨqP;K+wO'Z[v>>>꺶 Rn\2xRHgٙڮ6j-$L@cL9gSUZkdXDRB"4MFn\}ᛯzbBz/.v?Xۦ!# )/~7NZkDvM911D/cڶu}^աa~SDt58RkFr&M*b \T9UQZ u$þ͛~msRI! +>yr}S5E[QcXʮ!g9"L29Q)gB1&i>Y <J:k{_l/]Zwŵ뗬9Gʀ~߯y{_~<ĘsA9a({:DB9A1sJ DwZI.MbJ95 Rn딒TFcp8g!xb'k-?9tp.mf!:]וg +L0cU֏aDlFR RJs.rE$#꺖RjPEHD> ں?1UUY1@D1G c?ALLU;ͷN]}T'Kotr ),S,% ~7Pf9nTUu]71FDK].>cI z vŹTvGkgz%gB_~'s$t>9#+BGDfV?MQ 7nSiA.ؗts)& lO4SO|ۉ+(9 v9B r1i%VPPwtG;W}A*YUZ(%s~daeR*!TJ{o7sl{PADRJcLαD 19DgRRWJI!rJY99v1!x4]ia yv1c<\`94M<-˳3\4D$ygTy-(~GgC&dalۋͷ"刃gs/-?Woyw|Ƿ#:()rvZ+ebRJ 24scyӰ5gSW/Hyqj=;g盦!ψ}? 6Zpf7,ȹԙ;>..!ѻ(w2pQ !0 1F)rX0tmsOj!ԿGCiJ甧H @>JcX-ۯv!R8쫪:;(e8FAP;gf4sQ<\IDt>NdȬȤRעu'$TJ' )n9O>?wNw>sc`He&$UƷ^fr^j1{_| _RZoC2O}etZCJ~?pNs3p&R~c9]Ws)}{ʕqL&J e"#YSǘ۝Q)vǟxs5ffi.ƽ;܋2y""W24nLy .!q.+W[o~xiQ7)%aL\RٻP}sd0~7{8\g"ƅRj? 99HH0#R @H r R B9.#{_ڷ2e)y]_V ,:Ya{RTL9gX !O E84Ni'BJttpp PIv+%4y0֎TCK:ND1B !zbL1D"Pw)e<i >iuUaF!s.VU%7眧iի1F4WTzEJcb(9۔1d)G!8"Vi8ժ4Z"j%! LT9D\k829oբ>u7^{;1'v対nko0i.#,G2\ RH)e7uW/1 |gK$sҥKfﶋn%H1!d9C>:A|rN9]}3.32GʴFo}I)?@sw?tn ǞlmUp?z!SO pC߶5>S" |W1cG)K_ny k0 =o'f gFG?@կ/0r{{n|{_11r={]tuSm7|) Bgew~=ҡ ⷞTH1 ;x[,=+go~n^B$xw|ty`eyWUZ΅iWu[_fsTF@)纮B ܔ2d>mWD䦤G*,1 bU!dDRJıdD!pZ4J!Zk"\ؚGGGιCJisΥzRbWf97 !"oqΑn圇D}7MSFukmqn'()29&8c}>L-A@^HZ~}:c}5OO?W\]sNsY ==;D%,~^Ư}{_37X4qcDJ1"Ɔy~ljth? B㏯~! TU'x^{ 7t޸{"9_\ht݂ b2zhښohZձBr3o6ղ態{HT7G!_\*0Jkq]soO?Gǖ+^|n=g P;9b1XTzuЙZ!uTg[un܊?)ͳcL(Nڣ]my9CUiDR=<: sUUš<(O}aif>uc "iir1cMvR|Y*)f:)ʺSaBl4]vs~IӴE?cIDd}? µ@r !v10A8vlVZ DS)i)ɇir0fG)@ 実NN/uįrwu]w9z })yk,EEv;W^čqX>O]*@+r#;W7kwmo0ZTD#]HZ鋋0 f{v}(9sEb1j,Y/_ė?Q0ƙ.SnF ܸqݹ}{?̳1CL9ΞriZU6@'''E." 隺2fǑ1BsJi !\ e`e 4:B£NOΤliC?\s-|\|O1Ƴ#; IDATrPXRfC!mZkc( dXJW~Bq-z}ppPt]u]?l0bcLI>1_3)yDZL~_>vgyCp82FINJk-sͅpi[Z/M9ZO"JD-_,jk纮VO(0R 6f\~cl۶$חg\~01Ɯ1 \V +e,1dMӬV+1<޼R-n9( )Arr>Z\Ҩ3q>a֔I+-1RC48s!M%]9;tE^.>y8K9v]# x9Rbq/(OrWL3&q "8%Ds1dOi '32ΐ@+ QA)3MP7FkbLs,quﴲ!Jف A3D!笍*D3Qa4Z@)4}9/$Rr K)*F VJӨJ3)!G9W9}$O܄|c,ChqǮ9uݬdd*92șqL%/.vƘi CK)38  x9c g;UuED4S3Ɣ1gX,Vi֪i붫@;Gzѵ cE\u]09璅R .ύT+-rgB:gLQ U,OIIz{g(g,dGȴF<]88Z{1mS ɤ!"1OmT^”,jy?Jp".1r~9]AKb1Fk}y-'> `%1%ui$t)Tylɹw`tS`eV-Q.nUڨGD3VU%SJF瀡VJ)1Rkgu 0H9"Z,Z˔@1X4"sq΄$,$/O5c?DY=""R %+mY{y}=ĕ#{7+oRf:LB98qZjTJ*޽{0\ƶifȼv`vvm2067׍N>|kVm-W/-bP&b!kWv]uO?*SJ5MSbNŜ)e8c9&HA Ui.yۧoɽ1$k>w)C9sJ)}/a "4s c}ߗ̡JBBPw1΋߾Bc+5L%cLUl{JAi-.Kb0 bUU3}SHȨ /@\-~ Um` vMhQ*#oJk8)%b=rH) !N,,^81?Dr !vR,n}x\-Rmikvw.]:w]bﭛb3>s4֚4KR < ;gU 90[r{g7_1gJnɦ"Ϲj)爌hJXf,1`H b@]?s҇⻅Ȝxc dDd+%c"wf)K2vgDDirDk20J)R [ ZӛR[K-lyI a*MTRrXJ9?xoKR^ K˹s:ghڶ"]S+CBHf!%,gm۶{o8imn,ʪ{?sSLQ >E_W 2RsSrW\1 (x&RkUUŘ˃*TlCMd*'FBb Esxxp-dzsE|gh>\h>#EAu}- #Zӭ_xOꧼ/WPM*5Ͽ~֍64]f)hQ iJiݵMhBn72BS5%ȹȔq냑ܙ-g[fqƘÙȏӪmR,l\3e"S4v;F78#nDV飶{| >& 8Hsw6ՓsϽ~g.c(DĔSJ:MJ]jͅRJWR4\J) 9#UAdGdL~GDmZ; ƨa)c 4n˿XP <=FJsR?@ʙ |T>H`+B` FڮI60!D d%DD<8Xc1z%cb߭V+)4}?4mr3%Y#v]Xtۋqrenr>k~GuJiǺ2!c ۶v&clc M3\NJ, lumm[!f.63`6B" 4mz7?~+GՆ|ꌒ3e&x<ΓPJjU@Q19 !Ę/[L2ϙI\(xifkcLD} ī1%eiwW(wGٿ Bb2[q)1&,ݲJf !9sNTZM?;M߿DMt;8ƣR@o [ЛT]]ۏ^cYpPCu9eeUWu˙[;))_׭;PIv& GN(@xknPL a "Gb,3! `.D"0Fk~l[q.su}9mvw'[ Q)MB"x  !B(}皙u9.rNfJqpJn/3$z&_;O"-Tk4cHk)<*>&ihYJ9L)%3m]|szq0UuB4f ! Ǐ!Wգʹ]Z l6~#4M}[DDH5nn} Zk^9tZeYn #!xbl&$3xh:hDy-`r9+G!r3Rͻ֢vH)봝ųv\] /[[F64+Hl.yK.d qɼVq##`m Z0Eoooyqx{{_|Sm)  s@2JH`@ XO<87_Kܬoٿ0NDnqJq rR0r]v?ʾ?$Z4Myº&q !AGn"h- c<}6\އ}޾rލÀRub!_Iv1eC$3e=|DUNs-VیC"D@aEЫۣ ]jd@Zj30f.rf%818)z_Rǡ*"V/L?e^y$j|9R9*`\g3TJYkkJ˒Ӛ6MƜ<.8$'Q.-0HΗ[i(lBbS}M|#R`LťR; QXEjR71Ә*}ѯ;Ӗ`R*o 0 j_n}U^xw954 :{FvfZKMղj4g9/(-զEıgb"BT'gZ[i-zbWFX6$#35005UOoz_mLYkoG X,c0ʊUH>֤b4@N CtJ56qؘ IgfsΉnws8ܥ88s1hdZU5uE1"cg LT,_Nu 󒘚 ֔qt.@^\ *M4֪ )b0e0ݺ㭚"5)n<;%8PE+j\kZ `k@[s:4BfyQ5|^} ]0©R2}xWtwKdf 3ǖep{Wˆ=NOQtš$rnP4XeI?9l[azW&fh"n6*-39@yOѓGnY\ڋ{;$w^ښ2A6dD@5~b!T1k2:_GVD_rHJ)ޓ|<_t=Du50sa#8&"N8ǝֶJSUUК xHv!Rv;y^!2_]]{V/v;\O4q=Pv>VZkmh.&5t8%6{Ax{>M Ksu 9ocʹ5q"e^YJ4iOG/MCψ@ښ4/ݛwjmp 8uX+%'rk+VmHDH1Hg{t@ C4D,Uj-kZ,F1zhgUCa"Ýf :;泄1fN9&FyU8t|+{1"]Qz<^0n_ߟN/^ON Oyi" 6S-l魠}qQ秫Mzb~ӸrY+q3\.'?:⸝χ0TDLE*#O֝h*"(0{yw7~k]n;OĽO|ss*!Ј39Rn2/|0NCDq&t:VBZ̈0x>T0Us9rzJɪRJ*x7,k!{؇>|Ԛ朙7co<~+~g1ƴ&)A}9)!3lg#w9tyv\[1 c`}k-!ofZvEDZHnjm)四 B7n 0A4-cx0Z?  $\ʋ(4"37!F 0,`W5Zmʹjna2{^CޱĨڠdY-q0Xɥ2ı㡽X"?6`l]?LޞR:3mҜR&tf4 N;Oj)ݗRK)Nj4*?7L Itށ92&܎'@"[94g"vИs/n~[чqJv2;RV眑VRi1piYl'EdDiv|9C8]=z~aJ|?G1SsҬ5!߭ay}WNS#TkD91Gi^|\e7_ `@H@ Bff*fur 9=}?+OTHP:zԦ䬽C\0-KV"3C4iڈ{JD9z*Dȥs~Y.̬*:{TA*v?nUrsJ^z^TJkMBn6fs#ֶ{SN)<Ӻ#R 3nR\J"TUbzo=έaT"IDTy}$^e{.TSWcLǓZcҖ\Gvú)cpc/H |:y>i]u5%L);JzpjSadQF@ۗ:ѣV Cc}3vS-/|n, nJyMp` 뒴,;AUs&!TR(ةJTkJKݸuriMM(*YP @ I:Nrx*u]yV(P;wwgCP"0y=+̀x"eVȀH[9n/K]K55Sv ޻ΏCX]z9"ҥ6 a J+ɮ4ʹ1̴6}-5ޅZc/RZ~1k1XJڝ9瘱5kg ̬DYM t]f8!viKΨ֩<k6U ﻹ`pɐ AV`_"f[Z/Ckս f-abCh@H;nF2VS1!lz>=N?~f+_Tro}ojɦ.^/X:-W2<Ě4"slw9WuRr.c)EfMqѫwoχ@ujGÏ>||ATIHIi u^/ GZnOnOZh>x5Ui&~ٌðkmrɄDj-1ƛ'?{{{; CMYE0`TiǑI9.0 a"l$L֢8Gsm}W)眧i !sW :p89ʲG7BmY.c(*`SE;y>: ԃN*5jM7h-v;M[D[z?朼wΓ냣/KfփK]֪Yqp.RO~q>0π^Ukm0N.qZr)Ek+}z<%"ZKBwzUm@B=(w* LwTvcK5Ӳ[ӛ緘=7~w+j*kngii%c)nƝ %6B#i *B-QX014PrnYͅ |ypZdfCNQRA4tH`]&rɛ= 4ulNϼOL4"3Eq:/33_&A6I_Xw'|z/89"j uχitmz4NW9pvwwpolf ӓGW_Zr0|c4*`l4^~rJ&њ~qCs6 38R]KKޫXa6lfJ?zvO JFPn:]RS%eUG^Pb)<ߟwPe95r )D$1z(% ^^XܤLS,E9ZeG*)MD0✋1ԕNۭ 4[eP`5x/4)unՙcCl"9Hjz8އJ6ck-_?^ 쐈CmuS&oGGRu=;q7L[113]ʺ/Je]p bC'^8|y`IM rˈhdL [3]8 > -"]6??h֮7M5""o_{u)/^k)hJVjk5Ty1֜uY"!Ny%!iYr^s_EVqz ÓM H!)#KŋnFιaI'8Gtj伪\zw!< {^j(X#$CD!G1zG"Z:U4C6"v1Ï?WK5!3R2<96}y]dއr-HĈСL.B"Qe^f"y&¢jbJ9M)!" Qo;EG ufZpRs%CAɋYSJ+`( "g[D-&f5VJ\|P%(B֚ܪ04T uI(<Dz?UErl*jRj 1(4@ &(MZuC3fы?<_4)_J+^)EӨM@58:fQD4?h)tʻg/^}< U َy q?<Z9 uiɬ&Mp=$.ujkY9%S=jpҗo]X ab;\OU^ɚwѰ8HE9)gow/5"ǘB}E_Ϡ.ɬZv3‹/zŅHY9Lt\_,K*u>N6A=5ɛ~DZcb+y#Aas v5'3".iD.Dt9UձZED8"+Z,>$b`8lz\2'uYK&T!qӊUo9#`-4m.1M9n_~7/΋0G,Nj6ɤ 84DxtsDnP=n=-(L\ x^̎*ȃ+Ʊz wyN0Kk-sB$}V[Q\r<s<鿴oxgzvhk N)O&hSp`dU 15\%ubi0Z-T w E"4$jF`r)r<˜Ox*кZ4jNTۙnp>.$+O~fdfef{UEU@TgFpӡ3hϼ٪ "`i1/~ն֬\kZg%O\.L|YYQAKd͆]?~u<<݅?w(2t\㺜3<+Y }a3r*rV*{aa?>]W'ID\ݞ/1z21GG՚r,/җNsղG_ڎ'Ϗ~z 3DZŕ@D#R7讑Xj-Zwai 9R=Q{s.mE9R5DUιu͈kh˺TS3N΅<D{?sXr!nsGʹ&g9>[J=y6:|y^bDhS[ e9ZJ ݾzbާЌ  jY%&3\sn tèev=%4%"t='{mQAA0(Ϗ?H$"4\YNGW{"WZ9f)w!,(? 8t>{q5͓mn fJVPUɞ 5#>}|%rh~}P1&FDSC$,'{;9c4f}`5iea̹ M>ckj)"VUށ4MeYSJ~o,kө"hʦSnY/HDtlڎJ1Boo%2G,gae# *@kH-j˲5ޖRGuD 8-"r@ÀC#I}-loҤ?QZ2=q)=i^K&D9fLU^ Ԍ @E\睙~G?ȟ3x^>\S)b` !30ihգGf6$6$ U*n(|a'(|:M0F?7s .M칕&ԫ0 .Aᴽre˺{K>~f;\XŒf:܌'5Ֆ̐39cj>O<2 8ZʉxUMjmӸ13s`jp9].%WBοZԪPK%j cԚ80V9ividEԩk!뼖Zkޣ3SG m bu΋r,˪˲X)5ԝ9؋*XI @?v|?k_?K_s)a; eYDA ?;YIENDB`images-actives-html5.git/doc/images/params.png000066400000000000000000000075461250410645000216040ustar00rootroot00000000000000PNG  IHDR ߁PLTE2v%^ #W'Z'`*h *j-r/t0u.b2|1}4x45 379x486v6}:::<9s=:{=k?= <@AAABBCDCFB E DFH DGGHEII%EzJJKKJM!GHL IMNHMOMP OPP NQTR-M}O&OSSTQUPTU!QWR.S[X-U/VZ6W_+[]*[`7\*]-] c!_3_dE^<`D`;b&foikCf6i#lCiNgEh0lFm-qMo#wJqHqBr=r=v4x8xQvMvWvCy/~>~]{Z{Y}Ld}PDj~XcOGroUkgpPdR`]w_ewmԁdkp}‚xs܇·ɍv偣}È獪ԏϓɎܑۓᕱ՝ɐ霳ї啷ʠ֜ܦҘ퟼Ϟ覾鯿Ҩ߬٥׬ذ߿*CtRNS@fbKGDH pHYs  tIME )ة_tEXtCommentCreated with GIMPW IDATxw$׍7&nں!W;4Lj֫o2LٕI *`JZV+TGqZ~hkQ[)Z TNۊ?!p&:`?~{\.Wz=.#ѕNDWzD>MVd5YMVd5YMVd5YMV@DX'GFO7lV+v%Pã~^;˓&Ojڞ6oGHn<+ XъR,O&ՆM63$gh oe}uWFD=r\G*XN:"&eYXCϋfV6g^lٲEhzMKvV AfX hLfV;gP{}h/Hɝj!kx^/VeiŸpaJ%y}GY,Dd([XFH+> K^?ж5렖ۜB36}U}w~?cFnߖUs%Kvl|x!"w#,9zr[x>?)0 }q#G[pT[f^S{t=Xl|XY;>~|mso>yM IG'N!\*)O wJ ~xŝVΟ8(7.aTPgX-&5MȰ9ŹXz|[}Ta)(]݀ F {S!ᙂjȉ!@8?lV i(RBh}nBoC~D ŬXTD9w/26W B !Gh·nYN˚WIT͑UViL? @f6IdUFWbNŞ{hJ砃{|B#*EEq23HUPWauK I%BXy0_;0޺5 K'ɫ8:bQ /u@_i zlNn! %PBS%,%ȐT(Tanƶ3Z{6u,Cxx)Gfד#D'T 6xg[ʯR3],}^)PyGEYTjzCY,Ӡ(X;gmag{ǺRZ1pY!Z<+KGCgUa鑓Źc}nnm +{PH8g']ZAkծ'{fmV xbiz 6U;ϓĕ;u%(h+RE\Hod[3hMˉB: מ7zbtjР+X(6i[D&Pgg5=ZAУf^;: (ź9-kt F`Qno<6tXE\aSWP'^e zXo#\vM@U^$nD;O BzD"1e K5;k5zTwhύvD\L\] u㙿 3n7n+] g2>$;>D@D@'>BF'?@AEFBFK!B"CHIMH#E$G%GOJ PLJ Q(JLMN+KQRX!Q$P%N$Q&OV(PTW'SV(U \W^-T"X]_a#\e"]%Z%\_([bb,]b ge(b*aeg-`j+c#di%gn$j#k)im)jrp'o)o:jwu/n"r z!v%v yKn}+yFq)}(5|/~Hw#"/$H}9'4),CM1;/9$^D5K4&*C4C8B+*e:=8GJ?GCKU@DwtPMKXZeFhKSV_^RVm]aiZjweb~ofhenkiqoszu}mwvт{ؘ݇{}܃ֆ܎٥ވی՞ߘܗ؋ߔߟٖީߦݯ߻mbKGDH pHYs  tIME^tEXtCommentCreated with GIMPW.IDATx xe `qm)bp`:"VAx`X ˸ ]f 32baڢBK/;,)t&& MKH3 R*Ug94-Z2^M53hȐ =jǞ3g֬Ͻ+V+/x^]?/ol;/.tWTC|\[`'DSSScKl[[ǧ!:;/vmt-$Y,:>4!C~x `,_AŋxcJ tCVruTcEatmw~>ri7Kzd ~,4f=z`D?bOX.b,2t \?W Hsx=.}r6J_Ta4CdY ZM3%k&뱩^;w\rYv.Hd:GL Z{mSKS ϸ}`;1|}idA|Zc0-͏0SPSb}*uۻvfg눮b/,2=ja$)9] NQ>w p%l21[F5a"Ɯb.]ST ZWVHd1mveµl?w@v,dCyYjFf4Dn<.JKK\kwkcGtGz]I^2@BNdyyX>dSm%MtD qc#RLK混Aa3ZF;$XRbٜ]z=d,6npL@c<).Xz5mzP5opY'̺Ғ} `sSs=60Z<^qL2k"Cт3dX|m 2 k ]DOv;j-=%d3ښX?>Ad>mA:f4ܮv<ۈ0@S% [!azR;i:nWäUT!g+T<(l" kc-y^fQmQ߼9#c6QA+!X-E=r6++KKJ+ iE33،$6Ɗ~b4mQ, ܅ _ĕ\Ul;ܖS>ofԂqWkV%$}Qչo_Q43[}怴v@k(FDĐ&"5KZb65f e^7:X2 UE }&L3"0 gD52Ka ~hQ; rr1of GNPV*A:wwLй5d 4D ‹Y͡e\AZ5/XLOP]2z\PP>_נP $"<\7H}NCB F*=XSZcÆ Jk_H" 8]y1+"/*V!bAeuw^~koa6o=l=.Xf^QQ!5N"ѣ,~(#k'c(gT.9Vw0gjR 6g6`KoO!XCr:[SW,xΏG4:ɢ*nx] ۑb̷y9Ʒoe.؇ζ4@imrĊ0a?a gw"HvhgTjjL;wG~V6Ȓz0e-':BVOsؚ6ރە'ӭOϷ똶O15CNm9\ ݆a kȑbaLfs↍wi!SnߔSsUl9)fƢ ҳm>L[ ޿i eb$ _CqFوs> H,CaM^Wq FvX"[d:uXPuS:X.}-&F&NFuCP5y ꨴ8bQ]8?Ⱥ wX."\ƒWa cDu[,u}^<Fy䩹hYC[0!Xc'@Oo@qamE(l=đΉbi!XcǎEVШ}gu}ݧm]7ڭRt Y3U,KV,X.@YSovߝa3(KfF khY] 5jW&S!q9w)`x=XZV^C+>F 3o`%"j(V̖Bؒl+6",5Uwc!OxEaa/2juk;q W S< S +JY@ v' 5f^ksGC(I&R 6,f$U 2gep&B xX= 31Wx{O3VSE*&F"'ûfwe,$G WGW6ШT+PޅleUGTVVJ o`U.(ZmDYzw١T['h͖ #UamdO=X2TATvkb3,v-KX@++XZl1S! WX!a=ZM +}E dNMF @`ZV^ BaXGOa6WW V1V ɇlAş fCbF*֯-/WX55誄ee*,k0T),Y!afUWKJ,)(RX v,+ŨUa#+$ccL2V5dQ\*(_cmѽVk7cM ]0W*M3kfq 2V SрX#iQ+?tHUVVV~{HL`QQWU0sYl3%THC:X|:a=ACICPf](ک.ӁQ"?/aܔuYTf)ˊIXTbV1-c9AY4ҰOYxjCzCc!Ue |v~3ͯQ`E}XŐb@nˬ\Q бzXU_CH" ^dj! X=f(i7lVY3 @a<;X];+2,ruܞ?cAd*d0b!}Li@*kJcœ=ڹc;Ŏ=e:YVkfeㄶ E;@Y1j`@wc`&֞=خvn#3;v٣|c<0o`b8+4}뭭kw֎r;%vKlj~,U` Cz{W*33s-[YYyu |@Xco[Tڲ%##k+e p*BVff682, v rXjΆC+wzXoy-rdlO;plKߗ5<&7nϔӤbc +Q666,yHEܑJ Ճ0da%g+&4,( DMoIc7 e^!햚&qRܿ +-- TزV^a!м [[=JG0,xix 9t#fU}?d|8ag8O-؟/*U3!+]a0KCBH.: cң?*5k,.YW7mJRq#2gNy9/eefneF@HP"66:1uSX`ҥKVӷ " ӊiU0HxEؙ3gN?>}vsKElTF-`)F[4 r#FifΟ1\B+L ;#k2/.<]ʸ"KkX05oLq#,p{dG_ǥʮ,gjuk,zcS2'_=\=XO]%o5|(K@JX-XF,XԬZ͆VTҩXkcy F?}3p曆QaM4}Of.T֮٦7aVZ&֡eBNjYRS~7~ ~BU"S"PF1 gij,x@&'/眕ooOL{c#\'l=/kY2e)ڈ VRuk?KFȀu/yU (y5yϮU֭[ueE sn՝XEX-k 4_VTqb.n]FQHz}2KkEjoܢ#(K 0 Vdؓ B 󑜘(?h=omjݪ_,8KN} (U)Uʁ_E*~?,\edZ _rl=8ԏ53ُū Qb%SEWK ג'+539E}TjV3)`']r'Px/Éacfҗd0%/S2.V*eksIWq7v% 1=9,JfgA0DU^-Sr"gkpΚ$~VRk`c\̂O UʙL$EYd%d,LW2ߝ>Z*T,*nHJBբE3HJ7o^BBlK?VȺG Κ5Opϖ{ĊvUT!Y˂u_TZԷYJ1))%O㈈-ϑXfg;`;+vR|b/,f0;œ%FĔV'h+Uwn KZľg͞b%'f:b.7z:$$0Wh\hdDlURĂ:\"Z$%)u՝,h[v, kYz[=Șm%*2xDHU||lQp L0\r͈Ib`%g5+>LaO Vx@7tWQ?< +s;< 5-8V0)Qd꾂_rbZGҴi|!Ϡ,";%='[wV\|7 bAbYIR1T]լfS_|_Qk__q}K?~;U2ʳq^Oi~t?l?N4R1kv7V{cyvXN+Jb_cz0- [=5+dǻg=H*xξ X23`MMȊO|_(9ƥ?/cqܣ?kz`%ȝ>QV2X"Wk`[ G*[2+If?ݲ),>&tg%9m!IENDB`images-actives-html5.git/doc/images/popYellow.png000066400000000000000000000327731250410645000223130ustar00rootroot00000000000000PNG  IHDR ߁PLTEg !#.057==AEEG IFHJMOQN SRMR RPWV VYXTW Z\^[^a`ccbc e ^ aegigig higjlmlopnlnq trqtqvuy tts|wt xv wz|{zz ~}|y{~ǁƒ̀ȂĄԀς Ѓ˄džͅĉ؄ʉ Շ̊Ċщψ͋ ԋɍЎۋ ی֍ʏ͑؎Ӑɔԑǒ ې*ې֒ דӕҕ ݓ֓ڕ՗Җ"ؙЙ ݘɛ'қڛ˛1֙+ۜןݞ ߟڝ/ߟݟ١ܢң0إդ(!Ԥ:ޥݤ!֣Dܤ+%߫߫'(ޫ1ݫ9ܮ( +ߪWG4+6߯L>.7/8@H9:B;LJCC;EL>aZUMGVjbĄlǀt{ʐДҎؚ֪ղڢ۰ܷH'bKGDH pHYs  tIME8~tEXtCommentCreated with GIMPW IDATxڭ{pZ.wwӸN567\#Q ,*5 8,V# 3lpwGўd"/J+Qud;ktۨn6٦M+vHtl!x}8Da>t("a1D"p_q1E> Gckdr!+OK]r {=QVM~@Z V]E tO 7Wps%\*URԍG ,=G ^x9VxEM"VΗ eHY2ME\,W`VBdZ@Pp#Ƨczpa*LL$jO5~$:t" gwX&XBڣ4Ub*9'y8[Xt Ŧ/]䔄6:NNI\k?A.Ƣ5X MU~Xk(-X(1J2J^2K9qb"^] kaXbtao4Ju˕^K?`P.'t5$Dh>WjI,Ub%Yeq Tk)-椺E-/-QC&+nx;e$))J$f'^ O^z饀@"z;ypԂeqB*O4U ^ ,UD{r>g`KeD|u38=SɚN[Xx>&h1r=3ͨRҔ4T .K)Yw~|'o.f&l /-%R95X06%oBgs\ϯn7 ˷~梴 XE&BTw2?G>Q BVmndGo7Xa;6{//ZJ+7`[ 4&0^vD4٭Visyɑ>+ӥ .-Y$?x8qerd&h~/0q:F\qVft}h7J-ȳT`͛KpJeTC%$Ya|O@o(Xnw?;o~WRHA3X)9w)[dN,*H ^ p$>Ț3eS샟{%(-ҦJe#H n7+^I+v iAbL|"T.b\DD "R)SEL^*&XB\DAYΐ QZ*{IoBk [rs~fdEW`>qixY&";ַ1!4b ;|^~;ÙXT&b1Y\'ѩZN]"% wZyQ4L3<Ah` &1E.`%gJ˅<5< NVZPL.3l^ ڇլq>BeA:4A%.䤓+@TU6`hCggb wzňASuB-/n0El_"Ƨ+lK /9tkl pb#Xvsd3Vt9`]EJ7;J^`z[>?5 a/pP.ˁDHV%!¸իIځZҕxbB1#RnG{NM"etvJ^O&,t6Gd8$'c`3 e'!u<;r:Ȏ&g>S9CP<3];B^浏c@P& HJ>xD럝[@͇ ;G=o qEVCXccvW22YiH7>;÷!4ix}\,ѵJ&3 숏]V z&dKs\N=?uJ]=p([Lc $`&f؆n)_b2H"pᲒ]FGF._?|4 @ xQ=yu~~~_N^M_r@[~;8elvԂ]\t}կ}ۯ.iw^~u~n~.dsׯhhVǬfjz9 n0%RܩEɧ|)|^?Rֳ6ãPm=:#-,k<TDPFTR>Tnm[,(.-jcOt= >Tʽ/S=ꐝf"-7,&&9:7J nJQ)Ij$'*/3<*42=t=,z`x_~I4v\dqbGu=Pq58eĚ5#EF/frVxEȳϲfŠg_Hiu:CY3s^, !+A[k4Sb5JɊvFFNN&QbvXm4jYY4(w`D a J.cb=QFj5:Qjn9VX1 ).:@?;<Rx( hxpD,Z!g&F\9BQ EA9r W5i=522HgqfW Gʥ #I bo7 %72j,RVjTjTsdix f5:N(°}j^nÁijMpTt!JGN`& O{S!Vzy J"{i3sVۡh( 6,DZӠec:E:6Q+`S.N`Gb者t`q]DٜFv+ O"`1SxQKRW@b6)M6#̅D-)Z04mq mMw<@@8 v8;jD5ҙ[: LoBB `lFо :hDrYEnPT2N_=giۑH J!rY3X3> g8LЩw^jYq34~#,6 Z75Kbگ6Ӛ*҉A fna10l^[L|D'm=p%.G#~!L-xe=5 )Ne1UH^R#Vt1D.LB a4:/@7IomCA VP #vzIt< ex\m ShYl̤lf+(QK  :h)Nb:h[ vH /cAqË/;, ׂT;{AUVb=\KөM~Yه1ȃ(-<2XǙ={T#\q3@5)~QcQ2k V$FY;95ӴHIlQq1&2Yb ҟDDY1R:FG=~Q I'aM!p*,z ZR4f1g0AI-*Hzi2eIRhI<RRSIDATmDt!X ϱ3ADf'' JW2 iu;߹[䈜 &Egf1ETxf2ElNgJЏ񝳼{c?~j-44u;.NlT Ʈs6p-0p10ِ~wA3~BA"Opv[n|ݙMaB}Fya Tawf10~˴vӘ QMjMaR+6ào1 ҊZm+YQ7T$1(G!?99)Z ZDDI w4.w(v5+PZu4jfD@Mf٪ifdK{= 897Uil8 N.6c8GHH?2X`9i 4V` QlVi zoXSbSvfg=E3ͬF.煱1?v >.#,-cypN9 BCW^nhioX󮆇P+Nf:&~ddkl!_ofכq ɗ'y&|cBgs9پr4YN0' ETF@?T۔mu&LrM;D_б!3ԧ4~ϣ9wb|,$}>s,z)h4qGZO '}=C#_ve7ש0NU66+-XQ3j=ӤwYK &No3Zu_?{b^'}H0!~zmIqD'[$n96%^ R)5FZQV!J [!<0\]#_Xc"^名?WF PFV+ n|?ǑvJzX{ PMΆjw756kH-䫃R{CC{hUn[A?eӆbPvCCxs9[p HО,/O.v@,itd5 k6߻v暭uƝrVTUZڷ͊nu v6[ul>!nj1ٜ&9+{lV e%n~9JG$bP@IWv˕oxp:V S{;y]ooI]7fin54_fy>s#QaLSR r29=h7'^ҰM |n݉zl@^iW٢F+Z>a $P%)B76pk9n"xNeb6vYQaa5lR#76nٺ.v.^:h]vHA,pzO[wvY|6;P$a\+wHKt>/B!w-6AWlܾM JU*:jdp_^czg>jT ΁>p َ|Ȁsrvvt8Ă)6DE坶!4"C)ZR}Lp_ =mؾnκ4f45a(u uv};KvfX};;un'b3p7 bCUNsA&] AA):j54iݰc{c[JȯVvGͻlca@ghϠ;dvZNvM I.$#9Mô$oڳisRjza}ry/(477۷+)/ll@h?;{=ͻvj~룶#dn?냕;{}u(-Mji.U}>,oWw;tͭ_59>')CbN؍ 쿄:-}w<۲yoBɷۧ]StҭQnlD3z|WVfnmXso1 rmSCBOAPr4WqnCr~oެݠݩhWw~.cnQfMwyc{ڻw[gpyHSש9{HmezBq'Ͽ{ݼW~?sX@xe[eB]/o۴q;k-5͆[w[[j&=5ڭ>f:{P xo㮽g7vZWgk־=7EԠg;6Z+ &{5G5[oxJ~EhjjحҬo[2Kw~fhZ۪;|C:p`1#C}>]'u>fy]dʐkZS v融5uG7{7oQlh+-*4-zBgC-]c*Vרk߼n;(:#u:;6K%tp[1C;{u]xBv0Bo eq6'7oRl,-[7l+ Q]=u/aqj >!x=o!҆wӽ:Iӣۿ[;RK=}!'CO(|g00ztK܍BGam[(>e{Mf-M[)6)|]ѻ]5`'<A۰cW?ݱUٸ]l_u w[{`.Dq^]_B(9@mO{^q kmoSlپV~]v?Z+?GnPw=1yØy;ۼy?m];wzp}o7Ey?`t: n<[*o}UIENDB`images-actives-html5.git/doc/images/selection.png000066400000000000000000000011471250410645000222750ustar00rootroot00000000000000PNG  IHDR$";sBITOtEXtSoftwaregnome-screenshot>IDATHֿ@IF.> Zioa+bg@,l,,=WCd8st{UnU|f *f'v;PJ`k 5`0 TA~? b2Ms<Ǔj&N31W@`V^ U@EfsP-^e}^?>~k&8NRl[/v3˲)LdߗJ0E{cL&pj@ғ:40Bn4M<#ǑGc+^d2qe[Oa" jaVT*exfH \nXPJөhmۦiryG, PUna yLb_|ϋ0ƉDN׃ B\._|s='!cjj۝Na0"J"qW0Ƙ9>'d1ͫW3IENDB`images-actives-html5.git/doc/images/square.png000066400000000000000000000006351250410645000216110ustar00rootroot00000000000000PNG  IHDR%'4_sBITOtEXtSoftwaregnome-screenshot>0IDATX헽N0" @AC玂\Og]s.F88s::/˫sy BHQR/lP &(a ГWYA:gJj QY$ӤF^v씭SPWTtRAՏE h`p1Qw%|S/c 9dUg}xւWebVD CY`B ( ⽾$d(&\5!4z~ԗww* ٰ|mgvi{g?;PnzQax  r@@I"M LE)F2@?}O%Wbw9:5W$@[TQ)zYh\5SM;/|^Xip~S'㑖s@AөrbwzB U։>?|"ZHGjknԧ|i竟za8UY7Q(**tXd~懟ʧf^i h~}?e$X~&9BHmK KYo%En0М. Nգ1[˓,5߻ʦ^tm7_굍pZ^$ `$$ F"hx._0‡;I)Mӄ~K, Zpؿ.{cqMG,rfF 9}%mŽu?\r1D]<511l?#sJ+B;mQu_0wg˥@Z ؄$̆pw1jl8>wik1ʂdQv^yGm/ a.td3 T=uY\P{ Z:)1Y ŕ r%p]`dRt-nIcG/\up$Sn$,P4泙$+Ar7R"EfB ιCd1<fC nϒ,Y9H,^,T I,(!9԰[8wYhdƠ}hs_~o39ap̡z04(9 $_.(Xy}HRH9^-2ptGI +;(Ќb^zWC=bg~jftJCHw .ZAf1%TH3w}ęw?N=Rf .$iEc5˟#ncUtL[S&d`eTF&z,]} 0^TVAN)X+sLE1 dj%hjx]݆ ^02r?-k#rʀDt9gB9k:_ckz˲L:i )lEu*sj'mfx݌pUH!kբ u}uJB⛿){'R e֥dzcr{_j]DZok}L.uE3Zb}'3VUSZm3Y2y`f9甒q,f2%^P(A=rJ!־`wo"/G8!Z{^W}s0yI$`.i&1˲6>kѪ?lֈ 2!gU g @J Tk I,YZk6%3P i6񲿝}SeŪ*L.m.g7&͙Qu*z]fRk7_E #29\{/2ld-8՚)@,7_zOBl.IYN.7_[[9K.oRI{Rvbn=k-P;\;")KNPoz!`  6$)2Rxxp`Fi1ۚO6h!bql*Kލ&rws%)Z@YQUtd%7' مLDUUU| 1RK{p263wS[*/F) oXs qӲ 4o\&]̔d ~þ~C<6c"HDTݒx`x=(o* $ǡc-?Edǰ9nleYI–"3P CNEq5_̲nz}zՐMNZN)_K/ah@P Pe hhJ3a,6;UuaXNFҲ'IA1C @@*{z 켪r*֚ [gP PN(l ڟ͵}wBM~ahBu=X?6z'[`'0B K=r![ G.`PxTu%S{uw3}pK~q;lXt}8/^ld !ܩ칄 HdYģC ʲrO?]Pc۶)gVԐwX:db,D)JjতCȩiw^2j!wvhֹ]ٙ]۝-RJx6n*lNbsv4:b-l%.tns/wחݫ^J=ZXU!-SR >86"SJKy%3LMlI5:tOgOL:= ˔c-#Ylw:9Q~28%j#kIUNV ja Boլ{ ?dVB!rD!Bذ>uBo - };Q[_!<Pqؼu;ݣ˹[<^1~ӆmjQ3ؓ(=lP%-gϕ)/L׊({ޘGu(!1fvwv_z/A"sNXZJ|h^^^ՓzL{JpIsc1W3_}u-eZףNx[oL{cyb}Os#90Ox3_p6w5r!1ƃ>aY!lOVz&5뺶m%eI=,H-/-P8Vx3sWe0$Z&P>ơ8oKĂ[mS0&&X+f0ËF.e ΓVtϙn-3gaLj;F -%ED~/ $,C&tfOsI6#؀S_<\0#Z n 8gs¾Wi=lI/Xϯ\>@U f4)ύB0JB+]ZXX҇:)簊ghKYPBA&i"-⅋'w]m5tVlpcពX,KMYg#Tti(`BYqdփ+8mɳ<6wW^C LB2s {ad4EGjEpIh-H :)Uuqw)U?Ki{ !;eŔ&ݝp}w>1}"r%F‚:N@ n]+C(BHDRZGPL)>@7\C ` CdrIYSu]5t񵛥^16IԂ*˘' "SLS킋=15^L|Vo:̪M|}gSͻ*_D'R!':X 0@nY]7$3˗#:<=tEB=g͔X+6[{ Zu񔬔EeE65w@jl !Z+y^io\Ɉڙ~]c uSܕR'X#W{[^[fE@~{~d(H9 QF Y聐BiDrRi`8sVBP5~m{ڴuK<+HZVȆhea6Pš'f؊`,˒]+cqv>eAa}S+_up,;ly5h$2J41,tHQCq @@WO%=ɆJ&Ixͧ~+lƝ#Ɍu+֪~)g/N‡`!nK@! ִQI Ij@eTW(`]ڜg1/.*Gb\!V6 !3Zij9X,q.þ!?S ! ^/:co`EKJNq}mږv Wz-ل8왽p*5Ɯuv0ʓ`y/Xfmc&r=˔AUYn6r"m&NɨXUޖ\\ Z3pP=Hb]ɕ߲\ʴA b*˖͏5C,A1Aed [f*m:0GMSŀV^?v/y'\A6n[OLQ<9ݚ\ʂ˓+h$ XHKN+sJ8ٓ=!"ىN,pu_lmmT߼}<6~仾lug*:DY]Qiƀ:r6ZUya.3;P% wIb*IiN/;x,!,PZ5&lwgݽt3Đ}h&%%yNbB42<4pN WZX X:m@q808`Yf>~.gko_ Z^ˀi2q/ eyd t\Pj 4OټOn`Bd@s}Ml\=&YLfA,ǘyBlc*.nD $Hd]g:Z:Ly t\:! ^ًCAWDřW)Ғ=__SGg>ğOܹć˦ c1TՎ\hYU-%B( *k02o~'`1=em2,b(R;61zE2` ; 5W-0eߍPsиl95McC)`?O[}~ ImS*0ZqmCatkՒyjq鉵 (S0 $ףRK7-6@vw R h UpPP Y?pe`Q灡;GKm 5~G{0k1%ڤ`..BF}Fg2*i mbE0HePT@DגCmN娂ʚQGU6$,GMPIZSK9\KCH]a9&l. &+C%߇ H<UUku]͸M{{;uezմC(މ1Rv)a:Ĩ0~u|ތ]X,&SGPY+S=fqhvJHd,vʕGX(JpAf`y9n.9LBH;T>4`(h, %AUl1=/S\@|{vĔ։s)?{>__':tas(qՠ{|ipoLBЦhn8Ñ 4Aߞ[{y#~A&BT TDb k68peD Iࡔd`AwM0)+{44ӡe4<軪^G .)%,`(KډIԹEDt+׿xW^;w5=??KzV]C8/IE૤ u Bn`=:Pl;Q[@Ek'& 'FUR႕n@ﻺڬ‰k9UzAP!%P0zUv8P ; 1+~7ⲧu2~8CG[Nٳ#o"LiFFcJD, :'+ ǧk7w'ӛWNئۙB h`(}ܪv^؝͵¾ެhԺPPCH~sK5k~}կ^>|ӑ?Olcvw-nJun 5q/+ ^"7)3V&05aLh1ؘ^icčJJ劣 |0jUd筽Sb+ d)cwa6 Ga=TF,_j.(a4Imuhcn_=oq>v]~njȐ6]Q%557^Qgj OQ \.X&f1i .T`ґdoh~KQټ K}*O{Bzfʐ. aB4igc}W.sTUJ浘d:/|[5K)kAl8)t!Uݼjx|chzv,9SK[)/BO5PMS(qDH!OOvt@1TUUUUAZ^ҵ޹_ȹboˮ]iHm'DUUsHM,{K63MqUÓBG'DV2AL %7'Q?ϳ` [X\m'_O{ͨw!'" 8|HiqRg!Kަh5E*!czw~N̙;㳎[GZF]k_l?qm\hiVag~䜎C}m( 64N'ܖ "I$O>s{70w|o6ܼR ]NIY$hNm^e 0,!m8!(0rp4Ѣ&壦0ެX7_W&U*;E@E/zYyUQ`CCS&T,@ +{:Mc{W.&H)-Au+ u]m* o3D^/vh"$>]Bg*Lv^ãO<_$NG}OwWko>W~Ξg~G'a|mO^O7_Csر>ty^>?Scدf%Pa{~Z?g6&oޘm'|䓿8٪n\̯wf_sEfhͧN#]?/^g~#Ǟԛ~ߚNN:Ԏ'6SkU+G/\M d:}tC1ri( ױ: AA1|?'Q$TN}Ξ%3_Ae&Kà@#7M{9L * _u$Q\Tng L Yw/lϾ^l.^]QP M;%BJ?0#|ê:BasP Ra,Itڜ]ٽn#l#ߜӧk-mWGf3:gOn2 euK+1C9lЯB(| "<Tfu7ݝqŲ҅ =}|gޛ-C5 VH's*9PRhu1lg,Z0w\bbfԃ;}+|wÒFP "`#ST(J5UV(VľO)(y=DC |˓т'*MF4 SI!?y7Dg4/N,߄KI,FbVrie0&Ɯs6]v޿3=wn???rQ>O־o.HwԴ>z1zc~酿z;?z߾|Fޜ_}kyuͧךuŻ(A f9џ_;>~|Ne<][cǿ{$O"g?MXeZ?:zaFuOxϷ?t=/w/]y/FpDU\}9E֋Ag;SJr5usxO*\tCY~Fhmz ̨o1{ڴ̏mV!LG `+M=򥚘PUJEYĀA#\`00M;O]=g7wmѨɽmnߨ @  C+@ArLRQ"{7OFRG'Wnl}˟ OzdCYfUl/|_>wkyt3ﹺuO<O<]oɕ>a^~'V+NgBekj|x>>>/<[_la?1?ܟ.?'̓|*YoN}?_˒?#V An.L'go/Va n~ s[_r8i`~sOՏO|_,Soݸ/~?/3=<8_O~/w=ǟ=#xzs9aۧk[{]ם954HP=bݪ@*{nFzEU1B_;QUa$ ֶRBs"B,zDj4U+XX<018DRXY#-zzOEzP{9]=lUSOB.fwBjoBoqfKQ/,9AX-uKv6Kw&L>|ƫ/~>'۪}_+o޼=mc>ٙq(D Wy|9XbsCҐVbA  pfՄ;a?RIXfrvIǖm}js![΋ܧBx2F)E^)&IMUQڜ4,ο«Fm^t[)ǦݷoV sOYGV`(R``C-nr 8ݘ*h^O9>xo{XP۹d xn~1z! YM> `Lj*h(2 ;r)eT9+ؠz B#=ÌP)h{|z ᳿пcڏ ꡪ|#.uܽO$[ q?[ߗ/}3kp>K> V"dy>^J3>Iy{R n^/=O~ۇڶTß_ nݿ/Lּb-E綿jkYu~Fq/yw}s/@y9[h dTV:Ɂ'Ms[zq/~מwqK/<>_~ W{{V0cbm5i ~NMpueFqmZ?9yJyP፧ךg7No貮4ZwkT¹ p؄[:=?y'k{;߼F5^QE`E"Z]-õOMpim\oLk'FY\7 !Uִ4:r2v.˕raws\j}CWљS_yag݃,˲o9ޛyQ]~L73̀hc` ,K0Hl!aa$+²(!  0003=TWW׻*+ߙqk-U]]hz2*:qK ˇEn$GZݭ-w;=ÄISgb.!'LE~C,+ F7ChpZN@ ee>>yǾ{q Y˶}m>`tz~_geIO|G3pqHvSAR LIZ$?wS6<#" 2,ḿu3Gsr]"Hz7`f#O^qU !pf<9xkrLe(jJ2:{""U36u0"fh<1 $xN<yK\1 >Șniqqib8QIc/] &0FWX%hSHz)\j61vAh?v  50\|Ι`3sp]8Ch4XND25gF*5wgIT ]Bv`=hQYfo02e1;qJ+L"9O䨍mZ۝ zVVl;8OU8-ϭĖ'9 [,SONE"}kJO1Y 3&LA`Ij Gi (<c;s n/.BulƬ%!!%fF95j9#' wQTS#7D0`q2^91>9Ooeziıc^~ፍ/|?zjsiiU4oxdGVē^:w$j8ſo/qy~D">9OEPk걖~~8}bv u͸[wr͖ VEIOitο#M~@{4CF0uDlBhW$YT)% L dsQPAcFwp>3pD$d Zd `,j?+_xf{mc\xRGٺ4"غRk ADNc>x_W2>6zˠzOdW; f.]6_ N0T1.rsP*巗95=}I7{`L&F)~9x 0%մS%AF(z(3'.jQqonܖ}}Bu/*25 d޳ 'ISWҖ*~oiKd,DɌ`alX PE˗,14v9~g̈9@Dd --]' wGgKwr~V7X)1"L,)]YFx/b+ IDATI<8K'^|~gkD4Ss>?y3Oc&K^pso\uz?sdž}X;wj޽fkc|;]F&m?x', yÏ?mt2J p%+,[#MO:-\M;5D 9%PP)<]9I~+:YLjUU8Cv})dG/gVnFa w.R(׬(\d%vW˽;)F8%n(%Jmoļ.׉'9Uk犣G 0R 3E+iGd`XSl4!ǯ:ͦ*:*Hêr$O$&:;#j4gֶN*ﵲserQu5a]X_|splkg:7,E4x3o<3ji0U%~oA*KUTOVfߓ(7;1N]0eGdݭc@t J0f"jab<CQU%3GޑZp;DtK9!2cUIwU2Ur႘~}W~~D;Ã{=tf}͹q_>2z'~mw<ï<\xu}ן-vz}']Ok1QQ6oT rYf5'ڙwt3/98v6%opp!dVRև톢L9ךYYYDr>Ez d]9v ̠BosFN8߻Tbr'S%"əD&Kj5 #3cv6Үom%P[NX9T'ן޻yIhVfxKCvѺQaՌqOϼt'-ss b" #0n0{sxSzsvBpLyr9]21$1ELc?\:#bZ4,( 6s r DrMl ss?qsvPYCcrdljc!n/]tvPJd$lf(ޣC ff2f7k#k,.,-T0Q%4uS8O+B j1R'4bα<:L*u|G~5n.@àf1F!.٢сwB<ؿoȟ_݂3~_kӞa?W{-Cm< /8l.A8[M\?_|࢜^~tm,&sţwo1=fjN)X~#ƌorzÃW徭⃇? x(Tz/ݻ<|jIIL:/4nXSPgr̽9H|+YǺ@ mP Wiߣj/g*AMCuHʮ~'|@mذAANqY?|c' }xlafllU}*# %xo_lR܏8}Y{H]Ո#60(۾w7yLӨYX|*̕޷;x=#yxYnY*2+Cn;xMc ,Ov;_?c?C?o\tV).]Vy|J(mڶ_{lCN$!*]S!d[j( 2bx\U(E2@UڃУ~y܄flI]\Ɏ9\D?vx4{{#zoִi%6EgDD9 p{(>A cerU ;L0 Z\V(!0yȓm%>͸djN &"E(r87DN:3=zp8ܝPat3* [kۏ ^Er>)!`4Z}DSb>%#T 3[VA=2 (a:m'?Φqh <6/J؁qCaRUq$`wռsm &UsJ"3i]XG}>ܯ|O(D;l.Cbݽgy0ӂW~]x٭9pb3O[°<">?aFG?x? /|o߽xhmso_. 8QRmM.vs `krf[o~;%5pbS;= |,_Nj2 gb ԌymZ18#5>>yKdT%gDÄib=]EjJN=mZ~8N=d8I6O&VP"K6ZjQlY g,x.\zco Wsǎ>2W zK.46ޱ $VJ-R{rpO)I"2 B=pKw&w{{)RVݟ:(B p BAG(x jP-붡 `YӐw;SdLA MkM#`*vsy2i6/]cfaSW"h'z, bAd`4{z_ fXͺɒTh[/~G D?/!(3MdTbo>m^]w~yySM_w%`UWUʯ,=z * f\&Xҙ]*hU1qpTU!*'sk&#HކMrsƶ.L=6ol$;^SyDELD %d~}whM9+=m{wyt믞8ߴ=?hkW^?uݽzy)B?rG౼[[`0N=&ǵU9-׼(%N<| +eS;q_x#_&-Gsj$GnLZ==~yq+P!j$uZͤUڶO[CpEf&!g2<əBw6mWO^x/}ƶSu\m-Rj`2GZ!Fj@pGo]{1D(0P\eD " ΅kw<ZiKEJ0zB)?%3sB馽 m[QqΉ([ߕ^Uu1Jv MUlyO~kSO_~u{|tdžxoG$^3{6P#VB?LxbeU~$D Nq@Mmzǎ~dc SU8 ,Ʈuy{gfppʲĄđon ͭ(eAz[ze14 /5ŁlPk19P4rØT9LuB]:j|Orco:Ty˦ +s8sjwr=jʀ2UnUb!>x< ?158se[ڼZ]ΗGcbF}ܱn+>WoڶlBZw]ٜ`P5jV7c |0Ox1ÝYD_6_;g_}J=Uj!qQ<(#2&HF-(~*)^3!^[&nY1193NM`S'3`( MUhLj ̡/Yؽe Jt1:o[=qe/rAF"ώNs>=wNv>j?=e62bԵDOaf,^&Ŷ*qt2`S#ÌUw7^n@[;e}q\ʓ'/}䗗||??YlHn#ucȫje9&`:@ *J3/`LP֒US*HdXf$2ウ3c7'uif_$zUhDɵߡ&Dꥇ_ Ĝ,U5b6RMǎ J^΄ 32\KݏyǞYhV^.2"vkLD%D(њ,z {w^+{БJ,`l oDj!d4χyݶo\z7v^\Y.ׂMrrVYJKլWK#;QGU _FxNw b;H }3#Vi+]fjV4sne+?yEjQEѨcmlƉyQQX`B9d gX !j 2.-I֎F;rRy2 (=pu$8 ځ3E-0%Ռѱy%ZmcEێ`땃+pcP܍'':VŤ;vf&KA/31t~hb6I/H6꼳RBݺkVsA`tkEJBvz"1)]0uKH?a:/lK;W; AI+~t>zH 3ߟӿ[HSlYHp72Ǜi#qc38ZkϝhriX14,=b%j¥3 sKgW_)ܑ%o<H9re#VfEb؂G5Yk}҅W/\ܻ{Gj 7m i聩f_5ND싟}O{PVk", {!Gf3 U#H_z/;syn<'Ah//F:U Ҭey[!$`tk|qc|Db-읂IdOgv5F4j9op<LΣGU{֦ݞ[@2!̈ΐn%&"RZ2#O8s2&'QKqguD.xBW;5]z_)<5e)@qt 3y jMnk0LHqٙԠnC-+TɑȋO ݃a<ҡ7^{]t!RH o0Zi&ߙNqX˟}+EY`fPoܛO|q3* "A)$@gγF)#f<xV>džGOu8ݕ2#Y &&QMbKʵ@92|Ұȴ7. njvɮ* "ۼqkͨ%k]V(`f )P;"Ê@mKdp &-IhL}U٬7ۧD/ۃYv4Ė5ݽ M@h-璨/׹Eyte|}쁢pxo6wLkaiy+ NBhCv:2Ű`v/pIlx{>x;*"9j]Ɖ偡ա X^yTå/m^_#y#.yɄF$ZUm;qwF;,|w\=ߗsxއW0)nxS՟\DT#?H'pJO^yq6mH!2 0V~ieIf *`Dۉ wUD>֓һX bit'4v9D CHJGM۰+YaʭrT TBPXlUJ3=83 1SQũ܃?TzzWO|cv5rrŖ8նt{t+^:3?Vz;aV(`DFvY0W#3e3iu%ԓ+'|5}䫓^禶S-w}մ,gN^Z=OrD5Xh"3'Qp(UfE3%v_/!++ڕɅ+'ίblq@3DYH!޼NI6uSyDWF_,H'-m>KPd6N bibۚƙodNMF-*AM<*o^^W90RPr;U+,SV݆DFڋ(?WNl967 X'va1f@Eu#og^w $R]J(S?̆Qmò*TxIk^0Î =\>0\T13#5GFS48'#6jZnQLcB|}S򃚙#66z\hbHIt=Ir%}:XEe[ks1)LĀd)hKͼ^Ŷ_vT{`\Uw&:0xQOŻV5ҖE4../Ue˞+(x. JHQD͔Q;[釻#ThdΞe%V]@NE]5 @uy~h1ZIaEn$_gQIXsoom D$كX*$HԆk8zz}ҴݾxKz/e.xSjg¼a0*M3ĩ7n.&=sLCdJU( >g_;y"pБг>xzqs>Q+=7oR E {4i4ݮ*G{kk'+?66P>,Nq[.VgP#U9s^y\e(g1n4> 2NEl +b:RACYZ,8ͻ]u~ T&bnETsv\OSen4ɑO祮{Hoih& 1bLEr fwOٝ8h|?sB}G.d:ȥ`ތԔ<0NSdn=;d|VO4f$R=UNSz~RU'U\ {m8Q p&\mf{ʿO8 EQ9|3- 4BCDA QG7 T;ǽ( T8ҡ hȳ#̱.&BLLؔq{<ɐAĶ77斎 Ku-7Zxs2Gå{bլOwi@ r2W6R1GkPUI\~u=l׫V +ˢv2mB)O& w!JtA3E2ѹUѶuKMlxԼ+S1a5cM,!9o&x~q?F[u4 TT _Z#ʅșZ[:ymx7RJ44q68; id[!EM }[V @lᓚNu\hjF6rw4{vچ"LHf ΗnO ZD / jBxi'߈6e("{{9Y<ҫ&ޯ+L&P6#__ G)Ώ'Qk#z1T\Q @UQEQF^ߓpY5ԋ3&3b#pRuǯs w4]y_P;ֺ]7;Qؼ7S?-@Jl k'8-`L bkYe#zsS_}Ô i] e [ClLy" 1jf?uqXv^B[¨arbB**gΏV+sQtԋ}WkV%zJ]nw^I+&bqAe$ *):)ƒuxR Qlc3]qZד]*ͤ\t` UeBc,Ψj2gmyM b$;WSlȔ=$I@ǯj]9gjtNwyL82x⼊NA1TfVmNRH00q"5D4T}L*pJ9H%:ɥ[%;ћcRݽiT>d bٸ"jR0Ko<& QqYF2L!z(3)#3jQr2.h&*ıp(bi7^:yn+ <FviԑIzӵޛBi+AB-2(8l0_bBScb&bM"fh*=8Po?02I,fV7Q|,$DT f*$̷uz+VL/~Ҏ.2_ϊ?T%PhU16v+t2W/767g* b$8"O(?ޙLvZ>t&;P.oTCBБ}֕b;j8z I LA]s$g9;+C{3"X_W\ZUqW(C. I]0vUH|:ڛ@Dd`XަS`2hFHR3ȇf*QZ53X8WA+ FQN!BK h)\ f&p濾c Qb4̙=|%̀4VMvv/SձsAQ\*$S G$(pq7OLD˄ cBzPDqf޹;T6tM*/|˗W;ݺq #jdq):ݟ*:/[N&Kq-P^m#sZåA޼RYYhK+`f1yZtiwD4w/ٹttǓQl 5֕Z* {֚ ljDjdIIC@j, *\yK١n۶u)iљϺEl)ƄHbAmYQlUK{&Ɏ,=,w%#@{zgI&(o""Q4mDuOo@r.~уY*î2+3n|[J9gU3eМ>{ y5$t K 9IDd"fZV~f3?=QuVWEt7q.gդ*\>;z($S#uAm b FHp&zd&|0v(#~ ]3B :+"); svӭnͺMIEt|rYY$flcbCR$鈱i?'EKüɈ2nsn7=:fc8,HStZ %{+"o BI63tUErkم#0!Ps0}]5(y@2"eo5[H!e#l F5AOJդԷO7w @X29HVlolyuSup\EQdL4 %ܼc3'Vӷ y@ ep3elqyBxWV0#ř|ׄb=ܛ U-J[mAz&UCmȻ udj% iNSA4C<}kXUBoi#ȡ2FHۦ]ۻ&Ⱘ}ZTf] d"jj9  (bb_"Dq `;pWsiC1DRADpz# Ph7}ϗ7*A.*rS#← cR1q ( .Ay~6f7cW#!vƠ@logt8xZmWbAoY`J댷Sڠ'{o7'cfZeQ$j66h\z7.0T ?> { 9|77І1 UR }{fQW}%NC)F#۝ }]e- +#['{^k6}׷WvQ{ AQM5Q(:rHG=0tsKJ?z ĉӀS.g'70$rT q,PƂ!`LQD×]1])cc2XN?x87_|=+eL%@DE+yIڮv%4䜯*B DCf&CZv*LyKĈeM]`b,˺>oz"mۛ編,ʒ7`@TԌơ ,{Oo*fdQc!( xиv+b4=!2ZMxk<6`9U.}oiQWvKLl˳z (SdXCH,  tiZ0$Ff"KDԷ8y%f IDATnRFQZ0EQEQ.*ewQA.,*?dmJT@z}I/4 9qL`?D"DD6 HDj&I9Hm1`i;x`.O$Bsy"ѽp}Õܥ' $Rj{d7ջ2CgPel֫v}1Cb @{<) yF&pELf D1;s$ ,0:,N:&*E}8>,j+gvCHg P쑥8mWq9pͫ|lve25b8 ;"o40 ^=Kﻖcղ@.XMD7Q"O A%4=ϦB`XEUL ޽:I,1&ꭇžMd$ }%C =<^Y-A.@>@!}*Qz11jwQvUq%ϧGVizxELso!n 1>S(W`6:̀3 w& rbm+p-3ŝ_;yS%K2爉;*ՃDm^\_.MbtJ$j &Ib}O̒b"5']5+! GX&|Mj "GUQ '&HEu{DuZ8 ["]NSzsƃ# u1Y163&譾= R.#tP} ~;b^D}ߧn4 +bkWѕ n-wy&@'BWсv+ ȀK(ʲdvDy 9v,Y{D}3!$3Ƙ*(&%L`^ Qzel2 QC(8Jh/ #A rRtX{Qq)I1qH']8BKTυFc0+sLDkq"i(hF\:Ϯ$ "f(\r(|0Zuޫ ő?48Q ;E+uыjt|v\MKb"e?^S#*B}i qdYΪZ61nCޢ{E4__U L]+_| )3;EMf 3 g Pɔev<-@P ^.#g^2iz&EI)<)uoV?O\}FDcL M.)L&l:v#|ЪwPo),^?]Ӭ%$!ָKE`$ĤXG24S:(x:s5$dv0L?~9ƃ{48A!/.3rÞɐDLBק}~-!%1K_h}=-\A\ٜ=! # W7ZȅY.UQV{cGk99 f2L[;{³ QFV0d,,E *f&ɑF sF}KGZT@QI1",@Ȟ7QDv QE&T u3z}MnIYGA2`S`V5LdvBhdCRX f4iKDx0D5oNuoh)dèh 6 ~:1$i7|GApC7rQom1a ;Xz{ b2pfv/k b/A}'F>ȱZ $Aa$XѭaX7!@˓|'h&$], 3ԁ _T2ǘNU;&B4$ ]y{} 4$ʉ*Y^.twTY *ʓrZ#BL;CM` "JL=T ASQUe09 hRk`-|jy_{.J"~684/ &I4Vrpej#=Z!aLQ@s{k gDLfH-ԛ vI2!h7 v41YY,K ,p66;VۼGA9n;E֛jٌ.F{ _&#{%LEoڇJ sЄoP02"o! (8RK:bSǕ Jb@Diʊ`%} !EMaLa00X(Ik0D mshfPuVLF9 6pmS C3}mZ)~k0dּavGa8y/>4!Ȑh/GP K&h@Tbh@*b{;x@̌cE?oɟ>TU)hZ@?7* 0$05Lu:~8L,J݈wBpBy.gF Fд-wd)=V0-DJr`l[OkM/|1e_p0!`V2Xp2 gr9c򖢀K} ӊL0E6!3B) SkݴXX.1;|7 Uz/Yo@ٸFX w p83`uDjMhRc9𥾥+Ɣ0!01RJX5)I{ܵ޶rQfn~9}⊽'!6 5g#D]oW_nn I]@J L4A7?..iȡȇł}z.˩7mkC`okFHHكFMwm7-KWA۟lĮ@U@ڿ@"6;"}3;DC&!EvD0kMt| {ݲ0z~ SAM;{;vCH ilTZp`jC<b ڎ۱ۯ1G  $DH1'cK }+F^=TETm?Ri2ĕ GEIaׅW =ƽ=Q&:O Шt)Gkf0"bJkƃ|:j4XEѤ*&X iwd,оw(ȸ8k|*63!Ef%$Pa"&ffGɢhz7Q_=XJ;1_W ?#L\0!0gxlrL׷ $1"{6ùaf꥔PMUu4qfKl+bW%{i L#`*;'qރ0(:S$}T FUN<٢8 l= h1BCLUTE¾!dLxs͎Uf HRbf#UmdϤN:"b"Bq_7o.zR.Q]bkޑΛRňۧOV+3UOcOA5 yp=4FF;G *hJĀPUj*)#*(TzSԤMl6fe~[*1k s߿ޠ"yIi9ZHyô@5h Huh /U{DD{KWw`jۯ܄# r:~ULp6@Mf˩`(r,?tDn{>fԆv%WBa*ѵw B!k5{Pit]1}QTx;"ɳz;15,N%桉~pF ޑŃ׹.@EGT{ΣcI❟Luq2L'hya;(G%,Y=7+LH ,`@ 欘⼞׽: BXE`G.M b>":D޲O~u?ȓHA^o`!$2UD#v`ꬮI߬>9>0"*#s+ѻt˜4_G܄ $B,ja?%d_mm߼qɬw# Ј6\qeGq!hhW~c}X)yR}RU]hrx`Ds_7" Kz8@1S1! MN(гA e"**3W0ˢ>Y<(DRc[L_P,}b<;`ʩ  +&O>*Z"n\e a/HPՃD\-va:Z}'' 2wQً(;' BD1 PLH5GٱU,1548-a*EY$)E}3g3h@#;8^a# {;k1~n҈DZ#?|I*'Xâ,!t|鈊D7~z3wYFb`X`I% JCԫW~sXW]ݭ( "A]moDxvR1Nl`XP4 #jZLf0SY!t]n!V[5=>,/34t>y2=:]ZoWiZ>AIyTz}KNgb'3v뻻1/6G㓓SOW/Չ>Wϟ)/RW_13vMZnnB \GGrm1˪Zoïyu Gix~2=Z߭BmVϪ>~lOtH (l> :r lVtvӵAG󳢬nԝρv{bK2k6$QzCSMTGOB}{?s_6ww]h>54Y'щɼxn\S#musyܞ\)f\e鋩/W7ȏ><8zpYwv9IdG*K͕gţ꓇29J]>F O_^۳ӇM ]SY!Ifh>]-o> ..oz%vd3ކ@QٔN/&n6Zx8?/OT#'QM] 8^86Fu\5MجB8U9]׷7mዋٳ_4 8u=ztw_㛻dF擧}KggϮ TnyVsrޮO'6.뻮tAmzpp6[lVO_lAO&WW/n..L>tUzv>iL!}g t?W_?m|_DL=.ĭOip%w[mG[rn}h8pQ5| ׳=:m[TGE|6/&G.$p4;\vϞ~W\ªtx/M~)>~(]jZXJL1WDY=mPh8z|xY, |e=yßh|r4?onq>?>^,Rfv cGD6qc{v_>\m^< mzAfӪ.t*ba6*zU,*lzTN$_UW˦(P*}ZJ,c¢dեMp|ReApE-Wm0=O&S٬>=shm^K&ƠeNq:˺fv`cYvp6,Y JWE* 3{/vCD)0 籃>&4tQ9@M} yxۮyf+5XԠ^{ͯ0"}Up|ኲr)&UP&aR **I|s$}!5i bDt6H׷*B0ŪD7.t].hߩ ^HVtz^}ߥ7eF9ku.ׯVxh}91$UfP=#Tоf(JP:~^}^ IDATB4 '@mJ<֓˶o?15N011W{\.&0Pb6:4]$Nf+~vKz|jsu{{މ*m6:eY7WZw씈Uu却mnG'd>v9d 'gw7+u$ɤ,7IbTH" H.m7U )܆;7Ii;_8bzI `f f<5n6|6=(':Аȣ jR\td77QېUUkv6)*]mnb?hMON&Uu no! eQnַkMp:\+b=.>z rҬ-kD 90cdv'/V˭sl6OIB ^K誺Y/<6땘lZS f ΁ 8Q]VWϯp.Wӏ~|F ~Oɣd2Ym=;,b}/.uyZWEWw7w~rt]u]cCX/WuCb(<{BϞݬi6[]-ٔXDzvu]FmSHӂ?yp|?MMbh]MWMˮM1d2/o䋛Eina (n+ p`zZݶE\S':Lm>Z&TGj$ 0:^̘iNVTmdHW|ϛf xz|\UVuxBӮWE}$!o_x`.}|ND̔GNMJ$屯j\],MG3Pcm$vMټNK$Jz۷]!'Ot6!(XW u}2,K JR<;%PQöͦp|R-.&!6m߶{)%"}C, B}ߵm !F{pDF DBLID,ƨ&Mjbl۸9ONC 2:L-m(חuc1=8/ͱ Iߓ"f#m7U%2V.>qMQB L*1;yȌ4A$)%):BH PMTUL46@USЋ*E?@D>3 @JL)R&b!@$&*}v@-'e!Z!Fqˊ۸"t2_L.?:JLfjDTV^Rlf21U0cJ9d(I$1j2űNN-uU&{>v&iVϸ Qz ){ Zf+Ebru@̜jlFD&҄Tv‘%mcbRW-}E'G:}Y~LNn.fۤ6N&byOG~ZEXLVf t@*XPnCCGU5V~ڴiZmbj`:jJmU3+M0\|i1NdUONJgI]%M+ZwwDY/#se>6EE~r|\Oi`cΨ&sAme]YUSfv öwbIuvGUK1%Ksb>we EhdU$"(b6Y(3VexwN'h]6!v; ]ԌY5vXUl:5»|l{wNO>LחwZ.JY'g>H(k],tV4f꘱mOM\-N\Ukݜ]>\̽#8b2)}$j\8T$MnSSwv6?eTUU'2M}652nwW˻ew]/8D K$NfdBb6ƭ/\}$$qohW&Y!-Ԃ[1i7ৗ1Vاt:mz$MjA2*Zc*mGӻeltRv}s{;p8LSj%$b2a&]9l=!/Vx\ŤvV>CKgSǾݶ]/@cgEImM\6)jYzIe6!_`YU'q`I.6̄`*_ؼ(k$tQymZIf@ !S$ETTN!(")X߆Iƌ MqD.AMRޗU6Đ$֥CI1(3`ª,3W:b^d4 5P0uL`dI" Hc|S5aqcQ "LFg ˜wCajR)q \V bn3JF=*)̥E.`)` EJʀqJCbR@ˏ{OqK0vnjgs>ĦFF9f5o[;vhzvl+ \8p)D EJR Bu.Wn{^4zvy;A5W!iUz)"[u;574!Hajm\ڦaӾKg:N/WˇYJKHX&T@lPxOcլ{S8Psq4(Yn~ϕш" 04{1cF[BCʹ("gZ"iX,EUnrEJ/VAhO}DiOr:$)hۥ?o_mwG4+Ck `)%ǐskzaܗP$,kq*MKƊ1R8=(Y3/AP)spx\ؼpx _/` 3@C44b,8bJTJDZh4-9V1(EX1TĻ*0JJV9 J̻ݡg/=<?|ܖqN0J)<)‘\XgᬌW$pN\1gb DQ b)g)A (Ɓ3(Wu sF#i00PEkD@$BcmqS (!$ 2zT5W) pJGP s\))Ĩ"Ba pH"w#ownܳ?32Ɔ)5+:1&ktUUZx{0چ:Kp,q|^0sd73/OHoy AFW)݉Ekz-+\HՅjoSK߅9fn1uաb̋E.( q!R)JJH0(:1]-LEOzxr`Q1A^_ftܟNz}}:|˦ΛbtJfɃ^ *xI)P9ڐ().꺩uۚ|FE94Oa u[w^jttŲ%iН~0Z UDUVZ 0_Tq?|||Ðwls}n_|؍$uAbHJ/oJtL ³M,e,gxێ}VƔ"=Zа$p׭5IYc*s=]Ym?]~llQN;grJtbTJ0٭WvϞ2j_պ]ضAX AV2dr0N-:Z%ʔrc,gs1᠕fC*hE8~ Ngmֶ6*N+fSmY+i l4îr텒Z}/27EJeĊrU'瑙5>'h1ʍ'!)'?IE~=>t1B JR1b&PWxqQs] E%Ὄ3g6c Gr (\[ca;wS툄" ,HEJ.cJ=bV^-n:X-% qp.P6Z a >yU5v7>/4p*"ZɖJ|MRYcCRØC(ȠF0 C7Mm p'RFB+ffRx"0%T@IF𨈜x>ip5c)LV"0 Lz8ɠNWLAEP |># B,  ""`’hOC|FG"PC) B..l M,R`yEXBK*FCXbIL$ RJҙ9 BdTh6ƔRdFP laQhBQptJlZOSg2ꓭ"`-$!h)cB0Zc52pf#jR%$Ҡ% a6k+IcĮD!])0f3_#^=PZFiƬ֕MxUKOѹiX!NԴYͫw>&Y_.>zw1"ٛk.'YgEp5T5VMS,UEmkһ]wj}!/_}<OKa\\r20SH~.aߟfb>}xxz^NgKuqcERuaOݻqfϞF==mx<+ 5*nRkr_}yz\)[lH㾛,ª$P],SqOoNM7?w?=z,w5$9<"7py~i;޿8UAkl cäm*oBv1o4}foUBy}}"PX9*^?eg?ewoN%\^emfz&Ic|:t:<ʢ)GҪW,8Me|esݷۻV0=<>BfyF>빦asfj᫹܀Tq=3nxӇw1*-O<%+4~3=_dmǏpjQ}q,]^l.jits'oiNi/nξ`. no7n^ Cw8<r{ݶ:ӛQ)xv{giL%18B5>FX_W4M~/?jLJ^B]n`aWԴJ++\.U]76\ו&-JM4 !o CU)ܝv f382rYnJ$I'O?M :d$TR!Rm[QTJ9Nc%Gtd2B"oTJ%%EDX!)"EXEDCcfρr&KXaBgm嫜ru)ijYLɥp|5+A!`fRb}Ǔ8p7b-*LѠO_ ,Ӷ[4bXA,gB P2ş`-G\孳HY*HX@kRb\p4E!AQMByb,w{H*s)A)'RJk-"\SWP. ƣV:Ɣsg֚I,V$ENh ii⾗R`+k]BlgUU;-KO6̒ dk{_J;Τ#³))!X (U$c7bg"HZ7U6qeul´/`}w8nGf,eIcMSs1(P~X/p M{s}BSȬKV0-3iiXkڶQڼ~==¢ʹZm5'qYsR!NP?cwqyW?scl?fJro W׾von;+X,hHq|z Kla= NSf*vOw'm*/b%h?}zf7_ꋗڇ#W6PJܴ5?n#dhfElqbcy 4u}汇 8 (Μs"  hx~񇷼qƀQR+"#pSwvST%w|۝HM}x?1_ ?UaKg;wc&O}9"^0}SK?yNog@i,nRPUٗ0kfMt<{q4jt\vS= Qfb7fV~z:ATv& aExR:𞼳J1-FJ4PfUwi!FWC? 3=t=T-&\筭CgnL!O*ŰZ7lV_]!Pߧ|WgNۏOo./SwK,\0iJZ0ƺk;q`pBC 4"EJ5Oi C8fư{m9G<)'=6 _Hw:>Z\_ԍ=_߿{,yWiu}%J\RN!4y^ )SHа k#")gbwEF3$H5"1i,@@@ʒbz.4ndR9U$E&v>qLip)㨰B21; ߖA,Z@.M6k@Hr. c$(s]u|׳ {]5M" Y@)'?䄄"rĮ !F)%i2m2:+ $ GH18U+(sR`){,&@)NSJҠ5FڂV S2BV(!%QHְ&cA *ږsx:M!H$(CPyBDBDHRrac6lCbN,",W0_(m\&I)Iy2=Znnc ֭Yfz@6X'D7ꆮԡz񛯗*{!Y_$VޙcC) 9*;A;Ôhy ?¸X٬gN; ИJk .0n74-WOa|5[={ъ4Wn%.* K921'UmMPATV\Wq]?Z^>~C><1wné+Dh]^xT0JU+C%3C3(,}s:^^׫pƴ^>S_ pLifI]Kuy1[/mk;~x|8vPzx|$LiYm4ᬶJK!"Y݄"D\ gAt@ۚ6R@X JAK$y媹qwsZ!w܍y]ԍ)B Uv4N>#fm[Z3_~evDϕH+\:5 "@]j+̩ЏMo_պ|߼{||Jh "b&*%3 iK;ڨs.2L%J+ 08aBʷs 1OR2%|;o!n9#Q^.5h 2JP!\ g a)raNIeSJ,ZI@avFǨTyy6O%QJa"YXgM%ukC"Hʞd -9HȜ(EĥcZhjSW K)`9Y_rM!f9)B &MD)8߯0p9ctޔ̹)L1Դ6g. 0(M8j *7[IBZ8R RD(||2#/"O|O/B]?€øLH&1493/t@) WLØcuSb*U~t8 Hgբ,?aT?Edt0u4ݷlsyH>>~//>Y*};ZԋY9b[ϏZqN0KUѐXEMJCJ Әs;P9\DXҵCI E#j1^~Ĕ\?n.)>lN]^^.Q3el[ì-U(ZWOt8"KpE͜SJB"T9ALeXrI(4(\ Hd6k}sII1mGVd攉*3@`bkq2gF]VH`!T,%It[WDr*3 FctCȁ"!3wFRA1w'w3"PkrN5MR:C?DZ+ǥT" qkSȧ0d1ʤ.Nĭ!J,o/T7F3`;q,Y@f#5)%fQVOSA< ۘWRbJ!;.ijZ*:4F lVnS 9îXgsU%9R@BtU'CbLb CVB2A)^Ԥ0eH ʷUSPN"RKmkK,"Z*9Q]EX h欕vo1FXEDk\z(\rVk.IrbeP)5ab`ᐢ~?vcOO_,6nt0\^z,elf8C$x#s0K}Wfw .k2}DHJgۗZiadjjo6c?Drk6ߧoa1wo4kc~zyE-wo᯾_<{y߼;WU4=>-Y=mMS(v{ܺϿbsz2rb|nZs q)m6d=>4q6ژ֛ WKa7jB]ܔ_W1z} 4'4aZ$DT; Y|LC=$ǎ/V@2!Pl}3/.CwcvK2 Xa<}W?Ï$}7e$Pb"7F0f6k׿u]%^]^ ! ˻Wj 4ܿX[]Ek=M(gkTaǽQvvwb-0*@) qtٍMɻby6\]ya]'<~#,^!YNM9?}f8ϔnSY?j0t} g0؟}.הc8=l/.?=Oi@<uU-Û_ `qC(طo^ umn텶]w!r z%oߏݤ!䤜o6o.&$\~LJìxv[*: V @:cPFSW1)Yq>Tm)~ z㾮bSu*_ˉ #ւ~N wдt}|i?(g.P iYᔧzg-6n\lV)Zэc?JaH8Y7xvӘ7uӔSLLz$_b,ƸʑvBDiJ}1D0SvP(Ip|VDz1TiO*~/- Z;`͇o ! D( YבEγw! cmU0rk).›Y(`\2"f9krhZk"4Z&BrsIJ.~؎)KU.V0])2ڟN#4j)EtP :G!DD&J%hEMmc뺶F!{ƂxsN!"N;BNax<ŘS Aj)RrUtJC.s@9*1m0b9;J)9"xNaT 8kgHGkaR&x:HeZohu*2M܄a"Ӑ˵SW5l9BE 98Noƀ .T erv.O(wۿyexjW4[ʡ Wf>WoE6~v >nN)了ܝN۷oshvY}V}q\^4P@R*1qO[,kW y͵:ӇoL;?ת\\+;q𾴍>|Ҷ62&['FW>)?|xLÏO?|+0W1<3|aBlZ}q)?}xzz|絯>~P/0߾Rݻ? ZKλ]wjuusE NoW2Z/nHNiܿxqb cB*9)Y3BЮJL񔭕Ū3 jR & I+@lo~߼;̖Rbjx %Գñ! p!i)v[p[&Pv~q< 0;hJՕ?wo>v.l]b" .ХI{I-t n{\^hӁa T]h$;l^.żHs7PUzdKsilffI@INÙ޽Mt}6B9"tuHPH Te[o&F9e, 9k $]23k u֚kNP0# +4fxss5ژi|8ra )J&[;WY@Ak1Fh;]2qW !0RiB_><_W&$&ט۾ީd(F"1G5_\ $)2PXd(4hղ1fAkQZյnQi r)-TEVU%,HpYPXQx^Ψ@q0aT&^K!UyN,}eMc*|y~D궭AVBD W_Z !AB#"J֒sRD K䤉YוHhi&%2*P ,+CR67-0i rx9ww6%vQhW폿ߧOR;#Wr> )˴j/T2͛[BC159/!ƙKkmaKۜnԦVn}u?< Aֻ XkVCAU\Hy=V?Zں߿>ؽ\m%/FH{`’rS1nS;grlrAe>>R50lͶ0a3XL>r9q2.moo^8?=,?|\r9OXUi?RwfaלrH%5d,y}|NubۻGK&N@DPUfUFFiR%2ii:qHrs8!Bm2*$#pE`5u^PK Zc92h#%wn;,cj4k5!DMPeTjkhhf.BeA[!"!^NHD::NcJzmAu."B"O[;_{RDBB$ tzB$ʀ1gR \"9qdND$ P 20T\mz,\H)EXJE (6@Vg.tiU5ek,E6V#R,GkuZ)anx ±oMUAr.EUo$&`()yW7t<-:[ŔRZ뮯qʩe%siZb` "9ĐcU*1zB@R6R08M1b LA]eI@R7Pנ5,)qL>eeAUӒ^cJ29)ͯP,kȩl̞ JR(iӱwo- )dЊ@Y$ 8͗OaW@jE.@>3Fk8nw4^NF5چC(%=?]ZS)KʩG eQ] IDATh;lw}X$%)nD|~$jY|>Pw`+4y] F yq/1Ԉ)!弬nքL_)7.Ͽ7v/OBzJ|zz$$~f__,B9!bow]3|8stn[v0 U)rsgyi%7oڮ?x׸VK:{!!(r"ĶuIsWoͶxW0 aSc(9{ޅTqGPoq3CXnlj(\2;[mԫ!h;PowRך }nxVa OOlo^m\çGZ7t0P(`Ujwo KeKrEs3PI*qc<Cר m~Ŷ1pNe]3 ΁leNe q]= {L""93gM3}s/SbQM[*s^@jEYNTT "p8i] 8޽7CXC9+M)sCBHGt-" dIk2JKL Pq DJ~NE+Mk , BZ?|j{}ٯv1rU㟋!]DC>!uyWyD$D(p]BFWTȹR1ɇcT K"ڐXU&@`aʜSB%R0W6|$Hi3Pe3"F 0ݭ#%Ӹ.s\ àF4mkZU"$%"PJ Lmp`*"dڂ!R"w7Me"9:vg%m1nB m9ͦk0MEkv"R1""$DfYO)eY<%-vS2.Knc*ӔSH_ֱHr$֜}k$|9mV˘_^W ,jm23Wk r%qs\Y=ќi PR`m_>S2llU7)ݾ7"ylo6:T2ZӮ:3heC~ǶQ٧C뺦6Z%Tf'e1gcH"s|y>pF;K %t5TA(;R,Rvh6Zr<㧥bn <=>~FHqxZ5+BA)IЯ(-PB0İ.yۍwuLJ2 nM,r3f9_`TtF~y>ϥm,"a-lc G@ɺr@iZ ,=ݭ߿nQ "@O/Cݭyxzi:{+K=,˩+66"صۮ3vwj a~0;wqQW4m~xmϏ) 4.ӝ5+OzʷUXV?+$6g+SfQ?$"|lR@b/rKeQPꪱ!q&yξt*lnn>ÓR߈dߢ kJJ"1\|y$h[p 7-ٯ˸B*5n1mQ8O4(UZ PXú~R|Ta0lhKUQEiK]^ A׹E@8m*ոqn5Ot5mW̫1gAM0*ʕ^ $W )23rA\r[}=_)D$j|Y9b1pTHLUWZXɿ߇? tD1u$z._?( @uP>F& f4"Қu:!!BCc( UR :u )jp4M4YwM50X2cߪnhs˼v}ňR ʺ:X4Wh[a;/)y딈.opi0O`^JWm=>> 11OO>cYx|xs;v;q%4nhTbyoqx>"$XU7a4?4.c*v%O,S/*Is5ܐks;O%0nj[wu5 Dhk2V4lZ$[@ QqƗ7 oo[(c. Np=!4n$N9O8 x{7}iSJ15kqqJ,[W?/qSߚ& Kjf&)m\ݮST*ʭKJ*ܛ[k7O?cӶ>}nny? 6iN.+/?fSE FHӲ#Fc!R (e^,{MwCמdK!²U߽q/χü.1Xl ۍiί ڀq)amk.LSuynp<@ljiBJa]3D+ЪJNM,qC1_?M)'W5ľryz~>/ %EYon_qb9u HUU[i&ܵovsU$#UɼN˟KrVMV;c J, & c[:6S?{A<8㜶[PvmWsI2|wV*F,7~y2ctgyrsSݾ&>i9~<~~=nZN}ZNDkgڼuC%0S}2#K1U f~d (%V7Cȥ`f(R v ^NC"b.&Laz9P MR\ُqhlBՔݛ_|>_}c4K\u=s)񧇄[aQ}R23Yp)cI+nnݯ펧:xf>~Of{ۇseZW6: mdYK*L_ӒPFm1'!_z3p{{tAUWW)Mo@0\Rsn6NSWJ4ABeY)k 1Ôcmͽ>rȀ*UTk CӑR0h \+Dqr9{ (r]6V+ \5" %!Ň/~ZKhR: l>sZQ t0&NJ ȥ J) F{sgS΂E9)R [ MM5 *Ȑnݰ* FPzF.$tݗA>XkAbTP(fMfubU_'6:ꕴ "s,,PRĔ4 U׵muH)|e @afRrSr^V mmjuRspQ]ǔ8%(Z U)d*\PJ*'-#HҺX9[8-ze SW&u@" D%E*L@'f7Or:&)W׎dTUC׫;Ss)B%ɺeO+1eby.16ySش۷I4!~o_[i2/dPAO# WvnSڡ\y g9WJŇ#YP#I=ݽOImm\Ο/u]!OϪo^[ʼIsyeQdRZ5,FJx:oþɟWU)s>cG;uy߽??iM]Zׇ`F# ~Z6^o}v1Uu|S`kPf8]V2ULK,UZ;tuSڴÀ ??^NK]Cae޿ij4ZM0N42hZ眼"2B0 X~rȯw_>}>[xZʐRۚryz:m*OqVV0ׯn޽{),eyz:+U5Mr$U6~>s+P(DKδ)MHj`]y/ZUMpl6JlXd Յq^aU7u՛MT0'JDJAe붮ڼ!յ&(/>kc*QɠƢqd+ei )!9%|R"wiRJCʕ) BZ(,cN!*+HȠ*H̙pPDZ)fۘc*NǸK\qQ,vu6c,PCҰ2s&@׼ 0Ƥ!)׈r[p ! ^%(Z4DL1 ;tg3`*"_l׉L.5 @"PN 0K\$ )itRrfᔒ !E`Z%D @C,j1Ubd@XZMP8m)%KX EP N5ƏqS]2@8f9f\ZC)/|*\="י훺"~;S GKqJHZįO?Crμyu%"l-XkHt"[u{#OTU]Wuupu@Θ4MqTwx>G( ص;W)_n۶mOC9MS|rEU@q*勀pӈ!@Ē28zm"cm\][QHg}C#K!˸4jcOQi9 kNiBD(E/O唍V<OoftjnZNdyy/4:Q°5/Ʉujuhz}/~\u28MQq< UUשzK)77۾ڒk+1.<˲Fm6)mwm׵~xw 1A캪yeinnRrLx]r9δڶV}H"F+!# o"E}4t<}X&n?^ш9i^cM4O)eg*(ERnZe2!1vR徢 YryN ME$޼T*,Ia'~4 Δ3fTNv}{#KWQ߫ݾ|jC}c-MS1-E̓Ml !U+2O^Su6KP BVBF,QAӴ5'&ewf۟< ӧ" }HMM DCZWU>|XJMrx~uokSgy2P:~ɷnmSZaa;Q?4n{{wqd/~Ob6&JJ2aetWi%q ӰvUHʉ3%Irӯoљ07muw64mgi^\֗yt’T:"epc9_fpt|_e9>owpn+cnC J()|~F<-Khk knkt&6RtNZg]AL)\M|K,}fMUnpE޽šWB8旗I[s,jkO7n@i<ڦ$%募Jӷ?|0ǥHVt+RJӫ0(h:˴7mӸy*j =({t IDAT9$M@dF<@1iy5"<b(R8W-sEeYWTF)bRR!vMu[sʔ Qϩw0[%RˤTݸ{SMݭv|NOvS57csZ.xBRXZI# c[=3d 7o~ִOJk6_$5(("9Ep~yӽ(˔|}o!~zXeeۙubutKiiu}wH:A)9:uFR YWᆱnoae lt"bɅHW3r\òƢO5Lnv8Ur*4Qked S48@fd_ NeӜ(\B`-P]_H`{G`UP  ^dѮj~R7Qѿ *ڀ&@bFQdFc_B P* "09mQ<8eΨH+%WP."EPPQljVP=µt7NAe)J[dGt!֝+@BTɜP(˥4~We%PuY۶&I2Jg$BN,ŧP2怓$s9ium05*/Rնa.y!CtMӷMS"xVJP}y$c\ YŜEEjL[0i ,,#-ܢm T҄V L^XNFeZN9Nϩ=JUik9k㚜0O':[㼄Vk|?k}}~)4}?xD׿5o%<=V9bnrnLJx!~9֑kF$XjYgviBHӲ[ \/aU*/S8d1*~o~o~U1IQܯS~ r cSƏ'|B$~|\ˊcvvݻ%?>o0mUh3؞J'\Pi,ucL95*JZn6?ڰD$'Fa "bU3Þ?ݒlQVC;yr|_D^P+|l۾zF'qOCY"y9<Յ+evUL)V&@+K 6*-MUY^wo苗`U'ճ1|8~:ǩ6?[au˵1{?~_1ٴp}}u}|؍w0QOP2i1ǟ_\^v]YYYW-κ䦔KZ,+.ʇ)8J1L3X-ƑcOyxq enor9v &8q\w͟wa4F\oڦF8}͟î) B˥ß._LJpČ(M??hiG>{eYwr^tvM%!Zm2oן]- QQ͇a7~n׏U/_//Ka޸ ±]l...7ۅR|bL!8`8‹#˥_޼PX Yf )m SU)BNpd '<7?RG' #>lY)Z 庺X"*%~/%8OS|-|u\,n8΍9.@u]+% N1a]7L6U/yKX,%<["}ӄX8wo7oy.RS,Y2-KR nv]}WR:/~R//^^*Z EtZ7c緷!D @֛lXR~xwimK|-iN^gfuo<@@ ai8 i.Pv.K28Novwm^~vC=f)m8s]N4Df{?<̋5|Uet EkJ1CMB2pbHDk#%@އinNnfx)yO0aLWU1Fd]RG8.3N\7\yww)*"RU -øB$!Y (J+EnU%JVW.Ocn#Z5m D8>|:R+62W\fs)%PUHEsqȥ0ϓ=YUɺZd! HYrRRJB}t~s B,g(]r J SvgbG$y )228 wMJ#'r.b(n"JI! d!1!&RiƇarɩnh׋2}.ifBJ^xEٝVz7wrя}B t $A,ݲ5gIO~Q[zq}mkBq pTVC# ӄ+%y<q.aw( ؊6feٍ0N䒍AUU0iy`kG' !) uJŢl\KYՕL9u% nji~+ ڂՠH(qFWV!c8$D!aTB*TIyapѱ )rtBٚ嶫ZNƪUN)Ƭm2ϳO_~q^.Q~{.by CџNn=%e% ڎ%tԼ&"0iAim/,\*p_׮284nx}AMe{rt s߲T{_M5ΟLӬi|bYRﭶ˕i s % y~z|@ (je*K~.O]ؽ;ş7**>ru_w'KC[_پ*CּO>PW7}~72 VMðXn?'H'm8f?z|?fZv RDAIhO%+ JTwҀeL'oִڼv}N?eH )tr%e1 M)r%HY!q?5j|ᘢ,uD۶X؝rhJ1`&fiKJo) VX`Z/n*88[U/_?\gSw/'cT,q{e$.eS'Yأ MMt RfK)LXm R)b 5KLxn:r^.6QRB1ayv<; 5n?#D|rh0JpZA!%4I.7'|۶y#@!$(R2sbZ5mܟ4FIb9:΅j-uNCےyy.1`+)UJJ%c ڪZ" rRXJ*FB>+8)]bR4xqYSJ1%PE*<O%$"ׅ+`( ЙF& 1MMe3Br1Nޕ/6Es\ }422rOA)@wB03),ZWP) R*\>UϷB(KFf 9g(@d1Bɜ @$)sSb&\UZ D.䜭%AʒsJUmCP%c*R"*ʥ3tk!"B2OQ&}XY,}w.ꦩk)*m(26sӹ˹ڈ0%1'%Ts9r!TU"zS,JHf^.M[[,0a8K2Fif ~t:cHD" hDu "ԊVkk +ñi*!ȇJh}cUԿw)O8cJBI.!(<>|(hܴ )q.EqR*UmQaɤk<1s pmA)Lf盥_R30YNq@gB)O~XzԡU1s9KVԶ '#r.S!rs*[ЧӇv~vx]N ;J7*\H?yG}ZwM 'JNjqqՀYsJ(Mif4 DUEia7] z!VV<]__]lm7 Bq+>zJڶѦV@B4+ђ^/_Jcܾ=R]U- y#5®-x??ǪBMaR;jXo }پXo~÷0 첡};"ի#'rC9qbӂxmrTϞbs<a8Z Bkm@(s1(Zd̩!" l/Qje٣Bn,} F-3NID 8%p![UWkm4]Vn9. $XR,tE5j!\l*!h1;<dg%&df)ZնbH@[ `i6jYR,Z44n ZaJbUC_,RVZ +aF"` yS`U11!*F׋TJ>Ɛb)q qᔙcNI!9ɹ`. 2QXc,'}|;b>:@~[)kAD?Z1@0Sΐ3ǜKDRhs!)'@,R9i5NPx:nQu]XO$^IjeJ$ `%)v!ǘA+}MspJQPyvSD)sEJ)D <I ri۶dRTN'?%@KҊhJV+$!y瀩$Պs.ղf_׵̦]eRCns XHȔ]W%is<&x?z[n@yw{Zuk51Tw3Bl[lB Jl/ۊ!iH6X@IZv\0T.OpᡄT6߷ٮWzTr^FO?< NiRJSpX['5[┕-v IDATd)ů~ۇp 2FBΙV>f66ruo VONtFv>׸ǻ_vZ/?[]\fY}xy_֛Un.7/~)FR(3{_6FK%(Y+.enwjIVKd2se1ENIJR1Ag/{5rJ1b(Zӳg]]7xLJpLh Zs l U)"aHTWf\γ{x8NSPNt]m>RQed*c3SD 6ya9(.v4dSVBR%H)SURumIi5:-yc\*TEvS8)TVˢۦdV3}loꧯ]J]jcI X81 F "I DXJAdI$@xɤs @b.Kʲ`A łP>u;V~)ʿA~<âqoο @b5Υ53M0R \؇r,Q sxKΙcNVVj}ʙϜ߻ lПM""I)FܴU HBDFk+ a$J$+[!a&)J"PR\RLjP1EƂag7 !Z0KJ~C? ݔK˵l-H$J"!sH4%d|mkػ[ 'q:ꪫT6WbVq5XGebmC ]IH29 жQK ڪ 0;ʔpWV>{q?k8NZ-;)1BƢ 3|{&ꖚN'b8UOu$%fiz|0#7Wǧw}f)Bǔzկ`,PAkuY{m›6jx?/;җ(wof+.WW7z}Uo'7h+U眛 x4u]O_m[)vjm֫B,VjqY[uSOӔS^/E`IrՕ'Z}\n;/zb\i;:PHd; ,}4i_ʥxGןC}'(9sr80Y@l7k훻~=XL$;nψ8<+͒ī+YbXmE㱟avD":>zf.Oq 1qi DI K붚)stSq4Raеŋr{8g;$Tf b:fa0&M7rZ]{.R5 54 *Qjh%R·AIι<C4ƴm']m.T.vNiם1p~@n{7Mq&b$gwU-_lh^,lSU!V1b_xz7]([iBB@)t63b؏:!a. JSe4֜TJ)@k.|J1pP2pfHOgr/0"1suD$Ν+xSdDO s`8 +ob~ĭ'QTF XLB'-{2c(-SH, C *rN9ۺ)0"hq:P g`oOן[Nk3ƓnA\M/wk'j8yzo,VFU >_Ţ%5~sj2uppk]궫k]gh1նqfn L\_n!G~sw򆱠LSςjg@!v2z>FF/ZN9hAb(ՇcRCOM|cB?j[/[<`>9|n?2PJz?*sLɝ?\}MxŔ6wn} O~їB 0 0 `MXtnd4A]YC"02HR`2Jش(|H>!a{a [A<=[r(cik-R2PBicZ#R< F(RJ}ZUJ-FRaλ205ѹԴdF=PYov[[c'7""IPJ*S3,3\ c}d%!ń77D8CpM5M3j24J%d7"uBFP(4CKv=S4RZ ".@HTJQ1V\PT @ c@.g#9>JU10cEEɹz9"WgaČH?Ɔ‚JOggdF(2bt6|5cyBp)yR$)Hr;bB"2Rb(BBt6$HDP<;H6akwleΔB TXe[񽔘:G!oW^n]nݓzE0VN Q2bytͪ5GvM%.ݼW[r*nW_;qyLуjcw۵5sq(>ܾaq,VzoqSȮ%i 0 s0m+;guӘϏp0v]=)HhNHQ!w_U_?#(iv'Z*bt؂Ax&)2!6VVm8KnzCj\?xvqRq'`i2 y ?WUc'4e|㢵U[//$ OW۔]]ͅI) s'oWi_54trU4Y"CpZUC?|w*N08`SLRINi6$* `4mV߾=J۪4ϟafA\ԋҺz?Ix"݁؇?s[m.JND LϧVnaѝG̒(i. ꖮ.ۮ'4Y"B,Ah R3JB][mDivU!R$eY,b]m7]Qiun3 {x6 NB@`rO%͊IiU1[eթd)P+@H1g?Է߭d`b X"abFEM>6K),V#1Gc230PI@blz-@SSqpU !~}3 <<̗o.xKu+JеM]c)ySBtv4=,i˯1MŴ yr`MPhl(0&䎧}qSs~5Myu![cV˥q˹edB)R׭w]U3A,(TBPXTpahRFNa/_c?ի+dHlQ~JcQ0 1gqi^oקi1ՕCzx_\s[F4U״=rւs{ I ww|u5_^Wϟ?Cx"Uc!NsR(<SӺjǓR?ɠw"mYFn/mzuRE>[%wh421l쵫},%PJ0CGNl-(YKs5K\vZjMHT/ztr2ƨmq菾[ͦnSBr,ƪgsaQlq5H1R(!8,b UM׵?a.()U6:4S߇,Dm2C&԰ڈ89ciFlY,!R9 &0RB*1% V;g9#SH"l4FTa> ,R/y쏏1Π/C #Z/%NTɉOV($h%KN R@%ZRZie. 3H.a@wM? !JSED?b A '+? f DPPKm]h%RJ<OK\`TJ̥ssRCAJ$!:iV xk*)}|]>[~u]7ahSx|>o[خ"qS?DZ\@QK(|2tia`J+*E3wΪcM vxxs!uaw]˜]7׫/>Y3//YnwoW榹? BSF -C >`T@nZ]4tȦ*tn!'JU idIkэkOݻ\9pњFtfyr7[3aT7더WtX,9&cQB8TSە K;\CȧS)>%yjsuZ>tQi_@H%ggbUkyOBR 7e`DއŢ0)@)rZlfLJq裐 b#iU]JDnO\R e[nT180Cm@ju۶nDGYJBծ[.9tP2Rxyj.en;Qrer!ei) cPC*!oZ Q8 J3<'DĪ8k?s&kjD89GL/J\ԅs&6Rt!r@. ǺXʀ6?|<޿{KkbHd75fsEM^?~DZ P(0!KZxAJ*6Vk1Nq?RSe` 8MCfϪnQ1Th4i`MNa Eh%s}Rv !Rn[Q蜛XJkY7J!  ';c? 'GP m.!PL%++%9٣b$*` JF!cg0M%TqP.r)EAkegn Q Y䒟&6{~L߳|ĐR)(zW.A &fxZ3B?Π!XR,DQ0R]98ARJDD_%\Dș|A1P?|:懻S,4>]ÑJ_ `^$_٫E>oNoN^.նna񜽔(Ix@|>g?[hmKa)i/**V}ŶjWa EaEm!I^}ŲT>K^jlg_?\^>z" I\lbi07[7O=\P.xqutCXu dw7r\@H`OWpw7mֶ~?P^K{fI\2eWF5 IDATqw~`}&?Bp ˗%|CmzY 7TbKU+iwC =Q궕HH.Z~}<)0P/|LTHs=bJj$ԖQum l8;z^z崔̚be6z-\1U-_l%<=g҆Q9ѡgQK]7THa0J h$CW5Aa$ʋa)!!F vj#i4FIRsn6gT7+*pK,RREm+d1R8_^}TH)D\rFV1I F )et:n?Lf-kfB($(@-hԍtL3fDFꩰ`. @% rf$% 9R`ZbL JႈRy=QJI?fO/ACd rc Nj)FEv,X$iTu1D)1BLյ4ǑbS It;*P|E}l! Cf z匉3MrQ6EkmOӰzFH^n?ij![q1! W/ڶ4Nw?Blj}vCZu~>YV+,D!ad`]Mڜ윤Mwo޾-6y<*9UJ~u?LS? *U|"Pf!UmP8q1L ̾c^<߈s. ZIUj͛7 Vb hW>ߝre9Nw^(ƜE)XK&[REnj赶i82]_®/U) +.SS)XWJzXkq*l]Z#HYfs)Ҡ5)-ڀB2 p5\^*N iub*TxrKV,UՇSS.m:(*93 f3ݾ pK(UU*W+ ۥ< CY ^9M^m"ݛ?u`JZk]ڝxdNaHley T@)UJcxFې4g@jJHBa)}rN锣OSz1 V H(` am+k, 0qBiS*BCTb)3@ BHAXr&*O7H&YCZK! ba|"x>NVwD$""/ן|{$(5O$(CBJ'QƜX2A@\ 1FŒY)R9"}'136>} %.WW;!4r.cGey8/8v9SJªחNRX\-W1IQRHDDtP6Ji3iSk+SU\d,=蔦i:Fo./D5e~- 9gj'_xnFs)rt:+9d<glyBÜl%pE\֫8?%Pjqڮ 8sYn~Mk,(<Έ@H!J¥@TC0L0BDƷo:S7Vp:G6Nv9E:Zu:yܟZeJxAi R.XM=4lmijpNt_^ ES8V̾8&ݦBsf`ֈJUUK%4OZ|y%/C YiV:( 1bPRǦ[8cuILq"-jD})ʢl0yPjVY(dk'+PƑv{ &tR yvV@ sf!mU46sއ#@ntXnVIpX`8'ȉCIXZǐRiJs!PJt>J-9FZO~'?gk1tKMUPl -#֫E(N~U JL̬@AH:- rIȮ`U9.,T*F2FVJaSy'(@jPP돸)!AʟV2B؏J"_=?΍X?]/=??Џ%1J Ԉ Ĥ@$~a%Z)(Ee4ڀ+!$ĢUۮP8ź;ﺕXuE%M/)`S}NkmqU'z5CLWMp_Y5,ѕHQQ%+nw>Χ=PssJR]l@*`mSXk%F?P^Pr~f#Oa8ΣGf$s)Sw)'sNHD|jya73Gڭ>f [ WJzq~>xD۸JE)̙pXcq?w9̊zwN )FBzWulŌNUQϳ]8s~۫8yw$@r6~BvEp:L>a ʹ?O_|~/@ft.x&e:k`2C]8yJz)ה/S 8fB? TtDy2B"`ܟ<+CUW/RaS/X>4#$q)?f_eH i?}8}xۗO\-uTژS?@2 $\)+V%i?&RO3hM#WY\) VD\J)r%r)˥rFT,@BJ9{ Rb((`̒8 (BJ"FI%50F)AK$b"LC~L9qΜ3( R`+4V:W!1=? H1aXn0`?20yu咟rhi!}7)]]M ]c(I -؅ *s*TRZ}:#?鏪ӹ|nI %}B9z Olf)}qZS<2!o.U׿>ú.XlUm;vwg>sR:3Q{9z*|77믯]=EOo`.YkYvS t8@%m7uI~*U?}~?㜉i;PQ*qlY}]z|~׭wSj#i^7[40R/onB@]y݂U9a~4)vJi$̑STQ(lm[M!tUx-)pub4E:#eM6XaS0iVb.-xWk6hsDZdPSܶ|:k˺xfmДr,A1HMcNWJi!$BK10q?]lswT2t>iy~6YwX~n}*'ƺaKW) $S̐B XOxfU)RXJMcjn? ®+WSlm}zꪪ*:*%",P\e)qwO C>bJ@IaP$D΅1J.C!B%Rڶ=t>ќo.Zqw8f g/]7p8·\msZWrRH 9t8_ g/uU\4 M|w`дiwfdYW.W+ \6kնP9T6F0!fE)A4(sZftmyJD)@W-tURh&R@C.p>SvT:O1r@?K <5NMK!L av1JJ(ąUy CΓ&kdUUȂF_Z 9`VFUSJ9y_P)w!? DJɥ HZ3-ݢ 2TJJOxR'h2~ʁBhy ?V83L'ұC EPP D91 +S)Kb=>_P"`u T)S1m2G?0,;Ivp؏!L>F+!VTy3Jzv5R7UzZ|\_Et:FΆ?^/?7~H96u'[4`pl%@NR3qEDF/ d:.>/mۿnCuu0q߿BBiy)_}?~Ϧϻ.Ӷ,UimGRUԁ-U6ZPhbEuMJ|%J5bvӹOTmWˮ^{Ї|4V;]w"|1HuW/ZHfIʩmkRM]@L)"{JlH `- 4Br˕Vq{>\]-6"ͦ*$?-BsLcU !M?T75,cF>QhF1Qg! Ds!JA`sd y˜-PAB 'SB VZ3+i?*#01#]'ǥX )| }ɀwa6,@!FB(EW=pj*-k*43#FEߓX i5 4"""*i`Y &9OhO ª@\HU'{br{SUWϛb]36ݾK,% ba.7).D8"gk򰟎$Z51N \#VK?8% C!,9ǘS *+Bs)3K%gp^&?p7+w}Vr,󔃧T1 AP[\EZUyӔ` UV' 8:!R2$.XsFJ,xvB,,6R1*%@ Tr- VF]1e9T81@A7$H>PB΀L$ RʟV "4SD&$~!" b̒#LHTFc?!պ YdAO$t"NUB% rp!Ƣ RbJ@'X1@LP 1d)Z -0O?GȐcO#)a[B4)Ͷݾz/p>A`R-]js7 \sW4U* t%iGK짾(N9WtvP:^*$fhj-y8<Dm-T-ۭ by$6%{P!ϐ -~uN",B$St6NJxCr6Z<9=kILT[FR[BvH%ƾOjוx݇ӾW+%ۇ+pm`QNV LCsQ[%O# J1E!P$bj4jf^Zknêbm&!`B*[PIVҢ8S_峋M-k's*$%ITRYZ@sʱ0 a%ttVH'WFsWTq1l@#J\m9Ca,RuQJJ P$(% xY%c% ш"fiFL@Mh뿣0Vp=V0 bEH F D>z]Q: P~ו ȂI#3dB`aDBSCRRRY#@(`DԂK<#+)C!R(*Or)잕ʕÙ'OKl)9>_l!ψҚ IS9IL %)Y\kŌ|>̫-ӲMT"rxe6 iz$_|Bi1Sn7oK<54u|nՔ2?|[]]ƄAQt<$Ug\cLSƦ_|9NT'ffB~΋.zMY IDAT=> w_=WP78ŻoaV*O<<K^a̜p~Yԣ}&rFք ·'\,i)3KQm7aeR/~ˋ~wwq>\իͳlqMEWya߄"cbjhLͦ^v}ԅ=v+yײjp·pU-e}݊t= wnePFerغJj8ƇC1x@r\nQuͣ81^]zyʆ!0BTNɗvLr9A/V|{/mשokX @FAmW_Ji0-"e5pTr)%bN髏Y"i]I_}g&xxKA39p>F!Fo@NL&bqNQ]̨LyohB##Ha$ IDZ/TAA >nCC)rvXofI*PޅTL[d\2Q'rd#3E"Rk44&?'L |];.w c ( f;9@Xbv1?AF7FpD>x:_x ym  v\-R\b ?Ô}z_/O_ޯzV엯6o&s}h~^;f^-f{vKps6w."1 };ٮsPMB]& gguT^I}-J'e]-F(m x֑&ȕ+:eIElVe:MҊzۍ<}we-\^&/>?q#D0$/bM8Cׄa*ETfte"En2fhB!X))_y8mCQ$  <4` )c!+{C=x_(C|)7Lͧ[G}ZĘ5 @p 9 >xy2|FiX&cc R|A>|Tk$)V:j4(Mg'33ʪO{Bd}[_dY;A~/i^U!8ɜ0ȥf6f7)'Y<-sLǼ䍴:YV˂XV>Yž6nZ=}ta:)݌iO޽Z@Ī4êfYG7_Or}wxE_˿{͠?m\kE'^ApH c~,xz&BՋ4-KEUa/Wx7 0Q=G)i-?CV_*GV\BvCކ%@\8|t۽" pu8],9s=툉T\G@ VE0sh,<:)A WOi@z(Lc1lmQBZP?R/ke$8p9+11.+묕s\Cj/y]uYcoڮ?\G"pv!T,M<+Mۘ(E~B.I%NZg]\|vfPYQ$Bp%In8.ZDRH1d!$xarS! !dQE?|.V!Lଥ!Fp RضvYiD3JIƘs.FBD!8~G{?E].0 ɪS}<;j'׷~!*xwع y91A3J1D!@,_uZ`)O> g+++J&Y<;-Ե]m߅rgg4t؂I)pABA@2F,cZd RemcByWp,pCBͱN(}~{=V8(D ,yxJs"S$Җ+͋"y7n1K?ѹdgC3uzrVsx?zj/eXJ."O2ϰ/KYe=loߴb/ﮯDUUE!$LiTβ=$iL \K fe>oE)88O IrVQk0WwVݏMZY7 Pg^|c\8dezΈ!C"C!PyGfg-,Atcu 88cyf p !ԴyvyXY8÷_mڃҞ dR$Mxwn CR$Z3șTƈ1@`={cB`U<΅ip}#DH4j-~~ =NQ b$$91|l?|O8r?=BxX00>@Dyd߷ˀsD a J)P('(sh]4Ms|t\7Ȑ#1i-J D)vq1_yQqp{R"CeiʪhC'ZkeTeґaI-Gcè9i .BێRPͼNA)؋WO߾̦Wu[kBD&|jޓE(}wW(Ju*;RP\ 7`mHa@hal Xj i<ūMYQ$/5)Y煵dID{ؾ}p>T8`*Is !s(nDpCKu/j=_b#iж>:ŜC~u7e\" s<ZJEK*e\t""g=4tY1w]wvU,JYո8Azl|9%J.\qr0q]Y#ϋҶa}egj1KnslJ왝uZkG9L,WEj֦~n C\]\8ҐJ7/$,SG(g"3q߷RRd(xכ<Reʢ-*"2aLњLJ/r.gLؙxii0ZG@@|q8΀qSgEH")Jc,Ô"H Zs6IB3<@&Ww!x<ЏhB >x@(1 ,kĄxGYb em]%(Ԋ)s,aYovۭ?LYŻWRC,*1Pf,{o{}0R4>:.tmaPTR`0Yɳݞ=01`pqqţْE"ҿ//Oy;F4[Q$4(Vu*H@&Jʺ]ݯ BL+,nC`'*;3k>R ,J4XwM|2\I}~6l !ƦNgnr~g >I铔c{7txv.dym? '.BY"Hmx.Sq8۟O~'CS)VY^p&%*7a?n78,Nc%ljK}u\*pKI/O$,`IVUQdA+"Tl΅ dIR/$ͺJ`6gӤ8/Tj)E$#|֍#Mas];9 CCY,yӌ_|?4NC&-i1Ž;\RJeBB777Zx[;]UU&.㞋aYryl#cL'J T <:kk,,Ttc :ƶC,S]Y9E~R pގ&0.L]2sx(\`1tC׎^ ʮ#Y%j̲J].h;o_~qyFZ "8a];f84OO$__Xwh]OXdtz&Zےen@0ENNW~81j%ݛ{#8[Ed~}o ,'cqd: 6;X7 ޸i"x4j}}j#o_￙Fb_=B/WIUݏowM,%?XF2}s>h\Cloޥ_u c/]GLU22w@=`K$wp dq#h8MȘb.2aMMo>/.NNϺj9îz F(`"TU,Fcc0l7; guud}S ΑRHQFfB*a1)l&b)K(b% u"y{׎}ooH;]J㳗4)ą0T2uy9v>hqr|tc4;XŒeniL9@gđYoͺQ#)`^YGq {J^=}tyzH9}}ӻX9g|YF~xp<"%D"N44HP0!d|E(X&;c yƴ!Z@Y/wC14ж11 )}n !8 K3Q 1"$ ߷|,qqF"Dj~l'h`%"xsRA&' ?9ah^{,ftR(b]:92_dS %;vGx 4WO7koe)߸u:#`{V2Gl~"d:Raip_W߼tr6#.F= $YE )Lb{}n`5"!qnHpsM`_~*Hl=.T ]w*?<46a M3> OV~Ӽyk|lTX'<5 *ʢ*c͕⋤ڮzVY.o; ǻֿ~הpvA, e tpLGfv;Wˌ~?oA 9'Α= @G!`כm$g/tYơ,xCܤy8;iš;PHK뭑fʀ \lW]㒄ɟ>nH|Ut5>"\%|K` !IyQHy+FZ- ^_eAEve@"x5UYN*,"NJ'/Ð54t9?h,ˮo~:?,\w$F, vO^&x|f{2پ?1`Z3n%Wl5ZY2ds0H^~yuGŒ\TѣOvo:|ڮ '>𮟶{3HHlyҔs(x!I! J!dE(KEHSyrB!@&պ(cq?L,>582Ƒ(3q!IDoYDR2iG5D_ˉ&c|sp7#6dƂTȈ(U!8`] 轷},l6!LZ)0 vo̫٢8M -`&P4#l߾6>yt]yf-"M1H1d5 9n"d)9O"$Q+?Lf<6_qno",M0'λh3usY/N8 >'ZۯZexyzs,+ C0:EVpHrI&GhPT18)K2Z0E,\w!zV'LUQLıi9筣bLY@e AtO ~Tk.$>q۲4L)0 .ո̳:ﮎDP Z>r )dj|@Yi(KYh=vs4JGgFiȇu~hL%Hqf,jcuJncCeU|>OWl6t 45w6%3b0UY$i40:19`v&-$ъ\8Ҝ H9EPpb'?NeV SƆ8:4pl(sюۿ7.J!?HuƏ%̓օ8͘Q4E"ր,I$I9Wn(*z߼/Nʌ5qqN1Ƶs|Uec]gG3!4^`VR@aZn7c{ %~h~hJ-V"n߀gPWJ݋@ށMCE!L*L$o_o}^ȳ3 (*Dg JHtf|6,*P+d,j֜0ўA֡:KN]ow-A04IY:%8.,acnqև~ߙ#S,rƶ ]KƂT% I"X ="C.X,p䊼Rx等(@"I3;YcX>>ćh ]BDbHDD D`AH0, E {P*"<$v< YQ?N@X\!d @]GiY&$ц (F@ƥ\rM$el44 ĬiF~O\qd1GDvd9!D{;&ZN\oܡY8,ެzr>]0zsfN^V7ccT:0.OƦ#Ed XgyG3ooH+}8mߡNaf Rgg3bcDo_kyUf|y1_uۯw Iﺈ!? +> -Tz8m߷CD\4ͽ"RDaﶛP@!YKfAр(2 W3D8d <)b*QEnnnn6ȓ%r?tU$\S;g.ldbٲp@I(jt/  iVeXH2Xmszt2i짪g 7Ւ/Oln( y\r9݇hFIg t E**5qm$T+ֽ~;m?tPezZc^'(fs#h%YY7'I]gnw[T_]ZgT2uUWY4 (cƭoOZZyp7ϋ(׿nӋDg94aRo >j^'e۷MDJD9 9/9:]Lz}s}7NfW7͕,08`0nHDܯn޾ڢj~*;XOfJwWTr]+k5 ,|g dLU92,ޯoDsp*#VJJ-2j fz2}PצrawDy4}0gXQcFcap\/n?Nt egp޽pOWle}4ʏol's3ӱ=>imF`ha$ ]8&` "!p3INGb{70x8ϟ>~R09V."(V }zz0)tr:mVxxUGDI~,\@|(^C(60`"1F,+ (sqH "DcR(!@w]w+ڿsW^KRJ0NR θ5x {Hh'qxdFxdLxC|5W`J3yܾ(]9a0~Ċ$;Y>/8]MǶߥ?ġBԋn'OW_Kq0+uMs|)J`#Ob<9sE{]p9Ջ}wRY@'+=+7APdJj- ,)W㚎8ƽgR+ţC:nmk"7wf~aPGgz=v= Flb ֑1xiC|c&-N~A|h} ]NYlogYx\f7Y on1QvK]S^i}4x10MdZUY9Ol6c_߭g/g/˻n=`h}wYL ʓٰm۩Zo4)mMu]f?TCԼJެպ,sߧgDddeUJF`C*# /0_` 7d.,K.Rf23"3jnDTʈFQ\/{}ڇs18`~G铴TLDG)4gLl65c8ȢZj>ȔǶH ?=>Tu2y=Bw{oy)&{#?<|'}-g_fo39]Gג6 Br*xz>~TEy|y1h)bR mlcӐ0CUq. jwFLk,ܻj \3 rALҌaֺ` @4X @R\()䂫ve ~Xь8pD'aB  LH:G}N@D$ H ( LpJ!{'~ig%$K<Ӄf[k>Ct$8Ot *"42w$YT/~9~`jb0`ENI"B6]`#7Ks5?ʦs}V,tzF6tYJu;>8|2ę݁8EQy^~|TsDƮ_]ӶiS]Mʴi> sq 6@g]׍I.:'aTb fl7K⪔`G"P9i*8'F5ZZ?|tz~|/ 9v ]=Ic*hHJsE^f8jLXYH%Ƀ\+ m89$1@^ܼ|Lˑb"Bvco]]jҶR-N,;oc=Mwq cD{3) -]겘 ö b\h'qy$b^vu8{HGgQxy &zG߃qv22u ދ4),%v;?&0tmd>ys"^. ZVzVf$:JE,tCdDN6D3uvl[nv3-+h*Z c(@!TԓJIn[uv,)B*/zt(lg6[/ueF=&Vr>:uJ#)BgI TQu8~ Ȥ.' n< #a94j\ &z1ZDCmE1k (,CqETB?[0.2:vPpVJKVgua:aQ)F܎{cQȸDTIY8Rɟ,[13$H# |,p6*AS!ljS "q.!ޑJUdl+l\p@p{ks~lTʱGuZZDi|xq4;U%%6Y!6;oP;3G;ѹ5'"4q\/E֙}gs:rvn-gSA Jzwm 䩔 WOTVN<>^}&L犣X%(O蔨Oκ9oWFI*_92C㍪;1HUfU; uI[ O @1k-T$-+18BƹmAkf- d *Bd hlpv^]G}x~ojmJO3kDbV{Bz%(r-K$θ9 EώNc=Y]sy] F܍&RTڇ坛/`(' ղwU߶n},Ot q%?$9󁯖Օz! C CJi2"wNE 9&e.Qx4Kֳ2w4  [[oLY(#g\tƶiYMX"IuȣN s0BM@1@eJK)=x,IbдP(dF{C|0,89y~i 8{3XDeI>T`vDLka) "Fϛ]>Gy=Trp~E-Ay3ZGJRH]z8cBH$SfE F) ֛f~!gcZ%d *1:4O&rk"k[C\mܫ[w~8?I$(rk~/_Djӿ֓o4F+K΃4\ou~uu>k#<6uRȲ爀 O*jROOp{l2B$˾//`v v]׊bw{߶ŇDY胟Xt$ `mw:AxH9Oߖ}?| vK=vjU:9݌]72v$ bZ"*kkcj9=onn4wT47ηKGYeַIihLγ\kL\L]!% vݸe"@[5TRr`6veo?~v 0Hc쇸E 3cQ(`xh cpy.Οd3^_>pwsi1DLs]4Ow}cD gB{eMKC^0j;+#cy曧U ֻzii)@` SJVqUdKJ9|t;{KYӺoq~tP dRTz9#֫;`) ތc]RQ9MG:ܭg !R U(%Q0~7rA0*SUU%D_i,"D@'):L+T!cR2F3h)%%lI&!F01DHSH81D$g=慜U3~׆w@dq!8p"?A0RDO]?R2!"=f h6zf(Z;.YUYE Ҋټ@ !9`&y.ì[1Z 4FI_ Ato2>бMUqmT3LQR2Xt+ u'"l\Ƶo~{El%B&uzܾqjgMGl3;˧gwauV˴K IDATZ7/د=;:;;l޿㱐_?Rwb[kwŬ?& Nw<`r4}gJm[YnTAyTDQj:Y)]n.'%r4cgw<͡œGdZмW߿v'Rp{h6x4/2bM=_gՒP03Z-f=N30ZalSN`zlwfᬚLq;>;yOEY͛7fsU;ݴ/n4|r}#4MB;/J+C$Yy  Pͯͤ?{LGǏÏ>6iFPM߾^񅞝錷nybY81A|Q+Oޘ%RWn袷ЄvTzDrγ#m,%b&F7mh<ޤC7r)QT^z:LR`D};\ݴ-3eBs`Rȩ$'obTe,(=i ^^}.Bk g뗷|Ap1_,m +{XB$Co^zl6)[oVUTWQ2[O''׻׷/v] 46*mZ㡜 Ȑ,HAnF06E gge^$~xwyT%Χ1OQю \B5aS!Y&8:^$Zիq>8=qh'k)x@D!#G΄@;o1j BCVSH9J%ԗئ>iA$9#>} O/ q&%'8}) Qd@"!&Yv~>NN:/  }DTgbR Br;O!F)qtQ#HzZ  F8![s ۿ~o_\VӒ7_4O5|ڭ3DpP ˌOJBT5S#0H;__&ݖj>(??kU? :㳅V~g)/R. e\iEdTNU.>|7Ч5abWׯ@DB}yC]MsnatIH 2k5*,Ӻ?]Bpֶ6"? *Jx 7;s$[tv2Q,{<͕HUU+\M'l>4&iZM``i(4"oӢ_P`V&uVZYm -j8982YqŽ!tC7*fN(+` fd*p +KUޛRv"ϒ4+ob\Ie)ӪFA30E Y|V)g-$BE 19XDAJ9C01Fs"H9) JMat>/rG@x8RdXWX"|ҽB ;bRKƁ(|F|!q$  "aa~2=wϿ{!/ꧯ @?)E@(bHd3!h@Ӕ  DUa)hW~|'=] ȋ+[?Ϗ%dzwоyuVta42R`.Y͏h&{=TJ"XGۗ?o<ӓ @p8P=6`ZHAfZްw.Mt>-׷m'gnR,JӪLgY֥ЈI*tQe2OMӉ`ϧ"K9Pztow1F"#;( ~<~ Cd_'~ 0`GYI' @${S@?!5BiŘD&@(cH(H s-ou _`M-b L` 0\?Z DVRx8c?̅'#kc @jJDE&.tKHCLIJHjDȴb%'CvƶYִ00eBf"ҋ#c1tB B(mNjx^i>kˇDZ%Y=~NO]nmL MX_ :>. 6\̅Vrh@sBYy η[ZV:vw֖y8ݝc&EQT_{UFKhZv%fp͏L*MUg@Z4Ǔb> 9PJY1 nG6LnIU^벴/WۦI cBFE`WuyBSQz&J^x>Mb';3̎2l_]`| qtx;ÑUeag{T'In$Cp0~ryhлw@dGDgC uVF: ?dMj}_\,f:9ÆƀuiF D+j{3n"20d *]yC ލfLNfuma<ȊBr 9l::\M4Q}cT,UHgR 2D(:J ~vCLeδBi%,ȿ,c1Ei?v'gS+26J>h8Zj: Џ|ݏY~!)՘g,Q/g ~%Oz60MlBBB괬ft@B,m`$r=/')!&^dTe;8gh}WB̌eHGjnnb.Oڬt4qN˩5PY~/ff"V`T]Ӿ='X ty;Ky.d~KfS6ӾҘ7oO}?zRTu=nam@˪DVElwz#4SY΀~^=7/h~X>x 6ք89R꒘^ umzdUpʾ,kgS+DZmn1"b1p6R̕w&nј>UPفx]wCoF{u'Y^pS֌ b:kZ4ϒ_|%%l,Ixnv׸)v3>"AUgOf8]d3 ^-xH6BkbцW=;_x!mgJBYE`QqVO9 &8dvȧ󅔬뷃 2I T wR 2cw;-o<9٤u{Y?4je-OR.h2Ҽ94E!DfY֘QH)8y眳G_hOO(Hpb12`HH(!**F bH#?§xq#mW]3مգgdŐ$ 0iLn@p5,q R-(B9 Y?8mCvƙH($j;aD _a ʿezw|?e5yS?{a<{(DMJy~~$'gPd7oOoխ{}/oݟ|w[g=9O)DǬw>0?xn?#f~@=ʇ*Nn筻h=ӓ ]%znt|Əws$d >Qۻ09):Ox,袞 !;vIt[i*&dURA <ŕPM 8>LűmYtȈ>خi:{z]7CwWHe}#>v1&f#?=4G$ZW(jkW?äo3ѕ438h{g'fjzk7?ޫHcǜzi:?n.EofCZI]],Ԡ}eQc6Lb`@!QњmY:=::fS7o͈ʢP # <=)]k 12y1Urg:Qt}Z`^ ڌ0"7H(ODdC;A*m3"@D4 !o'Y&$7!vc,].dEʸ8:!*)WRBx4ߛWj߭]/R|7rw[OԗL?!?dR>%OV3 qZSo ֻOn ǯ?m [Sv9D}paX|zu g$Mjb|Z]Xf0y CCS%qmV r{eMqV;:,U5=<^cc_ ]b'*)8"LJ%:+yhi@6YobSデ +}"z7 Z\ɬL0DAe$ˊ"/Sbs9}G z짋щ6wfoLDBJ@!z@K:cY]k!ؑVR$:65DB$I3Dd1f$"X $ >z yD `'"&GQ$R8@"btDcHoF'!0$#}h.OZOCh>'s㈈S~5m??S&Yp?FCy\?Y.3,\7&A}~57Kؤ9$GM$^viBt}b'Ҟ>,nciH%M }~<9QF>UeRz!prY_}Jaw~r<R1j,;}ʊ//b{^,;l=^}L2*e u,C xb{G<=Ȱa,e*d F}E02Y,! Ds{qލo^kSmڃwG)b 2!jl7-+a7]Zfp`)0ڑX"ddhV'Haڼf{d6_=>;FsضMݮKIbtޚޅjt5_LI`}tYO%ңw٬i:mp0vchq:@qQiyy~'uLS4ȣ3"AUƘݘp(tY9Qn{uۚ~?v1DfoU+xx 95 `?wVv?wyeU7|Of~OC@3>?9~{_0 I態ޜ0|Dٿ$Fal9j&}׎Ǝi~+SVdT)ӜapKFuwIjSH.K BqR4%Nk!uL]S]~;'Uyg֫߹&Ck/7Yd %uVnȘMJ,d8 surgZRdyaʬI؏EQXoRUU}nms 9~SvZ^ԓб}J;0X=Igs̄hG;]N5R q(eS6bv p\Π,y^($C4IM> qh)s)hl\*-t!|.d $ AvX+ |yJ F9 ^"Q&@"(נAYg~7Cs Ӎ˂H)u~qcm2lZw!%ŭ[,е:ǸZ׏1F j#k߄Lk70?v2/5MUe~vUN/ĤжF"K wXc">[q z6GB/c!1$hR"v߼ uVwDO˼6!r)E3$roaLsbk;rMEcl1eB._tzpvcGq\5n{y8(E6?/zu,KJ] ruS,Kv$/'(ZS vzܻ{r}8;zx=J~0/r_T͝/=zە8;Rvs1}37;?L+,!]:ML@nKo9Kr<$.[`d πn0Eh'3Փj3 \S96?gi>iv43.m QprnoǍudR)yU'0?zS\q@s̒@Y'Ā <''nߚG,P4q "!XY%  /a >{7DR$!H@IDv^;9F^o!1~cw_x 2Doi Iؓ pUBĪMnZ/;_&~^ 4@`BW)unHMu޹]˗v !p6<j Qu۞kqugnMܾ[4Yu6/p pR߿wGh擽G>L?UQh7_ɎB8Ϥo/n3gAv%Ƿ`~ݦ͋?vhUbaZZh9?B^aiu̹k7}s)e]GrR0<~n>쯼7Ugi]ZX;ѹxbJI-mkfz馓:OamV}?ёXnmӾv W0>jJ8?)vO~+=<8wqv}G,_UEv|4 Z:(c*E q .xk' J`,p%/S]^]&e>&0#,~X ZC`])R!%*^ZKVf7=!uY%8Y'օlvmݺlv,E  &¢bf}jZ+HfPsZ 0I~|&f:Ջv2It2}k[wvW-m48@ )D1E֔PdR1E}˲)+ðZC.s#t99c_~4M,ŘV]4wn;hbhD{@&.@EW/u|jjUU>M<>xtTrNYMm Q >Z]@^RUYn=Yxu]F  ꆄ2,ю1yQyԼle^hto'Pj8hs @ID xl\ )[3S9ltHVC_Bn~r@Dzzض,#Kv}-ω,)%,TUF`)vƱ }bιМs}@IY& R@)QH.vBSe:q}7aGR땖xkK1h#?5v5 OhT? ,psS:;;>jNqo]o5Y\m;6ut]pr@bY-Utru2+K*I3 zvCWOsLl'/z._ p"%.,SP"b74ERc8ҩ~~"sNY"aƕ R}"1vmU5 l(8g~ٕLӮ,!y-A %)ŴMËt?`v14%" 3#ybYfcP&906lٶf"2'G;ABlLf!lҤ!E3~l7ׯBU骬*ˆtFTey)2C/i_Ӿ3d hs[- -IlF `:UEb ]!ϑ)(/rVWڥ`g#Qpd y!O9Lr) Fb@,KeY)Α1, - 68 ٱ]%ɯO< 09D,B)k2D`@HQ*E !"1z,U1JR̔LCo J\h`7)M*o o} !9q B(lv7% k 2>t{r& ĽqKh"oiнv-$.VY8Y/wIb4zV5 d k7pNB@]$i"X+v($2ktZDIg BBa}?:fjDl?l*I0,xT"Ҙ>$2~|^oO~3Nʦ#7YXccѣ{wm&e PRkb0} BBO%ͻ7-43u6ͲO!ƪI5cĞ5GMчnLod}'9WĬ s`<[Ui&0XW8t>13-t.Nfv6}m,uBJ%(]UMQ;mTQb0c$9|btJ soi:G~ۑLgRń&〔4!'bBƳ:GbyKPJ 8#dRB3^(2p.8q0s.qRRL /4#熩M#fF1`"#^"`dp3Y,J "C'opވOsĿRw, R؇ R@ozdQC"nc9B楜0s0t]L׬Lń_4'g/w=ˋLk ۮٶ_\:sU,ރӼMol};Lk5( p~|˥]K)TR: sϘd}Ջ3=;BY `$kGaU (RUfɈ>1+ ʬ>Lm_ CmmSU[GbaI4}~.ũ.Rq)\qb3ɲLv;vyO7Tۀiɵaё,xk2;zëWH5S[+8,a#b1iYv#gOvw'')BAIP뇃+r ۶nBӓf{!FMB!*AƊ2G"DOm|U>(UH4WMY9&Lj<;r^-8qyؚv69 ha"eܺD Uy> Ɔ!cbHyTEQQkR2&c!P <0,Ÿ nH{T"@3"CD@f''"$BFnnE.Koh(/ A>A! x7 kˑ/X!.n0ِsR %5JGU)ma젪*r>WC_GOO_T?룙?7W~&GGo۪d~GmoSG/1tʀ+f01ZV4% tǏvq;ߜpNɤy ,yCQplRp32q/h'#sY'(X 8vRHz.PyleS7 {vNt`{hPEc9 Ð5өƪr=|v5GnqZ?.[>ZH4.}|_>{n^ ^5{/(Ybf|2eWz*Ķ=#B$sWD~tL8D.oݚY7o]QL=_2'~ K|;_k8:}A05M1ƽБl^1(8dU.gZK0. !Ft2]W5w# ^G( o% rjə-w H͟~9T8D!0ل36).߹}v}^$~=߻WJŪZ4qz}vW5]J-1ȹly;j>)ooJ=yzDa@M9]zA1;WeY&nW~jkS]Os>BBH1a6lguYoW۫׿O 7Z|`´#nևZ0Lx@UL*M;['\î)@ w;Z4(v)q7<~o[%ea\|yIgLweo8a̿Y}~V2)EYY h'U07ɤ )"8=d]ŗ/,[mZ.|Ƅͫa5&00 "T 4vn2(+FA*y10vEMwطw!bY/'`1TV`R{4Ua,L}m$F"M c#"J **ˊ @Hn!%$ZKь[: M! #OH% y]*S~Ql%IL($NH ,K`L\p,!M$% :ZdMP@%T :Y-W<S`!#< ;uV$GP__LN+{X~3|I FK}}x/wwYxlSU])Ojw:- 7xl ,hsݧƲ#t_PG?l}-MnGgvhQ٢2cTn&%om/qsUɢiʔ0c73GمPd㬀s=?,|p(9HugwKh?ޟUfc41HSvq  9&f">Qu캽=l2D31+佇ʹ<~C޽=~Q|˒Ql3EJ0vnWd5kخqEx-tKӾ*g6>ytВ| aRf\mVKDJx2Q'C8 pXaB1`GGc'-$ʋs ٭^^Z θ12 bfBMz[?4ˢXy>48듪VuXNbst]X.G=_RUCyA_R/[@Y"|[+!H0n!j)kޔq9~c!f\8FGWyp[g^ ;ccsv(|.D o-8H!I0ȴ[b gL@Өf^v 8JȈݼFs,~nMF BDKAFRQ,WyefO\Ct6Ř Y7S^:]E %K_oǿο@s;_2_޾#'GnצvH6>~{?IݫvtUL^P8^+ɰ8q06%4;yVbf[aU:;u$>znh~~uv~d惏7+Me" QSM>Pnxa:?bwa\D\ӋIu[6S;Lحzw..>߬%ϓTSŘi,' 0ڑct: &eCy}$']mm`r>lW̅mL~>9֤YVHP\)lPpca6=C\mi&2Ő!h7}=^?~}=uy~:oNOfv( ɇz'sشY>;>Z|*&uNtc"C rEZ^CpjZY!FEq>DW^W 1d즅xM~]!PJѯd|c4-6Ү=瑳;&m=jJzFjl&J̚wC!Ʈnԛ?ђj*qm]Ucx0 Aq>*iZi.8%`sXeSh4r%DR1"ޚo0^O\7syqGm4n 1 Mgͽ%T)H!C$eW&CD3!qިQH6D;if1gmw"y.ZAY'Fp}}09'Ǖ/]wbpt!Na"SS'}jml%ju{B%x[~Zq4,cCg,ǁ^/Wg䔤!̦WK;Aɼ7.F;D?~to~tޭbW뗝zyLfŠa|,Mzoߩ}P.Ofw;zW}꺾xp.W@ u^w򣏟|OlZPs> I[AqH 8i.+f@DZݷ`MBJ9k}^j:"#Ƙ! dP@y7L]*1/d@Wfx|5=#Kp#j oG9 g^Ld:ϋD Sh2ou]_=c>ѱȄZZPڑuqU 30:utM>3d!"7aD1Ou g/ee9FLtŐB"!cUL)M=꽫k( ="xwm;dQg^GO<;׭ZG"^EBiS||\˕dLk8\C9>qN9of4$HrcBd9ě?26dX`A!Ĉ0`D!!K\ Q Xo=Z0q$J77X.*W"vG}mMLE:6:"nwmm2 ˳K]o!!$$}Yÿbu?͇϶.s;j"v "Tzdy^Jէw?O ߞE}3f _E׿un&n}^n!89j.81NRau8iƋwg"?6~3&M;|EY;ٱjJ &d`=䅦x?|E:?֛n`:0Cg6~uLd)U Wق_ζ-ʼn~;oەVe|;ژ ueRg*@,=@SJ>*fم1q& ֛|r"Trf,J ,7DV`s膺)N o=9p8z2ĆCX^;8\HU,&pLeotJ(|9(o63 9"cAo/ qC` !J3JfZ LIqC$ ݵ5uya( "&PPrAṟ x"NO:_(RYYg|&r s$\ 55+ bvcJ% 1Dƪ?݈771i0|d P1#L$ 1L1!!ϲ;N7 i+(AȈy0 10|F3D<c|J O}F@J~z:Br/H)a6q_!/{/@blR޻?/?,ғKw7L-joΡ%gI %P@SSdFI۳bYS^/_{9>ɫ-wrr6{8C̍# <`@7xq/s@B0$&ir%2ZNI0a$7Z9fK]Yvg9"2"gniTS4dIi2IOzGCzӳhI&ԢH6Ŧk$9[@u&U!=sYw`4+U>}zLZ|E|4sY .cQ)0F󺅡#["bg:%#W^˔Hcr^厉,$,vOLoh| O$0Ţ[O1)SYhD̔8 ƣ]]'Bf$8 dr,MXwMr}eJͶC?ƺ&/ yǞiT# 4% {?nP0 Rl&rQ1jbQ%2SR:gtMH[L۾0i. YqŸ F㴞Ȣ(V`"bqw :2H^c<*g㞩 (zCI I {>tv죋8?x5Lp$]˴` 6zg0I$v۷[U p$Aߌ17T(4H?40HiTUnfkb%!I>xyΙAkxRrmrs^7%q1P.\jXz=tLB] SRP^IkqIUX⅞NtRHb qU\ ~NzN8>$cUK!6Ыȉ1)9x!CBt=׵Rv ]=ʲ,Pg// ,iBv޹uONHLDG$ =}bq+:cGOG "r!bZJOjpNBwyo7n2ɉ]CF8?:{'_#p؃RRڦV纮A""\Y6@8 tޣBZkݻ`$y^cUqu,Yk#(8%!Y*bϧNOe][:+7k8#fgEYhi[&hQiT#/ 7*\!ck]o "8KKYDց6^%hZ5MZB@!̄T{<Ty5H2>kLXғE)ʜ)oNkT^l/;tE#uE֭4_a# "$Bp-Ta昼icYdZk55gZw}kbfdw'dRdi~f,[WɫMXnXI"}VWsR2Rlfƣ z}drY^|mmQhZӦ˟>!dzlv~ܭ7HS(F10  HOfTV!gG/,fխ1ڽTIED1&Sqr Ym0U\rOqr̵Vء( |thnz\~Mߚ"ϯQy 6E(R4`X"I $u,)yTҵCm= D(r>'E7+bmXK>3 $&$wwOgӹY]fO?[>~ <waH0Ʌ{:z D!oK1DXb.]04[PH %)+,I2mNaiN4Sia{Ȯfv6D R\B?AѨ2,nhlu4f<{$).B.vJ H@ՂŪL%O+[G3S̔biy*kw@0c)2uxrP2)!/ *!CwO3L$>P-YP$gvk>}zӲ4e]e`nƺ7ûwovy{XFi>xn ֛Sg<|YTVj:`}V6.|X}oE1 fye:MFy0ʌ긟-rQ!v/Fi`h^%lX!Lhe=_y6EDE+8^9 ͭ\zD ؗC O@&!Tp./}ߒE < }Pi"Xj5D7 DlഎB ju(h2m?s .};߆hHghRd 0X!jþv R " `A0CDQr#{$,  YC,/{ 5a@$b«QT Dpױ?$,d&t<"HE* 8WBB!)D!ɤdL,cQ$i5xXwzΗ/%o;!0b5-wMBn躢m1NJNyUWh\7]}v F缬!F/}gkBRc9ycU9!/a.*%4˒vp/ig*8罍ű,d${$ETKjNF\(>/J6 n$w{(4i,cȎ(wo8߽sr%\j<ORi]Ϛӳt"8o9XEf~,xMуb&urwd:)UsxQhEv#He\]-+[ Nw]W<+XT13cwLw|zs0HaxJ1!%`c{p-Z fV_E0DsWA5k!"!F/ǂA1JI(A Hs˫aZv{.:9."!cLF6 AT+RF0h!JiJMw+AO9!t!@l=Aّ<=Fv+4jH~;eY?|Փ2-{u]ַд~NxXDٺO?9Ę' ŧ:I%j\'ۭ{`tCނ e  >?Ry׫vv'( ha޲TC 2}|zӭWMb );O[>{Oܿ|ΧeR "x Z; 1PW` @mBF1̕ˬJ:WqAa0eǼ!U9{x?ybflvdy/g$a'0s:Zo«96E帞fJgi\v{g@vyucjj\;gIpZPO3uTE嬳c;s`ڮ& y5%H" 󎺎Ɠc>2@[1p2SǥfxD^ݚKc-G\׻FbR)YY][D&'Ƒ1T+8D*ldн3!f=t{g^{9oA` ҫ_S!uD@ )hbUsrAHe=Il6֛qd|sU*hCZz H(#gu탉C\E rƾ@v8G.?oĿ{˿l̕D!bhͿ_L|o;zu Cǎ~kFY{gzޝahыB0cM=L3sf=ܻը_`Ų}_;D!/^<ۼxzxYG 8:Fq5Oj֛3{]{7%޷Eut}[)M[fӷjzj[*Cj/b 9>eUui{HSH)۳;gl280zyz#nw/./d:5! )"ݹWZ ݹ}O BU`hCtXa27Yoݣy~'o ޾dFjuu~.v́Nnq7f53&qvt=xRvoCMX۶$1P݂RB]锴% =l U=tv85FѸ|yoD@1橣@yIE. *`\cYgD*'i[-mlL뜩)ƩH//CgҴMfLPׯ"iGx 7p}e$Bn 1 J|u , PDVџ#z ?FB )%Л_ "w~]<KdB*@BA`;t$d]bTWqp[ǃ?lߟ7mN>Hn6?벺\G]]&8y,/"8,}#?{blQJLrwJ"rlx6^"'-I!~:K0UG WWXtHypjNNIMý;Q*1݉:ٿ]~T4Ὗ]==a4U-rφ>{H3(kal !ϳ,44PףۧwO''|{]7/<=yz7[ij'CXm|6lFcyniey=G?ox[m $QTK%J?e{<=VEFJb=eQIbj$Ƴa1JLb`4JF<,Q߲q}`o,sf&!&4m8teβ@!k,פf<Ķ;>:}a&ɧ'a2IE$W YR'u+ә0*O?i''ðx1ơJ~>!˓鑯>߬nH"F(N2{)F~2nWeI2LNYf+x 7<&JGӒ#*犐A`ӛuCHe_^^Z qoVaodk}z0P&UJ}oĕ% ]-v9]CN&,:nMc#y,e wy }g|(2"V/G?N)bﱪ 3rƣR|ĺR0NպXd2`ad{ۭݭ4?Yu;l@8`\!uNM HiNQ3$y׿|!~IoM+Q~L&2ɴ!zmQ" 6# c"$4yՒ,<;SgLi2 FfB.I+'H2E&;pNMxg@\D $com .|"k CGp-"DFBpqI'Z@+qER׋B~jܯcZ 4*d!(H,wXּw$iƬ5"r`BEMRʪLC軾 !m ֑}sP㟒އ'ϊ|l^^}C!ygT&+zagf$8M߾sv4cӏ?L~2+,!p2v;ј%fnzmywtTh@D1f_^p-7B9xSQ* ;02P=kvLQyƯ.6}>ȐngUT.,Xc @*$}\3fYnm$XQCHɱ~x|syѐ+z0^%NfyYWYV+Y[:oQBuId15W>׊s4Y]GU%nTo=<]Ε$)E% (JH!!/%N;- X$Gͮ۬CR`\Ρ%n,Yl{CU1 \θhSC0 :e|@!ğ"Y ML(]ǧ"b" M1^k~Mr+>/7p+0 ;D<\.B`9%9P DIpcL/xn6٘7 tW~-RW2gy~|>pmàIۨ K~uYUF??n}UsO3ol̞ػOϟ>[ƅ!R 14B2mbo+deE]ym 84mV0ʶa"&vh-|u* N^=X~OJ B,&D)us6VjG  "AY"-KE1ptnC?㣴!du_7zYʺ@|$Uo<Xw-(_сHGOA9MXfv,=Uoݖ;{GQ"tY]ؕ1O oM&ϟɧ}ąnXVn=}A5s~1\-R AYyQ-yM#A>a.KYVaynV+Zh:.-Gg0(3Bӧiڴm+8ObQ`nڞ1jaqvۗN_ IDATLmc{6裆 8:T7Dصgu,->9$ճj)я->zw'#cm[Bk˫;\>x 3lZɲdV|03λ[t rɑGB."$i j|87}Ĉq~)vYH&\bdzGq4#Ž;6; 1Or  "i]ޔa>M ְl>dYO'sƃDnfUMcW%r6Y^ZQ|{dww[_YQo+5HCCx-Nw_|cgqw?__OV*Ѯ#]v6aC"Kgw b6>i?R@-+rohtN4φA|&''H۵uYN..vnbVboݓ;yC۲tx|\wqi%K6B^O+8]kŢuX#XߴW|Π Oݪ-Oa3[3-q.?} 臿>΄PE6yNj:FmG brkJԢ=0j,M/WA1f"U#ǟhقIU2ɘxeꜮnY&Eԩq/N~r~ܐ?|?x}Y luchr}|˛R]\re|T4 X<{R6tX}H?(;t_ HB L"!MANU?OJ ؞;ȔĴ(S<Ev2ѣ?=yBy蹒yYГvUr)p|R/E r,Ah8x }yZv+ y|H"][ !Fd I$In zzh2PiRŠD@:cvD (ovjefUJy>m ;~-*מ/|[X7GOz)KgQFql"Az"ϟ+ RPuE`"+Bbv$Vpfh`4ƣ*2=X H(Uvvk{w&ֹd¸Zmx L/%OCY#Cidu%xm%ȥ6)#`> ZӳJ jbUml!2%QlTj0C" {wYń0lC&F(ߏ#ɓK/ސ*YHtӬH?ZFmƀ\7S/\Ϊ`O !xC`` PaDEpJy6}5qFM&$9ˋ/r>~=^^?]y=݌'E!~|~g(ˬ~R2Y7G$gэfD::Bnh_y-<٤)JDY~jCY|ESyul<@Vt86Ey}}6:K&$s˜h匚Ѵ-UCy>. "IqǮ[N2V1;7S|RIڥ9蚮2[ nF{ UK-6KRF!2$@AqZLs5 ~fh^ e=Xo-q%Gx:g'ke*8Ad y)eE"='2dD \p(!4~pG8qbTh&(#EF !1w}j|oE$BB$࣏4"7o7O2%T$<O >C 7a !1;æBA pHFCIOx8:߷F0"d 12 F"b|0py.ʜ.P`ezG}{]o'x4h \JŬ=gS( :v3p}kb 4U ]F@"cstVe\n4/pk(HƬD3:vNWe|Tϲ?/>|嗿ǣ0*$plκ*4EDAaBB^\ """,),JNОg4{<X&g We.E!P > ѽ}{g\=E[rAz$'OrNA7J~q]1ֶiΒR.W54XB0J|'ERBz&}}:8MMlLH)S5v|s;3\UcMM`vj:% R`,GE7v,/.$_-DZ : yutuv67oޞZSo޾:ىRWǯJ-'loN" !1o+2,05G ƺyfFڵ1Qxvc f{\^?vU}{;)g 98XY^,ϒ4V@0a1P:yv"yZc;M}b6εTRuBm]h|/ k◿ᄎ7>$O>:j $urj-1C!wwSᓏl'! >) ʼnJu$'Ɯ58MƀJŖ+ɸ F<!zcDP Ǔ?|qV2 8Cc ƀp"&S0 HEH3!bzq'zI!!@$%D_U~Vc{`1Bz,<,,)I>nesj!xRh-pdEࣟ"0P?hl=c>{E>6RT_4*IByO*!Uy.,+nn2i-,;[ewS+SCs9:RUEgv񿛩@tw͟iY1voL躡]s&Crs{/?v؞]yR}y}{3r$>ط JT^ߵ˦+h[GEV`jէo7dBX\H$?}JJP"Lp Ka;4uVz*p`VY77qreMc3n=D$F:n|E<6uL&$)wОgY0MӔOygepvM'E ۮ1UD"e`p:z@A#2ins#2kݩw_.i洆d;=хA(dR*I*ˣF, Րj&\ZlN$1831Z)lo&ri0І)<[xlǩG0Ƶw.$/&`!8hvdN 4,dr?4L%Mm#>d#&F.DV 4baFcdLqH"|h0_݉3v~Z,kw')!#4˲<|$L?љh4uK<ĀSP wfZ `; Q|yF$/9 w/.򾙾ٽ:} I=HBdrTIa岪j!sBd<=7.:r D`q{;Oٜ4 e$ hƧ_p6f9?/_6pvhNgE]wt("ghr|UUmw}oN/ϞgEj]od40J0M~M̎gO oN PW,0>D~&(!I&\_ܬ7$Ij[G/_\.~mߛDkFSu]|}܄`DsyO`u4M~%|_j)ł2d7[8jeRoCn7q{dsx4aD\g#޾֘s!b쩬|U 9 Qϒ4d>^((]7!)9rcRi DI 6a'vlP*S6Gc΁,3J֐ %`9j@ƱW ӈҐ:u@ 4)$U"?}VB9( ޡ bduB(#}~D_,g?O]ZkG߶"i>H%`:OBq9TIbBpHВqmd hO8qnG|pEN<=>Ra~BBYLaj˪U^(3RLnӴ{ L8_^z;qc,dW nV˪blwCO}|nn!qlHgUEi~l> PH4bd@{ U9W!'gH~S]'jf:8?SpfjUGPb&gRZJ)(e]ߛ 0BYgLchDY1U];ܾI=/gE#E9c7YB墪JeEO_f+ɋ@4%GѝƢR&:O~|rIUzaWK<[ ao߾) ۭh=3"RE߽}c+%wn "Z[Vb1Ohc~hOi! B HN[|%$ȣ8B@p!>Q4`dϗM0ou/W)ȇAG T~d#)h/ J!yHSin ! <{J2ݸ;.& [,S% z"!iFҔ`Nm 䅘2Bh>"vQg̐< wN%eNЏ{ ? )$D@$p$1zBhd a"~WA&n z>BW,ɵW7/~넷(tM甒`$a}Ǻ"՜(Lٜ>{R(ri:JSy\+!82œwz@(s2jmLP{LTwj_P`{(K?cɃ >\/nOeY(!@ Rк䒋ꂐOgvJLi(KRD_!~ϪtF3eO_D'O B]DS yDj4;nmUe/@DH,d+T'pڷJb'7CkSY* 06]bzP`#:=!XVdQg֚6XEI$#Dgb߸,x&2Ix)4qѤybΙ? #펔,Si. ` q4q1M5.t]""T"4)UhAkp.LS?ễ(Q߭@3^q .+a+ D4DJn0EAk\Ǝvd znr隶}J|aMoV0įֻu? W:?sHK&e !΀9q҆*K%ȂJdRVKj8n=SU~kFҝX2eIYj6_3ڡc9\I*ĤR9$䨨T*)D)Q%}o>la]׋,mbn7u]N<;]WU%ihQB)RKH$=PB9 77Qinɒ/fӷ'Oq;m&BJf \c16Lfm=2_~0uqnF'w}ӥ0΂Jʡ"]rF)@'C^\h4D)q\'O/Cӱf Lr۬ȓN:8쭝}BYA1S`II!,gT$&L8 m@e$*|^Ȕ66w[%nhS<!Te$FH !,M~9Ciqc@ R, ͫ3-6;.ްNT$ @<!B3C8A^CP$! :<CqwR>&R& Rf0H&84Ŭ2Fnd'ykC"D$poRr*.σ`zʩ* XE!Їcw:(}2_~8L*rѝ~:WJJ=D@(PNSayƪBF& dYtBu+@B`lc(S&3`2m[;CoXD Q?O3xƩA\@?Mm; bU%ZҺ(ep7Yccwc8,sP<$ucib~)n$Mp:Z׵voH9S >G##ɾ|8L'y4ھ3#g,{=!0kYM@dq=LHxwͺA Z,K\oΈuОqU9 an],{"'JS;ꬪun0ӌ2D60fKH ׼ |N#β"ďTo`9YlO8 &0(ŐY]ym0n1w @٧^<}bqNNmo7BHph6)pL\ӫJo/P0 ]23 i w=9[M=UwoLL kAEVOׯ:B^=Kpۤe-4mo'x~sp*'I`i "h .S΁y*0+̣:^^KxGfJ' 0ms8`A xE-̴a&(3vwX&@"Y07 dY$eYU4ۻMYUԥ?6Lr 47лZ|{`ns.\|cwNŃkp|Fd1X49"(޳wT-O=Mn n۷7 /V?[(n7։:é4ɘNEOwzR^Tbyy~~U߾6YZT$Y};n0PV =ǃr7QebΌ!uxS# s˵/~2f #BU!֚[1죷$&8TʔUeM].O Z$HD*%IJ[&R w7m oF'¡k/%׫׬"ʒ}{ iAH8e?ӌ2 Q0~yy~*qի7*G%EU._cs<3H"vgWm18C~i0H&((9ۭ<abNI-2M.Z,KDfn7:t\>4mYGO28Zs0 J@S\iӳ'kgaPyUqlC3੃`!x`@GQ=V# `0˛odBA 騊⬮f+g~]D0"KKqQw*!Wou%; t~,Ӛ#u4<Sy=]3tuh]7t-k~ I-,宏VpW|~\YVlwk%k\lG '8@}مec\~+|zً TB'\*U"p8ȕ.?KS:_J=BD32yFʈ* _ S 6O2r ;~0:R, EY=C#:dSgGŇ i!y-3)㛻󾪘k B c8arLT5$]tIg|vޏ؀`b؇)FY&XI39;L09G.-2;5?YZx&c9#p{w(BDβ"/$)-dZ%eM"BnK|FM= ="Bh)!1@xTNfs}usK(KV,O.8a-%lۛ0;`Us8|^]>/ sTȒx:ևOWݽq^IӴ]R@FgC $ #oOna<uUE=WIέׯ۷oz|z E\kZ$b7{o3r_b+k{&$m + _m+-A-7k9lnH$=B.jXdE'aPA1ef'Pf.(,Bb}oiZ;n]=Ʈݼyz>Y E` nFOγ2Yr>Y>xb5cLx}RCLڎo6줪DHR$P!z cT5h]4㨘QSD$i#2Z٠x|rOhHH]@xRjJKA֌fQ\.OOO7oY1=$MlXVO ff/ ?yߤ> B!c$JUMtb{lO#h FY4 (~; D2c)E(T +Y5c cD!dJ&!FJM!4L<-cfZ!t=9Gz2\e݄2KO7M7g"Xf\0ǧ t5uGy%YM6&yUь$UQ}{ b4Y.O/${_CDFǻtUIRRrA68JIh@c'k\p@(,6pyϖYQ莝2>sH*b&dB)!#X)Ŝ? %2d" !iߌJEk"ռ+ͽ Šcϋ? 'sL VT#%L"[KZnN "}0IA%vldSJޅ0!m &nve+Lpidcts$xGg36rFOORc1 E GD?bI/n2b5mm,J ƭEq{R=؟e>fFc V6}Æ#ZvZlDN㬼%vD~5vKӴ²>qpB< STΪqM܄8'x9Y\|pF^m?>n%|}"Wrs=`~ju"/(4 !X0,v8CdOϗ't&{QW.O=?Ouп𫯺m{rJ>G,Obc卍oVv"ٺJ)8tFDd Z B8FT@8<{X-ggW4-?拡-QHڞU~xnɫih&m9Ŝ[,OCrϞmB=: }ӪhQ%]2РTbiigFrVo?O|+ Z狹[-`@ 0L-m}6?! !nY?99]囷/}:@ hbڸ~J Zt&qƀ2p0e@09Gmldu쇝u Sw3ʚ IDATe FB,ayEE*Mx[v6ˊrƲl[C+ "PfE#.-ͨMt}f;ڱ~BH eYx"$xlcʅ$p 1z=N1FN%vOoM($|%: DYb3~xPiRzԩPTm.J!qZ'`*AHv{S?&/qJQ1TDC;6<9?_%aͨK$MlnoOPw Zb^V{BrDb9?qEHrI`!j^΅2zhͻm WkZOͷJ\Ȕ jj6[w}]+r] Z+J\UYg]%IgIMӪ %$Q"6oZw~.VşC;!BTG2o6ǴhijTk6bITﶇV'x}"$mt`-,f49 p?m $BF@&؇LO@)@0:;M!DvaJ#!T8ƅ2qF٨LV ajER\QOXUUn0B#236: &uc$%SZGL"@!*X4i6*M¼]ޟh V+}M1̄HxzzeVI.Fև>[b^sll:i۷4$ek-KrR.b5_E48cJEP(~ti)MyDIYJƲ2O10"Wvh鴛_AvxY62i;lmlͻ ^?5^$P]{|/˄`،Mf&bSc=XpPZ#b "(Biڥ)YnF᭏"@ƚ~P;Ѐ,H$d.h/u42/ʊ7Q)bttI)M~ 7tGAo^b'r9~_7.*H8)3VG+$\+q"PKYiNc(xQXgmjŊP>=L#QHݪeԝ a{맯>mh#(!F@qTpa1ӁP5om{ ފy̸dt(*vP\ZIwX(ZD~0YyNWj?{~}N>L("!B ]8EFۣ0zי(s;"к0YVW*LFM9X$CUJK &SE)-)dG}*L3M4xP'0_+W0es!-]޽}?}׈g '?iW"B$4vǸ)(凱E={<[FH:?͖<-* sV(ʾ."8N(m Q.%!=C8maJ8勅 1 e"4w&@Fy 3Q PF!R [o$mC8b3a5BQPڸs(`&q*X ("! HH*\Tl:8 =EJ co{"T3vv:;=]/ 1B!%EdxB8,dӠ ' {6'3!琏0F|sg#C{>\4^Y*`S1f *hnC紅"FMFRfGTY><d! [F=!GLUA )e޾{TYQ$sB8F'l ͪi^o:zu8;9?z_c- <HcBE^E6C< ^GfUBng@%-l~^i]=3$BG0j]0Ɣ35Y=P^ʘW/qίg?͞Hu5y}ݶ_?X.\ CۢtF#Тbp$䛦!fR}enhJf%S} W|M2Bժk,es0<ڑ VzgC匝 }O!Øg|6ShqQʄ8J $%& LsBMpf/Dת7(D&c!2A0 iNBFNMg))2;5L /T=5ZC!r1CgZwi8;euR"I? "P8GѣP@1"#BADwSA0y(=A<4~V*fu1Ί\iW0pL2_-iS84C=%P$'Y&a7z_^vF p^"bX<&|C⌃yNi-bY 8ffaVD`Q05@ v}@8>HްݶN{fR[$7fgJ,^|W_Jzzwa).*}ipA!d!f̰YC;2uNᙸ1tlkm{|wx+h&.~sX @0ʻE31v:tU&%SVZY_*x~J3ڤ'X,in fH';g|_|~v6_ǧeaܰ }⣧mo-BsὢD$zFxE,g/vUe2#%Ay{Fm(~OӸ?W7ͱ]=D.<ݸOQӌF;ޏ 1Q+?:8/OT&hӱ^c9ab.NWˇۮk}4GE.s:ydi46j %fݱ i 0:vj4!0@i?VJ3!AMa2+GO ~~ߙB"|A.v`כ=q\iAqoaPL=]/HUoٌSDo{qT$b0Nd&jOIlt֗I$:yo8h[, j%D$҄H 03Z "(z:<=_}EOwl㡖֛yvٲ\]1ϴ*[|gUUJnoےゐcy7Cbt^)XkQjgh8ͥLBQ &i.h:yE,x6bw!.BM^Mzxfl;t!Fo$a V{`'Bb.Ft71WuQ2-M6Xhͬ1 $9֘}iN1"%Bc@B,KY oߵO5B:=b q{.H08s09a 3us0jzKh .s7.pPBP )c|t)g k4DqH1`;1a & /$;u^m7&IFpi$2=aKQU)EF)cB 9Ό fS _{"H2*gu^ـ1r&0*REHcQos# %8!xvp0ZJAL YYQr誕-&xBQTGo4&$s~&#FQ VCm)v{]_?|qPOXet~`3‰.]|"/EpGцz~:o^s>qfeFQ"iR -Eu Xy$ħ1.Gl&>߾F"L1*k7{bU+0V9?0DyBm0IN t@㪠B{T_}~݃L c>J)iBv{lW˲NNQ:&"EE 0i FGJ%bBU">,b>vZYUĝE΅#d1rhDȿ@ բ %7wdhyh;i50ey 1(۶u>ZY^[/2T?h.ay2gB(y&"vЏza}IY&#D Bx}CpVQ] q?W^OqZ/xd}{h{<_|.28PMw[}.&)<˒B0BډW5D{x;ډ,˵l1&x |UԬ6_6oϏv ńP/ʼnU~ܺ3}|ku0)8la峂Pܷ=H( 1% gZ >оl%WY1'9&M%}''W7_v? mo^?_Tk859SNll=fPykvuƸ}EN(A$?y]&e7'Faشz ]]igcUO.3;MӒ(`e«9{N 1iQ`w÷wa/.L;^`'>|m_'sifOo۩1Tй9f5+ IDATbELJWsZE.P@XnD#>L7h|۶Lb7qxw۫I'?<[} t P`-`ǼKon3]TU/O6ino^W/~\YeQ ubPUC|B'˳t#@4x w}7Wf?Ndk-qNwwC<; 4Q$b"8GO~XoS=M"[27pzF/eHR/3Lq|-5ZB< 4u(9EeLzbtEYeIYDpLah 7"PA 2ccx8ʓ$u`_Wy;ğ|z~ɖ[ qޙ>Ee1- l7@po9 , 4BH]b} 6bqCZղ1k߼ko&$2 n}O6ʜE$BU QX.xo󈘮Sk/"BշcM31& e #+W"]Y<[,[< wu/OK&+$"Q$wO큯'9;#mj0`vo.WsXcS(*@qxuzDcYlɳ4?g ̯)կzͺ"RH.Q!-"\/r(,$O蠿O%i[yͿOO~v_vujU-??9 c}5UKWv8ROXYf:G" m,,z9 .t)cj;J!N0"\to 1:J8B1xM_}}f۬dBI7YIڕDD"dK%) 0>: hBצkyMh~M<%k .&IUw}>"lk̦<-0Z(O"BVg$ZmN @PHںzcdݠE- !a0G{PZ ;BѸHrPDP& "|@k 8OC}9E0D1Kj<̔XRf+,iіw=C092"j:5#eLsF+4%Ո2؆RLdyIXb{s<qw y%*~蔆ǧR|{PM?M,D(,/ň$5CyAqdFF9%RQ ,Y,S2 &Rmਝ:j@ x&amO'fr .Sl m*IRӄoߪpN2)*zN2U i0PR.}j8COǾ@1bN"btמ IA&#٬w;{B2j8}upʤ&PX-݇3*j/0E4bYcT}{uMgNtO  11Vy @ww K!F! T#:{2xwF7-V C?辅 QDPZ ZGs::tE (RncLSwŎJoِ#)k:lF]SHG`~/|?1BL6]7N$S`Z[jo BC߻Лrij$kUkݴu> !c3МׇQ=gCc7@ u,DwcP4!D1g2 ,)Y5 6Yﻈ\$Ô۶ĤC[CBji<@x־P8!JC0rDxO/Wp{3 *h5$cxhus $isR NmWs*8ō,f@SHr$r1t}ҧBeidRd-2f#iSp&^..WtJ&N"+B!Χrw5A}7Cz=ZFYi![w˫ 3/Ϗ\}oqͯOPÛɫ%bB#Ik֮c=/FHIdFh~M2fˮeah ks.ϔLx݀퀚&v-(o٤H:wzkEkԇd">~Sfe*|殯h񌱫ھ6&\ q.O h6ύ=_]y*ToSˊ BmW{G0 AVJ[c)"wrm=  Eh\N)ݶFY;U^^oևFIU!@*!kM8 B@(v6gR (> 8r X4o c8e\rL2c~:x<nЍ6:*+XLƫ}%z˱o)eJaA q!Q C@v8}j[&LΤij߹(2ztz|\w*.n -GͫOHSSN&I1O?F_\av}4.r%H ("iO~kz}wa9!ń[>tGtCxvLHc~.' Dk}$RYX.c-Uԇa=>oaumfЃ:ޔW q<-\ Vt2A2KJ|Q"DT9qFc)"qkWj>_vs}FO~򟽛C7bUO'2vi JqFO/^0pf!sJRoq)5#Ί{ QCo <Efˏoӟ/NgeQ[vV1@'r!O/Ư^LT¨bWUЌ!rީvzu=7I*Re _\e1\W+xj,SwߺSCY~s{='4s?4Ær'?ן`(m7G?l6C͞y]c3uRQmV2V _<S쳗piI>]9V<%yq@ )^^~W_>&M߁ j[&ZM& BI-n&5a&bӏ?y3=zMux<.E{ӻ7n2ַkm,ȧIh 4Ӛ1dȗ%t7]j8 cA K8k (3<_<غLLOj)./' (0C",0(>Y4MJcTׇi@rSju5cDŀ0H)IhCtcHBAz@B>9OQ\U|:Q&xEF vTZgI;9<8jPjCGt,a}tmO6 (ΗU9bČi˻-$2Ǔ.]c/X+h7Y,aƱ2KesbM` yVG< O}3l$(a_djTS7 NQ4~[H74++ÿx }FrA Wr m[ A>2Oy]LoɩBr,=n3Vl~ڟP('r{ZgCYed(&O9rf~{5$\8mX/xO՗w?+n_0Ç]]7u(I(" }|wΟ16.<<> lZ̦iO0i!޾{w:ƫkb6Ub:7Nv!͍IgKƙ?6w=bϦ )3}$nnC ݿ|JLŗW \J]^Ɠt6⢨fzְ!6hfroaH2|uoCf~eȅF?W=~v{ p{#sq=7>ޖ/>zEaRŏM3!صahtטGYbfFA7=kբYBslxج"o?20t8*+TVBZ 4bo;)aI~^O$|{| χ߾4W"Ҥ;?w3a1SkfZ!g9 qM׮j$I3]Q2"Y3sD n꺩3m[UG(Y<`D)㘘j$oFR7Ahcr i\1Q+Ǘ{ ^ Jq<(kSBJp:"F18kCߋEBcHPcİf?-A2% i6I<$,pq𭍁I5IGs8c>5='^(yZmvfō874X,D@\]D@TKb4wgf *`,v 1/G9 ƙVGN f pq7ӊ8H/i[8 >+RY ՠ8C16vVeRKѠW3{{‰Tv?t H^ܼN+ݭd>n_X| n<9V<(D4>^:FkQ`a}Q"2iÕb}! HUXt-|6IK>Z@rxXBr Z`;R̓90|DFϫd[֛$)xyZb.{lFe qoCwaw~xq|FmS|trX? Y޹ By1Y>>m]}Duus䯖U:(>6ͱdQ !ۺr+KX{3ONy.eců?<?|VCUw4^_.#>ETO+#ܫ7\[o=#b|)雫B1OP".2@ߺ/&O8MK%]Ck[; KJ_'Wi::$$:,t9݀lLhNF6Z1 =zןE&>9S -LʉXMuZ">t=,6@rI)}k9)-״XG÷.X IDATwCsV-zy'ժæFL擛S$P i"ML e/&!: Q) ^?H!$ipjwIPAS<`VqH?eߞ["yiPQ8"%Gs6FIxvҢۛ;Q 'AVzw ALY31?=ABD!AỄvkAfUbm0"Cw'Յ@3@"j% 9ͲR7% "."Ҍei.}~}PdH^Ґʰ\&i6hĜxDT4`W^bB@t0HFMzG8o#Pqg3Yps.8K&y95؁h52 =31F@tҔ#`YCA$VPRDuQapO_.1sf|P`@27т"bLwsS^^??J\y,q~:,Dn1!D&BЮO.)a\mՂ$%(j縮^˔.sHzt5 umӵ2MqFpSV<OxۨMԊ}]VNp>G!c!N=nM`Zڒ|T0/Gr^JlaxNf{8[QfLD!2)Ʈ7nxzX]iC9 HY`9a$b@"D@hC;g\wD@k 3N(aU7uN"}4e,$$gYUcŒl1{KX""d9>dxvg|ח~mopѽXZ5{s2'$`M3t:ViAn`q\,rA7۾?)G!`p"vr:|߭Q 6D1l22Oq0g "mwnvkr0ŋ'Y^ht^[ Wqޞt*ɹm6j>&T¨dws-3,wިblռkTש(+.նnˋŨ]D(5mZL3=k 1ՈP?6.`Tr4Dzif Row,Ӫ+cgIZa4YFiM irN A'b6f׫qUdQ {gK<q.D|tRxc_Ϧr?w]q+F1M354/&q')+ eloc}˂[J%\iX8OG+S/J$~WKcQ# Oi}p@Dt@[i~u5i!]zr</.Ǔv=s9"8ik#(W/wFL%[i3s|"`8G:c((˄R}pL0. }TJdk7{yi&Ҍ`۶o`Yν G*#7d27?L!1Zy` .oD H(z%Y燝V٤ H3Fx :" JM0M eOmdQdV/"uʴB.o>uC !"L֪*$s׶x$Nۇ_==kWڢ@aT c.8ϒDpƽ49PiҜ )!3c$Mf}qƠE,i-o5/~@_YZ=}~T%y/L_\"1a,}w6bE"&MD?tݐտtg?_[^.M;N>X>(/挶.Xt|"OC7EtMiCm68żBठqߞr{s" =[v}mt"" )wÇ)Q8B|ʾ;SÇo ݷrGn,psT|1}ys0LizGȋP s~oelێɼj&#&Ƃ?ށqL`2&&FfIQ-B^h0(L^$!V-协]Y2*ۏlUoap EF<1r\g N@1I!kX ^,202x F a1"uMgi&@P?欋l\N+B0nZByU!cLN/xͻs8S\a%d\,/󦻺/9i?QQdR"2]ևf6 ,f*&NFk[>Oiݬ>>lWqoC'`OssA5* <8Y0UGDI3m{$=o꺱ǢDY YT> :Ng{on?|75RgmήQOVQfUt?F &Qabw}7R?鼷Ur|iymy]jrf64i>0[O{m痳Smֶֆjű]_;g۪g. Zi%et!  2%Tp$~<ס,N(h"RNdsTtՌϗ1qm8W|~{2*N9zkc^|2Oq7_WSj($>,OWӾ9T4L {mnDHq6:|_۟m1 `v|:U$OϢj@!8fh,bT~b\>lkg KF)'?_=?6,aE.(F;`h+or>bViNMל>\R)GVx\F/,V7W7Eם0vUYd߽gjpAQ.x&\rTxb_fA}1Gh, ֜AU-ϧ!X%X5l}#ZN2X^$6]8`fh49ʐ5u!*BT"(G0蟹Š<YL#qZm?E˫xAO`lxLQGP\ iYLB !mw{ E]ph$s"V%MsN>圲nh#Buze* F}DĮ>@H0t0B{%,(>L"1uqЉ$iFkIBCHoקty_XwOOIR.q ,sØ],'BdV6H_]]]VH:#9A#B +sù=mm3qQ*x67_| J^.b,!"|uө<ie,epҘօHQ$ z+ͯ$`1 >"m>\\Uۋ_/XY \%a|8εIm[D"h%vݤ尼n6ruu]7_?m 43JEBaTJo>hF>ݶLҩb enpکfN\S It2?7i ) ߼{@EE)\\0h6[ bIJiЧ̄j|w_M]aZs8MEw.ep޽}|+!PЖQLxl<et0ZU˔ǰ,MysڣtMlӹIK3y7?yVg<1lH3vw1M?n4QowER/GͪDFk0aI|;B%e9.wF~La4_,IwRpQNEiOG}a,2g;!(.!v0tM S^bW ʈ?cl^^g"ư2>7:leӌ-7DX;=*b\4''˗2IwVA9 A[1e A=ck.j߷b(B"fR!|pQ8ÒSgP΁*8Psxsf2E(䂮Qw_|d:jGHAH\fCpY~T5\ESfI;gX ,XCB >FQ!H0` ` GDB!"ﱳAP(x#N"; jfUL?4pGĪDƍ!4bT0! cg AZ֑SX* nw7sg1o@`36'5 ?!ɡ]%]뢻>_!XoBNc1pańhӧ} 2\de)* &@lU2;h1 J]EL\p0L*B>ʨw|t<M#XMk˔cݞ_m*9!PɄ`-L TՕ$z(. XPn0/l(ƀ\AcU׋c#}pk)50'B@P`&=Dbo+MqPυKČr$$3ݏs(DvGVee^޽?vC22d}~j$MAqIsXygo^~U ,xoз}<WYQ$ۇe;YB?`U\xy7^*f+tpvӽEW&8 .HQqhG\?*)$T NIfmaU(RS85r K)DNRR{8tnzj")ML05f ͊4M(B ”PZVI"x>?GzQmv݇I=}u^'@7iF0 ^Lnnwe6dIs0AjNQPsAy8ħ/k`B߃8iƬ@ye-G  dTL$!PҌ!Ǣ7S" f2:"-L\6H8^ xsǽ! Z/amnk/ؘh #EOA0!|DJ"!1"F~lר㡓Yu#U4 "S䝟a1N1Զd! IDAT|4KDF2+R;5ic >ZSI4gOjo<1͓$M&"8 <x"D1_B꺩 ts(&Y^87 Jmz[)g*ĜNjl7sku:5q YZOwj^VԨǐq\圮 YjVY1hnb\] \4s4!CEkvPـ< g9#٥/3 $8yzV΅4~kqI\VK*gqƞC?WH&8OuVXDy{gjuvy{>hO>Nc72uta 0v\a#y^UUvh56`#r#)WFcJYu*s"à!PBV`zq>{Օ2RLHAe:h[uqjoo>nw7>9c!1t;crYHU#iCRYB=x?}|x_jv[ؼqDph&N,/%alq"0e?Dh,lJ<=nN~2x^e/I=i d9.k-8E"%VfA"J(-h x/BE>Cws9}ɏWe!I&v hȌsP‚{N(f݃;=oɅb QWFHlVl&ڌ}_ox1}۶fh,pդ¤ȋrig8a0;tsF3R*F;]8$ZT=E UqQ;,Vi?:kݬrðX\XUx87j1oyq{m 0 ļJjhY>]Ͽ4oggow j:lV/fs??l\E}CvGFUQSϨ !*|}ݯ7O#(22F8j1BhS;E.2:뎧BROs뉎875%dz-zOlFϓ_].s|6A^?|tUV˫49۬us)Few(CEIȢwL/^o? "2c|]s6o"RVẘ!`>e/l ?7_x??m1-(P"x49X&~nc=,sfϻ?nn#ݡ/^'uN; ϖrqIZJ]PlE|iL ZO.bN뻸;i1ƫS\F)=;0\|=<2RS$C CYeBϦBſcg1Ƨ-beXp1|kE '{Ÿ́T."N] h ,3Ugsb"5i#j|2Y"{d˄()# %iX,|%SB(A2RSʣ!0l s|d.։PfqfB@1 1`)qf]?u(PB:oo ׯ.qnnmX4r1Ǔi4)-*\=loY}oO:OՋk pu.^$IƻNaBQ7Zo8M .ݎA 3=?CC?0%z@l]x8pH31jzߝ T rQvC3FE2'9ݞq&QBk9Ee-(aLQ&_ïT˯wq8GzUfoli$X/eH6[˼okŸ́51ykYU?VM$-P 0fjqqqͰ;mgvx<;@vj>l}_e:sjSlԇw-K^g/_}L[D;5-S3W-bUzח%Ͽ,;{ <=dX{(Ai6Dhf/ꕵnUN'z￿+bQKJ2!{β{: ׯ_akF¬VUUI⇏j4U.\16ж} ;Q龗Mj_jY2jeEPu^|y[ !v xܬk8"3E5ZgAr΅q(` ӫ˹9Ӥk|}4q(9ʨ`Dhd4cי-0[&&J%(Ix<'c0%I&Ʒ;+R'R>cHŴ*r [!%)NF:z 䚭C&ho,cc4:/WEZnӉbtq&S&98OqYUgB7Y-UiZW)ot:zt`#Z{ S"' 9C1MRJE7ӧvV  :LO"D4'`)MNМ$HjDe!9RlH=4,|zWW>݉H]3>臦Naƥ0VvO_\nV)M}sj\doUe sT%v9.nV8u9I*%A9qEQ&8Jp^i ݏ˲A$I$7(NWz}u~8Wqakm=Y%R&Yp!LƚO0pi",ZO0 * r"|;"(P8pԭL.ExFC>cbt`:zm]i*21`8'ϝ>(ƽL~2aFc" ?k^  )$x{Bm&לz "1u>bY!btU-@QI!W%E7!0@"u pAM@ bAcܻu:iBۦW\$H6Y:U"BR@࣏1Dϖ l9&Lf0FAuj"I3k5=vTCRR;E-8GE:$Qa1ΊT.jL2Fp"=6p~V,I qO_΋uJ)JmLt=GFms -皰|Yiz~Vm|ճJ"%:ĘE̸`^ =$eV&3JN(Pl=$DIg*SN Lu48! F+&SB>w  CmVڡ 잚g֘!DꚖ c2vɈh~Y m!t4ͻ>bEOoY1U=dS4AR~|^}Q&QvFT&8ObݭDrZcl,a1dl -"0 Ǔr&QJ^>-/ӢȪ:AJMH"I"2As4N*4(QaџĈ} @Y "qG # !!F9 >!$FGqҏE'[m8F]'!m$c& jJC Zf>O糹#EYfᴼ^| {paI N1]!q;~itȚFc b093@RFҵ# ?!EX=Zik ϘQtE*W'iض] 7A!!9oK,0qJ8c*ܟ҄Ei0z5ֈnh|q&$OM1nV&'y>RV|~:O=!'çaCI"DcAe :m,i̊N7o$YQ.N-lPf9hNkŜ)5ý/⪾N lhp<zqBPF+2>oitf9RF2>((%w4V4&X2i|qh,jӍ*piY8OS[g4#ꪤ$h1O+`SjP!Dp `%(!wv0BFAVϫ?~MVtwo_~}G͇yI-I<+@hQ/ C>ݍ>h>~qc\d9ЩWpƀ"?;i 770E!YzOoP!]׎ӀI йD%Ibޟ'_,I4TSl?Ů7k%~EFH`KQ9zaM Idᰍ 006N*XMH,S?|9/nWqTEF6dr4 ٤qfL"4_fm/)օWy4y)<=m _|1˒tl PrQU#Syu:m "`$CU1ߝqyƵ#'p&>}ov>:'$" e|Up-Eph-*M2BHX;s:MI ԵzB*o1@2KVekX04mg?y҇>0v1)F1/_,[VhǘljH*ßoQ ʊ4d9 C (1fw@.%\GQ6(#,B?nw{< F{~> ey|l&EFH5ٜS&` e2I$/P*iv3?Ś1"c! F tߛ ?8a0c@˲ ^{hI 2!ZӣG|TSH?'k +0P1RvnT!mc.Mb !8h>A?DH"P8`axQ:_^~9? R1AY͸?~mת_t$-4cƠ_\U \26=LƠ1s5r]ܾ}2:Y?[z~_ 7nͩ_/Zu;ۻKr\_w8GOߡB}J$c1F5a7<~J0ɘ8__\+ S|i$xv}5+~_o0_s&+ȳ0{ɄA&<V]Ue4N";)cyZۦLҺJH n?oC_8Eoo}9}bs"NK$qmpl}VztU<-4Fq{$!,ͳlfIYKCq я?v+}=$ 8&BBH"/wM-^dLr`|nv;Tn!$HtSrbF~&nNg|}I8[7_ox]<[SO&,(UZԯ_%kǡv.^e]ͧۇ)/j6=jg\^$LVj8m~/ͱڈ3ݟu^c.ޜ!Qo1A_8_3VQ8 WQRB1P3ur wOiV73!SwL¢/_5\ھ}֌BIQM:L t5\z2v?cMW4H+X,1+!j]EY˦i$&`y6g:|aL1+(rwsƜU ]F ܡߏ43P MQ~H( RN܌@h)D7|{<%6Be)0 (Ƒǽg!唼 9zN=c"0 bZKNS!+R4dV糷vJ(IT:)9CN(h%Hr0dT㴠HS$)"%&ɀ$^*:ǔ9!.:(E@J0q98Zx8)Nh\ HRQ."N(,;\CxQ.WO{oc8,}f!yK#NvJsTf6SKIdCk"q 0͇W+Pqc2~:cKfJLYN:ch1XDj`- ]x)w\r,<&HTD"U9ٶUٶ+W{̓r0XEx! !uTU}~u~rr όWXUC?iL~"̥c)l:ƹ~!4ͪZ7B.:St p wx~EĪV.kѴ,Hƽd\0S%82E.ň%R",K \@YJ]fQ ӧ݋+dVₒ6 n`d>KysUptg;E!DB*\r.@eAKhDy͔˪)|Jˌm-,C*tVT2W 2਷*¸8;DL+)KǓ9;$<{z(p>6ESkJ8 NA>oS>+K?; %Ϧ s0jVaBgU,a c1BAݖ&$IaN!xU x c),aY&!)JCE\D(%b{poh]U BtbHp)R J ssr$Zgg<`ERLF C)$ I!$E#B$)CN9ODH!;%X~N}#it\LHBD@HL9c&Z/XHE!aGI .u{MAĶ6{ob"eJrlyww9mv`eUaaB\K0)^jɀC1,$a1xJƘ#[! J t%[.VeunOfu7/:`IU?/6WלBBN_ xrU#_h.Kx!?!Qj[ԡFҖmSVkc&cfcj5'].nIt3}Q𫫺!IלdLKBGM e3I}r c83cQ< 9մV׋<؈+s΄.tgGrS3LLzM s1g]v1H9&wwJ-PrG7sK[^ov+(crio~_ 'c>WW]UtL8%mNC U7W+0Fy!ǐ.WF%L߯%G΀RRR| }U!?%T0@xqD@:&Xp$DX 8s90^y9E=[˧kHEt("gr518rE!wSI׵^.cݗ1 `:b1t>ͪmSG )'$4f 9du%aǑ(U=y*kDiTcBeGB.LCt&QN(ʛ ڴ*i8GQ :`IjA( A r̔!s0俦B0s22"yڶ.7Q(a|_ϾZ]ZZ8q%'+LT )9 %Vb9usZ|})#aP2,e>%싡X㒛sd'ρ*@05㭂q!a%3 0 f)r!e.)pB A9?G!K<ۇf3OO}ֽܮ6$cY )Gޮ|4T)nV)Z/+F>O=̽..[8o)Ȁ`v#rPUw:onrVrL3`3tWJECD'X-! SX,slnw?oyLHz]afʱH~΃ZsU麕PjN/[E_~:s\n+S&R>zY+D(*=UsEYu{iϺnh~mݬr5fֆld' $9 d3k)u -b<")27g-/+j%yy+նWs>6nw6ثx<~Ux?o'|)!"u*Ţq.#Y*7ljRFĐzSh^I۷oJpjw@w3JIT&ΙPjNx\ȔAskNn8>;.ꛛ{y7GRBV-??Xs!uӿp1Da%]{W}bߊC"CgE8eBfM]or<2)ʦny Bbɣ1GXQm{솮 i2@gi1MEt!28+g¢F й,$%T|۷]Hӈ̘3vD  1@M|F @PsQ>5`CD>jSܩdS Ze7xx*`}JbxyYHO[myyE1]̣5ai;nm\bͦC~4߽n%)  . 1!CQJ֫F4Gk1xAр,kZ-ty!znyxaL1qIJiC&#n#pK$u6OV˶{ƨzx|.:UhZٴRpn<̹3;R䌱}Oq5߼~Yójo?bZ|I5\O۟=>saPr/^z(ypgby9Ɲ- E!:|W*ǟC|h2=9>jEmoo9A7"Nv^v9%@Zܖ~͓ûXA|UbV0DxY댡P[5l(f:#EESeP)H͌NKs$JJI`3l/Z_fԛOyw3 $/+v z_wH=| /}^ȏm L˞LsE!]"vy>ղ\*뫯|IX N*(tķ|ZO~zb=)m*wû'/4|G tgz=pE0oo?7Wu _*cÇ8-uQ͋vwǞ3=3 b;1"qL&5Jͥ?b0ьesp'd#TvODq#8XR_vB}.ueI T?vU^?U oܾ,)>tT27A~w>ilY^}|O LeEڲ9?@Xۮ<hqҋP!ۨ}N쭎ULhR61/`]ip;J% $M03V>nZ'C<D$@>O1 $D f6s,ϑ H(%HcN@?|G.e]'7g̔q>TP5`"XV%%"=־}ްղyd9E a9t8!DU-ci #+[([eEȜǡbL4xIض[=}^&0NΥ2 Lw. ٨:g3a!g9^_UWkb QgomNyﯥr˵^Ժ?!B^?wX*)wZ Z/J>`:q\NwޞXK"DŸڤ,Ҿ].q3R4o~p:,,./fepm>If fF$dwϞ?I4M3Ԛ9cU7+I)KrWbLҥN @r(۶h~lxš &ZIo?~NjZjyto^l+y`I(4 Q` ޢwip!bއY(H4m<OK(pL=7n~O$OßZĤ }(k 4FD c?]oelyAnBJ)t) 㝛?H (%."l٥^,Z4VZJX4lV8YS-! d9g9g$10[MvĘ 'Ψ*ixK;TZMH "d"3gFT"ŨR7q!)BR>8}!eʨ'B@U,'6XJ3Ydku](E La¨` x-SjJVH6DPʁd9 HFugӧ>'|s]eP\ȄAN.xBr1{(Je*dU!1F2OUyB?ϓ`'CLd!A(4M[RLi{V8sr sY[V9cLx&Wyy=六L]nM2}X_q8dbBĜKH>ټMOSgj*/Q֞VVi"Ƀ`, DKH9l$ԾP ;k:"(L=8eªE͟hdb+1f@9~p)Im1r#m4wn죵>a(E$$t}tai(^B6Y GcsaMgM d1yX\7|{) uM|r]Fe^]mlݟNvy}T;SZu]7ٹ4#Iɚ)X4䊩̄M#hã~b\%a` IDAT}fNl\4 L)*].k?{$e:sfŪ cq<_"4>5miuL^pHK1F{̤LXcc*]Uګ, ?aHjutc<|Yꬉ}oy7寧{ ;[EY\\:UU=%"$LAr+Ҭv/!eSKHCL S*,U0pK&.oqa\MǶǷj RR)7T[8@04545EXnVzp&D9!FfZ:]W8O[.$xg3mz0<3` 31ib,l|u+q!hϓsjg_5焏g(9:T5U!JQBHzeQNNV+E 3IB4'HB$ޤ669? 8 s")rVljV>?\>R8\"xz83<3P 4BKӜMy@!JɪfXIX4gd,e4NQ( z1S饢,QFHu[p+]4rD $&@!eAIrtE5 s+YLa#$cbfQ)N,#CH^+SB&]r]W U!Dbd"O$H"[h$ۓycO%XVepy0rG)S!TsH?-9bL08[ȑeRAhvy͔!NŲTAHr9gNLx;J6?o^6,JE+bw_+F gr_?+Wc@CN,2/}y|RH 8]t7US<}|$X$m֥tr,d)|kg$ E<ی^BS&0qOGw:Bե.Ґ~N\:޿ϞZ^^]EݝQƑ$."z` ΑˌO)"ŐǔrH4@ o/nQ!yG#eKH,5q1`Re1dw)<υ}puChjRB7ߎo/ٳKߵWח_U?NFK,d)(ҍtOwP/w.za=Lm_h=#tQ/k",)by|r}($^.a}wGzQUAizb&Ǔ(WC҇dZ5.f6@ZM.NPj C";? 줔Զ.ˢ*3PbLQ䆜 XԦ(@B3|ts)tp<$%d=j]9c@  S"1yLd 9 ه\(hJ:OڪUٟOOl )?7PF r3A$| 7(~^kbtCp}=aÄf]F){`^/m|8Q _4Yl8u6\t} @A/=)+XL ^^\_}Hoߍ&U]J& g*қqJŮ.Onr~NG4q@9%Hd>)Ph-zq}J86˫e9gdTRyBj#611ƘPjgSLu"F;N)x'?OiNɢϮ~R+_}yȔۇ.7|d>)>xHT5&.Џ:uGtHn?]^lbo8誶)PƫRH0gr Js]=}ƔCd0[uXnR6/Io~yJ vtjO͔SΠfh@W _.I)"AJv{P*vFIIFOwmKiO9yȺb$Zo[{{}V_7mD[dBR f '.Hey Sm68gA"Xɹldd?n@H0 H!JH*}e[F/,Lo cC" ]3㌜k{0! DOP'lHsv }o6UL8[tm6`=ܻ9>lG0{/uV=M;Q},IJpX:trmE3BN'NTo<xue9WMSZN^2Lo{6E]BY%gyYFys~;MxX8lvn0pX8LD,Тftz(z??r"c(KƔ…n}ER'lR,'ص9N޳eQD;oi y Ec?}xP6I냋\:y!Ŭ+RL\J%9)-w?^Y}*Q|~8oT4 1O~q?W}^P,ϔ$WKuEJpFcEYiy`1rqI?( 7 $ øXgUl8"#.!R^>xlw.06D3hd!ơ~F\rUec +۫i g km!eY#EB '{1 t`Yy1е2&1޵[c < %_͙yDk5mZ o,g+4 =eU $Pzεh>r$X\p@Dx -zs:Rs-Hy9rLG(8Od=X RB2)2LOɧ>Gx$)Fl>"p <,xF u͸5]*f8g!zDH43Z@i4s`Ĝh#0d Hp&yng|媚Ounl:cL2x41CQT?ٿ{,#0&\mFSg >S"r.]Q9Ra~O>AfeW:6f["0I"B YfJ$1Yd)Y^: IdWW/>,X?`!w'C$2G>vDaaYa;n7lgg)p@E*+Rd,)^_ZgG49^i^ytLI8rxV',OBLE7m;m00-Np n|"\̄IcdJl!Ʋly9k,rQq0޻.3:\9gwRbQr' ~s}=ӧˋk|:^kB&}I"GDȅim>y~B4ެb c kIڲL.d|~P,Xv;DP)cR~!RQ$B),dž1zV)auR%r4>;w,cq OK8=]I%1ƹP%E3v@ !q1+U9PCQ!I~|A b!TR >"foK=xvY=d_^OI>',ɪLeUDt>Q@,3k q=i޾Az@q4# csueݳO^_ԶÏ<Շ㨤iT:ݍbVU]A "LdDu49E 8N3YJ`XkR2;NO{vC/yCBk;;GB Ðn( q|9P _b7'<޾Dr%Gjʊ0TLd25c1w4t$ެ]; asm"':g IDAT"RK+s(,grq~wݟO\,*޳bf+CeeY^Ƕk{zbQ+o񟞇>=UYxڜ.`y{us-8ΐbp6XúFȶoޞ\.UYnGmwzPJA%SYj&\OԜ=B!=nh}m#=|pq<'h1)ab2]꺪feZ6k}txg;tkaqx쌅 Mi!Bya^#b4 !IqgsMR,EmӚLExo# 1aGB,Ӻ@=ž0AUDke=)AVRI&'N'X.VbjYTжmR:ư }c֔'<:[oG̖ËE料=whbVB mb\3 Jgiv2v7}DL%QH$=q!7n6;!qP+>Gy Su&i]C7ZH 0HT%޻%KYGLcLTqLu>?T30Yy=kɐMvM_ak6[;Ȳ>KfCBdcV0ZϞ04͋&D` 8"hŐz1SʚEkmOfb f6[7%A޾]33y(>x`؍tM?N<.N5c=x ')iy4OK?3/>?@u]D,> bv~q73'@audҗ~˒" 3FrQ֝Tsp6q6ѳ*f0clcUu*κV09aMiÓ Ur7{wNNZ+} 蛟(bjJZU]׬vѫOH>ZID%Bʷ[dJ*uv>D .%p"'XYP,U,EI)** y=ztyrf;e9s8(o#c,zf1d0p?)a^PPT 罳{.b KD/~Cˤ̫ 1a`:4/W4ӑ]F;Fj:@t_vwS-./=4n 0CL,E_A'Qt~ȁ!hay* xƾv뛣?zZ8u6MSJc۽>ˠu, ӄx`9T^/BVz;oZׇݎ~TP 7C; ??vNEQ 3]猔P/TNnS4eٞ~I>TO':vq/ryD=zW,}j! ƌ;2/Og'?oǞ+楻,tnӛ~ȓ*UW&⤸(7W C˴b&:%i۫W9''7&췄ȵPO͋Ȓ\,Ja9/>Y>|PCВNA)fLla$\lis#P`%)i)2H3pflG]Ot@$kpA/Nˇ &c/u>lvGRKVf )u]]O$vvv*#~5Z/$@a em{@IpJT)(b*{:ݼKP/?{5tfm,ޭ.R?,AUuM. ,L vGgArhEC(UTK/Yoۗ:_iqNUm&g|{7zqf{8J1dUe"F׷M%`"02u xK!"cC _>2"kLd8޶GcxȗNH2/Y/lA +r1Y^Pq@:Na*+\FAJ`15zC\ߵRl9ec?l wާ)d\@.N:(<& :IK1p}n$08ߙVDioCYS,H92gB@R`LSM{m=e3eɱED#L'+Yf П-˓~wak"%)0DTrFgKIdr&C{18{ AWU,x{2?'b6_C͛m0S Ͼȡ5vL'\}ٮ73y6Qihޖ:3nI?v2>{zFp{;+r~,ʾn1}4Lc9yy*9o?ٺ޸[($0Ifh># (dNmL(QCDTCUrqgƄ+`S FCً)KQPBE8tqDތc*vyJ&P0MoxgׯovL Od,!J5lУa>4_ BlHQk&2 ]WFJ)īW}`$SD[a=%Kb6DtLPkZ)b% )R9JeHƌh41hܙ-_/ !_9o"bwޙpnz|~Cw*2ZTݝawb TAJC뜉H3a$5e-$y"eb^vL.+˖7`7. w6\F 9>8b!!H!"! ˫_ [DhҌ̐s2(R^lяtqUW,z E}0Ɏ#%WpZ *,㤦 \)V&Na)-Es!˘ANVc9NY&]8?>yѼxy O.RccRC?,McYFd"qۣc],g Urhw#LRP\i?:GQnF*ÇLR(7M}Ҟ]L]V2e95M3irsQ UHj2u|l|$ӥ'cmێpz@(~% xl\ii~:f{A Hp%lH8'S3S)`VSQ"c1g"a~8X H)S\ !d@j} T~։ohBtf#RdddNET$E3L֥0NLjݢJz|H{~MYd/XD)/a G`!HW~u$z&m)LS$2gYVMWh]~4BHI*'ȁ5Џ BL3%k ޅnfK0*Ku\ rpsuhۻ!+^@3-PA~:I'T v?hcdG20Q1r!TTI9Ob4=Tal6`6/A$*^/*~v8L$G'ޏYG/N0ժoOo/ft1?=9WeRBMzb5?! {[?o;۹8I9LG'YU?^gޓg}Y$9j?Y3X%%iܭqjه?w_^)-!KqI>SI7DZ+Dt<P{z"Y X M<=M>{"og?ٯ_;fdz2Niθ4:b&LwĹDMcf* 8) :[~;TH8(W6}9ia >3pIZj0[ ,ocSҢT4Iq5* S"1$g)`xZ=qIiU^PD3ļz?T =⇫kdc=Փly9˖l4f'ro^kwǼ)dz2L i7wt\Vuwcς5ǽ!W{ {}N(Qo2= % %veE5E$82ER`2MBB @!14v)ج2j ZLɤ{|Pg0Ei#9&BCJ102+1nE9cK";Ww]m_P@ GH2k7c$IƥF'e(c{WkDxR"uҽl?f샋9+ p4/<-vm0AAʒm;/gK%s[?:ɖnUgЙ1XGC޼& PuJAv0j$f1`>L=$W,KJiNũ܎\U2=XaR`|!4_-=9}l׬7?0*[O92:Im]r΂WxDFEytefgR*>x ssnV\@YA8p?/!/Ӯ}Yz>'pLaj&')em]:"Չs Ŭ6Ij9~^Ǘ:Lg|%iD_ղʳ̻Z9co#$#h9L!y ;r0PՠS|O??Y|t>fNUHmOvXoGm8rYa*^u{8ȃY U*$޾1A9Gַd.ʓvk7 rAyܿx*[@d< EonktEt̴W'R2P RΈ[7h=i Dvci" bf#NY/9AI(VE R"F 1"*IULǢqX9"k`Р9N!0 m~oYUv`< QL ,c4z׭o'O!@RIdE.$]BdYRr4'f f8:H @+sM>OJ1asJ 5 "vw[}qi&Ͱ;j( .E <1* yVgYgO$nj"ыͶdUT{3}{o{o_< G<Ń4ʟWoo˚ӹ nuF^ڵV#Vih{~'/S% [ͅ>3[0Cqo܎0N|K~vrbә&-}oOl{׷Qi*QWaT?||_<'JHݰ}>0'untm6o?9|ұ*2m f]߃s IenWY X)%C&&e˲df_Zu^~ݍ?6qqJ'uT<׉.*Yٰ$f"sݛ4[E5G[4I&8+lv}Nw~~K6 ҿby:74͕t86$e(!`D+d3Ӓ)8NJj!MۺίrV/o}6 !` $F!" oK9H uwmgC(rH"O(/RC9jzgl& ݀K1ns?:׃h2-"O{],۫6Q`'v 9GBc}>DzRRUQ~}14z'wbxW ^Up}|{5"$b q2Ƈ1~+R~d =8R,, ]|G ױ914TJjfkyjPCB)źb:!ɣ"8Q*&,%iqkD?̿xCP]n`U*J7He*KsȑMoUY!$qF-r Ira]4!i,/*޸86>BB.M?x<<~O˄uߏqRrk!$|yy!v.@Ai}s y=_. {a|O>zLn?^_ub~Y0 A|,^ |Pgp5ܖyíqzq>GfOIe˺L= IDATjuJWB/V,xś V>^|7W?l3 `#HVK5ّ3nBК-VА}J0|`Vbrhab& 6YM'Y#(RI B@'U}<9B3?B~۵}#axʨ^1:S^00*0Ҕb.kLBI f WHpe~޼y{b!/F]`a94x6ӟwu,r!e.NayZ!F.)<~ EI$uןz~I7;SL >9\tgv8/g~FDv< !vc)I㋋pۭ\43=tn۵}Ɠ  }02D"c.~ tt~?&^`!M)!pVc |9<0kКcHi&2OAh ka駻|xs^i,r%Y`*dmo!͸ 'LD=|2Yqط D !B6-g\)un(0b"bHt_t5,=@H19ѻ(S .8wv~9TgKA4?!_vO \*V="H pk 9q"OI! VSӂE0x!`i2F)GPʊΆGww76MD^Fs^(3 ET. C?MS\(R0ȢTc1+ Ѝ]Y?yb*+3cqgiLo I$QdⲜGZF#`.jYOq}R&xЙY]٬dv8vSx7nL sxfUu/V4?xbVW>CM=< 5U7cKwfsK1B˫ꉂ흿Z O,|Ę%<ɄƐ𼸻n!Vo>%>;INgdյ溔A- "Fc,ի r8UR'OKMLDT `j6?>Mcwfۺeeޏc d>& ezl˒e?CCTRT$AL/zۍ$qz8uD;N\/-1= JTl[Fhk9O A )c9zrh[;-tZvDcyLr)#7ZOtt7w׶,,, hy* `2'bq">cׂpslԳ.SˆFh6?'LƦsTdѰm#RF殯`4yaOg/ՓWחicئ][_u$ޟ=.T)-%???8K+ Z~ST(RKdS ,]ߍ ` '‹LLUQL0Ļ6v  b}9|1Fc !~h#P%yOOӲ(zp\ITZnBxtDBPw=hR҄"d7]"DH " ;j SԆ"1`܌. 1"Dʄ& Y˳$J !PwaiFš& Q ]"%F5ڮD@̛')ސFy*ywsIș0u =AB4a4e !s0r`i Kݍ)T '%x́^xo!_S*@jo`=(!3,4,zghxVny}XWCgo.o^7mJ2/ɖM$RfM4n6ev>?*2qѹjw_3!"-#?Jя-[3VSz-`R$a qieo~6].Ul.S/(L_ۙV+^s,UuU%gl:/ǑsS2کku HnCͅϤB '6b}1 !i|t1_ﺦn(d%r<bIhAٵp^qL2YmXVb o}u2)nQo}êO+| S% KNi(\' 1 s(רiL擻s}Ttij,F̹<뇮Kr~|Oq:g6kY%]]06:6mK˒-&Uo] v9(QjﷰG7n^?!/PT5_*_NgjꏏLv7{j1 Gez}kjd,)H!(+F[wɬ2a3VYhZ] A (K1Y%L/ƁHmGwD)}w Bηie6N%YDfd~BhNe4rE|4?P]ci$AmpmӕY-AC&dٞ!H1<rHE@db#{2b@cDy!ȉ<1;Ѓl^fpJ`^(`}[{ D)H:CZxC-DQj"Ba;l]ן]O䄦S~w5~kw&xN7#!}|zlL_yg˪@wAum7z&jB缵l PH9_T}Qp:Ί2%0eQڦiFpJS}}yݻ$I%Sy& uK]BwƼyu>X?yt@_bEۦmag?^wp62?+%臺i,vn< M!,-_}q-`.ΒF(^JEOc?h U36)]O^t˷v&a_&2L'\]KI_ a.QJ^MQ<끍w1RXȺ@'OiZ^Jٹ" ٴ6C; }KNivi7`*M4@AR$B XEU9OC}@WWѹYx/}H~E"= Qѩ^_~TuAlf/_>4wu0V+G(r"{Z@c߾{nIdVҰ;tSO~ ,Y[Fqig d\-@q1eQgrjP**D9Lv5}z8֨G' tfU!* LPX8d3zs`^Ƕ ӗ/ m,89O|ٴDlEƎ c=޼޼67'?tQL# ɥ)cS#~/Y,٬!~u{}zˀr4t>/M::"UF"Kie^'Ȼ YڃdEc]- 8ltdO,<^|VaGL&1qA }lը8LƶE`bRI$vXL\ۻMᓏ_MꦎV"剞m]q. }wq\GgS2nL0>@@IYVLҖ0`*'㾑ލW{tT.\ۻ7y2m/Vz+;?,l%U(h^-.DͰd< | > ^j{si5-'&Ww~hyVGk^ifbMk\f& H7oG\n",I SM{IѠZ&rbCk1YM uv1!3.HJ˄،áhx!2>xLj@iI;4Op1+t83HN$kcp6) عC+Eɪ"+d!oHBHKC 16 @ؑ(ЃҊsoώذ[7\dX|)Б?d!?T=xe[0aH c`ꦓB =N=a?\%w{]oйv Fg rȐ(8n4*Mt'DoE!Z %cG1rJ3aMO+%hdLs(`YI*Trw1UׇzOi4S&]׿6v4?m70)G)۫;0& /iy'b:ozևE><ׂi69 %=7ź&0=xK0)HL2Ƹ IB,y릫1 8e:LD_kQ}[IdRf>puDr"͐ !q}}0ft t {x~<9Nk'+X΋,inGGcC] >gH@3Y,\UUm'֐hm-Dg ;5_޴=TK)(L;;@M:Y)W|^B=v2ˑ~J%Pؘ0r9-DC]rz~jkH\1.ǀc;v^C:SlҬ,z-Yʤ|t̶>Ȟ3#P;o;Iuv.Xytq7\ ;L@3Ƒf ԉPsSș' z%Mg"K>*OxRS-94qI#ș(B"<ȏ4_e:7{ @sr8;ǑmM7f&2:MqZ㜣9i%FB5-D 9w^#XȈ("""ƴm7Kr e@$z*#D29R}k=(~oˉBCJH Y! }"൰߾z&4Y˻ݚ+q\MT{'Y<k=BpCG!]i)nqn!7!S.'G>OKQ!OUK]nrgH%s IDATk[(-ˮ_|LHeMyܷvl˼Țn\dE.t@B@՛o_gO择,A+sn'DͶi7".ORB^1flrtTF|Rzr_?wke$h1/lvkWw/WzZ~_|OiuY.`~$IƋR+ t"eK Xm?@n~<}+^i?bRn?=j8}gT;?WIO3ԇ %Neb>Om|,b6gZ0D娈Jkdh\)l"IҌ vlN5(PL fچAjDTvv=AT,r̅L 3Z Mi\ GR2Fn) m\?:dVg}s6C黤8'BWT,%t$" )='1b$ NCā"0B$"CD$$0Yd70x"ߣﳜWZG/((],B 6C]J}<GM!VY*llQ&*BZ38 1FcQ 5uw` :,%C>]rQxsCM;Ҕ/fgcaG+1m s͕7/eY̦{SH ƌ?$Fv鹐!R,4EΘ74%nȆmi6a31aY dg3K`}Uӳx:["7vh7ӋQ'~?\:d/'jxu R,BkoO^< _ߎovr5{¹\o7 >'ݡ?Xi/N^mj`29AZ@ft 7'GǩN_reQ&~GgYڏu9SYzn0Wrq*eED^ {~؛u$8-ţ/^,k; .NV׵پ|U uڎV ^Z =}r{W_/u~ ^8<9'2Y}M傩WK87zחT,ph'//n |'`+@ao#zzߏB!KN^OB1ܔ3@&xrs{3SLCPIu Vn{$$u%Rzw-P\bucu]7q>2T4x]'%w L䤜ŗo~>c>;=nooև"B$F ~oC3\!!ITv{m!SPf'b2)w8R#D, =֑ȁNf|y2OFE!$6hAFT^z M߹)hl2'.-(,DG0ϑd)ԜX1߃17}B;cg$G&i0`}2$ficurJ]'>ѓWW_\ODP u]*q 1%K_DYxH3fYQJ16fw6 `Iuj6.Xjar˫pv !‹Ov5e r3BBbpjZ2uc|N&Kv19NB1v(n-rvk`:.GoЂb`(\$6zJ) 5ZWTH 5 $o'&K z% R`AMs6Mً' 4\\7Ȼ|MzRxC9xTΖ},Ҥ\L)d_7۷?FG5-\c]5c?z;:6ӏV˼(noorsvq򳳧nm0p3ݰKǏWow{d\ v,/:|%|7W^\욗NTͦhNjFX=.Xlcbݻ<Sey徜$A!O΋O~ѻwd}4ͪYd^d׻u/ʺV} /Nw|6^_ߍ`Y{hy飹4Kuv5ܯ,U \:iD HC]&J˳j9ә $;]^08{S { G,Þ("rAA"D.BLbtFP>H@\)9!G[wfB7$ob82 Y=uyfl>os8 9h6[Rl轓J,V3Bpyn|k cR-&!\ !rd^o/w>X`:$.Ax|t~h[_)q1 y|6a[-Q:{$C}5>BCVVL $q{o֮o!IyQ0m(ԟt#A]O@!Qդ( &Ȉ %PUټ(IW,`)GMa~8vI Mx~~II>m+rpte?=G Cad;ys5^w9,W|L0&A7>&\ڻ톻|~N8Ų5ׇ믺Z\#&y2q}rdl$-'waYzvy핿s3&h1S #]qn^}iU4Yjv]_O# ,M W}ȣ#6ݫbU?ZcSXU8BoM CdeG>u6KtUVCo2RD!al&8Dt>L&0iޚ>.z4~;YVń; - DJY8GlZ՜QThO鼜Iwxϓ@=h݊D` i:fZfY$npяU5<#L%ݡe|^i,nǏgN4ڮ; !d3C $fd*Rtf(+@PtUg10tA<)R(i ms^ DD\xf}pqނO%DalBƔC7nֻsy!\b #+>(PJ0A;ap |͛KT`1R88eŅ`Ŧ9C*e7!%e`vw6"RAI DkI"1:ۗRJ ޑRDTMe;g $2"GFh=HUt gt.6Rۮ)ba?7F|q|=wƺ :Ɍz˓(dMIe)#꺺83 G*Ղ"b,Ez='lV0  &&)^dQ4sO17{bJ[lC&EQu93D%RI1ovEn v{xmoqI0?$g:y8X2P1]?dAH4˰w6R7Pe' iͳBceQw &]i3e2)TJ686*Β~X'笥h0{gd󯿼c>}7Nd[v 1()8FQDLK]L &$rkG zCeBP.TZd*D #:^`޼"H `# =rޅimyߍc {!9̈LJ">2}XH@B)2c "'=Pg=80 b 2\00RKBd b>=l:~ *cA{JrX,lx9!P4ɓSy!X]sVӢw=]Y@ u2Rw$-]|\~1fM5h-,D5A.@&8LD0mԟ2MoPJf͛_\0cgqly>_m%E aM, 4]+e:Y,ofsָvۻf~90QR?&-JGNm_*Ǐj6un7}Z:]dE>fo@` ${]Y$KlkW>W]( 8O'| Ā 8CT7<"NH[]'&@KoD6s[*3UdenY&[q2hDqq6Q3-($ś;kؕz1xlގ-ښ-rY8Dd05/MvrRVb:\guA9Ak &d;%G%f?7H#@8PL 2 )DAJb': 8 cy@#DJ#Ⱦ+AO h1g,D !g b1?z\cBY.IH GSD B.X$ >Zz;am'UG$>lu46R>0ⴘ}ݽq~8{W NO1rм="_75q1BLV 6;'fu &?]bmx2;7zv>ջ|/W~(@^Ey5W83 !\>1.Z,\ aDv(gKAi!2Z($ 81'EN.|'LG,5kr0NK.ы*Sﻷw딦'-ND7w-/.ΰpy #L2 & ҇5 >`8nD 4'\k?LKeVf*/~vc..7oCWONg'wu;A',S֣\OU> v\ SH $(L(I$LSĚ}oݘgo~yvo;W RM8rnD)2tϋ')_-MyY..7ۣMfouioVT?]{ J7~7`!]Ys;'$'\OOy>xofkt,MVghELfЎeEb=rñABpܦy9+MٮW)f=<5kjᱵCa0Jn?ty~`Ec6wRsd&V03TOQ_EKn eJD,]v_6PP*SS>ql4exu}:; }sTe5e:S,NgzM!]ŲU&v۝_ż䏕 BM>c,@vuh1o~ؠ$9 AXϺcrxqzu6T*..m^8)(lo]Or cJJ:փE~v]\^eJWl߿M!nn.mYqz!W^~_?w57ř.gC].B&Ϟo7Zo6QPt?O?;9Gv~{ŦOyϟ?wt_#Mv7TbV-ܰ*AۛƔ

[]7S$28}۾,,Dz$cr)&6Y߿_дG )dB̈ MHJ0ιRRy \K%!!˄;7qZ\nuRGwskɺBE?J0Y4 蟋ȐBR($,D{_$cJblPJuU)7c9/@ !~CHәlc(>vk"m? 8#!P>"朐3އqpѥ0P\a F!"F@2 t ='Sd=a1RJm@(/" ӡ $c6 !(#Dp6wiWgxm)'yh&(S&" c<%b IDATR4w6l^[IN\I'CDr\&)S,/rz]tӉQiNdfNNn\LvUɿ.&F4O!哧_}]N¢*791&Y{N()(Бd,EeβιooMJ)=UIv#OBH*br%0sd!v8Uh{?ċ)ȀOV'ڎaZ]8uSsa LiO֋suvU z7t|kG~~<zϯO?uo^US(ߍ}(|J.hnT!)\.WUow30E&%d_0d:ˋɴ(n3  RJz@S TUe:,qz/q#g4KPpR!k!X7;rN s)?C NuDqoaRJ+ϣ1n; ?  R8d$!!"&Hr9L! 1dĐlj01ɀGǩ< C?~t,]8q6?+siCsXw "qǑVLkLʜmv]) L 2ie1183wa6Ż~pM,ydC5e yB[O鶾,{"fe~U#zam.^i=_1F%t.B'iW:c>**Kah| 1_$>~@,\ % )'ø!A ~rp?6Mبv2I>{CE6"Ӈ{.Ï>{}ð\Ŝ /i}Z]_߾Mr>duf^:ٱ|.Nmit\|Z -6C7ҋշi}dYHqO~|@Ƒ1@`K2͙9H GH1c`- .˪bw@(h 0 o$9pLqFGK& !FBbN)8'ñaEe $O1|d~Spu%r;J?ĀRjc\@ "% q~wr XJ|viGJ%(!NIi (}4GLߑaN |HE% ":4k,.RUe\JTB6RB$%@r@)cB@r8!"pRp(TB"qz MZ#Q ƨ$@1qD<̶FS ؏ CVM&.ѯ =bdCaߡs:E}<:5@$,6h,oۑI*WB1v]ۓsHRR(S2 #\r*0G! Ϙk]Q HCWOӪKۻ+|1[~wwp8-l6pr %<-.V1G1dU,VR?x9E>ný;{.gaޒXɼWy5J4q︳pqO < e'3lo6[b,z'bƝ=)v׿}?H_s64"?=cBzo>W?S}E00J9u7O &EBcr gSǛWȞ]fyib,h¾Bો FwX~⓬d`=)f:?|ob_oMBi1.ȇ"Qb@"H!&Ld[;B:όcRi"!3L+D2@JQJ !yQV!}R`#DObyux8YmmS{&sRx{;A@":YDQy4B#W # a7Guzpu6gf21G"#5 !QU#=fCĹ"d!$8'(9 :1T B{cp,jG옄}1ŏ44t! SL@ JH)W];032xtwq衪s)xL$hJbJ0O]$.e8>4ۮ;ʼn,pyFCײDa 0=l-N_ )8΃;OTm~n֝.Q،)rO(ͻO8?=rwzFbZ\<9?==}XLj9f:.L1`>S}v;PWx7MݹQSbw3w(ڦGlqZooɡ1vryTٳq%o!mta6rOKݗ|n=Zjӗ?8@zzRM|_hS;ܼ}Wx9[J5ϔ({ :8$ ͛ۺ<8k` 釧{ !+XDp<CB)kgXf1u6])>Rh.0p#W]΍I+ 8{7)%( ^U .Q @dVey7M,ɹβrֻMLj4g}GY畹*CU@pnLf0pξ)c?#3<>(ܼM>i)!̣p]Bf&NwPM@f2XUֹ%Z>+<״}gżS gj4D&r+hۑ"]@3W_rKqih 48[?i8Ãh4|gq,n7 P0?-26hC!/ӧ"tw&.ɴJI?? &&',g.B2qzn7=]=y6숿4t՛xv_?]ӔqTk`K|s-Ѷone*/4x4:ܡ?Ļ׻қʆ*ւ7z؀mlVaݿ$APqT,?]Ϟ_Uz\|by8r&R⛇ad7BĔ\uş\f\DsԍGPaon>zWzS,'ޮ?9u޿y5_/?^iI` ft zK_g*'m~ΔE5ap=l;zwΙՋ92\jb>;~ϫm(Jx8Xǻw{4+sFp_|O.O>=оogO~xPNh5Gxy =XL-NNwooopڱGXeJuHbp9=U&0a<:~[ !|d;bYF09geUN'0wc?^;oOVl6Ϥp7>̧&Ϫwn#4'̳Win^}GL?Z9vʏMӈ> IU{D &ok @MRJ,E IQb@ #)1X?H,=}TIFJktt`8: b^ DYEwքKɳɳQHGR#1%PL<(X %u~є(c%SݘBΎ=L L ,>M΁O`Jn!hM')% dQmz%P!r&n{T\˧H{Qi`9,juz1Rř/G%h2z7Cn7Ba$"cRrE\JI㤓d*~ ͗ ,*v?,I~vlrquyA:D3.W9c엿3A{4]6OGԠgy2g kyW/ I?yTIYN7?D7ҽkT4= ^,ŹMc_-M4}6 ~o#S-ݮNj2ɧsx+N'9kwoRtS5/M'l׿ԴWX]I>p}ۉO~Oc&27?twMw&|!}ڵ𣿘ŋ]OBo7or3pn϶k޼9o? .}w^Mon{{zx嫻_fK_<[д3nNQdj*.ҼI&,~>zu1˔Bn!hAm$B?PoETsE,4F/vL rS2?ŠM Yo:KUNCxȴvʋ]t2ד0˗N01v+?jFmׯL  fEVVTowf2-',##f\?'$ SABB @{L;$'pƥ:9re Fz*Dd1|d Rs#1r(ۃs8ͤ V29HC'b14ZF HJd҈sG[JfsϦq@1x LDxżXTөQ̇8";rp6X  A5!0<йfAUJsmbL2%;ן 1In2ya6 >}VN'~眓BYӼy>_3{{p#tcJ# QHϞI%b>9STs8ȰDN(،E7})BЍm?c퉐.>R1\_U瓶h@M- R\}\_ͻAIRRe!݌_|{WT^ki7Fl1[v)٢2jaXhPgKw߾8k(X<cx~.._~~%%"l^b}SכmLfW_xr_/}8w|K޿޵{3٤@޽?܎t|yӶ$6+`2@nplvo1<+B0 /ǔ~˅sJɍv ]!j}bu .oΟNcǮwy$(VYɒN dL@f%TuxU?ńֹfyZ!ӕ* )hqc\1!8xȡlff K7] QS?}~oT\>L,cJ ۫C(r%zWSŅ}p^ &BlR&gs~u0BySfJTGb&G < L"0 |~@i00]}h\LKY"y>1|hv$lWY$Qn|};8S30Hlh:x C>K-+nonlw빁uxKtqJ׺ o Wtr#{f4AV;LUm{yw$&ka:e2Klw_Ou}dnpK~XS-cSJ*KR"P DcC7bQQLZ |pղ~<@HB`9+( b$ꆱJ(! F]78@)2F+%U 4d"OOIn0Vh$c C \TG;dXd)pO gA[1 F|L`?nV.w! DѹHt2R1l7f3 "ɘ1&bT$W c"ƀip QP3Rr. 9$F@D'QJ\6se<LJaU ѹ8:Vg1ĴIYCU.Ԍ+ U{tc` (I JCѧT0Oc4sݱUu|o[L2ֹ~;zԃ_ YSiOBrJ#4t܅n{^!!&5]zWk>:dcށV"բz!l ̫,SBsn-nlL+SYY;Hן3S> <WsP:Ӻd۵wݻᰆaZ(2gj~Z~F>L@l[oo~ S*S2mX+REON/o}\]^޼\^_/Ou[iV-y!u\w6u""ƮyaʅfKXȳӳId2%=}Q.ZŤ"u4^^;cmsSVgM[%tF4pDXI6>1{SQ])VJPLj9=\r.nhj=&Xh퇱?%C" tͦm,g2Wt1FHBr 4[>܏M&Ę 8GG`;%r%gbCYr^Lc,D$ )3 Em#%B1ё2XUKTyQ0&:;fOWYU ɹ`-J RHا!N眈IJ1rrB8S(E$~4J ! $#9>7b3`tdov7i,zx!шdh~Ff̪bL h^O/AUQ$Ia"}g:k}k @;6yMn ?!/S,?n?&1F A~OjyF[)%c䩏C =%[kaJ1!pBPB?A-wmj;>d9_gEe8 .a'$1@ ޹TUYꚐDQj4C cy],”ȧbs!7c0IƔJQ( B".?)w&9 %q#Q}xصǶ95~]XZ 8BQ4 ŋ<+b!9Lp=/ 9 پѿϾxXH޽i~zZfvC}9 xK8?73 eY]>^wmq&U`<cUSإjzeTYtl^}۷ 7lFRa2VV6 S<O:sp:5ꪞ \句ٟm綃ka!ݱ9fٳo}%@ze_|J;Xv_~ݻׯ/_lΖ~$w0yO/7k`}ź\/_|4/Na?|Q}Vdo~oͲ>eS../֩ Apz]H!/^azd; 7*d׵ucpz!}o7nϲZʹvR@3VJV[>'R ]n=ܹ}~;-5~ıqn;pyax.a{cEUfO.Dy.tH ytxw׾[2|Q-..a9}$Sjhw>^xo~ۭ6֢!!@̓$,fLp{a:Dv̞}3tAr!A.d,3Jex q7;9Bߥm=x8WJIa۶{n۵XtWFScS1\I|ѷ]UBs1n}4 %Zc(msM.T16L##,Wrc)F4%;-jVY!L)&/$Fa jL.d0EA 2&q]UYT1.rEt>Ngܵ΅,W]Yv7I9]m͆'pOOVѹp@yE0\1#"\m]pg|3gM+f_ݩ_}f4)dMA`®un)eky (y/ʡO)甛tn; a:* Be@~˺?nonGqi<;_ m8!D$4*++J.ϊkկ7ܼmz-qL;=O0L=C,=.Çwֿgg:qiuNlud:L0%&}8H\Ono[ӫo?Om$ ~J K5wHv6)aR3-x8<ܣ`n⏾Keojբ~|8})[Eá{b?.JO?٥na?&"MՒ뻿*_勼.."υfov^BihZͲRTq)_`=P`|)^~ o]e"S_.Q+`e.oj34 rnhMz6ϡ]3IuYE&TTPXԑ1e]Wٜ RViUzVBp|?4X,v'BSDDi\F {?NOO pBA2Bq@ғKOEbȟ&PHc%S+-t,_$;#߻:بbO]!"q!=pv G"PRi% 3Fc,clճrV)qiD9) H0&C.53;?6h+Yl\rf}hH9lDzs^yg|^F$&%vzx􅙯yh3raMћM=uag.|v=UE w۽+X#0R0ضM7Zz%lz6˲$3imhQFjwj'2}`ql_a)4Z3>15m(xD2EV0OGE1U3SdzmFb,"l_s@x)qL1AwM1#0$F6 jѺs0S`\uQT xAXC֪/n|Q 2% ^w7SGpwe/(f -lãL.Vٱ=Oݠ.ݑ|Qżn yVRL2X CXbfGi~ө ˫On:D-zU8Jc]U`4#6op9H^}!^Z J)yZ^׳ih&˙^/K&v﮻8_Oh }b7W$NM/ ]8tqRuVg'0)K-}׮īOΙQDg" tyaj3?y~[N0ylN=pn Hd Y2nd&,R1Q!4F]=ZRaRcT6ٜ1aB4H%l&:i )X}p>I~8`,Qv`X~yU1:\̙P IHG *+PLH?JX$c,!R^HBȌ\๐Zanz&WsAoNCcsx2S/r\JΨ%ĀFگC1Xg!EC0Q>vqguCQH#)z6X+S~)ˠ;$7k?xwkd2Ebd˚D|w<g6+ԩ|>*]Ug8qEi(%g»SJy|&eN"m?4gCNwway|}YnEA-W?<(iF7vcy]~}6iϯ(|^siyUW,TVpۢPZA̮oqC8+zZ/+f>ǘeQS*:iV?1]z~IԒJx*Y]ɬyUSwn6WGN l}(ywz( O~RgW}sw.lih]{h%g4J 'oߏ/>䜛*F:vn|JphY "E70PL\%V|Lzu4msRd,<\K*ː hC#7Fy ]Ҡ (ɔ01$§}8iELI[D>D&K6.mTUOI(RrR/ RBHYTB)%%R@*B 0 bE3Q91"0@['h7j)I۷0A*GNH,&.^] 281OZk⿼G1b K"GqCh9nO1RY(ca"!|.9hcMm0z   Z2 Di~5f^Fs`it%8g8䕑"&JZ#DFbXՊ \'0)(=EE !E689)%94~>Ʀ9 3dѣ`ȘT=tIZ8D),}]0~jFRJ)5cMmTyU6 $è4li58yaB֧(̞]>]"!v]28W QDTL1PVkp ˡ颧 B#W0یi2;5f򣛢< cM@ijTe|8RzRbt <Uf3ZgY6yJ6X}&3#!L! -bL(D~h[57{+xl%>mawfK-hGYFٰ^/>[\c۶k@I).q3,l$mUO;;(B鮯9!y0TEÊ{s0(Z2$ !8.B ` !"3kΟSU!XLxy8_2e}_Ƭ7X/#z^ʏ^/~>鵨./?ų_y{<@qdžV0[M^|1}E30[,G84ģ4lVHvQolᘆN 5;bl)g, *1N!r0;B:¹H 9v۽wsirfq.iK*gܻ01Z`? F1Ps$d0E$Ĉh@~x!Cd}}O` Z\O(/J)9?cfIIJ`iL#ghBp>*-C"$.! L.L>!$8Bpܨղz52!-c(%炛bp(7F%`X$a)? #'$ĦS$m"Ť9W, Ix&# vIM&Xpbse.vi )g~ ~ gxg$PJm\D)u2=I4e%unȮ~R9/Jc&n@!/Ԓc$H]K,R* 1@Ij%4qɅGHSprkP,Gu޻qJYns8q<a'#@ o6FG>A`Q@H)3װ@DpvލdJTz!A@H &@")RvrxhJs'8*,A0EvFN''>mrWB?gDir~]ġ7+JI (e!)`?\LRgiAg:ӪXVj\o]$ci<1Fee9im!^_O&OXfvh_.׻vh9T(rfG6:Rh6vvrq6IMaSfHkEisJ{n5Ci SU/VKY~gk [drL"L,Y< ]2INv-l|)U6;r枿 {7S8UVˮNOef5П-^lVW~˺F 7~4B>y.igMơ,yUdǃkZ<6d;t )QٌեRrH)BdfаA1ݞ$3i0ϯ~'̿K>:euh&F IDATUvQׯ߿=\ӷ﾿oxΞAwW_zs<5V?mV"{|!a󹬫]s/^\u-^apҺjɖ6춇iΫ>zC;V7]wSJf|(=)'Z¦;lMv=!v8(8f֊c 5*ޕ qji7qlFx,r&bd)l.QRdy!"Lc "a|qzFM+NA}+|r0" +)#0EuU췿{381- (Xm~H 97V~9SBd<L) '4S:o ?5iUۿɳRG= )q ?c1W y3æi$JBszbއv1fDBE !:` %ǡ@0"{["l^؎cl_|;R|H8 ]kS'+sk/t7zɉ~~74L>#y8ҷ߀+1+fo=l޾ChV<̝]̪ZiY7_toΉ}0tgsvxاqwcWa"7!k)apge6|V-2Pϊnh?_'o ! s8_k  1$/sH:5]shn\o͘{ο_^(n{ib6RRq%p3拳xڛC7o%x n"U{sfW yvYBɶm+A5DU8/bL1@{DM,6^\vg/S;.,E8AԻ7bGŏ~Z׬ߺ,_p<_b\`pk D1j/e߹0& m7m3J9f<wדTleSǃw{䤋^0ۡs!__,7ma/L[T Eڬ,* yzѬ}߈RbW+z|C =lPB) Lu ìΌm?J^|Y0R3[R t˺=B\oTZ)@AZw}nV)? a1!ey1yo>^bYHs_P1(g '.E @32Sie߾WVU9DO$d B껩iF$egCs8,9)q(Iq(q:F%T^̤{"AFJ|Uɳ&LĀ/bnTRbHp+aF @쩑 P}$YA@1zƘ&iw/>kM51.L'""p B8@TYEQ$$LiHqEDʹH2>f{:)cru¶k-FI.,b=XE i)_6ibBFF7MnRi19]<ز3D$LdǾKmoqrtvNef3Kw<LƑ1|f"s4>gPvVۼ9rg 3FfzrqR媼?&7 4geQϪq#^&?)?tWHD5b·4,,p >O_*; X`$NXUz8~v$Y tu}ztN9.'q!{L$JE^D׻5+*_fCb721yl0n'|i$S۬jSR!.Zq$X.6?Y\r|%~;|r#\9}xnBb.{X. vŜX2c{'Wlm9gEx>3HŜl; TsōDnXBEs{v=xc%[NelE޽{xnl }@Y.:sx<ow[q__ F9tppZ.r̼R@ɦ0ճZsO zua-uMnw_O[РE00fy|vV\,g߱L幹~sCixv|nK˜}]pz=cpȖj;}e}7~t|N."MIiLrLݽ7T:4e08G_/bUu Czr.Xڡdr5ˊrYKJX.j,K׽49X+#b)ez$ 48B ,7R1X˼*.D,|ǻaw?(>n.f\i>N㮩k4 Xs츋w-F&v3\0cC?}/41!0l1@Z !ē"%y c? [-2, iX 1BLlVq% $:/5Rp8#Ɓs8gw=5Ue^*zZ7C3<ςv} sB2daRӁM#n籞ss Őb!Oq7aޏ! " iCɧ" SZzVo9}An~f|nߞ2+*qo4]-yUJCWJ>0Kd8/bjxal!ҀY^,m3nt8`\. C7eÀL(qN,1LȢ4yV?n)QID8EcL!M>2FGxd"NҰfwܝw(KA2QRĺ(}xe׸z{}/ׂ whCsmP,`L伻#1`L X-}}/K#U2CQDf!:>)sُV_eYͣɂ5 &;5.9|vUץ1EYe$rJ H-IbJcEVefľh /J/*lMS]m>Ⱥ~>u{s#H 1^_SnN[F=9(*?}1S#ϋacfMbyzߓ򢀮qz1{T>gg4>%202p J4‡$I4ʎbFDi\L#yE-u"K\,i}Jɛ=2w8E i ؞ 0jkq꛶Η~ǶI5Bhr`R(B0MHH],g4Uc)$݇yvq]=B2L/觬-b61E?"PpQp3;Eeݐ:ܮ4=&.9B߁8!߾S pa4 wnG@tFq~VVn? 0xy=_-3c腎'ΡZ_bYۂقgRi>brB !IH(r|>=h ?P̡tI"&:kbYdy'*VPv%Ϯzqr{ZZ׋cwϙ:{eے<>W{*PB N""4 V,.9 D,=h"!6/YSfRd7Ed I!KR<ʫ0ۘGIUYeq>4lO1F{,t>h)r"\{墬e1}0Bȉiu?X`q(Ŕv<E.tQ"  ӣjGZӼx:O!妜/scGcɸ EŲL0N XXL! v2GrJ9u)& 8Iw1f3Yr¡1e'?@J)& 0BG@$"̗1\@H}P/")a4o꒎C<3,>],Mbs1!DP5H $bJ4PB@1%LZZ$niJ(!o/ '߇RxS"!eD)!$JQJQ;MhnM81h ΁sQ/s< p<ƍ,Wa798gyF%B`tx9j*v1& >x㢏 )ZO̡#1(yVܤƉs,A#fMVׅ6x!fZB.9!yG߽!<) ٳ2퉽XeD)3S!ͫ\J%e/˂8)GA1e9)eE[)bCB3j;5%gaֵ8*(BWbъ$JRB]?krCNe%3Z1aO 5MXy6n+ h{&̘xUSQ"y1 ٞrTݤ*ofbYep:9!c"!d֎Ϯˊ.ڥ5^4E*r^TSp 9-+P?u==UrԉCgFGb"_ r8&(9CZZ8)"I[}ۣi;5_d7RfvGYz9( عp:)-g"Զ ^ӗuͫ-!-Eqjͳ>v8<{0 ZxQ1: v2$ C8d3 0d52J6I_Q 3JRmT>> ]++}^[0BeC (9T ?%A0>2 O$!Eq"$b;׏bFb))oaxJ;DSBI[z/ <$@) R 1 @7K'gG'@RNB!x#@"&Կ"q>xi8"B %s9f* "$J)cmbQ6WTZp0">PV4i/~{>w yk\6%UF,+,fMbh~b!1YGbMJhTB(a|>PU\L H #Dem IW;8ũݶǟf6DT|#_yIe뇄1Y_/>>yap즁l⬙,9 ^׋<;B]O(>"_23YUǭͪ* kn.!ÿw 6ϧKʡ /6xtp >^?]n?l9N\^_ bW.CvϿhc!l߽}=ׯ/~RU/࿛;]yWWi},L:h{\MwuQ"=fn? 0hG89kgKeכE9C^Jl\| Lq2IB8m&kֆX7녷xUl֗(/)FG5$>ƄK!ZOȔpl!Ĉ1 )zNJcr`V4B.fs>~k4d00oR,OBBi^x+2-z:!w[7yO)YQP F . @yQa|W BFn.f!p@4$6  ~F%a#y@1 QFDJ !# e^!qDQˆ Q ,fWwtS,Q (~pƌ1=JRk.c(!{}>yojyuΥ,< IDAT=ǃV8<˴ѣ "чL#A90AΙ30 &c+hfc#J0cLQ"2JѲ\HʸsևCɆƸIi gwBѤvv,KcFg|F?y?퟾{xŬ9sێ'K!``5LtQ+ʄq"x Xj_{AtMhLXB`xlUFnV0Ze7/l]{q"ӡ+qZ Y|̗(F k3k䍐U|/?h_=c !4y-\Ř^+be "%!T/W4/hcNawwa9F^[.?ʳo|qʜlvuq vן.]NÃfxTG SQzl#" `li1ƪenOZwAl6.uʞx5Z?OY6/G?Boލ6aAD3#bv8 pf |yu}Րߺ>b.tpdwUzv}=^' ĐS^}exn!0N2̗ @tvrǧsMZ?LxpOOfv;=}N]2_)M?_ժwE˹z^/ܫ/O>ɳK{rsǫb}:S(9墩2.qQJWo |],6At к{o3rǘW"X*r800iu%8"FS;.F f3\/z6{oJ)DD IMSoSZ0ń1UX( @$l?0 gTWTrn&ݟ!!csNG@ A %nv{^]eUW4MmߎmDBaDHFO)HB(!y?S!$E4ԕQ5$e9r:Oއ*p&wǡRD;2I c\> k/oB$1!g<[4NJ`r0B0"" 34"܇(a(hV 弊c:nW;J\ִ 1KDf!ɻ\J ${!B@H"E[M.(J__/s'!C#, ` #!sιg]ujH޾޻#NL&Y+LE2_䅶.` 1]&8 dAG*xvwaeQ]^OͳݛSi~}jΞFlb 7UWWan ޽n0G3 !Cʲ~z>V=yI.aT'.8AƸaɇ?v5w$x ^.$Eԗז R58MŪDtC ]^$VP6i 0A9y.+|^+}fK4ty&E 뵝/ꛗqt v"Gd>rνTKqy,L~hj\fpqvTOʋC^Yr=\fvF9gV$cKL)l \̏7Nvv1,.I's7qQsŗ7MS 23wRQt27s Ƞc;82E9MʷǧqLg~(` "!ǀy{(!*J@ %)hQWU4 gw~2)Ç%)Dy8}`0"$J\K_{}uc:Hpa]"$Řb?ɤUUuR*b1272k#BPY]QNJ1PBJM(Ed1En준rH1)d;Z}&A J>8_p@8O(A+m\#DҤMB#ZT$"9#k49gc2|B58*mϭ;aFB0""c|0.ƘqRTHC%ړfuwӈ EAp7L M C7B'r\ 1ބ`C(Ry@JYY\4w1,Kb;/\^XT*kOU'0^=G_FKѻ|s4Y%E[lQk1:]K_|881b$ԨM]^^ֳy$F ZH!Cs?LLƁ06kXybO^3ݵ~;&GĎ]h:cSik=BR[!( l2P6T9b s#dƨ S uWyY*nTݛ"' BSgfopQ!8QgopV& LE)[3aj`u?y,tt|j&۩袞qokK;Ǻk5lxծSP f{y*99JZ+|JԣA91+=`·0$9) ch[߶!Zg<$0ioFpZ.!2tR&8ǫY̛X+2]7˺\O!.jQ՘73PxA|aYPem26sdE@B{c!z331 E bLZ1 HX0G5:c%4dpJDeyL1FĨ~?Ęŕ~b@H3TY,O RpDc@V;`hQl9g߽j珤B(x%D?e Y7c(AH):P ř:!xJ˫)5$!Z,h>`!$# *뽱I* 0zb]Ez>4P\\$66ΑNE '4ų˚}{&%pRvG{N҇jGX5+ʩvԖU#*# ʲu(ˠ1Y_ǯ޿n"LNN;`Y"x0qTF=U.5ϸP)?j^zX 錇H2 N )q" H86)7;&EXzҽ }ߦ``0B)I1qI1 2:_3gt>R ,˼rzF BY\a s\M Yb=!N0\1xmt?1,CeMʌ19o<#L{$G9_oSg*c< Cè ge1ǔX;P0C3ZY&y\`,ȅ+ iJ)rThAPG#T}!bH[D9p_<#^KK%$SR=?Da"v 1tG87Y⦡\ B j5a<; A{C01^* MLȢ̨p.HPd ~1/mG`( 9slb)ATLMV b(}B8ֳr>c Q Apl P OPr=@ZkIUySD E9@ ةhFT,F~*hsy鬟n.YvsSNp'?Dn휍'/WeIY\Χ{X߲ ~#Ja}Al Y zY0=TC|>e<{ ;"Re"墚rɟ~1^|,UXD&t}}#M?٠ fvj{n)|MoڇXczR1bþD y﫸@Mod(9ό*ʼUݼ>B>㟫CvmM,R^[ӫنK WQ euxxϚq8[XgGn̗ɋy%D694`XVpRr%q &a޾XO OѡrVw:Bw9EHѼ^> d'c?x t1f#-wGݻ-^೟̛?C|^ |ڡ` 1Dldqܾ @"8fMd,;eE縢0$g hf(-"UvL-JsD] f3Q71Q08  %E I]3nR.8B33R_L G&ޜ^gcEx/?LJWV3r9lhSfPȈ'=vka FQ)&I%KR *[ߞBv-UY^aW"X Mi8@Ec<{ 982iB[%3 B!105U@Bb@1"0Xkӡo7X9cD)>OaAG4㲊%8 AƓ `f"<EB8qԔqX5\9RQ 2!l8 *Ebl@TU@iMUEVߕx%E+[0Xa5.vID)q. Bwe% Ekv۝G, EW_-Bz~W|6OK3)q;O;emJ 0">ԯZxqq>>m#=w·=Hd_)? +`K!tgxso_?G޼v!X317+Iw6'z`}a,V|>OǢY잎@y%Y]gOwJtqEs}; 4D("U uEpr^Ȫ)`ҵ7&iʒjiA0_W|b5?R,f"p,oxGL`|}sXkټiRK_(b~c;tX_Wn~0;8Y<=k]?Yd&NG{:LÛyJ(eM+wqy=黷ۧ#h@i"RɩapV%PD8seQ"X9/ |eUezAf9gikھU"͛,ˈY:6s"HV>g3wOApxyz<(\.+-0juG~s7<%ȮWԱi2Tئۇ]Z(yRxӬX_H,PR6[t>fA/./WgoU~_5˸ARE\npݛw'|P|"E%PxTR&sΘVhlc!&9d;ElJQGc /zSn6uBʅ`'o4Pb :zuq;><>LjDZp.vۃ1/!L2 2\jm;0ȗ\ o<2)`K a3̼8׻u)/Ȳc6\d!cd]YުI9al]v$=դ \hBC{ہ HqqbDʺ$Cl7'YQ:ہL %}$apP||篲 }G&AQ$ \FӤ&0k&61ΪDT`6&c R7ipPI QxG8 !(al悮D1Ø h\yrjA)') e7o ZlB8!R|0yX\{\p4qOm@Q%Ka:1t}0dϮb:,ܤn7qRf3cu^Ӝg|[{њGIH a{vu?L7śGMN01. pZ1_~b4WlztVq (㳋|󟋿p]̕ .{ V@Hj{REli( z=9c) &."hΊ9~w'MxX B5QcAfn_Ͳ<<pb!f 2v\=qq]2ͤ/ɷk{P|v 5N9QptqSY|)b^0Y~QcnB@% 2)<bf>\=Cr9/C!t܏C$.ȤO Hx.cYcetJ>Ջxy.Y'1nOr$:R<ق"_\ N 1,gR3X/e,Zg12GSJR2 e BQ>`H3Y,&1!aB,Ue\dyޞ;BQcsqF)!F尾䈪O6byFSЏPkJ; m'm~BKO&?KЯuIR(Ne)'SBJ8a۷ޖYU0;* bJ1QJL`j6BHJ#>{ [1e6KgRCJ8bJJ! cD 1&'A0SJJ 9d{ AЛpĤFBE80u=<gUx=˒V;g#xȪzO4dib F#eN h&1xLlP0SճjםTʸa&-帹BGoSfhJRy}iOo!ȯ­VOyQeQ<Υ1*zS?#o }2!ssݽ?|"o3v.˴<&ߵ&X )3LߏޤCNi8+ *QZ#tU5skܤ)g1g$/8Z]lyػ'\$A\<g,Jfة;IQZk jԃAW?DH3LsnKQВչjZx .H7X(%% ~tZ&BȻ9璀 ͪΙycW]4wp?rыllFۇۄd|Qh fc v.p{oKrvB&ah݇wZW8ωdd($H-'?g竮JJqEbE!\)2$d`9n^Yi&dcRCUREDǹ@JdNA2s1 )Mƌ<>XK QJݫ*7L!) E R1%(!hZk9HMG)rJS%ܻxw7bZ]Fp1k]xF0aS($6em ZP?>!@,$?V< qӖSSӪ?ȧ&4my g)!J@(e'Bh2y+y PF͈!S"2@. ?F@QMe2N"8!8[G,N 'J@bLɇhb}ԢJdLh@s~@\ыlz4 11_²ed$'!YC$Ur 3-Ea6q,R;g+F]S1 U M 9cJ9)x0cW*#)}7LX/a)qs1ćuՅ~ݎB 1B&;ﱪOO~S3!1" T-_2w?Iǹ|.ȅ@I;ޞݗm'p?fyϺPx8DHZ"8v13J!ئ1nhГ M'y!( %8?ͷoZ.*a%dV7!e&$';`dJjq|{O,6gML>6miOB.h9a,*"mVu]~)*M㘍! o?<_5eqo3>F"(^ޝ~{vXաb2C/BG4doC3 H ´>JZ|w *X)p.R6O>@}.;-H +Gq^HIq 9hǓcYW$$R%82"2PPu))E\ 0LR9B(JJb$X.T$C"$s!,mnA!4ƭwÇfp;~x+\" ɈΣ$QFlFGBm)R )4 üMJ+.2 d8%)O(PB cp%sħ F=a}J1JWJJ X(Ԃ;cr ASh1Ykch& `!Am1;yfc] 3"cU֪'s:9IRfNf1,JG3Y (GxSŶ*X$#0 3}HSxhˎ?Anm:n\@BP  As?O+i < !#*Rμ' 5mwpGv̄cƈ HXH>’Ol !d$B(R;L,)2KIZQ1a̋.t)EJeqnApUå&%2 <ejq4qN`9bH0?b q ^ ]Vϛ?! pl]g qB&)se!gG;Arbsv.O>+ex:zg>|x;N`f2׸=աD`3gv{{Uڄ{?%⢫caOt'q>a6 lcR oxw9yJBbcoRS"<"ۊE#1 z<C]HZ,g#*EG1w%д럨1G&`s^߼b i?/JѧqLJ{_o^~64V&ؐ569e"ezYl;a?ܢs?+.` zxwO>'$E%T)ʴ)8~Oof3< F׵aJgXvsDTt.JKux!ғoze.պ[YǓvY (@iϾ?|3 +!9񶓂3yέ~iXKZ2DžJxsh:_hS!һ?#N#ɉSµދ{We݆y"TILnD]5>Zl$8MZ…Ru a7ِQG*JD`VD01X 8a#>,'#: }%o?C(RswΧ'Y2Oti3BE)e4@mD3r n򩷂 N%p<ϞooUetE붓vMQ/x[וo9Sx)Y(NB?q F*8?'MKS]BpUM<_X7caǃ}&m%D zg?t}=l`ݟߝ6I\ה䏻&$e}q=|\AےnBpVd M㈈沢Zp4IC_/>+R6~wUCcL<?<4~p01Mw7yjyu~^Y?09ŜcvM_Q p ݢ9cT+M!gq@JX ~[W?Ef`Q)AqwCn[.(* N؛)!p81 j)ml9\ R7E!y(V6l,f`B~L.ׅD~9.QRm`Mt:3sή4E!E>&ɦٶ #%$G0#d*B9c@4:9h7,2!(%PvUx4l滑2T 8GI=%Y wIBFN洺$M%(OB ! $UO]HyBȂf!H4+% q Ns$ S)Q&0Q f2D(s&@k{s7*' )~Z<[-f|=Bo/Ŕj"+tzj\M 1`ιB!sNV *$S{3wBKDiiB-{FIP6IpQRbZץt&G "A*S@k ϱL'S3!M;Vu9e%(C*:Bq%ЪL6]ޗR6բ,EB8N'^Y4爇Ӱw޴P~s[φƨu??B|t V^Vª+ax{2#V\5./˟1tg]FًE]釸{#p6Wh<>]ۭfj`3#T40!dZ(kRNl`^J)i077MV dY0lrU.з'kSi$2U֗?{#xsTn}' ][UE1aOj\061\|۷awSCmrm󫺡!L}w`}RQa;9hxդUz])U(tVJroHT%\H<>wNÑVy~ kJiL+"KH0%2GcӯmZiO:RAHszu]nۯOT5Y-zye<=4б,e׬7kH=@~S)!!byD Cɣ0̌CLHB2DB'I1#RY rQ=3-_ D>]9!feOL[R2C!*/v@&qZZC|4rјmgJo6C*P>奔p0)8M*S S^.)A @,WrӮ9q{ ˳\ ʴyDSx<ŀ *Api 8wT=OE8K!C]R 8=ŜT(J:W!cHza5MxS0[,ENiq:RER鰿z𛯡jİ!d`tֿZ#1"it $…ǛȻO1eG1ِbU?M;qB>{qwG3'&Bx}F܅i S:Ru)sM(8YtjqxpvJɟ뫪O6犲IE'6sƚT"v}:OYTu>)oWʎ 2c&q4/jE}6;cWQ5VJ5Xz~|ϞI1`tR>\,[QEU}!w$n3FpWu`M>2.b{Ld f~5e-?]tvlڦ*L#!P 0#%zsͲ흙$ >;kRuլWkʛۡR[Aiwc265.ʶӅ@$\wd]p< LȰtoCXbIJ \p MvZe Ӛ7N?yw6Su\m)e ]n"y7qdcNE:;&] Y F>uJ󢠛 6K$VlI; ThQ: 9p-҆PQ&:<%g9%PVVbƜj`uEJ0J MK"Rݲj:bΚ{˴ oo#0O:^S+٭tg Q>CPO6Y n~xxFU6' us+ʏvSABh_}B!䟻dJΙeJc9K !$$Pl(n٢f?&'*,L]Sזu&̇Ӎ*1A1Ő BBYp5Y)V3;Oџ'4!2-cr8Y磐 v2R˲S=3䐪dk0:ZjIq> a~u^6uAH'3U˥ssTeݚ]hLHJiW7(nAUMp}~;z2ly^LUy\.aps?uq R)Ɗ?0) MC^t*EaϔVgq+UFF=øD߭łXnc1 KŒ&Z2-bUJn(򓔌n6u^t"S} IDAT& SS?aQ+1GDJQjI)dȇÍp'?l"PteM*SYqx *g`d93{'Isg]蜢hOضjI l:m[_N?yf*kdY!% !;/ZjhhZEvy?uWT{cz:Iy:Zf7aasI"$!T*ŅP&O1n gK7zԼd fs7Cpf̋zRvu+]J!%S $d&2s)g@ܘu_e'ype]Jc=&8%#"Lrwo߇a]6 ˦)En)Br]*}Jy @*Ƹq 1L39x5~& cEG+iĻ*3ME&1g"NUH\ 6&w,\-ٮ$&RnC|59MU*e I$,3b E@HH"fB3Ь9߇.Z*zɕ2#fgNiN%U%1A# ic8RE\dSB/ ɛL2ɵP1>Ega4Kb3%8 %lQsn':_A>nP-yooiW͕PgY((LHR"'S/ !! ?[t,DD=%1"LI^z'iSA3G`Mu! Uu f7塓bHsRhy~q$D-eՊۇxطj+cd*okd Le=sHmWT&?>o/ĢȔt?[)T+YR\~;Lx@l)Y_]s;b76r%6Wt}ٝF3̅`B v"TJ9Ehgb!WO_% >aQ)RjGaV[Lt[SEX0r]"ٶR"i 91FʊG 1bfkZR@ O_$yR:"Sj=!J1F@rwn>:,e6B# R&r3)yٻIp"J֞>~tk^͛כeY xN~ 82@FtT9hSP;F'iN/Y%"xB')Ap:Hfɘ4[)=pG*)1.#6d!YILm'3E R*N70^Ȃ쟿|NS#1Bj߆?ɉ7xkLj>/8өi䘰jMM4e\.y)[O9Gdkv[(njҸhJz>fD%kV Q /-a/B۲UG) '>>7/??lv]D&Ҭ $7ՙs?j O_]^uson~M ʆ.iBs ]IH!ԋYTJ%zOa8SaD$nJjpIk|864n?eh6Jfi}x33Eu9fxV{QJ`:v?{o|8!ʶ^}oKI֋B`6d}\$aHi޷ ]bLiO~=]_w߾﹆/gݢY<]NWc^R?~7ϣT4w1//O߼8ٜYUw2FmkzX;gmIL9gY* 9x$ \@Π4PA>(DZVԼ&fղS?ovuY)P@RD$o~8y0s@s!gcBrs1Kg0zA6+8ͱ÷njA+I)b!NHhSUCΏJw~{Wvvw81//ˇ! 3(jR(qvP\&Sux񅖼!l u=/rI>R"/0 T-@FZ >4[gGcamۥb8V h ^_e }a~,cUgϞY|Rewl~>NRĔRp#eLVal0l̘7g&L>=%9Jko>-ɁR EcB4,s3 `TA_TUpZ_jo9,r 1`nQ/j03[nn"o}ߵG8]wD(Dv΃rl~o}zV338|9{R;9kViE\pn6ݤcY\i6ݦkŞ\/?ƌJpA~ =n_*M?Xcm<=SE:1?bDvM>4$$)&)޼^-Y-V?|#ej=|l&ؾsoޙi+YC24"MsNEU#O8SwZ\^>|o;?W݇~N)~0ιO?=?o_7o5-g8=RٓE}:E˸_hRxx%r樻~o CiW.&iFPG/d8b*c4Us)D$ag"Ѹw7fQW,5%klqq ffr[BơH F8eN2ZR%M)75 E,+ i@amC~伪>4yA #L]B$J$d2ݨy7tvX ! $8tLY. PٜӜˈ*P3ZdsB{dK-&l^pcN|l&<7YD|TX۩ʒR䴾J)Ng, $$>DzgzP")"#G?$1>zBx3XUUΊRwfܓH X8/FYa#Ss~VeUtq2C=ΕX?4''<Ʌ1ݑ1@a &TR0әӊPI%` 3a!=gx2QiM{b&T]lY'}354ߍ4UBFN8z?d'Bߏ΁h6x [PSadYJ8Sc ,N6XWQH x"RuYii.9$iRճa7GC$IFc7C4^PۉxIWFY(d*n~jFR)!5&qV<8Yn۸$UIVfs۠%g/'ENR-،I8;)?2e<`߸ Z+Y a@!ĩR"X0v4P.³eV(v;Y{Ny=߭ag A)%zF@LTޝot_jz::Y:-;?zzY]զ0Mh[TJئXe90nl$lQM^B/gs&hpq{?5[HN^~qu?4mRdp8bvG%9@JT3@Tp.|sk+}_ps㭎2rzhK,`&K(j;p6ɻ(A7 vm{lMH26_Rt]tTLr^[[|2EZp6JOG흨21ǡvVO(rdjK b @gPf #MU gFo4v NIHKz 2ei!UB0`@o)jZG}qvy?{TiP`\0t~)$KB$a  9NZOR̨J*$hb!)),K,Uͦn/Y"`ǦA*+&*p">ܾvfH=[ +Ə}S$D;9[3]]hv} 0Q*e>~[/Vr.5\dӈ:".810JLӥq.㼪JK odZYYʌ:949%YUW;KwID KJp2%ɍ q4Q2h:\0!ZgM%söӇ"ˑrΨ*ȳI׿xR/֟>IȼvM.hO\|3 iz$bcuPZ=C60K:;SY "i9Zgb˸=܉A|%Bî9{.Tx^ɔLܻi4J]Υd9N16̍\! %ULۯ (Lmrӧg!ol'ϖ:45(v!Lt4FSJY" Pl߽2=[њÀ1:Ch&AnzS1 ^`m"lyv:yv>f&Mu3lO,_DAHV'~vۃٳDcstB٢Jϖ< 1YRfqΠPjy)աi|UEJcUO/ Kd /ͯq:ze.O<ٍ%s9l~ ,dh?ռ?yŻۛ|ƍ U&1|;+$ȃ_$.[ R{vU.fe$X2Mu'O^ܾv86͒,Q)tS? Bٷ{[ o_=nc$"Y,RЛf9 'pd臶;F42En0:7[y}]XftwI2X, ~0[?~>?4Ϳ0jvyZm-e YOiWpqVV% w~rɝ9)%,t/pu3i4 kB~'&Vմ:V/^m3~xO*' >bwl837#p}%˟6W/g_qlGݭO)2Hkd`!DZȴj}κ@Iy7qNtyC 0ۿ}Sj9_=}ry~Č{enVî_?h5Lƌ:0㷿嬿3b8>=6  iBOSFc2]e\pAda.Nhv-W'3t1R(pa?N)d#S"jޏ>LA1'(Z?R"I |\./f77VKKѩs3XI7` j.18jc " ())P y\!0'T$SbJ0yC&!>UfA t!c!(AC ydcǂ_"@i$ 1E&Y >yl4 >\ܼB\& ~9:7$ei>M3d˓uqr12jj:6p#F'y^Zc!McNzV&pB$sCjb!-0zYMS|nx99 y鋚X 9b&ҘUYUTD(A9jH,UJTvo{;'ڢ(RP`Iԫ4`{޺T[JGϩIdYI*:n{`ͶF?jmu WJ)G?־wC f,3 |jZ3X01߶G77}(Ƚ#1D$H͐l^UR?$Ǎ* r}]'ty&E'M~hm}4g_<vnon }(YnGZb^J{w|~M:^r_<:g!&BWëW[%-,`!تN޵u̪i'N9G'Kb,U~⯿Xɡ]'<).`sOazعؽYV%;O˛wM{mf%ˋ䫟-^|vcswnrgW3Vy8q"Y^ `G8򳳧Wq3{}}/_^!tDG@~5 qwWg?ׇ͛ǧ=l.Ο*%Sx i*/.N/gzn޶}ïfnJZNLU}2 Ic!w>DAς c\<9-xo~0xi1J<'sYϮ{ ,G btݾmWٳz1~Mlt9/cJ9w}<+)[`  _Tfi(ŒE7o_9ò BhL .ʙbNOcn,qL7vhR}& Oe^"0k̃4F3A F*ӓ1Ʌb.o[lю|U| HV;1GS ..Av}qzQwdT b e\(%D$ >#?%B8c#?`)Ј1RF"B =# S?c@""a@P*VONOfR`1ʀ<BJtuV[D(0]pфİJYEcs& qkӜ+=jvGറ 8 )GO3A2Jd1$e1" tnh`P =XųXRG<&Ag,<Alć{gFU|S2EDsj0ػo#;.QBP1x@`C108N1NEGl~$8P$@2iG;}>+J 3샏 Ӆ5YE:is(2Ʊ<_,?t}oGMIgw}G0y]y~]<a]M?fp*vCpOb|uŠR8;'!2Hz)dJy-z6]pKҚ^Ε/`;73[ }aO>d߶w,֙=ݾPq˯.|&%q2ᒏ dYP>]j0W~9tLc[>),( t2UղӽFoLK5w5{3uv?xNɳ\%T$w7,lAǭ)T$R g)8D&Oγ)L(H8OfE!fӠ̄ Lo>e~~ٞI1 :1$xv~w2EWiVݿz '%g~sؿݓT.k@v$"QG^!,-(S0Knw⪪_cl{_%T+SHvyl6MNLrx4>ueΗ wvY6&syfKn|!qoz!Heq}fg"cGBfs7};Ng^4k\Ȳ&ߚURH;u 8^(L%EgB1"*@$Q^d9E &6N :pf'2"R'v@S$4`3B4bPa$îoHs0ab9'u pJR!Dχ`$1P?0 G?]c !^=vhg EBPI tJγWPHOʅ˯߿;2%\: Nd|cC!]fm'}8ӹ+^0>YuVշh0DO =]ZȒrYLRfϊaB6ځfn:8t7Dß=`n{aܼ4d Tx$fY E@'o<:fyZ竫*-$6٭NgŜxd"MT挳pr9Mvد{ټ=;]3MC@ \%E}v^՚ ,jlڴ\$4ݮwd2fS I?%i]\W:gNÈr0#@JA@DH0>ú?J)}kVt(CAx׵~ Ed v&7JpFg̈́`b3ApUUt0d^\^\9FRQd|Bk.4|/p 3ze)zhwlRRj.)"9L.PrdeKknÇtY}lΗ !EB M]IʪTFIk<$p0f8AaB*atQ JNWWˋ qvw_E_|\<%&'Y&R#bܿn~GW0r1%dдWբ@&kU*n<,$9e"y$<`,pY9v׷;=,syR,oJrͺ.+ p8͸`U0ŠRP.ιw5n:%]f2/R:˫9f<k<(Rιqf# B"R$Z C^d Β`A! iuǮ]\H9KSp& #cjmg*I\2·frJJ D)^'2Fk$@ [cF(HHDqB??> B! "$\Dq_H# F= Zl/=qPďK#FƸ:" QW$y;Qgb"Fc5v^Pv~-=mF&\*We]Om:/2Ϸ4ms9ϋvj :N1c4AayBҩFP2( IDAT V󤘥*&ڦR%-߻e d˖t ;¿T-+ܐA@$YV^rL@Pl:q9kĘc|3T4;ss}{1@!cJ( N+6gy%Ed\~[xl6˺nΫd\~{~Z^=^=я.Up5 z:??R!} W ׷]F"I@H8%Ά_?O/^ݾJ{Zp|}nnHioIQmu OlE֕›$zA ],s[c>3HP1\0(mCDBDSj$2B8WOW7X$~٥X,hoMT:G]ݽLC AEv2*!e)vWv|m=&\=:+fk"ZUTkdsٓ/}YU_}qޤI,+d@._ղC]g%b1j;<$ a,`"ƌc地L Ji""O(XWo^Q&b6Jg>hbL2]ۭRJy9\\Vy r'2Y۫v 8}>1}{oYy",BkqM{Gɤu?DBH %I9)s@<%·"yZo 0Ah,HRiU-B]o#8>@tmÃØP|@B3HHShr89T b\³'<ۻg"9HN j~G',#T8k42\β0= 3\[B 7?ΊtDD'ߋx(C@!B! !RK2ч ?o^Ѕ`&^$D[@dB#!a°#YIu&Xcqax$)f f*,F71xwGԤbEP>YYux߮0~huXI E>DV!"d)Ғ/2F6MRB7u8J(e'i&iC\>N]I @(`$+<0KlN8%Z]c=`&0H*k.L$O2fo\oP@J`2YO'ha)ت}v}|`x \Q7 Mjxru^ Β4Mfz(9?{>NDԿ/__^?=||r㾾~wicz6ii&i:ԣ^A7z,i{. $]9db;N׷x$2()8qGGH3Ȧ I9ɢ!V,"3g]{u F@,-#!g4Q.")e*Ez} @B"G9o 0`@ "Bˋ0GoQB6jR@e$^ EFPL$iyW|>G Obbthap@#Q49,Fv8* *)E-Ǻ&3^e@1ъT&C;:\(*2 $\#,QMj2ch "8T U%~~j-տy1,zCgE:ݫsAK ۾o~˿au>WggϚ~{8'Er~PkD<Ev5ڃL ׯ{8=8'Kr e2(Y?oܯq>?aFL&+swmI'~nVe 85^m-?suK=`mإ5*Z$Mun- 9+s{ksObVi5 ZXXv#t`Q:0r5kG66K <+n:۫q2dAEokwwc&炭kڱssx1 n~.ӛc -bYapQ9 臑Ę#!NI$&\H4eV9Iеh.ZEVkE9*I2Ձ34@ yfR EƘw`@'9$Zu7I -*9H\Uy& fuDyZC`(pi m8J.${2O֥񰝦-.~hQOH412 Vg8C!E1w#wGC.m%ဈO<0!c(#4!3OSv {Ku i||ZEB @-3Y9cSL,E#[vgp^ ƸIf0)KJ9k^Mrp6vnJӲaԤ!ZW7z۠ !H)D"#!HЇ5#,K7Lr)"Z} !FT hCޅi#X *5 xN*2K ϶vG[TɌB҄WR<1A[a!fW*$M1_fi(D}u*kLll0B%̚8#A 0LZ9o$iԗ s_=#".'2/m{4Fvs2Mn}5!XE J a|ݭYIO}7{53@8yQf:;׷km޺a,;{oA/iQdU m}J ϟcOWRa/٣s_*2IP2.OC? 'o?~D ͊i `'3_z@ O^.v#!A> i¥Tm"ɂu>gg'ơ=8eB"A߁qX$VҊ;q>I?{d\KrONiD3uWi8#קj΅ޜж/ϋr(W*2-HB Y^_?LʕyK)ff~4!ρ~߾6|!QLiNժR2`Z7a i:NFEQ޻Gi̶{35T)6Զ`m Dh$բ9LQSd3"<ԏj:8fby$"e8{1iN$~9ll1+l?tƈ8in;mFG/*'.Kn. s9P18D"%OdiSDxR4z4PDTpFc4(}@|Q$OZGMVUF}d Aium͚A{5+99*Btf(Scކh %#%@BH!G4#,>> $j8c$c`M~!ځȽ?yW1qkЈ y#Y }|R…P?2cYVRSS-M%C*HRچa'h^g%CӨRe:C ~"ϊ V)/ Z0 b*|tyZykr`X@44IyE"S$+LpsN2 :3$2p` ReqvN8z3ڡBZ"s6vwEEC$Zc <)g#< I {c|qɪ/WmCzNK9͙> ( e5/Y׺%Y\Z%v"Xvu{zc@Y.2]&H$,HrMJMi8 :H ϣ7SUf^ e q}gIYA&2E~ۿr6P\! c4 Jaw$2A+<4Ly\]oipNw G*~Pm,NUyyuyJܿ^BLmvV[f2 G- xSɫ$s|è9$nvL&jNE̡XvYf$8}0ئIiGBI8uCQRp*dv00/hUQ1D%ǐyF tS@0dy*q v0*f@yw xomj S!I$Fi1!s$1z=9gI"hbQF(8[3ʼw>H, ꬾ.)ʼnk3"y|Y-fm['b ! V(.õB q&>@6[}cCJ"sι-BPJD BH. ec㝧d9ߐvlQQo"U1C5a9[S̫jhlR,q(>[>IU>iJVs_7vA+-S$)i5[;4 ]_ \C&ﮮr$zKiw(Yx1[YdbZ0 4xaQ !,@Q F 8,g)^U,DbqnlNhTs$sr95ݙh!xyzU͠E)glڽ~TXn$5RVz2ۏVkd oaslnL*$:oۗл[oO13m;u㊂!!᨜2V>''UUn޾qx%a6%w YMvwN"T"84NW 㾾}qk)"==( N8xDz{Ug_9ng,2A%+>_OΕ oZ5;N,GZ٪-B0nZA\.xԎwonyU0FDeYy9L=\<~~Z3LaoKNɚfiG?ջ^>v]o gϥakŧ/7޼zf#~ρ߶}/YtN c{$'+$4;~\~Bq4)E#Q%,qڨj|u;OƏW`ozMA9YLK~B$aD~ӏ~x[_[ z0 UIu{{e|&0SCog?XVaơqe2.K ZPJQJ9:}eܬش޾{`Vlõ>܃<-4ڷ}2_ /iS: "$0LloV0*ϟ\U=ցFK.֛y38zk$q&5MJMv}"cs$I*ؑKd“x`9yJYb2"8QT»cj5A|ѭ Bf$p! θv+ma`75:i1@Z@Q"|7iRﭱ EhR$jR2%r릙"Dpa@SZ9a}sc.O$+59V% ! #!@ l&8g !C{C=`A1B!C ! " # R$wH.HSG?js*^Cp<C&#P@F<|P&{PYӏ_r# #mv~7DǏдmVp) .A[M<3,Rĥ*i prŮ"O..\qsv\ҬuMׄQH rz)7Ad;"XM." 6](BYIͨ<, yI"Fc*]s4zhY Dwu!p`"6 Ovΰ|uB@$phs~VևCl23qgAHFwj6kVqQ&`}9)`Bx7Mv('?tgqG:{KO2֭3&st7O/OiC(biGraMouN>  IDAT84W:TbՃ7auV)aN[[HHW 'srqJ\U'Yw_,>zؽ]]O!ݟgo]kuww+FReڱ,S} g.߼}7Y:eUŮ(>oNO괈Q39<_e~F"7 )n>|DR{pq.?i94-cZjwC|WXo>l,i"]ߪ{6 ei03[b޾}5iŲ4_zRXl<{cH !E>H]߼js@n^|Nt @!;P68?IO#{H~~vv ph {99*\2BLYrSnX,.v|;>ѓ~x9[fؿ~5C 3f+AEJ8otehn{w,)7 /WLBvL JPDk]g~so}4cxH9 ~ $n$$;g%֭ R.`AMS}g X!xqB@O|"".!)ԓQ22Fml{!$DJcq4S s\f9 yEH1ի7iFBJ5w4=}Rq~QşǏF}gx˔'IWt*f~D!x{k! ,wa G@&ňڅ1ƀa," @>0$Hd1Ssfl]~Hmbx[z `{XW/b06D3,xpwT0fKYr4H 9m~HJ^Β4Bɖ Lcli6E.df[ *tv~wJu}l4O|Z"fж򂍓2֦Y' ߜB]04cd1u#[e  @[zc*!ԱeIHཷz);8oc&dlJa1O/wo#y탆˜aۇ0=%۾op6c "W c>z0_yAa*NqrEY΅'atν_a0!ȁ*ߜmdL 1)h$uX]\'VHq+Z޿{R Lg6㬌KƂ!'2ۣ d =?QurqO,ʝ67' "1.t)GerAd`6#eQz_}7i/M9I3INIe*xVH$'4PF&è哢(IZƌc(2X.rQ q& ^=˴O8tp#R^fڂ+g)dbfph>#!y"$>z|}TЛ9Iǿ_hC_l#˳unngNS{)aIܔ붨0i-$σ1v㳅?;74XftV~k"M3i9IX@˫'?:hc84B\'U;LU$7z]>cI“~}%TY!R5YMP,D%Ms<8Qvasi;(J`05z`>ZǏ.)= Bxk\k#,dVU7u E X!Ԩ|"!<,.I$8W7]NNXcC|$]RBƛ7j4ðomR?Y'iڵ5QGYЌaH<8@J !!F r >8!`}+?Jr8DARUZhpԳ]8/$%0+L?nkCW~?zaowcq۸oi7)+1 )E1G aom7ͩ$"fY6vCS$wGϨIB($ ,xYΎ$!c=:cӼ" I$^kL:D`-![=PiJ1!FHYN}x:ƹB !ZR0H d(3c" 1ZT)Pt˒\pE^}؇,'B>H8ʪX7 ʼ(JnkRx yA-N(Be1ƣ]f7ĥ%ٟ\8DҤ. I.T0dWGɟ//|1DDF !p* |p=ևYnk%8+sNYpG2O)Rk֓bt㐸شNG}}sk!sI9u: zf`,ᅡOvO(uw}~z:5Ȍ;֜ٲ49n޼2i"9^i*,]OhYZg|)< V*(7l!0>+6+X,IrfN.&~u%axR8mH ]x](WJy솭#R; cNNF}`Fh"glh'!ŠF:u*b']ۃ}˳9GgN3h"G@Nj3_mO8c'i9 f7(T"Fj=?tvg\<ϊZwVZP@ֆqTh! @"alٌmt9iŬ.fNH흕.΅PHeY۷ggL!\%i&cD3F&Q0* 7hkbM>E֥(D!Ͱ(:$qĸL@(% A, = &0c5%DH#,#cYjSh9'%[̒,a:c,qw񨢉 QU9%b׍/֖Ka&H0NP 0(m[ )BF!rF RZΌ&`1~XDΪ""B`}g)#z1 6bAQ0ZhVK&>|N>4Ym$[r~h#8J#w(e$@0k^@:~Ӻk? ! U+|9 h=z 0bgR_-Y?yۛt}.nҪP$yO%gIS!tI)B&rN|ȸ@d`HL8y$0vAP#ݶ~\kQ&C 86۩)ȜWLұMmyFSYTd4l̳qew_}?Lk ^lqhUǝE>[޼߾Q\\PY̎G-ŬH]fUV՛۞˘$A-4-eVēsƸW N6鮞v;mesb,+>+%?הa˯̤b`"xeB$E>׳\Pc]g9D\4:F92I޾V͙L= 8 s*ӣPʬO؜v0lps$[v]͹*ܱ}ڀ@ hЍ) $EA I4Tr_vN H\•ɷ;2j=xwƇOO/Ŭjڝc%h|[k,ʲ,nN5KYZJ~P{g&Ϊ̳{stB AyĩJtW>B4MgR0ѵB 6H>!c[C+ҴߌY0u$dfEP{@Df*$y+eG@C R:F?nxsyf33t.hq8ӳͶ'EYNkfz>/1Ol1ľNL nwmVb*)R*`qű`HZBml3H&\ D P1)DeDke<&E肢Z!͠(1Mh~ c8 1Zpov! XTSRSݯwLD~ Vz+-C! }\;L>pgO} d˶s#h%bMӭz$y^i*:aln\CL!;IOqwhesG0:\b4m$!E.wҧLu?-3)$c1ކP4LĵF8tY2Y? ףy}tTNc!bg]}|{G?kLSD,U98j\ŐOi"a<Ǯ/i&ncTLLffssKu<92ݼ}=t1˳Ӊz{< Y\UFeG⒋3q`FDwߚjJSd=%ׅJ^]\2cϞېSkakDT7&D7b6 &/EU)!F,#:c}&^}MjM;HyJA$ W?suuOD tGBKqv G<'{Q VJxp:E(((~U-|gI7hlw"9̗(Y4OHYcO`[!PKbpQZî1w.=xf 1.ϼN$up d(#h DDdC|,N.;k1X,DQ*C7Z s` By0&^]0It6wkbjmwftKX2' mXdz>cwьCAN6z0]?ЍO..?eP7\ӌɤ7AlN(cQj?Iqwo7m8=iY\_-ggO?Q֛"𑢧dÝklA ٱGWUgz/<S͑7/_ŊPwcteΌZGzWO&vǻbkzm$Do_|L+|NI1_&i'Q(>)C2f;c{wW$?d~h6M` ̧$MgϞ5qi;2 |E=:L6abyanTGo)-\AU*դ?~/ a.HhJ 8n{ ESHS:`v"M_Tb16m)fnp޻4T@D="3ֿ:*0DddOE !1bARd Z Q *B>B3;RT|0m䐬VK%C@9a'*I a՛310U,27( C׹ i877fti^@(+PM֘>Ifdގn4fHUZ(Q2i/v6 }G unme~K2.ƃsz9:gc-p F{!#!f砅1PiveD*~_}?Ct>yӢBF:EUVnugRԸa@vrY IDAT4W3NtۏEVL:8b2_LOJ'OӉsby1b7fbY2')MOSumhLhl,$&WP4 ߼n߽rIiϺjNlZ 9Cdi+y%(a'pr*f]6&I/Y2;?ONVE&BL#=?Xﯯ*zy❉y鳦i?DCRoގl/.yVOdICۺ*'8a{l M097TPdtg n鴷}|OL$m!-*^@g'0nBxoBU󾃾1 xi$88Zt W&yVHB!)xʼzb2Ipa;>@ꢬ&TlB?y n ȁ .a1 :YQqtMwÐ AjZpmqv16-#xB F`S~~6jIYIC?Za9J E9ka`UUH}?@B)MG8R Y`,_D1_Ṃ *  &5#ďӀ#"*hF./_|'/kh }=wNWGH`DHa #-KII.M83DŽJD&1Xy = B]I)QdeUUWnnnwsK"feD4 H^.4!YTE"00('!ל{]&(F 5fDRe"$ʘuFt&% EHC爢\)Y䉏c^ӳ|^9Gnq1 $0Xj4U:6vf~p {;ҬP :3ڱՙ`=e6),Ϝvv#0yNoM?{ ;:iA߰;:6fk4]j=3*Zk~w}K`f~f#: *bcQKbc1Hܢ@woma5_}߮4[<˜!F"Z{,/WZxnHs-uz?NtCTwWEł#ӵH".OBgY⩦]"fH ??:Mł{v~>m׵1)*)K1a_V??HN،%OsϤJyݨm%8C> ?ܘLf€,;.Iqhɐ; umo Fw-KjR- 8 :&yUǵues}{?:_F!VY;>'dZK՛mJ_<)*?*Vs\X݃jrqÿzw<{ΔEuf9&9zo~wsskntOO"$` ޖEXw61jt X* B&ZQAfh6^@"EZrX2 #0Ę f(_f,a!`3!%;8,?7 Gb6LV0|XVȸ1P<9O,wXl*$DucA7A5Ǿ@dZV_m:i.ƐZH6PybQLr93!PT|vZ0#%)ODđSb41F1F΁!g+糓vOC=MXTv%Br{Ӽ}3bu^&ǰ { H:"b1DPp;"b.q$1fK=Ѩ&l% (87rUp͉^(@1Qcs+z-˳=&.r"H@+| D9_2\XTRq2RD z DI"(`*OK%oƪTy|`DYiPMd40 0"g#wmyBDo,e)!Ppa\*^ܚH1R"qIdB @Fft"3Z+n3|i6>VURhbZ),0 hC7Ƴs,O,ղy~luvܵuU4w cd¦K]?Zk,Kn0kN HJ&!dm:z7tRr;9,vFt`ӲHhhZ2҄3O4gjof< 4kWn2ExF;ׇ֮nh׵I>) 8á11e)SLJmtADLIʉJ@Qñʒ<;YG0 \0֍cd,њMO*ˢ*'U:2۷:ھD!|>ñUcdm}cztqžy]plw1hh4t\hSҔ]^,vݛͱ9:HsIR\ݎ¤`ۛov\ymtI3ux r '&P2ϸَ1FP0zwߩ#_>VBb0Ā3`H12O,rɐCH b@dD$Kq-[?V %rDDbskF`0RF)[sΘ@d@EȈ%ZQ ѹ&)e0ݬwcʹ8 !UV|M(9þ51)jd(c( ɧmJiYeBft=SJqCygRLC5>8Z9"IQh} nr1}C,4C0cpo81GD<,|ʪqhe#`2)W< x\MWZ?MgYv$ !:5H}H%Y8Q`_3z8g#քITD΅v21LDTYbIWCmۑ/E݇9ǁǮNgU9(ݷwuz'd*$鄍f _bťL7;3!dsz}hOWs(!x^dJ vwaЋ2lHL9q o_t}}ҳUll;=〠L =zV{o*5.:%bw?c <@lte$Iƾ8*ME4yxWwd!8U#'gLZp$uCMSb.Ndm=ZJ8%@Ȋ8ۮ?էM}&LB"xrG (Y'e)'(.Ύ~ w߶5w8;aiFŸZNB1Χݡ{}p|\̯"/'-N,KRl}R zHCrYnlrUvî(pmHv1cUet26֌-T귛??iʌp26ȶ댍 qR)-ӡ7=!˸N18 \kAjmyxqϋLwNi`ΌZ0!2%+hyB1D.@!Zm}X)1Xc><'CaRa%2FWÝI3 fNxn,+q9Oд}XgX1(*KLR:9l\. <KX]}_B1&:GǦ^D"@$t#(? 9D9"VϓWIk]$&cG!>2 R$`D "}YU &Ng@w6gvחϱmm#Hj+XXRkd V'N85i9N&% xOD-O_zAGPo5O˲*C7>LrZen;e'@ٴϞ?}J 1l뫫a"ӓr6|?w>b4w߆WϪt/>\ R@yD̪6li5LcN4Dĺ}smsco&'aH~:-J=EuͻtFiY q.ajtslÝC- fc g&'*CShr^NJ.cAY"놲\owÏ~tyyd>B@gXFgeXB4JX; ?x}7Uq]ONd6䕬&s*4\Z|Ʈ7ٳ%XUKoonM۽DL&SrMgR$e2ME}l8:#>ntI>:pU;G/?y:-'{ =xh{W0łOlۡyh..O\ML,bC7Yfٓj9W'gRb̓Tj;6>˒Ft$[{<E9E| @Ĺs?}ɵ _! &"gFDzLxԸ~h\DQ(& @q>NaXohIJ̭ՇcmĘ s=}]:Ls2@α!"F{wT%/*Vy=2C3X4ScH%FpjΥT!Fɇ YMX1 bLbBp31nF׷`EH!TC AVfӿr~Iͪn|zW&z<@Jv67wW[qrNnMFl(l4o_o,ɦ릹?gyq?}_ٹeC>RwW)/[zRRݟ2pY/~]ڪ(sP@賮ǭm ?v\,]~Y}2cxu:a~~}V,qf~ӳոe6} CW4O?Մsm+&h%&T߾z[շaܫ2X.t;Xj4MSl)]wiםߺzs32U~u89ťJƫ2R-O=^%zxNd*ԡn4ŮC*1A+@:O'6ubHƇqQ( sN;1LLns*.B4YsYwغ լ҉n^ ťZQ;|xLRf)ȧmFe$$Qy źa]qcJMrC 7>B? $#kB10V@p֙rC@O9H "bfV?^{FD8r0qz_wX2$\H(0Gn1] 30eI!PV,M5"礂4O31 Coyȴp5OS̲(ϊ4Ӻ=a{RH:c5i&$cuN)^!HS `v}yO(8ye$QH6(c$g3$$#C9A Ʀc[)IXT 5+c3?PL` \VRhd^ Cۯo}øqq\ߌj?~)~w[mril>۷c?b ]?)g5z~j q~}"0J9)E )Ns1&BgJLe-PR%6-UAbV_l&OO3>&N6U5++l./FJ}TXH !чyv']i7+]-A爉3Ǥdaxq͇+G+a^ )TB($GiDaqé;>zeWs ~B)B?"02!E8Vk؜Ų[Sڬ-pq!;.jVk>9rCӔrV&ڒg9R$ӻӷM&Tuelq4-*@S!&8p Y6R8R]ꪱ\{cU 8|9؂Ϛ<{$jl[XRxGW@Qz {Yw]N^!6⢆ECJgCQ1UNxъ|0yr<QfH&6T4 -O2zIò*j„wȊezjsZziRooZ ~v G* ֍DqcN91\97g${3>~!ga3P:Ԋ sU rS/6y= gvZ Iiz,^o(fZg-awAj%#aZ)&XՐ[ɏub[qb@h3iOC'J3CD_y&y@A '&xBb cL"BVg Wzj%?fGML/اe3{_1ƹ20Ɵe"ciUY bF8=) 4HH\IH %c1"rYcDAgyhƜ<K1dY)aYdS1`-bLCH Wr.!gf@|rqֲw]g c9Cr7.6Kh9`B@5q-0y)fIJ489i 8~jwmPPx.Sĥ0 ugjY9)o kLIʐ? 0YK(1) feW[S2$R"K,~q-xbJ@p_VnؚD'0a1gJőYa48 p#jiݰ{?0%+n y~YN8|nqn4ϙ7|{&)EQJ.ǹgK. 6q>(tnwWtRr'777Ghn阈2 B|o BF\6hH;!lY hx^^\Dnn"Dy5pH)c\MSʺvѿy}_ަ7bé=,WOTfk~,^V%KWͪ^1jm)90%O~|5fs)?g ۽g 5'.M1:94O\^á+Qֆ34Mn**1T %IΪTH3ʼ|e*|ۯnjھ ]R 3sLu{WJ5< NuwQr𳟬*ab*x11#2g8%۵w7}LJn0`Y`PyFłHh Xc.CYnA)8߼lFys|7X]sV)-%sȎ'!zZLQ(*rc нmwlUh  5.Wz ;م'+ûݛaŪ)2K8g9C?%%gL[+$O} z l`;(yA$3,+ŪF~ggEY n:Ʈ95lѨͲҺOB8r*kn-S[mK$xbsVavB@8* SƄRkS'@ Qd){?bV9gwهr %{j%`Zg𯮉am[#ĉ8J HYg ^o(`זxQqA~x Oι2y$`1BzZan4?#I ];6!)ƬZ:}ccs.BXDqMeQha>aaM E!c*K\-2Jrk"c Z9BVZXvnH1I)}:WTyRN^p"M}=qƔR1 p%xyf?πZp3/j'&azz+a֏oeJ4xO/"!%bHL.TԂEq;ΘXX?.0LuZeu#e9yBWRL3N$=|Ӈn:6K6cppټqU&ܲЇ4OaVj-P֏S>L<.G?/?_l<<RQUͯbA0wVjqjU*ͯgwН``PհZYVz,?,@B\]hs!]A[$!eӬϟMMJ/9$/^^vGgseQtǎ2e|˶$.qNjWzvBgzp< iuHsyH;;{j(/̻ѪC?J%P͇7jt7:=U,"Gz]mʸB86U=m,_@UCݰ/q`}/w5\\BAYl0Lj8e'ez7v0YF"yC: oOTv}qz|tWs _<5?;RbkSxFo7ڸWfˋ x};!B_yNeԎQɬ(Oins}/ʻڟ-?_;x8¢/J [Ϥ0oa"T5lϼǹB T9nJ-W9ڨxΟIm< k4,>OÛE*" ,o JP:mKO>>_6GnN|{.5+h`jc`  C8Aɹ):L98-mq0~8m*M|? S^H&}IHO4 VuM77870j8ʱ/JJ&Ltl,~Ϟ-_֦y0~ La2 qt9`UAz4mZq0"8S_>d$$YI^G1vŜa 皛RgA;bݪWղ"jݽE_xHJje+WJ)Hq ~0Տ>?y9|*SHGndtuujbC_nBSOqL.(X)99g4-,2 YVۭ'L2JrZ'Z4ЋR\<œ {!VJ+]ib^0~/j8??_@U*Ky?Rp?yO>0}S~?]Hq]E^SFܸT09&8OꊟNˋmi ,*ew9 hH!v0.|q )c*ҙU*TМ blkNCY1MO~V׶}KR~7Yí??}p1??׿4wҜ_!T!Bk'V(R`8䯿+}.j ֋ҩ(~ձ;e g|Sb2>SX^2+.#5a1%<ͪ"V S?yǃː$tBxs/^ûۇHLz{ï>[6Fݾ~sM!eI Xnia*Nq Jv94Ɯ1% bWW^(HsN\LD|RȈŀ!rSΉ4r<GVldJOĽ6:4K |J!pOJuOcB4ӱdI IDATYZDΧ6r`yYW %g cb9i+gK5 XO>81F(fbaWϚNsaF8cB3hb8,PdPAq'<Et&+],̦q7SؘrOeqS6yE=I(DeG@gϩdQi< CԶ(cQ*)Njyv^WSP.r%I)&H;b!x<o4ucKenlMJ8ߎT8uzY=Bei(2S7–8 giXRE,+8pK}6 *K]558R>IAPY9ҪIoo_!sM9g0&"z90oð[gm3ϹB߼ qX1"p ?C5Bj[yH^0Q=vcg롴yi ~uIgJ- ψ@4H!Ϸgz3 0l/~vuy}jUo\̙F21Rixl?wpCagzuivwحWm/bt(]Щ,v>4e]k`~ 9OR`<['D NU%WחalN;?ܿ{7s[4.lVeY q.z,rnǹmʲF<qD)hBaضosEQTʀEwIpvwGQqcB=(!$0Bm }p%.V4T6g6OuZi4NYi2Wu0Xf^WLJipb X֗KcZdLS}plvcʨ 1?+1@*08@Y2,8}36#b!DtaK]aY=C-"1RJs)bpAg (# 1dF1huտi{#-h$B_S&=ƘF!8">C;qDB`Ls9^yy2":Ɍ1!RRd %k㢙T1iZ1k&9ƤִfF1&D!c11g9L)2ƃޣ/kPE DyԱx@1y0 ĺ Bx!Y"RHs RbAq2c<ƾ?lX.d0ǀ] %̀b֛r4I> ^\7?Ӻ_|ۛ!f>w=aUrwӄhOeU4HAu`Vv:à$l-tB9N\&F=U6ZNCb &ICbE)U I2u4!̣s!gblLL9Z+V4wHZ»ZWEbQeUWU̞ 1N3`8df$Vf3-0բb:\ʹCrLsB?d򓫫Eܬ}!x|w7aY㳗2v 9+SInEo߼�JsB(i0_B$3. 5,2J*yG妺07o HԍP,k^pf&BCSZLESaєZ "|l1c4vkdkm5u֊G,e!s1M L|ÇLjMaUu]r]M#$xνVqjpz{eVJ0 &Ɓ1eՏLs~c$ɡhȇӞ MsяCv\n,?y124&jXlZJQ`0{@-e×yŘc hsܸ†)JΥTN'Dbd2`F Q Ӕ终dIpfzm߆ʲucL!f)8VUp3OU4ZyTZDĹVଫJKpRAK)q16?Լa:S\>"'@(Ybus6{W~`S$W8)P(gLyC1w$)v];ҖMS%'Rp}JH28g1B4 @)塛s9F }g籟!<8 C]5qyτ9嘦g@BK%88 @i2Lfq LQ$"J9L OC5[bɐE ̥J*]޽v\l޼mSSɺ6UJrͰ?MN8uZ_ƄqLb#!C4l6mj]f/=>>J)9~jJ4\=|8cF;wvV|vv̑28o6K?PkPc䜮X. x>tOq073gvwqod4]&[oJ{?>Xo1bȬJ uܬ%"Pfggua4H+FUrjnص_ܷ'X gPeJq0ČY,ԍ\2δٜǘi0Nqz-ɒ+M]}eDdDJ&UCf<̿0@,#]mmp `p?8/f{ٲNi> %'|( >,G@%ΩPI|L fZ .TTUU)!E71mpdRJ+a4ƲE0(LӪ4!eQ &r^)g*Jɘk.a!q@8h./cUv7yw{-zv~bp\!'=;mVMx8x ڷgm<\)Bˍ8 >d} AihZQ~<2K0 )e6ǁJF7yj*Y`HQ ^qAj45 =xܩ?*eo7g6W}~`ri~qWDma\~aaw'd\e.6(oYJG=alfS/Ө޼޿k픇i[ж'I-g~raZ-WbozNgWU}a8+U-ںt'= +L)X)0[f%v1a{*jɆ1R]zs[ϮoowA/bNcJϞ<ޤB..Ͼ<TGiƫ} *l:biQ\*̉G$q}N١nn?ZYNP]$E#Cz޹!RnPRcg SЍd1 !(X5[&/δPۻw?8wCV*UuCUi|y|z_tAJXE8tDd|,VMucLX $SJUeϪֆ?L0ͦ"%{m Y 8CpGC%TF+%c)fcYb&Z=>ZM3)Ĕ, z}* dWFMv!17]&d!@H4IitRu )gR ɱVUçS/QOHafȈaQF^ٗmAJĐ0T!2|2`\ On>%c Gb 'x3Ļ~˚% c*%<LJ6lLa*21"\Zv {,4mV<A))D>LTUPs7i'ƦmWUZk]u]WeSOarce#`PW1( cԌlntR M4ٕ1J?|Fq([Y:kn=1MHqun*Lq7؏},uvSfa˒o>u ިS:4 M q 9'_~U}re o?'JuU)f"@J)@*Bd!Ș@ 8&PaL~nRJ)3p!~EGO " A$%O)?)ݩ2Ȉի.>ˡ:r)U#A}f;Z/ߒ\ 2ߋHʺ2D1QH1 !>aUkB'٘rL0YќqNM&kT6ڔePŸuiуOc.Ţc) 9QdIdBH)`9WUQ)k.YҪP rf(8NI8viMZ*ٜ!c)KN@pŅ.pԊǃcRj)3!.sL/Rfaw; 1GY9gsXfcn;yKg;u ` 3RgϟwUNI))TP5ZDA 8G$)0@X(6k gʦW/+GsP?{Z^qtkw{O<_zAۑ8?CJ Z"}wOx MXiDZ嬝V.n6 \K|E\h"Oλ|YZTvy!H}"vLB>Ɛ(&b!\ʌ3Sr!CO;rSUQNts0J cm`!ONfK?CVMIaۇnF{LBB:i=!zTXeU*oZ>~>RUYϪf.ݶ:sU#J yQV6qω#DD B-֊(S$SsQ93LP}bdA3ipydHqw)yMU!?l1oO!XJKḗ/ 8L7()eʦ.ݱ}"$`:E+U5f.KaKqy^ۙbq?>;"r9" jRqZpU9RqpmXb5?[*Rr)N !dB.|9E7ݖIi >㱛TAk1DקS~<:m矩>/VF"[/_&@&dy8Lh}PE]giw\]OoP SL՚wq}UM+rFً!x/${/0L=>އͦ)/F^ uxwq ߝ lLqQ2N]z ySP1Q͖uuRC7 nk80+f^\q~?Mǘ}2f={Q9'!+1ɹjdөmDQƘ _؋y$YQAt] aw*CJnejVnl3SY1_a#9()aE3gG7ZFFUK&7rQ^pcGQ W V]u2ia8.զ֝ŋv~ vRr cLumcP/] ~w1#=k˺nv6DPP*VH-qӔȘUz*V= FT;gP(SC)x ~o3 w^ 6PT矒d22 9'\" 2ow~ ֆqH!(TRbO"HbSXq:Mq򧈠) ː|3_dC<2B/cQQءCu*@"`@?r:!'!R',Q)QUeMN몪JS.\V .3#L>]êe%5g JAQ*UQ  Ip@F1܍$<^+_WR4LK ^Zp1i`c?t1N蠪)QITB1D#Ci*m=C>3⫙F1 :BS@/ze 1!ھOcuStB FI)qty{9D2!V^<v:F%j̋OEjw]GF|$ 9~y&>|Jw.!]4$/ת!N1{)7OWJT> I`4gZxY#ː0,KM%>Vx@!ǐ| c y?n꒗lSU6SJdnm(`nC:u *YprJ^h=tBfBZ1mJU.fkEoo0hsc-,*8"O52m06QjX5 Vzö\Od9DRT`-p|QV3oQ2Elڟ1LLv?yA ظt/bΤRXLpGyb<!PO]?0Z(: )Dmlp>OrrSMvp$gϤvz  ti8yn?{9?er!r2wdzq<0Ktq"+4{b,La'jų778%2L}F{ћeЂsy4'YvM5K3̌_[3Bapbe^~A:\_ ѹ zǏovGeL gb>SGp# -:bKb/j3 }=X > OG{~!zqxٔг.pxc?W ]6L&$Yh,MYr E6vPuetێ.>ϑx8wy8ʭeLuq(W˟}bޝ;K a`&̔!gXb>o&e?t48'hbe&&HeU,bӢqLB%1 ŕR2ԲL-c#VR=iB)`!RLy2 ,*!{K!CeȥR*0Auj}\od, DČ!髌ș%Vs׎HH(gxa?]žY/ƕݧ]RU!$Pb, x> n! .bOM2\LI*i m f[ww .Oq(O1xRA0nO=R8`JSwc2HӘw4BHG4o*EO C#A]6eːZt{7 O6[ |%fY4cVS\X4 r~&t\Lo;>h@MQb 1Avx^U`ʦ.*u7 :(k>N68q \_@]f~V@o J 3SW1e΀h/3ÃQs+kX6LJgo˟/^/nkeh:}=py=[l6Bdvb=;XAj)\鴥i/ݝ./_=Ų׶jstFzuŧi!puQ\_>I"Xot;YIMR,3F/ S 80 clϧw]؜_*ϖzw I ~s˙Y/rYz1Fo?ob̋ wStS?}_~/n+Mٶ:Ҵ>~;3"-Jdݻ6gɅr.Tmz~k;tq?}J^JYq~PxiՋg/ׯy\@;g:H+XՍ9_wјB\]Յ5L#r!Wdݤ#1MZf&9+/ۖOx܏G;t)PUl1+a{`1UCJ]VI+?el`TyM|t)ei8rΉ2r@9nqJƺa`\]rQ UK1QȐkrﶣye*)껏c^kbi@|8=nݾ{(o?o/_*&1p>NvTDfֆ&wzD^d (gm6իj1+77vȕ˵^c } ϟ|BABr(Ƣ,6$x\Ϟ]pՅ|T\ВW!/p.Y-domw`}d!A@=irC ;?/u!Sw8^<ܟٜT+X6Z}b sQhyGg*~8gp5!EC/߾yM5vMw!뻛I|=sβ):4 ".,x(]wyJb_Jr]F*l{>~pM%_]"cau6AQ|by¾n>l?s6s},Hqr1Cnq"c"a{bY! # xUjce7Jv>u76*Oݤ,LzۼYZ=[DYI1Q u5|ỿ{p&h~_Z gNHe3)b !Q^i!_W4QMM˲(Č)J2 c?=)J\L))}JUXqt!d"i0ܘ<c!@1Rz:p|t>Fo07M@9?ye@d@ (<) x.X"RB$ K)@cvB<,E罖2/%Q΂"l c ss(Cq&EO}B<1CM2Dd])O]OU]jwq" EAH] E#Q*+SUFJ)V(gD%멪B (ҙ}8UUѻ0,6q TM!!#eHD)> >)4nMtv1fGGgm90L20f{Ca,Ti4xt)K ̌2###8iq%%yLqdCf>+8m4MDp:i-ʶ)~QMEJi:[UT"d:OQZ*(<9B'7 DA㩋ݖ=tɫj[.Kd|pueJi0y(nr%-ԫNƼ4ͳͺpaH7wQJ ¤g7gIt/D]g=W8eYUקM ewca4nmlۛ(XӾіF+TY^atw'#E5Tv څ yDu ^Ͷduޜ˦펹ku!!Ƞ=0EB`.scIz8U72b#e9NxۀR)v=?0/evcgD7>[amsrgqR w_W5d?ie'ht1Om1.Ǐ.G*HƄVWϞo93"2gߏoU!={ 1COZ@_/dr bَScd'՘Ʋfb >Kb;'ܪGMQy]՟^]\UA{'ۯ?aLl|(6*鴴-QeTI'BNs3b 5Mx%po{r{=_6~Q2q+Hb)/0Xd77u.(dl DU݅jڂb|a,3I)LSP%uuy=Ūl)[l۶0+ք IDAT:WI*x&Bv 1*KmwwzmU:z CNJic<2)_{#%( B)ٳWMvɦ9$d.TFN gLj#bSe+[ynpk&8#?9;dΈ 9#&FO( \ .٦f6e8| >F}TBgbnF嫾Ak]N)X @@J hÄ!Yu,A067}b0xŽ2B'tXGOHTX$DȔbHOxbGBxZz3RLxop[`4)dY2,g.KWc|}R0u-#鿝31L3Y&><~;JrCgR$wcۋֻ ,C?(:c@2g!,j콏~&_*Bw7.1]_λ6k8pQ}eźV~߿+Kಹz^5ea!j4<YȕUgjzS X֌ @L*caScWW ߾߿K\ge^pa2l;6Ե9&&!RNρwͦ)2ۅdt"̧%WۺejJ'T5p?xXBJuk*(D!*rDE)NĈN4eQPO4qG,qFp8- u"qM96KKFPwr)#Q6ς%7dvui"q*!"ǜ!2?吓gJ,2טLe*j s\RpFS$  NȠC$+,$D4@P_>129!1T!si`PIM7m}J?\I 7 cs|(\W*pКBaUF11W5MMj;%/49)+eͼ!0g D.0SNa[n&YZfcO& %xkV|WUP˲,!B\[ P%hAjEU,t"րJ bD};k"wPSbY1AB**~**h{լ˲V)JdWK~84Esv _5}N}M?}.i]ct(J6]p*9R/JL8 ;&*Tf-WuC~ T}ۛB)eWؼ+LJۿ~uw}F4ͻ\uUD/۴Yƛ<"kP:Oy8I;! QK y'`.ԏV \_.!O&l'I"ebPk lVL*n<m+2a{.^r|' 7"UYE8XT,|W}QQmX*Nwu)nxx;벹;7CB MU1gdbc$ Jg//Vцd=hZYtحu8eOct9u4LY>Q1 REz>=ۿEݐ܋zۥ cYbNY,Z-]rni}'VEd;nNߔ+^VDnY0W|hk삇Յվ om{a0.>Aɺ=owOVIOvr\wUIzS7ݳ׷h?PRq~_V?F}L֌tF>nן_lҿF~<+hjNПk[ƭ9Dc̛x<߲oe<iO0`3j"Z8|j|djw^;p#'uqY2lƙ`LhV[ѭ%Og*͋yA6mw5^O*0]p⪐v|dѧɺb9aMuz?Osv udߞ eEB2Jr}b'k! 6Ŕ<( mp pwdT|B"˱*ii7̸ QEt5I{h-`4(e$(2k,E`PP*F=>* !98G?MaɈ9d=d3%,=Fs## $`M`UzT,xY֙ DgE SBٸˋˢ(H#IAi1b OOfuw<k#gCee2eU"UYUUsvHEODC=(i.۶mME@ѻ2mS*%b 8)fl6uBBx?g 9R`Aް] HXZLDRr1CjR CRE |:N& :! fUuU{K{g#_4|`&q!XJR ΂a9ܝ^}w񋋮׏e8fW"w#Paw+޶*Yp? CHKXE g?<&rJ5bdh:<L<|pwۋ }8܋z1oU>کm1 !D}f p;@yu Hf%M_9?/ZW̩xx9`[M}Z&zY]o^$0i 7nW}oꕔ,+(K(kZ/O_^?;+bÙz_\v+θ&.Ehⓗx<-3q-JΪ1Û|xl'_]|Ubӻ7sl.ZxƔF8Nf?#y!%-LJGhlgdZc _ Va}l3uͬaKS`Dz-[sy}~Y }ݯ}_Q{W_($8?l< {B,~e,aamp8|ưb2/i IM˸{y3~wfJ~{uY7p/]6BIl]#6u? ۏgt^^xGVؙϓ99~ BssoBۏtX֛֧қzOϯ.ƣs`wh@Syً(wW|`봻f϶H@.YI.vB1ֶrh ELSrz uELvgvαdwRUn߿=opuٴSWCˡ>cف(7 }c˲ǿ~?qZ$oc ) YSv=0TscvaBU,jV&+>\]_5q'.47U?er:?clġ1:/..1>,7GSQ4l>lt3ٔ/^,ZbWJnnwϮ/09~x^M_qeW;1pn){ORieܝumeo)!9lk!ns]+!B1獵!Do-UzQİ7駟UYEJ#ϥ"oi9K<c 6yh B`Rv7M kNÔh^]˺FC)r0VZBx}^؅s\mZ 6 ZMe (cxχ}ZF' Y*㱘bQIƣ.|9bgdRuW"C^EZ7|?4:"hڌ!B埢<|z1F)SH !~G|j~zdB 1$ndr$Y)S@ 2"@ʄHLROpew'矧cL$gQ$sΙHŚL:)wAUsN1PJDˉ3,3y}뫪1xs&!" PjU00*T]\V 90<⭋1y`!'H9"v]Z8x!!24Kia)t{d 鲬0;i3@"CUKV];esG[ 0Ř '̤tV}/Xw U X& "*wˀQXWtr__#>D<})ofSn41yWZ)q(u^[P:0םZe4AU"e!ê(s(rڼ|E5&!pYȔ#5*e9qY6+삕gmWhއۻ/>?3"~t&~}~]7&,0FŶW7M.K|| O7Bh> )MOD΃JOO3O_}ai6-# 9KƜ]=,{gM[R^!hzyy՟k,~0ƞlX]_m~/]WM 49A}&bX,uL29ϙQ$[2xsq_̳~~}#P׺Bf!T*U? aHv@ @B LUbeʶFl`@lL4^ɪ\AJ>bN.uV3r`yumi&[gbDrz9?z< "uU&7;u, Uf%0D2^5rh߿m:p΅8q4j~\&,qzU .,e(KtB1OPgwDži!s"Ub̒g" Zy㚘j] !, EU9'=AVfp> 9Q%Sd93"χ_,8 RؘBR vƚ)D' ^N!&s DPi-2F<1EG?Ljbʌ9@hj.G1|b'dH$ k*՞MӴZq4&}9|z~\H-&Ip)Y?f9B<:ħ : pP Cx(C~b= nDc)M 'J3`D9]H!!QF#2ƥD 9 Lcv>0\ AFF3#"!PiwNҵmu+9"@)ggm^ ~v6Zcںl0 4O.[pδ1G4S r)D3de >9(S1I9 1`@$R`s@CYp=/VJJ|J%*Y7NsBJYͲ8 XUJoWhƏg_ěoo`\ .HL(YF uWQ,ST ϟ=K`yJCxswD6]$@ @B2+jsav{ Dݻo~3Ikg{L>ѫ37RNMdhuv.C!4!]z{ꐦftcIju#6[ s`Aʖ#kw{_nO6+ͣ$8Za1 uUx3+YDUW*ZV4d-1빀,Ôo׿!LPt[8d/4!w=unR uydJ9 3p0ivѢ!4aqCw4[/ZUeμsA. ^$D θ.K!dq9wƉ\w?ySպמ%BL>'u]ЂOa&cS #c "!apm ~dN4PK\M ªHwq*{"#O~P"&…2}x H$WYǻt  38a <|tu~O2ᒺnc ~4J?-##@0EQ! )Ap^ǀ0&E'@@dSGp Cɸdx1B *eN*'zv..1u؛cYpTȫ|x8E&]$޾h"%%#QANJxܷi8gNc1ƸX_rǂrL.,uMׯ%"̘,O~vMx12,l4M31q"aU䐃 '3{|wSFYJ(u*^r)S)iydX*( )yQ QA0dLit}/VRښ$)Q)C&d3ݙt9֕v fg}UDyg bf?Aik< ȁ)Pd>gsrkM>7 ]p7oSx:SM Nc\"bz "u#EAdVtH12 JYw']ax( ̑`/ΊUSOK1f1 3yYׯּA90:f<< ;|kװ,0|wg|˞ź|ΐ Uwy{ʛo?۽۞ץ2攬1E&^,$۷)Yeȅ[ou!RUwA2O㇣yr;xw7;)(R5d>LEea\^X]\JXd DsSb=BIJ`}Sc?xŘ.!PUc]YV1*LEmr5.p.Z{<~ +J(!i}blʽMĒtN J)MNkmlmF?JsL~LubAB"0ؓd9 8mSe%D{{]E (IiL(+Ynh\W7g^OM>l]℟'? }k xW|qz:z?i5E%#0zY{]`<  %Y\Vչs {oDH,$?U`ع<ϥRoq%}H92/u!*UZ7кb1FBbi%Z>ĔZNy%f\I ">3(u`4Y'?(dJ""xe42D (γLCHyB@H@D2>MmaׯOkǛ'Jua-NRb*lnP!ƶâfKfv>ϥ"#ԧ.~z[˙Pȸu8V~=tCD\p{Ǒ-Q*.tnZNj7z 2i' QP|j̊ON@HbFO?{݈Dvn6PQWх#pz>_uUGέQ˭<0ч)PBQfZﮮnnw-- mBHɄ'!*!,\",Vt>j 泄0˼̐a$Ag"˫Mw3r.vHenqEA1 Hwř=p yIvˌ3?BB8_|>_ˀ2+φ]/*rUo <ߟ/ϟ=y?u۷Z-sSh_8Wi*Z' s+^/9ǂa,V0^rDsxr.>LVͷߥ,/'|QpV?t]=qCgaUyc^'Ko?F":Ί)Dgj}8 ]LI'}w;U5xg5-oۮKPQ ] h.)1R;BT 8\ =;@yQ\R )m7a䨤MS204H.|QbQ(HFd 96GJ v X2R#b $L$ uE)B3.mwލ"#%PK%|{9]eb17FIH92W )"y$óLN(&`NTM!\ɟ[;f,g݇؇sFrHB !GD B> :>bD"CBHqem[{ H?5 w'˿qeb%C(q$Ӓ8:HD(D˜&b )D|#d^Ɂ#ӱbyDTs9Q.v|Q"æ1VɅȼ#碳Y8dH}LcD*,CiwRmt1[,Tz"16̔5MJ<_-0.h'_l>ϢaY&$XOSt:vޘX/f+ ?}wr8ڏWwU袏<+b>]+t{k r=_܍9]j-338Ol֦)8 S0\b9~>z`x5WB -#TͤDM׆*>{UQ*喬 $GuS۴}@iw,Y̍Xd=hvūg뇏7þB0C53a?kX,F;2ennwwi[7Db9\j)1̹h|ȟ;RzO~|ֶf 9.˥7=ܘrEݵw![gU>1b}N Pm$*v>jV'OKۣ q* :Y΅(Rh#*]^6L5bJ~q+VkȲh6C?'uU?Ln-yQedmT&3?WE:72c߅ ɲjuRψdqV>&;yd }LaMhgPV')6\]G.bUSw^e͗o'Ru(ɆTp}lsvN2˫㫧/JLԆ>m9кcn͢lnLFsnC "` CzB34aV D<)NWm7z˓.PaTO.N|~c[%Џ3 ӊwB >%- h0RDL)~c yrREIR 0c'HĄ䠪jVZod7啵.E6W]&4]pzaFB-b)#3Y,ȸ !/4M0Nk81iar9|H1%"08E/KGϕ'8RH3_-jX*H@0 dn`^Ϳȳ}Bd("CY8 Y+2c㞜uEqHBy9s?[T'g|a>##ZfPa䔦±ʻ ](Na(bHZnf0;+Mu8_*]lwߦ+'2gVbC\Y5AD~vl6ŗɛF:/ׯ_0Lww7JNBՇ$u]ef=O=2 _.Uއoov#BQb86 ͐ %ij'ڏݍ RJڄ !`?v MVBjQVE,41ƀGǒSJsncއZRdq3^JBysqaQpDi~Z>]Tvꃅ$qN/O}W}B!d1ə3%?{u}yeTayo^_}%E s^3oO8;=kjI+؞8V&;ݶ=]qΩqOCcGLOӑg'(2@2"/"G%\ 5^m7{GT]\DI)\*%}ئ77~^䦔=h%ca !nuz91i >1Α^?ZJ;v{sO݄H&%?i4/fhڑqstɕxu'ټr霝K$,f,>zks#`G}Ւ.T2[˜4abLdZg2;O~򶋥ɴμv0)%1 ?[raĸFtrYiW(RӧaYu拋^:Y>^Fc2@*TB p>7Ǯ=~mBD˾BRu>dE:17yQVĸ3&6#b\A$M"vN)ZxnDG%m3 B˪.96ۗxj,+,Ug~;p׵` BĀ&d:FC.1B\"W;R4NqWeūR]ٷȹ## L&S|lOa聓`)&SLRB)9O($˫qN.LTX`4NnP^|u82tNiT6vr~44@X1K<{w5CspH#Wl:up܇L$3aXDUJ#Ŏ($>J3`)In;ʼn( xy`vPU,||c}/ UTئ~>ڐ ]3`})1ux$F:XZ\1 !$Y09j%R0aϒq(̞/NWH݇óg69,27Ƕ,ibxR(sdVBJ1c{`DO ɓq c9k ΥD r4h#dy) Vqn:bJ '*cRS@\)N~fK]Tؤzd2R:nt)eVEh 1 8&D(JO֍m`a± (fTbPХ#!)%)FtQqM(i}#"1-omX1EtCdn:{0 !pdYNgS;UztvzjuZ)Z;E"H^y];ti>}:y__5J Ue] nq"Cs$k|46#i02gfBm??{'l0i]fN1icbc`aƁ7tRh"L2bhz^&PraK~Rh!V''cY35 %Kُں0_LeU^T! P+*'u^ ]z=%,L&Jc!X_/r~3 & !cQ$0R B<}wGknmUPW8ͻۻkZ-ə4Ŷ6y>.1~iK~nr&>xk֯?/g˛o/ouecbh]tq/KjF %2ϋ2o;.]0od~o ᅤvLTq΍&+h.Q 9?à8/vӐ|޻ R6mKH'gUUl9;8߽#Ry$\]קּgj,vqꂏ]Im˒#ڟӳ‡$s*eej;wy\~Q4GhZ4 GY)Y4;ءu&[VO_.w;Ͽzx:Vկ: aם>Efn 96ATsm040#"òyd;?ܖTؓ\lr~t,/5WSQ23y06Ɠ0ps?61sj}F\TمT}04t~?0PJr~Zv{uYKР3vޒ% \AU#Xn9!A8IjIɧ)"Es#yH"onh6Ǻ2R@ R"Jmk-C;cAnL1$Ȟ=яپ, ?}ǜ/ X"1DH58Cx}hɊ\ f;MR2<G( R6xD]3 Stq&ɉK09BY190 \1ef)9QC qtIB3@1ՓbfΆݱuy0(5V} EJ'Ї{xHd8AJڢ@i|qq-8xxǭtH঄VtƎ݆~^<{,暆NNbel=R>)^x}f23ha{8Rv$R>yt=>!xp.iQAȸ,(8,׳Use~BA 'WLq]]G(+2r'gΣѐ|D}svy O_̓LBJGd4J>v˧ΗJ?W&o6͞ љSȋR JZzق%` TΞUY6;eC7zczM.?u=7髯q!DOE۞VU^BOHS7WX~_6?YӿbrJUR޹iBͽ̍S]UJy3pp˓.*vҕ,(9Q!$HΧAעZ }K6x}{ޑ"a f\-f)y\֫"˵HT8ޢՓYnqLj̲(Ҝ15g*B:}sh)Lq]4SwOD=vӵ>=>׿;8 ~s:{R )@"dt6 p29Gdq1`=݇Hϐ8AVlɊB@qL6HHGE U)gD{J\"O H"t.M6IKt캩"xL"\"($m~BZK~v~D "@HH DS"E; DRbB .@09.HsB#!Ek)dѹ.n RRƐ#˿.[(TRH(yM$ϫէ''+\><bVTf#$*;9)al\HQ I)d1N]P/9NJ,2g"0)(B#0̔p`]?ଊy.΋c@bc4L\:e!ڱil*rƅ.~'dPV&%?YKDQcd3TFa"4GC$&t=rø7,݃;VQ5NwHY#HOT/< ~¬M T͚vCt3L<'zuZ1Y6vpnT-D׋dooOvPXU0.!t>Ĥ3!ꌖKH qoO94g99UYɔىɊfK}ٯ˴+J**e4B㸽߾u6;屬'j6}{s!!&bw7~$aG1`:'8 xm-+\O8"|,2ip8. }pIتy1;]~3NVTGKP)\7Ň6 lYV Gߔ˹0(C,˺oЏnr>x1x 9}@&fkPWFf'? B<'gO,f?k~~|q.*;Ļ=yUUl84ӓSz!ɹ8 &&^~Zkr9Bmv6̺GS v;u]R>lD4 8) ;-_(fmH2hEf?]ٹZ{{QzZT-tZ0TX5Ǿbe%.6it땦DTi04qGU Όŕ1qsX + @E"4DLJ*"q YBĈD =B.!b0gܯ/:5!cs4N0&֋0 $ Xk$G$Dwf(?Ƀ2@ gh@D2$ihc1)ZZ.1 c).bi` ̟Ӱ#=V@*AQ1˪w@Hĉ($#<눉KkOsom+7vvG|6ޅ9`eLlSr@S,Ss;qm?  p\gif^RdOG1}cIh,!`*Ozxn~-T!yJSYj pD}ptڷM4XZ%MWg^o}|8w;-'a:޶_oUnX2a ]g:x3B](F ,lY<øȗB]J5\z < YKpTB!c'cz3z.d\ D (XL􎝚IH >~8BP)[yf.li4d`0cXTWD!p"s@jswLrH ȸT}8!j)BP:fB &5/-#&n\,FR368g#"EHmp3SCjɅ0?76"h:" ;% T:qy`#T{r)*zaBFD$JG BD HyDN"(0&{އ" @ A 1>_T)  gAg??taa& )$$@p"j@%)8觥TzzЀ*b3ͿQx E","d)  cJ&RZ$PFLwc fŢǶG92r9BEG11 }Oc6 _m$C.lYIHQVP4"5Oleϓ11vqS$ Zfvvƶ2" 웳FX'YARW1 Y0O?yYd>80t tE<0d14gT008!p!T^d!vm73e$IZ8RJ9s^5 J2,L=1apơbJDY)0$20Hɚ @)Q%\% v>샎Т*ur\Z@^D2H TΣGGS F BO f*xQ qFG ċcOΆȀETĈ8mVd(@׶y' 5}tiZŠ!H"LRť>"`"DlE4uCϘ4^<YCYIJLTfX'tV.R$8oLڹa4AspsgżrV|w6 %S)&7#J/ps%}?t#,ܩD*OR;dB3O(-ႱdXTsԣMB| ɵM !!1sј@W<)=WTTa~6zY9n3_nDb|Rw0JٜjAIʥXYwGdqBf Tcn;6̗^/oޘFG:X*b<0 HiN'J˒ V$yHQQ,A0&/B fD?9E"Tޛ@"IzrsA!IeiާW|G5b~6 #+ "` >>>+/L=,adeU7*Ru@;& Wն栃7u-O?|yy< օY\t߼枳3E\WC:rn"?@QHJ3X.źEp ={3\]޻qmͳ*CZ:@4gX((5d)x4` = b΄}Q!!=.,M(z̥fYdi$0Q"!0>N#!R r?4qA>LhBHEln8K!ro"*ͥ%ORLEZ; Ƈ84͠֋jH) (SM .`Sy|S9#z rT%< Ȑ2B G?~#@H "1O1& a Ʌ`0sIya=MF"ڇ2h@/_/9~7D ֒HmTjU0CL4!gH}z ˜jShw>ȴv7Ϟ_n/v,i.B(U"/iY)bYiNEyq} }g*Mi::#!08mۑG`uH0 4XVa;^*8σS`<ݽ;좷"B2hXɢ[-/g{_՚ptن88Ft>5дm/`D 09sό泟 "ϲښZu17%ȥ>((!|G/s //`l4nW?| r7 3f(KO?~bķLpgE^gx{)ϰtOuT+_lo.>%,N´JFORjC?|ц|w_kHvZ?ѧ="J^]1w͇o8֋͍J3'xQ3+R87V Hw $RdcOݩ(%5W,/zύo؏}wƓsc7=~e,.F9kW20ZHVD"\YO^IuQk7bV R7lhi6&1J0?_'CZ%5n^^paj~{|{{BA,J((g<˿4GUC;6^Ow?e~_~FeROH=t1RMZjŝQI4}O7 ::8MB݇:U Mp8B,x: }wSU,xn|U"8 E!4Y1ĬYB߃3_e,38!c|b4K8WXlm :uWv1)Ӊ`,۶i]VK?TBijCĹce2Ƽj L? y LfwO]$2:uZ?@*X,`fZ/tHUX76\oAPo E ~Sf@Sѓ2DO2.JH#b`9HfEh">v! y2؍R,P InW!D&g1]ɚSD|1!S]~a;FQjFtJL.fHM焂YΧ qشT-VirZ 2SIz]'}4cM-Z. &W%Wjv)ZCCE%giibq3Y|qr[-e?NI154:-R]f\ }xs&fc.ν>7VrsLM±=vM # :{mLlWصx`*v6qmN7|dܘ2qVWfMco7eŢh> CD&:HH%eGYajs v~?tzBu2ѯVEe0,tM i,f3N\f*cusoanwMCۋy<\Vf`Kbe>6;m4\mA!yvaB֓y`eIzq"7$8o9Wy59 gV0tܹ`bʦ٥| fIUowoa|%ߛ|˛^mt<)ek"o>>zŢogy^}gѽ{< /_E.08wo߽izي^׷{mCBE&t] j+:3<(W1}W-oB?ٯyDqy?/`Q>~pP/c.2O&Ni"ʹYLw`[MgO\Wf#eSx.$=[:M=A]NmظE~ûnr@\ AD$*k6m iיMvˍ޾R*~ȲѶ"> y;L] lW$:39n8ܗ(8@@N.b e s-aPOVcxt yJt^N뱨ed޲y>2t֝N@$XrT UUm^lG,`25 mu(rdqgpaq.o}舃,cqե9cGav.ydÜȜqu0Ĉ^s@M4X/,m2mGq1z=`xxd?s(b)1#Cb1D `"DD@FĞOaW4OBd9 "\ɧ*##HO()Fc!xgaH"qadB ijw"W,d6$FJC@"2PJEDR9W\WRH$ЌcR 3)3`NhSZGLp(J  ѥ$34 YQZ 0 sW`y8\DȸOD!O/dԦq>$Bd:5=繸zymqEgK39H~ Eņ{BdZZNPKS\f!4,ޱnwm,MsBai2,$RֵR2x9Ȅh}UxfUhvb G~NmkƏ} *;G$JPu2oW|{器WV+]8χconbBk]$s'׫Т֕>zFD\ț٬/*-xp?{/Kv8Ä^o1=C@x;8yd2l8X34҄CβH^`퇷勗eP֧"L!E'l8ZP˲N]B!G3l"Ybq\0rQ>c)6>~7}-oٳ|2m{d}LQ9iŸȹ% fc['qεRS@B?0sr{cE #!#|πB>8_a2FGy c*d` 13&9Cħt-0D5@yVP2i y9cC!44(j$S \jɥh謈Gq|ڵABghDAXBU54U5g '98 y&N1±rB$Cr"C!l:0}$Q2KZy>ay,(;g{LJ:Ox QO`yşʬȇ$FhќW|2Mӹ;\mEʉ[b5VeͰ'"@θpݵSA߅1Bs$ RmF3r?cPpuS?شdr#LHLN! 8O_ț*)xj,Y;6B/T)8ڶD` 6txf =sP%sc,3[; ! 9dh'g*5p : sSV u1zxDWW2v"̓굮'HxZl xfy C;XN!OW7N'1f(sǻrɀBi hFg"K&$ BqYUYy^@%0x}xYʪeIv(df?oʫXy{iCZg93Pô*fS΋4*t82.(glb3}W?P/_f?eix3~yUmVrQO;?mYdu6=Y^f,EVvtER5ya^e8p<)82FCR,9cJ Q)0cg5xq^$l;Cqq>#uF.P՚qn2k6I*U0CKD0зMHO8߾ή֙EלYQ \hi c?Uuې>MӺ:cR2e9L ']kfl\.v!04&HS 2%K)R Y*Dyc<C-D.IJʦq"9G(xZg8EZjS(TwG "D!8tu^Cg&.gE) DTqtM >BҌ/$MN<ưt0MSiXK80eC2#y>R@ $Kq{D/JK߽Uqu0N3,hcRޱ]~>]^"Wj8 Dfo}n{ZL|2GW߿ !yq:,ijlZ8?|~b]7\=* KV/SȦi'3; NP%PDZt21IVӁ*G"-iZw(Pm˕u#spO@x>0&ٻ&{)4it>^]?/_iwHըTz!C8?,eIB\_-"\!DZiް>x~Z$|>l8O}}#߽c7lK]߄Mϲg7ilnu4F @ܬ_Řeanc}>u8;gr<F/^,Wz7ϗI[m;:Qj./WϞm_+Ʀ(DBcƹݏ +ko#Izj[ǖ*Mi-3FHNg:$`0=$d+r7o{uH6Ms/w7w8`?! qTpfZm C( :C5\r6 BI؍A ֺ^u7oLm6L|'0B=z8k!|on6o>#)Aǩ K;5蔦[m\a09OIreK:4AP!$~Tu0أP@ x C*qgN6 [LQ4w. eOyZ;yHD,Ҽpw7"glRVouQ !v0(!z2v{5m7Pq,T By^~%Y>#HYp~mÈP,IU͝Vch0l"'NIlI!GG{ ?ު>!3P='=p.@GW=HBZ+!Q ;s#qJG.X yq}c4qf)%@# {B0dںom{&6Fk``$$)Eޱs 3(gr`>7w2p!"c^iTQB¬(0Lv K,zbQppsªr4^2Bm3Gy]{h8\N@zlc|: ϲ[kgnlD8&nRBHfGdMPF@d=;OaH a?`pa!@u"Pʀ `BAmY"gG %)BI=!{dm'z4KD2A~8vʞ osI8buL(8  8$qi"JopBc v}1;0Q8v@xۮ(gT;=qMY/I$DPH7FD(nuts;c'X1r-b¨~lk<|剔1Ĺ\x_]o/s5Сѳ/<\0fK:B4G(hr߿^E1qR\.gxl@ /2aT,TDpNǰ>w' iǹ&}R`1+ ҏPPzB}rBɚ.*0(UBV,8[<]$]mgÕ}ݻ9\~NН{Bto jR@+/^ȣٛo?^oL$+3njL`>cu=<١滝87.2Ir"~p8zZ$@ bJix=+Q̣jVQKALFdiyS Q0(kԅdճA,ixz:[& W/] jeI/`ƤݘAVXM? dK{G礄( `&Q\3yp?9yվ{"9??٩~d 㚳J_ngׇd*R,@xu?}p_o[~{*2qPmׇHlqv򋣣뫪$ځu[.ggd/WzXwv߾߾}XS&ﴚ4q 4Aof3gw7s6Ȑώ(c۽EHSлIo*3AH9t%<>|RI.E_x84*l1a8ztې[fp⳩Wdq@!N!MrXj{8 "8 VC38qpkeN $(:d~/y/OO64PD);MSQd۶ZuCft1./Hc_|qw[wI2ޏ:kH Q<h!Bw-Qs@Mcߍ [f"!"M d^yh5ɼzt N0~2:w0L c !PJB):," acYZv{;ϔcA [G'DGQ>{Ix \/O|PأBD%fB<P0"8l" ämH8gD]La:׷Y QI`D@Kz@R*t6- $KB2+Gغ:T)x2uDR8zmfdlp0U|vm74++99pX ԣ{j$aX`(=tSoJx Ct!ḍ0^,~WnC"s #R>u]4e~RAZz@hx,IatXeq]1ˊ00uF2,Gi'`>aa@@G>NPPzml@-rr" jA zKNbojt> hvn6|S q|4B 1LH༮vzQՠLqǩ:py~uttve#Pu-ҤHh]_|ͯ@Yi a8U?YoiZk. Ǡ~}LNYw~Mdz_:3gyonv\ٱ1mx4v9[2bit77.\?£Sr?6IZ[]kω8 %K8B"Y,S=A);aзn0p zF(0bDzeA$߽/ u`k*'a猂 {ʼn6](itC7 !nN}YѦ BF:z θsȩ092{c jt](Y(Ʊ\XkV*D -h6O77W.]Qo~a(Y,1/c~Y?GbT B&'Ȁ&iPQ׵@hmlQ )oΑ=N fKbB9\fynصiZtd@2lu.ٌ͝gdIEDXRN&A6yXD AIMӁO'O';$xz $= >&=O^LO[$|2.(DnjFG  2n9XE$I 08La7L84 BQ*0 r@2uZpjZKpԮ{& ( & ?0 8M9 mFӡuA@`4֚$q.(Ls~ u c\@ìyd4b$\{f#@6+gI#CըCVJaDitͤFq1OsˈcyVs[A yLb-ln)n)cL}@0ʃEF`à?x+U׆8M.ONkf"DiRkmYz9gg/(F段Ѩ̤3:,,4 pwK-gs "Pfv CUkvϞ=??;b8amvdg?Y0q;@^4KCɲXGƓCuv$8j --0Rΐ8CG"hZӎ캸# IDATiwI$ Z5f3\YjD89MWN{^)i!M@̲(NIBxrU!jiFf@н}5Jv]Gsts"ծ,G& L]Wmu"^xn>&r֧Y`Ҷk+g'nMS}f/./'3-\"i{m6c Ů?lojlA=8Q9& cA1F>IKFcwф?;ˣl=J7;03)=@q \&./媴^oa v.sFk[FD4zz;?lhZqvwy׿ޅy2=9Σ f̎VGJngZz( pGT&$0P7@(d9a:TcDB@(i0dwwj}$ վۉ%Lp' OlB C s cΙs OyEaS|#x2yjED@J~JP '8OO8<9CQ)S$DJI{fr@!y@JRG4wQaYC|$v 0¥$)8g@%8qqaA< 48x4`P 9C6wyB;qV$d"v64<4c=`XOv[-4 黦3ƂhyɎ, ;/AU; @Ϋq,pwLI'd4FOæQ~Fh pUQDON"vmGKtJR:EB0A'#I@{Ju40$qqpwNR\d/X7 BXd.ӲLr'8q*Gq;wޠ!)X_oUu>/IYаáȊ~r|l OSjWLpp&FMo&ܫ/gk,!C"G:&gaO(S_`V<4_$I2mVd4˹i{smwC576i/_{>m8eo|^TM7VOYoe!N~hGՍ`-pqBӌ! CmH / De3]Wp~4uC~%Eq8+|Q CGR{0 $Zt{|8}~?}{zy8GC&nۯ?o>|oy8m vYBd9^yĽW,<},ssy&,P{$lM31D Uӏ#)ל~MSck^^l2j`>pzA5JhW_ Q`'Nxfpt:vɏ5ۛp Z aA9Nez71Or\Ge{ޅ{~YFYv^Xn>X$iCH9e,nj \YEsP#΅%`sʂS ޺R(PY$q`YQ9(!< Q@3}4G7>6c%8@dA1F,PAѣHI)c ,Bʨ6Vs)`Ravl64 & f9zP 4+ ]]VH&Z% P@]?YLG1M3`68#ȥ9J?YEO{1@) O#nVD0)`8+!F4NfMcu!4 /q .,:^MCM(Ͳ8fV?i0<#:,͆cKK>hu{_iΙ""UiQjޞ$ۇiYY5MW&(h1Z=tSo\,/nn7j<9ɼdhj/~qsh/_eG ڸZCM\ǯ9Sgl~ \qUsw}0 d4-" qfX"`#>[X gѤMwsg9RÛ_4 C@8 .|6qϟ>ݶ!) ETSב4<_ko>?"JCA)~rLƴ,pF2*>(sM2m老9BՋ8ѳ۫J<ٳŋe(m7fgy9{>`]? >8͊$r$\=̠Z|E@YYem6q [FYtjh9q(k& N)2JYx9׏4mg $J5?y}kX˗e~f(WNÛ^=7"!y&$I:e:Rp2MŋGBi圍[֗,YS`4zY&xuvis|j5< qV{'<Q&O|$c9@ @<1O<y+ISс(ǁaX4B~'c AJ'c,{F[=<)bX@@= ^ <ո=#qB)`LKI;?Nrc04 F0` 7B0Nio^,LdrRGi10N㡹 u9=sFX?6F I8 H&CSDͨ(S8ղ( =8I-1av@eaDIJEXyYD{\эGdI1m0#h}1r"/kHEw] RJVW5X~աM\/$Y:Ɛ8IB[Ai/w8\|{;ʛaqES{<FRYΦnDCU}ߠ˝h큐(b\<egdގ})rP;zut19t:ZM""n'VwȳxXEe asf~z"q ~K.m9>6c3 R1aߋ$a Q E '|phAH1}Rq@GȨ.yO@:hBpXvmTo ݮWA̼Fc[7/.J Wξ(NCuzA_}ڃp'+>_F83fEݸۣu2['cvr?~ tcBn6NHBуV98+'a߅a< VM㨆,M\$n- Gc0ilIlL,Kׄ$XVr8w{~E`026/]H!AZu`ӓ$ nsۛ~a7~bEA^XϗeVkjTCR@) /9HA( zBJ4F!J)N2)Oz)D#YG8=Ez=b=0 Br'XP}Rb$ KӒ>~'69Dab AXBaX%(eq&mK,I7x>IyrAW@(!rNe(Vqއf;RfV*̓I[5Mb h<38< IRRY,#iݖ$<Tܤ!P"j&uaHE}kcT(eR:g~>Gg]^ݡ.4pB9*8Q805><_)!W:0m$LP0@j@1 l88ze1 8#pnZvKxb=~Ō%կjcj5K|(=ұm]´`@KA# iWw"0z ڍPA >;/f\k$%b|STN!׿m"$CN#!yu]]]]w1-c~,,+=Ԯ.^QJyvM(}{ޞϟG|fb}Vt}ՙkQⰯn>:kv/u7'@9[䑓5-%o̖ܓ ^(ѫWYZ BNvӓE~ ifyҵ8_w . vxuԫczxP&0EJap`;?D|5aQBHu붶u\sl29|LȄgRȋdI/,$em: ͠\&9u)eRs_]UR&6^fD,.hp6Peׯww{Jh"7zw.tO%=m/^ж=mw}Ei1J|؝M{fmV~Ƈз,/ 9-*;#DHD杏NxN70Dx߱ݦkk;8}uऔ|U-O~Z=[)s JHf]>a@H|:juU|^o!8X,,IQ| ۃ "aݡ,CSdb9g8+b!ywIѿ,GJ)\%Z_ݛWIu`R]rjL|"}oCe =Q1q@%$Fr>DTTIS!HvھEJ#ǯ7pbNG̢|U-x>?)k fl>83J=vxm;}؛4!0͔*FBzbSFDz{upB)s&84Cߴw+cb^j:ϒTPVMC8  Fu_Rr)1c;u0 X}w?O0Idm30 N+p(`!(k3E2:v2&rR"1DzB0”yÚVgc!:AOʝ"8 BA~>^]^YB}&I"FU唥"*N<v|>f IDATjjh.(EyI((6-!K@0-tMzFE`=}'}_ΩǮs0u1FB(wGFw7bF2X! @UPD8qt??}-ߢQg׷>}O~G a3"@ f1# Fh( A8"y(2l<*@[ CpXڪNOyYRV;  q}4]:MG}(skC\eT;jO" YüIw]K- bhxR# " IB A֨v8u] 4ā< GNZk48"sUţ7VsWT t:r3`5XY( aD Jά>rFǒʤ[tJv6M׃rD~Їv€}9F|1A}pL#mћwݐ3fFJ%f%4n6o><|m,UkH~mskqst Ǥ Y:|,tTqݎnq8 c_|fpx" 72'fnNlht[`\r-+b^xJLgQt(MHYJ|:ic# ` $*e/~w:6ѩtGD.7upQaKmNܓYFw[M.Iٽ׎ho:)˟|]=<iQj!,a~'K8&hmGSé&E 8 ͣQuP*@\^!&6C]*a^^JkFFriEiX,/͠$śo̳$9Ih|!٤e1"eTTOhp<'r.iGU` tYU "r1Kg D wPg]7"LRj=*BqUI5VIZDH2E|1Řhͩq,MilSvѧWg.ɃsTurԮ7m#˱ip9r#Jk` \@0:;xuba_|g6Λ|Ӈ}9QQDQ|J%9u9:D[}^5yq4Mz0C.4hk0i("YgGYbF{pY3Ri)\M8k39紵LdZI.άѣ鬠f gbi<*zQDHS8<Yf % 664 낱\Xߩ%cRB}t}7!ЏG^woFal%aF}; [*)~"w#;>]9!"FD0J\DރA!eTHZR$q<)z!Ӯז >պS)R'\2*66*8~}ph&֨^SBaRh w`QtLr.:]\LAGfexQUpf1xbY,E5`kY A%B(e*6M{􂕋4F߼؍'P6X2TȠU|ozgޚqKQH+},6ʔgOrYHQVw(+O6Mf$Hp#%z ]ۦ _ˬ}ly9^< ߿X3J" Ӟ$oU'A2]t, D%lvV+Np0h\]k|Əx Z^/WV*h!D$16 IJ'oj6K&`!&^ױZQﺣ Eӟϲ]=vܾV,3chi)\ 1X$YUs>nL;7n!:Ƙw:4<WPovLK}\??4{Å2;s~?tG80)e{~dz/Ah#[4uhk":Ph& |5r% >>X}lv%)oTARq4 1z^&1.?T.&#T`+|ynp޽{1Bx^1r>RZ2"ϫ|>[&-o?$n6E!"0O\>RgXLJ%wGշP@ƾpp: z90\?cijFh2uݰC3C9#N#xM7X.|?ZkĨĈ#I2ϳ<;fmAYш*H @FcdzGn7ϲLB4(MR9GƘXYL/UyGTMdymvPAuMmÀcQ]OUU>l&Jݭ7>Q_UkD8`,PVDp24$8ktLW6K㧟.?:]3714ez0>1]-V11ж-bd+QP Q>.d 1 J@9PB2{t!P7wRp:y&3&y!DF{qzۜ6@MWiO.&ެok M "(*iBl5S/aFl Pv )yJ9ƨD9EIG,:(+H! :Xhuob3 2FB,5. Q,8q) EdO/Slgb℀A(IMߪ~p4Fd~Џ:8 -\(Ifa6z4Y]唓黮m[Xep:o a(M ޞOmۆ]adLqxg^=~=`H"l‹t>վglwTjB}jSzNԺa8A=S,LNJ[{%HGo^=h> \tp81lY2sJwMYpthfXdD&P>6grHc@HDBLC$m}D<==ZQ^ezPU^V|_TǦ5㑼^R4jz,5!&X*{p/TUU6=p>F{<NEհy5U|^<%םw7߼#H$01tTw@JU:|ZյjDug ~QzuO/dZ><;SxyɋcW{+y {! ?zzjq}twws˂r}ߟ(Xӓ8DsJHGmA =⧋|h叻F rn ~bbeo^Nl5Nʤ'8/ }x>\@pWo߾1H%Pͯ.cȳo6 0%j}5J8?!DO #ִjG09$`?ݾ}^k$S5]n?vgƗ].M}/0"-1/dXrEx?C &(LY BAkhk .d?)b6v{T, ah9Bc^h,KfncD0F%! QjJDPO2yֺ炵͛fruKN,gyo#F2#2e]fN't7MӜzk4Bo8MRCDyf7.vP72"yK߼p{ {li[j$]Wwiן|IE34u}\ qr?>}Ol2B毹v44iѕ 4c“&֏km^NaRmmU]ǩoAvWt]_=Ur}Y<+l< _x\R1(swbt?_<Jcw>wdXa㱭3 r=G2y[t{Nv*nn9FМNymmG9~T?_DJ :2PVq<z}^nHz%,/N}:[}Z]\N=l;ŕ@Z'O`-)MG6~*193&ξlg}fY4#guh5G-8_>,"$1(O^Xvh68`ڼ\7uׯM1.oᛧpJ!e"Xc}s(r Ǒ{(I$BhۦERGkyqUŨu}>!*t`n3p8ypOR0GQe9v7;zDxgUlfՈiIƵL$qP}9Oa E(Bt1XmSEr)F>va9!1hĈ,c*5w?G¯QB Dͬ sSKc1B /FEeluƺ!OL#,Dh GeIPMh&9pq (ZEZUEﺘ$Ap&zg|<]#"x2-8af0AA4!&9aZ,46>"\ViiC0j|86;ߝgGolpH$ﺾ=ƤHc00E 9>ӔHO`bKSb9l9dQms< M.Mt[;t]Q, XΔ>I 3!%Gm#J1\'-O ͱH>~Pp?#Iv4l5,! MQZTc]mC}NFR(07M׌&bvdIe>ͩHй7|~hcƚL8ùuW ͷ{cm5.ڻEk(`>QܩDӛgjF޾YwC3WWׄV5tF,L&m+>|XUL{ K0VThZF.cVpXô0UJQʦ B4OY%*}ޞ޽>,hƽwn^ /Acpn6qO|J>p~}4tqzheD0h擺kS(xgLEnm!4]w7bDz ǐ'X@1a0>8qWj>i<7@sdWiBNr^,r4"_ۯI3d[T[]6DH.-Kd?y1A$(qx.J̍S)djơVuY&Y>}xa烾ƪ)9ZcCmfQYinct;_\\R~u;Y7Fwh<Twz"  Ø!غ48Ϣ7fc',xオ`D "RHI* Os!/`hOjlہ'%j0n4r!D B }rb4A' <y[ƹSj0h]*hgEHV~zJ(At/y0;[$;A+UDTTHM7X1CP'|zBpC#!i/ ["x8:`F B )Qp`i[(i^Sl4JQp$D\<0z+\/R(HwY+$N3D:0VPϧi$IMc}q(b0εGCE\}d1N[Zʼdyt=$ aCEwم> '~hmcOhG߯Lבd#,DDXd8Y18aBGE1 Kgn[Fէ~1x͓eU$L&d44(A1CB kY!ӜP.xqL8BsQkPlhA .5HD\Lֶz0nNr^!(E^bwO&R qڶ]ӅVzHh{V!t>Z.Tǃ \Xgdf멤i7W!FE=}~!ӑ2ROr;DB.DŨקMSZCDPdN$-\kΚ#Dǘ{&}> q1YJ NEvX&ο}[|r}}=uj6 .Xjj|=Cߜ_#NPneO+Iȯ ͇mg YÝ8KPV (v5pZbQ> ^>,.dߐp6U룙3I<2)IhM,4l.ijupxvfs^Vr2Kę>6P'WOu ANE\}^~VRN>u{*Z{&Uy=LrջݾulBvjx/?! IuFL3& IDATx U}];ITY%H89a`nf|2PLŒҧ!Krc,zkFgy'ʚsu]wǣ !xQr4 Cj{X],IFtTDQv}S"nF9%wM87RVhY.EZeΛD q"&Q'}+K>pLʤ>u $5KB[eB9XGaD0! MK2$7,g }`X!;!߂|cpַs׶s߈ #l"+1!1=qJ"B.&t\.OOo_?x$դR䄤!:ct5s`mCwtj(# ZVX,ycuYe!-lFq @0*jSldEo%ͭ<Nau=O2؜]^?Y6_YtSeTdԡ0Ԝ47M{ߜOW>"ivoe! eK >=Z|Ogiړ;>: "  q;Y^TpJǺկHXZf.D >8矼|\ @,AY1 Q2ZBo|1K@҅S;N#C@(EҊ KHI}N* GF$.o^ozjT'Lli}{u8tM6W?=o_ixcc]쒜`Ntoy""hf߼z-*Mn[LLƬH2 2O!^?M B?u"\?"y׿\H<O'fMKy4[̪x"*NQ߷ pPMFz|AV nh;; )pOgxhы٨w;J|'y~x:jO]h iV%oHj}>nAjZ}"i$f,i)0!|>`P("=(ΰ.Lgb Ygh[FC{y%FO|{!B5_L|Ə5Z)~eo'}Gr1p@Ԙr$Il|zQPT\bRSǿ2;O_k{H BB;&nx>1YPDtCV/fV7xi4p|BgRX~},$mnɼ-a>+a:1j{G{q9;ZEJ"9P 4 Tf^u*g`6+k{k!/_߾-.&>PλmcѳeOVQ=͇ߤ__(ow?b:[B8'ͶF8mnA&j9ͷQ?Ӕ)3 Xuj]7"ŒW_7w5bE=T6'&A߈Kt<؞N{~bY/n+}rNOG$чh>x}I]T~ڶ^۠1m NusJ9- i"4٭??uOBFZ´?թN~ L3$<' qUFM?E2͛)fhGs]b1?=6D2tbW8/2b_^O_/nW>锬U,ߩ$W|_| r.fw'3l?5ܫmՋsi6w~a>鿻N8g#`māJ9Ų旙T+z-NVj~iE=YLᄆ7_RuCk6l B=tuMN}$ɧaelF/j[#8><2`m=40M-$i5}`JahYr;9`pq/.W,n}߷ob8o4z6iyXL&5o`Z,cJms&m#aوvh} "ut)WW96t2ͣuk!Ҿm#%j\$C?D'ʆFj!Oi$nx3_J!(@ [ msD0Gvw73' }38dIda2?2 - ic"06&{M(ĵA!F%uӶϮ]^0ra;$]4+)BF&Fg NnyoVr!8<et>DEOR@؏rva M_?ܿ==^,O.fkU-BU11/tz r r>dgq &Ip}-`XiE AaVY aU$`G@UQ " #u^B\1_}:W'9-%(̃v9jYYAg.JYJuam(SW|4M^'O+ǃ:6ahc[;v \>g\le)5/"mC#l(,;vkf6Od(0F28Dpcߏ"M!d Gp($Y9$)Z,Fi% 0x,aڅnQ0yjcIB}l1DB"|A<Op}?eO>~< `b#RyB1??CPϒ<}5]B( 1*MRGt(+&i E:)]ħ5.=VJ*#2 *B٤z<]EzuH31FRPpQ0\m\)a@Wid<6~xZgb mf^8kU;HeI=!!xBu·w04S(;? 0t1%}\̉5> h8B)moiyWeU咘h=="%4~(.6.Qm(\>,U[{ ;Y_*0xֻ=BƓ.YI|k=:=֗XMxV$"Iz>un7{zz6 J Ho7\֦Y8վ V)]L,){Hyy<8hj2 pк(ɲz=#h`Gd99gi^ɮiw4gb El4Dozx>V[_ M#hݨLtVMmt88uCۇa]P9+oޚD)Kp~{{x\n6 a!XbbĘ8 d6QjVLϗTZ=TwQ›c ,)nꪨNDů27ަ( RsjKnkށ,C 8z77˓FlDӜA ]SUHi*TfGDbsQ, R% "2 @ŀie8jNAd (ʊژ$F\Uow{-l6䷿ja;9I 5dY줠erdͱkP*NN9g !.춪g {x|C=/׋asݵƎܤSQ xtVtxx{n N!Ob9-ft!d deϪ4mbSAM(1[ p8iXR$,ϋbwjnnTUWZ7èc9fy]BpBpj)eGbiWуwз.XT*^-(8!Fl3RY!zꢭ$n ]I糶m7n.D]Mi91:Jp `5M8TA&3Fq .F, &a"+!Dx1y53 2ĐH8P8)cB]&FP$4@TSi bB)ObDrGS=yHDŧ ID' {k:#m G(B$G4ٟo@,0@9ba9"UIqN`"B( D5*= '8B`<8chBp``YZU9!$: .`A*=a\Jn89 "r(uΫaPڼsN yDt+ B[@991Aa0\0`wCm7 9#($AcsQK4 CAqQRCb2EهjQ̲ %bqsGOf)'icVvj \̡Qq F8^0G1P 㫳dvqnwoTTyD (NcZC9eAEFIUfx3rIEn-߿~JNH!X a2G'YUey1MW}w0]P*RA!\QhV;y Fq"O\q uC!?9Ea-଒S+(H(ߙӴ?J0D;r\Ah=.Z@.Īb{0b#ObnQ /0MŻm<%@,*u4Z#ֹzϗY>H^m]ӺvVGɹp^nI< 2NLO, sMjy01spbXbFGeVEdW_+ 0MyZhו؍q?󹖝5zn9{vbݯiYZG1ozFN00|Q>vE^_gKǡfp#o?r$ b|UDN' xvF{'+>ӓɉsJ";"p0PH2[M* Z(+)7Gz{ P, (ՉSƉ7Q}ke"'%Kȸ͈#&PgP!}UO}р!F`"YncꚭNɄhvz#zEhBh}V"iY"E!C{q4!$/>ǀ"CN@$|F9c1Ǒ!8 ft٬x0B F-w*ĸvގj (L;3 ֹPB$1R Gt"4=4MuOGT0xGʸj DY#ϛ㏪Ƅ`)iHMٍ}k()D" z{g`v< %"Bc2if CQ<JigY 6XB :v R>]IRYqw?^~D~/']8 0Za2cѧ8g5' ! }Ȓ8V1$ X5z"໣ 8Peu>c{F-RF4CXg12 GiMx:8"TdE6_$6]oZg<4V3xNpS>MR1ۮ8spQIY) }vJB/,el79 q6QwfӐbb* =y y̪l9}7vk:!㴶ZdY a! 7$%p!0HJvB2(TrL{MI.,c|A0!qt\sfA=촧[P$9#0JK""K23 ; IDATrԲwȘG edS!D hŠ\ AT$ٴ;5F_&,d$fWW>߼_ȳ/2Booz?\"W&˳va4AA;B`,4FkJ!Ma$I\oỪ1CaPJ!BHh35Ʒ8tu`PIUMEMHB1>ZL /#reD=<(yx)=F4՚x?%~L00!&O?#`Gz8z`0")H?s)ʏCRI˳1"0Zj<`0㸻}A(QV,~4YcLg&X2[ŷ] M `{Ä>EӶWփ4&G!I%9H@i. R Ȓӓ.ƪns9I&wbZ$Lq,ƪ o-wV/lc<`t{<.,I13#Q6ݦ{f}TstIEuiŝ#77}۠2?;/ktUEʽ6m]ǸH| ƐE7`G8ni/_ȋDv Lr Ǎ7qpoEybw8rSP?6\NK! XsTYC|<X&D%\?;ëv{1nOο~pc[KQbIk7xE,PNQB0fmJ޿;6KWҨ[=1"H }Q!xQp00 @Ke:s@(X##H2%vaUpz7Jz1qΪCUfYq=UU~\١i%8QňxB8hF )*#B %m jwR>Ty^qt]gOr(@2LZLo߄#[Gx'@) [ha$,B<-ZBxZXnj?^נ* 控sֈ"('M^!ƈe!zS+%.H[1 SJ !ظG"  <-I<%0Hc:kp )FY4Ka bB'QܴRAFΡ@8tay?,s-~ly~8O9Qo_O+ՙVK["M FܲGGu1.x!/Hq|xg|OҌ 6@nwV@ L|%1*98|oS[-V!QϘ8HA[TEA"9Bv /(׷)p{z6=B o8Qr^CCߏvt>+y9cvMI5 Wgg2m:cdY)0.8At2+tA4Mgra#i3XN+t}ۺ2ߴr{z~їYfE29= *LHoo(ia;?Z>fsߚ.8.Ѕ:_]]fWW }wlY*m퇻n1rLbZ,Mb\Vt=)4eY\=QkŗϿ6|M;9;{7a%,c"U Ƣ*}y8\$iQuwy󺪲e% psS <{&\]-qx刘le݇yK<*9JyM_Pcv}[cқogǼLWgY`l7]g)rpl`R4?[m`6V'h ȔYVe(/ZB$F"5ʒrD͛<4y'jq(BXD0O(YYgcV7 E$963qԪ#EoD !ssc=) b K(J) t:Mf'vjRDZk$ *@@y xhOMc)ďnI#T hQ4 sQ!$ysQ:/ħq#̉~-&1́ vX$I]! ƀ( ,D"@7BQ"6ηmtGuA*9-|dDw!0>4YhCo>=j/3۷l^dV(mA?0!A7&x*IҜ$5M6M YZMcP5iYjgUf4nDK9m? !yY~uI^ l{cqWFadhggdu޻aJ:WrϞ:xDYB3;'P;%%%9=퍿"'y^ͪ?|aT:b`)fki}w(UΗ @z^dB{ _]_|y:B4֝h,FЄ;D8d,[k!ٌj=>?Wr;5{7/rnonnnZT+ =B=EzqQ.fgu+{mfۇ^B,2 ,岸:=xe#)HL]ڢD$@x4A:$ڐ}q?Y]N&/}{E@CQg3B~o/3m!=@mVz;B-B> ?lIq}A{ Zz@^.$;82böi9g$fޔuI8񫗏a^k b.ϦOn2a_~E90 O뛛QH5:"~ltY#KCce}wNR[4fƅeIv( &s1I2qOϋ ׯ~0:- /ӫbk;E٪77-ϝz͋i7<~oi?QV2͡ճGO9"im@`ZYGLgQ>IEjppzr1 ey@ [wN5S׋v&K% W'V Vs nV'̇7o/4W SEy6t$}q>a$zFHu3Qөʋ.x$瑞]WˀCrzل'i']Km uM(n6H^J*5i86L$!3zDȧ(ep5,|FN.qF pZbEYFT6i;" EB(@zSl HĚ1'ϋoۮs2Ffl(eۙ ¤~}MGH^Ʀ'BjCyF(*;lí^^~9_ߛj`JD-V ~QQ٠$ƷMSeŤW;l 89H=l7 k/~}VQdD(OR"irBN2)z3nvbP: '1Cqq=L_JcTeYG&dśPgY(sc2aLY]ww`I0.D=d*MM2ZR*&/ȳ"yM3W71yj3a'nGfF4vahLHUlf7@1Ee]L0$L&e0ْ'FIV7GddV-"[<|yr뎿ݣc'ݙbzz Emd*ǎG:;zy !82cL"g,ݮwALqur*yJ\]=4_iƘ6= adxǴXUIfh񊱭&Bw(O$/g*b(/iY;Y8ͦ "uӔ}64j)c}7N-Ow*sRV'RN&eyUU`ԇӓdq0?UH/UGxBΫԎݮQQe}o&+K tyRŠ5GtY&=:v͠e\R篪g.9bj{IGQ3x>{R6Nbd(!pSo!D.͸11tU^u 1葏 !*B̲@&$ @ӠF1Za6R~D2A` BB=cv[H98s:g#%u1IScB3B6QsSi B~]]%i"8Nh6!#!L[e5Ut. )2` uQ<P!/YZ5Bl>Kd>j= bsq"JO 3[Lv?UFE)Y-|ǣѱ?V(Fcۣ$zkge#!vݰJAV@"b=iRS)c!i0P? 0)u IDAThQ{sɥ }s F* yRZM7Ov0혀՟^^%s{q6s\S^zNe$bb[1RBQ̧̪kM|\:)cDR=ǐrTF0PR1ΨQaJYo){>=;-4mWzԪu7M76??',a};_.oo}6M5BIy R׻s_pOs|q=~_^\_x{ЏInON+2ݦE(Ƴ2/j=O9:cҋKÐW~ Ov0d'g9Ԏj5IΒe~ǿv9X vw-Օi+*t}Cx1*̠(S¢`r]qyߤE>vfTydvãj_Ԓ`~2 Cǭ}TBG)*]mw8='',svsܬ_/_~}V{L-n۱F_5l0 :v@8[yRL*M cY..#.P z j&XI @vTClH%x Ԇ}-b 7HEcEGg11H\bIIA8 %S$GEmFR6LhaB|v,Sv,CBBY 8l(a6c7/JݮcCsƴcy>~|> 9-"0Ɵ1#Ÿ?t~")~zcXs>Ƈb,8Bia,rzg\0ĉfNc6&ӫ+lsN9xWz4"491?j+9OEIP .)*x$ 'c;o'ٜƨ}8B ֤X9ƅu0xf&q]g/ȲZ\&j۶Bx-fX,d"`t2;Lee>쎣!d6o-A#4L݇L,]']Vփyfl߿/?UvEolP>obNՂCQ˅1I")ȸaqN F0xyVj?2ߞ<4R~0Cu>(VTM}O~yZ]Ya.IF lQ/!.L@(JL}8ׯSYݽ1+~~rں;Zz}Z'WOo?|( Hbf.+y&oN(E|pxuBpN 8J>~IWb>]Ofwa|x,|:Njd8\A0Hv&4~'7o-|v`ͫxy ߺݍ .f~kDiԸ{"gI9Zn7_~>X*nUN=IvN݊l^WWCgMi_ ifWlӻozTfnӀUrq>1n!b|cIKZ?xs8ovLfF:8[8=m,Q b? h$%3F98 z:yz_VE>:cYB'u&n&礔RkBy~l"1@9?MSDsNqMDbļg\Q!2.a5;J]NMV0t~𖷭 8v0yl&nry$Irk0ʐ6D#LCtJ4jb HY{xIJ'v۠&X4%vYDBGjmBB=zNSTxgBK Sg1G9!!1OcǧAgUg\S?f L G6mb-hLye P9g9%hʅtVr9eyoGƤH"O ч`x@0d\TA41*D\YU(Sǝ\^ي!p}TRPHrs 42&a#EP`6rNi6ieɫ25q8`*ɸC椘~'Xi rsssuq&MxXW?:;s6NC8@X2 SFqQ=nqfgsʐH=44}36-{3;Msi$}x\̄fiX8(l2*dilZ],p&5);DAu߼!Գ, NwߍS7?Moƛg9e˲oC?9"W'cl"M v i_<'( y{X׿jͳ:g"nv Ôl\_{xuyY,Ҫ,٠UA.Y1Sf%:d'm4(ffBu}Drs-_Pό&ul06@zo5f|=ͨ/rwh.X6\< Jc]/iYk8Bi=ۖ/R~_~y~\xpJ+adi@`NOEzz^x'v,}w6.=_WA~}8e]-s9܌J8Ey88[hqZ1H$=ON?,gq}g˫˲.vmŲpO Y(Kx8ţL9x֔xqsu<"F~ѻ:Ey!W9:"Jo{3r]'%)pHp ̆ E`!cC3YL}p#!f V:8C *MӵU:R:q i_^fp,3X&mk( ] v"F *tRq=e3j^pb4 e4MinaGo T%Hɪd8GI:1i~u WG8_H@qh!!xmӸq4Ϊa@Ɗ `"W\\B AiD"DF)!4 !"~:G$K/EA~gkIH c3mZ!FF|r_׹fS"C&$&FHYii3FG}SC#15z 0`c>&p:#0bD! /^q JQ18Q 8\\WOφ@s`K\XF{uԣ^+zO1 gi:h}4g%IQ="dOEpc?7*ɋ|qaPvyC"DGm;g"ՀcZb'b>k½Vf#.Tzcƪ"W'ϯ67_?6̑ G>LX4Ǔi&_ BIOJI}eZȶgՋ?iBV/m̆iJ؏r_DJtw겺8iBʢ]ZeY5?j9fKvfs՗%AތA2.xpkv7|v(BNO$\jYܸ2+qw-6_,y}zw~u yUUyTE X#Tu>0+1O irҸiLRFqؘ[uDI9xv:}fecG=u}F&}>uX,RcB4=UQspv3<p a؇Hzm0c7əto_^,qLrwzZ 4-cw.O7 qjڏMKr~-/$SoƳXrjNyW"@ׂ6XWyq:.n}ݸ IUE Dޅ#Y5whطN^Jrr^>Cw {αcY}}L񾻽 AP}89*<(ΨvCp%IB!)ajG*q]QawiefPd^A+cd& Jq> k4%GI4fb9g]9d`7!DJ>c:K)HE0&fLq&0Lu`*@$PAR#q?I)pQx8" !&XP4LN[Dt>n:0aBg/ |DVoܧn[) B>u?֞ D#FX @GSǎHAA/#"B1B ^di]S0 ؆IkϨe#\D40F!bt.X0G#L"#`my79g-1N=2҄ F{gd e1G2+ EwIQEo{"t]+R|x8T "$BE@!RTaȁK@$#m="lFab1B2OtxSde5D:!eŌSߍG$'$.:a?qx':+o"t=,x }`#"?!D\S_՜7vK289O˚fDJ4ic'E$j"== H`8Z7)|H=f5;췿4*!}aԻf\vAfEZ1Fz܅~Ҍ;m ?uÝY^b~}=W\L44Iv{g>mh=0!Rbk^y!E2(L!VEwX?9Q J*Va/D;}󓓚ol.3 "ƾgZ~匯GZ&*N9$ov9‡v E*4&bHRVե 8]JEXDRfB4|~vȨ#<`O JT{&@@SXtJ{yUIl4WEv~R0BA?|x$#@d1',=Pfm98?Jb 'y&zuS(,Bong&e\Ec]b'LL3%%?:~iL^u-Vr(~?>>~\o6mauE <%4)Fj:L嫄Ӭ뎀l^Ⲥ9a3 "ҋ_JF~9nsH%s0 \cE "Hfm% aumVC%`.ƈF>8-{{xk-"PTnhEcFrDc%q.c#LX2+K&Quݸ{Jb'U1o BiA5Jƀ#c$1(= z!"D@HL7i%bl'vyg8uaJ#qs=fb1&1L#4B "B~w XL2:_9Ed{;`XsLp!uFc'$FAw OORF {, Bd/b)?M& )0AuO'X*SA0aF@3@9,HDʈRcd8Au)Qk8BE I{3LDJX!23C^ZU-tI!,)M LsQ3yƅ};q6#؛mY0Rhp0w']"&!~4z 8!ph'L&a"ΆƮ8;E`q g4MrBʘ NNOfuz5 YEV"儐^iίR {]9L `'| !]PRj{$,V߬{󄗚( "$9=Y]?)3Y'}{ɗ$DG~^DiY%.R4m%ʖ ﶿ i:EhM&cA%ϫ$0F"wC7qPr/Euz~`-h;tN9mO͖ƺ1f6fP6@@0ݎ_/QbWYZЏ)\Wy y:5е MY]_]>%(!rIۡhX@$|,tVD 8..1g,Md'}geFHZ7!savO`cN/__;}z-ż72Td嬞1*߽|I<g[5 n( q쳒d2nbsFlM5e^wmǤ Q0&v>hc*Die25Þ]ܔVSAwq0'0%A;?OiCH8&mk"G2<y)EfDNWeb|P5!(YQI&>@&qwMh X:M- peF1T@&qq &Ɉ0hdsy1:&*A1pX#dY*Hgm,,OWguHrbơ-KlZE`9C},+7&S="j5Kaa 3{=5YF U"65ӧy&ɟџix{{o{3xۈ}rM uޛ Ct R"|b?^㧆O#`L*#? ?P!sI柊&p@ȣ R/@RSB}Rg,x<{oAaiZh[ Ĕa@1LQtުO4>u "Qb1!36Pb c 6xU{EarY=< }gR*4AmY%:u><>Y}wEyV8.x}x޿kc<TFkOӀ&+wجgv/&cj۩%~{4gi^m>)lԱޓӓUwl͠$/x JΪVgj:@u.ZRzVe:+g&xUq6g.~Q2`#"d&>rvrj޼UM~?>5fWBΔPQpND׸ۏJrj|FhB//V#tȳVxlqqv޶9_aIVxc-U^+~˅$׿p۴XG7Pä7("ŢqܶCcBOem$k6od¤AEn. n? R{e&""]LƆa^H4Mzowj[\v|Xs0լ~)!iw*(S#W2;owms/9khXYB>Gj8;Q߾&H\2O$1iWgI8S}c^_~Ef?&F6JvLR0n!~ȤEc3dYF[?> WvSg1 AA.b^"y+L y!dw Wnb ,; 1}h8@?=2  ?wF .ÄrBb )YVp!$g,10,d*)5܄IB0,J`{Rb%yXp=X7n@DNqw.rd8/Z`4<^\URѢ^iu^*D M f 41"`ion6˗>L1v482_2gR me A '?Cϭ;7P8Ɇeqqb5`j61uߟ1NQ(+>"H(14 fy~tUۤTUrۙjgk&k @0ӟ/c!>t1B8_~yq}y/E\$Kݹ#D72gܾoc&81H)jk/s^<ٳU]iz=YΪ~gM)z9++s2ac t1fճj7cYiQo^?_O*|aʪf޾?7b}?'[!u97w#iijc4br l/^}}3٬Ϋ믾zxE5'J=D̛PgQgURLd:vGמCqC~㏄${?0YHCzZVINa`gy΄]u ķE7791N,.mph=\.Nȫ9B>{?n/.!$%5v>}eQ0LIK*3,/g}o_o_Nqdԇϯ|*Ā)58,zK޾3cV*OJGB/63, RK %B ӱ?vn l6R7϶ΕqwRn|\>sz*ogui f ;8@ yT7WONom!> U EכJ-vQl~˧|u)LBbם1LQ"LK^ aj^2!0QJL@^r歛zGZ42ulܬ45*(r4BHh$Ftu }H8y .TU%/2F)s ޠ. EK>Fa^ )YJ]`\ $eVUaiJ rgG`fkR/!޺q%ė5(Jl;1]C aoR2B } c.}?F A@JS";:gr+<2$C,>YL` '"PBRBD8x ',E7,FSd"iDGg)hɴҳZӷOd3Rr! & P;DZ$A;$@DDH(Mx}VZH5} 1^ɂDtL2X,t+aC{&ǻ|R$#bmi8U)l4= *jeqOh@& / |m S}euL7"!qd} )r+^ky|a2frH sUB$ ;@Ht+L;&Y\֛mW}}~׷5+fmPsl11;RG6p~<ޒ{ @y*G帀Sy1nV! r8 eޛZe%^s\-DV~D&ܱE) eCN@ͧ|7^?ZN޽n޾YXoq?ez\t 2xq4̟<]bb;2 cN0¨nNy*Ӻ^d4~b,/ձtGv$M>a *ί";ߏb+Qf%'E8W$/z.|㩗 5DolDH;]܅ VU".rV!'1eY*+@rg^5ck©vBNZ&ZL=}\}$!C keE΍)% %Cf\jڪ^4;OsURpl)sm{}`*@$a>PlZ e;vJSjer c![%d8@`E XcOe$^0tЄqe#? Cg5#oL-p |WZIц裖@9Fg)E.c2 IP$xds,KȥdI?6"f4ׅƂGfJ~!T~clEQ,C.y.w1F@)Q*,siGx?_J*&uz)\1D`]dIE{)iQ@%cD!4k0 P)"G3N;2U:+J7ǁS b 3JRPʫ,Lht>" 2+e^)yHmr jmrf ӴLE&)pĐt}J¼.(Z !FOd$T Ot#(}N8.ىG6%"^^ OB/*XTã1~7uRjtМX7fϪjV2QǬG~y.nhTw|U4xuz7|&reNfzDw~q"-8#&“Tq~n!$s.iF]gl{'xX\:um?Z_9lT.OP\Q hTL!q1{8)'ϪUA1Y.a7 u2mt!h$j.u{XbA+'=><@i/E%B 5jO6BHa2.x{;"ْe{KYRb.bɟ2Gң,Jq//ZiXUӄ1F L$fy*)\E'׸}*>|5͛o#,v0!zí+Wu4g|o3^gt$Е3Sߓ'eT7ѓd^yI5,gɞ w{nS؝עi4ǶK*%$ovo<_,ϋHt~pS*yfԄYZ:#Y/܍wjwW6 tOgSsnsoFZ8!D֐c>8dt®wՖ~=>튴FrR nZ3):H1_]Wu␈BH,)=, JtDB()c!|$[1(RӾBFkorUEݧ04Nm0I4 2Sp \.UɾvC˼YTy-2Mq+&UB&\Qd$b "BBOsd}sƄH=|CT)V}k sRŌ"#\E4LƅN)|䓉Xt@t٤;38e]uືDAC^T$hAs(oL!"egDXD)& Xb'%(] vy8:L 7/1Hō/Takع M,JX cή E8 pLbsi5 c! ukѳ2+TbvS<ɗ%[tQׯOϧX2c|icO͗p*月6oC DhDOBKN M9XQBɄ5hm˫x0ؔQP zȹ`O!|g3~_} V}b:5a?Kxv:#p-a:&gD^j$q6m&ܻtSwe)cr̲yJ 袠3\I[b =?&b_/VkRioC4·]?tׇ7Z/+so9n6+!TDgB- @PgIL/>fג[:6Yf"'׏^c=#hs?C&H]"Oo -.o߿5gJ 90YBGۮqJR~gg[>IP7u.4L~{rsn_=}O~3a4}5>_/9ФZ_ԥeZEsX>/.)E@&h?vm#b+߽:yAY`j_O_γ"S쏽F̪IZk)<gRp6mqiH8%x4S2cQ(8sZb˹xBSoϏaA\e˜|+K}0VhD $ps<7a e8wbuyu,6E ϟey<6oُ~t}<>d`pA|usn송߼\kem|&w\AU-ҷou]׶r]]ͷ|je`d &h)$q!zLCv삋ͬ~qܞ7uݛ^s/vK./|)*eֵ_~y8p>Sa}GOy_D6w|F Cèެ/Fw>t+:CC²HGU`əSwWJJp{.YGe!ug3K(1`Esht|w{ϳr%JY4ۻRm" q$f9_>ndjNudԋ}7s6 s5ɂǢX<7綟ݾ1l^_tm%Re~T/';ug=[~cs" 9%c)b{al7j >`}SJp8!x={qh~;OGe$ ;?$b#/Ne ENɞpUuBf,0&`jV0ڑD { mP-ɋ-Tհ,rs_vsU]ߦ\<ʲ`0b׹LSuNH~TWDf<_|xL?ٳ/~_\ 0UwLH lƻ&l=g}3H^Kz8Nto_}y)+J`>;n]C`sӞ=]3RP$+8D z5WOOfolhR&i{>F8w-~S4gPgpk}srTLHp-<{o`^ =?5 &G94Ø**T"uFWT*6YU?w0j8I^C@("*|9P<"Hh d\߬bHp7/.ba‰i1_0v0ӫovh (-ۙ`qIJւ|>N\Ţc knLPBoSc~Ggb>܃1 3}$ ='@5Ղ%t݇T /IL Sv!%ZgQǁ$3PpPzͮ]H#0eIJ8G&t&u-x eYU UQ#dD K$d9SuX؟PlK&xh)g c0IpT NIl[UeR]lLK&geA%3*傹N'뻘dDs$NMw{w }Kq yc` ɝ>$a.Z?ˊ&j~l 糿XuPǗ/ww!ǟEfl8ۯH-boootU 0ulzI#g(%)Kכl3LS8dϞBdvk\IŁNnןDʔ$)# bw%k9gmJHϧp ?NfIgYҢP?owVrE$J#!મR\<޼n(hH̆ͿC.~i O ^} 2ۙi3xxt{4*/y 1JoWG@ق3;nϙ毾W3*lw'p*$.P@..= &c>;BH%APX,fI:5_jZ %2YVOlaTks`: c.7XJu!bBt3 S:y9"&mMF}U:vDBhL-dV )cgD*xdE™JltpnG`6q D!A(KbAPdR 8YLI SLD)!j!cJCL284eV0B}$@ ]:oa hW\qX$=fDB2djL?Z?Ni ^<;!$hdf[H^slu#m|KK`cdBd*_}5RrO^2eu@6y7B?TcrxXi`ٔbZ ƍm"0Ce)+&ߜZ(J6[^|0 Et[y:#, ƶ:+!DJi>^ܬ~TǶda>Q6WؙDcOwoo^gENǩoD!t(|Q )wvLJfx]kc Mt˥\eQ,gUU%3r|&nj<@Pgu9y)KЫ/dvk/OMof2BhS, aa B#pb= >=05qC ʩ8`z|!tmVvj<efn;m'?ydtVsΦJU͸ק v=O#I "cġ ߾ղz|9`W:m6G66M2vljƙJ EEY,u]'1dqy='Eٜv>ő u}g>+SA x7GBR"_,ʾIyVsZdezR^]͖kxMd)I4p1Fy xTe*`zAtOE!z3S{w/3Z˪teJ۞l :<܅x Ve>ˋ 0"pe^~/ e3.wN4Pd΀Dm"DʌqKyb 2I^eAS\R >3Ћd㽿 VMakhqLuvv<V3z(r24Q/Vq~蝔ruYNo_1pA$Scq$QbQBRBJ8G \K`""q5Ap.bMA 0*`c-q6D2&aXnJS]jbC.+(2!e%&jSn/E0N#c8x&dB,'p}Z! z@هF鴘LϏ(`O)!EBcKo+7O[ w`DJȇ0#b" | ,#޷}?1ߞ;/WV &B؇O8炫żlrHr!!RB" ;Ώ!%@8# L !F~S><)&JEn~6RɖZiw(G&E4&B@- &\Ip%RN{@L!` @Ao(r&sh')NR <  $ AA σ3 q/Sg@b $le3 ,\1g 34\٬,dc"?OIд yzx8=ޝ\]Mu)RPQ#h]u>qε&ژ9 \l.VR,3zQ/WW Q=pkp|f|)E,sO( AJ2Z) EtzQ :w@gWBG{9bhF}2)ڴQ8.'+L(j)MZ׌)/r%u0ρ@ʞ(^ϖx8v,Ka % 8&jsR*jgJTZmlICed,=Q2\=ѫz I+ge =N.h)AR)Ad'EueZ.iwAI<>~:׹Ns>CucD3NiUkKGӍ-:[pOl׏[kmLFBjVU5#C4A؝`;79I{BWF?ֱٌe~fjn?kP[|WVyI=wcϵp7Ѓ )E眤*(2͛CDEh!uc*=yYSoGVS'10c>֛ z1Fj^ӺUnʤ[ӗGҙdh[f;"E΅N-C'ȧnkf9/SL,nz*mƻu IlѕFHeW|^J)PBuqM][ӎf4L%,4 -B!VUO]e}7ݾoJ e~uBD ᜧRJ@)I)J/|FC@"!ۘ!H "D@Ӈw>S$ =Zw*kύwSP 挅ɶgdxwg3VPUmw#K9F,خ{9%%|o՚rjdznma꣛ }?ۃY,BOEN9 X8HCHmkdpV*s#tdFl;z(WfNl`*/Lx]GGO.D! )|rvy×KXrʓ ɺ8Iyv@|s󢘯0[ =RLDiTZe9++0(,dyY:X@ >7_e)>d?o6/>c œ<I0s9lTib篮O1csMXL΅`S,WdgjO#YΥINPVVE,:D)?Ghz&O庪$%e8Y"'_'FK-RZBC 9MNwWk?LϿZ{EǬE,2H@ OK5 nqRey%'xٔ'I벪 #% %"C'X4sm`06l1Z쟜Ͽ8{{l:MSOC$͊BCQ#00y,ԒB-9޽k=ٓs~v!n, gCzAkvrB3YYcc&NKQԪ<%6iгa( q.Xͺ3‡}l<B\ݎBl!fMqxz/>n.Ζvͻ80L'Yt(|4L@Q(%=b:;kf(cPiD(bS9<5Iљqθmkv{+.ע !.Tu)M3uL|ȤJ+QTU R;{A)q8 !4LHc j c&cF@NyXBeˠJ̴Y`G]S1sUA>X@)GB'cbxk3!GLRϳ [ c@tуx4xh0Ry^4E^{<4)/Y!VuZ;N01 eκq{@x\n R0RocQjYBfU9{7y⏠@۶5~:/>9=mᄑ(IG:DkdI|q&R>ZO7~v>z,:̀B]d'Er{r-37{gh{7.ˋO̱ᾯs|M/ozu.Cdv8vQpIVj^r;p a^a },yZEg"̮>;g_&%Ly0i;w Nq;$0u-s&w|21I%bySJΚSo,/<* !s2]D@LJԆw7gڭֱ^yRvMuc _|\\Gp/o=D](r2LeNF ) 31~찟-aUY n۽':j}(.3ʳi{;rª*=黛wʪտ7Ɠ z5'7Gs0θq%`!CRZnXQDθ2Xwv)x[XmjCcrH2LMk˴B$((slYeG)S92罿NtJDC^j6r'i.KzvGzSߘvwP_w_x˻w?5|v3M"ˏd??hZϺx{7G>O9SeXݓ&;Ӌy^ږl{[6ffNqJE,Pvux|~yvx؇|.Nyn+L=rgUzS8LD }]΅RIl\+„YrV$(t0d2CBy1! )P3Kak3Shiצ@;=/4L<:^/o`s*pegπw﬏y2qU]tNͬ0[sŒ;SH*ƺf`SI8zɩu~IІ!,cYO(] ~v?7Xr yS4gZ\l.mQfb/XE4f͋~u7wMj6|_ G_o_of$g!&F>kq ]`R9g .ΐzv3''OfH):3x7ww,zc 5lxd"NMvr/^y#%S_W;3 |{q:}E+[eYK_uݍhr~r\;7uQGv~.׫!LnW^wn_o~uu@[pF3=f,W12Z w!yY%MW͊`0:_כi]dW")"|V?ߚtq|W_ ~9W_y Ye2Bq+\&:)(̴j\:켜Lr3!_|/I$loۭgK:+.EQ]3p9[{ !Uu>/N6xBED]sy4 TYbA;0^./ xr0ϕr'ʇC^J (E0 V%co5=yr髬(5i!pTZTuU-eBdȤ9S3(v)u*\b^4줮82@%itaj>ϛ%cqJ$n.gUVe릁rzr8a K0áO!! Eqi0LQH~z^̚LpBb8ՋKwS? ]R#C}a/B=]R˔HAQ U4Kd"U).1.1릘RHDȘBbOT @ L@ HU#@@#ck08|Tx#hb 1Sa[ki2Ɔ`'sLER! ɤ&8Mu( #q%TZS MZdbSޗJk!%+i=0BJ\jVUUFkKjdimwfRC&ļc9R$( ) cBC7Nm %6uZjY62R'"伏, 1+Ahgg*EY $"K)1*l }Ācq L1N sԪ68g zb$Tt7iz}tiʹ9Ep!zH)ka`r%' Om![.h&Ceʨ w [2)ڷ69hQ/7raa7Zch/sST='h欪¯?0o޼ U5Wʋ\e 0 qSk [fzpt5ϋfrs eȼ<}|7\B߁WU~N^?:|.38{*%}fW6b8Fɑ@ϟ^! RɲθE;|'R`m>H>|iw`ƪ*B:=+%f!`SLGz7 {T|l X]k%#2'UL!(~uv\.bD1+ H?vI#O % qZ/K5㐖|NfAR:P4AW XCf7QRTM,.in;p("?{¹`#Oz s/Nw_ MXfn]>zTť RfRs2b ߍ@^٬ `)L-4[`q C2$M)90 o=0B0!b!bL1D29R4pP50PsZĕ1wS "O LdJp`VuY"du(y a"@ ˙F-V~{3L$ZKvܷ3)Ӥlۣ!"K|MUn_~*?IIEf?/)w[zblX2OS*`k*cY3)\I)R$I$I d9o/ۻi23>orgs.%ΧxЬj:SY$kl.f*:,Oू`xl(~mqrDZgy-n|ge]n~ow/HlF@fRk&:G/ rY YYOV% ñsϫYYVPX6M J${*;v1Th&GM1<gjHwwks,27˧,5c1zصTrUeZ,Y@yu$E)bTͲF]*#\Hd(F0ЍjQGob*˫=`?IWх}׷O?SrȊj6 n 2m˓\J >%gb9gnd@e8 .pR ' B X׽<YVa?l-J-0Rgyi!NNrc:nɔ3:{ua֠mupMΧu]uwaP2Qycwh^e]DG&gy,sKuL&kyB )t,RbR(o'3Ҁ\2@Zk'-`6CR3`BLCUBf X2Sֆ\ 3LG%c2#Ky`8c-19pbB  9cR| {>=2!%|XI*)dSDlȏFBB 1@P a1*@%24Y)Rx !l 0ǡBGH)#abp<8Mm7n۶=;kmJi9 AL1LbAtSDR 91bU3뢏n ,W՜<vIH*Ȋ\g;0tGUn\P6J,#g3YdՖ1ZYm/EWEQd=(Ka&ku]FأMPsΓlq7eH>3LKbȒG<@"ku#C=;v~{G&/MY5}7ɋ7%!\(F!a#sL@bѺa BrE0F?s1dl2nn+$<_ҳN1\*ܟρb][/ERW4Khew飼^K3C7 !B .߮W|ÃmF E !be]@H hw]]Z2 (Pe{j[ "GY-Q2hJM>{;v( P2)e>XCB+ {p~Vlwe^-+BڷmB`L%H.i'dZ'!& E0e MOD"yoom]WMS:"%dljч*}Q< ! %AB"@D`0FJ\JJ$E)+}d&$Cf'FoGsham8w;}.:he  U(xϘˇyTo1'.pص'`A)* i,ptWȻCd&q8-R$H(8$ q* 뛙Se*j1XS4O.z BLZʄC"$rX0,v2OΟ.:0ʹMB#I`9GArƑ[ CSY* /CJ!ͱLZ/N_<]{l;"ԍi>cuuv=fPZ~>:p B#ueqw?5f6 JH  H%D1 £LkY޻+}8"'_}us{?f7x&,!C ?XO]77ǯWo>YVVe^.|7ճ 6ųa7z_qnR:=( Wpk IDAT,TMnAz&+y~xbk3] ~k{Ru#0R'@vCp1Uo;׃3z֔`|w6{ ^{r'|^eM.ʻnbYVue')eVϜw=y>ϳyb/ri$'ի'Il/Ó'ggxy}GwZmd~Dŋ|>kKj:v2*c':S$cFY'6<^|T7إ}/j2ߺdz&S?~3?<+..Lz}@ I !4A"(jX.y]̀t "yuػowY6_-5W!EJLy k2YO6k%E]8K!h)avJ7"Rz3%]D,X?fё8GEc$"8)#h!F}sf@ {Ͽ DkmQJɹ "dNN6fOrX.f֚seRJ+-@@"$($8C(U6'@ M 9H/u]7\PeJ)@@ hIqF (cbz[[؇1>}}_ 1pZ,U\"L:)&/]au5 '.Q(W*3!3.ǩG%ơDYs.dl RdQ.!.?;v}-z>5!lr(5r6gYȸ5`-EQcJ?Ecle#'ye֘C[L?RuvR 8긟s^k)d\~O}',_t?M$Ty!i1^]۶)<liw֕S]MnHX&;#b6 'Σ)k\dSY͓blu>6y0$fCJ֫LKxJBr%ϕYoCJ:EfQD:Ь(a0v`\й d6Z|X64Ճ?y] }{tebqnӓ' EQdyz| Ls7׃1S٫O*=Iۻv琧2aJ]brG0.,_5.xHiǹ_4!WWEEmNg/˚=yZ-+wf:\JaūSFcZnkz幛/r^g%h"8˿7͍Gk xF5"Sdi *j\j|-t%㱍ǟՊ߹[Ylʝ}g;"ݿ;trz9+ˊt<{͟TLt8mI.w{[vB0:uVL:`?.~}ێYϳϟ 90乬smw6z ~,Sż3DRU(8_Q""+rя~F!%.9gڸq-8cDPc1jDCS0!F\H rH 9UF!4OǡB?Ѡ|Ie""v*j9_q*VE{hS,z$GHDftUMSd:3WRB%:gn/ GSm7jbK14aL*,($HJHáw'bxEUw;sA3bsC,n$ϞY8 \zeFնG fYCRLpHÑe+&e?2?6M{oZvf?A~``62&2dJo d=9*b0IFF{;p_AʒY2$Mmp ַJʅZM&蟽HKJP$gq?>~dޝ_զq8}x+$I5(Ii$(J :D*y11̈LV'ˏ?SUd%km=$ib~FNLyzd P˘(!0I.N{ IR}qְXLޅ/LiM/8sA9MhĨ\(8g&F\+f]<;}6ﻷ|#v6J3\(!}[ !b\xO|$.N<"77<Eyƨ}5HcW%yJ)FiV+Ħ|;n(,6EdH&jg$ͼs`xKLvCoba xb:M뮿 aN "D,Cۏ>թxv],7w߽i1UROȹr$]kCkײ^,ܾHEUQ'ȁ M/cxm(S븼`RM6z\.q#;zכ~Hp@0r,ЄÌ裏>`Yf˓!ˁ 4dEEbvCqr?6R%+˒1A#cD@BR:3Ɓ;1Pb4˶X5#.W64B[ ]d^jQuѓ m6evu.BIxsy5^/uVdc@N0:{ ztI"1Yk6e Y"BP]7s#8ȥE)Eⴙb`jB0NG2LBHdDbHP?.ȇp̿h yں#@d&B)cjRbQ Es$c!DFC?# GLK^R Y ?G/xZՌD&yg2p se,ĈcHI'v_O9$F\Oz>XA0@{}m*!m҂1rifcM?Κ 2"%Ȕހ - &+#SL'0sH  :ST z )T)IBB*РDFZBa!2րM2JH@)4Rr$Ih&g5bDP߷t}Br3.fQib % BtA1c]#+gAS7="0Oqs. a%J"R &?7UIsX'z%kw8D/#Q k84:vv[u$9URe7_}5 ϊab@=Ϙ,)g\%1? x"0X&ڷ!LפcƦݖ*8%'EQ-X":&F?REم* ΕYR,[,Rzг*wΏ8M]]__Fr`Ja?>Now0 r^tnvaxPzhMtLyj!fDqQk,s.jZU>mK LSޫ,lZhqh^.(N.R:X1tܽ)QzYdN$`-&+P:@1cDCE̥2vɉX-no4w5K>ǬB!@TJ+4??^W n|5wNNYRbD %ac*@L@da`[ߜ,L!*̻4MYrzdI&Z$M|'B=mW_j?J"WH)2Nc %q.H8IVBLc72x  ?$HbX.7ŪTIsUr#< (?住ā )9 w~K ?H7L9Fb]G8u0MTե߽і\=* dq FRCRc1 c}JioEgj;M1"piJcwz񏿿}+*U:v}RDN13*֋e]z3"8!2tܫ 30 R-zh{(Le(*e48 `'>usYfݼݝ6&]`pJSloЭIJ"[ w\Ll5a@"M6( NvYXFdUׯ>/ ,2o]ۄ`q>,y7oSUZWMs7[}\KL6q) )::WE uB|Erš>n[' ,ϖũLZm_f˓ŋ'k(jW]s%ElYcP؍a, ՜goe-8f'WWϒ$Iz Ifǃ猞_h6øWm y?i9Q4OcqͱAz]DbEGl{xи\&e!ٝ>{1}c6kON»hKH.+Nq}k>?ų}2_]USJG1x"͖qaJgR_|O!_uէj?5Ø*)Zc^*λuqzQ NQ楂lՆWuUtcof;"8\^)a(,z.v䱮aΤzQ\\BmhPԐ$("!>6{̳˗iǦ94ق $27_ϫ, Sl f=d90 .:%ϯܚ>9R)l?ѸX岊 !DJ9̊Berû&m o Ik{ .iNBb ћ ʜgkX?vy!պLb=`g!SYwz@=G(kblZ DQt}7y$8@S(nS <E`Ob\C1FBK~h12%#zzt;@XKoň JX?$)kɳてfw$br! Y9?*(C =D@B  XD~|0?SND$ Օ=$xv<#nu"3)n 4CuHa| _VB0@޾qSg$+S`qxXǏ.Jp̀&m=Y8"%I_ t~pu8BgSѫ"=' yy`%xT+›OOI*N6sNF{ͻv~0 *[6>[G엿ڬ х׏_PN2~8zqui'Spfi4#_;t֠DZZfgFiM\^߷c`YO-W v,M7og+X]d#hXtC?އaJ(%&oW7q .Bzo`r]UisqcWߩed ǽӟ]0xU;쾺9e'z}YJT1œtv{.6g~ZgRIU-_>i<ä`knIqQ/87oZ]n6'싇0w+5M|\h)/e7vϊrUݶ=a}'_ Ȫ:L'y3! IDATGv8=z}>첌}[Oh?| O O0F7}@È& F)s?j{N?~nC6'Z^\}|l`7_~k-v0^Sj-o)7/cUoo >;E5esߓ/lyD0,*#xA&5 M6TA;xB֫X#N zXE-OgaAǦݼ<&'&*f)&tˬ qv P30>n^fS#rFD#,$R$5X$=1\1"1 O4 RA`I  #"z(BX!+39 "'8` Hb 4qv?}C ~?3Q|t#?F igց ]ui3>LKyqQeB}Na{ ,SJ0MzSxgLPGB!: '"fh:mlq%gd(/b; xI0Щ ;Rꥨ^j \[eS e$8XsE:+6G 4ofT(g4Q,z"٢i`#fHE<0ǗScTPH"@F7[# *icPuUd<9~<]zfST-L{J~$d >'g\%zP;xƃL3{zkc-OYVzY%eJ>7fc`,Cɞ( 1M.3$ضy,6P ZՌnoio_aPPDd f̕/rɅǣBRFΣz6.ņ]RIaONsƢN`f8Bc18G)yց@"$3XKۇMQʻyn[W,?ٜ7ݻbIfz<ΣvuOֹd|<>^cG]&IjFhpH^yp$4i)rVs0\B˕HrrM"٬Sv/Ϟ8b(k%4pCރ iQJ!A@$ȄTE 1͉24@ !$"!?4*BxcH},PB(@PX#d% @# E 0@D(bHDDʉOX@-!R`a4"!'YkМK~4y/|f? F;,\sKeJCO>( |rAvݤh!8 K)`JD,O)cB 5X% ΎPmfJS"W2j-*ɲhmɣMTe"uce)2pr>0&q1qEHsCpicCYI<IlDUnj퀳 dN9gʡ^aL?A[K&YO:tGg<`PG#U\qdڷBJ( iJvfZJpl~v2M8Xd2Qy:vm`@oѼwF>Js?jyU )A{7|J,+%]WQqmgO:7v6Ύ];t.4LI~,p<4'mb'uкJk¬~׽yݍѬeo=$g!Ai89qFeAs}nZY$C8&U7}gTj'R 8}{ozA/_IʜzdI6 F2Ixҷ])'"D=z37D*An:$F}~#BǺ S A9JC} G|_hN?BWf"X' gS%H06EY͓x Ee$a[@Kf09)+;3ɲ$ӳ,$ rz\-L'W<^1 %#rW'&:`lD) DA"~eNO3o*ĞҙΣ#z>y4#!Yr%$80df|ܛH _EUpMC? N&$tlAJU&ġy1\'Mԛ'W1'R>/6oݽ{ B*!8הD$1 itȜA5K2yMߵ𷿼@'o>=d\x|~X0.>W.t7$I~ 5T-7 %Ŧ p>7_~h{Q)7ɪ^ӣ G؎sBxAp0C(e)Bu,$TN,O 9HL*դH8hNDcc0LA$+*7()0@z_^_M"<6$B { ̬  VHF?c$g/pVܵf"]כ84ngA6 ׎'G,fGD> ?yG|obZh0X?N<'}sUT1$:wa@=Fs#:,:D)"L c)cZ,Wq~ 'Dp2Z0_Ţ|Z?ڈjۇ}?b\W$u<5A''!Y>0 x$ S" ņ/Ep3b .I" Af()*e < Ϥ0HHBy#LY-+`Xt:S5_$7/]8;cEM],$!1x\N|@ @p݇w+?Oo9~UxsۿR0p<ڮNqpfh?@oNOWjw=x')8ۯ~uAGnng qv ~}w ו3wNk 猀,8iJ }Y.17 }߸H!&8z[E*]lliPIm?hy<ª<٧/O_]\q!W?h}\Pf6f)Q!:Q<ţ#D8ϞuMݯw H6uo:Sy |{f !$>t&ٵ>w@$W||'SStzȌH\pQH'YQS .YGHYu an>aH^f 6ʱI]:"!hkVu6٦A%"J!%#+%$ X鷯6-A6gHLXH ,/5OhL3x9b { Zx .*BT:2N ~|?z"A|Mp\@B! 3=XoM8Fd9'+q0`kӲ4Si1m{Yե6cvDk}p;Ǩ$D{Szu]G͛ṔH =>6q3 a, .'Dʜ1 80 DĠSpʪGMxPr YY(>lnwG qK 5T 5D2/%dqh&G?Wת=& *wowAE8=/Wa\]$:}.E/4C؃|YP45 ~߾ս K+&JTQ/bYc*,ƻ%nv~7wD`l7D51 R* JBi𩒞mۗ9,Ffe߷}7*kb"-=n/~3 a%R%deVwęY*v?~DA p@Z[?rӴ-]E]m;x/b$}?ir$I~Ni1qrwwֿq`5i ` mAʓxgn؄KJJJ'c;gBBWشc?b{D] %PQZHf7NPY$i*mxe{l¡Vu&V%G CQȓ()XYھz󗘎$W>ɲ귯BLq.hMYΘ` ѹHsXO!<:?tuة$My9/H=\}*eákXH uAQ1P X⬳ !o^~ A'z 8K">)ݽsRSXT!iͱoNbUGgO?Y׎u=]?ܾ:!KPtazB9GI(]7|qq\ļbR}5ge+)xVY^RnbԾn<9R&m/ G&LԠ {d8e64xD%0HȒ&j5xližOᐤimv,-g$,p{3^eLM}{qqPJYK 9\/R$#E 8|Ljq$C PQbNNiw7bͪ1A*c>'gc8M)i qJ""֥D9R(+(0"PzJsKrl7oj\QG'C= ty!f;9(07` F]ӍM\#D 0C/ʒE;ݏG#RW˫~ UkW|d,quCq{L8̓ٻha:5.MzTT;kʜs q(Du& Q+qg\}-i&1!3wxcՖ!IZTշ&)Ha6H "eUA۾> A;X'|&9%tȼNC]wǯY^^. d}sV,"E9흵Y$RǾ,"1шrXH S"gLPHQ^)C!9$ <(V$IVS'o}6ƺ~uC|rrƝ.ck}Q3a-bw0>ͤ`!j3aw?VMm[m  9!!Ew IDATc|# nwLeBXD䕤BDjl q2=ˋ}i1.X ںv;N}3hK̸c:(h xv&N6zeuF~XJ4x7wGGyc[9[U'eטIi9-(9:+J!r֍1jGbp~!&f%84kzFCb k\>?>c á9VS>\& D-N]6 B Y"]FKG/ (zJQSтJ(KP?m<uۛz*3nBy6t=Mjvhڡ `Ҝe$!X%&F)c@ѢӓIՎ8G)cfV 2Onl:="r'LHDc5AM<7TGy.ɩhu R% /&H{%Hc490d#$ o8+D\$X~RcUE4b D}44`#->dTPAF Bں^eI%1 z(T&iW:Ts1DHSZ*sWu[9Lʔs 8gvLm4'iNgn %8""gx̘f,Kwдmy"BFI**iÚhH0* t1=)#9.HNݮޢlQ\ SvrƲtVgF7Ƕ9Z1m13TX9e1W#}fwsWy|wŋ.L8VXdt42C\PP% !JrQɝ_|1'lzu>XȦmTR*t{뢷˅2xYZDz\Rcw5ښ2'&$b)e)Bn K-g:NYaax0v="0F sąVSk?8b%|@~貒&9!h<" Rܹm ȴVPǮu?v 1㍪ww}5epb ERL1Pqxz- J;o.wGŢR>Z3~vžJxl2j:4C?h/Xp\@|<%wtʲFa*///0~r=xI֭b& +HV~}n>q $z&p$ &3YA86m,YF 3lӔQHYk8CL}?=lcי<\M6ǧoj E oɒCd̫)RzSc$!\J6̀RewG ~$\BSG&\8ӫ,OQ upLr,`Bp 0C q"AE[wc&PVIH ;_a&8bi|NMg>D RE^zGbPƅIYeHj#á@ 0R>/b(6LLV: ~sYa`c ֶmІØQF!Fk! !>p~?,5 gXpJ>GBDC1$^3J"1>IT"adG"ј$x@<^M9x|loӄA>cwpsaL/ xphX h !IcieVenyliQ6D$ M)TMo1IxVdCoLc  XAy%ܹ6o LG+82:ߜ,5hn<b̾l^]+=ˇ52FdEtw,GGgM9S?im#rjMM=Y})}7aE91|1So`Zq 2Kh~I8#;F5`I ;ݭ0^TfN^*Mb єr?@bHXņ^ۦƞLxurzq>+LMU@߶,g,y[y2S_'l%N| Pgh5M!B8 Zݽ|shKbCkb͞-r6/3) Pe1&J|Nam/(1c5ΞTrf0'~8,,G՜ y?APgB?ֺi/JJQZ,#t\z_+aDΔڼyj9ܾ S2rAk&GHh:͊ȅLWkD2-N킾IĻC@ʖUvۛ!4^^'Pwۇ]^W/l{xhݶsa( qv{Mp_<߾vf 3\.^2~UAѺ;dXÀxD(,oUoê{lrDz5U%EP$Xe= R 8qLHI 9!DwG?& US|1|kw0'Xdqv7۫j^@( *\7LtV;+v=e_?uoAI&|b@`I(@U"<ܝ%ro4 7?KD1k5KAwڤI:ۈ ed]k[w8(ُ,7yƇ~13@F~([ %蠔?9{ίj<.yNvs$RԏaK"KΪm e-Շٛ31+ oM/A6c2!~u8ٰN,M0*oWIHΐqwyNf)Vq2'p  XɉaCz`ʗZrYX m&J+"b9>\k稌BbkBJJG"wpzFS2f~E<#JܨLf>CwlS% 3" ?Ԍďo {B5&8BcE8fE>(~vp` t^C D(,Sβ1&mNf&;}UQ"kmNg3g]욣z&U䬪qNLuspiŀ dJ"AGcmP4P& %уE~c3Z 嶷s3pZ՛>z؜Go_w(=Ve=܅aON("p[מӤ4ڿ}}pp)?a`fhq?~ `1qyQ.WEmwHru(lo_r @`_xo~sv|0(" $WHEB^R,Գ/MSkZ%ɝ7V'%c5_&}udA]הCᱚqf a:C4Է~^ઢ}{ۃ/lQu9;L߽IJ士>52mT#e8|/Oyw~6āR4mP!T,@p@1DPJp;\bx457/^ δifZe F@JeR29kcHe`|($E>[ʌ<q??嚯q4پ jU) ` )$O>M׫|ӂzL7y%AVSKϹj,qTf)؍thz{=9}ij^_vO9ejkDP*Nx&9iv',#""릌%'hhn?`DM"I2L giV`CwO!gE, R;?ގ+HS;E5Knf8{RaP?MozwNkX"!PߏcߏS)`_VJO7sadI\1}hA7H 0>Y 0. ́3#k (\&8b J`RR @#&X^%!߽4u$//^V2_n֭ P壊}9%>z~FQ$!rm00ڹA[O2ˌQGBjDqRSF~UBC,I3ӫ PxF7&DaxC(ƈ<9=)9>L` 5aTn, *b׋(ѦQLQS?=.BcuB(bri|*;Y\^ n3ޙIT〉E0!37Q4/"|_˿3fRS6qˌ LV ;ؾ ݃Y,lI5[/(P =n$0c6Nh0(X [, fQ ŷo<6q8NS0 ىLh^<^9p}}ՈOO_~_M'40J!ы!G<OpC}8~w4:Z#qzwSfI#~z=,7Yy?YPAkkΖ$,rNݠ3?Yna1>b3JO(?|,"ʢeN/ǃ:υsPuU]VoWO3L4IR֨o'(96!KFrn`1h.Iſ○4+G$GfY6Ŵ;Cm"f]g|ag_̓TI_E8a'TB$ 09(ynyhA~v$Ǟb`C kgN뾛/6e8B;NOgn|Wby{wsGY` RɭdGg08u`YGll^tCtFXfņдM0lA$gz㴠LW)Ft }mtH#v[ X[Daj1) sO7+LL׫Ix(rj2")%eruKDzr@(n^h(].`9Y5bٌFwcp<ь}ߌFHk 2#8<mB ER&"?:au{#b ryc {)b#gybD=!$~F}=;m3&LA^cF|*4βRrGP{BˆP,jڤ%ivkL4DSNBdèC@Ęe`"т񸅌 >ԒxK D#=;sպj^m1b?9Y& u{x]:a=6a% LЭk ݭSk;с B3Q)Nιͫ+j9%˱âw(jDpތu4XG9 4Fkdfd`&"O1ΘLrѹ0LPbA)E-  &OO ,AT m}% 9Q{&Lziʹ,fBpGxpz!iwMT1L44&ITMO?Qs5ulCViYBR0Ai-\`# au42+|Ny0vz9Y(u5:g v(KmLFh߇nXCR0; F"pV"KmPjzL dh ,yX~WX8)iUC XƤ4A:rTL 4~4j 8AQ8PZC bdS?jϗaRqΠ,+ @XdL`ƀ\E(w+KZX> [)xpahk"T" C8QF$@q*>aDUօ c"vzLl,cc"'Ucb@{#1z@ Q(z xG\ p9HP 2a<4F"!zg}֋sIqcAs1D>"k\ !|& R.#$˒I"  HZI))zN2EQ&8& ᘨk؜l*Y6䋯 $JlXjTXʡA} zk8,ԛi0Pj7y}b:=$kD6(XdBDCQGc92_'m~kfsX/_4Y2_H)51˗U-ɴ,Nr~ƅ&+ᡞNPַ^O}ۘH0b)eR}8ɜɟd=%u~;x' l5ȝ}_%eBehƃB ñ S& 'rhPG~Yaa{tEb9#q#TrMvt9LP]?QD 84G}s3JYXӠV"M8BԹXEL1p0.Z.#&\6،Yn֛Y7uv!F=z6 iD)c4rRz4ӑ;qU!mO|#Gη36v7﮷4 DSo2ٶNU6%Qτ烿8}ooVۛ&>|{[-Tm{菮gfO?{aqs5T,PMlfj]ȓl> /p}%Q!@~aS$H|OҴ`p;8 X#u1 $Hө^t~:vnhڞWWe771l56ÆJI0zwE₼n4Lh#,?ua]')^.HA Hw}7n$Y#0Ƽi|kfd}hִ*ǽy&٥Jtq ё?Q*a}IJ84eV<)Cnou!1cdbv:tfXy9Moͫo X0$|!)>f>׏9ʜ`JaR\ 9bW˨ +(?l %1Oβܶ._fg`~d)SU;w ' ˩n\~yß.C(T6[ovNlFhe&eLw64 vl6_.W]+{&`-zvq㜭E^?{6nooo^7 ãYᨇWU5[o8/_,|~yJx_⛷a:i{Y%FL0Z\/5MІa '?kv{`2qbjxC΋0NG$`-Y"ӄ}K tZ Iy #(X^ k8$MRivQ=y)P(D4#lx|.,2ZrU5%~F~<(| qճ*:Nkd48o`,I[R}kҦ /N;Y8O)ͣww A8'z:B P Γݾͥ<_mn=XH9|JYY?A}g# b.=8syS&uH % K22;;7?ɓ٬)!XH3R@9b UC߂2Uմ8x@jDet}ݘ۱ȋ= ]@#$h^ӓarz>*^7ﻪU^\}*789y$8 Bcnnw/fZuGGR=" DIO"4U^5OoLJqCDYe&=aXV&ښv8*>95=nc4K 6L J=dS\23 $!ń?| [pYt>XRl]~\1j8z SmO r2Tf,%uRCGP0_Y9rHChOaIҪēЏ2U PB6~@ *I˒ZC dcpB#,DRJw1 eZg~2Sb)ʄHǖX睃~H #)kZI9AMyyi>A_54ާUR1|ꆗ%d uoWQy٤i .hHS^Wl4ȳ,)S%D q*%ʚ7 d:(V#Oj]y+`}TɆؕlRZH8ʰe{pC?S, A)&,/ xp7vwoTM^88MfN"rfap0n?ºၤ]\I"/ハbzY54'D8K@@"OxxK1RdCSeWOVui8´:[$`la~Ʒ>`*] ϓꎀ*?xb> uVkWn|(M;<_]F]F΄ rs4H󟔜0ReeIHiJei:$s'(GqY] *N~q}O7i*3pv".WKU>7Jp<3͝1 q&Yȍ͝~.uDu쇘((*>|ְT=ipPQ:)XK[W4nlx"]]x2$y)8m 85yE1p1xhp<=΋JyэH"TXB; U)YJ~Ȯ.zBjw{lz9){oG`e)"D=EJYЦ8PcQr/Vբ!3eeUM sqo=:mK wOx$k"s9M  ,"c 0 `1Pl,EP>v7]͚j GEda&b?"L`8AS ƨ!!8i˓H-֒@[0}IJ(D:VJ͒O%7X0Fx7@^6yF'{0VݓiEyN{PI:_z&%vcH3? (eBIc]~׳d})2NA\4%i+4bU9ܫ.iPIUÒLhGˌʉ 6ऩ3Dw`o^}cY:eEZ׉F[pye&"G[v>iv@ƄLS7Sqf+UQ H35CW-37cST ,ԼY)OCQT &iF .h߾17w~!f:IHytHf9?I`Cl1+K]>c޼t_n/My<ބQH-><ӣϻOA^:T.k(4:~cIgSc{[lk1}$11UA(g:}CQPpiشSwҜuYN(ƵI/ǫW}{Bl& (E}`6)4*;IsIv~5+2S+~1IDvs 2Sl*tӧH/gO3v닳(y|jI[*ePE+M?O'XT"X'{\IJdɋsq9/DGjezvvm,;[OCZ Ddg|uzi=qF c/OI53ޤ' }* UXo@>+}! |v$ '% 2,$J s׉w4%yvvw0h|,֘9T&%K$OHhBHADZɒ$HI'|.4˲^S?9Ο˫ozzlS몒 )J3q<@@q5[^O?Y|xsw7fWǛ~s Uje6Z[d&i2! Q&z%$M=1Ho0Rl6z3;KEQgծ;v7wI %A!/Hl8\<r>?KYbD;m߽{gQbsTDHҩs$cg#*jKiV[M-dyyzw7]񡷄l<0e"1a,=v0!z)@rcP͠vo~{PI9D|͋ib 'ekBc|6DZ7`nw9ʗ&eR7_^O@z_'Ţ=N}Bχ^˿_䏏oW_;<~nncXUvED7;ϟ8{Xj!IoGif1dyV><RıvVv49_2>zl}YݽIn=]W}qaw:!S 4O "u, E 3rՋz= }py)zyB׃S?Z?y߽qqJkhi3&l}l~<ֶGxb90*%҂RL./DQ;YbUI =gU5Zr;L1oDYcgMS";*i޻G*X`'yn,VuHCxR@3?c?T*S$1n򬬪Q,]^@)80[K\{owWwߺC{ BpaiNHC^j(:Bk(Jfl>o>,elP!W  MS FCB!za$ArF[:tEⵞ@'p`1DߦbL?!BaaH,0Ze#s< mĈK ݑO$v4;9bLt4pNS>#"cja% =ݭ1]en'X6ȋ i2\6ʑZbeBY~yIr_.S׎PEY]3}nRO>kscs.2m⇷?&t>ކף$0/YN~UZLWOOm1DY=A/5.JQߴ6ȱUnǓ=Ϋřëo&_|!>}}};TIIDʧnM>>lϖC?c?JWy IZ:Vɟx;}O?-^:Myw}5o/a~gL"gg1yC-Fzw.Y fxԧJ Cn I)Yp*:;׌R=@c 5L:O.vwNw ǯ>1Y:eȸ*r渏Wy= f@@PO,vDYʪl51]\вyI9unfs3s}~E~lm&󋧆Zhn{7!YIBҐ}: ^si8rALF ֎@L^`Q(θ@rƊR%zs:}1OT"Y>7a&H aAP;081wZG ,v`&JwḷV<2)=uF49!=v"BymRJ:dI<=΋,SJOQ3Le`] $ @~ȅ!d5kdP$?fGW䟝uA{| >~~tGZ7Y @xA`-Q"]fk)>,\)S8)_e%@c]pQՓYD h ߋ!F $gRL:甖` R9H!FD\G "P\ }H֗r[o"yDIRJԢ)!fF`V8u</^T!Lҳ,U,e*nsۓ~䜤y 8v Eiz4Ψ\]^WY?Nu΃Kd8$'ф < `W.id* i"A2l Ɂe.y^9bD <#$%J\դ gśwӴ9We &tZ93r);qI, ě4lNǘd(88\!d`~0hc`L.v"]3K-}+Y'ٱC;+x\JG-DNbvB H){mG!qlqti"JL&o [m?N`T467q]쏿`_jsacnys.i1H ~D6:}:+su2aZ%SF}qAEe"#xԟʓpQz@jBJ M#&Ӗ?lcg26d*?uvO=b5Z^q!a,R@=l=%pή?gf/RCY|Z?C2[Es?Z4{$~ IǾ7ݠiX#1D5'=MN&nƣbKJ䤍A)IcӄҲ=`d 'c`X% Bͤ?;!u@2ňYJIA8ޣ3!HP*z0kMyTr%dWaR"$B=%Ӣ4q0˨k|(Ry 4Bco"O+"iyx@E7rCn{ *x ХDϸr<8!W5JT8{e L֐H:úq&Npl*2*UжG=FMX_@V &b]|n"A0I$)E|ݾ[>kϗ'%7``"74HUR)*iu^ Qujܴ;:\dNe=~+ <;{v&>av܌g4łq1oKͫLk"{򬹺zBFS?IiYL$s%6@Jq`b!X LLNyGf*홧$99?1v@=eTe糼wClR(Wl &oN&x Gb%޲ð ,̮6ADt<-7>x?gEw`};5`K,6CZ =hB"˪ZvU4`a4\d ČI*ML1 <|}Non*7Y$H$:Y^ #+l^S?7|,Kd1scd2K΅_xƬ]Y)"@uী`OGdD$Z(`w<BUIA%2}<&bY~0e%m77A^*M$v3Q~-a"@ǰ$ )04wG@ %HO1"2בY. BU@9F#ab# ⿸!/|#|0Z&0i"GonǮs\̖6i}9+WfҭG0FeŒ0B8z@r%I-"s#e<] id׾{=Mr9:ZK4[J:"0z$B$=FoA1C6wݤ_^/@gOΘ (XB1 >9С3lɋPxu'90aу@eւS&(W-wwl?1G,S,*+*2L 7κLn VC (1qRz ȗ 18nYX.vm7nlUsyԗa(\(K76>޾޿F0p^~'g2wA!2vʓӔ*I 9,RA QǶc9Υ4>|;/^yqpzӟ=jB]٬.YRا/ilL,u6wYUfvz|ҎS-cYUHD6MmEru-@H3|k?xVbq شg7Z_&U`֗˿|Yǁt'y=uW??}ByE{lP֕~sw_ut$SϤc@:|nv[s:g{^A-I$Gؙiz]QG쒧͛7fg8p{YOHyoI1NS{bQ&I=Ygx8!z!ĀgqV*emkBdۮ;i'/IVBH:4_G:ĈG HDHDJ=PDHDB ) %@=i@#!H(A$%!0@GͿ C"@!. `i*l9\^ ,[]dvO5ط;/wo+K{D7~RKl \f( 4!ФE@K A=4$`nKUWիc;q#n5Id5 #Ofqc'$d9az絖`$q<#dC##`c&n/,۫18^#04*ƄX MeQYMr#գ \]d4:e$0H[}䊞_Ɠ1}c].BciL0--pbfW|6jͨ7rMvՃB_QsˇWG]WyX:*9~y.,(oЮf)i뇿O^.^'@?SsЭC4caP.a:))MO㷯oAQDJەfip!ktnHJ8>.F_}7ÖS=Sovָy$;nP\J?x8R>rpf$M BP MȡUQ1MC@d]5Gd~{qyuIT;ϔj<1X}Y) i )Z pTvah4J14V[덶U9,xyoC~) 8=Qc ]qa |ll}4aa1D3(2K=:D0}Pe[18)1x%%KL) ʣȆ^;|LӴ,U; qQdkѵ(R6k%8+#~4{slt:g~Dm%#Nԧ#r( y F`,-0X$yJ#x*{<=~iD :bAN+0=mB8q(s>X e$I6i,a6K!u{뢌VZ1AVp`YCp (`;DЙǻ&B8M\j L )˩2:!lݘ#Bń@Tui"!ĂCG>hqͬ6JAF)YBjB0AY03oYS?]4s񸬬r7o߬JC^,v|fm0%/'yg)#QToǟ@N/J6qXqxbv]$C[gu7^o 3:qk DB]oӏGcDVV LA7dmǸOdh(,8?H)k_Cw<R7w۶ɸ:R<46_hT|O-Fhv_uɄt{E}:2l-k IDATi(a4% `6BDq~zVh1Ȼm8>xqvqmbr1bvm/\N?l2pQdwM{>Ƒ}/Z)T{fЍ2׮{~'pܳFeBUGE{}=R۽L$onGϯ'?hw/>zdv}֠cg׮[h$M~{˵/09 I؊,r[4fĩ5o(K`֋a:F.x ClQ Z~||D׋g0?Gj:-_|5#X ^|EʃmnozED d!:7?yI{rM h^48h<^Il|8f~۵JV3\4xW׮kdGZ_7v'eQw8JOD*%aG@! =yC0Sߗr!wrx'@?Fή_tT/޻AF)e x9]OfXKw"(>NP$wBF{ )1z!LQ"F1z;LPB`PJ ^IEY6(Mڦdef\N*OR` l6o1n4}}S͟_VIZw^ M<6E̦lV]Ot1|0 /_FD;h(Iru B" efԵ1jNljs `H^tFi'1 Z+rC bm K,=?s'!J0p4\(o:=$4$Y(Sg}g5qs*?ٴt{P<=>=l]փD"?.Ap1ΌGw,6ʼn 20ͮi;_>뵙Y|Яv/@#$-X}†/_={^e[>,K0;:yqU5y׫˓[pQ2nWZev6tڑ2SixV(Q9@BU2Ipxeӊ9I>՟YbqV"OP,<圖Uhs3J.hʒR߿^ON| prF瓅S3l TM ľ|T>d:9>ޱO7o,8/,Qn&En GZy6ʹ6MYVF,$V0HK7vcFhg(R >]^P@SH߁<yj!v/e >B9dC'IB)` ]`&$[ 0X. #i,"J9a  cZ%FP2| pQFc`P!`-B9 +ᅕekL s eCCr,99uW2JBr̬n2.//UZ6YٱJD~-\6Q7ބDIQ}r<QL1Ĭ0isLSγaRh A !8@ bt5>)߈[3Y@(.ZV7W*I-ld :V}ИPfw/= W'=(dK8ωUau?lj=}Q⭦s!Ng_gUF6A8}br54"nb΋>]bLOγOjR,ھ~ QEMs:U:i>D-шfEbl߾mE9Dhҁw7/ȬoU+ҬL]a썵ȁg,BP+p֯V3M[7Λ8JgGTmhVvVts߷8@\]y: v6ϣLqXDS!k״A!fal F{]׮8R`ιH(M'N !xQL]7Ҕ;ƀ3A OUB h[g2JYS3Z3 siVl:LBO <` FG?q>80<<2?H4{B)!@ B09B1G2`o8 8}J@;s:)e`409d@ٓQB% -h#p8q,R PDmlX{_bf'.x,K f&8}wH*H4NҀ|V.X!:$6O~,\ *g<r(8x<P8ZLeB/=@$uup:Qke{IMv_q,P/ieu8 MS?r&J]QfYC?(, w"FI>'J{(@;} vƛyڿ_+?׿e󿾑-cN@2wx8O<M<(l7{4xI#2}jJza@AZLH)+Y:_ntZ|6,҆I4çE$i,YN*.1 Iu}f$-F'A0NASuFWKxeݾ z:>;Z/!\@v 'bR}_;EIrضֆQJ t}{wC1e^63aƙN~کruDH`gC .VAk}|2"4{VRJ$zߪ7i>yQ,Ó͋cJsGcg[vCٌeO,Џ5ho]}׿ջzr6O&eEQ>w&dMW594!CW#:ǽIQQل)#S|=!RJtd #d))eJo]' `#,dׇ׾uY:HJSФ,eS:\ p躃TN= V0ZOO.[|O@ċD1ٮCByϯF|.1@Rnv>MűQv1췃hBg#I" Uۛ~vA߂h\>x~>2|W͛V V,$cg`=8܂Q@wEu|2&Llw%@y1E5] pܣHb9.Ӳ*$u0('lj}rTwېtq>dʲvVyD1h\vrwXBA(E9G)MSQ^)d0FEe5 aR08CAD8+C^Ϯ./OzIie'@B)JxJcJ3s(`ȿc@bPP l8q1ID;gVvm 'n>Cx2B4]ELFSWeӢij_ʀr@[J?!(%w r88EIB#zypZ[)%&z:Li^4R\vC!dHW0_@[Cdfp_ʸ#B#W w7o4 n1\^Ayc/_F4pF)|6l6hz18$@͘UуR2?.o˭ʱcKd!J ~w~}?/^f$0ŗRȳ(XǮtl}W/ΦsDX`\l<)$4/dQWh>#˹+@N!a;pp@ E? ׮o%0;k{vOG/^ɜOOC8L@ 4q||EY/ш0ȶ !DRD/'#-T*NBlmg 㭒l<[ެH"\ٿ$.P $Yz|\VDŽ}E7_GgGX̐,s47tx_+GU/__ۥΉunywu㏯E闦fׯ׿NG ݿ.|I3#I%wJ aFQD5" Yuv}'Avyh')xo_|O1b2؅ vTME~׿QTzPPkF{G'f%+MʘƐgHoUAajoLRef]?ST_Y(Iۛe5îkk4BȪ^އ?ɦǖRBI;Oz X=¾-f1}ޤW@czB xY?'C=tŦn;XNR$ ιF y^..eƃh(`P7Vj"e/gϦ3_8g%߯E;9A_-/.b8kbPȣgy߉ `Y1͛vU P"R]UUфK€ǘ21-wikNJT CƊIQkj?FxsߟLO'W1,%qj{RJ0J)B ނuS@;)w~~rEO;!IA h[HD8a!m dWiL$l[{g3!`ԠiH6EMN8Ԧ(dV.,GR1vVjmpPƢI{ڶADri M0J _=",ϲ4oTe̙S:8+  D g , ;Q0 0WM`q޻Q5JcV8ܭWf:PN鴚F* uJV, "j}0ҥ m*  3 (@b;AТq(:tXD@.x6ї7.{ ۿ鷾-裏/y^ CIFE>g>oEq񃯟Y9f$ҬFwٴֆN..,)#AynO>9jbQX7#,]]c<ǵ=6a4£-I7Yp^P^;l;\Up+h +f7 M`ѷ/q8lM)@ Ƈ1 $4ɽ88`zi_Tm< My1}|DGA>&X2;PD*u݆sgxRMwybkBs߆lV OPkLҜ?9n74Xzd%l &mfkC(;Sqw(qL pqF-B1B4P 1$TɮZ<瓕Jeg4!~um.Ϋ;oɟIeι]sA$QÅyeq}wEVovqD[g=4{aIy< وH `M,fx與lU4"MhQ=.V)C@Q\ ,xߊ!B5$9 mo^DaܝczVmM(ei_UtACBIl>'teU2>ushֹ UܷjxDEy4bۺu)2)BwS+CQg#(ŸՇ{ҰM2Uy'-ЀZF탐ad0YoWo!V7)(!Q1F'' }/O2@IɮGd};QWwzejCdqE,"˲8$]m/G%zܧ5G2|[7'xX^+)i&Kʾ"!ȕ T>|VhMNVv18"^Q66p*1bSmzm!ECRY` +rxqU}EUAb{&/bVyp`)ׇ@-Bۉ`1K:=:N8.wK`4 0m?tD^eSR6罵T#zz:x`5"81cn-fQp8(B<<'94B:o|"d mC C'x8kg$Ylcʑ1uno]h@evlR}'466ó<-~ƪL8ba'A(?A)4)s]?F{wB ?ς-,y~fX!z^ vY#bHb+S/AΪaDߚԻaݯ)zR>Q o߾ !88 !Bh _$G:tm_kapyF9G(@1HEEUNN0DYLX5ڷ0t4(r.vu=tA*% (}у76Z΁24ayB H(r:D` eJ 8؈ s!zqЖ3HƙT"n惧J]P#i,YiUeY\\uov~mDP4P!>HA|N;hAL ƿ+ {8 `)<4>&?faDCPJZļd"z3f#u߂D0`5sp"X9'~JHKBD`'t9d{C\h` DMo_^@0=ei:з5xRF `@e1-q2sŇ"c#،ot3@ ]c%wuSNjs@DNG$"܈k(b{jVs@$E0m#lD%d Ak!Ofɿ2NG3ڋ@ܷm!ooʯ 8JJI_5R,L|~q ̪/&HfЁ0챸8E@5MDL `0,ucgƝ1oܓ}[P LзpwR՝]''כji1c Tf oUVފ}8׷$ )@4żzxء?_A|'_O~'C3dSSRd:b8Mw| ./AU(\^Z,ó|5YHMItfx?+ϯ<mGpN à!`[eëOb5)ԠGD#UC b C*㜓nRCȁ A)R*%t%yA .@RjN舨grHsޅqo|%y1c 3X,g7ZH\T $߼)A,ID> 8xyҌ%@!?L* FZ룷 'DbxX}IOM"?A=BLD(G@ E@j,rk>uc[s.,NM#dZեU|{4lR84vhyދA@1<  LBwέCO@;#7|8rJa' yN4l-0 S&%RޢWcŔ,U Z(K3UV1UqȝQL"Zc`Pp TUh)SI4FlCцl:%hv|Y-P>Lg,с`O8ކWCDȞ<:sB̥K 8k"T$˘҂ 1 o.@HB SIfzxTj~:O?0y[@ Pӿ_{u+RSo^fR~^\K95<5h<$ S5øtI@Ǡ].&`j-{?rr]:‘𱘸~؍#J^ZM~;r܀nFJ=]75-+٧O*rdw5g _|[{Ez~..^o{0?r>y]ݚٜ}cde/KPuGSF=o]چ51~o8$\^,ƞNFɠ}So>/| ?Z..ys}s[?X?d l^}7W/l _g?_ '?'O/?aFen2aci\i4xط{75K9L+hÝi;?!zxrL~`sgH*]$Dp`jU%U~zg|cySH$80j^d{g!x0fJ5Z]7=|+E†wd8tR1 CSKeh ˵4z<ŴnN|(gJuVk,eeUeGdD0瓢(Zyh2cA8U<8g O$r>"!@J Dp&}מBƱڪ*&Փ'OpRo~od2 RhodK' _3 /Ȼ^U@X󥗄 _9A wwO);\]>/~n7f&CEg|RA&tpvV1Ij>W0,[_Dhۀ}nu0Kr$]n98P 4Fu8uM?0|뇆$HVJE>uufEf9`#&9gld]#g"|L{  y!/.$=S1)ͥsztaP1>] tZ7 >6Jgw^ 8?*ov #>~1s_wooK1F h5Oư=Ao9TG:O+ y8e\重L 2q5Ki`e.VgM?K۞%C !%V9 :6u۶% gtoǗϞ=Y z1!vx:?~IԌ\$FغO>1i:O?{~yfcذ٣B$Xb EEƮi#2wH:\hzYFw&|-XNS^U#%,uw/2y훘V㋯?SL' \MfIQ.WBPkM\-3(hohˏoyϯQŋ|GWєS3"FH_϶۷}tUfe([yseL6g_!/܀82_T_hog;>켔~NR(^7oSUt?{[tFb,ţ Pf@~{^z HSI{곷C{ 8v~mۗBZ*|Tҙ}XXN@1]"`5?+_!Mb9,/NE!f'1R[|0"rB iLSy~(R!ڶbvr*ḣ$On4}y(97t9CFj6"cG03x\'ʒ5Mȫb״u=eVrRUd{]tIR}]4:=XB`0$$I0ԵN`>L&a]=:)$J$iJ~ >ɰ@880q[%jU.OݠYd\S5JO~v8Yzd50%!`p_:SG"D0hH03#oimo Y㛻ma,4Bh<,/EyvU2Auk!>I|=MJH "ٞZ?@ ~ fiLdU&4?:]ģPSW;cgc#T%;ln9K 7͍'.}g.בY4 1;xTyl6`Ig#$'dEa4#W]=m^v'G9 .fN'qt4U hHR5_]ߔS&{SU1WG!ȗ#~?m4 .*1oٻ "ģz}=+rp$e( @׸BoT?/lPSt~%Znv7)̖,RBi\>./!h(^<33nftVtD۫"(GS<H<]6μa-Rf|T8ep^}"'I4ms8\V7{v1]yZ?1gٓ<99yq*,擦SoUY⒳  `%ۡZ$DJ'j.9o?OG`ge FO#춧 :/&bb""޼L\?{<1*mlǽI 04?ho^r-ҫH%+qq1 d̶TcܖIV;+X\1ƶ7=uɒ)>tn{P՟f|t{QֺvoZHNA)ԡ`l㱏UНlBC>n{h c\\eONV,W3B Dra!ɢH'lۺ,\! tE$|L50DiƌL IsSh|R#;\W˿|re|3 1$`\`]0Sl'+)ۺwZ 4'/Y,jc`@a!RA&PPC;Vr*O> N 6D.)0#C!`:ϧ]oL&)Z1A?hcR)6"ʏ?ۚp>[ݴC>MYD1%hYO>]Og}SfYQe0x >   #ȃ !_$oeuM29M&ͱ N6f<%(bɜ6:䨻`%P=%Pצwh&Cތ0!8d\_KR+R:ƱGkWd6gi* J烣oz!ŹX.zW"PLrtц(Tgc:G\ U."m,S6D 6=+l`;zMqv{J=;n,cJxm^BL(=4vhssfE L㜧'?u,!E :lw`!b Ϟg'eeRkovI8EA# J&T*c:Dc!Kq8#" N)~6!& ޏft7EZI;2&m.œ3`g:"}|9-^oOwG8@$R~gYAҳH7mD GEzu;0V\ةޟ\ơ1cZ=` ^e(b?svJ '́$Ml^lBdSnwzӢX=Bd#@A~<1_Bo󟀎> >RPJM`#z^ۜp\*Uxe౮Gj1_훷nŒzG~k<`)Fp.2@N(LQDD 1IJJ%|'DdE8e>%)IW̞f1HjwXOЇVx|rȒ BQTգR~3y9ɪع(e!}{bJ&&֊立fׯasīrxB}!}|̽t.__x8U%5Lx(LX^J{`\xOZCs7>S-Ψ;*M4qHFct;(J0L*eztr * )IS!eU9,l)<&0_QuҗK1]+}6IʼJ2bwp} *ć0p&~qGm%f HE߻_)JBӈ(ReJ&@G)IGG)%Hd_v7_a}̨G)q`q@Bag(c.xɓhp캓EHsHr<^PVAH_1Q;b'>cSZT]۶]$#FNО$,̣T|`bepN' VC%#ֆ$ɖݦ9Y7U *SRLUZV*DOtD<)%1x1!Owic ~`ACt;uعÓ|Id $Nۍl`: OG+j9+.v;[1[R-Sݩ#K24@*jƪFO_گ6O>OK#a0 4r梧3;2AF P$I&9s'D*WD*l6adD&nF2bZMܽ$Y2ͬ;::5km-feUB7:?EeN捭eyCeOl~߶q4ƸfǾF^*T)$ I&Eey.i 1B*ƍf2YT#lh~'o,fy9ƻsݚ&Ex˜sk#~^j'fD\h@$vAF>xXUIv{}f7ZV}>xf$}|˙>쇷o5o ]NJ>{ُ=\-' $wMwY<(EI"UYDT@HDz7vŪOΪf2g/UM?]1rA'yF q!][E-γ120U !xa&$"`4c  `w|%avTf&QK%'S1BP"HzXĨN'Rw)x i.1p*#Rr)lqJy A"dQ#RdLeydw%BH1kFT潧ZK)uY2]yu>ibfc9b-~511-: Q20}yȵ@Ra_6DD5FD(ecq !4Rq1\eeV3B"W̞-l"IӆRW%B;fz!HQeU}eRI11 Ȕ9c,uzˢ!0gc2 cuG|Wj]Y2ͻ?O}cR",1,&d*qkm7Hnww~3o~݇?{yjdSql:͉_-.$.8i1m[_=yk0D=z ,ճiVh~HFvؙ7ȱG.tńţe Xw-TM6O4Ju} }f!AS$bfMۘO]4.$%f:{ hLUQ7/gbR%iOiȵv.$eښں,#RyE(dY~<cDrN<-hM#`?-LYxżۦUBIFA ],{w9e. TCNgbPO{士NGD,`(cB m1ӡ38 77zss9f0ri(}W2 ڄQ XPI1IƁZͽ1I48[3YIBhwYrL3sVd$]30 O@ic!K_!sy'VIm׍} DUp!t*~BJq{2}YQa9Wj{1*)*&rT HttN̖~4%{rwڙy01CߎQ^RSʌwo޺~bgh&(uMQAR`E!Nl!e2 gLp{W޸i4Fm˩#4+UmCq)CGLN {`݈:$+*B}Å[Di la1߼D,5W;Wi $ UA˅dB ns)/ŚzyvConoqmʊ>~>uMVm/\QjqRY|3AJx͈Qg6y#08,dW~EitooۛE$okx{t*O^$zZ.h;ïϓd\a^# YI JtLŅfБ·sL0*%* dI5L}ho{|Ճtb0(qġXID>zrq "ioL`2RhkZ( /1h{3h'8m褤B$QYfbc<s9cpZ@8$k53GsqQ,xrY^)N@J1BQpr*scMmC2WRB5jPApT&0#{[h2A$ $之xA~GbD11ѠY۞^MlXL$ϦKkilkpݼ}~{?ػ"p.H }@$P A Ā`,@2.ggczT^߈_6uX;@0:tGt6 9͡ `uN,`%P8h#@"+4FS`'>m9oIn,@` $ Q;( )Pj &JiNp$>T˅>:7N.6x ŕAUU͆v6c7hK~ۥ/ÙoW@)nmz2.ZY_vzޗ g )6D6E۸C8ɛ=J uJƳKKD8u. bbS"x&EםzZgM-DY>_͇Ȳ)Έd4!c9A$B lƑ1qgi ]y&?|zonѣ yw+tY:MSцĺ! =Wq*'?_fXIySC2ƘdHGJ>R GB7.JaL}?Ƈ0lvnkRJAHd|p$>ZMEhu@5\i5[aYiC1 9f Z6M2&8G}.8 )bbյ.bRw2b%()9$d2#DW$Wa-c،LJFgnZn7_{XJoA<*s7 ;kң'2p.&>.%`y.D^I2 By<&D 9l !@I`)J2fƛV:;Cʲ$$tݪk{*+meה9tQgZ$|B@ c"b(㌳AчjVRj%ern.H1 .t8Y,"09_*(5u6Ǩ(E魧@~V 7Йpwkg]uY8b!RVLjg>;E/~K??gss.d|}V%db!8PVm \䵰cp?nEJEή~&R@υ'/?xexܾzlFUSU.Yw"ȩ3i!zK$uxܞ)R-*Ǹp\}<\o]ch8F[,x~U| ,9 IDATt;ۻф!RA`) bQTu݌tCB`+-nZ2}:cccd s1N-uq<2Yann踇\5ZԻ]|u3>$+] E!0%MM ۅ$:[eE4)L-b[o!pg8z37 st?_.]bְWlkZ11LPEq \C%@|y^ k33( G? bۅڹgDH( w6[ !/ ]=]Z*5_'c;Ff2 OȩWgZL ! y>9c56H 1aI@R?D)>Y JuѶU5yk> cHӘLƐ$"a!d&w=k[Vk筷8t3n*JeiA!Zth'B R(ERpKai2*ʂ?9s!Xk W d&sFd1BRD]);$*΢;!@"bQ"r(@0xDG>&{c,}ҳgYѴ߾wagw80)?mGHH!cwHq0|hg.473y.0 ߥ~8`|J:_1:nU-ƪAxV>Ec J!xDJ)Q'-(D@IP )Bɇ,c3Z͚~~:nqum;n$|\fBH~ĐbxTİw_Hs댍&%qt99>QլmÑxP帺\3QԜ?pL%fT(9RO0'~?}"J}GomXlR~ǬB3$jUUԛr߂a>d9k,s \i!c%pI*DPh~|ya>/ԫ/rx7e䳜bt:ϛ2pw)L$Ϊ&7Ot{+ˏg notP/?Jn7dY*xeyu6*+%4!l"s\"Ȟ?YCxQ-ǐe!gE=zºfEqo}]~jWΞTӖB X*y7v.峙E [@Ȁs` 0AדSv`4ޭVKrY!,Bak!UV" % Y:>:mSR8tAgP,!$RȈquc7!@^7'NI 8Umw&v6Ӧ6MUƐ",$)\Uc.D chMm%0LӄY֌qdRߍ>Q2P2AƑRDU# 9J M/ Q^,0)wpGdxcGEƌfw_<O\|r>ާn11P "I!" TȻNX4Qv~q}Ͽ}戅q>!&$d@\W m!$)d .Xe&W7SU#xGB9f pl8)A)bܶ2tr)X^+єҎpw{avU]ܽz%}O_|vޟNW W`t^~:>_7H $g0GƠi`Z3Ek-n:jkU's[x֗9@M~{p!B*dt0rBk߿8*N @ O~m׷nK(3/߼%0 p<2vxF~=99:^`Ă)aų 'caH^lhGʦ)*)]kZ_Ĝ@@Tl!޿no R P4'g`50bR<8<rB_rOY3B0>޼m͖y!0pnkg3\.cXy Uh۶lwoɎ Zcr #6$JI?ǝgrVeVM_3yeUz\6':WWdƄqC 3̙0t>i ?ާv<oH?ӰXv^=1& A t'OU1L8kgg(vAX!CW_'?imt/͔yH!i*qݻ (dv(Η8l]TU8> q@!{sy.9=܆Ū?{W,ͨLVGr5 g, Ƀw>Xn8Jކh>'Nw0 [;6& t sĠ~3PT׷7pbLO/_WWs!dE1=83H_AnB3N7XHQ iluIǘݔY^U?|/m0mշqzm:ޏqޕZ۪<dT7T"D+b>$3LZr=tϡY`G RRmoTp7_X%bCk##PͲ:6"ԕ̳ؤs0T/6o]SˋmYǼ˧pLN)2WWg3BqM0p{ cW(~sIyu9&y3!)@ƈٰ]B`?nB0`]5e-!\E8n5eZ# Wruh6/3ۢ$ sȤl1o'ƛ<'@$XAJce6~;=MRG > Lc0F$Bq+@cҬvSt,Mf(rq>k4is8L\yV%CIfQ2E^}{{Ϻ_u۽NP=[ t>|68^1%%xai;s5c1u |r.HmRfb4zDZ'W~WE)%WyԋDZNj^T_w ?HN7']]t}e7)yLa?5&gyyd+dU=:`48pi%Q^(EJSVmE;bL{ ԥ\D!AZURZc̤wbQ\u,#%/CzkCYus>IEd #Yk./L hq:O)(؉ ں{㎈iy\Ed ¼ǩc1%#)e2K^M]?ق(#!˲qo7yU(rfb)%&iy#%]SPft{JcuUޅ Q〈dbvwכRbJ_VP*FMRBaQ.D1/er%E`y&B0;am-Q*LHa2+B9Br 0E^ *K!sὣ}`.1L[ .$"1v6$L(c϶>G6ov8>>~$̰L#>yLZʻ2&9b?zr߄|GH P k "&"d11) jO' r ]֋=cpd%$c1pBͥ-kj쏡;oĔgB IO}:my3,ϸ(ײhT^ xHv?]ߘ0@[P,T~Pe vv x}G޹|̕TA痙_p:vnw6cḛglM_]OC,,5.wKU\<ƸyHU3 dnR]3q&3I 4OyasB`~bȭJH- #)XfXcQ#Fd*y6]uu{g6jͭ!1ƥf2;ĬȐ8 He)9cց*Ӌ8v-KQLޗL◧T>oۣkJtpUx֯>ޘtŠ0n|4w,h콄*2gQgԵ8?/ C)JZĉ"8CѲ@2$WS)C8crsHH-Jq$ih-\2C)DUqsuw;O!H 1/eU)Xȓ,!!EPȲ 'MEUƀ 8)B*2%6kGw֛SZҒCJ)RGߞ/Έ_'zx`W ($RR 9_7ٽ(0$FMֿc$| Pcqq@|;iT\*T)AL6dF(A3 SB-ʻtra`W5G$k02KC @ֆYe2Y̍zK5+%CnkFgL*;?e>_]ֺO;\>o\YA]3"VSJb]HR'r`'ƣD)@X]BȥBO/~ç1%YǛGAJdc1kHC@{,B|XaLQ`ecJ[3_0"㲮-MA<IN e.('pY^&u/z!N=d9'ďS3 Ae 7\XA(ɹ4IjN(#,S F<ɥXVXjJ:F\rɆGf9x?}E0猢"# D6,]B352aw[^~RZ/YH}L8cХt\p$%VLM(DZqRD(]a"p18!BK1ae%ˢRJ1Ƹ ˂1&M7M9wǡրBE0;;ش\*FdYMЅv1qL  (MRJJ LcPY0  \+|BxIPB"9RګyR 17 &p]0rʍ ɘ8 D@j6痳3>~pU]ѧٜ\[L5U[".aMͫF%O6qLY Χqz٘2g/>7$e@a% g n7n;z-lwlUX,κfVת흅a;zEw@/u޾C;cfe"aO݈m$&,gf3bG634#1.f*AD 1nWoJ-9Hء;l3ɥ77;L);%g)e*.xoރ5PhIadPhv{,E=Y nL1%3M)YމW2')B(`u(f /α(8R3z~ׇzfe)]=ẛa}?}~Ydm`h 8 8cLŌ!S$3-ϳ'Y{vOXY@:@v0vAp뜩\Ӊ||n&nܾJl2HH1<;B΄ߋڬDt<.]\N4Aݶ]`Țxv{fU B&~لZ*>Mv(W*Y=MqfE.ݫ)9 :?Z4 dc~;OhFúu߽>%⋹N0EX7\fM.IRع踊E)ź?EWLrDL)qJ")DC4RP:1H`,du]5ѓ]L1&J%szfE1~`.(͟=͔,6{)DΊ1a q2~ t);uYcq2օ\g)dn'  UYZ乞*$Nu6C$pr u yZ  =&_i&# >ƽG?)9DdǪ#7)" 0]AB "8oC*;wA6>2У!X3Ycu |>HDRp)gR'%S?x:2(y@q!B !0dZ(e9gD!RVc4ܣxDA 3?T`IJOnAgzpdeY4r0{Fp4[hv3]n?b>t}noooN}]:I͍yͰ+>/[R!}TB;p蒙)DXLDV*X'ϟ ЛۻSQr!o_/Ӌo)"̟.`F\D8K~M![ œјPq}Y~ֿW'J87 Q>qYyLlZ-QJz)90)תʫLfraJdʢ"}RljrX.ŲHOO2mdqsUC 4 9\3OvHwQBBL"u,iL"} ӒsZdgY5zZy EXNp{ 䊜drT,X)F"S(4-V(T)+ek^vxx07i0=.+d(-$gRȠro<>zg'?/ uGWl~ME"Ժ̝wc$e 7/go^2mDlpv6q"s~ ^3q}l9Q}L]ޖZq"G:(3_Br3tQdi/7_2% {b(cID̋]ˍй 1|y sf&0DcC0["E F! DBR)S9J.t9T%s/(Hm3Bsl2ϳiS(Ly)yO!A/W^Y;B$B`7,޽86 ̆beMdH^zș@Yk70J<t!@*2+ p&U]tVMsSOmv'ΕAUuhl^0!h&NAi#xuDd9?6S:T%>QJ@(I&ךeL %' 4`! !L\RV1dO\e@<" H?b#(I$CTd,%},qT‡B R@7B& !%CDrd@JB0:bȋR<87*? '\:k}D%/y")KU/ڲR<1u "atx1i0{ @SO \skLw墔;S r_ZbkgЧc^6m?G y0`#i.EX36 YHAL='U-ED?SK =`5Ս{Rysw U.V@sDUy)4>AqPgjUxA e$E$){# gHĸ/J^EΉDt2DH0DH(SgUUUJJou II=@/iGO5,D!2NL2iB$8'( ӹ,HfbDDq&)yiHk@ L3sN"f^փTXi\3UUT5pi}ٚa׬ʈ|L|=atKiL>1ak8"_!v:mi iJ3l,+ 5{"-Z)0u{ W-̴<8@H+P̳qdB c;?lIB DJ4mPXOi4"28)xuն풒:.Tֱ, r༐2i'R)%)ճ`Cd<!xg}1 !'.&g.rx (eJJ"P Ξ%2 ad?DDHE xuyIȟ콃"ë+;M0hg;S2 "K>`*/bty/lC8<18L΅L)4ic3:]QTs˜HO?nGpM^gEF [.43{,Y]4uY.M*,y5LaZ/ʋ in2 fTE g CxrY ^T{7؀1NCf]nRo'@Vm`jVRÞu\o_l)Ң;(UKјQ2-L>=4\J"T yxw,Y)O9e % n׿zy: 7bEd)S#O "DAesy. 1g;ɔ/_~)(iXV 5Ƅ!ܼjq  "T, qVM]GѸYU( RoۇT/HeaC& #sL$cLapj͛6z Pպon`z,~;0eU5<~ܞ;,胛lmR,LJBJO@e A v;PTeY943Cc&79R1 :yڍEAH2 Ms3*Ww}8q^_lgh8Ǣ8cLhݓ#eQ݁u*4sa[B4 $50bgަȲBieT`|i$3s6l>EU $뢪iݩz*gui-sq8RRq<m/ >v߁`|uǶEV0N`$`4hU,-CO.ʦiBRTB,/s`a&o9hJτ0/qnwכu)5uȈqB.?gF}y $ )F1!p0"`"LcD IPg]19cwLW @@칽Ӑ?ɍ\#p ,zi@%,Z%k֒g^ `ɹ^D A4zcog ٷM.I3"JqE~cF<eoȷkYܡi~cnY->y{{:u*GR22C|(jih2%@aR2?t&#| w+g4ԝpJz/{)';O=U-U Gf\fZ IDATٝ_3}+\(Jx؇?&bPu^^8v}8Qʩ~ŋW?zu߿?L\B~NO ^(*TP.g9 lL^-_|qmnwޔ}qEe^6ibPJ EV̴;_6|מw gYUtf H=ס,TJA`pY?`$ ?jY Q T`KEY|;<)›l݈UIO>-Wq]l/~|߿={:/1MRۢfW`J8 (dxfw5__??egq0!VZĒU[|ܥc 3ELu[6H_.2Rwv\mlZշWry%?) ?"7rbG„DH1& D8W'g> 1~]!3!P<ٌt;*!fK)ERLq鈢f2!B,!OZD;4Ԕ1)$3;ۘb ɴK-ZHf"i Wl <zO4@krhKu%KW"RqH}Y.1DZ,`*7qo3HHxcC`#QTղ ,E?731Fy JOf^rIܴʹad@)B^httLW_.a؏y;0f6PiulYZpAE~}&D#l}5kã(!Sis[\_$~ź,bM|L1л&wvfB:ݔ5Z>>L/~7`a02ހ .qT<=n/ٗ=|7L 8#/UF'%( NRB brY>E!N,yt!Q"|fgN%~B0̒8]/_0f⒆*Xp8>Ե(JnlGy,1i~*"k]7w/ַp׽_|EU4_+;ŭ&Od.~>fBӿmh~k3BȪbVMq ]M7~Eƽ/^$!96kٖdx)WܥgzU u֪;K.$kGca<9K)b$]L8o^n~vN~7FV.iǘbKOฃyZ{R-&Gf+U}~G\zFnouUK)j%37ȴ\ ˼@PU(pCج7٘R墐O.8X"sgWZ_I?ۭab"0t81YX,:R A+wx88(/g;>2D>WP*cU[@ٛ30O- }D-6BEt|ꣷ7bfuu;p<gRZ5m ~ogo(I(x.^~-& }@":ٔcXSB`XXtcfd1dY!B)G9L>LV/ HE\0Y s "bf19I$qLp8K88>ӸU$g~:|JQ L`Cr.EjrllPaZBنXDuAa䅙<&IgU|V0DJlE*I \z*,̃cM,sS02 =@Xݨ-~ UJAQ+j|1xJ*t"BHqѫpmHIr\*gs08iЏ926Q|1I\ĿQP_6lx*ʅgɢaPj)beٔ BZorgoO$r.;u5#u'JLe$(k1v]W w_'oKlUpHu+W=ήՕ5:Y aSo"X6fOi]L %s9-.yQeRO'9:Uo.;&ӼubofCD>\:!FL# *I(EhղjΧ>y`YDT .QImGTAcrRU$pÙo.ǺEX.\LJWo|Cy8~ ==Y26_FUԃ[cP ` rrBf `8#4N.5 xzy  LJ3cTե{cH1@e43cp_ՒykC jMG<% \P/z\&D2qEL"Ks yzHqAKXQB @,gJ22~KeMÑSJ9v2!E y#}D0$Q@c`)yKA U9:~='T6^cyD``~] Ƒ(!a !d|:qLٛ`=עurδfd4+_|yq}}-0qaiJq\iBs)"yy{wū(ae9p :Hy9o:xNGh#q!q;H|ý5CȚF )W.aLWAC$%Nz#>@\b0MQ˱j6Ly>1R^~2+ÔbJ)N㩛;ǘ'?[_dDJwGZ˄u)P\,zpzB P7:z;3^ھ  gk\314㇃}t-zyI%jѶ^_)tL,p/Jj6^`i1Rp*OWy:~HGq꥽i_^#%T-(,ˀ @!7cBHLw{Z ZPf3SMOL:)Ҝ(fVhp8ޑ u޴n{0s K]_ki EtG?y (+Z@q+*eYjMSRUk5OХJWVC70 nS ~aDvǺLmq2Fe2c52R``M&LoE9?u4NWvT!:JSGv$ȳ#9; xeaofK`LDb S?a|f"EVYD0Zr#`2>W 2$΂$*k&cf9J VFz=J.aaF !I#ƈb , B1Yܓ1q6'! J6!` ' 1%{ϦY bHfR^bYf{|")R#”x1yH#DRs6On-(Ų\,gr9\YNFʋbe]$L硏12O?ai4%3!ޜQ}LA"2\NMݾlǷo:sCwo=}0x;督7Ѣ.8jqgݟ_+xJm=X*B)U" 柿tpڥbu˪ $s]t>A hTY/>o FG~2q98 'U^Ǐ]8?%;aMNg?><:n]Eb쌙c:ЮyHXRS"o97aO֍ZyΫF:{֥U]9o.r.i X3~c륷M· :inBztTwxy갿)q,^`ﷻ~ᰵ?>`s)ċ\sUuW|t;6 ܼ/p9&@ڀ,ӼdIGH'lj8s0@`ę3[Hi"ҐGlLs7M((X&%K@͔)%i ·H "5QhcʹjEjq&J&;]&m b|f1|fþ)Zh!t}p7 ..εD$%w3YByH<4=) );hDJ‰<~>@wWC7<5{|&9H)R;wBb9o_vuCo(|yqomPTEٛ/x=wQ67[lö~Ƙ2r;_Fw((Q 3" bpǪb<[Y@ =pc',^K5榻z^e3Yj@~Y Uɤ!?(VjV所7ԵZM5 㝪DQ:mctuU˿}{>(ɫ7xz<+LM݇A] 0!X|'+\\. %V/On c.)I`i 1AT53y~MUΘ)0fߵYUD/59m6v./o6X.c{U;BH:w5 Zժ'g_%_!K.TX.%6 Pc}bKe4aa,_,͆TdOSh cϳ<ϝ3FB!$`ŌBp J%oCF`^>%f2)k'h6@FFKUfwWV~OBm9"_\~ofBI]`GH<c.BkǼyE!)IHlV϶wa,k PR.D$g]_`Hȑ'A $! ]ZOۚ(f;8]o?ﱨg d{dB,(9)A8yT0B3tk}{p~˹"ׯnW/]}Z TVZMvoi]4OtL^R\t'e) 7x ӟ9l}E\GQXפ_{C/լ۟],~xѵ7~D~48Xgm{>1ЌhEtaS_T%nouM -f,ĶlE+޷w_j}-(B Y QCxܻ]Ss<]R|޾x958W ٬gz{ ҈,E A\8R~&×.x?r <$$P̄B.Va @:Ϯ/1؏9Tl P`Yv굊B@ kɋo9Aԏ}whϳ/B}~{̔*Vq6;<Ĺ F EEeN1udRJ]zoENP΁xvr2[OZJtO! fl6J}?41r7d OOgx_4({SC{7')y_| ""1)B(0dZRS t@ `D@>9޻XatΙaX2@` t&`LbFeiXukɄ=6!y)Ԃd&ˈCB@`(Iސ1(>ٝ1"dF4ҩΡA\Hi}cňrqgiR]ELئ,@PL}c NUYYB0s*B0 M)z G ͵nwMXz敔u]N9}R:!T$@uLDmOY.W ,?>]\oM[,OY.z#LxA,^V(uۯo_|p=_!qAY >L IDAT{7n{e~fo s|IN`̀˙X~s(r$ֺq{7cJbQ*B+-R<2C!x8RQYBq䪊6ŋj٬b 7W\f'z&7 !ϭ0`' !>mى4Iq^bWUeuv-O*igs(g܇iG|NΘ22믒7LۦTg󯿾_ }>Q)I m; ]{ВB*(VsQՒatDTy)$azֵǠmdu>T~cB]gU9k]{m3,=ܳ ?ݧzx`'۝!Ȁ#e-wNG#qxN` Y| 8yH9Ϫ$TRz;2/Y]am{׻xH &!&`THyhS-Vj>\'=qM?ؾËrgEw6LT zO{W I# B-7@ދ^?~9cKl0BsgYo8ΤJYy&(UE. E[k10MCYepr TsL8!rfe)qpYm:Ǻe F ,Sr%Y"+\7X&Pi*,k(5 0F4EOSU,zS.ԥ ͙۴޶d}rh'&hU=Zʲ{@*>nv6h TW&UtDr LJ.9G!c',kls;+2UP ];JI3F!bC^,TXgVqZVl 'Œ7M}/6?! kn"6XV3`LVy߼ Bl-5aCI.DU#@u}3FȰZss0P aq|8z*w{Fy12k~D$"ZԳ`K)ruR)r"SDEIN췝?HUzeUܻ~k\ͫna$ʨTXbSLHUjAŒ!-rBx)J)2oI fbicRG/lYϥma*crONQz'HN7.K%C$Ԕ"5ݭPq{!Cnu*8rkTtRPP0YyJ0F[ 'H&TQUiLhr(+&b<'bH*:m q@=TFypoMp-b"7"aUh?5tN9>: M`^b.G'p&>IRL&on}}?zHditm| ДW$/O,"1vs>ۃXA JQԙ(Ɇ$'_[ȿNWe>uݗ} K'L ̃ 1L5噜f7o9ѹ1&Wg *?\4Ŋ_?[dRJ FXP|~m"T1B@N!/jQ&ߵU_v_}ۙXVW1]wlP\K⣵zƑl]*2\$rv; k`\3U"bMEFY0<'3m-F R.W^N+Agܓ򗷫y/)/wf;A$e~*D)eO5AJ.WxB'w'''+ "<B~mA޿߽f$ "I8-5tӺ.")vqzܙC À!tVNnPjz?"6aFV`JhFtRpwwCQN<_̗b&WPf n|R/i]s-d\topyqo!YY^Z#!8_B<`PXDgr6̻\,E!8Dhy7f'kڮWZU R/ 탋q}y.182[.ZP;)F@\ݛ[+5_V(iVav6m8%Ōe]a{|A* %?/> ;=Tӏ7}cE*m4BDfp%2cj n܌"@kp} [+AwZ;6l*g әqb1ž~/b[l9u,944+: S/.߶C3&OǛ_}{A,"/3"4 h|I_/~zYU#p<4gZ3iſݽ_'A zǐU*/,E}-YWRye<$c/^rm}x'!XR%)Ǽ0d  9DHtn=?7oyb8nw)5Ty54w`2Jw[]p]V`3?_'T3 L#tx>NǨ[|^lŔ?}T&8rw|s̒Q$<qZ-vSAh)~LecYʇ7_ .gGˏ_H1ovXC_TTeq94_ɓq0@E56n&bљ(Je2AMO%{ќ usRBGsEVrѕE>;̰mk-V ITVkyR'O7AV/S-IOig tB'0;#e%@1!`(GDk˒,uƘ WX@1@BLb!B c{~ 0 0Jv|9?GB`%8\Lq߷>@hm٪("{suu5DRf8R2e=[D'$(ΙRG\TQ(`)ءc$ TT@#(pLY` rJ1vR8Wg^Տomh1}MFJT^?.'eGnX  <ąA.QP";]JȢu?q&(US>| !q8$kqyo!E 8Xp\ZQΉDZ7 >E.IU'mw>],QhOd,]$ @J alƙ Xʬ MI3! p<$R&1ap,TU+Ӧۇ;Ea׷a3E-^| w?K\՚V (g`~'@1a-Wi07 (&7!!E~0ݘЄRL`Lo7w@, k}~Y/:e|)&G'3>ѿ}ios;lINra(@}pؾկC'`d6 b]i8 :X¸} lx{, zuQY%y_`CQpD v͐n~~ ?^0M,ЌfC|*K<n"AR0HX Dw}ylT 2n#qb-!II+h) ]J%"&S>K)g2ۅ@iB0A3x[fs-"bD#O*2ѹ\d," T.̷/A@قKM88GW0[D7wgjO2|Y'3T"lTP-"`#C;z8RJM$v P4#F1م~w$N%'ч|]nJXȳs-]IHEVf_~UD)w}| F f&d| "M1ݾm\.gg9 n|"0ꌭpaHD ƥ!ˡ8ib#Fy-OQ1^T:S^p*OIPװXq)3r]ɹюD]g_>?y)ЌH^L9Z dC2 *J$j IDAT 'Msu@YK 8z#҄40]$29[ɀSg2S%mm@P ~:0zT}9C$i$H2{)U @ @ۉi)M"!$!OR$H ;W\weroH #yJC 3fLS8ݱIt01$* iy"Ti"ӊcbDUƢ(Гiަh0t6(# < M]<YUcH,!ĻSX0B@(! 4M]ɍ[s9I0J$xxBBy,/Ȇ`VK]fλ:>*Tp.B6m͛T|,RLa 0_ubLYUdYu{7e.Ny7xtLEwFgZ ?G*b)C`0n`6~8]2o/~4gcAYz9يܾC]h)eD' zNLa`".E)xtH,`8< &qQ:&Xbs"(`D^ȓ>3/gzu]ϿP;9/֭遠8bu)ͺL2)0BƱ4;;mo42F \+1CH֙Qmn|b7Ad7ouW2B UxCԭcT}Y;UIĮǡ] ~۷KJS1p g?y^~*U!C?U³uQ (竮vR2T*V,S. ii')&Ѕd&(%pv%L HFRH1`zZu9њVuVǻr~L&57`1%O.ycE%SO{Uw` @~>-45"wT*%I a|D O:-q7oȼ.`iJ2"SJscJHIWe-1Gx`L!4DZ;(z}Ǽ\II>Le݁@\._\hntH=쓏_:ј#R#HVa0B(Byq1qƄ؇_.x]BIrW.J|L-WB; I 1oM>;[x#%G4Ɍ,Y5.Mz'D6M4%BcfuWYF@$TKk1z`Li aH.FOnoA{$[r ޸2Eef'_ %l#v;FɪJ}uFl9ei72DplcwG_3?Gb D[ȸ/E/ z.՗_Y.?ڟ~7XMp*>{/ ]Kj?9TyL-# 8w:n"dD Bҍ81'ˉX xpiz3 X^dB&&dVxՌ׿yMŌ 7_?IC]z3,ͷ@@Op}xvǒ~q5>ygx1ahF@qfOIDHXJy=7:xY1i6ˤmg Aps9_4aXm`V vi5yvqjMC7Ye,Ƙ"7NP#aLr\vAk(smOh*v{:!M폘|6 (u(٬vԮ;I=k k%2it8ugjrV\q=??^.έМu9NG zu8|Eūz\Y}N)cbȽP*$N(XYdj/M])&d=!l퇡q>47Cq}>.L^>`sƋ|kmX/Iwwf>-gLJ.R[͝*ᄁF)YUsSej~HD/R~xzz/Y]Gۼ~{;JS5UŦ]=y|YO^T?]H^ƔMn蒜E옜$0Iu>aZ,n_9$is8/~ǟ2}z<^N?z|11"i`_c^79ci.IJklOo͉2/;C y0"H1w(D(`tApAT?N!"<1Pn}]\qL$<-B@5š!͠`VƼ,JWy鄂"Jecd C3M k)9j;>DB+UT;< H+qId@IYy;pg#U`AJdu<(t?bx&Fve/`8* zL& @!N*E\a]7,&92ct8 ]K>FkClAqr3#xr6[y^9[?]?hqxegiƧj~fjiYN cѧ0m"JthZYfOD]ݏbR$dm' 1F@?P*[fiR rR0)aw87b"p2]DDžj #@`gL8}Ty^rΝ3ˮ93 zc`B;-Lt< So!ϓ`gۆ/ *iz=d{=zy U-M''HvQ%gͩ,qe6z)ċOժݷqLfp<+9KZDɳ~_#XP0ssI˪RIIsH3BfYR$ 3@{={fqC88]0Bs3KY/8yl6/xRYa?N",Yݾ=G@Yr:?ɺۛŧu*~{:"EsRXV%x2UxCS)x=-7_mUk׿z=voy"XʒIo BYOunc5-g3pc0d,o$d>K9ګ\;KlE9$p`q LYE=4@wDUdM: | FzQ.7(0|ϧ%O+`;o5;p8CfJog'Ӗl?x,Ng==!D"BD >nq $AI"tiE4'U6$²hC̢\Q"Μx/,;λ P/+Ag'YVQ blZM!U>Bvl(&xd6wzM (e0JB`lY^a۝HQ*zt<i!4N"ryf]-u lQ^n~66;u}=⻸ЙC L4c`j 흏cg?2Y& AjE3jf,i|qbn41\b䋛k=u׿&i=˛øGH2*$RKQU< =}.BXU=RwC?\#,Z$€fySN eLG@ͯZ"Xh^18#M`ۘ$X$cdU5ϓ09 0L`IryOة,!M!Z,HKx.|uNlTd[ĴϽTBKj܂4!%['|]!Ƒ R^[k_]YuӡݫRTmnJF3vrfYl>8ǨMSzи47Lzv:N6hE y}YAR>'5)>y(^`K C-Xoތ)Y(#X]ǭM4ơȓT{=5m1Y$VZOL"IrZQN3o4 '#$Ssͅ(l拲zxsfx!c(K =*$Yd( FsBdSd^޶tO5U ʄ)ힽ5 N?eg=ٙA34hMDy;:?|< $"GZG!XF? q':[nL4C׷n6P`<fnP3X ?q8s=&.vC9KJ۷mCU#JgkƇFGK90 6 XB][QM"h1D{/<*R$x_X2SiKizȬK((6h %)HEH F`)\אi'^d#*{:~C]j.OesM=BV3qԝ7jz6UvȝHˤZŪNRAd9$ KҌͨAKdS~,ix9UL '۷&;ͯrE!3@Gixu+T}j)ifw`9 t^QnBz0't:Ҥ^gB%n0}:ۮI$7Cu~?͓'haw~{t${xs Yp{(!M2v<ɐ+?o5B`ۭŲ<]P(ᛯO( AʣK:71n gii7aR0^9շεmCQJО*6k-*63Buv)OC)uO!jSm|>{2,$lGc 66cv,v})lD|uQfb񘗔pqԢ'ʓń2wmkhƆ5;7>-?%gm3Z>O AItg4Ћ7^hS#Kėg#2GGXS/#H4H:<҂hǏ"]̈DABP&*`k矗Uh#1ܽetXimݷ{+TTBtM׀ Uwa^rzzu `|6{ˆh%Fޱ<ȠahB!Cg".#h hK+<e S5(Ȉ,D0(UfYQTY$/2dYT͸; 5qh5Zv03|=dU>Y>-n"f%Meei5eyH v74i=T)\-n;j95woO_kx mQ~!Zk]לiR<}R!QN9g2DΘɋgO7v>8o (4Cđ\&yeHd{k{^đDꙬk6d)Lp&U3*T}kb M8 c$˝'mƪ?f2!cD! # 2)8h'MDR&!FHয়\<9C0[a^2P&Sf3O { q7Yݶ!>N~YBzO8c]l0Dn4 0ЇH0Näè c4a{"+8>C UQuiD "PiD4=~0utX_Ӫ*.8L7" ]k{s<%$)̖`s'OvDZ%ܸ!/XUռ^$#1_:sܚPEQ$ցm"eYbUipUڟ IDAT"ե\.k.tw';d/4r u]20ǁQNj (Jv<~QMSl5Drt*^b3Zo<m|O~{qvpn`DV0R:^]JV+uhqyHf?rOF0n;:D.6GIf4x}RC:~u!X__{;jĘ`S w΁LqztI>vR2Nsq`^U/y| x:+Yw  Qms +,D: PYm>mmY !YƳ ΋.VYڟ4 iSN#pgdhm}s}%xG}>C1JJƵ,Y5>Zvyg=B_Eq޵o?jV,Vl\޽= }ʋ ? DA6ȱ䥋? #b0P2 #2!CDda8 Üc,+H=Dvo|P]FA(0zߡTX,S)WoO筱B&!=n`@JLs&8MCWj-.Wve]_3/~ݾ{787yO(k\Oө?&Cq@b2"Y׊kj;׸ p0#YќLw/#t.$(xhσ/b}UfX=E]8gCELQxGޒw#'b DRR)y!Qcg# YDJH!"r>>#Bw.11pQ)GXO%!b@(h"c*nb)F43,6Ͼ4_ڈQdsew* {? 7/q_y H >!1R w}|g>> tIT DsT/4CLۋ ^:-rHD֞Ʒo0KyD\lIzV+Q@A=ϺO6MlV N7"T:4P*Mi3Y"acI8gB9 PYڎ[(WmOm\y16tjk*|M1C~H 7O\#C1G!c|G*<}(y\WH@XS~@_C^oxjy$B!R7 5GBB^U]vtї@zm IDQ(|ԕh}:j3NA0$1 dFNwo cC`m`%kd̂b{lYdl XcHUn%2WcoEnY*^~ _,+y_BrR ,rݶ]8璜d ]-Ui?uQ E3B@Q&K  W4N1isOdU%Cޛ`#Lf"/^>u ,CaғQJ)9"s1 cΧRE;zml0L1 2JYxE*`@r H!0o~`"f"Iv&7L.X2.(u 1Bx+DZGWxX 0x:,37RPbYg֙q U꼪njNcʋ"lc]?U5tfM0Oi>ǽ8l7J+ -=l1lLǷo~s:ge uIKwbVˌ]__T3t./+GBHDRk|vcT&"|ow zȐ3& xQ0D _gW;/^yC H'#x>,M7X[HtbՂB?路݃wycw.Jenge%ϬfoBL9%(R XWZOMGJ h0p>P)R: [(%O(m.x@,2eI40[!DA4Iv~BP |L`' DDB0$vг ##!r!1R*Sa#(P 6 ;e^d^T}*(3F&*؟{AE#1)b67bu4g0Jcb OAü.֗ж~h)G^J(+uoL/vX_ M x ^ %RQ&\$ =ށS2,(y"oTN00hG]Y׍},qx23]yqLfYa'IɼMJ%gNn6^8nw޸LQ4>f wޏP#i'eR]'w# ucj0T%`i0pHL=hr6'FiD$.8&HEX‡k %5~pbaY$2da}q:<깹I>Іwf y6全߽%|Vi%g1 EM`9TbU$P߾|3z,s\.|xZyӴZtzwY(iɜ9&e)1ϓGc,c$0p]SH > R-we%,c8/j^VpyU8Σ3~*!yIӓ~s`_"_ bxǰC 9CP|@ AEzG]&W{ B3c}:c8:Q1\rpmv"<%>}__YMCwvC"SX\pJ%0bw8#i׻L8`ދi49Gቢ\ 1 ˋ |l@D;vGkD`ݿ)gi?OB!$sD"{"`Gr%mdX@<>N;ADH(D 0@$  "F#`q}HF>:39Od#| bLSqHTZ d2lU: 493%˫LYL%BPCYQO|觓}r`GǼY5C;w\-כJ{;4WFIΑA 06mJLrUyKZ(ݻv.GS #s4A4IҶ4i,v6V;$ci2q\B5Kz!xDqyhx'Au)$36$i&b}a!%L˚].R8Ss>Z .p^D,$DI?0uRN~:V!cE 1WL e䜄$8zb!Y=+Tvrb^ɪ9HK}{b›Yw wjQRWp8&ʐZ\?eeEݡS`SQU@nn)_H|9He< N V`o>ۿ~~zxh~-f!~u wCskFDdhwE)G}wuXwk ,aGG>C*d,6nau92{>ӤEUd*X A aF]^ )=iHpĈa`PE5MHy؄$aHHC@cB^L,ӄwĄv%>d9L BŬHm7ߜM~?wIf`{Iq(k?h NpG|Q i2덶q$eBgGzn5=י9kFܺ[qHecs$x`[(宵{񇪺Ȧf ʊȊ(O>3{@;_qh#B 8G ю1ǿ<᣽!E 2,zw5G ?{r8g ܋8R#&\d}`aQ5~ > L5EcR],Ky^mcUS{< Y0Be}8RYd˜Rg_ho#A^fx7pY_noj\],!׾9캾"/q~O?w.4O1"yD0 |M6xZj]^\Hiͻ y>?/x|&8wpLS) Z܉E!L۷E1^>Y/*xӞRDF1#гT'']o77,/?/6->LE3`&'OBFRVfX-T%qz@B.@qМ\fdq^$ m3`ԥ,ߏ䣃,-KP:B0!%3ݍ0FkHj,H4üdLA#) !-D1Fbggnixۄ[{y>E_dM0`G{:!궝n}6Ypߧ  H~W/Veo$EW7߾&y$ B޽,^yyiLۏ[n>ϊ"Z!LVIQ2F;EEu]FvUvq>o^ܔD4tw !M̹_ZTϞ}Z4 A׃1?ڻq~11uYFllVOY,uc 9se%,Wo RTc.`Yu+gl432_[{i!&/ygO Z\_ߝ7#Y&2 w0 ׮ߘV˶=_g?ܟvZ޼n߼7fh^ΥE!aE4a^iq}Ӽo+V:ɩ#|=U gO5!-g(9 3> *{bm㹥Lfǧ?`{va#F"N y$332? h Ih{C D"r}8D`Ϗ@ (8H@ ݟvu(VGI `RDJB D*!@1 x!@kqyY,z;ƘLiGpJj~nO; ~|"}RH i웶Au )D'm;qWKsv׻ph{h:ſWe۶U:;OA'as O8ցZ2ƻ-(bJ7UWw7ib5|?82I"2KeRC;\0>8$gUUSom"gU$xﺛi"g15П3~S qfJ)3өيf$)48FY`L%y \x) 2X i!f:a,(8KuV4動PF1ZFf3 hz-gwr](C[hj)q0PeYwmzz}~gqy4S?z.bӤd%3sqw6Qӫt۶p K~~Ad m~B(AtQ,A9#1 c߹xI56M7I|H12 @,ڈH49_۩˕e޻@gn-sYl~ggs {Js1/S v}; yθT`oMT˂#{A@J8<"%20ChFhQe@o8tS-bS/A|[D!pea ט.D$H1$O0Q{#B B<`~A8ሏ; 顰?ށ?|(>0A3W`|RRĐen7DY9 @BDCp#E`,lɘ8@jɤ} XCeifbrgB;oqiW|B~o1&.XhvB(d 2>YI"ϯΓ3276*fwz2}tiL* Pp:9!!M'r8,cQH6 0|>ln*RZTd pCY4+VU97qpp[덋\($saH8@C*u=9D ƽs=MF(ٚ[|q$#(ɫyޔm?qGoz%]dVlʸvE`UU\p]xYp~,-o%p=K" cuBYǯL-s\TsZifM"8CPgU[wVz\)T6|d8"?8]b^;~2^^Y~SPĜ\qP3 YcOlV.׿n&5hE/_pv%O{c&*s6lfsyqY/!((f.բnۓ>j&jg6+cCk/m,;pfX49V(p{_^gW\ y{W}W/~l:զb3!M}g9Wj={q~~Ei:YU֧q8ػƥi[U3U8"Hc~F-˗ Փ2kSk޼b<{^pEvٸ7!y]{o[/^\\3?˲Zir;[x_)d#Y~\o0-Jve5<`51[&!(J) %c=fah?X%?X4xhxN3H|[D`.<fh囩xL\|rpvTU!4RPBKiԶ.TuqYy!߾2qHfёmڸ9WypO!N1@d A$#,V$ Hh 8i $,w~4bzn:??{=Qи_c~OBrv`Vya?rN$2!xĽ䝿g#B F1h}p&=߿E$R )y(03I:#N2Fda!F@$g֒ #~ J>KO~t!0x:1J,JrVhz$M -jd轛;** P >ZiɶÐW|Q̾ U"> g!I7;zCAUڎ,d}YȏMo3dGoY2K 6rV*9w|A(!"Меͤ$2I0F>^ "B!c(s6ƅƺ0`\r'7M٦,M7Y"r 1*)Zb^e(&`r\jiF<O=t*U)R*BLN#dsXSqB S>S>@9]2-LI}:;kh$S:NʊI;I}HsdHjRk38Aw 5^^7aQlǙ~d>.?}ʊ@}BDPFW ,ÑY'2䟅pd2&D$L[q6'B}{5:KE3 !425Iy:`tETz|.#s!΅sƍ&."Rdi%iLJϑ0=2nֹCG Z`hc>^ d!P URfxc' =1@P甋2Ĉ܏Am?6N$@G죜 }l|?4OC@$Q*Lѻp<"Ϲ>0!f̻8 b|HV·I YfSDPI׹~Jy,EC3S"r8b^oMB?,geIf_(]T "6M=(%D0_cƩCYhe…}S((~4:pxtMVe/?_lC Lg9ywCL T$/W궏 #拊3.|tMۙeHv6o~3Z/?ξ7~DzgEj61|zSno{ 8ՒՔd0_'sۅwv}Qc|_ŋt7ۯJv49End&h;8Yݏa?u=޼o6zNX1Y=9_un ,g2Iy^)s$j;h {'ϲ\ִ^üY~0LL)`Ǩ$(i)We6ǃ*Kq anB s(fybyVg0/ҋ/TU]p3>h5 }GY.~3/\L[+/f8 qm @1-ͪL0|޻2xgđ}`;8I|tסW}ȏ}W6 +?A&" # ~34 2Nʟ(g }t`_/ϟb䒁sǃmHTy#Y`Xpt}o6= S\5LmJ1m4i>u~ "RXD9W2U93ގs6FR\ (b\ItA"iU뮞kl )e _5cM~w'B$IbCJRCp3z)RB+b$cӏS `y^:OY$0~ d$8J.؁l\RD# =@.3ZdNM{8Z.Hc_:郞`Zb!P,z<6M=iTc.!S@ l K (F3ۭutʊ_rDOۛ-._oΤ֝;t 4mnlHh6BLiN]c& aS? ƄV%^r.w #JS(qFq.6Eru1_Tx8vׇPUYH>Fx .d=-Kl'W䯾ܼ{k Y&gy4띫,h} 1K!/iCdUO>2ۃery\&n(ϖ6=8<_<vް(qu:rk%| ǏHvo# (z >?<6P&x]dq@d@C3~u`1oݝطh>n_}YeuRJ|M'RNpa&ߵ~!bdmbI™QA6yR& a6czSW#ms`0w\9: 7`!b1YFks?"qI0<ٟ@?PA{scopB yg$H y4N.PZ&Zs3u׷!D@<u–giόm7vђr w;gsrpjb=( &F3Իh1ht"?H ٿ΂}>QPV{;Be.V\tc" PHD8|- YAͼKDAp'{YP Jqx$k٩#PZwy:|̫'JB$kNm8 {LG9o~bvbE)竤.DJc gXI~~ Z{;J&pNjM|N\_cĮ)AphmL d\ԯ ~77w`\ DLriusdJ<+}dh P)%wp5ёe:XSgE6jIgHut&AU~48IW3 uUQ`" oiG_P f1E|y+ȫɄ;z-y*~A#ﶻX |.j=klBF,ӳLٛnl7OϪz!O)n7\m}\O&4#" A;@3c1fWQI l O;YWr.TmF7q8R)-N\k(Ra{Un|foD,t2kO7㾯Y̝q:0ճ*D0bs^fw[Ǹ?ڻv2=8RY&wn2 ۢΖS 9>v# >L!OZa.Eu:)Qbuy-Sl뭋G"_zd/UdvuYHr9=+aݭ~~:B|xzI>c"86!XL1UٲIP׉s5qMet3΅PDL"P"UyGf22-Fl]V:WfBcRi)*@Jǀ BHTYV \Lbqtq;+8,W̴sFr\:>8+f)pc0S@=Mޥ`וGpAWy&r#O[bŵ/r]]! .z1Ghm-6b#0Z`')減;˜trˊ0a",q>/77@tyq(?W~va4`B7ZJѭB׿n^8 7Udܞ]' xdB4'K䱍z0 nWb]LwM\A Fd~*: v86G~w%ކp5W2%qG"p  H6CҝBc) S`4%LVK^˗Loߞ^,xh\CVϞ@:a8nXLYUtw;kS(Jò՛P &?28p$v<(c 案w ;z<,Gp1PKInA|&"I@:8nK]*"3b0yP aq"uՈ<: c:Db\# #wZcQ*\w귧O "'DŽBH gjk{Ww5x@ iʒ< TH=``OID# |D|  Fpi]b=?,z?Վ=ܢ?BT%L}+3fv GP&A(PR(a8FS gBe2gUj9+fnw~gտyyeY @@;Na(VJcdBJyA%xh (@)`qD4Ripu݌C, l fMya?z(Mc*skw2}]O *=!?&1`v~bڜ֚^2Q\3$J*q QDT2;@,:/ F <؛]gw"8J0D> " GmSKLτ}Y̊é6WR*eȰZ|FgXiud"x/DDNal I.U 3f̔Xرi;3hpsI~?5i7,ɏS?EFB|}zΡX9GꆃX.m9򢼽mـ]LS*4t$Ĉ`=@w6-b|eNms|eq%@{4YeWz{گ̗t6M1bs(?h 4tRpD5PmU 0ssw|ﵾe]p0̂΀`0IoqH9 +yU[__m'wwZ>.D8UuY9OaK{vfՍL@%\kXqPwo OH1xģG $`_Je.y$CHJMZ(b!+{+Sݗ_+\pB (2IG{ Cސ(.m\@⽁=2l x-u ۴pք}%xWa@2o1U! ##@1M9zQP pbL@g-LZ(5\RBz&MڤD8f9pw Jp4y4!ZSXF)M( K6kuSo#"R4cdYŨQ,i EVMHYbscB,G&oK)7^w)w?NaJ "HIk N&$@#0"$MiD$5,; ~+0@D-Ư!1B}۫4 F+ư*y>lhr!n]L@ I@B}Д0!2\dUH9$h~7*aM~8*R:1"xۺ`׏_яf؏#)YI:"Rp "E7RF{sw4֛j!QO eǠ }NfUOo?e8zg,3z1"=̉j۽N ʚ.6٣Pơ 90fyF )RgQvuP*"HQOgu^ :],˵LDJI }/TT +} +4PmA87;`w!^.s on^ #g!?ntM!g9A]/t*Oۛ㋶Nww\3o~<^bF|(ZpqN\>} b&JP,WuUqN]4޳ګ렌w CWfYq>C? ŗ,zqs#1J ){O3L 4e:>(_4X5!0BGӝH`ڌ8ҋmZJ}?$%|*&F#9c߫-RІ`$/2Ǩn_޾:M ) H)hgJ&NјcXB2OqqfM+?Y\>α!e1Fmc>k+x@+J"2. X7o/*iz!1ZdNs x A<9ALs$Mn">Qq2 @H¸1Sgm]%%澷Z#"05u..Χ~E&`BpQx> xHcH%HwS1=jB Jhd$ч,ɒ y pI$D"hxС5Wt711(u@S)˘B wo, pγLjдU(R8eJ9z2 e-,s@8_:E[Ógh<]wGGUM/iF "(Kt,w49CBCV,[}+&Zg+w?b|ETvp zNUDg-3a?$,͡ifQJcͦaN8&@ږ}7Lzyqޤ\BmSJAJ`ȶpf!bV@ uyj."~? /b҇ϮeSo?oM8^# _??}ϧG}̶Z^ΨY<&я.d]᧏-W!qネ>dM?TMwdFP`C m:(Â}eOnNzEw@l<ۻ]w~+_-u@^~ PֲnΜ@(YC.e g<wd#VE)+j{ɉϣU~YWjZf#$J)cnx_C_}?('WjZp&=3;,b7WU8ݽ$U*/r^Uv"Q9aiN~?+>w aā<H|RbI[Rxȟܸq|򄂏e]"b !ij8$ RpMspXX,:!he9E<$L,Fq*%+‹" FGH iw% De/x_~uvP-YrQJ~'o0,y2! S"FI#Hu;/HDL$!"`wž>[.?owID:iSZ_|:Mjv@ 2[W 3ryS$YQ/Wz^.֕$RDjRG˂'ytfͼw2᠌EA$6e?tdKUϧWu篾(sN8T BK3t\TAu2'CI{'6mBb_m8=MJq$];~2q?~gB -9GO >}L`C칝ܜԄW4z$\9e8c c^m4$)$.sVWEoXlMRTwҽzf? [Cap8Yԋ7L菷yq y~'?'s}'xso-5g3V鲌+Y^mDfF)+rQd2zq'"L4Rdr#ӔHs1|]Y ]9;jC<5Y}Z6oi5x|~xÏ7ug@H!MSc%U33{!qt4N?yќNH\%1(=5.dsg +D'w[&9-ik Q m(WEBf"BZ" U /YͲ=;0T8B$^KawCH Xdȸ8McRœajJ 1'l'SG_<3+~x>(D] eH%<1P pM9_-# 9U?S=d [Rr Ϊ;_<j ͂I!Lt]~(7X mQ3bۥ(_/>뛚<. ^1Q@PǀuE'ն]x߼~+UX8myιO }QbQ&?R3U0ft%ƣh,| L糦4aL ?Z׏>h׷; H}TY;)(C$ʁJ"qE^y?nb4`ǡY*iDzO')JaF^j!|2~F BNm/X_Q! =d_ I߇ >Tr)\b +d,ٍ>U)Iʩ}("#&wۦ!NƘ-AN0 Ae b| >8!=1aIe I+ˊAK%$cU YYIE~{Z Z=Vs1Mg݇SHߌdޅUA{ .eh=H@1BQ0)xdz%2HlTH 9䵲<SY~Zd%$4c4&MS.XJfilU4]JD+FRJR5RC'lTS!PNʊ[%9cS0FXrd4X48gk ?;%%`E=Pr壽nAp@)Wg #RP0?B `}rqbTvݳCTyy4s!%˜s]w{ ڤLJi]gB"Ncfy MAw# ƀ3$H awAVXTGt{o\pnQ .̉ 2VpZA?ޕoo7ץq{̍< /ry.R@k㽣c ơ!y @-S?pRJ\ZTXI)JՂ.f8g!5@ zfWy?NoFo,$,+k 콶dfS'%ϊ '?}p#碪 s:fO_JmCy&YyY1x;M UM d.*[ul֍Z=Z]AhN{wڳ͒r :/ǘ_ǧWWtʱ,ps l~/?şƙ X]48"'?~.9WjXp*m%wنSѤ7Bg <0FqR0d;@\8}H$F\r{OZgE6|##}̥y{əǏ}8|f 'O0}wȬ?\TDDsr/K]瘛+_6[ oj` @ۤ:!BYN> b!&u)LS.\\}?ޜO~8cqHF joya1+ RU48L@C1B if{BRQ`Q$.h%*#X]BUj^zys:j:/SFCHy`"yKO!t" A(q~o{U 9? %5-{^z) &Lч zECtE4,$ aNoC SZL)ZWiDZmum>|lSfVK ԗE[/s' 1և-KMELYŔv{B1 R`w?=ms]f_,qKGJP1A7$aՏno!avep־~뻋Mb%ZZG'4: J <:ͱ^Z\ԛuS_]_Eή"K$܍,E!?;>~Wvt/_oSjHx@a"!Y3JR#)c2SWn?9qAq<~ɋP;h/0H]@Ͷ;u!Jl ѳuM 8R͛!TeZ ])O?ՠ_~1m۫8G| y󴻛O#UUUEyc h1vgEK&V6Bx75m@A.b` rQ_挲TmS՟ono_ɟٟzqQq@kF8u0@ Q^gyD!&G)M|~޻/Ԥes/fu`1@ N~&~>UFiU]즣6!m"Pd`9ORHMEukaa@1mY{ȧ ̵077Ю=^nJcs7x{Ɖ\ںIa',+֌i4oMVUlpZ0e˘p]4pΓ+/Z8bWzڜvۗ/0B@GnLCbBE@pa &F ,:44 <3ge!BPB4Vks$e<#ū3f(ap4&LE&.3)gu8se \ӲJE& `=x }fh=7~R"OyQжn`|~x\Ր27/  Eo?BQ"S#'AKŧ![Ǭ,fbU%'gBJHpI(г٬(иp8 nlt2H=EOMZ3'O'μl%Ƌicv H9bpQRt'Ra pW9/lI1@ӏ9cY!Ef8s\>[Of*0d)١s۰>Ko0Mra{xgSHu\]0.a:yι\WVF'TN<Ƙ$0ts:4+ $nGYIc\3rL%tL"qe$Nqv:7o-Ip[?C2\˂A 7lwށg DtJh^/,a}!ewV>͂% !f36 c7r$ύ-x6kd(E2+dlQ\\M6U> Mt|zmY*wjLr O~pb@~B.o" 'ſS GXSO JM"q~4km36FBT9RVwԶc݌0/IUĈM. ɥ@*` C?PJΣ%dA@Ds8BbSy'w!-0@UbV=֨ӏ*Z~XC@DR16<@[S5 q3=xtyp_!A7fh0@q_nL  r!{MӴl'Je~7cO@r6I*ٳuQT]ߞ/f7_}]-{ jgD |$)< "RMwΡu\z& d X_=cORl<_r})%:'fX 3jZb\/4M?աF!W2""GNmψC6ħHϸ!ogų|o|( 5> &TpٴpnjZ|@,lV^\.Gdy,p!b\GǤooH@x>瑂ZV!g EZpH*&tdifڶuushx:;#B\晪aݧiv뇖n3?܅~W``l)SL'RiY&#)|*dAr^O˲'?蓏1fGƸ !̎L8B={o2 Ի1 9w ">8m! ךߘ 1{*y#W+}>ܷ=uhrZdD IDATB$yLSJSed3؞u,Ite:C;(XŪ̊ΜuQD 1(b^fJZf~`eɅњ($D"0"O+? I wC1"1$BqE#c!#8!zBFGdQ"0`{Q#=.CA$1kC?0z!IZ'9gg1lY*HRQb5msw2Yu۫T64-x \։LьQBv˂-\kg"ALgr&r g\VA|r۝oͷGd(FG#@xBe !@V}mEE i=7K\cב72ItwdE2=u|\]Y%x؟yڮ8-Z.7B 8Aܰ;(آ+^"{WuS/ѳ矴 SZj}qu3BPppf9ߌ"p~ .A";zbR~}~_3CUeR~o:B,DrY'b3Xd^)&o۠,X~>hMu2g]WS$F(JSt#Mv<;(TL}UxVU*ьp&YM%}m1 H5>"y? K !|>8·0b +Q50=ORB 128Hl^t b SbRY\dR}45ELJ x\n1Uk5r69_~hכUW_}磛-œ4 "A8&:@ƑxJ(Xd1ɼ [/Jyj<ݟ^߆Txk 6KYI>vJjq .Nӧ/iS>k8TCrZέ]Z ppbG}Ȼy7x91%;1?b6o]gVK\fZ<*n htZaOv߼~=H\4v<$Bm;tǾ }ZaH4Db SFgawQb9M'I)tI(m;ۜ?A,҇,N@ѻ~Tzt>V2;C +y$ 1PC BG/8*Pt\,.W_}t>~ێc˗Ŵ4#y~Mv2ϞZ`~ "i>]ߺ~rtCc}2޾:)) u"6ΟBT^`L{fh){۱RUfbfiQ"6ztVrwMgšib B3N0tM8j?Z)}ۚSZMb'PK./ҧO:gU&̨é10H)Љ"M2ߜȄfl%\{g[2ELreI$H3DhnRqD/ e4}/P9 O0/?/ 8#q[܌a$2*0OoV&ɔcca& d$X Ym޾~B35&ZrBYBezZ_O_eLr'Yofryd[#pM]c賌Wb F;Z.b#_?_ݜ ]`"pTj hv{? $(Eij`\q\w->M90aJ |@5o CNC: (xht$?FbrralL@ !J0q.ֳ٢pޜƌzV@p"҄3eXL+DBjRfY1~wCMbwsݾiQe!u di3 i#(I g\fbQMrhG$K*JtCHZp6XIr c m=Xpk~0-/6n4KEYMd5c=<ܷyGINƦzs=竢'yhLf%py5ᴫY5_,=PH$KkM*z%$k,fdzd I6fYzRjoxW_&ϒ'OVJg{?@q)hiz"!Tf^J!k!KEǿ_O~1]^n * 8'<:KX +eb1{WI՜euGgz9z'Da8K2)؃+D/GgYƀVt6ݶ.&Ttƹmf{3u^~'_W:(p{W|O gضus$X.t?Ɍ>5olOfXYJ&k[ÙXZ̼_#[,&t~u}w \u7nzy9̄!rzcEG>[ < uN7~D *n{?V0-Y"ˏr1mֿu{$-C>"wC'c\0 8)!R $G|$y1)g6Jt6YF)Jpq;ؐfP%Z&ȑ;㺮~h_ru6-bOASzۧ4ٙNu{QDKu}ӁZ@YkxJU";nuE}icq!`@pO)?ijT!\} J@2F, c jЍno-r3_.b|տø\Owƞwui9gъ~h@@ Oˋjb--4ѷc3>Wd΅t+~O}9L+9Lc4ɅIϪ*ۿշ'/aV=dB&v/|/>b|wMs\1ݩ䏫ϧ vw8ȣCw_| _'? cz(.'/o޾f\:rպh$}P-vFFki .b iU4؜:ko޸ %Y9yzU`/?t_7?ʵf]K{;Z3; ɗ FJRy]yЊ ?D~c\(=nnC7ՕX,__w)NvnK޼`M?^%O8/|{{"vU@ꉇ?G%"$OTHU7۷o_~}W=-LNw Qcv oל&NaA`#ٙcXF\xx``Z}sn)=1j"yf}^ߜoކ*?-sہ֐,R)ś7o޼9r3_zp cy tEF%Zk18]%N*Τ;r1E1ƭ~u~o" H~W- ]L )HH"~E)/ #Q|D CAtu5fR(mݫ7s4.0Zq41V>nL{s8XP^@ւZy\L$W)@HȠyUHct 1 @ھj,ssۑNh6KltO"v!GFi `s0KJI;${O$(Ȱit./&yp|}b5 ҜMgӶkMEso4!a Ku&@܌>DAzt8uN*Zdfƺ]|6ѓ:F d6C@u' 6oqs9JZG1q ,rYCs$]^nj٤ך=le |o -PM(|#nw`bRUߵBdP~cg3 >WY;dk0qRӱkNVHek`<# 6k8߾ySUϋEҍoi_\^]\u !ZO'mY|lZ|xaZUu`][[M3G/TŌi7w}}]sBi e:x=t|?ïK\\?Wd^Ux3t4Cf:eU%' I{jZөK/Xs&.洳:Jp:y`WoS |dlgO֊U]烍dm_C Z#\chiҲzAZˏ#9 IDATY$U긫fP`xu~ǟU}Cڜ9@O2C:y|Iξ~}`\k's43夂1?зQ'H0EyH_Ee^c=U|`F7t ;!axfPh۽ zSi0D|ZH@J3o_=bŞnY"w~7mL/q\'mMu|^J ]Hm ZCD %@TZVE9DB$,pBp@Y$97"",nI&CY/N2?R*cJˆ9uxW:ˆ^7=6@:MM4J%w=%""CArYN8ڶn&EB$ɻL{3P -@1*Ur"9}脧ND)qܞ@#`DY3eƏ qe*u;2UYjM=@ddJJc{zX;771Q @B$A߁oP,OO>J$>E!81yTY2<5+/?C}ܟC4 ?=Ի!,,$gZ"MݤT\dR}z=gͼ9\Z@ F>ODQĢ0:7Y!@pnM8yMPQHܞʐ8&|yֺƺ,re:9nD"qbfS ~w[g|9XM#*R2~#~ؗHC {pey` ޻kɅ(e HƐ5=q9J%EDh6C&`\2b)*r]J Ҋ:B1:G΃a1΍hFE%Xf$(YoƾwwP$ȣB "ALvQXƎ옦2ѹ֪ȍ]"yËKΘ=]ߘfC7FN$9&*kYyFp؟ɅAt]8X"WOxbde)~_T$uo췶>y<$J5$NAcIbw$rϼ5<^UЭRI$p7-PV:0N\r+)eAҦiTpC r߭v,+AfI)cIEL8*FК0F3bu7Tdq伉"{dbӺSFq ibV$2Tgޢ]5GH8Â#R{:V -3݁$H$Kv-\ xwl`N&2ǀ7."EtTUI:)uu\D}E.j۶04ol}>{?{V^⢨Й9;]xx.(uzRȄ&8vx0C@<y.d=ժ=~aq$Mp;;H6d5g/s4 Jmv;VFivWWI^znnv7=¾l=-"y9ۦiVRZYe#v3͸:2FhzZ)F sbazQInP,*J(iRALʥf2va:T"C i}a6z3(-x f{ooB($!FRΓf9ѻHC;Vc24W%^D0. K!<2UGq  L%at[|Op( g$Iwօ'&͑ E14EhY(Z|$dBv>1Ԃt 2" yy.v71Dj%xP7Q  {Әdyr6izjhS%ϒO?jxM}\wI".NC|Skpsu n]2yg$D0!eWt_YmM")1궩Qt +1Bܥi:XLh1IzpEbL.MV+?X"fh&BVg/X ۣ˖,p-ᶳn Գz/_^WR貨Q*&ҡ=lOb2Li?8'L8bzV;Q&}Zwa}#HR))JDžJJvKY,Cgg˳|9oDK1sQoF(ҺӉk˅+ jIkv3t{#-YzrbMZ/~n Nz<ٿswCV<^_^ z9ǟ0(E}y|4wM7_}$I+|#ҴD O8A^>ښ#[u9\p{ ŢtqA ]w}=p%"'d&$Bsɒauַei{vy!}h6`t CҗqaKNWwM[2g|0#Έ&'?Ƨ/ DݽSu7.i=[o{M,y'8w+spRl8l"eDoCoձL_j쀪LH]oIjnFs5Z:B6;:cF.0B2F $vH[bS*C1-!ˊf7 #6)G/ut ;Gqc)\jlj;;Fr}} $-,}] ^0cD=So=A^\)i⊔&)xg`h }ՠlLC>诫p?CQ<~љ-0PhâĘ: .>FD`XDpDLQٸ2" pk v0LnUwF<$u{t@!yTmHd8#ppUэGLd@Akf95Lj$Y;{w~U9q&eYbV; pYe’$vVeC<%1cMYE:Ƅ9CYiiHsxM'[eEFw(F`mB`XJ<u0Dۀ[PU&U> *(fĞ, ߙN n4h58}Vo:]תiß.雷_oZeICsl;GrYL.߿}{WSÛ7}*xÖ\_;t1e=tn~_|_~/9Bf!-$eUTkP7hviN>+mFÏ^ge[VrqW8_~%9~j}W9nM%Xy]F}{8v7]CfqBΫrS?{bYˤ''Ő|_oT.!a;UTX|r;.덍r\X\W_n)l^xH+$&w_/^]6uqyaz8=ϒAЛje-xaG>0{!!Aw΢(Y׿:=bʅz)>دl3PUd %A19Лվa2N[ݳgٯ-D)!zBh{1R<)b}XO>Ydvх@}̀.1F# !Bb Ƙa~‡nDE71n 4pQD M]s"#I+m:uqc!:gCP9"0{} a$YF2"WM,r1f.@TߛZyF#%$Q렆hML'bSۭ*a:1 Aos8c2M0uZB)e$Mbs޶L1A5p1R?L*@VIӼxooz| $I`_<477ŏ,|>F7mĵm }]Ty|{㯦X~躾]zObh6GXse<-Ѯ>p8)PTFU.=yZقp.fLm٧*gVCS.سGs}۷^Ye}@STb9<4(9 (J~?fðZZx>L.z3&|X*,!$+|jPWUfyws\oN1K%{ܭL ^nGnW|3=<x<6W_f<挗,NV7+- n,όBs,&=pjDtTSG:j[n_ɋ2{OO/S,v7Zk}=C ` (#ʘ<:ae.9`Cwc.rI&cXy.߿ ?D\_ֳj˿}{ժVO2ċgٴ<=hgw͋Sb׻M]TnIE!Vw\sw=<˧Ye#RM&\H㧟?'l{;-|,BЪ 'YϸVh?Ṗ-zp=X@0u_淘B<+,(9Pk0gy1/_߾m da;L,9fc6Ո4Z{c6}߱P3NZw7ƙdQ)G@Q@xoR_>6Q1 j$>~e}9@H `F,x] <(#r*&*aǀ P H5*!h`!D6aB;Kbu^kc y҂onfx&VAs$J00x1N9*{@`ύy}@FDQJ#m:`')cv> [Uɹ4!(M]:5IPCQ#6[ȐfcD(aL(;@XJ7 W*b9@%s&,ST`\tv iJ kFG?hl6嫵l1qL,eAc@mFsBDyq֭<6 6x0]jAF`pfwN$%" HyK\]wuw}q2O}6^΂2 =e|ڴ viCL3m ,A61ՈK=un GDlb 8Jݼ }ɰׯ_C~y6Lj9Cn׍Gp퇮\@(ѨyT?goz,??7ua0i1ezFJYd"z]oIFe)₞A} 0Anx=hQP᳟|q7o'FeVgj\"7$B*OxvLvn%Q IDAT 29WGgsxEoW}GH A g4+($vQft6n4nsYj*O?9sTmUDj>=_|Fz_-5 VBQ B[a%>,ҀC}؉_#!/!S AQ׷ݾ e9cDZYc!K 9TuփL`cʸǩBTwB|[~0S;琳a{"#n2v$ŌQ.>S>ÄC%B(`) 8FQ=^1ƈ]AnA8, BbЋ/PD,Ei۾^#1Hh\ZB|LӔ%3AB7(c! $G(WqE0nzo #1((9噱^jhC@AkC \pG "裵Gcb@rl*#5c@9r:ܯ."!B!" > Y)`rɄs4eQJ)aAFCĜcJ` ,&)&+X_z% $Slw[2)'gӱ_oo MEҧKׇ^u>$8&!&Ltig#@d=5p_i1 D<R m?y2Tz:CDæg/TIpx ]"cCa΂uzw]bq@T ]7qTCaY&۽b4faq42aybv} E U|ϺeUh"Rdiڜ 1تo*1(x$]o70٨,zs,=dwwzOE~?}W7rhuVq]MvۯrHBEҌ& IH*<6R}הE^VEU1XraАd8+ExAH)E>+XV9|v|)mg/g.,Kc,h^{on|>tqx-ó'Y{N}2JMly9ɒ9wrqw[A{u'|) ֌X JHJYǮ^;z:Cm^ށ] ( J|(  ~XgJS^bBq>°<з\kalUo..]cכN+( qA1FG0!$hCtEh䕨&ccTZwWxBuL!( 3Nofj?t>&(Ə cẏ~ݖ+1aC*ďL @) %.z(‡(D P >8C8FSMS&(#ԥhV5;<q"_<:Rîk;JQX3BMSuuĀHILN2,`}$@ E¢Qp}y`{om8ʸئQ]k YF"0tc ]#8\T%" mU|@yƊr,cG(!4Z} 8iJ Z=tB*Vj*Ͷ}j=[ ۴bLC-#6.߼^-b<3}j$˒D lLl4.1ĮUx|7/C\!1C@ELIW01 !׵Cc") ,)2*>KН<:?ǟW-"c'LL4IaK\Ɉ$B{pyGVQZъ{7w]@1=ֈI8N# g*Pe퓺>w}dx(dEEjz2uCPU'og~%HN_΍t}ko#mc k3@ߩAyGIBZp]_3m|toPVPEa0Ԁxs{]Tafe!ܭ7u1""C8f)E;b! ʮnHA:=]<:qmlQnPPJH\t[LM>ڣ-BK- (aLO c>}X#~;+>8^c{ "@`7?< r` `Z J" b쬷FQS7.P,]]J")%d9λ~pDӱȓ;}m9W/a>zN&@68ӧe-6ȤY6etzNJ0(L#a!2AF2 08r4xws`ƸLxq1+?BJ)*ZRm/2I t̪Q>@D8 0 @ q(:皶Yn^9W{?q񨝇 hDhkKFY'o^ՍfP$9e8+Q)IFq7`GOr86YDBZo-Ms~n?}>0 fӛUt>UFz6z6M2sN0D$zg FRNrqLyjMPytFj4 _YT~8tϿ{3S67sOsoE·&Nm]{=n- ~ A[YT"cȦ9 oᛗɗ?/&_{oealt~1GBñurВy t>?_ms>MX{hHnjgE2;"!$)}+$rOONMj.ޢOGY:v[8v5'0r_.3~-Nq^gi巖?A"_~U>BZgy"Ӷ5a 5}ʀH`:BG{ݷ0=Qkpم7X"10`i(JY]yfUFafČ+c5<q4~0v@dDQ4 67׫ S4&.XH%PN$]T5q6Y輄r|er8.X`fx|vr2~ϯ{& `fqhv:-eP qI')BIƚEUNsmk1Ʃb;dY2_̲,znצ՜s%c\ "!L91F\Zv>jJ p<4 }tfw i)yv{lwb"5 \uA77hLMWgѤ ~WL4O55 Q"zm7!-2A Fb"#H٣r3mNk1:8\ƙ9؍z=ŋlۦ}&r U%1bhkC (Jp=!$MK :obUeϟ~,TeXR1 sӧ#&lR )W 8/]woHlYQPm>`!QIX1=B~WיL0PzܷG]VOOfn}Fno_~"}&YRջl8NGծ<OL0Ķ<9Z/~߬c@A8K#lB~5ZsB=={$6߾Vƣl\%fc2}mݯب0YTScln:gg34GbY?yz:h^imSO8 ՇSAf0x2) O = \˯p*5];y$79B&`Tfx:qnSøBD)o`P8  `OXĔW{bRTćcĦ6-@(! yucʀPp>:߅ B#2~w%yoMݍ+NjSD׸~22!1ΤH N>_L&Ri >a8+hSnoBOl]_m8IoAOu7I8&S=?\' X[j?XNNyT!`_wܱޛ/(wW]Z͆j4LBiň$ZsjĆð:>l2M*Vސ\;u,tYtMMEEa7Ӌ ʹIt1 E P?FFoMw?l4@!a^xUwp٢>я'٭ۮ;9jfmW; \KcQʅi\fEMbb8Ơq7:ع ReN[RH!m{|G?R)#?|*8FC'dVޅA^oje-MS(fL&XJtu^F9&(`n38A!׏.Wv'^K2j[3hZ%,4잇{Y% =ʧH 2^ DB 0닥TmʓY*{CG1fΑq]l:M >P#⏨?9)L94#AMh6Ӓrr!z/F1H}tn#@"ȵ?#Pjn2빝LUye0vm;44M˙5Z@E7&fRIw00)%HMjib#{}[^,S1R\J2X"Ϣ\I` )BL1QtG:Zޥa1@N}#Ɛsږ ]ߙYg3Ƴ YHOe!Qs % h eAO|q!8i VnJ唌bȐAcbZ.g&?CKy?PB(WRpΘZ,˙6;:Dߑ2H eB3d2ܝ&* 7ASkIv㾙/*"F$9VBX E?rj$gDS(l&ZJ0ćՕS}}ˑp!/bۺƋglM(RMK9Ӗ3ZR0>v8܍JF\E`>Fزqi:W C~iy՝rZq;4]j=Ҧ9=XzBqqEZf9 G]\s7nLJ=}>09rn79*e2fМrSʜreAy].Z.Z; H=6<{b2iw}b0]Fw>u X}߽:7ǔ{2Ηz(;?g'>F{&,_4xQ&mQ"r8q8.Va?bĜqHc#RGm++ФюF|.S#x{s;SwuSM۶gb 뫰@ (3TF'?c!rHUkly~rۈ6B +:LQ뒓:]yB'/J Z7Zky1S!10 B(qJȸ"Q0R RRrMƐ0#-Fw@(o|OC$g"IO̐2IX I3G&"N#?=\@bB0,.L1YL)4RLT(Ta4RDރwl5׿}q&3P}ԫE- Lmf` ˅22q3ʙ2 mv`M߃R\Ȳ4DslNncJ (Lb aa?Q{|)-7q7%\ "W7RH ']`QϓbJ &</N )rN44 0"1 AJaAKII]_mo9//Bө9F76Mo / 8.16QƤ˼jIMPrrxtYo|l)ՈZsƱ{'>:aB\ޔpv#XP@|9 ]hb㇓k\ -bH T.j| ~X/i &tL9;ߝ_^({OS(J~sSo6WwaFiW_;wˋgWq)3޿oHOn/>BNq1\p:ewݖ~ ˕/0M߽3E1&~!+6 S-orcݯv۬feWKr0&'_H䦜AH,xYͦ60m>ㄛ~5" IDATVn+.5< Sr.9%XX*Ks>2iIy3u><<|z&>*ZGޝS)I@agQۥ!>o_9̖ukb i>9]\Y.ʙ`@?lpǂ6Z6!Dy0\//պi[RFR&PS̑Inw{T2e. J1&N) e.9|N|?fL#H U]e&6a C$)hY9%h-lU}:$r)$.`o˫"4 }Kv19"r& l>yP?4ca0Aߍ誙u1A&Uc~x<0re.JYJnHQDeL)RC3/rE OjeKcz 0ܝWp{|87o΋ }zuwVu\0]#SVDfSZe=_^_]?{ Qp~Eݎvq/jnbɧ}ջiu Ob}يs-C7OtzR1;/ݤS dV/BLcso<빴zq9]l{[iD",1.zD`(O,i>}qsl߾mTcPaZq?2BS΅9`W,֠ &@ ]!8in7qSHءǔX7NL?cg/Lqc&VNE-,S{ZrwSYEQk\\.7ǗCXIp pǿ"3ILW-h7xLsoټ( яc{jR꫷~s6׈(PjhO0+r \H܅Hc@y)!Kc760v@h3w>)S# bYY1ƥx|U4!ٍ>&ˈ9g`Ȉ9「Lri3 8 |L3ˀrfab观 Bf^t]\]۵(` 3VS]UzE9SvIp^/O>d'LrD>vSBCNHѹ}N&l!8c!0eD1Y]0dwۇssN)@l"?'!$).笍ЂPiP01 w;?q`*8kk7.6R䫅hNΏ9e$V79d oYXdĶmOi x~2Gv@Rxm}7dq1Nn̘ Uj ?v19Bųg/J%fan|a s7m1wô{$ !E*D.ȉd 9H2zb7@-䄗Wsp>} XCրR W˕5й)WzQFqԀ~1ãHc6Ȅ,gֽ@r&ӹ>|8={o>Ngtvw_?6_...7ϟ|q{_}ww'n>%9aѦHSLs6bUʲ48/lFgocY/g89Ϋ\/(ഒ43gFwY |g,'̓smɐB)!2@$?fq1E!1'WBA &]bяJdɅ (۳ RRΜAY0JmMԌTJ)*4}OoeH(fGB]y܄D@> $73LĘU\pC`L(ŧ1vm&?2)c4MλRdRʇ} !q">LJ+YLCxFe%6R9<<8NbƄ2GS< 2ѧBҚYUF( !N.}'<#yn+6O)}7>}2-R|dCwocrtk'-H毮7_s~EgX@8HԨ^cH1NދD.&!Nq>Dz.L%r~`VjVyPǘgƕa)H)D!4g!KMS~κ+k'Wo~-3h0\@!h@b ɭvYp)3 U".7?i{}19Ǯ.C;>ލq-ʢꪸȻwNfNyyr{ HSҡ] 3e)ech16k܄yHNC2u>矕O4dA̖E@˕n05|wwn[d]ZT|>GnLbsb/84Ǿb(E7 JgÑ!%)|,?@d9'r ڏb@JL< 00Ry"> 5į.ח&K )]jYx쪮V18&Ap#C06dO2puXgRjӳ rP9]k -1y @۬w$$( "P C?4l^i;?4}>{b&>tqEcSFr0`&#dcUܶSzL̻3ZYOhVM'r9e .)SycJbq?H>|pc)Ib8$JBC8l?mfF`R3q@0f>zN?fNSãs bȈY+F1˔r8c Ķ($h+sJ1AJ!wC"M0& \ %JcK-%gSS0N !f>'u\^^0 `'?! 9Hb g&0M>D(*PI28\ 9DBXVqibCQ0D\.W3bsrm7ӈFHR.LY-b#BX!)T,[b8G\`$s4P^\ݽ/ʼ墜vh~ mchgs+!MS >n'S_Vb#)J*HT=*hTr2&=&xJ00tRRBt8HZ_X,p11_C;: dW%^LÉu#3;O7TJ۸jf+*$պP3 R pJK/icXPYbL4λˋK[@ƾƴZ͔)y"af$d~:tmw2.ff&rO0Mirk:w4` bJ9 ZCQ&i.Н&E }빪Tqjv14Mwwa07ö||T %DVϔ-5M"`f_? Q@^ wg}Ƅ@(ѹ'vl*hM1@b\I&8yȁE2>41x<JQRb')~~SARv={b lYEEvh;D aLPYCBׅla!vM-`nemYjSJV]mpV2"b)iꃟ`ղRRa 9%p ",!gQr Cp1ҙsD!yYbSN !)r7'b>m@mbvueX# )hQ.&}虋b Q6a<=c데 D!Čy8|X^C j^U lɵ%^\ءsy bV:?>Tn4g>-.v}W΋x8#8ܾzŌ+ȂЉS(.$? an `Җ0)ZVmb`uO9RCppxYnr1kÛ7א̄t<{l^lt} &4/d0B;UEӌ];*EՂc0<4;?Tpy\&GfGWճX)7%SGw]ۜfe V33߰>tAd@ F3`,H#"q-QpxU9ЏR L@+, 2ޥO)'%r qضxDfBkc10!j]btFs@v8LDz1))f)qݯV#,|缋)NZkz!AJ >|8\_,\:SrdbC#Ir:BJ3#jsf 8 Bh e4N Rf.!g/^f<}} y~ʛ(,rL:RYp %5-M)iémp~:eD7=bY5*'>PPas\߽NËy }P:.W< P25-0i'B q:(T`,l.JB VX4)q "(FW SC䶏;ԝO?FF10E%_LjX=7oc#˪X̌Qɏ d,$OFkrOiWrh80fTV%0Saw{{ۍ̚Uz=qX]r.cJ@b͹B%6 q{vJU69=-}Mw `gI)+,,uW8-cHn{0Bddֵ.VZj2PW5i}߆rnW y ]xc?9bLaKkC{<eWK=_(x.d` Чw?/?uDi@\Hy>oݾ} Wx| R7yOs,F-r^oZ}[X͇qb.1YgTV$Aq)!ϙR "x1Ft ԕXfJ.|vc0N9?|D;/'ؘ21b@hp сG*a|3<fH$6cJXЄ9CB@˜Of$ 4D/ vQK)Cd0xhFk2OBv=M=YN0cCO*2e>1yǐCKdRQjI>1)A1{ 6E( X )et8s)s9+L-WV(AJ̘bSa}\0@4aWK^U5kp:eR+ΐwovyܬmQѨ0*xx8O"Inr!R9Ei3E&rap0V7M=Ly7:oyB MDvy,ݬWe9w߽;y'u9tV=[Js=YBs(}xͻ/~u5_z!׷~_ØI@P(5xEM/wx~x 1s 0nhAJ(cU -t:?)zZ]])y8tCjY43ِz[/BESfrLZb JI`wq1V\1._߼~:V~/ݻoٝv|Q)a1:Qx<Î6Wl,Re!i>_' ĥ6's՜pP-Z0yvq,q>~cwNu:36vw}BkD[J0\,CNVc۽z|k)/OxLD`4};x_mJL}יky OsAR`4>/nB!HgGm%=~նmy~xgkpW IDATż#PF).pЃ:L|c;}4/Iutu[̽1yrCp>11q\\#)AQ4JR y-U;(x'@o}tunďw!!ÏrCJ@3#2#fDcx8+"$&@h( gcENslĠd a33ܔ&-3e%7(>扞߾{< !ngOEQj)2X\,Ӡ8#pƚ&c͕1v> $%H<ȫ6UǘaBr%%}?M#b. .͑ekr]\\\a<М2|>_fSӜێ ج5 ,+t~@]_߈Υ{BVG?CjԶj%q"G9(y)~0WtqS^_-Wrvh1Zjyϋ%(}L  $p)87_B^^^\twu=/fI/]:P2Ĵ*m1D` k)=N|O#ؙBPcsiD"ݴqh0aYm4I?)_~lfû.as)6؜ka8}Yx?q=.!m}p籂,,ɜ/}hN>xVkWռ:Y֐=3߼;GI9}}G&}ux|̌2!xDFx:f22 J=}VWO!AQE97Ld)la}x<|VՕ>|;֋j9f]l'"B3f=Nm{^Qv5<}i6{_}O]a&ar~˅R~x]owďBqbc6"B@@J ;p?=iNlǫ~1fsha7lwT to^!{p:󹹼ч$QUY)I8 BB]qvy U5|C;@v: 1d%?xj?Ӫʟ-0 Pj.8cؔ 1Y r&g.1ID!dYa{@1a"PΉTF Th)LeY$dL82F47 i>PELv2|"/mv%ToƘjcá)ZHs<ĀI7:SȺqh8@"OnWeC3=rI`<rئ 77  F 7}{ڐ`%)pѷ۳O4y9dx8 'FDeX4ȕ@yBHg4jxjBQ,??nTYh=BD{ȉL KQ]&=Bcz%3|Ƙ73$EY\Cw 4B~BRɔDbNwgnReSo  l̲|Z <}O5~S 7jNyaڍSt،>cHfww~4hM(>ќe08OԪ&ӁcʲrV+GCs P1(fwpFZ4sgƢz%wk)x4;tߏgKi<:G9_0ֻk bNNqB#ۋ?|dSvW4nlls .-TZ 0yr-=YI ! 4j7u4`nl|Lfezy֠ü+dV1!I$*^:?10W ]uիw>S\Jnhѿ\-l,A*6XlU0)Qp8gvN]"[̇!}|u{sMRB^.٢҄bAE=酷R6dZ] IV^FS#%[fap>v (l_\5~E[`GtC=+L}.I%0#y3QU& p?03K"gH Ws ҖZ8?v8`%څI()8Cbh)뒛O- yH3 DH !@D&@ϭH! A`1bɌ0Q""2Ƒ0%H0=-Ϧ54&ƞe1cx +rUQr„ c`' dpiВo7ac+-wgK1)h|+ J3xҝZp ]7 L'n (\3 Xb)ĮSJFɑ4uirSVz RazFw#u}l]!+)cLD,t4|#8G8gXg .$$$j*E`~@DNhfGd@,BGQ;;tZTrߌq@JR}A[06)C)0Dɠ=q) \xbaʲÍdlx:/fEBAQBUZ'%g*9~}y.D, %L((Qy*%k3NjS-m4Xlт!DN~p%JDnկn1bvݭ4)LB 'PD2% _-bɹI }хE-;V.N uN)nTj.jy.Kc3]"y&Qfb\rEnU0yJ*C*5ij/r\_AqfoDJe>+%r>L2<=T9."4\7cx$C뜗eZ-B%a|]W*&*KcKm2uޞ51!$Ȁ FIR:۬J>W>;f-wA/ EQ_oWqjC,}1elDnb{o?L\r]<9)`A`Mx?1D 'BpyH~%hlfڰjMz8pb9GPr)D;nE&k30#T2"80%&1N =VAf#)kG;GF"tYlqiNiCL !GaV#"bHxA !sسE01 O0uHRhÄF $D H@  CTgIa~c;d1E-*=C I2` x `תg7_n}:OO\)ֹѺ)OI28QZD)8k=QL0N5g醃Ƀ6h 2)Q\J@vm~!yBRqԊgF D!Pxc8nw,Sd/^p~sQi16FE`r?$HKF" ͒a1Tk\.'_N}P=ܠR`evэ#M(I%WGY HmXUTЧOEȌP"^0?XLLܵ3AZW/^.O( ,W^t\h}hc!j}.Ydr΂Rfn禵K*p }$"Fܴ]_>c2-n',-x)yHՕgǠP8jԦsxyͤ8 qFa<#2gR X]l벺ljx:꣍Rߍ6"[(KYEtk$tw+d{![/_~~o,…sHP`2\-ᾱ-\ԥqA5OEָ0%qjX{ALsZ kO8( Ug=dLyqVf|dqH)M\fE14WWyS{ a}6.M>5ȵ@ 9̔R ]q!X}ay@ ##7CpԱx>7M`3)rNvqۥ'9>ٱO"H YyH@{~#BDٲʈ3QL[<$1ͧ0%l 1(cl 0oeDnrbB5 rY%כla9AnX~Js\yJ#eYgSOmyY.KQT<h| Rd1%9bAjPBp,#ޓQFĠ9rHlf`2JU6YSR YVáC G,rX'UXJNз@;x"gqw(Q0-YwԶZrbL#YVcw'wrR܌_.G7;Pn~=\ W/ɶ9A)vWcb~#\N3|9޼O) yQson tNY>N$$%Eg<~c^ 2XTf0ON{X.+͵t9Z7/k|r]j g-C9אx֋M51lT*+eӺ%i-VXyo70Ncu]8;~:\{x ~se>~yrr5-捊O~:7)Z(_~︘kTP!E\=N} u0)˯bIܗgm4/ i/4ݶ9}4u׫۫|hSb0 gs8)x`oA 9Vy,Ksx?7`XL"rlQ q}{?Xs{zv !O|f>mzNs1xV8g ~ń 0! 1@ c|,%JJI.M0xw!& F E7ikO' ba>c/X1#J|\HZeY) 5 _z}jhg?Bs2Br =qn4cn8zW)ELThPXnzj[fKXh;ZyVr4\90Ih Chan4$z1+8vEL18G Cb)]q[,3ǽ;Z3'@e`=7UFpN1\gUmzf_~f4?_mQu/_u^nG~qXU_ ;f&V]~u~| SU炯?~wUB~ҰU.7=$M& _} S\dA;K2猊lDH^qٝy_۽ɹi.S׺@UU Zq4 X@U2.Y,5aZg%Xr(e.'-?}wz8c,q3 :G˯wo|5a~x8X? d,wR*"+,Ҍ~}O0'!&P/\y!?wNrTP9  EEAH]_;,JBjZr]_ /z,&>0FhIcHB* c׻>a궐<&ɺK;W \ˍF4 }{>uDu\FE8=d ^z I1x>D)OO̫ Tx'0"`"D" ӧU|i'@zޠCbOE"!%xޏgA>Ey0 D<)+ݕ]+6NR!H-3cs!4Mi%BLA+<LPrZbUfE.8LH)P\`]s"!MrK#43% .dX"-m LcD):p=ժhbJ2bY@wNv(X.1LZ@9|0Eab)ӹΝYxuW䴿Ҫ/G`g Rs硙G۲ .sg|Nv&q;jS^]2w>+Y~w/./) %:G%RzrR3I}Z5<2T&bێ! !YJdy{iOOѺ;m$ XgΤ41;:$)=>&*r5zƦq1BJ)؉LCcs0c&.S,`>DLDN]:4YcuPlA"E^e>r\Z |WK\ŧP$m܌ە0ܐC`͗򳟙^鴿7vt2M^UzW_wߎSSZU9'{2ld뭱+mK7b*C/ V!&! 0L4*o?|ie4<\E^y^,n[lxFi>?k\Qŵ]٢LŲL0?Y\'*D(ѧ` =S3_,B?QEڧUL8z@#WThrXU|N} #iOԲUT(bL0@)FwS IDAT&|")iL!)*+`<&1aK".C"6n𳍌CY gHB27 ^-3~c"011N8 u#.C\[EV LE?1I0bM,YH1H@%+&䙹)㩵#&Df X.jHeRCQ!q6]~CKc2 '!QQqdU=em2#&3)+rX)k":?C7U-4 %LՂ](9c1E^UZm3ȻvX/p BR ɜIFFcQe1,˫;͙8O:hDO) qm EjZuvV1u4h䛦Hc9h $Msx36+wxBDe@)]fa^|cȍH1DY.ru$E~فϞ^U{R憎3r&qf:Se!S{x!n7h۳τNe1U@ucX,EY_En~lڶ#{N,4\֫XrU^zs~wde3 Dv[s.Bٝug]oMoZH~aVZ2 S)LփC "1Lf7O}_ʳLf%4R$n7iQ^].M1U)e)9My^E1Ot`fwo8bvgOo߾O)2ov8B^,cyu yJ)3uws*\jG:?̏oEmDrL b9u[łf-2KNtN'$0lv?>.3H&q!M)& s) ,!QٺT\R*$R !D\EYb]y]T^NԜyV(I]Ie $ܜإҕch>n~ Ͼ @@ A@"PJ!bB@ !#F" Y+0>'\Ag`b% sƀ$Y"/2ӫD /t$bRv]c3OlH䣟b@<;TԹU]FkFkgk}LQ (!91ZdE ,<ˊyc+*k, /*\kʢvZbbDyٞeE\b: fZLtr.LO}t4)E˚gUfJSЙ,u`=!& !LH-u\r<6օVeXVY̰)jڍ&K&7/Jx7֢JS1B&ruHSNX89 !ҿxB&rU\Z s&{S2,`zquyݼ/smߍ\:5+r\mĬS<UEϣmNM|5^|Q\4LZȔDetqJ/,rp8S&L]jåoz+wyqo^A1GX:|Jr:>>&w uo_~q2RF8NC#GD⒫H>zp}T?}+^EgK7MvuE`3=w]0m6҂`(o^N1))aby!˼ 8S en]Ui5xGGkyP<,\0|G:ܟ}ium2+ԘuHOp]H5\sVqcfH,yV!E"C -YR0*a~NP৉9H(=z2gk0'D@H >kSp@g3"`rDEŷrօD|>jHi"T s)^e+i=oj!nK0u -0%b6%HHJ^m?=>~?>Ec2$A`I49V+mD1Dއ-qy@"q\IV[lϧ 2,"]#_βya_qMҙ2&þ?] ڸ0ƇA A^!PSu}/Wkp1%\_5qbm=[g~_:fX_UTYn7:ˑRnꇱ`!3)A}EޕY,bit 94KG!$mƩKO|?6&n^, 5k7}"؇8{|jenp:9FҌ,adyf$pA\3V\e7P t,Aq\ 6z>~\k2,Oܱj9w)VFb?OkTl1aHĔ`gnE~6<F ?Jdepzw%+߼ԊC\a,Tuf4#A 6Ed7n4Mo77a5R8y&(CdB4R,27 \S 笻yaKөu_ Fqz8|{ +r/Ra6E8uݤM/ˆ`⏩ `tCT\'ϯS7ȧ) !ː6>O(%\Ω(1a VR y`R4x}+Jw3g<rEOJHvΥqA32pKس@[Q )|Ja,ooo7>۩e&o^T*p9t7+b(2y9r9_ntV a A:)#A zEQj|8~.8,CMMpʎl6 d9oۦ1B4 qˢ\YΛfH]7u,/Gԉi1$ؒT뻿E gJư;71LmoDnW'zYOcE2Rlpsh^@;p BU[&O8,al>>?orNRvS)1>|SxJUYsh<&A(i O9l.ژ!9&@ؑ$c&wq~zjhϮE>x: Te7Eb/oo4 0KY/˱- ]-j!"7\,©2mwh^տ4v`')`]d'K- M?OdK ~HpnDU y`Ԛe4Y ]3ypڟL!KuqwƤVMc. }՗g:Aҿ_{~vz9l6+aj3#tA2,+jB]C(qh_/z%ӣ;@K,T^KNrs&EvZ.չpfRĢ0qEcw%Z˪J)/\woW7?.xXCiH]ߍOuu;QUj-?_7N.2?rXWŮkʶ= U ]:ј/h\§e"cT&ӥY4MJȯ68M3%fT3 ]o/.gzwsbq /&.t.Mm@E^_rci!rap̈oG{ :ci=;u]V~Q}xD:y%h"_mȀqg`IK[V<>ie%7Z$m#<#L"ޝ FY=_K4C?]oFE]E_~~;xۯm<,_oW/L !z3Z@"-fDZTclǵ֔`rs91&)o6WbDU 猒v9?~IXPH1>% ub{hZ_6傾⋇CV-nX42L+?3V8]\EY<81gar.>S;yo+I^}32kf13A U/$Fꥪs#|ͪnCV qZxp"p9Lg'E޾yw¼bnC&ϟ>9 ݙJJ{⒔v'ޑ~躦BVL\V|Q Cno޾_^)| ôGg?/'31t"s왔B HB]b0=r< %ۇ߼z1l˦#EhwLTA3[;8$A*IׁĈCL߭%}"_ozC4CT]w[(,Y"יִͳ,%$ i;߶0B3Ƙq&7"Oj^rƺM6 FCs2QehBڶ~>1[Υ:H|5+0:tm? 4!X2I >+ 8F߁[p|8~ JB~Q)x  B(jr1,:M{||.Cֻ)8&tƵ``:HR Ƅs:K48#T8%S@1#%1XcgY c@ %3BhH ΅(Gg;;1Dy@ |uDSG@&ΆPS*$yƪR͎* kwq]^y EnJlj'h^L\O\b!T)`D nmg$4%ޑAs,ҜfH&O6('Ѝ{d5_yU7N(%01DJm]2ݴ0`zOYY$BPqL$̫.m~gO悳Z} ! O/r%vefpdst}NrQ1IuL&;( & ?~~6p8O8Dk՞F'7|VgrRMV+.h5x)r4]RIT3l~&pkͩ6Uþg^H=ڣH}UI HJpJT}zµL7[@N4]-!) R8k3j= c'/_ų:7LLevu*ӌic m[z;*eZaf2%/g6 Lˀ nv^b}r?ٶ1+l=m' ||rr4ݛon0v*j. l;B0Ӥ[/?hYwSz z&]7[{{=9{8lj|gU5zHUi 1WѹaUDB&˻qD2"UWW^ ^lӄv J竓O>O42=l8`0>)r,H1R#Dxk1IZ"ېDPT0;jpt;7=P:Juх{4XO$R1b8lv-(h%C$uQ$dzaC!hB8cS\D2@' )pa&;F76)`p AH#cP}By߲)w/B APRVEN3ڪҌdaB 1~05v =1PJe! >8d";f'9Ӕ'lQ(%޻0uhL:R9.(* Ƈc @@I.4MҠ5ӳQi)Yj9ڰ]`f5??˪ 0!0"ȧ.JmaicRyƁ@ӑ(N$"5ZF`^'Á\a nrրuP,,@IL3HR*vmyCY4ccMUΎNdЛ1?!Hz7&)eQRJp}}z1ƊJOi;2XF.noBK$K`d" ʝNut4s` 0`p]yZb߆8gih0Hei빞-rŀo7m{8eeI(xIta|ur^PqꠤJE" Ž۽;Lz#2\*z)vcGYiLggGny)z$"6u@3V*3@DJ4) %ɔuxh`;Π*ѪZѾR,MU0$IjVc8aI=Z̎4$91EhƦvL3/u=9ܯfe^rNDjzlAuum$"߼3&XKau-=q$)&)v݁kQ,0 )Eá-a#zh]ŢbiB0# ;R񉈡z8ix1z=#BFx}wⷢH跳:Q 4W>G;.p \UNMF)d28Nv]<@ IDATCU4W*"1@C|5sH΍T'L'\.h#!;Ng*QʄȄ20Hf%M`ʊp`SOPYpI@!"b=Ob@pވc}q-^G7Q3Ĉ1?H1#a `YhCv"0JL)/tuJvo6Vk]i]H eq.b5{F…\JŵL3P`4MRwpw5> 4EYHCpG#2MƸZIeLHiqB{mLZJXeiL$Nc$DpR`"g1XW Bu6]yWNRi\Y)==gOG۵e JI׻uoɨ aumHsE$GAAgRB&cE^ ȝ{=gU9M!uM.z3yJAiC!~v;C,j$6]JNh{3B<3B腛`ۛcG/Mq̫伞jm''y zAٓ|Ȅn<ʤԕTltR4SraWZ!3nFv7:쓧oGi鳜UWYѫ$$ԍ\3<>/noJGnssi=xYԸv"q: PPuz}CQbTrV.g"UNnL7v(ҋ< R>\_\;<:46x}}r36_1RN L|l6iSZY<dFFb^ֻۛfwrriɹ^-V q/+5EZ4i`5m{rءrœ&B,[Ժ}7뚏#0G7oŬ\QukS-^vq];b SW!FJc@! b| ^v'ǣFx<'+0H!Gl SF޹˛4O>:#Qֻa> IV< {p(#8,P:gk, 8H, RB^ཷR$8CJU*#Ly\> !@U`*ښ)RH%0 H(ߪ4% Z~{|wq^Vq)A` xk]+ Cc 0~H6c!@(8pu` 8q;F·sv1W4lh43x S0`$H8H(!i"-J\\f"BYLizyy-$΁4Ѻ,J攊nati*ټ^.jTa7 -k~ gJق tq3zMY'G6EB$ BwU¸Gg@'}7h((လT=mw0XgGS= #c#vw}y{?99K9WՋřʳC;2 l.<&{xh6<&'o/C' Wg blJi Bڳs򓟖gO+fvmkL@a˸X qɚ-}&`gDӓm{l А#{XE|}h},f%QK91ޅ草 rNuBPHqB t443,1˘݄5J<Ƅݶ'!BR TP92Ƙ5Bٜ)fw{yw6pFtw[+*\lmt~{kmf6$LKR#sZeZeMsM{\hOvc菾O.~Wưq-Tb߽n Gl6Wi&f&T~cpz5* cp]_cYQF#0 >bXeU+4~4|ތ8rLď  wGNG% b>LsrvLU*XDmX4y4qƫBOcw{9tmlTX.gͮQZP}e4ww<=_ WQ$Z$*pYmзf$6 F+~FKYJ}]\anPqnSMgՏd y&<8<Z /]? CDO@A B@2OFfB{ QqÎ@H$ 4jP8Ge0omY^I| Oa>KX,~8cT:Mέ͍U*9e"0Jg ao&{:\`FY*rkY]|9"zi.S F E\pU 1Ԩ[q?{޽,<]B{#1Pta죵HrN"J4UcJZ .`Ym^PQNY"IL ֙7Ӕ31I(@Dΐc13J8NE7U8BfY$3vlɇXơw>ۄ!b\^RUɜln~R:m!DQ'4K+Ņ=31}tW7PI\X7*6?Q$*Ir\D]}d2uh$}C*.nOƞAHRsl^PJǩv2n6+E?ܡT`}$0q Q-S7Ds&D1!F&`wX!T&2gx)']$DfIΙ,YK5;Xky޶MZ!I'O c7~dhbV|pokYV_|CRonoZ\H􇊔%: mGs1/ipq}'E9W4IE4`"#e}tv󮹻ފl?p0Ba5#*=M 1 i}Uۼ|mӽ~v褚~-=Ke.JɡgSw0:G2R1R/Ͽ^lWo:,uSUލfoGk ͗g) !.*hhկ~vYfR~4ۻ{UE-d*UEVOgmSjrat8 MbwJC1D7Ww7m""@ i*f&DiE7ycq|=()򓋪o޷/mǑr9NK,e-*Ƽu( _"wb ᣀx$P(>R#~h\*H̍?Eo=C&dr>L (1Y5gwΞ c#TH2]a!KTH&'4X7}ʘP|rSa$$  8j\ nvwampg+΄q V-B!E  @)G7PH(????3C!H!R<YEKYpZ?(Xyz ~ru}p.D2 ˆS91ҡƲy-d0nk.c8GK9J |F‘sPJN'g`tKb>L3 t CR7}?hAOf'q>cU&GEn$263%4$ G[BtDT VˤŢa?M^ 8?7aH3ukApb`8?Y{(®nܮ(fػ0 ru|:~nv)욦10;1hOӪJ)vGb>$u"Ƈ@HN lC?=138qm>%ybv|xڌ-4KQ{@(D"Bq[XRc+ 7Mz^I-~ݵ*+$NbTiV4XH)Ŕ5bCagyoӡ[oۤirym,0YWٗ_%I -A):qﻝѕsvrf4|(NO9㐈\efqHw_|{D" 8K|t0j^`1 p:) D0PyFhP@[璤#MRH (!i Ԛf7֚`R88Rv{}3ؖ(sORuHYsY(,XT<7yz>L$Dsnk#!h`\A+.y2`H#0`DB5 ]6$UJ.+^Q:BP|[+ 10L6t}lFR kZKZ` S@{$E >LB) !3`pNΉ-A 1ϘQ8)#e./ѣv'!f8[.tBQp!%(Dƀ@RGYyoNJiaWMQϿ8;?aLN(Sg8`"ɲZߏ7sB;J(+ 8M݃zY+#P3f\o69̗tB BCF%y9Kd:#'D?L(R: j2d_T__](QY!vh(EB8ё@@=/Z۷CVpQUSoFZ@D٢HKsmg_k|HY]bd^kw{n8S=O~G =>9ͳ/WĬV |`\a/U%9.lno׿[ȳg鏿8f&fh o~SLiٓd*u!P7)@"[v3xBh xҲΖ_ ,&?/xzgD(BI.ɐqlRS! F1&)!eR'H~qlJ1ʙ5hLP-\9d3Vy"hD227 vL.JNnnLHބ`CB~ l#@ 2p`ȣi$>x4W!3n)r\HA Ʃm[P{`΅9<{z̾qcg㡿f_,A0B]C&F]$1Їqgc.x3%(Fw鱪bVWs6ǀ%94=#vn9|*9%0 !Db)h˪? dxrSO8S9v ́xaX$Qe%oHP|hw: $1FK"('i 2kM1 E~r+Smn)HM"F0K2]b`޺i2eYoCU-LH!D,.S C: EYƉ8H!|s9mn_>{?9[̸PLt~EQ*8T 3Ѡsw6v8 U&%{+?u@<'ER-d||?_}fY0wrL#aeRʧ/|0wiNH8R>;uӛ,*e:*7B7 KR*0@ߺOG!*I] 26as1;ʾ_%Ο\'E5iH˞:t7_l>j?"SfA1q 77o9=E_zkcĢ"JR@eawh;sj4fLS6E3ydY* $ Y"fSwM}?_\{LWx\jvtvW}X^*{뷯;Oo^^W^f_mp)Oq}G(T|s{՛7W'hDn?օc#FJ>&)<ܙ yzhT 1ЇձryEZϒ qfo2\Es IDATU%0 $ ̀NLo(Ii iɍćD`( Nph')IY"MzX{B1eE5ӆ޶'0a⇰ r>T@d CA {B zU 6HC`$U#2S8ݏ&f"#|1T~B$CG%3A,NVE)42]?zc I1IH209HN{U4 RK=S867m rET:^\\^~zs| ci^իmr)-F(m)uu-SڶԛI۾YdjO@$jB?_]i,0nTsNj7>W"*w`EU'RG*l,~6EiԵ̒N#t(f`/z@n䌗Ti쳣;{u1޼^|zZmz5韋L2Uߊ2]~˂>]+HK0.{\k8>" 'ɑf|y-'h;\]!B,^XK6͡OOƘO:<_bfn_oLNjK< hx7O?Jsl.G:,?!mNhVn0_nC]K&jMgu߽bQ)p%Yp\y b،h˳y06m{LL2kӅ=q/v-hi;'1և_ 0l6}Y-쳧~7}y΅TnIr~_͒:ҰAiu#yt& a+)5S̒\l4aЅ^G_~uT\(.kFgfg<>\n~7Q|#׿Z{E`Ud9OtlpC㮄CaGVa C w)`ABnr$l 0PUz_m[ sD )d3N(T$7yo+Yv㮹TeU셂hғ0"0*mz=BU*OqT_^V,ya@JNi& %#kY0#1`)虳1#)膦pU^9Ęcc1Z XB `ve9%2.׫żk?N:rY@ovpvzX {BB]߬y&|*YIq"E 4{4rFrEľtp1ԾijY<]{۵-=pɧ{GU4N=nh1yeZGˋw]&B0Z8Spc`2F6LGq>༆hdC_wvGẼYRd-m?_f7zuH={^͓>cȮez~4:c|"vEٵc!CY@L]j]\l&#8Lag\zuY^^_tg=M·XfeFo]WKJT@AFfH1}{4~f+zԃzJM*#aE7fjxfyVOI1B $nۗWWaeG8oyp,>qbhXx0 zDЇ?{B8&"&<1?C4 .%=r%wX[OA-kCH5^dYVUYy =_|>48 sDT Jݮ5p$FP 1@h89P|^-OC看|&Yȼ)DǵqaԌ1?'`@~Jg+1?gC;'1G1D Q*M%QL}! 2.CƺQ#Sd(CȍyɺSWB "(8Y)(bT \0fu2[dʌEB"ݮK97]@OM1n)fYRYhttT́ajYvPq=_Tc!c1 2,-< , 8YYI;A%Y"M'^%?js'c޿q]'{2KWcw$2y&CWff}uQٍ[_53}^}„01,ͤ!1NG#xHMГeG-&!b0c~9cȣDc~1B T 5 hmwEsPbq`ژmo'9Pɔ ItONC/f`8kk$K(%)p1*% iαi"y{:OqlsqBq)bCD8,˂"5S&SyR2)c&E"i P+Ra L(ݾ#$y9ӣ<bcg3}@E^{bp-Fѻ#Q0FӢc]1mus[&yy 84)g5RJqo}X"/G'S^ΙP1z@F2"BJ= %iRDFC"]_j;D#r* p_~w:X\%E""`t}fE1x<9kkHu,FKhy , y-y[ӋoO}|,vx咖˴,s8$ ֗6@B;ϢW,fta>8/zS O݈b4V',C[/ϵzaݓOJy5ӎI`??.qaMou>4B^HZ#|>#@{lU<6m5 HJQna׷R$k+U\\.#lfWw_ύ SbH}ƕ@ b建mn䛫_뇺]Hwp 5y -YnߙG5g֎YAדG.*׽&H Usx~t2tmG cF.,3H/Ep "vLO`Z63__*ddx9= b6O޽mNǐsU6_7bl42Ne\8݈<$(ux"H\99ˆR7,gm{=e S!9 !:c[tWߐAXkꉬ&dd E ~8W#Z8 !zI%*+3f ATYi3Ym8m4q`pf)\EԜNv5t'\`U̕B.6B!(Di߾ެ8ޤY\$%瘗IV̄@y{"AĹ2Lz/LdymuFHɌxYt>^p>f0d\~Wld8:[aQd&zȴ,cж(q)ʙﺿ.x_<3\O׷ &GB(cFSE&B&@E4q4!GvЍ"(&wbR (m å"/=Ʒw6|HC}<"YmT"7߼+ ^n9R*&%TP"q*ѝ!e _G}{@lwLHLi5/W|Yb|}j x^o^yix[JENP"yʔLonGY><ͅ|M1ufJ*䜭YLR81%)ZϳC۵<Q/*ݚn3U%á0s" *E4,/ydH-UC6wy:<4CS}`׿^_}GͯG7G ПP\a1b-cbGoatq/l"J0%Dq؝'$}yY֏G@D64단G4y}߼xa`Ba{ې(R#3"9M U0to5|}ݫ|U}o:Wn7*aA 3%X&͠'P^p1WUZNVlf:f?8?97 {"S!?XɭOD#/tCć\@Y.6Iig,O'x}kv>ڠ-c뜟6E.U1$Qy ȘJEUbȹ鼒j(iioYgA[۶1Yph|TJzCcO[}iw\f#L?@ xA,cVP8[dYB4Ӏ B"@2b*!A&bNsBm]ۋˋ7o_wq0ֶ>M6I\0.VlB)\2aAp(r d㓋];L9SY u=p{˒_\b!Ba NUz^i_#ńKU!s&dd[ v9{b 4ز$il Cħv1B}u>cuc\DR6Eڿ};vx_}W?y>Mi.^mdՋiO"|8WEgS4Mne(hoT?'y"~0h,1.W҆+iX-rv~*9jLx3!"y!DR*HD"?rASzÏ]?: O|t0 G3<Ӎ?2~2?.R Yv+icY$Vf `9qTd/YZ~7#!@i)/*%"HTf}vTfe0jTH[b>:9b `< "11XVY0NBE0پ!P*A !p.BeH$ц4t9oqMLY/\B \&Z\yBdyb Mldd8G'\̳^3m]`!cs8 ɗe5]{Dy> \U" JэyOmKXޛo~HfZ?imthFRR@=x1瘦<) fY2{oL>MEKk: 9$a* Qs:I)m@+($8݅U,PsC2ah&u{nhg$%睟ZU;j]Uv޳e5޽pR.,_]ݬŅdAK6/T//bUHrT;O?>g3XmTJ5ͤ"Z{.IB"q@ne8 alt2Kֻ)1vʅʃY^|̱i^i@u[b7)++,5zԣ~RwׯpuI '/|~<FPwo7k`8MS3M:GӾ4G xÕ+ BGh6z<],|FXgCsyld]G2qm9mY#!ed] P$9)KynݙD`zP2Xی&DRQ4On<צqePu,f\tbVA?LPswr./٢1ь؜9%v%]g!%O3uSE.!NIuzw Be,۵}S(Dt|\nnG$Br&Jei|vwgkTj,-r,v=5<8 mQL|#LD&I?`Kgd<*ufе4Om7O>} Imz1o޴iڬf77.U,ʹo!ѳW|QUTMU( qB.iQ{3M&D|gM]UA]a+5ۤeNs -W/gY7IF 9D?z?"J,a"-XTƆ6}u)#Fo4q424'F^Puǝ}D\\.1,apwwnDUuV!FYe2\QZ@!94te ;[Cۄ JyVP2IS)c˳ !G?"q11?P >49P@Ju6z bGS?M:ORAEg9LDhl4DhH"1(eH\ D82&XgOJ4"yC|K3qnlP*&=""NBI)\쭉ynoǏgO;ݞ|!s큼bF FGG|tEHXX9Έu0hߵa1BfBb(Ӵ2lWEYgAc=5$y1:p! e2bDiYX O^̟<koh1Bd"͉Šm.8b$3iD2YB ,:K]-gg?N9o֤mV,YHyΒHypdzMpHjF%OTw;5sl&}o ,B@Vaqcg<h0=FijDLf "ԏuO3W ^L=BS?'}dC\D`pBE FWu:OX3t]:TU|bƀu\_L[ӹ&(NE 9( S :Ȉdb㦎zC'c,yn(ù-PBLR\MGàYmm5Yiݮrʢ:۶jJI3Y;E0GZbVN;|c}3-!G0&x B=F竀8MqyUJ}۶FTjmϞW]݃k7zt Yէ~|uA|M^fFו<+WuE.REbqj::5P|I"[,݈ރNF o`a-Sr_ѡcGFG'1PzRrJ4L  $i)MBA^0~ Cݿ<1>'!#Ÿ?>Ï!{c;^4XMm-cR4W7DA3\2kiR5(gN+ !B <Ȃ 8(&E(J&va!Lf𮡾!=p*I!PqA2 ,g>:} O[["` c (j ;wmW>ȏ!uj%~b?>Q?`Ldi^DMӹ1p (5<'Aw$*"H3[h_oj^pAMYqyִP:uF;N92`*Xi5poVb>aB ד Z(=Ol<(o}BϐHD b "$Hj<)Lǘ 1[l $!bb<_~T5o@qr{w =~t]A)6'L͹~/TMo\ww..vSV:c @/u ZcM7u%Yu]p-|Xo=z\%,FLCғ'kzO//˿WK*sDvi0. !߽Cƥcݱl)n>o͋LwMY;:,O?Y߽nnV|=W}S$W*/9iRUS71sq J% Z|hd#E+ jjzFf+?}ywx޳Hs1CVDD\lAD%iDp>Z_,J fX^@^dB XHyrcpxx\p.*;tg f8R$ ݇?kI8!:ہ16MzDkbLd""k+9xaBR$EZ7D3Ac<\*&ϵ՚)h$EJH,tBތVOYg26 iVyOd֜u׏"< bT3M?g=hk}]߹|q*+.E 7օ> C|Ɩ4:y 0K|әP$}ƴB=AY@[;z$6)2A&$(s(mPX._gZO_}p7JzwWlOOKN~z JQ$oϫ7MUǻJB* 9!EVR)rLFSE))|cQN}}7L=7ٮoÃS0ԟ4Z,6s埙bBL!OGF5pggnwCp2H͂C ~V?ܽa? g4?oI/y_/دaO_bcZσlޘGt˅ Z۳ִ9N$h]7Ӳenϕ3: )iKMŃ8A&@H/LDt!~`ҧzJ[<`_4дlUehʔxVEQY%sY sQeSiNg 8ap0i$9cr&&&]3US%q5(\gk'70  ) yʐ)g~cu+c$kՋ⊄J8vx)g+:`sy>i))bH`|f!! \QMQ%&Y'x1y.POӉe18G^)2|nti/cbN7U[5!R 89@EUA,3Eehb#Q&7viDMRt7kږ%:C?t} ax:pP LN'jHVp› ҩ:gxp,/~F0ӛO%pPx|Y'.`r!w QWW rR,>?7rэΨA2Riɥ`ZTmS` aT*7r:41?hyڻR_6 exa]R:66s.8a&&q Vuqݝ1/~+?'-SvynA $Q*|~{24  (첿;\'K(% @\?M ') Uezo`V,pF!"" w+y1w6g)włw x4 `*'f̡C"B F(8:/LA"t?)2."Y1 xqtKI9 Zk긟g;972/I#Ku 1NꆴAː"p49}Guʒg ߝ=ӌe DnUZsʑ}ߒ ?ď~x<цa D ( HE[\rgbNJ.Z>Ƙg@Ec BPUaʐ9)B"w8zp.Sn=1&D`^/BqƓ6 Ɛq )1Ti<: 17uUvA)(6ȴ9:+XUD *7բsaEirTXt1a{:\J8qvsFWy ~mz93F((q824gkF͢\0ZR"d5ZJ-qbI S(a4QSZW7Zrٟ[ݮu===w4rRIcf?̑2mSشϖ<~,TYzz> 9 lcիO(sxz(!?_tܟ$ԝrnnuqq^k]!$!XQ(u3r0BGSZ(Y>?>{'R*ܟNxpwmKa/WT.^l IDATe=utt=4j=oS,V#pNq0Ƽ~شo{" _ryì.׋0Xz۸v3D 4p4MqXvv~O! ΍Y͚P*;> $(~ڙ%mʒPgOx, FT&~#-G%H y=N[xނȒ4<h"c NMޏ6 :H)2ƌ*|MSSVB uw;; 4DI^5"gO{A?^vg8 fP2"%إh.!g%je@&rʢ1a#I)lٗ</(3"pwr)) f Z)c=gVF P3rJCjM ާiVu<9gg)h3MP <)SbxS.+)+$Uvw"OCζuɓQ^b?X/ 0R a|rSXQL0PкL24ͳ2T*!@)KCK\@\<1.\pg5EBitee.ʘ!mcY:YĐb̉tdO¹ĴQSN1\xu]Ć?>tɄyӨFSH8TƐc1s,$SEQ2PPLۺǐ _mFaSਐEn '6O.XjQW>?vC uUxD-/m# t8vywG!xŅixmJv矞NE \_^TM᰷q,<ٻ(V<-siW˲0sAJAIvOIR>Ϥcnx=W6޸xH` _,8i(,Ţq0Ŕ\(. < ]?|WOjU_Ja!S4lm(l*ɔ01ym'}tuYag.)mxp$*.jZmЇi].R+ *92ʙR?GH@/%CcFoA DmRX( 2R%R 4|iN!)S  ;Bwl D9X=$N((9DE-f#bTM+bpN0VF&k ? u%^Z_=>>nH\֛,03ّ.' \^~lֶ;}ן-6<3-UzSlN,j@1Yh&1$TSZNuCy+tqp8ԠJTmтEhplMcV@H2@+.nۺnJJ5u-3߿ϒ%b]Â3ѝBe)Qst 0Pd;P/z>~_}z}v%̱w.ДqxAy?ȭ~ust}䚧J19%1JmYUeie*5_- ޳UΨt*i|\ȺpxA0(MQU/seaqNN>3U}KwNol,r !hbi,GOSÅ\tQ `x>9 ,2˘oC~?j>+f!  C~`q6޺xs_~8 |o y@8`\)`!I#LRD7tJF<̯E'7[()e%(9@PXi9i`,/.MQ a&7̐6^Jnlm.Us&b9S aцB!X7aRX@D2aqӈFhCĐeaGLVe&nv(~7sx>ypD>DJ>ƐR9#sb& G` $ !y(fBݶ 8;NuӬVgG]E$a8JJi>Ūx:Mmrs<cQn:o4Pخژ֪֨i0H]]^^Pz`s+ެ4Q Rzu;SQLՑ^0<3dIrm㓟FZ]ö>$4<^\mr#,bѺy1yz.UQCzv.M.DOO8|_/?|Nl.ʢ>xoV+n!<އy Ha!bQ28gF.۪)eKT?vm˫3]|fs4=G!@F xاo%(|>[.7Ϗ;BO7RKajdLF̘ltEz0eG^ a<̹0nڊ?>P*ySH)a>\ެX.Nۜ\-.av#x˧O y<mn|sX?r3g~C$ͺXJvy&z)"n)0R e2 Wzdͧ7gP.Lh698q/6i\{ ź$lڠIƙOmxxɅVE[]eQf#CPD),ya1}*E*CT]ݿ1,Kc4"NhrJ1i.@B#MUU@!Ɯ4f"C@ιRRH D!!'n!D< Cbg&0Πm*RJ}]ya/6qj8Tu9;f~{8D%3L#xo~}7 s>)/f 3~w,D.K#̓GcPW$KtqfsnLAȬŹX(C1ػjA%<ok {sgv[?fIp|NHubU8N[?~LBAΐ0~wx˥ԑ0ۇr]/Z^yf? m* \_w~8(^.Uh\(RT uQclʋ3!ttq3IfUY?uݸ[z#Qөxzp߅VgmU`FNB?>OyEgfp|aBNI8c"!"fBzO/|3ɐ]K!5bߑd?D`D`Kd,*ugF ;YUj2r(e4reZ?a}tqUկ?iOhgUks{p&7~;}z:gVTkg(Q/ @ʘ0>4eLp9[ 㳏CLy˵Ʀɲix'X )5/4#Su0g p?E>&.PgX7)<;&8)LH]fMUe >8;B&ˢ19Th= / F5Jxqm)̄2b4Zmct}]-[)ݶU(T,П8uYh O,R;'72^ /${h$I00w4<9iӉ,u^iin;[N}Kݱ[ʪNXVz'2eM_|&V7qwraf:fwC'xǔ~Ea}{᷿\Z;v[ZA4La!ΑSYs矸GG'7$&}}mD;]윫rCS0KX1j%dw4Ȃǂa#9ׅZuE+P!,VKBpP @d8䋺 (BِUK*lprQK( !vsvp4E`Ȳir?x!\㔣CFB@望s.?%"L YBNuM]!t?؂{A=\`lFR!0ΰ;xơT9 0ε1ʇ@R cVdj.&2oV$)iR &g pSY1FAU@ RsFHuk$h!.:g4o]IԖ(`mضyr3&Oq9She\<Ȓfzn?~ 4 <!jW QYYv?OidoԪiI`¬˜Y~~='Ѵ10:{n2Wrqy]]nW_\8 >2'-b٦uϋ Zd)}5DeAw[lYUֻ?s3 .])uۈX.n7\F7RQ,c|xNaQe 'k'(81NR< ;unoSeQ5ERC?cʞKeqsH\,$ =y,ۺq@OPV6n`!:^}rɛ1QyiQrůB}hFvE' V80SpbUsx5Xzwx96X_abU S= ! 3@# QpӘf< 0U Fԑ}LBx lYLH~  `?4tMx` ~l/N^I( ^^b]n__ˌc#L&ƧUHDːڔD笐Ii~k jYѨ1ۓ;bNކiʨLĤT*;&?I"8aQI z3 ;6y<0q}?9Fu8Aй 0=Ό0 \F)nrsB\2~o{h 20Ƹ e$;;1vʱm)4HN {M5a"D_~Wd?c3'NR?Z&V?yB}} /q0$Ȉ;s 0k TbXiZesR lYbJJȪR38LQf}Z\SWO{3ߑI N S_'@˒H9{o^y\K %ROݍFUuw_3"|8@, !D0Kǘ8RJ!D}Ȉ` "Z/~Rŀ||cNa p>o,J eh2HD_yvqxI>txH)8BNN)^84 T6*fp%Yh?}}WEɄ&Djhxޤ<ۛtui^h_=RahvQ6uH9#|_~o&kl*rǁ1|RU˛ba77o^̉l&ŽUk;4x>?>ews)deWٲݞb$[hJ%ZehhxY.^=2:SoNq*]Tn<*je|scB-jM\v<;ooG4p{X.isZtogW9ʯbi)>zyys.;gV*Fg?x|oB)A˲x?Jӹ{8W_ob0S r#F~=3'ACi/R.)D|8ŷoOH샎{^^Na&`<X4~B^2og?m*K7/뿾_.*H^oo/ӦiouFuPMQ4U߽g?yw)22c 24ԻlO)?ު6gv{rxgqV0+9h(LD+ө&.W/ [0Y8a"B3NBH-ǣ ?R/.!Ctiw!;*I6qt - =F" 0 I&D*ʤ 4&*[V13ʂ's~$_ȷ-NhkS/jajU<c̙"hՔ`2tC`FH&VM(uY18i\0ƌ gJP0uǘfS7c!j X1^=3e84u8Cx| %m7?d)$0(lyԝKF>0*iR)~Џ ( 1m:Ƨ'4O;Y妲iQ-1d2 3DHJ ia*9bL`9ҠQ*g{{>s5l*Dp͓QUSF"ER 9v\̓;z[ZId,",7`jn C$J+ 0Jg_vpwFZcJ R ! .+siEFiAtV=/_.0YɕnsL/V |WmYi~ûwcYA $7!bʾcf-RZԋ+}<E&sXv=2xAUUN.iJ]?w^XwzM9gW'?;3׮Ջm='y>CxlZܤͦnc?_uC"{36CJѩ M T XC+L9oN, Z͏('gBRqrU+d32!DIiѦ,Rl&P!N{zV[8!OoyT5 O_=闟VswWNR]m/RlV鼻- 0ىor ;`bYGw"l./V/_^-W2cF3?"eJ$owcr|Q-+U^?˛ 8d9gf2PL/%z+x|oz]*= ytT+SscU\ f!hiQ HRjUg8~scRfa{Ǒ$'@ \2/%m]X^p8O/@iuU4wv!5|ٔ\i9t>75%@ROVe "45?6N/gȐGCKC!8DzadHL2! 8''` d%N_Us<~r\B> @ f!cl/fm$ʰX 5%?4H8EY4~mwy ۭ8sCc<]sҘ2ǀi-34O7|TᄒܝR,Ȑ(s`M0c?H(PFL6} } $QaW/V3DxMy^~B+O! '%'51ddz>`zNHA)aVk-L)F9PN!D"!QY( >4:`QIgY<)Q9gb9Abi&(jYUUŹ !1#cf2Q3H \)TzJߚlQr"FG;DDv9ɲ(mhy]U u(|Q*j{&Ǖ|j%Uys}d@08MyHK_4%UAQ%,u}7 IS4/>LȁixNxʖL[Ɖ޽ e]!i.4K짾{%K> DϞU[Ջ}w@->:>",V†CYzaw]DKU΅픱p9Pr,xUˌsVi<Nx.VDrο}M >]>B]âMMMEa,{Lee.S: yͺl!J~@ϰ^fc(/^~/?lu' v\d3PiVI)8H)eX2Ri˶bk6 шr)D;wߤbv>̳|#iO@)9S`БDDY- ˘:p:# 6 }|E~Fm/` LBɃ|s&l.* !=yLij#&lj}mhdJE)i 7&kqfV\lJz^y+<4\_d-wrx|m}~T B%Y8P׏9Nj \&)y`Ӌ7x<:˵خ4wg^>Z`8}0<ǏI\@E!!PH0d|ŏ  ̭oiyV\踳cLV쎧;QrQaYgw<`J\mv^>z:f?eB? >]ǝ Mai8znYgmRJY)n S"T(^ ]8f]]fBgbl Crv1NC !*aF "4OceQS~D2ZoU(s&H$ze]L 'H{Ҁ<?1@OCr#Ax0{?tn< p H͌рܻ3 .rJY#@JiCӈEQz;er&H)SN9# @F4Ma@GIJ=K0y etKy!M\4Apho!Ų]vls6Uʒ{/2+ᙦvT/VY c]CNxJE%M"uވ;F7c& 6uGjSUUXrvnLS䐒\Pw7󺩛өVӂS89Y)lQ/JreDնv~@Ζɔ /6Wx) DQUfj.ו0nMS6U D ms?w'  sq!˚RVL,RPJ{I(B-O!ewC@ 0n)<[ťiWb8+}G`e])MN`ʖ ~8r=<>]~zj٧)~s MC]SNǸl(A)y9 ^W0C|Q4ӰJ1ߥQ(HEuڏuYywa6+`3na=Hnj5 4K]*8FKނJ v>㞼Ç]NDe9+mlu2;ϔAF 䝌&Frf-˜#|2BU+-O.LR<܅i>M9M]૵n ؅H 4 nu#/qduiҔ>c 9()%@"E2R?qB*(<2Pt~&V?\wh1E9 R.#2dVS 1Dv '?>IK>W*U#sBP[(9Ɇ8KñΝ#T !SdRE·q88\1<=<~2J<3Fe)@ιRd'pЙs*Jɥ:noT .zXHo-9G! 1Ap\ZkEM?h"eB?>Vk$G 8Rp.!CNh?djAJW ?*C{#?~Gpm#0dcrfZ"(?!OӘLD ds80Zkl6ΆosY)fBy!$%5j#%9G`@R 2Tia|Bcq!CHfk-RA`=(MM#@2Qy{Vr~?L)bQWy6Lp>0p<8M1d'k8JLF)^p$R.L{a'fZd&<Sf^^-44C@ Qz)yts,$L3(R0}0M30uťӘb$xad>2iFFl/S"B>Ce} Bk6q:۪1.tfcÜSQ8eE%<8$Te]59;To;/6Ŧl B"1?·zK" z\EBŢBb!RQiO>+SOHeX@(K/eYK;fF y١dB5 41;sBJ>9^^0x-%rpʀ KXdQRH\iv X4<П{]`O/OB5T6j8 s?ʪ.b3FrnEn qF~wE|0L#خ痗a!{xvYn*e6V/d 9t`@c!|'p,?Ɨ䕐9rQ8J!bLn'B|l ƈ`%M=Ui;h>/UP: 1z0Zu~6]"CH0m46?p3xDV%x}}.jm )<@.D$RLtkW"1% {=Y^hP"L#fb$1 4W`s03A( ɀ ?5|?b#"XΙsNDH# }\%5-O;b `Ȏ @dQeyf}.c-Pm H18x·rJEJ#C:Ks@ ΀1` C1CD)Aq"6 LʊOVƽ990P8`qxB1BeD߾~H022D65P ΁?C! A/ylOyݹ޳ʋ1^.v! t=%z @$' gCdeY.8;MQP5s(-Y{ssIkX@kTRr&90cTgS˟4~w4MfS@MS ޽}[\nG2[,4Nn`Expq{U9?wnAU+1#nnYF_rYK{?F AcMIVmmu%R2*,D(Z| 1lg7Yb&5,;{?ݝ.E[ǓёX`;C<͎mW/_mᄍN)W^ Nǻ8~/o6u]Bq5%nJU)5) %97֥]/V yQq=7]_A(zД)q g?{>L7n ^O^0Rdγ(˫ݷ STT # -^}j񻡬 qN>vyooosJa݊Y8n\\) KX_4ۋqwcm^dLtJAEɴv)gJ֏w$7{7;fl%~h3fsY)*lj.~ҳrB0wɎT; IDAT@GB _u\eQ .Xj::Z?S]1<44Ù"Df8y` ^ ^EQY_nv)I }:1攐x&)QJ l .D %`Bssw}8(qTJS7VT\(4zmV%Oͥ9zq~Q4@|G)*#9Z8"` 2Sf#sA>N5~`D԰Vqt9E)E‡w냳pU mJsL@Qt=cY6u燇|f%0~2UU5ac# Șp>DA*ˢ&l! Ѻ@EiJ.e>(ZNT0Q5sʙV0xx={cUC^$^aʸ?qI`"#OBbp3R-x]Y&1ߖRhpp]`&T`bøb, X68 xեjRb&h);CB`0bQYHߴ4GJc.e˺p_s~Eo)a 0._˫ŗ?FW嘛 6;횔yj r-kߋ2,@l??N>?Ac~-߱xoAjznjׅ)t\OcJ^]b, !$dY0[ٺ/WUruy<;UhWRiUTziJ)D(J;{J,DTuYiO(rQxLxr}O ًeH@TWb iv1f.<Ï'P> )'BBD,$YEX19a, _;A,̇ǜ6aʓ?g'.2 L|3!cB&>a!@I cLe]`.Oq2E ,ń%XL3*IdzwX^ol 6+6O.T,Y?FD99gCRcB2MD9G1DuU7U9sgc4Y!&@XU:h H(liNl1 Յ'˦?ߎwކʭX/aN.s2%>γ 1_\,_( WtПS]7T~^^ 0 =/S9.jdH 89h4VUʉim7 pK+(Mݶ;Ӕ!be]ZUqا1'Hڕzl#N| rdE7ˋ`e 45l,J}.P5~>.KLr8fJݐk[\1Ti>cIƴ(yӤ}Ȕ:0FWnx~\6JE}Ϟ w7L6 _w_5ϞU_)Rlnٚ,\YTz޼0:LTy]w~VGZ64 y5H@!\YŹ)31<\Br9gO OBO` O8@WoUUBsY֛ \ Q!VeeBNފ<`Дʔz7ه̥Jw.9K)f0z'D )9WYH+&8R j1=g,3!fXΈ*U <)嬴UK&1a)G$rdUEt ga?^yR.iFAee>B1s 441ʚMUTixwm⚷ݑf8bMkz>Lm]_]NG20Twr;yej~庨*F1F9!`YT)4ңйxy)vqu]F^^d9gۻ %^\-iʘjҪ9[ d\(jiR*Ѕ`?XŔH(?a?߱0ٶ48yb( g,Q$S qVZ,SJCE[H%\:@8Sa URis%.CaT]?sszf{K,Komڮv*93|̀ tMJU&>+4;.8r zΜc5p‰$/a&quabVV 2u>IO!EP9 hWij8 E% g*)޻&_,UYz'jRdYg@6D)Qصe8=9RH9m]//Ry :0v|%Pz"bN4Ce`obyG|I|c07Ke>1 2UƎ,Bx7-*D<w&"2F,PDTY,$&υph4[$$qA6%ʌw}"Ny2R!2gQB"y72M0H'n0jgдIQD0ìΈ 4@"x,l<# }2_i23!rJeQIE)%C 񱼀H%XJcv XΈ1~@C>*THC|"2W2/ǐ͌*F) U^1 E+Tyeژ舰 Ak7:9glJ)ah),J ih&.td9uD*5\!yQ)FBl04y%T 131+A)M)<)"p LUjÝ|V}y81oxaoYKLɹه鸮f?n..'qTWYmf=f#6vCݵϞ伟v8:y,lO`f^Lpǟw'Nci yk͜e(U֭lUQ.T 4Lc,%$@=9aVS7OǺN,zs]WW_9Qs"e#L>R)Rբj W4NAäyS%LhS]- Q|VyL!\0"0,w~i6FJ&y&hxO iItUbL]%c r>iczU )(T|c @3+AZnX6#)BZYyyQ;(I+No޺E+/.Wf8rLL_n4 ^sJ"z ;*Vjޔ9!`Ƨʇs*rذV)8q$ z &M[dDO #&`LBϝ2ryIE%!$<3C!`y ݐ|)Y]ch%c/$Fb)>~2!!@X9(Qs.snT.}JPd)@HU?s[5/iOE9?qٞ3IbR9mLJ{p6 *#BR^]]N*X^eE<3NT%rA$.YP vsg/}j"M8VW%fHF@) an:n+ǽ6}?^hChsRJH(]ԼvlIŎz~sf7eO f|WjK 3'P;yF %\kzWZ0x~;Xo`>VyZ,*бLz!AQiQr[4be!DeYPJO9"c,&ӄP>]шpQ/D s;]@Σ BFn7(_~Ęc;7 Cg55?oMwhϯ?]ƞN۫5XkŲa`gmk!Q?@ǨhFdtqu9řw|CLB 9Os즇s]~P~_䍆L:{NPeuS]|4:J1&HHכb[C:CRmlȬY[&m.ލ%pЅeq4糷TiqQ-*Sìͬ5ȌzcSȳC#d&U@ɦ_OcH.E5xk6$}Y~~E^o91$&póKȧ' H?i~RÓ<rOK&GeM]qIy_\^^^q@ ݜiUfEcrt7`uR(K^<+ILiEϜᇇ[gA79)KRJΐ ]΁֎(Tp|x`Vm]Ve]aضOrrNͻ0 %H!i0dp(bAXJSK)E $I/g$@9AD{ZHD3C?aagB=)V,Gdnbw[s)S pܻEAgW٧]~gwa?Sn\BqxsDN DyԧyN736ZA0`xr c?Dų'nKiݫwsX=oWf&h2EmTq60ju/?3?}}0sL{esοyII^ xm1VUAFYjnAa?Lr;@ cRs?@kQFr8釛PTsے)./]>x:,,خÄ R m R8,c2%J>y!K_%$="Nl:] WK#ASdlx9$p B`w IsaLOm,sUјHX䜪\0Jp]c^p#kZrF%1QS\JYEy!Ubo\њ8 I(Yϣh eC)Cΐ b$!LdR\ !8BJC$+ʠf ydԇgq(ˊly05d9UV/S 3S,( ء>O>Q}ў py*)qDAҬ8tap_h G8B":f Z;[E^4k~F u-V|wMB\7E>i~N)}oU/v3 򮨓x_c89pI٥jE8ǽ01zpB|ՠPPԪnK8O߾~C]\(3ٮ4F]¶5͗Gu(,H?@u@d?"f;:1k^y#>T(*԰Sey4c7uE kl`C],, <^0Z#q 1yl4(Y#~Uf\M닢EmW%!dFc8{g1%hQ!U1yO].\yCoڅ(tF#IYEI !1N)%yyQĘ=<{â@$F BBJ i4J)R M^@{?tG{aHb 1 7"{$?Yo|}c'=FU]H1: N11}RBH.h؃1 P řR"˳,˔,AΣ=P#  =Ď+hz-*)EJJQ'b+-s[cp`䌰`Hxc52łw纒+iy<) $&3AҌђa46CD L@夨EɌ !$F キl1FOYWT8!31cV5p< Fhi*XS?h=Af!s?.KQ,*Qy(a]lfhIu{D9,r(>IP$ɍv$ {y0i◻u]Ȧd YmԺi97eσI:1iPs<%ֳ͢?Uƛ((Ef ]?f>bWh&b*(q.H}@!ٹs<4m˺]5"$Z/U"pŶ)gzRzLFBurP0wAgmVdz2qބ"ѧWO~g_?|<GT{'_!;}`ĸ"@WѱH d?%,WDpRt;#<:b`"yWEeL(+P J,#q8LWYEY*sRʦT׭7ڹ\)JuT@qƃer ц,LSVg#2,mφGxgɺ3gkļǘ41F{[cu1@yKI (%OI6ѹOׄߣc)PƕdI `0w,9)I„$g % E 5ڜ!"J(#cHre 85j)DD N9 G=w03P M R0o#aHE!cDP)l#4)JjXȋ5ӳ{;a8iθTDhJ)E T x` ضr|w1t 7pe/X4cľ2ƥ$. 3: UF9d |@&lS8F [E2/hq !ȚEg#u}H1&$RΣ  8R.yJx{}Ia[?1nb]y55nz wp6RL1^<Ϲ,Gm$n"F2U%mjT|ZEI(EL1N2GO|!y: QAL(4ֲ*Dh&in8]?hC .s)SBpF6Z['4ky_g?ͷv϶v~DRm@6+WAۋ`rwxuA5oT]\,$RHc2T߼9\Ն&uy+ٝ]YJx~xeN>H&_Vʮ?hwˮR$j #c]߃>dχY>QmnUq*3HYh;PrS)Sƛ9rC 1RsߝƇ9T8#Α&ː8}^ޥa06`PȔ.$dbEIngpBH h{MdJ}S)OVm"sYʼwo!)Yn/r1vOωG{{^ ږYE[UۑuTmޗ0i1%<4Oq7:|R)FŨ uUU$79;cڐL㌁f Yq)W*Yac4NQ&mX֙K;{k,"p az!᨝cA)\U׋ö~ͦZ-dLi,9rM׍68򜕗0sWkq}6k$tˢYQ0Ldg^7oyBhnNn %6[C^4z7iTr|z8w8%ʼwxs[/vW釾s+ʢX~/^|w0˜S!+IM@35`p/-49Xfe#aDj) |zE jt!l&#y( T.zIz M1@Xd*ȋȳWe{=&3`E͒C!"ZҜP<4-A<`xmhӁHO47ot@A5%Tf"7MDaq ˕/T*ʅM㴺(N1@UU9Lh$6K))@FMQ5E^4LR3gVicrUHEQ. .~?}սcg `._RMMSerӘ"6c 2.q `n5&~7 #!x\ɏ./[K-oGc1ye?2ŏ OO12)\P" XL^11Q< ާ(ceY"I8kN]`2 ,E׊)"<acb!)afm%JYK.uZ@xT@)5 F۶mƙyq]0>t Cd(Zcl0Y"4[=N]DRc:\e%0>Sfӽy5/ųY=E2&lUVg%ɽI>MC*7jm"$}aE ^xW/ kc-s23U)Rb6;Bu[snߟ{jB`QFr 5|99229Mb?~w wy2:LYrI4 $p/n^W"W2+Y[?RoW=`WڇwG=#RSJ $/1FxijT.*t.7.T) X?떖IQgR1|:n>69S`ldq,JTb^O$:?H!* D|IUt&0@fa(]s!|Vj+ʫPT$$CHL o R^\a 07|)W22wqtLAy1 3:04S n)Ds0 >h0 E!MW!w7y1#ƈPȈnN C Umɾ}k'bBQBUVY;a2Y,|&ȿN?+U+޲BADb`H4Y{0[P*4IP c yl!`J$ ^12g'2@9P"Fm=@RcHQI,\ht7Oe g2wR0!+jQSw>bLĘ̀$v]DA{U}8 U7DLyq>KϐJVcYCf\m*oN_^2c>t>y{.me߼3W_,X;=fˏ45Zgc$v$,sof 6kX.4[k`sSLY"[#y!2m[MHUVt{9(F= Wrzxq^]*PiԷm '~6*;s!I_M3)':oNo_Ee* '/{_urI05 DM24TmZGal[eVBA)Ҥmcn8 !WN$W-dX"כ<1/w'7c_=RW IDATIYU/?fxߛ]ؿBꃋg.9)Ȫo^ki~>q1)=hdedG{nR yrgNe= J1Blm_N:^6dU݆קqwh},{q{!Kq^%@/|MI{}w+BLKlmPmf\[$`L:+ U/+t^fMޞ `݄ʖ& z Ǡ)ח_zw}{\' qqˎ˾泟bb2F7e\Ve \cUBT_Zp>Y|F#Bhst'{i&ڪ/.+0v (ؔO?#a NLVfU-oneӱf( ZmWjE+Q"A0`ۛr^U63 >ietӐc50tz'y6B)JxcXKY"0)/7ڥR8e0-)mnYY*GpPJ"G #]Nq-,,`4@ƴj[ (_NΣ_(0v;>F,Rn9VnC,ˆ%93ѥnnեs,u%8ybBSIJ}Srr=x-[KOLք!$ACtQY.F*N^]dSb2Ӑ`qU!k%LLZ LH@b,aq6 AM*By~*ݱ[pE@ܼy|U7M]4=sbʎS)~'!r $/$_.sDsFEd7B%$rJ)1(c&J1I!w1gMSTrDQP)%QJ Sp39z\PD)1&rb/ 8ΦYp"8lF֌M)cA(J7,OOHj]*(K,3$c@44N.:(*  EP7qTZu !a~{F7' $ ުKVpRvJt9?LjE!Ҷjp8ȟ>؃w` 9TPrm9V ň%O9s\?gRcJI*41\MVQlëmA Uqtu:KENkO0}r-~?~areY8EB`jD1)]Z݄͕Xo %i #xc$d$LYKJfTO\:KR <_ L)k%DbN$B* bK\L !, r^i! rkͮP;dx{_oi&;}zpuɵS%ܐݮBxXq׆,a #c) *';gYf[6K9߇y1OCxa8 VKWoTUu#Làe{s4|ZoMsz}<̗y1E(` !f @ML(RaH0%)3Bs䀢1\2B*)++sw gDx`Q&\&DD!es1?- |T|lg _JSJ)RfQy,D>Bư.۶-ˊ˔ 2!eHEE")ek](J3٦QR$ F1攈!* BqnqvɌ6B:?n^/K "/~ٴ%ڭo['4Y4g/ k͌HxQ3QF.2fL0!uqvq.2n2".. 0PX@dWs^f.Ü"BwN]MLs ! R4~)G Pq$_6j{>R V0`v8Bp2ҙRv7)Kw^DÇիQj"moۯ)9RxdYHr+m,8gPjնJ~w4Fk @00 + K\Q1P8d)E]sSMonzShlAB@ɹ"ATExȘ"}xYmJka6x}SZ=N*3e<67tUűwivU=Tm 8nĪm~SдśׯzE/_7)%1BSڟGSTE >AADJU"çr);ox;N|i>2< E$!@$Z!4DuڨTt<~R7_o߾8ņqK 7-%|~:gV,tYZ~]pEw;{ ČUmnn۪ۛi9Y53.W6fkXdߟoG}Xz;brѥGmrDd~~ϠDx"xq"dFI(XA%[r[wޮCo?q\?W_vwŕOc7]Q6a-5h}h XΩUw 5PVYgn$"J`O9\#,mNJJ2elڂh1h۫qs$0PYs)Qi(+)T !9_ A`]VMO)FHާ2 ɪPr1f2 1$DL/%|ٸ~N"?EU0DJb B$@` زD"%1,s%#0H"D9C˜ $HDF((C@ bZI|5j]#CȲ(%m>IٚQ/5ݩխdçSu9T In+Ѯo*xikkʅT4C%E\Hc( 䘋]nW.!< 8O;7կMt~Hna4vUߚS !.ܙj4ZØ|3-+ys/af _5[|||D{DbZ뛻x|< Fi^NJ iȶ;*ܽ7m7>>h @1ep1&x|?VWaV[ӝ?p$lTnǧ'!WOe BA27kѥi\B785fu60,P+#\el0%RZm0)Д&7yڔEQxZKߏy޼]Da~LmVawH{}' n#дjqhIdYALWkx\lñsFRISt{{}o1ჳ%^H}cKXXۚbܧh˹<>_z8Ç`}?nM1_;7 @(i9vsi)Ų}۵nǟťVꦮٺMS||nweɵ~L0ZzÜB?`-0䫍&Z&3tblZq{K7Sg ~}(?87o^Q{߻O?2.+!b4%@:&rkv7|1'6}_κv]ﭛW՗?"7|ŧ>A{͋$Y͊\.Jʘ dH}0$` cS"8fATM=ȸOɢ`PSyWrDZqݯ|KamYCQRBL*xymm19qNURɱr7Mp | @(Rm7}[ VWfܦ<1uc Υ2Hi BVi ! vfS*͜oP_/sH?ol-/ɒ3bbŀRBOB(%91~E&i1ɔ"2"(9 /r&dPjRN9DgTZg% SsxHc?YSvUF6v[Յw?y Fr`vtyLdJ)! eS1 TZƐMy?#Uj2d疺j] T >LȸPVnf2г8.cWB7׻MJɗʺlě7wwӻn@DX>B%KzNG{J]9MllBJmD۶~XӔ1zk@rk2LzqRYĞ?-s'4R`'hhhfnn<i^tIOCp9]J pu_oZd )T(A 2w0J]X0R׫,+y$pYB"qϥ.os<*$u2`YkewŃwE7??C?ՕTze M &!p^\ LWzgC lVpskVa& @fBIQ+Sz:<>|w:Zش|<=_6WPs?>|?f7[j*I͊FK]%Pa| DZ1W;ޱUdܮ|7ײ) .!RtK&#U+奮)?ts ju{{C~}8^USjqBtdž~H,3ŪR!"4M%å;"y/o!R̆Li/+N|jB) czx ;&J׿_h=zyǗ'7-38v^W5N .c|ZdP1x+ 5̋e$`Jq{wY!*WPŰ`n_\]3&y/fm}Hÿk6[2USs cs0(`'FK $p =,6ili:9C Al㞱tg6wޝmoߙqFk#H9Li?[J+&y*%~y>\Q pJ{?Ϡ4NL!yQ(c@FRxO> ҄02!_\Ȼx9AweA:zHsp El\hJ uY5XWeD,΀1 Ej@@m ?u2r/[3r/FȿD?A824 c@Hf1FeƸ1}!3AJ?ws)S"ʟ;IZk3xn%bUCD_vPs^0lWһ0Y)c.X*ͶuL%N,%3r)sc#%9իJ!= ,vCG:4H,ǜR4-# @TRTu!5 øe vj*v6xp Xv!qS*4~,T/ЬAjK1 qJ!ĺjon}?.-Xomf}LDr339<[oպ1E+L2v؟[BYe0A0 zs拪twY;ZCpx>Ūw eR)>40Ne!℩(1ha n=Q/K>u]U75+792XXcB1U],N>~OcܬapiX_wz]甜퐄٥ai+n_ofbtu)eʺY6ֺn8͋r R!~Lǫ+]d, 1Wb{]n$%>tQkѮ88vșZoY1#85Ҋr(Wu1t3{rs*psHBQk**VUӔj.&I SvIgT׬+9Pfw9͎%$@}A-N^.*֪{Tljt1M' IDAT%l?CBtCfhO!Q 1/!)<ڸ;(SuB͋øBSQ"2px&k4ϐ@&8uY)CZyBvB"ŵ 1\˥?I%,pR(`䩻x2IMmJ%.6lgLi!c>̫0% `,+#L) )p%쥬B/RTZOʘs?]URJ/u\!h #%/@>GQgK5(13dU,֔(! E!9DglE)|&(!JA̤ Dz^x@9}L1 R2 ,1ETZ$2Qr׭jR"%@ 3s6%B1t B|#81lIhI%fAd]B$c DE4OԜ_K&`3p1(s,]՚x(]r9)Q2#i4/e%ە:B< \xYekx;$~Sm(5|麐\\ժmeA0eY<,bF nIr8Y%ghMoQ]]Џ㐐պz}ooͶEӾ.deZsAbEo(aJ9 Td}O4w-Kɣ<HE]f)`j6Y؃(J2 uyyva!\VnZ\}M w꺔iN C>+Ɨ5ܔجlALhɤB䛫Z/HwG>tui}rKaXF{ h{&YD* 4o7&@D벬)Pucr@{OA\{:~@)$0e%8r?rBϵWpce:>[ (* |@q4LG&ƔRnye%J,09 $cMiH> e5r-1qPTg۟sULJY*x=c %2d@dH/?_ }| r>_s9BrGc"sNct.09"E Bls~i"2D !#qyRc.Msdsl9KN$Ǣ`BBJn!%dL0tSLyŝБ1M3%$W0 rv#R %'HѢlX R&BB1L)&7F C) __~+Ǐ߾{~k&%ϐŃ4  \]1UnJKm˶,Q1DŽ^ '.W9R☀-}?tCЦl+F4 œ` z92EBŪiv!ETaGKÜ/.Fzя.`"蝭 3 b Q91Uô1ESpB.>E!E)X%YNW!,1ɪFβH܍g޺e$7*UL-ˆ# `ֶؤb˃5&LVl]015( J1|sS_}[oCk]Qҥ>Bm9R>RLqYlߡIsLK\cV^.h+Y%JƜχOUQEmKvs}e玀R%NNOCgBYQa\N0Egܬ 5S7|z? v׵sG9" tmwUq9eJ2`$8gyJ1jۦRLaYyZDxں^ѼlYu5 ]SJ"u>{_]7צ:3DdqOu]&z憐{,"t>Mu!!ͪw_/DN *r◽[L(Ä<}ŚוU</]9%7MQ"'̙S|v#q]5JRmq]n>8O#ONIq1'hyӲ2?];;ts,jOQΐS)M^+x8,΀ R*8L%xHE ({cu[~fӱq).OJ a 4GTɨ:z@j c?E-$WK@ȠnEQ* HE%!S jJ3L1E"<@ PT(pE,Bsƥupy.u,%RS~)OXğw D0"y("slNAgeRΐQ& 1|a _r: AJV(9c2L!\J9)cLJ .g e"K!`!g,sD )YYQ|Zi DT<5CqnbZ>|tXE΅)zQst>PFRvh0[[^o$0/=-2-)0ࢬk9B[oX9_\$,U?iTR+!ӲPg1ow_nnġ_1<%E]s.׌񐲳/u롣;V5y7E*VA1hw[%inVJ1]ź_] 5PdDJ56 J`􀈜y9yp 8?ro/U6F\]=ߴ9~~ihp U\av{wsUj?]͛r*ya{Ud]{ZTJSFqw)~ւ.(զ9ӥH*ǚOpxgwWFo}n`?Ux>%2u\شi'"vf"aE%/rbj7v׿ޭ+3Qk-peA,>永%Dzr7iU"\(~شlgRp#o颔Μ]?N3ݿiV$b!C#gP V‡^R8˾ E!*8rG,efWyoVeiCׯ  i8F70iiJdp&E>0AuSbe)1 B`,Å`f4  ͗o۫o'ퟞn8*˶:]rEE-p+~s;{tw)BSʨsxQ"}dHM Tnw|DR޿BJ!="U@`!sJY 6[`.$!Ř~S?qw n\^U4d`(0/z Rf7ZrwxVucu9w HRBF`qab:Ŝ$!%;i5 )1EN`tBa18˹Fןz F@!h%[2/sJA)PoHX >~o+5 FbU*jXZYo>Ϻ޻RgYxO}G^,0ƴm yNH -A\ǣ TЕ 0'`(@ye!g+9Yș*%bٗ1yΌ X!mdVZe1qNm8? QJ)e=RXU2$3178rU)*>,dt G!n0/S4j 5K%Riއ e8gqJ=K)l)3&,svXVs ͮ?쐡eJ-]oksB\]o_t;- >1gOv>W}ޘ;_.iZ2`]쬯z72Ol}vTm`Su@Md]\퓐P2aw҄lSN18 ƈKGx ~UH(6 CtS|@Ua!eý, #noMqh.24]{nMjkRw},?Jwǔnټ%yl_~%RȒ_B,.Jvm=On>Oov?^]7}a$ H?9h%/kJ( Chb\.\5ѯ6( fLٴDC%xǻWuEdrъWoT_lJeZוF%\Wvn7ӇO#u⌤@$l$\ gZ?<Ǔ wwn|6Q &N]Aez)$o X' ZSInDy+ct}O\0ƏǓ!:pwؔYls 2Sy"%JJR5{]mi=s@w?HHEOG_)d2-3rk6 E;^nDuֻy#o~v٨ΗixLFkz{eٝO\&ekoWov֬~Ly]U@m`Y]]?ݏbmpXz,6s*1HQ ~=AHh{6!HQH@d0hv_/?<|p߾-$Щy] Dq^< Raߵf;.T2dCQB;~e_.K(J`Զfu_cp%$LLq/6.!S2cPJrS"xJ e~UPQ ,R\1\UU4?o?8 hS#$c r@f|TXJ bVM9 /@2_&g0e \4JiED)1 ͈6f7Z gݲ$DjٴR>Y38j)B  Q!\xQ@Ą(JPP $ b.Hij& ]H1ePx!jZ|<+CueN3fr)PUszfߛy||O3VoGS([K AikeY/_Vշ/˧ӡR B]7o!c(J%Xrk(q9"4-7C |]9 x\[3 4k6(R2f_+r>ԶR)E{˸t+bHIu|y>.#2L_qxsеh.X_^ygƧ'm:_v]B 1WuS5~U-+#e 1õs<^fNӧx_9ʾRB^OnovǰD] m)[։JŲ- no߽{5ӷ˴AJ7ZN )y|^`!N v߿~7MΆcIVˆ|Uh= ݾݛ.{<]S1PbS  &XN92JaH 5gQ n|VnT%MUR* 03UdS1@ &9>|'lݴî(B L)RKs!D^dJIR) )䜲g9c1@Apn;OD"@ r!"`($`, FC"PeUF> 2hZ#B8 GSɮce[Q(c!.2&i]_y^-AΟ/?@ԕPӶ-ٝz]51e뵵O_p7WI"e:UW!礵=EOR(m1g Z2]0Od4ms䤷Q5&+p]t딒ۮ5;)uTBl7O4!.@˜b4Oڦw]aܧ4/+6 9D@޹ݫW7WלAiծ2˸\߅ۂLJ"F 9eΫ6Fq酆֬$ f.otnN_~~<<8@(22-Ӈ?攠E>3d$ 03dbg/Wq Y i8wCJTRD([`>gp]@2|6 "\Ot|(-`.ՕD@ x"Tr< :hT`75q}|ve51R&X`#1cʭ! e-A|q֥ed?BɕʜbqVe.ޅRUի~kָ(2M(>Mcj*jVSKf@Oxfk;)$G,$qFޥ` uR$GF 9rc +˷RRsE ?AL%]DZk)e)^ny0ˮ[/r";撤1I*2FA9)b!D R0 UÍU#kFL@ч A!@ヲ IDATJay ޽Ksk\J)B\*J"2\j.Ƅ,\%JQ ig(\a$-8хѥP0SʅsQWJJ$H>X璳!p8C3`Y4A<+sT T .<8yz뾭~ N6pz:V ƕ)X8Eeπ.quWBrׯPŧ5 ~ݧ\T*8JƗ>Øl3ׯϟ_DT6euj+5%*⼬˲Jq]4]mY*T5XUiհ]XCZozIbOvv [jn' *..ъryBvh1H o8٭A .xJ"gm?݇ s 0\.q=g7i+oe]]|PTMs.x"1zzr_W}'s)%DF 4Z2/8žSZo;3!ł@1"U!EBV@2s[UKiꡳ6}nk^NV5*M>ֺu>fc!1- }FJPAe^FV~d},m#6 ͔*bQ}&sm~uw{*!indN*IJ=S\)fWVaew9KHŤA^pdox_7u%1]lAҰqRϧ+Xz{駙+0Fm $3@B$6$!DdZU*.XRJ` 8Zͭ5QU\F~ꛡ1 /f3]t nulpy3i{ZRƆ3FzS1BXacś+t;XkPQ(Ttͯn6eYV.%j ;ZpHv\gMܘ݆J Jr!%B}vg|2 J^wM7)Ӽ0uۦ<s9>?o6WrZ4g\Js`+RNӘBDH0LteX+r*9m00]zflbRi'ƭs ųMm%5 %I]޼n_^.o0_~}Ӏk1$HrS^y&d@Rcۋ#d3*e6qD(N&y<+)ˆ3Uu]-SH1ŐM-Jů9GǬSDx]?}*{:j{>vCi;v}߾ww4xs/yZKfӉ~[WM8}ʨꪺޘvۿy{y7Iʲwm_|yusL}fv&Vx[J&#%Y.!@w[QWW5)._z8=OM񫗅{=hÎ)g|]mՀ4a^s9$H+]oj{R.8 muۏ?^˗KU4жuu`*ѶȺevnzv65]N盻WW\ָ֦eYϧ8m^&"eę*IKB)3%1 \sPmkT2) Zo_=awݶeƳj7OA7=Bƀ )Qn &«p+CtZnBJ"" ò-ATX3pWWROϏޤ&["PT 6u]>/4kDSc-h w9r Y:RT7o,կjp9pI(Ys6reqr`ӊl@O n^ mp3BUk>qWܦ}_ϟ>CAhFt,6Fg-څ낥׈;|L4s!.J#\0@pNf+/ ALɮN<3BR2g=A2b 0u"Trc> oi۶2Zb_xs^Jټ-DF1QyF SF޹%2nkSK4ɭsJ+8(+mɯk4h R"":ѥ Hs˒tayH9 4'fW~ݾy {󶏏:q<!Ar@(\r|BB%XuZ0,Bɹ )G VRfϏ4[ Jhi?`KMJfÆA R޲i\Ȉ_]WU5>&r޽B./_>_]_Ka蛡7w;=tW{] &{tԜljٵ])O?==~[U*hjay" ^P3)nyx0em)' 0F7[sjDD3PiJߘqjԕua]Kpz^2y~_S%.B65z~7})2nj]տٶub I͸BSWw_IKOk?p(~s]n鏏zSh=][9篟\v5myz< -oD0K-t\2mX_VB uݛ4SU%v;|V'V[L M_jOxߝ?o+505mMթqK) Ɯ2,o?ZtD783] $ Ṙ'nù M-(@eiuڻWWOp`# W]ikX}v:R9=yhXmfhۭӘynz*q 3@!!{1cڶ:٥5|z˳xaM|ӡixv>NNnn II>yƨ8RVZS|IYm(vûtP|f##@K_װ2m94 z_U%e}~KAd6|*PFu^׺gv~\L{Kbvb1Wۿ-zn ֐A*x>6 >1`Vjk{ ּ5hZC8ϳ)2dJ1 `.j}Uc(mk%c9%!s bL Q)4ed9B# +f8c2 B^8Cq nUq'*)g(D@/"Q4ϙ^\hFf .Mn !mS b$αx)9xg*s 0v 9D>K!_=cB0).K*=Wz]q^x6`Ff}ױjۘOxF=i c 8gJ>R"@a%H^6CPB 5g*Exmk>~^%x G](Sr&0l5$itr8Bш F ]lwW0ӜRf[mK:J@iFP'KB&eT7Z1n4]N)KR=g ׬ꛖT"[xy~\vX.ݡn .MY0Qj*)<<>xW2;cbY4R^K}.q}0n a|IЂJ&oqϳ#f[0Nono4NBa54×'Zp:lj D_l^7$e{:￯7UW~<Q*XobX 1Og9qӧr9-T׵9rAMS;M Wm<_%d/NRusm9J~_O?}T%O!}R qr9KbZ .gdsF$%2 aPB *Mn* "+󾠫eh&bZUSyk|gX`@]:-Ƭ+D1(A2 `mr7==̇'oU ^vT?'L~մl_Kua:5l dCH4B(TC1N6񰹢Zb\.]&kYM>2+ hΧxXѮK r bPo6C]׵heQ::u-`q_,`R.P7G_z3ٰk-TR)ySL>TXu9\R"&)` IsYRɩJ1˒CSZee^y=9妮C(%Y]Rqc$0NJs}%g&87Tx#4Pɔ?r.c[䗇_[}{/\sA* 䔩0Ƅ8Tb̅PA|Bqt9gJ !g(8Fk1&EJ UM-t%R)HŻs!ӼC %!Qs*X 9"v]%%R.eL sBƅ" . HPra2gW+]yVVjvq;Nxr4dp$h:띍TUS*ͺ "eD eŁuuk쏧ů Ht,ĮMͱ+&U|>Y7K;Xw2rKif5Z c "TJjm~~row)oҸ|cH RF\ce:X1kW0d^ {/2^xY5Ra]v2#`Tw}7cr6B %pWRarq*eR۶kn!{İ R"!骘62\lp185A@k٫7Z^.r$}mxcUq:MhL#۾t+EO|LCuŹ-d% 3d9ڣ#!Π[ꌌMDuYITn;DkpNVID\sas,$G)LɹS/bƈM^+ b!%襾)3H\X % Q?  Z֗7u,ͮ3rcDddVT*u mu 6ZzPIUYӝHÍ̒ݶ_/bq~{l MtPHnjD(ԍ-L1aKmx1@]B- 2 R]sNP2LoZR yr.R뒸WW` !P(!YkRv^,tTcqXIT~?./,H%dBzMPrNR $S,12[JwJ( 1eU㚶r# zz H@ P-W^֢V-_?}yoRX)a@X!ƚT"RIdm3I$x]5%sc) j[}P.sXה3 `0{TZ )13…R*9fEրQeY\Im+_ՕXgؼҶ:شMm:cnƒTrri ׵~ O*  k ƚj۪'"{7MM%ۆϧueW? IDATܺboվ{#uT:nn8zXV5;ՀΙч^S"+੤ X R%#ٵ|8n"h| :gn$AUx͢$JYqן.1THuz5(!$ J)?_PfUƉaY8Slk#5Ue~,M]ջ. ZKz dBmo @M_"auwuSrXSE}zfYT*^./[;]iL@O/_9 +ŹN4 7Ǫ.]o 3!v;צj_/OMﺦJ}HwQDZ*B ƤJHa-mm"Jfpk. vV*2-PixNSeǫ99 `rwu_}vm/ka商s.Myx~w@ǩ}:a##m J<n?8?,몴jۆٴ%!p%vwzuGӕ"yÒf Eh#e&P֕@LB{W+c(H*-ZY9#uI9>|(յ$+JkZMg1mϧ'J6~JΏc\<ʉ9y\^Q<]}SgFi t5ycJkr+G(;e%r BrbcǭmXP ( J @κ!(!muFK% A*Y L$AX(D @BA1yl/K&`RNu_."BYJ J7/n V4aze,GRȀ 3mWLr,AhᴶiM2s$v«NxO!Tʬ|`MUM[;(Jq(!8ޤ )P9)PRTRUrmKe ┋pբ Xmm. Uy %C8K^ȫoiBÐ9|uvX-N>9UۣNz j[|\u~%B~e ]%Wk ޼w^j+8e>~Inpg C3 =4=n]U 򪹲V= }jFZHy:Gx!FFU9O?'*㖅Q-/w;a`mNbX &93N i}˺=as3o}07ǿͻE\×2( x7 o̶1P"|W/u[F~ިǿ*\=i^_w }9Ͽlkhd1!ٗ_ƬoTn의i+Ng4~֘\2MzW>N"qM8͕0j_paS/ JI˙^c/a㶖v AEaZ Ac RJv f/ۡMY8?^uOi~yo=hu? $׿괬V,`feu e0;r]mwyVصphC>?m6%SwJiYB;쮺o aZӺN%{=TVJaU{! hս8O7M0%yJA  .*ϕ "̥df%P0ud*M!57?_X?InvȘ!KyeP(4uJ# m(D8e TVZK!!u2gTYIH1o3  hw%Zl[x8WsA"c.4ϋ0 1`mv̴mǧiJ\b$!i1B- J2 (t ~MJBP4MdFL6PU9su2ʈerJo5HpU7=H2>pErwgo[K@`|WoFa>kf6W7^hʰ5lBm;2|'eөi*8{6,$nyB*2q)q~搛HE6+"?=<`v㹪񸿿*mՐrz_ 3)]e)ZJۺe0"Ӹ,/߱y[.öL,hcq/S|91Gj]nښ JM:lO뮠S"NWG[|>Olu}\x;O$뛝iW[v^b\6n(m}5[:oNg-<>][E!Cٺ2`JCʌC{)n $B<*! W.sb6 .IYr}W1Xe떵%tRkz|Xs ^S4nUZDĐS!b^%H PJV*s9R)(d.2RBSqfwmgTb a8JPa!e]WsN 0".1T HB,BR9XF)KJ) c,D ^vc9lךyK q]咖RV!kNCAH@%@ȲN b5B㵻#㸜O뼌Ι 3 !@I*ѴU@Tk@8i^]-BƉ iH(PV`5*T8\ ȨQq]_66Gc@r[su}(iƜ %(#5[@)H@ign3BD @վmc C(r>u`@Y G T9j V/IHvxLTJ[Yjxm>~m%4ѲB][(N_?~HJuRq`%)ѩ9f4*wљ-$?/_>O+hWTMWmW< @*{9 rvmֱ@68Mir!Bdcw<ʬ0,4@Me|6\k@)R1 24ϧq#(cRN/~ _;u+ʨ-Y"TRھ{k%Z r1ryJ~&"&KG633S^|!Cݵpi a3St+J5XJѲR} hU F 1 0Qz~,%`(9;s0o!,5_μj4cfM]ն$HǸLeBX+Ug*Ⱥ1Jyqu6 +2 BRiTa %KQ^År4jTJfĔ9nK1 kgȮ2_ `?Mr&D_-6)cp? F{YbJ:~u)R JTB%3!Jᒉh&Q^9RIcRJH@Ȕ)s !@)J)B"*+eJ 0R̴5 ( RCXmRk#uJ%k#Jy5nRb):b| Z5;SUi4 [JR!HX}/N ebaʰѬt)"F&ΓnV갻}yy9="@2 asR55n> s۴ZVY68Oڊ3uZ-k1Ea*+ VJh+R4>Uq}!nơ4çS,}Q@" .0N[6 Su֢MT`+EmM]sIÚcq&Q,H @2}Jy.~]7nobH@MM.ss9-)>zlY"q&aE˻;vRe.CސAH%Q%xݛJ&iOOX2h lh\&zKvVضE,5}D?_9* ]RƤHB՗S1iI9+z x6F )Z L4PP0C`kxx|\%l Ķk݅}L~B\Xdۉ;/9L/PVj}X_9-S(EWCRJf@oިr>0mbPU2F4AkAge]kt"PưmjqmCOBkuRE?eR۪tqTErV8.LR|@ %LΚݾieﴕ@9n4q77w]pftR%am.̼NxhJrVQ$\{DTu,J^GM<jYDy KQ*)>{7ڽ\gAWUzTRbL!gZ)8WI%Yq**čP8+0 )kO^-,z) W2S W _._ wW_3SB   J0sU-SA)Bkcuļm˶\2"("Js9Œ3iBrDHB-*bjf s R3}+vRD!Ny2";T%eJw!#{)$H%8P~ma|OO[XQ$jR bPXcHy]#5@Z5knfkptWY?M[out@ |.R8m&Dݴ!t8EZ4Lyӥ Bage,qPJUږ+gs]⭄ jsE3 þmcB6]wyP"ԝ?n猹rוn9'آPۼMM42"+#ڶ2 Peδ5Ɣb.T8X ľ-VPuue7G@kқb9AFgR`+zk/{c5@Zq9N Mmv~ VK`#+cbNvMVϙKJqYmPx3+r1f$ 9A)s@e6R*>Hu B+YZ)M$($%PIUse(%X%U0q|Ӫwo@i${x|yڳJ)8X},9B@JBg".R2}m˸|9(Gϧ1klU1yuIaF.i[!l,B|,dBnDQSgġ%&(o]wt˳\U6mM3H+*pu- tB*T,LJS\Xœ9^K pmn*%߿mc()Vi"2 TP5(k#%{_@(@ȹPakM[́Y@ M?A s@)T&bg<͹d"RYk6aqOaR dWkǟ'X!T╄JD̄'"(D R #(0%Ni ! "Ι^ ,J-$$.TcPbi}ʌ}1 rAP#& !Q]۾cQ)E$?< nP< iD*&miBT2N)XmnބSCT =Za%%xuy;^X]+ZgJBμRB}ǸY&w˺-o+wv˼XcBȑJ2L1MɦvJkTvwlQ m(%2y<qhvzmҶ& IDATem a+!@V+D@ƈu H p֡traYiaJ`+q|0TV%YIFUYVM"T6WG/u̱N7F%3]OٝNy}]O.?/Ⲑ߽ FAH FC.B)hJbbӖh\o+}ضy:c_.?HWWVD48y^zzJi(k|I<6V]nBXȪV;< !G[grVhf*[JRq#-Ę:_OOø0}7p|?|.i WLdRjc pp E`msZIکjd!eHõ .Jm%o<K ䷄H!m)$B(k+"1ŘsNT^ѧY2Fiec*뺦8BJ4Nm#$,:a@Y %*QTQ0kU2eƘ2&0S9XB `Ɯw;e.E0sig=1 ~ FX,[ȑ%^y],(:4%eֺnVyMyNia ]~'>@@/LoyD@кNw2??]H)yZ[cMJR4k&l[RUUi]I4uJLԴoP5KA( @uX'kʨLO@ XwK!hj1k" !n_VbS ضxwg=?\.LVa*MOE3r9\SgYcj!2/_.ďYr=ݮ5{Xzת gtUbYNC\$VB.mV?zx9GG@EBwwYHk攦KN˶psncijݛ7}5\^KLX`KNas\k-EW'̬-/Ӫt9殗_>= ӸƀNaa\O5D&fn_Ƕ5ZqўsJ2 /콯*Ȯu )SY p54'QvPJl2(EN/ums}N?Sw چ%SNH%?>,XK=*)&dB˜󚉘 \( =3S`ȉs~W7ͺR(Ŵ]_#Jij<| 'x=SfQ̲p! DJ#"[E|%K1 Jbܠ|!`)%,_LGED(u1m>"0TU#LȄBhf A0? ӯ!ԯ632$Ϯ 9F=I J)BjATJ))mK1Չ &"RR>lGF׵rKJPB@%Q:i ƘBQ) H0J[-K",!@ 1@}>sB,$`.کUZjS,J *B@u#TO?~yw/9ϗu8dzբ߫7U6m[Vu&f!$el Mg]-5B fvu5O/Ϗct}Re]W iVJt9ڮm+p'}[/9yO9$b~焤o:dxZc䧧]rP!*U(Mg~1 oVb<3sY#5C&^ūLfmgi!ۺ'9̗1$^7  º 9f Fr{oqp3_Nh-=4G̼  M=l J]7E#>>r`iKy7P qKYmk*|*ջI9Mc6ZFk`ɯxAUrT;Xh\4.)d&Jnd4yYB\JH t|BhmS%)SVGWb@j;2 9C޿vϒ5zXN1!k +,K}*iQo߼~_m|FJGBR~ƥTUv]ki1^`2Fygb+J@DU(Z(m7\x:?4{4 nqrcjʚBNV4TE RW u}-qFZvUQ@*e:-U%VEStK 1 ehzF\SQjݻŪa7cm^m7"_3x }\a߀imb9ZE0Z$QO3%W lպ񶔨5 9ʹڜYx2ϗrһw&Z2:Bzi-Ƙ2VT:5ORVv\OP\187f<~ΙT8ttrSa`gckk[m8\Qams)TEz޽'DPڐ折a:]ϗeI!$@6i֣t2"LY,f^3I |A-dLm{. -ƪņ˒-Tvջ7_>-5u۹ 8^;mtYSs,ê[b采l6;E!FoG@r=Zʼnw+q>]2vcV[7~חk{:|t0QSMVհkﶮƮt:pG9Đ R324z_J^Oa޿>)cXdq~P Qm4S///qo.?n+XKu+)VB\aR* ׫fVFeH{rfhu{Ct hε[||^'(z<Ԋlہ޼5m \x!朁HuBLǾS%4_u,k5JHyk ެܒ̋z] G~Zn1ZX(t *ʷ/ڠwy͒ !Jֿ#̐snΘFr)Fi5TTs\J)s)sʉK@7BT\3X!" CU@HS+"K@ Ai4~gyV`1TҼ@eHʱ2w=`΂@~hxZ4i%u +Xz:⒗%sbαDKд/!B [ ֵZ݊VkkCUk`NM4el:H Rݽt8m5%9Lg\zo_ϟFַ-|:y };͇aٝ.uLﺮ{zzO?|ccZ:4wۻ1g5 nҶEߙq6o7cTP`o6RO$WLڔmw:")@hVs ݻ7%}5X=0㧏?sMg cû}|xWXoo0Ysa*9W@ A.jcoq}׳K)qӫvéLG|f?lCnQa^&y;4 S?Z-l[ x|>}鴟}_߮tIeׅsx ίVu\QkͷC˶+m+e &Tz8Z a `-nox^ [8Y=~/O/y>G+EK*z<洤eN "]z>>A{ݽ2j6U|׵Ɗ6ڮy6me iӟ%zov;Y雿Cc t:әa7FX_bJ׮SrO0^V+  t?@vOԐ>4/ ř7w۟X᷿_%x<oܷ߼6VT^\lCHDMw IDATKeaaP{՛zf^C0-h#2Q)%t8k/ݭvOUm۷?|x M,7߭׻qKE!+޾QƪaƒJZ TXBPjTg0ti i!(ê٤}ظ<qLnn@z/Ӆr* E,!9@4HnaY W@"0H9l^@F N1Z \jbZtɠ40` YPDu\RN`ML,acm_"R}㘸rAM(nŠqT.Eos: b:Ri%7*]&R TTRk- EXj1JP U njʵ&HY7dJ9NKʅkaaMZ[p)QoSJ].RRZDǹ2Z"s9kPɌ_ %t#3X+I:^K˫ׇy93z]%eڐwvtw+T I[U?4Řb,ڲ@0CYBe:ehMy8 V}UU_sz8+x7&ٽ}ħK:vۮ6vݯvԒӏA)Rv*l:O7[KumC/9\?efr?f7:9LS7ի `57P)qݎ^NKG ޕuZիE|cYm5$r\R1k}}^jsr"կ܅p%?#)͇x8y7tvB#c<\Q1Ii!Rj·@ιog_6mXǮaY/%'ӿ։I46HOt|}k< -enm=~xL\/I94 aTJnnkg{ZkuAXo7Gu 妉ume2IVCvWAi[yΦIbӼoy^fRkV aN0R o;ErR|8ߢkT4^ks./{ݶkpش98?^§/XNtvRϟ~ScSW4fևs3gh6ݩfRJsR)GKJ%d@ZkU`ٌ)HUJBb cQP"iRP@ rDRh jUW2,$W*)X7ERP /CbI_F:2 2 T۱VL@@4Fs9EP \0PRpE H@ @4Z@-[6҂s.s*  d\kaV""sEDZcEB(Uw Oa9 zkIae/UjVǒbI nK$45で4p&k"V F,)d2H C.4KN{girșHz5?ˌt\9JKh"|>RH΋(1d[͒xCukKE,E"ϧmpmtR3:HVشd{( BV af}IK$Q~x^*R@[STvҍ׶VJ +h2Veƴ,~ݹsJmEZ/!@rTDaܿ٬7QJZu%v\յZ#VCJ9Z{I)!_O()gQr |2~m6Y}/5γ.D-ǜf%Pڀ\uޮ89esL<+zجWͦ;cH)my|Ɵ>^.uXOӟ^p9d [AmCJ/|~wڮ:צ'5K/T2l{o^;݂Qq%@~wxi TD8YonSbm6Wa)߳ͻww俔 49׶=#)^V,0.}#yS)g]w(DQozƒ<-_>˩0WE.N9g} Ʃ\/%v jzMPo5%\2?޾Lm mv5S\`(xCWK Rb*(Z T OS.1/ hAa&~(]r Wjuvw_i^ΧiKFtii),j])eoacB23@b'cvQAڣЯo?/X6{^ڦIa fSRXY]-ra"fCөV֧*ǔc?@PBHӴ5h 2\S%/54`ӷ­MWX@ 0TiE,\H)^7Rr9T$%J_uBHH UnS"+/h*\s1rRI|\JŔdaƒV j,R`=n *C ȂA/ ,Yt1 "9ڶsD[RC*sk{ڔJ轾Q!B\g ]`>Kq眐V PT&A͂D@!"*Dدh4N3YfqJ\e?{ZxE)4Z @.%sF(jXEJ3oj!IEh ]5$賨a\/S $+ 8-yI0. A.TN256fή^j\u"'j Za֚xwo޼<^S*Ey^`9eXONm}.&{# CWYֵx֚rN9k?[h [vm@ odI\5tNw):?BHUDK_ropy/y|y fկ/._Ɥmf):U/SI)0,?11s)>\ks/~}ŸoQ\jX?>/Us͂=vkZW\U*cJq]4cy[xjVS3W{m=<`PQ IZHFD(UIkmhhyy~^jnwӻz[i?~Z0m9 6)a(a!qU?\ʼRXJD޻ncA%×Ǐ,҇.C7oאJe*s5N X yIKS@3o[˧0# 4|rƈa'ũbwڒВsK!\se5%"32iJgf^+Zo-K {poL% #VzGb&fss5ڴumK-5L|NMKdRj!!Vn7.ݲ/?o?u)}wE۔x?x W_]o %Kb * Ui̗ϯ9=o[!qۍmh$>9V/ϟbX>Bal |/Z&UvE+$@^}pΟ/\Ӕt?9c )@ %9˜i]~9ІI>/VB%(Øu*7ur2|8zi~YfZnr2` [ B d✳Pj|EZmv29Â"Y5 =q.,abZPHz U^fߩ>7Zz:L4 #tĈYR7^·8^2d+]Tmki*oo}c/ 2@Vbq:OOIk*Jm%M2D²1 &Ʀr֕ę1`49S%FZ mӮ/ӧK_PTBo+W|`W)LJC.ZBY RƘ*4ej zmD_Vy/9f[! +Jjki @ԚsuCY[iRFCY)@o,Ȅ1f"!l$`F,ENYQJĘ-)P("HQB3 @Z,ڶ"NC~w!(Z7؄"eP2![YTZ̘ (@%IKJJ)Ȕ߆D92 D,Z3u XIވRL!MSX0z1NmӢ!CJg& e@}IJ,v*]Vdx9ͯG#oJh8^EFJBLu ւ6P7n2bfާqC)aݺʦ_^_÷ m]tN ~3a=g(ҴS ͮE1,I \)syb]1^bk*da$kAk3?>JMu]!)g)3se4fnT_S2ߙvmZV2BVwޓsw}u}??AimbHE=Ee R?vPO?z(l!Op4۶m?~Gdi2fW4u B̒d50fu I1__Ret{n_umsz:ȸh\%¹OR,%9'MQڲUY_|y}Znk.)Uf%fu_~2Bǩ@iѶ+v% '8h)i4O] O|~~|7n5>ġ¡VBxz!99 )Xbin 4fǗ)~A!sp H1e203́*'%]f N 1U GZُ˹y~"t SÔLXnӶg8&jIrU|B_~n)H-߽v#7+[ܭ|:?/ei00z)e  -TQ˧/n2/_|H11i12v*.~zzb'beh흰O}f1E`V:7B}|aȍ/矿쯛uK=P7ȜǓ_:I!8KSyYH%0z",>$62ƠLO?}]_ a3=?1>gʛXTds7FMd=9YiJJ IDAT1g@H4i `PWu)I zĔ3] eUYǙ'fBdBSNjs(0Ad 2RJ!!̀ZTbF@`YK >!1oJ·Hm9YVh#D)'&"=>shTFd-E3ys&JsL18HCؕ`,-K`k6h,Ĝje$ b&B@)Qs93eN-"rJ!BJQ!}; )(ic6/eÔJjZ+TH ig.$ݞfE ŜyZ||ރ1TUeAwnYFx" 7jf_~x>Ӓ ǸnH_KęM0O/iYRP8Wև{v6IR@fEL zUN8ebY!Ȉ5jcVZSX-lSUM)>??dRq1VTW/Hr_Χ%4])y9؜4__rX^ݦ[PR&PaYt8O?g koWf9'|y_ȶo~WVWmUZRCw8j (ҥ'=חo<>?=ޔiz|lnWmKJ *2e__zc0^//]ߧZVe YlWY12<ǜ~vov=L4"-p^Dd!ĂHDžNw￿.{:cмD[ץm ta9RB̑ڪ?f\_mO!SdqfMk/9!%z>24a׉VJn 9wjY6vlW!@)uss۔1VcL!4uחyU3K\P69ɥc?u%"rN! p\u2=_^i?%g#a^ժc KŃòt8OOK]owun^ݾCBf!}̗K9q'ЍDv](~UT0pP*loq>-'ߝ2kPZ]ʸߗ:痗ϼq>Q*=]Ǜ{o_~ 7zF9iiͥe%~{`b!:UEQ(8e\ŸLLi.3syauru׶tyaN38 |9@L)3FDݮJ"/^)ED}bW#R  "33`J RCΙFo׈ȂWķJ fF!m7u_iI2XW iP*! YD)N* QD!D9bΘ:!`+Pc@Ȭe J00>'ߙ]UeVk$(py?#f^Uev?=@ ~|XrJ޶{ceΟw f1O0c_OPM^OX@aEn _[k[ vxl.=_LE%ezy.Y)7R KxT`jجaŲDP-9O0ެ\#EYo4@lRJ! aLLԻoWiM[Qϴ<|z˓olU™s7M9x>.R*>@6j#m,!LgABjy>?˒"ve f]M]q"))UvsULqݘ3tG1L)(#U Jm27~V/dž:#hec \ZRwIx6@pu^mwl{?qF%T nUD-3sÂ>A]+f Fօs% e~3 GBSۦPΩ뫶돏^21TT M&z閤V]oXZ"ޟ!tb˺eSʀ4,<iBಬ[YmxSih\\&(EJ8-csfgqγ$%[v<^ p+\ioAHA4 tYTm+!u u9̌,(5H('Z2 Ȁ9CNr Rjf3 B|U0"`1fb!$0-)[`)1X|YLHF#"VRri$! L!PęBbWR#7޲@ %AD3H9{4 *cݴPIs)ǙSG)5@ (#TQ|6 @+esm9-X48N4͋ 0aAҁu]u"(ʩEI)- 2-EYlsΙesd$Wݭu ~t҈ubu?fv1J7SI6FpӃz}8.i#r2' ZKIq+^z(Jg2 !,>zuHuiVɳ.@xxB Z YCwɒCpy2n&>O".m%]#!$ UFݹvZ+bs?s)x>~Ϗ,]Of0i#q[vu~Y KHOp])>V^_,2&V1MkvUiR3ij?FDZ}b˯_~nLsL@1"b?5uQG hc/]7.MR>VR8O>xcRF5eN|me2^S]kO?= p~1M }iruV>sLvjaE:Mi]*th_WᕤPZ>§"ּYf#Vk.k\7ٙwm 'ˣ&aN2PTHjVIdŇ$R C S%F{) %Tڙ)]a7kyQS/8­KQF+`A A.1_0Oj: %YɦpqY)G}/+FtOϹYSs Xt$,| їnՙ|}WߖU1?>հmYI=jENc "PVC1"Vrf٬`B4q B@ gD$ &O!5ڠVmj])LF ief!SL#z-[ Z0N|9yLjƂY9i|Bi e?S7HR4R(d.u! ǩ?NU]"?̱q0e`QW#@ȚY ,  R2DDh0g @[%_B, A5*$_]/0Nt:bDO`r)ZSΜ2sz@˔! c$crJ 3=X @}Z4yn 9N0 9gc- HW 3/ϙ!F 0cLRIY@1H1)h Q")WCwQ&irYUV1!ಔWzNSU@xBIhiʡS^,)ZIBLX.dQ(Pyy.|?}^lA$-U!y$YMهQqUP{U߮2r+-V;S56(M91cʬF؂S,7p 4qݻ=NOZܬtqD|IuU##lePjWer<^ss"Zݶ/EnXiQe 30M vrm@f87ThVRVRLaKH1ye#K {خ2/#H"-P*"TŔ!trLƪV;s:]y1:g%(R ^틱Tcw/~yaA-Ax)lۭ?؛뛗0+VcQ cDq8cQ[9.|8dUr=9 K!Zs[NvBZTUÇfǹ8= OqʪZ7vUry|"d/U b<-s\iSF0}fhjT.K;)B@"犂A(f5vj֡1jѫxFfL rH!%M}!qtR쯜1wR9bB1|k '(9)9s&4Z930h U)Ɩew5eFf BJSBf ̜3AB׳|;X!F@RHo'Q*)`o0 f5SW@ 1t30e1 r9Q ?ӓׂM W]5B@a(dDRq.9`CjeRJU!z{x0KhנpN X5&1晓6XǩtiUC7a\j[?/ew/.^Z)rLs*aJiFQJ+9q%r)mweҝ4ӹ{x^O?1 &'v7-60kH\[]-_fJԝ?7?씲_ |zhhP_5@R2ˢ?^?>|~h*iH@ sEO_޿B 7[TVeEϏkyn7e-{/?ij6J 1 + )BX)+=υžL[mAiHD#)teY$0n6͜K@+sꆩ_:`c^7t:%q}H WzI1# !,9~Ѓ3I,}@òֱ]WWfwPUˢTƨ,a8i NU6RH-dL10@Ny)N\_~xx84ߵUSö*7ˏNq\ p}g LXb}^_̼u߼ۼL㏗»_<1׻"S,6e#A6c%!fժ(t GvNXrL1gcjsl ֪ZGA  jəf@CRւs`fL$V޺+a 5W" 䔙߶oނ ,2fp@PT B 9gƜ 1 8TY 0NoZQPBLl ٶզ, 4y!cIEi6ħ#YVG羦z "+BބB2 Y H1ze WW$e )k̙211pmnԘ8/%j.*B<9C  >]\M]zͽթp,lӸ.y:΂6׻6_ V UN:oj{I!>Nq&^t/8]ϐ˚ -w7jME}\.~)|K}s=1&S%(6rQ)nf79 IDATm)B !g`bo0,ǔy>z@J9{ĩ,UݸCF䜿zRBQHiL}QQ̙HQ(a%R(QmkU10J(OGs( L JqU) Sz~9aB~R]Zn 90dJ% "fI^9$"U,KQ`Ke`FT(#k))< ˹;oN)0 ,_^Fq)󩻌yZ0bRXa1L!4uS4U9]ꧡ{-߯˒?PJ[{~~LfS& tEc$=خ˲ѧ9"5U^`p ZCN@2s nq0Vkj5ڡhQ҃.kMBz-jUçuΉ! տ˾nTZ^VUyؓ伆2n؟%A8^ ]dS+e}wL9s4ZPlK[a(8,S0IvG/UfǎO׮HBt/2څۍq3b\o+uδݛ ΃:q! F fƬ֦n+YĪ֪}Q׮MUu!$SB4Qfb. &r1 <{"D2fx [NS(iY&@VB,K*WMۖǩɿu/Ͷ~39K K)_9e"1]cp=,~X J\ eq>$,l `, Sϗn Y`xy?<[VW^pWRŔu-$**:/~<~KQoޮW!K~=MYy8 9z[m6kb*tXe1Ƙ C6SHݝk64c1hW+/8)T)\$C ‡8?2ou'TpA  Jm=QI*i e^i9/$mgmPYl- "ڵmc+{:ӤTkS/> %Ѩʱ\}j״MeISOOgY՛yF˱UkfCiQS07z y~L ޴ofo-?t\h Ť\VBUuù >E8 CdW߿}w9~q, ^^B5hnWKAxAKVڟ1$9Q6LyQ ^v0x:qTƈBnvfYnw(E>~<Hf͇7z/90ѻZ)5ϋUMJTpV=9P(`Oo8 m}vklisNY}xp ]Gum`Y F0nnps8dRdE*ujHA!s~ g Sda&o|F$lv-x鵤KsR6ڼqf.5vCz S !5fC냈VŦ^3+mp#d 4Q߾jyr#fC%g *AV[rOx3Zx5jɴ U ?¨glu^'HM&m][;8\딣TVSn^UMi8qYthXa0s,s|ym~zs?`p^4鲄g(A(!12S Q p EUugL1O٪8iK ,\@ JuhFiZkbǔmI+gm '58 UD@DX _O[[BT`2 D 6M6JЪ64>>#z#u]K`y:B.3?$nC KY@z9K80_ %S6?@L_9Y),y*ÛnRvضu{~:νKd_NǼ,FUm)pnWn6ژ>?~)WUɹkhflv/Oc:ےpnViHeGbVT~~ [97{5̬Hks)0͋||~z>/K0Vu|u T׮i9O:~}r|=_J FJFEpfj/wp!Lc}nk1rRB1^ĀlvZ䃿Ng^<4Ozs׏?O>qےS.4-T5@_uZg 0ҭi ,H ciij%Sƀk$'\P*\eʳfvJU^ݡ[/ǟ62S/kwuڒjS?TWe&d`թYM pY)O㲔`s9&TZ& )rо>˴iRø@]3@ @bKX֛j9\ƉE3kUh,1v//㥟CAJSUa_5]X2 i&Rj8WZ;?9FB sVm"SlNk,DSyBetf8*|3koHӔ8+TV 4׳p:_B ,"ԋu UDʵMXO}V.q[zY}w8^OCYR]C~u9QjA3k*V%[+,Jv}5]մU}ɊZ2~y ޽#OG$ R1p AO2].%@m/?NZh鱌X M ӲCdXR\fm[}O|\>o@QLm4]9gpw{߄i<jTZ8S7{~y_`0 5X8Y=p`O ZR;zW*Ͻ4t۔?9z"1z|Z~JE>?5n;ݭ󗇇iϿo>[9$#,V |˗~|mZ)W..EǾ[7fa` 4 KO,Z3_Ӷy} ?C֚;?cɘNy{swc_?zZPJQ㹜@mwʚ cs"adK.0djU(fFb*Yݵw2_N.شpC MެL"VM< &0 r*/ϧ~_FpNopGP-ڤPs1Kz[<asI^K]CXkA8}"U պ;]p{y|샇kHsaS X"m[<<_@;PƪrU眝SںVxuhUe1ڥ~|}=sJEUl~gOutPFW: DT+jE0µHL0I"H)^7~ysErۺ骜xRDXOYx|e8\b"RbJZCf9ǘ8MLmkg)J+Tc'b1sQ+eњ %R fFy%L gDVi%MwsAJUm:giJ%^*;pn?|PF56fvJxy99  1!E LJ)лMe3@ʹv`nM}ZmUʀ fa"14q9M0i mhM 9ޮl2% 9@7[wsYu- ~tFb20f6mSbz2#Zݶ]KKԊf3N}RU@%1%LA8$'WSݘ{a˟H7cHE.8b<^77u]hi9% f30߬ۦ~}̵sMeIdmmUC]GzkUZץ e<"%'ub_.8V$bVJ1!1Պ˕T&ȥsy^r \9SUFY!T9KX(p`De)&cir+CLiUJ¥PU5D)`9)4!%In|ƀ0sΐ"F1+2Եu%9J)JM4mAiF3#4HH nt+"MWownIZ뺭7붭ezz"PD 90)H$`j[S.2 8PPwf'F/'A՞}!Tj`KZ`/eBtje6ei@TƮ9S4+MvoWv IDATmR" I!fl ְb@y_R]Շ8Z4 RI[LSajƗ!+2cTQe{nfI1a.9WFvsv+l\TޟqR8(C&%8$$<~R֫zV]-pz<ͧ٪a_LhcMv@fK 52\lUL*D=笴M.(Yې}SᅢykfoW(4OS9SRR]ӼA/Էk8oo9*[ q`AR(Y #hbeS{mf/❅"8'A5#Xvݭŧشp64(HT`/gq]R)EB9U]BU[ƒ9fAnknq4Tw9c[E轔D!L j3)]owIL96j\2[k\ r࣏ ԍ2V S\ F9!Gb"2$R Rb*c($rSr >̤J;BB+9J9\ !B 54 S.nnjvYk/@V)Rs%'P2 Am RqNۦaN Կ>LYcqf[jQӹ#rXťdh0ڶCg8i|y((noJ5(,qYœv#uXhUWn=h]/KӗhV jzm ҄,Ms~BikɻKLKD з9$x~1KfyYGc~waYSqs826Qy~U@11:RlY=Z ۲: G 1,( kMʂT6[/TTj[q߽CL2p#kR_>?ƴtHJI8CZ]/gm0aA:%?x咴砮TS2UŹ9y\3]3KĹ0Vkպjܷvnur13Cf%J 7jnrqࡥkyv߽~K&DR)p)MuU[R.0 3j[*\ۮrN))AD)6̜b @ϳ !yI3`,&zエ_Gk^" &k^fu׀J)RDED\%,P׆HDJ"7*R 1KBBDZ+A92 ! >Pi5rbjcs b*YQ9S /qVPbʾjAcզ[U)a|e|!Rq2SLm Tv |zR59(,qcD8sD˺]#i1Z"VF_i&*s.|>}B YW+}a."R[ZٜJa p{GiB ̟??woG7GW˲gq)q G$yPR]kUVheLޚ&i!A,&\Pve3% @앂Ȝ'Uk$,|޼欇?ChWY^).4炮FTh[hWզr5*8ӜXu~ YR[᭵9*f̙C)Cl5I@}땹I1q&Xu8N(UVkRIky^>ps?QmJ)1\Hk$)LqeYݶm{2L3V5zw_f7[rPQ~BN8|~RR+ݵguV !,:ӴF;c>}/ThY@MV3C"T֫XUVܮY[my Cת%P ' dĸ,S .77p{l+D,8Ԓ"]-̜b6JkK([R8F?̈ev7fU qs~2~iYOO/bΠE?U2)(d$b9<%YiS+V@kv/ϧz)& 5w3r,!4Rb8SAMU`ޗHJBUYV!2K!;VBSI󲈲܏wK^e05_࣠H۩fm%|&8 Em+!RRDkjϥ7[eT_?7//NLԔ׊ۺ@ 9i0%3*Pn5gHv ÿm^}|q<563̞_bJ[k%Dhi Rոq۴{•oq̮e:91߹U]qu֮ET)z|྇>nOvm7M?c{| 4|7u!p Z` 28 w*28Nz>}>c?u)zæ|x gtvf K+MzsH9ɺoçsbìv,9U7#R9G o]H_>}޼S:v=mय़fDLF$lJS^ˎɕjk#DDRltؼ¼ϐlSǓ q>8ypef_k}k( I+EFu[/ӧ/BSԄn8Oà4tZ(滛Tpfx&a^4al,h Ef%a>j m0 TԴ6痗)2E ֏?M_>ndWٳm " saUWf*x>ϧ8!Fb(ŧJCy` ĜJM`"ek\K;n#!13[kYXPnsΊ4"0 R/] V)CD uz^FJ)9J)ĔFf3KYID,)AJ J#E=Oct i4D"\jBk}x)liM9y)lKcę  %SD#g4yw-wjC>|a/ڹ_3txSpنA3L+(׻:H}}ʌjfeNFIMT<嘙*$5maA2/$+(nU!e^B^&>g4ʠVǏ bіvn s s|[2c? FHfWm,]w{O$p8|uN|?Ál?^__u75:۶u{dbq,FnRaPW]ciӲ9-vQ=S i%΀ k=)4a+y)}[m_~>Xn!mIV`*Hdj?ל2B&v{Hezu|A;pqu).+Ғrix[n׸8+f KSXxs?dP1$kUWMگi 1+Z6ۂȤsb1 8KWY)!091U@%өg(eQo{xx>̶Ҋ1uARi+[XA3( UeJV4* 8q\#^ҞpZqu 00 +bCKE$/SD ]_E.Kq+6U@@*910#0"]J@8e1$%z9H4!22 j\B/refa %|}`9aYňj]|񜺖,t ݬx rɺ_RGӟZaԒkUY46 @X28,W4 iw_`mUo~<Os\uPShjs|,Fm& 9Ŕ!*Q&ղFO&{[qaYJ۶iz9%~ӵIvW\q~9O)jl"5 IDATn.ooFce/6; 4 uɯaE0 8af%xĈVAc MEtvDZuMvCpܽ-߾۟}S_ݔ)ScsHCsQ5,)bUJ*z~|z:VDlfoYr:Dhn(mW^цhc P #U0y=ܽi%*`|NB(PX5D lf(Z I)mb^c\]m )ecv{e,X'Emn8˺f!Y |Z`Kՠ) W2ti.I8~k eչXg!ld}9χQʡTΚTc1G*YS`^ VY-u"s0B[+@m:B56d{VJ %KYѠhEy!NpN9**휊)%c-5)kEPANC$)i~172e L$9,HZ?F| "R䢳\@!Y !) "|Ѧ^C (Z@p#% (2pII@ BcFyDDD 8#o %C@)40%go-ZkJk/FIu>v0 1 kFi}!3jM `VJEBbbuYò։3W-njtcfșmeN),X֑X Mg̀yYAA H3&Xd @TFºb@LIX1o8== өL[m e^aĥ]e,lx:Yۆ4ȕjS󦫵%JT"ebIWWt{{%󜋊~V!tǀ`6BR7,EWE+;}} +M w_}nޔeI2̄jw۝qEj ۔ײxr䜦y\%p0IIk isww7+Tjӵʧ~703A. ۑ'ΤR ptL9r֪۲.(Kzt [JDƒ2RV;pٚ4ցҦ?DRl4eW֕1ԯl$Z%0qiiz9 )1  r/~^pژZpqX[˦BMsXC^l%iYDUtSJ+(9df,œsr]fi#,I4G (`$1t>SBJ**mfeXX 5*"#3R: ҨYQ4kE&+.n !Z?Yd4uH\%A.u4V5+D袷ENK)$ɜ9 !"p9ϑRcxY.d^(ŗCk "4Fc8*R"09g1F;g tк"TQ p^q:[\q)Eڭ 1ؔRQWjː9̪)FzO~BΠE%mr1s1ӊo:^uYe`] +U8 bHrJ&[bX=sN,Яj4͟7߶HvS9߾\)ݮqmcq<8$Byj aϦ֤e=?GP % s -)%/rz:0Z-$۷*5eDX)IBC 0 5`-Nnm@9h!²)`朹,T6UUO&JZAʗr\o~us}E//qϏg8#hЮys%ʢj~|E۫UXOq/eΘ0gtF+˜/q$Phm}8|ys,>sO)HS, οSBPÛG}uKsPU6Fۘi~> 0~g?JsVi'ory%XHd"d_QZՄ|>P6PTpmHO6*6+g= }@j 0Ct_?_% P_mr¯ # i`MAwP$83=GS Tm+կ^ݸ-+ӇS+ 0n@4KVeY0q*h m f(sVZ@)q$9fat9(ńxX|x,?~|-A`BP 2!g"HW했1a!Q2b q50i|i6pz\OKƯ=/q]-jz7ǵO99# ^!",=2R6BT*T%`<[?[lc )hqUQY^/]nʶkSӯχ&ʸ ~6@Fmv]f_~YČSQ^ 8d<>)l2Ӵ.kU39"¾ ,Ⱥ &+G<._t7G i[s܏q۫b@1n[*1V;鴌flyN׍UZABK9@]+t_?\mA< , c>?Uyxv?}g O2-M}ߔeb2q]mx><|J#߿?MvRźj<6G(w߽ٽn`_>=<栔Mz4?K86]6b*Ub jbu ʢ ,Tanwݛ[?q`5c7W >zRO;]skOTv?[yǥ`VB,"v-\K@p<ϒl6FY GQxƗ#8S݇ãz_s?}y?V̻g>N~%=\ =˨hraI-_jR~iT/2& \ImWWܦi5ry~\  ԍ~aUm=C @S6,KG,pÄ%ڥ2u: fxeL :Jr˪Ph?fI kM$G!YPFE!I^ xFk&.%2e9{kX~_9kV@S1zjH22"(ڠHf)\@2\ @dF@RD$I2s)\B_J$"*qKVU\EP RbkDDXᲧ@/6VABiL,)C|?޾f`wD8!hH.3]baAPV@X` Bu]u5du!(O/u_C4%y,~]sLyżFP$rJ9B"kX⊬5@[¦,RcMӵveO^;t_Rg:7[$E2t"IrwwUn*Ӟ21uuU 42[9OdsCn78#Sݬ>* EB 10 L\$0$C^)yKD&1g [PA鶛+_ǧLJC&(98L~n: 8Ng _<T]]5WWys+ Q\y#.^, 1~8=gUmvd~8.3Jmw-WG0cJVPT_t~Y^s&AI_*u&D`\77ױ"M[յiW:!5xاUs^'X3ܾt=}|| ٚ+IӪmVs!\|YxiuJ2aɶTeicq >p??>LO+B"M`LUS۝rq7t>vﷷ}GLJ4ݏ`[zU}IY|4=yi|9tH8orC.SҬ#1bբRfVXM[!A @TՅ&sx8~iq|m.弦SU:T9 3ti m 4gaR|+h‚{}KR3\UFcah]m]/O˷]Ϗjur,S%(!eT**P3$)mژ"~It. Rf]SO0麽1EXi X)7)d .(Z$cȧq:x9zs[:r:/Ƞ2 B)eüpߧĚi. X!,( * ČF R$_Z>X4$!Z5ZeYSL!eQQ)\r>D{*Ke _8f@塯Cū,pi۽!jDYJ9/aDZBEJb,!0, ꛜ3(}K)%%"(d9 "Z!W21=,scu Р_ݻr! 3QD Z%$4U@`rQ*)u>=̋[4&9 Bd-@Z\H܏-r|Y6u/t+Gj6z{k)۶,]= UZ Kx~>es] 0rj777׏˺FarEa]Q2yZ4r ²ВiXW}g&t&H)szsx/x "T$p0mʦ-6MѰ-Ƅ~eHJާe >d =ܧyh6J;c (֢B)* @x>zroVؘX|u6fɒ%{{cYeb*c F#x1nDP$ l1ղit9. [WsfaX_z y{o_qbqoqMsnߴqk}1?ӹ EPkۯnv/R˲ƼҠid R1+<ͦ(K=4*nwMQUWl# |*׿<_+j;!ZO9,ÄȈ`pEL¹lBiJ`J2\PxEbc>9R!p+UΨҪx8ua^8'>=ϫS i_:K.A[}AZJ]]+SSZQ*_ R%B |9̰>Mi9Ck4RJ7g˜b*_s.19e;ٺoM@R؂91#47jWnr~eNˍnS)|ST$yz:Nqjs$/Wn*lߏ) wY$9GD@aM"= .8~[~䖿 Q82!{(T^w3Å߈jhȀCV"$#f_S!mŊՐHH\/Zv9_>_ܚjF}uO?9,o>|~\ݟ'w˯~7ߏ= IDAT|7k^\tJs ~mmE*Zu]/X/Ma}=t&=ck"5AP77g$3u|s]]>>y_/~q7ߪng>}Z`x)[eI$*JL{ܼRMw1LJoO>fr> T53ea<Ư~Yg_ֿQ>nnLe\jQ$lAovP٦ir3H-o_a*_k×_._o]v<~x~Z&W2e)_áQ+;1%.sSuJd}+jBL@)*MC^Z?wv#ihv^2(R}#ںrC4frw m^憌Lu-^RO }r8mTU-RZ/EħӎJ,Ͷ\vfTѣWXhYUL%C .-( K)>6jKh I()"g:&TbŴZ*̬Ldj w7]LJqwEUu^)HDϬ92~(*]x, x~|\d|\.)WG=ݻUw90z f@iUe L",%#⼜.~w~7Vp%i5.]g@$k@r*^Nqw|:!tzƇk9v>R7qr<^֦z,Ec~>l:[YYEuvw,~j_vssYӺ|8LJN4Y*ӂ2Z@Tk<墪ww/iYNB?Nⅹ><><|x| o?D%d]"TO?v7u^[DOMm.e*s}ve)SQx$ۥ%&!=Vp߽~/~f8gvV?s{]oJA~"luw#O%n}[޾ qX"՛wwg~Q͍٫7k?_/v~wrgƛ7;y|p\>>.weUdyugwZ/Ӄj^j_)/_ןM}7?/S__ &x*rڕ׏t^.j'Ip6g?x\YYĻw;WcfgC-w z^zEןwo}ٱ׿~bPw^sYr/5eWoa8x8d_o;߾*|"wwwi^.a5)޽wxpݷoo~ׯF޽_r X5KQf^ y{9j/.:O+_OP޼oz~_A߽{󪭗L޾{E9r9kDO#*IS* ;{xX˯?|oќSF2e@ Ngno^L*$^Uٝ>xo_leq)<-L|'խP2Ȥ DBIm'/ew08o$ERt _ef2!$:giy||\4wryge>,MI#f [c6ֶ͠@s͋EQFBIEj2!~)`HB-53]'LHn;QhVֵ;uC{$sR"r7ww*wdfEnkn#J Af_>WzLTUT6t(ܵI/ŘIfD ]jd 5ӹAIHv"څWnd۾1PB#ZvOzbhz9:IdfD4AdY׺뺖Nѹ|٭_\ծ:Se-:k\[Grz>?הBp& ?Arv/^ %RUy,|^(>XDtڃTTD@F2RȘ\ 6k&n垤j%EXSY5`PP)Mj\&#zFPH$*&!mMيw >c2*%6 +[!؉8&Ff!|a sv Sk)IHaS/)&A`,8^D9<ʺ n,bVdtuG2-e]xG2߯$J 7]S aR܍LSa»y.^S1zؠ:`TUHdkyC׾誺F9rUY3E4-B5q$UU@-@Bjc%%#43׵ZUѣ[K xY虚5wu AnX'"rqX Si$ҩ[<6z26n)r])䐳P4q+^O"wh!XsfbL462{YHjk(+h XЃȞ*3lV?: +aeoy^FyItCdfFTDe]3֒0 M! ?;jqׁ9yd=c7%,Z2z^'Szq!]a.dѧ}n"dhд2%DS-ژ"E۔Ez}e賈ujdLVՌiƲ4&Q3:0MjYcEj Ft_!٣A(q(e.7_[eY#L%:HM3AHK :ߙfT+%מx1(fbNՀvG14-"ZjZCqh7y1S\#RՖKA>n"TԶ&~7[kS'kf\0/j6uT2 -FJ]M5t{@FUXo`8Cu5 eZyD|r"z>3`"b4ҎskmTUS\ /;" ~G{qGxѼ<~;25!"F+alH@LidpP0&Py}A^.5P-l$Lٖ˅)`zTke좔~1%C$oVj6Ć(upD2M(A@ 1'0 0WRhcBXD#m7uDfdWS0!npYZ`E $6Rl IILjt#}dLjUdEYKo)tlllC6$Hd![?>ULFƒwEG BHFubkSn_ wcb][JJ*{_=@3hq:ek݀'`fV¥.`dk= jkjZkrwZkPo!~Y/A!%ا^?Ad"SϠH/0IS~^ڷQ?~(89ļ7s5/ZL+nfh]?j7wޱyaGU_a>L:E-dz%#-BĐ`fhmZ QIqD :4}sGrIY׵JNei(ZkF?Z#ɼz\$ܑN5Ը,Mu0q=*!"뺈t[5tcYْ|6)IsU)tMŠTtvWѢ*fM*O˲Ld)l-TsD/M5бVko?3hP\Lu52Q fPEd2Qt4!mRJk/*"4Sb]sYPsum5 Vy)Ev2nf  S"caD] Q!17oC֔t]F* udYzi?>~,wag+:nԵcu'`shWUbJAFTxԅ[t$A1XФJ+h3bR @vhi-"=? Tm$!dvs薅ؙOdwf*#o P~w凿WF a6u ` B |Yracoϰ 1wU]wZzp@q~Pw/Sa; MۺufMPuY.aݮ|ɺ0#;aӶPQvY3Ѳ?DaDFόo(ⓩSMúuB {![Lifd e*E.|iC^GFnT!P"ZJ*6n3I ~wR)uqjof$5ϧzzX#:uw/% 5NyZ,TD`jŭJ+ ą&MZ*Q'IF22#E$33h%-"BGdddkTyV`v@VC( Hf Daum6RL{%jm33Un n eh[>Y몪mr)cW-̵0foLs>>># Vȯ Pʺ6,TB5CiIDZ 4nm?TЈdqS@ k^'Ry*UЎ\EF4FOUl}l 䨪#}3nA*n{P[kz՗F66vz/e$F^it4VJvSu' hb.N$^Dr?<.父AEdRvׄy,fR *@titҕ"B$DKi 1#pc~A$^jK)Qx:3QjPV[DdWW Bl^l2 mkon78](P1 Ah}A+"s*˒K ))HzJoEw Fl]Aw_n“ihZQDUDGZOirTKrS"-[]IoFRA RA/VW_^(%?0ͷFIwUCW+gf胞PR r}3U.OZg @-6h*vg<1Pt6X27w2Tw"~|7O-ݫ0V*bKx>]O4M} c"hR 1 &s{u 5T$TiM`\Z.+Sz,pw$C;}19 4Ls)J d; ?,ޣ@@m]󹻶 vRHsdôr"Er7R[iVNRњ4)LmTc,6Y2㇇htRг3YBFO61݈OS6BbLZfĕuWFi鵵> vjUb_fpw@Zcr÷ 42yg Q sunVd}$SKYZ&,_ /e0W+=cދFnQM;N3ԶGSS]\52YK➑k-[qF<1-%!b$` iȫ97PtXB6z!1Hu [ CP557\> R$0^s_nɌ̞ȓKlA`c~2m"$i.,)C~ !ّ}!.R0p.B[ku""Ptdc=^cw>, xEs$f̈"[`Ueg{?ZB3+s2;C0"r  EDMݽ;tgw3-^FizOj[{N||jVwCk顶=Y/e!q& 'gb-5Vo/ ke9=}t IDATp+>>ݼ8G(Z\axfa xTFk5HO RMW3F2ifjqK4j 8vVR6:9 , 1U j3-ŊOm~Su7+6\uKUmrEA$r6OޗVe :|)`|+9kcDM 3ޗfK` 44ON|v(zc 1JuYDW>ph#FI{)J%Tvրh43 1dvPQ0ʵK"y겎>6O+yBL0=jM 6hg7Hǽ=k{:"u&}!"+:b#5SB*aR[D 5E'q5$2P"ZtsUfCKoUމݿYxW~_ޤ' m- 绎t~yCC> ȐM/Z.KmCJnɐh^aAWu99T\L M?=`<c_sS_t/eeCb;5~p6I:*zg>~djL&QR&5ZMWP"#BB z?QƎQbղգr`KIYXIMΔ~NsDe"3jf/K6/VyE#5D1;]7D&y9*ܵ3Exfyv¬Ⱥrnܴ1k}e#Bz %w(+*w &Fi ?-S+$ç1_rԭ-R??K}` sc I3q(MZk^X_MňH3⍍RQkfFt&s`\J W{.i[Ihҭ(jFa gP@"u]׺9XI$mWRP6Rr\εV3ڍ:,:ƕ݉faaWpUL wUHULx5wR[d[,52Td`q> Z|zF[^wUhʕn8kCv©brwv+\Z[QU/3Q ^Og'T 'z?tEa?+q͂Geiioy7"$*޻5R2Z?*5wHoot\1MEuie7r*KBJSOdBUfr>BLaxymeMŏuĎ}sO &/q>x|0V͓̭+Ou]/>=B 1l~TNZEgo\k0ּ\̙֩Zks+w#@YCY6{Y/eVfB;n枒"t+okAUS{tHv.)v][P5'pL)[@8?v ҃@!=-uZ pؗbЀ&@[8-7)xFH)M><ﶝ PpL1g4"x<wْ~sN1stPRX) 2L{W96vtMLA &.(S. ^9˥eH&ivj\EۛwΣrsiV݋@Z~˲/H)7IV\(9zf;'h7ׇ-m:wM.6M|>u0ϳ{(}j"pO2on6MgF hiwpab|HDLyw8Prd-vO3>DD'몪3~jj/EF%C֪gBS=t?>dff{<{7k s5gcN_}|ssswתz>_ewVw{2M;r:7|ٛ7Ɍ2k}:qeۼ~mUV|7pMB2C 2$qZ[L2٭ 2ӗKdHnJܩ.MEonoeE;RiGZ(LeYǩ{V57e1LEg;G{Xq;5"S5fZ}+]T3fw1fF)VR4g/; `꺲y9t? PuYudPh@inN3l90d*SD*3wۗ-˭ZR#\RV Tqrݷ$P MlO_rl "~D-<1fwgK,!ĠNM}= x)γSS'6xF"sĺWa;%[iBm[.|2˾0x\JN?\BkA} K6 # !xm2K0Ix;E|:RY$fo~uwe))gRb#8cMr}磁C4Z OOfx{[a4'l%rM ShR O"N@ڻEJɺACR^&y~^ΗJLͺYyOvw)ڶ_}2NeF% C!WS>ݏ*c} q7rkDkk$ E;eC%)ّGmd֯k?4waa>`υ ))E:sJ%mkffFISf'#)3{ﭹ; kJCE$ѡDxBC"@4))7OSbڶ^9.T܅|`N;ߺPvM:"9$"#sfX:P/__of4MeKIE繸 J{Q zhKET[8? GT֜,,wf4M>,wB}2Oϟ,b{kI@{ 5\J9i2~i*HfݶշE91)I5{aA#| ?Z elfޅ-eo۾߮"tgPHz?e},d 4Vލ2Zv'ۼ9Aֹ7ʹi*Ӕ[YTV__ښ4O FGxS.[0>A"ڨq~ S{]L8}MGg#n{;ЂDt˔Sh A@È!Z,ځтpPz{oEpR@} P@NӼmې&BDN3,~BFATR/|9{vK9O_.,/YZ[tO9][E M C ā`7 08b(ee f)A %i*zݮt:"%]ϟ.*BHaĈEщ*JI"c:'Q]phRq&Rzs{7qG.:TB2Bxx[C. fU|i{QkJ8]N*Dp8EA/oNȪ,t^UĚ(&y>_ݼEuƹjﯯZiiY >8}cJSn8 wg1 p )BGG oRII#$#CZu= 8R*3W~%RJӜEFWxhVLS4Gzh0(y߶TsD耓L;sp!Ȳ,&k~z̉BFhdбHP4k̜+z$J}{a ֮@zʗ9vkF&@%(Fp8ǁE?PS: &Dp{D@oVrZ˟_^uy.9-"ZiNs$,Bw0%ǠSޥyV9,k}UIcJ X,EZ]SIUF~aL7Ȍej[{o$!]'WeQSoΪ6wRafKyhAHr>qP0}4j!pKV>RƵ,t}mvt&AjD-tf!XkBbB$\L5$ȶm//!eYea&Bhy?=ح{X_r~ nWM"bL,3Sgi.u.QyxB p08ape:׺{{se4M 0E ?/ ?N{ETb#CoH ޺ݞi4HڷMʺ>}*Dz3)Ls}߿}{]7@ѓ7Rho|,#vnu]`Ի ׺ナuy{D9._C=pa.R'oE1up#ß,%={sot5`Yq9}N9dUL1 O׷zQr@hi* @JM[LN[JBĭvw/?.~gKs) mӗ۶?rwFYK{=g߁m[,N̹9ukDD3A}|Pwz8'~뫵j)re` FA '.u4AB'x)YUE{MZA7уj`'nDהscLVrj,e~y6\Q//7,LD\RC]Nu9"y|{$/Oϗe;$x0>r>z8G,Ǣ?ODfW\D.~_NbLܝIg q`v n҇"CPGNYT?ӳi#?4 ̼7oݸ=,ʭXęLQYH`Hi*QkcQfID5{x=9"D#5b^[k' 9A!Dwpp:Yoq[zIsID$B-oDhn8q[VYK=%?)I ?"l\FGG=a%'U;3(x{if pUO[#=ќubIDAT9T|LU^&΅)3yz~sHA̰6:\[k;牉U㝋bA㠮{ &woG^=k ?χcHsۨ <vf}wQ""D}Dyom۹Saux4 )7운IiHN*m3 !_ tXQÉ9LRff um;uZH0|$9L̐deRf. grL=Π,unu%ꏏg#GDHƏ8r@ okm a#rd=W.A OFH<ݭEqvf2V}ڈY}i?OJSyJi0|@zy>u H@prD$%eRHo{{xjѐkA`tJ)1J%n߿Z (wwN [P2ݝFcֶUw0Ѻ#a E)y$ʙsٷ{8z֦Den iHAޣ9[3XU=Y4 W3q:)%e*[r F.WUޛE5)9 njq0Cg~$/JΥ{#Lv R 13 ɣ?n`fw ,gyHP0*OܪJzsAʚ˴@2#"׸^eIXX'15)80Jrz߷7X%g-%LF8DIR+SV_Q5;??? |?jߧ7~>-'=~I A$! m6s zOww)h[+{!?kd*Ӵe^_yZz߮%6RshI~])IENDB`images-actives-html5.git/doc/images/white_fill.png000066400000000000000000002433731250410645000224470ustar00rootroot00000000000000PNG  IHDR9/ pHYs  tIME  a IDATxkmgU&kkN.' bZTʆRJhuYU\nR@-* 7jKl.R1ܣr 9IHNn?9Zbs>k5לw-7=}cfv۾}O`[/}g<9rm>?^?˭.I2IL3S{("(itDHOHKJ*%b,ʫ TKTO'$I$9 ` g6!G( mp?&:ɥxF1# oI#]շ Nx%*  ~wy6,^_w)I.$htB.`R>CB!*TY13H R)%>]\xHY)E8`a${)W8lKu~ =/D|8[*V^AIYo@%ZPk5S#CUDWσ4w-o)Ȫ蔊`<S\l$.@qCa/ ;_[ tWu J9\Νw׿_Əq|?~0 ${|<0 0RꪓK1E$k/ R0K8Z3z#uPW>rgp(b%0d`5`>N؄E0G~pP~z[̿;_n%=# 5c)6FYhb.srRW<,l!.(UêJ|VjH|pJrL2 H0:n@,8'j+6"C0V+Zch0x܃Wמpȡ^kGHy\ݫa1<>y:S}:ǎ{^gf>cN*b[nk=DͲѵ5;oq b_b|6  =H] oHSYPuwf薻{f9IHD|b8aFr©+&iSP " yQ8ߠEo~{vOZ'X` +2ը*ap]R/ےyF#ZRr#Zn,f r+pϻ"V (0EQk%HV{ ٢:VnX.+IcTk 8ANJU;IJi,>3-j_5H #%h"+<0Ʋ7HJEK)b1 : .w(U lDel1?G Pe7"8Um#ƍF9cǎ7|s_p"Q VbĂjdVֱ$^ rg!r( PH9^Jb0٢Pcma4--C .afj'T 0g$PhCLmTЀH&Q"2f. 5h""U 0<"YdЎq?`,@ P F%Y18HIqƿɒUf^+4V  HV&w_"UwϯS U_"b@PY#u4<`Њ@B/f[gϣ+hR7]D~,bF ,Hrpp)3]x ΎK0"pv)q ibKIv[=+H+$1+6ceH*+〧aYGXrQI(RҞ=[S6DލŰ=~}(jfHd߲ 1+/ǔ0-hyRQ<0@3R$ESBرҨUx]6&fPZRU58yu@]WF,SIYD|!B$@UqA瞍 cW r)EpGWakh =qqI}I-r-;G%o{y*S9q{MZVPW9T_+4\!0qM4@HMei3>GI@)餰IеFՈ>Ő|وSBJU9{vc~D +] $d𚷴Zj-fkyxNXo1PD˦EkK|_Q۝HgW)k+?RV3iVv_8#,\*\6̸AG*JG<|cYW޵=LzQ0FS !&ަQN\ڪ )RtRKQWnD6PNlmCjae6c~-0W{U]bjs*g^k H{S dṱփ6 :wjS;A  _kmEgJ|֒t͸ Kⲻ3u1 Ҡr0)whuvU9@RSHkTaC8V]dGHq $F:1RRV-Zr3z/MLbA\EL*QBUs\_TX.(-wvfn0 ?E]iY(f brtD#P^!3\u~[2DmѐO'Sٚ}ͺ5I+"ޛZb:6EsO.9ֺRx&{pXEQ+p޶գwZhe5cftM+Dgڤ֔!*f`4dJfbC;E ֟ӱ[h*Y|1FQsRkrLhs=ٟ^_DYP =Nlyɔⷸp-S9KW+mO.8c}bJ 'N0<qzDXڥ3ͷz@+2ʪ8[#8YB[IVwU(Iy/U4X)'Qm9b*%YϤqה&!E&-K-AY=ЛKa(B4ie+pm=VCRXhf + lNR P*no [ `E ƯB*ff4݌ ـq\.eBƢpG=nIVGS`,yc4jܡk[qW)Cu2 Kps7Y Dz/*ړb^ JlDmWi7qsT!w!=_Ļж}t@hj-8 -QA, V2@*HN0zM7}=}޽wp%[3L$gm+G5v')Wr}}wuW4_(,1 Vji F:* K"ଵc`e(r1>8v.[f&8"4 ~=z{^s +ӻ7.~ଁ ud`7҃8s%s@xuT4ƫ;? 7g7g˩Ʊ5JsW$ 5!Z 6MuvGR_dq-ꭡuL̷maUﺢ) 酶g~ To1ћPmdlڦmhnQkK_ˮx'ݯ+CJN`I~%@_SGwżyL!~cv)f+M!W1" P|{00'wW?(GBP0P" K$+%tyP57VW\q?_/ o|k>ϟsЇm֜|uu(D9ξ׌LP45*>&s ,fC)qqNNe895t{Za/ ]CӗэɁ좋U 7t5򱪺JLX]$h/QKb ˯a1Vxʏkt;0RK螬 K5l_}ċwvP@0X)0+a1sͮgkxq{i3|9jtd-.wn>9Y2qp cl^+1y{BsGbC`I-Ukt>uz흝?뮿ȝwWꕯ|O[n/ʯGⲭQskr@Yk BfYBF,X,m @#w\݀2wޮ8y$7H޲T^Z+C(lYYXi6sfF`VhF;xvvvq=ϝ{u Ð%,܌W}h58\48 [/K GQa.i},Ԝfa37|M7ru[8v-\󱏑g?{pog?~xǿ`0/TDap q19ibd򝍿U2^њ)`]rC5a:P]*Tf0IJ:[V7G>a]7k6 6FF}ڏ^WGS,)oǛl7J}BisSiV 'gg}Wʻ˴|wOLgcBꏙ|b:}-`X3ՙ8fj oӣ=:r>w0z۔idnhؘ$h9ͺoM pZ6^~7#/>vG9'<[|ӟ.׿7_sÍ7y?я?_cގuuJutw[ٚF,4E.]cP7U8a=YjlE'MJҳ9>o%Xɚ[uJV 5ho(ٳB (:}( IDAT<=Rʮ xul(iJVRJ(ۊɝ?긘2Z? #JOzyN*X5h5:ux6UZ$}ANąB+Odn9 S oݷ}{qQaY01yN hqWlkK/T AiwԪYԜlH?O;Wo}|Ӟֻ}ɻox'$=!y22 W N1/s(ggrdV zg@ΎڤR͒bnyHHRטZ;?܊,Ns۲; eYi7g>+%]nv=iMPױ ]ū1 2uLl8Wʥ"E_{+8'Z0ztb Ї!0DXdA P,aUwkӏ6RAzrŘ9xbưz.@~^i`} Yh-NXm<-t&lc&Nc?{󟿳ַG=~E^- ˡEXu-OO%/y~_%G_ߏF=Zm\<&%P}35u"x,DMv4])Af+86u+ L9X q7lE2mA[&yf!d+]Ts̽]X^+ɗ_؟zn.bFopg\S*zҵ)=鵓MD,mz/-̦-SmXa?|_ W٠idZ]v芜iA%'6T\NTW׽/Pl*ßm@e0:dt*k'fD׋BSbe1H4&Psj|6μ5-9_ڲ7W3.[u~JX.:tVW`,!53]aH:{xR0 mVxK5{8N4r{{gY= *u9s}+b5aBҖ9 4sirQX $buNuRJ.OfK/t>1+78waqg?g<+.Mo~>мsS0LPc@bӹ4S*1ܮl"fJlڔO&ڰꜿ)Z>Wm0 9J)9^F/::ܳ9ZY=%*Dmg}Zinݵt\YCOF\ݣ~w+y4x0)M'a>;:v+&rEP90Om[8wbZj4ZCXNO.7ómxƇ:45\s͟)ه>ssgkPa* N*V6j yf 9t{m6ҚQy=<' k}~`WZ RYV ?UKysFzfVL>Y$dWؠ3ɹçxUxқp~k +o&wr2FX2v0d o\vQ3 *Fo<\/w|^Z_'0YED 5(m3JrYlekrfCŏV3T\dVh9A1C?t{^wYG==}<%TS]9M4v;CtSҐ?4ot-8zs[ݖwr7o'ϻ'ǾtM'䏚vʻ7;cӸ ':ݣ䮹պJ#޶zɵRXvjgM'Cl?g]ň1yG97L0HLπ?l zbkR i˺3re RJ;= .jFX=;ک#lҩ>r3DcOyk5xXPͬ9kZ6 {M{BggOhS+ˬuO6?<[0^]AЕ&||Dž^t-tǖ88{uwh͑s?O]4F5 5AM6lPC9ܦEu_`{^7vhʶ)@ Rq\<Q. Ҁ@(hD̞ie&=qի:K>v۾~v;~>?}j:T4y"(NTi ctJj\!VA\alEӷKOC]u3aHءStYt qm}Sq#eEq5̡pʗF LI՘]R ɥ]G{Xi7Wcw{ee9e9 /I`.m./g-bB,ЗeNhŌ"V uT[SSKM0Uiki~|W\z7xڐx=z&qg}Sz:S CVkdy['a6UMYc>T@糽IYRf_ ~r Y2=nvrM3VYy6zsan2U0 fJ%yTi4)m[g->q[G_srGq1_Ȑ6JS,Oz;~Z)ꆺv~#tڶU11Zg6Wٕgrj ^{yMc#6 0z ܖ8YKHGo]་θ/VZk -$ծ{/RVӊ61m,>[lf|9$L-l]쵬&}nklAbXӗu)Md)b!ԇzaysR)-]bE04,WZ8SFJY?3N.\x7fsAg\8([|oHX, ˻~MJ1[9>VŬSA`5 L{,ͽRo€,#JadB(׃fS]U 'aֹ =(VV}{|cOߤp9tIƣዔz0~Mײuvݳ.d@ԿS,Yw6޼Uxaï~#;͠q,_&xRL;a;Y4qh89UݥrJYeS93ebآMa!&DӍnj')`꩜!NbXsA`0#AE,0àYw TKJ0, jH_PxU+Ը֩ - 8l3[`6Dɬ 3JS _q?T˜t@҉V)QU+k}+b8\Ꭓȝ=g_~w(wlYmm]7TER, nFbsjΪoIF|/Jf1z̞u'|aCx"{Ϊ("{QU-ߑX.bR q˹prt ˰0״MF4WLNdfI+D4vm.ષ49۬ ;&Mu{zk|o.0lEi/;Vو?$?Iܮ#(Jjl%Іhm5xg76:F^8μd\;}}b(]4>;XU'AKS|z6G.6'䞐K4ϝ{m"̴4|=}k;V~ŜV6I`)'RͶtFvvĀbJ+_ 'Xbب*Z!i1`1g Nb:ͭx,Q;I)hrUP%Wmnl.yiu}:}GѳB FTYiC %g 1ܘ´[0wÞeYۻُ:~g)l)5q)b (3*>w.0>{=>[/u{faЛmZ3˞ael:`,8NMxeӀ=! aTGQYw/FV:B̀}} PdhLdn1w/[MY/rsS+r{'ll8N@+V;_>{֊>Ϥ!$†cny'v~ wfڀM|58FZ%9p1nHwH`9Lp{:~)ǽgظM2 8\C)kD82mR=2&9j}\S?'1SLp.,l 5@X-"kЁe6YUA,YU[sEhUo]\(~֎WLFQI7Rztărx!MA=CWRS ,c-Yhq%3 wRO`3ߣg'0Ez. ۡGݔ8?¼3-cXw)q Rȵ &L!C0 S?fa(is;:6siQ0B˝-9#btYzp3Z3Quϡꕖ0IY-t80Q3!V;jEL#4E69r0NOq!1s"JU0Fi+వǀ:@ Rc4x]"|yu b/~e/,!LF_!Ph@Ac\YK i78n>wr$3բJ=F7zիoƫE/z}'V#%wunΓ+_Ly*6gXݽ.ܔL ~jrQ5!ԍݨ}P Z,JPXtډ֋Q+L,Wc+&?'\HPdNM8i}6tQ+:=[BJZa_b'w]~>X5hݚ5O/]S<*&#% 4vUd}ԗnZ*4X3BB:vW=j*cn ٦ْƁ23Μs^ṻ1YhӇ#|לC6414],%ZtQ4 3ZV[a^vQkFdNi7}9nϹ|#b?yȆ;겼˺_/FF6mv"vtHՈ~=_޼7L&|5M^C'o<{5eJ20kelZ.UJa:ÅnOZNoxP6sxQ!7bZzֱYsJ '6Iy(h3FMUӘMu].%eyw}ٗyoDw?gW@DNlJ)ÐndfYz555' ,꺺$q:VQ)cDQCZ7zӉT!گa|)p ڳu_b_ xK^y]IAӓso'aYѥ5ihrre%0; 8[ATE4j IDATRHgYdtW+ktmeF@FscqLT([T;Q @s?z\L+r㘁; F:*ÆLC-~iaߜ&Q.d9HWbDAZ~%3V kCEҎ\!upS^Jl{CYͻGo?% ]Vvn=r=qpmu ¯nq7w8q+[H\L3s UZ-'AV~ThFyX̚%ND9J1++vp6SOjb~/x_/?Y//җˑ#cԠvI3\Y=1Ti  +bؓgS&O! TB}FxG3ww ʀBTĔ]: ަ0OE-cdjWcFDU)<PQEX% 8h`]$30&`XLK8q%Y\>a8x*cE3s8g^rH?ͯZycv _ʹ.{W} )M|@aD/ ~9\Θ;2c uL컊Ͱ8 W?M,+gt뭷}_K0Q %d+Lࣗagw҆Gvn`ckGk樊htH w7'"#VoiOݏ١p}#Y}1"73,8es\+~!Gى>(4HcR;5ČkcƂϸ9ɾthx-Gշ?I[/{~eOjnso_.;;K[{q\.G3@+.2 c=qdCb-Jbmp#aSY_y; _F%}77/|ھ=g>~xOjQaf@p`LBWYR0ܜQwo#%T'Wd8غol(1Xu-ۤ/P`A">cU礩XU o钔)]ZDŽ/ 5P#EIJ20{}xmptipUG#ii¬kЋWJFU7 h@+g4wuok?p؞n~ -䰵raBHK|w6aij ɫK6'-+&hKfۛC? 1eWvK)}ݾ}F9gzSrT~g|3ww׆jܗǞ=[ݿV=QϯUP*PmL#DƗ$C40Θ| 9,fqw ֺ>$+!B3:{gr|qN(e cb( 09 &mĩ۠tq%L0ZUiN޵T/WZ~rrI;㸬cLIJb65 rLw}qCJ;>s{0}=>܏/ lkg( kPŒ;;'vOqt:.A2!,aZPH0 CQf[{aqkk+Zݺi[?0F;KxG?.O Ox|=s{ZԇVf>LOsqn+Y@~HFcY'9)^ԬB\"eI >ag/A^ zim^Pi_yak)p䪨Kࢱj9BhقkvXu3^GDRdbS^5Lc8Z8 Ł=tK>,ۚdE_~KΉV߾G7-Uٟٽ[zs#9ZrO[=W%ބѓEYvf;QiRMsruVǼ7*" 5chb YR3m[k͔ ٍ(8:w\`!iHO4ëWn66 [gW$u\˥/I0Y!\.I3+tLN>(º=+ d{Z;+(\SwwߧBmN IHpS>f 1:h89ù뎝7oF,<f*Ԛ9.dB?{owUݏs<3!¾QźnXPAE+UHuhjڊb-~ZE"(a J6d&3|99~>3N y5}=o_ u)_⠃>S|ï~k_p;@P<)炞6֍S]VԲbnVbYQ/.^vŲɱ4QF$bQw,ɞ}lS_;pbB$"PtnJRiv~SlSpyd bcݨ@^RK ˘1nN r_FN!o NsK )Zv"ƾ ='6~/=vo q_e(pm2TLKĊRXj:uX/~|.䫿{WM4vt255N3t7ᝲ 54I!D!Mb푗KxZ`>@ *@'DԔD4R`Q@itc3݄b5혻 &mb=:0Z&PT5IIԓ7KlNh (}|*$uҁT4 @̚@ 9`?fH}~O:ቲy rT+אjH5[o}iOƎ"_~rt^:U0_\/hC Mze!äo7ele{VteA&[&z1*@C!)ΑQE3R#q"{vVҷB AT9E^ !('u rT8g펈J 7TaP1I(j/q.Mlޙ7nݜRrJXP,`iE/z=do[tbh[*H$Z~FVDYsZuA"HJkDJ%u`fN܇5}ו:Z] tL*x~sk׬]fg>W}jЫyLhR B( YF!BI׶Vm, j0˻0AĞvY5ԛq`,GDbyyHUD*o[p SrN-RHVW 1D!@df@r^aֆ 6%hר R?UL\R9 z(4L[`ձbVHR1Rf!c!U]I(]xcy}z8S}*5u[7%,T1u$ b-C E¬oco-掍*k7B-6$""%1H &9Cѩ藾ӞoU ַyѽgd>zye  x)>KGhbv" O4,RUqS M{ bs` `!` ;5cto抛YdɄד饄ĩw[T+2 6c*.=g3q_dЀڶIʎ Qg:A&kt:n/`sKJ"JH f#m"FqU 6`7 ܲ pd |8)-6 y[F7oO}{637P ްqWU?NM.-6tLŻzIXQlsi 6-P&fmhQS4_,Hhm_l))|T4RUEX0 i~!!5 #u;$d̋u 0Z߆v[k҂ Z_@c1g=:qiU#ԩq[tT5Z(f^AUYȨC-g"kdm6ԝ^ am )CN,:%?s2#G? ?ǽ(~?4-C]V|p``tt?EN+nV8R D3 *E}#. ǔZm#f0T:EZ6n)%k!-z\_)2ǩ݁ۖgE4y֛Bb*',#Te0"$_'T@By;D;b|xIH% oPgk-qYk4#cLJ"K)%^B02(R 5߸}loNm_JPDP 4o,Bֵwcn:ckIm/:#ԵrW}KMg<;d}i_wU`!k+lvaiB ߶.Ahu1~AO55䇱R?hg)4䫵.*~ʌfhj?] Ha Ah\&Df~IH/x&E(|˱Go-j-oX*>*V;YQUNӍ{]x]Yhei3@6Jtr}֮hY((͏,nyaKKem|k4\Cy/??OSNg=Y^sC*̨@֠1(,j6n;>>nveScaQAcT 1bVB5bl5Mn``?d'GؾmK0lp &"NdT6"Q!S{lZlctFՐE &)%˦X!4GrHu-\ 4'М,<0=Z(,*"' p&:ib-4{!j 2>:i_3>PQHvf J,l$WoRo:&DIXH4Hb*tI=AVqA1Ewuq;2Z QЗO?cj^/HYGsfSK1XFO F5M=E| j# | 09)^>3& LQ46| ~@1PA+FTLB@P<=Ȝ}p5=# Br2e ߎ.ЃMfd 3`b{J]\oypi`X<8R]>^q۞ldQ5oBdP"hjVjt*sShAZuFS󭮍%4>̎3$dteaAyO(C3/|IWWNBb!V!vJ*D.JӊzN>\OhhvފXDChv{(†}+AOvM@ }*P#ŻJ.z$ U=iXlo\8FH"VUUUAJDKNuJ>. FBB~ C kQ[DKWlQ!(xhs'6jc0kޞsT[}2QۏyAf-D{P,(mb ȪI5!BLHj-CaF{9o^xqA t>g\0{#Y{{|_e nʉE6E_Hi 5 ޺fffFdƨ;5Aۊ=&\MZOڑC1eź'%),o9GdK,?]|w߇ kYR 0'w2t JYBi:ٙ),KXնC͔H=|s$>>1R~ӱ}e>4uGNUX-]nf6B$  l!6?NUUeZV[+򬺇ɷwgﳧl?n9ܐJғ<ۢ9F ֔o;$$\MFb%֟cT 3ǥMhF+<-Xcm?' 3_.mX j'5BexDT 1p@ls ,+$ TbnXX"PXQE(RZTP:BwX"R{ NFmUĔd?* ,(]u,*Q!&sdc$(V*UUNLTTЌ+eg] bHDQ7RPF!Ҍ ezZpv$hz}6s+J5"T%@v0D%Nԓ'+)T볕\o&D v3Hq)`7VsCm\e"!Tc6S @JRH "dz Ȫ,`u%*&e"A<eR2ǙF:#u7⊓W/N) +B*[)jn,c +?S6{܋0Le@} >3H~ٗIlz mi+dp2\ȝݎh,/R>!KYt銍%fKe`ΞsF~쾛Ɵ\'b 404% LJQkbՖ{2ijZ|٭YeU]) !EmQ6kU@z~e38ui;]t%\]Snwyvtfd'^SCyEWr_"R!PT!%&4Dk.jDrs>Tyx F-1ŀHIRQ1~$香2Y![4MlSRJ\fmkATіq0Jmã:QÜX&߷u->ه4'cjf0&G[ak0XŎ\C48O^vgƄQt7Mo=Œz{Rf#v;1`_{t^2D5Ŭ;IUAjUf+,[,*ʦ bիZGȄ IDAT̷Q՞ H{!-e_Nŀh6m7z)&RZt[ u t`hsMn7s[)م9 O? ?s[};+՜K]tˎ`ǖ49 3V 8ĜD#Pb^(bh/ѢAC=ʆ̔SKAVdSHGٓ`dNj ۯhj*wĈP++!+ &s 9$롞1$)"rǩjxH "(JDDJU. HjVU 6_ (.ϹΔ* ;(;&k No (T~rT )"2(@[Cwi5lu#f-GLVN<;sqbSV 7')Kf,Q]'$;%Z1c !4plm /p-ګ׽U- ٽR+h|+=C-JY6PB "RbT?[Vhs󜷪 `Yq41V eF0 NUDԝPUgb+a.ƨ, jGܠfd$q5[nWHk" ~ V:2#@ ]MA5/[1 w+K[o'< }j^;VO?jݛ<?? Id\i8ɾݾ*f5祦8*~ Uf5B0Z kb*-MPAT+7>痾s"EY+9.4JiŒ$jϱ[ҋ*I+ кބB2z l#(v{sDmQf؛~ jBDP{Q!T\UTdT$BOFgh)z7HW$*\i%Bv!wXs$D ݡTT.g<>b,Xi<,q|;ylTR7_.:}OuvsuVܔS ǥesʧBR $c( 5腍6Re#+aiGQ~ Ӻd"M#Cо:QM|K b Q("}"t@bDp鐺d-"` %4;?(.Ι]st6HIW1fsA" ZJ~}>m*mh%hv DPP b\K"ן$uX ojPݨ_OmxGE;ikycnY,\rR 4@$kįA\,* 3!@$,JhE̦j: q^߄(m@`^Nj(՟nbh0L *A\MPAM=D T̚CUAƊ[9-5i6T2_h{S'3Na']A. Z9q'<֭`cofjY/GԜQgATZ@[ DԷ6hƥ;0.MeQ^@{5u]OOÇModӶ[^_ow7j' 2  Gr }/vOx%]"$/=fI@D@ !"։ HŢۮ[I%$D9uC컾50b螘&€̊\Tv\0"g%,r@ @F/ߚ sa6LE58=0)œ9PS2)"b4t1BpcLI BC1f'dBu{o; *E ZL9)WD%2F  dc`d $UdҰYDs)lK}CT7_ Y4kCK uTo>9[QSo|xϮw-pxq[Fָ+ſUAT0$t/qLNE"srcSRtuE H4Fa bU ΰ$6Wg$$RgB"0 lS?)t+2! Y @-g*S*(/1ITcE 8eN03 \j^$Hj}R#; 5( H">cP5EKVXKQ6S)dSEI5fw{$HIWsҡ*3 "og =/S`wx$u7ᨱmߺţ ]ppw_3; .FKȢ0QUUؽb~t(D0ojCч!!hCm7Xc= o/s_7e͚5;yuLjV= >E%R @=ӧqj]AN'λGh -Mm"PpY!]Vԇ9^FnMnkLA _1wׂu)Wyqژa~y FVsۥޅV:siI#D ) ㎎]—w7ڙa4 Hg6Hj@4kr QQsQ-m(+ yd u(꓊gz?|-ron?|k^}- UŖt+ @=fm[ٷ @nWy*x2( :%F|ƍ\ Hl5zo}wbK_ uVթдp.wJچhE= BLч+opSO?c>yኛo9u碋Xro_lk_w޿}; ᥄,uE;"PR)r ,EZēg?^rbDdi MG h ٱ0H0h9CNliХT{6o s}9sU= %( Xݐw-_TjaJ+Z3{ ަ6'QA-T@d,ZVYF6q,o;++qm YyتhH-Ur>,CA&WgfQ@Ԉ.QyV@Y}]ݶTPt泘6nܰhB"y/ m??>|k7ag-dUvIXcT,BOSPM6U6]1,TQQXZRT2~r !Nshv-نN; ij>vf %eT(2T9aSФyxEB4PE]ڃ`E>{ bS^? .xs_=dkY>踡8{ajX*mgb#w 㣏l\%Ksn5كdpn:1DwjwJTJIpQ竂MY$7\l*fȐ=w֭ǜ'<x6w]ako WSO9wIk<N),[[Pk2'sv.4I3S$w3PDrOQ2(*XoCtWO&2^I,n"Щ05g@@E(HGL3h*"i\'z%RNt-gǮPc%G?}㏾.},8k1=q' /?6 />K `΢eˏn}w?Xw#S!_s0 q#/bnC=ScYiFE: t:U){7HfW_O\(1>5}+fhDN\\&T ! ΟO[IY0\7 kM*Mb(9A8%a6O< (q]uz >}ůNCPe0&U[ݶ6dQQQۄU%*F0 Dhr;e'F4#SԵ7gguf \/##ۜ]sOKYE{-VpL0dBE68Flr. B U "A0*d#V5ׄ@%7ҋg db˶B(I)"E)td 2 08i6}Xk**t:P.DAROpF(EDp`b*Ϸ-+QR] B a1 *:HUu!dB$RRGxŇ{?9)TuvVUѧ=tH.~ggY6 L(?8kN|nXY9rDP|(DA1J̘ب*STEp @A.$6ጊ5%DEJŪ!j /=%zv5|KNowr?ϺoFGG{ɷщ7lXQnܰ~u<oOɴ` }dR=qV/i>zf2*&J>^X(0a!%nkdܘ.g n)( XTtۄ+ދjF (v$26@87 kb Hۋ" ),`Ȃc-xZhBD4^CyG?⹏]{=?6ɝ;v*_2.$FEaA(WDAl27NZip,,YB[\ v Oy7߽iphւ_p.o\G{P ׭z;. -BEVI TFAaroݦEA/ְrg0dvD41#,cUO{XBa!tZ7]xJ[ߦOLL=> K#"!eISV;fCU~jZT:mKQEϞ~&6Ϟq8#@M%4}^|_\E>𷪹{aýg^r?gcS4|;};}H J PTG §_p@ P"ea; u/F>@JNub))"z{Uw/<~T{+l42:Q'N1m]Mw^' Gf9HneF.AU}sm̎#YSґƠ@2bP"b $n(*HYgC=8A@js]bU73EBi~l{!&>ڒ6RV$#M@A&Aۻpx?+:FR5/ȕԭ >i͒s|%V;O])tY|ԛVw7\WoPo]]Ć_M;= Oznآaѻnla`gx:ucwIC0 h D>£z-޽9K*PLQ͍ <)'kʕg¿.Λ k[[s_{k_3{a4$@ό&P㐡(T!(F"DW<.Ie4,,&؅w *lEH*]+N> !( ADbJ*XDnUt,m3v8"B67^3d*Ň<ϑ쒴m>RA-һ /_|gA2z+Iq]I&dbc5rك?馷K[|?9s[iRs*k&?7z !t*P|6#P[PJPCK@ DAiseDO q0Êz8;u~.x΋s W ߷; yӍ׿oY1ĿB6gMd\)@l\xi"\$dܙ.Sm`$t2L'{g-k<sYV6o4"jˡLr+Y8Q s$P5)rI^ IDAT&~kS~|'Fok>#%}Rvv>]" cwc#k~n ޶Z_2-zK~B`!{_xl]AOry^O=F KCc߹SdʼhgjoԮ^^wW\{Cgϙ~щug;sw ׿ d-Cz50MOA"u=ydԻpk~VBjtFp<8SMuR6BZy !PɪHJS'O]n$QD&&l@oIY ajX-nEB#hbk_b|XЩ &Zؔ9O2.|ydMB J3/WcQKO{֩PwTl=PDx7VbPOdgt"A"0LOaplfڇp /?'?7l[s%_xgJ2!ﶰb N‰QqT)]ۃ֨[g`a+P0׭ Y._[/[O$-A2@QAѨPUQ "79CEd٨miun9fX#%LEDj@kߧ-($L> !IIHD+Z\{x|$eȆFE$f.T1!(T-&U@AARjZ#uDPU@UE$ BAHmI5(PBr& vIL5o]EcĢLj0 I{DTr)CKpUU jy$(4N")F 1Br j!TBN** V!%DĢ5sg?^A2[7kT`X{t'ZH{v^2^uU_Yo6A~m?^wsty=X}m&)/}״sx QTUPDUAƖ7||يvDSھu8|$H5z~ռ&2,!/;vt Y AW;7d|_h^?Lӌ\vJLOlE'u1*G0[)?'Μ99s:óz$E-Z2{il[=;mKwۯu'>qҥ;[KP"_W`v߳s B T[RdBk3QbE1ޣF:~7nX-"JZ$B!Ĕ f5 ,]̈́3HPY*G!܄ї|[l9C,\\su*$I7lܴqæ 6m\{;wN ༘\r8P 4YD(Hm;ў(NpgyaQ˟ǝ^\D-}=vp, 8 XEA1j1U%6}%QݣN;6}uӶ#M(b\ZUMC )>DUÏTM tO7tip6mHi׫0 >䄅Oy'[]7H=1%1+pT@=f-JZ"B'jb)jkcQD9;mX,7;~U\jdy /ZS2:edlt;" ͝7ws;p^sz;mMP LJ=$i)?́#τAjB*x*t}RD8TQdg-w-t9¡Y\: ! 7 aʑZԭdG|eUT[]\[;cT~j-(?Rd9mcpc{M"Ǘ"x+?g/|sGg׌}COsBG]CJ*@y{0>H޻@lN_]-O 𘣏'.|ܙ"r csƥݼڕ2EPCAyBX"T}cOm.RV[Od+4PYùFhO4,2L.)KA/7L4#b@E8O(M{^ԵߵIT!=V!`"һM˕N@U!D0Ya:7wr4!mebT84-=K۳Cw+ W&-Ϙ['saGYAӣW )W3nOx&3Zn! {F>pox @rcwLekɑ4?My*89]VS`AdV@+ti@0ҩ xIT(3QQAR@n~%9fǚoǯv>Xޗ5,B1*~0Ps2NʼnvϪ\SsB"B8gW!'og%lޮ=*.z7cC?ŗtD/ob`1Vԩ%Vme&*&{]3?DP6PS,3b0E$(J}1/ꤤtk 8O15a+Byz3j  ;b p"讠d"ZUS&{{լNkl:AZK'Q$㞑^L|7 1 D"@V,^3FZ-E|DU;>?DѰn#8ٱ sp0nU'3oQH ̳/,*nEחe;ˈUAAImOo,vkFW"u)dI5I"(rNOU]4̚7ͻ[>^Euy@[uE@'co>YlցA%jwDcpy(b4ދŒ"xOθ$́e_o&>+1ہ Yj: Tx! Pkj%DFC׻%mlQsu&tQ'FE}#BebO֘SƖ⟪!!%fL4R֠ * H)"Ԩ]`2<j"! Ԍnf;TBLs50P,݊ SU_UG^?{mnPo߾;t jMuwi|COx D26e`8'P=0#ԣKO8k?E0*,B iI#" j6$Qf;8 [#!97[Uͭ|suΓ W8S(aD~G yȂه?dX-ZY5fՎ$|Rc*OowQH#5s4lM)++:nAPnD1 mPLۄT; ~|MÇ<.XC] в.sb(J7yL~ˉa3۷V @NDdjJ}*#0e]R JBERJXH4( PjAH!z1" _ F| _)aO%qNTII巉HD7pӼ;ahK%mH<: -ZƽSFxY~}˱\F/Pr4R.wE ~zǕO~A;X辁7]1N;/v/.gc6#я|lG88 %=Tm#Ori0.F{T+;Z+0l>Ntd[ەW~ lu쎛VW~xe8vs2G̓"tN=&sjmkIT g 99HNp$2nڗIH\ x"CNSoxrϭ~n{g6ߣ6] CϨjx3"e+. 8[ ptmJDɄu{̜$H;H+M.EnyҎFŽQa~EG?iY.݄vnwSQ+Ց^Bǁq ]]]6lPE]/2=_ TpR԰w6]y%,Â/-x,7 %25N1SJ-nja& ytsb"aDc8.d?a뺪w{P.餵ݠELeƫM 3ڎIxчG2J~batG>^Di` 3M&cE%~rs&~;ώ_f!멋 ZLfhXZ%U;7BQ Tu|g nBKg?t[[9L(fJͣ`Tq%uzʛ2IkvsN-}`334@B}Oj0%9nl-)Lnæ<RLv}t{<_ۦGpÔ0kw|=ۿ76ꍗ[Wm811mߓ:U4Cy<&Wͦf$B3f#"/iEdžÎyx}NgY@c~oxH~ wyB:QNfCFx,L$̘ɼ/ ۼVQ.lg TD %ΐVI5wwc<'^%pڏ /}҉ IDAT?~O>߰*)VΰpWS WsI ^C .8PTVmi5lCe?.RK.9/z,?kb8M6ڒӋ~ QJDM]$)+uD`R\NJfjhF_IlH/s %97EY 2"C=ʹPH |K/܉eHiBDX khfBϡP'08.L3c\#O\Â{YY4U #T%XR,*8n!ɩm,*-@ar.t-ሃXFs^v˵yuо[?GQ"կ嶿:/&@ ym*[@4t&$Lb A&B9;%NQ&Sm&R  aR,{O|P_M7M/3Ox+o{JnThOw?5F!\8|X0 x/} o!"uW"c$R D}t1ʥgwud_Zꤑ$'Z+䱙ӈ>vb= ս3YtDN:ٴؚ M4;` %WWsW |\joEM6&~ҍ?{Q&VcsF: jo7|;/:w;w^Yڿ(n筘.DWW}I( 4`d~0KK2"u>yڮRs5͹ŚlBY/#t? ǜO;i5w oS-ӥ}u w>wnJD?o'w<Ȉbr01 H]4g[pwf+zQ>)rPm9eJ0!Pl hy6̑O_ۛQI1w2ưRGIޤ*Lh jM~7#@z+KgADlӮ;aq9+.+Ny;9tċw~/owǰo:iQUk ܥd"`^9͛GCԐK^W^@r-"$0@ 5g,Vsۅ=[`}I+OvvpB-Gnds2b2LUbaG~ֳi}~!i~緾vkn߿ߵv˵k^;VvNBHl`eA1j`fIn1֧.a>k{fyYUˌ) Ͳe4Aꇜ w8y3<9Ï{񃏫FŤnmP!?=uU7p=H\ifj7y~a atwxbDL!- BSE_QSyK-aKSO-cZ_JgģTGv/CNZp+q kEJ>t=k=,4N "wɤk_blJ-:념Ox܊u8=;wyyOl>O{ LWoҶ|Uu>0<۹O0*"[6El T+UB[_*ESaRV3Wetx9BEv"~iAo䍗|q< <40!6Hc4$Ds>)A,j46%CC5ʻkɴwefE<7E=4`NĀ4&t*vv&DZ5Z*ՠ@{ e6()(8FuιTcgnnR73˪$D"upkh^ ?B"f`Ӈr9/ܧqkۧ⶿}k?v|Iyu]_m=|P"M5u}'E[sήFN/;Dq夔,kγXxx2I$Lnqnd!Kn:$"\.C͚A es?}ߛ4[Ζ{ډ@SP۱ΕFBc&9QI#GX$t1sQT MPu";xȕ#g(Z돃9閌cT-(ɾ L؈33c/XM#~GTa>f{s76Ө:]PxAM6G^;6'$]}umukpk҆6tΘ>ⴕcOMib!7gg޵}_[V|_ˆm<}#(lr^;-cQ+_!Qb S$d,BuwTA 5ú[`d=$ŠwgWcfoPiF>GpUWOާqW\uRSǓ5GD= 7'tq/dDȝ7 h\?P% 4xCYq쵡13Se|r0UiQR*=ӵV $(q-5!QIb0w[q0߳FY=XYH)Wc]AG#8\Tt٢&2JOջCv;9!uIL-d:Nd׆X-[Ć+7sSS ,p1#[]h}$Ydъrj~:.LkyD2՘C4J>bߞbBSp6`φU @{qXv)X !lbl5zNz䩯c%5[kt.]eLO{ rLۯFݵ0zΩiqYXE^&203D lUʹ$BQU56 {>ѹfV~W׃􀬲ZR Q qIObYd$QrsC ":/VdƗ<[K|]uF-ȌroLCF$ E4z.R1rPvpBim -%I>3jf0Ց[PUG*s-CQvG%G4I:0zi9a Rr!ueal`@+ NT^ u@(Yitv#mbC=Gw0o@ŏurX#^;}EX͉/bK)IJ`NS0[gsōV $r 5NDsr2q1&ta4NCڼH~/D|Wr#j'219!Plqd7a8|N-ngϕ_84J I-T;oъ *.:VfV1̌ͪ޼6np?Bn!ȮDU8T28}A)PjhE5g0ri8CXM.ew'b╝Sbuc2qFyfC\}X<?Uo}xnk+V*JӝA*&bqpEL68$l\Va!6bI\jnbb<ːwGhRnLF-;gz헽o<>|#-9 ZbLmH#>M 3_-!!LYuK-m;E\#|]7p§tVE7l3?AGw0ZH1w'"5*-gE+ҩg|CDӪ}@ʭ /ot}?3)hϫ-\=rOn/}σu?q;}}[;︶U`xzK"! GDoLe"@+ %fng$gW7bw2&2q7FUM7k&o~@E'Jj{EFU|sql74D)0"d##K0/#Ze/EmV]H^At[56hH '&+$1rkjHx!{sqOK2!Zq7Dpǂ|[thf+8 k/Mµr )Z7mX`BpY:qO]0ߵJ >i?r9/Ɇ}3jAwݸde`N{'[hg0xkÐJ!<蔧/8mHB DVvd헆 ^"nA*WV:!Oi0fgr{CXk //T;e/D鹯յ^ |5+$ UU{ÊeaYc?`/V`.N`6#God-tzӣCվ fwNLaE9H #5t:rJ+.JS:łD8ZF@EmAcCqDp:fFȚ cÔ$m Ԕ Br z Z(79q5ZC:E0;y~بҐys_jxj粢Y#$Z^0,o7axq>Vf~jCkNXL=D'I$ƌID^< h <4nHj2jUQXI:?l @ 䖣=|w1PSyk(jT ~cdwtMђ:th ި%ҸEPۖ͠lq}{aA:ǝH@f^1 YZÌ2:pSׄI۩A MMn<Wmȳ>][XhK%9,/(stj@ bF+A#dY5Lj)2<0Z0IkBgC3_6cN+ph{jn?25JB Xx. E-P[%ƿn쥄A ^K|s0%H 3NJnՠH*O 6vj_`PevU_3n|,#uG=Gˎ|'jLܟ>?>9k>wH7.q\$<#Šf=N^b HoYjk{f"2&&)qH V-kzd5gĆHOЬ7<2$L{ ‘Im,Uf3f,yBrAd(Yi;/=?/=eC%xUU2ڹ/5>"<-|JF^㿪mH -?R ~nكP+K#AD\k=n@} >BX3saDž="n)nvagf=iYQ& L=mDdab Omלp jJe522bk.!TxGC>ʨ/r!lFlj֗Upu*C^gH)\ f$etq|\$Z{ T{Ʋj+[w\e[I=׮?&~̆Ϝow~s~|6_Xm#u<ݘ6;zzlyƉ;"= p$g)%([!3@L 6܌'0;$B$ ,PFpE \2rL[օYWXq@x~NڵUk8}p*C!ؗAIZtM*_W; i.'t@̝Z&1yqGl4@ +/j&#-ݬ GNZB'27v IDATG"a!I0Bшiakam}ĉvڦaA}DZ׆o[ !"K6FfJn Ҝ(Ů@fX[cOimmn'aْ6=1nprf&s g;'J` JߎCl>=ym^s?W|: i"-g.fן_|0.D-G߽ClS/MVB5_Qs+~z~R2j+>O"s`Vnza̐ @ud:Kl`fQ#:yK˃~.p16jQn!觺_q?;)tӏzϥmł>+G1=4!BФsf!pwI)L'&'ƯϹdYM;5̡ڿSC_3/ߴaYgym}xvk;]"nuaa[έ/rk8u 555Q]N1;}&]㷙YLȤ15 ۔^<4QwyK~臶mve}+f{7oW]fvQ4Lq}A،%5n=dٳ3dXdNFݻӪFeuliz9gUe b4˽&osgm.ԬWۇm٢eoA2PٍIچl,&1v1,?S87q`j8=3%fvv+ 32y%w׼rTq%죥;׮m))Ŏ>tH X"qr8TRr3D }uC`o^9+A'i%ĆvMV((Hqh1Ք`$DHE^'"]z2zYg7~Zq3<~胛7o**7p(pIRRo#$IhH );]dh\lJ0d9X<G"40Amp.Sk'G}5w.̜yW'udk f06%]:8&RѤe^/G33RQWJ,gJS" `GV m(oԪn@q՜0KU6:wALoWmvvA3 br #1=W܅rf'D$Qb$Vf%D<k("$)%&qݎzЪf2]L&I: tvH~K^qҗtmmmeeSNz ~EkozjfmvPrmQ@a-r}/D)Tћ2W a~>lNY"4afc871v1LeՉH,"v,Ln}ɦy.o?ڰqownN<҃d3"7 7X֑?A ZN4BuҪs"aK {Wu',Ũ[.BiF* nHM),FQ %E-D: "sDoY=uvD"v¸ؠP Yh aKXҪJ-{9Z p9v [-P]X=ԮŖ@;;ɏxl={n>f݌[) [AM(IP#K\m\ڙ>7.LuR< cri}k}?'YVYx$%ٸa2DؙAI:Q!VFկ{?}?ywyo{@=0}ONG b톐3FLS Gho*)[kgB@^BF=nR;SJ9?)De꣋2%ĮD_5 x {rY w-DJ(bzo]!->пV؏8 Բk~2e%wzק .~!$U u*k4z*;j5|Fn;oG#H+[>Kyuzn#$\1h O9VJ\ •PN mqg}3.s#YޗRJiV6nL']'L{~%'b/]ɛ~-߸#_Yg?0}*gTcLr n.p VxXV\(LIb,(ҺH\IN(N\6%%Y[P:%&r A ?rC]>v|gfq۬!@o$W8) dnj ,biǻ3@Jɩ1}IdHHQv. 343%!!c}~-2(XHM|qZj-oEG(/ U Ѿ[V됊ZAؿƾp E:.u(/Sw5C~#lv ; {=wӶ=XB O+7w0[ pf8!1眭:2jZz[Pi^ȱ6ϱ`C8cݧ攝HWw횧4=OSfxhѫm_[?}W>?<#ZZs%W3F*<z1~(9u] %3w=2)VcB4IebA>rê] j 0n"AbU`GR8 ZbeuÛaZ9ъ+\(6<їG\W4j%jvhKi 3-ɔ_"ljҚl5H,y0NY54EoNwQ`Q=0%[iVn+c[ب!wSMr,c/x`ʔJ[LWK |*B zd3%jˢj` -daz(t_o?O\7.[~'<wX[H@A>+&7 Jq͈!L0.]4f] I:EȒufzViAgܢ(7E,P ;MLfsdYe03Mbd⨽I-kr;Fpf1\x!<^s#KL*#MaiT]z YtU};?qM+jZƆʚXtfoE^ LBfr쵚ÇdWƣh1ҔSʔ櫔v޽wE x5.T# e j셠9b keQgj.#?3髉[zp LmfՖY_.<Íll\JzxJ.@0ԯG?x/Cox{9眃;4w-!XOJ#ZЂ*TN4+I{zMj8bd"w/*[ ^N:Tšs&ص W =uS*rH2 !jIyB1|b!gkS–ćj˜@h,!Ŵhе[3"t*tfa_8cS`rB"EAQg9g6apo؂6Q@FOSO ՜bj4c*6j(y`$D|,EwE};3Fp-fh5mdf %lL%٣pZF[Ł./1\uOD$i 32w\8}c铟$(LPeјYԭPg}4{mbj$Ikkk%iFrIb$^̳++:,NѕYY@8mb,=_0&a-Qq1ȵp3Ǧ%z PZX`IpzωHjw-ͻ ft_Odzdܲu E_(]٭kTU͈_>vnܸį}^O,ۘ^' O^ѱgἏ3$?pV%BU?7T@˫s"lWF5;oǯ$鈡Ǖ6]"qQiv]I0&W< >vm)mN{駯&8g+3,9+蝟"ޔ",VFf"*u.Q+ "iQo}J:$wI+4@\wXc)sVW~ -[~۟<%򷙛P6y6LQ8vqguID\W3u' X\l6(w0T*w7 bNe t)p5S5p :B+$̍uPVQVd)%)|!)`)Z37i2g*f!@oÂ@f:s,Wč*LX؋?^"j{Z@NEd>T+XDPgtL6c(s΄p/}$sd̄ ԉk'  _A>͝Uk5s>ڈFTUR KkCcDAsf똋 3 aFl_;^UaGE9aIA ve?@PL ( 7U2s7ffFMHlN:$٩w\`.کu]{N:>?P"ʽrc$X\]5̅ 0E\x0Gc$ 6V*W,~\=k,}̲(Bg/"ÄT@ "2gLM3K2$:D7gLn O-wbk`F+-L}BN0sFįIB]􂜠r"e3M]L-gFj0)<ӹ $ W5Wg:;=C{%"6R%EW@&:žؤaj 9a:MQnlY43Qg;'Vu# W-j0#}{fّ'ɳ}_hyV}/)Lлʹik= HEXs FC耎zIMըș5>a:l1gㄉx.ݡȿ#QLs" &bwR3slVV+D ݄&m)Md4onU>WY+%, ˛=Ω0Zŝ ߞݶpcd?(yj<;#oSD7U+wfN-LHґ?A[~[ߌRQ(u/Rv )S)GW'`G@[չ{|~:Cz_\w f_~&%^_V3i=[.; #+,:0Y##$n=I!-J]u'bfCz&Ff#\&㑓"ɯ޽[Zv~fٮolֻovq]O,~>/yu^`C [7VWc|ihxg;0_&7fadٵ%tX*n}pP)f)ҵ:< ƌ(^>wu>v`Ϛ hd2){EMfxY<_Yn,%{W*0N'`d!3/CT%՟Q 5ù5_*p"L 5I|&)T&ށ 5&j 15\Zs/ɚ3D{M5*L>vIеKj'nŊg#л IrіdXqUw:{>4""귽9P"FEiyh}9'CFxڟ!]Z$iB+x ?__ÿ7+%Rh9ϼC[qGm{?~sH[C2&2X3IHh:cv>V{LG>Hg1H<0Q9,I>?.QD^l!Y7][ZhXl /[A2czIM[kZ1/q=Nv>GpN)@g0&\ L^ݺc|Fqس9JRSQ(Kk-lWmYT%BJys{bFL3:}71BB$3S Vs;`0Ͼc.`#-_%`pf2¦xgr'm hG0MGOĘ6Gс+G~ [5rwTl7 ‚q@jkJJEh3 $in MHT-W9DTO{MTQ o[lnm3YwlTo}w!)ܙpQ-Y^PCUKY D?e%ω0af7ImmX\T#<ՠ$أZ7Cۓ|>dʼA,-\i ).FMN[ä\`*93Ȭ|(s*T=:'y؄8l1ύ5Hs.c>#y sdZ\I9VHY~J1+#@.-SAa#D:D͈kow%U_? h>1q ԤN♭]nRK ,,<7fzN$(6XC O9,kxX1[^S9,h(㻿 7%!$| đxַXT" DK[ Dޣ E!v}{R~V.TXxPAta;`гVux=@#MR!lnFv0jne*n7揄!hnBRa*̼f0֏LFG4e-w4"jF9 ~:V]L[   K` ,^$o-[Zz O5fb=nfF5[r 4H dqN%pz7d+]Ш Bin]Ygx0`>-s\漢||^3Y<]8[Rs`jb)2:sIQƈSs$<,\Esᡊ "e-$HOeWotfH4ܼ^|en8g8`>"{ho49~XbIRӨ%9mʨϥ5ܑ|hEp"")r0 TDVE=@MYTu]B^~rZDtuҥU"/R'Q3/YG<*6YME` HaA!y36VdcK $ۦqs;DtOhFL ʫ#D Bzm,9~fmi*J[WzRy7u\W5_T@AU+O6_>O?9@F yI8q4C!= /ųďn.1]mI1+pdo#*T7rHPbSYs<Ƀa̯dvdCvi Gf9AAs3Ve?VF<VHmgSvJteƭ$&3 BQFz Z*,( YuL,'Py1X;R/e(άYU,S&u~nSh&zQjsd$eZ|MBC`F.`ڪ0Apkr- L 39DӢe*E6&a tEwOyL d<ᠼg} /ۃM7gܧaL:R$30ޫ|ߥؽ;,0DfRJ!t DB(")Tw/bw"nj paC%r+ֈEW+hdvLO_E,!ډ 5-ȍu'Eօ˂ָ{ö??w+O]-O[ O]gUє#4x޽}QF]U)!s!0REO%"yu2YUYylf<3==b앹imqOj-zʭbU%]3$@ZɩMq~K!oeMMmhn{ 對sOŲ,fF':bND9& ]?w2o[*l)|P|ЈD@zpLpW@ÎdJH0 EUo=2o:nKI DJ0N6cҺ+p_Cxں={ut ;Y^H=jA;T}"l¦B"&+R5,,Ü&ro1[]-RSkBdMV6/&kӵ'_8x3_oַeSBNDH~ 9Ymm8z@RZm~."1޷Pv+-G^1E[뛹vwmMS/)6((uӦ5'S!n Q"c3=XxBRvCU}=nI2Vw>n=$cBYbL3&z` [Q)LfNe^pFe\g;6!ѧbTUKN3]e㸼"Ԋ(JIru1f4%gou>C6Q@ݜ)@ R`@%FB)m⺷Cޕ8ijָ޿^| eS<7kӵɺH/w>g;><ӧ"a"3Q(vfq/2X9N =ӅT^rf>b;G I˲8umiL1z9CQxx6>$G=pM4 8AKiCH!.S4q!PNIΚ4y޻sㅲ6䰅d܏WSd"h}/Kk1qD9 .A/?r׻,mԂG\U镭SC۶UY+%K >J1. ԶjJsMw,yWIJ8 dH+isE!5}7FdXT#PJIZ>T-۲B]zHHFsmY,*tv ߶#~0xCjJ}"^6Y[Gğ_W%|Ai^T$ 'P@Eik*yCEmkhhwU@ؽ,Z[!B( kS=8$CU23dԵDDA1d?@qD6nԨj'AVU ߬$'5җPHD2}*us,-.iTtQ7vO#fe#o~DxxGU(hah'_[(dm"+_e_#6B̞] 9m!p8$9wg,"$֛Gt{s+4A-9'^gߔdA Y( |MdJM֭c #¶ySDnXco Mei*7 QRHZ]wU9BV!UpRZHtg:}nq7Qa{,?ݚݻk[6_nt<1Z^",,?>X_ ̏ %GKh|$B6#zxhSVO4N 4b*vSh&"N @a`Y[px2%3cZqWhy-P+ΑfT*3"a&h-1gqGu.r(vi73Iwċ-K[Q%/'{惙TQ# px8)0"MbMFM*#}"ؤmpn9hѬa̦SrhE)Vmd|K'M."U@Sk!fЃ #4!a * O:5<5NϮQGHxT)$UZ%͕)&H;%4]t=``\EjYDfV=`" '\OWG~U苾-/×?zSw&E$u7npMsG!)$֢d{T-y i GRLzlR\V)[a IDATcyœ~f>فdE^*YVat= si%Iux^9b5%i)~˽CIjPif(ڂċ<3u*}:{y[yd?Ic:n,z95|ؘt USԡ5FoXD|~B B16U5}'L̲3#~Ho VX`d)x"$ %nQ30){5>| S@s^sWU=Dt;\ ;Pҁ}H*)_:(2]nW oZki)"q}b;40 D"FV5(U,.9)=`l!Җn|Bd9pkڬ[L5|}uq7gkYgbٔ^u&+ xt"Y^q[oUHޖSrj\Dt( 2e|ը`@?w O6䫞yX?7/6ѯoW*(K`i͜A]^p͍Ma1&eضUr{ɃP /H)m.KkzCqmKF/#HJܣW%nud ͉Pe(w@ky f^.e!an҈ͤr0,ۍ:msP A #B89S--}S{ QnmAju8)nKf ,̍ U‹):59r1O06Az {o܃XTMEzkK2{3vPVm@!icԩ.K@,i{|Z@<֯|r@TtJj($T&|DdX]"КpuA4g䈐!ӯyLG6~T9pK_uz=^| D,777($,` hN=b&{o}ssQgcs(c>êOQ)+Q'SsnB:*-l]OrPُ~q$="ƼԙAuv}$=6ZT`9TH Y@$IwJIY>"?0XgPnBMTꣲ?e$ )h+nɭ B=M!)WLsf;ݖH2Iw&40{LjdsINH~LHM!ux8g!kF}$d],X7FVFpGD7۶m۶S[ ;v7E$DLSrF aj!@@ģO6t:׿~_qz=^?rv,͑ʒ w .M>ݳ3>ΆN, +*TdYAYNLA3;-,hw"aGZ{(I!QL gY B҄Dt'qn4+Zhm8< ΃]葟Ps$; hIJ|p#sjTMD @k3k  (."alCuY86?H֏3m Sqj3 {P8ÎߝccВT0ֲ>L!j(.}JPUk[-Z.An{i"%ONP͓J\6,^"]S[D%x9 v!0zʀ;$j#3ϼqҞe_? _kG;:5J +S^-OTnAR"lœ&х3"[+(z ' PD@1 )uBڀ.{_SRɁa)=*pk[xmI4R3qup~G3g4tʁ9MPo.Р;% &2@wJ (iL[C)K?ٓi${ ,|  IozU(d41o%v]F8| ΝT%Et:SU N,@4Dޑ6eC!5U Mӭk: E̽!O 2Ѭ8-Gߩ`~#OG=}׾%A!Cr)^[½+/$֚csk= $̺{_0 PB{TDNB"dHxxO=hGԝe2Todv16>jWYxw+JUƺs$PєpD8VT9U`KgT2ʆ;HF|ʚ{ KXO#!R$Dp\5᪝&Gd%j }S-U|c``UcwأuU oa_yN5u_ջe!HVTd\OR1|X> c:P;#\ҷhجElWz+I4ƪRb_1\ a0Y(l(R)d9y»[7+U3[uHgx!=Of2DuRx#{w(r>*=B:4Yv:)ɨ"@?;1ՠJMK8%vx #VeqK^B(3Y!JG3c8BS؟֔ ΐUG޴rGG4:_D~ж.`KL@+h5QK21wDe̕b[xTo9:b$ "M41\l~,yOOvc¤VxaƬē8XKr"A*1T {11h)C21>cmR08I7ۋFĔ6R*wBһeKyB%@joH)HR!U[ "G[sI*XP- {yI#Yׄ*ClaPl:'\-l1 YFR]KA:-^f {GOU<Eˈ.JX Q9ʱmh7* ,˪*\Oy%Ȁ"Ua2;w;XdzF0 HĢmf,@q' @L,A%?UDɋrØ#11gն677͠tAfR%Ѥ5 \J* m `h=D`sW۾IIJ[9]2!@eY3ΠqCcF_&TUn^l .TU-abjDENk;ZTFĶm`D~2k.j%+I~l %" G@n7Z# N 5Ǹȍ8BJR[ZIrl#dGL2%# ;`J+2uQ)ʉYVyã.ngO?̹w^uE 7/Yee04zcKH>ӝ&0{XI"EEU3/3xEg_ yg*4fMa4까J|8utZ"B 4ՙ!PM/FN_ESHkDrU t*" P:=suNEI1WhD嚹G(| !JxIF?`뱾1Jъ@!͕,qPK?wE3kzD ;"qI~c~C&LM4"G]ha& r-١1!3;(Q'b9nҘͦ0jP`Qtj*mB=-{>ʦ95@ǜ>Ia1c(2(Aur%UMD(ֻv ,ُ"nDnhnZR3m;I0i%%;8d?`SWW%ܽM=r͆>b)*q{SPiB[}j-V$)m䶶{"4\eiڤR\BȴV'ww ░Fq3#> 甡t-K h 2B4H-ؓ7TGoŏ ˖\ks/O~s>seQYkm&OJ@C{D@Y~Cزtݡ96rKDl}Jl@P/""g $RC }%-~I5; ٴ{tWfh5EOPr: xT',!qs} P%+ۖ>R3J,q—; D#پ$gjJԄ% wfVТ4[KoZz_[ =H̗7wemB񰈣Rr'e0#*6rܯZK"fSkt_i]TS%D`s]GADi]2a$L|@ *yҴi<:3on7|<wӤp:afI[t J"'*wۺM,>$d)|Fy|fF~m1Q7KߧkkN'g#EQ/"VQyyjraDz 2,~G^q!&÷l3KgŤPI<#@Ƚc1[Yf0+T@twGM0Iɝ*Lߡ.NM2yǔ;}Po.ʟadơ텙ccԖ%:Rݠ5m朆M%Ӻw$)۩BW¶,۶G4" /U$Ee:yKef-%Ŋ!m5|mVJ6V*{mUURKDIiryZA< _Jiv6ZRoJPw2"hOygL뱾qt}lZpmz;NpWU %9$˪oڂ %;3$HKu@% "epSIQtE @ uDvTZw"j#scF#I դm&FIA[Tj>D O"e: }^4Sh{1=XT`UD;H6A Z9ɯl*dcmt弄 RE#` 2D;F TMwĊ+9hM"g[B촏GJTrbG.dvf2\,Mh3rt8Trm-'i3Al(l19݈Ӳö^H=16*AvR-).8O?uFgŏFUq޷`N&"f;cWĔ@G6+wY!bژ Y:@7Ʒ,Hgb@ FXTm枯9;9R#7Gg뢩ɹ<VO#AUUOPEI WF#BO hC(PE"*1ǧy(c`Q~ɘ: ՜"Ħ$ҰHb~מ8c=_zd{ }7^YdQD"QN] GEEe"Qa{&x<0{r@,% n.QV.Ml}떔TX莊K#3%w~L˘^i)M㽽#0"!CdRɧbyj@,HxG<̷f/ @(F9ݺ9)>K]Vح#-oʹز;I@c )ͨM Jr+@ED!J/6qr9fa`=)ڞV$f 4BMTB:L|=0D¡<ߜ}J޽[cJTs¤%nf)D[Ȍhc~^]XWK|L%${8D!l9")}Mी' [ۺ`Ӣd8 ,δ:dm*Y|;o+߉'{KweO:,o|7ѯ7O, &Hv vNjn:nz}v|J9=[Eѓ'xzWE_|N\e]ev...,~&+~˧rYuYOzE+g;N_/e]e][Wѷ?.e]e][??_y晿wݿ˺6x5yMݿy/.벍>>?_%w.~WtRi}?k.˺˺luF/.r˺˺luYuYuF/..e]e]e˺mo4҈|*uYuF?[MzuYuYu9_e]e]˺˺6zYuY{gWsY֭n{*U(d !2d0=K63fPT`0#6Ke-"mJ˭n~hhXP,˲ P@ 39"[zTBTb1 N(A,^t?j(D厎W^ӃJ QSiN0 sΛ7oA _6)]2~<Zd$ B QM.\p '''mmmX'4V R((D4hЩSWWWDҔF} iH}v@@@=\R\\ {HShyJ ō̯m҄2J[&LЧO˗/KR^HSW;w‹Q("I iӦm߾ܹsrѤ&Q%C9SR{ AW'MIIY`ƍ ))|/)UqbHx fsb8;, 7"^Hs\6ytn&@ PWW?Lx<^3- '6{-| ^HsA*-137tEQr?mڴ'Otss (TUJ!܎?S(זQH$H$/_633㔈Qu...W2Q D(^H3ENI$4IQ<QXh32 uT*ч Qk)˰[Lm;ߘb mJlQ04M)h.Bbhih2}Es +k(joe /*AwI8.Ң(" $rR.'ahaYPQ$!I?{jjncU,ڨ +Q({edQ\k69$'m^SS+ {U_Fv(0,˰4ð K3,M3(J(|)(Q_߀"i.`X oֶlCvI9twϮC~ٸTG(+B%mJׯ B̯{FXc*)ۨrXXY|LQM|mTJW/V-"߰p aυ$Ɵۢ7;fcD-o?z?}7q̰,Ƕ!MQ FBTWFM 04(y\m۴3JL87 ^w?g|? f[q]=n_&+9هw˨\&u=@G]/Duefh% ęr;ۻ~GQmv:wqsϽS|)}Ic);r$A^|LjV-mxe=t(H׮]W F=uSMiunY[|oxe2Pp@'gHt-uqNStzn-_`ƔTgns\$3-5*昺F!AP[D"xAyOF'8^H$d2YYYYIIIqqއwr*'}+1(z ڬ^ISfswV;v60iڬ&)?ESSS]]]MMM(8))IF%T{[H34Mէk\HRI| ͘lՆ.]\vc E:2yYYiJ qAi5(a8Y(H}ą =|t~Naaa}zah( \.+J`ExB{}IKK 0EQio[ "P 8ðZK$S3x<@@갋={Ȥe.gԓ$)JKKRwe*;ĽgwEE=~"x߼vI?6(z3agF. YgeݺDj;DD"BPV}79i7Ȋر ?U+m۵ի7@KK"8xňçN |rqqIƌ3{$۵k hXNJӍre͛]+8<M\[olM[QQrrsԜ?Tfc7/0 {~v~~>gT#8/8ݻd/^}箫?} :gYޝF&72)[Xq3iF)'N8jԨLGߚ8.J9M*@ΝfϞ5z['I>>V:88f͚u5̌) >\i8 enwtjӶ}ǔ$ ,ò,`z9Bc@՘w}۷w}AIItjhVJJ$Ip f$+,,|ȑ#ҸovRQFƍ޽Gh~}V3)oL&m6%PIIsqVH$tu6o޴sg؎CYv-`ԩbc66W}w hikwS/[?}I%>~̬>]%_y< kii)t=[8ׯ```;GQ 09SU $bܸq$22200pNNNܴKĶm'$bjIbww7A< 5zL\\ܽw+yz ߱ck5M񯲲2ebg077w֟DKe@7W*PWoB6_a:.Ji(}[n(b_[[#U?cǎ;JಥK-]򜚚n /rrrgep׮]111yyyϞ=ST47p3f`Vee4jzVEbիWZZZ à (((off8 |R"|fzQQ޽{9[0 x.](/]544&N=Q~omMaZ$&;;B"?NjrRTNzu濢- Euttrrr5aDEE ৫CQ"x8  C8F|֘ӧG x i|(w\,kjj*d=}E]vx8^^w߾} (]u-2_E"Yu@wǎSRN>CdV_(AO033ussS5b޲.\( ۯoߊz A5Mn詡[ïMheKx{{#"tIƍV8IV_ݻ7((H]]]CCcҥ111\`mmurs?|HOO X]d2v^^^uZ,d/^{e>Mqqqz,@vQngS }.(hɜ9sCBVkjhJ4%2|ÆХK[ \8p˃554554=z&VSԔhJbaƆVޝ6ujmECWVhhٳkoߦmfUcLWYXZ)L) $'p?;"H jhjp8;;Wi!s玍-@ ۶m! ͛7kذaᡡ,ˮ^}ذa޽{whhݣi߿_S"iڨX"pDD(@H*mNyٳgN5-X˗}8Dž ر[h׾9sfk԰2JNCBVx"))iʕ[ֵkC1b␷o=zz֭cǏkiin)S~߾hΜ'''F͛7gΜsg߀)beee7̙3cǍoӦME^=ssl&ek**r1yHRNV֪"L4E 6'OXXZ>|0 d2T*)++Ϸfii˲%%%jj,`\. BQi 꼞o޼111H+ (ܸqc%B_p5e̠ 555~"""D" ʟK |ſ>u&Iͣpy8-`hFWHR5ԭqȑ/_ ѳ/\e607 Kj6oQ7,,Çqq,jhhpƦuBBBϞ=+[TN:TIsY)Nzʹ4ŋzz~?d2a84v 8yRWWz_1cRRn@8::pa:TnΝ;{Y[[s'dr%^g)zS$!B.4Ayy90%} Q)/߻wACGEDҲ2 135-+-ATDx<.P-΁X,jjj\ '[z ZhP'D\^yX+$I λ(akkVۘ ==d/N^x0e,KK a 3Z;~SN=zp1IFܹdj P.۱ÃzbOUA9Q5 r˲|>Ѐ. #jw~T_xP(tR777555XܥKK.qbXMMM$.,T{ϋ|[[[FB()! cbbܻw9[zJ5z萕{ 1 SQ$1133359Y  8p充o ,[uJ"˗/_헗^8o$7}8x/>ᇉ+CBww(/ j~cfΨ'O{vh|<@a_mƦy-X+_Аã=(R[S#:::*/2ׯW۷s{ZTTIJle ۣȑֹsիgϞ !UZ^߽{뗑q~qOu m~n~.18MuPZ隴4ijO8XgR(@TB]6u9s4ʕ+\Пg.&^K/_LMMZ8ȳ_sg{{/ZaVYYل&.Y0ٲuD6Ww6#,$t!'T`v֫8u~ڴiӦMQ~}RoL?~ ,-^1tIII^^//NPf̜9h@EGɓLa %'__sn>{OJnpcūm>w.fOUl4EQuk aTEW#lҭgR8q??nݺuvv2 N0" deȐ!O9FF{"w+:ux-w嫊zAm&2ʨH"7MxAK-7q"bEcǾm`ǏL1\SS_~Z84M3y⠠-[=z䰱I+}E3228k׬i۶ 77m~QQIiiid܌={8/UڵKSSi6#( r],r9~N:b!'9vr2jU LvQ8IdJB(I qMZQ'ggxДhBF=UEQ[$E)|T+չ42lWva:<{QX]\*-{n{<>>$PF!afeNNUyu. u$PF! |}6$EQ>UxBZ#ΰ4 #V$p]TIENDB`images-actives-html5.git/doc/images/xia-logo.png000066400000000000000000000715551250410645000220410ustar00rootroot00000000000000PNG  IHDRM?jbKGDtIME  $R* IDATxy|?3W6EpCl]jţhU<9Vm˷i* zAꅶ96 wprnMȱ~ޯ}e733Av^I8XqR8;)L R(h !b*89Z+ G)Ѥ.)`4!d= \4@&Y/lPwÐ~ΘR#laԉ:ɚiD?) ?d:P@8 %~B%U(4սwDJY 4iHmPCH I T bCӔf\vDDDA%KԝRRBaR`8!tL#CB([jEl+=4QGIlq()hH1 @9,!6lm(HAZܐB2(p(@"Q9esOb,D,MD .Y7zTr&GBmP@B&hVFCDD|sOB)lL&ll:@[-XacXX‹"+tLHy`褫͡@(+ar)5dXBJn^a[Q `:$T!X4C[#I+GpxvN1L(XRd-*Vv .x !?*BO6`$D,MD~W'B@\&s$2 M}>ջt{ KWY V.W@S ^|vJ4"8rXBcTt.yD,MD=_} fD(Lg|1"&.*Ei(0W)>R,>pKgp3bi" laSn&7AԥR]M*_?7k+ &p)J ͚]S&@v?uqKQ(ֳܚYD!F?D2)Tu:(r$&2"/ !^䁜 X%|!]r@OhZJ'bi" `S9U^]wJA,MD '(S}AL(hZy!Dc ]Pf22@׵IXhR1q'$ = RVEv1bi"%#!!sL($hαbDԗ_2p 8 %Q([)4i^D,MD(K׀e(ˇ|`04"'oeRp&! kR ?.a7MocD%KԲ#~)@!ND8“";za Dt31q /sX(B0XBD=PgMZkϰ3bi_r4IgEeG3biaYP<  .bDA%{rbiW-<y<͵,eDAeBan~J׀,vk#%ssV0 bivZtA``"D䧽~Y<7w= & (/5%?Hd"Dy?ZY4uLP r46`D>4U|@4(xۤ,1 bi"ߔgJ#UH!`"%90 bi"omieà4 S1 bcmXbi"Z`aDBv@J|(d  NQ(pSvD:]|9Y,Db)(NxA2 " cE󲊙4 ,%| @< 0sPX8狇 ȋeB*e}(V! i-1 K܅5ADtJJf|(X(\H)r JR> ` *jv+5q4Q,(jU^DD'%pue`i!W)Lxڐ q4Q("iy(vSeLXv^əB2 ""iB<\<'FDA%K#+c"DD>٩.uYͬg,M,Д7y7_ۤ,VD,gaR*oHfDD~O۲Y(..kvݳ|˕(P8sK"0iW quen #n g)\DD !sZbA$AHaYX+@>@e DDASsY-| Xͤ ADt+w0 &"KAX$4VbfE5MA$'z4 QЋR.YX+H  9Kqܮ}SXr5W@\4Bz%f,M 0ȭ>i@^S27gL)@eLpYF +(Xia%@ADVB௖|"\[䟸l~4&on4Xk,QZL:R\+_(Xv- \4eRvF-ؘ`P%".)Q4%#!LØB d^?xdX-B,LDDM_6$Q~]MKSH,,R4(h;~Z۠v뵪91`陈Θ c S JaИKSYhMJ Ӡ8u;Ѱa9}沵МlT"f#6\$;W~3L)dXc \uY.j~gcWb@|H::DۓObcl38 &KS`lA՗QH?zD]6Ac0ޙ/ox߸fEB>Anݧ9[R$N ii;~;p\fF\K%'d̜j}hܲ*>>.f Ws]~~SoD N;Gt8 ͬg,Mm:[\?qӠ`VyH-f=Cny~^qK 7I = mJw}L!K  ~eAM)C1E'rY8y/`a":bOma]({^Z0ts-,KS Ka_D߯f?{(C@j Hqҫe<%Q4Uvu f6,G岗C4b`cbo'&?@ʐ^߽ ru$) VE0 &_G0IPp}Jywy ػ `N`vшFf_ &AѼ(dx Z/1 &ɷ^?3 vfT~|^ (|´S sPp?b j͍e/q[$/Y&/gK)2 vzT\6׶h?XOtA% `i켒ljW.F{ U} +B>V”.>D,Ӡn'0w}WpڸuQī0 8!)LBEpڪï,hX5W!Ļ,Fc# ! qLBIa> @tb1Дe狇0 Jn~Sg1 UDawZr[T>Y4uKvB`PӺg#0hXu >H YmfȕS3 #Nq}o? G!u/(X0mr~O\(k .|=C |:)b\|i72-{71(8wq)L,[p735uY%xr1DᩕMD=&۲<FKychg 7I⩬,Ma`EKpէ*M&I] wTEog畤48CYSS8= Q+aUJfBSX#eګR2ޒn.`i A9yEc"ΌCBΦ:AB켒4DK| 8!3Nkv3>'񚥠8)DmU]KQ8W'H4v8L|);d& A"QCK7ڔ&Kxx2!d2F&"vK~-,MA(wqX k2я"f1i"4bN^ u0+0 pijaD>.By#wqaH>q#$K% @KtBwk#C U})/\gfJ M Yz)I! @WYHc1.&" !}0)T.Ζr]%:9St@sBjnAN}).*-$:JtjƤA  iB4..knfDMfV@U܂,Mݦ> Su!.!>v3"4Hw}i,(/$:I}GNzKM{} x+$QJSt"C ,MD>Ms`i-1c*ob8D3RQ2hG~pKAq :Hԋ!!tD>ufN|,M>PM @T#KS|rAҡ,M>uSGzI  "UKLQ_~bYX|=K7I)P^s D}q.Y jݠ*M p4"l,M!$ M &>&B>uIA!kSj/aN9I\ň+I|KD.M- Hi9qE΂YzI<å#M13hύC U#MGH}#`/ 4_*"w8j1z&@$+Lciꦜ[%`CջO[O4uäc:C=m]t"C @5;dK)85#RyN[5gi" TBʀ1JS B=<5ש4LDlJvJ}E> N1@UmU @@MA0)jp"j-2h4vg0}c?'$& f-3^DicX:X\5 {ADn,M0_*Dײ{ 5q4q((H_Nxamjؗҫds Ai*穹#?xAN#a]]D '$Yiھ!t0&/$ 7;$=lKCbW"sڪѼAt0A&im ^ԉ@t/2o{#\|5C843W5Ѱ*M/w\DnmDsY!84q((I:!o)Mq%OՐn8LCQ0һaQ_̉|n C|*Tc$ Rk|^lׂLD>~M2N"d2WW]85ԮAtbNbDAOޖ: dKSv c|Iq9PW8F0>(U3|W# jgRѿ9u5ƓґRP?ZTz,\DS% m;^&h;6=.D)PT3Ts4Ԉh(P"J.& 8⡋I>:"b\#|rJrF= "(z `Hc@8A0& Pu gjY[|+fa"/^dHs:V mU?Uu0&PR˜:`LD')'#M9%K`&+o4nv:A0ca4~ ]#ot wPܼ4M \D> 5ly(caPf<, QP1 –9zox=da"ea Î]V_Bg@1a8z0Q8v|>80 +gC%Dc`JʇS 1;+-SosTf ԰?~`;Ѻo3xފ ) 6SÓoCRYwHR"}KD4SJ:R/qq^*~0#3zlT(+|&"^ rv,63'LOJ[lTV.A1 *M`ۂ{`S$-/=w<2nW'8H縚a?PʝМvhm-A:qEAFAf`!syK#krE3) \hkw_#3 !גbCh-w\<`42&#&c ' _`,L;-߽uyߴC|p7ާ,y%@.lI46DͷoyG!晝)u8_KMfAgY($R1_#zAR77ٯ)sQPխfQWݺOQ?VUv(}ߌ9 >HT~** (\W̃>&aw7YY{n`aꙦmk?`WMm 6@dz&R.bƜŅeڅ}j|0(,/Cz=H:k2 7Sisٱ[7r4ǩ9*hX_~9Hl6"΅@ܭ6ۯ\V0(,E k~LA^΁.3_ IDATX7S/oNq{aVuk?v/"Z"r'v|ӆ˜ukQs!TC!OR[-?u~> NAj8"|m.\ucWz;zfؖsWfDRz;8J \ߗ%d\ 'X8;{뎨41pjr`y^auRTR.N]fWŽ>=g)(΂1Zhܲ*(>|(/k;P>ۦ ,$wiJD͂.*PPdyk{ޟ3fdoygIpo{8N%Noa[|Q7یmy77e q%[!1bxH!qo~qzH{n]w1 ^ɘ?#B}#*:({aV\94 )ߎg.Τ8߿)Z`aH[y8A=(@5=>=7op9>DsرnO=oB}26~ S>m'N/Gwi;M/ 4DI$~`zVz(;\ƸٷIԬ~?3E% qH::cWlC/ f@Ҕ1G8&uG}lCCoOwy4e>Sj|X ؾ6@J@1D a%Y>pSsa[ԭMe\D(frP#ngۃ=Q钅e/qyLY>jVc  9YۉƭP +9\Dq*l[8~ \ۥG#M|K1;KP L;lD= J_lAӶh=lV׬ 5"< NdS\K ai* ;^M1ṉ="q-{6y4m_ʝ\XD!@: [$Lॸ5E;ۧ粞$ =wܭ64lX q0 0& jVl}fmFkV8pBtp"_E^hiRTbNtH} C\- hڶMt:4T`O1a i$C.:xF3cqvZ .[ ]8eΆ*8;ª9IlӇd/ %a4l㥜(E۞jdtXClCCrwVݞriWlea"" RM`׫s9u7;[1~ 3sZKQkYift ҤH\&zH+KQk܉M 9ݻNFQnbDD!`9^JA,XuɻOYr!$ @J8"" ToE[ތ4imyIbDD!X<} #qi,(` ;)mC " Rb'jMa5ݔ&E8ԅ9 (8mըE> =bTs, " #5?@D8T&`bKdiPuw6 " =}? HM2S4_*xbgDDau&ԗ| B!F6̎D s;Ais&L)h*gDANC\ q)ECz( Bj>j~6Rj;rTj8mМ|Rk\9B&E*M9P<}̂(Ƅ0 )mҡK!qiPIw G{.Wj'mo2 bmUhڶ07]mue.#;ܟrp2 @ 0Ø6aJϡccaJ=H2*EN+Za "5߽u%8\}2c Otщr:"f#2t;H -h./EKY!e 1~c"2 ܦDbfw9?b`s1|OU*"f#z̙- f'Θ 01Hɽh޾u>mrޡg{~]$';Τq'ٚz$Ѻ{ꋗ1 EEI Nhf(G :c23&֌/Q{hpC44m]FI4I8@ hރֽQ#k8 H7($MISAͨm ǗƔ,%aਭ4D5̂3g .s:g }VUohN^c 1cİ; DL=jgػ.MR Bk{څa{ϹnAD U_P_n'"c`͇ "["rJggtYX(ǘƾo ^3Шz$λ $m U~v^<Q! H[X>~`Q"Y {ވ䳮Ø> ~Ct1"i ;T BKq6{yi9u0 -@K07bտ!.1y0ztiv5yM4yrc4;bFz 1`b>.E3OR,M!n KHǩH߶g'eOŐİ;2" ax]ĝ>yQ訽%d#;lV`uba܈ԋb01 Ro ۤ>BQFS\䢇GKĎEI BB9 |. SϾ0^$0MU6YHn#K°qh`Be1j0@.*Cny 3 h{׏!!Ǖ&bȭO#qU yix]{+ !q!㡷5"atSD/RhC+M3Azû$묂:4F  qqC%"=!öOAǕ&,M~< I(AKaw.BEXC~!<ίu44$JPCG?Ͼ( E #DQQsF q0ar$EiH_Rc70rAߴ0硋NdaHw䳮cLj:sKS'7;NG0?x:.܏U\+ a>=s:R,!DN|~MQ .t";/AKy$C>M{_9uHp9TsLgaJq\)ˆit4..4c,C7#y 0 CNgt9yk0ćFA#󩚁1Kbd 5C0&3 :!Sp:"E$$\!:H9RT0rmH:gP<.:c2fq7fwp0$XdGN/Aipx<".< #sQ( yĎ6٘<ʅIviHS1c 1&ꝄK0䖧 T=àS s~߷ T|GJGSHi}_H>z(z#CnϹo?N)@}ۙ: o-}12ĎIviX!! ~0F;H>N.f||R(/~_OWrc'*MI$S|*.{[Fȉ /Lc_,)9WCwRF E>t'%@<$ >Uu>ˊP-4g; sAc~˟Xk~r/4{3W. "x/1p4,K~:Ir~9>Gs:HMc(aFQs߄>eRbBͪk7i>IN%pi*0gc KDC2@€b4c!b@  58;iϩ]Ҥ(t⨯mh wC] %CowS8 |SoKPNRXZ8t&4n^m*h- %|.MAT~**\ xVA3~1gr}ZSI84qQn'ZvB4uzhN 2q!}]}Wط ۚ%^?}UM0褫^-heEvGRbԼ(0\M|4nY0)jD._6㸀䄼Edfж0 }Vm}fۂ&*@(zF>:o<_P0$G%!r/{tBfsN9rrCѺo {7ګpD_ ~GQzᝈϹ>] _Z'c@$O/@Yd畜)4[\uh;5{ރ=hً=p N۞eZgм؋EMEt$LMkoEv~aI J8kUi;Wc p5pwj_-tڪv3}GCȡو=\e_} gա>S:(`K!.Lsᨯ®$\ %SP]z?.Н;Ѳ-pI1D HD> CNC E%0X 0&ͼb= $3&#ae `JAdz&"3fBj\up5T?UuǦIu5QmchƠk]@J>& $p EN"aHHcDD^LRM)&4c'`J䳯gDD^)$Kƭs̓H~?c""o"-+ Ďرg3""/A,sGg@~ |TE֊p40.$y-Iox!8M+BԈh\t ")8 -,M]I:Z(AD#((Zlh8bD971""_p)AjXI.2A.EH& Ҵm-C8b0y3 !݊Txz42c$NOn'"(ijC[N(GQ<AD䗍t+RhN.+ %$z$SH)\H%  SaDD~"܊aghw4uMF츩 UD+@nk}VI+ lm""hUY(Lm SfDD~kJky)C$rh6/'"3)] PPiڳ!tyCF턻fjjPu (6hiP xk7Piڻ!&bOi;Ű݌=hv/4"`Lc@<4D pQ@uR/Zfi;WK`0漤e4}-+^Gv+^ޔ: 1cBK6!)Ѫ3F' LBkG:(GZP꟨[1ګw{*wr'.F!qHx;tCn(?RL;;C$v \-Ԭ\z$۰PիHzΜɅA ,%61Loa !?> r򿯣zm~,9ޅPx QQ{ˋH( +âGL`}кw߂/_{awk#*>ze/SD]N&zA9 :e1ސ| ӽ-^QQ\ZF8D~~3w54!xb?m?@pgv`;QD-Q!8DVQtq0& f=hĶ30uVcp' |6R:A<~5uvv0 m;ǎa@>p*BJA~)Ss_o셻^돽b^(Q`:R$d j+4xCWKv6Ά߄U>wѱ䏥I@ai"ksGDcڄyh i*ZvY" (BtiR4#Ҝp62\52S8h)_r÷8-.`@:H|zNGȯ<`J(ө4n]þo 4QtvQZ2dN5p2 >鱒LɘQ`LtdmohZlon'.}#GaNֹ66@ 45V3å_:C8^n'H\xbƜ Eo/m:pTi,M5wMb]p4T^>s0EEyD `>Ww%pp }/J"D~kD7@5E1.Ԯ\ vc0' LƤz([ W"ԏ~iX .2!t4~L0"̃`u_)W"]&^D~Hӡ|t.ū/r!bFoݷ\qЦK9D~;:JS$KSWl۫יR"a>iu_sE EǕ&x5^mgi]KSW93F 65m_(Wfl&9i KmUpBQ{>q{[l Da;!x!A1ZK{ȡYE1c):ihW"m%5]&c"ǟchٻ4tV]d ^YQWvҤ> IDAT &*ciұ4Wwu4|^CBZeADvT/:4 )xz|Ns4 *zp͆"y99i{ g!Vy KԹw0 54uyqܭ [z9{xg/]W /'r KbԶ|Rj邥$޻׵g oϠ#qktT4k|]`GJOr;{=~p_>srȶVD>?4ulxO+)(HiH4m_ Hӿi߷/K-reCkN^62()#Mt蛣ZvsǽtO6 IHv(TЁwU̽/1%ݲ44z4)F&"gގ+MnGk&O鎯.M]jiuk?n47D"u&#?Rz?ölG/x3[P%g<+ώbs.@n`Z+!!qLQ^\h;8k_`(=ei 3/^Wjof~C>9_`HdAD!mo\sJ KbuM\ QC.#t7MF˃E1p T3/'Ie(vijEo+Rgr[yH&4u)zl57+ګQ'vaSWöiEPf@Dh]qr#-%d3: jPđ.e_uzZlDً=r"b3E)0&:HYrVb &~`8+o[YzV4BvfGId8{WstQ 1"aeo+u?a\ |Nx, !W2:YiNbk1.$Mv[Wq ↜42>#M?Z.uL"&߈Kxw)/Iqi|A`-#9t#M'<&U>($q-<ﴪnkKhb5#ߌ"4fN8)o vȷ fw4Aci"&;R4Lʅw/=g,$M ȧĪ'-Mzs-{wUu=L= dK]u A~Z !s_khYe2%dںܙ;3yX1yϙ$C$KSB_ OC6^N_in@}~q/DgRʍ.M_<BnedxiË]S6mQ#~?-dߠ_݋A8D{muKӉ/pbdQ $6ďr+ˑ<`"ۺmz& }3ovhW !DK :y/ǖ(0_*+O7N^Tk"C¿K2H]g'aIDÖ<0KԠQ>(H,Q *S'49kql^" u.(Q`ni]yʥ tSt i- "Soӱ98-Xq Em'ӥIb %KSa [w]a۟ElZNмČ0\(s=SkS>1V2v [ -73.P>}!^y7fԛC-&"Xi2=A 3d,CXi'.@Iaň0|s|XF佌9VDּ=V@@|\hQC0oi +z- AXb{z È;_ eB9~\S!%C7tOg.M;A<>djBW55@ڥ:Z,q3:>jGd B.M#XqtD=^L +MNPTHք0v28D~u~p0wF < ~^g\A 2)O:ݯ򃳋H׌ 0v2aU1vpȔ}6r/AT 9BN-mOցK,vxKӷ4X _k#,1  0-܆Q*@~Pz @DTD Cqn7ŵSDy˥VG. ',,ACyѸe9j kB_$e_o' u߉Zڢ"yQh+Kgq%iBa/ڵ0?SPaKJAD D$-1jt< Qhp{ +MH,cd$52QG1oi?QӥiFMFMfn{ ZA.[cdQq~_k# ":uR_uStdشl( [tkdDD\P^{/IB~HB"vAo!DDڙtt4g9jNF):ZPv) ":.[iZz՚gdhi:mC_ fDDݳS@K엊>C6hQɿwviJtVadČs8bIGD {.M+ 5Pcތ/ "Ze阕St+fXX1Qf uQ'ISs\. u2n@ aY>?] :Kǻ+M xGh!BsMDt=MKV@ו8dشlX0p!5 "ΤS\fg} 2P8wmAD4S~C/ )!<#<*AD;>jd_ 9&d4;O.TG  1$".zOS/^\  #`W ~Ġ'^ (dx]scgKR?DMEdTX28vN٘7T^b kYNZ,wD0(8K +Z@rxj3ɈIBLZ6N-)1  #MOŨV(xevh;1>c1ja4w+J> ZR.be!1bʾJD4$qvi}mO,^ϟhZ* r9Dd]yZ#j@"3{6Vq?Kxc= UhھkBkGDp𰽴aJO2 "LJ~! N54\ Ȕ8h~իĎG~#xzFȓ=-Mr(jtMa'qmady)Q_/|Y yPm|*48>渄.}GA= _<9VdK\^ NB@z\ AWX*7j")W{g*="M@tp(ó?AtB-8Aʰдs)_K. U{9X!DJRO/M_<\! Ƶ:~2Ԭs)0jZg~zw~ywh䠅YOL_iwOsHI@atyh]|pAP=PZkkޅ3L{D@ !DߊiHi*-bGF ye /]WE- 2_rmkn.4ā ^m34,Ǎ{ :1cߋ8aqIbKw~Sެ{=bڏ#!.-45wTs(!adF]4חP&?hܶ:4v2^FlP DȰT7 8|d>P3~0:q?\[Vg(~ %8h,î7܆c/3,1 5Q\z0J?ִk=j׽A?T6;62T)71n8M0(͋OH}t|ks`BcҠ-M (qdD  T>{;OQ^7*"ߧGMYT╅S ])I6s\t;s8{ h?aPi-|~:v|qj4n_Á7vmEFܯ-rDH c&!2%At{@Q'|Cswu_x=xQiw;9$JSi^A%2)n+яꨪĞvh{ؽ#дk=' 4/ʀBHG2ѦS7cOA\ {caAur?2rߖSnRc8%ʹLgphC8l> uBޅwBkoZ*J a_o"o[@2TɈI zbzū]a k8qhC1O}GAΎ+M | G_2!{ލ.Limػpj,a3IE<_T2-M9d\ď !C3hp|0H]t3o c|9:gF>2% "8d ziǁá%Bw1W])C 4!3/ᑏ_tG"9dk|ox]Uh?a#*C؏W k ǎ8XH_ g A{@ʡG`)π z*U.| $D/nGc !U?◖]BNF'# ^kt!v>vZ*63 px_gp񡴝y?  $?+ E­P'#>Zz `Fm8j8^ 2maQ= =xW@O+M%mE~2t[mx] m_Ʈ'Aӎ $vhU{H7Z] >/ͷ 6m"%Čs57ަ:VO_8 /dyէl #ْRr4ᯝA͋a#W{ %@58߰\*{t BT>'U@guxNQ[};u% a#Wvݻވ h$4[Ax˙] ^ `;ST {mơwƎG@͚%UТڈO/Gy@ĭcn}R9;sdh>u0@l;Zмs-6R!*% 5OT}<g4y]{X$tiOf ^ Y"dPװgh;a H"aOҨxskr,ژI/VpAEŠ=o-ׁk^ʾ DOBb((#f48?Evp+ CY3Ka:L^T. ũBF9T}Am>" i n=t4WlFѸe9W`3.k mL"e'%Y̖9KCFм{#Zla&P#o~H7 vxv]/}4WiJ4n_8'IĎ ߃XoH؋J?pƐuq:S0ğ~bzдs-A m|~ 5:a\ϞdeƬF>3.:}9d8 "Z4q#Dig f踠]S -{h,A˾Rs|M.6-3^`/)4m¬es^pV_|O/JEvD[R) R{U:UnO=l\z^ "~)kLZT쉥r4w+݄jd,"#*% kl)&@5^T O1x\U6TSwUh?Z,18Xm M^XN:k)/fN.ksXnInig!N-)DXaKaۚ{ۡ{:uBwAu8 qν/cF=@|NjVN%ƭ糧H }KL"0Fy˕pihPK cgD}- qЕf.LAQyf>'݉ AD}ξA՘73טuRsZ?Պ[4WD 5 rw0x>A%@"U'cԧˊF?Gb ¨Uz\p& dKdaz }Flc/0s2ˋ  @%Kȟ ( Ek0Qtv9TdZnTyEsx(Qx5&!?g0 KfgӃ s9xiw!1\A&R.q7+qۋʋ5Vwj9^!7iӞurKb+?TNHW*3!!jHM}DAdRHS<ԡA~ot4PVh^NV Hq4 3? %e] FpY/R50^xᄥ@6a<0L߅SgS!˙uBrS0$VqRX1b 9aЀ/?ǽj)dK .{MWD4: c&1 @% C+Dsa$̭ƅ2@!]J/$:$j,aD~b[@LjPT:KS >OsS@L,.}C.P)R;dfnc̻pE[Y+0X߇J : k|2\N;aOJ\PZ`_Ve=G:dԕUx7Y6.D') ~ #_Xw;ge?n:l}.*)!pJ! IDATځǻ눾EEbUDKF kr;3'?M8U$/dD""}"&saSOp.YY8(X>,$`dzRG}8S62 YFECc +N6iی1|\KY*Ϙ ǖ3=d,D0" %Kӏθd0 U{qtYvedZ^1 I ü\..Q4uJҁ"74(hH/padՆg_~ͣ qQY~ F%6}.3GʅSwp,&# `uvY&|u zTlzw+FN`S%Nicu(:`i1EοJLKR)26" gM0߷W xKSOq=tncSZ*_A V7';%m),X pUoWp9ӠPR@횷иu%ΣL $xU(R+YRv=\4(Pijz^qBa3z$a1 &Rfgq17&uQn%# LatOehW@qH;Ͼ $4E&d,M~ps֮~*2w4l?U@B\DAHʹ5/ M~rRi}`i Lqzts,D6ӠK\ etw+3 jt<2/@R%I7!^@☕S(X[m/B# Fӎp9?Eӎ{:JmT GND!sxRjrcvFd bGH| )1 nCp~]{ Ť qM@ByHs/p0 &'"eh\[W]%.IY ~O#J,LDd%vh;FE?A쨉MaQ ?MB/tl`,M,NDAPmдuZ9{䆞F#.}I}S3d S33t"C( &+o+NnN#4N^Dmh?m]{'#j(D=d,1(y3/{;`i JOŨV.`D]kuN }8+km /dE-y " CԠш4 GЇNBҠ^P>+s`i j{"%p% 2Ro1x\Up H]3kW"aKJ5"w" Ed!Z8U{`8gf`,M!Sw\4 uk? ަj-ڛu|nk@ a%&xXb`M X~P#c8Hԓ[ ,9wQ+?iL\@!u ڏ<F@@Z:MlFEQ&ADDU~]>'#ޟYY tADD]ex);/1~""f)g~!HSߔWhgDDu x)c@3|>`ADD7β/e,M1"i7j |K1loB3 "@viI^n%0^d"fiI_ Hi1Un6tE蛵a%" ƴ$RyKuVV,4B&*ͷg,M sKҥ|`4 " ٭q~#?a^fDD~s7:gef,MLYťyB1 ȯ\,jDݽQLT4z\= :geQ6^3&$D1QOZi,Y,LGŒ+@< "6/|(o+ KyD L6A83 & tX` ":)7 jxGX( ً} ųiЄzsy~VfD^7b.dAD|x2Ro{p팃\tq|A,MEIH4( 5 !82_cP۸N}sVjp(|aݑ;=~ؑ ]< `" %q@HNe XLw'E1(xDxɴ6A,M#=[d腀 %~Čv3 bi"Cd+;W }ә:ymKP*Do( @xS(8*㉲E#DȄ$x]S23biA&""Y+YMXT9' '2 " #_Yz &2-]*&B4H"'JfglaD=?uցy8Q%woμ2A,MD0mVwBb6!L(FBGj>iU X!gfޮ\' H`,! )GƼ MXzBT _B{g DLTRw6ڗP茄X$ ZzQLȔ\\(t1;qKQ)f&x~-DO{"Žg1bi"2A.ot;"ko*ȑS8(p\!T \ P VUtͻ(e,(jHy3}"-HԱDQy94%9R7LKrQKZc$D,m,~~tkRfW65!&0u>FH @a*DbrT;μ̃X?d R+!kX 'B Me1"&N;NB(U !߇*:%"&S2f^VsR+T(Hy!JBgow 2Tڅr &23"&"˜[:FQp 'd;"߽݈XLc)IS1@_B~ ȯ5!>/3BHBD%jcY8_y1 3!.|!4-k܁B3"&W(^eBId ^E. *X%7=4>)EFqT& d07t# !VCbѶi[!bi""3'#34t&j%A(TJU+qޙ}4Qds \!]Bd Z-(R8%CjA;6"&"2@ҁ-!H `e:r.J)P完=`(gf+RH1RF @22L+$*$K@ ]^vleU- @"$*YJ$"@ 'fP{QB KJ(l 8o]UimY"bi""ʚL"T6˶WN1E"EY'IENDB`images-actives-html5.git/doc/images/xia.png000066400000000000000000000145201250410645000210700ustar00rootroot00000000000000PNG  IHDR1 sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxwxT% &:$ MR2A|zUFL0eB E@ ޫ?ę9{9{}=syC2v" 6A.GJAtdH* A3V-5("x[ &iTu)V "P< ""K#".eJV 41AM A)[H!4#6qvmi!RjPDpoZ'fܛ0r?ܺ6#m* RR$-/WMFHNaAkpL r @,MDYfAC\"EE@#мu8')4hBA @#6+\@- Rp`@n~!|ё!T!7BJs6 Abx9F"b  B&fDZ9Q -hbvl߸zmSω H1hb_[ n&F`e\q41AM AACDh,O}y"fJn]ަ|r jWZ @*/gBCTžх`.Tr'N 떼H0>Ӡ4)TτIDUr`Ng60kWP-ktq@CT{ J!'VO#:vWWhbB;൜>qTQ?~8'"hbGy2I̾(niO(ɂ&- ^pj41;XX^<9Qʏs4^5;=[lBq/41;Xص+X2t'W-j>Z*UM!3dKj\4W&:1+X. ʓkb9ZߝO5xG;PI41+wCb8{8dOc!+vm"yrYyh[3ܺ Ux4췬[%_[q$o1ڜ,ըy\ !:]{@ E ¨IĪZMP1,ci)9~Q,bP츒5O4wSχ,(Wܢ;6UO< OwCDtHc)Yֺ0=!7вmU#l$TBE&65ȞlѦ=7e?iCCf w.wshʊLJj$'hfl. PܺbdXtr_rX!lYL76>R ZMxKPLHK]dw'kԁp*7|bE%(sl^h\md(5idVIN=Ibi-Qv o }ÇJiشZr@m[LSx$1BD"v}Ed34u A+sAaIn]fJ#Ĵ8(DzDEMHZۓ/](ϯM۾q$_Yղg'&#MFM5";# 훰4' }6ZBƼԭEmb.Esn_eߐ*iS5'Ǐ9>6#C 3};us\:ё!Ī kRWY_}\_D *xb`i<+\b^jٿ& Mr= 6k%DxC(̯S4_Y roM[51ZdY+TYw9s%*ӒP]{wn\ 2fMK'ڲXC{w1Մs^߿~$=2p%}vd6!:2DSox%$'_r,yt [I\I|4iͿqRfG%'7^b^rm{wnݽ-YϒDh߹GדTs'o!oD10 4fJO%ݣW,Ğ"'- ULVbf7^V㑊,8=DV(-VVf|[CT=<3}?L3Q ̂vm(37ȿ'-#w,RR9.Q,(Q:3<2Ҧɸrz#9! vx6O20R>EEO$$"Wo]y+TOýw$C^PJ=u&3Z|H'=y3% vܺqp71N/ N,|wZ*zݞ}AKeUǮ'3 Č{n=I,aS*IsD3]3VMK.^` N1&4$9˘\XmL"aLJjLzc7RdܝjZUHIrڗ0&_n( n߿cIlKir0&(liuJb~OOըZ!GS˜c}0_Dz "Wm|IY9HB$tf'iEƖSLxڂYGU!"V/uϩݿoVxeɯ*!Lϐsѕ c_wxMl|MFMYT>ZVg YcyG߳E;YJO3҅azFf}mJjݼjNƸvnY+ըRQtfY.X=f-)]˴iU;wIkp|Hwod򬨘sN.nmI4ˏ_R#*{Xf&fi6o nXYѓ͵+q4 4(6jD?ld΀ih`к}gf;vDOֱ$3W}! ._?TB:07#ݭ{VߤbMFVm?wm(85-޾[B+Ib(O$cb咽[c5BuZ[4%YIL?’%ebg[c|$y@d++D=1C%1L= eb0W qqҨ{ZjUqP7̑y#y4[-0LPcJCx DLϜ6Us$ =#Z%GjЫM@xKP-1 0-!%5˭R*EuO~$=#-B"m^Yno8}[OrGp=q]61T,5]U Kk1̞gXQXO_Gljʥ %yuV,?| |wTYCGO9!4!.RR42Dl.o qAf]Ӫ,آj Ս/CRꥊr3ojil/\ sobsR?S.g33 iͼd7tG??@5Pp6/5IbgOW]E^abgZ'An~!f!.elF_l<g*رsh5>W2rNk<$ï66x.]8K<#ў5kC!/6,'L ޔho\+1|C\*3آQfm5&P|f/ro)PN]!ǰ[,w振T㰏F7Tmf3,PjPDp,BZ$#m*^11k,"c}י@_-C(Q),ꇼEP$DOޠ!"&`6C Eh40Dt;ioIcx$h`7&k:|ځx >abfʻ|N 5 1`\Ϯ W(**@ٲ~Ъ(a6!~pg^b,6WrBO>Zb\41A4<-AD&KE*Adr4|[ L>*UTTё!yЇAX_ط4@n~a_.ا&[?-LIENDB`images-actives-html5.git/doc/images/xia_open.png000066400000000000000000000041401250410645000221060ustar00rootroot00000000000000PNG  IHDR ߁1PLTEt|ajbkcl`q]jdmgtenhubsm}ivc tf oqyjwurzovl xs{si!}p{wm!yq |xn"z}u!}o#{v r"y s#~{!t$ |"u%!}#z$ "~${%#!|&"%}(!$&'"%'!$&($"%'+%&$%(#&()*3,429/4yB~8=<56HFLRSMUTLQNSULTVNPUVUWWXUWZ_ifeǺjĵmĭ}‚ȇċˊƍ‘ɜĞʝ˞ˠǥҤΫȭϬɮ̭ЭҬѮرպqtRNS@fbKGDH pHYs  tIME Ұ-ytEXtCommentCreated with GIMPWIDATxoF`i#IXۉ@C0dNt6{&mj#݆QäȻ8~__X~p:R3Q1d,W2Yf"YYYYYYYYYYY?f- Ԓ;CuKo>}ƙ7_Ym6ĉ+CԖ?^usW~|Ps3*]DZ綃}$/y֞RDj  k~F~*d2"c? kDZWMxóȗv#h֭3i '++gyᦕUkpE`AXc:p7trw/7l%n .{.ƊgmlsȦMayV.=2q qv0v nH7of eV;PX0,oU \:JwCofh(J|xxxp+ŧè`9\.xURwRL25}LԛVo&U*ۺf F0ȢP!Xå8M"Ln|| qE"dmz'#8wjW *SPJ~]Tpiq Z*sTYKTe ̀.ʜݕtVͥ]cսnsWA ـvPRܮ0*;]T+b\ʅ]1z©ڬ~W+ p]Y͌¸5NWhUE˵~ëL mAY}.+b⊤2WP Yb#m\>*ajB kE7|5 !<+bCC~K;2?JEI8 R93JQ%]"j*FqTUB˥D pIENDB`images-actives-html5.git/doc/preambule.tex000066400000000000000000000021271250410645000210320ustar00rootroot00000000000000% po4a: environment tip % po4a: environment alert % po4a: environment links % po4a: environment tikzpicture % po4a: command -tikzstyle % po4a: command node [](){_} % po4a: environment scope [] % po4a: command -usetikzlibrary {} % po4a: command -def % po4a: command -href {}{_} % po4a: command -geometry {} % po4a: command -arabic {} % po4a: command -Roman {} % po4a: command -alph {} % po4a: command softmenu {_} %po4a: command caption [_]{_} %po4a: command selectlanguage {_} %po4a: command renewcommand {}{_} \documentclass[a4paper,12pt]{report} \usepackage[utf8]{inputenc} \usepackage[english,french]{babel} \usepackage[T1]{fontenc} \usepackage{lmodern,textcomp} \usepackage{graphicx} %\usepackage{listings} \usepackage{caption} %\usepackage{fancybox} \usepackage[pdftex]{hyperref} %\usepackage{epsfig} \usepackage{fancyvrb} \usepackage{tikz} \usetikzlibrary{shapes.geometric,backgrounds,fit,positioning,trees} %\usetikzlibrary{arrows.meta,shapes.callouts} \usepackage{wrapfig} \usepackage{manfnt} \usepackage{keystroke} \usepackage{dingbat} \usepackage{xcolor} \usepackage{geometry} \usepackage{xia} images-actives-html5.git/doc/pt/000077500000000000000000000000001250410645000167555ustar00rootroot00000000000000images-actives-html5.git/doc/pt/documentation-pt_PT.po000066400000000000000000002052531250410645000232210ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2015-03-22 14:47+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: title{#1} #: documentation.tex:7 msgid "Xia" msgstr "" #. type: title{#1} #: documentation.tex:7 msgid "Create HTML5 interactive images" msgstr "" #. type: selectlanguage{#1} #: documentation.tex:12 msgid "english" msgstr "" #. type: renewcommand{#2} #: documentation.tex:16 msgid "Figure" msgstr "" #. type: renewcommand{#2} #: documentation.tex:16 msgid "Table" msgstr "" #. type: renewcommand{#2} #: documentation.tex:16 msgid "List of figures" msgstr "" #. type: section{#2} #: documentation.tex:19 msgid "Introducing Xia" msgstr "" #. type: subsection{#2} #: documentation.tex:21 msgid "What is Xia ?" msgstr "" #. type: document #: documentation.tex:27 msgid "" "Xia is a free software developped by teachers from the french academy of " "Versailles. It is released under \\href{http://www.gnu.org/copyleft/gpl." "html}{GPLv3} license. Xia converter takes a svg file as input and outputs " "an interactive image in html5. Xia allows to generate animations and " "interactive activities : drag and drop games, discrimination, selection, etc." msgstr "" #. type: document #: documentation.tex:31 msgid "" "First sections of this documentation (see section \\ref{basic_imageactive}) " "are dedicated to make a very simple interactive image: cropped details with " "comments only made of plain text. Then, you will learn how to create an " "enriched interactive image (see section \\ref{enriched_IA}). Final sections " "(section \\ref{games_IA}) will teach you to create games." msgstr "" #. type: tip #: documentation.tex:38 msgid "" "All examples are on line (links and downloads available at the beginning of " "each section). At the end of each section, a heading \"Abstract\" presents " "the essential guide lines to remember when creating an interactive image." msgstr "" #. type: subsection{#2} #: documentation.tex:40 msgid "General process" msgstr "" #. type: document #: documentation.tex:47 msgid "" "Xia is only needed at the end of the process. As we can see on figure " "\\ref{workflowxia}, most of the work is done with a vector graphics editor. " "We recommend using the free open-source and muliplatform software " "\\href{http://www.inkscape.org/}{Inkscape}, which is really easy to use " "(Inkscape will be used in this document)\\footnote{It is also possible to " "use LibreOffice Draw.}." msgstr "" #. type: figure #: documentation.tex:75 msgid "" "\\tikzstyle{box} = [draw, text width=.6\\textwidth, align=center] " "\\tikzstyle{ia} = [draw, text width=.8\\textwidth, fill=reddebian!80, " "rounded corners, inner ysep=2mm] \\tikzstyle{xia} = [draw, text " "width=.8\\textwidth, fill=bluedane!80, rounded corners, inner ysep=2mm]" msgstr "" #. type: tikzpicture #: documentation.tex:75 msgid "" "\\node[box] (open) {Open an Image in Inkscape}; \\node[box,below of=open] " "(create) {Create details in image}; \\node[box,below of=create] (meta) {For " "each detail, edit metadata}; \\node[box,below of=meta] (save) {Save " "project}; \\node[left of=create,xshift=-.37\\textwidth, rotate=90] (scape) " "{\\textbf{Inkscape}};" msgstr "" #. type: scope #: documentation.tex:75 msgid "\\node[fit = (open)(meta)(save)(scape), ia] (ink) {};" msgstr "" #. type: tikzpicture #: documentation.tex:75 msgid "" "\\node[box,below=1cm of save] (createia) {Create an interactive image in " "html5}; \\node[left of=createia,xshift=-.37\\textwidth, rotate=90] (xia) " "{\\textbf{Xia}};" msgstr "" #. type: scope #: documentation.tex:75 msgid "\\node[fit = (createia)(xia), xia] (ink) {};" msgstr "" #. type: tikzpicture #: documentation.tex:75 msgid "" "\\draw[-stealth] (open) -- (create); \\draw[-stealth] (create) -- (meta); " "\\draw[-stealth] (meta) -- (save); \\draw[-stealth] (save) -- (createia);" msgstr "" #. type: caption{#2} #: documentation.tex:75 msgid "Creation process of an interactive image with Xia" msgstr "" #. type: tip #: documentation.tex:81 msgid "" "If you have \"image active\" project files (with a .xia extension), you can " "change their extension to .zip, unzip them, get the svg file located in the " "unzipped folder, and open it with Inkscape. If you are using GNU/Linux, just " "explore the .xia file and extract the svg file." msgstr "" #. type: subsection{#2} #: documentation.tex:84 msgid "Installing Inkscape and Xia" msgstr "" #. type: document #: documentation.tex:88 msgid "" "Having Inkscape and Xia installed on your computer is the only thing you " "need to read this documentation. You will find any relevant information " "about the installation of Inkscape on its website" msgstr "" #. type: footnote{#2} #: documentation.tex:88 msgid "\\href{http://www.inkscape.org/}{http://www.inkscape.org/}." msgstr "" #. type: alert #: documentation.tex:94 msgid "" "Make sure to install Xia after Inkscape. Otherwise you will not be able to " "access Xia directly in Inkscape.\\\\ If you work on a Windows system, use " "the portable version to access Xia outside of Inkscape." msgstr "" #. type: item[#1] #: documentation.tex:107 msgid "GNU/Linux" msgstr "" #. type: description #: documentation.tex:107 msgid "" "In a terminal:\\\\ \\texttt{\\$ sudo echo \"deb http://repository.crdp.ac-" "versailles.fr/debian xia main\" | sudo tee /etc/apt/sources.list.d/xia." "list}\\\\ \\texttt{\\$ wget -q http://repository.crdp.ac-versailles.fr/crdp." "gpg -O - | sudo apt-key add -}\\\\ \\texttt{\\$ sudo apt-get update \\&\\& " "sudo apt-get install xia}" msgstr "" #. type: description #: documentation.tex:107 msgid "" "[Mac OS X] Download and install the package:\\\\ \\href{http://xia.dane.ac-" "versailles.fr/download/xia.pkg}{http://xia.dane.ac-versailles.fr/download/" "xia.pkg}" msgstr "" #. type: description #: documentation.tex:107 msgid "" "[Windows] Download and install the Inkscape extension (\\href{http://xia." "dane.ac-versailles.fr/download/setup.exe}{http://xia.dane.ac-versailles.fr/" "download/setup.exe}) or the portable version (\\href{http://xia.dane.ac-" "versailles.fr/download/xia-windows.zip}{http://xia.dane.ac-versailles.fr/" "download/xia-windows.zip})." msgstr "" #. type: section{#2} #: documentation.tex:111 msgid "" "Creating your first interactive image using Inkscape and Xia: \\emph{Basic " "features}" msgstr "" #. type: subsection{#2} #: documentation.tex:113 msgid "Building the svg source file to generate an interactive image" msgstr "" #. type: links #: documentation.tex:116 msgid "" "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1}" "{interactive image} created for this section of the documentation." msgstr "" #. type: links #: documentation.tex:119 msgid "" "Download the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/svg/xia1." "svg}{svg} source file." msgstr "" #. type: document #: documentation.tex:126 msgid "" "Manipulations described in this section will help you to create a \"basic\" " "interactive image featuring:" msgstr "" #. type: itemize #: documentation.tex:126 msgid "Zoom-in enabled details" msgstr "" #. type: itemize #: documentation.tex:126 msgid "Comments on details only made of plain text" msgstr "" #. type: document #: documentation.tex:129 msgid "" "Once you have chosen the image you will work with, open it with Inkscape:" msgstr "" #. type: document #: documentation.tex:131 msgid "\\softmenu{File $\\rightarrow$ Open}" msgstr "" #. type: document #: documentation.tex:133 msgid "" "When asked by the software if you wish to \"\\softmenu{Link}\" or " "\"\\softmenu{Incorporate image}\", choose \"\\softmenu{Incorporate}\"." msgstr "" #. type: document #: documentation.tex:140 msgid "" "The information filled in the \\softmenu{document Metadata} (\\softmenu " "{File} menu) will be included in the interactive image once generated : " "title, creator, rights, \\ldots. It is strongly recommended to type in this " "information. You can see what it looks like once generated on the image " "below\\footnote{The fields \"author\" and \"rights\" appear in the window " "\"About\", symbolized by a clickable button shaped like the letter \"i\"}:\\" "\\" msgstr "" #. type: document #: documentation.tex:149 msgid "" "The title entered in the metadata of the document appears above the " "interactive image and gives its name to the web page. The creator and rights " "appear in the pop up associated with the \"i\" button on the right of the " "title of the interactive image." msgstr "" #. type: document #: documentation.tex:152 msgid "" "You can save the image in svg format in the earlywork, through " "\\softmenu{File $\\rightarrow$ Save as\\ldots}." msgstr "" #. type: document #: documentation.tex:156 msgid "" "For more clarity, you should remove the current extension of the image in " "the field \\softmenu{Name} of the dialog window. Finally, in the dropdown " "menu, choose the Inkscape svg file format:" msgstr "" #. type: document #: documentation.tex:158 msgid "\\softmenu{SVG Inkscape (*.svg)}." msgstr "" #. type: document #: documentation.tex:167 msgid "" "Several Inkscape tools can be used to clip the details that will become " "active in the animation generated by Xia. Among these:" msgstr "" #. type: itemize #: documentation.tex:167 msgid "\\softmenu{Create rectangles and squares}" msgstr "" #. type: itemize #: documentation.tex:167 msgid "\\softmenu{Create circles, ellipses and arcs}" msgstr "" #. type: itemize #: documentation.tex:167 msgid "\\softmenu{Draw freehand lines}" msgstr "" #. type: itemize #: documentation.tex:167 msgid "" "\\includegraphics[scale=0.5]{./images/bezier} \\softmenu{Bezier curves and " "straight lines}" msgstr "" #. type: document #: documentation.tex:175 msgid "" "Without going in the detail of how these tools work\\footnote{For this, " "refer to \\href{http://inkscape.org/doc/shapes/tutorial-shapes.fr.html}" "{Inkscape manual} or \\href{http://en.flossmanuals.net/inkscape/}{Floss " "manual}.} note that the tool \"\\softmenu{Draw Bezier curves and straight " "lines}\" allows to crop \"click by click\" (work points are called \"nodes" "\"). You close the figure by clicking on the start node. You can draw " "\"\\softmenu{Bezier curves}\" by keeping the mouse button pressed after " "creating a node, then moving the cursor to bring up the control handles to " "shape the curve segment as desired." msgstr "" #. type: alert #: documentation.tex:180 msgid "" "If you set a left open shape in Inkscape (for example a line), Xia will " "automatically close it by connecting a straight line between the beginning " "and the end of it." msgstr "" #. type: alert #: documentation.tex:188 msgid "" "The order of creation of details in Inkscape will be the same in the html5 " "interactive image (for example: the first created detail in Inkscape will " "appear at the top of the interactive image). If you wish to change the " "sequence without having to create the details once more, see section " "\\ref{XML_layer}." msgstr "" #. type: document #: documentation.tex:192 msgid "" "Once you have cut out a detail\\footnote{The colour of the border will be " "the same in Inkscape and in the animation generated by Xia.}, you can select " "it with the tool \\softmenu{Select and transform object} to resize it, move " "it\\ldots" msgstr "" #. type: tip #: documentation.tex:198 msgid "" "If you have some difficulties to select the details you have drawn, apply a " "colour background to them. Choose whatever colour you like, except for black " "and white (see why in section \\ref{white_black_background})." msgstr "" #. type: document #: documentation.tex:203 msgid "" "You can access to the \\softmenu{Object properties} by right-clicking on the " "cut-out detail. Thus you also access to the dialog window in which you add " "the text to be associated with the detail in the interactive image:\\\\" msgstr "" #. type: document #: documentation.tex:212 msgid "" "The two fields to be filled in this window are \\softmenu{Title} and " "\\softmenu{Description}. The title filled in here will be that of the " "detail, description will be its comment. Do not forget to click on the " "\\softmenu{Define} button before you close the \\softmenu {Object " "Properties} dialog window." msgstr "" #. type: document #: documentation.tex:216 msgid "" "The process described above must also be done with the background image : " "the title and description indicated here will serve as an introduction to " "the interactive image (title and comment not related to a particular detail)." msgstr "" #. type: subsection{#2} #: documentation.tex:218 msgid "Generating the interactive image with Xia" msgstr "" #. type: document #: documentation.tex:225 msgid "" "When all the details are clipped and their metadata indicated, Xia can be " "launched (see figure \\ref{xia_interface}). You must select the svg source " "file with the top left icon\\footnote{When launched as an Inkscape " "extension, the top left icon has a different look, and can not be selected, " "since Xia assumes you want to create the html5 animation from the image you " "are working on in Inkscape.}, choose the export options (see figure " "\\ref{xia_export_options}), and then choose a template and the destination " "folder of the interactive image." msgstr "" #. type: document #: documentation.tex:230 msgid "" "Clicking on one of the template icons generates a series of files and " "folders. Open the \\softmenu{index.html} file in a webbrowser to see the " "html5 interactive image." msgstr "" #. type: alert #: documentation.tex:239 msgid "" "This file will not display anything if used alone. All the other files and " "directories generated during the export process must be stored in the same " "folder (see figure \\ref{xia_files}) as the \\texttt{index.html} file so " "that the animation works properly. \\textbf{It is therefore essential to " "dedicate a specific directory for each exported image}." msgstr "" #. type: figure #: documentation.tex:258 documentation.tex:297 documentation.tex:665 msgid "" "\\tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded corners]" msgstr "" #. \draw[help lines] (0,0) grid (5,5); #. icons #. type: tikzpicture #: documentation.tex:258 msgid "" "\\node (bBlue) {\\includegraphics[width=2cm]{./images/buttonBlue}}; " "\\node[left= .3mm of bBlue, opacity=.5] (aBrown) " "{\\includegraphics[width=2cm]{./images/audioBrown}}; \\node[right= .3mm of " "bBlue, opacity=.5] (guClic) {\\includegraphics[width=2cm]{./images/" "game1clic}}; \\node[below= .2mm of bBlue.south] (pBlue) " "{\\includegraphics[width=2cm]{./images/popBlue}}; \\node[left= .3mm of " "pBlue, opacity=.5] (gDDrop) {\\includegraphics[width=2cm]{./images/" "gameDragAndDrop}}; \\node[right= .3mm of pBlue] (pYellow) " "{\\includegraphics[width=2cm]{./images/popYellow}}; \\node[above = .2mm of " "guClic.north] (aCloud) {\\includegraphics[width=2cm]{./images/" "accordionCloud}}; \\node[above = .2mm of aCloud.north] (aBlack) " "{\\includegraphics[width=2cm]{./images/accordionBlack}}; \\node[left = .3mm " "of aBlack] (params) {\\includegraphics[width=2cm]{./images/params}}; " "\\node[left = .3mm of params] (files) {\\includegraphics[width=2cm]{./images/" "xia_open}}; \\node[left = 1mm of aCloud, opacity=.3] (xialogo) " "{\\includegraphics[height=2.1cm]{./images/xia}};" msgstr "" #. comments #. type: tikzpicture #: documentation.tex:273 msgid "" "\\node[box, text width=2.5cm,above left = 5mm of files] (filesC) {Select the " "svg source file}; \\node[box, above = 5mm of params] (paramsC) {Define the " "options of the export (see figure \\ref{xia_export_options})}; \\node[box," "above right = 5mm of aCloud.north east] (aBlackC) {\\href{http://xia.dane.ac-" "versailles.fr/demo/tuto/xia1/accordionBlack}{accordionBlack}\\\\ Large " "comment zone, suitable for the insertion of multimedia resources; to be used " "with vertical images (portrait)}; \\node[box, right = 5mm of guClic] " "(aCloudC) {\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia1/" "accordionCloud}{accordionCloud}\\\\ Narrow comment zone, with more space for " "the image itself ; to be used with horizontal images (landscape)}; " "\\node[box, below right = 5mm of pYellow] (pYellowC) {\\href{http://xia.dane." "ac-versailles.fr/demo/tuto/xia1/popYellow}{popYellow}\\\\ No lateral comment " "zone ; a first click on the detail reveals it, and a second one " "simultaneously unveils the comment and triggers the zoom function}; " "\\node[box, left = 25mm of bBlue] (bBlueC) {\\href{http://xia.dane.ac-" "versailles.fr/demo/tuto/xia1/buttonBlue}{buttonBlue}\\\\ No lateral comment " "zone ; comments appear above the image (suitable for long comments) ; the " "users access the comments through icons placed above the interactive image}; " "\\node[box, below left = 5mm of pBlue] (pBlueC) {\\href{http://xia.dane.ac-" "versailles.fr/demo/tuto/xia1/popBlue}{popBlue}\\\\ No lateral comment zone; " "a first click on the detail reveals it, and a second one pops up the comment " "(no zoom)};" msgstr "" #. arrows #. type: tikzpicture #: documentation.tex:282 msgid "" "\\draw[-stealth] (aBlackC.west) -- (aBlack.east); \\draw[-stealth] (aCloudC." "west) -- (aCloud.south east); \\draw[-stealth] (pYellowC.north west) -- " "(pYellow.south east); \\draw[-stealth] (bBlueC.north east) -- (bBlue.north " "west); \\draw[-stealth] (pBlueC.north east) -- (pBlue.south west); \\draw[-" "stealth] (filesC.south east) -- (files.north west); \\draw[-stealth] " "(paramsC.south) -- (params.north);" msgstr "" #. type: caption{#2} #: documentation.tex:287 msgid "Xia's templates" msgstr "" #. \draw[help lines] (0,0) grid (5,5); #. icons #. type: tikzpicture #: documentation.tex:297 msgid "" "\\node (exp_qual) {\\includegraphics[scale=.5]{./images/exp_qual}}; " "\\node[right= .2mm of exp_qual] (exp_firefox) {\\includegraphics[scale=.5]{./" "images/exp_firefox}}; \\node[right= .2mm of exp_firefox] (exp_1file) " "{\\includegraphics[scale=.5]{./images/exp_1file}};" msgstr "" #. comments #. type: tikzpicture #: documentation.tex:307 msgid "" "\\node[box, text width=2.5cm, left = 5mm of exp_qual] (exp_qualC) {Select " "the quality of the export on a scale from 1 to 4}; \\node[box, above = 5mm " "of exp_firefox] (exp_firefoxC) {Activate or Deactivate the creation of the " "FirefoxOS files (default: deactivated)}; \\node[box, text width=10cm, below " "= 5mm of exp_1file] (exp_1fileC) {In the unique file configuration, you will " "need an internet connection to access the resource. The xia engine used in " "the unique file configuration is hosted on Versailles academy servers and is " "automatically updated. In this configuration, you can not control the " "background image and icons (default: deactivated)};" msgstr "" #. arrows #. type: tikzpicture #: documentation.tex:312 msgid "" "\\draw[-stealth] (exp_qualC.east) -- (exp_qual.west); \\draw[-stealth] " "(exp_firefoxC.south) -- (exp_firefox.north); \\draw[-stealth] (exp_1fileC." "north) -- (exp_1file.south);" msgstr "" #. type: caption{#2} #: documentation.tex:317 msgid "Xia's exportation options" msgstr "" #. type: figure #: documentation.tex:357 msgid "" "\\tikzstyle{every node}=[draw=black,thick,anchor=west] \\tikzstyle{auto}" "=[draw=reddebian,fill=reddebian!30, text height=2.5mm] \\tikzstyle{manual}" "=[draw=bluedane,fill=bluedane!30, text height=2.5mm] \\tikzstyle{firefoxOS}" "=[draw=orange,fill=orange!30, text height=2.5mm] \\tikzstyle{manualT}" "=[fill=bluedane!30,draw=bluedane, rectangle,text width=5cm, rounded corners] " "\\tikzstyle{autoT}=[fill=reddebian!30,draw=reddebian, rectangle,text " "width=5cm, rounded corners] \\tikzstyle{firefoxOST}=[fill=orange!30," "draw=orange, rectangle,text width=5cm, rounded corners]" msgstr "" #. type: tikzpicture #: documentation.tex:357 msgid "" "[grow via three points={one child at (0.5,-0.7) and two children at " "(0.5,-0.7) and (0.5,-1.4)}, edge from parent path={(\\tikzparentnode.south) " "|- (\\tikzchildnode.west)}] \\node [manual] {my\\_project/} child { node " "[auto] {index.html}}\t\t child { node [firefoxOS] {deploy.html}}\t\t child " "{ node [firefoxOS] {manifest.webapp}}\t\t child { node [auto] {css/}} child " "{ node [auto] {data/}} child { node [auto] {font/}} child { node [auto] " "{img/}} child { node [auto] {js/}} child { node [manual] {videos/} child " "{ node [manual] {video.mp4}} child { node [manual] {video.ogv}} child { node " "[manual] {video.webm}} }; \\node[manualT] (textM) at (10,-2) {These files " "and folders have been manually created by the interactive image designer. " "The folder \\textcolor{bluedane} {videos} was also manually created, in " "order to host videos inserted in the comments of the interactive image using " "relative links.}; \\node[autoT] (textA) at (10,-8) {Files and folders " "generated by Xia from the svg source file.}; \\node[firefoxOST] (textFOS) at " "(10,-6) {Files generated with Firefox OS export activated}; \\draw[-stealth] " "(textM.west) -- (4,0); \\draw[-stealth] (textM.west) -- (5.5,-7); \\draw[-" "stealth] (textA.west) -- (4,-4); \\draw[-stealth] (textFOS.west) -- (5.5,-2);" msgstr "" #. type: caption{#2} #: documentation.tex:357 msgid "Files of an interactive image with FirefoxOS export activated" msgstr "" #. type: document #: documentation.tex:361 msgid "" "In fact, since Xia is also an Inkscape plugin, you can generate your project " "directly in Inkscape: just click on \\softmenu{Plugins $\\rightarrow$ " "Various $\\rightarrow$ Xia Édu}, and choose your template and destination " "folder." msgstr "" #. type: tip #: documentation.tex:374 msgid "" "If you use GNU/Linux or Mac OS X, you can generate your html5 animation " "using the terminal with the command \\texttt{xia-converter}. The parameters " "are \\texttt{-i} to indicate the input file, \\texttt{-o} to indicate the " "exportation folder, and \\texttt{-t} to indicate the template.\\\\ " "\\emph{GNU/Linux}\\\\ \\texttt{\\$ xia-converter -i myfile.svg -o export" "\\_folder/ -t accordionBlack}\\\\ \\emph{Mac OS X}\\\\ \\texttt{\\$ cd /" "Applications/xia.app/Contents/Resources/}\\\\ \\texttt{\\$ python xia.py -i " "myfile.svg -o export\\_folder/ -t gameDragAndDrop}\\\\ The template " "accordionBlack will be chosen if a syntax error is made in the \\texttt{-t} " "parameter." msgstr "" #. type: subsection{#2} #: documentation.tex:376 msgid "Firefox OS export: how does it work?" msgstr "" #. type: document #: documentation.tex:379 msgid "" "The user has to use the Firefox OS browser and access the animation through " "the \\texttt{deploy.html} file. Firefox OS will then launch a process in " "which the animation will become a html5 application." msgstr "" #. type: subsection{#2} #: documentation.tex:381 documentation.tex:623 documentation.tex:955 msgid "Abstract" msgstr "" #. type: enumerate #: documentation.tex:392 msgid "" "An interactive image is first built in Inkscape (svg format). Xia only " "converts the svg source file into an html5 animation ;" msgstr "" #. type: enumerate #: documentation.tex:392 msgid "" "The title of the interactive image must be indicated in the " "\\softmenu{Metadata of the document} ;" msgstr "" #. type: enumerate #: documentation.tex:392 msgid "" "The text of the details must be filled in the \\softmenu{Object properties}, " "in the \\softmenu{Title} and \\softmenu{Description} fields of the cut out " "details ;" msgstr "" #. type: enumerate #: documentation.tex:392 msgid "" "The general description of the interactive image must be indicated in the " "\\softmenu {Object properties} of the background image." msgstr "" #. type: section{#2} #: documentation.tex:394 msgid "Enriched interactive image" msgstr "" #. type: links #: documentation.tex:397 msgid "" "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia2}" "{interactive image} created for this section of the documentation." msgstr "" #. type: links #: documentation.tex:400 msgid "" "Download the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia2/svg/xia2." "svg}{svg} source file." msgstr "" #. type: document #: documentation.tex:404 msgid "" "In this section, the goal is still to create a \"traditional\" interactive " "image (ie. in which a detail matches with a comment), but the content of the " "comments will be enriched with formatted text or multimedia resources." msgstr "" #. type: subsection{#2} #: documentation.tex:408 msgid "Formatting text" msgstr "" #. type: document #: documentation.tex:410 msgid "" "In order to insert formatted text, the tags described in figure " "\\ref{xia_text_tags} should be used." msgstr "" #. type: figure #: documentation.tex:448 msgid "" "\\tikzstyle{descrip}=[font=\\sffamily, anchor=north west, text width = " "4.3cm] \\tikzstyle{box}=[draw, text width=4cm, fill=lightgray!50, rounded " "corners, anchor=north west]" msgstr "" #. type: tikzpicture #: documentation.tex:448 msgid "" "\\node[anchor=north west] (bold) {\\includegraphics[scale=.5]{./images/" "Description}}; \\node[descrip, below = -7mm of bold] (boldT) {This text is " "***bold***}; \\node[box, right = 3.5cm of bold] (bolR) {This text is in " "\\textbf{bold}}; \\node[anchor=north west, below = .2cm of bold] (italic) " "{\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, below = " "-7mm of italic] (italicT) {This text is in **italics**}; \\node[box, right = " "3.5cm of italic] (italicR) {This text is in \\textit{italics}}; " "\\node[anchor=north west, below = .2cm of italic] (texttt) " "{\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, below = " "-7mm of texttt] (textttT) {This text is in \\verb!{{{typewriter}}}!}; " "\\node[box, right = 3.5cm of texttt] (textttR) {This text is in " "\\texttt{typewriter}}; \\node[anchor=north west, below = .2cm of texttt] " "(link) {\\includegraphics[scale=.5]{./images/Description}}; \\node[descrip, " "below = 7mm of link.north] (linkT) {A link to \\verb![https://www.wikipedia." "org/ Wikipedia]!}; \\node[box, right = 3.5cm of link] (linkR) {A link to " "\\href{https://www.wikipedia.org/}{Wikipedia}}; \\node[anchor=north west, " "below = .2cm of link] (relativelinks) {\\includegraphics[scale=.5]{./images/" "Description}}; \\node[descrip, below = -7mm of relativelinks] " "(relativelinksT) {A link to a \\verb![./foo/bar.pdf local file]!}; " "\\node[box, right = 3.5cm of relativelinks] (relativelinksR) {A link to a " "\\href{./foo/bar.pdf}{local file\\footnote{This will not work on your " "computer!}}}; \\node[anchor=north west, below = .8cm of relativelinks] " "(bullets) {\\includegraphics[scale=.5]{./images/Description}}; " "\\node[descrip, below = -7mm of bullets] (bulletsT) {Making a list \\\\ $" "\\ast$ of bullets \\\\ $\\ast$ out of \\\\ ~$\\ast$ 2 levels" "\\footnote{Insert a \\Spacebar (space) before the $\\ast$}}; \\node[box, " "right = 3.5cm of bullets.south east] (bulletsR) {Making a list " "\\begin{itemize} \\item of bullets \\item out of \\begin{itemize} \\item2 " "levels \\end{itemize} \\end{itemize}}; \\node[anchor=north west, below = 3cm " "of bullets] (line) {\\includegraphics[scale=.5]{./images/Description}}; " "\\node[descrip, below = 7mm of line.north] (lineT) {Drawing \\\\ - - - - \\" "\\ a line}; \\node[box, right = 3.5cm of line] (lineR) {Drawing \\\\ " "\\hrulefill \\\\ a line};" msgstr "" #. type: caption{#2} #: documentation.tex:448 msgid "Tags to format text" msgstr "" #. type: alert #: documentation.tex:454 msgid "" "Links to local files must be relative links: \\verb![./folder/file.pdf local " "file]! for a pdf file contained inside the export folder, and \\verb![../" "folder/file.pdf local file]! for a pdf file contained in a parent folder." msgstr "" #. type: subsection{#2} #: documentation.tex:457 msgid "Inserting multimedia resources into details" msgstr "" #. type: document #: documentation.tex:467 msgid "" "Inserting multimedia resources into details comments is quite easy: just " "paste the resource url (relative or absolute link) or iframe tag of the web " "service you want to use. Xia will automatically create a multimedia player " "in the comment as long as the resource (image, sound or video) matches its " "supported formats:" msgstr "" #. type: item[#1] #: documentation.tex:467 msgid "Images" msgstr "" #. type: description #: documentation.tex:467 msgid "jpg, jpeg, png, gif" msgstr "" #. type: description #: documentation.tex:467 msgid "[Audio] ogg, mp3" msgstr "" #. type: description #: documentation.tex:467 msgid "[Video] ogv, webm, mp4" msgstr "" #. type: document #: documentation.tex:469 msgid "" "The link has to be inserted into the \\softmenu{Description} field of the " "\\softmenu{Object Properties}." msgstr "" #. type: item[#1] #: documentation.tex:472 msgid "Absolute link" msgstr "" #. type: description #: documentation.tex:472 msgid "If the resource url is" msgstr "" #. \begin{center} #. \end{center} #. type: description #: documentation.tex:476 msgid "\\verb|http://web.crdp.ac-versailles.fr/02546.ogg|" msgstr "" #. type: description #: documentation.tex:479 msgid "" "just type it in the \\softmenu{Description} field of the \\softmenu{Object " "Properties} in Inkscape" msgstr "" #. type: item[#1] #: documentation.tex:485 msgid "Relative link" msgstr "" #. type: description #: documentation.tex:485 msgid "" "If the multimedia file is located in the interactive image folder or in a " "folder (see figure \\ref{xia_files}) within this one, just indicate its " "location, keeping in mind that the interactive image folder has to be " "considered as the root folder. For example, if the \\verb|video.ogv| file " "is located in a \\verb|videos| folder located itself in the interactive " "image exportation folder, just indicate:" msgstr "" #. \begin{center} #. end{center} #. type: description #: documentation.tex:489 msgid "\\verb|./videos/video.ogv|" msgstr "" #. type: description #: documentation.tex:494 msgid "" "in order to create the player. The \\verb|./| means that the \\verb|videos| " "folder is located in the exportation folder. You can also use the " "\\verb|../| tag to indicate that the resource is located in a parent folder." msgstr "" #. type: tip #: documentation.tex:506 msgid "" "Since video formats supported by Xia are not natively supported by every web " "browsers, it is recommanded to export videos into the 3 supported formats, " "and to upload them into a single folder (from there, the only difference " "between these files is their extension, ie. .ogv or .mp4 or .webm). Even if " "a particular format is indicated in the description (following the previous " "example : \\verb|videos/video.ogv|), if the browser is unable to read the " "resource, it will automatically attempt to read the files of the same name " "possessing a different extension (ie. \\verb|video.mp4| then \\verb|video." "webm|)." msgstr "" #. type: document #: documentation.tex:510 msgid "" "The last option is to insert an iframe tag. It will be interpreted and the " "reader will appear in the comment, giving access to the resource." msgstr "" #. type: subsection{#2} #: documentation.tex:512 msgid "The \"audioBrown\" template: sounds instead of text" msgstr "" #. type: links #: documentation.tex:515 msgid "" "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia4}" "{interactive image} created for this section of the documentation." msgstr "" #. type: links #: documentation.tex:519 msgid "" "Download the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia4/svg/xia4." "zip}{svg} source file (zip file containing the svg source file and the " "sounds)." msgstr "" #. type: document #: documentation.tex:522 msgid "" "The \"audioBrown\" template is specifically dedicated to the creation of " "interactive images in which details are associated with sounds instead of " "text." msgstr "" #. type: document #: documentation.tex:532 msgid "" "The method to insert sounds using absolute or relative links is described in " "section \\ref{multimedia_enrichment}. If you wish the sound to play " "automatically as the user clicks on the comment, just add \\verb|autostart| " "right after the url \\footnote{The \"\\texttt{autostart}\" tag also works " "with the other Xia templates.}:\\\\" msgstr "" #. type: center #: documentation.tex:532 msgid "\\verb|sounds/detail_1_sound.ogg autostart|" msgstr "" #. type: subsection{#2} #: documentation.tex:535 msgid "Inserting images into your interactive image" msgstr "" #. type: document #: documentation.tex:538 msgid "" "Png images can be added to the background. To do so, select \\softmenu{File $" "\\rightarrow$ Import} in Inkscape to incorporate your new image." msgstr "" #. type: document #: documentation.tex:542 msgid "" "The imported image will only appear in the html5 animation if you have " "applied white background in Inkscape. Choose white in the horizontal colour " "palette at the bottom of Inkscape interface:\\\\" msgstr "" #. type: document #: documentation.tex:550 msgid "" "By indicating a url in the \\softmenu{Title} of \\softmenu{Object " "properties} field, the embedded image becomes a clickable icon linking to a " "web page." msgstr "" #. type: subsection{#2} #: documentation.tex:552 msgid "Displaying a question and unveiling an answer" msgstr "" #. type: document #: documentation.tex:557 msgid "" "You can create clickable icon which will momentarily prevent the user to " "read the end of the comment. You can even ask the user to enter a password " "to read the end of the comment." msgstr "" #. type: document #: documentation.tex:559 msgid "" "To do so, just indicate, in the description, the tags described in figure " "\\ref{xia_answer_tags}." msgstr "" #. type: figure #: documentation.tex:571 msgid "" "\\tikzstyle{descrip}=[font=\\sffamily, anchor=north west, text width = " "4.3cm] \\tikzstyle{box}=[draw, text width=6cm, fill=lightgray!50, rounded " "corners, anchor=north west]" msgstr "" #. type: tikzpicture #: documentation.tex:571 msgid "" "\\node[anchor=north west] (answer) {\\includegraphics[scale=.5]{./images/" "Description}}; \\node[descrip, below = -7mm of answer] (answerT) {[[Can I " "ask you a question? (code=12345): Yes, indeed I can.]]}; \\node[box, right = " "3.5cm of answer] (answerI) {\\includegraphics[scale=.5]{./images/" "answer_code}};" msgstr "" #. type: caption{#2} #: documentation.tex:571 msgid "" "Tags to insert a button which will momentarily prevent the user to read the " "end of the comment" msgstr "" #. type: document #: documentation.tex:577 msgid "" "Use the double brackets tag \\texttt{[[ (...) ]]} to indicate you wish to " "create the icon, split the text between the question and the answer with the " "\\texttt{:} tag, and add a code by inserting \\texttt{(code=insert" "\\_password)} just before the \\texttt{:} tag\\footnote{The " "\\texttt{(code={...})} is not mandatory. Remember that you can not insert " "the \\texttt{)} character in the password.}." msgstr "" #. type: subsection{#2} #: documentation.tex:579 msgid "Controlling details behavior : automatic display and disabled zoom" msgstr "" #. type: document #: documentation.tex:587 msgid "Default behavior of details in an interactive image consists in:" msgstr "" #. type: itemize #: documentation.tex:587 msgid "" "highlighting details only on mouse over or with a click on the comment " "detail title" msgstr "" #. type: itemize #: documentation.tex:587 msgid "zoom in effect when clicking again on the active detail" msgstr "" #. type: footnote{#2} #: documentation.tex:587 msgid "Except for the popBlue template." msgstr "" #. type: document #: documentation.tex:597 msgid "" "Both of these default behaviors can be modified if you apply a white or " "black background to cropped details (see section \\ref{insertion_images}):" msgstr "" #. type: item[#1] #: documentation.tex:597 msgid "Detail with a white background" msgstr "" #. type: description #: documentation.tex:597 msgid "" "In the generated image, details will be immediately visible as a flat area " "of opaque color, hiding the background image; once selected, it reveals the " "background (the zoom effect is still active)." msgstr "" #. type: description #: documentation.tex:597 msgid "" "[Detail with a black background] Users still have to click on the detail to " "unveil it, but the zoom effect is disabled." msgstr "" #. type: document #: documentation.tex:600 msgid "" "Logical consequence : you can not apply a white and a black background all " "together on the same detail. A single detail can not be immediately " "displayed and have the zoom effect disabled." msgstr "" #. type: subsection{#2} #: documentation.tex:602 msgid "Controlling order of details display in the lateral comment zone" msgstr "" #. type: document #: documentation.tex:606 msgid "" "By default, in the interactive image, the details appear vertically " "following the order in which these details have been created (the first " "detail created in Inkscape corresponding to the detail placed up in the " "sidebar of the interactive image)." msgstr "" #. type: document #: documentation.tex:608 msgid "" "We will work with the \\softmenu{Edit $\\rightarrow$ XML Editor} to change " "this default order." msgstr "" #. type: document #: documentation.tex:613 msgid "" "A priori complex to manage, this dialogue window is in fact quite easy to " "use : by selecting the input in the XML editor, the corresponding detail " "will be highlighted on the image and the only thing left to do is to drag " "the files to the desired location:\\\\" msgstr "" #. type: document #: documentation.tex:621 msgid "" "The Inkscape XML editor allows to control the display order of the details " "in the interactive image. Note the highlighting of an element in the editor " "and on the background image by a single mouse click." msgstr "" #. type: enumerate #: documentation.tex:635 msgid "You can enrich and shaping text using tags" msgstr "" #. type: enumerate #: documentation.tex:635 msgid "" "A multimedia enrichment is possible through a simple link (relative or " "absolute) to a file whose format is recognized by Xia" msgstr "" #. type: enumerate #: documentation.tex:635 msgid "" "Adding images to the background image is possible by importing them and " "applying them a white background" msgstr "" #. type: enumerate #: documentation.tex:635 msgid "" "It is possible to modify the default behavior of a detail by changing its " "color background (white, black)" msgstr "" #. type: enumerate #: documentation.tex:635 msgid "" "The order of the details in the interactive image depends on the order of " "their creation in Inkscape. Nevertheless, the Inkscape XML editor allows to " "change this order" msgstr "" #. type: enumerate #: documentation.tex:635 msgid "" "It is possible prevent the user to access the comments by inserting a " "clickable icon and / or a password" msgstr "" #. type: section{#2} #: documentation.tex:639 msgid "Creating games with Xia" msgstr "" #. type: document #: documentation.tex:642 msgid "" "Until now, this document was only about creation of traditionnal " "\"interactive images\": background image enriched with cropped details " "associated with texts." msgstr "" #. type: document #: documentation.tex:648 msgid "" "This kind of interactive image can be used in class in various situations " "(students progressively discovering a document, or creating an interactive " "image on their own), but Xia introduces new features, such as the creation " "of games and activities, in which the final user has much more to do than " "simply clicking on details in order to read the comment." msgstr "" #. \draw[help lines] (0,0) grid (5,5); #. icons #. type: tikzpicture #: documentation.tex:665 msgid "" "\\node[opacity=.5] (bBlue) {\\includegraphics[width=2cm]{./images/" "buttonBlue}}; \\node[left= .3mm of bBlue] (aBrown) " "{\\includegraphics[width=2cm]{./images/audioBrown}}; \\node[right= .3mm of " "bBlue] (guClic) {\\includegraphics[width=2cm]{./images/game1clic}}; " "\\node[below= .2mm of bBlue.south, opacity=.5] (pBlue) " "{\\includegraphics[width=2cm]{./images/popBlue}}; \\node[left= .3mm of " "pBlue] (gDDrop) {\\includegraphics[width=2cm]{./images/gameDragAndDrop}}; " "\\node[right= .3mm of pBlue, opacity=.5] (pYellow) " "{\\includegraphics[width=2cm]{./images/popYellow}}; \\node[above = .2mm of " "guClic.north, opacity=.5] (aCloud) {\\includegraphics[width=2cm]{./images/" "accordionCloud}}; \\node[above = .2mm of aCloud.north, opacity=.5] (aBlack) " "{\\includegraphics[width=2cm]{./images/accordionBlack}}; \\node[left = .3mm " "of aBlack] (params) {\\includegraphics[width=2cm]{./images/params}}; " "\\node[left = .3mm of params] (files) {\\includegraphics[width=2cm]{./images/" "xia_open}}; \\node[left = 2mm of aCloud, opacity=.3] (xialogo) " "{\\includegraphics[height=2cm]{./images/xia}};" msgstr "" #. comments #. type: tikzpicture #: documentation.tex:676 msgid "" "\\node[box, text width=2.5cm,above left = 5mm of files] (filesC) {Select the " "svg source file}; \\node[box, above = 5mm of params] (paramsC) {Define the " "options of the export (see figure \\ref{xia_export_options})}; \\node[box, " "right = 5mm of guClic] (guClicC) {\\href{http://xia.dane.ac-versailles.fr/" "demo/tuto/xia3}{game1clic}\\\\ selecting details on a background image \\\\ " "How-to in section \\ref{game1clicsection}}; \\node[box, left = 25mm of " "bBlue] (aBrownC) {\\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia4}" "{audioBrown} \\\\ creation of interactive images in which details are " "associated with sounds \\\\ How-to in section \\ref{audioBrownsection}}; " "\\node[box, below left = 5mm of pBlue] (gDDropC) {\\href{http://xia.dane.ac-" "versailles.fr/demo/tuto/xia5}{gameDragAndDrop}\\\\ drag and drop graphical " "elements on the background images \\\\ How-to in section " "\\ref{gameDragAndDropsection}};" msgstr "" #. arrows #. type: tikzpicture #: documentation.tex:683 msgid "" "\\draw[-stealth] (guClicC.west) -- (guClic.east); \\draw[-stealth] (gDDropC." "north) -- (gDDrop.south west); \\draw[-stealth] (aBrownC.east) -- (aBrown." "west); \\draw[-stealth] (filesC.south east) -- (files.north west); \\draw[-" "stealth] (paramsC.south) -- (params.north);" msgstr "" #. type: caption{#2} #: documentation.tex:688 msgid "Xia's games and multimedia templates" msgstr "" #. type: subsection{#2} #: documentation.tex:690 msgid "First game principle: selecting, finding elements in the image" msgstr "" #. type: document #: documentation.tex:699 msgid "" "\\textit{The game principle described in this section consists in selecting " "details on a background image. When the user has reached the goal described " "in the instructions, a message appears in a final pop up.}" msgstr "" #. type: links #: documentation.tex:704 msgid "" "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia3}" "{interactive image} created for this section of the documentation." msgstr "" #. type: links #: documentation.tex:707 msgid "" "Download the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia3/svg/xia3." "svg}{svg} source file." msgstr "" #. type: document #: documentation.tex:710 msgid "" "This kind of game is almost the easiest way to create an interactive image. " "You only have to crop the details that the final user will have to select." msgstr "" #. type: document #: documentation.tex:717 msgid "" "The instructions must be completed in the metadata of the document. Xia will " "look into the informations filled in the \\softmenu{Description} field of " "the metadata of the document (see section \\ref{preparation_svg}: " "\\softmenu{File $\\rightarrow$ Metadata of the document}), and create an " "instruction «~pop up~» that will show up at the opening of the game. The " "player will just have to read the instructions and close the pop up to play " "the game." msgstr "" #. type: document #: documentation.tex:721 msgid "" "When the user completes the game, a message automatically appears. This " "message has to be filled in the \\softmenu{Description} field of the " "\\softmenu{Object Properties} of the background image." msgstr "" #. type: document #: documentation.tex:726 msgid "" "Two informations are needed in order for this message to pop up : the exact " "number of details that have to be selected\\footnote{This number does not " "have to match the number of details on the image.} and the message itself " "(see table \\ref{tag1_sumup})." msgstr "" #. type: tabular #: documentation.tex:742 msgid "Goal" msgstr "" #. type: tabular #: documentation.tex:742 msgid "Enter the number of correct answers needed to complete the game" msgstr "" #. type: tabular #: documentation.tex:742 msgid "Display a message" msgstr "" #. type: tabular #: documentation.tex:742 msgid "Tag" msgstr "" #. type: tabular #: documentation.tex:742 msgid "\\texttt{}|" msgstr "" #. type: tabular #: documentation.tex:742 msgid "\\texttt{}" msgstr "" #. type: tabular #: documentation.tex:742 msgid "Example" msgstr "" #. type: tabular #: documentation.tex:742 msgid "\\multicolumn{2}{|l|}{\\texttt{6}}" msgstr "" #. type: tabular #: documentation.tex:742 msgid "\\multicolumn{2}{|l|}{\\texttt{Congratulations!}}" msgstr "" #. type: tabular #: documentation.tex:742 msgid "\\multicolumn{2}{|l|}{\\texttt{You have completed the game!}}" msgstr "" #. type: caption{#2} #: documentation.tex:742 msgid "Sum up of tags in a game1clic game" msgstr "" #. type: tip #: documentation.tex:749 msgid "" "Text inserted inside the \\verb|| tag can be enriched. " "Images, videos or sounds can be inserted. It is also possible to insert a " "link, allowing users to play another game, in order to \"chain\" activities " "up by degree of difficulty." msgstr "" #. type: document #: documentation.tex:752 msgid "" "Once your svg source file is created, choose the template " "\\softmenu{game1clic} to generate the interactive game." msgstr "" #. type: subsection{#2} #: documentation.tex:754 msgid "Second game principle: classyfying, ordering, ranking" msgstr "" #. type: document #: documentation.tex:764 msgid "" "\\textit{The second kind of game that can be created with Xia consists in " "dragging and dropping graphical elements on the background image. If all the " "elements have been dropped on their corresponding drop zone, a pop up " "message appears, confirming the achievement of the game.}" msgstr "" #. type: links #: documentation.tex:768 msgid "" "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia5}" "{interactive image} created for this section of the documentation." msgstr "" #. type: links #: documentation.tex:772 msgid "" "Download the \\href {http://xia.dane.ac-versailles.fr/demo/tuto/xia5/svg/" "xia5.svg}{svg} source file." msgstr "" #. type: document #: documentation.tex:787 msgid "" "This is how you can create a game based on the drag and drop principle :" msgstr "" #. type: enumerate #: documentation.tex:787 msgid "In Inkscape:" msgstr "" #. type: itemize #: documentation.tex:787 msgid "Choose and import a background picture" msgstr "" #. type: itemize #: documentation.tex:787 msgid "" "Create the graphical elements the users of the interactive image will have " "to drag and drop (ie. images or group of words: see below for a how-to)" msgstr "" #. type: itemize #: documentation.tex:787 msgid "" "Create the instruction pop up in \\softmenu{File $\\rightarrow$ Metadata of " "the document $\\rightarrow$ Description}" msgstr "" #. type: footnote{#2} #: documentation.tex:787 msgid "Exactly as in the game1clic template." msgstr "" #. type: itemize #: documentation.tex:787 msgid "" "Using metadata, make each label match its drop zone (actually being cropped " "details)" msgstr "" #. type: enumerate #: documentation.tex:787 msgid "In Xia" msgstr "" #. type: itemize #: documentation.tex:787 msgid "" "Export the svg source file using the \\softmenu{gameDragAndDrop} template" msgstr "" #. type: document #: documentation.tex:792 msgid "" "Two methods can be used to create the drag and drop \"graphical-elements\". " "A very simple way is to use a screenshot tool, in order to create png files, " "and then import them in Inkscape. It is also possible to create these " "elements directly in Inkscape, by creating a text, grouping it with a shape, " "and finally making a bitmap copy of this group (\\softmenu{Edition $" "\\rightarrow$ Make a bitmap copy})" msgstr "" #. type: document #: documentation.tex:799 msgid "" "The graphical elements then have to be associated with their drop zone " "\\footnote{\\textbf{One} object can only match \\textbf{one} drop zone.}. In " "order to do that, make the \\softmenu{ID} field of the drop zone match the " "\\softmenu{Description} field of the drag and drop graphical element. The " "only subtlety consists in the \\verb|| tags which have to " "be filled in the \\softmenu {Description} field." msgstr "" #. type: document #: documentation.tex:802 msgid "" "You will find in the table \\ref{tag2_sumup} an abstract of the metadata to " "be filled in the \\softmenu{Object Properties} of the drag and drop " "graphical elements and the corresponding details in order to make them match." msgstr "" #. type: tabular #: documentation.tex:816 msgid "Graphical element (drag and drop objects in the game)" msgstr "" #. type: tabular #: documentation.tex:816 msgid "Cropped detail (drop zone)" msgstr "" #. type: tabular #: documentation.tex:816 msgid "ID Field" msgstr "" #. type: tabular #: documentation.tex:816 msgid "\\verb|Detail_Title|" msgstr "" #. type: tabular #: documentation.tex:816 msgid "Description Field" msgstr "" #. type: tabular #: documentation.tex:816 msgid "\\verb|Detail_Title|" msgstr "" #. type: caption{#2} #: documentation.tex:816 msgid "Sum up of tags in the gameDragAndDrop template" msgstr "" #. type: document #: documentation.tex:818 documentation.tex:845 msgid "" "Once your svg source file is created, choose the template " "\\softmenu{gameDragAndDrop} to generate the interactive game." msgstr "" #. type: subsection{#2} #: documentation.tex:820 msgid "Third game principle: collisions" msgstr "" #. type: document #: documentation.tex:824 msgid "" "\\textit{The game principle described in this section consists in moving " "objects within bounds you defined. Typically, the \"collisions\" game " "principle can be used to create mazes or gem puzzle.}" msgstr "" #. type: links #: documentation.tex:828 msgid "" "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia6/}" "{interactive image} created for this section of the documentation." msgstr "" #. type: links #: documentation.tex:832 msgid "" "Download the \\href {http://xia.dane.ac-versailles.fr/demo/tuto/xia6/svg/" "xia6.svg}{svg} source file." msgstr "" #. type: document #: documentation.tex:836 msgid "" "In order to create this kind of game, add the tag \\verb|on| to the background image. All the details will then become solid " "and will prevent objects (png imported files or bitmap copies of shapes " "created in Inkscape) from being moved through them." msgstr "" #. type: document #: documentation.tex:843 msgid "" "The \"collision\" game is in fact a gameDragAndDrop game, since the goal " "remains to drag one or several objects and drop them somewhere on the " "image. The requisite tags for this template are therefore the same as in " "the gameDragAndDrop template \\footnote{\\texttt{} on the " "objects, \\texttt{} and \\texttt{} on the " "background image: see section \\ref{gameDragAndDropsection}.}, but you will " "apply the \\verb|off| tag to the drop zone's " "\\softmenu{Description} field." msgstr "" #. type: subsection{#2} #: documentation.tex:847 msgid "" "\\emph{Advanced interactive games creation tips}: Magnet effect, tooltips, " "double-scoring\\ldots" msgstr "" #. type: subsubsection{#2} #: documentation.tex:849 msgid "Showing the player's score (game1clic template)" msgstr "" #. type: document #: documentation.tex:862 msgid "" "It is possible to display graphical elements automatically when the user " "selects the correct answer. These elements can be png imported images or " "shapes directly designed in Inkscape. But as Xia considers as a clickable " "detail any shapes designed using Inkscape tools, you will have to transform " "these shapes in bitmap, using the \"bitmap copy\" Inkscape tool. For " "example :" msgstr "" #. type: enumerate #: documentation.tex:862 msgid "" "Draw a star with yellow sides on a yellow background with the Inkscape tools" msgstr "" #. type: enumerate #: documentation.tex:862 msgid "" "Select this star, and click on the \\softmenu{Edition $\\rightarrow$ Make a " "bitmap copy}" msgstr "" #. type: enumerate #: documentation.tex:862 msgid "Delete the first star" msgstr "" #. type: document #: documentation.tex:872 msgid "" "When the graphical elements are imported (png files) or created (bitmap copy " "of shapes created manually), just apply the following carasteristics to " "these elements:" msgstr "" #. type: center #: documentation.tex:872 msgid "\\softmenu{Interactivity > OnClick} = \\verb|off|" msgstr "" #. type: document #: documentation.tex:872 msgid "" "Then, group the clickable detail to its graphical element (by successively " "clicking on the detail and the graphical element with the \\Shift keystroke " "on), then select \\softmenu{Group} in the Inkscape \\softmenu{Object} menu." msgstr "" #. type: subsubsection{#2} #: documentation.tex:874 msgid "Showing the player's mistakes (game1clic template)" msgstr "" #. type: document #: documentation.tex:879 msgid "" "Games based on the details selection principle are obviously very " "interesting educational games\\ldots but it is also quite obvious to guess " "how some students may be tempted to cheat to achieve such games (for " "example, by frenetically clicking everywhere on the image, until the final " "message pops up)." msgstr "" #. type: document #: documentation.tex:882 msgid "" "This is why it may be interesting to be able to highlight the user's " "mistakes during the game." msgstr "" #. type: document #: documentation.tex:893 msgid "" "To do so, you will anticipate the user's probable mistakes, and put explicit " "graphical elements symbolizing these errors on the background image. This " "graphical element may be an imported image (png file) or a shape directly " "designed with the Inkscape tools, then converted into bitmap (see section " "\\ref{playersscore}).. These elements will have to include the following " "caracteristics:" msgstr "" #. type: center #: documentation.tex:893 msgid "\\softmenu{Interactivity > OnClick} = \\verb|disable-score|" msgstr "" #. type: document #: documentation.tex:893 msgid "" "When applied with a \\verb|disable-score| tag, a detail still remains " "clickable, but does not add a score to the counter that delivers the final " "success message pop up." msgstr "" #. type: subsubsection{#2} #: documentation.tex:896 msgid "How to add a \"magnet\" effect (gameDragAndDrop template)" msgstr "" #. type: document #: documentation.tex:899 msgid "" "If you indicate \\verb|on| in the \\softmenu{Description} " "field of the drop zone, a magnet effect will then be active when the player " "drops the graphical element onto its matching drop zone." msgstr "" #. type: subsubsection{#2} #: documentation.tex:901 msgid "Links on drop zones (gameDragAndDrop template)" msgstr "" #. type: document #: documentation.tex:905 msgid "" "You can insert links in the \\softmenu{Title} field of the \\softmenu{Object " "Properties} of the drop zones. The user can then open the link by clicking " "on it or by dropping its corresponding detail on it." msgstr "" #. type: subsubsection{#2} #: documentation.tex:908 msgid "Tooltips (game1clic and gameDragAndDrop templates)" msgstr "" #. type: links #: documentation.tex:912 msgid "" "Explore the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia7}" "{interactive image} created for this section of the documentation." msgstr "" #. type: links #: documentation.tex:915 msgid "" "Download the \\href{http://xia.dane.ac-versailles.fr/demo/tuto/xia7/svg/xia7." "svg}{svg} source file." msgstr "" #. type: document #: documentation.tex:925 msgid "" "It is possible to display tooltips of details on mouse-over. To do so, " "create the tooltip with a png imported file or a bitmap copy (see section " "\\ref{playersscore}) of a text created in Inkscape\\footnote{Or a bitmap " "copy of a shape grouped with some text\\ldots}, and apply to this tooltip a " "specific \\softmenu{ID} in its \\softmenu{Object Properties}. Then, just " "apply the tag \\verb|specific_ID_of_the_tooltip| in the " "\\softmenu{Description} field of the \\softmenu{Object Properties} of the " "detail that is supposed to make the tooltip appear (for example, in the " "image below: on mouse-over, the yellow square makes the tooltip ``Test'' " "appear):\\\\" msgstr "" #. type: document #: documentation.tex:932 msgid "" "Note that the tooltip tool is available in the game1clic and in the " "gameDragAndDrop templates.\\\\" msgstr "" #. type: subsubsection{#2} #: documentation.tex:935 msgid "Double scoring (game1clic and gameDragAndDrop templates)" msgstr "" #. type: document #: documentation.tex:944 msgid "" "If you indicate \\verb|score2| in the \\softmenu{onclick} field " "(\\softmenu{Object Properties $\\rightarrow$ Interactivity}) of the detail, " "and if you use \\texttt{} and \\texttt{} in the \\softmenu{Object Properties} of the background image, you " "create a double scoring game. In this kind of game, the user can select two " "different categories of details, two messages can pop up at the end, " "depending on the category and number of details the user has selected." msgstr "" #. type: document #: documentation.tex:952 msgid "" "For example, you can create a game with 3 details tagged with " "\\texttt{score2} (corresponding to mistakes), and indicate in the " "\\softmenu{Object Properties} of the background image:\\\\ " "\\texttt{4\\\\ Hurray!\\\\ 3\\\\ Three mistakes... that is a bit too much... " "Concentrate more and do it again}\\\\" msgstr "" #. type: document #: documentation.tex:957 msgid "" "These tables sum up the tags that have to be indicated when a game is " "created:" msgstr "" #. type: tabular #: documentation.tex:1019 msgid "\\multicolumn{3}{|l|}{\\softmenu{game1clic} template}" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\emph{Role}" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "" "Sets the amount of correct answers needed to pop up the end message of the " "game" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\emph{Element}" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "Background picture" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\emph{Where ?}" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\softmenu{Object properties $\\rightarrow$ Description}" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\emph{What ?}" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "A number corresponding to the required score" msgstr "" #. type: tabular #: documentation.tex:1019 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "Pops up the end message of the game" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "" "A personalized message if necessary enriched with multimedia or html links" msgstr "" #. type: tabular #: documentation.tex:1019 msgid "\\multicolumn{3}{|l|}{\\texttt{off}}" msgstr "" #. type: tabular #: documentation.tex:1019 msgid "Makes a cropped detail unclickable" msgstr "" #. type: tabular #: documentation.tex:1019 msgid "Detail" msgstr "" #. type: tabular #: documentation.tex:1019 msgid "" "\\softmenu{Object properties $\\rightarrow$ Interactivity $\\rightarrow$ " "Onclick}" msgstr "" #. type: tabular #: documentation.tex:1019 msgid "\\multicolumn{3}{|l|}{\\texttt{disable-score}}" msgstr "" #. type: tabular #: documentation.tex:1019 msgid "" "Makes a cropped detail clickable, but when clicked, does not add a point to " "the score game counter" msgstr "" #. type: tabular #: documentation.tex:1019 msgid "\\multicolumn{3}{|l|}{\\texttt{score2}}" msgstr "" #. type: tabular #: documentation.tex:1019 msgid "Makes a detail add a score to the score2 counter" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "Displays a tooltip when moused-over" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "Make sure to match the ID of the element used as tooltip" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "" "Sets the amount of correct answers needed to pop up the second end message " "in a double scoring game" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "" #. type: tabular #: documentation.tex:1019 documentation.tex:1088 msgid "Pops up the second end message in a double scoring game" msgstr "" #. type: caption{#2} #: documentation.tex:1019 msgid "Complete game1clic tags" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\softmenu{gameDragAndDrop} template}" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{} }" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{}}" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "Indicates the corresponding drag and drop element and drop zone" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "Graphical element to move" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "\\softmenu{Object Properties $\\rightarrow$ Description}" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "Make sure to match the ID field of the drop zone" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{on}}" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "Adds a \"magnet\" effect" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "Drop zone" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{on}}" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "Activates the \"collisions\" game principle" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "\\multicolumn{3}{|l|}{\\texttt{off}}" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "Creates a drop zone in a \"collisions\" game" msgstr "" #. type: tabular #: documentation.tex:1088 msgid "Drop zone, Graphical element to move" msgstr "" #. type: caption{#2} #: documentation.tex:1088 msgid "Complete gameDragAndDrop tags" msgstr "" #. type: section{#2} #: documentation.tex:1090 msgid "Frequently asked questions and Inkscape tips" msgstr "" #. type: subsection{#2} #: documentation.tex:1092 msgid "FAQ" msgstr "" #. type: document #: documentation.tex:1096 msgid "" "\\textbf{I can not see the Xia extension in Inkscape. Why is that?}\\\\ $" "\\rightarrow$ Have you installed Inkscape first? If not, you have to re-" "install Xia. If you use the portable version, Xia does not appear in the " "extension menu." msgstr "" #. type: document #: documentation.tex:1103 msgid "" "\\textbf{The \"source file\" icon does not appear when I launch Xia from the " "extension menu of Inkscape. Why?}\\\\ $\\rightarrow$ When you launch Xia as " "an Inkscape extension, there is no \"Source File\" button, since Xia assumes " "you want to create the html5 animation from the image you are working on in " "Inkscape. Just choose the exportation options and the template." msgstr "" #. type: document #: documentation.tex:1109 msgid "" "\\textbf{I have installed Xia but I can not find it. How can I launch it?}\\" "\\ $\\rightarrow$ Xia can be found in the \"Applications\" of Mac OS X. On " "a GNU/Linux system, the Xia package is called \"xia-converter\". In " "Windows, Xia is only an Inkscape extension. If you wish to launch Xia " "outside of Inkscape, use the portable version." msgstr "" #. type: document #: documentation.tex:1116 msgid "" "\\textbf{I have added some text on my image with the Inkscape text tool " "(\"Create and Edit text objects\"), but it does not appear on my interactive " "image. Why?}\\\\ $\\rightarrow$ Unless you make a bitmap copy of the text, " "Xia will consider the text created with the \"Create and Edit text Objects\" " "as a detail, and not an image." msgstr "" #. type: subsection{#2} #: documentation.tex:1118 msgid "Inkscape tips" msgstr "" #. type: itemize #: documentation.tex:1140 msgid "" "Don't hesitate to fill your details with different colors. The details will " "be easier to select and modify, and it will not have any consequences on the " "html5 animation (unless you choose black or white as filling colors)" msgstr "" #. type: itemize #: documentation.tex:1140 msgid "" "If you want to create one detail out of several, you can \"Group\" them " "(\\softmenu{Object} $\\rightarrow$ \\softmenu{Group}, or \\Ctrl + " "\\keystroke{G}) or \"unify\" them (\\softmenu{Path} $\\rightarrow$ " "\\softmenu{Union}, or \\Ctrl + \\keystroke{+})." msgstr "" #. type: itemize #: documentation.tex:1140 msgid "" "Once a detail is created, it is always possible to modify it: you can add or " "remove nodes, move them, etc. Just double-click on the detail, and use the " "modifying tools:\\\\" msgstr "" #. type: itemize #: documentation.tex:1140 msgid "Some keyboard shortcuts are real time savers!" msgstr "" #. type: fbox{#1} #: documentation.tex:1140 msgid "\\Shift + \\Ctrl + \\keystroke{a}" msgstr "" #. type: enumerate #: documentation.tex:1140 msgid "to access the \\softmenu{Alignment and Distribution} tools" msgstr "" #. type: fbox{#1} #: documentation.tex:1140 msgid "\\Shift + \\Ctrl + \\keystroke{o}" msgstr "" #. type: enumerate #: documentation.tex:1140 msgid "to access the \\softmenu{Object Properties}" msgstr "" #. type: fbox{#1} #: documentation.tex:1140 msgid "\\Alt + \\keystroke{b}" msgstr "" #. type: enumerate #: documentation.tex:1140 msgid "to create a bitmap copy of a shape designed in Inkscape" msgstr "" #. type: enumerate #: documentation.tex:1140 msgid "" "\\fbox{\\Ctrl + \\keystroke{g}} to group different objects or details and " "\\fbox{\\Ctrl + \\Shift + \\keystroke{g}} to ungroup them" msgstr "" #. type: document #: documentation.tex:1143 msgid "\\listoffigures \\listoftables" msgstr "" images-actives-html5.git/doc/todo.txt000066400000000000000000000011261250410645000200400ustar00rootroot00000000000000# Reminder and TODO list # Generate .pot file from text po4a-gettextize -f latex -m documentation.tex -M UTF8 -p en_EN.pot # Generate translation po4a-translate -f latex -m documentation.tex -M UTF8 -p fr/documentation-fr_FR.po -l documentation-fr.tex # Update translations when source document changes po4a-updatepo -f latex -m documentation.tex -M UTF8 -p fr/documentation-fr_FR.po # Script to generate docs from po files # tips for inkscape beginners: for ex., adding a red background to details in order to manipulate them more easily # A4 abstracts: - games' tags - templates - workflow images-actives-html5.git/doc/xia.sty000066400000000000000000000067061250410645000176650ustar00rootroot00000000000000\definecolor{reddebian}{rgb}{0.84314,0.03922,0.32549} \definecolor{bluedane}{rgb}{0.09020,0.56863,1} \definecolor{greendane}{rgb}{0.43137,0.60784,0.14510} \def\purpledane{violet} \renewcommand{\thechapter}{\arabic{chapter}} \renewcommand{\thesection}{\Roman{section}} \renewcommand{\thesubsection}{\alph{subsection}} \hypersetup{% pdftitle={Xia}, pdfauthor={Geoffrey Gekiere, Anne Lamer, Michaël Nourry, Louis-Maurice de Sousa}, pdfsubject={Xia}, pdfkeywords={Xia, free software, html5, Inkscape}, colorlinks= true, linkcolor = greendane, urlcolor = bluedane } % margin size \geometry{hscale=0.7,vscale=0.85} \newcommand{\softmenu}[1]{\texttt{\textcolor{reddebian}{#1}}} % alert environment \newsavebox{\draftBox} \newcommand{\curveDanger}{\textdbend} \newlength{\WidthAlertBall} \settowidth{\WidthAlertBall}{ \begin{tikzpicture} \node{\curveDanger}; \end{tikzpicture} } % Style for alert box \tikzstyle{alertbox}=[draw=red,rounded corners,inner xsep=1em,inner ysep=1ex] % Style for alert ball \tikzstyle{alertball}=[circle,ball color=red,text=white] \newenvironment{alert}{% \begin{lrbox}{\draftBox}% save content in \draftBox \begin{minipage}{.8\linewidth}% \color{red}% \setlength{\parskip}{1ex plus 0.2ex minus 0.2ex}% }{% \end{minipage}% \end{lrbox}% lrbox can only be used on separate lines (no paragraph) % use \usebox{\draftBox} instead \vspace{1.5ex}% \begin{tikzpicture}% \node [alertbox] (frame) {% \hspace{0.5\WidthAlertBall}% \usebox{\draftBox}% };% \node [alertball] (alert) at (frame.west) {\curveDanger};% \end{tikzpicture}% \vspace{1.5ex}% } % tip environment \newcommand{\thumbOK}{\large\leftthumbsup} \newlength{\WidthTipBall} \settowidth{\WidthTipBall}{% \begin{tikzpicture}% \node{\thumbOK};% \end{tikzpicture}% } \tikzstyle{tipball}=[circle,ball color=teal,text=white] \tikzstyle{tipbox}=[draw=teal,rounded corners,inner xsep=1em,inner ysep=1ex] \newenvironment{tip}{% \begin{lrbox}{\draftBox}% saving content in \draftBox \begin{minipage}{.8\linewidth}% \color{teal}% \setlength{\parskip}{1ex plus 0.2ex minus 0.2ex}% }{% \end{minipage}% \end{lrbox}% lrbox can only be used on separate lines (no paragraph) % use \usebox{\draftBox} instead \vspace{1.5ex}% \begin{tikzpicture}% \node [tipbox] (frame) {% \hspace{0.5\WidthTipBall}% \usebox{\draftBox}% };% \node [tipball] (tip) at (frame.west) {\thumbOK};% \end{tikzpicture}% \vspace{1.5ex}% } % links environment \newcommand{\rightHand}{\large\leftpointright} \newlength{\WidthBallLinks} \settowidth{\WidthBallLinks}{% \begin{tikzpicture}% \node{\rightHand};% \end{tikzpicture}% } \tikzstyle{linksball}=[circle,ball color=\purpledane,text=white] \tikzstyle{linksbox}=[draw=\purpledane,rounded corners,inner xsep=1em,inner ysep=1ex] \newenvironment{links}{% \begin{lrbox}{\draftBox}% saving content in \draftBox \begin{minipage}{.8\linewidth}% \color{\purpledane}% \setlength{\parskip}{1ex plus 0.2ex minus 0.2ex}% }{% \end{minipage}% \end{lrbox}% lrbox can only be used on separate lines (no paragraph) % use \usebox{\draftBox} instead \vspace{1.5ex}% \begin{tikzpicture}% \node [linksbox] (frame) {% \hspace{0.5\WidthBallLinks}% \usebox{\draftBox}% };% \node [linksball] (links) at (frame.west) {\rightHand};% \end{tikzpicture}% \vspace{1.5ex}% } images-actives-html5.git/make/000077500000000000000000000000001250410645000165025ustar00rootroot00000000000000images-actives-html5.git/make/build_js.sh000077500000000000000000000042361250410645000206410ustar00rootroot00000000000000#!/bin/sh # Copyright: 2014 Francois Lafont # # License: GPL-3.0+ # 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 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . NOT_CONCATENATED=";kinetic-xia.js;hooks.js;" NOT_MINIFIED=";hooks.js;" set -e export PATH='/usr/bin:/bin' # Get root directory and build directory of the project. script_dir=$(dirname "$0") root_dir=$(cd "$script_dir/.."; pwd) build_dir="$root_dir/build" for theme in "$build_dir/share/themes/"* do [ ! -d "$theme" ] && continue # Create xia.js or minify js. rm -f "$theme/js/xia.js" for js in "$theme/js/"*.js do js_shortname=${js##*/} theme_shortname=${theme##*/} #if printf ";$js_shortname;\n" | grep -q "$NOT_CONCATENATED" if printf "$NOT_CONCATENATED" | grep -q ";$js_shortname;" then if ! printf "$NOT_MINIFIED" | grep -q ";$js_shortname;" then # Not in xia.js but we must minify the script. printf "Minify $js_shortname in $theme_shortname theme\n" perl "$script_dir/minify_js.pl" "$js" rm "$js" # useless now. fi else # Must be include in xia.js cat "$js" >> "$theme/js/xia.js" echo "" >> "$theme/js/xia.js" rm "$js" # useless now. fi done #perl "$script_dir/minify_js.pl" "$theme/js/xia.js" done # Minify js in vendors/ directory. for js in "$build_dir/share/vendors/"*.js do js_shortname=${js##*/} printf "Minify $js_shortname in vendors/ directory\n" perl "$script_dir/minify_js.pl" "$js" rm $js done images-actives-html5.git/make/generate_mo.sh000077500000000000000000000023701250410645000213300ustar00rootroot00000000000000#!/bin/sh # Copyright: 2014 Francois Lafont # # License: GPL-3.0+ # 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 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -e export PATH='/usr/bin:/bin' # Get root directory and build directory of the project. script_dir=$(dirname "$0") root_dir=$(cd "$script_dir/.."; pwd) build_dir="$root_dir/build" # Compile .po to .mo. for loc in "$build_dir/share/i18n/"* do [ ! -d "$loc" ] && continue msgfmt "$loc/LC_MESSAGES/xia-converter.po" \ -o "$loc/LC_MESSAGES/xia-converter.mo" done # Remove "xia-converter.po" files in "$build_dir/share/i18n/" directory. find "$build_dir/share/i18n/" -type f -name "xia-converter.po" -exec rm "{}" \+ images-actives-html5.git/make/minify_js.pl000077500000000000000000000020441250410645000210310ustar00rootroot00000000000000#!/usr/bin/perl # Copyright: 2014 Francois Lafont # # License: GPL-3.0+ # 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 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . use strict; use warnings; use 5.010; use JavaScript::Minifier qw(minify); my $file = $ARGV[0]; my $file_noext = $file; $file_noext =~ s/\.[^.]+$//; open(INFILE, $file) or die; open(OUTFILE, '>' . $file_noext . '.min.js') or die; minify(input => *INFILE, outfile => *OUTFILE); close(INFILE); close(OUTFILE); exit 0; images-actives-html5.git/make/update_po.sh000077500000000000000000000037421250410645000210270ustar00rootroot00000000000000#!/bin/sh # Copyright: 2014 Francois Lafont # # License: GPL-3.0+ # 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 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -e export PATH='/usr/bin:/bin' # Get root directory and build directory of the project. script_dir=$(dirname "$0") root_dir=$(cd "$script_dir/.."; pwd) src_dir="$root_dir/src" # xgettext is run in a subshell in "$src_dir" directory to # have relative paths for locations in comments in .pot and # .po files. ( cd "$src_dir" # Extract gettext from source. xgettext --from-code=UTF-8 --keyword=translate \ -o "share/i18n/messages.pot" \ $(find "." -type f -name "*.py") ) for loc in "$src_dir/share/i18n/"* do # Don't handle "messages.pot" file which is not a directory. [ ! -d "$loc" ] && continue loc_shortname=${loc##*/} printf "Merging xia-converter.po in share/i18n/$loc_shortname\n" mv "$loc/LC_MESSAGES/xia-converter.po" "$loc/LC_MESSAGES/xia-converter.po.old" msgmerge --no-fuzzy-matching \ "$loc/LC_MESSAGES/xia-converter.po.old" \ "$src_dir/share/i18n/messages.pot" \ -o "$loc/LC_MESSAGES/xia-converter.po" done # Remove "xia-converter.po.old" and "messages.pot" files # in "$src_dir/share/i18n/" directory. find "$src_dir/share/i18n/" -type f \ \( -name "xia-converter.po.old" -o -name "messages.pot" \) \ -exec rm "{}" \+ images-actives-html5.git/package.json000066400000000000000000000013011250410645000200460ustar00rootroot00000000000000{ "name": "xia", "version": "1.0.0", "description": "tools to create images actives and games", "main": "src/xia.py", "directories": { "test": "tests" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Pascal Fautrero", "license": "GPL3", "dependencies": { "grunt": "^0.4.5", "grunt-chmod": "^1.0.3", "grunt-contrib-clean": "^0.6.0", "grunt-contrib-copy": "^0.5.0", "grunt-contrib-jshint": "^0.10.0", "grunt-nose": "^0.4.0", "grunt-pot": "^0.1.2", "grunt-potomo": "^2.1.0", "grunt-shell": "^1.1.1", "grunt-contrib-uglify": "^0.6.0" }, "devDependencies": { "grunt-contrib-concat": "^0.5.0" } }images-actives-html5.git/setup.py000077500000000000000000000064531250410645000173120ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright: 2014 Francois Lafont # # License: GPL-3.0+ # 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 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import os import shutil import subprocess from distutils.core import setup from distutils.cmd import Command from distutils.command.install import install from distutils.command.clean import clean ## Important paths and filenames. setup_dir = os.path.dirname(os.path.abspath(__file__)) build_dir = os.path.join(setup_dir, 'build') make_dir = os.path.join(setup_dir, 'make') src_dir = os.path.join(setup_dir, 'src') changelog = os.path.join(setup_dir, 'CHANGELOG.md') readme = os.path.join(setup_dir, 'README.md') def xia_build(): # Recreate a Cleaned build directory. if os.path.isdir(build_dir): shutil.rmtree(build_dir) shutil.copytree(src_dir, build_dir) # Generate .mo files. subprocess.check_call([os.path.join(make_dir, "generate_mo.sh")]) # Build js in each theme and in vendors/. subprocess.check_call([os.path.join(make_dir, "build_js.sh")]) def update_po(): subprocess.check_call([os.path.join(make_dir, "update_po.sh")]) class UpdatePO(Command): user_options = [] def initialize_options(self): """Abstract method that is required to be overwritten""" pass def finalize_options(self): """Abstract method that is required to be overwritten""" pass def run(self): update_po() class BuildStandalone(Command): user_options = [] def initialize_options(self): """Abstract method that is required to be overwritten""" pass def finalize_options(self): """Abstract method that is required to be overwritten""" pass def run(self): xia_build() class Install(install): def run(self): install.run(self) xia_build() class Clean(clean): def run(self): clean.run(self) if os.path.isdir(build_dir): shutil.rmtree(build_dir) # Get the version of the application. with open(changelog, 'r') as f: line1 = f.readline() words = line1.split() version = words[1] # Get the long description of the application. with open(readme, 'r') as f: long_description = f.read() setup( name='xia', version=version, packages=['xiaconverter'], package_dir={ '': 'src'}, cmdclass={ 'buildstandalone': BuildStandalone, 'install': Install, 'clean': Clean, 'update_po': UpdatePO, }, author='Pascal Fautrero', author_email='pascal.fautrero@ac-versailles.fr', description='Convert svg to full html5 interactive pictures', long_description=long_description, url='http://xia.dane.ac-versailles.fr', license='GPL-3', ) images-actives-html5.git/src/000077500000000000000000000000001250410645000163545ustar00rootroot00000000000000images-actives-html5.git/src/inkscape-plugin/000077500000000000000000000000001250410645000214455ustar00rootroot00000000000000images-actives-html5.git/src/inkscape-plugin/xia.inx000066400000000000000000000010541250410645000227460ustar00rootroot00000000000000 <_name>Xia édu http://www.tice.ac-versailles.fr/logicielslibres/ xia.py all images-actives-html5.git/src/inkscape-plugin/xia.py000077500000000000000000000065511250410645000226120ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # # @author : pascal.fautrero@ac-versailles.fr #import os, shutil import inkex import tempfile import Tkinter import os import ConfigParser from xiaconverter.mainwindow import IADialog from xiaconverter.loggerinkscape import LoggerInkscape class ImageActive(inkex.Effect): def __init__(self): inkex.Effect.__init__(self) def effect(self): # fix inkscape bug # https://bugs.launchpad.net/ubuntu/+source/inkscape/+bug/944077/comments/11 pathNodes = self.document.xpath('//sodipodi:namedview',namespaces=inkex.NSS) pathNodes[0].set('id','base') # workaround - fix path according to working dir # inkscape 0.47 extensions working dir is inkscape/ # inkscape 0.48 extensions working dir is inkscape/share/extensions inkexWorkingDir = "." if not os.getcwd().endswith("extensions"): inkexWorkingDir = "share/extensions" # retrieve paths config = ConfigParser.ConfigParser() config.read(inkexWorkingDir + "/xia.cnf") numVersion = config.get('version', 'numVersion') releaseVersion = config.get('version', 'releaseVersion') imagesPath = inkexWorkingDir + "/" + config.get('paths', 'imagesPath') langPath = inkexWorkingDir + "/" + config.get('paths', 'langPath') fontsPath = inkexWorkingDir + "/" + config.get('paths', 'fontsPath') themesPath = inkexWorkingDir + "/" + config.get('paths', 'themesPath') labjsLib = inkexWorkingDir + "/" + config.get('paths', 'labjsLib') jqueryLib = inkexWorkingDir + "/" + config.get('paths', 'jqueryLib') kineticLib = inkexWorkingDir + "/" + config.get('paths', 'kineticLib') sha1Lib = inkexWorkingDir + "/" + config.get('paths', 'sha1Lib') try: filePath = tempfile.mkdtemp() + "/" + "temp.svg" with open(filePath,"w") as file: self.document.write(filePath) console = LoggerInkscape() root = Tkinter.Tk() root.title("XIA " + numVersion + releaseVersion) root.geometry("465x310") root.resizable(0,0) img = Tkinter.PhotoImage(file= imagesPath + '/xia64.gif') root.tk.call('wm', 'iconphoto', root._w, img) maindialog = IADialog(root, console, langPath, imagesPath, themesPath, fontsPath, labjsLib, jqueryLib, kineticLib, sha1Lib, filePath) maindialog.pack(side="left") root.mainloop() except ValueError: #inkex.debug(ValueError) pass ia = ImageActive() ia.affect() images-actives-html5.git/src/share/000077500000000000000000000000001250410645000174565ustar00rootroot00000000000000images-actives-html5.git/src/share/fonts/000077500000000000000000000000001250410645000206075ustar00rootroot00000000000000images-actives-html5.git/src/share/fonts/yanonekaffeesatz-regular-webfont.eot000066400000000000000000001353021250410645000277620ustar00rootroot00000000000000ºLPK @ ?2Yanone Kaffeesatz RegularRegularVersion 1.002BYanone Kaffeesatz Regular RegularBSGP$*xZgicyR&c4o4Fw[Λ I\Y:5uM9>,X]C%(~TQ{fM̷_ 51 [ϽLv$ߐ@35ׄb z{ɇFCRݭqYr' &o~:dscF(\V/ XNÃ)(0I T>^cZ^l\ran͇0썠0&}s2/v"ЮC5 Y;E/vL(uk^2)7*6pLT 3Wݫ}e<ch౏\Hx!4%m@,јn|L(X3ܒ<CIJ9'aXqI|kϨWUEq j2¶YIj dc8)$ *p!^w JzrŻ0"AT)F Ҽuu! ’B4.(H#]OV KyAOVI$hn<#E"Gs9() $&/σq,,e>(Y>bA=^L'!nl e.Y d+!Y1lThRP!X 0/8S^a8@h2dΥ'cr*(T$D~}:_E,XAT-K4'mՕN  TVs F ٷ|J~jDT P#"NѫnDr6@9\q(kU*x2֓hh)`F)厼8 ؜ق(]F0XP20E2 5 hPe^\Y> (|>c*7k(YKyeHd|PIC$v `#DžZ ld2",Ԉ#jNK m *9O0c wfvBaI(I& @Iv?Mߏ hbLA҃e]PUD P4KU#;R*G'bE=@x?X4eSJU ##Gb%HrųD2@$)  :B"@y)}A &"| `4f$[ww4)N޵ `cA<>:D On!3f*!U۝6V B2>HQ!`FT ]H}@I|ܹ鰡$7M` \sCȒִ-&A`ӓBف7D (؊  \Rk[AS1|v2DwSdt`֒\{[lvq_ \7VptSG?P9O"茣ô.4\@͢%(%(BqozR _ms=kZ;AAhjA4Qbz H*ʩa[F@q 0D"X!{a|j&w7CeSq+O$*]1\0ҞPs\p UH/YǨR:;h<(ª ^fnw>UA#psK o,a[Ж0=aKR/04u`vV{%eK0"ie8-ۤӉfRұ-m0% Š(< v¡5f.J(! bF ěhVfЂ"GW<,CM-6aAjh-T 8UAy ;:k /FBEd sH@jx;9Nd5V٤Ȃ¨14ɍ.P{@*TM[BfvʗeqÐ@)K-^eNp؄l<Ė%337GZ/Fи_Wfk[Yٜ郬Oa5-$Ԭ0tfpi {Vk#kh~-J@NPtf[&.h۳dΌgVJ_wS1̄4l ftRַE,4a6A#2UgFF%K=n?4 ŀ N|Gaa}©DyRBqt#=ЏӠ}P3d4;QlcEml,g$pRI CYK@as ٵta؃7m̆a$ vCstcC wȁGdet&B ko9hl(cEaw jLLq-cF*ȯ3(2㘯Q#nMpxm Z2K0WXaS-d [DEt@F44Y ssgC| Dd)In c #42c;9Z%Aź05""RZOU \wN>~3΁@Fa1e\y)AdNX2$s!#,[ @91҆=DԢ|LVb;f4񒈔 w؁J3#*Їvʜa- C15 й*$|0Ey*ڋQ|d8  B Q1`.I=~nhCV?J2RRREPdkؾN`J #ciud֫;o"羵Ѫ5cN歁jvkh?~a˕M1 Gn̔e8Q E:dgE7X"S=3d5 4XAB#p D醇e3`+m^< Vy.H[.b|{ǮR133j|[ǫKy8t#m}H|4ƆTVM %/VNh}mvF**P  M@<̚nj#6=CV#HT~lQbE95,FϮeNΨH/pzZc^M?A&D( 4*.^TR!)8 #Ql&ɽF bHǬ%9qۣp6vs8S0៵Fl S@d>)L:p1 P1QvQ ;Ԍn$4k$»x6!|H4LRb$@tBbUi`Cl5N|p*Ud"q@>m$( iSBk )HM_& AxX8ҜpѧDT* ~-, V6|mp`-fd`MWM2c3\nbmeaYI~SiZ d%9Z&r`D&-qH@/&58ܮsۄOwd OX585Ħ @$@6E"i%+ G j&E J}PXo#rD%l,f?O"3l|Q-O)z v(6*FKaH4BY̕ѿ¼$MpF@(WC#6( DDap Q1oLEj]y'*o:$~:17H H[XדYf:+tNa1]re ` GqhuSRZp*Dan`gJaۡq\nny;TKҟk:n)6b"Zy!kκb[DR L CD4j=xNYSt& ~=A$AUm;D &6@NC5Y [QD^J$3#p%.AvA3nZ$$?lGR-$Ȝ @ !K!dL*^"Qq^p+*i#ׯ Maj:F zw[t5)NNpxĦ T&/9T/T1 hC &}cV?@E6з;ReL(4P#ݗO#ͩy[K2%$B+{ (i5c2'=q:F4GMA 0RLȅ" CB+Hˆh DJy(tDdgٕKrTFo:+GEX~C6@DS& obŭ_DOiSd1 eEjlZGdfEg fɷp5F U[C5Q&Xykna "DC7KTRTxD8)яQoq74IjhByWRI>` ܈`љ'Hl4Ed(R[QRL8Ѕ1J4D'4مq~('l_ӈA恛A'sjxo<"Bs9o4\{ *dPPp^)zVq2"쟧.1:yd( AzPU-M$11]=|J*AW"ː K =B19Íp UkQ%"J$&%a6ؗh4i?M @(xH* !"1G&mNpe! ͼ'\#@%^!!|"/y%ip7IXd.2/xY4D]8 |IVJ ؠJuTGz䀇59y59+e{ QC.EC0@r`A*,Q2.+]|>m0jNB֭u`W!F,O+m_A2+%|(^W4BBS` ȑ^iB"K"q , : `3 ǷX{piKȖRVU ?\cZ#„KtՋdã[LJnFy,!MEC6HWaʰ4E@+(3kԃc.snWBohBgfDUO*궼ECb.dg2k*2dj4c2UP fbg0PDG2"R(2Tb_X!KUXRZhwLV1]]/2Z!㺖+quwvV%UڬtRWC*$C*rPl272C ռIm+Cr>q3pD݆H}t:8fƇ [xa}H`:B \+lة!J 1FbX@h`Y_СRE< , |N@|{{xl . U4^}ULan<am^(W A_:KA[VWgZuQ B࿼莻@ZN-@Z`-A-m)"m}8AFؒm|>3b9 x<2͸Ӑzz4\sN rzzF=/=> ̽Fgos/@eF'-Ibrטja-li*–憰Cl1/<7Q Phf]\aۯ@ B(Eх6g ?ZbR0 E|žk5R} 'b,U WhBwsRԡn$ su-#mLS] o44 ^%X/oد&cˋ̟  !ǂ$`&1cAhOBRmI`(JZ „ʒp jKi+I-4F[Mt$I;B`)*NЙ2I4&6I-3PPI-3PGrHit$Hv#=GZEid ]*I *BЖ9$ hKZC% u$(BP?@)BQ BPЂbm Ee$К2dhMؚA& b- h#Q.O{=(#B_t@B~UPAvGU4Ah%@|OfSѸ'7eh9UNh;"?wX1B9[Z$NO}S3\Zg4 p`ShsN93C3f*r!(ʧ"||r!'ڧ"|9*r!'ÕS >ITBO)ኣ"|1dBMjIP6U O.ᢛ!L4r$N!L5R$*B$}R"I*B$Q"I4I0ڣHD 4I0ޣHD 4I0Q"I!L8Ya!L<$Ή!<=#ID "U@$xtI'Q$G $H:HJHPÎe 8P_Î̊ qْ?Jqٖ?u@;7}@+4/_ÊqY+4׏fb8̯Ê8ͮÊ͋evVm.Ê͵q[9tVή_q[>~\Vnnmnmnmnm~\6[.k%<~\6[?.e- ˆۖˆ۫Wmp[Bp[Ej%=LZ mOSSPQBԁ=BҀTZ',HZ$"k āR q,Kʼn+'V%U,K,K[voV{՞ɬ13$o= Eu/y#=w#{`{}͞&{LЙo}&{goy}y'}Hdoo$si'Doi}ȤoA=yH#O$B&K5wGdOO?y:FȍəޟFdnο:EȋיȽߎv,Ջ^ζ{:"~uE9^ΠߝA;:"w~u*DDDFD\)7XI;u !i.sNι\.nw'w\tߜ?'wT<9v|}'gv|Jt;A1㹤O{v*~ t{ýG]Fp-$sϔ@H_AܸH@G3:= R܊@vb:бδ3gibv^ˏZfS3̋3̏3;?;Lv3?fs3DC3DG3G?s:p~ugX?s:p!ಣ%:~u:gX:8gPq,teuc}u3xfX2ٷ>fX;qcme'ď!+Nqcی» V2n3/62~̟62~Cn3'v2zFOmdn#';q?$gaU?ۈFO2~ FO;1?]1?PوFOöb2~FO6>jS>HEOda=&2a=dDO[&$"zDOla=&="zdh)0fb3 d"z&0vûU=&2a=&Ѳa=茘DO|a=&2a&a D?a&2`"  Бx$?GClx$?#!# HHBǂC  x$?GCx$?ׂCB<H|HxGC<#!<<#!F<#!<BCB5-h$?ւCh$?ւC5W= HuC h$?F% AZ / H_|B4\H]pA!q H\`A!q ŀ\Z  -¹%BX.ՀBX.CՀB&Q`[ DEB,Or-SB&,A`1`c `m.*!zmX.b \ \,)B\ !sH,Ox4\$P8P-a ǚ;) F;ppNpv݆Ov1Iq$  Mf8nMpdehcm m Lvp ӕRюHv1 jE1hٙ ͘ LMf0 eJ1M`M `c`MLlMҠ `xȌP?n# 1@# 1@DF( $H(+q$F(#2b ,F.n~F(x>W$`mr1r;|PgG1@EF($_jhG$Qxb≊ P\1ArN\LVDb<.h:c ln@ r1@߂XP3# ٶr1@ !@P$"ϐ!@ #BxPD(Y 㹐5lD( 0! <"!@+D(p!DBHI_@7BȪBDB~́iBdVLPF L>)e-K1 d;途A)HHPCIBߛ;4,̓d+F(֙IQ=PB0tҮ45 : % I&M6mq&>6<) %leӶ=@@p{<KƒBBDeH!An!@KBDBBͯ$(i|D(iD(i'O*WMD(dD(nD.a- 0/M.Ko(iQ!@%L uP!3!@U25I1Mϥ*?'R]_byBvs @KB h϶!@{KB6—<&;TD&!?H!3H!3KL,:d eK3GvBaE6KfBaZ?ȄrlBF t") 4X@gD: u!^lD:!\@clDfw8DkU~AogIٳjL@ɭt退pòt~3y F3$ MS,f` ʙo*#Tf YMrdEE3d\X &{Lg` @ &ɀo(,,#Md!)r ,"u2f 3% zQ̤\LJg(Q > 6|LY3z\LI$( 8/z\ψr > %J?&Ο eџ J'u 6|@'d|@'f|@'@ůb@+&L08J[ωv|@%|@%DL5ku匏2gˈٟ \@ ?Aˈ . &f:@ \@L/ / / @/ L/L/ F\@฀!q>Cq>Cq6@q6@q6!6@̉фρyx!!(lr, ʁa.Tr, ʌ)LuՄLR"Ĥk×ua7&x@{(W, =ȰW2F , ;Qaܬ fX@w+aܬer`ɆX@wܘ28̰`N"8 d,-l`'36eh ɦX0[&`MzQ|jɖ <*I f;0S'Ȱ`O`L3e1> fk`O2t0/`Vf} EINT4AM䩡:`N3K/ e|cvz<^N3;R;+Ȍ2ߴOOH3zht0=Cݠt0'v;gCwdɝ_}4rdC.eU#w`Fߡ B]Lݙ t<Q_ hKx~ :](o<_NVL0t0tEGnhy.LK6辆n 9 [ѡm3ۣC)9   `t0uXuM4h`ynh`{-%4kS%ɀۓ{\-h`6!C1umH40wmÅ `6#ۡΆnt0uGCRAOt;!y(u4"} \d"5;BSO(wHtOYRWlDҲ[tm%2^y9LXiLDx f `&hYУC)G EрS%*C2Z3a &e`L0}3aPC74h0}3`3tמ_18UgCL*?F&B(y>kC' UD=ACƕ OS?dBHt0u=)ڴ iڴ %HLL% Pڀ;T%Cjڈ '5*c,jU;Thwn pw6JS-]kKS=p!MҖfa%%s 9TTc%&~*DI^G֠`ۮ32"y4toncw,?JZe(PZ}I4m&WK_a\ɂ9#])bi%Y4;eϼK 0hxQHgp  q1z\g raڄևwCL` Ce*7CN А*7BT@tQN T nҡtTQ[BܟE P-B趝@BX=t+(B袕!d8F4 ntVT nP-B趕*7KP,BYfZ7 hWt]N H*7D@St^ }*3DAЁ#N :3DL@نJ%bh 拁P.BhJt fP$bzDt֩b^X3B G%)Wpt* @kg (S;>Ί ǫ lW$!C- =]q- +OбqKEO`?&%,]EBX;>7fShAsWQ[7~ u-l.Y0r Q8)[G;]9ނR/tDAgăB(t f8J@Vp#9ct-- t eЁB\C;IM_eń94ƴxlȀ(p?Z`Y] AtwE*,A"pw{aȻto {E2!bXg"?Ye bAD,xw,!e8%yP&%cs/QY(M~(jK<;gr0 $@n_f} g&BJD2)PʘJu D\xL) \5 J%) "0‹<閈 :k /`ԭP.TauZDHk5F`(wv4r&ve%ݑdLQjׅIP$)6e[E{99X;9bCs;+o!n$J *җYjF" &lKqgeJom,jЖe%N+h`rܿ<+C ^*B}b-jrah8q1֐}@T=~t IYޤ{Bev|yOwӵ9_5= uv~`Đơ?apg\Q2g-{/۵I YJa`@>LFLK{C]rhkɶ140r d18A%h(8ɻ6>-FPZ B*0Ky9zd̲lƍ=[#IQǥsɠfPďp*ygc.,T s5.5lƭˠSD.b"djwU%`q+*=#ڕrbÏ = >Gs(RrVO=a+(F"y=4 5 HtkE5h|ьЉ|׌9)97!Pz@8l4a 5OP8CJEg'#^ `Fr-D!O .ľXPaJ) 1X8 ̾n=d5Pm w[2(qC4oEҸ$%a^yap (/꿧ZBP!uA !g]P%5;KBr3+\bs5fu)FDZD]azT7V(nA~, =ҭvwb $q {ڽcCt?yš:9'#N 0/i22(o[҇b]pU=)tvˀbD{tjsx;"H D1,EI疂lVGFϥpUw¬e1Lu5OOrS 'J3yֈ#'"N&e(ՅN*߫ʨ2 bI_|:v[P'{NFrkuCnub!ܫ'(& 87 bTXdSz~΅1D; rfJwKQ'$jOx͞q^ CJQ}'CoGiFuSv(zVMJnKt-~A=^(HE4/ƪi3jwq826?!6Fwx,8k[`{y׼C/19¿ʙgEN(ՌHg:VƑcYB49s_#MVEȄyAmIH00YUԚŗ@ r8Clu,`DzET.\4L&I:RYX#jjoa!O]nmf$ob)#غ27wp,3M!5 SHYLȐtQdqP˙YH,8Ι@1aRBIBYjb%3bBwo#24z=@ 2:Sv9oMXqRF@_ Fa2$[? t[\r3B!#;a$"Vqg̏`ABם}Q t4EOƃ2A&Ɋ~RܣC4V 7 B?>~ כL 4E8hL%&a-ğ{k) 2'O{^DTΕ=ʓ-l|V1{NRKzIlFdޤ|ڌD1tJi:GldCV"+(jb?1(yb>~r6CQ5k#F%)Lj*H" SS29(._L Rݮb}E5 ?|k C—HPADeB^]dR+Xeu&$M)R!@J#yi~UGK *0Iw2!A2 c7,WK2Y1e~^hlpCS-KLEƁ)WlևmĔΰJӶ|m>A!Ią3FXC{)#RVTg~]Yj%1&9I: z0t&V[ejbSQNuxqg[&ٴ ǡ9 uBd,[d{rJ8Nhz}{[Ajޕ<PO ,(Ždrz̥[: IPۧf\= g)eg NH(Ge$<-d廐@L .%^3~blMk0,*@gH ~Wj*|Ehq7U0\ːu9\I2F!âREs˕|CcەeBfşDFSa,X0sp 0-!%Wv ZK0oO\t_)|V@%@jݙ6XgwDZe*㤃R] R-,əl0t.q!NEϚE0z^l"a2Q)U $|;ϙy(7S3tPQdÁ-4p' dYZEؽʃCbؑɠ2,m@\ djt|ehIRl!"HXw1Q?K;Z 1" Y-7[!HFb.&rs|kr|%g1j˘D]Ξ8qu N#*.sEu\qӧp ݦ"CpV%&$Ka٢FwDUg+$ޔ %[B]˖q|VEٖwUu 'IDf'^fh0%j8zRd :pIQfqHjXPO)Ł<@B*ijΉWk)Ȫ^ 0w D]b Ew[>-*MINUhhG+눽 \#FR9KQ <$6KFV婪&A֭{%r^kGzK3"YurIu.Ǵkb@\ Zu27k+:}G~"^ fH^ւhXqEiٱ b 8~lҔqj1乫1|ȨU=JiJAx6Mڂ[CT W8 4!(cL y@Ichat6)V1;`K χ(ZՕz՜ʬֶIAmD+OH-| NR[])ۂJb:MNp*a2@N-x-Sʇ$v.bթ:1,l'bֵβJkklػ 2 Gaz i)&=,`5 hzӑz+j3GAdYնݕDXEŞqƒ; #@vpD aA* £ Z&s$lna4>`i9[0v}L\p ϔͪߣŰ.צ`y2\pj>*ڨgj#&}PBgCC5//@FH4NAmLL &P.jwT{@mC_*cbb`wC.ϔ{}d fpjkLPݑQtbXݑgZRr/2%bcŭdhGMccd]2 P~x $!l]_f&:3˭#I9l02w^p+L]Gy 7 v架\Cabus4?F[%t"0Pt6%.eW{gic,cQWӪUڇC)+#A.{,|J2 槼WfBk\b-P4N/܌B֨B.QI`lrcHUi>iJ@X%γ06"5/E;^ akS!8э:r=#8s"4TQ:J2ڱ'gezg>FK_^&l =偔9gy[őM|!`s(Uyhu]Ұ_, I| ȉ)APgKyA ϗjJP w)1dE$.ȠhҨɬg%CeFj.Rj}IhX䊃42ڈ/)^i.K0#Q6O{.)F%_",' ,H:Yr !+g}o2^(ңb-{`5f`۴6Sϔ`= lđYPôYE L?F!oךdb%y+*\O*$^)o#j7eآBnR“FJSavwusD,B~mB*\PP\(\4J&Uaz+3 )r:*t!P(J·%/ \t 5̏bchD@a;1$cW8Ij[%HIĪ dW$m^8ϺxCn;aɓ& @}!7=m%o*>5Q`  Nĵ#؍}c!@U3G`\2n0rwq]V;}`v LEi6郈L'D|r*p":\GkJ, &ñ`x+_X-6}@};.B%'Kw ݌Y,/saL$a+! sCp'MdƠn j/XN1MѦb>BIVOuTsEᘂ>0}./T@E-&Ikj/He0>O}-;O4#AiخEX$(qA 2@,L+IL@ub~nB>a@iQҙrlXs/YNC;Y$ $|lfB0]yƼJӗQ+yI>G[C :CX2y [h^ng{䙚3tC# =8&T2s!p!ؘBE&Kwh"f)fkR)۽=P ˇF**yt52ו}|.p%F_2W~j73ߝOs!T)(،=!I{>?GDP37>MXSZBQIMj{ d1P({/' uics|?иkN7"xp Uwɑ,?db]2YS; X*~)Y J' $'[LD<9]*TX]Xce?d(7juD7:U*VY1QI YGơ!7O!'?~vMofrtqB8$tG  8, B0:ޭ0%DS((D%GcѮ(ȀyBo7$p=gФ 96\yVo۔K (b!qLhoƁM TRXTF` FLz"|mR%f M؈Qym} $ ,j2'[-6 O~Ig"#CBo)f .DY5&/&O;3Wm98?0Q$tU!Q?OSx=D1i2nɭyc}=QϠt/Pf) |x ʫ_:g|u۪@ Ϳ4GmE_ g ձeVOʙ"I@c.k-jQqEL?U.|ɐPtwBdJ_G(iM|Rt `D +q} ¤-߀vf _ t_4_m< zB!A/Ҧ>.{?< B+U'q Rae [_N 1I|xGe*yԥAnfg nH@Q8lBTZb%A&HY4Mv 惊$ 9/e A< ԓ(n"F$Q;Ű#V=K/,eEB!@d8& ؞IG*⭔٨Bb% N%t/,h6<Ի8FɅusEBOb"*B@q^Y!v)vKtpSWf("/Q`HTd4WԊfYðk֯ޗEX 5 Q3*$T Y{Z^Olsq,>ՃҪDUb# ~HA-%-VB!~H␜wHbvAC`yvi:j(dlz ~~ 7۱=b;*q l+2h CI aTg㥈I\J"swb${CO)Yd0 1 R!1VDr yՓ[WhsdU/䙴 W3}26#uhKG2-pHimK"3 4hmQn& ޺da( nQ @&Q ~@bXGRapQ̾. $KN e58k*k܂fKBQolA:+sE~tMؖG GC)Cdj'J)Vv>G}8u}jYSH!-1} j)v- ]nƮK^HYe H-D52 M2WYn)_bp_=rř-,I KaF|![{s~#_ ;Fx񗾺npKOX$DWVd3S(v0fȇUZ2 ֝6a:'* hE{> vakyCg)u2aJu8̢7Y%\ lp{BWV#L8i;7e{͘5F9dQ3p>P_Qq&equ'JF6ѐ3k'fEAL´e|qhgia@]AKyS HEѕeOƮx&U Z.N'j'ʀO`&VHg+j0H:lGDzG&H!Ћ$uߣSԏaJ䓪xEo{踆 F7垒? :2yhEpn 1sPrZNd!|iF\GJ p^t Euf{4J@g׃N0ո [K>YiɗQHzǥ`egե.~r¡oVhq$3V)LQInP$y\qױVE&n %H^]T9dF%|ˣһ)k+@~eRoa8(m! 1M0_BjhZ{@!['!ޞ$V|( qNjׯ#F~Ŕ))(rߖ&PDPhl!`|?DM#/ -!x5߭ka a.n yqYziG0 lZ'p7h_Sy!D/D3K ']5s;9" ;hc̾ijNsl"ھljUfiwИ*yr , i@үhK9nE%cVx%x6R4%zoi;*(G`m/$vQ8>G5za{=!%";}*5#٤MT{h(d {GVfwJ }3*nu#1ZD5#2?pe$$Fnڟ~y5[Tލ#{8&Ԝf0Cps) ;`2 p f 'QR FU1-݀`y;dpSr+$ffI1"tqjT&ߛr@V3`FؠZ(/8OOD_ χZͧlU `|7ѿxF@Ŏ Qaz7^^BJl00.A&_ e! AO|-҂b@3ps=wfCwb8Ո}뫌0A6:LͲg Dh(S6dlz `B])+筣lDvA_:* qZ, eR1wXO"2SרڻtoemBw[EP?5!NQ ͬaRWLA~c( /|渴:y#&wp>a"UMoE]_/l;֘7kR2CnX : ~d>JyZanXm4˫w'  4.-. H2zm̮ MK =='`}Jj=2N|ITM,W$a$ !$.K;%ŰTaQ DܽP2dC} ',05]x  IŰ9NoÆ#&,`ҎZ\a%7z'n 3BI3(9a߯!!)۵zS\`Y0@sI\'Nј%y0廀|{vttڹ0[97a|Uk\QewJعXL"ETƵQ'"I gyb>:=-cvH6Mx(%H/\:lG1iЖ}H8N*IeDAM͐%/,.BOEhO1 b|o;)KR~. N$2U#yFOLbE'Ure0tK<kx-[c m'äxŭV:~'Kg'B",SԬd7ZPa0)S.A%i~Wcpݎ v"ZM'8{*;xF>{nݸZƕxZnKuM.06}<057j=?#cr"(n;.viv; n{_yJKZmD4nG3ݤ*: gI_ϰh mgA((z" q0g<*H nςNjӡM>BKT3;}h,P7}v5c% 5j.RL^ooJ~?[ = cM uyI mwzQJd a(x>P'rޛ"4 X`w$b Z Ȩ˗(=lx-d uG!FF# __N M3!aȴ%z:_xQDc7ŸЋ#j;u/EIP!wy(|ͨ,_H"3?fn z B uy؝LqizA6%z*fX@?*tf *R*5e\n1ҚQ[`I AV ]"I*!y9>ZG'>.xw|GiˊI<O;t&;|DdZo!,JQ)Ň*dOJy!qaCyr%EkἚ$d:A`Ȭ6ha/6fc^ %MC5 PtB"cʸ>uq K'v4h"'u}W}' l>VX“RY}2Ekć"HA[ϮI A|/VXb >wNg0qV!p 8tD*ǐ: ϧ*R3?0zC#E@^T6:˨A8"y x!z y8TSg^Sj;0{ud;p<*Li&mT)waHmE3<>wC5o/f ] K$)rҞ@IB*Se`r@8~eEsx=}Y]Emp66lvl|mjKD+6+qP`rBqjq*}2)D`vUl?͐!h$2mRuϞ8J0AqKte+9LZrD|FO `B+h:BGMZ)'gC;4XQzB=h< %ɍǑ@!B<Ґ0T ]ywې]S,B]-+ubԛ` ,>Ϲӂo4\`'}-3 qBY":2#U@A,"rd) j,7[T*o\Y BpΏ 1J uFۧMODk4'g[beoVubUnT,3K{1uSX6lC*=BX-+~5cnA0B"jOR?K L )Lcn7b r$ؙM[3sSDWH"@ D_xJ/0m\0F MpR[aGS^ iXY`I!aءi@ih {S~OƁD r0X7I,*( b!].ܵ >TPIn!IN+9(Q)d:2,Ynxb6F0A%Qs nE]С[Xu@Gh5Fȹ8VW#jhdY(vP ˕eReupWCQVTg`ő+$Jfj# St\_W=g]H[/~e$--~05U,`@ET>=6\!t4 ZH222VYVf48j\|rJLc0|_YVccXWa.D(qIj;WfAmea޸Ro~ኀ@MojIx|PbzrZ`EFY"E Vy`NHnRXxݖ۹jlg4`NawLxUc ӛ$݋L}W+=` SFCea`W&l,q$ 69hQiU[$[CL4b HC@@Mģ~E1\jSkxbH%GR5qIXEXdW$IUR=V|8*8aI*$Mg?W\!h1f{W:9\*eXtVSZHuD ޱ\ HA>em[ WJ" $ApI3>]py;t@N+Ş9t8yqxOr$#QA\(8;'jpN0a9v2 SJ0y g;H]Pg=1/?M$h )WH õ{2JPGE.8H,|*)ˬK86:B4n|cO+wPw"S5r0?O.FT*hޓi܃{q83X~.Ap">gxk$}tN$;r\/,M$ZG|`Xf(1@Skb"q\q-"`ɴQ6wO)1dVW舣N7Y3xD]VSM>튑iBA3:c-l@۸FU! -g46O /- 9s<\Ev>"Z66ZuNO~d;Żygh\" `Fe<89@EZ?^ E(FU`x2v5(kkv_\v'{kiN(&88 ~cIZ4[6;Kxb{(s >*`C%u cus**P8>W (?Ji[dJ-rE};#6!X:( xĝ~b3{U@Aa嗕a#{8@vHz_[ةyAoEG{dBԁC0(P ~Fv@#ol(8HIF $Z3!2Aemyهò:uo,G`[liB%`cȎs$`^@Le&!IijdA<󂥄ia 14f 0_A_xM`q:3  3CodĪ,P5@LZM;96h5\D T[%8S TUg@<.IUIqGI!v]DRTkN4L*^d`${hTs)*7=&ʔoĊ*CG!O6 pӉ>rR:[ɼFb(&7@P9 `\b̂Ŏ^exL]F S8ne ^*R Kʬgz@} ?DLiatޞeN jRNQhC$qf.zvApKߑ4f0( d $#sL\-`P_Z#0[WNVk&mЍkʚ`娯Iۍҵ 8P#2o%0 9)$% l2kIjj@Y6. OD$C;e4?3[zX 5)QpoՄZ3Ӥ_:yMϻ܌CA"| 1G4ܣ."£Չ?DvᷕT(dPjpMfVex=|^Fzq8\n焺 F$]7\ f.ĘCT m9b}U@NX)8۵/WEml /}&7rfA(H;>#>80*$BF.D))dbw{d9f=yܨI =-!.5sBgft._j0xt1p أ$>媼\ E>~-3NH LсHJz 䟺 5 -猪6Uu7D{> %BLhbVԖ\Ǧv,Gպ~3^;&U \royCv/i}aTΰ4]MVxwq ڊ$ӗ\_FyL1Ъ\Im k=Se `aǾ@X?]ܱz#lƔl}Фwg1.$Wemv <*]zA+JOy=v<ـ/go4)`jP-ۇ^Rni$Z+;GF2rH+bFEEڊ\ 5Ml!H<DR  2#ܲu_L9i)kc<e,ÊAm2UZ펛N6 snda0(#YK\v)IA3MǎHHA?J% PM?HHtP|H<3p,m7a M#!LKPMT$&x)wT+R"OV$n z?/yL~7J,AC\`KԃcSRR:dxa/LhZr]~ 4GelMW fba|~1XqܗE; rdڕwt )" bV09l|X%-R&7eA>s4 CŘt[fgbXz7XATHbܯ7pI-1 Ϩ%W6 XMy3`.Xpiz1EPKb*H24.Gk8,3O㐌,ZP:, MРfڄKg`dy"jn-k^Jjˆɉ#|a뜯04dPMbX`)ߞ[o]j2vY( :a3 m.NEL:7'RBk lq@*/]`0\_ 8,8G0rKxJ`둟,l~C;ҦtD3q\r22鴱1ARrp8p[\mXzCi[E"Tġ_ [0n?x=lBF.b"R61 qUě>޳=2[_TB멈twVُu`m#:|8(@*7`ν'E 5h* zQqN 6QY8 `2N`acb< e6a6r'vUةc}УnM6o@Tlr %P# N=?HG8`RrB+f>}s:J>tjuJ(IXX֌7͋ a@DiJK٣t&t#tC%vٜ"O{lgU\^Lx Ijy2G{H SXcRh;ʶMba>5-ݪ˰@}A]V4dHqFH:&MƯ4R2n : b ĎF]qjƼi8K2 [Fhib,eqVC4+^Q|V{:mD+B"DPi4an\ +l|;uh'dHlX/e,'JM'}|FlRg{%D)kbBO>{bʶEt _mPK5s(GlGlzJ*'{ ?<2 W :KV2OgFo-wJݮ & yLAD津 ]#@eML#0*e`fC(Fm+N8UIn`bqNw"e[N#nH+e/ kfZo^ ȇBɀ,tg?39r'6HDȴ_P!ՖTX@CK_2(7y\*[csD1*ދF{ΆV@G}C)䭋d=iaw(.`Jp@al=bnd@f%Rɪ.UƺkVx&bpO0KOσv ʖ fl9ba"fvL u>HskDs[Ai#43 $.NdSW oN]k.d2R!AG)lMW @+?% Z"`^UW^{brgZyNdtI \7dCgGI2+{5+QZYޱ$ IY]S&aO|{8uNm՚}8؜[\>KE6|oq0+"+׀2a쌐ЫJu{a ̠O4r)nCapOφtX43$Vbcα@RD[brxCq|8&r|P̮ `G>ޔ~7,=G5Yix56$@#IXs*†y^n0 jHJ@CAVJHSpʠ`! - rĉوq"9(%mC(AMdSL͈@r&pdי1<|܃l3W ɩG#**8ba9ME,[@zJUF3ܾ65|-.cnnm21;FrZ Y jh,fR [\D0C& Y-]Aaԁа)ӖQ4dP¡-YJ& Zx櫋AHŨ FM$׈}wdmJ|ޔuTnZ`Zu)(;s~w١3(.qv"T?wj8V(Dþ#NJhp_`k߰4R ce-NMriWhEZ1Ŧ c8 OJ9,椯Io<8A<WG4XHdfh$Nx7C)`sLӧNUqܐ]d.M3 #L#bw9f@ @A*Pb>R#8:3>\uV9#i>;:?=R@*ا/7(sN] `\.fN'l66[ \c(ݪ \C2:tp1jA)"ͥe* jHɞ+qר2y W =T\PZ𑘖Da̗.:NA>SssP fp7ɹ `:66 images-actives-html5.git/src/share/fonts/yanonekaffeesatz-regular-webfont.svg000066400000000000000000013100101250410645000277620ustar00rootroot00000000000000 images-actives-html5.git/src/share/fonts/yanonekaffeesatz-regular-webfont.woff000066400000000000000000001350301250410645000301320ustar00rootroot00000000000000wOFFeFFTMÁ GDEF),GPOS@@!y3EGSUBBThOS/2BT`dELIcmapC4cvt DFF4fpgmEeS/gaspFglyfFgHf^headh366hhea $ ihmtxA1locamaxp namey lpostd{prepPg)0iwebf[S:=|%``Ixc`d``b`b`f`dx Oy,`Rx tUUcPQE)EEPPi cUms}\.m˿tB. H#"b1bE@[NaNr N;2 F[urr`>9;䜽^s{ut]s w^͟W_ԝ{u奋˿_ /.7wa~ٮ;%]n.a.SxM_Ok{]|߭p/Sڇg}]WWU_^pګ7_s5[k߮a7߰owwZ}_VoMWs{n~[3z$n-u׭mr5ꮱw+nzxؐa O/餟ng=sK ;q'~gM#7_}'~~g|迿|>pK׹^8?-ӂ7xCqB_zmqb_.)#|¯s׺u~W7w5au\|X a,>{ֿ-nq&ҮR{^ea?V*V&&^S:{skmuS~{pirynz=ޡ>ϽG"ȽWbmW+}6t;C)a]֟ Aʝm [tFףh/r69hn v׸!0mlޏv^ p CjE&nvS7ϸiH~]iXM=< DӿFhq+Z,AKKP%DCh UJoAC,4sqR24PF߂w#}җ! l6C߂H_k +sɾb@$|uq%$C{Q 4a(kv9ph0|X a,M3iF74ftPA%:DM܄M܄M܄lքyl$J@/VR, R0dDKR,52rS!|7/pÏ~L2Bt\UI/ZC/*mKJJ4?RJXe6k;D9N}+l66U]xOy_My ]נZur^zٴNPݔ4W}RטF9m!VYYYY|XJh=,cb,[uE9[mw-r-? =֑V@ oqv>eԹ$TA nI,v^=`ϹH~3Җ!%<,6a"l(7mCP.6 /r\'^r\%ޞKoF"l)F6R}>a및un @l ҖwHQkKxEnK/L\^|X a,a ,ea IB@쩐Zc7V轢Ӄ0zփn=0T=PBj_H }@ h%2R$kg5ُjTMS5}##֢Zt[K?U Z^+_z[~_kW5Mmme?Q=#ACWSZMϥ`>,ӋU"ť C> z 6wރbw;VKj]%wѮ9u]Owc%TTH \+]vڈ6bic^ X#iD}Vjl[mVi-55ԴJB)tB)j45V:NrWIg AnEE6IZo1-Fbb[HY=Hۂ-Hۂ-Hۂ-Hۂ-H؂-H؂-Hx a#6"a# Y R dm6J&EYD D"ʇ:xk^g;mmx(]7SjԀU]1?I=0$Ԩ? oZ`!Mxn;ngv6ngbt;Flt;Fl$A$A$A$@=H $A$A=H $(1U"]e:DҥnO$]%r+g/2z9k4PoˑˑC<hk"z-|'|"zY"qK C>xBR*T)J!U ʑc>F*T)J!U)R"U)R"U)RU#U5RU#U5R-EHJi\$d\uOgQL4@|HLOihf/%.Wp$Tr0;EoKOc>t1j%5ȣy Q/ea1njKܧb1] Bi-Bi-^Khޅ"xCLЪ-Χ_-5 l-ҿ]5#i =̣&}XKXn܇sfa+CPle(2[ VFb .rùJ 6Y E? 3 B?ѡѡPlg(M܊Ak8fz޴pZj8v8$Gמ z;-EK[Gh0J 4VϢL բZ4 FCPm B4T W P!ZVhh%Zbp6o;lz6W gshh*DCh j4TjPZVN%!k VwKCuцF;@#ǣ0z.a,E؏BCehh)ZvА֢ڴ_b4T P!*Ć栝BSN1)F;hh#|vNyZ;h$}zgx#4ҳ.Bֈc4Ј?EZ$M"Q-"Q5EHvhk9H!M iRHBlCmH I!$YzSHF'Fvm$sZ$* xDoitv:m;NNGtu::ӑ~:Oүu5X1_lױ~ZfX~=_6栍9hcژ6f<61mAsz>hcژӡ]Ю Ju=)E3h͔vmK"JQRj^JKyHRRj\Jqq:NGi/?epTh7ÕBjTtAW ՜v=@b$j7y0BXyXKa,|XrPIUSõc׽[عW"Rmʕp/Hz;{I+L:Z)cRL+N#TZ{J˽DbX-V@bD!:EQ2ޅ"xa [)'|HY%+| >~ηccqM%y`8[>No7VKB0̤Pj+=do c'oF_9 ;+}mB">MP~7Q~7"[nfBHz[7=k]==k/= dXIϒl;=Zkޙ{ ΨssA5X:6rnB&4]<ypG9a~q:^8z]$oϠxv֌}MC;ag A<)u<=J_z=T] ٮAEIP 1"IiSM x#x#x#x#x##_ mx'\94Gmy<.U'uu 5ܡ9 Rj@-Eh ԢZ4Pj@-Eh Ԣ5c$X-E3hJ頃 ^P),\m&mdž|ye[$dJr'=`)y'O\ϓл :kU><̘.{ L ڮQ~ "LH&f>y=@pU-?ӏZAW3P2[>Nf3[CuuԽ.},,e9j\>Wڳ\'GSdq=|'JϨ鉯nak۔m[nJ>ck׹(]֚6_QzJVǚQ2jZFM˨i5U@<\|Qͥr_~ \Hi4o7?9Aeu3niK{'nC͙WaS*~mk.Oluq}ʹͶ~ulFl'ߵ1}E'fDO"ݎp_n/uۋ/s$TA [Sydx\/ \B5j8\_n$m$m$m$m$ʕsFZ3eW) rBw9xJoԗ?z+{Hw8g-%)`Gý}H45rwOf4n!J%3~Ey^uGUA^Y }e5НK]t^ݬQH3x,ޥu.P])!FKǂu1G$~UA !QND=}ӾuVTEs0Gýp:@M[g@U"u6~ɟ^׹Zk >=;N` -pjvCJ4"uk?&yk?&ߘfՈ#mʴvh6{jH`쵄Z↵)F-W{]ZYh}&\(m)K%7aSW 5;oS)xqln UR˜S.w};ҷ'wJZ^JMkqh;rWJ:+%ޝ\jzߎ;)mWNtB:xDǼn3iꔧ=}sW}w ZC lt770~0ApT̈;3~Jʊ$#(s ;}[q>wyn}ժ%2X V^٤rO~"/awFBY*\*/i^j)Pjq'e5HSXi)m:>Yoq !HW^Qh^'cSQ4!~ ayrz5!nM:˙2[ه-#ح;w~>>zlf?źIpsxLpЯrK-W--綻{ܧEU0f w4; .$D2]6Q& bnc4AF#e4aF#g4= $#0)X@2h$ÍF2hdHHdHdHdHdHdD2hdvF2h$F2ik=1H#4QH#4qH#+!h$#F2id6F2i$F2i$F2 i$#f|X2ɘ Jɨ Kɸ LȤ Mؤ`mfg"4J#4!J#4AJ#4sL3uD2Pi$#F2Ti$cF2Xi$jYMɀXɐY3@;,xG$ÖF2ni$F2ri$CF2vi$F2zi$×F2~i^M!y-#1L#4QL#4qL#4Lu;"4L#4&F2i$: iɘfg~Xm>ɰ@2i$#F2i$cF2i$F2i>IpqdH9dH:dH:dH;d 1mɠzɰ{e $ R7 d Le"5I*u!&a Tu3IT n 5 aL$ iPe25o6؄&a ٺ4Ɨ&iPe22HH͕w91\=\al&# :HJHnKHKHnL,0Xh`K ,3Xno`ռbUvt#G5oi K5ocPdA vt~Ԑ,=jt Oh$Fj~2jU#`5sCL7X``b ,5Xf `jɄIT t5 +ZJ&^dH^dH&_BhG&/vdAEe3IT v4 JQ&P@~_sk$GFr&j$Fr*jd^E#95< ,2zRe V6]aLR#kjRR?rMNX#[%!G@&}9+<YA4SzP05n4Q@ii$ofDU3o`",1Xj`A*GR4<;IH^J~B>MgF$c\`jdHL5HMH^NHNH^OHOK#3g"yH5T35n-HS5ռd`A ɛ0f yc5; $Fj$Fj ̦ Ȫo@VdNɬIT ;U0 +8g"V5ҡFrj,<ADrj4\AA@rj 4\2jڥF2djU)DȷC>FM 'gp;AA鰮&a 4#R#4CR37d| ,6[,5Xf ^MITb<'j&F-j$ꋒA#y4B#y!4'Bc !y%4gB#y'4.FrShFH uɅɕYWRcBrmh$01 ,77Xa >4+vua}L0(0x`sN3yנ=b-|%y` $fFє=3)@jU)բ- b5߽z謇z謇zYY'gdX?HdHͽ"DH2)EHVdѼbUl0L&u$3mw ܪ [ $fG' Fd$ R1]r"4FO,1\sEkXלqX3 4 5/EdL:z^&fOE<⟋#Mg4tٞEɓ9 `dҼbUkk ^7Hk0(0x@2{i6x`s 3yנ([#laإf 84/jO4  [":+f“ ["qa6.Na?v}}f_ޮ#kyS~e7Fl58ݾNih]<#Ny؈}OvɎ>+F͜m fv`ʋH9QDT&iPe2ZH2JITbL[VL2ggdg w 3(6g4El5`ǾʈO N}gj;| Ys#= ֊C/#4; `_3`( c5_oϏ>1h7X``Qy/KV `kVf˴RfWKIWIUvDR~zpO8Šٸv,fy:;8v6.yJ+<5YySXۊe#X6:~wF3vLQ4;fG(Ehv(Ehv͎Q4;~F]'1~Q;X#ExdH8m5 :+~fC&D)S35 Yn21}3wk+ ^5Xo \1D67 6Qmw Neί=VF{#:{8a;00HTbd&a`);,;,;,;44I*:Z0c^3Q5QϴGHT ΐGz;aLFts"zq=+ҕvMj/񿦿(baUqo"F{cBL"5f ty?1Ox6b1o2;e#ƾS!b__1;3o`"b\`A ZkkVşh^1XG_Ҽj5 y;lj0(0x- 6Q f3ּkPҼgPl5SV ljvkz͌GO :wQS皔lo5zC <=]+7TfF$ r|Y1@}vQ42HޚzC ҈AftiDҠ eMhzSDoӛ"U)ӭlsDTlk9"iPe2&$"a%I*ִ08s42Hn W46)"aD Hg25[֊A}Sot'E$ RߦEG$ 8;VbѾ6^*foELv9S9 ^>amL0(0x`sCv4WdA6IT > k.1>t IT gJ5ȳ435So_w|E#Vfk5NM#x9"iPe2=hںbHT&iPe2۝Hf\s?[kTpMҠ e30$?0ۿ1*dHd ֌4  s2j/uP:j^1Xgz Bol2x" >0f`J :A%j\2m5 bGzC ҃7F$ rBLރ7F$ 1"ep&{ʈAOEl>2"i`)3ك"ֹyHg{࢈݃"R߇_;=8"e k\g{[9wwX_15SL_DLsM~jv؇&i`²M!LD ' ĞGSQAAdj}8®]럝5뮣U88w+:w;’Aoq$"iPer RϋHtGX9+{"zQ9bqϗG{iùUX9!b[DثV5ELF>X3X#^1XǶW f25N 7 6qPGͷ7qwf v"5IJ5)OV +hNAg;cSz;Ny|9Q-og;.rWL5)>5S|@Dg[TR:+~DdK~戭?y꩝Z 77WBdήZ{F03f2^`֏Y|duٙ$3?s+c]q-Zvŵkײ+eW\W\r)1ƈш~7dpNď\s@; GFF ECވXf#DJ~RD3I3H9tƨyhB3ckb3y ,4Xdo[XF`2 Vh&VSC;i2h &Y|<.p׺܅N=nF7ǏD/]=Po []½nsvww\mq݃nr '.Ν.= .Gś.W59Ĉ k5=SEž0"q2_q_q-\yz׿p9vN]!ÐEsmQ{cš7DL/Ј M5#&}uty&biɈ8?FDfM iva[Zom& b\HZGK#Sh3~MD ?e028C1E3ŗE@?}5=kqWkyN̷җTM0m}s>?~syآDx/9829UӟTb_Wixn99mAǣVnN8Gf\L#֑x] mV6;U~hتbğ—S뚠NmhPⷠ lr3G?3| >Fehu+ֺ~K66ށaH\?V[MshᣩVo=~G-)u{vػgK~wkЋ \cko',"FG<g7ri92jK_ 1ssgitG}F%TZyh3#9_yZǟvߺ"~E:)k gXǎ/r_>c*lweU-걥2saM;4w"W2(c,9zG^HG 5mG.Dk9k[]+3FѺ)XQ MJ"jIb~dƶ7!M^p<?}?سZx9Ρ>+56bƶG{XK x5z5TňNjN4^|ZhiCj~sGk9/t8CQWƶQ]HQ,cB7XYJEW汵ZtX.< ⥓vԱ&w#o\!(;Z#syiw!\wtq>ޗ +]]宦7, wBn=᷷g3]c^H+8'o{86}9RtI'78B܊v^I)o8z5h^piiB^IpYѲҲ:b1h~|a\]roP6 nͰKnK?B|q!o}ܜ~P6; vOʶlbمV!,hɳ˖zEn{}(7s8w{?5~c.7-a]}ecZUO 󪧅y>p axc`d``bca`RĒ<)8 y1'3=c#PD3110< OP xxc`f8u18`=v>`݃?p9ckIl pmL@ ]0(XX98yxED%$edUT54ut ML-,ml]\=<}|CB#"cbZZ;'Np%._bk֭߸yӖm[wܽ0%5vG m3 ˮbX>9Ω!3k4;;sΙ3KʑwkS$6NH덌Zlfu є;j=o)M;Z ;4: !qKͺb00.?R4j˰Ѽ34@Skm!qK˦6$tUS]`*́Vy &ҷ$, b 9@HƼIJ;ㆵƑ6O'ӿZxڴ|'>3Fci4XeYQ4eY(8c\MBICHlfsl6ͦ,ɱ܌l(Ͷl(e{=˯Ïroih{w$ IOF}yy1@V-p&Ih=e2c2)(8%LlGbODu)^ejWo?Я+˿!OuDLe'A$MXRD4BA3\&DtE`/f&(yEi k󊆔_ut`Ϩͭ^J6u٧%74QxQۦ DG]=4G&d "E3B#Mp0"{45#< Y J+Q [P;MStˇhSdѐ#^EiH=̓Dј6Yɔ 'ZIcU`43pk4>gՂo:5W*͌[<fz%3iD0t[4S.% f^M\m 1oFRٜ'֤}2#Ρ[G?$GTs*:zNͱI(֍/~6<˝`{V\{cٟfSr"̞FH;.3;D@{`)i,,@ KAl:Nf;:sO4 vRmf`DAgP167;?tYQّL/B75¨+<=)-v> Rrvo,wһL _S Yb=)Dy-Ðus{{u3m_\9N73 :|/Zfh4 j˪NtP0G׻hފ$8U'kF}{k-0M Ip7^gM{M@ ҇C#5C;#R]5N饲Lf"x~ݖ_A%DSH4&QM)ؾA} n7y8҂:yǿqqqa/so?8RI˱͏nᑹl@]W3{oA7w~ud k?{]۠co >M9Qވfdn\,~b ;`f H<ÁEcT0`vXRwiΤy\ WyC>WoxvK|zaКhyC>k'~M4Z[fa?N4x\Pg% / pk lZHlUAq뙓kkY x*"„ zzS?ө| I'LV|).Lzm#)zD;3i>pݹvfO"Qy7wz\ä3 =|rrqP8})QILĉ Ima"![A:iv ,& =ʀ2l*=mNƴSd+LƓ`gz\Rv%QߖvY >wyo[gDjRGX^u1Oʙl嬟j6&*ߗDϢ OH_Xs@&]4`l A5WA3 [q`l`C躋|YR&^Niuxjj \UF%s >"+rqMZZRv„Mi5{D6Z<*]#yW @ !2gQG0yY?x\@p!ƿq%`):58L+b^/z7Yd<3m5HrAyt_ ,5O?$'Hg$oފN[L o^^+ \"u 4Q6 2E3 !DcHIeQψ^<'KѪ6Sg^~;v;̋Fv%do7M-{ؕ>OZ'g}x^LEpTaIHYiu@Xv2=]"d;qLaiq_ZGQ{]r&?|hx-axjfnhˀ]0CL9S˜564p{AF5H^[MݥPݢg/N~vhr)wto>60.2GH'^Vi\vp\d?N~nIjFn:A3ZU4_N'͔f(xlѕ)7`X 4S-lݦڀNV[cB/C x2q)>ޖO NDT9'/p'][O <@Xmy ò!?Q$OR,0sܮ!0Vkݹhx4ٱhD3eO3#ah4|`X+3c-𾿼7Ą(>ۼkVW0p^w״őNٯAvS,mWPd#0&mS.P{QG׍DnpXn_`qط~C7L,5u7*PNic'xlW/WcmSr#Z,:nq!hg'\Ĝ`& Pb&a{I}k9[AF ovaykt`㸀`y-L?}CNoN\|.? OCwdrR&cZ_L->}pD21}yVJ`8HpjwbN:580倥YO0Ȝޚ=ux?;엾R(,ү<_ʩʓ)r&gijU$ NBeq< >98>6H`ɵ hI}QDRi~܈d-IN8}=-sGqpl9% pOZRD}9>J򳇇m%TMNoK>w\,\PFѻ}]ly؏ wTR9y`` _bqӻ=1ۥר;KZ~dRLp rDQ>#jXfVI0[GɊĘMhl&y$7o8RYνRߣπP >GHftW{M5|r!14YOgUziN _0[bP+<蔠q+ćeI Ykө#f6rL,򒲡oH*78~li}RT$3`zr-J&u8^}f.|0P\>b yfNp(Bzw~0wi$߆ ڍEFlleU0w~iɘVp/_@4wKg@<,e^tk L^ß7ꇟq'zHD |˜>oybgKUqZUN+CA:lTZg߹;ΐ1%nx!LfTrpVK!>WÝ{>O\fUO>x|NJ]rMH r?;}OumG#,d`pM("azҖ:<* xOX('voL-=._}8h(u8 P ׋f;!A^f-Q䈐 $"6ņM>mq]L^IOƩʟHB"#.Ii+\|pq,G*J]:q7aH+Jmq!Fh,, 7A='qJV`Y=A G⌸< \iC0݋+Wy&*M٪{$n)MΓcS3lTN&f&ɜپW m80fBvNh|Ɣuc(յ5zPLYI/O?}jM~SX⒜ !y0: A<$% jf2$ p4 *և'ǟtt}3tt}wPb(;ᣆ,8jIKƣPO}SLtDGFW%`~#N(Kh~ꬨ>d$Az YKЄ`)!:OuNxYoDDƿMIy# 8czϏ$)]~kPOUyq&`Oc.G-.GOBҏY( C[f> \vT@"1B2(HRȯdA9hGM_9vy|3śy]ͣ]]zn^@_VaUc*;3{~u7~hUX#&̷T~~u ~]ZOWØQ5X/  *<2<.y#/XVa@A:N;X'rf%jִ_????~ǰ2 兼lhZ2FB*HKfCAD((>~JrDnv тuPD,|v3v2xBXYe?]Ft`25*.!3=׎mU~9!_/P>7JR` gAWsU[| ѴTf!WlpP*Vb 8d ΊPHk.z'v[MEY\gD|G>cVOw|W/,񵧞3)㯞oYJYtO)h_`+}Dp]Zl6(. lð=v0Z VF:nzd<5JF/!!^{ şii2pG~z,w/zFkPZ^">>^y< ^0%!Uﰂߤ%>+XYKepy6`_K#}w#wlC@SΎE|N'\ N s>]6y|xb@ƦA: hZU .GWS缜)i-Nv]}թ9O}`bneFN>2-h^> 6KU FASƪlT` < i(I+ MwZE!aAh!,ueE+`=1`v0Ǜ…$.3 쪴.r6ofοٓ/8{@)O΄xbq7R.8V{E @ 'V%2R67>˸| )^ X"m6!܆D#嬨ZDeY|*ۇwO??_P14sF #hfn^o¹')7\0!Ysz|c+L8< 7B Vߤj· pP:E0+^lVW,0-H_P)Hey~;'*l&Slqǯot uUk<('HфذXo {7cn8YnϞswBzn ~ kf0tӟzeĆ0ٙ  R0xk 5]ᣆgnycYa#ÕX|{"<هp\1%}y?o ~F?!FZ]jWzGzxp|⧫Q-j` \ ڪ1۲x.zs C4$Ĺِ({RbIN' 񞬒x5. [[b7u*-gEST_qbߑ~DEr^FX[^h8.WC.ѕl%3#{ \ 0B2QE2A3tubd|n.Wzzs9ԓYW8qiRpS쩉˄ߒ'÷` 5 M͚р=rCihnP)zV#pk^Ӎ$L$GƆy!@QR0ʻ_mgwTI9M:r\|ҫb kkj'Hzme-VچLV[^d2ב#fƁ6 Uu@QƫV>yrIpBImP%MS`,+mU`cgox0 ndfl9$XG>ajt<{(NW^#hW@lw/8Z/(W\~:i_7~EZe(Ih~\U_EsKU" I4X$_iu}o!P}+06Jf5L3g`5 9)3FEs5qTZV d.jmz1JC6Φ<C3\Iu΃Kh!IX RI:p` +"a3LdJ8EZbANG\l֒ezrpuժ:Xi7qQY*9k|&F`Q1N`k}/J4R8=lgƷLX}~l< r_ N~ ܂VBcB5.nqo ^3f"h$!I[u5J%7Xj9v@yHXo]^\8XJI+ʦ D!RǕƽTG 6-:ѸwsE±4M'=3>5U _ݳ(GM~Jr=-Q!FӃLYKX3h#(IQG>E,sD+z\%b0qvmWR\7ًTU_֣$͹Bէ,Hnd?G6DZSvk_|`k;Q;aUֆmQaY԰{&:v ".신sJD9pM4 *q%Ќ9XNʍUH4vMR YZXʤ^m0pSwņ9yc|=TIӕ+@/>C˶HUvX!&6bYB' 0.,9vO!e9NxPg E?V0 дoJCo@*ey{/,` 5;. ,3}#)̯N~cՀWs5<Sya|{T4: G_n=:GnLN oat%be)M8_9]ZJȥWDIqK+~kց  唚|^+SCC۶ц|l R˥JqRX3qpifaۅpkR_il6r5KN&nEs㽥/ZKcxWr5@L]}{X:|@#MEà2@(քE#+LN`Wk^Wk M`lH1z})Khm)ϔb2n&R, Xe*U"b0ZxBx?Ê.)~YU8֒(zTz%5--Q탹HaQn7XۏiANU3i 66h|0zjy+fU?H(QyxW hץe ^`]1pCg09|uƕ~\gte2.-(׃A, H #7``(~d)(t&U]ULET &MӰ6:0>I 2$cſNO fY4NG%Fڊ OX7e8ڕl6'fȈFZ4+&Vu2l]Z*"'KrxȌƃċ@3|X:b{5[wB,zx ]|NmrNS/hB.yh\Ρ{t@M{E\b\@ =}A$Bk}&::98u4؟APe'Ç.E^<&.TiH/<jnaE%WyS_-UBQ*Ud_#HO?Ă/S\"(٘KH΅?ԾG+o}زO~x^恃oaWE $3])5تER0AG2/j%*|HB c4xiEbؼ>/P\QPW5OQ)-7KϏKT {RG=⃹ʂsSg<$4Rݪ|qS+;&#" ۇ7xL]J@Մ|`SŻqL!C>\(j5‘,2WVBK{59Uch#l}b(gB =F7A6tsnz:"venR@I9z W`KT7%l: {EX˺ zၑѵ,ud=S ! K/ՈA""mxHHZʒ9ܟEKO+$jª{ koŻK?VF0>7*^jL%Uwr-S-(ՒGqX851}CRz/ bVik^/师+,zhZ8$:NnR 0,CUʓčO9TW/ɕR_E2/)܉{ԴCO.5ܦr+zف)Bjnōw餭[YO82f5^([jᕆ0ˆM"Sp?VojƤvDK.7Mq`Ec`*73\}m >@ sжC=`nTRI? |h!F͠s[=Z\\2tYD󦌦V "Rq8f{ji]6pOP.x@ giia] Ƈ:+cr5DLKQSlqUgW(Q 3{p=yftCIE\4" JҙDu>` g/ )ug ҉cH aڐڥ'87X='M/k݄0/kax$Лvbi9ºBKSSr ݯݖ\80c#۽uR~n0`"}ωgvV̇m1;[ϣ:FlsIyNW_?ĭLC tcϘS͔Y EP`Dm2 nq3 lXasvX( Z+EA #J^*d,:_Hy?gG.gwJ `Fo )))2Hw<;٭NU AW$џ_n+ȲMNF $@mq IkPf &!X~7 8D3;Xi\%#x/gNs]z\0#:>$ &d?ʈ}w}:(MߵWF\zzs#*#c0OCd L`Ǎ%h`#`)byi[)qa\1)6utFE1К_A뇡CljaڿBofnF!$u[x`Nc/f~ܯ.ohc mE$.27tˡ@ϊ [>R}ÇU"(haiEQ*mKR}i9/WNls7 墉=Q]`bH莁@@r;vp. d:sh}[hmpQ Zñ6v(Py_MJuRJs-81 g\8˥$xۘp_&0EGRFQ;c7OĆ֦=(ܑ =.W0/kG''F~A=_߉QoPXܡ&@e77fVR m'.| bERi f1UE%a# ?c;?v{0bCğ}th xі{ {ae30I bxb.rF( +ںɠf5> Ek:>E:X`<5V ]YiOJUQI\ KEk9EٙɱxTʲ*ҡK(X'ȋ} |ӞhR\UV j!\ІwQĽ% 9FjyRV,mb)5KK**k?$6"ݿ[֯-ت3#q̸Tվ#toh+l@ο?kn-'x*mOom[M'Dm~X&DY@Q`P Û%6camLj7Rq.}7n}2hJe uztk "ɮl& °Hhk#-dSnZE-Mq+R-y\oD)ډu*uք{fwnxsAھO#1tk.긤 Cwu$h,P4?>n]R ?l*P9M! WfST҅ W. P^3b>[@VANs&LF_q"4DXKZMPXX"j;e:-ѹŜ<`4MDۻ17wtdrw0B=N h4xIff;U&hzYyk]êt_6:=^d\S>w BϗyYDA1pyDyB1ȴnjq,.d[ qͳp3Wh1r͇֟')ha3-T>EY-^U6 둁ŽGD߾M]mNjN 5˯<jq?K 䮅Gw/Fߋa c؈s~8;ЀPk8O3b'yqM]ƑdZif&sqmC8!i.:o@-dz046 ^cTdE&]Xv~nѰe\~w@-h?:Zn/nj2gM^FY :<[8/ؙ/KN8uƱER_')6=˩L˗~ÉťTs.4j1C@.amY 308ԇpiU+~WWo\RvB4-mDlLUq|o'w,BN`!cG31fnB=FyXt%j %H-56%*1sx|m$DYyf) fw*F0^t֞=)І'Rc36v.3k,9nOMv>q=i#Xq3' uK:M7$w(&0%LMHo9 ~|ϦNN|͘wgѽ>xl:ݸKrnn{rcdFkS*kM?ʺވ6?|w 'iUXbji^[Y5xu "Fi).2LR qA)KS*VNɏ*_ 79y%PȄsD<ݛb,:2rYoE^3vX=}w7q;h[&«&q'*m߲K>oP2(B "QQ'OSsJq$STgy1'X5ZNkJ퀇yVoNٌ-GeDǰ&KEi++ZWI9=tI&S>e!j:530/Zj@kVt|ݛ揄a#Wt{[ǦNպ1YapKk4e[jggyW5\S}Wv}棎\} O[GC⻂> >;;,֤Uik*[?v&|%EBձT^JrjC$';w~l~C ҉QqEg)UNG>|:s 4j428WVttsEV>to\GI+?]ĬHQc|ّ=Sj<k nbNQ-R X}#Q5CQfX4 Ǯ]SD<9,q r+ Sm͎w0L`ڒDue'Kz\j|[yz<|v8wZgOOUC's{jfmKap"^%.?ck %qlD4ݸ^3lVL5iOV^jѹLWKdd?N!I…XWL\i_/A\ p*ϓYjPyFN޽X<)Rս,vv}iA蕣|ˊL_Pc6)u#PA^mI)fP80zE|G['ڊf - jOҥCė@٥P;:x=Sc}3C6/e5M%Ĺ]jkϬ_,jyώVD+G1=T6 5]5t\۪u>U}7+ڵ~fˎhѸ*>a(:}#¢k?`.qtu-]u]m`|v0q~h _F_hLj0ُA|K57]+XW\MϠ6\=רy6gsu%A QՇ\;X6ihQoN^],+]cWmE%v;)Zo0a}\1+2z- ^GŅ0g`a$Έ&ͦOތy~O'oqG*SNxQLSO|ƻ U@)=;? ]Ci?Q_O;uuG[J.`U<[iϵJ|:(+) aG,Oku-d2ۇ&tNW#mՄ^!J풑ubr,Ϣpzґ(]-.+--c/NqO}Mw#SOqI?~?9q7%yXµ7wPCYSgUJx< ,pnH1P(0 SR_4 o\ c 0G'3IKLGTeBqN,3-xqhJXQZr-ݺxg=F l9[:[=%phb 8gsa1 22^tFnLm!CCw֧s#ىG~g&~D8ԇԂӬ4+--j<8&Hg$g5fmi ŭ>L%Ows;rs[(hıkјE߸FOYe|7Q1ex\l<6 f`@;&V?r rM*}ZLJN8.0 i ǒi+||pSJÊa'j3TabŽ@Zlml"`yَZ"ǐ-.]I*}v͋l#v4HSe"ֈXV&LU.mڕr(>'+w1poFru=rtq  Ryj2')Z$Z aV*Q TeuQ0X{)2HS*ax]XOƮPw'aq:Ptt3c~!z8u`BcdL'|">27o9/<3~ue:zʾu  úVJ-'̄?.Ba3g_[N?|u90I yI oPq~unLz`tL\E0[e&Gb;F5Ikj{R󕭬8_-`1=}2`SÆ?Q_Ɯ7W9 7p>Ty/}Br `2lύ$,&4SkRLS3n{Zc< nZotfC)RydzPZy`JPZ$U 'Xy nr-uYFg1;v[lK)|&+IǶjUNT얐VXWmaklq5kH4,S AVl'=FI@  ʂG<%:P*!D2 IFF77GZ wz\8ci m3}S!puΐ:qB;L&.q_vw!i~0浟.P)r erzduBw͗#k(2s|W!_sw76E*s%1g:Sul;7806oH|i1Y% Mܲ7Ԙc?1ݦ)+$`zT{4t=[ Տ`VՏ`I:lӕ'QĆ0w ׀~hq:mkw4wjT[g:+d,_Ǽ@acG|yP܃[ZeqO} ]!K1Y*y݇4_F8gq1S*U1s*k|rd8%> p%48q5ߌW6.v+ jQ#U{g72`|a,P~،rP(Ke9.R9J">.&-_na95ʰaA8ŅYlL*ۑD0Ck [|>\IQY{Z7^{;h" c>*ʱFLʗEouUt/e|{zuJ#w47 ¥[Et9gOWsݽ}bnϫH5=]6=]?|OW_TG[wZmOkocgRHe5sgL(w<3OexM}DUa.,BBm-.d !M蕤ݴ =6mHwT7J{=Hu$}2 B~iٻs;#K~hb!l62%I*$<::mϤ g[1W:?e[ξs?;\x2'\Cۆ')/5wчdc_/IȬtq$Grp4ALtкra мWF22wX bZiϬoׅQxdZlKjl?lK0l'>Rҷ-ҵF\A g}m1oV4R4Ȩh}8]6ع؅A]T^`L}k{}ʘ_FcYЈ hD7"D?h:a(zt& Mw0djiTxaW c`1k$Ap1莢с.vD+&R5DWwtPEPf*n; ?٫Kkƃ;\k룅rUy+c`]TZ9#;,,Is 5uYbh( 5F%&-N(<;|'nӗUSW!a%VI|n3qzV_Zp&BRek vWeXXg-PsD*GrRD:^y%ooc.a>!t{ GE~Ht sqKx~&2]ʀ {ww3gQh/Mqr)V'`!ZlW s.87VPR9\xS[ ZX[k1Wqb}K{c(yuH8:}h j OLtOڑ}ndpll2]vc,==%?sn!밫͏rKkhi-il34v hlIzƖMR"#J$nQ_V!A>$#~Tċ3@] `!܏. ʐОs27I[ѕl": bLK!WUjPՔpx\Us0.h?;GoZx>jIA3@3Qaa @/@Vxz=ҀY[/zI`;No S!ܚ̂'='wƲѽKexk}B{uRo>v賈IJ~xu?{D]cWadb(z.8dݸeM`WE臆}V9'{tٴrRG 6]v\chOtÈmwa0%kq]RYPVr1T8U"{ԭA`pC?;lx Sy3W΋U94 ő[ЈdԢKMq?qQj ҲIPZ7Wu6~BSk1y Lޚߝc#ds )8lvPߠd00gl4J\ VF1p?9sxG|x|Vw b>cw}Y:8C+2aIGy^ȞI>: sEv=쑸LcYgҭ`BTI+j?$$t8@O-1w{F|C':S{\mJ_DBjlf8sS(J7S|Ptj*=&m:Cz7KݳNsT~A*A{V*md^Yܷ2_M]7}xy zC[x}?ryE\}5֪BJEnBnߟn0Yվ_Ȧ'R#ww0Xj|b nR@nˆj!:]n ;K`(wG$.«Ǐ/w=N'~Ŏ/ZD]nbKRWPV)Lܵ~|50wGcXpLSkock,Nf% 0ɼI` pzɼ Sx'IxC]lg@JbRoQ 0FrN*[|TDrӘ"t0e'MgNk;[Q>'k.^6hl M>yhL?Qq݅s_=<~s(ǚۮ+L'B;v aዟ#5{zO:BJ2EZ"( p "z;JW현aْTs2`QgQ{/P|o}Xށ w[r/+/+weoOo8U;\?? 6J1P *U.ڎU UC(U?^jO 4\c1F! !cflFhdڙe=C͠ʪyy\ؓ>Z:SYd6_ޡβvU ܐ9D,sI3vR^GC!c6H?ŧRxc``Ё:-LBL1`Q``9jzMm .)">bp=v.aegWw_75lV s _"#%zGC%#$BEny#+ v +)(RSRަ"2Kj5< ܣ>IINCCKKkvv6Gtoѿabeba$i s>& -9-V|V!V^YXﳩem;bc?a'.gM.f.\׸uxyNrzcη),'qO')  y+lWx\DTīHpZ]7"ED%DM,J\gw#-OEoBxc`d``xPL @,A&xڵVnU>Cq!FlJQhiwi"T=c;xƚ!<k,Ab,bw{=3 @gν"%Mؼ.M5<Ϧ.C}}Q;^گgG1R{:ysT0ч+J2+fEJHjW=Kd JSu`u@쀐H~c.k*g9 K~q֨2[G2P홇<33r7d_ XnޯZwzgtU56簑 sÄa{>` b" sj]Rn2nwqut;|v*u }dx\`k9'flqd>r_vsw4 ƅyK#r3"<<Xx!|у>vӤB}KWs׫LEq0̺(|gy!3qoyj-Vaz[(c)SN9]y ߈#v̲w7gX>fXv=2 ]IQśecj9gbi}NL%Id쏡}RD;Ӂt3]J7Ӄ7}K?4t \PL џ dP(JL1dX1 LdT1d\1*ql`䞭e8 a'=l6$Ü?1{e G5>ycO~~DW&EY ,MYrV𙕬լe 8zֱ|;i<7x;K$J$KJKdJrK\.8-H.%O@ kn p}PӴ KTPe4.[Q+K󼖺ڠ?j X%ôp-孚>kҥtcDNxEλ`~Z=Z=J .bj`][  V-k!nU_0ՐL/5k劌 A0b 4 0K X 8sF p3Fh|!.^jZOv @bf10NS0I30=(lcE| c\S:Zimages-actives-html5.git/src/share/fonts/yanonekaffeesatz-thin-webfont.eot000066400000000000000000001357731250410645000272770ustar00rootroot00000000000000LPK @ i},Yanone Kaffeesatz ThinRegularVersion 1.002<Yanone Kaffeesatz Thin RegularBSGP KQxZgicyR&c4o4Fw[Λ I\RY:5r+U, PJQ'%p G24P|pr;@9sBUٜCABaVw= s!:muV|B @ׁc BL棉xB}82k zJy鼖5Y/,4-`eo'zw O,P1T07I_,3Y@Pϡ !@ gdm _kUeJά' I {0IA0F uXXnlYf4I%݋m{H-Xt:pD1ɔ)#HHњ_e sڎE&?)gS{̀*" g3a2e p|5O $LQK@4JK3%r!q؊@ۃ\:0&02/ڻ/EʀA'z!K D]cEPyE/nnie74w@'ICWڼoh32ϡ9ΐ.zF$~01[0s!xu)%6d_ 1) 8ћX5M;;N#Mi@4#J#Dd鯗xfTxd$Y)VBc@,{d"#} Q? G}U{ RE]X!eSO7QZGy^c00H3~;m駫PIf(1CLG(UBXR*I6o[qq%u?W'Ѕ2joVM#ϠJlɕf.S̃VBq+/8fDOyzoR̠MJ@*7GHb f3JQH AR[Nv{UJ7hYQ=W{Y-GaоnIZ $ ZtXeN R K"!"RĚ7i@VhwhpIg3%E$ko-MևM_\vl4>XYAg <೤DN4ƿ dJ㞐`ՋM`9;ˑӭ̥RۼKm4u`vCaY+ WEDZI^ ESSzZykQ [] 6tBD} hуA!c;P!d3J])x@-LUlj| x+*)39b+%!ofӵ=C8eL`$yY<<@rQΐ t9̫<Dfu Hq]10 9΍ٲ6]4R0. )b^˽SV~QT !"v$_ә[{ |K7)εJ8O>x\*wy<:fͩ.#6(]PԖLֲJw ^o(z +BH*!K,Ƚ 1BϟEӡc$TZJCEڂܺ@DSt0NV86{rPj0g+3{v`CJ5Ajfj)-IIKUqa44tM Z Į]ʻar|Hf޾ZOߔO:9MTA NL:Oc7OOf'\i:ۄ7N1a; 9(ɼFMdDO5y4">>oQޗÌBc+(QT ۬80LwA*)􆝠<  :h{0Fay6X**TJJ]"zUqnjBTcqTAOIn#`TH(Eߥ9VѼ/P@/y le_SR5(>v #b/ b+* qx-q9@AHKI8.5օ9IH_%v>S]%LL0N#MT"(&% <H{)hD3FtrQQ F*FZ4X [s۱89|`IL*3 *ҡ*aha ΂%l_¿xF@6 yd,$B]㹦!X'ai6o}'OXC$.vbs2II+LԬǓ, 2`,p% {AP%$J@? e$$ v '\ h?WKl`4k`RΏ[Ǖ $ .3 Ӧ,/g 3&` "Ww!4V fȗd49X`zY1! a?S7%8 !z :Ն` ٓA3e~/b8/ -J~Gbs *<9 LZOV'3U /e$a%{uUCvB uCAa d_&x(x6O=q)O'qs-0,"Uw;Atfz -eD0Uj]A&,ff}~,'KG[pv Y՞>8b%ak.} V`y&xU@śH%ʟv/PxLs9U8}̎tcs (G( Əu2ińh@fk >/# zHazt(tCBg v@".H!"@CC)M\ 0QR^wE$S2mKL]v|iF,ǫţTa|4 v=}Fٜ5|Sp ͂y8`WN >!(F$2f$$k@,`,AG1"sIiޠ+$# 􈯔 evp>%] chCIG M7-3Eh w&mJm1H)eCbC8uІxK |Cl.#=;H$Gf4hL"YMBe9(-$O8Jq8ެlNP+w4 {Y $6A;Cȅ Rɏ;mI*m=$ۉlPb~N9UuVy1Լȅ65 ga5ڸ ȁ)]S0E/F`B+ 8m`ő \lSh"ȭ@آ  IdiWB: Di Kêսh!3hBE=0#05="t%P`IR$GjtH5RhGt,}ijX8_Iy\*=1븅Qm#Fde!tp$Dc ! 1ϡM|+4l Fex3s㬁# IC0}&wC\oIEz[V0 eQ(/zF+A 3Z* HLn/H3Fi͝;"b dX)/ѲTu^҂$eC #qDM'jz @D2w ?#HGG 6|QJOAz$j12l4?"Үux! xݑBv]Hk8 ezpnb#p HQ5cK eZ!1Sf!220rb1zuslA["UxuRnaX,F17Vp PXAi}xCxNś"HGWdeCDtP~H[x.1Ljaxx\~v68=Ck ;>`d4w\h/D¸s:*2w;CS?)P)W4"`|AY@@a.T@ тzڡ{K1EJ i^pe!Nqrz @ј/tgU+A ghepjU3/ {T_ (C/53\NX =Gc>GtZ*RDo3(3(K-H9n2E1óB6oTF}-Nl6 7g&|($&4ӆ-Mpt]"x[LaS<*[G]96Ⱥ͔+t$knWAT}3l&w]&F*_zNDm\˗CP뻕mAnݞ]"#B\CKZ>uDC%.λLa#S#_$q句4#IGfӒ4m9[qt+(hVхZ{ŎÐU^ KO9,l"gP˟fz?[Ξ>x\*v1-v{DwPF +#GɎ]f@Fzd+2?+~0,F1 1 T *Pꊄ qHn". ,)T?ˈ*#^ XŤUTTi佑&/T؉,+h,5iDnC}(S G}(|pJjMj6!7y MDt!̈ڴDFWN2JPlo&u57f9CCHr)*7)l#%6xv ,7m;2" k?3W%)#ɿHCSiÄN?>|{تX,:U3rd`".FN@FF8=h6U & '\9A`aqBWaV0*>U ` _xC #v<+ճV!Z?&]~^M:/.t~^ bVLb̃bAU`4*I. ڣ. ڢD{TЩ^$4,k 4,ok X(I"k& wJ% kL%%Ip`\.$ה$^^ ^ȴKN^#)z:KSaT>R:Ҕjӥ('Z ęӘad2KB4aE1X$ )&P6@t`x<ML 7)O` {'zY`;Y}&,暷kNiTX}+O_7iU_hSziҁM)ĽS gN8ft^=2efTyp:4Liy'h2EWEP%pgopYM=+؊gtQ]QHv"좊ҊòZ+ntWZZQ\9 .QvE[XRP.y5(AUx#D@E= \hNHx_4Y˿!tx)@q pYEG+~oT`< ~@GLX J769Ԗm2q\gfFx>S|M20?<(O;' 9xo5\JvG崅F ҟF!ciro,.;!Ƚ!v3Ȱ$$tL"v  TF:Qst SL:1Ȇ:ő Zp1>ss"}@"+`QbM(7vc d{P@'zlNF dsMMp PM}p `"t*xH_D8_3p|ޑ;*]=gf^8gg={3^2gg@ɇuh0zL:t0at]0 t0*4 tt bHbyEE\(˖%,cuP,~QCX(w(yu d0n*TaYj܁֬!S3ڞ1 cA69q Ccq69q~lr|lrA21|lf80H@XlfS.,63)C>fe>fe?F3UA9SPlf XSleORn>PÙN:jTҀ`5*( !ʧHUL!TV0UH!^BU!M|qbM!rHp܋:hbn[j0ߞaHpߖp8o08_JiW4 Ά"hbLgU I41&hbZe6#L !zZ Qa-C [AkLMalcCbCCx2 -AhzZ%ɨ]r\ g ֑^eŃ3HFpiZ爧^˨]@ uDẂbFpA7P^ 0lܑu˨"g GQD&]E8n -L&pF`(20uQem3Fmephu#8n@),&&YI|?Ეг8lY6Rg e!&pHI6R! 3EJڊIR$q 3_L᪗Ѓ8jXA5Rg TU+pK0s8joiRg W*?3@^eWLO$ʯ|ڙU|4ʯL' 2r*i#Ux^&Ux2ƃѰy7(U pyywLU_Ļ+eW.i_YwؙUKeW.S*wH˿D]*ywUAeq"LA:UښEVXEjIZv"].i[vȑIlE*R(iVHʴD-U#R8uhZ4u!&"KʴDSwcKZEUQ'DړĊ$Ԑ(6" $$$Ԓ$Q$֤ƑD&I1$Q&d"6CD٘ECDq"Y4&[35"di(fbE:(f"5$&$Q5fD0L$Q0f"CD٘ECDQ"YEvޤQ7fDٛĊ&(6f"iQ4fƑDٳ6M$Q6f"CF3hFPьŘ[Q141mH,I"locu;R&Ecc)LJ%`PF01bNLPc s(InMȠ@&RL "iJ& 4Њ& 4M0iM&&Ěhr&i4I" M$M69g4xMB1&IměĜwbNc263$4c^$>bNcKtĜOĜo鉣n=hoP]1'&t& 1DTI6D"zKLAbOQ+ .Xv5M>0>i1i 1i [4aCMu8ĚC$E qylbM#$:X3ID9%$zĜSrAL 0'$'9!SrBަ0'$CrO!Hɘfi 0O&`WAL3Oʁ>x4Yfi0v<M aX07'pyRyzgGHj"'I#H r9Q  " "IHX$][@5$z2@7VD5* #ֈIğ [I3O$5%ĒAZI$ĒMf{2Iuğ{[IMW|8}}LINO$kLL$IZf8gY̓Vָj,f\׷Y$ \I ēZI ēZ\I1 #ٓB]&-d{2MzI=&8ofIZi\I4ĐZm<\I Qhb){Z8 E FE'mm%^L=o28]r퍎+lb8]c ⧶8_VЅ=cAW.xvO(;iSb֕=pv1 Ŕ,=Iiҥ$) Bu@iZ.Ԇ@X B1pFu \P. EjV:-C%pA7}BXpAp X bKUH#mp`\z]yE2 s@6J9w cA_JR, ;A`S)kpEpoBn:DZ E!pI< ␸;N X8DąhXh#!pG{p(i"/`J\Y YHRLR[)jzgH>UY%t00RQH\zEmp 쯬upj!i!p@w4&n%>K0O% fu%@EHR}ڀX}s2!pR5238IzJҡ$=%>TZgeVNaaeaaFJ9QLD'gIx0_MGRPYih%s}t沥{> vev0L4kboLo$m& º  Uy&a0&  Mc00L06T  BaY(L*6\ F|y|~ww_ <}G8D"$}7# 7;Ͼn'|O'xCϼnϼn/xOxCϼn;ϼnϸn7qy øx<^}spXϬnXXϬnϬnTݏ-u,kpx*smJ*yTP^}BjpV2h0}2i?ds-͒x>"}2Fd?dړ8ґ2DO=oBm4eӔ/%Uv_H$cϤHϤh?ϤHsrs$q4;Ϡh6w@>y|B|C|Ay~$+ϞHSϚHP$.$ ώHώH$$$M$!!;!;$3ςB0wπl|>W6@62o|>3LO?b|ɎL?e?|>.L/?a?z{+to I'?T'^~iyeןfμC6: '^e O:#3c)FןO?PBxAB} $o?PmBcF5Ϸ_hF}B7BB uH ]}}24[UdnUdjU¾26Udl UdloW5_fF㪺̋BlV,ȍ?U}.)6$R<9VVWA;8ijU^mWxZ|K(B]`G&ou 8U:4ۮv~.B}G"^j'6ȜmWՑ8(aA*8+#_Vf}Yv;bs$uYuYUdL4嚫D@΃Djj#M#B"dDo5YYZwt 5Y&'zDrj##uQuQ5F`tU(ɮ0Y&MuQ ">uQuQNꩂz-2k0 "=3YT溨>~uu/YPLtf>uV"fcb''6YyJCpuQ-2}el4$ dA+*"خ"++tV^cuc7q@1YY_26clVS"s]aP?C$Tخ8 $V V^`0EeǧH5 686Vքe5N##]RGбYGiYyHz1+$z<;#Ge?_~6++VVf\V^k1H: G|b:| FNG]ξ-M2LLӻ{Kd;`_{WԥXM"/lXg1cM"벆XMDŏ577 C{z XMikB,|c%H !c.2\^c 3@|tc e7M>ܱc$\&5Ёp)u`Cqpf,\FWKe%7Tn,|Xʌ:EV>1liĬd*beVUȱͺڱ2qV>|4V>y1p#^|LcVtJ*|҅x?I4g9qci8C,|.lcxa9ShXƊr4P8~HƍdtQGBG4o;hj6ʒ>vm|BHƄ# 3"&.+$e՛H<#Kmv(v nyұ7|Q4nT,(;uMͥ#6!p |H#4,EZƣo ##j;uQ#j%{&,b%HGH~؉[Hy!e?7Rq n,TK"]q$-#E7yƲ$#8F9FtHݪG>4H*G>$|1#M0|H#y&1ϣӌq0 8qSa?|>a008?|00q08ӏҜ|0C֩DypXq7Mʼ*q?gD G8Cne J}`W8"3\U׾FN@U (j0`Z cP%ޛ"ꤲjcݭWaTo[dS"AOL@T4_Ínzw^cѷ٭,{9DXH|4 `gsҋg"r<`|Q0IxH~]%7bRCZ5 "c'q13 KS瑕HۙS"qqd[>g8Ɍڜ|#dFvsȎo)Rmhq<7qbLy#|Gq 1\i^%}[(G+rVB&_m;3ONofh 6Z$vp 掺u׿CƵ5sNqCLƕE0:-=Li )Vk8從!iqEg W}Xt 2@ɴS{B8M=E64d2@M4:ҩG\yzn V" !^7yg ݛ|*`Ptp2P9,@\%KyYPm*~P^ZdR7q^֯{w9j!^bKsqqU}Z6p>à Y+#l@.gHKJ@YrlDBN/gC *z!?)oe{%tRoQi^a>rʵ7P(@\9 P*[(bn ~J9VN nwDDD$yM: zDy _JD$]F F;t0N5|9l'PQKs?[ZfJ"i3爙"))8+$HEpթ'9|e\BAUз-~0{ d*k'x1EJG&!P)1)"<6 @N@DYj`/d } &IhINKe9(NS[XX8㯙3+V)uV'ƈ5':'l>b¯V("~t܌Z> 8/q\OPXPn)PDž|sF-#M驅2!JWE͢T8r39`!W 861dֹ}Qd*1{4~fH,\5_c%tUޙFf]  0&KmΑbT $1iF?ZIK ޤc w?~l `ͶT>wnTX]o - faU]vTe:14{3lc$mLtȱe:jwNAxwmܖlff*b4DE+mi /HlV_WB~ 0/ ҭWt9)H:z*ʣ | B/" U+CL/#>) hOơÐ]ޙ@aUaC`@' p%( f iT K<K{x$ޡ5:Kfq|T]+]E! =䄪N% l_800V)$AG(-A>IFx eWR!B %JEeS:ZM6K, LUOr;0A%c"R8^^añ&HP3N? _\mP_nTGGs>.!u܃rLP6ķ&r˦rCV)jc-Ϝl}q;L+X.Të'0G:s;vpQs[ ;=AU`n5NvJ{EΣ1C`2~q7†ɛqHa:<=tU>8Yqd2Hvjypeps H+71q1*'joofD`8puG"-$vٔ7Hz1sAc|y? {􏼯7g<0 &;^G  wW<8ZzN*2s53'[:2:53鎛)Iwj1I042&iSZe&)$,u>R@4y"VA#Khx7a ̲U%ÖF8ƿƤ GPǻ=Zyx_.|h(uc7_0:_E*ds) a%Nwl 0h>-؀|ma#SD 4oY:o2` MVN޳;C5wZ9~yI{$V zݖd[Rx$`Ty7oeϜ~VJw<g5N&&%Z/?eRT H C#Ig8WF"Up;{m;AJ$H2p@zWKF=n\ԴfZLo2?%xX6bkįOgZ,RN^1bMt4B~ <1&vwPP)tB\h4HQJ AI!$ˢ3T$T6BAr!Ý`"{",ĽX}r+zuJXGg:?#l U',utBtഩÄovM"B;_QUԂ=Qd{u5&~p-$jm8߷}d4p_4 0 *}LG1)/5_1M+׬*3acf-;G;TPkRJi6=Q`MD)}:Hhx U™??jmmq(+4*h|ߌE6z BACG{S玩j@?md9Jx(. @*ZkԉCڄ|s@Z6LKw^xٶe%Y8D7aL'+SS|RH3DMج@4 =3^dLBt@@EfZؠ QQ@@;-=4VmsBGx _UuQԅ]v_;$स\6{V:*#Ar)uW#e\zg_נh_ϸS^'B)XO^* -~<mawA`0/ B0CkmDog4o k]Y)9zH}3Qkp+bM8&P$V#vNH3ʹL=B)ep@15- 5 zHժs P=ء2VmC[xw4HɸHfVېr}VJӀ8yBӃCzLmd>e,n ]!t,¥5!` r{[Uր |L%VOaX k" A\i&3d F8Gs 4[;/aM?L'n r>0evW8U5Fh1a CguR)|prc]EelsmR N 5 )CAPXg4O dIޡa2ʀK0a12  s2p!+#I<5&NUi4[8z~ehvZ b}hD(yފvNTnEmy y8 ?3Y<)\ ,QU2{l})PvC6'{N-ts.3A 'A _c2PI8 u@#8 J%@ Zk`*WbI^aPۄ-l?0<,;0e##* 8>H WYQhu⾚0VmΓj<Iڧ)x6PAőXEEP-۵ap,0(Cx0 Bpoh! ͘ &xxgZ*<%45Lem+# X W5Vqae14٢/I@%ǚFU`gC jjbMe2Q6>:B}9[ "b-'Hkc<1aE^GTC"zF Auzj,Pm!OF.8O6BRQ`1%jN(oX2U,tRT DLL{4$2E\I6ld"vlN b󂕑0fYv$ <O-m62:AW%,n2е' hw{Fu (8S̢Lm>Šx2fED=Ґ*#/?  .zQDkc)da֔8ܯyy^n<>MmSavrĩ>9WZ*!qM8j {-zV}d&y">zFHAaqIhZ6:!,rWVBQP`SP#Hnfx#A%]6׈CL0{C d*u l$/| ,؄3f@Ι%Q'x!,RL /Z ]^ %wsw?gp8H11Ydv: )U ^AY Ƹ>… s[ڇC>q =_~,cID]+l{&lOrC WpLLCJ,Ѕ?LU6arVa~Yu.C;_sAaLu:g Fb 12~)o]_ LYq-.UWRil,{;Ɔa(Ա[=/4nkb!kׅd"|q<41\rhgmbNzZQXyb:$s'ȵF e27 A0/֎6nW6+wه峱at:[q)_3瀤I*li #kd+;+$^PXvgfF؆OE/vULo*F}+>H}(PpUPr9CuztOÔ}A{Yrv^eLb$ńn*?)CQ AД 34)X}ǷGKMF($7r""v蝇&$( g?p31\fUP {yK(e(l2_LMdwm%$Y3hq/ Fx~4̿8܏2 >/ ׌͇znnю/=34,&LH}w&vD$_ʹK4,\$VMOIO) |N󂒗-ϛF> $w_kKw;ɖyf$; ' &Gh-ߤEF֢N5@ZW{D<1WYle "jgH~ q=헀_licH*GZ><+q))":`Q鮶"=U=a'^ 4J;<2&5F-~@|5xKy?ys!rϥpm-Oо&D 䠿b,3CMGTc$6|@&|e"@Rʷf%XJdA} 1CB0R*q aNdYQ 4%I%  گV TDU"/a@ZCĊs@!|dh́8D(ȭk[Jy2DPf%^ ++U"8!sbgPCPWyPN.k=s#"\h^Gt81D>- e-I6 [8b{R'$y;%NxRDa$؎FXpqxh7gJcp; 61_!bfB4^9ᛡ8.zʫ"< r#ݕ " AǙgd9U阳Wn-385!%lk}F]ؖsGP(=l1 Eѻt[Yސ fQ4G,!9f-PLM/ʑ$LU Q6@I>b (D#=!3M32^se#ȞHuP 1eց%X`%l+rT[%$K(`܅ZS)S&yfy/OA^g"6zReY?,2#+J-H']b窏ASeǂsP6q0{[ވK].c4},JHcU)6-nKKܚ Fib %&cApCD!)-LY!v*P[4 Ȫo!ͦ$q!I.VzFb=(Lkaw+޺舰nxb]w^JBDw 'p{)$MNlәn]3@6_؝RT.಄F*3I\ ;VRY+^J~(fY lPVjނj CQ03 5|?b &(Ngˢ2Xp&iDtJ\BA6 A:ؽ ]Bwtm sIg@#D֓Ȅ)[`q 2j]Pɘv#6\2՟b!N %tz4)e').o&"R]Ikg-|xM`דE{7ٕ:_U["P/cxCV~ DKZW0F̴n {r7Q(pӓJl&8tI@F:d'c&KRDL/jނ%(<\)(|r@Rj5hE][=gT N k'dU1FI2@1CQ$y(z:!KXw!cʼn15 hMR d:\OI`ɔU2/E` #(Gxz,Z!D%y%24ȾG9t@KSᨉXolL?|)`E7YOE@Dȇ,_S^Bs-#!0`ZI iXbR.)%GL 9]ɁMdp\d$(Vad*0Ē |M90й$JRJc 0π R+<9ZNJ5#/4Z*dpa(# 7[(vfx4Qt U_> 'Xn]X(* }SLDoGL@P^|]a 3Ri5(B[̨s[9.w) =Qqhbx5wFMB?Rp"13",r0[ ȳu!%B_tIl5R@JCI*)IBrdqL+Rr4>q ,(AbA$gx =┠NAܹ"XhKij߳G!R='W[Bfdr^Q[{^3aYP#( az{G{JoX!d4DK T/o\ 8BaRUGQ %Ŷ$c9坊э0j@hU޵thuuHq0T%}7lF|#*~*ET 8 R`qۍg AJH08P܌nh KxeLdͧQՈEV9_.k3hS")aԊِK$UJm'`.X .?JZͨC [/a 9=e_ @aS3~i0TpqY$Y^+{7 "_%isC9m@xw:2*P.||+ĩn1KT3`B Đ[MP-fV.,zx-jP .a0,[6{7ب*CQah$*!Pzͻ+"f4=jP u4Wfڹ 4(JЇğ+(Lu=D&>u=Ԋ=rzv0 (v+^wY^sPhD +@[ \? X܀1nL5apgPN^&^E9}zw ]!k9 }1 9P;4(|Ba`^?#A`2=d%-jpcWˢ!1.1:i4j5j/LgۯpC/7BC]Y1|Мc5+s2To7t(MSr&Ƽ$üW95!]3$#%ΰ}puiI pIXe%-Nh#Nõiz0 dV*(ղ1ʼn3?E#:^L'R6AkgKV> OFdك -F #گCEj4Jq Q=Y[t<1# RfCL0M0#Ȯg4YS,ڽs[ÞUğ+2Ú5J_S,g:',K`2ᐛçiŒ ӎ.,KOBQH1Q)y"?YrkY-HxarƖW좠izvޡnމQ=ӢW&gXrhCv7 {eaf䢻X"(L;RGdɈ~oAna"C؏͈=3z =cן~NtH?!~ DmOػiQm(?%:G.kg:YD'Gޝ8Jle8FLiR6RP W~ٴ%Q>$mޑ@$y,miE})t*u+Gm3MK4bm1k `4ffVEfg+F.23RiPd~r4ɸA $Mfi&ޛtmja7D z,?rK* sF/F֯R6Nm.ZwCk#=Y _UCZӖ}Z魸PItXWqUMeF{Rb7׫6b┥I[;ulqI'18=q$98BBHBEQy}~SZq"Vg*0XVҮB1 /TܠljZo8 B1^fYM5)H|X-tJ GS)q[^Q:b_uoܚro/-UbS~XgPg+=+0Aqq?xeula< r5^,d?t)!%b, Y~Im-|P&މ1_KE)M0PҨ,l"|I3%xK0\2nV|L:8}Ua"{@8}fϰ DóϘ 7c&Y=إʩ~շ=_I :L%s $%ӗڬL/Ss <1L1ifԁ8c.6ip>}GZz)gwS70s ׁWGax^fʱN-OZ,N)2/9ykt-Xk,_,*4(ʠ0򌥊gsR@ m,𝘟i'yJ pX, >Nu.jC2HLDX596<w2W/9,IFQ_25_g뱧j'x!tO'3`nl0[<;\ ff Pm xqٝ'gSaL˦UyK< 1nRT(o xJ𛋈=S9b?+%'PT'D˕jـIA*r.X,=P^̐vg(vgOL,zWL"͝R Gv<d@0]FvɘCs _{ÛZ~M#6EOLay}s!+2U[:xyCL%uL< ߲[ߞRUӇ׶W!t KJA[nŠp$ 3z U$T~t y9kse +r.`Ȥf%Bmt4Em4K+*:2O Y\>ڰ+Xг3BY< êik$ 7P0}](Ɍl`8+F♣9-}RR}8|D]5ȰMR{hEsp.wrAy$q Ȑ>n- yg)0u"6tLDЍN=i_= c [zcMlc!/R2-aEx> Qq.d"%.Pf(ۻDs3 Ū<_jtŗj: t} <'(V} ]; 0Aj~s9}us2qe:fXؗxE \sdlED0yow3,.Q @ P)e( ѥիh9 Btč4۩"Jiy4YIFg*{s?*3PЖ?keQ@~aokSkd&4Mq8Hsf4+]>EɀKdōQh7DohNhfx 7&IKgHFnƁ e%84 .87 ۀBFW)eQE:ןɹDRcRw irN;-WZh f Z9Lh(#(hy ܔ:Dm'wM4 OfKC#X`@}3KK}FG(OhJX}>dm<T ֛j "EY82YLRdjD;CP54E1kB25울GL1fKuB5۩@1o7X)'-+Fw]#OvcAqJ*߮#D_|'=D]CiId63Cfov0/SB71X*>XARQ N&8&G-p`&8A!M<_/[JB$oFnh"#P͂T PP @2F*>p*M 7ʇ7N5 0% 9A&1+ @.\}Ms!{e@^V=+X2+ÏxV*2 tއ#9叮@]2HT^8 2NRhnHtȅxn&g,# ᫍaɷ)ù +]']G"쌎MgHy'iإ9hD@iWZ ɉ|`= WqejVc8`-߈U$8{ p:ND^W5?Ax:7Pv ທQ7Xx 7ȍo!+~ނ'J6 j}S '@$ItEw?^;I2АBRѴDa}@,E3!(fOF! ]5h!'j릷ٱKzë;VF@09eBɁC UHzW(AJ/>1],;84_([-6 ih0#H;CiX(&r4Mdfg[(`f::#F2mHM"P!'G3^d CaK{3 @A%<v'{%_]Bdv ^>ȗ^oZn(EKDE+/'! þL#H'BiqcMsk:#װGS\I>di,xRYvXlWS)6U(cVu E#ЈR} |4`SO@)Y?}0 X r?kl9é͠#6T#);~"`ƀJd%E$Ho{VDG)V3<4('/{c sVQu{ZP=A4adL  eh{f4g M#5iT;dn_qEN PYn$ֹ +)?INR  )''IU)^aPzU) cb~,Mx ר z]kd)5Wweʸ=, VZڔ93zcKfA.VmxC>E`ܶN0; U׮\-?$"ЧA` h[*:KЗL NJV(h`"`UuC`Oрlg?r' PG1051`I47)Ս7`xxį)(`*$rBqAȈ X-rS֘R'C. x1Vdy|$` zRgpsD˭@w)`[)'; zKZm@]\> _db,rFe [(%J ->dQ8ל˗˓cGiWSѐҔ@/(jN8ؗ$N2- !|P'l$Ӎ'iBrKP` ާۋTph6 hҿnEs34N=waFOL3 g1rO:#,Θ|cO(M;%s琁ˏ$Lb% eױJd#!`KW_vP`/ QаN z_(&+034pĂƣ27eHh>KNԸ!/AuƘRFT) '8qqCp83 ً>'Rv77!r_W|M_2+JU\:VG4ΫBpv#jjC .% W+J1zn$B 5awl[u.3;BPX9 y5qhBpZ@N$>Q8Ag4#ZnZ&s H)sH̖핋FP?j 'C$TN!5@:D<٬ekWϔ/%Ѵ&f4Dۗ8 -U]I3u4jj%M<vȎE2$ٴLszGhn>[|_~o^2e@K4E~i$|a0c͠.ŌdhWǠ/4 QЪI:)5q h9G  Y`N5oUZЙBAQNAx+P &5KRf(贎3%Wsy$ L:ѹ0=ChuZ~@ SDKULtfl7"IH&L .΍/AʣN8gƉIJ5ڲk7O,竂:`)P{q?B`j ͛# rrj>VYXҾ$wk-Mh= A]3J贈iRg^d֙TF w$ݥ ݒ|Ă툥( BC,Z҉EH5"CoY6$S 2:4iH !мH~n~cmߒ!DjJοHɘw6z\Pz; }d,8l͕oMۧwr_C40^rN5e">$oYR vlDXK}Ō|(zA)~D1 C˪B1KYJڣ~q ঩&Q~&}EV\LGuG3@u.`K:[ e=$i#цD=A#AI"yާeg;ASl0hи=&>`X-Lu,/-|@Ч9Y{٣/]Uzzf.DB7e"pdDhX Q2Fx)8A4f"#1^7O =*>a!!bS f |*d\ ޸"3x ئr+HҢ)Mؐ 2M+T&aR ?Qum]+)F>xfTӱ6E&D[ }4 `+(U ,ʒbRz䎆F_X4Z\@ի }6ʁ  Kh =?ER%4K'.m-Q6> BZ^2B5ְE 0Nh=Ybkbo@l$vؖ:fQȢ-8XSʲId<Oovˑ "]qZKd>Q:rv48[P#]Xf cv!"7"G{L:x `SDY vheHBçk njdGN QaL̶!jG<܄Jڔr= fs7VԭsTT2P,`j՜ m6T~_XBPڑL8o*xO?+Kդ4Y} \ \;\Xpyxex}"[6?sf.D'fi\@ڳ@A 0+h{&vԎ>5p=+BP *b2G{.Ū}}rNG:, b΍mæFgIÇXag!jz`,I-3 qUC O[N"G!+%"d3)fq8}V{ĶdhήG FanCKruDUijKS] b$]o&bTL0zͩqbts%kdd,f,:.Kܹ §l`Of?0b_,? 67FP3<H+IqߙDT"h1>xYņHVK C-B0Q\xa17F ,RK`}掏b?NсDH&7 CV+@B:7Y}x! e%'e3x0]RE6% &A6tSD4YHHrqaBu}ī[7@] EM$W!1"rJ1]?9@p/|-G;vS84% :G|j2zK_lˆ_4CVzDF[֗k%Ӓl WtVǖר388f%ͳl3.˲R8#1oq`gxnw|v Uจﰇ/ jG60-" 酵Ә!]C8BXx* vNU@?x|RijZyw)ONrVXrwxc2<Ι;z KZkg+<8A^xR"D2AAIg x gW?N k?(AdP-%5ggE.\ցLR ֔>i0,#LQJ2]\Hk\:E ?F9s{=q+(|P- PGAPQp4Z`,4_1 T7. $liU(`> FLQ"׫xJ.btN>8󚧊%.1s@6M,.|2=fMP,( f#vϖ HЁA8N6l#s@7_Vߠ}lcz7M"MΦ&zA|mu\&w Ys^UQ-1Y)#>Sd:y'VB:p6Qħs  dv8P¨OUM;`Ry9˩b{jĝІqRD7C(p*P͗qfM:<>S6 N\h &@bޢF-ͩgXlJ: +ì BY盛z)ǪE`gL5oj"=9ng T6mY+UAtbδ_z / F V?J'>Бtrpl2#|x= /W< bL`XxBy`O偂!+T648'^L ڒ*MaPgy<&aʬf mZܮvIO~%yՁوuZB KUFG5X8뜌 Qp"Iij"(ٛ&4=ĝrU;Pԑڭ"\(ḪmZ})Xw)RE3 xt$>?LU*} 31/6y{2ȩ`5Ƙ>Bq[^U*|P4۸^E!f n(H1Ut{N173.k PQڈ>~x|pޅْ6:F-d KM&;p 5aѭ<菲DH }̫nB,aܑv&7oDFa($Ur<$E<|5N 1p>)FD \jVL3|8UXPJz)Tw̃(SEP]zDο"Fd-,Yʗo!Xy'<>@ IW 1:nig_GR$mA=h"wb /6J^s4>/H$ a( bVKVkW~,GE#~F U Prpp;gځ6ahJ2Ssc?`-cNS_z X4vLC:HhO{i 7Du(ZvaF;]"3'$2S2 sH!6!O13rM\gP^Ak"m rz\|^+E/w khM&A4'%Qlά0.p|r_۝'Ajˏ3ՆT`~єzbaFMFay\_(7Ua:}"4g :Ek5F>e`Q,.l}ojh,4Xm(sh+J]?\Wri- %CxEO*{⑭$rU\!|92%Nv5dY^qB6Nͧ8fvФQhdPl~]hblDeF:2Ĵ ZD@Nsϗ?1@':n}2\g;YEQ$lIy9^dї0;52H'q FEAzaT={`fs&2PXd,&vʬ^hՅԱ^B/wf!P7Uk;TVk ?ʀ:fR%T TB0zu#5}9 = v5uS>*Rh%ےa H;k[x%ݺ!;IZ"y$\"n#l#z0"c /H\wT>t8cHI4QUO 243:nFS MB" Ia7gԭA*8<Ĝ8>Y;V1Q*LaӁL~HfJ3%bn@Lp=RݱgӚ(7}:lHl/3Ε~]OmDA:"+L)9^{<2@Eӝ|Fxxm`7 l~)̏_"T BZ,&57N6␏@-/_ R ,q#L(G P`IC(' ĴC sHe$ bE'B@J_}|˾@.]>X-6e$Hd{ǂYKR}d @7 sbPr9{\+ RT(fz[b)ߟ!(i'V AkiDFZYܽD\zm:l,VEϵ;ƽlQd`9 /NQPʧ0rUL=2yM*H?zݚP/|Wr!krјљ ,=!G"hϏ 'CDHoJ_l h(*^^gI@7'Rٳ W+!r` 08>3RYB|!g%VNU]K m:R䄦F=MF]jFVc%n/1ޡ/\A9N,UMRNX8`bIX'Dp/$:XT#8@4s4!~- (q fZXFďx!$WFdpHy1`|!2<b,q<$e=*Xc˖c<,~nwߏ "u&]xheCb?]w|1=z@P0a3swBq29~] DdY #D+a\Apl0Q LFPkq3ld~cL2Y+qܞ=@v#8n*%y7%-AR=fHP7pb@䡛b[♼4ӼCLЮ[My+n ksiFAa͂'U"hjsj e0bD? Qkj&vͷRQBmř?u&(:C2DW^LR?HM3PLڸ 6Q&|WXtw7_ W,_q˻m_(> ɨ+6Sz.hxT.sJT(a[ +c-<+&>!+Ll2]@xA)J@LⰣ.MC A.oN%’FO0j{SqVQe'|PفQ$5;@Cc^\ *kQEIlP\S!wDk kS YR22xI A!9N1k ˼ O%VG :hڛM@qYw!Rji`eU`.cZXxK#&M`z@ZWswSI H 9S3%i,CIoȷ:e{Ubp@(mBm*,aQkQZ7ҁG}yԡb 5h ^UsDVɉLQ93LA:]v2|ZB]+ ,A: ;6$|TvzW~khl?P=[,GjL u%5 /p4WӈtMa? &@ :Tg#w6eC>1z&2tǣ8K>i>5m;bTiN'(bY`h[% lS*K$\ D18ĝG%V`Bg }. <`u^H"]j P%S iqG ,]H`$QHd܊&]abi :f@^G2S@˔)Ǯh6c CckCgѯW#Z,D\ke5߃GΡ';u,)hkd?&|B4Hr^ -N*_0:nPa#x b,WCJZQ4@M:c` \^m΢m1;( D!M"b p5јcOFo,-zA"WK3Jw}gbL9aAdh3o2 -@_!F]R 36Ohe-L{5|>3X^04.Y]ڵWct{*qB-PEGF%& {/9EnU}܇a$Ж쁧( af5cOb%SQhL(TwIC!ӏm7p>_K8]\5'NGVԱdIϧjXPG).d%%RߦԮY~If3/䭟4Ɗf|'rA:]V ׊[ 8+3|lAL+”e+ )i4_ƛsLЪNMR D%QdD3.P/LBr|& FP2#Dx@tِJ#NéC@ 5Nk fx V AiM+ 4́P9U%H]`igUɿF aB8265fj8(Iɣu miZV6@3+3@GnsP"Ц.ɼƢ8|ĊV&ʪV;D0$- Ah$VQZtFT]%,XT\;n3niIx5fI 9 x4GAXAr׏ ID d.|Au 1uC O^DW3*" NERjulc4 gH:O|S>G) u'QfOݠK,Iҷ0[ؔki)rQzn@O _^ϘO"`:W"d??X A`2|X, RhTe<xഓ\rJFNn }hpX]ZsT N +Dy 3ꐧu(V1= ֔&OBS Mk4M)SEvEr'q"8Zڣ(իAhi]tOTRk-t.D}22VCB0ܔ~ @h6!Y6_kП}K9[ ??Wdd iL4'!ˁaH@Bc (nmQ DXDp]Jix G'#:@`6q}@E"(vj#+ (0,䂍޻l #N;S$Ef}E=ta)=MV}V \u6qIQa:GW6,z |PRaEvZ*5ņRYe̹ .r{N ̸I"``aUXDH/+d hg02N* qc9U)=Te1"pLPJYZUB6ҭ)t}Z@o|ǜUf=()EhA2A#\3XK=,3C.)x3cq`aq1߰D_~C]mP*?N!( [zpym$ICx^D,`5px[ (!~FRf^̅&լBЈc`NՌiK:s5E24 |Cq?]m .2s񤲄5mo V6SfزuNbQ9.H(>YqƊ9dD]}RsWȷV (. *2Eai -Q*kTUZG[(0[wt0P*45gjwŤҴ8y5{ ;f3%~"FbnOrRnS>}c[`=bЪ>ƾF{Z+kCGmQv-i Vd4gu+B V6S9ಎoQ/S4~ uC|jIP? A8`w$%s e"O4Q4tOU8lCD8`L3&K4 D:9J{<aE PT1iY(b7-k,`\iX"r*SV1*V3?Ė=ܠ]5twy4aD#,t[i\˓JHm!! T`D?`-cΆRIKk)E4;.@4ʅIq&$~.؍?YkXGV@6OBH*= DbI0AdHk*Y S*= t%R91 -kX^auςlYgd|Í`r<3DpjC~"E}w%@)RվHN؀H6Jz~;#i>4\ 0URFoؘa&w*]tbG& ~AVƁFtBؠ DM1DpŞT(~ʯ’DkQ!UBQj!TTWNdq]쮚 >QUEՂD] 6d/ images-actives-html5.git/src/share/fonts/yanonekaffeesatz-thin-webfont.woff000066400000000000000000001343741250410645000274450ustar00rootroot00000000000000wOFFl<FFTMÁ GDEF),GPOS?rYGSUBAThOS/2AR`cKcmapB4cvt C44 fpgmCeS/gaspEglyfEgheadP26w'/=\ϟ]/7n@ągq+=\]_JJ=3OMǛkO 5([ư"b7ԭv/S{Rqk<88}?rac؉9÷3#VņQ;FG\?{~w}6o9s_;տ[3q~rOrǏf<,wNbɧ ~5wBd7] ]?ߗ~O$w-67s}ύuS}.rn..c"[ K B,k-VVk76JXŰfW/su~{~{J}{:oy ?mcݛ~ǻ~渭X[n{peߕ)nvPVusܻn/( 6q]`41- ;|6G﹑jw/fSh8x$N@8D/h.K-g|Tg K7YHgR/]VW'iA?F+a994Yuhg1i@3 h44L 9qmԡh Th++ 髐vOlm@f_~W!&EJ߁n7- H_j#ZY_6@O7\A=|eS~~V)xp#`Hri%@ -PB %@ :Z,RJ*PF ePF exїH!r]1o!ZIHfKQnӶ] m-]|5ka_O3:mJmw$}z*~x$~x*=_<^Px6oˍmk' Z=ZIh!O?üx- چub]MXX5%>v ov~v^@;/ ihxKLw|u3-YIK6ђҒ'>qWB2=czϷרS)l@7p!-~ނz Պךת hWh"Z}9^=/h.Z֯Nۓ^{5Uڊ\#1PA^?jاcϰϰa및un+oC9l.J#:h)4RFjH a7xIkg7#g`짐---------Bˣ(<*6j-:,iWU]+C[=bOl_;(a-]@)3(sKh?kS-uNZJ^&tۄnm~V^+k%zLEҿ֡uZW%Gz F-я.Gܣp MԺ+-bX `^%:, a-E$(CG@9lM셤ZQkڵ'z WbHZ]eʷUrJ\*f;mNf}6SfY>kg-VflVQ*jZEMBv.5n+mz^'aC='|18?6WCEŰa)2| BX B 1ڼ 5(alͰނcHv| >{rm%ZyD:޿ 5(LނUXQBnFԨ]'U"DϏzýF}x]Ԫ ivSt;G|t;G=|t;G|t;G ɚ ɚ ɚ !Y5U#Y5U#Y5!]H v!.$((jnW$]rO ^v#^x=WDxxS5H\5H\5H\H\5H\5H\5H\5t-]~^#pVή&tu]BW!ZtUjU-EO詹"uaʛ՞d԰ē?cp!mUr~X-hwx8˫:N!Q5"Q)"Q)"Q)CAAAA}H!>AAr*Gr*GrÏA5r4ɾduuԽ>!:Btqi}+z5^MWմz5^ijZ] i?CjFj P8cA!Ƙ.ˈQ?sj0̡sbM`5C p9yGQp99|v:Xԫz${_bK8G!-AAeJu: yc5!.eܯD:C:C:K됺됺됺NvKB>A.xFQZQZ'ga$9~Nw|-G}Beyjdn7^^X`%XVbeq昴C k*:DOqs;}mZhj!Zbm=Zg] Wa=:lgܓ$t1 ]LBNY,lf~Ơ1g M۹۹MM(5֏A_3 4=4=Zm-5;zsǣ3 hjT"tgiN8yȇP˨xx %fbXk1n 5(aA % P!*t[hh+ڊhhچmhh[cZꐻ |On&ZP+jufm??(>4u yG?8BC5hh ZtҐ6֠54;4;4;4;lhنvA;{·hCSv*;f |%4!]!՟6DOMF eAjIJ%[ޯzH"Q+I ^kHӊ4HS45HS45HScV%HRIF;O(S}DRma~e}֋a R(9GzP/q"XUP -% }֣נ^ |=m#ۼ `3l>I߰m,@hE"X6hcX6 S+BEhP峏tBV i"4SfLs?Vu}#IQ:j\G|k#5ޘSQFʿ'qݓf͟s+j83lj j"^ȇPXVA1zhF^1B0oz;9/ΣEֻk"wj0e<3Ǎ#ܽXh?ۍ~42<@M!w cRF+NGoVZcCk5{zZc=dvM~ s$[D\mb[b,ipflzcgp>qfLmm3Dmmm횰"l(Q ѱumu+I d;B-B-W~Xj/W$r[ ;EK QmԲ.e?Us Sz6ȺPL:yn%HQ8v=4p ^_4ZFkh  :f( GOpGOpDk 2!Gy :]je[hYR[ay^8EL)t]ڨY2xa; ,ې8S)Mdav p"k&n+lW#lwqEI(>ǖ<ڳxϖMi׭g1,I9l.v([N5sų6}>[~V~ZNhmԢZd15b=.㈍M]zFMyeR֝Gu[I|1XnJl"}Pmo Fx6f(c,xa;쀸}rN 6kYzOVbPO&gs)o ( 0sG Ꞡ H/7UW=4P jڶٱdfkz}v09nNնVQg3v#W\+YdMO=#z+x0㝜3AmGt\>Ga4CO|~'V)Kh-ԺZ,Y, 4ےjc$k^_QAgMo%QB~j?T n>K Sj=ZOmZCL,/\;EN;v>>dlayaZ7}ײw {0rsYv?~Dn'~Vsi?1~b e?5(%Ԡkza:܍q9}|ɍ ׋ Pp'V,׎F{/ۍE%?*bLiĿY@OAyy "\:Ff4t h(C s+}C5.H܌MAx?ɫ[aDY>f65 žiII_/wޒT{)vB]O H]K?O#yɿkuFHg{Ylp-\a%͘ MWH%yߟ>bum )?akL~BkslFoIFjngaV1铔5fSlʚ.a!N2 mGL19µ(>FOS]w$#IFg;]l:|e7:\ɼ'DSRC_l4g 2˕dL2(ڙ%"I{;'%:jk(MF:v 4:Y' i>[9Cl=ݜM_ei]7tC})Sߟ(kD8ޏLiC{>4<?Vo^->->- "68D{=hVڢh-hiC+ t3n>(݌@3h>FjHy_|=5RFjH-=FWR L._%7n r^J[;Bc½~q- -FKRq$wj^7)珹Ez{ri>귢MhYx{}OGamӷc'c'~"y,Orko?+ʧU|R[~{vӵکXT`*V05B%%%}pvRNJII;͒s)y AÔt8Nq))0f} %KΨ7BtI};kjk(!7\CƳ^uir[k0ImUvp3=gMs=|}+'W8/1Ÿ?<p-Kb'žu6f @)φR>P$u|f&6B(pOjYs%>Gy5~D~ّMaNE#$2,,ξ{%Ak2y=4B.gl9"zha5W{.{e=WPO9aES "~e|ɵy^!٦~u?>õ|`9,w\$ #ˑ`Y%h; v^$ گg6txI<<I#]ʐ+/;ʴkrxr 08ˑ>ٮ私i?s"e95̋T[p-pvU1]䵑Cd>$u}}>NQHs'+xs'ۖܞtE:CgȜ_3tY%(AW+3UN{ׇ5CrV=hTFh)枥ζ =FOSh<OSѺ#Ma 5n=^zO~==Y者{j IeU۶!Ѥ Xmy^u!!Jz'.DJk`̟3gbųxQw]ׅ]/P$\qusaŅaaSzwX+S֪Ƿ[wϿV5E/cÏ~YEy<~ҟvn5[v;"W2{/c ծ?屆s#k`tW\:g:&;/ (ш҈G҈҈҈ӈGӈ諑X#FFkޚ2kdk рFVԈ'HhB#хF D6N42h$zH4F##FF0DC4-i$zH4J#іF/52"k,17XjP` #F"D5:#F"D04E+ V6FSb F"D@4!i$bHJ#F".D`4i$bHN#,БD5!j$bHR#F"N.H5{ $bHV#F-Qc JYYV#+jdYp dZ\֌7` 3z&K ʼB4XePl@Vl MMM œy:l7aPa kjtdecM۞]S"i^' o;u_Ϲ ?zSI2~|;7xƜy윲3b=]ן~ *%㞟uEZo]W-ݰM}7?6eLXkԿw>ز2#12K5Y٩d:c kk  1=kkdK#_ O32[3̦i sPlFf42OΧe-zMnd3@jdP#3AȌFf5E+ V6L%2y#tļcPn`Aoïmi.5b;p kgY5EwL# 4WH.Mpu=uɅɕ /`ӑ ɵ Š ՠ 堑k$WFrGhF-U5{B#(4B#*4rFrYh$Fr]h$FrahWӑ\ɝy(H H.HH.H w3+Z,!%"5#EYrK#J4DoԠ@rh$Frh$WFrh$ƞn(Jљ[;#Y4E#[4E#]4E#_4 F#a4+FZjH.!\3=Ջ5F#j4F#Ck)uWWg$׍Frh$,HHnHo:HnHHn}vbHn H Hn!$ $Fri$WFri$Fridl><r!i $Fr'i$:W\Kɽ\Lͤ\Mݤy@r;i  P,VBIGrKi  Bn*MSS Nޠ apkȅ2uI5c:zFKe P4u74$ _, ,azF!˘Frh$ fd)H2d1o 49!G:L#Y4M#Y45M#Y4UM`ARe/0(4Xiʠ`AdӼj5R;ra&N vk`{:Mo4 >L!'&`pD:CP#95 ,5(0Xf B HEMAAQe`EQcǻQcHNHԼʏؙ B,NAA`OXHe +h$;J[#Hv-HQ"ƥ LGui${fQ1b%K ^ `*b%/_[A]X-#z~դ4 ɖ9#/Q#kQj.k#p4G#r4AG#u4aG#w4G#y4G#{4G`ARA B/Ẉua5t$fdVdkYU^3`|*gugOe$^IY^3@VHͬ Y_#kk^5XoAin5v}g2x⭚@hv9k` 4HvMAA"Dz^e Y5^7HGkd}^d B4C|kP=2:c{ *z:vLLͣ鈙l&FXm9ּ5/cV6,,W fPjFi`dѼeAyǠ`}^LDžs#}hQMA]ȟNAAAc h38n/bhv-Vą~g{'3cq};;ì;`e`r>ʓu쯩7h4HH/2v#"ZcMAA"dD;D2w"FcPn`}HWǾ]vȧyGuMAAb}'cu!}|iĕ}uН#B.tF5#4z~D>"K +UG0(4x k VfAj׬sM˴Q}t}҈Tq0GE$RX1ӻwDY(B2M5x/2hj)SAW_60>j\0m5 >?iYs9jpA(ns ڦFddkr -ӈ43#f QGMAA58fp@43" cp43ޠ aEh("oE #hpDtkpDAA߂,(7h4Htt9`[n =ˍ2#D𹦻o۳25ol2l΍7h4Htw =4CFV:Xxa:Kk9ig|dNMM \p:l7aP̚}|M4tw4򉯎u͋26W1[]kQGMAA@bg" {lYatftV7h4HEFdX80vmLx׳ i" EDis ;hֈ,lb0#Gr[+_Soh0zYYٮWYk>J~ƈԌ[#zɴfla0WEBca5tJn2lp!+Öl7a.ZנQYj}̶=#!=xyDAvetL<#w Έ;#2=8Ӄ/w݃vEb# }EDL G=סwtL31Wlʈ.V+bogL"bk2 U 6k8lFsq0" ۗGW#_Soh08ZEصZՊ,+>k"?ޠ a]C1/+~bwyύ7D\ɸ'(q{]ڈ x*DPcůS+lɣL#l,iA325V W slklLPMě 6l8 ަ/'`eoiONw vE|CG][ˍZnAO|GypFtˡLMƳg+xK!Nt9h\}7u\gԚ=Of➈i.$t;vCDWiʠؠ*eodm; ?+xVZ?{v1SxWWn>F#~e=dsDׯ+A W:^+2w~[! 2+eVHˬY!-BZf i_ i#;3"FhUhh1~}}d<ٓf~O ꨙoY1?,Y "tYl `A2?>*bAJUk J ^4ѵfliB#؂1Z#tz\kDezEq=8d3:k`"z~[UӈoWh5]Po "P`C5C)Ssώ7D 71]qhdF䰭f"bq1x3RD/b/\GЃf*ej:ͣ3\3<1??b.YD,V5 ,5(0X6*b9}DoXȧ$зDD_4XePl`o(1xY7Fs##J9Ҽlyoo4؈7ךMCf?5b͈xMx(cмñ5~Jv?7bT;4/jv4fnf{؛fiǶ4D#cQc z2&]8Zwen lFAl1GcƜDc] wm372+zW芑c5an-7X]m?Qvn/Nq2z\.t\:'2`ـ<wγx'dLw2,b(Ss1WF#_5\sϊD܏5 Q!~јi~Mt_(:崓%4XePliO%/4oОZ&>ƪ2'D5x1N~Od͞Nwx'x/xyZzs-^Q.b}0bdL:Qؗf4k{"q "f1_=h,17XjP`+ V5(1xFﳭ֍9j;)7T_jy5W` ا`MWAkryWMr|_yoQ_uoa *Q#5&*G>Rzn>N%'~.Im{z\  |zNlUcՆMS4=|KSSxn7x<jpjՀ4 9w:(l5--*kPzvHbnQ֝pM<鹷?_vӂH~:#&sm:wצs_MBE]'`mU~P[aRiu]|%$I-A->9>glyU' /՗+C:`eg}}S:*u+˨ա.]~/w~ϓ=q9>0? ?Ia߱PO[6)z?D5xB⭫}粎z/%~Vh|~m{+;ʬTT~'n㹲ڱ=P=ZkhH:i%56RZW ZtZԱߠM%=y>}9GH'|~TϸU.T[qN;mH)=%}uI]kqţNjCza] (:7 jF~ugũ)_&g%D;0 vc9} T,}aQ~NՁNcZP!?Kj|OpfBwԿ~n{-c}O"4b^%5_<¶7#meChse~ W;F⑲C!'/q_oWs4/CӉ* 8I67nھx|19VĚE_`OrFx}HyG䳝3~^) d gDr K0yfMk-Ek||9zR;@nsw#t,$MwVx.9]鮏$Qk*m^v׸k}go7w7rUtag槽\pij:.9"q5\z?ܒz !3Cy|~zvU!]3lov\}w]h]&vXhh:}݇,<;qoaS vM[^gTΏtnO=\A\S^ߔ_oمV{ F>d`dˡh7n7FS87'Cn2;=qq{=nU#KUy{n&gZ{7aoIxc`d``bca`RĒ<)8 y1'3=c#PD3110< OP xxc`f`:՘QB3_dpag``b 0~–/m2!#HuR``D "xc```f`Fx1, %d21,f1.)9%5}+x5J~6wRmAP   2Pp@>8`=v>`݃?p9ckIl pmL@ ]0(XX98yxED%$edUT54ut ML-,ml]\=<}|CB#"cbZZ;'Np%._bk֭߸yӖm[wܽ0%5vG m3 ˮbX>9Ω!3k4;;sΙ3KʑwkS$6NH덌Zlfu є;j=o)M;Z ;4: !qKͺb00.?R4j˰Ѽ34@Skm!qK˦6$tUS]`*́Vy &ҷ$, b 9@HƼIJ;ㆵƑ6O'ӿZx|/:34K,˲,+<ƒ"+8c\5k ii!MӔMs4R(,eYˇ3K9Y tYRp9=.x]>;Ϲ,|j43y>j-֏SF4n(X7Y e aV<]q34פJAD]fd_+ޥ*և)ƨr E Tv3TֽN\T,eOqI(.>:eI6j,"e-{BG^}^.ikGcH>4'X&VN&f+ 4>B)j(]Rh)M,4ޥE$KF;;$+ROG_`m0Dzq8ò0 1lw˧Y2N!OD=pR24|T4pX25"eѝ* #B+JRQ9P}5ŪPOkn&ѬmtN櫷X#k=Qsm}n~d[oƩáXij}vO::T-Ƈ{놸H$7o{`~ 8a<^b||VݢؑCgo􉕺[.#Pz*w!M4cu TG5#lYZ$úDsPhvacI8k( GCHdd@֢/驢>"/Ds]p2.Nwf9 1@ leژѲ\G~H<KcΑCo6<ʍe_ݺOp؅/?i߻mM xo87ٺU]Oݾɿ߱svP =zñ.{OQ_pYg6t 55:Cܿ=;H)Fܼyvϧ&vH5=jjTQb"Q|.|(u'Y'U^H8 wC uPĺ|@e1Q+.k!X]4D4ZxϽ¨\7DIQdRsRnzSmN0SΞ`(" J di/TE"INm^mνe)w_Se>0"B\H Ek(4 nqB@C;E(*r0ѯee%f/_{O=:t791G*?[:A+G_82P9iE_QD8CV-'AC)Uw4D׋z9*WwGȍ4OIGOT7ҝ'\n'HGk᭏~2*8|W ,L " ntJ*/~ʨbosCi܈ ݬUR![@똪 L;jc9J[t2ٸf,lcNY} dVH_UnA6TCAhUuIγT! 0jT[KZ`DٴM Xּja|F5smT?Dub࣪]=89/?8fR/N|cs_yfF324K ׫mٗSh&ЄX«I0p&ƭ$52e mcTgY  XJgUNLzmt TXV949KQG⮩\Gݽ_M<|\Nf[R.I!AhWSuɝ?<6 r֨)Hi#5IkCU0F<3[ Qb^{RjapPK\&U%A-!knsDhh~ŇQB#X6ztqf.+>[o>{'yΜyag򃀝3/KNӰNqXu;Zan@bewgm /\d\'giYr{;EQnӃm F==eY=PUŠ6l!8!kfq=t5&,ټ7xOcكlTu[ٷ@$k홛ie@T CG~~gϽi)YAʍ(mevi1mODp- UX`gD甃𜮢nthb)zYbN,as$ٜ[e]_9c#=g)w$+vЭ&.1]<;hwo]~>Ldvi4 Rȡy}^sM؜:${ק&vr='Jg~=J  5#N.SR<ώQ78hv) c;xZ2.EPb0*gPm qVɝ Nj~=fN+6K7E{ŧO\g&)c"#t_䮽}T kMԊ1ztdDRxk`+7=+ʔ5{o~k|0}}AFpBlT=J}*Ϡj4XXW i¯P:P@XYP8bsx-\*KEc]#qy`j媊Y,;_~LɝzGFߟ鹖eRÉW_w7o:7 oӷ*cyѳ̶>Cl殙w2OU,j⣂ޭ;]^>BO'9h2c $ %Ly˹9JS ?lЊ/?qB nQt.V뀒&X5=k&%EQ@N[g)-o3sIj@E O˄xb osSx|I 5 ϸ(!l{pO^^A)7j &6(jHtz3sKWz/vzwߠ~Ǽhܝsܽ˞ C+PF\6="vξ9~%| !qs2Ǩ6@%7P?YUI/VbDѠay(Pт_:?Ԉ:],[WΊ~טh6]hhf-jfD~d0X..q,cќ64<4X1Y>k{wLݶwK*ɦtY$$Bɭ5726>\edrl=@]G}{JF5,tfrKά9@%F.F@r,堠/7#}KvѸ  G3Ec#)vw4 &FZ#Sv~)-2P|9SO'z%瀸1ͬX[ٛ+7V-直JUCC̰E>.Wl@{urUӰ\rH%X9O<TD%:鑒s7%Y88f&$=[؞=YeDʙ/qۏ]}o8cC9{pVfTg}\o S[%T[Iۿo~HQoZ)H.9p:2]ˤ=>7_%O ٸlOb&ôrLU,Y|T# X׃C4͌Z2 nJxY$>:D" R!OYР?7.\w^'.u.pDq-֣ˇ#W;u>Xŷ 2"7t?x~C|Cdlı ױGe5E=Pktrbmc 4D&0^/E[9-kKʰ0g5|I?NX[G{6 LSw'NVX9 BC v>VK0!74!X@] W2'Ԃei1Lv(DʃYDh][ ล=K/R4[7ks@|=!s2A) 2OѹC Ku G"ScكGc]{fލ]Mq> ~#,t;į[v\==3[̞{Ak ۻ!/y@A e d Vg}^Sv6ZK2!թˆڃ͙HObc"'h eo$*;WI-~?4$=|)gSu|r׈]_]=qPBfAr%~YQ BdGMI"[ 7M<+:PUoUV9u4᫏9xig[!:LpC0kVh++fuI49p8d \<`<0ɜ}c=$~m6qV@= sx,\ [ 5k~|Ǻ;wwνAϋ. {pK$x!7(H"nQ O =1Nxua9*~^˙:cc {(u)U! * 9W: \q #0DbqI|VhZ0/"«JHL-WMBz:6zёq2snO\g&̭̀0o֪]9% iڀkQ!O~[ezZPKo?|?~ (u&ǖhO=h^߯D⟞ L#> gY:Xb27FE+ ;Log4xpRpSTÀQT C9uȌoڻ3߹|S9"W}Iey &_Hpʗ*++L9muo֐@m{:00@p*Ht5{uIa⅍EIi&V/ B=N[/P/*;~wNn{0"T|2C%AFi ,[2z/7;CZcuHj! \RfcWolj8iľKM;&>7`^y>6>h域{˅+.y_|;C8}Oߦ+3y/y2ZuI֑$`),̰*c&VLyߑ0ZhTym3I;>({W_> 3ʘl16 u]𑌵M>:7aMs^ۀCr]č~./^i.|M[4 - 2mN1SjBbd|.8䇮Γ.bwzg\~C*FQ[Ljr54pր˥DazD-Ima }J( &@3h&2z[x#{`;XޛK7<\rX`?Ea=#1Uxg7rM!VX}/>j>_V%óN0Ȁgu{뚰~Io % _gh6#)jZ[M&ژpw{KC)fzIf]qg DrDĄ#{(B13ɍٜFbma]_uuQTٹ"0 A՝'a\$֚TYNw͠R#f0O+?3锒RN?)ia !T(֛HҖn1oȦ.+@CdSB b0&STu[G?g9.Ψw8qzNg@v^v* `^S0=UkVf  I1B7Ʉ"Q0"SzMoxڪm)x)+,zӛK`E\`-6,$#SoٖQK']8co3̙"c8+2\7^W '4"tՆ#V? dE?e Y&&Ѣ,cڬinRŀ"bKskOv*Q4gӳ}עtzar=ߥe~KV֯9J5\f,rFVż`sm+kcS_y[06/B],,`^4jSǻOIw a=OX]w }Xg7htbXE# FwS׿}*S!L w=8^wxzr>(.ad?ŷM0N\Hk;NiRV2FFO۳.qЕX$c'K8\Ȁhp߃oY@Yp-OQuT ϵo 2<ךuKԅ[| Tkѽ1%F?;VYdyf|A[fE`Y [{ Ln,^tzN;|yL`}Xz}Ĝ856~lDn듖>?j\ bT׮{vl9J"6-|Fk`O"z b]W`0[XPmh|2)M1|>KXz}nSg< gr9y.kc*gJ7o-{7zipqz^Y<:vĖS 5v$xP5U 2`<8 s-p>'cFʬp6GqwEcZ)*'DzL姃~-\{CCt=o=6\J0I޴Z͸$H\Q1@:үxmtlR 3s~f3O;>aMRŠh^N/YٌQ4=_aN Jw`A`<{wԤtkɏR5gFy_~QWs^>}wJ }s?bRf"5s>Ը45+ld۩"gRĸ;Vk.霊 |ٓ1*/Khbufc0_l+[ۢ*^;/,,̤뜶H S! \"hŠdWmqt9wDt;ePHa~w^rac5TIDP2 ا.T-հ\e^jXVlR*ά=rvJ1,H^ڛx}$k|i;EQDMf 0=JQ>܌\ŚpcyXC U4 ` Yb/,v+E"dzAZ Q,܇22p) *]2"V|ɐ<ŕĩ_YSf´!f 畢n:g&妊Wܝk;=l.:uiCɁ)⳱1Vvɐ,%d+9{맮Vqy췻uzj0#bȩf,o;򘁀z?Fnhk$$HrA&3WG {>=wO$sz']}uFWR+q{FoñKn9<Us6ZnXgr>ȊqI2{cX "\G.HnL̊}\y/D2a*MWFiD^zitzC={c>|ѹVB4,7x`/Ty3AXolNj72H@6$q' xop7l9A]5>dk%>] \j| b;bh&fCjM4K Mx.k\orͻ_9Q1Qℑҵ ٌ*Pp5DŽI$&]>u-j&INInŠ{z<)Pp)keCmluse N EA? ݨZL4͸(/?s}b&@3 5^ez55wnM!p'ֱHoA*l[N0~pIs1oe,M録l趱 OņZm;e"0F @4T74J,/xC Ziޣ7v kN]Lâכ)k71,! kB!P(Gh9R5'V $86+gXW.d~e-<鞳@L"3%@wj3,UPd$Q3gErIrf143kZc`׫!JV:G>뎁>fݖg?WM~O5!UI/)K#8I)1M"Maŵ&YgX>orاNJ1G0)gGwL^fY zgx +-<s̛%jbuZUxR6\3!]Zp[@j@T%/pˤxێ;à<\;EJto(7Du,՚C[^*(IdW4ưI `Adc":?31C Y-d9%wˍQBnw QIƋ yvf};'H;@X/.,+򼫲CK6eH=tQu&?<{$Γ< tj5_OzXЌw9 P6Ì>7b^Bu}[nq..n`L"D?0Sdܒk=]/8c} |Z#g;@*MC䙯8x/(gVc ]ZEnfCP3N8)sECxi0 5 ~Y=ၑ:XsȎgc0_u}E8Q9?9 V4,}ymQ^+Im[Մs n"Wv5]V`Fo Hczc޹b׵C 9UޮiG-_mKdv?A|d x~kU<fcՆ?jN@z YU(OR2k\M9J}:+Kض\ơ7#TKj#^/5Õ h /wf:SU3?gVB |M$=qOצ"Y&Xف>R(j!8dk- !f=|*kTufo#@})>vz[C)_= DcS̯@g,2Y砩jjϳ\D @䒕nr >#;t4gwgQ,G05oԝd^dtWqEH&on 0l,h28̚xu x!Eq;־WXF-QhdNs+$v>Ȋ/++;-sy[L!Ϻܛ  .A jߺꄧ0]M'w͜'唠ʧ~{?^1\선{NSz^}CFљ~up-&@ac% (wU'/\u Ē職2ǟz孧m~qAZ2xo&ԋ "1JFW+OKyq!or2jd cݟS\(t 8o}\$. ldH!/^eoaXg_sXOQe!<22k%Ub&sE]#EIbH be_ 6ƒ|;:u020qmq/k$n_iKY| ER䕵ﺙ~6n|G9]IQX.it@JJ 7JS ـ3Vu5`<qԲ'VKx۶''F{~N+K胨=.ӓږ ?T@3ȣ EYoZj$H[_QͯikuA1Xٸ>\"#V.xWs#u="={uL~>~Y?rL%z*?ygMaFjUv$7h["{l] r jӆt>gys:쁍]ʯ9Qy{~3G?Y<:0kmgs&TJMn3*;m&}͋0(5@ *fN**:M( WOz2qbY֝QwY"˫(#ܜh3$0? ]@.}eؘ[XYm1,k)/q\\Tg2߁/{=eM58 ۛ; V7 N֚`EE=#5Cl]$̖k5 4q"ٱ>u W #R؃Ȍ( @sX O4슅F PÄG?3 sB(ٟ"B.?xVw|KǧSnbmc;_<8=s|e+ wtVQY͛TnDyg@N@zQ5PIm$iIsU|#ۊ@kI>r#kս;lS N8$x'a7íHpJA W"c9fPL.‰_צ L=I5@<)Vv ~y_j}]HEb[D2~U7Yda3GaEW;J`9 MiFwg-LcT{=ùBW I:Tyӿ'+6,p-5k?HsVL,p=볱mg*;h-P_~fU:;7H_5iYE&88~AXo<Xg1Fսٰ/dͦL5Du%/e`٥_=^.:.`%QI /f2)$޸tG / jXe،"HC98UÐ)/%IaÉudWr0AoQoF{ ?an^\5\Q&_~bsgnt3z0}q:{0u9b(%CR4]xXp:ѣ^i~C;o36?mB'`g,/OO ^pzy\=83f} p~w*Y0z,f[SXڐx݉"6!ˆPe8:Xˡ4µ5DL_F x$َٞT]!<|csb\9d0hX]) #2G`By7ggI-sD(e9{vcKT!< C6 -f"E58Kk8up"5!ʑh2Cp~?%3ݵk&qiwo7RIzy3-;IZ Cn^YUAyXrR^Q=g;%*wEE x7=O7PV@tm\‰gFu۪] 닝>z?]YS4b<מSZ`&:%y@prEXP7bя}K(o2w$4)9?;" g,f';{n43vzþFe5]?֗Ye]`FBM]2aiGjĕybGLb+,$u3=Jd56`}rQT/~C'|ժ5Cv +# `Wv҉տBO5!6?9117I6r{sk'Ʈv2%~-W[By-qڢ%"~ά t3Ǭ4yS&k+zd $C*rN;, zг0TK,ZH^~尝8}{x[ެ'1V[](3Hyج.nޗpőw ҿBg ǎ><)cNSH%_=2,;cn,st"m爀țX_"K i>HCgL<b)qn\`cڑw "c+Pj!\sPkJ];g[,ᢘ.N}IY>r@oiO>03w(r?X^MmP6)#_K*|FSσֽZiYinnLpPs65րJU$dXYcG\i˫G)/T5elnZ H^r0IaR`)@܋iUR'& kd JX2XwA/֘XkY?zdgƶ^Qvo,ߝ?w?7[ ՞lGԎgW51~2Uy{N9̺ucvj!G5\E"MhI^8_Qq"lV츸Q¦>i6[oVuI#9Sk4|$aizgSyD]>a[t m!>x^8.XuWb0R[0±`BAe ծQfa|{]$ 3Q 16Vcb'^>X01LZX"æ. QI&|2_|ECGQ!w]veO b{.{ZNh7y}y;d%--4HXw+o\]|}<+#K%Npj5/rQi f@}ɰ&JRw& A3B:B1׏պQ\)Ol'åxo0Iݲ;Jkň̞?./Eڿ+z|ǭ7p@LnD\Z 2n'I݈K`2 ᰡ#F݃ZG K?@J 1N55.Bt124t6'{7TpFbݗ&^5Is13},Nj:8zjt%0:*GF{sـJRAC~ҫh{JB nW@:C Ÿ88q10/'AN/_3V G@x & ż5Y I7ɮ^,A'Wr'q@wk܍D3LkeAUjDC2a /8̭'gcڲtn)䳊bX JåPfIJ,W O\8ea։ܿ#Q?l8'IH[7dwrg~l ￑ 2%^~lOiLՇ+ \it&iqY5wƼ/]_w_oﭔh K^aM6OOŷ d̐1KnXߐ'P z2q,øFHeJX/Xs:SmV-Wh+toX9Gޒ&Ɂ՞~u{[="΋;m #xKx ^_Vy"JʋoH ~|&POp,øf뱱. ίRR oPjp}䢼]n }/,p9n ?2]4`_t^~k=1&1Z2Q WYxF2Xɚ[+ aFЇCC2?)2sKvQN{C+"ҷ(}a ,-zs2vBF'0@A2nı  e2|]ESS2qCWwO_Ey.(EL4Rfv?qLPTj >}3x:XcwU {Rj!E >Np{>WcX4u< |]4߻UZC/vu5xƐuIUH?[,_jzwvhuB4SzүhmWL%~kkJ=2UnE" 6h3>c|!Q 5L2!f_YúlV"3&0cv5>:^J:_s/ M^5J #C|Hh(j4EKDKdYeÑe[yqRQ[mEZm` E' "u  Fh^tmZtđ;3E)q!C3q=s/#bC1YZݶl\ 4o2є]'OXaQ(QD^Sv^ rtY>rGJK4mQ8/6G0s\Iqہ9BӠR&4)H%U^r@~a1!n<Y'nL1</X`Q:kȰϖ1)boᵒz_p!-ylK5淖 #OK"S  MhpSZw~C#fOuȕrcQWn,T lȻܲwyeGɜ5Ҡ: &Q꽩 8}@##͡a7TcGhEn;u PVpw0v4ipls.*pŶL`Wx?,,1RCnjtii =Z Q24[1 b 4rmC%6?5 %xq8 e>[ ZAtC]^*j)8r21oXQIAPIrJr Z:YJI(شvI15k2TN)w58!ևu! +nX7F%͢] 5F4e: od啰e'cx~'nuMOځe!TAvQ/Ɛ 3fh#a@*V!c-п ' `ڊ{J`?%`L d{dr6g__49ș~1zd=7Mfy\n g(E"]V-'JdY;+gM>_,ϰ> ~uҢ:HdEb͘Ob}8 ƎxG֓y& j\m*:IȦrޡOO]O8XCjL>y`b3{]mV;G{7N~v2`MAܔj6(/Ǜw.:7 ӌ'K:kTs;$Kƻ߆<ќ\OtB{v63ҫ"ο紧_)U"mk^Ƣ\Mmnai( ^6Nܞ*6\]ChD=7L*Ԓ2Okm f!=4Fn& lYne]ZErR20징Z@E4?ulSA.9uKlt`n"ksw}zX~a6Pc]mu $ p,LUk}CCCӣɰ?FY!ZQe3 ,FXho"ZPCH!pTDH!Ѻ5o!5h]8M?4]oVk:XdnS|yN;į $ Fۉ- qL+CQ`EnLE1L\E1wvD4FL9lb܋dH7$~7ʜX頌9/=,ܤ^ǭ;:}Vb>V☛/WW0w=,zd%&z*/+:ð>v}NoZ4 {lKLɺ8 J=,|iqŽgޚiY{7hhݳ7Tp;ЫziRYԋ)@p=`M7 B`?hYlE>K5 G3ۢ =w,bP>h54PmL|é@z+sj0r` @4{a4UqcѩK L?+,[rwKS]t,ʉ#S>No"G>?uVF[33}+}O a3SA9Pms ̽O Fhy]m2IɋٻtsAuSt <=WzdsOGRW7p̻atqGJ#3A.6G&﯅ֵ7z pp]qBsvQ:zJi䞘ރ)J}.=7@]Tꯗ\2]d'\ѻ{G"ջ]v6pl$'_eb{M?/^ۊkdl/Nn75*K(,T;ʸquԯ t7}V=ѵ,Pd%xF iҊ` VmQ[" 3c@.7r8n ̰\{ q{fꓵ5g"-}7GM*`jܧ ־oF$eȜ+}g@pbw0LNwf_l0\50f>._ (;+}g[Z'~I+,~'}g>ŷE7̃RM}E'Z8 XЮtY`> ^V}QXՙ:RC2;H({Ln;h|Ր cZ B8i~nǨ }TYfOxn~ M><:f: ]HH{xDUcA9 t}s/<^o'n|1*Ht3UnUrHW6"ـC ?q2E%C{r^Ԭ"5JZŎR$6Uz48nrֶKśBt2G5kG,9Z,9E]USrr R9"ijIF]X,U,o]Zsm_ykx%%U9ŏgWnmr ɑJ =SL$E鳊=܃(Ʌ+A]l(c0-fŐ}n,FȄ}:+``J&HB{]Ivh+]y+Rrⁱ4N,}+VtzR;[&J4 Zx*O53$ķnqGp˕dAVۮP~tC'(CaG7TG 9n&ɴG2fYmPJэsps[tǥoSSeH?zA76xZংpOхihCm ^{ĐHHV0)q.5,oK¨XeQHWh7Z.ט:=ִ[!@t{j|B޵_y4Y QHԇX&`NlY4~38gRM fk4~bjlN]V>Xa7QU/吏ez跻}ssK`'4`yi`/Xf%9B'`S.{r/ukSWrG^7ry4{Qo>zR yV,f}{І~M"i+z"."K 1oNHVEeW:cZ'3}CpJ=ڸtm^ .ٹ < <:9}lxh*NS?PԟL]\ Cь0BK̫)F=, /@tda,*-[Q<\sCڝ9a~STeC]jw'z/ZZm "<AsnLqҚ@P``u| dS-ZeJ5֯\-ݛy{l>Qy?oﷆr`N~7wibodii*)ۇLXLzS` TCwY5a5_.%N'p}>EQܿSԀGP&Yv!4w3mrXR,5CmuwABŸ5d0QfLF‚dG swX,ڹXR"u6UhlNp.vn >(n&MxN97 o4a`K銸RWY<w3:Ʃ"е)m9_JO*p R^kb,W|wD\g&PUAM xe<*;!ށ.\BëMf24Zm6H[8NOG;L=mBJ@mtfdDwmd s[ eX48s^ix $ yvТ*ۋ3Hf;сs7{F3;4!YB0d_i%pcsP7>QwKBw3j8 I )y |R茄攇@`d 8=pJ7]8͢DxWKD0Aslpά_Vi< %0Y%(CW%`K nDT3[*SѦńDL,5#99܁'1xrf T΃%QLA).J$ E?"{ I+R[,iwOmüξZ{JHbL Ud[H˝]13UCB@:Li\ϙBd͞Oی&XM5EkL8pTM)>_S=O# :T [iG>:@uOy| jӺu2A]g8_MP9 Gq@q3"r 8GPi>6SÊ+I%>)Ǹ*U)6@J>:h_ Gr9>3*W v7;)c) >d]gNxF{Ǽq'x뭝LQwV"_@v$-J頂@蠔:yQ  U1q }r}B/&v)=+ҥ*S S!VCLp1v=C92g>AĈ?NаC ׯ0.ETNZQb<[DE`H)! @HA-:(5ӯCVQb&MgTޣ?al+m0TZkpWV`C``7[*c1v=ByANxc`d```dh͌ ) >zq{2͞ZV ib66jXeӻ?2yA0X6~o='Ȁw"3V'5dEUfƙ2#~F_ kaw'\&Y?ˌؗsb^[NaXHLxc``Ё2;B_谤aǚƺ ;v?JK858c*vpsp[qqQ5߉@:7%Bψu="DCbI)I?"e7$IIV~$3C'9+3x()(QRQS:jڡHJ5@NLf$>m- :f:Y:5j~t9_@`>S3%s% - /6l5l{lؕf`?G NNKqusf64/?ۼ&xH 8)KQPMй`! !WBB /q .rKFԮC,q8`AlSM8j3%*] #~Ԟ`ّb5痮>ᾮl3q1+HcHKX͈ǭ;# !5X?P~BtIM^Mw+k@@V rOY[qݑO(c:5>sFK 1)F'{y_c"FR~Q4O1:ALbPioV8qb9<}}2aFSmz̈́XbY( 2wRq],䢲V1 c5}ْ;U#:$s2=dYO o 3Mjz}maDT1XuIQƿ/OW8|jHᑫ(g/4s̭XK!53FiZzeI- YY!UwN[S#W9HB=? sftl^$YȽ#?fėkP_ ᠌Ytdv *5W3FkUa^FRkg+ᗲmvKר.Ɔw 0N87ggѐ#*'#X]6cS>*;DNvsxf)fd krZ%rrܼH?:ؿ f=.?]"0o7mWhcҒ 5z]{Zc[U ,~yE~{YX%2zhp㡘J)/2|SA%&C03b4c83Lb2S43b6sK8F6?fvİl`.r!N(y=0졚Gp<1Ox'jys^p??^_6d!4FB4f KYgfVU\kY:\[I8%^$Q$YR$U$]2$SEp;\2w)&$Gr)y/R(Ev]sc@w냚UXz5}ҥ,kш (ut)JXY,U^]wPMuUSjǴUC ,oYwD4./JxMͽ@l~%_\4iL 3^FI< ^6Kwsι葔`/ғh cE i^ r`|z? F_ٖ6J KJA}AK[~S6#* ڤO_b ϊ12)&x"^: H|WS:Zimages-actives-html5.git/src/share/i18n/000077500000000000000000000000001250410645000202355ustar00rootroot00000000000000images-actives-html5.git/src/share/i18n/en_US/000077500000000000000000000000001250410645000212465ustar00rootroot00000000000000images-actives-html5.git/src/share/i18n/en_US/LC_MESSAGES/000077500000000000000000000000001250410645000230335ustar00rootroot00000000000000images-actives-html5.git/src/share/i18n/en_US/LC_MESSAGES/xia-converter.po000066400000000000000000000055251250410645000261700ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # geoffrey , 2014. # msgid "" msgstr "" "Project-Id-Version: activit 1.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-02-06 22:05+0100\n" "PO-Revision-Date: 2014-11-24 19:10+0100\n" "Last-Translator: geoffrey \n" "Language-Team: français <>\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: share/themes/accordionCloud/hook.py:35 msgid "export accordionCloud" msgstr "export in accordionCloud" #: share/themes/accordionCloud/hook.py:36 share/themes/popYellow/hook.py:36 #: share/themes/game1clic/hook.py:43 share/themes/buttonBlue/hook.py:35 #: share/themes/gameDragAndDrop/hook.py:42 #: share/themes/accordionBlack/hook.py:40 share/themes/popBlue/hook.py:36 #: share/themes/audioBrown/hook.py:35 msgid "loading" msgstr "Loading..." #: share/themes/popYellow/hook.py:35 msgid "export popYellow" msgstr "" #: share/themes/game1clic/hook.py:39 msgid "export game1clic" msgstr "" #: share/themes/game1clic/hook.py:41 share/themes/gameDragAndDrop/hook.py:41 msgid "You win !" msgstr "" #: share/themes/buttonBlue/hook.py:34 msgid "export buttonBlue" msgstr "" #: share/themes/gameDragAndDrop/hook.py:38 msgid "export gameDragAndDrop" msgstr "" #: share/themes/accordionBlack/hook.py:39 msgid "export accordionBlack !" msgstr "export in accordionBlack" #: share/themes/popBlue/hook.py:35 msgid "export popBlue" msgstr "" #: share/themes/audioBrown/hook.py:34 msgid "export audioBrown" msgstr "export in audioBrown" #: xiaconverter/mainwindow.py:91 msgid "select svg file" msgstr "" #: xiaconverter/mainwindow.py:104 msgid "ajust parameters" msgstr "" #: xiaconverter/mainwindow.py:161 msgid "myfile.svg" msgstr "" #: xiaconverter/mainwindow.py:163 msgid "Select a svg file" msgstr "" #: xiaconverter/mainwindow.py:173 msgid "Select target folder" msgstr "" #: xiaconverter/mainwindow.py:188 #, python-brace-format msgid "Sorry, impossible to create the {0} directory" msgstr "" #: xiaconverter/mainwindow.py:213 msgid "Parameters" msgstr "Parameters" #: xiaconverter/paramswindow.py:79 msgid "modify image resolution" msgstr "" #: xiaconverter/paramswindow.py:87 msgid "create firefox OS files" msgstr "enable/disable firefox OS files creation" #: xiaconverter/paramswindow.py:95 msgid "index standalone" msgstr "" "enable/disable unique file export.\n" "Unique file configuration needs internet connection to access the resource.\n" "xia engine used in unique file is hosted on Versailles academy servers and " "automatically updated.In this configuration, you can not control background " "image and icons." images-actives-html5.git/src/share/i18n/fr_FR/000077500000000000000000000000001250410645000212335ustar00rootroot00000000000000images-actives-html5.git/src/share/i18n/fr_FR/LC_MESSAGES/000077500000000000000000000000001250410645000230205ustar00rootroot00000000000000images-actives-html5.git/src/share/i18n/fr_FR/LC_MESSAGES/xia-converter.po000066400000000000000000000072661250410645000261610ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: activit 1.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-02-06 22:05+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: share/themes/accordionCloud/hook.py:35 msgid "export accordionCloud" msgstr "" "exporter en accordionCloud\n" "Accordéon étroit (zone de texte réduite, image large)" #: share/themes/accordionCloud/hook.py:36 share/themes/popYellow/hook.py:36 #: share/themes/game1clic/hook.py:43 share/themes/buttonBlue/hook.py:35 #: share/themes/gameDragAndDrop/hook.py:42 #: share/themes/accordionBlack/hook.py:40 share/themes/popBlue/hook.py:36 #: share/themes/audioBrown/hook.py:35 msgid "loading" msgstr "Chargement..." #: share/themes/popYellow/hook.py:35 msgid "export popYellow" msgstr "" "exporter en popYellow\n" "Bulles avec zoom possible (commentaire immédiat puis zoom au second clic)" #: share/themes/game1clic/hook.py:39 msgid "export game1clic" msgstr "exporter en game1clic" #: share/themes/game1clic/hook.py:41 share/themes/gameDragAndDrop/hook.py:41 msgid "You win !" msgstr "C'est gagné !" #: share/themes/buttonBlue/hook.py:34 msgid "export buttonBlue" msgstr "" "exporter en buttonBlue\n" "Boutons au dessus" #: share/themes/gameDragAndDrop/hook.py:38 msgid "export gameDragAndDrop" msgstr "exporter en gameDragAndDrop" #: share/themes/accordionBlack/hook.py:39 msgid "export accordionBlack !" msgstr "" "exporter en accordionBlack\n" "Accordéon large (grande zone de texte, image réduite)" #: share/themes/popBlue/hook.py:35 msgid "export popBlue" msgstr "" "exporter en popBlue\n" "Bulles (détail isolé puis commentaire au second clic)" #: share/themes/audioBrown/hook.py:34 msgid "export audioBrown" msgstr "" "exporter en audioBrown\n" "(adapté pour les bandes audio auto-démarrées)" #: xiaconverter/mainwindow.py:91 msgid "select svg file" msgstr "sélectionner un fichier svg" #: xiaconverter/mainwindow.py:104 msgid "ajust parameters" msgstr "Paramètres" #: xiaconverter/mainwindow.py:161 msgid "myfile.svg" msgstr "monfichier.svg" #: xiaconverter/mainwindow.py:163 msgid "Select a svg file" msgstr "sélectionner un fichier svg" #: xiaconverter/mainwindow.py:173 msgid "Select target folder" msgstr "sélectionner un dossier de destination" #: xiaconverter/mainwindow.py:188 #, python-brace-format msgid "Sorry, impossible to create the {0} directory" msgstr "Désolé, impossible de créer le répertoire {0}" #: xiaconverter/mainwindow.py:213 msgid "Parameters" msgstr "Paramètres" #: xiaconverter/paramswindow.py:79 msgid "modify image resolution" msgstr "" "modifier la résolution de l'image.\n" "1 = basse résolution (adapté pour le web et les tablettes)\n" "4 = haute résolution (utilisé en local)" #: xiaconverter/paramswindow.py:87 msgid "create firefox OS files" msgstr "" "activer/désactiver la création des fichiers utiles pour le package firefox OS" #: xiaconverter/paramswindow.py:95 msgid "index standalone" msgstr "" "activer/désactiver l'export fichier unique.\n" "Le fichier unique nécessite une connexion internet pour accéder à la " "ressource.\n" "Le moteur xia utilisé dans un fichier unique est hébergé par l'académie de " "Versailles et mis à jour automatiquement à chaque nouvelle version.Dans " "cette configuration, vous n'avez pas le contrôle de l'image de fond et des " "icônes utilisées." images-actives-html5.git/src/share/i18n/pt_PT/000077500000000000000000000000001250410645000212635ustar00rootroot00000000000000images-actives-html5.git/src/share/i18n/pt_PT/LC_MESSAGES/000077500000000000000000000000001250410645000230505ustar00rootroot00000000000000images-actives-html5.git/src/share/i18n/pt_PT/LC_MESSAGES/xia-converter.po000066400000000000000000000064771250410645000262140ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # geoffrey , 2014. # Louis-Maurice De Sousa , 2015. # msgid "" msgstr "" "Project-Id-Version: activit 1.0.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-02-06 22:05+0100\n" "PO-Revision-Date: 2015-01-29 12:49+0100\n" "Last-Translator: Louis-Maurice De Sousa \n" "Language-Team: portugais <>\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 2.91.6\n" #: share/themes/accordionCloud/hook.py:35 msgid "export accordionCloud" msgstr "exportar em accordionCloud" #: share/themes/accordionCloud/hook.py:36 share/themes/popYellow/hook.py:36 #: share/themes/game1clic/hook.py:43 share/themes/buttonBlue/hook.py:35 #: share/themes/gameDragAndDrop/hook.py:42 #: share/themes/accordionBlack/hook.py:40 share/themes/popBlue/hook.py:36 #: share/themes/audioBrown/hook.py:35 msgid "loading" msgstr "Carregando..." #: share/themes/popYellow/hook.py:35 msgid "export popYellow" msgstr "exportar em popYellow" #: share/themes/game1clic/hook.py:39 msgid "export game1clic" msgstr "exportar em game1clic" #: share/themes/game1clic/hook.py:41 share/themes/gameDragAndDrop/hook.py:41 msgid "You win !" msgstr "Gagnou!" #: share/themes/buttonBlue/hook.py:34 msgid "export buttonBlue" msgstr "exportar em buttonBlue" #: share/themes/gameDragAndDrop/hook.py:38 msgid "export gameDragAndDrop" msgstr "exportar em gameDragAndDrop" #: share/themes/accordionBlack/hook.py:39 msgid "export accordionBlack !" msgstr "exportar em accordionBlack" #: share/themes/popBlue/hook.py:35 msgid "export popBlue" msgstr "exportar em popBlue" #: share/themes/audioBrown/hook.py:34 msgid "export audioBrown" msgstr "exportar em audioBrown" #: xiaconverter/mainwindow.py:91 msgid "select svg file" msgstr "Selecione un ficheiro svg" #: xiaconverter/mainwindow.py:104 msgid "ajust parameters" msgstr "ajuste parametros" #: xiaconverter/mainwindow.py:161 msgid "myfile.svg" msgstr "meuficheiro.svg" #: xiaconverter/mainwindow.py:163 msgid "Select a svg file" msgstr "Selecione um ficheiro svg" #: xiaconverter/mainwindow.py:173 msgid "Select target folder" msgstr "Selectione o dossier de destino" #: xiaconverter/mainwindow.py:188 #, python-brace-format msgid "Sorry, impossible to create the {0} directory" msgstr "Desculpe, é imposível criar o dossier {0}" #: xiaconverter/mainwindow.py:213 msgid "Parameters" msgstr "Parametros" #: xiaconverter/paramswindow.py:79 msgid "modify image resolution" msgstr "Modar a resolução da imagem" #: xiaconverter/paramswindow.py:87 msgid "create firefox OS files" msgstr "ativar/desativar a criação dos ficheiros para firefox OS " #: xiaconverter/paramswindow.py:95 msgid "index standalone" msgstr "" "ativar/desativar a exportação dum ficheiro único \n" "O uso dum ficheiro único necesita acesso à Internet.\n" "O motor xia utilizado com ficheiros únicos està hospedado nos servidores da " "academia de Versailles, e atualizados automáticamente. Nessa configuração, " "não pode controlar a imagem de fundo e os ícones." images-actives-html5.git/src/share/images/000077500000000000000000000000001250410645000207235ustar00rootroot00000000000000images-actives-html5.git/src/share/images/file_locked.gif000066400000000000000000000104131250410645000236510ustar00rootroot00000000000000GIF89a            !" "# $) )* %+ *,-!. !/#5 "/ #0%7 $1 %2'8'9 ); *< ,>/E-?.@0G 1H0B 3I 3J4K5L7N8O ;W:QZ?[@\A^EgC_FhDaEbGiFcHjJkKmMoNpPrRy PsT{!RtT|#SvV}X Y!Z#[^%\`'^(_a!b$dh&f'gk*hkp+j n#m-kr%ns'pt)q*rv,s.t!x|#y%x0v}%z~&{)z3x*{,|-}!#2%')6+-.!$&(3)657+6->@AGIHNOVNQTZU`eijsotwz}}~{~tyuojjee`f[a\\WRMSMSNHCJDE>?ġ2á:ɠ3ˡ,ҡ%̢-ͣ.ڡԢ&ۢգ'פܣ ޥ !Created with GIMP! , H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲˎ׭apՒʕWj5ٴni}؁fl-XJu]Gu1im}]e+QD˷_FJE׵qغm/^9i`ˀZxԷn.X0^yj>ُ9dTeͻl%+xyߊ廹sd fϸGz~I{ug=#qRq7T.?ߺe|e(FCd ) kK6 >J f{ìճ .ih"Mu 1`x⌗1> @nH/#>RJL7ZG4,52 y#+2I'`ٗѰX<Ȥ%(aAWfn 2j:2`H-0&f 316 J ;$4)ԟy ; QfL-LL* x*0Ҕ) k+J*pR?b'im1(j%-؉| $(%Ib%(᪽&pI Z֋X1cH@3q!.$JcdH/`p1?xbo|nG20p83t>͌,*(p45((4F10pu[/9?c0Y %5֣1ܸ4(puwo6mW/cH WoQ>H-wiSK@~bEd>&p;)s;d \` $l҉'ƛxK;s K27'>aQd!L)K'W0p iP&*ӫ\8"X,o\H@ GnFhE7'zch;cvA=Y4ah "{ S- "`+k_0Da;ހx`AX X( ]py3 ko!E>q#t@SX P9b/8` /û7   WD(4aq-4@1H?9ˀ@pK|0IM- eH5[#xpWLx&SL J@k)D (vC 2f ` oC#F " QGZh {@As<%@L2@ 0 8 T!8 -3 @ HbA#XĀ2{4d3[ &~Ps-C6b-$fͼ@ R D =JbF(zÇ4j ;#"1B 1T p. o`D ϡ sD\0 i04]07@BЂ70II@;P(6s!|0@c"m}7aco`V[ bͱ6LQ#&f uAI]S4[ T40`P 3i!ÏOĘBZ .Cc tpSf1] yC7 x~ CP bS Y Fn/v]2OgpBPǥ.r%@KB/X=pIز&+?0KFM =KB:+ɐ*W2I9XP 4 `[Gv3QX*m*SCh@[9) &6@V0 d M~&K py` Igzr }%ijhn1%U%H$fjR <#_2Crq/#mv7@: $R"+A!p!}!!yZr j!O٦ ߩO!ء%jP 1*ȡ31bZQ:5b!1aa,헬;!rAv1%aP:P!TaXA`bAfj 2A6:> @!DaHگ;[k;images-actives-html5.git/src/share/images/file_locked_old.gif000066400000000000000000000170201250410645000245100ustar00rootroot00000000000000GIF89a  "6  +%#,((%>&d4*@%yU#2:S%!T0o* 774 F9A93@ *p1"$QD_;6RgCECq> -QG!l?&8SXD:=aO0TaIX6C<RTQ>Y_CP bX-uX@GaZNMXeMilI3jxZCjnXadaOFhSReXT9{XaY]npm[gax~u;g hz~K|g]pskmSt~b0s}A`KH(V88}*lv><ۄhh̋G y?RpБ1s/`\yΐwWjPЫW ?,ݩFD׵O#9޼:(3%RYCZ^DSZ㾸gS!bЁKBDZ)ՍmBHou[g[pVjcnv_z! ,H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI&E;tL*f 5bh:p9s(AI*ר?vjeX'?jRphrㆶ*֭pAB̒3v߿k)5n88| .fφL?p ì换Bx;wnɕSWTD3:vܹ珥G3}Vou:!7n|QZPkکӣ]{>4Z+ 8qɓ/tO{>QC=4sThSO;5VHaԡK Xt#boш,N;<5X8R'Xd?(7D Hg121c;C\ވc!'`AXT̛Q lц%:# c/x%"/03ʃ.r6 `bh ~1|֠՘yliX@WNƒ;x  OPlh#@`@"V5u\LcF6c4;4 a'CXhfUءy(,yyLh9TЫ,QtGLP5AH뜱Bai bo@U P1+L,5 Gz ~̃pB&EhNԛ(KYJAKPC㚳&^!r4.%_o.b.[&3  )3!. ]ٔe5zc༛8{UN3ğ;WrEŘ'F-r0IRbAPoZ9g}DJ vH@z_wq IC+Zq[4UHS;BSNJKh7 At>[1@@H`=;{{\0*(W0PQm Љkz7{B{^r~'yW0 %y1@c0z8'rpx)94ǀI'%PG!AxEix9p'ҁ @LX  ,.9^h4"~48 A wE& h '&"؄vzOAB>d-&WZZ 4 ]()`/mLx Ƞq$v5$@w c. +PS؈?&@:wЇ$ ǰL}'V(pP{2p)' EU{.$u7/@c &AcH 7x24p#aOgBd ``zN{،HbTYIט%qmpU *[^+$`D0WPWPqʶz'=iI{)$' *v9+j ۳K{esи˶<ʵ𓹚;|.+SJp]1" {u|%{Yq7(kdbЯ몾)꨸{J۷Aһ۽;SpAGۼ+{x@+1Kbw+ p[k1ڼ+h6nH+;W@` K) B'@gĴ þ"3l`Z [| D Ş hp8qG pwf,ŽP7\7p$+ư[:jƌʋ&.2;wL|ņ1p+ {gX|ʨL@˾̑B`h  <s \\7+@[`eѶ|p٪&kд @lxxxk`<}(P|Q =B&mμЄp50 `9m-fk`W@Pip̬ ,Ӓ`w|Ҽ~|}.C]\&T@Nmr-4@umxb]3@ʜnב k!zmx d  ' ` , )j-}0RK碵 p ۻ;Ma$ Q*)@j ms }}٥@P [<=l3S;ߑ/P:(} ͗ ]࿍½ nsd86 < p }ٳ SI6 . \L` dN:=B^} rNJ^_|w]։坳.I8PD@}#  c^phn jo @^Z|Kmp޽\(`Q@>e.h@ P6rB ðdmMPm (퇾ۆ0^链C9nڭ > 쪰= PK|dD`=?_~<Nn׀઀Ԑ\ qx ͇1<8`b_FoIn $> u ݜ> )+/оMa 2{8D0dۜmxn p O?o ƈ}~ [*`O~(!e蜐}H_HOQ;n %/k@浰?P{]^}P֏ ؏ / Q@[\{ (_Mz  eI`"BPBG :Q"&,r1)]}Ҕ&MLU"%5SxYs=*2 ְf|VJGRMIsR$U"GE DPXe#RDE9G@1MDE^2gӤP?)RCZ#3Ne\˩Wf#L)hҘj# =k6rl~c lឆ% cK0,9!Ae4bithfxM}\{elڵ^6`w7=D/NrȘy褛:rĐc ZKخB k*Dң- 3E'|(2P/2 *04?hˆ(B #'0ɾЦKXFꣵ-rMaHA8\$KQ938(@oD3PM 3hؠ)sB,t(mA)k +eR˛t30j~3",3-M˃XC("%f oې$CMtJG3hR. J N*4zdD\0@" #h"Vdauוu [eI\qO79јCp۲Dv"%x:iP.0>x <}s?YuեB3̘IKH*y 6$e_%%QUM18 <1bi#hpRB%ຌ21lQ6 sOf~CT88oq sޚkbVw%ZkəVb+Ɨ̛:ApW'pzdg=v%پ+ᮩ+-J/!2u=ƚvo{ٻ\4G!9bc BDE(.!aD`D$ok# I Q Nf\@`-R O8$"U9/WRR QfL-A a`Ǭ Jf--`!ᒸ: NPNe;Wߜ&3PDl ̈́g`h6oJ|d5~B d& P_6@B8(ӡh}&>M~3Rs4!UjȈug 2o:Pi ?EBPըMh`pP`'izRrGjV9ŅvS_kX:VլgEkZպVխok\:Wծwk^Wկ' ;images-actives-html5.git/src/share/images/firefoxos_disabled.gif000066400000000000000000000107541250410645000252540ustar00rootroot00000000000000GIF89arnnnuuuvvvwwwxxxyyyzzz{{{|||}}}~~~!Created with GIMP! ,MML֒KKJIHGHI,xHÇ#JHb!D Ȥ I&qDɓ(S\d 6l!H-Ar 8@ JQpG$8 .IrdѫX=bE En<ֳhv#K𑶮87H[A$PXx3vP(Qw?Bt c 'ThA4mi#ဈZ$Gk@F6Fo"B|(5.A4C B !¾}"EwD>|[ !|xAT4 D~`z a:A:wv9l@h.(/h80.%@ϠbP10 LÓPFÔTVieQf8,CBc@@,p)gEAE Ÿ |o(DQ@͌t5C fG߄*8J1PlL'3^xpuAGL!)ʴjq:k+Qb쮫"lA KkL,ABnkKJQ~K>nGD $@澚oD l6̮V+L'LLڋj1 !\0l.8,lĿ D s%' l9RhPpW8>܋*sG|(34acP{ ) 610ŀMD!Oi!"t +B{̀cXL}\˼ BS>v,悘um ~TZ$ OF_4iCdDVEYPiD;]ۍ .W:~6 :u@B0~[Z>hu(aμ@2 q^`oS'݌a  '(^G "ĠFGfiBUbH(p\0adAir u, `QBѢ2%4 Ft@ JxPEfF1"QY')~0U'Ա(qJh"Ѐ}# lb$Am xbŠ +PRcFel`8,TKp8\!,ll@K2d;Y≠JP'([DhzFA jPM[b2~̦/yrb#)GdP<"1g=OM<..xARA8a pp@ּg>7͌# ) ;1b,miDS\VT1)6`4m 1 (fǻV!9AR] S{:u*z|]ZCT5BqYei#i]R'*SF=A 0% \fuG؁V@/e[siNUo% B u%g<}6HؒhIӲUck(~]B{Mmߞ"OpkZԶ5+dfBau#&)%񎖼MDqM6wrE YALa~CyCbVA;~re댃LߠAnЂP@IU@X=l"75UpTAƒF@bq*~p wU<6lF&%f BlD^)eT892q˻T.X+@^ if"!Bls;Vny]&c\gR #5 gagm>E=~5%Tte#f[Va)(fˊ hTO nU_sSA ] `0(\! vvFs 7sob,..DM!o;}l|+& մ*Ƕ(Zr`8ߦ9mG $'\ 7K1G=tH3,z.DQ:]ϸa._<OB56 bЂO!PA=-' _G_vw(؃y]CK*tkH7N۟>&(8N{LR0X/|̩?Ua?kz'N ~}oU$/ٷ2 ~}W^(0ǀww`|qX 7 {w7Z&H}3*Izz "(s6c+)* \B'bYe4M-/a(j(IPHVD0WZ8pVc4 cX&:PGXxF P'{⁣rD7T2l7R5 ,I24ym?L 0C#}(gXK?(3kDzw1`X2k؅yh3-fDZ |l(s&HM((Ԙto8\GM.uH%Lȱ`@hz,E<`p Ih0xHZp @.А@"ݡ (n}XZ5kvp0+`1DyFiI~K)ÖV6φ+R+`ǁ EYHeR3`a/P v, wYb1ɗVn=wW@ ӘȔ3_P({` q&^*YٚG>*p O388yh9p|H`03ZB{kJH{JL+F2PT+;Z[z[X\;~\3 cKf -CX[GX􇂁7 Ue;?˲T0nkڵkK4p`+`E{o [l[y븢۷W۶Kwe ۸S.klKu뻿۹+K|k; {+\Ƚp{k{xȾd;[K [IK\l+Z :[f|Kh_;DŽkU[׈,.0;images-actives-html5.git/src/share/images/firefoxos_enabled.gif000066400000000000000000000070361250410645000250760ustar00rootroot00000000000000GIF89a;;= <<<=>?>@?A@BAEBCF DEDFGFHI GIHIOKJKQ JLMKLRNTO MOOTNPOPQSY"R\2QSRTSUUTVUXa1VYX W\Xc/YXZZY[Z[e-]b\e/]e%i5^_ _``l4m5gk'p4u9s"|Yw6~Ux7y8\Wz9]X^Y_`a~6a\bg]cc^_eghgŒihiƎepȐgґ^ӓfے[Ԕgݔ]ޕ^ޖeۙfgidjeݝvfɣͥȩΨϩҪکӫԬխͰ୆ز޶׹⹛ڼ辡åĠ˻ν!Created with GIMP! ,@H*\ȰÇ#JHŋ3jȱǏ Iɓ(M\GbʜI͛8m*P㈔-,6h0F IȀ &\ԘJիXNuI\J6 Qh"U*6l%/[6X)e9Rapi&]-\t߱%n9Y@BW],n6ܺ-'7-Qv¤7;"z4iӆ`̱ȱξ v*Th~wfpIp9d JL*c}}ExW^p C d5cYmmaqwEXocAHUg^q]!o>|ɷe6H&)h9ȄdeLƠbsP EHI*4wG*|i1cxWe@g&kP#wo&P^TI"m29hofJ֦%u)yꭸ뮼Z$U|$D6.HIqWTH~DZ).@] ڲ*oJf2*$EU7԰.Z6` bU^hvb%0'} fCU.[拎ۈR:\q FX 3Lbfwj̕1y1B{Hˑ"-?jJX@z$$؃*TݲNYeL( >DnxyWu':7uzEޯK"T0 X>*hؑ{,2jZQu 30; m:/JWMbG0C%Cyv/|Go|Wo觯_8ExM mo!D1A.U> pC&H &E<`x X3bO0 WQ gJ?ul51AxrHL"~cŹχ{v洞l}ʿ"Ł5mO;k]66aUD1.9^\F7Ka3Kvq_^͘'idrQ_snq@KOY2eڔǼ8ar2,j,PLIP2< L2M,t^>4 [-F+20wu 4$-&enP71pmb^+&*IUjj3;KsTi&k'">Bs#h #hC5E4uA-7<~ڢK􆇗*+@Aj68I’ʠjz=3Z$pLJJdʤ#jlGB-r `t3UMQuIV-QT@Z x]$  `{@ l 'Pxe5P'TMe^(@!U@Jvսړ-: 8/~,5#ԮkWδ'wzu-h6MZͮvz xKO;Sﰈͯ~gD q*,S%H`c!ݻ0.0-B@17` \1.^$` b@ +$ Vj( Wt=gL? `TH&;P2\d 0BP. iICmeLfR^۷1}-:FT9ټE.\3ڬCŢfRWSدEИgwQ? f %h> ǡc! Ck#$YFٱ֙<_ ]#Vi40}++ՊʥNuuY,;(hups>ۘ}'tgr7)[퇎ȣ*Sw4Ag LЎ樏{XA]—OWֵ 荂&HW+ \s^}ȋ;images-actives-html5.git/src/share/images/ia.gif000066400000000000000000000066421250410645000220130ustar00rootroot00000000000000GIF89a1N6P9#R9Q9$S: R:%S;&T<&U='V>(W?)X@*Y@+ZA,[B,\C-]D.^E/_F0\H0]I1^J2cI3_K3dJ4eK5`M5aN6bO7eR9dR>fR:eS?fT@hUBiVCjWDkXElYFmZGn[Go\Hp]Is`LubNvcOwdPxdQyeRzfR{gS|hTziZ}iU{i[~jV|j\~l]lXmYn_nZo`paqbsdteufwhyjzk|k{l|m~mn~opqstvwwxz{|}~ºûżƽǿ»üĽžƿ!Created with GIMP! ,1 @*\ȰÇ#JHŋ3f8PǏ CIɉO\ɲ˗0I͛8sɳϟ@ JѣH*]ʴӧPJUZfү&ʵS2Xb구YVŪt[iծ}K2r"kߌ.%x{り>XA-(kXƛCygk kž-Uls;%Zonwiȅ嗝K =2Ƞ(#v=̎ꊗ=EilR [dX09!V#ua Q 'MƅWlKDb҅6EHa-rS|bI lqH5-v5bU V$Q-yE%L#ȥd:yA 66Y+'tMb^`SX@ɉ!}`&L2a0:ղBaŝ/UaEX%~,fB"EI͇[ePSvRF j_}$/m8VKX@Xvֺү o(дi J\t,~5G}i$WJҶFEK.w&aApSy F:*իP S,Xx+'Y\DBX0 V:ntIPFF2ܲĬtR;,VDb<#44'-0Iձa.P8IuNA 72IQP-0*.aA ma4AfzGxmca-]!TT'E,*VfP9HdƛW4!DEŲ3Wm ҔXDL(z'1rAv_o++a=2u&aGHY(v4}X14YUWOacC4FLb!Q` ?*CFa%0 BDC 7*L;Xg3Ao'"w26Wr> ^/arh]f"5KJX,&V\$XF!MZ"FtF @1/:kAGGd9K>bYcH@#*~`BRgu $JT2d*BBO8\)EY$>3 &%Kn%9R|nwXbEAY@1:%bL%O@Q삛JL*\XBIwN7ÂR%ӤBB0>IÇbKΩRNeO4^"ѝD@A?3z KcIf! F8085# ^@OX!IMaŠIH4`3 :*lhI߹{T#8\xaYO!ꐎ@bYduVա&C8-Hk6JUV^]p% bWsΡr(5edTu'CDѸ$HV#^%1ǰ(<ipb.C9VA H'VdQ1^ tVZ>V"}`b*MP)0}Ea "׼9ӕAH4zY^yoPҀ@!`oP2pb ԰rPE\NsU+/-I!4TpN; ! S$]ڭX ҘdňE䰖rR(*2 */V;;yPZ HcH"Mu#Yl|6sI.YR,^S3e%*οDO"#+%)A~EAh^rEBAuZʭ 3lMWT]_z" k T Yf]6H|_c'zm;CI6R;8K.Q}fgWdߤQ2Ad*V`⅓DX<6wK-xD 3;6%$LXy3i$*\͇(2j! 0Lޤ{ w] iM'.I{7=#6:Vpޠ7Y/< !J XeqrXR䭗Wq5En]mK="*ڞr 6bo~XŲңy/Q;B>#f|.[_WE1o(D|C&l9jP, A C$+7b1!h#qvEK!zAhQ1R8;TaXrZ~B]0d>pq3n"lHasH#|wipr؇.Sȇxta6p_T˃t(+b 1v8iX`S!艑xe 3@6&5ey8ay MH؋8Xx8h)茿;images-actives-html5.git/src/share/images/ia.png000066400000000000000000000145201250410645000220240ustar00rootroot00000000000000PNG  IHDR1 sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxwxT% &:$ MR2A|zUFL0eB E@ ޫ?ę9{9{}=syC2v" 6A.GJAtdH* A3V-5("x[ &iTu)V "P< ""K#".eJV 41AM A)[H!4#6qvmi!RjPDpoZ'fܛ0r?ܺ6#m* RR$-/WMFHNaAkpL r @,MDYfAC\"EE@#мu8')4hBA @#6+\@- Rp`@n~!|ё!T!7BJs6 Abx9F"b  B&fDZ9Q -hbvl߸zmSω H1hb_[ n&F`e\q41AM AACDh,O}y"fJn]ަ|r jWZ @*/gBCTžх`.Tr'N 떼H0>Ӡ4)TτIDUr`Ng60kWP-ktq@CT{ J!'VO#:vWWhbB;൜>qTQ?~8'"hbGy2I̾(niO(ɂ&- ^pj41;XX^<9Qʏs4^5;=[lBq/41;Xص+X2t'W-j>Z*UM!3dKj\4W&:1+X. ʓkb9ZߝO5xG;PI41+wCb8{8dOc!+vm"yrYyh[3ܺ Ux4췬[%_[q$o1ڜ,ըy\ !:]{@ E ¨IĪZMP1,ci)9~Q,bP츒5O4wSχ,(Wܢ;6UO< OwCDtHc)Yֺ0=!7вmU#l$TBE&65ȞlѦ=7e?iCCf w.wshʊLJj$'hfl. PܺbdXtr_rX!lYL76>R ZMxKPLHK]dw'kԁp*7|bE%(sl^h\md(5idVIN=Ibi-Qv o }ÇJiشZr@m[LSx$1BD"v}Ed34u A+sAaIn]fJ#Ĵ8(DzDEMHZۓ/](ϯM۾q$_Yղg'&#MFM5";# 훰4' }6ZBƼԭEmb.Esn_eߐ*iS5'Ǐ9>6#C 3};us\:ё!Ī kRWY_}\_D *xb`i<+\b^jٿ& Mr= 6k%DxC(̯S4_Y roM[51ZdY+TYw9s%*ӒP]{wn\ 2fMK'ڲXC{w1Մs^߿~$=2p%}vd6!:2DSox%$'_r,yt [I\I|4iͿqRfG%'7^b^rm{wnݽ-YϒDh߹GדTs'o!oD10 4fJO%ݣW,Ğ"'- ULVbf7^V㑊,8=DV(-VVf|[CT=<3}?L3Q ̂vm(37ȿ'-#w,RR9.Q,(Q:3<2Ҧɸrz#9! vx6O20R>EEO$$"Wo]y+TOýw$C^PJ=u&3Z|H'=y3% vܺqp71N/ N,|wZ*zݞ}AKeUǮ'3 Č{n=I,aS*IsD3]3VMK.^` N1&4$9˘\XmL"aLJjLzc7RdܝjZUHIrڗ0&_n( n߿cIlKir0&(liuJb~OOըZ!GS˜c}0_Dz "Wm|IY9HB$tf'iEƖSLxڂYGU!"V/uϩݿoVxeɯ*!Lϐsѕ c_wxMl|MFMYT>ZVg YcyG߳E;YJO3҅azFf}mJjݼjNƸvnY+ըRQtfY.X=f-)]˴iU;wIkp|Hwod򬨘sN.nmI4ˏ_R#*{Xf&fi6o nXYѓ͵+q4 4(6jD?ld΀ih`к}gf;vDOֱ$3W}! ._?TB:07#ݭ{VߤbMFVm?wm(85-޾[B+Ib(O$cb咽[c5BuZ[4%YIL?’%ebg[c|$y@d++D=1C%1L= eb0W qqҨ{ZjUqP7̑y#y4[-0LPcJCx DLϜ6Us$ =#Z%GjЫM@xKP-1 0-!%5˭R*EuO~$=#-B"m^Yno8}[OrGp=q]61T,5]U Kk1̞gXQXO_Gljʥ %yuV,?| |wTYCGO9!4!.RR42Dl.o qAf]Ӫ,آj Ս/CRꥊr3ojil/\ sobsR?S.g33 iͼd7tG??@5Pp6/5IbgOW]E^abgZ'An~!f!.elF_l<g*رsh5>W2rNk<$ï66x.]8K<#ў5kC!/6,'L ޔho\+1|C\*3آQfm5&P|f/ro)PN]!ǰ[,w振T㰏F7Tmf3,PjPDp,BZ$#m*^11k,"c}י@_-C(Q),ꇼEP$DOޠ!"&`6C Eh40Dt;ioIcx$h`7&k:|ځx >abfʻ|N 5 1`\Ϯ W(**@ٲ~Ъ(a6!~pg^b,6WrBO>Zb\41A4<-AD&KE*Adr4|[ L>*UTTё!yЇAX_ط4@n~a_.ا&[?-LIENDB`images-actives-html5.git/src/share/images/ia_old.gif000066400000000000000000000116371250410645000226510ustar00rootroot00000000000000GIF89a1N6O7P8Q8P9#R9Q9$T:S: V<UV>(W?)[@X@*Y@+\AZA,[B,_C\C-]D.bE^E/_F0aH1^J2bI2hJcI3dJ4`M5mNgM7bO6cP7pPeQ9eS?sSfT@gTAvUhUBiVCyWkXElYFmZGn[Go\Hp]Iq^Jr_K`s`LtaMbubNwcPdxdQyeRgzfR{gS|hT}iU~jVkWm ~l]nm^n_po[parcsdu teufwvgwhyxizyj|zk|k{l~ ~m~oopqrrst u vvwxxy{ Ŕʙ ̛ΜџԢ֣ ؤפ ڦۧݩߪºûżƽǿ»Ľžƿ!Created with GIMP! ,1@ @*\ȰÇ#JHŋ3fOǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@k&ѣH{-zS -SA͎e3B<|C44pP.6@!$sA;['}Bzk"54ACmyƙs_@%FӨS^t)ī/C Y)) iR4: DM[iN3? Գ}vyYZ bx7U{tf{P4Q$BDWB`6X6 PA`, İ d,I JᐏP RmQ}P(qPCřh&+BU4OSMCڠͮȊWB7&[k!ߴffv+k覫&[;/Ar)eIF~vbP`cm`=$ 3v{/1W_?DTaAXSI IRjzT2L0 JCܡPL2DL.BL2FGM q )D!uĔ`kDwlm(!Bqךw8u"'>wDB7^29>s[D2" zP-9xG$a˸W>Q95fQԬx).4${787)mcB. %v'\y?^'Z؊9#{}(⁃C4uLx4$|`jeQeAy4wX"x blx|vEA!!xqA5W.8PH*6`XL@Ep`NGH2hL6pH:x#'>J~ dC a!>@gn !7&7 ]i :h!ԡ 86Ic2$?eÇ>jyX! DA :X]/Xr۠ ;?QND4fjB eA%bpŕS_BpcCGB3 P6b($@IuP8Ckoʨ޳8)=PXd|.E("J2SIT!5!\/!C/" wa Ab b$>85FԢ5pnA&"`Ysv ^Wq)L P~G/Z`aWO&"x]0٤99xjd)p&dLQ$&d<ʈT"b lA[LDB#dh> UmpaDB*=į R,DbB)"fC}!0GuGAaxD'@{ڄm< A8@ irB;V4d.B ,!(x8q$-{|Xb{^} xHX7Y8H:]9acHw|^VAbQBH,SdjiQh '>UMy&E,O@uȀޓ!N>Dv!ldrY"9#V VOBgMkNָ(v- DSFzoO;iӰB@{bhω"ؕ!9RH ci=nQ H?XѹI@o"jDC.O8iBl`a=n y:#9uV`A &8u;8Ϲw/d>#ЃNHOҗ;PԧN[XϺַ{`N]A^/@]n;.wu=\0;F؃;#1L|'ȗ ,E1"΃`D, w)0 M;3tV `%+2<,Q _>cqz>Yp\#" mT*mA & EKa71P`u s@dar ;1Ѱ2Q uMQ5 ؐ*؀TQT4 P<}V6?B8DXFxlK*>. QNuN UObE5x3 ^aA  ,po S" !PEpc1/H1_aH Y  ՀX4 -vHBQ'8 3/F0JtqJHsa `xx7^8`'28-0Te1?#XCQ s0nŘ~P) ΅.I@蘎긎؎15h(Tp'0j* ~n}KEXxHp @{P .I Ƹ В.mp. հNFEpPX%gEuJL.jCV1"Е^ rLu-h) jIF4r&Xm)1nhHrfWW:!L 4 qv\ddnB 0Y^P7 44|3g4Ќ8j"epx0!z'adKP@ p Ԁ Ͱ  p<Y q{QY)s QZ4ː @|  @ P Lʼn7Z@P:P!%pɂ g1y.Зi\9I] Vb0J 7M{ z D\P*$0X%pla0e ] @ 0JR t7p P~ U#>a Yp?0?Ag1$ :`g ! Q?fn Z6) >Q!uڡQA-'w%o! A01Q Q 7Н3(Q^٢4| qΣ!yi 1B Ĭ>k`B1q"ѣ1 M6@ Pagy_ojH: aa@ 06%1f"Dχi96DSұʷ8 :yfȓ+0 x`bdv``ckҵT0)pAУ?S-aHね N[+'=g&4{-%@WV<@dfd*jyif& ;0 $`O:1W{ Pi9u&1O0[h|_`z1$[ʙa(ﱴ +{&6}{r@ Y?n.'۰vm+=i5 d0+Jh>6w+po?&1 n?5h@2?!*0k?s|vh|Pfd@ go0A @÷ bKa '0 ` a 2P L ﱣ/ H,z@ V;V,`f,'LL {w >P t W5sj-@ ` Or i  o|˾<1cTnj;images-actives-html5.git/src/share/images/ia_old2.gif000066400000000000000000000063251250410645000227310ustar00rootroot00000000000000GIF89a1N6O7P8Q8P9#R9Q9$T:S: V<UX>V>(W?)[@X@*Y@+ZA,]B[B,^C\C-`DaD]D.bE^E/_F0dGaH1gI^J2bI2hJcI3iKdJ4jL`M5aN6nNgM7bO7oOeQ9rReS?fT@vUhUBwViVCxWjWDzX|YlYEmZGn[G\o\Hp]Iq^J_s`LataMubNcvcOwdPe xdQefyeRgzfR{gS|hT~jVkl kW~l]m^on_o[paqbrcsdu tevgwhyyj|zk}{l~ ~m n~oopqrtu vwxyz{ ĔȗΜϝОџؤܨ ºûżƽǿ»üĽžƿ!Created with GIMP! ,1@ @*\ȰÇ#JHŋ3fOǏ CIɓ(S\ɲ˗0cʜI͛8s6Tϟ@mJQ"]ӎL;sի6J]JW7!/z7K#LT$_uFA!)y6QZ|k܆Zw[?3 QGHb5u@v8ϟ}0 2nad)xD|}9] K^=Cq oͭ{+4rGnBE%m(F j{LoH8B@vG1D #W~ 1Kc[1߈$(;pE .L sJ!Z@<@)DiH&L6PF)TViXZy@ C CYd Th9|xJ-h{!q)R W\cY/C 16w?@@<}d4BA.O:azP4/e!4HϹ$?FnЉiCh 9 H xF! CW@&LFn80m*5{ >axHZG d D`ᓆ|XQG#w,@U-LHu7P#C !Rs@H6 ({VI*LSBІ:D'JъZͨF7юmuHCJҒ(MJWҖ0LgJӚ8M\$r@NT% Cʴ:S !"VծF SԋPRaJ Q2iArؓ=D|_Xv%5ȟygZb Xű[C(ȼ5e\0PYYA`dG1@`P\ϴ 0_}`%Ams[ܞka,z&4%J$Rg,AJ[Nx2!\ W.AP5 , &,`, #@0?@Yފaz = i" \3]GCp8E@hqBID2]^`FL0D{ t2y 'id$nCŠMřBB`3H f݈4?ٌZ}уH /P&1ϸH2t=YZ ]!,6ȉaS+X@iP(9 J._h@>17=g_3 Wӆ))|`{RH,ҷ]ksTLmXT=!b{Uk~9;n FcC3#HW2BdmqZ;?h<""55cC8Yh>dT|!)()g ģ鹄Ms%d.6l :fZ @ 2@3">GW_OP+5!q,KCOCsRjP RVJoDI KsBC(x$DZtӛRF DC q@@}'tR3,i/H8HB2. $7/[p UWd w #`@` RA`8T|uP"`Vx$ ,4v*,؂.0284X6x8:<؃>@B؂#5_EhG;images-actives-html5.git/src/share/images/ia_old3.gif000066400000000000000000000200021250410645000227160ustar00rootroot00000000000000GIF89a1N6O7P8Q8P9#R9Q9$T:S: U;V<UX>V>(W?)[@Y@+\A]BZB,_C^C\C-`DaDbE^E/cFdGaH2gI^J2hJiKdJ4jLmMkMaN6nNgM7bO7oOcP7pPeQ9qQrReS?sSfT@uTvUwViVCxWyWzX|YlYF}Z~[n[G\o\I]^_`ataMbcde efyfRgh{gS|hTij}jVkl kWm nm^on_po`qparsst u tev ufwvgxyxiz|{zk}~ ~m opqrrs u vxyz ’ĔŕƖǗȘʙ ˚ ̛ΜϝОџҠԡբ֣ ؤפ ٥ڦۧܨީߪ ºƽž!Created with GIMP! ,1@ @*\ȰÇ#JHŋ3fOǏ CIɓ(S\ɲ˗0cʜI͛8]>σzZÆ7; =bЀ|孪իo(-NR;p, K%1Z Q@ Nl̘Ad^4 .GvU0G Aa R :F@㦂& Li!nMBHɲ#@AC(@DȦ%A 8Ʋ&Lp".0`M1gxc@$BD([Hs R;DѥAHF+9X@AHRdK5%I(!s 6yqS "AXXBx 4t3e "]D&L .B0$€7a0 7 *C|8pxC ΠMƌZ(HH!d@h]7N{Ӡ:"R;p NIVհgMZָεo-'Q Td2$;ѥ'hLcJlYx,p <.f7d袛E0 "  }v[cU7VVV*4A0fE@r UCޛc(\@!:-46Y}bLQSYd, /#^$ gAЊpHbs~$yX3l `1욇$ @/ /&EA uCB j1? E؀D7$H^;7@g\npA`&@ YCk@G$Day6,Y H>U pW8k 0"0&D l 0'WG]HEBٿDA2!0̳B TXpR@2  ``T$Y; t"lT(V}$ܰe0 ej@#`V? %V2sP1xװOP< U sX` 10 @;@U(p-5҇-F!/B{=fdMs{[v12QG` `g `x  @p @ @X1! XK` ܐ+вif `0 Pހ`׆& 0R Q@ P@$uPSkRy`!LKmTJ 0X ($0p @ pMUQv+ Mzx~!`2U`! WVROEj72"M q8(PJpH4md#I8 Mul q 7vx ~ 8O1@@+0wQ  UX'xrx!2Φ$)=4 OSeХԇ<h0bpzVi|Vl> $ţP,ÓD0>[!' ?W3(R_  bbpcG ł}Plo# n0[zyN@ q@G<  RLP@7 DPB >QD`N@H -or(0!J&\co.TPg@*kШQ4ey3Ҩ]MV]n-Le 0`VZ rq9ʠ9`Hdo;&e1`˰Pb$Xy%2\ G41*b(I&6(yI)bD@ifHr8\tuPb L$ j >`~[#;Шi{I# 䀬 1a#6 1>N  <FE 05:rYdY^9@2۠T ^^X 8"46&Ш3h4`JP 8!#6PdL̠ ^1TlEZ<C~a!溠>b^8H?p !a`ˍ'x#D0$Tx?T8!R"#& 3O xb:#u!$=!|hC{WwCARH."MhH%( SllxPؼ  r0:Xr]rqi&k &nx9詎Y & Ã&IY.*r!kt,@i)rX!m^a~J0(Gi<8fΠ>$~ X$q"Et ۠:iDk;X" y(qIHw\Qe*WVσ8k/Ce1)!!"v8*xP&@4h B(m.0T8=l!09"3H6"hFR!@ "*5eS=ōE ܀(`" @#`C !pø_x R-F R< ‘78H#": ^AQx Q(Q:5`E80BX$8TrQ:,a q !3C2*Z!T>,a "0x4% h+'1(>*L,ߋP& rؐy`)#Twc7 U9܉n !R"r0Lce%RA[6D MId hb2IB<<8$ \ eف7&G0W/ \#jR0B-bh1B*TAD( BERax*:@1!4cA ٩Xp'0T 72W9YL1n ;jBEElYVj ;B<BYKBugjqE  R CTLP$"a׉ ޠb| %EB A &=TB)Td AȖ=4 4"T H3 x21}H/ H$5l . AO,1^PC+IhK0`pUbN`5! 8ʂyTc" t!I;dF{Ab`䄄vD)l9E0|"XH c ?ʑ%! &(w (! @E=@`!":AhM! gKC+iNwӟuE=jRԧFuUjVկue=kZַuuk^׿v=lbFvlf7{"pvjC[u;images-actives-html5.git/src/share/images/image-active.gif000066400000000000000000000264611250410645000237560ustar00rootroot00000000000000GIF89a#6 M * E[x 8 X /+Q!C+600.**6n$ ]*g(i)%#&!}4t9#63-SG"+\H@Q3lFMID18sD3gG;7>>C<:OIL@B8M'PIucXMud8^c\IdpQbTkhif^wtqWS[}]aek hCdhg znktrn{pizxG{~mńQĐO zv{֑'WɥAװ-A٦Q$Aٻ1޶Z1ҽfJ/]? O翻eƨ.]z@jN(`2fl;M3ouLs;\ih{pVw}]q!Created with GIMP! ,@ H*\ȰÇ j:DȱǏ ɑZhRTwj&OʜI͛'ɳA'K C̞ywn۶fˢJ]֬իUiʕMM+K,N0paϷ! F먼yKmz߿L0ᩈmPd!q 2n3ۼyݺ渽bР }U={ӂɞMmڀX yŲSm .㘳O?A-Ol~qE+p!:c!>3V3u8?O?X`nSH!eaG2|bg5\sMڇou(L8#d?_]S$# |(݈k-@9,È0̗;o./̡ћVN{ g( \aӪwX F|aG6lv9D-̢ HCQU`2 tH6"񈈈:1'=:/IHcЀ6D!.&9HbD"< 0ŏXQP09 W$AC m\.^z0b\2Yf:󙙈f&>1`A09 6Sc?9R<@4@`@ 2נ.@`L3ATA$`SX9Q(tPZ}q`DC~DC>3DPUDMeJ$TCX,8=eSb,b0GqtGwG}GH9CHHH{ NIKID?:@ q# E4^X _TiKxXFFYH4hT$MՔGtsTHHÀ &@I@OSOOLJ`PY`P:Ex]PL5FQxxQxLۨL``UuYT4 PEOT Il0P J,4yWLQQbA8ƕ\/\6CX#`NKMGTGxN00 TTJYT8O pUY>P^%[^lV!^^_wʵ\ͥXѧ97]-^yYGTbN#0`ZE[uI^M W/PY\S2 \Y9]<%_E2@uWf )`g9Yy V:`pp9j Y aavc09(b.c/AI&`&RbFbO!e0c9 k>Qh&pdMdO5W1iZv#@IN`HHLvJUa ZYj y@  l2*gZPq]T }̖j f@ n1q ytdz֥glB h !V!2B U&Chdix*ejo+ՁjVhc_ &'H qyJ a 6q bj$R#Fǰq`-kdܐl'$f b& HA ,bnkTJ#p#P l $ڬ!!I$Mrmmpp(eAfn.qz#ְ=2ְ oMp ౔0Gjp0"e ;K 'P':#b ((r*m &+&&2K5k 6@(r:P%'wRb 6E%O," 0\[*$!7r$Wr"% puc"ǵcsزys !'GWtOu+mK[ǸR^ :vk- >7-qW.dAt 'ϑt.LO7/($"@B)p ; '"4XCr4[ދ1 w'w.]+/~W/"o p+sA=B1ݛ- 'v 1Q1yH2wet6,3k38' Ēvp4RvEِ1o7d{3vw`#+gUWuu5+Y0 @;e1%{|Q35d Y8^îQS6kzg+`WĒ_7e.H cŀS T<02|[lJ69Wl0ڗ7w3m44VccA;Ʒ'ȏC |EɓS|{}~c;EDŽ>x}9pʔc9])ov0vwC>[x{>ʷ>39~Yoa?:EH?~>#̀/I?S,TP!# 0@H.upK;>ђu9wE(@v[{ F$`'AmA.A]P28YT[spBdG*+@Ih>Ȅ 6JeTT=1:"=@i=ؓ;tB4ZDDPмYY^ElKoNhHGjXGl8ڞP8T*ŐTzP'66,]AuN15S6GM8H  ,S:}]EGYKe8O:9IXUꖍj9n[ NbNoeveWzٗSePbF"LOYB3A7YG|ȋUChŞnllV1c4_yQ\CЗ~[yJ_Zi@eI@^kY-_[[s[󩷗l\e<RE.IJe9 e^Uq[\u)\ideCϕTAEUP]o$ @^v^WJyVK[}/R z?6Ȯ6?`]]$) (2HV!'_ř?_؟ڿY"62- bQnppi ퟛp@a&Zj ;Naj>!8C,^ĘQF=~RH"!g w-!\0L5FPRN=}c$GgXƋRBp7k>5OU^eI9͚Ce¦EEEf5\V#r-ۆԞXZQo!Wb\Ƀlٹwn6=vLਚVZ5.VӠco8 "m,_F*ō\hL=,YGކ˘5o;ʓ ~.]| V _~KŸ1b:;@‰m s9dS%TvF}Tgaoāѥ{]l:tG?xbv[?à-9>~,Ei>o:~ְ@XHG=f=vv犎U> ςդqP_!ES鞧7\#4CXAߙ/\u,A&6щ?jb>a 2d`QCaý!fGLS.D:1RDQ:LA' d !-@^Pb =(`ђF!񍝘#78J: !ٳ|.,d,ы1p@+AZ—d0u)f$Y jpÙτ7nbOXr _hH82Ce:@W eB'4P fQHjx5GC/שvW 9܋h(?v #p(ũD'2.Wh$J> "F,+],Ѓ1Րp 3_)O ?#!KCB;ac6AS`՘: 1_⫇]'0$aֳBu듒mk^-WU`M=ʑQִ=lN!6>`1f1[U`DJvcj~"@.Lkb 9tp+6VMmq PF#?` Iҙx G2rWP5keV3@iW5q襣SxBPwmzBػ$<ױ)K} ѫCǣ?q'_<z4@<3^5`pm3б2XK?Q.Hϼ懐 lvG+};﬷0?ڃc`୿88qHt؇~`#)p?!x9ۿt98[3'  @tx )<擋˿DA?l:Sh+ ˶D+q@ 4* |)@3DC4#9 isBPB%l\A›-A9yBs@w0(C T5\'8>d>BD:<d>?gD CLDEBFD;h; \D>? @PQ'1ESpwp؂DlEWD0pCrD]EIPQ,[FF)bdLqXfĂhtW"T(dhAKDqܢr+,s|uLeDg|GW|EGĊKNKƂ% HTe@HSTq(DT0xǖ–LD)Y >GQHB j3Hp[INl I˻Dn˯lE`,sTHzw8:2{ǻL<[L†a(KTȧs2.hwJ*(x(PL '̢Ep Xa04Iu4|`TdtK2,;˴Dd'Z>CX-(EށxJ|dO6S-*n8KbMZNmD805a4]-JheW~e\eZxłЁ!GbD-4fv;y20"?3g2ĂIfXE՝OH؃OG^fIjɥ܌8؁ i;hLbB^v;f*ȁXC{S>ithڠ~֡VޣH@DX48c>.Sg1邭fkXmN,P5Ϟ-H: Vb-p^מ{+2`j6Te=5\}VDv̦NNfdUWɭl#D$@&4`Noٶn$P+.(aW 2`hl4TC6xt ~hnBB=f~ ` 7P'qηd$<<˼p%_lƦbh==nnxr/sshqwqFo ro"7ŻNrf ogh&Z/EgtFr/0sI7456s$0:<7=OlfNf|h*aB?/ FE[/s3Kx5M8:mXsSGlfgނB! 0YuZO[3ִMN?v#;sRiygf*O*؀ !؀(mvHu2/q]w^_gaGNsdxM(~w %ȀDZopx^?tnp y·Qy؀0q?Ltbǀ'߀W{7xWHgq4gf w/{hRX @Dz/y _z#'7GWgwׇ؇;images-actives-html5.git/src/share/images/image-active64.gif000066400000000000000000000050121250410645000241150ustar00rootroot00000000000000GIF89a@@#6 M * E[x 8 X /+Q!C+600.**6n$ ]*g(i)%#&!}4t9#63-SG"+\H@Q3lFMID18sD3gG;7>>C<:OIL@B8M'PIucXMud8^c\IdpQbTkhif^wtqWS[}]aek hCdhg znktrn{pizxG{~mńQĐO zv{֑'WɥAװ-A٦Q$Aٻ1޶Z1ҽfJ/]? O翻eƨ.]z@jN(`2fl;M3ouLs;\ih{pVw}]q!Created with GIMP! ,@@ Hjv\#JX9uiVď Ɠ]geDIsc˛FًOg@լYm͉Aͳ'n۲> UV=t^<>էճWCEgѭؓWn2balڿUCuCn][[Fcz\\gu07 FƱ(Yס,ٳ7X+-E*.Kx;8%4'%Ds2$fK_ wUKDd1}СCRoB8B#6{.{]3rS.C>| |S\ӗ]ŷC|3Ko=.E2} XA'(ND >xp`A`cp A* !YDv0X a0A;'`>XRa ~C, kpwEp m  u(dp0UBNF< [BԠE80Z@""Ox⑪#p`YH o?(r|'"Y_.`Dā X@': lx09LQ⁔Td&Ɋfj˕A"` f2|!;yCSt 8IA b:vl$ɌblAF;a&8);T !NuV"}h&A0=s:Q(Mi Vz*A4HSn dhC""]TӞhA0-Ρ #]KOR=:<D42\i5wTU]:P::0BޒM :+ T. 2ՌN>`Zl_B( $ B8j@`A 4` $yL.GIjcb](l-8C d5ޘ@J@܂%gwـWBe^[;`_&*d(#jc<#s xg'zeuꡈ& e:fkXqf:)e|iQK.9ҩ^G(&i 6BaQȶ̢,J%>Rzzk f",λ* ꫌;㾵j W ,$l(h,XDa/c>Ȕ^YHaqF=uSZzUE `9{ FE:΍b]C<]]W'tZrCV&pw5B9y)k` B0e]IL܆=2Z|}~/[)ǑHh%e JUND'D6p -Ğ(pv`E0I48,& :hj&7 loW,+> r_)jJbZTUlMj[kG<SL5́-) /`d@i+wNY 1L*p20*!1b* Sxc_ yG A! *x:Q$HL"F:򑐌$ 2w-laj$bԨ UAW]WdM kakXs xKâ+a M8ז,ڱvt\],p@4`;WԈQpȎd̓4f K;5$+YzskS&xsA`0n cBAgI/ȒKM A8&6`{ ri iASn)M #74e"!T((RPTt!ONMv')O 3.N$dG~  *jf@ۤi?oAuH2 :1B%$$l ;-+NAlu!F.Nt/_(" 8efe+]  Nk0~A2 Q"^)mbT &&O<[^t h0 Yxƛl{P:R!=]E,cs7 qADS)pO= |qm}((Jm 0r0q2Bm5~40_3Fa!tASp d b9;冇bI YPle6w⯴Ag;1C<;3\e!1&4L<Ԏ>Sm zïeƒkfVyg7ҮNרV7ǐ 9vLlTGiuư'@L<$ӭnvMzη~viT2Y½f~p`ы;ȁH4**g'{wr Хo 7(3x#W[nd1{%P=1IPeCH4KʕlTB`FF|s+C]bd)pxcM+ТM>sx'ЉA*J$ēm0EX)-K):<,8H8.M4y,};O3PX"3  Qbښ< wI%h_bAwT/}r`: 2U-R/j*z{1U)aP2~w2+xVpRZ|/$Ӏ0G(aP}72@`pP7{@f'RKOPz.@Cild '}@|`dz.PX ~/XgxVYFm[ց-'u%d{wrOA O20v &RG|'N|pe}uiIE 8[eOs9^ u87}%mocspvpszV'!@Y%eC&l2T$sxR'2skA$ W@ Mu;@[t"p3@w8f28hH$u@8*pp@$6*`< 0V  &0\`\(ao $Wp ]==e$x aaƒ%f.d%$E]ec^R)=ݓ^_UB%%AeAlv90M_h%ECIE"1AHcyBud4֖p.D(hly B7SLv`beTK g\Vc{ykaH98cuI`%jGG`vYdeKf"jg6eViѨi73_cΦIqɗln)ٜz{FͦbIJ\ȝ;i llDyٝ^f]YBTfGYFf؛A%imjי0 X̩Ω;5hVD) ? J[vBf h ʢ vחC&(bgB}t*r 7wx, 3͂j6jL-iUq8C JdXVN6$b?b晣'1!kcP&r)nK$bw~֧":HJ1ibm!QHjiD:[BD)+l 9ڤZ Ԫ6YU#cFʦQvF)tB&mZZgI 02zmfІ vnQWJ?:n c;images-actives-html5.git/src/share/images/indexStandalone_disabled.gif000066400000000000000000000072241250410645000263660ustar00rootroot00000000000000GIF89aP!Created with GIMP! ,@+( *+ %$$' +& Ѩ֗Щ "+ҩ԰! P 7Y.t$y°CKȨ 22Xq L`},@ġ ֱ`ÆNbT4B}ࠨHhdȑ%Mÿm1W!rY8\ Rv"ȕ 4PG.H TW J(r4.€e -TؼYڶpέ;ѤJ5u*M'62C"iАwʔ-_̹n΍@i*8uܒ8p}ݾ~!fA+ 4^JTgG^ȃvvy]xU&yr1 da4 ~ 8`x ZdX4ar"࣏z#8vݥbp-bV\zlEO=^1@3:`#?!_Gxo r U(蘈 h ^~=xjybogY禜v駠nBHBQP +t0ס@*k<08c(}* Uۨ2lA:I = JX8t(XP(0Jtu 2"Aj~Kn>ӃC&2.;P Β@t\Qaɑ"t yY-MMd0+֐h)uLy]' !A4JpNlh>ۥ ,G"0CHÌr$S\ugj|ZLQu: `6TW`Q,244 6jG*n~@ #rc$E:J`*JIx<&ezˮ`O}5o}^項c($^zo~|#ܣQ 'hz=^y&~O|˩qTHL#t` RJ_Jp''H4ֈfF Ŕn}Ka,8p/\Le ZK! LX: Z xbxHXE]P \ B0bL X$8-0c4Ps 0T0a d'I,#K($}0H4``3T;+%@H!C%%;,!0@OG*=kL!,IY!GH/LCLy?s^Є5e>%G|M:)0"A䆵-dC{98` JΛ0ቁ/J'sgqd C6@[>D x]ɆpSjF9pvZz# r+` nPM yVKjZ3 ̲YK>Op6kr= ||@bӤfԫh@F_1Tn QgW8e_E_|VgLD P5eD٬m\]]FnV{L[kuĺ Os+RVQ(4-w?6i/1"G$援V]4 Mz?BMRyX"#X_=mp%?.ϑ9E(/G{_N|)S_`P60; w7[p۶߻V@:N?cL-9 &;PL*[4g %cY(PP@2d>՗/1 LBk(Pos$ ' U\}U!2{=آ*XZk'h%@ s80DJs[j,0 RM zͯ6H $tr1FHo4j]X d`o%=bk@)[v$(@SUE Oꆶ20iUP.#-=k{a Yi# T/yLUpo@&/n]ysvxıسOA)\e6c 56C06FpeD !xU*:$ LO%UMֱFnaƻ,MxʼQ97Bb$<pc}?9e:OK*Hrv},膿O659/ 1mC=xCf^Amğs7|XЕ4!L^7L?rgܹ7d%] +w_7Q0|:XOe}PQT"dKQ7E?*gA\!8#F}~PqJ "K0V LPQ_"aSEBЀ_Wm* 0)UcQGOePq $|7]w40p7qUF5; EzHv XARdZGm)刓w(2脬*_H53808E)%cfX_uL!)1H]T7{1VF`!UըAq;v$98^8!`Bi!a𨋣s#:u]3][(X9f+ui#bYZ83%$Y)aaa 52) 4)7kѓ1)AYe9s? M-6P8IX]fyhidY :Ox "_BOyhwFiI#(),֕{Y,yHhU0acya^ɑDi[z)d`iFWY)>_biby6Yb"(s\Dٚ;>>΂byaI_ `c9].6}i4`B@;iəR)Shd>b\]I'@蕟=f=9Oao ;images-actives-html5.git/src/share/images/indexStandalone_enabled.gif000066400000000000000000000105361250410645000262110ustar00rootroot00000000000000GIF89a         ! " # # $ % & ' ( )*+-.//01234567<=?@BCKOPQSTUVVWWXa b c!d!h"k$o%q&r%s%w(x(y(}*)*+,,,-,----..0010212322334343454545455655667676777878989899:9:9:::;:;;;<<<=<===>=>=>>?>???@@@@AAABBBBCCCCDCDDDEDEEFEFEFFGFGFGGHGHHIHIHIJIJIJJKJKK!Created with GIMP! ,@ H*\ȰÇ#JHŋ3jȱǏ 1M0R\R@ʜ n`ɳ'O`:4H*%B@;|JM T(ѫN:sā,6k(]KGLUY5&ֻ "w @gϞ<~ +lԨMܹ|Ҥϐ 9rԨ#E.T@6WT9K?. S'N6m&K*Q:ҨU#2ulٴن۫s2"1< T:fjiEꨮz <ɺ#4@30̭L1:iblzIzj=i_(HIeW 5!d+6Xc P߆K)?iK{ggh0B|M78o ?\Mv[r&%Jj}+̬\wFY״d-1TyvR p$wbcE6Zw 5rDT:Q06[m^6cguxRACj!؝_ wXbkYp3N"zUsԌ,orbu1bw wƠ<䣟 'Sx'huO#w r3ܐ)8CVKU"O`#R z+VB&$Y(C2JR8Dl몔2B̀SW@6Ȋ!- Pr-h 4ckH`D&!Z}뛵U1W2Z6Ʈv5QMN#ؗC</E֡"&1ix \H%z̉W*ډe% By"\v0ͱ׸+^cf4(0uU!3cGl3J7sQ|=,fuhY2f:Ќ4=b wӔ2ZF]8)N/Xх@ q`z!:e L(ByDSp-„}DHA fP"g CBDC JP  ~V"MXRitiAĞPs= ωӁxIS/EPHԊែW6u3tA&螁R"o6Z:UVȄ W iGK*\1'w]2e_')bMfDs =.)e]*T(0{X_'|}pA˵hYTWC e^ p}/U~aXss(`' :@,8T\p1a%t%ߥ[NPm,T5ˁTi)@G}.O9tq AղLEOe'\'~~U֗|UO7OàZZ Uc~vT VU(W`|1aT S]VuYRf!L@*:eqe=@(}t ^E^ăoVOH̔WC1?6YeYSX]Xѣ p^30=e7_JX/~[r8t^qѴ `= ljuZģ,y4=B'=р%Ȇ^ `bla^+8#`` !Ba֊E?lUT6vb mX[b1bRs]XXV5 fHo5{%8x ׍Zc@6l'?8b?XH:kB62_uȍCoRdZXZ836HeUfň_H:Vr>;-`E:*3L.)lĊn5909y0#mv@(((Dcb(9d`B"F8hVɐoґR>ö\F)TX+)91gEqIcA:)9K$riILA旑pYX\]^]pY &!!ciF^oOD,Wk Wj.'3fAy0H39`aț҂iShRmfZٔ^5gRakLJGK)-qV WT#nyhmafMy.{&C*adip˙-jJ iYoBz*InVF B @6z8:4qieTk$c$&l ltkqimɔHa" 3qffAz2]0n[SIIҶ fgy)HO) 5֫64gj6,z1ʖt"'\3I'FCF0*i"ڭI ]SKwIAn+ jJjzc)@^CKvqRJeI* F[r#Kq ֢FZٓi5XL4 ʟi-p& =Jg33 ënTg68L;images-actives-html5.git/src/share/images/inkscape.gif000066400000000000000000000100631250410645000232070ustar00rootroot00000000000000GIF89a             $&%*,)2 $").#!!&& %,), !$(" $$"&"$!7;. 1$%#26+"1-",3<'%(&'%*%.8 C)'*'(&2$4()'?!G*+);$=.)2<#G7&=F!J2)96(9=%D+-*,-+-/,E&MH%S/1/204D)I8.;;->O%V>,C130231342E-FA/FG-OP*S:3;463Q*_574M-TO,ZF0O68697;G2F8979:8;:=:;9V/dD8CU1`<=;T4[\1b^0h;?A=?A>@=F>C@A?D?Ic2q]6`R:\AB@OPb7he6oDECQAS`;jb:pj7w^=eFHEq6zUB[g;xHJGk;u\B]q9JLJaCe\Ed^DjQKVv>NPMeFnQOReGi}=oDypCPROvBXPUQSPmGwSTR~AwFUWTsJFCEEWYV{JHJ{M[]ZKF^`]LKJO`b_RMcdbQMQegdNgifSURjliTTmolXWX[ZȵY̲[uvt\z|y`~!Created with GIMP! ,@ F*\ȰÇ#JT(ċ3jȱǏ CI &+\ĨI0񫧌M9x.Sc(fL~ˇ=zŃΝvĩםv%ї22 =zUźN]s̕#Gn8oۧxn}]pT>;ViS{n3Mx.\aH)W!(Ql2V=rhΔ!#W.ZVTRE;% *ԫ;| Q"vٵo{+g'N BY=t]gE>xFy jמJfnM0 Huq`w 6 %\ 4rG !F)-F*ꨡF*Bu s*2ͤİGuktI;MÁj $欳2BVkfv~T 7H6EQRL=8i%>gSS5;sSW:9 ʾ"IY P(ZbrqvX+##^q.@@, 8q qB&Bso";O8@ɸs[񃺾 ߊK)h84| h}'98P@tvNɢs`6*тoHVS)7c\[l7b(TF㩂wuJ5]:j5y)L(`D5*>ͫFT!VuH\KԈ4־JI А !+o~MT*'E 4ΰZ "wm6fGKZF@ BYl3PE5^4qrnMr:ꂋYn> z x;^ .k@Ptc-ͯ~_*U'!<cXPI&r5Ԁ ]xZ8!j(H#>tgL8 ;Fqhd|"HNdT^ABrA*[9C āCX;h)&4?_N6pW ̘9xγ>π3tA@!E1fh#DZ臜xGx+ k(mQs@iWԺ522G8Uim P5ZX/x2@ ' VZuH*UنlF"k=EYEΰ#%Hя)=Xuԥay!`f#fBHk,z%- f8@f }偎6 [XN&F,ŗ2(\2*ral`޽K#Z GtmSVcrD/(SEħ F6Qfz QK.҃1<ȇ7'D+{1Q2躼q .8.K8V tE#CW:Sf4hy|8@CkzJPtp  wE$4:*j0^|c U+Kx kM+t߶j~Qb;~C(e;!-@& _=I $r?vYmL?T?R.%7rQز5Q5OP48wU{xhĢ !+O{7U˒XhTH7YwucȀS ~RVVX@#J%Qc .~;5# X8Ga-%w.hf"&cRǀV7VH4J{$؄l&1 UD8[{{wzDiK 3 >0}|gCUkOo#]8Wc$0 ! K<>`#kO8WAqC+` 0 S`PQ޷\ - v0yȊ(E:(0jB (:R!$VS UBl% e E;ݘ ;#&Xx(p!g Zi#"4 c֐p0_& 0 6 0&^ "9$Y>d VPA0294Y6y0)\P0P .PFyHJKI@ ?0A` % f]5b9dYfy>OHڠ+(c]5e't CO|ٗ~i$p , ??` 29Y9H0 VV@p Z)B p :f09Yy_&EҀmY xp™ʹ̙]"00 QnI*d xe bܠ {깞ٞP?(pZA,#" APz *2^Ca aP0"* Pgv){ ,ڢ., k1 ^?l :<ڣ; y4 @ HJxCJpD` hx Q,R7`Qj_pS(aC ;h Ai:tZvzxz|ڧ~J/ Q*P;images-actives-html5.git/src/share/images/open.gif000066400000000000000000000067201250410645000223600ustar00rootroot00000000000000GIF89aajbkcl`q]jdmgtenhubsm}ivc tf oqyjwurzovl xs{si!}p{wm!yt|q |xn"z}u!}o#{v r"y s#~{!t$ |"u%!}#z$ "~${%#!|&"%}(!$&'"%'!$&($"%'+%&$%(#&()*3,429/4yB~8=<56HFLRSMUTLQNSULTVNPUVUWWXUWZ_ifeǺjĵmĭ}‚ȇċˊƍ‘ɜĞʝ˞ˠǥҤΫȭϬɮ̭ЭҬѮرպ!Created with GIMP! ,@ g*\ȰÇ#Jp A3jȱǏ CIɓ(S\ɲ˗0#͛8sּ&W:$H!\B5(H'H`!%jդׯ` HHEpᦘ;wػx U3! !NR5YE5jP qcc ˘ XG$Cq2RqX[Lv(woDBMiՆ[+dysܝwwTĈu}!|xq7R{rN>3t݃;-Iԯxw7@ߟgN8ELz=_u'vgXbd`[хUVtP0(,FL!T8HHD<(`Nxz- vAxw!b[dRւj)QA59;X `-(|I'~k:$a(tyeCYL5U8fID*ߛ*9'9zŠ!hhimNzUj뭸뮼+찶jP̊PЦUYv)LI'|&+KHt-[!pVT7ĕYni-vՆ`z+9QÔni\":'HUdkz2p-8 5I,FFXs l璘J,2ٕ,2}_Gp,\iPG|졇\1w-tmvol͆p-tmwbHA.#khi5$wKi睭c s[fV]DŘ:NtHJ=+*ܡ[v롤~nj^ᒢv_zI[,0AlA(GFMC׌rN<@:=c x ] HL:`A`F8Ƞ7F iQT.h(L 0d+! [X/`]ETAE6[W+jh%`!.^Ғǐ9dohaL%IY.TѥSsh'uRF5چ!ɑcc$e{bPGA'i \F3A.PIBf>xlρ$;+\J|{)QYObRh,SҒ6F<]h* {1iL`.sbӞPլ ) @ !G|=pAi Â)ӟtEBj8ԡ H&JъZhT)iGDGiәƒ惊Q"oLr]LDnNAhVI>vqSZK& NuFfv1^H::%,R.ri]6AIi'LmSx?m@GԢl ^R+UJp(<_/w-TxqubSYbEwRT=i~5^hWO 𲘅ٺ4Vcu\翅65loTVԟ%R׺ͮvz xKMz|{㮏ʯ~,z"3"w*QMA]jQ @H0AJZVmS&j *"ՕHT`=ԀHNp!/a AL#*bsj689qt_Llo1_L3fP1O,%g'*[̱^^Y(@f\+kJ$N,IS:bVdzִRӟ =R>Frh5Pꗅ$)+_7@Z3Ibд)6~# l !kYG+dz',ɱ۩CWUe+6X퐕󐤌 |)л! 7)~6HKVJ7C~vSL7 x5 /dmSGq+jJeIrU'|#l4U~|JæF\Js?5DžH6ϓUf$`F Mi}N7, SāWAηE t `@@ HDP`@&Oyϼ7{ "pH鞑ͦ07zBuܞD?(!wrُG]޶"Cժ> JB?z%ZiUip%,;\eTM)'lme  ‬U=hq2PEF!kj\"(Yqeweu 'pkGF{/+5"%W[gg9Hp&YdYҁUQ*XXH}3}1Kkւ0+5[e:G?8XօpQZ>B~~PTYg-r+3d%Y9~zmׇrZBu"e2׈4\e_AXwRHE9ka[#%rkh3ɡ@d8ev7J؋Cht5T7] dfT\5H*즍h!uX7vu];images-actives-html5.git/src/share/images/params.gif000066400000000000000000000104061250410645000226760ustar00rootroot00000000000000GIF89a%^ #W'Z'`*h *j-r/t0u.b2v2|1}4x45 379x486v6}:::<9s=:{=k?= <@AAABBCDCFB E DFH DGGHEII%EzJJKKJM!GHL IMNHMOMP OPP NQTR-M}O&OSSTQUPTU!QWR.S[X-U/VZ6W_+[]*[`7\*]-] c!_3_dE^<`D`;b&foikCf6i#lCiNgEh0lFm-qMo#wJqHqBr=r=v4x8xQvMvWvCy/~>~]{Z{Y}Ld}PDj~XcOGroUkgpPdR`]w_ewmԁdkp}‚xs܇·ɍv偣}È獪ԏϓɎܑۓᕱ՝ɐ霳ї啷ʠ֜ܦҘ퟼Ϟ覾鯿Ҩ߬٥׬ذ߿!Created with GIMP! ,@ B*\ȰÇ#JT(ċ3jȱǏ CIɓ(S2͟˗0a Abǒ-*sD8 &: |*V iӞ ^vJeRlⰊ=B0*J8&\sH2YUib S')KTbK'1I*\ QeT1#Ȓn1.)4 *äV Cy 2ڄ, 2&}zjs 'b$A}P yK0@A Oz UNL漇CB 0#^2D͂$9#KJJƝՉ|ܙLq~[R n<#a vtpMD yEqlfA,R0|@.1Ô1$lAML1H]+{(n<(`iQ^d| źh*{&T_=SP8Xdq`ˮlK6%"g i6j]$BuXl\Ժv-[{t V, imp]՟-!lBDKZ2"F4E&:PH*Z#pI5x>\ sYD^)AE>`h+&-8CH0}% ZbfƙQ|x;< Y&%@2p Mr#UK1,x b54zk\BrrdP&2-Ut*1ͣx.R*WKr!](Kr5lb2O𲗠< 402HNyeJ7 d1̘ 84 ;`Nsˑ p0,'$@> hr7 :_n;M55 %&DX&3:6І+ǡjʢ%S%XRY|j ؏*XV|U/@2%2U(BW]cUdI:d$n\L1&JpXC8ULn+["\\'b .oHu/v<%yPKTߞx<ms2L]%$oU킪]| & X #?ء(ip 7 hܭB'Aӥnex(H>0_ G?oEd)0RlI_zgp"Ͻ1]92nw%3KBLJhb0nh>P7d/$z.K4LF]"R nx+?2s? 11ciiT4jP`(,h,-PSAvz/x_2#f;Z' E6G:@>1Žd}[Ջ>QpDa~W@ 3^oO`$@%P`S .kg z. jAw8"0b6zB\A3*q | ɵT1SGpOyYB;xepZ]5q{aPsƒjrϱ{9v0# pRbx$9 zA [t%;o#ycq0#PCe0s!aMh.Qr@ZWBHrC%zI4X%xȂaMYZ  ԐIgUP z1 @%׆.{ tQf@&T؂"z %>P! 1A |@ c`@YK# ,`J=}0I8tf#@Ċ#q/7*^d0&x1Az~b9Ig) mrEq3B A̕?`nP;ptB zx>d<)>y<d`9p,: `)fA2v^ԉ9E/288)SvBbeuVrHy(`H4uVCKII)9AMAXzf^2UD֠hV&cnjb*,F ;mfS$Dv3 e0E8.$,JgjD-jm:DvhL^YD,ske&Cdef:Bh¨ze[YC6- Be2kh,46g*?9::"k=>QjCfl>+V.VCxj* sZA!J*ZlK;&ji$iFil[z*R;images-actives-html5.git/src/share/images/params2.gif000066400000000000000000000134001250410645000227550ustar00rootroot00000000000000GIF89a1B]FfJjKpMmQvYxX~\^Yt`]bcfg f eiflglnqp opt/j(lovxsxu{ zy|z,xAt+{~#0~,6@N'=5E P0#- [KRE=(2[g EFZ#a%;4$Xqm:0^S"3g8uoE}-_oSA~ȇxPYbwՈn~ДĎ`Z~܏fpϔjzݠЉxҏڪڡے!Created with GIMP! ,1@ ,D*\ȰÇ#JHŋ3fOǏ CIɓ(S\ɲ˗0cʜI͛dzO:xH*]O58"9Fǎ*~AӳhJtMv6S'DNɳAj5M]8bkfT˘}3FpC s%0E(eJP@B'z 5ۧ#.*X(1NwA%5Г9A:0'c/ ͋Qk\ȴ0hdm.`p I f\@`nSa]uFE \݆)a  )O0@aHxOt؋q2Lse#o CY|pGjM4@>0cfPpj<7ҐC ->1|Wv%`FM O|6dN!O$AIdO6;pOdr S?fdAJXsY?ˆXDΪ` u6^GgȒqF~ J>(e( o= s$F橑`0#pB 'oQ;/ @[a0#,mR JD4C 1$p 8ݔ)O@1x0A,st\*Y\ˑ0f(K>L:BY)@+"3guB\;#?70SH[ф"HtXsW_v}6ăQ 9+yrc-YWngwT׊nlO͔l# ;|BS3A!ܨ\ہ O, Q.$qewsN e1-jX#<>D }jK<9*fHEH\"T'I&p dh<ڳOQ]T 5%>*8{| }AېT^;C޵|sBbN $' @Cp)jt6Z? |.)Ȋ=B)+ų :?2I ^.q%r0)U'\G/ɐOT M.UaB E $\">y`*k#Ub=aD[.",*Q T}D!M8 7&:3a03 0`l@g([V R&pxȳK,3&>&uS[ř<3peIPV ^H+`KMb:6. .mD\Na~}-.vW r?CC;Sc/&N *zЅ&0*N^/FI#G#:$Ff_7:6pqν+ {+zR78 09&O`1 gWl~`dU޶hPs4?3ZXe Ǣ bp!BY8@DD<4a {$I:\A?Ø4zrTfa_T@ CX^7/`82" ߚKҿ =*\ AxB ,l!l(0Z&H5dŅ$j:,#PϙI>WuLpH c7 78U'F^IMLA,+; JE [Od*Qzx- nsU;?ɇ!V@"60QUoY +Rlr@*?x'`{!~4RIWb4t 'IȮE$jřq\7[>DlSV+>E|InhbN ,q0f1v´fEmJV H| 7!a]A u@B cbvL`WH@vX'vg* >}r}2{7I>W0Pd#"xՁs> fL|m2ߥt#`M7xڄxB Zu1ݓJL%᭏Vjzm$Rngq7&^aRF;hR4DP;6&g6Tk0kUg}t!DN e72@ `Pgug!T]8Gw(D7@')p<`Ұe  *cJ(4c`P(!~BXviERHR|4@u S=Tӆn7','*TzR+50z!bqXcs3We#5VkCI\w%@ȉj;ziCl4A 79]jE0xRn9EH\5E،t0Gqe8X5H,1U明긎؎8Xx؏s6 Հe `k90 O@I_ 9@xI7sBr#5P =1 z#+DHO6Pp%1YHWZA'a!jAJ3#P. ` ;"Xdȕ4c<@"q,E*p'k%?xT~)W^t@`{q 5HWf =q? B`Q!/0D$jjFEI`)p 7>DpgF:C9]r Q rJ!lxc* ܉Ph$Ƀt|4|ZxE;,r3jA=#vg^J٪] w׎j$PA? l'`DM/y\J > b4 ץDd`=#oǎ;D/:p.fDA>dEKf`- [;F*ȇ`"-gt0=^|@@ =e> x4RFg59@Z^HJr0<$99MU2瘷)F y i|0a :Ex@{*$C>OusV%mT>! 0Sv[&e_MH kINwT6=! t 2ƠEճpa{ӐIw;$x@> /vԽO @3p7L:v 8=q'{*N A"r 7IF 7*4@ZP@ xD`P$P ? ?cz]U12+0l4g_u()*Pn_kT܀ z]•OPbGa $Я(*D֚#VJ6"F6 <gLUg7@ 0ހ  B|empOh1+N%oA$ɶV+z\v T Ywr_9|u;BDjЦ @ wppTwIm{Wg*HC#-HR%?ptp^ 1 0@a(*R`QA\U-ߖ=($/D3%@Rf9,.Np{'I(%]֐p@ ʅj4@G.INn䔍zl7oaV.N\ӭz}-l>9 RU6pUu=m|RLhI%v%0h3EԧxΆwm8ON㢎x۠^(ײjN}D50{V}n(nɮ0 `JKgNQ1~>V^Hq ^N3Ҿ3 na^Q~'!XAO;images-actives-html5.git/src/share/images/processing.gif000066400000000000000000000105621250410645000235720ustar00rootroot00000000000000GIF89a@AABDCFF DGGHEIFIJIKJFJKGMKGLLGHMMNNIHM OPKPP NQQROSQTPVTPTVTUWSRXQXRU Z Y[W\^[a&['[c^^`*^b#cg)g4f-f,h-g.i.l9i&m4k9m4m;m3o>o9n-q@n-rAq0t4vEt4w;w?t@vEwHvOuFx9y9{JxIzPyJ{RzM{L|S{?N~GAJPMQDTG\[QQ_ZNaUZc^ZYcQgck_jmctipvnwytr}rრv別Ճ{ꏨҌيԆ镭׌吰ڒߔԗڏ由▲֒ܙܕߜߚڕ㝹ݙ䠸䜹ꟻߟ홿⦾ߦ! ,oH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴIPJJիXJeF`ÊKٳhq$DKݻxw %^Qԋ|+^̸ǐ#Kn %RϠCn B_HͺR pHgk^=y m0}3EqK- שׂ_gS{-{N?>do`yW~y#؃g)@(,S \ E,hb̌c8pїNT1@&Tb6t2$h4\0ϐ fbʘh$xrɖ ӑBS\TP%Cf0 2u蕙8Vd\UWyɽܠL"٧rH&TD8.T *jKbgI :o@W8&j(LtfR),M`$o} 81m+K[b_-5\W31po:׶c4O 0GeE_)4R@kL5™wMoBǓ xL+V)Z<WMRN _f` Qp>K2ÏQ`e JRz"Ӌ=}L #f"pdJ+p)W"!Sӈة[(lݔ {-W 7U/|q5+׶20hcī HoӮ# `8kY5@|}?*_Dxty KP1ݨʶgcc1ں+,Vr: Df`cFdu A@[EAWSփ+/\Z)FHc@帍3hy5tnTtAj nvema~scI<)A \U ȘQs*)KJk.Z7 o! `u TA;ttSkpv>Ch*N- gA y̙]h7cÊ$g<0 |c7 ɄfCʬD\!HBhL+zpp;u ciRo+I— flKV=9^koM.9vIu!(ظߦ\a971sH?p\4jdH-igpяP?]^\]مhjqiaỉ1=?-H)P+,@4.pm7or\9!j15]qP0HuHkWqGr7[ wA4U_ʗ0V(U{YW=r7A  5: /}x}6f8sE]}0GxEyC?7wXrd)ASQf6[mg7wv *+eAt@bO8 g`=pTTp/G C5p{Q I5`6􀈃(5?Wz9kZGn(!ks^Ҏvr)ieIheBqf"+ʫ)yV7S?q*zo"SD  Jd7:pZkjR溫: 䮉B!wLIz*Ku.:Ȧx) گxzFAuG[&e]&!izNa $p 2c+u~LF;B@ 9|o豙-5 ЦHl85ԣl -SIlUa͔֗.#6hLI)Mdqetf$UmR̈֒↙="[X<1&+F5}i^G˴h$&55rKp~!czPΏn}ܦ/ΙN)o ш ى{&{y~<![(P(1s(AcА|ϰa2:4.PKEbƆr+)HWJ{PEX9PTJXQTLf!@wIM, X)JV28Ũh@@(@ HW~Mb'PYD Y.KVM>Yf3Z=wR~ImiyK3MۚPiTTNm+/ޮSEeEк$jguJCkaYUte:JGo H8BϢzz׻L\ڊd"N;'L [ #*`/KD:d24 YHLe$6>qRp)V kH 懕y]3aTDHVά(:pt+_.r0SK kVF;0 vSV^FBp}˷4?9=К"ǬaP%*AZֶsHLȊ@tyCbFIz n xM = ]'rRY.6'fh@LjugPYAަ"f*u&=]~ nV&>Sp!\5.W36KEx" Sb כi6Ґm+DX(K״WqtUBvJB#y.m1*@"PWCnLk ]z-)̌n{o.:DŬzP3*:Gu#S:qJ7]Cxۜ-#`v,#~!^uv]'sr}%-N;VH'J}tAϑ&% )P v~W;{V گ}E=n'icH~-N͟dGhWw~`!Q7}DzaQu|xzb~ 8}3F^5xA$R05{fg'x00DSxtUe*,8V/~ՃP"&$8~\:T4@wZ8V=J*0(drhjl؆nȆ2 U=`ZVxtRVRUuh^w(&|xa1s[Y>p p ؉6r!a?S^;6ԑ3cxq< 0WuuWy؋p[YIҀ[>S3wr=})h,k[5Zg2]%Q]U_<5{8)Hꘌv]x\W-8u[2^x'v^XrH茦w~ Iv_؏Đ@)IhzW46d[*7ys]U6u8^$^1Y>x,:@(YXw5AI!B`Ŏ)@;images-actives-html5.git/src/share/images/resize2.gif000066400000000000000000000073011250410645000227760ustar00rootroot00000000000000GIF89a|}~a[\]Je`Zh ]Xf'[i)=*d}de7If88:;LDTcENOyPPgQYhZbwcdߞellmtuv}}~!Created with GIMP! ,@ A*\ȰÇ#JT(ċ3jȱǏ CIC&t&j5թKxi +rɳϟ@}haFEΊPgM"ȄK4/ڈk $bhӪ]˶۳7vUMA4JSY(`ʪpÇP0J$L2F4A y #MҰCcpd8"'&mt萁„I j:)Ən:*͓@Y awaε'lxyN賦W2!ob桧^IEGg݁ '~oWbAсPMUP=(N*Ĩ4Zh~iaj"Ɔ%"A,cG2P8$4JhucQƖ\v%[PAEZ3̐$ LdRg^tixnFD Q! f J28 Hޥ :M袌iae)yCfo‰*zj 7+U9K@ jcR bl+k覻Pp)p֊Ldy/gX40A0H aY)Fb /THT`8d=( ":땪)_RυlB&qȾ:%B'ϒ20 mm|i T?tj‘|$GO+GeVфn 8AyKHQJ C_oԨת}to^K7TvMݢMKQݪVƍ%aL)Yi&m9U[ | *n}i@}kԬZ(~k{Go(G/Wo= ,ΚfPVκYm>*ꓛ 8O4ױ_oCs֡kN`: Y.G#VpW/%q 'H Z̠7z F(DQy(ԍf'F `bLCnB)h($.A@0,\PH*Z1!8mTWAڥr+T)HC:7댣IcT/` XJֲڪ: Rs\ $VFx.@ H@౐} ಘͬf7z8 Kwh 5[iZږ3a_އS6:oiLSWOlg0˕+[G)5ym.] ~9.pmbʺ*jSX-{K[vVHB-֮un4qd" [ΰ7{ GLB$t +0KHD3Q\L*aQE -xHfK\/ [xl0APw07 ]ЂL2W Nq3TpsTxJ0C@]ǼayN,0@2@bAV댊NbR0 vYT JAUKz\%B ptŤGK\ѣ MlЎM琸p3g͇鎗#hX ګÛ!ӆ-1)%1GMsTTQe*Džxґ2!Ӫ$TNqn!W =K|{U܏L*YvPRd9A@R VMPpfj4*œЁ  ҒD7%r {m;T4hn6_gdU%1|&a߈ @@ kddz pRWtoE ]NI,Z|7ߴyj x;?ߑ_x y=]sTs׳UHo|tML/ۺ y鑿aH/"_PĢ"!`\W)8g|^ק_!0$SDt%!-U{"7DWT\3TAlR9uL؄LE!T2]'e7@:/ƶ?$luCݱх>{]U4,GA(6PUV(Uա&Xx(rPbG:p^WybWnW}X6Xtct\{Zdh x؋s!?S_x`5?3M= @XXڸ؍wbO]xܑ<t=)渇-|혅MG_#Q^X`鸌e8z'{Ha&=q(ׁ2_be}=2_\B`ǑuՒ"|&Yh3{6“\|I^/#) IҔD9祔XXyZA%Li4`|V`4nIdQe` /Da٥W6A;images-actives-html5.git/src/share/images/resize3.gif000066400000000000000000000072641250410645000230070ustar00rootroot00000000000000GIF89a|}~a[\]Je`Zh ]Xf'[i)=*d}d,e7If88:;LDTcENyPPgQYhZbwcdߞellmtuv}}~!Created with GIMP! ,@ A*\ȰÇ#JT(ċ3jȱǏ CIC&t$RkJxi +rɳϟ@}haFDrPa"ȄJ4/ڈk $bhӪ]˶۳7vU 'p8JH0P?eUիa` (pLTxHLyrI#k~ `Jiō11whFQ6:t@aߣ{-4cJW7l5lIy ¬HAx{w޿ J6 ]}Z-N.:݄( 8E,'H Z̠7h#O "lqUbFs0ē"1 jpuh 0@RGpp&:PH9RX5@#B.yaV"(B#T& J!A27ˌA4Ə1 #1|kɎ߂* <(|ia=mk& c35z"O%7R&!U>HDr9]^FW.%̌|-)q1eۚ&y9gbD?dUM3AMpjd"9%s$C9!l^9GOe &)Ry~bq=G'P BhV:H(:pU(l|;|s]HJ'hQq!]gӁrG!Zϼ$*L=x("Jծz` kBj&Du{#%S?PwiujԁA $M&KZͬf,vg Q)IjyzǠlW룩ZY{Se+n UIϙ57S".B%ռl].FO+ZGJտiWmF[f6UҚPՕukTr, |DgvDnrQuQ w[(58;'L [ΰ7{ ` AJ14YB'>$=J%pb*!Q'h@fK\/ 9ܡ 10aP9w6 [)6>)rR@j&L=pCT pJ C@ cAt5,΀E&Ё PYBOXe*eLO/ 7i;P*,\E H *ʵH=@.R# _sĸ=` D&Mbl aA2 CT-^wE]9e f4Ƹ0Ƥ"ٗo&mwQ9E!@#ؘsifK@XF7YY4d7)P-$a upmGi^ 1_l3xSfְ(goNߢQHu*`l@ 䎼) -Ir\'ܔ 8 `s|"b.[UH{ui~]$6A2N>.ě$ 7ڱw ` 8Xxs!?_`>3Ƀu< XEX5XxؘrcZ`@ʵ5hz>7J3v;ЂWyhBh|w8UUZ?_HzŎ(H{5.9y\ׅT8 Ɍؐw(X}"yd߂k+8)^X{HA2ّ7g):.G_4,9wO]Q9S MY AU(H]I6i_G3<Ɠ=?%>! n- 6e9])-ZCHO`$;images-actives-html5.git/src/share/images/resize4.gif000066400000000000000000000072701250410645000230050ustar00rootroot00000000000000GIF89a|}~a[\]Je`Zh ]Xf'[i)=*d}d,e7If88:;LDTcENGOyPgQYhZbwcdߞellmtuv}}~!Created with GIMP! ,@ A*\ȰÇ#JT(ċ3jȱǏ CIC&t&b%)Kxi +rɳϟ@}haFEʂ`cXJӃԤh^Jeu2 B6Ҫ]˶۷pAR5E݋ *pcL8AfR* 1`"EB&*$Af[Z6һ}maAP@Ԋ`k$?.(7.$dGBdN%"/.NaPu1˖*kcmRG/W?=<.iI}ƞ[z:lgҘOoCojN\: ]~oG/%q 'H Z̠7z F(a{q↫$MfE_bA#$@ ,XPH*Z1!8AmRWI!dHv)\#F0%,@)sJq5cd `@ ngr-8N#'Hlg|k ?bq09;ND-(!A TlLej3 oˈ "6\bJsgYi~]23"a&̜ؖ-6k D) tgZ3niIiNdAt&Ze>Ls#rd#ś> s&SJt"=gw"_B׉gnt hAZЃz~5:*) G>ڋHj`4$+Jz4XvLI鷎M۩B/Sb0n {:V` XJֲV&5Z=%5B֒ JWĕ $ O a" .Ѳ(:pE)KR:aaŹ(EAIU `OZ#!!,(#XiKJ DA`F(Ll#kЄMjS;!qa!D>%L{H CBFۛufdaI!0#f]f2"ϊ$MJn!W oN\Q&|g"'בה'SŹ5=Tj؀Յ'yCo4e /Ӓ7mr$qnk cG~pRs&Fߨ[!5>dgd'mnrw$ѻFS}'?h>#E^;#1`|${ȃ$tmz1–PSȉB]TU4-GAl59p(>\%*p(h8Xxh2 $=z\#WVxrWlV_Ȁ'et\Z%? p 8Xxs!?s_8<63z< PXXUxؘڸu"ZMr]Q?[ӌt=)h-}]֎tR^%q^u`V5G}y)I9^]-ؐ\R_9w`膝%wDžߢyHǸxd3A6ɒ8 F֑\DzAץ^oXP9wR`D_K> FTYAV(ZєՖ[!EbaaeҢ߅E)6A;images-actives-html5.git/src/share/images/void.gif000066400000000000000000000004121250410645000223500ustar00rootroot00000000000000GIF89aN6!Created with GIMP! ,@̌ZgݼH扦ʶ L ĢL*̦ JԪjܮ N WX>(8HXhx)9IYiy *:ZCiJ +;K[k{ ,aΙQ;images-actives-html5.git/src/share/images/xia.gif000066400000000000000000000100321250410645000221670ustar00rootroot00000000000000GIF89a              ! !" "#$ $** % &, -!. !/#5 "/ #0%6&7 %2'8'9&3&4(:'5 ); *< += ,>,>.E-?.@/A0B 2H1C1D 3I 3J4K3F5L6M7N8O9P9Q ;WZ=T?[@\A]B^C_C`FhDaEbGiFcHjGdIkHeJlKmLnMoNpOqPr PsSzT{"Ru#SvU}$TwV~&UxWX Y!Z#[$\%] d`b(_a)` b*a"c#dh$ei&fj'gk)hl*ipm+j#m-kr"o$n.l/ls&o'pt)qu*rv,sw-t!x|#y0v}%z~&{)z3x(|*{/~!#%')+,.!0$1&()+-!/#12%4(7!Created with GIMP! ,@ H*\Ȱ!#Jذŋ3jܨqǏ CI2"Ǔ(SZ,ɲ˗0EI_̛8sY@AB!ѣHvYL+JlQҫXQ6G?xֳG0Vbʶm-@KW%xMF;U 6 a 1h|G.QIKAkF  M:f)ًGװ0JC Ʈ; a2ۥeG!Ƶ\Zbkq<5UЌZџ4aw`:Hg0Ab'|Pn>HfBP ! &pVr" 5?@.Xd$#9ĝ40C1 )6뒍PIsZЉnpkcJ~MDT-y5]@>7tSR/zplF%I^XJ$q<=hi/oV Uʸ x`0mq,e0p$$F1HC(l!;Ł%bP-ɋXVq>2v,"8GF11Y~ }rj)Ͳ\-Or))E>t+e9H T%d^;!Jz* ܫ@l2asKrjѦ%3Қ_^ZkȀ8*[ Z)KFpQ Gq\xhz -qDln{Tu- <[/˛ U4vZ;|V4 Am4Lj cuO•j@T)F4< m^ ZF87c 7y=$\ Xܱ^tfp Pbx.Cp0 :0 )#̢@%`!JD*ʀ*ph c,9*8C$1`|b 48a3O1,r7)/'y9AA Q`oZ93>+(8 cx%|/LN'qE3fcJخl`6Ep d1rNJW]|[`X-P 0 T^"cݩ ?ьI! [=( H=a`$"Xs3 Mp49p +Y' ư t@pt1NP|  aX#8L@ 7Qo ɗo vAu f q&P4H*µ;haR*AѠ:Amu S0 F1/0MP :HƠj(PJ}! *5m`z6B"R<1 G%ʰ tH1 # ZUS|% nRrz(RpURa&b}q6GA(0 $7Ux'B G^ &_UEISXET%H lb_P B,XxU` xĠ7hU| W Pe8 0iEv w0q\Q < w`H!A mPNw C@Oga  AG"p}! ie?f`y!% @  ) $sCQ ]5bX J?7 ApqP[xRqBRVWqPNnd@S5m\xuUXFq[ k1<0 6x]E"0q}A:V"1WF/ A\nF u(g,!'9 +}Sm1`d@ tDWR1 $ j`* ]9+e L.PRt)jpwƒ  9(Y(  w@ 0tnf2D*Y b0'60bΒ+0 d@ǡ#?i86g oPx'1 {sYf3. P*H: 2`@` jc D;K J y2C+fR*cIVaffX b6yXڥ,`zd6ٖbfl4l+'3Jrd;images-actives-html5.git/src/share/images/xia64.gif000066400000000000000000000025711250410645000223520ustar00rootroot00000000000000GIF89a@@              ! !" "#$ $** % &, -!. !/#5 "/ #0%6&7 %2'8'9&3&4(:'5 ); *< += ,>,>.E-?.@/A0B 2H1C1D 3I 3J4K3F5L6M7N8O9P9Q ;WZ=T?[@\A]B^C_C`FhDaEbGiFcHjGdIkHeJlKmLnMoNpOqPr PsSzT{"Ru#SvU}$TwV~&UxWX Y!Z#[$\%] d`b(_a)` b*a"c#dh$ei&fj'gk)hl*ipm+j#m-kr"o$n.l/ls&o'pt)qu*rv,sw-t!x|#y0v}%z~&{)z3x(|*{/~!#%')+,.!0$1&()+-!/#12%4(7!Created with GIMP! ,@@@ HA*\xÇJ٬](j1Ə IRȓ R,ɲ˗0G6Cė6snKOی\s'jb*uǢP:u5ԃUaYîȤ-eiZQ %怖RUۄ>60ֵ#4zա\#*yc\jcu;cecNN(ej ~&ډftь^hb9$M@ԺP4L.Ol#%=.RUhFR x\aΘ}6:[9vYժBAi,! MǞW UrSGW rDa%!%"eQ#B/AUXW {Ya4VER YGMx24ńIKg$IIVg EPrcFT)G$X)k5 Ւ3Kh mXFܸ#ΐęy:Qr[32}]5uoRd@Ij%H홒'fN nR()MxC0 48 )}*Ö,y)EyrK9B\])2{m똥J;images-actives-html5.git/src/share/themes/000077500000000000000000000000001250410645000207435ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/accordionBlack/000077500000000000000000000000001250410645000236415ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/accordionBlack/css/000077500000000000000000000000001250410645000244315ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/accordionBlack/css/main.css000066400000000000000000000202571250410645000260750ustar00rootroot00000000000000/*fonts*/ @font-face { font-family: 'yanone_regular'; src: url('../font/yanonekaffeesatz-regular-webfont.eot'); src: url('../font/yanonekaffeesatz-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../font/yanonekaffeesatz-regular-webfont.woff') format('woff'), url('../font/yanonekaffeesatz-regular-webfont.svg#yanone_kaffeesatzregular') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'yanone_thin'; src: url('../font/yanonekaffeesatz-thin-webfont.eot'); src: url('../font/yanonekaffeesatz-thin-webfont.eot?#iefix') format('embedded-opentype'), url('../font/yanonekaffeesatz-thin-webfont.woff') format('woff'), url('../font/yanonekaffeesatz-thin-webfont.svg#yanone_kaffeesatzthin') format('svg'); font-weight: normal; font-style: normal; } /*fin de font*/ /* override Wahid */ html { margin:0; padding:0; background: url('../img/background.jpg') no-repeat center center fixed; background-size: cover; } body{ background: none; margin:0; border:none; margin-top:0px; padding:0px; } video { width:100%; } audio { width:100%; } a { color:#00c6ff; font-family: yanone_thin; font-size:1.4em; } a:active, a:focus, a:hover {color:#DDD;} header { width:100%; padding-top:5px; padding-bottom:5px; margin:0 auto; background-color: #F07C19; border-bottom: 2px solid white; } header h1 { margin:0; top:0; left:0px; /*background:url(../img/imagedoc-darknoise.png);*/ display:inline; max-width:20%; padding: 5px 1em 5px 5px; margin-bottom:0; color:#FFFFFF; font-family: yanone_thin; } .eyes { background:url(../img/eyes.png) center bottom no-repeat; margin-left: 10px; padding:.3em 1em; } .eyes:hover { background:url(../img/eyes2.png) center bottom no-repeat; } .meta-doc { background:url(../img/meta-doc.png) center bottom no-repeat; margin-left: 10px;padding:.3em 1em } .meta-doc:hover{ background:url(../img/meta-doc2.png) center bottom no-repeat; } .infos { background:url(../img/infos.png) center bottom no-repeat; margin-left: 10px; padding:.3em 1em; } .infos:hover{ background:url(../img/infos2.png) center bottom no-repeat; } .title-document {display: block;} h1 { font-size:2em; } @media screen and (max-width: 640px) { body { font-size:0.7em; } h1 { font-size:1.5em; } h3 { font-size:0.5em; } } #detect, #canvas { margin:0; padding:0; } #container { position: relative; padding:0px; width:1000px; margin:20px auto; border:0px solid #FFF3B2; background: #000000; /* Old browsers */ } #canvas { width:55%; border:0px solid white; border-radius:5px; } #detect { position:absolute; top:50px; left:0; width:100%; height:655px; } .accordion { position:absolute; top:50px; left:53%; width:45%; color:black; /*font-size:1.2em; */ } .accordion-body a{ text-decoration:none; color:black; font-style: italic; } .accordion-body a:hover{ text-decoration:none; color:black; background:#DDDDDD; border-radius: 5px; -webkit-transition: all 0.2s ease-in-out; -moz-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; -ms-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .accordion-body a{ text-decoration:none; color:black; } a.accordion-toggle { font-family:yanone_regular; color:#F07C19; font-size:2em; text-decoration:none; -webkit-transition: all 0.2s ease-in-out, color 1s ease-in-out; -moz-transition: all 0.2s ease-in-out, color 1s ease-in-out; -o-transition: all 0.2s ease-in-out, color 1s ease-in-out; -ms-transition: all 0.2s ease-in-out, color 1s ease-in-out; transition: all 0.2s ease-in-out, color 1s ease-in-out; } .accordion-toggle:hover { color:#FFF; } .accordion-group { border:0px; } .accordion-inner { position: relative; background:white; } #accordion2 { overflow:auto; max-height:655px; } .response { display:none; } /*.response:target { display:block; } .button { background-color: #dddddd; position:relative; right:0px; border-radius: 5px; padding: 5px; }*/ .unlock { width: 80%; margin:0px auto; } .unlock input[type="submit"]{ background-image: url(../img/unlock-icon.png) ; background-repeat: no-repeat; width: 40px; height: 40px; border:0px; background-color:transparent; } .unlock input[type="text"]{ padding: 10px; margin:10px; background-color: #ffec64; border:0px; box-shadow: inset 0px 0px 5px #ffab23; } .button { -moz-box-shadow: 0px 1px 0px 0px #fff6af; -webkit-box-shadow: 0px 1px 0px 0px #fff6af; box-shadow: 0px 1px 0px 0px #fff6af; background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffec64), color-stop(1, #ffab23)); background:-moz-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-webkit-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-o-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-ms-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:linear-gradient(to bottom, #ffec64 5%, #ffab23 100%); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffec64', endColorstr='#ffab23',GradientType=0); background-color:#ffec64; -moz-border-radius:6px; -webkit-border-radius:6px; border-radius:6px; border:1px solid #ffaa22; display:inline-block; cursor:pointer; color:#333333; font-family:arial; font-size:15px; font-weight:bold; padding:6px 24px; text-decoration:none; text-shadow:0px 1px 0px #ffee66; } .button:hover { background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffab23), color-stop(1, #ffec64)); background:-moz-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-webkit-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-o-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-ms-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:linear-gradient(to bottom, #ffab23 5%, #ffec64 100%); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffab23', endColorstr='#ffec64',GradientType=0); background-color:#ffab23; } .button:active { position:relative; top:1px; } /* popup */ #overlay { display:none; position:fixed; top:0; right:0; left:0; bottom:0; background: rgba(0,0,0,0.6); } #popup { position:relative; border-radius: 20px; border: 20px solid #ddd; width: 60%; margin: 50px auto; background:white; min-height: 100px; box-shadow: black 5px 5px 10px; } #popup_text { text-align:center; } #popup_text img{ float:left; max-width: 60px; margin: 10px; } #content #message_success { overflow-x:visible; overflow-y:visible; } #popup_close, #popup_toggle { cursor: pointer; position:absolute; top:-40px; right:-40px; width:50px; } #loader { position:fixed; display: table; text-align:center; width:100%; height:100%; top:0; right:0; left:0; bottom:0; background: black; z-index:100; } #loader div{ font-family: yanone_thin, Arial; font-size: 2em; display:table-cell; vertical-align: middle; color:white; } .videoWrapper16_9 { position: relative; padding-bottom: 56.25%; padding-top: 5px; height: 0; } .videoWrapper4_3 { position: relative; padding-bottom: 75%; padding-top: 5px; height: 0; } .videoWrapper16_9 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .videoWrapper4_3 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .collapse, .slidedown { max-height: 0; overflow-y: hidden; -webkit-transition: max-height 0.5s ease-in-out; -moz-transition: max-height 0.5s ease-in-out; -o-transition: max-height 0.5s ease-in-out; transition: max-height 0.5s ease-in-out; } .accordion-inner { padding:10px; } .accordion-inner img{ width: 100%; } .slidedown { max-height: 1000px ; overflow-y: auto; } images-actives-html5.git/src/share/themes/accordionBlack/datas/000077500000000000000000000000001250410645000247355ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/accordionBlack/datas/README.md000066400000000000000000000001221250410645000262070ustar00rootroot00000000000000# JSON datas This folder contains data.js file where paths and images are stored images-actives-html5.git/src/share/themes/accordionBlack/deploy.html000066400000000000000000000006441250410645000260270ustar00rootroot00000000000000

XIA installation package

images-actives-html5.git/src/share/themes/accordionBlack/font/000077500000000000000000000000001250410645000246075ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/accordionBlack/font/README.md000066400000000000000000000000301250410645000260570ustar00rootroot00000000000000fonts used by this themeimages-actives-html5.git/src/share/themes/accordionBlack/hook.py000066400000000000000000000163531250410645000251630ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # # @author : pascal.fautrero@ac-versailles.fr import gettext import locale class hook: """do some stuff during image active generations""" def __init__(self, root, iaobject, PageFormatter, langPath): """Init""" try: t = gettext.translation("xia-converter", langPath, languages=[locale.getdefaultlocale()[0]]) except: t = gettext.translation("xia-converter", langPath, languages=['en_US']) translate = t.ugettext self.root = root self.iaobject = iaobject self.PageFormatter = PageFormatter self.tooltip = translate("export accordionBlack !") self.loading = translate("loading") def generateIndex(self,filePath, templatePath): """ generate index file""" final_str = u'
\n'; final_str += u'
\n'; final_str += u' ' + self.iaobject.scene["intro_title"] + '\n'; final_str += u'
\n'; final_str += u'
' + self.PageFormatter(self.iaobject.scene["intro_detail"]).print_html() + u'\n'; final_str += u'
\n' final_str += u'
\n' final_str += u'
\n' final_str += u'
\n' for i, detail in enumerate(self.iaobject.details): if detail['options'].find(u"direct-link") == -1: final_str += u'
\n' final_str += u'
\n' final_str += u' ' + detail['title'] + u'\n' final_str += u'
\n' final_str += u'
' + self.PageFormatter(detail["detail"]).print_html() + u'\n' final_str += u'
\n' final_str += u'
\n' final_str += u'
\n' final_str += u'
\n' with open(templatePath,"r") as template: final_index = template.read().decode("utf-8") metadatas = "" if self.iaobject.scene["creator"]: metadatas += self.iaobject.scene["creator"] + "
" if self.iaobject.scene["rights"]: metadatas += self.iaobject.scene["rights"] + "
" if self.iaobject.scene["publisher"]: metadatas += self.iaobject.scene["publisher"] + "
" if self.iaobject.scene["identifier"]: metadatas += self.iaobject.scene["identifier"] + "
" if self.iaobject.scene["coverage"]: metadatas += self.iaobject.scene["coverage"] + "
" if self.iaobject.scene["source"]: metadatas += self.iaobject.scene["source"] + "
" if self.iaobject.scene["relation"]: metadatas += self.iaobject.scene["relation"] + "
" if self.iaobject.scene["language"]: metadatas += self.iaobject.scene["language"] + "
" if self.iaobject.scene["contributor"]: metadatas += self.iaobject.scene["contributor"] + "
" if self.iaobject.scene["date"]: metadatas += self.iaobject.scene["date"] + "
" final_index = final_index.replace("{{METADATAS}}", metadatas) final_index = final_index.replace("{{AUTHOR}}", self.iaobject.scene["creator"]) final_index = final_index.replace("{{DESCRIPTION}}", self.iaobject.scene["description"]) final_index = final_index.replace("{{KEYWORDS}}", self.iaobject.scene["keywords"]) final_index = final_index.replace("{{TITLE}}", self.iaobject.scene["title"]) final_index = final_index.replace("{{ACCORDION}}", final_str) final_index = final_index.replace("{{LOADING}}", self.loading) if self.root.index_standalone: xiaWebsite = "http://xia.dane.ac-versailles.fr/network/delivery/accordionBlack" final_index = final_index.replace("{{MainCSS}}", xiaWebsite + "/css/main.css") final_index = final_index.replace("{{LogoLoading}}", xiaWebsite + "/img/xia.png") final_index = final_index.replace("{{LogoClose}}", xiaWebsite + "/img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '') final_index = final_index.replace("{{JqueryJS}}", "https://code.jquery.com/jquery-1.11.1.min.js") final_index = final_index.replace("{{sha1JS}}", xiaWebsite + "/js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", "https://cdn.jsdelivr.net/kineticjs/5.1.0/kinetic.min.js") final_index = final_index.replace("{{xiaJS}}", xiaWebsite + "/js/xia.js") final_index = final_index.replace("{{hooksJS}}", xiaWebsite + "/js/hooks.js") final_index = final_index.replace("{{labJS}}", "https://cdnjs.cloudflare.com/ajax/libs/labjs/2.0.3/LAB.min.js") else: final_index = final_index.replace("{{MainCSS}}", "css/main.css") final_index = final_index.replace("{{LogoLoading}}", "img/xia.png") final_index = final_index.replace("{{LogoClose}}", "img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '.script("datas/data.js")') final_index = final_index.replace("{{JqueryJS}}", "js/jquery.min.js") final_index = final_index.replace("{{sha1JS}}", "js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", "js/kinetic.min.js") final_index = final_index.replace("{{xiaJS}}", "js/xia.js") final_index = final_index.replace("{{hooksJS}}", "js/hooks.js") final_index = final_index.replace("{{labJS}}", "js/LAB.min.js") with open(filePath,"w") as indexfile: indexfile.write(final_index.encode("utf-8")) images-actives-html5.git/src/share/themes/accordionBlack/icon.gif000066400000000000000000000112261250410645000252620ustar00rootroot00000000000000GIF89a  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@BBBCCCDDDEEEFFFGGGHHHIIIJJJLLLMMMPPPRRRSSSUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaacccdddeeefffgggjjjkkklllmmmpppqqq!Created with GIMP! ,)P0"Tx A &l(A'RbƎ/F9„ BP˗0]RPD31L@{cɡ:&VIž5dXsg֊[z*ر]˂=Uϊ&T`CRYioVMGI_JFj+١Z2Ţc1~4-[yzJ:f-@mwkmƊvVaG}ǂGcnv]u\:j7ϯ )x߀-XdEdI@ӅV!uNh!rh!zԕ .]jb¸b}_aC^]$IP Km$MVRђW5`Rfv׍YĭfaNQAyud9'S yΈ${=ڨUFXu^8^rZc}\prifqi6 n 닧Έ^J;ZJ風 Uz^e;]a0d 6.ZhvTNU>KvtR4A"to *ie}w0&{{ 4I@! MT*Be dj%K3Dl % -uT&S%ULE"VkNun-iZx 2"|dm 45jpٛ1Yh/!| J-avr *02ImٜoQHZp|#0 В /JNzKgۆgA\ I]_NC*hM`zN[$ >UG/&Z\C[!' .=Yg=qBuw },O?}(>&^O9W2%)˟بb:t5! F840! WHBЅ,D k' @`Mz 4[ ~0"HL&& )pCx bH`N #M3D.!3 &x4F݉:TQh9.@ṿ"i"`pcA Bdt !3J,5yK6 KiVE4^COFH6r31[2 *uɲ hSf(S Lv2XBL0`!KWbWJB,s Z6kVZbbVrͨJ?7 |2O*4)ݩ'skmM˜Z5J]*SE= X"^uYUV}:-Xc 9=ۍ2l }Ln2]|(GBш6ܻ,kArךաHC(k34j^bOJ#4/=c;o9af*t|諳bdsTO҆f@`+`:m3(̅@֦> (CU }ZعiҌk-6DJUrAɜ4% 5mm'Hvr*Xi)-aQmDy4+r@@xNN[2|&lz1\^j&x/Np6:汴QCNUrx@H`M/(ͭlƭN[XϺַ^Nx WЁ\Mڳ޶EM/2kkvwuC^g;'?x4k&^<r"?@қOW֓ g=VPl 2gqҙ"ޗH$M>0n`}Ϲe1? /_?2D@Շue`3temRT~?.>|E;1Rz$k&T|' AjgyNUuf8PF}teXQ0!r[#s%d';)LXт<|G}qwևk(5a+'销$U6#"BvjD6' (BDŽЁ)P/u^nV(cA-Fim*xz|؇~x8(o@9GG*@%um7%p E b+tGGZ (pFAVQeIh톊p'^PAQmOX438 b U3H ;&N6X0{$5Y{p;PRH 4A-؂#td9Qx?7d:*f~q/1 )*Ap@`)A᧊ !)s';lDi`.|)D JcѓgM&c(I7H:6TTFPfyg9+#}PMٕ.t 3Gɂp u? uB20mOǔsy:/ t2:9 rɕ3d1IS;Y?yr9Fep50/ٛ  `HG@Evҙ6CJ3MdlGFP QqEVpDG"ƹF<0)JG+ FFz`9ۨe8fßF429E{0 +)x6E6ZD1 D}P=䙟HG.*:D00PҙxfNYHzD0=C@0pDj/H6YAu'Xz 1F2p Z>%:KjUfZD9JYMxC^0x'RJ.ُvcN01g..I2^)!1@n6{GIF6 1g:Xz0EraP)|at::zGР Fg6fX+1짠xpn)@#㨌G E2*%!vh(kG&pv⮭32Ybz>z1iѯ2QlO;ױh"+&u8j[W$GpD9$J^xK#0)%pD_@%Ra`DC[qu0b6`!T_ c b+6eF4fW&>,PIz]N[(p 5+1)մ#i)#Ƞö k%0+ !99LjZZQ(Pa5\HZ Z4; >'(‹=X:&v {mQC7YjGǨ,86QrjuG4wnu)xnK[*:'`"H~Y`j\|\  >GWZRH;images-actives-html5.git/src/share/themes/accordionBlack/img/000077500000000000000000000000001250410645000244155ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/accordionBlack/img/HandPointer.cur000066400000000000000000000042761250410645000273540ustar00rootroot00000000000000 ( @MMM***eeeqqq www```jjjmmm ,,,bbb =><'=>=9\!UW[ .Q4WX8ZZX!((YT4 5 7!8Z 6 NQ$34 5 7XX;@1NOPQR3TUV Q? LM112RSTQJ0%K0LM12X>U/JK0LLM1>A5H I/JK00LJ?[$),FFG-H I/J/S)?DE /FK -HO :+#D\M;"7;C+/&3KH@21B3*FA(@???? images-actives-html5.git/src/share/themes/accordionBlack/img/ZoomIn.cur000066400000000000000000000042761250410645000263540ustar00rootroot00000000000000 ( @༙L@3uaL""!tSSSǨiii555^^^trr+++} ===׶-' xxxXXXcccRD6''&̬ ///mmmqܺ[[[0)#xcO%$# ```ooovvvqqqt&%%(((˪N@3 TTTݻYYY___wbNaaabbbhhhwww-(!߻Ȩ&&%RD5̫˫cbb\Z~9zq qX\_@_`%%rpM^A&%$o(J?) ppG_R8e$66jjhf8k nn_!dfws Ijkl77lR#E.3-3.Kii$s\kcL tNfg^y"9. *4t.'dm54V44tu#g_TkQ34V3> DZXa/4-+aC@T6YPtVV*3Q5l|YJxttVVv];^Y7St 8B}EYA\8Tvvvv*O\>,1WU4O_,-V,\$0<)o\,bd\\\\\\\-b`FHc,#|YV??images-actives-html5.git/src/share/themes/accordionBlack/img/arrow-back-icon.png000066400000000000000000000136411250410645000301060ustar00rootroot00000000000000PNG  IHDR\rfhIDATx{\}3]c;Ūx҈uQC.0$MfIHTjbo[ *VDjQVm*pFTƉF U\5ᯨ Jm! h /̽yܙsy}?ev8w;sn<׉m |6,Lu#8zx${K`  ;yZnW/PKbX(00^k=\7<PЌjux>LG uj 1>L~'B8L!sgPo9FdpXwc\PDcX2dp2P `xU`y@ 1l@) أ-sZ"n@ ^ wmZblDvv@Uw#`DvqHH`^w#a/h )`N(nӄk:?p#%`Ȓ6ݍh( `TN0FFx.T^1U@mV=0{u""`=?0ZJ\ѱ@@h)!:a/xA*l Prh47[w?b>זI?[RP $~ҡ<TȌ|2C! ( T N@@t~[T3*$OJe  4d  CT =*dPYi@N6+camޣ߸LKG.nF꬀L"&' SO\E:Wu7"@HZjlTݟ-7>wV 35kd NHYFi)䩋Sg㺛:,lisL_w໯kkhdtR)N2o(IA⏇![u&@8#3'iͺO\jR' Jh8y}_ODƐi?Ib׃կy`JKx`FghPL?H= H%d-kodscuiP#8d#u~3IuLdQAI< H#o( ӄI\"Hx?8hi}4vߌ$H**!o*( Qu1CD3If_3( '!YXɱPoyQ$fr'$hjgE0&1!r'( 3s@}ؓ Fӂx?`xvg @.* WL}6>+ޏB,$ʕæ7U~:į% rcDAH冪x'KoC'Юri\ (l/g~ؠ4_?p_0!ȅ@5/I`XpX008LSx;??cB0M}|GuV1U ) F+#x? `P }ÀA_yQ.3D 5Ga,$NdOѧdtQ"ӄR-iI K7 Af"z"Q#~iI4NŒ/\_eZ:rXW.42fۖ=EAQ@LH+ЂE7rY @pLGd[}bF R3|aC%Z.a@lo0ݣ@1P˃g2ebcߏ:4%Az 1l'%!;`lґDIx?;7miz0($L ]xɋc*Wq)S;5+CVA;t$\py%  P'K}At(fIp(g]`tIg #O#`Xu'tZ@H+ RY:"޷S(uEӈA& Iz%  SUvU Lx%ᡂ5ALP/8- .& Q$>H`H`b }^I"F}Ȓg>Hm`dH |u }p-`$^߻[ƖV0Y$`dx_lV @.& o\ns아 !+z d8^ AV\3LN@ + MExs(R`[I,iq]L@ [$! /`#,B-R{$&XI   Ol G#HyTOx%yn*K@ gY] /0:6Wb5`> ٧-õq@^o|@Xzw xءQ&x( |2@< x p] `xF~Jc_XؿCl?(!/Ps6mf#-345w`F\/q} ym}#?|3.'KyG_@' P8/eU`\ wA/ W.~]{Óg:xMqٱV?_ؿ1]H&@U^`W襥7ʴk ;Z$*/6CUa@ 4V vSF `׃uu Bij+{9BC[6hg ?)Gi] By=BL ? 7cR!n3AswOH}ϸyC 1_~` @ѾA@y? ;/xƀǃ^0 ? @~1h r$Q? KCQP }b  }:2=6 TNu>61k!&}NT_='Vd>TŰ_H\T;iCU^ ]tӏؗ$*/"b$V=Ӻwt {W?WD%*@G^!=OO6ZyIrC>7{a$O 6#3/XNMu$g` #/O]FepTɂNyLN?`>#S7}۷5H( 2 |3MCltVe(H8/όӶdd֤WK~&fw}iiK;YùV dbPRd;^1 0Ϳ >C.Wy1:\Q"k [#ץzwuBᄸߒ|m{;Ў߸> ]$brR>\HwWB{ʻLԭS`PtEڳsn"m9Jbt>q1lȟ' ȗ4%)L Zƕ[uizy@2N̶vbqe:Ku7`m }G $%qpJuFxes琀d*ڊ'ief.# 6C(`/< 0CVh ͥ+|h3?4"9*ێY!!;ߍ}Q d7\+|( 5 yC8fUPj4P(Cǹk|81x²2j~T^|V@=vr4np7;@y~yjrg}H X&@NIqH j$cүu@E<<MX(~422.];OwT#DZaFk@VzBej XK`Qr]es_}B! Zcy7` ,>J.Hy?3qN!AW",U+Kcô^R "՞5 H$.d ±=/~Qwc\PD(< tu7E dP & r&*Ԓ"xuz sL0;|Z1>Fa[pؾ8WxÀ, BIM-U@g7bm <\{#8z𸈹x{ F~F)IENDB`images-actives-html5.git/src/share/themes/accordionBlack/img/background.jpg000066400000000000000000001141271250410645000272440ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!''''''''''"r!1AQaq2"SBR#brC ?k:[ bx?|j,;1S$ihה2t|ˈ4O?}|11vw1 1S}|Ƞ>>X( _S}|T`|j,21?O?ڧ 1>O?}|ɽA}|~>Oc>>X*>X?ڧ _S|j,2>>X?ڧ 1~>O*j,|Tc?ڧ ڧTa?S|j,21 1S}|Ƞ>>X( _S}|T`|j,21?O?ڧ 1>O?}|ɽA}|~>Oc>>X*>X?ڧ _S|j,2 > >X&5taltD/<0}} ?n,=Ʊ:`U`>>X{`t`>>X{at`~>Xd`uc>Oc~>X>Ox>~XO@>OaTaA`u`~>X{`Ua/Geة gƷK"cTapJ{ _S}|~>OP>>XdPb|j,GTa/>>Xe}|~>OPT`~S@ڧ>>Xdޠ>>X?ڧ 1 j,GTa`ኟ,SE/~>O@b|j,SPڧTaO>Xd}|SM _S}|If'} n,4zy5;gO?aTa~~Xd`ta>O_凰>_S凰>O凰O ?SdDzcs3ι=~0}|ST?*|~>Oڧ>>Xe}|~>O@b|j,ST?>X?Ta?~>O71~>O Cڧ>>Xe@c8bTaA}|SPڧTa/>>Xe@c~SOc|j,GTazT`|j,20}|ST?*|~>OڧkpZ~SHǖ?s}?ã >OaTaA`u`~>X{`U`>>X{`t`>>X{at`~>Xd`uc>Oc~>X>Ox>~XO@>OaTaA`u`~>X{`U`>>X{`t`>>X{at`~>Xd`uc>Ord8^{<384s cWcY3fi۲8Uڧ>>Xe}|~>O@b|j,ST?>X?Ta?~>O71~>O Cڧ>>Xe@c8bTaA}|SPڧTa/>>Xe@c~SOc|j,GTazT`|j,20}|ST?*|~>Oڧ>>Xe}|~>O@b|j,ST?>X?Ta?~>O7:L8o8^kW{|$t`]<6L{c8 ((*(**mPPTDPTT A@q6OLLkbv 3;i<9%m[DZNz ygW>-'d28oL**mPPTDPTT tgW%։{@ *^u˩igj**mPPTDPTT J[%)Cs1:Ekk @\[m uo7[y^ffgY3PM* ( @TQA6(*( Yz|y6饿 <>L{tּ8:z\y6nq52ɋ8 hhUP   PP=hUP  s[﫡[VWlKˇ5]Hy뒱jα/@-&O)sm[RfVԏ5}qh pT4TPN* (@EEx\tctzi' p@3Θo:TݺG=hUP   PPnն`ݖ-v4f+3:Doyɖy2|dpLLZc+x]P   PP=hUP   P\ &;osO&⍟Ι1cXBrt Ծ+/rx@PPEE@PPEE@PPEEYC%rY˓-[_8H:}#>4@@A; T@@A;uç)=x nt7:G|$PQTP@ $PQTP@ X:Fx:[%ϓJF:+:|1}SbWi?U1m6әfu {$:* * * :hcXjW/G},= ("(l4E@QTTAA@@a+/K:gnbz:e|uy헂g[LS@TTAN@TD6(*v* x[k331e1SO;m JV4P@T:rLEql~нkN33:( (&@TTAN@TD6(*v* DPASPQXA&*d/h/]lcɇ_Tm1gunTP@PAx.  uTP^( f&8Qcm{@u ~&8YIs/Iiêa=uS?tQAA›*(  /EhR:Rum!@y:R&^ @Q@@TTP@PAx. c-|1fpycZ>)(l  3N&J5.~\;vW&~o)@E **( ( PPEPQAA›*(  /\& y6ioF@6L{tG8]v,6<}6.^&=ל0 "*(  h ɆOKpmq:גv6SçQ] D@<@Q@@TP@QS@TTO놓٣#K:rŘt=gv*x* f忖7tXb"0T,1f\QrQ]il&Ky:€ "*(  h *( (:V&{b5umc~IjWN   9:\y6n߳0nL1zXncu|3LsGtxTPP@QQ7 w &PP<@}?S'm@a>]1䝛ܛ*)5zPrR4uc-6zwt &PP<@@DDޠ*{l:tP@TiR;%'\r w &PP<@@.$yz\>yo92W|֞S1XZt-Lly4^bTPP@QQ7 w &PP<@@DDޠ* (,DDkaQmM  ( @A1e+kcscǒkaǒح%ǖkT/J޳[mP'<:YZΘ'|sQmM  :]4놝7IA@jӤR-&[:޵լ*  *ڛ~uw1t5ۿ-T&Jb5֊ͧH-,L֔O||ӷexU@T=7* *  *ڛQmM  (o"5lc2l1ۿlctO90鍜d6u'i"+V4NdmcǏ];^TAARi.Ɋ#u cXr^gxӐ<**( ( PPEPQAA›*֤ū:L  9Z7+[Mf-Ycp zlK_;yOcǟeL15&6L@]@2s^t^S{KNys2PPEPQAA›LΚm& 41/O1Wo}LiͶDqyɒ8˟=ݕɟқ+xXQ@@TTP@PAx.  uTP{;)=4NI#DgImGLtDz XbǶ#Y,( MkhѬO Pz8ߊtZ:^4U-J4k䍼:-kV՟-I* h *( ()*x*111:Ln@ Ddmgrbf'X-_h6UR.C篢} pTP@QS@TT{:ehRm 92S|֟ӌktl,y_,^bzp(oP@@M,\1`{,6R>wKf<3ݰ6䶽ZVb#@APAPAPsfwf[i:pi=bѬLOs3Y&by9sk2׮?`n z6Zwūhֳ@TA6mPxɇ_\m^_;7u`Ǔ|ioFs/K?6(*(**mPPT;6܆Otǒ~ +W揩H~a6:N|}P@@PShK:f,~o4z#-?s["=€("@@-淢=x[cvJV+"7mP~+cg.lo&mie&ffu2(**mPPTDPTT#&<92zcg9ڧGXے|6@4[^tk=}nIӲ6rcJDv(oLLk@ jū5;ا泻}ec͊2;̃hfkhczqT<@T@Nt]v͍hfr{erm:g PP=k6F;GԷwv@2oT 3"7L_58C6k߲ɟOq2T4TPN* (@EEx pKtfg ts$fV#4o~bُ4`8 h@H* Z=|Yi'cTB^ll2E{vms殚^{o-zG=0Wm׿ Km@@|-/76s2aɊ~(csí1i;a, tt<A; T@@AgN)m<;Eu.K6qN?tDhVuPURF ]`OԬ|39H5; Tg'L]73SGHo:R%t @ $PQ),lzzl{}KG9y+XEb4 0+d|W˽?U16s:3g|֝ePPEE@PPEE@"fb"5No?y.<rmid7q5s:Wm)XiX9@@*  *ڛQOM^OW;%/KW6Zzm>,rG"o zeqhPP cX-\Ns͠9񤼺֭mZ5֮^)?4ǫRԟ-I@@PPEPP( ͇=[g|:oXgXrYp+kc%/\VuPT&h؝vcew.mjL&7( ("XKyL:GsD*0us혇=ϊsR+N&j-?0V1ހ ZtbT3au>+{+kOtqzͧH~oigl;vWC"({joTTD@T=7* 3ct9ٵ]p4'JWV>K~"#H;y:Se+**9"l4E@QTTAA@@a**h*  u˒LvpeY=Qkl4zsꉬ\K]rd 2GK{ ^ꉯ_x`*Zih:9_g{p*k5FQԾ:d/2tvsSȳƓE;@PPEPh ɋ-[Zy+jS&TP\:r=hm ]綺|u(V. Zt:l?Ji;8X~^ͧH%qW[wkC6ke+ ɟ^3ͬPPEPQAA›*(=VX>ӷ$x5ocn<~Ƽ{0SMO9P@P@r~vsSPE4EO@TP@<@Q@@TP@QS@=6ZykKw xvmf;Wm׈:$#d6@Jֵ+ؠ3w#V9an='x۩m6S3ߴ;e]^'u9A=u&{zܓ"2SwcHxީڈ* (( ((@;@EEzp(oP@Yֳ1=WzuӶkaӲv9LN؝c6YZ9ӞtFz}taN;$DFc@P@TPkq_sS& Qnt9#{'IKk4mi|SDޠ* ((Lo#,ym-&bu+_9#h6pKƭL%cnR⑿WO+JXbhTW-tF1DZdۤ.9o, &PP<@@Deɺ4r kJZ#YnoO XiX9@51S%1cGo@@@r㯪Xc VzLcY}1۩?Mk[|:s}VXf{=mf{Ozܜ"#VI3Nݱmkzgkp(oP@PE@M* ( @TQA6(*(**mPPTDPbf'X'2ש_daPmW?XfU|Em 6J9S4i׮]{aVqh3 [VOt @;bx \%mgxKDZ4kܽNsdj^:Z4yTb&ޖmKoó7ul^^5rѳ>*|Uˇ͕+ݕVH4qX( P@ *%qWi2=M)|S6,{b5sP@ *@TA69qx^'ufV=4?2NS1ݱֵVtw#x n{sgg=nI 6g^v(*(**mPPTDPT@h8**('C@HqT<@T@h8**('C@HqT<@T@h8Ʊ:IJW_3߷ňzlfUkӜ[VޛDJ;cs%stHi׭OvZxf%oKmcT8Zih9J?e /1^NDDDF 9zje p3&KFqÊr˥1&5ߪS1Ɣ"dV+X!@ h:J{͞M[yR6fu(  PPͧJƳ>y-ǃ?Lm;dXlۦ8Luo{w~̓DDl hp@;m}WݎV:d0՞Όs䝕x7:zi61ͭm3]VcgtdLD5 gcZgjhUP   PP=hU; T@@A; T@@A; T@@A; T@@A; T@@A]^57^t;|XmWlb{3Wm{=NKseLiWŽ̵1OZ66^ WV;VLIbQA{6>-yc %ry #e-fY}Q5KWxFLxrgsgGXے|6@5+[ZtLccEiے|6rcJDv(王x5`|>Hu{)MFzP@TP@TPyO]cO;:?8[hޞ+-|4týATPP@QQ7 w &PP<@@DDޠ* (( ((@;@EEzp(oP@PE@M* ( @TQA6(*(**mPPTDPTT EwRi0f~.y>f4ޣՏj:+q~Q_G?>-:`ǎ|Ս'M@h ( XY6kG-!EPE@M* ( @TQA6(*(**mPPTDPTT A@P@@P=hUP   PP=hUP 35IIc_H1謿Ǿ7A[w}_n7㡎9=zm .>:KxFQ:JFfǭ4rՙ0o]@^?OyG=qλotUy!^:,|mo? pYb|`?f@c8J (489isX;9odW,Ꙟt5f6Ώnf< @%-aIޝk=h_]Gchy:jVѥ&;A3_|5< $/?@TDQA@TDQA@TDQA@TDQA@TDQA@TDQAz^wVgz9Og>sO ?P`Vtygu+TnGC'+8A7ܱa3A(~+1?X0uc8H"7@9^[pY8Rߴ94XsâCO/c4x q[Q՜_^P~(Hb kґ#f:"ml%ZF;dO;ffgYfx7b[f`W+cխkζyDr}LQ'spdY"g;-v ltnֽ*ϢvNm_M9]V&yn_n;~־U90PP( ("({joTTD@T=7* *  *ڛQmM  ( @APPPqhłmu׶AlGcBFk﶑61ve#e"gc^Nk*y QPEMJ ޓ7Jl~1w~T@8nXZ<՝c |zkߢdr%=uxuدa 'vWd Rjˆ(l4E@QTTAA@@a**h*  QPE;@PPEPh ( (&@TTAN@TD`P@P@P@ak2gJLƛ#6KAAzmSdHRuz6Nɍ@o؏,5䯦bKx*յgKDXDLvbZfh3ߤ]Gf h{AEPQAA›*(  /@Q@@TTP@PAx.  uTP^(1Α@obOc̓ #lWqSgYоKim_V#v修=tEO@TP@<@]8ƞ]lVWtǚ^+zmXVglP޸/Mn#$͞gn( Kړ)36fw(=R:Jh{U[[6Kafo:2S$y:խKV'@k_&k<\p퍒/X U1;`#-|]cmbQADMSPE4EO@TP@<@Q@@TP@QS@TTEQADMuAPAPAPAP֭vb#k߫]G^[z~+tx[OcFmkN( '_|ZL ((@;@EEzpΑn`bH¼:Ly+I<{[`( 1gwyz79yo|Ӗ=1mb]>(ŷLkIgZΓZ6d{c{f5;$?毢}݌[kh%ˎح5y<""Aԟ5gIҷҶKEzcmW dJ:=( *<_<>/`5/Fv,׾U9MA+}6K^m{$dk(@;@EEzp(oP@@Mx""A *@TA6mPO]j߭lL9~5ז;6~ץ=V`YHHO )pe0γ:*mPPTDPTT hcYzÂgfyk0(}e6Oͮes}:k炈 ɂlՎmm4@&Սc?xh9F1ۺ?<ݺٟE?Y^lkV+;cX yFZi,@rf&&bvLonX|k=Q@@EPE@ԟ5'Iy6K;oK%u@(  bMIT7i:nƽzN{LDƓѿKPN* (@EEx pT4TPN*378:Yɲ.+m ""i"\IH/S1XvDo;>i}lůkmm;@ Wˇ^6+i"Ƹgb\OtՋkmӼ.;bIx@EEx p^ZpUh ]U62S$y:=hp@&+hcX,71mung~-w|Q15&4R%[Ɩc~5.ZF4s` qT<@T@h8**('C@HqT<@T@h8**('Cr  x0ߪOU ĴvR^,{3TmgmkۭJ_e:rƨ("a ("a ("6ZƼpWk843k9y+tU?NlQAL^__4tbcXazIֶuG>^Zx2jͦ4tP bc's2^9L("kz:qHi 72[_,yc>i(SmǏ{Kɥn|Q˛151kux|)=] PEE@P^Է<7Uot|U7ǚ^#I ]bX/Vvdm|]cmbu/OUb{xQ?^rVtA; T@@A; T@@A; T@@Au@T@Evb#߫+f#lΑZW2[Xֵf{~6D~舯?("({joTTD@T=7* *  *-bftk2tM to&2݈"4%Dmc<ӿ9siͭ:̽f9o6c{joTVGaל̹M`es5v&Ye5( [MmJ/XnKwɬN9;c@4:Nz>k֬^&bwq[泻( ("({joTZNV/-XhamJ⯾rWYT@c WWo8-{Sq^nL~vxuدbys~񶓯f`/Ic@@CSx PP@PPEPP(:*<%)G{q艴 HпU33;fuo_+i/嶾_;6m:j  QPE;@PPEPh ( (&@TTANKyi{,뺜lߦ:㯖,6w(* ?Է,Vo$}:| (&@WOicDr@lz-mO)  ^^qDy@un:Ll~Y]8 yFZywZ=215w揩X|s DPASPQꗶ9Rta꫓t,zcmW 旮H֓=*LDƓoc^HYG-V՝-.-Z"c~2l|Q15&4PEPh ( (&@TTAN@TD`P@/=V׿[m.:zϿQr`ܿ[]Ԯv0_~:G@]g(  /@Q@@TTP@PAx.  uTR6+m`f[&l:X}DDF8@(#lъ{Jͭ#{%m?fglEPQAA› Hs깘#\tbc\9#\vq *( ( PPn'.Ob'No=}6[jū5k.),͌PEPQAA›=R>jΓV { :CUl{-W ^#IA-J4D {x3Y~-6pα[c^={U'i vXXuTP^( @u W1SkhOt.t3/Y2[-t<* (( ((mQFWb@ƙ"}->:8((@;A8vmTxbӶ@s篦㔵kV-YsrW=* (( ((@;@EEꗶ9Vt4{뫟?}ݥxVuzP@TP@T{lW>Y]46|vK^M{LDƓ\7Ykߣ_Dţkjڻ- &PP<@@DDޠM@(׿Y{V[n,vzmZƶ,Weu3ii{P2ӥcokNPE@M* ( @TQA6(*(**mPPTDP[ykOlgeyMҴV@)it炈 ny<Ԝs,r}< lQ^?{Yrf&5c| >}Q*mPPTDPTTRo5gIxPo꫓ot ]U[U7ǚ^k:@TA6mPk-)aG~B&Zti[﶑61 * * * * 3a⟆6(O,<̘kmkX<>(QTP@ $PQTP@ zt =Mri[7K;[oK$y:€@@bƼdZ6㶽˾,cbM<λWi1n׶;tfQATD@T=7* *  *ڛQmM  ( @AAA@#RXgt7tǥ,.e+4Tc˒JZZ״fw@AAA@@CSx,k[k^Q PWfלD}lm APP@PPEP bѾ6-^8µ:,' U?R-gZՋDvsbW`1PP@PPEPP( ("T|sgIoakJ᷺\Xhꯏ_|7)z<՝`T@T&4 7q[lGy^Jt~ʵmI1=.-Z"caIޟ{7@M " ("(l4E@QTTAA@@a**h*  QPE;@PPEPh x_-3ɶ)ϟs~"+X qa(ұTKZ"&gdF\g-n^7~gZ("(l4E@QTTAA@@mtQ^yFMކ45|aFgI9D6(*v*;/H7Nr&O6?$﯀6@2ZygRhkhaN=|G("(l4E@QTTAA@@a**hTϚ :m,CcUlzV} )z<՝a@PP@Q@@TTP@PAx.  uTP^( @]Ak[^bfA7XɃ/oϗs8 s}:+? *Msfֵ3PQAA›*(  /սS)/  ( PPEPQAA›*( K:K{S\ {PuUvHRuzP@TTEQADMSPE4EO@TP@<@Q@@TP@QSF|5|VO|,7m#dqU%/[ƴa@P@ *@TA!P=hUP   PP=hUP K^bdI._._O\Q>]4jYIeϚ1SXN\陙w0h8**('C@HqT(5=n'$k;-A84Y>n11b=hUP   PP=tϚniot9:GUji[UojN  h@H* @H* @H* @H+짾Ae#exٿqF/qXEb47iIC;7վݽ$ߧd<@H* @H* 1! =$f}4x{qi $PQTPE@<>8= 'Imxˎ)5y9iL:N_5}qs T@@A; T@@A; T@@&ot =U>0 旮HVurAA@@CSx PP@PPEPP( Dei-k.KƳ+˽ 04\.?ʳ 5߼QmM  ( @AL4dyR"PiuyuKr@ PP+>YFc^h7:<}m >k}Qyyӽϊq_Y0 @AAA@@CSx PZN&|7\XhM+vY@T@$M " ("(l4E@QTTAA@@a**h*  &;6V7ٓK7l.2݊cH"7@&8 h*  QPE;@PPEPh ( (L:txh6[.0Vo ['X@'PEPQAA›*(  /@Q@@TTP@{;dV#Y ,Wɶ+ɗO\[wۍPAg~7Gy29|ho **( ( PPEPQAAzx5;cF&AyjGǗ%< **( ( PPO']Γt>8] imwO9v cd eφpgwK  /@Q@@TTP@PAx.  u{ǒZN[zdmۗZ * ^5gXTTEQADMSPE4EO@TPX:YœexG,8-u^6t1:ks#t\Ir3\g-XUojΰ 9 @TQA6(*(**mYpYHfL,K^-؈6D1yiC@TA6Doc<ӾwGkkM33{͖o#<  "("@@EPE@M* (Ƙi1cr TkݚOu3G㎒ A@P@@Pֳgvim{ŒqFuP5P@ *91%&NjUjZimQXPTT A@P@@PSh  L>jΜ<(:zdofr8SJόxJ޷k:5h ( *@  ${APQA8 *[JG|m1XfxCwKn0(ٶӾ̠ hsy䯢=gӤSyCDqT<@T@h8**('C@Hֈ4nJ9&58N'M6ruxxT@h8**('C@H'wgt>X6[wNr4V^ D ${APQA8 *@  ${APQA8 L:t&|7Ϲ5ZFOvI@h@H* @H* Bpt|#ygc|MRiQ#dr ,c5Ta׭+6ȍfLi36fuހ("a ("a ("&5;'?s׳_@;3[1:-4?kv (*( v:x2}Lqn1:<\Io󒑒Kn=mlv[|:=F]csMOpa ("a ("a ("c2_Ix=M2ofr[zSWo [ @("({joTTD@T=7*YV5X_-g: |;m; x:jÔ6PWHUas}[ykݳ̀PEPP( ("({joTTD@T=7*g&yGi1-@tz- Yה4AA@@CSx 1116(:)[MN&slu~zmATD@T=7* *  *ڛQmM  (L:t[zeg.}r4pVÓ>0ݭxVuPa**h*  QPE;@PPF|==γ2`ucH_#H攭+i@ Kf4bTcsu;޲^r^mmQPE;@PPEPh ( (&@TTAN@TDECe0fYbc\7fWj,M " ("(l4E@QT^ixof-h;\GI;뻺A9)\[tޖiˡaӟ"(*v* DPASPQM " ("(l4E@QTK5'Nq.m˟s3ZW'^|`RE:Ĩ@]@FLXZ<+6Vo}C,4Wm} 3}[if?O@Q@@TTP@PAx.  uTP4H,8LtcP@ɶLr[l*(  /@Q@@e䭸nbzlSFvK0oX? Fmc;;Q@@TTP@PAx.  uTP^( L>jN{SL r(:GUj|9>*ݭxVuR*x* coKǖ4_>iN|i_-cHdQWnd˒6̽[| "*(  h *( (oX1is4Oc?f*(  h *(3tjN΀ w &Pmy5J|Ca+x<5qVot3Dk3FgOӦO9 y[b@Mx""ATPP@QQ7 w ɂ5Nf&n?fDAPjܧOuS9 w &PP<@@=M-8v[lwkhoY^ihbѺv  SM;%0+kX'wg`0""ATPP@QQ7 w &PP<@@DDޠ @TQtOlZ <{pt/_6VEkD)@h ( x˒1W?vSY kkM62 "("@@EPE@M* ( @TVGYd@76 y\Wg1ִkY8TT A@PGXsl6Wwx::Ƽ8@JmWh^LsKogiΘ7  "("@@EPE@M* ( @TQP   Q+@<ֶke([m1b(Ҽw748LcY"7˝,徳L2uY? or@EEx pT4TPN* (@EEx pT4nQZ{ti:i^s2 p@*彣˪{@EEx pT4t:Ll~YM=  >#lzmmݝhUP   PP=hUP   Pimages-actives-html5.git/src/share/themes/accordionBlack/img/close.png000066400000000000000000000030671250410645000262360ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs  tIMETtEXtCommentCreated with GIMPWIDATXՙk[ƿ{gnӱ0 T鴚<EqѕVDžhnʿQ|m@cR 誋EGbb)Nv:wIΝo9},"ar]w1v1v@Fa(2 B={yފizkH?+%JiRzGQ)B.eSyqrrrNPQ널B=B!>lw? X. E?$ qwlqLMM},|>RM*뺋j[؀뿩16'? J<[:88#ɴ:PYTU}<Wpg:|>LR yBvf;a&>}n|*Z X.jv/&jիWXZZ:r/\hv\.ߕpRjVP(sBt]G6HOZ\gϞ%ٙ $Gu]H%YEVCTBKmò,4HmX.RZ&tBC)T*"Ldi- B8e)6^x۶\GPBE^T.,PJhٳgE5x=C5jKFFsϟh $!44kYa ^m#HHiqdPsuD_~^1 Y[[KO}b{{{۶Qcccf]#D۷o]ႽD\Wiccc ٫fgg#,*LMׯ_wMwD[3TaݝN{[r~ 0hЦ]AM2bAkkE-EQq!0 8VC}@\q`stymb-v׻%QEyk7֩yoq^ֺ0\ 5xz@[```|wG PMeQ|}Ϛ i0M3-5r 5Mkz9*Ki=x8KqΟ]j;[d27oRڗ\.8bdDs^4MSP\}}?Q\v DBW\W:TUsss8wܑ !GB[cnnҾ5ʻgffp۶m?:r윞~8΃`v"qF~[?p$<d=NRl۷4 /u3̟ʡAj FTUic2D2/^U?<L&ظbh&(~%XxI\]ظ-;3>Co]B4IENDB`images-actives-html5.git/src/share/themes/accordionBlack/img/eyes.jpg000066400000000000000000000027011250410645000260640ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "i !1Aa"q2BR3 ?jzݙ]:0%:q g/*; %?xʸXC+ȯB,FjlWVqϊYZVLmQieb|zq%u>%=:]9n|{+ \_F{ {ް~Vz xCW![S1tic~S`qm]S]\<4M>hK \`ao1UӬh+IAHerY \b婖9;;images-actives-html5.git/src/share/themes/accordionBlack/img/eyes.png000066400000000000000000000031451250410645000260730ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ˧IDATxb?.Ā Kr] 0H]:,wm'@$=`@CZ1 $7: @didf?"",dud4MiB1q0U⊬ SBJ'ǐ؟XZ b9 Zj$ πxo$ŀ%!}#dk@ 5U=Ԝ7"2dī)bRߤ@z2X*~B@l@M˺|bW )H#3!XOb PK"<&2Whn$E,B-d$'S@]وTr_$5V1o8ʖRԣUG.O$ .b(j!I2І7(nPР;A'>K@| y>ޖ]l؆F=FiAh@H 2Lh B}@bGGJT1#T f@Π{abn/ kd(TNJ@߀;C hfL@-V"?9"PoP3 SAXB>C2>:MNA tpZ gZ$5>]x pB 6& [mEhVD vqo@6h#xI5!X[*mIENDB`images-actives-html5.git/src/share/themes/accordionBlack/img/eyes2.png000066400000000000000000000034021250410645000261510ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp L!vIDATxb?.Ā%3p] i:~({X>;l 9fS J$w$ /@<8NF( @M5Yȱ␄"̽F@| K6Bp ^yPZM<'PZT9@*>?K} g~ hB-ħRb@ S8ȱDׁWP ۡC3/&g pw @V@|CFpQh[6R@|٠Eo MB">@]XbRC+XsiRk."Ak-sHbX!;G[ErjT%@_sqMME\)3aIВ# JG+. bPKCŦBqZz"~  > RZ`ta 1 !lT0kB# <[&Z ~f91u>B7POՁ8jvb@Aj)T' LIq1aT|AqBbU>5( ;NJ: {6LH#S؀'c ukZ MjФWq8Fa;8 bL@ 4 IYX$DYI#&#D_| Q(zB'7v]MK<#&. R&{Ww`qYhqIV;*Й1V~4Hx ڶi$_"|ӦQ<>v, _I+?ࣝGi@Fс_ b4 [J%TނM V0}Hxol4gtU46ly,, L[7>$/?"* "/t ImFTV=i&y9E2;E!'ܷv%iFOoBGGcn/@3M4QR8NFPc  AKH,s2]Q>IENDB`images-actives-html5.git/src/share/themes/accordionBlack/img/imagedoc-darknoise.png000066400000000000000000000057521250410645000306610ustar00rootroot00000000000000PNG  IHDRtEXtSoftwareAdobe ImageReadyqe<PLTE"""!!!### HAȫ qIDATx[ 8 yEY8f#=,gzO3WqS}Uy"psz~[fX21S 5>}OEV Z} {jygHj}Dǯ{r̎fp֙}ǚӢvk~gM}1ưhIJ>fZF/8+ɲՆ[c:E:dTGIk~t܅ĸ6°)DuF]t8R!vhЦ 5Pp;QW깚ʅ}Mi DžJ:-:kW ӌu.]*FŚjX JA 7ѢkfCTLT:l,ĦսI5!LU^kͭܢ pYwSRAd<}Bhup_iQջ 3 +F[ց~Rd+5£lnBB .2ҀFO>u*pV 6p>)9Z}R xڍq 2hl ಆB ;cex$\gJ1X 1VJRqj Y: q͚" `\#M3B[[KS6O'W&-v IGMuٔ;jb`crs}θM'cgʞj9"ty::TtL)CѩF] EʒORJcA M"u%Jj!MiDjS -iғ$q\(9rscp 8Fn3)tAܲ<ABh+tThk\KLj#G%Cj8f,a_+qœ4# v!8Q9ɐo;~Io{g2V:MjC#Q>) r9|/H0@h!w@!ЕܥtO|')q< t4tO4yP (fw4N(0D z1Ҭ1@3+\I1 Ajq$ 4ZoMA:c<ʽ+ e+`,UkIg^|ls1$Ҥ:0 "?LO& UdS\?23aG85-IVhF'<`k>uR=NsG>]ȯ9)\.CI0ŜRĒA\d ɚ5&´9ڑId>H釼$1j6’v07~w?YF2㧗*cEl*u@|[|=iL(0ĵ=n.]@(pCArDt 㪜9+npGL,w^T KdRWOprb-9z:{OLԋwW+-;? 6 Gv6u)KSWxvf0FX-P 9 =\*J~rVp~O79SF̈<%rjVcۃLMt+tw%?.itl!3IÍO10EY߉72Umd$TYa4&FӨ~'9ߛ6vwEZ( $V9/ 1q?$ڠTVȴ)A0DFDŽpI VT%\R9d<+h9egw`z­[J "!it.VÔ$퐯0~~#LF<# }([eb#]/<~^o0MKcΊN S2&S4 swΝ?aKOB +(Sޙ^~pZ/ 4ۣBݴj\E8G8:zomK8l|;kW`֋W+od~Nv\>&E{J~r MZJVR>0\DtCHTm4rV6]e'sJ%`dcIo4^VJήL^|!9DT`ߌ0=]Jgo}hc]n}fQ9㷂I,L'Wo ;?v0~Jρ Adobed         #"""#''''''''''     !! !!'''''''''' "`!A1"aQ ?[I7 o3yxnhBc'`%̉z͈5p4kֶRD%d|,^6ز* L+փVrgJ[iPqp7=qV:YPW1>Qm:7M<ԓ(0m>Vzimages-actives-html5.git/src/share/themes/accordionBlack/img/infos.png000066400000000000000000000024221250410645000262410ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp *#VIDATxb?.ƟaD 0yN@8;k,#2 :S#wوd; D@K^hLL3?@#6A|A  S-b-~u0? i@ j̓8#'5bb5!h4S˘uw->7RRe_ ^Z'}X!-=hg?0eq5ia@ߴA"ɪnFKg@5Άm(zlc1> ށqP!뱿8Gdv9IK i8q;1Gc( <2?G=7%?Qx:'CT֫B?rG=F$0;^IENDB`images-actives-html5.git/src/share/themes/accordionBlack/img/infos2.png000066400000000000000000000024621250410645000263270ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ;:IDATxb?.a<0EgB3I FR$p$N+pG $Y#q՝ @didv|b&RmD?Xޒ~Ɓ r";U", XH [7Lif? i2Y!=r$Ѥ4|}6|-#օ_ܙe#7RI @I?UL ?0ujNk*eH ZFP`w,GKm@5Άm(zlc훑RhU@&Àcqӏ41m7{K i8v 1= jX7cc q!_sc7=Jc+f6 y|Hz#r mݏG؍7qIENDB`images-actives-html5.git/src/share/themes/accordionBlack/img/meta-doc.jpg000066400000000000000000000026451250410645000266170ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "b!1QAaq"2 ??֮\"`eZcN@,6I /;mȳA @sB1`!W9iKoDoy~wa`\l„OSXڋtm,:J~0h. "N|uAw|z bn 8H*h?Y ]4MoK۞egm0ZIj4RxS n\tIrjd' g:IDATxb?.[aF40#6p lb$ABrP'K .p\GïIrx. L DN`s"//E?g$k9 CٌDv[ڲD D\!@O~b)jƿ@, UC&hz/@ C.8@,bR# %&eS#DO˞2k ~K.v S/XCe@mȱ g6G=61{Laćѻ jT gЪrPGبh|cRc nTP6Trއ?hqH1}6 3mhdE8ঁ*IENDB`images-actives-html5.git/src/share/themes/accordionBlack/img/meta-doc2.png000066400000000000000000000025351250410645000267030ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ;IDATxb?.a<ΰ ,h}qg J 9fb/X]$;$>մ 覽z@PaT"K#U @j)z`<,H 7@\e3\٩nH.`!X 0~2峠AZsRԲl3C-f &$Gnk XT@â g(l9K8;lS#=-{JOˬ-q*Za"@ S49 j 7C2k Pب(u4q FmD`+b5* UHl-#c,5)Ae)CIujX I  I-#A 02*h,@x@Q CxւֽIENDB`images-actives-html5.git/src/share/themes/accordionBlack/img/nuage.png000066400000000000000000005102351250410645000262300ustar00rootroot00000000000000PNG  IHDRD;VtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp G<IDATx eYZUWeUW> G(0n$Zͪ[@It넑<**[v 4GM9Fg]@ݺd>(wq(C;* ~:|"\sUi)w7| >ry Aɣ)fTQP1n9͍XBz|I2.zέ gR';\G1EnPc )V,RGPNQkY ~Ev:O<"yT vU#yY@*Q˨1;||7l8hG ! JfTv$:G8>=[ hƇHߑ*H <8e@{ U̎2@!T{77wQӋ~DREeLyz:8pT~C1̐y@2^` CM]kY1u5=s̿obK@Na3 z٭7 ɖ,.ZQuU-)?C"7Z tA~?an%:Z0T4ŀ[gV+FRg@ǡ@F ($@hcHZI|Dй9KFp+ˬϏ$zwa׺{:UOG5@\:sXφk _U^3/p<IGʩ;d>`ȡE|Ry$\xŏ{,J mCz 3":揶u2Z ;4 T璭[źԊH̢M@%n`pb?1M@r*P}O4B"̈1{h *Y ThJwBJЫ\EĎ xiP\pΘY&:>ÛjU,Rxp"=d $I2p` 33 ~-"P%UhxØuPK@#Hu^2_IM,n=k^2@q^~Ǽ4$BB> X"I G(눑m,E $Z:5肑<*r>"yPPCa)I$7j? ^u0 @!QFe*:VڹbuՉZ<($8;[b%60@8Dr$:D(@E}%fIGp|Ƽ{@1Y mL .rs Sdu"NT|ԅ 8s|51@KlHCF(ϨXM2_0N=N.@,:Aɣuߑtܭ)̡J$tK4J@y/T KCLTPlsdp1ydcdٝ4BEk @w{pN;e@)!hBU+Hj7{{TIU,%.ue=P_޵}4jS]$7)k2#aZv8Q>%%G#(Yt׼$ F 7AkfPp:%kY$.Zcj2{~T C#") YCub ={5VY#ywUW4A^HҲV0Rɤim ̦*[n2Lyd'꺠:~Tz,T1Đ>B F?w%T_:kp+O-?n$@Z4nf~.&") n=.?EDgfP0nx^y-Aa<'Qu.#h: m`3T7 0K*$1>S*gI)a,J REB*qK=*~Ƨw{ b꼟,EL4Jz+qt(+yO*h.o-x<)H0 hNU4$0Etᲂ9RN&1E(Hvx ,$K$ô)SGF;{et/f̢!iG2I0:-g }^SI1  ﶺEˆ8\I ¾iΐﲇdJ9WV"OO|CGw$ +D:J"Hk>+Uhk09z (İ*OaM]C"7Q'-х !#BH*Wy |suO6>y(8酬ŰTeAknP[sSeI$PRI$FC:: h/lO 1G{ ߹Q [#hE Hs+- 1D:% (s3ĎG3Ӊ%4 CQR{t(8h>@ !%N?a>DnP(Fs[ %0Eh D󫘡i:3NwU29"ɳw[.?=Fda`7z-ܻ@Kfo (i-ի٠#|^a風YLI_! k` /aT^񭛦?ذ) wggZLu5χF n)| >#CrWL(\;YG ͆dpz0MfPpTMQMC _\0*Dgq5>o4R #0C@GJM5n [rmSIӷZ*&ymsniRl:ϺQ EåNb*t5G6 Y$Ӵp J)qΣ~̑;T,h;HAw2p;s)j͟5_y@tu! x$KƂ zF:qd;a6Ln'N1h9]u ),}f?@ pU7mj;.OH0,`%\bؐDbnz g?\KޑMCzQKED½x^A7HAg?HZf6g'%1ώ||ZJdrHEH_wP@S׹`u H AzPHZ$f}hbw6_ Kg+΄d(eV"Ih#FEaVP@IU DNp (aPT8`TP۳-I DE#:s6yc/J)dHPKfD:mJ=հy2l lKѡyt^TK$l?3 AJPHC"Qg[1{,3B͚wۘU U.!  HcU+ x8əAHAC $HAs8!tR60ngRQѼWdH>y5ޒYBs?[HVn=ɞjvZ(>e^Ok.gH ",` w!ōgwQ(;^aGs滐$kw ciUZW2@H]|IIFw H͡b^)-uVL/X BWbvB7w12g7WeXXgg?P US,cXCr_9ڊUMUl?v#GdfHNw}ibI֍'ݰ)Fq $J[懒+$deVFU#@P`]f[AJ"1P(${@8|JΨ䐏~3 bs'ͫj`\=NsW9hx4JkrI2EϚ׍>jTqUwSim9Hͣ$ ݠ](;(JKrhB'y/TVX$ p1x< %$Tݭ ,+UG{=|t #;0}l P(=8h58 UkޑHC9s*9 ЁP *$3(jB0@:PncX9l>^>$Kis(܇ hT' H %Gd=U$G*{H@N%T] _C6 n]7iWu hh%%eTwuحD^c 0hzgGxEw)Ww03OWWnΣ y@G@ u#]5$p}߻IqKȆG69B)L3l4h5}a$lhz4dB ?(J W@hU?m^l8 9@Kv#dK7a sdS4oFrZFG@RDAVUH[OyBu&ٺ%y*_ Wz|2lKh/;Uq"]mmAI5P094J4+Pus z wNG@1  ͚#y@|-^v1 +(*٬gK A>0QLJqzh N PR]w )1DXHI);rv#Y{K:i @j~%e'zцo.$$ɔC({ C|:US$:2%Dġ@ݔ8 @2[2 ly7D`h=Jkm SĂ-G 0$Hɡ@y'"*N<2W~fj$`ЁXPGY#+y$' Tpt#wŪI֡*u=.nh™C7$`tBq86 yG7QPЋ$lX%ṱ3{pL8YTI;Iih I߷Z(i(sU;WYH9S탚})hnp3$19(ZC%8JBl2H:GU}|#֠H3U(z85bu+G篒o$ ):!~JFn2?" "C HAL:.ȳ%&E@@%|E yn 9e:sT֠@j#Iq&|E9tO憨\Y=V6Hq ,ҏxʼ ɣ$#0El~TG1EPЁ9H@U҇)Aݗ*# yE#I-?i~1ɣ죂_In[F $d~#-@W!w<ꖹ.6T%$֝ kl@rȏKl HR䑺u}k滏(@h?٭OUYA 滑e m )ivqS(ub, T)~̑yDeH Ht0M/\#Te~ͼl!); 2_9͡sEIs@ xCD $ 3 .11`>J -j }';p]fQ^Er~z;8@ $H3[UDf$!i+2HWGh_ɞF³ $kS|SN4hS@Ƒr9rcF,<hBCSIDf~9jӍ@x:\HTځYFsaXPL,$Tu{ ĀG*A3~݄=':}-{[(8h*:R% ]%2.&>?f4w9TIH5G™rs$:KFtvvXFpȗ,Pe0R`!딃/{-ܷ:hFYHZpԚM%h4Սt|P@@((N%L4<)-R*P?:+)fPv(tP -d$U[F,Pyɺy%x ? sJPUiF9i.@hB4GsHNݬ71E" |-L #u ~,@>ό3dЪHg6ܭ)h9NB$-F1$({2@H>G GfԅtS$rFҥ7 ӆ1C().mLCɣcn=ex{X+uj@pHu(@u18Q8QFR*S2m vh%UqHyT$]3YI EΨ!_FdNT!. I@B'T/YY61IbI=.2\dBՇ<M.S*/ }DI ;>R) c>$.JΕmbXJfS4 @7*5#DDSN}JF8RI3,Pq™.VU3k>.`h94jo/Ȓo3|D^Ou_i$ $bP ֪['Ѱy*G3s45!HT=3vdpFRa .Qq 䄬!·0FEɢ; #HBH|&R+.]  U$kQW1"NdK@S(5Ԋ:/ʁ ~* d $>_Y( )h+Wh]ts!P7ܚ MlcE][n<"(e-cvDF(}0-`@/C'ӎ.:K.<(& gĵ:V1ElGtPJ A㸑wH9uZɣq;z5(r"u]7/A s L}> sLsI*h>C_й8Jb g|:fhB jEaDEch=6ev]WY|P_LAUCR_ZFJ--%TQ{͘Kpv3i0GèW $UM%v 5z~52|&x.fc H1{:,ΌH" c@t9.ߴ }$#B7Oɗ aѾJu#q$U;]F%9!Cz3A EC=l⚥k P:lBz;8mE'EWffPZnj‚8Pv3ԍ$)0(L9^V̫;Ql hJd@jك5qΣ[ et;3὇DQɭKc;H!TA(u;8s:YRyRŭf#) wϪyiqL^s@;aX1"D8$4񡤑HnB΃g0.w$|fHPQBU+I^ .U:.SHۂ/}@N06H8t.PlhQ?"= CCR ҃;:a~dJgÙNw#@!K:Zԍך*t9aEoPIIu\Y)˪ч1GCDêbѾa$'m+KtǻOi  `xV6Q̕ 8p^n$](%Y b!.Q]07Vs47Ǝb#fTrhO5 D]CZ ҁplF%n?2@'&Qa`%[S {խB7N4+u%h( $HBў4gHe瑒ɛn]6G;EWk++F@6(yn3\:_[ Nv  3P mT(CG||,vo7*1@6cfQEGO&!gNTf59$8RȍgP7x bvB*~{.̲3Ƽ#B hQvT,"6֋B9EF{M:W#)qJQtQ@a"V/->0zҼ7ɣl֫ncHdE Ns*T/Ɂ!L*$_' u#bzp*IP@_]HF7M iz/}q| A H) 8r|ab2~U+y@cJ":T7m>t5 p𡈬wTC(#k!XP$ulƳWJi7ăԝ) B+PJSqC 7@$SP`k$ ] 4#r,5IɤSa)iA(]h1oC$1'UK~D\}#SD3ٯAE_ /` h!IyƘoE17 ЁFAKn}0bT*o"1ALQ3 ڪdHlB$<bC`%>V}\u$:Ux%G9$hE4^VpFԡ((pvͼ#QGQ\ocQw] ~5 !wB(}'@&ͫbyyټ6& ZF W`Nzg!r4oP@*b0G(}˖lRGIR|BRT½PI$ 5U,] *8YR>hT)xռ>>@/7s$QWbK(hatSs!Vl!z3Ć 'Qf%1R!ʵp\ź|Axb>d^ _5HUi7HIrg");8`QPD}MQ@mf(Oa3;;JaL) w@b^p%m%cxPuUo&=QY@`Spn3TX}&: A̺Y=m$NT>1@1!id386l.g Uek.LuoMb Am5b4xPpX $fAR]6/ {-,RQ P=@QVZFzՐH# 1Q,RS=k${@)dⳏpQI1d~@PQˬ[oCҌ (hHBI^0_ G4FTh7j4 S:%QJ] @^ `8>F'$MG|-Rf(/ł[Fg-Kw$Y792|kEsG*Gwww_,n=յyͭ7~ߨTd ^%00DD@uU {%?T)Q7گR#A"t0]@}w3Ăhu qГ~692i^3?)@LNNoڭsKKKtttXoo XwwwuuvvVFORQr;ܺÿdXArȹ}ͭn=g~{Z:&q|%Y~6䅹(ILPLj.Uʬl3)j/9Hp*QaĈΚְ[=JQN)on@ 舒Z1lرcf?Y\VKp5qD¨>OO&mCD惓SB#9yʐkUнlދ$gDԂ:\?oY./94 =c,{yw3ST7=A&iE\̌:R|l}}666Kˍuttlwuu[{?9F *Dr'ܦ w2e%?722yGRyޭqEn$ǡ0K*Pw{T[2.ڒ{ T}(t40ZH ZGcA6/ʻTw)cZ+w.//jF]JzWoG"7XↀGNrGGg;|uuݷ\w]-b;?'&3ǥcCPbo|7*a6a|Lt\7 jAvL3irx_ ; hRhѐHJ}WWWq `5xZVa;;;R? 1>>o///KmjjU2u ӭ_tF q5GBܒUP $OO<t CzW61G] I 印O}M0EMg 2FE@Gj,W X@Ø#S~}IW2ځ|񁁁vvv>qfoo^C{=w+}t?vuuͻ5o[x|ٙ~ڵkX>%vvvk{{۶lsswl299NB0ĩ:22]?Rh#GT%2ڧɭ≀Sz1GjpQ%r*EtÑHSSgw3ֳFAx=P $݇[vwwl u~˟jɓ_򋫫Th||%sLr{P.o```ѣkvvNJP@H?hI)y$̌ngFCRSF:(UIA@͔Qud Uֽ߼4Ԏ Y ܗZK{{{VںW244T-*Gj~~ڑ$:uS]]]_?$bt H eq6ǿ<ܭfT@ZUu]TPzХG 2>:.V'۞s\Pe {<yi AgMe >r˘$>[yoĐ$jIե@﹬ut_wƍk7a\f399YujyknݺU:uﹿgw#- 7778ژϞ= w|[?ēINڥP xIVt$BVnI^.uLQEtAE]/|Gf|)y$ٺȂ TDq|hs$4b2_xPc5ԅ.4nժKzzv~ĭ}~5ݗܿzvE PI1G>z~A)>lʚGF?>#<$}vQ;fN96/a3¹Ot)Fe{J0覻DU}!W /Md$n:$ҏnuM#yɠϹ+:Yu3gTOK(󍍍U|O~Wgggݻ[o^pa_gg'N8QgfyyYcCjz1AP0_U?7mj -@PϪHU1mY_hl?SfL%^?%vSTD7Vm~kb3Ca3mHjS@܅oSđ~^pKm/oB[!I);w\U-MIGjT҅7o^<ySɣjH'Of6&-̗̑C-.߻sFKW$a<BSSN8(l$A9%r" -]TH~u15kruo=>BBݨ83ҏGzíJRARfttDJ~IrNI7ns#,˧|,m}cᢕz݋}Pɣ,nMmn}Z+DDJ *=NﮅK>ԇ+'1C # Y @"TG0C g7 SqkJjѴJ;SXo>C|[ӧHEfll*wov)^moo1^ x~RƷzҰo䁏O0/O&=e~&j{Q@$n=HK-׎$|5 IՂ@` x4*\D caԱ.eL yGYyr$F='*[d J(}TDgg|i\"kΝ{~cckNuR0}uۭ7C\˗>:S}_Gb+R+[GSA^ĨDh(|J$!5i S@i(uĊ@RE)bfp?HVFd⬿a8q՘}ɢFB__ɣX]DvEAM ;;;<<<|~wwfgg%u˩9oܿ秖ӘAH ۷o? 8 |t*0|=8':i苷T%3TA {suǃվ"=hzdcF@+EsŲE_e 9y$ɣX[[~rwRQz64KjX^KxՙQwhmooWOn}ѡ?q'-[rH//vueF>H A ]rrmN$i*a,8$e'3fƂ$U_5YDQupnpm B]Β~=k̆˂O(û 4׭%N8_jDU՝;wp5a400tLɤRT]՟+J ޻ݟ2HD.^xb>Ŭ$fHNM zڃ<(@UJڇW'G1G)+7"hzOf?7I`Yt&~ (6@J7JM* Zn}wÑ#Gun|ZygVVV!T0Y픐Ҋjw~kRxKwXyt8`p/xfEARm@rKfTByOjP.kTA[n=cQXNBUyM_w#ERO/h-DJΚh? ɳ{ GFFr{JA~O%>\M$I2OInQ󝙐2<:>Uo;Ԡݑ}P=ə/v__t)tF龯yӆ {7۝K?}7_ȫlZ^ihJ&OF!i HDlO`x]HwSS2@IEM#<% \ B6h%ɭ?Wwvy].W:߳d[-IWIzoo_.JƓ.8. :.F*=}Z[[;ֿ~=9}Zuwt\sܷZ/aeHu!j~*UE0!w1 w ѩb~hzZTLD"+N!g{'@+Z sZ5ɢ(%SssW~fkk0RCwp:KVEH%cxp/νa ڜZJō;H-wH~Q'򘙯2X%/LBt}ӌ*%T^tͨ6o` $fVBHO'x$:S4@J?ʨ)JqQA%Ldݥ?y)H !+ ' B]%+`PTM\y,}xj7ڏ9R kmP*q+vwwpm_q_?c;>WXRsܹΰG<8p.ÇI{wuwwk 9O'$u+祛7oXJhPRQ`* t%"<بp[[[&=u wxs<B qoQY] Չ=kJ^Rv˰:9/[1`;= QGms>oUMt@wp}:)ytBQnOK@ovttQŨ,rVZ{[5>hm%K{ljC^FGGoV驾i{/Y:f,2Qm׊zm6zyf Rt~xeVG>nF2<<\H捻)655UM"-,,+gܗϸ%CirD$]%t ]2ʡ5h$ׄm )Z|m#(:M&P*l wRAX{»NSWbJ!% OYEӊ%*(e"%TXߦ%6Hj44|(J˴h6'eUP&(Aou_qIwvD. yH;b~7nTˉx:4M$>߿>rWŒ3>aՑtuު+䪑4Q0p|p(nlUe:#TBt`Lp(s A'wAzY w p_U*92XxJ;ݠ"k-DkXA(5@1$zK7ww~˴ҪK|LRm-\藃7fxrzzzv:i1( $!~zuSx%f|vjݻwy}ϲ@Dt=TH蛷_)YJBhMAU FʮT> : fw3gf&OSƬFj:HBc#EttwwoT*{Y"%9TbJ>)΍_YD1aCiHTɡv_2-޳G̝Ijpxʰ{}ۄޞU| ƪ9xXr%HɣʉF$j̇3G/qv1BM?i<\"LSD8ה? IT].)iLQJ {fW9$.TߣiBAjI-`Bw4l֥5m$w@T*^,TLѣ,*HW"I $Ų8"ñclvvV]nv8$-Uj)U Tr9+}UK{ݚQRԥ7A~0yUKH..8џG ꆺuV>= _~Wl)s@{u߉ Dw^a2l0rx'сGt#WlX cNK"un.L o[T=شKzQLZXjatt/#%EȴYm2yN˴։o%n2Oyi UFѴI[5 xzz:QzyK EuG}Ϝ9SmOL[h?П3|H6/cKPPo6ݻ,B;=c^^}+_5'Iv%,0)Idq&=yH}Mu$&&''bmmE#"oTG1ߝeǠ %׿Ͻ?l!afK1z[%U@sr4zV6x[@ԭ hG:IUI]WLةS3oH UᬪxC"=[ gs )p0OXB Xh@J'F;mL[\jb"ӖZ 4 Df5qsVTDuI}')6661D⥹@ U݈II EE>ds)aޭowCsyhe~ T j9f: V̽<$$;{9HÅUcrQ滑Ct38hrH =9 \FG"o 3gK.Z]ZZXjFb}ݻqUh7*bcǎ*!m|G3ERwϹg'Մ_֧'regϞmyV2sssV*yIj&3NyYVuNbHu^ _`{Zҙpc1w[4vyE)@dnq@J^YY&51䍉 !T:ܻI,:Sg @]8λIIrUoXXІ{%HWYFX4OYcusEpYĉf"s_`{QJȨ*!y1F1$G ~~_12<9H<c M GYR#*d\M+JJNz fPusՑkɃ[]1hk\\YYA,b3ϟ~:#041/_:DwӇNKj`hR`w$ H AcO I>zԉEUJ&r߭Y(KOVA$iXeo677jŗ*i^CK4h(!ͣnC%nbPWl-<I:.(fhs!W7sl,ݝu4kHGB|`yyY{VK CNWq򍍍";1y%{­!'F>$~ͫ8| HNR[]]&$ XԞl5Ў|eckќ>4/E隇)j;̣|hejt:Pl 3ԍoAC%<;B\.kkkՙND^$ Ix_)KP%saS!;mbb"jQ!GgԑSBWMMMUzv``n (,w:hJxʭ I;hI\5$*kAq qH ENFX ~|>c!19Rd"Up'e233ӱ*o_(u!A |vvkTommmLv)( 3uQ*$G/U]WL[mDAp9zխF-gy)' &@ǬjULQ{.u!iWG)-rϔ|$]# $]p DrӅq$YFJbcggKJҽ-mـIݗ:,c_H^(~VkgZDN@R'RZ9@D ɱ1/l9|(#8:o~6q rB qZ!wJ#sn3Mټt4zU,4mi1\6/Yn &8Y__j}j rK mooE o e u0K?coo/oCcJmmm}hrBZP`Brvo6&i9զ64HjI ( ȼI٩G)R;7CW0C}ɦΘtޱz˭LI7Jⴋ!:HJIB&W.E?+ѡqjƍӜ[sDrY{־ @>cIxl&G`ZP|dSnSG|Esfh OzQ jgIoHAG'RyQ\@$FT:ie2s7uoYĉU]՛7o4ѪLоk@ П5D3_QLu")K-(Έhz3GbJG`uQ=<2U>9RG$-!ir %vvvJEKֻfs]H~O wD%*ݳwرc3 ()ϙCҮM^tK;QGdskt}Jrl*@~?yYJTtΖ<%1pЂK.nG[^^JWu:>>KI iT9)րeS4TVv1I[PoS\2jA-?]HJ 8}T;l>FAn%$*y¼lI!e7+EHaHdp;֗Ek6:wBWWW[[\.#oGpIڎtt(ϺuaP%C 8:f/Hdny¨il\i#*:IQddUÜry=*9A춷 WHBb]]]O` yh>RUqϸ9%t-2Kdfh>[2CGfrt IMAus+JR)qZ$Ŋvu)k!b${NNNm3٭+niȚ`֟՚٢Cp^5BN(xҼ||ErjOBW^k8*p/bdA=gSjtK:ӯOȲC۞rL@]G͢z jx=r`XQذUu`0%>̼@lKJ<$R#h&@ûhW,ͰH Q}ed1՚2)2|kUs)hLJ2_89 twwK* uٴkRiԾV_tsst\=$&$711Ì'< (Q 4<Λ E)d|˼ 痄 GAAͰ\{7J5(KuZ}l_AF{ȴy9aCU<}dJ^P8RDݑ#GKӘrpa\$,g ]PGn#F7?( >Gw(J"d |B $SJΌQǭOCzQYGq9 Mܼy422@2(YRggX%Yg姣%ݖ7R8󶲲r/q9OSSS'0m6 X*ku#ubU&-"vsc9ޟޏ&k}ӛZ}fF3ofzr$ה;CC%6Kc\8;cxc!]5T ~73M.Zjs}WhI->_[ݒfQ]aiٞ 89 gNSZ\L{dGd >bzzzossaf07!mZJpX#9 'fG6ZXXj꿬d||Xp2) 1uf[wQBu9{\Y>)S<[Y+0q*}+0iܗL38f333+}}}skkkDisāaJ`rQBR=";;p)܁U:r GfS@x;md]^reRF Eq4ߓL-dq$\рeHAÛS{xˁ15q{R'n*b7p.LP:DY!9j6, ~cwr>`fv820_`'#TڼUa _7;;FRIFIHXX_QD_;ga*CHE͔jG^\\<Of8@1aNGh@  qP(/Jr79#4 *[C2UA!W»KƁL&hZ5'G`ddDif8r@dq#Z*UQG p2 dF$:}784o| @q@ E>NG(43Ba1qRh*z3B}000볳h :duLޥM2 yUWc#s.;lzYI5NKKKB#`' ⣸YHz k '#B'yAf29m(y&YrȻfFyDbOPIR_(g󳰰p𾫫kghhc9 nލyg0xUlnПL&;2QΣ/J֍eA xS@#U9-[^Wa 4j" xE)kj:NBAr* tַD"p,4hٷ ߯t'leoύ]|tt8h3}N#T@c:֔Kh>vB {ӺCy8p/|S@! L;cU܈+#mq uQHpsS\lB(dIJQ40wg,3/ߠ\,3+ tx(@@,P( Zov^aBQŦ\D"!cccyOTWɪ(iic"M%_뤾G{c lD")̊h%'kf#b׾{"?.=}ac; ˒X F٫mBPu}DB{9o[֝>>;;[cccs]]]Ԩ 3%nvѫ*!mX@Jӟ0@Bju:eBN:_ᔴL&@ZV[g[#DQA:LV5r9ewLXA* igʽ~ ϣ))!ĥP(V>gG>'V&Э}:`A˔y`@t/P $$ d*E[>/4Jɓ'׮]}sGB0x:#bB@:1}N_`=ntlkk+|=LmG?HlsL@qL!nOԾEeR G00!L9U .m HG_iUs3jx%,:3>`!!P(??᳢SqqFpMTJeUZpG92z߯_tuvv }dQawwWPZ(p :g !ōGh zi3*:x 4HX$,a?a6, &G@[k~BqjSs*Za%Qr`A~Gv9!Q $ 7?{Lzzz-& B-UΈ}UFaK SïS^V".V%ohtt4I񮮮FQN!͕3E U0)(A;ž''d!Ix*q`¾h!H ^18m dN\OH) |>ۏEKd=dFvvvdqqQ&&&Ϝo}>[e_H5O^O[rhGDX.$b Hz]6pJdHbx?^$_[|/+H>mNAYHq5-AoK_:Vtӑ|65=@{ :!P(?=q3cIgggz@2_y_ "%^QqPw:N#sCeP'7d]= yۡH$ZMVV_yduH#Fi $Pp@xSjšBJ,1'$ܔUcrJ]oS,9dC:BG8pآt)#]a2څ<"$ J{rm%P\ Z=sohh;1bّT*Bsߪ,oi3lem`,Dʔ3^ukVxA1[eX:Jy%>Ҫ j%?ӻϞ=7n`c8HpGDBB̘ Q gR8Df%T9~q ()T) (nP<:Gi 8%q6pMIl KbHg3X>󛛛!LR8V : )ߠʇoЦ(ҦIg|J.0ô_8\:UgOysð4uxP2ps쏍}?G_$8_2b ~.!T1Τ+*8{NҎ&P@q轧!|nBҁz>⹤gKP(S\mgOeguDȎ_?tk4BB;d![WWW0lPx guv4U==rA d%AF;x*?ʆx@ NkߝN433:l︮a'<`-!dG,,PGc24Qf] #u3|jHܠ> <B.s"84FvRMyDg?7A?Lo'R;Zط6%HHH^U#nY:ğ7HrA c'&Hex< ,zzzםHۂL$l9в[Dp*Kz6ńT(e]E6T'lt Mr:DdS|G)A{c B~g(]]]-Kcd`` ]wV#3zEߣ-F!{haaԃ#RD!8+W|g&)ÉSVzF:` ~SAH!\oUA#P iT8D_fkaB* KBidTly6 zIOf)E(ҌFEg|PHb`E?2}n) a2 IN#daԥ$DDT# &1($M(q9}r;;;@S!GDҾTIpwJ!PaM$*$"- 9i*qt]I.́ˈcSq?gͰGiѨ/e4R`IXr27Tt@;-?( nӯ6uêhRuҔ=/E# $ FB/]?XV`y =DB 8)Hy= _hÏHQ{剸 x5xH(WsK—AΖftz\4ߩ$4tH'FYlxRdTouumkBYr[Qe"蟛V,27XrGׇctCs1P+8 pLg?rzeeSHqt'dn'YjOcQq3atFQdž^,CHJOJaS xGzdJtz r:hkJ!}L壩]!)̠;JFu(>@R{m DF񴸁W !(k FuUc6bX@,LB0(tdҸ I|6U aEE~('g}}} ΝуǾ2 D?ߐ .u #=HlSѱ2xNF_Fw=lꮄ9&tT+Q|~aY PSL勂5gKc_uTQ˜BH@_r_V= ! _j*t:õZr]\. Y_xҟ$2t a6dN7qv 8g b:I8`gө|Ճl6۔߱ O8㟉uV"d%XB $84`eAQQt"C>!Sz | adhe=w1Ӽ.od#Ca%=L!NwƟwƗݭ;67722̬'Ac,pu4䄣>o ^?Q=ȼ Rlp ,~)6J挫R}:Q*z}}k{zzdhh‡5m)8㓗wj$D1n  30!Ѳ#Dz&tGd.RvAt[!Vz}|\/c$!:/zORݛNa"e !AJ_opI@$d!\.K"v.J -|z?k׮]:Q󙫝T*}y {3 p!ӨO;LFH'l*L& oH36Dboo?]__ 8Ny|Ak`C9g3Ho )IgI BBxg ʢPp !,W riKm=\'n@DIA0 mq %wGUnp$m0~IR(ewM "46D_i /yU8 8BRjEg-D܈׹wϥ#`0s/Rs*KP"^QN2;WjSsT*;^eH$&OgBa"|_266V$"ԝhqTyjèϱ.@Q't vtT*}??N#3I8NӧCߛ瘫g"@4!uGJ[ ҁ _5=a 3s*p =n pMKΨQ=S=]3 :*#MqmL(TuIB ->;.dVDjH [Tr~r~o;I>Q6 3m0ѭ< k:L!2gs`0*\|` xp͛9Q 5V2I%]݋5^| C7UA Ӌ3yHz]PS8N^Q!ۍK9Lp6GF*8mL;cFZh%&3V}o"Xq^HDܬJOOEjZwdJ)?'0Y:eip&+Oq@jcD#(aX^^C`||<ԩ-f %`[W8vTB p THz35Ω8n-7vLi!uĩ{G HgT/6+>Y .[I |e"Zv()###m덴.KKKu'!#9d27tK ):/ |\oTeL=ȥx' fTuU PBF"5$BZ "MiIc)&D%d"!e*pQūqd«f1,w0diHwr2ycI]]ͭG[[[zG2uww+W peՅM_t 5({A.c*P_?DRS1^pXN:DvҬEFL"$ػd#aA؄SD C0#ږ5ó5baF~ڦ&Qɓ'=TD'͖3LGWWd0#6YH?"#^0(Ih, 󛜂ς>Qz3 h|%9þ ^6%0 Fzh+_uF!oQx:\eanSEaI༺6L@COB 8J~z꣨o $ھ߁@H8,)04MHՅCe0~B/"yUw5z#N`A\AFzfI=٠ eU 1zˎU>:|Nh 8PecVoB!! ϧTT2ֈ[IC+!UH) C]]]ߚNe D5ؓA~[\,8Ij!JUUa^:,UK;j@IQNKI0?="wrZ $ .ؘ7CUپ8Ɓd]zװY>:Oг .}~yUc[|TKsA՟I A~ 3~"׮] bTz1 t˪`t8O0ofuysZՊW 윴h G2kbw4)1bp3/+y` av 9cIXRBځ,]0SaDb46S(eV=p{{YHa`4E/mUaDO8\ڣCȹ1 @)AA?cq#)qPD恄8aҁ `B>g>=Jų_J%YYY#@"ᾸSF  z -T6'$*9'%!К?p6M!g8p'nnNGDA^{1/6Ͻc\aG9n>[`#+xd?T9 Ka&F8 FDMus=Q\)|*+W|ӧO٬twSWP8 ԛ@#"@vUivY+|oE"^qn.P6`9-Rvp޽L ,n|H8F 93NE8n SZ "EQ6񱾲!4NR<o٭2!'!T~&ZP(|>(?\__pB"7nHGGe;qd0%=v\raQyH\'&#P_, ~oJYP_ѳf0bP ;# #8XZLf4 Biʯit`~aVB 7!TXV]vֲDGHm,;/2#?TJ_.Lfe{.WSRU)Zz {׉DP0,}s'PPUCԀÀYپsGtkR=78Lk8c;'²݄r}{ z({d@ÈTs=lk:$=uGߟo3ҁ@| ...Y:IHXϕd0"+ *b5af\p"MERGY;|k1)NE}Abwd!,WR.cu ,Ipp +}Wb!0 ]'Zu1i/jUĺײx/k6q^_jmp"]vͶrv3_"kF c6ľ B.HU_I0gK@`) j HxA1|UmOIQxq[hl9U=-XwKV~Y8B),R5ul9]x@0=m7iT{GdoR:C#$_s^~}uu~dR\"]]]6?_ "L)I7]" 3NG `,n s*u|@>v8Z<0~\W Yd1d| |P?D Ea!ʠz/kYI+!u" M}_ү%*Mt FH ϣIꭅD"!۠s|Xd&Wy'cЎ[H?bpD +@l0 9MM9_2W$kRkB#_& ![?qƹ) r|-gʴ eN!r .}̟ͪ:9׳hCm;>Gn`:EH C'2;;+;;;~+uRGrNzⶦʳDqA+煎fPl8'^{x}BjI}7}N䞎+ÐnT* >Yڤ)(g k@/-B.{Qϙ娘E@( EO; 跅JRvBϭ7 ^y5@$$p|]1cbz6c"kg{ZP]a2!$wKFe/ad*Z!5^ h]_Υ8e@jv cw8www'dkkKj= N08`Xg4^'і@ g1z,IRM 9(wsS0(!2nGvuNE8RY >KwǝρDŽNޑq p3u@v3a!$$_ѯ8=qew믾z髾/1HM@2yV>I‘T,I;~?_oҦJ.58FKWI붦 L;CNHԕ8:*(k6 DBSUNDžt^N(4/-{9ݫcQ#h%f !2nuXX]y/2'&ЯOׯ>8`36g{t V9y^yYX# %뎤t:РO;тCl$8}`!$~gp(^YG/[pn"yB?!`pBq@ƁHYNE=SGh(} #0F3 h N@%=J}N?v(U8. ke7% `2T=fہ xb[ߛ}G:C;H~<,3\.Nuvv583>Tŭ$Bր^Ia?ryLHơ˥?cd"0FJ#^@@rQlnG'9gǻMTb{r{x;ge̎ea^CZ`:BHXI^rtt m`K|Y>F&˨LnQ<.D#/n (Wɉ Sq րFO#2> #y@`"eƊ^8$>)t"zׅ̍=^oHʮ7ʰQ!rfF9̜8:o l)[&T1x:TfFyԩ^TEzdqN@@"6{0i@RV/X6'4eHZDpXh%OFxYixI8F,K8v?Qű[3RY egcY->%0'4yahbSBH4-k\@pmg[?rר?f\1k!bER'ا-Kp%9`ԹQn(hΖ|uBH+pSKeN،-lEѦ|ea9$BA%zp->R(I  <^Q5c ;jeD$i7ptX}G\ug^Ie{ nyT`` d8ur%QM K_2rh\:̺D7w)2#%{cA H0{SO;جGPE9S͖kZH\xlOUQ`\Ҁ$"PsZ"$ Τ5Ӊp4"='9߂3^}8s֛N=ǢQ?CޒLVz7eK:yS !Aqk3:1G% J<5=zC 45Iũ"6AJN ]o3yaf)QRgYgrֺܹAپfr}6u٨+eQŒ4!`I:J9 |B ~_4mc{H;c b푞 A* .ouNmLpH=O%z?,o AjZ@ N!I2?8L h'V{7UƮeUVedC HoPd*X ٨ U.r3_5p:4B BdƱOsH}=Ihlէ !  l9WӶrXQ2+,Y@"J ;U /īƊQ 쀡yE/A普)qcBcg3Թ cCw+os); Wu="i+ YⲮN2? ȼܽBΒ0FY{UצÈJE4½3iR!WFVa\SXp@ԱkQ_$X$[Bl5MHt qY)ew~0z7X319zI}9}^n0n! @9wk8MPRC 7U2YE>@ m2C`טCi"X(Bd E=3 -"  eY϶\LxNZ1;"rV%Ŀ!*/x{pJm(F,^"mi$!J08}_Ȩ(i" zXWUR8,Y?\+K0wu)vG![|^j?b_S.ON +^7h3gODlzBTPy[uZ_.È'/~g ~Ƭ]r jk:D#D9L2ד#ǨBFQ_K0%j t3 ?%n'b#5Y&nH,PGJG@ ,bUTz!wqeUV&GXq*Rt'wus(9rD'}AUbax/]伂xQ0 RQ onЧNI9E.gMI;(0n[ ['ړց m 1G#,R=\y2ע,YG2{+Ɏ;{ۨgٗc6\X%D,0FWh=L"G H#( Iqe8=kт߫w덴&vf xMo|p [6WX#aa`m΄P^C:d0D:LߥIHd3GжI&AhC]9U-!>E  Eu!ΤI4NFwS џRS.CzנO0|類94F B~mK냄6~Qi:Lxw//!n-LB)K3Z{5y/L^R4x/B!vb&R p*=RA 2KXru}HFs†10\_uMaf(\a_es4i:@YcaSese%EL>:[UYgOF"9F#!Qz~Ezu~F< *`Ge8Zןl}N   \J1'я7 d `Yor& ZS{J.K(0.ZuM{#Vasx́U]) zXc>Xgҵ/= T6xX&N}*tW.# "#vPS|W386UVy?@!$pY#UC ϡ$WJ* alNz c5U.y\(c<{~W,^x0x?;ǟ5Yʽ08L:ⲣk7 Y O( eN!$&T>vJb U}Q]yUT/}IL9:72 p)}ev9P BRAcg`ID_a<N.q0L1D70bພ[g}-N={͐k$5}qWea.~9DφУ,ү]DlXWfG^%aRňBނ$&īKfI`"vM?SF;]_B Lϋtf#](Ts>{gd0{M! >MCJƜ#[;]vsMp`$\% !I ta0"5E*OYcﰥ 8t B. "$0.xt3AA(/{U0f/peҷCDCA\c,ѯ[f?/Βz\^FČm-}$+İ.w$`my~GQ螰d!a'2:(׈NvDW Ρ-}_t*FK*H"]Du H0%][黩LY$N )w8cb! gSe#]rAi!X<`>MqvdyȄ}WBBGJFSξ_ޟV v-S{SקO ,t BMU<#TY/MI0I`/{Ey*Bg "Q0lF( zxx\9g2gm4'|]7y!'Ҧ9? s /=CQp ]}N!2*'TV%T.Su+>m$6ЁD ^%*2IL-dD*]SEq_; mpFԮ lN2'il)U=_^[FZ~N[Ke:*ʶѡӮ{540yČ`36A!ࠞ<Iܩ챣 i(2=-t BZN}Kd P%gҥCt gxL iCܒvcBe5z3ڸE? Q3[b_=Cڱ3zwˊ.pG oO,tLY:},]^a9U`OmA3Svbt B .ǾyE&#Y4F&= B"K%gAI|8YrC}2%[6)e; wY}Ο1m5Sƚzz_ EOZT~ 4BZ'ߙt&[彬|&bdÔCY:!abQ03^P"+: K*քM,Cq8Kq1`0ޠ rQ'!)JC:5^Sߟ @?0Fdj^m=cZ hW >l aO!':rZ1П3ӈȱ*G 㵨\SF ńPϘeҊUFfЯ);@H:B#"q'Ҟ1 S7kraAg~>-mԻUnUUZ+˝u(l@NHH]ѧXVN ╢UoէWTOU`Q]> DN=+d'mLG2D6҈9E:=h(fboi7Z?3S6RFZ@m -``6>+B.}f,##@ɉu gTO76y0˕*tUPLTxΩ@'^;:Ii 7L$?Ǥ3r)Jǒ>S8&\t1B c]{xPvSEHk}BCċ45͑s*uB@Y!O*x.:yF,RzSu*i^=vI;q>P _gx[dVapH}}!ѳNw`w+Ί%LjBVr)#5`Lk# !؄1>֯aCS9]aIF`\RP -. +z>UT-]8FWN~PFq̉,NAxW!\p ޛ !6IX A]}$nT-q J|ow!U !<_*gR ij/9FØ ЯcG񚁚%N.nV". '(,zFɑ:>ցmeSL ;ڒ{?Hqؙv& pGI~GB.qT6s[ RG$1kEYS12x@!As>_(=SrD/ш: l謪 7"zA%svM-UU@׶)ʬ=-y|;a\l⿇9E>aq qH`\@vؙvO\`pPrZQf-ai"_èC #+c*?"71U90b#!A!4O R*di}){8iMUނfS%cc #:è4 lXFҧ#N0& YH*na'%RFۍYlGƋB\= iF{Tջ/g6F$nkM]y:4"KBHQM?ac@(*YNQ9Uq@&^ausY`ICBp'^i'WC;Rv}SS{ؒϝ ߤ-]Ԅs亮Ml>p!S,$.vF_{.UCLGbqYr]:*#ЁD!>%ќ*&p(!I)}B@§b]:u4[[E mL`D8>&uߒƀhB_}F•I9>XbܛmK)!0f= GFHtC6LUyC<m[$.)I^ג[+FKB'TF*OPő2q*#JUDċhW|vuBE1z=d#lFy>؂g&]8`o0S:c_DjČxe:Ug1(UUաL9k>j[0":!s(İ~m0C*=&B2N^/bnSP ==zY,I86q(,eGPZf^W[Yrq`u^ʥJd=]NZt'gFp|{zddP8LŁ]OM] WOB9#{12KK88x/a|aU~Xߓ+ d n=HuqKg[;Q`FX.\QN[bVBƔ7u#0"uՑU: !qPD!֒/*/wKOMh9(EW})q.I̕NDž(vFߖ\H|gh6x`X9 2zFf]+6$>]da=R$(*쉱ʳ B<DPW `Sf5$jR UVuw@9d=HοF683-A3G5v^1;ᱜؐ56t.pf5#-ɲE)ݧȴad#Y*nyQW}©"ؤ`B!' e*YVJlM{(p(g 1$Q, Xg>dS9tu}o|Ԍ( րɆDz6-llL|B(V< P(pзSupg:Tu~îS{nLU&+|W49e[Mw-ΟO߅AѠII )8azptaU2A\6 ΄%•D.2uSse'z}+50 ɔԠ1w3KJ k+ d5BͽN !i `%zE·>΍#A3?nn wcƷ&|n>pڝXp+ilzkJօ&A Y0„QXvnÝ'uMתp%{@o`tCA1%4^rSxӦ6%D %{np{ziaЀ&uڽ% 147fwOkƝ8Fq$nzԹjtWOj#F~Ow=*.( w Vn%Ӏ5wb™Ll9w37 _H7`p&X{g$MPbq/_;&(kŽ+É>S J:8vN[rmQ6vǭ)WLg{zTbb%4qEmHA v7\Gs7܍f7jֱV$iAp0CǎWMPfw|ҌoyX4f7Vz *뎣 Bܹl\4+V+`ʺVzZo_S&Hx8B}*%TFs})L %M});ow}ކ;~ L׸? kTҞI8}W7 2AA)T" &qB7sl>ޖyܣ=j4v ~5JM1~L $t:0ƯG^S&H8|ҏn%~GzJ5<2wĈ} 9.L{jŽEZitQ7$`o:p܅nzH }3Zpﭬ閅VQXj.dayu}ꈐ@DF9,s7`s4 ᦸ f'7Q&d"= V# 2 {k:|\$NƑ>KvOuIs|?8| 2RHCR=5K_Cg{kVp $P2I,y%+GE?DZ/J94Mnjjbz}Os%F>k UGJΏitEO%FϫDiDɣi  >*9JUMFϹ7 $0]\7)2PpF)UhֶJa\0WBI$mm@ƪl\lrt*JR|]jĽܫm' ܻG+naxe@ %]I^왇a<)EpVƹb Ha$҄-pn`5qQkc}qڰro4+ pzm^bX1lX|W8>百PHI3&}4#\UѼ҈+M'њs&CMN7(._7ݒw&043u(ѨĀK4憶XvU:'*.`9E4;\ڨ,!=<2w8^Ƹ]qNٝΛ~J MDO KqMưS=_s.=ׄ{$aCHQpERݜ [ Knz5kRɤH A5Ah&xj$kM<4q`s O*Ud%Cɺa@vgLPB6L)y0 ҄$+]wk>4,A$D7l鹱OХUI Q02@(gX:.T.\ЯJnܐJ<X Sٗz'MwU5/ܣs̼ M ȸAf]_'ܛZQXlX]c򠍇l&`}MR~m6@a7aHk]=_k{Rj;iZ%)Y~{y?,I5E$ Q7 E:'[?x6lwubA7+W")Nnn_h4^f?oԢ$K#;wӨ;lW 39tÁ\, A hv!:FxTzC>x״(HT]-c~mc3kNHZ~93+d/Ka:mYj3o=k mk6V߸2}6fp%;B/c'''BJ<%O8Klxl]m|QB`iVj5 Ъdw}e6P#}ڿHI&R1D&\_e!a Hl nhhjÝH7+4Pft:)VT^_._kJN*H*EW㍝|vVӵZmF%}~J>2Gxٟw^[ {1G@U?L&R()6DRVu{| H!SC+&8[lʿhez_ 4Ҕe[5NdBMLL||&zJ~Ad2YQI$ڳ״J&TJ=25OeُNMM1]K7M&q)>GH[w]f ˤΞ2E|s +pK ;RBFs 4!\]&f +1MFRi܊OMw/Nޜ}+a 0s=*GL0Sz鳱X$V/~:_lV:3mH$*Lf~Nl߳mo4EϞQK}K^4;guͿI*ef6}7 vfmo04 Oid~{ >-z/ku! R7GgqҠ9z}RbH%’“1cI@Ey͝K4 `;Z$?}I~ A%nV,5E=jA ;Jي %cLDzԝV"eP՞N&Y^ОKdɞT*sssq75=.pL1X{L0p|+ж;c"fUn~kM0QN}`N=UӦQ%P5T(,]6$R3&8z? ۲W E%_A͎B篭T*uɺVVVN5M|m<;b߿wuu odekU/L*sZm.?I#هgggBia 4l-(:sp3ʖhHΚ`?v5z V~6%.aз/$HavȌٻXtZu}=jrsm 1HvmLj.%vWWXTIXX$ZDDlJiYEN5?L&7zjVݕIZmZsNMMYvJ$GK&2}IMPQ5@%.F}z?u2ͱc]_H5a;s#F:%UR ;/h5HmkD $;2Oϋ%%vE!tb) & \v^^^W$sssﶟNu:VVV^n, JԏfR{G[ƅ4s&H(R'QA&H~ {Ll5@%neH:cx Z]7vg %붫wFzL|̵Q閛S?M{yAIae"`@/N/y^lGHbF-РPYQզ׵Skzz񗯬<>d2Y~QT:TVS|>么a4@LV V$ gN5AIF :?fc=!WcHtN) =~ʌ }T5AS!Eꢦ럅 #ТCGzȐ@ˆLzM"hRu[ִ#L" r&YjSFc\.JX,6l3BpYIRt666Fh%h Q)ܨ]د6~~=LD"qgJi&Xevv7Wl]ӝVt]Pr(ܿ(g= {ϯ~X=^uF N ٷ>R% V܍i858آ&f!fff<=d֔[]]=H$oll|sR~[}TRTm&XT1͘TF``,J3w :ܿQ"9EFpq[:On9peuGH!^v;T\<\4"q$s#;=QQ,veN!50riQS~}_Ѿgjm*Ad?dcFI ^h4_YY9ạ.ᴝ_kEJoBi ~:%ߒԪQx}LiO$_|vvv!3\ fӱ  ƽ.l½UV,>ڒY`~xgsq8Bɣ{䜄 TRh]gdQ= @cjjuZJeazz,,,x<~YOqXP.h(L&j9Z(OUՙJ`د7vp\u=@OVre%FN m_ӕfl^s*7Ǭ;:|WQ(xic&ATe4_0 hK+!3E:lHV.LyQp祌;~li%*<-H)J%~T*%xGM "J.;byJIm Rv{Ap]8@NE"QZɋZf]]]}աCl,N ,@f*Y1͠/2m 8d5N960J3&)υ+cZ;o:Z]]p׌;'e8o#|sp2Vʣ{d"3??KKK?Q(̡Cϸ+=XsY}w#ݻ:I{hHB1A-ʜNWpuuJٕJۏ/ߧh\cGI$%+4P7`Man0Rz.` ;,G nC>wq8τpEss}`TL\n0*ez`H cԩS?rܹd2Ü}MFL}ڟsu!BQ&5/Ǿǐ0`H cX,XZZ/NgؓG1^Q Go*OtgnWo 3o߇u:TULwKdS|}qҝ#2siQmОUӝ>FŀsV,O]x;zzK&(lp7?b?L&=& 8m43oZ=.*6XlV"KR%3ֵ IFƤYLMM}Ґ6G8[_;L`C ]:iaI!iZt=&W=SZX%uDqw<`{̥]Q&Z{ަ{6כ*@o67x91SSS/t:ch.DVZ)1H&DFjcX:]󷝭UY?Ia?T\w^z=orrKCz]aWQ5ه@D*˦dLpenݟWlw=?NwsFJ5A"|οC5##$\tuӟ@n8UM,05^Ndz|q/J  X18rJTcD"QV+MMMk6K{mZӵZ͝N#!o fZTwK&lJiPӁ[6umUڻ2_G1*nzsEMFH{ΰr;M6}kA$f@ro5[jQlfcE,gF+PL&^*z>R(LVgggؘT*ׯ%>8"ǂf1 " jVF wlR VL"w?`7C%{H%4"+uΛ칦*dѴ&=΍uwM T\Lf?0a_}YK~}q|]</MLL\E7ݒe/;4P"-Lkt>D"Q___?V_W.+{Ո , &-/J齥A%RǓΘ`zfߩpk:ߨ\9-EVjuJ+YTvQ Jq];=}DF &1ZY__4\nV0@h> “O3$ 9\N}RF\^d,k{e25=&(kt]u}^q狀zXHz$Hl&Z.w\bYXX0BaпnV~{x 1~},M,\3Ӧ;:r %ad:ڷ=V1֞Hjc!B4YxihkJ()sp3G.xʝ3CtEϻs"u9J-,/q5Ud,0HH*J4'K9r5C6ˇA!{iIK t?n=ך{sJ/Z](WRs ",䮳jp#0FH sܿ)J^ZՀ厾0RI&Z:^jd26Wv)j2]̎V*i5IJ$1Ƒĕh> s&ܠE1/a(aԻ`]G{Kn=߭X,@HBI%v lAz_mԩS{ufWhH<* iN'0nRix 1YlEszUj6.`Eh0l}D0?o; b<-ݯotW>Lߔ 'Z&_5M7QD $`-..=qOrڵ͕D{vԝxݤ+4 RRyX,VѠE"gzkEJ؋ cϙ{dVI ZtJ ɔ\5-wFHSH}>\fN)19{IU ˻:C6L }0Ξ=k|k~ŋȑ#;J"f@TzL&%Zc(I$ Is@R $%13Z^?;/ם yEqAFndGK}8WeڡkȔ;>Q~BТD閧 F;BzO?;w.vAlڏVixs534RXp?5@})TN+RƂ3-nˤ 5i`$i\%+g+Z]A$R}X$چH6]v?w^r%J IzŌjmL&c?_RvK#J:!=NkIR_Kʘ'm%Dm 9U\04xO vݽ+Q5@/U4g+R41"p~6z6uC9}8[X@u9ARQV,3A6^f {aK?v;MSpꐞkRa&>f,[0TNɣ7u^2E:Gk4 ?#a~Ě関.Z0Hfy `hIngh h^1\v' JR:scN'J.RC:華S&Whҝo\F$ߚmnH%5aX]KL0TNgLWYTMX/&@@ 3v;OS644 5@ZORt:h4Uo5sߓJiuQƝs0_t!=*GWwkF_.4J{ky?U6tX-jmK6Qް$J>v>l+L7Po}i6zIq^)FH72ۇZ6f*ئ QidҶ#6ɉӴƌΛ*U7mQh#%λ뻒Ea:];$qtik~|ъM: %m9Eݎ7j^l6_V*r+W|x?_eE~2H{oer棒GwbSVMRlll>oLR2/3-Hh!$H a`f&lHX1uk sgHaLuwkKm{IbHj5O&1ɣQb&꛾k&''}G;{+UEBLMMm.ۡ+666b+++ž3tU^r;$Ј@5{3h4"إM591iTɤgMŬT*!1 0ʆ &RHɢpcD _J ۇT[l|97gI+%tE\"JQ.׮]d2f[0`$c؛oT*s\nfApnЕHʹ~>NZ=/tMV k z}dŷ{I%>YOR&H [$ll&&| }B ;nr+|ӶU(JGi ~w+#N7-H;c̓5XTƇ40ҵN%λk0RIuNdc%|yux_U: ^a  gt:寷q:,' ->RH>Xi,k&$4ivYq= D yF`¸E6n2OH p ڃX,Q[T*>ϕ,Κ`6d$!}>moqpMPZv=%òV}dEMwRzx=nW.UxsQ:QmO4bX,oV?33Zfi{q_`6NHii.WmIkT6 pO% =^b@]!UHp )˛ r{p@xO 0mXt1𙶑wVFewliU[~ m2wU2I3D^n^4B #MP(Lcq?E9K&ot:Gl}ߏ#7&hefsxƛmf`w1<[,ިK Zkbb"-sf3gSHTI}cDeB\1A+,kwPb芻p5lPb]6RR0fv{3Y]]5W^L"ieR*5~C [xX,D"FmoԮ2;SV&aZɥ=_(%ߣ}L\h#k*pnZݣ)JU\cX;߱l6k69Ϊ"۷6FgzzzI٘!G -Z\\\*877wޠ}FH;h4T̐5/n!%J&IeSTvh=ϚT_#ƊCZ}4@ "MX67ly?`[rt;ēB*뛫ji !^ii{$؆E X,~ޘqcc%[h4&kH~]MC_×cu_5AImL 4n)wES(ܷH`Q#^<[7GX9}1 zB3bW6?Gl|FhύHjfff>_ɣr߶}ϙ`tF)$kh˗jw>]]*#?d2f}&뫍#6q=Jm ]l~:^诨dtv R*VIR%TIS4MtUHF(Raf;λH $urvN+'''I)Lf%bg&h`XeUyJ(ivV*)Rm1t]U(\Y&h`%?j6㘙hA@@`8oF?VI$ Z__?t2VeE~[U{N3᯸h;F29@JiEV!e}G|뻛({g& Z\\p~QV*z.GҠۧm|T^I{}[D+TΣ ܬn9%/`,m ~-wz&>]hS&ygRyک"kz1A2lSTi'%)>hۈp_/cz;*w7g JḬ: s.ueEN'KCjqq|_Z[[wddoL;*j|_*JϩT*G'&&f{j&_xgh\h}XIׂ64$QUWM7J)a$F<0T?m {aCܹs}b/d2ըnrPZ=aϖ;Ϋ^a\NIA )Eq#fhI V(iV(iSc&X@t[rת{=Nlw_܃)!aA !l6}(*)y'*|Tz>:Ο/--}}?ڇ_7ү{3eƶڇE$T}"F^ &H )1T J EZu=X]o0nX,ujfffF+ƩUuQCH RNRW2Q.QzZMfGG hMD"I+6=~um3Ay3Ѹ`V4b2o#O3#.]wp&w<]F~cXn>Z]]5Z,,,KBX\\bةt:3DℽY}zrrRɔ=fUČq>WVbMN>=iNsM ۰hϵTL ՞n{\!N`$Muf{t}m˭V9z>??owzzN$ԛܗN:L>c2߫hL=`oV7Wy؛Gk[m? nX&Xt\Ҋ܍&0hEEV M] _fsRzds1f|fǏK6#vm?_U|P8gof>eoPsRd8h)VWZm&LD7K&HiS%42>sFLUug7t:T*g?ڵkoԜ+bt~fsָfyߪj@TU) +iGm,O8O I0j[)}cҞRё#GgFoxCcF_zF t~j"{SYNRKsqc +<=*SgclNL>/޿nhz psX B i)0ڔR9K6VLPp7ϬbޫDN(oƘdG ѥOZ2^L&K$ vDZݬo6j6gFuIȘg{>~hI^/LŅh0Y+ LBwhߵ ]Q{2SϬ}=Jiqmsݿ;f_76Nj6gclhN7f}TiXYY@biw0BziRʽ_IM%+E w}w'Vrl I&?kO9`0H 0>4;iEs=l*b3664[+J6.3.]ڠ 18n#Bfi&`ߵn*ٸh%+` lgk̸6Wu08$_Հ5NWؖ+.~iGLLRݚ{`p jA]:cat=4=Jy7h4LR\yN?9`@Bx4^XhRBvхjh*)QIիy ,Ӿ?Q=WgPɝɱ6~] 6'NASS)蠀׋N|EDXԠisl_jGzoڇ|5{\.%Z6FP]Zm6~=50~kEu^>DfjsMaac9|ח鸾 0Ҟc^8tէz~RI %T~:Hlm{_6(sOX9H !Jtp(5$KGDJ<ħ+ժt:&o[Wٱ28џ}s?6&#(ROI_1,C$Pվ0dF,S?fw8PH+4JT 6l4iub\ $%^o>RQmwacB8aB QW76.mJvm͵GP\0˜Q&D $ @?c"kaa/zbT`k6 F8tG̺ eA$0LUD_ tR_Jم Xls`&gmh D $ Uƚ;>Msnc"aXVG&QswL,[Y__7/^ўHʣv=͕ӞG0 Q6A־Ms9pgO<Uٳg7Fڎ_yp`DLhC6^jdW na&MaC HYղ6R4 (e|څ0k6N8ncF:ZQM plQ0"QVr'is=@5l| aBGm$h Ğ~o4ߨ:)ʿmkC: tli D $D] LP.Isڅ R}KСC+)j'l[CA6Q9$c1mwwWVV3X$vx_n鬍/hH#61ؖF|oƔ7/^f[s,"bǢgn̞6AI^P٣u&To9lh,--_*^6HJ& c/eXGާL/oHaZflq 0[*rU+xiǙ3gfbkZJ&MLL|>ߏIEoѠm4i!}}@vM3O`GMj{`ptCM>^1ÌwCnqqq~!}V\NM"Hr&nuumi;m|WF $`g8n$bFffjeV#%]3A)%0T@<{cyeݾƼ}~&QD"l65jP!lMa,R)&ػ@UM@}JK&K "k/HQ,yq` $hєxQ0\>>)Ljǒ JcH@@ iѴS&Xy`)%읤$R=6 X` @Mw"% &Xa`X;(iҚ Ha.ѽi&qjyMw/#}u77&6.IU#}L 5A9&H)QF)5knUeIhHaJqI J%i}rve5\UE fA$Vi{DwRbII%R<$0r&H0Zqf!+6`$Rj UJܔ H `hߢ %,RM`Hhk6LL J-#YM(J y=n:vG ܭhJaf"J"%h)Y!y`tƼc{$Q+Λ`Jm {DI!uPlgc}>iHM`L(aT3đJ]tѤy0h$9cđ:UFU5A;qkҊؘ6A:7J#(Ѫ Ju짴aK@&XI*Jc@ܝV()R%G ['~1ݣVi#%H+L@ %`UJޅ+'>RH "88e 4` Jʤaz@n(Qt蔍C&XwwJ*]6Ap1F ۥCJi#%&H1APJLBIl,`?%V&!Hk #EI)$Q<%2II%%ues*%` $BtW٘uϕ,6#I+&7I $%MJAHV͘5:h@nHݣJ)TqA;a( 0bQ62&HrAY:v(teO> 0,RHɣI ~"M؁A[vj) +"xj F6Mw#<"i跶pݝ7ABI 0@Đ@~ B %QqqXA u\ n(s$FCIrtZausFLXRndUJ$}A `)aw?{o$K̝3l9 BH !##/!a+$!1Aa!! "D< !^'fz;sյ9:oVUfUVUfMfU[;,:eY_k#6 "A82B+*ŐxB!dHP@"BI&gHt)%YV! Ѯ<Xh B HB! _i yUGWB!YS !$,0?c+D$xo\qO=O!!2!P@"B3a4a.+A(ؤ)okxPs:斴p%L\$#< (IMD!BB!$& ,q(%rBt;Nױc.!ܛrf,8LI]mCw KFhj %B! HB!1E(Bx:F&ь^ ! xt'GRz!YRDr&'(gD%B0/1>OY- HB!ƓȄ&hdiV!P\|F^5qC*ģqh%R" x)t}"?Wo HBZH\W鲸G^Fy}qQ?zEB1eq RX2lھq @P:1 {YP &M Cnms뒶xyLXo#L.wF1@B!F3cҩ zUӉ)ҝ6뇐7ue0jZ0  1BR<)8gx{!2۷L^qvvl6|׿s||\ dmBE^0:Ft5CeLGM і`Pm*HSۄ"x`@ǢnM(W̝ &k68${ڷXImB5铓kju1rP ́DpD!XN|/^FYpEX qO%À{,H<[z ~}\K$BǦNyWܜ.Ic̃+;%;I9 2>baWujvvv^s/^ H {!JB!q+=- F.( `(Bh]GHaWbHG?9Bz)[ 9wgޙ$Y;(1^JF\jI$? !$AB -'B(CPU_QQk[ mS\5̽uF ! ay۾{xqDPv8/N|Lȸ8rEI&GҞcr#`v:)Rkyy_[վy|< .& !.Մ#1 a>-D? 0.A8q GY-ּiiw6t .g𲸆~0o?_;4kIgo[4Tz(2.p@kabqZ~GDȐB!=  P0H!²({+ -qA#Ð{MSl[=A'/ CX<G!"T<a9ߛ62nY\O8|g&nꙤ|r}||yNm>"B B/"W654Q00; *]'3<yqg9i8e]\1I½ C[^)NgJ7un/븋!&\^J$ MX ɗiB^-V!MNZ֌S> "B!u``!n܍1laNӾkp25}?ymw8zA(~^"UV!9ck/0aS hJs+OA$sdzH&.1yOEBH0דuu.w.7[|4  HBH6=`4MˆP4] |gppɬvU;x#%cNyI\1MIO^@ް~] %o Ib8־1ngODHtNsq˵Zm\.MOOF޴Zv=GCD!dC0!T؂i0liNbD-hk α\GlC / fx辭㤏3f߱z04m@eM0pFP2?h?Ѩn_=99_YYr>jٹ\CB0C&QE4ea|}%!$~ǮXpv$y1'<WLZĤ9r)-q!S8,e#aNE}m Y}=J].p{{#-,,mZNPxGBD!L&0z- z%E0-N!ũ|'qapDDF;m}>b*ȸu M2/ {:~fx!Lwɏ%-&bIx8$^JAơ=gOu]-V!o|򅭭YXXx=- dP@"B&V IwI7ɜ 6aEHM~TEG>ӏΖ߅WQ2|hP"B=Wt 5qCY5xa „JDU[Lx<䢑_/hBF;"/đ;0K` ~淋YN^& ˾ѱ^z p Q")wNyE;qј # _oۅJkkk'| f$BB,VWWR0u!n覷֙Y`0V`@5OqE;KzPI.f2޾H Аls,^Mf="hr,ڷgjڎuUu։ޑ,@  \qc't﹟q_h4{rNMV=!!ll U0߰ElC%cl^7xfo8k$|* ]-fz+r΍y$ ՛3JX_76Ladm_b֮4rwbY^^kkk_ HBHr-$Ehy}mT8 /#+`Ĩ+B`1* l qs ϣV! u;sM;x)Ad$%ϣM#ᑶ33dJV-5V.9fYt^SW*m,!# 2B!$Y$"cLal)8bD#q.9ypb'O{sDk[_Bg끇#鞿xsU a uOQ9ޙHۂ4m4IzŸ/Ph& NS^ \ 7|>w>|iObNjڅBakkkNB$B!Y,!]d^׍6_{p\Fekzox튗'ۓ(P/g$\,!%ȬbՒy傣 bA+[?*$A@r+0&u&b(RM Kw_\(u#5>P9:2;0Z<7aHxAD ᜂ^/IZUBWu-zKDŽ#$KBȘD!$_ᭃ_z Ғ{9a|>1\/ Zd @\C" "rfK×@p#B9cuAo;OHc !BPAN57;;;L= /}JS\(>/#D$|>/J弔e)Z-i6B'owvvkvvO/// >n]P7 n0fB@w "a  Ca< l_`Ր`PO$j;0}}.e}N(q/%xz((bڮU5-&2l!BZ_]]_2B#op>gskFMssѢvAH߄(uҥ/.//vںna@ko¾'`0zLu$| A u`tH R75 p LxW h=+:+#B@:.I/%{C!!dxD! Ϙ#{9<<۳kd"F+++25h;iccο^ln]ӚyFG/K4 $~Qq>kT`cKqGxBUX0kxn3y<I:8 "kH ALǤS3B2=!D"TV;xa޽{O Q)긌=q=`cBݚqD`oYWD5^JӬ6`L5v{YCU-m[N:54,B@( B&/!PaRCnc7/rT:0BR4Cb&NSƒP7~SOIicqC'nSE-`0!?0._W`o<I拖8y`_kD dp Vږ'69v !d" BȰ|CBadyy\@[nI>?};8lcX.tjy6JlЈmX!ty(M! XW'$+!BB09jZ㖈uc)?f14F^xF[WgM#2h3%q0t]Zǚn0Hv%KW)>#OO"UDiIⅶ7#%98K1~imF״|JG J>!2,^H?_lNda|94>(pIsSﰺSI/ ư Hm#_ؿwʇޏqeqsuVD/Z`R*iBa$&r.%Hu^׶$!$1P@"2LX*57;eU68к^a FFϚP tlkωaAwYs!;k|_ :`LN iG&u=͉xG $x(q kLwH{蘶뮖c5!>B\`Bkkk+++GGGWEV ~!'YWzר5^4pᡞj6]w՞Z0r5'g2ZGX\O׵0Fcb0J:~@4x!Cecc9X Ky69f}s-@RB77" K}"WR1B!\PB*J_;"+Dg\p`IdwaXnjeuD^l0Į]!9]aB4V/=.g XZדyq ܤ`h"GиYHw.nQp!)}K:~XG@=B$B!CeffgQ@r Y`gN0jjȘ&:207U # taq ^H "wW.IH ک!^Cw99 > Cݒvk>|Y0wUmFPj49.BP@"+vlkݜkkk^ٔBtqXՂM ˆUH^BD!;U4`HU{0BB 2tdWa͉gY`&nݛZ/ Ըw״LDB@hd敊nNqǷOɥK=`W/9 X-60FL\!N"(A)) UC.O%7cC?q,I|oj2/[5-:u/%K+n/!imH"%B$B!:Pl>!\0r'腔]C %MB!gӽA?{U\/I+cxvwa3cA}0LE#^V4,OQ^!$Y-z1"D Pu=_ I$cG{O:FBHAݦN!$yHq[7x$'g~?z5ZS~9#Մ-Ѧ7S6gw=@сa v`$xP/$u4$Z,Wu~">#o؆ :H0"t[ZDpE!i@#HI.6jUE!4@B 6%7pxbќEsZZ>OC 2=Yؔ`Sauck)ƸjhH!0f>'&i1 Ʃ,Bº0_Bܭk?tp66x\ kk7c`zmOH%BᾬcZFRDf+N39t+éB,\B鴸2yl[seA|>/.?Y 1R]ǾmO8ܲa&$i+KrQTBc&{~ѹsU]~!( B1h4s"NZrs;H7nj]?b°z8i/<r+$06w95+Ѓ5qOٿ1 k3k,qʗe'CalЛbg KE6q 4c2Br{O5s2],p č#sԹpJWt,D/'M6&ks92 ˇzGד0%*")kmԶ=TM!X-q k͂9uXg# `~^ \kwHuRl؝5 TcPd/ Uɶ~SO?3麉:ƽ% J&%x)$3L$K20 1:n7ҫj?8Џ;BH$h zO0&0{kga^|?˅woߧFF,{B-T*HZr<S6c k Xq᝾Scj)<)aFV/H67Ľwk1!vV/QKya89q aMC0ii1Fscp/h^;ƜcxD!hߗta aMC)(BzBLEP#uCu{{峄"&9߹plZ -뢮(IM"SSggg37t_vʵ4S~I `o/NTx"8@!$ @1̟#D{kqym(˂3ϛ5b>|d$s۬7!ێiۭ:P2vT5I]tOоΟ kC P@"]v:]NBx^z/0g/*-(Mav@,(~C255Zj*J:Zo-..bq??#'bpGXmmt~BMr(F Ƶ“}rK:02=ѵ>' !]u;G]s 3Q;I;-xJjzV@j@Jg% $P@"OѨ(Ϻ}06a^1F&BLn?ol6n+a(#cnn?qxxikk[~))_픯r?+NS~[[}7!kq0 M8LJX%}S6)8ɉu+|^M$iFprSm4ep`M﯊kTFB&}am1iZWxwg;ns}-^E"j?i[;ySqxЃLh۰ϋgz}GV# q]DIآF:{~&!>c?1jعnދA^v+)!tm2WqSj}H=?gff]%PUZ՝;w~*G(y_F ^>_` D7sύqCq1~J#zxi5 c?AW;zƕk28^?]-&YcM ҂SNxy M}*$$h$$9;`(wtK:}02Q?BQ?EB/!c9t`H2)®, 8 E/jU:˺3#Ñ ܎*'Eh{5w#d<3Lo(JX%?R7xa:}I$R{bviIN:*':88z D+gSY{~9)_Z^^dzяՁRKR@m>ƟaA~. uģ>C hB!P~Pbgd81c;C+6t+W ޷ sgP"HKMYK JH 劌>z ?y}؟=_R~ُpd%t #,.uh1ibЄ+qQr?999|>?M(I_q/Jxqʇ5\d%,HNRtAϰb#uM.J)%:)Ll?h@1GG)ewnd9bm>nj^Eo]!o4hG<I+9*uiD/۲NB8c7R[(* {+;$ ux&}ntQ:y]zt۩WGS0Bh*" Mwl19\Z0B" N'VV4ӭV+_*NF1YWgũ.tAnןfn =c;Y2g=@"׊k 70yzqvnLCD˸Z7 kG^$'B:2Ϣ`-Z2isűO:U@#`M㦘A8ȼ+Q7{aK')R:Vm5xK8 zV-] .2I,a \E;ـCH{r _$i) H5qlQ“郀!a7}+ e+!?/ #%;-~9^ <?&<^N!_q BK[B:oL%p]J&xն x"Uu}{ Q #MgexS%X<8'36 H%QͰVS^9#:1!{5x^Ju\Sv~I_u}`"$41 GBE;]{I HaCu}4H;sU:7hrI Y c0 {իPHJ񰥋b"6m&&د;{Gقad;'ģ. 10rlyDQbnחÚ!á㧱A=Ա 3nVKE&x=qZ[a1Pw':h+ ٍ !](a#Q/(龗IE<⻏CD)x^dU/Ⅶ˳yrUdIS]SEG2Q0nH)phjMXu3!w )99k摳1_j qS劸'GE-, ˗ i ɬc#>Û:ϗu\|d0v;; . ZKHD2z9$EzF. HQ:y I"ݽ H^a:Fxd^tZп;Cjv%;;zn]\.\@-C@ np0'U!ΞNiDɪeoΌdO@2Nn+lfjexK:xF5b; !I[ߵu3a$ ˜z_~:j#8AeJ&ISׅzOHfDWęnF(%L(A=zPdp^D #"uyM"8ɳBQP>dC4 A$Hń2id -Fk![l`E]<#6g0%epp&ROJPsE^x>: k'<00xڎ2Z{__¨~YSy-q<$DN<Gۿ$hTux6)GL43ģ^yGQEŐu yU< ®5pvQB/qg& Ť /%x9ur$4z vZL!\:'OZ&ˡǜ;9zqbO5[ݜ9[%%[j4zUâO^c:fֵ°1iIm oI#)"^v+(D- 9'd h+Q/Ѩp_QI<ԯQ,iАvD#LIo&{yCJAnv$tnPAш8`!F6>&t]V35ۄM2}ј}`"=ÆN{"nB^0!]RQ&m7!d JWNaDג-vDR $bݽ:yu U/آN'!Ⱦ,jNa†h@UDμv:%Xt%墈ԐNk0BI\ _am<E#DG:{}0Wn#> QWYԖdbAsg w%78E3/=v/!$7k]f{DBL>r1. UGzogߋ 0&o $ PYsXSЫB0x_@MIz„|꼅5u<2+¼Id2۵Iۀ}At=jDHX( eyuG~1.H$0"R^Gx qE4 #Jtz I}'!)HDjEwt[\򮓀)(Ҕt3XIK k?M;=݀E#0oFkrMq=v%;`%0 xvgp`%I$*Q榶Ƙ 0, 8 :^){ЁХ6s葾.긽% BAL&ykݷz` ^]]=/mummQWH⠀Y}0##=wu4t g&Qh(בH]0VLU P„{@ lx%M~ ݽl&ۉ ȳ`#8v X56ģ[B@_|$Ccªܕd2/,dNYv.r:ǜbH@yח31q pҎtв(O~IKIw3B;%\]Ҁ,Ah,]]]܈gkkkuV73FD#W(QI‹HʫQzu?B-/a')HTnw$-*R'%#wsשn˰v8F0s8rLL[`45xp꺁IMVrϋe`x YdIRS\dr! 5 :O1/z*!$u1c溮Gگ1A,׶^JdR%}dj?puuXϴ5֚>2J( e>9qM8*ܗN/ϣn^G<^HFaBi (bRg ,r(5Y!)(]gRWRk]e}S.z%56`Eog7ֳxz.;6 ;opPE⚛U\'/2Xؔݑl{az_‡guY0̫v>8ϳ+g w52ϟkKBҽoD9ɺ]x?؃Dr֧} DS-jO>V(^kZ/:{OF=g)IA(2pab:D8*IrudNazY:B=?$$}hdIP ʟ7{~A/*"C5oE d7"d?8#M7Xop. 28ou@(SF  9JZQՄjKz( gg]g5T`P*|^43 5 tOCOu`s32>Z:==mZZ֍|>_=*˥BUUƶ{}O}{{;U*[˜43px6pr݄N0!†[8 {/!퐿n!z}ضN풗`虜 ,HHcGxtoD#[0jʳBiE#}We :Ԑz:rt&[pNuӁu{ژ Cl=be8czWn$Kј~wjowř8WA^nvr??KSSS?kImGa8 AAQ/[Σ0yGW4S ;-ň3a#"uvauJ7"S8q{ZMш 8o0e-ξ\8}"= C5ɶ D5l#If؏]}~+AۼLX_{GjFШ0y#B&rN暵/ǜ.iYHzԳwkk믵ZR}UT*,r9_9ϜcF!$4&qvCz : ߨ`E@ 9_/a_miؙkN. #%# Pp{#8ٞJ"md[_OD@ȋYc':&Sآ/k oJ((1cVk,g=X59Luunmm}s QuKOggg(7Sw8V>s)R [Ⱥnl[^"R'ϣNGģnˆFq FI]`t\>NVLE;Ԗg0W[(d{QAǼg!#b|3oaH`XDNG\* n O pښ[2t;w=<3%ҩ$[a;NY`W?kj8LXEH$&VB^؄k?llSNㇽG羅 oj/,--(ic?^oMT':⺳5wʟ;==ɉ8Wq>4]`HPhOOO?qt~r/csM:EY)\_jHGRP=Z2ސvȟ3/B9goeIL{ -G}vp>9Y$!烧!$՛z$yM>WuDWք] !ςpdlZP4'cGGŢ\|y>SN x!~}VaqAƣ֖~N?_ y|o"BmzzkyOPx(?;;+ߺu}e |S)z}{k^l>{ afffRHT>=Pw|vwj?bHbmf '-qܟtBQ?Ѡ^G/?R*sz5a!}_ ė1}NugEH2xphq >oK򆶹|CàL=aWBH-QtL)?ĤEjB+ GONNf\IY>߭3O>o٢ρğQx.677ǯ^e#!p0Kl]< mNpK< Gd=Q0ax^Q(f3f/$bJ IF4 ,C#w(did@+/φ !68ڠ<^ /k#mXO#A{g;0'k ]qmɮ9p_## f!<>l0 !y:9={a.T`?jO"$oll& ^G/Ͻ;Ivn$;/R3໊tiT-B  wH(w*4~ =< a\O sJ_Cht @X1G)X>8Cs{&BJ!CXcE.S\ Y-J^R)yeY__7n$!?_Kwu"ԙx&dI먛p[Ⱥ3t0uM?^Ia$~+mg<èRKigD#B~QD"cA¼q~cC<YV@<묆saPf%\ INJVƸأԺIcg\_б^å DZn& 7WjPE9u6#Ml6Nhtʕ$GmlleU#,M!S$ G'y9ŢNG~(G~(Lt $JGHC^Iv8$ ŘHT0P ${nʳT{3($!Mq0wXvO #݂d׫.D"܁N↥!k1{Z2q-QIƦW5ڊ}a=mc$!tb>5#/zm^?ggjn:Ե)  HI-G@c{azyMKoQ'(ȰAm\B9AR71gݶa@dNEl릴VSA߳{"ҼcG8Z),j-qONp`݁ˬ ӻ: J^7bYtH Ok/-]sR=зpGbr~J![ఙ &]OD2:aPA"r1l^<[?Amc_3I( %>ţNG#:p-Q7(JȺ0‘HGd2THھd& c ԩx.8B[lu iG1/K/F^ Yk9&C׹`ny,Üe/F MQ"𜅁Iʿǩhiǜ{U]i0!d? CArxh09fl/GjʚlbOc}v6䝡Y tl'(\]pM<*Őu߲K\GHl^GmѣMkwJ`/q T"}D⚗0'⿬V.T0k655c{ɶw NgG(%/d\wd`H޽9yێu2;䄨4ǵAby\*jpzz*ӌ?.$?C.gk>cWM܂#[pSW<(p$䈯 "$H.3(WW'#xC¸ߪHwoN#֎"c^lP<,Nqx.$9Ԍ{ߜl HI_B-W@T{;^z >w%! !bl0g[2+ WaRy /B2g)uOi?{o$ٶ5]U=ݞowyO@` Y2aL`Gl0d!=d#P5Ia²f{{{uyLڝv3dV'|9U9{ڋkv H_tFx l H8^邖i2sݖ1@DDA/º٤$~uNܲ挶ag9;mBr T B@Blmm>eʵإϩX>I?uھw]6PL8bx Dc1#;]R$Y7#Җy2$KKkgymZ@& EY{ݧ IUwTvHscXHYtG 28^;.Ʈ8 Hi'fjQ9]BtD"rՀ}kസU븛!oK!}JMKM#oC8 4iccc?511q:) yZ̜6IHzᩈrJj@O[~d'/к̦Rx;jEHĝ0#maN#Τe0m/La|΀^O%Fq^،߳ cjKAD"SBa-mK _p^nb|t_~7"do "^x!\^, к I8U_cڄA[lP):JFP"5^ꕀt((䭷ޒӔvtռuW7`C=N;un{w2[pŲSeRnDi|[R\{j%=N'$Aup(%u)PPpr;|f G ޷28Nu\}®A1}p*}H3dBȠJ"}ilggVsε?r||jDrҥ~/Fe[:v*L-+z-U}% \W#bHۈ>"fGvںI|GY#[Ԋst.yLH,iܺHZKn}RLsknM<8A4B:K4`G9m0u vv轍Xd H R_gY`(9*Ø[>E" d|Q_K^_9i7?omի4vCCk׮ɃN"˹1'q]v1\QiGmS (<×ԝvYR ;|QZ,/S֑~ADŞFq{RD* XB ZF$w X@`G{Rz9&W GvS@|N;[o wbXm/H$&zsPc4Ft^*\ؘg ڠѭ[z]naa4DCZSׄmΪM@ܡޞ®|ݣGxK[K]$ݴuF@2i>Ǘ,㾔uH?G2?Y4wI$ ם E=ϑ# /r82"Y߿BOdM5)8QwBt@񛎣tWu7#v !HKRiDxԱcڞ҈T2>Ɂuɓ?<@B*˗/1 7I# @u҅:;8ĉGiQ $-I6Iv۷\wjdFi?Y nYotV l H]H6'L,ݷUߊc='5[wZ{IT¨ZBLfM:c6)2ǹVU?~ONN߾}[#R7LLL H{{{yP릢):F!lP#Ue2.Qp4*GY#_\;(7psBvJzYSeIS&褚3yPD4eB'a}v;:Jͱs&qS:ӃD 2/\ RfdZw:DQhsBHc~2u^?!( 5lw={=KGy5Q.bsԇlN)ICk mCۓ ӥԉ}|iuvQpd HYֹGYHcBqa6=PE u\<6vH}9hRq~ 9/ u]o; _X8n 8[ΊG{k  l! vvIg -JEwJba$k_J>Ҿ6y@gRGD;|}FG#\:7H)ی$֢;)JQFHCē쑎 D)ĶeTg H~хyPԠ{z.]u9%fؽEu(ܢ_k o BIL-б6 6D@@2Ιٵ[[[ߏپ?NNNpN^߾I8.FE+qA=[PlY|QZRٺMy4*E,i\M[wԅvu:pw_ff{."\-r,9tuOd0km9=ϮxR <ڂmXtѮA϶yIzpBPw}}KoIԄ+a4rl ӱMhzyww!}efK#)Du]V(.]Eģ}%fÒ:FrJ/dIm۴Vu}DrnRQ|r:s `wt4J6/Ԁ4fr|}5CxgHJ6D%9twfQBMMJV!(ALZй iWlo?5GG"\q˯Svȴӿ^vu}H{wD}RR#W񥭋Gi/(xdHYRgQ<"E'""U=MHNC+)ڊ"RpSCt ŢQGZG NKx&ٍnl"c sM^k^J`uWz Zv8o>cS=iBHkXS9_ן.v&jZN= <;lI9b_צ@L#_:_#[<#W<##n#BΟk,GoLHƲݙ!ȳLJc>_F4-QDRұDww(T}{cuQkMRmv,za?(EHɏ}PTC)[ պ 럐i !sGd" *dz9o`F PVellW<)v=O@pFȣ8mn#RdRL*ħKYή#<cy7"R>pfW΀>כ!gA3`Kv$0ҡ[W.Kr\~Nm<\YЫºHNz۶:n^HjjzZofdd;Z=Maף߂-Ve e8M]E0#;mi}X ǒUBZJ;&R3F$]oqE!]"R Nݻ98w .]5˝ p> ) E8itܛay^dDϓ/I$n`ZO(?W(q ]Pp6=k^H!Y^^--- _( ]fɎE$7=O8ׁ7F?vz-GO$uw]4i|W੗( 2r[<򥮳#_#;dG(fJwxDHHd?6)`0$_+[q:7.1@:c"#c Sם'ݝq" ). ӤƁZH3 ubj}bwj+">BzjEP-o>"҅H(Q9G&[3!Z\6Ǵ" HQHH9S˨Uh{>}0MúHIVJχ߹׷֖@t xO#ׅ; ~ |O/@Eriw: .cSG&b+%BN I"uHsgM]'*5HD7!`Ꮬ75(: vٿ/uhIXCwsMs H]yD"r0`pKm/uLHf Ck?qttɰݩVS{AV*>xɣFzt ՓNtR[[[CQ5O~K?^:_( 5A\ȍ>GM 2 qa=?}7J8ZÎD$gwu3 9c7j- w@Sv<-5ˮ8׋<N9bB3yFuBzy@cITŎjT-dKKKx|||V kГ}F>?vtt;;;߻;?}ȯܔ _YY9F\JSD 6B,j==y Z&SʼnHvv ] g~\-QGnں4[!m4r嬈f(Eaɹ5ٌ l6O{s-QQSC:S;>۔u1cPlyC5 \5ܵޏtET5SbvsDyGGDpDQ흹:<<699p_7nLj'+ʳ/_ܾ}o&uMo%vAKƚ8.u-@[=5# Yuvđ+ B#B2VK8$S_i/ͭIwug[||vͰ=ţ΁M LpS<Cf^MSq~;TӴųEjqCQXOH2Hgz+Yǘ˗/vx?,--q'=d}rr;:lҁ{+gW^x `R2Dtсimv#7;!íd#$#MagOj5miWv>'#f?.q΁s!! $7~K3JvW&}!k!Ń^֚vQM1?q#IOXZZ2)yn^"XY׋pr{rǕJe{{_-V\}mhh(͋%sa%?ta !hrr_c!Dӌh6Ibr>ƥ""n(qC|Jsff|]1}Mxc(eA~A=o #az"MBaIҕoZ6AVT޿쫫9ߖ6DNLLο~j?߾}{+oWZ}u>a`^m"lH"1j H)XGMx4Fu#ڿrV"5K[Wx;!7"=תE>%ƉEi-!pY($/6αj<;r]pګH9Sat, ;浚v9ύ ɼұ c5 !m2 *5t7o.| ARtngf7<<166vuddk~)|WȠ?!m055hvww? g^ѣ{Dji]װ* ?2|ؾ!lN2>zH7l>Dvb6' Ar l &᜿'f1&Okzxx}ttt^ݻw?Ϲ$084mJ/>SZHx Iv!{QfSQ<"$EE$ӬlM$3kr^<*d*;gF$:f; vC=(h i1%dA),뺨em ز<S=Dy֮W$FE]uξ) :뼃 I.R=j~\N:DSSSO.=99cb{{!$#m'w:o H@, orxxxks)abH3lG~N};s E&H\M:~$`( 򍢏L]lFrVq4(-ȭy6W8ċD͊H>}E8J>d>3RQ 7t.vD!$ }W*v bN<oڌ@r@"> |#ˋ88/,,t,u;KKKc<ר(􏴵= JNx~H/&)P@Wh4ј^P$r_s#dn](MD?QRk@Bk%)kaU@Iތ*"!.!]:c; vbģ:5"a]qz͔P6G UaNd `#DQwv⚴k-.$-򋋾 I!B4iD^tLD{pmc,}?P'e^)" 8Z5M|6H%ڜITo6*3`}s\n Agaa?ਧP*ժ ?ώ6oD(Mi3BRs7)@ap\ӈ+ƤFGH8!).m]+u!%IDJT&6xd PesHLeg:-4SD;e2/ϳW9C($Qd!܍4vlԕ T͏,L!o:z6IUN-ҙNua= e0 )!6Um\1%IS\@ ȷD0Z`A"|bM :Ex}|;ބ|ӬTBNR Vn|;3P߀ q|Ktzt8h٭"LKs RyNb#a#j57y. ,:ǣ9S$5N.FFF^wGj! r!1Ș99cҺ%RV@҉.p!%i4ĕ8\Wȍ>#J_ȗ*B.NH EqQHN4xW;R<BrVNτ0BpΞx3#1 Z?QcX$Q$| r hTPt6iu0_L;rs`3PW}p=qќ%(NDG8.)mqF }w:9 /\.Qf #DT'Ej(j" T*;2d; AxE]x0/p,H>"]JXAɏɇO)lNhL ,j:027TgGjNr\$>A!r2S7s 4Fu1Ҁ }Gu)L-#Smƨ}d?@;\(K:WDb#B,"R)eRR)N0rLe~ϊ>(4|UH@xhtS 7: )^ #vI_-mV΂ /s0м9>}3J +t;(V`HڧOzRS MDZZ6vttt7T*/ y[(˯'&& )![IcK]{w::I{JK7:n6'E5x䦮s[w'7i"ƅDKDH$>Le~/p-5].юcrCޟH؅hR1N#* 8.Ai+57$Hkn|99\|`%+Onhttv}2#?mTEʴ=Kz> a5h ]oHj'" y䦬c:BODg pţu!'&դ9(S*3:0+].QdHyĨv&,OΟp-#7@Y}\5 :R@8|C}lsp䚴pxxTVg'\}T*>/^;XHcϏ cjoN]5d'w I;UF#nX'X:=A&EQBLR\##״+c;\E eMe%]S~r%n D2<%D]gWxA4JξI3 Xj xWtn9uqTDun ShR1jsfɕx͂;;;oWUYYY~jjחY vԵ "Aiݕz. iM.Pe4!=q:}䦕KvL]GHqk)D$1TvqRTvf煮~>lN|F*A^;炭5pw,JFl( sc0r- ]9&Dn>tQ8>IHin)$<˝;C'''wskkk[W^+++CLH|wt>O5:AtJGdALdivB%)4[E[E I|,i뒄$Gg1WJD\4vI"щ4_.${܃>8{ wVw.2ǍRHuS¨n4l:{0u~v\ϣ٤ L e+]qL6+jC<142SFQҮXsƶk~j:WT:~|?FݟwΎnnnO<Ԅ䎚4~QEҜ7"Kt HZ܈!z`+$K}lii5dPY7!dHxeG!۲4ċGDţh$#dcTW#4◩xcab> nt2 0kR GZ[I@ڋU8 3lpůWj]O%؀$H['jDR^,:;;W3P{?hÆڪ&" ÂڭXTeq CiedʘQu4\VC#Od>E"e\*4#׼+% I&)/N$> [KC<*Y1dI&bbQ[IVu40%9/O%i}`3YCvCfPfO( e$irMToI'Q$ܱׅ"R/0av_{W*z:' 퍌<::񛐾}ilCrVPm _4I[$uʬDQRM>JJ3%ȗ'@e!v$Rٹm&]Hv=; 0GD$IحzI[`c([BUv!H;q!3id 9qC~Kڷx>D&bSG9x6Lں )ccc+_=33[[[MH_ڱfa2ނS%v.LX0QFF+D"|:GGͦc!ľdB2HY#_J|BEL]8 &8K4)]-NFm.D’HݜG2MSg@PEr;pB"#a]A19pQ|cxK~ [&_J>,t la!?f5S4ģ4D!lsB9 !ߒ(e;u[iI߁0u]a{ 3%Lds Na8ɖ7Q3  쒞GrQ6-=|&lZڴAuRu_W*ZLaal$۔H{7%܈%Q@(1]xCM]#߈ N4WKaLQRu裤L)-k=$WDJt#7 mH\I]ߒF~[y3,!v] R"+qt}A>P~JOK h-vG8R%"cHpH`A>okz\.oW顡=7zf$!OݚumJKϠ} >Lp=@FPް{F`@Mfl' ‘/ĤV%d1ͮI1cTvqQHRٙu&($^Um]Ip̱! H(tsɷ1,ܝr Zc I2Ժ.Q"蝵EH9ځ=}?6FOu%o5WTJ:ڼEtlB P7(7|lP^5UYQ)`J^~8 +hBn#so仟5m]#BǰzHILREG!"d|DSٹ⑉BѱċHf3QHUk|9D!iK86!㰽dmCcWĂ]i%N",fswķy8 o k!ea\P H (ǽuĢD"i~ظLnD}<0=f/q䦭GnQ9%EeLk&ΎBKcw, XގX2QH0e>ˎBrE(y /dk0b{֩"}Ǹ^g0_0@<ꇨ.dHCm-;Ĵ^㈔P )<{R|R OQ րi3.1uRmyyCCC?|)\.w==Rx( !ׄN6}/vHY}ܷiWb8!,RR׹#BHƸfSٙɈH&hH-"QH$5B3q{FvK+ oITzBY;q ) "RGz#U4E M z(Ե>/wҥKryukailOe{{VV0\s/L+Jް-{M=~?l, | :WNNƎƇgBH7lhMZAy5sᢈu]}'$HiR{FB=5ήTHF@:&0dC2oģ`\-$B{v]c4; R"쩣bO/)3`L;Ҷ^ Hـ@(ȭ^6lkBa=DKHLNYZZ¹yr|ի211Qky7|~?=_HGZm;t^aj' H 6v.Xk{&(U |:f#7u]\HDiψ8(4$7 iX⣐!E!᳐]?QG,n\<!mx} ņ =8|WtS("# 56B釵ʎ46,?RIؒcn& #"u5Y vZ'[Ksw<<%BH;@_*HYD$S ߴ($L.&;>S\s"SE?F`|c=yCsB #=oqY\(=eii@)!Jr[AiJQw]Jt)n}ku Wɗ.-ukB:9%sTv&IB#[X{QHsڢD&Qt+ yM+$uɆӰmfIƢ$V]H|.;RB8N"RxDH\"s9BY5QdoVQJjt6d)Hy͗.K#;`%u_KJ]#BHTvn ;_*;dEqH& ($FH2#y5Qg8(/ pStQB -Qض-B̆lúΗAD*jK Hq"JKn℣4|GqB!tcI`N>eR{F)҅>qض/t\X ;IoXrKmY[!/uiD׭jsI4+kM-)%y'U$=}Dd G&0-iH͵!4$j"ŝL }3ЬOΆs?)Ƚul8Sh$_$BH'z8iwn=$_%tuFy ]s>.Bj75]tDX)]`CZc߳`sw A$6 |3"tG%`TDuF(B!u &}A<9c۟N;/p~:L]iź%GF"tWqĸ($[<ʒ:t*S88HYDE8%ᢰ`xkgEIU1Y0gQg鞕1Is.?ұ4vk&:?3)!rqjjWs.[lܘ[ G)!t [E$](a9n^;o~U ؈ViFRټpM#F ăDrœ'M]І{/_:F~K[;}B%BH' RJ; &D$`i=o+]LcXLc vMa4Po1r4ǘdԅn#vGdEǍ{ =k)Ry QOB!6D1o#Y#7 歷sE#s"磏|R\ $3yDB(.xdj k3I'YgEgΤ1hG&# 6C#Iƭ':v+>:= - @>vEX[./`MCB]tBY }io$gd' yF!GG^B(B8mLqF,ڗh7VϪ|GF!sN fw\_~[. 8}RXr=#s?#-Rf2 ) }˗ֺ!dۘk$Jyn!B:.-=]}MR^sOZ9EݝH"I>E*5BM($_]88[M L'VltMgG_|a{A]B< 0* 8 Q7kOP&t,vHc lko/eGm-،4qޕ(R8s!!|5[Ix>߶3Bɐf$x#_gH!y($4dHt$gSܹcg<4vI{QAʎ/Aή 1:ŎqvE" m:}Ԅ"x6"ZÆi Ɛm㹻11dB! CAߴ"*^Kz8Ls6&9F$2HpjCBH;dL#?1*g#%^ElƍLcwjcwHNcF;}`~ԽiMH8֋>Vc^q~cbf% D󍨍kBH1)l#66鹤ɞOR^ke)N0r($#4$^8-|QHuO9 2K*aD⣏|ujr6gMm]m-K I\ =[Ph'B} u=I6~ QH/iH%Gyc?!>LR' .V<GvR 4R2UCqH>GYR K` 5vOɹQDR&Fq»y]Er?IT)HЁ8V䘳8 ]b^sis|d:@H.Ǥ7"aR=B!mXpthD4*/m>Ka@rE$G+ՅB!$ zo\MkvRzlC*hdN'AE҅(6~G\M;H>1)|/<"d"j}x^nWHvԓOH* 藍}K$#Ŏ:#TD" 0&tq tv5<'~ }/KLƸDQcLL!- 5;r'h Jm}w3.ɍDrk!>1[)J B!$N 7MO I"Rs{,)؉O7`A] `%8I M+Ry%QACX(Cԋ>G$͂0W3n52jHv'Ħ:cB!cđ$(q+bRR$8έ!I7 b "?FB!Mc H%ֽZ+_]Q#8#IJ>̮HeM[2sǻlbހ(],ptI$p}Uwޖ(lP#HX#B2b{o7xq"S3iz,R=$;ZȎ@E!L 4}PH" f̌q٥E(b搢Cړ¶>OG$H]g%vE*R r;>@]Kks8QQkjb&X\g#!F개|O@rEH"ݲ H$gbR &^ed&R+ng}I##+uy#-/]IDG/ NH (VvF*'z B]^/H3M?!b昑( RHhZ ""1e$!=>g`A))dMAY 4sx~C5tXv;R\_1}!TYȣVģ4v&$!ϋ= `i!6 1)tNA_#r oesbv]+P6X!Bb TFѸNA7O4r%H$)A=y~4aUiD KC<2HiG.)BH^""sOXHN2>W0Ϡ>eBi # N<.IH< i$_[!RG_Yu.ξuץiTۺ4rk$t+ShD!JB $9]RTqU҅]Hy0 *zG R=M?c ~?G<.QMvE b^(  m]HxtW.S)!uq>'r>ww.g##h;߭yoK$&B#ͦKLZCe ApӈDPkq놌 $ s5Mׅi[! Si >㊺H܁[:~!B!@JJ]W(N@r>X$^lDm#cLY۷qϹ~G)_~Hrd! ii$f,,e_|n]^E&a~:MGK. umH:H!>qJP {h"PK6îhHWe* 'ҭ";af"{WGB1BHԧHJ['|:3F',Mޗ!Mb~#BȠak&RW)I%]7wSg-yZ6wm3AcXp u|nnKRٽfD`ˮJCDg C ]v !` HiQZQIIIWsii }}:I$!IKcW.MHE!_N]Hr] ء;%tVi[ d0DξEa2v66? 3B)Ӣl\Ǟ?NW'ud5߳YD8ҢR2esBWqŚ44mӂČy"Q <=HSGml Gl? -Na+N@ |MNBbq4.}]HפԨy`[A i ģ"AsR>ZuNXcw ucD1vI.Gl4kkev񲴴N $' HiQZQ0!gZK1(δjΥG/*SJ J+:"y2"-\]E)@#FhDX 5o8Jň>H >} }E=TB(Yܨ"wqo RbH yIPTu4!;ǥHzDoK'u2t Kݐ8lZ}< Q I6 x ",} :^Gm8;aBE萤GeʩǥKڝ.kg]BHRk#%[QҼIpLcF.]ƈ>fWdNyUk?}n5 "9p_hc #1!b;y^#-X%20T"q'L~`ԬXNIr0d,/BȠ- /}]3GwEppa'ftҐnea® Dޕ. yc:ݓ}??B2pTC@zŮ( a{/loK$O D):XG!=[$ىwsI\6Rp:[!Rɝ㴔uZH>1EpJ{p/:O% E"3݋pJ1:-98- 3dm8_u*\0O#E'"!"lr!2ThR(nl5[#RoC)ɎF23sN\DRFlHP")^A !AޢDbLa|{(LX0 )NNHD(%)H@+\WB[$-M(lG:N,mz^ `GA{>-q;p|5HhQ" _ID HA50\~9_,`"2 $`-Uc:feBG*p҉GRרBKЧM!Rx\$ָ(XWHjD. i !KN)ueLg{2p2WD9k!GSB*&X#Ef'rB%繠$:(BN3B+E!-(޷]‘{-l xLz>wıhBOLW "솾8D`sl1^C6}n51lD!o /&՚W<~&!(4ɼGREA ga{e^:nw70(oFtB;:[v6ðRq|nخ;r Rڡ>6<$GFgR=.A!2KCDR¼.X彰}H:)ZߍM_"?y슖$SyHD| ~!>Z:4"B)n 8$/"ol*;E:B KBִα^E~xR- rfw *D(\ֹ$1=FHPXnjBHI$MF!XzAh#7e]{YP\eɉu[M$u w\`O }yt<û5hE)? %eH]aJ;B!@hD!DRziQHi)Z=ُL|)MF6dѹ̑6_`^|-1s qQxQ#/*m]kpA"DQfB!$ov.!\fRڹi'l )8Qb1ӺGݰ +2s"Qz'cHHH$_:e Ҿ0 D)=-H;k+נ}%JGZVBrCźOBH;ERۥgݳh^MwŨ##F%J)3ˮh " l3}]:?JM¢( `"ޕHF|tG-u/LvLY]BGT^+N!6IQ8"rQq'Hog ga{6 H1nh D>be#NtࠡCAMజ H,g Q$[BOޯcDaPD~>l_DN6>8Ȓze ?iH !9. rs|QF$7 JBi$$O`w ^M]/;Ly *o0oXiDgp?`wk|ER}F"=8hy= ְ+ GoǬ b/m0BBZ!. #'BB"8 ;O `p'5 <FfO` ivE Do1.ޓ("k15#Y؝~ Gv ૵}?pMzĄ%r#nOKE|#&C#3fMfBˆ4 \B"`?Y`c"Z14ztSlD"wZ*!ErZcs[uM2tdBJpR%MUQ˺xĨ#G.t]/%_#c/ Hs7ҋ2s!>v^o |vWmHe9lῒ|GjOA522r|ɈBip?H$"u}vDʘ.MTd^+NϡvC*pR@ pݯ.7u GMmiEZF6V;a}/Z.OЛǥR]z}OjGGG?755-phpZ^^j*'''oёjkxσ gGGG&&&W^UfBH'D! CTtE#aq2bg!b ț:'9wu03zu0, P .nk1OH9HsG(BᑎeH]tdˈBZ널9(h-v-l?djjuNQ;wDc>mib"+W~off滖)A!t $3332==J.iCS1))⭮/,..x?̺x`NuB! I<82aðEc%"v:\Z3c"RE:pxR@<` #1/a>75@/J$<2z-OHCL*"7$JYfuׯ_w 0&\zUݻwMI?,--}/BH+0BH1>qs+҈:b:/$@"́Dco$! lHLcwqk^"!iA2[/ul!74ģ1]OHq6DoNASe қMY__jկ/^\pyy !$. &nGr| |?B R]94H\^s֟Ɓ;] 'Lk=E-$ YPSj3?0)>i?ψG###r yG.o" ~:xۼ\!YD![οgNޟ^Z5{Ĉ`BSN]b AҚ0@8W%!E siD)ݐrP~XH{9 )ɕ+W2>^=8BTǏ !$ !tø=E(v69ZG'[\\A\Cj8^~-O>w?\ZZcB BH@*8%<&$O+슖X(}%9L "bpa4^BϾ'QI0CO-c&l755}qFe=HZVKKKGN"BH'ihvf#Q\"ݵkDqǁL E9ίyģyHX$JEk( l-g6]6CHiw֭غHZYHB:A Nq:!(u(i~"&H;q~Q:.enk!v !_ Ci&+6A}DR?˗/!lS >X{bD!S@,scFA}HwLhXѕYT$x %vޛIuoDgUVemnw݀"h*"ิ4(:"㾌0>nݶ,}}眪'O'"N}"223g xռt0hǵiwOl.--]d}p`=-?*GM\GQ@7ZMĒģ}RQ ?I@!;h5HPMR5zTR2H@Z5@rH}G+9 sq[\S8;W\y*YݼyikkvvvRXrHrQ;a@u_pqTt&~5{1s.&ICKvL2%0@ko atl7ωf8D FlpگNLLƍ 4>hmm-wxxE64nQQE77 4/@c4Y>~ ة\[7Hu8}ټi; Z`2qrC$ZTuvlloܺue>> {7ްrj~Hobn`@/ݢ*iElڝe^#Z6F:pd-|jIkF̐ .~gee݅B^m}@"H5L>=62]ֽpiFw[A D۷Zg9ڶL*GynÅ.^*}477c tb®_=n_ d @'# eH7R6rRA@jMF@&r6DP H8lWX}Ev) /k.2 ˟C쬭į{I\.@@@Ge3n7>U#&#'V"T. \H*c )4[x4@{.>j^Y[C[?^s1^t'fffsbyy&$ET*O%A3C`H.H}pyuH29DY =S~.?.>i"zzZ<::rm.X<;;r1QTꓣ2g.]:va>ye ?gX*:{y||禧q k׮oan8J|kX?$S zB My%;^0!⑋3R*E#D1i4;. 5)&X4JBf/X5AT_xrr.b4|_BԔ''U ʁtůAX\|[*^\vytŁ@"қoy{w'Sف5`XDVΒĐV%Q{H_JUnssnu鷻u2 `PKE_H븁V$ZVRu@B@6*c(' u&2vHGyNą߿ǟ}zzzα)`nnF1WX,~{R陽ŽvR|}$ʊhfccgGsTf❣4j}@*ZFZK͖92zپyVIE"h_}TƮL:ꃴa^QM_ʹ5N€'dB7VjÇkg|>_). 7eRΕ+Wj*ʳTsT!K u7\P|3 [+HE}Dٖ$h_xꟿ)=ʡJJHM Dt9Tm MX[[{vvvArM8sn}jcc;;;+333_~,6H0䌉D{8`GX>sB+OHP]=\#Q[k0$\~UCD.~ڷw3Yj /`$ zJ\YĽ=\00Y&DE\dq1I*:F%>t]ghߣQ{h"4@C!ѱϓ  r#qi{{-r3 &'Ν;I}\r9[X8_-Pe~ m/͘"Qhd ~?4Fo:CF0C$JAM..i90j/bT*Wkq*A *c[ h`E2u8~5 ! b?`7Hg񶨚' UHD2vJh[1\0xtW_v(KG>okk[̳ܽpeeŮ]Vs^;::[,) 0p n#XGB1) Z(=k@@ A%5?E%z( H.>f)/p̞%O#3 z%Z1|vYdy3xcf{vHgyiT$ze[ G+{<Ǐ?{oo0r]~V`h? ;NNNKfF$H8gYFh%$ ĤL׍uݢɛ{FnQ#\pq~ aCMHr?k9GO96ODZJ߿+Iz*0B`Ͼ.XaSZs'Ec܏ch]ԍԒ+|hQ;W7&fG8Q0i]& B*E} 㱿ONN0:d!LOO?{^.肀ݐZ\ɺy=P=GzHu]IICƩtnu=R #4@-Hzz) yІ?~6>>' &" 龚z# 1$A. EaHg=O9gc%H}=gU^ "r9F&:^ >~ℤw&E]JsAH=6TSᮋER CfHC AȱsMY#4IXXE!"r[[[ޮ8W%RZH4Md.W+}&QD$ > d`4A@v1k|]yFQᨙx?S"R=Q^F$tsü .'4g09$n2[>:ϟh Hk. 6Ik얋C)Fk[+iӧrrrk.]ދtl_Hd8́Gn4OFFX'ȁ< HQab'xS;/"E]1),"k@]! i`utXq-|=R(s?)94^c hLԿgtR҃poo_ۆ${vf;;;5($"Ԑh~~]ǣׇ(J#bC gqHV#M[Eq?ѩ=.V Dp 81)]II}EuuݣOHCcyClC 'q(rQ Ḇeɿxcww-wï-//MB2ڪ;7ZDՁ- @fnb:%9 ^D8b~/Z: E. Ia)*ŕ'&!$ Sj~Rt7dr4ν8}gmDԆך)'J&moo=ilnnhT=B$d$h)5*\ ju/KikT<3kMLj]XL Iq@H?Za~(-Au["q%@'H@Ё,|0n,6ȉE o }u'~MrzzjRu^k]">M]BI{aj@ļOℤ3k\ޮRTD z+or:*]7A*F e}#Ό2Y9wYdYk,8aB7q[],YET*N r- H1<K/'o{℣FnVEVŤV(^VsH}?ݡHE6gL`wBI vN$\H*{1 Cߏ닺/[~nk9y&''Sب ;&&&j<{<6O#V_].nrAc͏\|G $膸2vQ)BF$qx IDŋIc7gGo4l=K:pAwȁł#/I46ӄ#8qvGHzJ=}&"= 4errrgii7~U=Eŏ# 0Y$<-[)깎 ILAE?6*oױpհgUyhG}=_q qw:EC_10lTJVXszg뵲urq^-ݖͽ6;`̽KQ;TiOx$zΣykr' {"5Z}Iv6H&y;W7Rw)ժ>CX!]yС7H& qs>h5I8I% BT*Œ?ԓrGGG2 $ Fkkk~27gW^BИ=S:&Br#敿.[}=,sţv[F̈́8Q)\.J Hg^i(:GHC"hQ&ys! Axlc17YV/0tJb=f-Yѹ:pr٩$RqZn8בHz JjJ;Z_w\=pnbSrMhQ'R!xQF_#yycv~HLs#N|? ovCpz+q#Ʉ{x9vGOHCO>;G:BV$H Hi?cRbkz$""~ƅD_{QMD ;D‘=Hf[$IF";vjJ/>/Wގ@ @7D{5*17_qO3f>Ĥ8GR# K4f{& bq#uV9߲6hMi)3[SNUoPWxj4%rwiQ.$zJZXMbvrr;ӧq5M߸q^GE#z\۫=O]5ttK<.@< ĥQ1)**Ĥf%ZXOD ^nS{^v`ŤG;#)FRj.+]n5oICG$ur\3sr;?ZBM\+0ԔJ%'DNfʯ\/굀<r5H=E}T~n`?V%MݭWwb?SlΚ ^G DH^AqbR7BR+#'vQD:"RZw$hI;Hq V;yOgr퓊s: z͞:F\|pˆP*+5yi[tU*7FM y~G{ׯ_>TH7p5BVWW˵R;;;qB{\>*0@ @RĕB IqR {~fRĸZrvQ!iΗ FBRn HK _?E7^>I @q?E3)NPj]F FQ)RTHJN"R_ݣLΣ'_2+II*K:`P_buqŚHnޗqr\H< xBe%M@ vݾ}۶ɓ'ѲvZ(]{/h 7 %¿W-ΙWBRؕGRXHH#KՋptbHBR]ԍ &ڑu#I_=0An%n'~$pɹO?6s!11#/"=Q_"R?yFN #*YZZY{a鏻댞 v"q<"DAE",Lb2Sc&8L13 b:w&C2`[XpbF(g¡#5M*ƄW(@/,Қ! u.%aDd^?PYrcDE=Q>G }tnTf[{sb^@$iJiXg±pO~&ݻw=e~S% HüI`UG!DR=Sx rR!U1)gLQbyT GAiꕰ>'$EzNJLV=F/A9:*c'̪#I,QFRT7Y,%"{r燄zXr VVMݼy|ͨ]Ix0@4J}/*];2qqN LO_q*ӑ =1zy}& Dd{U#)㳒vCn+"pQn1!4@Γ:Gr^]02J%9>l{llu%ZeccϽV(ڵk$za-_waHS?j^9J0H>Zq&5*qJW.p|ip7s,^ivRv>~xrrrΙܮGI˵u@"樕JT?'|Iq\>u:aYzepipehT.Z.rvڅŕr FٹmZ0Lɡ)*_wF*9]IfHO9$ =Cc\!kJ%]>966ZNNZI<:;;?SaEޞZ\IaGB\>onif~VyJAO$ꒀdRrhc x4A:F-sot-T8 H8{7V?dO~X}NOO-09:j^BQt&)]d{{.]}-,,V!T"s 0jH3qNԑ®FeEDCD.hPN$w)=n z&{E H?Acd]5kH</ԯkz:׹m)#)x=:(yQ#*{:m>mJhRDrOۣu쪉hhRBw蜆 ΝOs..HdΑ^yii677\./J_5 Ks%H }-,"&5{=~9k )W6Ku%CJ17xr9ʤp*Y[9E4.kaX,{\|/Q xvBI: H2r&mll\} Msss|73xqqC@ Y$*$5F"R\IFBR+ѨOSxRf|J\1Vv'{k# 3# # =IU=C7kbtWY.Hrwȕegg/ߜքL^kBnX.nϞY[2ўGfE3`Im>o65HI7ܷɠ7G[b^0&8t~.@"$ ʫ!=2$H1b7W̌bՐc~k(Jg]8h&'k/eVv% +kW.\.x1)**rmY2vOw/Fɚ1ព5C10h4"HCt,Q,?=|KWCg}>B!D@2wZ$M./$4s#<6r(5Re7ɽϸyj%&9%T@9cpBuHE(Y-X,>l7==]+5׾=+%ԩʼnEqSf D~ߒdR#'>9 hfg4tGGR' a7hL.I X,j{]q=CBZܘBy;̇}C8H>7 d$xBR7n3k,s%ꗱ{_*1?~Wmt]uVCґTtJ (~zΙ4cb{.~c$j҅&p!ǏùJ 1D"R#Qⶹ"R'TU*]w])Q4.QzP)&Ddm$H 5{ɿfCos1@'R?y5 =@1}HBSSSvtt~y B&@@ha ?vF{%#5*aɘdڮ I?oު[MCr#IHr(P({Nد!E蚨+VgҼ&*cG/$~Yz5ceeV. )L~P!I%!3Z]7R]Fg Nn\zĕ /?)"]yhA=džBܞ +t9kz#.l166fKKKYgTjnHڣ7RB ?OG~G!njnEDr?#ǑGWm@:G}&歈WE=P mhOޡ粱@z357]zGN7NIChbq$obzI[(ߏ[@RM\E҇ m2I@_)*"u2Aikk^k.n+&赱F*R9c9 N  ypzܤ_^#G) d@hEDK[|zfbR1I6 6?}([{+ D ;Yޢƒ""Ņ(YCRY E nWDjQTvHxmi^_Hl]?{45-п`8{ʹy.$Y5mhN$1TN%  3%H!/RN$ ~;bRTT{=6^vq:/ѤzQ!h0G#C0AbV3O:z*+cM _j'''''R~n3 `pt#">ڍ+I"z1o<f\H]ޓ[uL@=+8a]5~q%Ù ylhx$p| HcccONO1C6@@,:睔;ipŊAЌ"*t-Ǥ 2v%$~t@4>-Cs ݔ^|>:ـ,`iEDU ݉s$I8!*V_8D数3s!| ]vùԪ+6D`HI  _ A3IQUI;:V+1ۋ =90Yd, #˳p!b<.@+}U(l||O }ܱAY =+"U<6buT\hۏ:r=4ωÁzMD8b߇!w'lLh^/1 ;]}68΁41 o>.,,|`c E"R]!scΣzN$4as[gv^Ċ@ oKQ>>!Cyqv0L'ϡ! =!~mpir@ ߩ'y H飙)xlY~F5/(@؊ gc{.A H~`x҆NTQ/$b|?w^GHqNLL烃 4C*E(,E3kMDH6(D,mE;.vIP!i4$'3`ѵQ}]&=GV# A0Nar:@9:: l@@o"1q>PL6 U+[p"f:HhHʤc5U%#CO e)rP >/' $z  H8=YXX7d$"*-c 'dI),fYyQ =\h7JU%H0mޢ GcD $rH+gggcwnnJ8!&IT=WήQ s ^~\兩m6̚ya H Ha'gbm16Z񯡯=ö2> fGXY 4C9]՘̪ I&NaE;8 CC#rR/2RP|>' RvwwU *HG"R؅qAп!,2E)B:r ½y#&Mϐd1ic?߯s}LR HMH+*_d pN?@Ds'"1$ZX< Jɇ?Z.u&ICbc`5Q%$fL qyaIG8ǩC @z~d<CNŝL]׬(yB"ϣne$2P3k,JS?F H꓀?huYdo1)|xx*#@ \zQXDc H(RI'(B}'E1+h=cUc`4$~l (ݱhȅtȓaj GdggU `y|'$I?QT/ tut(G" "A;z|? [<{.k0p~qss04ФxT cNU (c~&ɡiG#({}HW/iR)>1$ԡz_yrrB: 0jHEgRXD*Zg 6pٺJ(.jdm‰yb7-G?  et Pi%e"9IGfذmJm |E2`8Ffe u"\Ү y4qxߘ$1cD9؀ PH:S).i83 ARvׁ>!ʼnJq"TXD5VaEe$1q8y YT4shXHҒeT.}h؎h:H?x/i\HHHL:ruQkѤqn82h?5zi$}Y`@Dl3M"@:=E_u. &z +iר]|]vHaMD$&G% Z='!kE%VsKòQ @!Ө/RjIHfBRu,ר1b4$fʎHd Gs"Arqp!ed5ĕVYSG784 `tW.Z=RDs!xhC2qm!Qt A]Rw^H0hðTZ.>h $lҪ ^9z%QYToMv#Ę9Y4K YC.]]yB>eCXU R6 LҨR8P2vq%횕 Tm2vZUȘEDGɣcR5BZUeURJF }0W E 2K#R)*&@jEDÈU2h3!q@@,"B7:r> A72ZO yc.>}HO.8Q3(N0' <d T!E1ώ2v ߑ<驝0̿t.q'@w d(.ĤF5xv4KFG9QҔ9f + )+|_JNMM]xmSum\p.ś|݃ J1, Ahyl$E{"EgP 5b}ʮ5hq4$$=@ x_.U`􏳯D@?>~5ϑ4DtN?G HPuW..#)*${4e&G% ]'2VzK@!}G# HS"a-iݸqOAx#\.]|xG.E?0$@vhDž-_WOH#>HTN$>mI^P[=z!.?K̜XTp!A?|=}~|ȼ i]^w]D2@ "Ni$$A:bRwBWw~"1 >}4AGM4@1 In<?=F)v)i۸i;bj!or.StO\| CTɅnߋ HG׵:݃B}tmn^UHf5isM+E{pe_⿸ :j'=VW|ş=!.>/&I4#?xy&#@@@0QQ @(i',EEzej煭4aɣȘS<RQ .s> \\JFMLLؘUH< iaaO zy~Ef.>]KE5:wOx< Пc<HH$kz.4Vs =KxDe>*dn<{J@<** qu0heÅUNKw_f\,455h{{*eH8Lc; I|Ɂqe좯/s"Z.߶nOA7L$ H̄\d@xEe.R*~=|6,..^xMӧ C!1~*tݞc 8H*gT(< (Jo]駹Q= l~~>{| )2LjVwa lk"$*X|8S~p`Q.,7=C)ihȎ`vXJ҇]nJa}p2˱t?'sؽHó{Kci "N BDoywܝgMΐI,=cD.$J]V 4T*q_꾼Be~ļ]bšp\?!Rvqj̍4 tZmg9 I 2[YeʿѤ! %5WɔJMcbqq.>v߳P(=}zqޮIfMy 0SQ. H6VzV;W+hr[yf32@h,ׯ?Yvq<~T2RI %>dIb^r6g1Ji7Kwvvn Ǐ۝;wb]J!~Ш|kD$͏>9:OZq!߳ u:VgDɢޠ q$֯Ir4Ҡ Ie# RI.f$͙tVWs,DWR):QnGRTGFω,#h4/" k’1gdww;^Ύ$C# m!˼v,*`r-N9qzk4I'Qo2P! Iem=!LNN'NJɏ=rL ʿvI:KDkH@@Ns5+gW.=GF#VO!.cg`h00?277q߫T*Caa=yH`PD ts\F#W5xS/Hwݬ H㤡gH@Ǎ&OH;u oXI=k$"6ύtt@A@Vi& Efr1z"R/x0e\3T }qAKF;0uommz"A)" Hb 3@Jŕ|/*ʼnJykO)wp`蔏9h9)zo31 sdnnjjn$,HCO9  Z|=Z.W @q=j$Vy%)@giT%A0bӧO?q߫V+ћ3\p~hidq0 "<+eg1cֺ &T,7gk#h˿nQrpȩ*iT^p޽{Vp?/2,k<*czBR*X A1R3$sTR3R1P2vVWW377W螞֜HJHtqEt@VnQԊԬ5^<1}LZI8o4G%* ;T4 BZq1C*`ДJY=|D>okƢ~{\-*xy%.@&vzzZ~2t+K1 Q9Y34! @ׯ *UD$Q`<|paa333q۳Ǐe_2 Y‘Jڽl^S2@?o&E{LjT֮4|Bi;ݡr }ȱz<7y˗?ezzz7;;;FF. ]n(fU :FNfn^=mgD`/p{Di.8  ._ooo#"*=.>J*RuOq]5J 9rFT4j,YI$mB1wH@BH_T&EUI{_]]-m}idb⿓Tr"ż̹ IP]uR{fލnUGF+{K Qv,`tɘOkz%"iyo)Rj/0/ `$`ЬoQW+~!D)S @Hf^Ġ @ޢGLt${L隆0;X4lX!JK.}իWP(\JYR!YÁiGzx%%0;4@; uu޿z7JhA)r D\*c7F* mJǏڵkxjjRtxxho񆝞2DN9;.%C{kDI;ZہqFe|n&,CUcbЄ+{$8$ˉm;&\5ODbBRލ7>}qqxXDN.>F*I7+iGJЁj/ĕk~LhzݼG,8ry7@o-A҄pt %D$&!?;?-i2v߷m.>[ ;O"m>0T;0@4+/@fF}мfqozz! $D#5Ҍ/"H,HTS*v?~[nwnnBoµZ@*x=txƼ< v"dVbieS>hH-r_c@ DO~yODHr!ݻwh]8 o;FQG%nxÉC4#׃uP!wJA,sbLnCa|-0/߾}ϹsnCLE?.=Ե㲋\LH 4@/i}vhZ7Ozģ2i6Ri 腄RtkW͛?;99{r /ғ'OHT럺.̑*gWҾ\D?%c']+"6C^f)rɑ2*wH59HRך"ZW6Ѝz&I@*dM4>S*& 3J%V,BEZ*UICL}V,Ǔ-йcOH|ɿy= ڹ ?q?W~ݔj2f@*_W =?NhŮQ3-,Xv( T*s߯(B𩇇_\.|DIg~q.ϑ$^i"-[.*ew<Fu!H qOT4j2j$DEZ jp 004>H.p\MJ]:2OTҸt‡<رI;or>?zpܶ,+]@BHQ"}ka,R4 8_ݻweoopv >6=Ve)çd$Ga}m6ɩ.үKH0-Æs5VzS兑}ӣ@ed_tF C@ )xBYzѣGHZ%ĪIj>.?|cm<{n_S[, \VV22eyw.x`n N_GCDS0l入[ ̂LV ⑀($6lYTFew0^}gtYa1)^&2GE4̊ pȹ deNn $jYT3[?QD{VHw -f`.%(~\Ld/6}D E2m e  ON,$BRfb;յhNZ8ld*ko93jd)Ô? :rrϥxÿuN9U`]3nK@D v/s5gQo47S  @{pؤ ` ӐrtuYJhh8 Z q9 );f^8{>φPH@#e!yn%pX\,xÆǛѕĢxQ^òrȵ} 3@Q[7B7ZHCBp56&LqQn%KHCCLX7rcJ Fa6ukeުV?EVsn4cKRMvwE^?r`tYiZBjo$$j r>g?1]G{(0q\ElqŪzHh^ڿGKoVeihԮ%r1 V-+Jj]nv2;) vDZ=$  Gc'Ρ (>3?%YYIDcԚ]+a懒c8k gxmζ.gc?RMZQ 1n 5 2, ;XwWGt ,>y6u#Iڰ'}e=08 &I R$%ބN.hPxH fU ɶ6L6oHh'(}hg! Qǣ*t 8|]$oUCY f]%}=,ax>?]qZ)0"뺷y1b":wAF-$V۬ ^s=F򓔒L,..&!(,>eGKg&s}ru7@Su( Lx;n F ? zHjxK[Ưu^- k"Yphbqgܺnx0B`M]TSG[$2p+A/9.tҝܹ{vݵ7F3f ցd@@V Hc"`)ytv aw 귣vذc4P-mמ9[݆߰T3N Jfe) 8[?*eυ6vӢBoCC@XF4KA7Pk[t޹yp 2DYܼ?Ve_$ >fNH)(3KIfeA)Eqh8kؚ:>kc|.VrvLm# #`)]%V uo,5j@c7~#9w7z3|Ec\fe^=DVْSd ,$c)}4GPX7$eEYH f])]\c# tsl$Y~;TQ=sn HB(tZANLb pzbg8^5-,$is놅CvX~w5,:wwy|T I.53E<cُnQdMDl ɦ;m]6Rά,(gzkyȏ`flR5cM[D#8-FE\C9oV\ιxt}O\gH<dHpqUu-w ţXPJFHUPʉI%!  t }]F` ]ZmP C@樽1Bh-~7j_Y Ƴ n5rf 慢&HqVұ̚ J]깐X0=uuMRH LsX00=儢8g&sscKg Q a::цtEP7]Fk;mHx߸k@l XwH>Φ5 ^JB"4+eBxtOI<hl2muˏBR7v:n~!"I#uc "-g mfZ]&o}+[%,r%˻D$zfE!\=8|##Y.CcG<;%ϸnUMee@gn|Q&2\q x|my{'&MbiBQ-rv ch`v`<FDsǧ #Q-۷ YZԡoCw $NFFviԓQvد%'>ʂ;ĂM"ѭ瞺8kQ H91)I%^ -4I1oJHq# GQ(JD$K{nhq`Hoႀ=C'2-5-@nM/1i?"[2Fd=@a53MeڳT'"6ƎEB?>k*t nX%Gw56(h(Kst D(,XeM+kn-s҆Djji~`yQ* E#w9Q L,ŷt/kem,K[I0|G7Gn us(!IZH\h!X޵ʲ dÍuʄf'Ʀ,mI4(+=%A)qݦI=^$$m\Ql[v.+thG 4 Ѕw:yqn%B˸Ubڰ@Bzn*MU# Dс(6lbA)az7fp9 NNSu9(eaw&vl}f!a_gh#cʉCMd(+3[/AXHu Gd!~>JG$)o죜}],!$4hNw]C@X=48λՈP K<|o0@iʊ>~3_ϖ;iKQ]Q+\R⑿B!(%09&控D:(ʞRIAsoXI*_ܘ~$|R0,1ZrkVe*)8[]Ȣ[;7܉;@4TQxţa0!m]ʾ#1?ƷGaōRvA9"йkX=ݸ KtGиZHvX9[vk"⾻DaҴD3],mX8ڶ0ƒԋ~4xD)hDll]פu0/ i1`e-閑Ew`5r٭)%yr,%k:g ֳ,M]#myt~R/nImhd O*(ea<[V}4fBu6 gs  ru;\t+,?Z33lT! 3B'%)x{6)e^rF)Xb1;mюsF( WE翌tou BV£6T ~4!,$Ɓ;` >G}V}F3xx>TIu 0'|apŒY^TJ H9Q)xfAj2ޣ|8s*B}3KQl'u2ocLj~* ɿ_I8"; Vq]z.(U7'HR9lܽ^:h2l3]8I{kn7QL?١UN [Uȣ:_^ZNNejN|<%$bf!#oyţϿ. m"7fn$I(VD̺0`Y ܩy՝Dq[n֨XE*1 RH'-fn9Dnz[l$]J4 G8Uj}|j#xP /6afR/*L9(}j}7iu}]}ՉG[G|@7,/yYy$GUBVv_r*x..pŭUI"6Zb[R'.-t|6P%T' mFN  WhiK߸:RRGa-$"ģ\R,h.w((}%:٢ݼHD 4$XmZ75 7>wH/ ŋrt\ 8XJ^, H씲8(}ԏK0R.(qhGKg!!$,hwc} $uC6(6k"BzakvZeWB"]pU!~] 2xrIm( FJPw:5^)@#; V\ݡ8(M5$y HuQi;t80#:-;b"&]cW[o*(!KZg.T #gu>8#m䅣PD BdXX t8% 2-Y#dG]JvfdhJa,`s:΢$ce,cԯ%Ī%jk 8d6iO˼sz(HqpmF5B,#ÚRM,G^ R֑Q.e_l>i&>^@|XO4'P-\;  9f5v&#oaf!Bz7vRXb,}=q&ಮӮTQGd4E@ uÚ18[%ɶQ.XZu8tXO4+ehؽ:U%Ӫ UPB>?cq^">zS0tndgOle[,~l#w#`hb]glF)CMo$GGV>¾v_k=OwtBsd!:kw] -P*1Vebi5b[XD K|0ec|`k] -r}I4v2[7[a'>ţTcKי碱zk\cαn,nn8ZQe6ܸ,ާҰNrqa`ɮخ.=r_&\{hKuuQߍ4udYsѨHPe7,-b=t)`̂\OʼnIż(IcHrcwh ZHj]7zЍ{6y G@"=oݱ3a~םtD7Z_Mͮ{Xg}l55`~t|x:RYH8MwJOZYH"@u]}H鳏b\Qi%2 C>cp4=7n^+`UHHYڷټgTG醥$%x͎2k&k$mZR/@ufXnku]Q:`ޓaa\<^_kC7Ql>ch=[ܠ[60~mYY[B|pgcA(F껉 n}`k&[8+V^9s. )Oc:/)hQ}Nn !ŎaóHm4kXt_ 閛XctŪW% P]zUqg!`,ױ;ѵkwXmˋHAρppssu]<XE#7z;TQ}]*Ɍ#ކgXG:ќͨ]p 6ޱF!ufƮ[  Z%"[M(BC349OQ6vqR/hg3CLc8s 79Ժ.nxwc E &Qξ.WgkG0a3HAe1T6v\y[UoD, JUġ-iR(⑂Z޳WYD; 3 H^DHA٤]rH 8t1Dt53;?e}TRGa}u ǜG#ј/ABBuӜwK#D7V\tH+/"m-Me!U6Ţ񭠅䅪8 `qbrV908>Ba Fa֑7qMX<:t8(e_dhbCFD٢}4ko ?&V(!mAV.R,ApN\Ml[:ワ0 FaR|Q4r$X&2=YU)˸RQʂnMvB(} QGY:q9 u}uF;e75淺&>wk܇VHgP.ϯ6o [ >A}P .dtU|Cw?ece!j! ò uv̼gr.=Je Cq,gEl*(}Է \ G0#^@ڦ+fh3\Cd]WccAecխqUI;P֨_*v/B>v̍IENDB`images-actives-html5.git/src/share/themes/accordionBlack/img/unlock-icon.png000066400000000000000000000027371250410645000273550ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs  tIME PYlIDATX͙MlTUδ}W@hmB"q1@pB|$b\;\3*4q&4AP"ĝPBCD0kZδvyseSս7ss=3 Sjl6y /+D!:C} @:L<M$e>b 8Wk)97e5;ùSZs<|`y5ɝ~uN/djä ̓U`94ɡ]/tmc$%%^3$iL;7qBy ە^Hp.?*hk!7j^*DS4tv2OK)>,/;*+෿Fi#>z$]+/\f4%i(&LrwjCg1gゥұJ9= @B[_A&`&[FNI UKt YS9>7Xz\"$RD 6fS&~4rq^XYi* 28O"u>WPZ{80n~%.U_ |ɦc( ڊ/?#M%ٶMEi)xfs_'eְD^D(Qt32mYsF6̩2Z[S\ *bvQԄx1Sr)x_8۾ ,IDiZ78 \E uYSmP|ܴ ejj5Dz:: ̦M=7J$$i6׀Kt# VM`..Pd ?``A>}x; c8pL7٤Sx?Xd>(Pȋpf Jhqat\F)R1CбÝFrR.c@x4+jo ( Ms$B;% )_VLqJD MVCrF#҇JFWP@XFSYĻZ1HvT9}h ~BI t;{B/2+]?:CVg:4o^g]1eH d}!52~=NVz}!P3oXE/*U^g <3ѼEh%h%6**_zH$"F,ОO`o4.cW sd(3"r*)GP8}Eӏphb;~0c@~ ƎoNy܃O:mk{qT⩪S*C{.uW/;icgUV:)As7nxsF/@hbPiWSG7<,(M/rOCHÄٙطiιY (?L2[RC9JQ2f|.g~&ZaǜEv4#׫ bR?Ld }tUt;72{{mA 0RhCi%u׬[]v!5bʹ{[ݔ[D5+ 3Anlu/s$(yU~4E,fɍ뉴48j=%Sx~8 ۰N X9( ͣC泤Gj8kLN;Bw#uն}`eakffՖ̎7ۋt fmW`5a}$Ny4Z_H;8HA)LC؁uPF˯wzg5PJQ2Df|VsTի:]o&ڀ(q '_-Np007&TbX |'^\yA{,B!=~uӻuަ{Ë4^$zSr<520^vc/ ]Oe[J_)e,.-{FQ o,C5>ƶd`Xi@S((R4#]iPH/t00lF[wҶ)y*}xU ]_A%p!ʔTg~N#-`˃Ξ'2nj|㔆l#Tʪ$/UVwz!ס(=rsSTBjh":^{]ް53uS:oM`'z@ JmģL:3ԯiF [ﺄHQ7r2vXXcv#Ic>r<ӨW:+KkŖ.ŌGRJ|po)oU-)}yKKۭ)`>K&f)O4^|+S @m7ߏ.JD"R/O 8颱uW}_Es&M}x8=9jIdzoұV_|N% d)YrtSK ˾ j Ȉ=وg~ʎZh=U LYrcM4? uU6^'ιj/pi8DP ~0k#HЧ KC婟ϯ5 <}Heq#Ys)RIE?D+(aP0u.Yo2[{dG/07+wCv(E˙[ ǎ`Ɛpk@Jkn^Vᩘj26B\ ̡LS0ReHF9M*]b]t,If">nd`{ )>xʎ9 ǝpyB, J|augUT=#1Jezhޡ$*S YɇQ?ҹ'[c JP8{c9`॔9ֿ- .$Lhv7D{1k#ft+^ZA^@ټ襕6iN 0< [# F*.@/{"ī}RZ.v0PD8PP}9HNl:[Wsn'> k">Y,b8>nf<N>`}۽{:$=;-fJ, \\C %@:+51ÈӪF }8c _k\F_*)0cD#p+t8I+2 #Ư%' D22(ׇJ>" KYd$cO:cfQ kD9[쯏: )y:aQV* E@ֱWI <m Q@ ,G`Bwc Zk6ny" lŹ4AGcflL=8/LŋcU`M9j {&m:3/Q>urIENDB`images-actives-html5.git/src/share/themes/accordionBlack/img/xia128.png000066400000000000000000000130631250410645000261420ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs  tIME  $1XIDATxytՕo7yǖm"`08 LBd0p8ä-8!4K& $ Ɓ !Ѕ mUꪚ?ȲdIUBI)}nC@‘(ty<0 L2Hh0՚~1f4UgB.9b`)P!5+g4U1DqTـ \9]ܧʺa$O*˧j*5Ӏ`%p*[/.l 5U1@)6:p$z$ex@GX;Oٹ-H4ǜ mt'Wp$S{N.}qHa‘hVr۪_Jђl GiD |  < 9њ(AJ媷.J?p9KM? !cHTByKS9H B@50ٛJB`~!.MU&yVةB;QٓB94D_q+!$9 *`[@F\SOa;6_mc#An?B䎝@AHJ4Uil_h툲!̻L? AA;/fGo;a)?_-֍'Jɀox+VĮo԰$S*8܋dBD)Ñ:`'`MSd0x!$G_ 4Llǻ#atXDqJ`!pg~!^Hb'4H G!%P<qWA.{]DtsRHA,tˮ TKݿDW F.Lz`33q0>k‘9vf4 |Gd_x@@UJ%?Q!>w)nw5~!lL ūÑM@>2zg(3R?`20ɟh<٬Ҋ!aÑYs~Կ ^,=f*CHtj~{wlޔS`B8ߗ8^'7VS3Pɟ:!IIFH2$x/- Pӱ ;)ĆOu*f"!W?PHBdHtiaV$B_a_v?~dCG޹a`]!):O'obaU{SʔjNj=74u(;k1g-!wbVa Ț}z]e 䔑d<˖A Ӹᯘmej N` (9`;Q!z:3#d4o7NA{KLoh|U֐5r"e\NI"f2k~מn:7/d S4Ui>!h޺m-u2/T-opdkxz4ɟv>`M˘ʧ2})~jLFw8N7s[hs*O+%gl%in#m2v?yTߧL?)ׯDo4U'q?R;W8iE yEdh=B-dCׄILtW!u (=Oޞ"Ulh,b1^hoI狃@BNE[|D 0:Y ٿyNUwp!a3!s7D>g0NJYK0 cH`:O) 4b rQ 5iKφ#QKX fދhx71 qBr$TVA**fLӠCi޶ï=E~O Vr'bvS/!a_Q2%\Ϧ;> S 17PT5`A)F">pS&$`-ЫOP\#ǬKП6_o> 1|-#f_ocL#J)|+| !;o0zJ霋i!@OBYD8Rt<&^}?|!lM`ZRQ^gNewz|KCyklǖ KKν 9a"+h^W,9i$ӸjYN3P.ABe㆔ ';&3LY>\EZk>gU6_tb_C!CotEIr %xmM[n%ZB}q/z[8v?I: c~ 5]\“灞+ӸᕮDH2$Տ#Ax%Իƒ쑓͎vYfn wIN:s.=K@ f%`7CC7Td!ɟvQ FG;"p4ر=Kߺ(Kx*bgvh]#w-'t@l{~'$ aqIֽzk:94IS^sv4;۶(_ f;~)7Cج򉘺Em-eRx|0ts1 dSQWuMU:: R `rvg[V;ydZO+h&dę6y p2n 9zܱvoI Y󜞔%}opۙw ;T!2)Ŵo=5\Le K6#Qnr$#*(RSR5c*uV'>ޑ3DV#PXwMHEQ@*g`IՏM^- >FlNK%C;IW`k2Oei8RK >L1r5 aQ_7=ӣ2:ȝX=t6X$4U&g -w&g^ C C||`/^ p9Yf}_ACEBƒt qiۨ珎H%1bŞ)Lu}n:X-L ZAѶirqvQt>W9o {V-O/eGvBi5иlllz#Y}z~G3=iN"ف-?y[rsv۷YhIOh*x+#\TG.4|)cl{!v3J!|TMe=o |)Z*[^vB8BHlJ8#ֿvu\Te3Иi-0vɭI3:|"!ŅDl":uo?&Q4UWJs^@qxAeZ vVd)zkSJ 9~N=HhC\'8Oh?ਃ?M?XZ>SAҬY 5v?q+z1iS#1kZ7>?/ޞz s]&np¿\I=vƀ`($x-5'.dcc&\6X;C{`A\H>$jݏlzrPe* #h5Ҽ-j׮J41g1Knu/T帝`Dn4o%MGDsO`)Pwi‘J 5eeCr4t.s.sO>~MU2^S1 _Y>&eg_BzaO=1nR|*. nYϚUԬ/߃_z%T|nV~ظzExxLJϾIK t6^^|Tځ~' cC|r ];!gLʠ *4Ht!g&-?ʿ{r7|Sk{_U𿨩>hk{1Lf3ɅU?+Py3HlWSՃQj4U!N, D͚Խ:9*. 9^TNLB$LjrC{}k/gSX9BS"v7֍/"@70|v j׮ -L\۴u9iR~ν1'SZ |&AB;b]qj\+HVvlgdZTz숉܄ 亅ΤAd^>ɹ8zU+=|SH߉38e;љ4*AG A J0ִ WL⬮B iԃ,Y#T4Ak0V )}8IekqﰭtV$YxثGi$0K[m0#HZ)f_t%o#7+Ŏ:ĆRr@l;BxJ{)E)E|l_c bI~ {rpŕ@ΎT)_XkG*[2OYFJ?E/T#2*;ܻ*%_=^;b%#fs. B;iNC b%IENDB`images-actives-html5.git/src/share/themes/accordionBlack/img/xia32.png000066400000000000000000000026111250410645000260510ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME  %,t٧IDATXí[lTUVJ[Jkm("3E^|A}P%j"!@A@$A0DoC,Ԋ/d Z CCzkgkmAx.8v xpn66r4`?h0K`_q&dܩNb"o6lx+S6D6,3t&*P &iWZӶ{5CO=@Ur9d/MKۧ矦{[n8@|nuD'yN ]n)Hm͚8]+{0"\quϛ֢B;5=*[ v{dmV}`opZR2pWc'2jlP-6uK5fgQ,. z!Lf:֊X1s ts/MJ1j,fn:tA]f`48z=dsBR# U0kp(f!ZѶw} !2")度17,\<<{wLWR193K49ڛCJtJӨrk$Xca2xM# bγ(-/v[K'l%p*7EdRƬ-تj3! x۹{$ z9b hm)TralE-UՎ|ұUNV5#H(Ak ī\q*7Z# 3q&,~5z*D텈mci)σԭCelAZlINr!s-*Bz8@ٜExx?l"T8PfhDCar$H3c<3B@]g}df̼C2PhvBHSc&,BJsK}ܟ4,t*4»O&MS4k):pQ>_4B2ǒ؏bPkY=@T-YE`**}tcQIVC~9hV $ֱmƌT8aA`QF\W")q MɃoO>ӱ"e+>$#Vmz\=]u_%q:#kHz7׬)s hM'=,!a.ܓ4qO_w]B-8x)ٚy{L2C@zzAcN|p7 z`|q: & F'269q7WH|IENDB`images-actives-html5.git/src/share/themes/accordionBlack/img/xia48.png000066400000000000000000000046531250410645000260700ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs  tIME  %c2Y 8IDATh޽{pT?{ $( >u/[NmZ+/-UUhgtth`ŬvU¡juPƺEPcdMqMf z{!LCONFn}]U`/1 =Z跋1q`l@04X\,]Exl7 }/%(!ss]>v5 +{J =`=~b5`(< ,拱6`iDB`h+@x|(rK`* Cbԟ20u e"FϒwS_@E|,5wй`:qٱ(O lCBUiA Ν ֚ЄJsRС0x EU,LL&`th<΁}e $+(h>mM&d jv@ځu"mA G@ړe&/c)>gg%D<9 ݟw%q'B!S @04f-lٸ[BTnӁ`nifRNa$ؿnv|qLU"j*鳩MkAUǀLC՜ 9؍V᧼i>V,R慎|;bќ+q#H !ڵw^@ ~b}!v|8ZpY8zoo}ȵ Ji̺^E1(EE ogI_xtPELC?U@GW||vz۞GQS)- OM= K䯢ʱ"aȎ-XN`E3i^u?)H(=QO ? x΁m9v G(J.ȳ-9^K|M4`iEϡ/XFI UϠEAJbG:߽sWT>=̽ys1,=WEhďv1[@?k̸.ʦFZBN xBH<3,souZYmYH˚NUs;snڄnvb$i#m ;>Bܳ8i͓~7-ihU9W߰Ky(kB=7;ŎdW{oбG?v#=bې>x) u<B #?v#cEBn&_£<=s͵BR03y"áG'A2sࡌ6EA G_J;3e,Wlr޶7hUS@ ߕY 9&H!0Id2Ar ^䳗?{:_^H~1 'pw 1ʇgfFB\U";> -9o&(h*m境мz519y %;_r%vb$߷:MCo;MpЙn2NuAt}J51ijur~ԅbp0>V臻GRE@㞯oh]AyN= Пξrl, w޶H{@[(P<^j~V㩝6^eNLC7?π0 ]:AlpFۮfDgD;? `htI! q`io&eRNupy9k"zLCk!&g5/>.4 x@@x?4'rm҃+OO3Q^H B!Mn _9c"RUIWnN@g3Ҩ0 t3|B IENDB`images-actives-html5.git/src/share/themes/accordionBlack/img/xia64.png000066400000000000000000000054251250410645000260640ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs  tIME  %HC IDATx͛{t?wf7@L$1Y W COe@ Le]Sh BQgc@Gf݇뗱g+avf+;T{{ϼhXoca/f$i+I_Ͷ&>;E0K ˒3'W|s=U>7({/)':Og v [MYI;) s39m;Ɯ$s|ӓU'EEEƢ4}ʧ~ j^Qfڔ.g$co߬xCKm,$8#@(iXɡ(Urc&#XQrPr>|v߄A #ޱ]՚.a&d';>&ϢlTP +B ({|8Ҳ}%].F!ޮ|{b~>K)i? +tr#߆Rgm$܌URJZF G:+*KˢF{ ˴'AO8L wryE>AdFx9%q jKPȯz@0SI/7԰뉵5j~1#au,/gKCVZ46}tQr ц j&R"Dh% 8)9yǘ?jip I)L)>?o_ֹn \жk)՝3#H+&K '?>ط - . ?m+Wm{mwF3EnŻ7p}mEF;6㳹㉵E*BUib}uRI :?6dEq_clfvk>x* s܀P2bE5S>ce4o^a?OYohӢՍ@"݀`9:hH?~coWE | {9{k'ǒyBвy;鬟)Rwrd Nееn$%#qw;LhCi2rNSyJa`d7u+/e-!3G5lF  x ;6HeRT3!,rznkOZQCVb5p=}Fե;A&gfNN,j`U-_ ZŹ+yT^>3.>׮2tmr½N!=/W~V4o7m;7mkN.+k(:>u+NDgڥ9ta 0&|~/&ڴ3ҎPT|}V$2C$C.srg}. w:Cfxza!~st ]{){CP| =MI봫 d[ ](*t|; ];㐛w /x*Xn4:tk7eQf`^]Ӽ {{TITLE}}

xia

{{LOADING}}

{{datasJS}} images-actives-html5.git/src/share/themes/accordionBlack/js/000077500000000000000000000000001250410645000242555ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/accordionBlack/js/hooks.js000066400000000000000000000135301250410645000257400ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @constructor init specific hooks */ function hooks() { "use strict"; } /* * @param array layers * @param iaScene mainScene */ hooks.prototype.beforeMainConstructor = function(mainScene, layers) { }; /* * @param iaScene mainScene * @param array layers */ hooks.prototype.afterMainConstructor = function(mainScene, layers) { var that = this; $(".infos").on("click", function(){ $("#overlay").show(); }); $("#popup_close").on("click", function(){ $("#overlay").hide(); }); var button_click = function() { var target = $(this).data("target"); if ($("#response_" + target).is(":hidden")) { if ($(this).data("password")) { $("#form_" + target).toggle(); $("#form_" + target + " input[type=text]").val(""); $("#form_" + target + " input[type=text]").focus(); } else { $("#response_" + target).toggle(); } } else { if ($(this).data("password")) { $("#response_" + target).html($("#response_" + target).data("encrypted_content")); } $("#response_" + target).toggle(); } }; var unlock_input = function(e) { e.preventDefault(); var entered_password = $(this).parent().children("input[type=text]").val(); var sha1Digest= new createJs(true); sha1Digest.update(entered_password.encode()); var hash = sha1Digest.digest(); if (hash == $(this).data("password")) { var target = $(this).data("target"); var encrypted_content = $("#response_" + target).html(); $("#response_" + target).data("encrypted_content", encrypted_content); $("#response_" + target).html(XORCipher.decode(entered_password, encrypted_content).decode()); $("#response_" + target).show(); $("#form_" + target).hide(); $(".button").off("click"); $(".button").on("click", button_click); $(".unlock input[type=submit]").off("click"); $(".unlock input[type=submit]").on("click", unlock_input); } }; $(".button").on("click", button_click); $(".unlock input[type=submit]").on("click", unlock_input); $(".accordion-toggle").on("click tap", function(){ $('.accordion-body').removeClass("slidedown").addClass("collapse"); $(this).parent().children(".accordion-body").removeClass("collapse").addClass("slidedown"); }); $("#collapsecomment-heading").on('click tap',function(){ if (mainScene.zoomActive === 0) { if ((mainScene.element !== 0) && (typeof(mainScene.element) !== 'undefined')) { for (var i in mainScene.element.kineticElement) { mainScene.element.kineticElement[i].fillPriority('color'); mainScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); mainScene.element.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); mainScene.element.kineticElement[i].setStrokeWidth(0); mainScene.element.layer.draw(); } } mainScene.element = that; layers[0].moveToBottom(); } }); document.addEventListener("click", function(ev){ if (mainScene.noPropagation) { mainScene.noPropagation = false; } else { if (mainScene.zoomActive === 1) { if ((mainScene.element !== 0) && (typeof(mainScene.element) !== 'undefined')) { mainScene.element.kineticElement[0].fire("click"); } } else if ((mainScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (mainScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { document.body.style.cursor = "default"; mainScene.cursorState = "default"; if (typeof(mainScene.element.kineticElement) != "undefined") { mainScene.element.kineticElement[0].fire("mouseleave"); } } } }); }; /* * * */ hooks.prototype.afterIaObjectConstructor = function(iaScene, idText, detail, iaObject) { /* * manage accordion events related to this element */ $("#" + idText + "-heading").on('click touchstart',function(){ if ($('#' + idText).css("height") == "0px") { iaObject.kineticElement[0].fire("click"); } else { iaObject.kineticElement[0].fire("mouseleave"); } }); }; /* * * */ hooks.prototype.afterIaObjectZoom = function(iaScene, idText, iaObject) { }; /* * * */ hooks.prototype.afterIaObjectFocus = function(iaScene, idText, iaObject) { $('.accordion-body').removeClass("slidedown").addClass("collapse"); $('#' + idText).parent().children(".accordion-body").removeClass("collapse").addClass("slidedown"); $('#' + idText + " audio").each(function(){ if ($(this).data("state") === "autostart") { $(this)[0].play(); } }); }; images-actives-html5.git/src/share/themes/accordionBlack/js/iaobject.js000066400000000000000000000731271250410645000264050ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @param {object} params * @constructor create image active object */ function IaObject(params) { "use strict"; var that = this; this.path = []; this.title = []; this.kineticElement = []; this.backgroundImage = []; this.backgroundImageOwnScaleX = []; this.backgroundImageOwnScaleY = []; this.persistent = []; this.originalX = []; this.originalY = []; this.options = []; this.stroke = []; this.strokeWidth = []; this.tween = []; this.agrandissement = 0; this.zoomActive = 0; this.minX = 10000; this.minY = 10000; this.maxX = -10000; this.maxY = -10000; this.tween_group = 0; this.group = 0; this.layer = params.layer; this.background_layer = params.background_layer; this.backgroundCache_layer = params.backgroundCache_layer; this.imageObj = params.imageObj; this.myhooks = params.myhooks; this.idText = params.idText; this.zoomLayer = params.zoomLayer; // Create kineticElements and include them in a group that.group = new Kinetic.Group(); that.layer.add(that.group); if (typeof(params.detail.path) !== 'undefined') { that.includePath(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.image) !== 'undefined') { that.includeImage(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.group) !== 'undefined') { for (var i in params.detail.group) { if (typeof(params.detail.group[i].path) !== 'undefined') { that.includePath(params.detail.group[i], i, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.group[i].image) !== 'undefined') { that.includeImage(params.detail.group[i], i, that, params.iaScene, params.baseImage, params.idText); } } that.definePathBoxSize(params.detail, that); } else { console.log(params.detail); } this.defineTweens(this, params.iaScene); this.myhooks.afterIaObjectConstructor(params.iaScene, params.idText, params.detail, this); } /* * * @param {type} detail * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includeImage = function(detail, i, that, iaScene, baseImage, idText) { that.defineImageBoxSize(detail, that); var rasterObj = new Image(); rasterObj.src = detail.image; that.title[i] = detail.title; that.backgroundImage[i] = rasterObj; that.kineticElement[i] = new Kinetic.Image({ name: detail.title, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, width: detail.width, height: detail.height, scale: {x:iaScene.coeff,y:iaScene.coeff} }); rasterObj.onload = function() { that.backgroundImageOwnScaleX[i] = iaScene.scale * detail.width / this.width; that.backgroundImageOwnScaleY[i] = iaScene.scale * detail.height / this.height; var zoomable = true; if ((typeof(detail.fill) !== 'undefined') && (detail.fill == "#000000")) { zoomable = false; } if ((typeof(detail.options) !== 'undefined')) { that.options[i] = detail.options; } if ((typeof(detail.stroke) !== 'undefined') && detail.stroke != 'none') { that.stroke[i] = detail.stroke; } else { that.stroke[i] = 'rgba(0, 0, 0, 0)'; } if ((typeof(detail.strokewidth) !== 'undefined')) { that.strokeWidth[i] = detail.strokewidth; } else { that.strokeWidth[i] = '0'; } that.persistent[i] = "off-image"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill == "#ffffff")) { that.persistent[i] = "onImage"; that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); zoomable = false; } that.group.add(that.kineticElement[i]); that.addEventsManagement(i,zoomable, that, iaScene, baseImage, idText); // define hit area excluding transparent pixels // ============================================================= var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min(parseFloat(detail.maxX) - parseFloat(detail.minX), Math.floor(parseFloat(iaScene.originalWidth) * 1))); var cropHeight = (Math.min(parseFloat(detail.maxY) - parseFloat(detail.minY), Math.floor(parseFloat(iaScene.originalHeight) * 1))); if (cropX + cropWidth > iaScene.originalWidth * 1) { cropWidth = iaScene.originalWidth * 1 - cropX * 1; } if (cropY * 1 + cropHeight > iaScene.originalHeight * 1) { cropHeight = iaScene.originalHeight * 1 - cropY * 1; } var hitCanvas = that.layer.getHitCanvas(); iaScene.completeImage = hitCanvas.getContext().getImageData(0,0,Math.floor(hitCanvas.width),Math.floor(hitCanvas.height)); var canvas_source = document.createElement('canvas'); canvas_source.setAttribute('width', cropWidth * iaScene.coeff); canvas_source.setAttribute('height', cropHeight * iaScene.coeff); var context_source = canvas_source.getContext('2d'); context_source.drawImage(rasterObj,0,0, cropWidth * iaScene.coeff, cropHeight * iaScene.coeff); imageDataSource = context_source.getImageData(0, 0, cropWidth * iaScene.coeff, cropHeight * iaScene.coeff); len = imageDataSource.data.length; that.group.zoomActive = 0; (function(len, imageDataSource){ that.kineticElement[i].hitFunc(function(context) { if (iaScene.zoomActive == 0) { /*rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); //detach from the DOM var imageData = imageDataSource.data; // just replace scene colors by hit colors - alpha remains unchanged for(j = 0; j < len; j += 4) { imageData[j + 0] = rgbColorKey.r; imageData[j + 1] = rgbColorKey.g; imageData[j + 2] = rgbColorKey.b; // imageData[j + 3] = imageDataSource.data[j + 3]; } // reatach to the DOM imageDataSource.data = imageData; context.putImageData(imageDataSource, cropX * iaScene.coeff, cropY * iaScene.coeff); */ var imageData = imageDataSource.data; var imageDest = iaScene.completeImage.data; var position1 = 0; var position2 = 0; var maxWidth = Math.floor(cropWidth * iaScene.coeff); var maxHeight = Math.floor(cropHeight * iaScene.coeff); var startY = Math.floor(cropY * iaScene.coeff); var startX = Math.floor(cropX * iaScene.coeff); var hitCanvasWidth = Math.floor(that.layer.getHitCanvas().width); var rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); for(var varx = 0; varx < maxWidth; varx +=1) { for(var vary = 0; vary < maxHeight; vary +=1) { position1 = 4 * (vary * maxWidth + varx); position2 = 4 * ((vary + startY) * hitCanvasWidth + varx + startX); if (imageData[position1 + 3] > 100) { imageDest[position2 + 0] = rgbColorKey.r; imageDest[position2 + 1] = rgbColorKey.g; imageDest[position2 + 2] = rgbColorKey.b; imageDest[position2 + 3] = 255; } } } context.putImageData(iaScene.completeImage, 0, 0); } else { context.beginPath(); context.rect(0,0,this.width(),this.height()); context.closePath(); context.fillStrokeShape(this); } }); })(len, imageDataSource); /*that.kineticElement[i].sceneFunc(function(context) { var yo = that.layer.getHitCanvas().getContext().getImageData(0,0,iaScene.width, iaScene.height); context.putImageData(yo, 0,0); });*/ // ============================================================= that.group.draw(); }; }; /* * * @param {type} path * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includePath = function(detail, i, that, iaScene, baseImage, idText) { that.path[i] = detail.path; that.title[i] = detail.title; // if detail is out of background, hack maxX and maxY if (parseFloat(detail.maxX) < 0) detail.maxX = 1; if (parseFloat(detail.maxY) < 0) detail.maxY = 1; //that.backgroundImage[i] = imageObj; that.kineticElement[i] = new Kinetic.Path({ name: detail.title, data: detail.path, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, scale: {x:iaScene.coeff,y:iaScene.coeff}, fill: 'rgba(0, 0, 0, 0)' }); that.definePathBoxSize(detail, that); // crop background image to suit shape box that.cropCanvas = document.createElement('canvas'); that.cropCanvas.setAttribute('width', parseFloat(detail.maxX) - parseFloat(detail.minX)); that.cropCanvas.setAttribute('height', parseFloat(detail.maxY) - parseFloat(detail.minY)); var cropCtx = that.cropCanvas.getContext('2d'); var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min((parseFloat(detail.maxX) - cropX) * iaScene.scale, Math.floor(parseFloat(iaScene.originalWidth) * iaScene.scale))); var cropHeight = (Math.min((parseFloat(detail.maxY) - cropY) * iaScene.scale, Math.floor(parseFloat(iaScene.originalHeight) * iaScene.scale))); if (cropX * iaScene.scale + cropWidth > iaScene.originalWidth * iaScene.scale) { cropWidth = iaScene.originalWidth * iaScene.scale - cropX * iaScene.scale; } if (cropY * iaScene.scale + cropHeight > iaScene.originalHeight * iaScene.scale) { cropHeight = iaScene.originalHeight * iaScene.scale - cropY * iaScene.scale; } var posX = 0; var posY = 0; if (parseFloat(detail.minX) < 0) posX = parseFloat(detail.minX) * (-1); if (parseFloat(detail.minY) < 0) posY = parseFloat(detail.minY) * (-1); // bad workaround to avoid null dimensions if (cropWidth <= 0) cropWidth = 1; if (cropHeight <= 0) cropHeight = 1; cropCtx.drawImage( that.imageObj, cropX * iaScene.scale, cropY * iaScene.scale, cropWidth, cropHeight, posX, posY, cropWidth, cropHeight ); var dataUrl = that.cropCanvas.toDataURL(); delete that.cropCanvas; var cropedImage = new Image(); cropedImage.src = dataUrl; cropedImage.onload = function() { that.backgroundImage[i] = cropedImage; that.backgroundImageOwnScaleX[i] = 1; that.backgroundImageOwnScaleY[i] = 1; that.kineticElement[i].fillPatternRepeat('no-repeat'); that.kineticElement[i].fillPatternX(detail.minX); that.kineticElement[i].fillPatternY(detail.minY); //that.kineticElement[i].draw(); }; var zoomable = true; if ((typeof(detail.fill) !== 'undefined') && (detail.fill == "#000000")) { zoomable = false; } if ((typeof(detail.options) !== 'undefined')) { that.options[i] = detail.options; } if ((typeof(detail.stroke) !== 'undefined') && detail.stroke != 'none') { that.stroke[i] = detail.stroke; } else { that.stroke[i] = 'rgba(0, 0, 0, 0)'; } if ((typeof(detail.strokewidth) !== 'undefined')) { that.strokeWidth[i] = detail.strokewidth; } else { that.strokeWidth[i] = '0'; } that.persistent[i] = "off"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill == "#ffffff")) { that.persistent[i] = "onPath"; that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); } that.addEventsManagement(i, zoomable, that, iaScene, baseImage, idText); that.group.add(that.kineticElement[i]); that.group.draw(); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.defineImageBoxSize = function(detail, that) { "use strict"; if (that.minX === -1) that.minX = (parseFloat(detail.x)); if (that.maxY === 10000) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); if (that.maxX === -1) that.maxX = (parseFloat(detail.x) + parseFloat(detail.width)); if (that.minY === 10000) that.minY = (parseFloat(detail.y)); if (parseFloat(detail.x) < that.minX) that.minX = parseFloat(detail.x); if (parseFloat(detail.x) + parseFloat(detail.width) > that.maxX) that.maxX = parseFloat(detail.x) + parseFloat(detail.width); if (parseFloat(detail.y) < that.minY) that.miny = parseFloat(detail.y); if (parseFloat(detail.y) + parseFloat(detail.height) > that.maxY) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.definePathBoxSize = function(detail, that) { "use strict"; if ( (typeof(detail.minX) !== 'undefined') && (typeof(detail.minY) !== 'undefined') && (typeof(detail.maxX) !== 'undefined') && (typeof(detail.maxY) !== 'undefined')) { that.minX = detail.minX; that.minY = detail.minY; that.maxX = detail.maxX; that.maxY = detail.maxY; } else { console.log('definePathBoxSize failure'); } }; /* * Define zoom rate and define tween effect for each group * @returns {undefined} */ IaObject.prototype.defineTweens = function(that, iaScene) { that.minX = that.minX * iaScene.coeff; that.minY = that.minY * iaScene.coeff; that.maxX = that.maxX * iaScene.coeff; that.maxY = that.maxY * iaScene.coeff; var largeur = that.maxX - that.minX; var hauteur = that.maxY - that.minY; that.agrandissement1 = (iaScene.height - iaScene.y) / hauteur; // beta that.agrandissement2 = iaScene.width / largeur; // alpha if (hauteur * that.agrandissement2 > iaScene.height) { that.agrandissement = that.agrandissement1; that.tweenX = (0 - (that.minX)) * that.agrandissement + (iaScene.width - largeur * that.agrandissement) / 2; that.tweenY = (0 - iaScene.y - (that.minY)) * that.agrandissement + iaScene.y; } else { that.agrandissement = that.agrandissement2; that.tweenX = (0 - (that.minX)) * that.agrandissement; that.tweenY = 1 * ((0 - iaScene.y - (that.minY)) * that.agrandissement + iaScene.y + (iaScene.height - hauteur * that.agrandissement) / 2); } }; /* * Define mouse events on the current KineticElement * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.addEventsManagement = function(i, zoomable, that, iaScene, baseImage, idText) { if (that.options[i].indexOf("disable-click") !== -1) return; /* * if mouse is over element, fill the element with semi-transparency */ that.kineticElement[i].on('mouseover', function() { if (iaScene.cursorState.indexOf("ZoomOut.cur") !== -1) { } else if ((iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { } else if (iaScene.cursorState.indexOf("HandPointer.cur") === -1) { //document.body.style.cursor = "url(img/HandPointer.cur),auto"; document.body.style.cursor = "pointer"; iaScene.cursorState = "url(img/HandPointer.cur),auto"; for (var i in that.kineticElement) { if (that.persistent[i] == "off") { that.kineticElement[i].fillPriority('color'); //that.kineticElement[i].stroke(iaScene.overColorStroke); that.kineticElement[i].stroke(that.stroke[i]); that.kineticElement[i].strokeWidth(that.strokeWidth[i]); that.kineticElement[i].fill(iaScene.overColor); that.kineticElement[i].scale(iaScene.coeff); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); } else if ((that.persistent[i] == "onImage") || (that.persistent[i] == "off-image")) { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); } } that.layer.batchDraw(); //this.draw(); } }); /* * if we click in this element, manage zoom-in, zoom-out */ if (that.options[i].indexOf("direct-link") !== -1) { that.kineticElement[i].on('click touchstart', function(e) { location.href = that.title[i]; }); } else { that.kineticElement[i].on('click touchstart', function() { // let's zoom var i = 0; iaScene.noPropagation = true; if ((iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) && (iaScene.element === that)) { iaScene.zoomActive = 1; //document.body.style.cursor = "url(img/ZoomOut.cur),auto"; document.body.style.cursor = "zoom-out"; iaScene.cursorState = "url(img/ZoomOut.cur),auto"; that.layer.moveToTop(); this.moveToTop(); that.group.moveToTop(); that.group.zoomActive = 1; that.originalX[0] = that.group.x(); that.originalY[0] = that.group.y(); that.alpha = 0; that.step = 0.1; for (i in that.kineticElement) { that.kineticElement[i].setStrokeWidth(parseFloat(that.strokeWidth[i] / that.agrandissement)); } var personalTween = function(anim, thislayer) { // linear var tempX = that.originalX[0] + that.alpha.toFixed(2) * (that.tweenX - that.originalX[0]); var tempY = that.originalY[0] + that.alpha.toFixed(2) * (that.tweenY - that.originalY[0]); var tempScale = 1 + that.alpha.toFixed(2) * (that.agrandissement - 1); var t = null; if (that.alpha.toFixed(2) <= 1) { that.alpha = that.alpha + that.step; that.group.setPosition({x:tempX, y:tempY}); that.group.scale({x:tempScale,y:tempScale}); } else { that.zoomLayer.hitGraphEnabled(true); anim.stop(); } }; that.zoomLayer.moveToTop(); that.group.moveTo(that.zoomLayer); that.layer.draw(); var anim = new Kinetic.Animation(function(frame) { personalTween(this, that.layer); }, that.zoomLayer); that.zoomLayer.hitGraphEnabled(false); anim.start(); } // let's unzoom else if (iaScene.cursorState.indexOf("ZoomOut.cur") != -1) { if ((that.group.zoomActive == 1) && (that.group.scaleX().toFixed(5) == (that.agrandissement).toFixed(5))) { iaScene.zoomActive = 0; that.group.zoomActive = 0; that.group.scaleX(1); that.group.scaleY(1); that.group.x(that.originalX[0]); that.group.y(that.originalY[0]); //that.group.clearCache(); //that.tween_group.reset(); //that.tween_group.destroy(); //delete that.tween_group; that.backgroundCache_layer.moveToBottom(); document.body.style.cursor = "default"; iaScene.cursorState = "default"; $('#' + that.idText + " audio").each(function(){ $(this)[0].pause(); }); $('#' + that.idText + " video").each(function(){ $(this)[0].pause(); }); for (i in that.kineticElement) { if (that.persistent[i] == "off") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } else if (that.persistent[i] == "onImage") { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } } that.group.moveTo(that.layer); that.zoomLayer.moveToBottom(); that.zoomLayer.draw(); that.layer.draw(); that.backgroundCache_layer.draw(); } } // let's focus else { if (iaScene.zoomActive === 0) { if ((iaScene.element !== 0) && (typeof(iaScene.element) !== 'undefined')) { for (i in iaScene.element.kineticElement) { iaScene.element.kineticElement[i].fillPriority('color'); iaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); iaScene.element.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); iaScene.element.kineticElement[i].setStrokeWidth(0); } if (iaScene.element.layer) iaScene.element.layer.draw(); $('#' + iaScene.element.idText + " audio").each(function(){ $(this)[0].pause(); }); $('#' + iaScene.element.idText + " video").each(function(){ $(this)[0].pause(); }); } if (zoomable === true) { //document.body.style.cursor = 'url("img/ZoomIn.cur"),auto'; document.body.style.cursor = "zoom-in"; iaScene.cursorState = 'url("img/ZoomIn.cur"),auto'; } else { iaScene.cursorState = 'url("img/ZoomFocus.cur"),auto'; } var cacheBackground = true; for (i in that.kineticElement) { if (that.persistent[i] === "onImage") cacheBackground = false; that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); //that.kineticElement[i].stroke(iaScene.overColorStroke); that.kineticElement[i].stroke(that.stroke[i]); that.kineticElement[i].strokeWidth(that.strokeWidth[i]); that.kineticElement[i].moveToTop(); } if (cacheBackground === true) that.backgroundCache_layer.moveToTop(); //that.group.moveToTop(); that.layer.moveToTop(); that.layer.draw(); iaScene.element = that; that.myhooks.afterIaObjectFocus(iaScene, idText, that); } } }); } /* * if we leave this element, just clear the scene */ that.kineticElement[i].on('mouseleave', function() { if ((iaScene.cursorState.indexOf("ZoomOut.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { } else { var mouseXY = that.layer.getStage().getPointerPosition(); if (typeof(mouseXY) == "undefined") { mouseXY = {x:0,y:0}; } if ((that.layer.getStage().getIntersection(mouseXY) != this)) { that.backgroundCache_layer.moveToBottom(); for (var i in that.kineticElement) { if ((that.persistent[i] == "off") || (that.persistent[i] == "off-image")) { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(0, 0, 0, 0)'); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } else if (that.persistent[i] == "onImage") { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } } document.body.style.cursor = "default"; iaScene.cursorState = "default"; that.layer.draw(); } } }); }; images-actives-html5.git/src/share/themes/accordionBlack/js/iascene.js000066400000000000000000000104271250410645000262260ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@crdp.ac-versailles.fr /** * * @param {type} originalWidth * @param {type} originalHeight * @constructor create image active scene */ function IaScene(originalWidth, originalHeight) { "use strict"; var that = this; // canvas width this.width = 1000; // canvas height this.height = 800; // default color used to fill shapes during mouseover var _colorOver = {red:66, green:133, blue:244, opacity:0.6}; // default color used to fill stroke around shapes during mouseover var _colorOverStroke = {red:255, green:0, blue:0, opacity:1}; // default color used to fill shapes if defined as cache this.colorPersistent = {red:124, green:154, blue:174, opacity:1}; // Image ratio on the scene this.ratio = 0.50; // padding-top in the canvas this.y = 0; // color used over background image during focus var _colorCache = {red:0, green:0, blue:0, opacity:0.6}; // internal this.fullScreen = "off"; this.backgroundCacheColor = 'rgba(' + _colorCache.red + ',' + _colorCache.green + ',' + _colorCache.blue + ',' + _colorCache.opacity + ')'; this.overColor = 'rgba(' + _colorOver.red + ',' + _colorOver.green + ',' + _colorOver.blue + ',' + _colorOver.opacity + ')'; this.overColorStroke = 'rgba(' + _colorOverStroke.red + ',' + _colorOverStroke.green + ',' + _colorOverStroke.blue + ',' + _colorOverStroke.opacity + ')'; this.scale = 1; this.zoomActive = 0; this.element = 0; this.originalWidth = originalWidth; this.originalHeight = originalHeight; this.coeff = (this.width * this.ratio) / parseFloat(originalWidth); this.cursorState=""; this.noPropagation = false; } /* * Scale entire scene * */ IaScene.prototype.scaleScene = function(mainScene){ "use strict"; var viewportWidth = $(window).width() * 0.9; var viewportHeight = $(window).height(); var coeff_width = (viewportWidth * mainScene.ratio) / parseFloat(mainScene.originalWidth); var coeff_height = (viewportHeight) / (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top + $('#container').offset().top); if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_width) && (viewportHeight >= ((parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_width))) { mainScene.width = viewportWidth * mainScene.ratio; mainScene.coeff = (mainScene.width) / parseFloat(mainScene.originalWidth); mainScene.height = parseFloat(mainScene.originalHeight) * mainScene.coeff; } else if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_height) && (viewportHeight >= (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_height)) { mainScene.height = viewportHeight - $('#container').offset().top - $('#canvas').offset().top -5; mainScene.coeff = (mainScene.height) / parseFloat(mainScene.originalHeight); mainScene.width = parseFloat(mainScene.originalWidth) * mainScene.coeff; } mainScene.width = mainScene.width / mainScene.ratio; $('#container').css({"width": mainScene.width + 'px'}); $('#container').css({"height": (mainScene.height + $('#canvas').offset().top - $('#container').offset().top) + 'px'}); $('#canvas').css({"height": (mainScene.height) + 'px'}); $('#canvas').css({"width": mainScene.width + 'px'}); $('#detect').css({"height": (mainScene.height) + 'px'}); $('#accordion2').css({"max-height": (mainScene.height - $('#accordion2').offset().top) + 'px'}); $('#detect').css({"top": ($('#canvas').offset().top - $('#container').offset().top) + 'px'}); }; images-actives-html5.git/src/share/themes/accordionBlack/js/iframe.js000066400000000000000000000023671250410645000260660ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // Script used to load youtube resource after main page // otherwise, Chrome fails to start the page $(".videoWrapper16_9").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); $(this).data("iframe", ""); }); $(".videoWrapper4_3").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); $(this).data("iframe", ""); }); images-actives-html5.git/src/share/themes/accordionBlack/js/main.js000066400000000000000000000156561250410645000255540ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // @version=xxx /* * Main * Initialization * * 1rst layer : div "detect" - if clicked, enable canvas events * 2nd layer : bootstrap accordion * 3rd layer : div "canvas" containing images and paths * 4th layer : div "disablearea" - if clicked, disable events canvas */ function main(myhooks) { "use strict"; var that=window; that.canvas = document.getElementById("canvas"); // area located under the canvas. If mouse over is detected, // we must re-activate mouse events on canvas var detect = document.getElementById("detect"); detect.addEventListener("mouseover", function() { that.canvas.style.pointerEvents="auto"; if ((IaScene.element !== 0) && (typeof(IaScene.element) !== 'undefined')) { for (var i in IaScene.element.kineticElement) { IaScene.element.kineticElement[i].fillPriority('color'); IaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); } } }, false); detect.addEventListener("touchstart", function() { that.canvas.style.pointerEvents="auto"; if ((IaScene.element !== 0) && (typeof(IaScene.element) !== 'undefined')) { for (var i in IaScene.element.kineticElement) { IaScene.element.kineticElement[i].fillPriority('color'); IaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); } } }, false); //$("#collapsecomment").collapse("show"); // Load background image that.imageObj = new Image(); that.imageObj.src = scene.image; that.imageObj.onload = function() { var mainScene = new IaScene(scene.width,scene.height); that.mainScene = mainScene; mainScene.scale = 1; mainScene.scaleScene(mainScene); var stage = new Kinetic.Stage({ container: 'canvas', width: mainScene.width, height: mainScene.height }); // area containing image background var baseImage = new Kinetic.Image({ x: 0, y: mainScene.y, width: scene.width, height: scene.height, scale: {x:mainScene.coeff,y:mainScene.coeff}, image: that.imageObj }); // cache used over background image var baseCache = new Kinetic.Rect({ x: 0, y: mainScene.y, width: scene.width, height: scene.height, scale: {x:mainScene.coeff,y:mainScene.coeff}, fill: mainScene.backgroundCacheColor }); // define area to disable canvas events management when // mouse is over. Thus, we can reach div located under canvas var disableArea = new Kinetic.Rect({ x: mainScene.width * mainScene.ratio, y: mainScene.y, width: mainScene.width * (1 - mainScene.ratio), height: mainScene.height }); disableArea.on('mouseover touchstart', function() { canvas.style.pointerEvents="none"; }); var layers = []; that.layers = layers; layers[0] = new Kinetic.FastLayer(); layers[1] = new Kinetic.FastLayer(); layers[2] = new Kinetic.Layer(); layers[3] = new Kinetic.Layer(); layers[0].add(baseCache); layers[1].add(baseImage); layers[2].add(disableArea); stage.add(layers[0]); stage.add(layers[1]); stage.add(layers[2]); stage.add(layers[3]); myhooks.beforeMainConstructor(that.mainScene, that.layers); var indice = 4; layers[indice] = new Kinetic.Layer(); stage.add(layers[indice]); for (var i in details) { //var indice = parseInt(i+3); //layers[indice] = new Kinetic.Layer(); //stage.add(layers[indice]); var iaObj = new IaObject({ imageObj: that.imageObj, detail: details[i], layer: layers[indice], idText: "collapse" + i, baseImage: baseImage, iaScene: mainScene, background_layer: layers[1], backgroundCache_layer: layers[0], zoomLayer: layers[3], myhooks: myhooks }); } $("#splash").fadeOut("slow", function(){ $("#loader").hide(); }); myhooks.afterMainConstructor(that.mainScene, that.layers); // FullScreen ability // source code from http://blogs.sitepointstatic.com/examples/tech/full-screen/index.html var e = document.getElementById("title"); var div_container = document.getElementById("image-active"); e.onclick = function() { if (runPrefixMethod(document, "FullScreen") || runPrefixMethod(document, "IsFullScreen")) { runPrefixMethod(document, "CancelFullScreen"); } else { runPrefixMethod(div_container, "RequestFullScreen"); } mainScene.fullScreen = mainScene.fullScreen == "on" ? "off": "on"; /*mainScene.scaleScene(mainScene); baseImage.scale({x:mainScene.coeff,y:mainScene.coeff}); baseCache.scale({x:mainScene.coeff,y:mainScene.coeff}); disableArea.x(mainScene.width * mainScene.ratio); disableArea.width(mainScene.width * (1 - mainScene.ratio)); disableArea.height(mainScene.height); for (var i in layers) { layers[i].draw(); }*/ }; var pfx = ["webkit", "moz", "ms", "o", ""]; function runPrefixMethod(obj, method) { var p = 0, m, t; while (p < pfx.length && !obj[m]) { m = method; if (pfx[p] === "") { m = m.substr(0,1).toLowerCase() + m.substr(1); } m = pfx[p] + m; t = typeof obj[m]; if (t != "undefined") { pfx = [pfx[p]]; return (t == "function" ? obj[m]() : obj[m]); } p++; } } }; } myhooks = new hooks(); launch = new main(myhooks); images-actives-html5.git/src/share/themes/accordionBlack/js/xorcipher.js000066400000000000000000000115101250410645000266140ustar00rootroot00000000000000// XORCipher - Super simple encryption using XOR and Base64 // MODIFIED VERSION TO AVOID underscore dependancy // License : MIT // // As a warning, this is **not** a secure encryption algorythm. It uses a very // simplistic keystore and will be easy to crack. // // The Base64 algorythm is a modification of the one used in phpjs.org // * http://phpjs.org/functions/base64_encode/ // * http://phpjs.org/functions/base64_decode/ // // Examples // -------- // // XORCipher.encode("test", "foobar"); // => "EgocFhUX" // XORCipher.decode("test", "EgocFhUX"); // => "foobar" // /* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, strict:true, undef:true, unused:true, curly:true, browser:true, indent:2, maxerr:50 */ /* global _ */ (function(exports) { "use strict"; var XORCipher = { encode: function(key, data) { data = xor_encrypt(key, data); return b64_encode(data); }, decode: function(key, data) { data = b64_decode(data); return xor_decrypt(key, data); } }; var b64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; function b64_encode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, r, i = 0, enc = ""; if (!data) { return data; } do { o1 = data[i++]; o2 = data[i++]; o3 = data[i++]; bits = o1 << 16 | o2 << 8 | o3; h1 = bits >> 18 & 0x3f; h2 = bits >> 12 & 0x3f; h3 = bits >> 6 & 0x3f; h4 = bits & 0x3f; enc += b64_table.charAt(h1) + b64_table.charAt(h2) + b64_table.charAt(h3) + b64_table.charAt(h4); } while (i < data.length); r = data.length % 3; return (r ? enc.slice(0, r - 3) : enc) + "===".slice(r || 3); } function b64_decode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, result = []; if (!data) { return data; } data += ""; do { h1 = b64_table.indexOf(data.charAt(i++)); h2 = b64_table.indexOf(data.charAt(i++)); h3 = b64_table.indexOf(data.charAt(i++)); h4 = b64_table.indexOf(data.charAt(i++)); bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; o1 = bits >> 16 & 0xff; o2 = bits >> 8 & 0xff; o3 = bits & 0xff; result.push(o1); if (h3 !== 64) { result.push(o2); if (h4 !== 64) { result.push(o3); } } } while (i < data.length); return result; } function keyCharAt(key, i) { //return key.charCodeAt( Math.floor(i % key.length) ); return key.charCodeAt( i % key.length ); } function xor_encrypt(key, data) { /*return _.map(data, function(c, i) { return c.charCodeAt(0) ^ keyCharAt(key, i); });*/ var result = []; for (var indice in data) { result[indice] = data[indice].charCodeAt(0) ^ keyCharAt(key, indice); } return result; } function xor_decrypt(key, data) { /*return _.map(data, function(c, i) { return String.fromCharCode( c ^ keyCharAt(key, i) ); }).join("");*/ var result = []; for (var indice in data) { result[indice] = String.fromCharCode( data[indice] ^ keyCharAt(key, indice) ); } return result.join(""); } exports.XORCipher = XORCipher; })(this); String.prototype.decode = function(encoding) { var result = ""; var index = 0; var c = c1 = c2 = 0; while(index < this.length) { c = this.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); index++; } else if((c > 191) && (c < 224)) { c2 = this.charCodeAt(index + 1); result += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); index += 2; } else { c2 = this.charCodeAt(index + 1); c3 = this.charCodeAt(index + 2); result += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); index += 3; } } return result; }; String.prototype.encode = function(encoding) { var result = ""; var s = this.replace(/\r\n/g, "\n"); for(var index = 0; index < s.length; index++) { var c = s.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { result += String.fromCharCode((c >> 6) | 192); result += String.fromCharCode((c & 63) | 128); } else { result += String.fromCharCode((c >> 12) | 224); result += String.fromCharCode(((c >> 6) & 63) | 128); result += String.fromCharCode((c & 63) | 128); } } return result; };images-actives-html5.git/src/share/themes/accordionBlack/manifest.webapp000066400000000000000000000007001250410645000266440ustar00rootroot00000000000000{ "name": "XIA", "size" : define_package.zip_size_here, "version" : "1.0", "release_notes" : "generated with XIA", "launch_path": "/index.html", "package_path" : "http://my-webserver.com/package.zip", "developer": { "name": "Académie de Versailles" }, "icons": { "16": "/img/xia16.png", "48": "/img/xia48.png", "64": "/img/xia64.png", "128": "/img/xia128.png" } }images-actives-html5.git/src/share/themes/accordionCloud/000077500000000000000000000000001250410645000236735ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/accordionCloud/css/000077500000000000000000000000001250410645000244635ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/accordionCloud/css/main.css000066400000000000000000000225401250410645000261240ustar00rootroot00000000000000/*fonts*/ @font-face { font-family: 'yanone_regular'; src: url('../font/yanonekaffeesatz-regular-webfont.eot'); src: url('../font/yanonekaffeesatz-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../font/yanonekaffeesatz-regular-webfont.woff') format('woff'), url('../font/yanonekaffeesatz-regular-webfont.svg#yanone_kaffeesatzregular') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'yanone_thin'; src: url('../font/yanonekaffeesatz-thin-webfont.eot'); src: url('../font/yanonekaffeesatz-thin-webfont.eot?#iefix') format('embedded-opentype'), url('../font/yanonekaffeesatz-thin-webfont.woff') format('woff'), url('../font/yanonekaffeesatz-thin-webfont.svg#yanone_kaffeesatzthin') format('svg'); font-weight: normal; font-style: normal; } /*fin de font*/ /* override Wahid */ html { margin:0; padding:0; /*background: url('../img/background.jpg') no-repeat center center fixed; background-size: cover;*/ background: rgb(114,206,243); /* Old browsers */ background-image: -moz-linear-gradient(top, rgba(88,183,227,1) 1%, rgba(88,183,227,1) 10%, rgba(114,206,243,1) 10%, rgba(114,206,243,1) 100%); /* FF3.6+ */ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(1%,rgba(88,183,227,1)), color-stop(10%,rgba(88,183,227,1)), color-stop(10%,rgba(114,206,243,1)), color-stop(100%,rgba(114,206,243,1))); /* Chrome,Safari4+ */ background-image: -webkit-linear-gradient(top, rgba(88,183,227,1) 1%,rgba(88,183,227,1) 10%,rgba(114,206,243,1) 10%,rgba(114,206,243,1) 100%); /* Chrome10+,Safari5.1+ */ background-image: -o-linear-gradient(top, rgba(88,183,227,1) 1%,rgba(88,183,227,1) 10%,rgba(114,206,243,1) 10%,rgba(114,206,243,1) 100%); /* Opera 11.10+ */ background-image: -ms-linear-gradient(top, rgba(88,183,227,1) 1%,rgba(88,183,227,1) 10%,rgba(114,206,243,1) 10%,rgba(114,206,243,1) 100%); /* IE10+ */ background-image: linear-gradient(to bottom, rgba(88,183,227,1) 1%,rgba(88,183,227,1) 10%,rgba(114,206,243,1) 10%,rgba(114,206,243,1) 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#58b7e3', endColorstr='#72cef3',GradientType=0 ); /* IE6-9 */ background-repeat: no-repeat; } body{ background: none; margin:0; border:none; margin-top:0px; padding:0px; } video { width:100%; } audio { width:100%; } a { color:#333; font-family: yanone_thin; font-size:1.4em; } a:active, a:focus, a:hover {color:#DDD;} header { width:100%; padding:0; margin:0 auto; /*background:#000;*/ } header h1 { margin:0; top:0; left:0px; /*background:url(../img/imagedoc-darknoise.png);*/ display:inline; max-width:20%; padding: 0px 1em 0 5px; margin-bottom:0; color:#0B3577; font-family: yanone_regular; font-size: 3em; } .eyes { background:url(../img/eyes.png) center bottom no-repeat; margin-left: 10px; padding:.3em 1em; } .eyes:hover { background:url(../img/eyes2.png) center bottom no-repeat; } .meta-doc { background:url(../img/meta-doc.png) center bottom no-repeat; margin-left: 10px;padding:.3em 1em } .meta-doc:hover{ background:url(../img/meta-doc2.png) center bottom no-repeat; } .infos { background:url(../img/infos.png) center bottom no-repeat; margin-left: 10px; padding:.3em 1em; } .infos:hover{ background:url(../img/infos2.png) center bottom no-repeat; } .title-document {display: block;} @media screen and (max-width: 640px) { body { font-size:0.7em; } h3 { font-size:20px; } } #detect, #canvas { margin:0; padding:0; } #container { position: relative; padding:0px; width:1000px; margin:20px auto; border:0px solid #FFF3B2; /*background: #000000; Old browsers */ } #canvas { width:650px; border:10px solid white; border-radius:5px; box-shadow: 5px 5px 10px 0px rgba(0, 0, 0, 0.3); -moz-box-shadow: 5px 5px 10px 0px rgba(0, 0, 0, 0.3); -webkit-box-shadow: 5px 5px 10px 0px rgba(0, 0, 0, 0.3) } #detect { position:absolute; top:50px; left:0; width:100%; height:655px; } .accordion { position:absolute; top:50px; left:70%; width:28%; color:black; /*font-size:1.2em; */ } .accordion-body a{ text-decoration:none; color:black; font-style: italic; } .accordion-body a:hover{ text-decoration:none; color:black; background:#BFF5FF; border-radius: 5px; -webkit-transition: all 0.2s ease-in-out; -moz-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; -ms-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .accordion-group { border:0px; padding-bottom:10px; border-bottom:1px solid black; border-radius:0; } a.accordion-toggle { font-family:yanone_regular; color:#0B3577; font-size:2em; text-decoration:none; -webkit-transition: all 0.2s ease-in-out; -moz-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; -ms-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .accordion-toggle:hover { color:#FFF; } .accordion-inner { position: relative; background:white; } #accordion2 { overflow:auto; max-height:655px; } .response { display:none; } .unlock { width: 80%; margin:0px auto; } .unlock input[type="submit"]{ background-image: url(../img/unlock-icon.png) ; background-repeat: no-repeat; width: 40px; height: 40px; border:0px; background-color:transparent; } .unlock input[type="text"]{ padding: 10px; margin:10px; background-color: #ffec64; border:0px; box-shadow: inset 0px 0px 5px #ffab23; width:40%; } .button { -moz-box-shadow: 0px 1px 0px 0px #fff6af; -webkit-box-shadow: 0px 1px 0px 0px #fff6af; box-shadow: 0px 1px 0px 0px #fff6af; background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffec64), color-stop(1, #ffab23)); background:-moz-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-webkit-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-o-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-ms-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:linear-gradient(to bottom, #ffec64 5%, #ffab23 100%); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffec64', endColorstr='#ffab23',GradientType=0); background-color:#ffec64; -moz-border-radius:6px; -webkit-border-radius:6px; border-radius:6px; border:1px solid #ffaa22; display:inline-block; cursor:pointer; color:#333333; font-family:arial; font-size:15px; font-weight:bold; padding:6px 24px; text-decoration:none; text-shadow:0px 1px 0px #ffee66; } .button:hover { background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffab23), color-stop(1, #ffec64)); background:-moz-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-webkit-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-o-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-ms-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:linear-gradient(to bottom, #ffab23 5%, #ffec64 100%); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffab23', endColorstr='#ffec64',GradientType=0); background-color:#ffab23; } .button:active { position:relative; top:1px; } .button { background-color: #dddddd; position:relative; right:0px; border-radius: 5px; padding: 5px; } /* popup */ #overlay { display:none; position:fixed; top:0; right:0; left:0; bottom:0; background: rgba(0,0,0,0.6); } #popup { position:relative; border-radius: 20px; border: 20px solid #ddd; width: 60%; margin: 50px auto; background:white; min-height: 100px; box-shadow: black 5px 5px 10px; } #popup_text { text-align:center; } #popup_text img{ float:left; max-width: 60px; margin: 10px; } #content #message_success { overflow-x:visible; overflow-y:visible; } #popup_close, #popup_toggle { cursor: pointer; position:absolute; top:-40px; right:-40px; width:50px; } #loader { position:fixed; display: table; text-align:center; width:100%; height:100%; top:0; right:0; left:0; bottom:0; background: black; z-index:100; } #loader div{ font-family: yanone_thin, Arial; font-size: 2em; display:table-cell; vertical-align: middle; color:white; } .videoWrapper16_9 { position: relative; padding-bottom: 56.25%; padding-top: 5px; height: 0; } .videoWrapper4_3 { position: relative; padding-bottom: 75%; padding-top: 5px; height: 0; } .videoWrapper16_9 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .videoWrapper4_3 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .collapse, .slidedown { max-height: 0; overflow-y: hidden; -webkit-transition: max-height 0.5s ease-in-out; -moz-transition: max-height 0.5s ease-in-out; -o-transition: max-height 0.5s ease-in-out; transition: max-height 0.5s ease-in-out; } .accordion-inner { padding:10px; } .accordion-inner img{ width: 100%; } .slidedown { max-height: 1000px ; overflow-y: auto; }images-actives-html5.git/src/share/themes/accordionCloud/datas/000077500000000000000000000000001250410645000247675ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/accordionCloud/datas/README.md000066400000000000000000000001221250410645000262410ustar00rootroot00000000000000# JSON datas This folder contains data.js file where paths and images are stored images-actives-html5.git/src/share/themes/accordionCloud/deploy.html000066400000000000000000000006441250410645000260610ustar00rootroot00000000000000

XIA installation package

images-actives-html5.git/src/share/themes/accordionCloud/font/000077500000000000000000000000001250410645000246415ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/accordionCloud/font/README.md000066400000000000000000000000301250410645000261110ustar00rootroot00000000000000fonts used by this themeimages-actives-html5.git/src/share/themes/accordionCloud/hook.py000066400000000000000000000163241250410645000252130ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # # @author : pascal.fautrero@crdp.ac-versailles.fr import gettext import locale class hook: """do some stuff during image active generations""" def __init__(self, root, iaobject, PageFormatter, langPath): """Init""" try: t = gettext.translation("xia-converter", langPath, languages=[locale.getdefaultlocale()[0]]) except: t = gettext.translation("xia-converter", langPath, languages=['en_US']) translate = t.ugettext self.root = root self.iaobject = iaobject self.PageFormatter = PageFormatter self.tooltip = translate("export accordionCloud") self.loading = translate("loading") def generateIndex(self,filePath, templatePath): """ generate index file""" final_str = u'
\n'; final_str += u'
\n'; final_str += u' ' + self.iaobject.scene["intro_title"] + '\n'; final_str += u'
\n'; final_str += u'
' + self.PageFormatter(self.iaobject.scene["intro_detail"]).print_html() + u'\n'; final_str += u'
\n' final_str += u'
\n' final_str += u'
\n' final_str += u'
\n' for i, detail in enumerate(self.iaobject.details): if detail['options'].find(u"direct-link") == -1: final_str += u'
\n' final_str += u'
\n' final_str += u' ' + detail['title'] + u'\n' final_str += u'
\n' final_str += u'
' + self.PageFormatter(detail["detail"]).print_html() + u'\n' final_str += u'
\n' final_str += u'
\n' final_str += u'
\n' final_str += u'
\n' with open(templatePath,"r") as template: final_index = template.read().decode("utf-8") metadatas = "" if self.iaobject.scene["creator"]: metadatas += self.iaobject.scene["creator"] + "
" if self.iaobject.scene["rights"]: metadatas += self.iaobject.scene["rights"] + "
" if self.iaobject.scene["publisher"]: metadatas += self.iaobject.scene["publisher"] + "
" if self.iaobject.scene["identifier"]: metadatas += self.iaobject.scene["identifier"] + "
" if self.iaobject.scene["coverage"]: metadatas += self.iaobject.scene["coverage"] + "
" if self.iaobject.scene["source"]: metadatas += self.iaobject.scene["source"] + "
" if self.iaobject.scene["relation"]: metadatas += self.iaobject.scene["relation"] + "
" if self.iaobject.scene["language"]: metadatas += self.iaobject.scene["language"] + "
" if self.iaobject.scene["contributor"]: metadatas += self.iaobject.scene["contributor"] + "
" if self.iaobject.scene["date"]: metadatas += self.iaobject.scene["date"] + "
" final_index = final_index.replace("{{METADATAS}}", metadatas) final_index = final_index.replace("{{AUTHOR}}", self.iaobject.scene["creator"]) final_index = final_index.replace("{{DESCRIPTION}}", self.iaobject.scene["description"]) final_index = final_index.replace("{{KEYWORDS}}", self.iaobject.scene["keywords"]) final_index = final_index.replace("{{TITLE}}", self.iaobject.scene["title"]) final_index = final_index.replace("{{ACCORDION}}", final_str) final_index = final_index.replace("{{LOADING}}", self.loading) if self.root.index_standalone: xiaWebsite = "http://xia.dane.ac-versailles.fr/network/delivery/accordionCloud" final_index = final_index.replace("{{MainCSS}}", xiaWebsite + "/css/main.css") final_index = final_index.replace("{{LogoLoading}}", xiaWebsite + "/img/xia.png") final_index = final_index.replace("{{LogoClose}}", xiaWebsite + "/img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '') final_index = final_index.replace("{{JqueryJS}}", "https://code.jquery.com/jquery-1.11.1.min.js") final_index = final_index.replace("{{sha1JS}}", xiaWebsite + "/js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", "https://cdn.jsdelivr.net/kineticjs/5.1.0/kinetic.min.js") final_index = final_index.replace("{{xiaJS}}", xiaWebsite + "/js/xia.js") final_index = final_index.replace("{{hooksJS}}", xiaWebsite + "/js/hooks.js") final_index = final_index.replace("{{labJS}}", "https://cdnjs.cloudflare.com/ajax/libs/labjs/2.0.3/LAB.min.js") else: final_index = final_index.replace("{{MainCSS}}", "css/main.css") final_index = final_index.replace("{{LogoLoading}}", "img/xia.png") final_index = final_index.replace("{{LogoClose}}", "img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '.script("datas/data.js")') final_index = final_index.replace("{{JqueryJS}}", "js/jquery.min.js") final_index = final_index.replace("{{sha1JS}}", "js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", "js/kinetic.min.js") final_index = final_index.replace("{{xiaJS}}", "js/xia.js") final_index = final_index.replace("{{hooksJS}}", "js/hooks.js") final_index = final_index.replace("{{labJS}}", "js/LAB.min.js") with open(filePath,"w") as indexfile: indexfile.write(final_index.encode("utf-8")) images-actives-html5.git/src/share/themes/accordionCloud/icon.gif000066400000000000000000000104141250410645000253120ustar00rootroot00000000000000GIF89a4@6A789;3<4=6>7@G8AH:BI;CJFL?GM@HAICDEMFHIQJCKDLCENDGVOEHPFIQHKRYILTJMUBLNVMDPWEQXNGROHQSIKSLMXOPQSTUVXYbcdehjkut}~w݁ݍܢޙ߰!Created with GIMP! ,H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʓׯ`ÊKٱVϪ]˶-dgݻx˷=uĀJ h+^̸ǐEWJT̹Ǵx|٩*L}^͚$T) ԛ[&WVmx+g,.˳sFy]`TwQ{/2[_a}ٻ? 귩v߀7Q` 9,|Bx%F2`jzJ7<ehr?袅6#(N;P/2Ȃ?VPdaH(ޒMf$Pd1U^dq]:QD9| 0`I&oԐBIlI.ԀC )0$6(DTH`v N?,E8|0p8@,믿& `$2;BM8хe>f.`JˮKKl°EgcNL|p~i%y(@ "Tgw̱2Wdih /#ԼH"83"<3φ-Dm!T4 YvM+r:. ɛ-ΖLWH-6UfZFqB d3 & +F88e!r]Gwk%.q1䅏M"xdp0u!>L>Sp曯ff5uaछ.ꩻ' ؖ2}n; ?>d$D_Grtk Էyt(q&(@z߷@vO?7o|SA:,Ia "PF_Tx13 $P7 DhbÕ E<" Mx3l (J?N=B',a X4KvMjb IBLd 'a'<#d87S(FX@$URXh*V%X U*$d$w G,^r&Ԥ7ʀ(@׺0ЮJL^b46}/TkFXȌR N${9&т;޷LMb˧13W .x-9ЩNJZҝ\'1O@*@F7x5HGz{SL) J慦#\XLөNv]DpGj-bAԢUHMRJTW8xTJժJuX]+p]H¥ S6Ԧ;uj@=񌵸Ab>a eUYZõzR qvkYK-l-{F-o/]ǪX4FkNZ=Un)ly=+Z!48QFvD Rpfc[ⴎ_x[Rv%np_WDKY)#ҝpjubW$`x>$WpZ]ƶ{z |Z6]i{ޒX.q{잰7X+<80Y'l o=axlgjߛbR)^ZX^ Kv:^58$$Z$soiA Y v`ηɂ^җ 3PfߥHey3qZ`B&6 N\ѐt&&MJ[ґ~%6N{|Pº=~~2Z^-%0Pxe*Sf5Mln3X<屔uxo+OTp&Ѓ%=Rz*{jF5E!SE`樾7 ҐT%ѕ1D WLtb}B҈#x6o}`4_q; n ZFp`\8c dA p83c8X::Td< AÒ3~:gnI#׶a,uק@ 21ٗ?C}⼤9zKnDr}^3=b>̙zxej_b{WbF}]4LBuC]Gg~~/l"ewcO$<Ѐ+7s7VՁ; #Q <؃>> z@w(x~ZxpGcq @E(X~)h[Ƃkx$x~e[x$|R ʡkPr_f^6shyҳyR؆qXs r_hv*x~(qwy&FGRa `v v(8|8W`җV|'8k aHwd8}Tq h8|mzX=V`~ qHJnlW(Qt y︇ ؐܘ`Бx(ؘ$V1xWUX y`04l"~LNxb'@9C fLّN PɋR mRA+g@ ^2)46iz!f(eGmZ gq!K|O[~gfBi!eyșKR@j1Ib 9ؚ6[S  iٗ~w~GX)љ y׉ iᩗM)9Oў!ydi82g)*_d@9yԹĵ I*:YVIڝ z_1Y&y-ؠ,2J4z6jl֋:ܹ>Zaz5ZGWѢL!*PJ9(:VIZʥ0:P8X%1QJmjDZjVq ˠfC9U, a  *Zzh,p*Zfπzjw  slqoah0 vp Zzn  ʪhxf"$+ *OJ9;images-actives-html5.git/src/share/themes/accordionCloud/img/000077500000000000000000000000001250410645000244475ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/accordionCloud/img/HandPointer.cur000066400000000000000000000042761250410645000274060ustar00rootroot00000000000000 ( @MMM***eeeqqq www```jjjmmm ,,,bbb =><'=>=9\!UW[ .Q4WX8ZZX!((YT4 5 7!8Z 6 NQ$34 5 7XX;@1NOPQR3TUV Q? LM112RSTQJ0%K0LM12X>U/JK0LLM1>A5H I/JK00LJ?[$),FFG-H I/J/S)?DE /FK -HO :+#D\M;"7;C+/&3KH@21B3*FA(@???? images-actives-html5.git/src/share/themes/accordionCloud/img/ZoomIn.cur000066400000000000000000000042761250410645000264060ustar00rootroot00000000000000 ( @༙L@3uaL""!tSSSǨiii555^^^trr+++} ===׶-' xxxXXXcccRD6''&̬ ///mmmqܺ[[[0)#xcO%$# ```ooovvvqqqt&%%(((˪N@3 TTTݻYYY___wbNaaabbbhhhwww-(!߻Ȩ&&%RD5̫˫cbb\Z~9zq qX\_@_`%%rpM^A&%$o(J?) ppG_R8e$66jjhf8k nn_!dfws Ijkl77lR#E.3-3.Kii$s\kcL tNfg^y"9. *4t.'dm54V44tu#g_TkQ34V3> DZXa/4-+aC@T6YPtVV*3Q5l|YJxttVVv];^Y7St 8B}EYA\8Tvvvv*O\>,1WU4O_,-V,\$0<)o\,bd\\\\\\\-b`FHc,#|YV??images-actives-html5.git/src/share/themes/accordionCloud/img/background.jpg000066400000000000000000002305271250410645000273010ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!''''''''''"!1AQaq"2BR#3brCS$4cs!1AQaq"2BbRr#3CS$ ?쏎fε&:tnbbcXaDs k%짌p]jߴ1揖tuWiGЌb2.f3ou^bb&41-qNJA{O KĢwbbtV5%Ts.ZI.Oc6#fqoig QRM3{w-qf~zHSiMN*Qɀ6+wU m/炾d%zLKkǫNgvOĺrktoe Dk1uoi^#MO(΀*0yF,v^irx jig/WwJ8{v@p_=.oixS)JVB+TpX֟JL5|g*۫:i(@ 2S iosZaxkvkRQm܍d[y^uG=^-0fε%?oJԯ KKWm/^ţXc*|g^+<;y'eVvxNΦ0s4'8gk11<Ŧ.W !qp0亚jiƔ\dk&}kjv✫[7&u¨W{~zۼ!,}>J[:Zq$+#ef^2E<)R'io,fѺ[F(ʹ#$Hvܶ乐3kM τ%sK^k,|*ݑ/i.QDF YیnĤ葽\uO=[[Ofݥ^,90=kiYc }*,Ds kֲvS8p.5Ho\8wG:[e]B2b2qMmn-7%x 3WK,.EKHβ]̥ra. )9҄dP-vy-3Ux§WXmSٟm>yKE`oinһP-ײַ<6:;az)l? [/Eo%iewӒyGk9tŲK0x'"%-y襽O9M ctd1kk.Oex1P;dVRmbوb+YmvqK~پm\{kr::}*'sl[K&bΑUZblrtDwoBڬ%ָ+mk^kN, Pô^;T3$vvbFbzùɆ~Yֽk+,;yniq⎕L.aFXLi1ODǝ5OFn.\TbbtE}3FY KVaqKs/im8H@Kn>ݾݾrAf%(/ma%NQqm=fSr` e4:: &xQZKMgpaaՎ_Rvgnn/،-6çZw_KZΒTSbѭf;Žѥ;JKᛄb|Dw+prAyy󖠸qm2`;=Ufьb٦7oÂkyb"ܸKhUx~@e 2*^tsϺӝB&[巕T9bEkw.gMNTJJrr`M@13Y'I~}ʹ'DţZΰvùɆxNYA;)c#sip8'KuvWiG~2b6 oJ䯍XlMQU6WǭWa|W&ݺJx^.ҍk~h-haE`,z\c\ה[i-:Vh.ye@NV-YϊpO.F`5x -OTy2\*ٸl}3׃5EKUMoFЗL-2bXʉ t[׊[5%m~>hU]Z9`cu WEc7vKbV+Rjw -hf8rr^מ5Qx\b4][nd0bN&Xҭe%VInԮK+۱KeŸgZ"+X#1r'7'[1o6jJi_+Nnd-+1qp-ZcOUvv˰ ^| ͧYfz bfN;o\߅$vvb -uʛ&gZh:[J8:Vu0w2<)Z8^}LǍzYpZ4'x\q^9KĢoZLNV5%Ts.ZI.Oc6#-6[Oo J_:'#o ۤ2B*]83^rO*C\mq5Q^#Mt}*Pŭ,;s3I#KPػN\~Mu**#mɀ1ig3J[%fVmpǔ~'qEqMfĮ0K6s_'tɀ)9:nmǦ* xf1rtFa:#l]mGJkγ-VQ6reswoHWi{Δ{Dj_j Mv\J!cЖ֞Vs"!7kKmo^oZnEI꭮.o$kG13Y'I'ܫRtZ-uuøɆ~Yֽk(gejl,soeKb6# o\tmiұ,7LYi%VI xecYʰVٴɺޱ±񞿂=y5_GkX4=NrnLV[_-Ǹ67*Cs+Ͳ"?:qScn9mo{=D!EFQK$a#1lxZ16&YcZ8ay%*_Fu<2ݱö}L35K8J2钣@M@z,xH}"U-iotKO.ZurrWXׄ7X~I0f+m?/ro6lhohsф/,sʿլL[onsw"#6#dΑ~/YB.Ob+9~YH@KaŔnM@Niln]LxW{b"#Hat^NbkZV+X!W:)S>#t)1qY쮵635M,NF߱|!Ksm[2`]}0W^z-49*5la7Y~ՋC:هM'=ŷϞ|qc1{/e\=jk#_iגs'[\q${zc~_ƑE/[1x#$^yMmNwOӚ/Yݿ/XG}FI}whɏ3.ۧvr_R|-7ɸydn(:G RwcnJK:K[֢۷%[ڃkw{Dwvnɿ.*~ޑذx}|miTkc=#z?]v'Cy͗IZo wLb k} /c_Dr.4˵?tzqq:=閧8N%4|{zKMO*K4f 0]ѦJyy9M9?+&N߼:zOTjT}}[ŹFW=tMb|ρFdrk=;iZitiP&N\f8bf^_MxM̏5G8ؒMP| &bu{ }S7ڶk:Ĩp2ak<:ġ gY(71[# ͻIc,YjܫxG~LS'od~\5!eq\5_DlŃ-k o؏۷RKV_͛}?mҟӟ{=1bxQʱ}eqFPQUJ.<[c/K^r`Ǜ*^;i{T?p:c%5gm[4UtN֢KcXJ/|^¿= 4Si^5Ji^X#'V['nvҌ`bĀ ?Mg}t>\k߃žF?:d3qS`S6[GPgn/Oy?X9{UWFΧOy}l:bqSmxqV43YX^aa59!JfOudCA/3E~nJ,`YJMʶ aznF驴R&)M}?,"eдvkmyymK|0(KtL5^Zih7̨UkԸ<V%dfG5jL%Rԫ;s-unRm={G꽯d˼c+j5vlԖ?c#f߁:;{v#ZZ+6bsl[\:i_J^gXkg.O%__ /{%*WDɦ}IŊan7N:d==q)_g9ޚD*@nfm~43HI~)_?o:cJDvSi6YF2]3{(9oqc"?KLLNj]Gh ?}s?q=#揌>a~ENqǼA=qQg.r>ǧLLLƓ&6ޢP4^h^XMyf;`"f'X)}ƕ?rQRTd۬_a{[VYSad:xu <ѧ+viq4tase&:eXndaeVg|Zڿ5?2q|\-:,Bv/fյ&khc Y`o1$i6$|!wuV&)J..۸AJ;@ ))4)Rx_^uKftty2\:q- |m,%gʱ=V\vI]Zkqۄ&`" {Jq Ǧus5ʗbM+ ߏHYbcZGHn9uIf5$8nSnUi-\ITrΟMxB8.Dqg'99<ۨPo|8WJ1rj1Ul+巍#YZ^m<ac..`GOOVR^@eLy nwhܻ q%aW%󬵙gPy˽~w^8-܄;\X{Na^2m$ۢK:LΑX"|"巽Jҩ{\ֱ|>k+{(9Bbq$Fs>:T]ے,ˁmtJ{d2=2tO.ū[Ǎ&'=vS5.18x6 )ADwm[ Z8IQJ%lsN,Ý/a?>ӏumXgOkt%lw-Y=&C~,'$S/ ڻmÎ xũ[Ɩd+& \kG57fי-I1)MhN7hZZbolǎck}Yg=^ZeJ?ԮVͿ7>_> *)9O;O{.Ȉ8Dr)II-#nT#E0n2fL-)Y>9n#Zbp .-9wMޞ5m[VּϧHn 3ix{K$`m+XV} uDxpM~V.)-R-vv'JXKd'Gm m0[LOxqzI),SU^s9[Z ɨ"f'X v}1sqܟ[VYNs:xuge_g?4#$Q[[q`ͮri|+;UYr.[fg;)JVC1X#*n:lF`qmy!6#my5 !i^6Xvg]~ZFEQSTX@_ŽGg#GwԽo]Α")X[U;Vg+dUiy_+J+V8D2>{㻙Y~25>+R:ƀ1q׵aЎL.;cV8E;d/ʿS,g-ex랝ut/ۗyCW6+KwT=1@/P;'cgL|g}g}L;+"+X!O["=YVQۭ T mJbܭ^S#n7/~m4Zs4f}cV(L/uG8D[}V>[UL.9mn}2ͤ7}8Xe Zknpt5GGoU҆8NV[w{'/%ɛF;[=ºf l?4U֪ڮ戀- 㜙+HL7}w~ZZ:?mŔ[O}FtQZCۀyOqat^#6'ox͓HⱣMm%ġ=;VٚQwɀG ]{O?=,W$DŧzV~uSzLئȵM k{$ V=U 9rqgY׭H>hƱ==e`-oN_ʲYs7zۓɽ/K gͿ]W=R>E{c@ L$M了W7 ڷ*αD>L3'XvS82dH-Qt8`c}6.4g.9z_jڳhc>xKth^k bwU팧sma5rXM5Uϔ\]$P\'xKI=Г/bcX"q}sSFvm\W 7;ެq^Ek<9&:Ořte}Ŕr9HGI~7 K:9R_4Xu@5K~ ^ӤVWp"fb#<s4LbNЋVB? -Id+7ټ}^#;^yf3<5dRݤU '8;VÂyu]+z;pXō4:##Mڸ#^wr Τa%$`>uL1qHe&.:$u˖yBqyӕ:CLo+βfݥ^,_J8G%+g~jIp߆Zn\p%߹ e;n^1n> E5jya韇i{MkF[ֹ9~yO^ۂw!"ݚwlf?qz9cǖ5+_D*GUꑒ^fUR1Y]~1]#Ն0oқdoUcGje9CUv;zlZL$c9TR:aŮX?pnTeǓODh f0HHeYY-~=k3`饾0C/$Z?}v+,%31Mө['8= G\Qʑb8)Nkob>d/q/>4M3!.ғ{kk{?%~mnor~OQqQGmuSg}yÓYgwa԰4׾[DLrL`#o0}~QW$Ŵ[ g8B$0}Qۏ⌻Mm8^hɨw=}x86o[vXkz6.[eNݕ|M],v,ѧjޚ(y -681yO;qة92VWUb8 ,wt6'qsf@W: F,v%WC y,HWqʼ(lkMav1G ml*uMr|)ۺʵVGD7.\\;Gbc:VC`V:)$H[޴ӤBs_)[BO ^ K^wbet3P[U˻zwd-؈Mfy eɇ%rmaa^f+fwc)<'*k4BN>W>[ѽZ߮2:+}pS{' cZc#=}krw-ܜ.'6u6z,=И$ۧE皟s88m3}13zøk׳13<!}rlz=k<&yX饨]([1r.}SPN}x|ӞL|'L\b]#[9jnh50tvܸ"_qF]n&ޑK|+_ IjdIs]>K鶕eB]o5=UD<%ŏ\YciYnܽZdO|#O^&utޔ :|/k<ߩ)Ȼ>A<y˓6Kei:eM6Y<~)G_GM܄p[#7V8"Ҙ2鬭iHX˪74?^VNy)_攡7ُ^x)!4&I,B31:,;fǤkGIJ+pV]]R.OKږtr'jnsciӴ:ez4k~Qs~_JJe;E{J0{L3o&ZLnV^^zOKmoR볭y? P`}kkm;{xrϝpi-;OAc]ҵv2o%ZKW{ͻkJKw4.@zkVf9k- K.Jw/ZGvqrj5'ʓ?m#L޿,)wkY??9X7[=kIi>}n^d[ǾF*_mNy9y~ iKOܙmn2m4# \͞OԯO_5;ͥ$b1oQZhVKƖJ6M+qnȞkԻX$(Dy1HNi[*kVkiWqՏYKSYY>DNhx)>;!{ujvST&jJy#%Wm|suq^OÚ6dONrX^J交ٱoc7̀]bQS^1מO9SY_V➶LrϑNhDk3.Y2­8ǥqH옯rӡR@^9fL5Ǥ9n7ViY9bEK 1r7ϸ{kne$͔[2`j^i:ţĽW2ˊ+9i#5~(b{Wr5L V}zk59_[OpoHXRQ42I52|K>떽AJJض+^liЍ1ǖXGh13m:GyT{a#w1Qx$n\J(*O9Sai:s|Kmif>s[Vt֛ *z-D9f!(Iy :]e5wmN6{O_k<y?n^ߋ4ιi?~Mz-x͂"~pݷ+sgCmEEwTJ03k}W7%vtlv46-ujEZFv}E6/60^5ee)|)^q>mNr=.}ZQu-W4=mf2{iڑiJ}56VZ]E!SVë[n}u3s7="yGbՋv{jVXT182 Bu&&o`50ڽ/q^>?~%_z~QWbn~hi1D񟏣y>igt z]+1OT.թ)^xaq|w#lKηisȶ۫Ű -IH6Ɠ⋓e=Hݚ^dZΗڼ-|X^_/V%&|R^jY覼KNMjr(Gڼ-|R)'ZV4Z0c@q3ҹx갥zRuQb͓ cOvur~%j.|yO~ 4'El[SJPdgtUw|vi-WYp5|o mouauK9⏊=`13YqoN8rELz#dX^s,%f-hT:Tn0racK{s܆W p.'U+y㭻‘k:!)e 9Gz@V:@+Ҭ[巿B͇fR{ mJs:.Xb4W~?,yWd~U}; \ p>HQ׍mhf8r䜙-y)lƲ⦲L:rsVil V%%VoJr銫9<8V9*b#FխiXcHU'q˂u,iio !wMifc'DirmǪN\`)o;Yhi(n{Ε֛L:yv#wX"gT{~8l#wfӑbK1L8>.'I,K2&b9΀(_8 om2F]IxY򈉏xOyK͈/i_o~O-fOumA>C_[oxjlYcZ^-)>/ޟc9x?w~I_Fo|$}}J}vgG /Y^3^5^*u{#1OU5Oq߾V'nk6O<׹4˒'q<>$-rƿv]+Y_}8Zg\sdo7n3ie7y\EҔT8JrRux\K ~WOXIOѯe1ɤ<5#椽6?ӧiI3%uR%%k-KX›99[I.1D@LDƓAluytc>xx[[o))VV{2t̓&ihz9&9ҋ2`'lwo?13&9.66=Tp+^RۙުrxB] }ℼHIJ.9y͙t׸k,˭e/yw_lើU"˦v),ycwR/h7vOaC^@X(mzsoqb%t,Y.[{bTLV&8~Ʊ9یΙN\s\qd"ft3++Lmҽj*ՙ\#{ki,i*#*NnNڵq}k5$ ZլM:Dui50<+ҭm˂AQJw.=j1QTG.\T@ K鉗zl[xǫW( nrŲ0V8BE6q5NJ7z+,K\~jG k)Ue˄<[^fE x:FCqmmB>X`+0ӝ>l'drn>i"c1EeWJÅZe"-yk*r-oNv8_)EuVx孺&# dLd & 7lL4i<̦Ӫmr&S2GIX/g}U"9Yȱ ]-[Far^m0EhIdYΜ{f"aEoK~dT,'f0n/X`0x5ROoo|e&=8yGÎzKRttX]<ۍ'R^xg5.V6Y#=&&ƒI7F]hW*+֟|)M'Mg FM,COj9E>xkXұB`KfHֈpxW[2'fn>i$J ±}kζV$+[mySqm|}*16V ~TK-Uߍ.bE Ib01kWfcM7٩|)4 VxDnr'~j8tˏ'hz7QDq}3O#5~xӊĶgH]'$gœ#paz\jHc^-´I5ROon4&58a$oMqA=%d_bk:Li,.HՉFs=%*Eqys+DD@ 3WK]6FMQTg ν1AlyU^9mxmf&'I&NR1:8[sl|~0upG.:>۞>W#^jʡ7X~)ƪ'I_+73otI$@9xۥDtXS:^YHfwl-~Zv=[[֭QeSc # J9Y]7GW8%Őي+)^qw)_T ߞIrĪ=4v#w!ӗ36iʺyv6Ԟ1pK6 mmh pWNTdMJ#^H~(f;i < ʲZ&:FCk>ofgEb;]JMby6y+=99 "HW'33,oZz+ԻZ$d榼<8LMgI%*y:e G EfdSJߪ—JRu|Ybi:w31 QE؍wL-[IWqiѪN3]Qu@ }3FUp |%tJ5s1/q=mn)*;r钠ݎ~2P:5?5kЧ{NWړyyn;\qI(I)ù[+-%㷞:ۼ%eem<]\K6h[{zqwi<^=%I>&a%20ckN9= e!tŲ[F;3|:#H:v@x~Ju噏8BKQ_UwK9`S692HiLǥS]c_2?F13NUZb^rx] jx[Ys=iHVּͭ:`ZV.u[r L]ӤOYat6%,"p$iwı gH*k2Mk}_/gєn*!7.=q$S,MaF'eY,R5$ MXf!2Jc\?Ep=7ZQɹr-mz׍!᮳誛T̰X[]JI"mJozqJYK`^ o'[N,Uj[z_Xֹ)xֶճBt: ŏ$ijķ鑆Tj1$Vv婻,NX[%Ze6"m2` ŭYֳ |a"ꋓQ&9JNiBQtZd {}r|4L 6:z! gW(R3Gb6 2[|%]ѪN3]Qu@ 11Lkѐ ǝ5 xJ>֙_B0iJ? tˆmxOG5tj\amutÖrEF!+"m=:] iz^NhU}{ƨ_"aZw+v߁=r/Em~eyۊKY:XAB؀ pXO!&;npኜ5mWő_:a0{i^]lÆkX{ǎi \Hƞ6^2#,f֝"1f;WZb=l[.OUvv˰ֱLγ:9Dz)eեZf$m\-K:l1W޸qS#wU,CEqyWMkOn77zO, ZY\`O/kZ1ȍɼKb >D 7źs: Q=,XnM2j,K>\ܯOѬtU[>[V>iﰯ=wiepDL=mQ"^NX6KVh K"ź2`q>81[$LGⱸwZ{=vx1#kCKvn?qi='ډIV1UƷaGcyk^ICmY11x>ā>Ͱ:MwO-cKG߬cKH79I|r˰Xg{Feێ,*^TMJ.JN6#7i:KIf2]bN32W^ XX2rx)rk.:Iq/͗i{Lz"v$ij mN=~ϫLZ5Yc8$`DL}+~ LX1b)X^._Qt}]'u)JM'۷^Q_V뛏4f~3[9=}%&>?yo^㓒/U5$rh v] 1w|8}uE4oNz+Ի\;g=8LLsJy: EI`MB^ \5{AѼ.Jt/)zd'XlŖIӼ,o1Ҷoۺ8GJΪ^w2H Lk ص>jl-ЛYn"bV8=fP-ʷؾ[v*ԴѤ&9wl,6=jۗ+]O}u>e-WRo5Y.~ߋ7m9tbz/]-S{Uڮ䢟#@DV4q-kOјqz莹 u xtK-yZ[l sM\MeʌS|Bm=HH yǔwבbKt*⶷Sg|DqҟMb"wX+&`AGMr#w$eXLDDpѐjJRU }/|+zVvSf?5ybX\t5)3:V7 k5~iGdbEj ey嫽-H?2GxP!byFlNhki7;UUr+}/5l8RShIƵǑyGPAov\3V&tac1rl4y3ΉᶊOޤpN=Kڷ3~̬p;S޶0qdnYUBVӶ[3q$oMg2v| .O(=Y/+Repi:bbt4u+J\{}\5{2S%|:;o8 1:V9ʹH1oZ5Lm%WG=mI1gd佲[m?^?OIz/MJͧ)J7%侥oW/݄RSP|1igC{gHxqhghW&2fqG{ꡫܾy{Ҵ֪jj~XS:W5Xt'Ʈ)7ɭޖ-[-6U.X]Z䥹KW+y3`kzFJM-aَ?ԴϤ' J.mW:p1+v擜2DnLpT\|q6>uVer]TDSXQ]-tO R~#H^ T3~̬v1Ozy0r |}UtI42Oom=%&6>u;IYWԲ]/C){}\5{Œ4c⍓:;i='݄$A׭>Rn%%2Wʓ6U|#$r|G+t/-*n.q$i|o{Ɨ^Ƒ͞N?yf@`sL!skL\m{+iͭ:MnxSQmFs_5?h %9Ͷ[5˽6Yi݇$t6ƞX$SmnVX!ԉUL9og"ߒ\b"8GQy`X7.Exw,tkF'eڷ,R0nbf#΀28uXJ-<ڎr^ILsw^ӭ2X{]%žxq1J&UEf 6LQ"Y$%rrIh@sg8c+G^4n7 5U%FKsOv˦puL{u<6ӌ;nM+[6j㉉m:>O~k[ꙟoѣՅӺ1w)SjW%2qړsf_4{kۈأ-3~.lv_ffcoΔ_5vr:QWҧYPklq+id^\7Yi-(@ZKm&mvJ7M*, <K{}gKM&\v-?N?S7[+=}:Y}>W` .O)duKuѿ>H,ŭ^Rq,ovDz-WJ5q{cv/ ә"byNk# &|x>mk' $@ oMg@a*6iV"kL|+߻nw3)^oM*͒Ǣ8E[ G{2Mk+jM{"ԉv;M2Vih[F.۟q'Q{KOfmu ]9G[JJ)M$oGN-RF*G!y$kkOj'=FVc*4]Qz4O>%y+",qꄔsnٻfnJܗ% jdxt}Z:Z86)8\s^Y_zOLFX%u Glt6g5-&RkyiM*K7B\Zc\|PooLӻl=iZEb~ZEN7Eɽޏ;)RQ'b+Zƕ typaYZEym+m5rMoJ䥩xVѥyLJ}6v.)GcEQ:v+tB[Qc{]ә?/\0g8*igfT8q@`m6$dm'tqi4UOa'(IN I5G{qO/SbxxL{jDOFӃyK=sib^cqi޳Lr{[:Z9m-nMi#a`d<6F=8wyo'^1:orIdoCzNReF"-نWN}䷛-T*݆649gϏmr"9GYЏ=&?s'uu6'H( ۴6 03nx۴ύIn 3>6'H( ۴6 03nx۴ύIn 3>6'H( ۴6 03nx۴ύIn 3>6'H( ۴6 03nx۴ύIn 3>6'KύIn 3>6'H( ۴6 0sqm}>6'KKr=2=4|yJ;yƱ:<i {-5ؼޝ;޵ZK'%j[].ze**gjM~ ]>lmƓ6ii^v25rZӭOi{My̱nһgMERnY$6o_]م"ƿk-1xq>_ jovݥiɚ/Q%O4m}ƘDz̡g}b&+?!ݤim6n*N䩹xWqvݥ!^ύIn 3>6'H( ۴6 03nx۴ύIn 3>6'H( ۴6 0Lq6inx۴3):D~x2WX擏yDόIUx۴6(j"xjG?^DţZαRRi15i^'eek`qEM+pM~0bun-fYO$̀r5g 7J1M.gQ s={O k+2|9KWj9V\i6xb>.7`*r[~:nґX[Y^Z6'H(i6?nqviGύOx۴@`gݧ6?nqvݤ`gݧ\TkƺOU z{S^ݥ:U+wVb{ͅ\zt%C~[WdoIN:^ uP gs~q;GYonsPm_ 6vn <7gם>ߊI$*ssm`M@>碥|m|&r㏗Gdfģ'Hbr!s {mmLDtu[b"&"#)5k=Jӓj֦6#o,ΟsY}DgywO?t)5P;˿:~?=Ο:~Rk=g>w~tyBYk=ϱΟsY}~{ߝ?ttФ{s}CΟ:~Rk=g>GywO?t)5PΟsY~???.:&{;˿:νI5CνxRk=gPx<sY~???.:&{;˿:νI5CνxRk=gPx<sY'CνxRyOy<;˿:νI=~???.:'{Px<SO)'CνxRyOy<;˿:νI=~???.:'{Px<SO+wGyw^y׼)nO*ʽupqYGx?j y:~U{’ђVc^U{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wU{y?wh׬wz?nvǚxynzB.Tɥ/:Fpn ngױgŚ5xNyfb?Mv̷d?͹ZLGzM?NG{k=s/.~[YۨRItέaz?P[TLsF-wʇv}&/hiqD{̭)uvZ"t;G4{<81Rr7 5eX#H B`15pD\o}fkqPO _۸~>w^A-q)&^ڵ DO,|t_[U y$< :1%}z~c$W eyi8?f'q ȀV֝+&,1Oo\#w`ב<4eh ؉Q=k#)>7G+]hW*D~Xr[^ 4ǧcXБ_Ό-n= W-Xpf5 \^VV wf1d{aI՞ hVGlF'9-x.B)^4V欽 {L8N]"8Dhȍu,FR\ ;ŏ|r{cX]}ea'#pIrNs|XqxOnIxvt_ylxDq+]\y-WJ:M,]@Ʊ˨ m[F=۝׷eqxv] cP]iNV7s|\-;YmLtZ53r2ͭm&m믬;{}UCWf#x6̽LIJZL;{DαѻcbN]-8ǎ8uR-bgk3BPؕYV&Or@y(=c\Lw-^Ҭz m>r׼(>|"_BSM:bpuv-JX-o&~ 89|+7Cx[lVm:V5E=*z$S)!dYo{Ygp)8%К"0Zk9,MbmXI%D ;ŏB.Oqp]}ea)dz<\?Ьɻ͓33R}YeOpp]}e&6Nv;C|X4}R(B8ҿz^;['͓ngL_5k,kLt_FRIQ`1XӤGT gZal0rxݽ j|Hϻ_m/:;Bݿ׿YYQ^Gegc9x[6VddK 5Lt_ưm/u4nsoeocވ%*oLic"ᒿ\y" \"DrY4ZS-.;6R3Dnv:!%.Sw&<"#vfı egX'a]>.j۔Ŭ e|} >4SLV-K8fMYM~6՘^15LDWR0~Y5[gO=[HxKGueIr ~3[Wa"y: P_獾 bڱ·qTrX4u}7[ IٺlOs/D|{ݮYXRkv8IV2R\A͎|!xGEiC{zLԍ#,k1Vsn+qF>Xi:vzG^tV̺nbk[^JD֝"#cW{,Q#Q OY]XkJkDrq8۱Eǁ}իaV_quF})E8v Bܬd&Tɍ8O1:tR+5"b[g}c'I~_ Wjֲ.u/S:Œټ`Ⱄ?w%`O.g_"Ŷ9+ldW~N7Ƙ{΄zSvkrySKΔn?[⭭'3I3IׄזqVqJjtKR+<ۚiB8{ a++&O;ҕHyC`T:$ g2 ittb餳CN5:'2yu.El[SOnvo+YZl~X;x4 42`j'Za`I5yϔz)?]tV=M MsL8uCҙm(ݍϴ wBx&)n,vWbRPֹ)-&+d mJꈝ[jnQ<|-äJnMm!Գ\)N3]ck1cE[cĤWW?$Q[p۔x|-zWәBNu&8Lh4u e2k5m4^#bNRܵ Y4+:MUu|sDiZs7k45~1+6)-fNU?i:.HW3Hkb?6u̓+=ս" aeY3m'!4iϯXgf"&5$9Ïq2ƸVkhnڼmu[ ӦVk.tSn1|iXGfhǸl#Lԍt#{w%njqxFRqUIv=r>t%i_-kތOrۖp`lhc#'R8c0y ֗͋hE^M{34EYQ̝B]2T`ƀZGjo3OX0jќ\ua&7m'N#vb e՝%̽*JOեX̜{A/WzfЍK4n^Y&t ilXV%Vi<6~Yp>DFi, kSꬹLLs_4w_޻%_$JAg})fjoDEvm9好ceYsNmO"Ms2`6/~RoM[}_,$boZ;[kȞ[zW ح:V5|{,1J#J!)_*f/](ȃ̾ⷔGc]{赭ՋG)dq'&'Vgnۊc[  =zC)6X5rtQM#{O1_dl-Um?W~cR]s^s˵=‘‘l'#pI.I/?̛:hp3X3*\kŖ=‘R5y'_XۂU候:܄|XoR5Y`oNc&dž {"['^V41Ƒ6g9K>çj- kygH3gdžxI^o n\ ڈ[T['}]i Kb6#Ǭv捱[>X~+{Wh}fU};Fyg.R)p8nMLe|gx$Y|3x+pZݍ$t:-pOae:4YJ./&Sa|ּjfyn:}68_ԝ&equ,ͷzv&Qx8m5rsuftgJ2]S0l--pM]Qq/(&Ɠ[6u^LWoƋP9wc4! f9+OOpi4vDv9Ijop[]z阕5:f cb/ݙ<ږmǙ4q Z5.1O>+2W n]ȍMs)Hk_"7f6,R0l#c1]&yqũYS3zjFsh.~ȪQ=km[$.m5_a~5EǾ︶՜[KFLj۵;銫s;ڍU˳I, m.E& W߭eeմ]λKv=PM2Znr&yXwggym.4:yGHINUbK}Zݛnyw^TF<_mu_,koucx|8qfr[Nizrt\QJ)(rQv4{m߹u˒&)^6/s95ɊF?Uuc'R5qZcm$-g#>;MZ싫_.q3saGr}+ȟOgO*լRZdT-1XO(-0^rST#or^s%㯆:״6qSyqgue3`bxD-3O+hfa&"=Zn&bbc.2c")Ѭks/z't>3Ux¥|bYf#0ijY\\r1V{mrKU:q=[7ibhvtǚx*J..ۻ涠i2in aeFk|:tb-WvS]ozײͻY95VbJfOc '6c눴$SV`ڃND^̻\wmC1tv=9[X{ibƜ_Oq]~ 4}QsY5Z- 11cW+pߌ׏&NeI!_۫?ET{WyGHMm2 i-K%ȣ;Uֶ1/k$WA= I'̨NQwҼc[fijQ0r&3h2Chq̻S W4aiq̺^=D{YW.Z[3ڛiǴJ^zkӛTk=\Si]vA-WLSWg?Ev6q-G6~^F;3;4zjQbv~ىGc^5n('gm;4vl\Hq-q{=%7z%Vp3N\Ȕa5.iɼծzԑAGXHi|{#8Fy"9ݷ4ᴘqmhfMk;CRaVz!eOpk_Tl5|c#cn giVzT[ffgYenB1aɚt|eeiF<^{:yplm}-{uXR_FV,0+jJgH;:al0rtDw.ڬ%34~˚s33β,ڏ^NQ$  3$V9uFIU35d~}0bV+^SSfҷԐL#9YYk:MHpr\X͹ی+g\o 6-ȋD"-p[oo^~m1E{kj2+>ӌ0dYk~95UMbZ::ƱGc^u) RTmn;pTP~/(I&5%4YN./j(G]/kxÒuIQq:ͮiY4YS1 c"m Qkn/2R/57]#ؒʌmN=名MsrRMQf,F%f0nmZ"\o~>:OʓY:)D w}z~~ q5$yV<)4ayjR-X[ڨWk$TG[_IG59_XHEv918f9ƌ7"10*k1̵r$`٥i0uwR/X9l"77ӗ[_E+'gMզ [OD{OD{h4NzX]vK(tB6t-";70gDnl1[1}uѯS7V2S3Ў^xCLt#ۆ4gh8ui;zƌWf;s#9vO6WE+/Golpl)cuniR_o| FɷXmM0z" 9tl+h|nVe*%mab6 />7B6Op)R0Dsni%i1 ̛ᯌz8Lγ:H3+O]x'R8RjåmQnq|8׭\MQFN-J.XS5|?ŖIk=xpsN8QU e[ҹ+5k-O9Mq!uc?s[kIUmK 3x7XI뮟xۃCQv9Ixa+i=&'oL)a>5yb;1OTn,GUf_59͎M[iOxՉp I"&f"#Y 5BxJ) {uϔ􎮘}f{KG+Ƴ?ھkHDDt+4m$g7K3SxAͺ|7{kwj-Ifq1ăѰ*Mw8˦J~,Z^:\wnb]ʅ׺n_o}UWYu޷r*Piy;MErKfuXpZy#Mt5bZ0tmZk.Ǫ֞0]PwxɆ1?gJK 7mK%mq}`Ȉtuf'z#Mnӓ4NjT;}z;` . otNTk˂ח;m:'c]q=@08btJSŭ4b9CUC(,$cCFF ѐ f55q8[&L4Rhv+`DɃqlz_t{J‹&D\^腗ջ*4sfiNS鉲ݶ97~gC-/>7Bm{rD:-%"a1ׅ#Qro3߆1&-S偙gY`nm)LJw#/q=LätsY,_~xc u"˜ϣDb#%aǧ6w'Ҹk?rxVkcHL?~~s%dcܡM$-U䊺YhڕkZl瞾Vd܎uN1-b4>Y>O=SXX~,Y<+v>jۧ)ir=QhOs^ǃː7|^&"5S˥t͎qd'/uUGO5ԴZe:b]/RT13p{^n-Si}TGM t#6Q߿tuFfd<7%.f=UyI|gR#v`r'sj\ڶk11ʊ~H=9ϔzvR5~xAx^zM78r}6ǂ7 ,bO%#sRP g}MWHm^ DfzU'ku;Kޕ]f2u7튪=dDV"Dpd3ۀEwLf>m5rymuzVcX={0cǒ+5X߹;quwEz7AJQTUڶlEHMޑq]E/['7Umy~/J$v)ۓ__U 5/c>A][YJNڰpGx~9&a^Mq>w^wIn//iZ%_at VaiN/&d\-،@dD:ҚJꗋ*Z,:v}to}. 7hMMۗx˷=6FhZhڵmS i# %5ij0f5"d|v\֮1jR7L몯>Mx=^m>A -Mx+saѷu3jt-W5w4rXN>Q :R>3цřQrtJ9 }nX6N]߉iZWƱC`@^J LF^~UW:}4ܸ-[d 3VEQ˷gqO؀ |3$WO F.RQ-v;׏S؈V8DpT''Vv-[Vࢽ qf8ߪxVt[LJJ)"o[WyPr.*)$qnw&wS v5V!̛GO *P,R-vׂb';\q[{@ @\mr}5]ߓ$VY)܏L=λQ{VhLcxO\b՚)ˎqd'͉Ut9T|LSny5Yֽ-c NwlS~4.Z1qwO.<6=Qm[-Y%NūF=VvSMozd5e[wOnv5LkZ3jfkhc 3iwd"ȃW$ɢқ6mj\*Fbf'XXk̔QMzr{,CYjY<7x/rZ8b3O6"gHƮ[]]XNJ>2_lU3kU_ܖHz^Ur5URN)[Xn n13$b$fg|#^}%^XP115dtO>q ? }'趟ѲMJũy]9ŒUfLDR+ڪA= @, 7ub%*ۅY,Z5Ӄp\v:i 7Siܚmk8SCzY>q*CeVu#4k5n3S T<5賘q5I VeIdy۟VoσïEfoς[N[6M۝> شu-]<ƫL|WkG)tF`MDtŃ&iґìY`c~kws{sw6 >+X!)Y+VamR+h(Z+N@1fQwִ (igl 7-_%[uxdc[ q_k2$u+_F+ ọ7K(NJI8J钣2j@W%: F )ГMjGM=q5+Fr&~jĺ|WmtP'Zn3SibWS/]u;}Tn,GSjYJ=kcG?YW{5m:ׇB.6',u>af!T]]k]?4wmݟGnI*Fa9UHP8{}#& s; 4#(*QjIӪyl5L)?fV/_f(m0Gj7s[>ky^!VoCXZ]"0[ 0(@_8 |!ڛ\9WHifmNM8N-Bf-Mc^WĵoEv^jG_m$ǍgN][tTX`N[0;?NiəN-:9;xi4ъTIR:1XnԌh MahzjrST^$?^Uw[~| =֮͋DKE2][W*-IڭT2`:a4Xz0JbVq3sM^zyHW:tixniiZGcHlKSf"5H;Fzܻ٘ j~ͬsqnVfϓ4i:9ͦӭY-Bڏ^Gw9icʵZ+^3<|1WGv}+ cMgNHCRkr-٬B=RHnỎ$7 q**#m`L~Y{u4kU.i#f-',\^UޏW֞tq'dΛϧ*7ȶ-vַgxxRq4c:žffffu2Ǥ<]. ?}wE ZٹETw2mW%ga[-ŒԘ3 An/h&2K츥~ģ-u~Gѷ{:MZ5W f?.=UfsZn:S6;6IcC_TRL?2?j!m?LKGZΉsi'!/4SQ~w%^^ot<"z*IrT1;.:ܜɷ64 mo&R1s_\6?,[#36"5=:z$:iXVJhGxyi:iR}cKk=4E+|9aSs Xà#mX$#1Ұ,ZY5 |cE;;`vMk )Wh:P B`Ya.JjîkU.=S[OQeI3saW`)>-5Att*^fXJV3suÃ&iұìY`yG;Ξw1;Ef[/i5!)Y+VamR+h(i-1W󧣆yLZֿ5&K巕YK NXV0.vn| *)*,l):&w49 B.RQlzs)I՝Vո(o`9gq(igF?Mx#-ZLjg+U{t^X%+mJ^![mi႑髳DGfToyیzb$ \$0{\eN?P>/x]xpӓkuIZWq)l\V%\)y[[ʷ 5J&:p[moΓM4X>_{g맬#vf,CWjYdʛ7i eZ| l2Ri_J7!&)C`hNYfoXaH鎩(9+ݕ۫D,qW> &۲=77b@2%լ)U3UF7]UۜZfԓ*iO8Z*ƛQZԲ>ݦJU}NX«mXmHM/K;zZmoyi"kNuuM7}ն?ٽ{M:ӬtB0ϥ$yE߽zSNTnB)->L94fT6)#HDE7m|;P{)Ȟ̼J_KeZcN{ibƜ 06<rN\zrUm$"&>k<Roi LR8;ryllDZk'N:.Wk~5{V:@@}S՞msDvWp+,-" g$3su'[qtW~N6?X)N=2hعn2ۓ I@#Vn[Qׯ8on]2OfEm̦ yq ;E:KQ)hk4x*k1jΓV[meҙ8_u{r::}R!s l{`!.i2iU6:I[1&5xKc(kqBZQ̹jV%`z? m#Ju:fIoF&+̳Vqg_nOqWX2moC'.%|kVڙm%艊DTT#)DH4:*p݉ehۊs[^s=bP[ezsA ]9ҵ,7" adXQak_d}m1p xY.bU_|-:Tmպd#isd~aoa %;~M""#H)JNMvmVࢶ{ Y/?-f7:}V |Sهm//`|Rfº~Y~$#-~"-QLe5oO\[߸%o'&&"c,s Dゖ H @by<㕿*saO˂թuFQU_)XDۆUW];}y#ۃV5ȏLZ$V6G)T J&bvLdl$%{ѪeFyW=y6dyl1d ÛWƚ !n7]i14rT :ۥUy3:W\k^f֝fz j8eL`1$+mJ[%+8Hgcݴ|zu}+$tz#%\l LFCgگ;s34ˊyssdt $iINO7P,}R:&i႑ߋdb=6{ I@[ύ-=Ts:uoM 9w* ;,g#35 donn^1^2c7RjI [?o/}6pbOat˃Sk[tb@Ht4 J^+u-xXErҖ+Z<3>sÚYâM:3M: rWK`0js/iW]oZ[] FW<$NQ>tlbiVt^ʼn:&#hGqmXGhѐQ;]yU=-+֬3u)X oɬ[ ]OWQ:ƱVi*:;V^qٰT1}n0acTڗTxNEL$+:JozsԴZ9R[{Z{_EniLѬ|ɎxWyp5|o KnUps)Glkc8$+QL\#wgYҽ![gfŤrŞ;[mo&fgYhEIE6BrQlGn^ RmpPv74a3;Lʣud> C\dny&fgY .'{u>k߷ƾ85Ӫ+ΐ|p,[(SVZ7}強mRqݛ7"c^u*_ ƱcIsO)a,T:QG) tm/>Ij]2+umgWUr@L%cyi,eppRTdܫj]M4Ǘz[&&51*:֯Fkjdkh5즚!&"fU%Ǵ[_[n]jfkhc&9wlӤIlsxb^yCY0ڊYIj#j\7Edz״V6{|_soY1z_k=]bk_-v^bms8Un6J7l=kܖn._,vϵŤb-S*l73Wv جV4i9NO؏EpE(n2}uc] Jl5g>]k L97kjRVc)E-`i;p%U=my?k*]׷sv9x_ۆ?ޜ\11T/HKU>E:K=K oxf^6?>g?\$z\nӏ~ܛłnB|xkን J7\|m=@٧-Z33ayeC'Vdki'V%+x .sμc8ɣj}v-`&5'Yf'87|_\.`>۸NJ7! ;mݰύ# J*J$F޷ZKe> [:qeZR~0;n߰;?ݡl"6{J$kY'/7;"/DtV۱=Y7E(11Lkѐf. /p>&joGWoZyޱ[۹;sSD:5EY8Ibng̷|\71֑qy xLsj԰Ks5LmV卹m->Ɵc1.99;KNM̊)P:\Civke&㜡_n㜡_o#<PVooo.-+x늑JEv}*6ZYT=Sڬ/q0SiO9*̊zԏY>FY9|y~Z!{u4tMT7M#,soGTm1YGu貨vdY='+O8J/aCsm_11o\حck9Y>|={W ֢8gᗷ#\IVv9j<`L| KNN86dw2+7QT[;cWCM*Pޣm=A-g g^%. a{cM"G1]4+e-e%79(i+gto선Sl[Tc0nFgXk?51NM%sPM#GؤKaŜ`M@ <!֞)1XGheEG1` ZWꜭk -*neƈ ߓy[lv^qDr2^ Vzţ2v8-h)69ŒcX˖N5n r 13Y'I,Ⱦ'b;kLygK+ܵGiyB/`11r \>JJ)6 \mVRi%ŝ[Ihׄwk|G՘k‘g]^ dAf񜷿_.<]L6?־#l s9e'W>MpVko,10inj}1M)ѣ4ou^8/Mv0b0Ѭ(ĕHy> u๵uGɇTPy]uk6Dɴ^Ӊ_m=cz!z-CPޜpyH 6aEe}sLSJy篧npiq %Ǫ)]Ž8-55oO\^ '4ayגZi+uKѤut:%8| -Xfx)rqԞpìFXlʒT:q-_?ζ-Y'o YnZ1̷8R;i%r-I5LM5Uak4YgÔ*_+Ec#,q4YQ 6i%SJq,U?9G.Za$tl8~X;xmLይ<8#X+\f~9q0SNKw"""4F@EkN)HVH0b˛yqR׏;FGo5}c[Z)ï_:y qIb%fs˺99RQKmO_e~G:Z&'oj}9"}&4B{D&2H1-/A{thݍK8=u{o}g~g?SxYt,kl^lgz.EY]r({vicObaWAlpl1=k5l''.MHr(V/aAi胛i0DD˶עսGr臓6ןvm> ֵp>p(/aj˷ӢLZ.Bg"EaѤTʮ40&[ohkQb[+ך攮:+ޝl./ {ٰ L9tUs̞?-{p6m!w̍kM6sŀ\9  ž8uҫ]ᯆ*W!)oe kqrt ZthQuy\n-Xlߊ9Dˊob餩}&sx+Ѭks,= NkzFJM' UQ(Rqi<b# TS8׭= o*Þy3jd;E:L#mKbƢV1=Ҿ{Uݯ} y/lS&ۅtzo=uԓW {S^]k5L i-0㜗y wm~fUرf w,:t4\ḛ_#hиkJ+V8D)\uR4rl#nb׉#K{zc]ѦJUbyx8 &jg}}Oq.Jmƹrc2G8^[O?vtVo}ak4QXܴCE}1 sM\o%'F&i+i0DAͶ]ښê{wZ()'yVfͷ^ ן:'YΈpjhϷ^ ttmLڍ3x&v4rXL40&6;;}G-e%7mܚI`TANMva$`DL(wc!R9MGr[yM߹<2X Bk疕+^žYl-o[ƖܿsicXyW-Y^l]oSrHo%o%)[ Z"Ք]O<^3μvNڀ dd=TY vׄ*>=m)" '4:`s0nUk,6tHbbo-+%2{OqI?j}|l޳ޟCX>sG}sBz -T[9@cOba acB̓^I*ް|@ 'l8F }]eck鉐z|䞓}pRt~2sn[_-ki5tY~_ngƙGϣI;dcOk0 4FMPs^ KCLzʷ&yߟ>zuSsdy~7Ceǣ}v/m'~.n1+X 6p'\xqg1 qMYIF.O$DgڬC&fgY.*)$q\slhfhJyvtM6zivADbӥf{@ mż^}\ٴiTI9:ɽ&'8ˎM15 fO5Q-m\[0|,}0m-#1jG`9cZ+ v1i\uG9~ym/?wSsU5Ua%b:WL~KV\u{U5OH^OM o|7'i \+ZgM"m4fgY.ףA6a?NZ[;R)Q/pk0z2TW梳q-Uۊs[3TLбNh7Fܪ=~l3,%*0 VmnP]1>ЏTEz-9r䜷V08y&.+k疕+{%/#$@_~m1ֽ1]6^ѫ{JDK2DBpf&:.^2c)ߓXs8Ѭkq/z't8qF\Sc)p_*_(mؖq~Ž ك,;}n,ˎkޱhLj=7[y'4_\&zZ]M%(\3^=@ t3c^auY8m/oM?. DţZαd/pMbY46F2b#KmڃvJ$͋oٳZ)<9A}ǎ=k?ӿi>{{jɆ?ʥh>n=d~Y]6Y;{t6x`d 3HANkB&j*j!T]9rs5^jVdye6B5t9#%P[чۯ(Sf6swr䘏!j:clj}ycV¾Y۩o~/:i#K+#,V U6Y>l/{S\m-9s$[t.C U5d%%u/u'[$%TpbH;Fk8E #we>qu[N,'t2j+۷wux~jgJ(QRSThۜn[n2RY>Zۜu>Y>X)h}v~2~sV}a5ؓSFo[ͨj"P˫a8#=ƞ{kL~%b)@gXJE|ܫ>6/buc%┵ʱ3?yk⾵mk<^,7t7$KT~mMVX?#fһ7Ϋ\YfpY|Y'F=>q!WW_7ԍ)~-=xN'?EbٝyLF>Vm4L?<^M/oo˟xzr^ S)՛*/|Wr?3^-}w'~9'.%dv+ҹbm^x]}5-EE.]uW\_ XAm5dx`Tdx]UE^Ys5V3em]C#qb`a{6Rkr6l$KP^HØ g(cҞ+݊Ǎb:1ܒ0lbgH주kOy\淎+Ϣb͜{ :sT7XYؖq|C[k+,|ǒYa{QjQn-:i?FU6-L="xSVԽSYοVfܭmXǰZ/: CQ7?oa/!DcZk[>ڱYQPr!v䤻S=gg+p#۷sڴfˇ ~"2g{f5X*% ;RY4tJqɹA&ԗKڏJ4ÖJrnt@#otm4wc&mq%9F)#$6koH&KloyZ}ejڷn0[~Q~<謗`!<)Z8@MTbQRTe>}[խѬJs? 6g6²1ݵLT`׎uoc?}eb㧬<ΧMsO>⟖[>龧c_e]%B_ ̺zū:e\ xDsӤGxy)R7s,TGM=λQ{V4&#Uf"bbyJqe %KّڣW3 ~vzbˮLU`]ȩ&O_]Wpvڏ{wi0^2៪cśjcx|oϵ0^ih~/Eɫ[DncN4]VV2ioYK2/o=LE:gZ~)11NiFkc=$eJROӪ~XZbsi;ej~_U=mC*'5.PNhi2q8ӺىcXn!Վ!;sZZQ˹jV% `:WbXR[vqD>YZ%{oz}'GHlPFw?]i;.[9#rɼbrgc=}Yo?K"e]ifg8.:vz_, 6/M d؎nGMA>.Tq 94_ a.EEnJdvr'}/lvRtj2hNmhx_$(fN 2|8[Wj-GOR.`=/NJ]QǦJ-KMmL0͂Ie^lm-:J.)a9Ҷ걎p>ƟcĹ]\2Khx5VyUk2s1o={-O9X;}?֞^l{J>PxWNp}x\uggOP\+jJeWInἷ޼kq{*^8`Hy pr'IՉ*BN2R[Kob uQjZRY5Pdc$G^ڱzgRjOIY*7[jWRϙ `@vy_ bx…+ms~4.Z1/it.<6KZ VhVuʹ[ҹ+xi5GW[ͩƟ}τvZ|\b9e?&&'I"r<2H Ϯe.,քHkά kd|iDdX^!n-I3xBs}"ewrtyTG<.R`xf;Ό;mi瞑ua&B=RQ-5{C`Q; m1Dwۍ+4At>8v@\9o8X)1_Og"׊UtW:2"1kNkz4S .&Gvڹs()84W3M6&sl3:u<_*NuÞmgXErҖ+Z] jVxEVtgN2RIT4k/U1oJ\T_R[ocs%A>'zKi(-J5qǛs+7j=^~V}o[ĺWX̦ڻTR\o-+_U]7ͪ)[jޥ=hGvjJ5$ K-m!sg4WnEk3=-FYW9k4s7+ieQ̻zk}1G=G\ ˛kKUq$2j}!,6Ҏ H^ I`*`:Ӵ-ygWr*k]-%G`Zyyׂ'e戞VkƖEպX2Cp,G))jOXR޳KMgpY*ƛfLRo%Z-IV}sGkuC5|:L#%'/4^mdҗꖫ(3 z -Xx5즟>.5ChMEv.*K=iB,;:[nն>6&5%a˻fv%ǰ Ȁ~-">k=.3:2 Y]%Xͪp }CļœTYS'%+(\R%C-+-2` %e%ETGQ{~ty)3y] -{5=1qO2&*#5DVDxMΩ3Y`_ 4|Vw#E{%/#$@_OG|Z{̮rώ;OhR'̡~H`f'bc 7~ߓz&ՙیcԐc,G>kLv .&E~ܶ5̤f8ate&c'w,,5%*[|+vɦƽ'&-883jnƱjdqϷh%i*IJp p.kJ5fil3^4j, Ҹx{P gVҲqe84jOj}.҅"x3ylxUm<Ykv4z&{Kv% bg>jٝR78`%F53_HviytrjiuW"@(ˎ՘)&1lw? X. E?$ qwlqLMM},|>RM*뺋j[؀뿩16'? J<[:88#ɴ:PYTU}<Wpg:|>LR yBvf;a&>}n|*Z X.jv/&jիWXZZ:r/\hv\.ߕpRjVP(sBt]G6HOZ\gϞ%ٙ $Gu]H%YEVCTBKmò,4HmX.RZ&tBC)T*"Ldi- B8e)6^x۶\GPBE^T.,PJhٳgE5x=C5jKFFsϟh $!44kYa ^m#HHiqdPsuD_~^1 Y[[KO}b{{{۶Qcccf]#D۷o]ႽD\Wiccc ٫fgg#,*LMׯ_wMwD[3TaݝN{[r~ 0hЦ]AM2bAkkE-EQq!0 8VC}@\q`stymb-v׻%QEyk7֩yoq^ֺ0\ 5xz@[```|wG PMeQ|}Ϛ i0M3-5r 5Mkz9*Ki=x8KqΟ]j;[d27oRڗ\.8bdDs^4MSP\}}?Q\v DBW\W:TUsss8wܑ !GB[cnnҾ5ʻgffp۶m?:r윞~8΃`v"qF~[?p$<d=NRl۷4 /u3̟ʡAj FTUic2D2/^U?<L&ظbh&(~%XxI\]ظ-;3>Co]B4IENDB`images-actives-html5.git/src/share/themes/accordionCloud/img/eyes.jpg000066400000000000000000000027011250410645000261160ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "i !1Aa"q2BR3 ?jzݙ]:0%:q g/*; %?xʸXC+ȯB,FjlWVqϊYZVLmQieb|zq%u>%=:]9n|{+ \_F{ {ް~Vz xCW![S1tic~S`qm]S]\<4M>hK \`ao1UӬh+IAHerY \b婖9;;images-actives-html5.git/src/share/themes/accordionCloud/img/eyes.png000066400000000000000000000031451250410645000261250ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ˧IDATxb?.Ā Kr] 0H]:,wm'@$=`@CZ1 $7: @didf?"",dud4MiB1q0U⊬ SBJ'ǐ؟XZ b9 Zj$ πxo$ŀ%!}#dk@ 5U=Ԝ7"2dī)bRߤ@z2X*~B@l@M˺|bW )H#3!XOb PK"<&2Whn$E,B-d$'S@]وTr_$5V1o8ʖRԣUG.O$ .b(j!I2І7(nPР;A'>K@| y>ޖ]l؆F=FiAh@H 2Lh B}@bGGJT1#T f@Π{abn/ kd(TNJ@߀;C hfL@-V"?9"PoP3 SAXB>C2>:MNA tpZ gZ$5>]x pB 6& [mEhVD vqo@6h#xI5!X[*mIENDB`images-actives-html5.git/src/share/themes/accordionCloud/img/eyes2.png000066400000000000000000000023421250410645000262050ustar00rootroot00000000000000PNG  IHDR6#Yc pHYs   cHRMz%u0`:o_FhIDATxb?.Ā%8261glbHCd``ʞ"C:u1b.@) ЍU:u e00000 0 Jalb`lbXNt]* $0B bk(6Db?#>s0$ ăizA50XX60qq00 7;pp΁<7(ƯÂ*_ N6ؚ&f\aw{,dM*x+g--1ZZЯo10;l|G4 L0 4=R,]9*'9Y[k'얯nA $R@x Pd$m4!($ 5?ܞdfw|wԕ3og).>S.b1rpy_!Eo@Oi1mu~ 9D'G6{t8z.S e8oU0Cgܜq)$^!fǾ+ܩPF/]ⷬ xj+TR`KC8LVիiwz$!K` #կx*SAXSvJ5UL_wUa(& 0 5Pi[zVf36k̽vIO,uD݇yuJ>eMjk]4j/ (FZb40՚;,_l߈/{ d5!jvC6 sF}q'IENDB`images-actives-html5.git/src/share/themes/accordionCloud/img/feed.png000066400000000000000000000013251250410645000260610ustar00rootroot00000000000000PNG  IHDRaIDAT8uAhTWsߛ7dĘĄ6m q *R)\:Ս !* (F身i(H.ąDJLb&޽x#^.sGF/ʝÅP5b1kq "2υrp{j_cB!0 &4@{Cwhhr-G܋1c$* H)CǤƯ"v={Nt6 &4H.N#uAo!~=iPEkBDD6n_>$DYI#&#D_| Q(zB'7v]MK<#&. R&{Ww`qYhqIV;*Й1V~4Hx ڶi$_"|ӦQ<>v, _I+?ࣝGi@Fс_ b4 [J%TނM V0}Hxol4gtU46ly,, L[7>$/?"* "/t ImFTV=i&y9E2;E!'ܷv%iFOoBGGcn/@3M4QR8NFPc  AKH,s2]Q>IENDB`images-actives-html5.git/src/share/themes/accordionCloud/img/imagedoc-darknoise.png000066400000000000000000000057521250410645000307130ustar00rootroot00000000000000PNG  IHDRtEXtSoftwareAdobe ImageReadyqe<PLTE"""!!!### HAȫ qIDATx[ 8 yEY8f#=,gzO3WqS}Uy"psz~[fX21S 5>}OEV Z} {jygHj}Dǯ{r̎fp֙}ǚӢvk~gM}1ưhIJ>fZF/8+ɲՆ[c:E:dTGIk~t܅ĸ6°)DuF]t8R!vhЦ 5Pp;QW깚ʅ}Mi DžJ:-:kW ӌu.]*FŚjX JA 7ѢkfCTLT:l,ĦսI5!LU^kͭܢ pYwSRAd<}Bhup_iQջ 3 +F[ց~Rd+5£lnBB .2ҀFO>u*pV 6p>)9Z}R xڍq 2hl ಆB ;cex$\gJ1X 1VJRqj Y: q͚" `\#M3B[[KS6O'W&-v IGMuٔ;jb`crs}θM'cgʞj9"ty::TtL)CѩF] EʒORJcA M"u%Jj!MiDjS -iғ$q\(9rscp 8Fn3)tAܲ<ABh+tThk\KLj#G%Cj8f,a_+qœ4# v!8Q9ɐo;~Io{g2V:MjC#Q>) r9|/H0@h!w@!ЕܥtO|')q< t4tO4yP (fw4N(0D z1Ҭ1@3+\I1 Ajq$ 4ZoMA:c<ʽ+ e+`,UkIg^|ls1$Ҥ:0 "?LO& UdS\?23aG85-IVhF'<`k>uR=NsG>]ȯ9)\.CI0ŜRĒA\d ɚ5&´9ڑId>H釼$1j6’v07~w?YF2㧗*cEl*u@|[|=iL(0ĵ=n.]@(pCArDt 㪜9+npGL,w^T KdRWOprb-9z:{OLԋwW+-;? 6 Gv6u)KSWxvf0FX-P 9 =\*J~rVp~O79SF̈<%rjVcۃLMt+tw%?.itl!3IÍO10EY߉72Umd$TYa4&FӨ~'9ߛ6vwEZ( $V9/ 1q?$ڠTVȴ)A0DFDŽpI VT%\R9d<+h9egw`z­[J "!it.VÔ$퐯0~~#LF<# }([eb#]/<~^o0MKcΊN S2&S4 swΝ?aKOB +(Sޙ^~pZ/ 4ۣBݴj\E8G8:zomK8l|;kW`֋W+od~Nv\>&E{J~r MZJVR>0\DtCHTm4rV6]e'sJ%`dcIo4^VJήL^|!9DT`ߌ0=]Jgo}hc]n}fQ9㷂I,L'Wo ;?v0~Jρ Adobed         #"""#''''''''''     !! !!'''''''''' "`!A1"aQ ?[I7 o3yxnhBc'`%̉z͈5p4kֶRD%d|,^6ز* L+փVrgJ[iPqp7=qV:YPW1>Qm:7M<ԓ(0m>Vzimages-actives-html5.git/src/share/themes/accordionCloud/img/infos.png000066400000000000000000000024221250410645000262730ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp *#VIDATxb?.ƟaD 0yN@8;k,#2 :S#wوd; D@K^hLL3?@#6A|A  S-b-~u0? i@ j̓8#'5bb5!h4S˘uw->7RRe_ ^Z'}X!-=hg?0eq5ia@ߴA"ɪnFKg@5Άm(zlc1> ށqP!뱿8Gdv9IK i8q;1Gc( <2?G=7%?Qx:'CT֫B?rG=F$0;^IENDB`images-actives-html5.git/src/share/themes/accordionCloud/img/infos2.png000066400000000000000000000012261250410645000263560ustar00rootroot00000000000000PNG  IHDR6#Yc pHYs   cHRMz%u0`:o_FIDATxb?.Ā& Q$I)b"AɁO pG&NHa%bjdl.Ϧ^j&G9Hj\1c";-Q Ha c(楩e l im_ i t3H4 `>#2&&hE qC[L * CC+el 5 imh!!֖]Fbez~ڲf$v-+Eb{Բu hA< = @ B1R&)ƣ؛X(-,sv1nc!e^3[}yWv*z$#Gou-ȋ/9rM`OWR{f. hUw ֛8uޘvF`b4zVz>fbj*Ҭ>ką,2-IENDB`images-actives-html5.git/src/share/themes/accordionCloud/img/meta-doc.jpg000066400000000000000000000026451250410645000266510ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "b!1QAaq"2 ??֮\"`eZcN@,6I /;mȳA @sB1`!W9iKoDoy~wa`\l„OSXڋtm,:J~0h. "N|uAw|z bn 8H*h?Y ]4MoK۞egm0ZIj4RxS n\tIrjd' g:IDATxb?.[aF40#6p lb$ABrP'K .p\GïIrx. L DN`s"//E?g$k9 CٌDv[ڲD D\!@O~b)jƿ@, UC&hz/@ C.8@,bR# %&eS#DO˞2k ~K.v S/XCe@mȱ g6G=61{Laćѻ jT gЪrPGبh|cRc nTP6Trއ?hqH1}6 3mhdE8ঁ*IENDB`images-actives-html5.git/src/share/themes/accordionCloud/img/meta-doc2.png000066400000000000000000000013621250410645000267320ustar00rootroot00000000000000PNG  IHDR6#Yc pHYs   cHRMz%u0`:o_FxIDATxt Ml)$X=qITwY2,:*/*0b"AM bfl,A/I2B8: Ckt5X5b `db&, IN$_1 Ehbd``xPk;u ]i"";-Q KÆ$iAj>zEŸe,f ĄR2BJ[0( zxZİNeM Y+Ro#Q˲XzaiSzZf[Ke(% ZCP An %hR}ܺlؿJa*D^SED f;-]9 e gyyN VX*ĊR( <W(R eq UT5mY>)J6*]JĞ#V lOkq 'MRo {G\.4S\D0˅r?DbS׎Z9[IENDB`images-actives-html5.git/src/share/themes/accordionCloud/img/nuage.png000066400000000000000000005102351250410645000262620ustar00rootroot00000000000000PNG  IHDRD;VtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp G<IDATx eYZUWeUW> G(0n$Zͪ[@It넑<**[v 4GM9Fg]@ݺd>(wq(C;* ~:|"\sUi)w7| >ry Aɣ)fTQP1n9͍XBz|I2.zέ gR';\G1EnPc )V,RGPNQkY ~Ev:O<"yT vU#yY@*Q˨1;||7l8hG ! JfTv$:G8>=[ hƇHߑ*H <8e@{ U̎2@!T{77wQӋ~DREeLyz:8pT~C1̐y@2^` CM]kY1u5=s̿obK@Na3 z٭7 ɖ,.ZQuU-)?C"7Z tA~?an%:Z0T4ŀ[gV+FRg@ǡ@F ($@hcHZI|Dй9KFp+ˬϏ$zwa׺{:UOG5@\:sXφk _U^3/p<IGʩ;d>`ȡE|Ry$\xŏ{,J mCz 3":揶u2Z ;4 T璭[źԊH̢M@%n`pb?1M@r*P}O4B"̈1{h *Y ThJwBJЫ\EĎ xiP\pΘY&:>ÛjU,Rxp"=d $I2p` 33 ~-"P%UhxØuPK@#Hu^2_IM,n=k^2@q^~Ǽ4$BB> X"I G(눑m,E $Z:5肑<*r>"yPPCa)I$7j? ^u0 @!QFe*:VڹbuՉZ<($8;[b%60@8Dr$:D(@E}%fIGp|Ƽ{@1Y mL .rs Sdu"NT|ԅ 8s|51@KlHCF(ϨXM2_0N=N.@,:Aɣuߑtܭ)̡J$tK4J@y/T KCLTPlsdp1ydcdٝ4BEk @w{pN;e@)!hBU+Hj7{{TIU,%.ue=P_޵}4jS]$7)k2#aZv8Q>%%G#(Yt׼$ F 7AkfPp:%kY$.Zcj2{~T C#") YCub ={5VY#ywUW4A^HҲV0Rɤim ̦*[n2Lyd'꺠:~Tz,T1Đ>B F?w%T_:kp+O-?n$@Z4nf~.&") n=.?EDgfP0nx^y-Aa<'Qu.#h: m`3T7 0K*$1>S*gI)a,J REB*qK=*~Ƨw{ b꼟,EL4Jz+qt(+yO*h.o-x<)H0 hNU4$0Etᲂ9RN&1E(Hvx ,$K$ô)SGF;{et/f̢!iG2I0:-g }^SI1  ﶺEˆ8\I ¾iΐﲇdJ9WV"OO|CGw$ +D:J"Hk>+Uhk09z (İ*OaM]C"7Q'-х !#BH*Wy |suO6>y(8酬ŰTeAknP[sSeI$PRI$FC:: h/lO 1G{ ߹Q [#hE Hs+- 1D:% (s3ĎG3Ӊ%4 CQR{t(8h>@ !%N?a>DnP(Fs[ %0Eh D󫘡i:3NwU29"ɳw[.?=Fda`7z-ܻ@Kfo (i-ի٠#|^a風YLI_! k` /aT^񭛦?ذ) wggZLu5χF n)| >#CrWL(\;YG ͆dpz0MfPpTMQMC _\0*Dgq5>o4R #0C@GJM5n [rmSIӷZ*&ymsniRl:ϺQ EåNb*t5G6 Y$Ӵp J)qΣ~̑;T,h;HAw2p;s)j͟5_y@tu! x$KƂ zF:qd;a6Ln'N1h9]u ),}f?@ pU7mj;.OH0,`%\bؐDbnz g?\KޑMCzQKED½x^A7HAg?HZf6g'%1ώ||ZJdrHEH_wP@S׹`u H AzPHZ$f}hbw6_ Kg+΄d(eV"Ih#FEaVP@IU DNp (aPT8`TP۳-I DE#:s6yc/J)dHPKfD:mJ=հy2l lKѡyt^TK$l?3 AJPHC"Qg[1{,3B͚wۘU U.!  HcU+ x8əAHAC $HAs8!tR60ngRQѼWdH>y5ޒYBs?[HVn=ɞjvZ(>e^Ok.gH ",` w!ōgwQ(;^aGs滐$kw ciUZW2@H]|IIFw H͡b^)-uVL/X BWbvB7w12g7WeXXgg?P US,cXCr_9ڊUMUl?v#GdfHNw}ibI֍'ݰ)Fq $J[懒+$deVFU#@P`]f[AJ"1P(${@8|JΨ䐏~3 bs'ͫj`\=NsW9hx4JkrI2EϚ׍>jTqUwSim9Hͣ$ ݠ](;(JKrhB'y/TVX$ p1x< %$Tݭ ,+UG{=|t #;0}l P(=8h58 UkޑHC9s*9 ЁP *$3(jB0@:PncX9l>^>$Kis(܇ hT' H %Gd=U$G*{H@N%T] _C6 n]7iWu hh%%eTwuحD^c 0hzgGxEw)Ww03OWWnΣ y@G@ u#]5$p}߻IqKȆG69B)L3l4h5}a$lhz4dB ?(J W@hU?m^l8 9@Kv#dK7a sdS4oFrZFG@RDAVUH[OyBu&ٺ%y*_ Wz|2lKh/;Uq"]mmAI5P094J4+Pus z wNG@1  ͚#y@|-^v1 +(*٬gK A>0QLJqzh N PR]w )1DXHI);rv#Y{K:i @j~%e'zцo.$$ɔC({ C|:US$:2%Dġ@ݔ8 @2[2 ly7D`h=Jkm SĂ-G 0$Hɡ@y'"*N<2W~fj$`ЁXPGY#+y$' Tpt#wŪI֡*u=.nh™C7$`tBq86 yG7QPЋ$lX%ṱ3{pL8YTI;Iih I߷Z(i(sU;WYH9S탚})hnp3$19(ZC%8JBl2H:GU}|#֠H3U(z85bu+G篒o$ ):!~JFn2?" "C HAL:.ȳ%&E@@%|E yn 9e:sT֠@j#Iq&|E9tO憨\Y=V6Hq ,ҏxʼ ɣ$#0El~TG1EPЁ9H@U҇)Aݗ*# yE#I-?i~1ɣ죂_In[F $d~#-@W!w<ꖹ.6T%$֝ kl@rȏKl HR䑺u}k滏(@h?٭OUYA 滑e m )ivqS(ub, T)~̑yDeH Ht0M/\#Te~ͼl!); 2_9͡sEIs@ xCD $ 3 .11`>J -j }';p]fQ^Er~z;8@ $H3[UDf$!i+2HWGh_ɞF³ $kS|SN4hS@Ƒr9rcF,<hBCSIDf~9jӍ@x:\HTځYFsaXPL,$Tu{ ĀG*A3~݄=':}-{[(8h*:R% ]%2.&>?f4w9TIH5G™rs$:KFtvvXFpȗ,Pe0R`!딃/{-ܷ:hFYHZpԚM%h4Սt|P@@((N%L4<)-R*P?:+)fPv(tP -d$U[F,Pyɺy%x ? sJPUiF9i.@hB4GsHNݬ71E" |-L #u ~,@>ό3dЪHg6ܭ)h9NB$-F1$({2@H>G GfԅtS$rFҥ7 ӆ1C().mLCɣcn=ex{X+uj@pHu(@u18Q8QFR*S2m vh%UqHyT$]3YI EΨ!_FdNT!. I@B'T/YY61IbI=.2\dBՇ<M.S*/ }DI ;>R) c>$.JΕmbXJfS4 @7*5#DDSN}JF8RI3,Pq™.VU3k>.`h94jo/Ȓo3|D^Ou_i$ $bP ֪['Ѱy*G3s45!HT=3vdpFRa .Qq 䄬!·0FEɢ; #HBH|&R+.]  U$kQW1"NdK@S(5Ԋ:/ʁ ~* d $>_Y( )h+Wh]ts!P7ܚ MlcE][n<"(e-cvDF(}0-`@/C'ӎ.:K.<(& gĵ:V1ElGtPJ A㸑wH9uZɣq;z5(r"u]7/A s L}> sLsI*h>C_й8Jb g|:fhB jEaDEch=6ev]WY|P_LAUCR_ZFJ--%TQ{͘Kpv3i0GèW $UM%v 5z~52|&x.fc H1{:,ΌH" c@t9.ߴ }$#B7Oɗ aѾJu#q$U;]F%9!Cz3A EC=l⚥k P:lBz;8mE'EWffPZnj‚8Pv3ԍ$)0(L9^V̫;Ql hJd@jك5qΣ[ et;3὇DQɭKc;H!TA(u;8s:YRyRŭf#) wϪyiqL^s@;aX1"D8$4񡤑HnB΃g0.w$|fHPQBU+I^ .U:.SHۂ/}@N06H8t.PlhQ?"= CCR ҃;:a~dJgÙNw#@!K:Zԍך*t9aEoPIIu\Y)˪ч1GCDêbѾa$'m+KtǻOi  `xV6Q̕ 8p^n$](%Y b!.Q]07Vs47Ǝb#fTrhO5 D]CZ ҁplF%n?2@'&Qa`%[S {խB7N4+u%h( $HBў4gHe瑒ɛn]6G;EWk++F@6(yn3\:_[ Nv  3P mT(CG||,vo7*1@6cfQEGO&!gNTf59$8RȍgP7x bvB*~{.̲3Ƽ#B hQvT,"6֋B9EF{M:W#)qJQtQ@a"V/->0zҼ7ɣl֫ncHdE Ns*T/Ɂ!L*$_' u#bzp*IP@_]HF7M iz/}q| A H) 8r|ab2~U+y@cJ":T7m>t5 p𡈬wTC(#k!XP$ulƳWJi7ăԝ) B+PJSqC 7@$SP`k$ ] 4#r,5IɤSa)iA(]h1oC$1'UK~D\}#SD3ٯAE_ /` h!IyƘoE17 ЁFAKn}0bT*o"1ALQ3 ڪdHlB$<bC`%>V}\u$:Ux%G9$hE4^VpFԡ((pvͼ#QGQ\ocQw] ~5 !wB(}'@&ͫbyyټ6& ZF W`Nzg!r4oP@*b0G(}˖lRGIR|BRT½PI$ 5U,] *8YR>hT)xռ>>@/7s$QWbK(hatSs!Vl!z3Ć 'Qf%1R!ʵp\ź|Axb>d^ _5HUi7HIrg");8`QPD}MQ@mf(Oa3;;JaL) w@b^p%m%cxPuUo&=QY@`Spn3TX}&: A̺Y=m$NT>1@1!id386l.g Uek.LuoMb Am5b4xPpX $fAR]6/ {-,RQ P=@QVZFzՐH# 1Q,RS=k${@)dⳏpQI1d~@PQˬ[oCҌ (hHBI^0_ G4FTh7j4 S:%QJ] @^ `8>F'$MG|-Rf(/ł[Fg-Kw$Y792|kEsG*Gwww_,n=յyͭ7~ߨTd ^%00DD@uU {%?T)Q7گR#A"t0]@}w3Ăhu qГ~692i^3?)@LNNoڭsKKKtttXoo XwwwuuvvVFORQr;ܺÿdXArȹ}ͭn=g~{Z:&q|%Y~6䅹(ILPLj.Uʬl3)j/9Hp*QaĈΚְ[=JQN)on@ 舒Z1lرcf?Y\VKp5qD¨>OO&mCD惓SB#9yʐkUнlދ$gDԂ:\?oY./94 =c,{yw3ST7=A&iE\̌:R|l}}666Kˍuttlwuu[{?9F *Dr'ܦ w2e%?722yGRyޭqEn$ǡ0K*Pw{T[2.ڒ{ T}(t40ZH ZGcA6/ʻTw)cZ+w.//jF]JzWoG"7XↀGNrGGg;|uuݷ\w]-b;?'&3ǥcCPbo|7*a6a|Lt\7 jAvL3irx_ ; hRhѐHJ}WWWq `5xZVa;;;R? 1>>o///KmjjU2u ӭ_tF q5GBܒUP $OO<t CzW61G] I 印O}M0EMg 2FE@Gj,W X@Ø#S~}IW2ځ|񁁁vvv>qfoo^C{=w+}t?vuuͻ5o[x|ٙ~ڵkX>%vvvk{{۶lsswl299NB0ĩ:22]?Rh#GT%2ڧɭ≀Sz1GjpQ%r*EtÑHSSgw3ֳFAx=P $݇[vwwl u~˟jɓ_򋫫Th||%sLr{P.o```ѣkvvNJP@H?hI)y$̌ngFCRSF:(UIA@͔Qud Uֽ߼4Ԏ Y ܗZK{{{VںW244T-*Gj~~ڑ$:uS]]]_?$bt H eq6ǿ<ܭfT@ZUu]TPzХG 2>:.V'۞s\Pe {<yi AgMe >r˘$>[yoĐ$jIե@﹬ut_wƍk7a\f399YujyknݺU:uﹿgw#- 7778ژϞ= w|[?ēINڥP xIVt$BVnI^.uLQEtAE]/|Gf|)y$ٺȂ TDq|hs$4b2_xPc5ԅ.4nժKzzv~ĭ}~5ݗܿzvE PI1G>z~A)>lʚGF?>#<$}vQ;fN96/a3¹Ot)Fe{J0覻DU}!W /Md$n:$ҏnuM#yɠϹ+:Yu3gTOK(󍍍U|O~Wgggݻ[o^pa_gg'N8QgfyyYcCjz1AP0_U?7mj -@PϪHU1mY_hl?SfL%^?%vSTD7Vm~kb3Ca3mHjS@܅oSđ~^pKm/oB[!I);w\U-MIGjT҅7o^<ySɣjH'Of6&-̗̑C-.߻sFKW$a<BSSN8(l$A9%r" -]TH~u15kruo=>BBݨ83ҏGzíJRARfttDJ~IrNI7ns#,˧|,m}cᢕz݋}Pɣ,nMmn}Z+DDJ *=NﮅK>ԇ+'1C # Y @"TG0C g7 SqkJjѴJ;SXo>C|[ӧHEfll*wov)^moo1^ x~RƷzҰo䁏O0/O&=e~&j{Q@$n=HK-׎$|5 IՂ@` x4*\D caԱ.eL yGYyr$F='*[d J(}TDgg|i\"kΝ{~cckNuR0}uۭ7C\˗>:S}_Gb+R+[GSA^ĨDh(|J$!5i S@i(uĊ@RE)bfp?HVFd⬿a8q՘}ɢFB__ɣX]DvEAM ;;;<<<|~wwfgg%u˩9oܿ秖ӘAH ۷o? 8 |t*0|=8':i苷T%3TA {suǃվ"=hzdcF@+EsŲE_e 9y$ɣX[[~rwRQz64KjX^KxՙQwhmooWOn}ѡ?q'-[rH//vueF>H A ]rrmN$i*a,8$e'3fƂ$U_5YDQupnpm B]Β~=k̆˂O(û 4׭%N8_jDU՝;wp5a400tLɤRT]՟+J ޻ݟ2HD.^xb>Ŭ$fHNM zڃ<(@UJڇW'G1G)+7"hzOf?7I`Yt&~ (6@J7JM* Zn}wÑ#Gun|ZygVVV!T0Y픐Ҋjw~kRxKwXyt8`p/xfEARm@rKfTByOjP.kTA[n=cQXNBUyM_w#ERO/h-DJΚh? ɳ{ GFFr{JA~O%>\M$I2OInQ󝙐2<:>Uo;Ԡݑ}P=ə/v__t)tF龯yӆ {7۝K?}7_ȫlZ^ihJ&OF!i HDlO`x]HwSS2@IEM#<% \ B6h%ɭ?Wwvy].W:߳d[-IWIzoo_.JƓ.8. :.F*=}Z[[;ֿ~=9}Zuwt\sܷZ/aeHu!j~*UE0!w1 w ѩb~hzZTLD"+N!g{'@+Z sZ5ɢ(%SssW~fkk0RCwp:KVEH%cxp/νa ڜZJō;H-wH~Q'򘙯2X%/LBt}ӌ*%T^tͨ6o` $fVBHO'x$:S4@J?ʨ)JqQA%Ldݥ?y)H !+ ' B]%+`PTM\y,}xj7ڏ9R kmP*q+vwwpm_q_?c;>WXRsܹΰG<8p.ÇI{wuwwk 9O'$u+祛7oXJhPRQ`* t%"<بp[[[&=u wxs<B qoQY] Չ=kJ^Rv˰:9/[1`;= QGms>oUMt@wp}:)ytBQnOK@ovttQŨ,rVZ{[5>hm%K{ljC^FGGoV驾i{/Y:f,2Qm׊zm6zyf Rt~xeVG>nF2<<\H捻)655UM"-,,+gܗϸ%CirD$]%t ]2ʡ5h$ׄm )Z|m#(:M&P*l wRAX{»NSWbJ!% OYEӊ%*(e"%TXߦ%6Hj44|(J˴h6'eUP&(Aou_qIwvD. yH;b~7nTˉx:4M$>߿>rWŒ3>aՑtuު+䪑4Q0p|p(nlUe:#TBt`Lp(s A'wAzY w p_U*92XxJ;ݠ"k-DkXA(5@1$zK7ww~˴ҪK|LRm-\藃7fxrzzzv:i1( $!~zuSx%f|vjݻwy}ϲ@Dt=TH蛷_)YJBhMAU FʮT> : fw3gf&OSƬFj:HBc#EttwwoT*{Y"%9TbJ>)΍_YD1aCiHTɡv_2-޳G̝Ijpxʰ{}ۄޞU| ƪ9xXr%HɣʉF$j̇3G/qv1BM?i<\"LSD8ה? IT].)iLQJ {fW9$.TߣiBAjI-`Bw4l֥5m$w@T*^,TLѣ,*HW"I $Ų8"ñclvvV]nv8$-Uj)U Tr9+}UK{ݚQRԥ7A~0yUKH..8џG ꆺuV>= _~Wl)s@{u߉ Dw^a2l0rx'сGt#WlX cNK"un.L o[T=شKzQLZXjatt/#%EȴYm2yN˴։o%n2Oyi UFѴI[5 xzz:QzyK EuG}Ϝ9SmOL[h?П3|H6/cKPPo6ݻ,B;=c^^}+_5'Iv%,0)Idq&=yH}Mu$&&''bmmE#"oTG1ߝeǠ %׿Ͻ?l!afK1z[%U@sr4zV6x[@ԭ hG:IUI]WLةS3oH UᬪxC"=[ gs )p0OXB Xh@J'F;mL[\jb"ӖZ 4 Df5qsVTDuI}')6661D⥹@ U݈II EE>ds)aޭowCsyhe~ T j9f: V̽<$$;{9HÅUcrQ滑Ct38hrH =9 \FG"o 3gK.Z]ZZXjFb}ݻqUh7*bcǎ*!m|G3ERwϹg'Մ_֧'regϞmyV2sssV*yIj&3NyYVuNbHu^ _`{Zҙpc1w[4vyE)@dnq@J^YY&51䍉 !T:ܻI,:Sg @]8λIIrUoXXІ{%HWYFX4OYcusEpYĉf"s_`{QJȨ*!y1F1$G ~~_12<9H<c M GYR#*d\M+JJNz fPusՑkɃ[]1hk\\YYA,b3ϟ~:#041/_:DwӇNKj`hR`w$ H AcO I>zԉEUJ&r߭Y(KOVA$iXeo677jŗ*i^CK4h(!ͣnC%nbPWl-<I:.(fhs!W7sl,ݝu4kHGB|`yyY{VK CNWq򍍍";1y%{­!'F>$~ͫ8| HNR[]]&$ XԞl5Ў|eckќ>4/E隇)j;̣|hejt:Pl 3ԍoAC%<;B\.kkkՙND^$ Ix_)KP%saS!;mbb"jQ!GgԑSBWMMMUzv``n (,w:hJxʭ I;hI\5$*kAq qH ENFX ~|>c!19Rd"Up'e233ӱ*o_(u!A |vvkTommmLv)( 3uQ*$G/U]WL[mDAp9zխF-gy)' &@ǬjULQ{.u!iWG)-rϔ|$]# $]p DrӅq$YFJbcggKJҽ-mـIݗ:,c_H^(~VkgZDN@R'RZ9@D ɱ1/l9|(#8:o~6q rB qZ!wJ#sn3Mټt4zU,4mi1\6/Yn &8Y__j}j rK mooE o e u0K?coo/oCcJmmm}hrBZP`Brvo6&i9զ64HjI ( ȼI٩G)R;7CW0C}ɦΘtޱz˭LI7Jⴋ!:HJIB&W.E?+ѡqjƍӜ[sDrY{־ @>cIxl&G`ZP|dSnSG|Esfh OzQ jgIoHAG'RyQ\@$FT:ie2s7uoYĉU]՛7o4ѪLоk@ П5D3_QLu")K-(Έhz3GbJG`uQ=<2U>9RG$-!ir %vvvJEKֻfs]H~O wD%*ݳwرc3 ()ϙCҮM^tK;QGdskt}Jrl*@~?yYJTtΖ<%1pЂK.nG[^^JWu:>>KI iT9)րeS4TVv1I[PoS\2jA-?]HJ 8}T;l>FAn%$*y¼lI!e7+EHaHdp;֗Ek6:wBWWW[[\.#oGpIڎtt(ϺuaP%C 8:f/Hdny¨il\i#*:IQddUÜry=*9A춷 WHBb]]]O` yh>RUqϸ9%t-2Kdfh>[2CGfrt IMAus+JR)qZ$Ŋvu)k!b${NNNm3٭+niȚ`֟՚٢Cp^5BN(xҼ||ErjOBW^k8*p/bdA=gSjtK:ӯOȲC۞rL@]G͢z jx=r`XQذUu`0%>̼@lKJ<$R#h&@ûhW,ͰH Q}ed1՚2)2|kUs)hLJ2_89 twwK* uٴkRiԾV_tsst\=$&$711Ì'< (Q 4<Λ E)d|˼ 痄 GAAͰ\{7J5(KuZ}l_AF{ȴy9aCU<}dJ^P8RDݑ#GKӘrpa\$,g ]PGn#F7?( >Gw(J"d |B $SJΌQǭOCzQYGq9 Mܼy422@2(YRggX%Yg姣%ݖ7R8󶲲r/q9OSSS'0m6 X*ku#ubU&-"vsc9ޟޏ&k}ӛZ}fF3ofzr$ה;CC%6Kc\8;cxc!]5T ~73M.Zjs}WhI->_[ݒfQ]aiٞ 89 gNSZ\L{dGd >bzzzossaf07!mZJpX#9 'fG6ZXXj꿬d||Xp2) 1uf[wQBu9{\Y>)S<[Y+0q*}+0iܗL38f333+}}}skkkDisāaJ`rQBR=";;p)܁U:r GfS@x;md]^reRF Eq4ߓL-dq$\рeHAÛS{xˁ15q{R'n*b7p.LP:DY!9j6, ~cwr>`fv820_`'#TڼUa _7;;FRIFIHXX_QD_;ga*CHE͔jG^\\<Of8@1aNGh@  qP(/Jr79#4 *[C2UA!W»KƁL&hZ5'G`ddDif8r@dq#Z*UQG p2 dF$:}784o| @q@ E>NG(43Ba1qRh*z3B}000볳h :duLޥM2 yUWc#s.;lzYI5NKKKB#`' ⣸YHz k '#B'yAf29m(y&YrȻfFyDbOPIR_(g󳰰p𾫫kghhc9 nލyg0xUlnПL&;2QΣ/J֍eA xS@#U9-[^Wa 4j" xE)kj:NBAr* tַD"p,4hٷ ߯t'leoύ]|tt8h3}N#T@c:֔Kh>vB {ӺCy8p/|S@! L;cU܈+#mq uQHpsS\lB(dIJQ40wg,3/ߠ\,3+ tx(@@,P( Zov^aBQŦ\D"!cccyOTWɪ(iic"M%_뤾G{c lD")̊h%'kf#b׾{"?.=}ac; ˒X F٫mBPu}DB{9o[֝>>;;[cccs]]]Ԩ 3%nvѫ*!mX@Jӟ0@Bju:eBN:_ᔴL&@ZV[g[#DQA:LV5r9ewLXA* igʽ~ ϣ))!ĥP(V>gG>'V&Э}:`A˔y`@t/P $$ d*E[>/4Jɓ'׮]}sGB0x:#bB@:1}N_`=ntlkk+|=LmG?HlsL@qL!nOԾEeR G00!L9U .m HG_iUs3jx%,:3>`!!P(??᳢SqqFpMTJeUZpG92z߯_tuvv }dQawwWPZ(p :g !ōGh zi3*:x 4HX$,a?a6, &G@[k~BqjSs*Za%Qr`A~Gv9!Q $ 7?{Lzzz-& B-UΈ}UFaK SïS^V".V%ohtt4I񮮮FQN!͕3E U0)(A;ž''d!Ix*q`¾h!H ^18m dN\OH) |>ۏEKd=dFvvvdqqQ&&&Ϝo}>[e_H5O^O[rhGDX.$b Hz]6pJdHbx?^$_[|/+H>mNAYHq5-AoK_:Vtӑ|65=@{ :!P(?=q3cIgggz@2_y_ "%^QqPw:N#sCeP'7d]= yۡH$ZMVV_yduH#Fi $Pp@xSjšBJ,1'$ܔUcrJ]oS,9dC:BG8pآt)#]a2څ<"$ J{rm%P\ Z=sohh;1bّT*Bsߪ,oi3lem`,Dʔ3^ukVxA1[eX:Jy%>Ҫ j%?ӻϞ=7n`c8HpGDBB̘ Q gR8Df%T9~q ()T) (nP<:Gi 8%q6pMIl KbHg3X>󛛛!LR8V : )ߠʇoЦ(ҦIg|J.0ô_8\:UgOysð4uxP2ps쏍}?G_$8_2b ~.!T1Τ+*8{NҎ&P@q轧!|nBҁz>⹤gKP(S\mgOeguDȎ_?tk4BB;d![WWW0lPx guv4U==rA d%AF;x*?ʆx@ NkߝN433:l︮a'<`-!dG,,PGc24Qf] #u3|jHܠ> <B.s"84FvRMyDg?7A?Lo'R;Zط6%HHH^U#nY:ğ7HrA c'&Hex< ,zzzםHۂL$l9в[Dp*Kz6ńT(e]E6T'lt Mr:DdS|G)A{c B~g(]]]-Kcd`` ]wV#3zEߣ-F!{haaԃ#RD!8+W|g&)ÉSVzF:` ~SAH!\oUA#P iT8D_fkaB* KBidTly6 zIOf)E(ҌFEg|PHb`E?2}n) a2 IN#daԥ$DDT# &1($M(q9}r;;;@S!GDҾTIpwJ!PaM$*$"- 9i*qt]I.́ˈcSq?gͰGiѨ/e4R`IXr27Tt@;-?( nӯ6uêhRuҔ=/E# $ FB/]?XV`y =DB 8)Hy= _hÏHQ{剸 x5xH(WsK—AΖftz\4ߩ$4tH'FYlxRdTouumkBYr[Qe"蟛V,27XrGׇctCs1P+8 pLg?rzeeSHqt'dn'YjOcQq3atFQdž^,CHJOJaS xGzdJtz r:hkJ!}L壩]!)̠;JFu(>@R{m DF񴸁W !(k FuUc6bX@,LB0(tdҸ I|6U aEE~('g}}} ΝуǾ2 D?ߐ .u #=HlSѱ2xNF_Fw=lꮄ9&tT+Q|~aY PSL勂5gKc_uTQ˜BH@_r_V= ! _j*t:õZr]\. Y_xҟ$2t a6dN7qv 8g b:I8`gө|Ճl6۔߱ O8㟉uV"d%XB $84`eAQQt"C>!Sz | adhe=w1Ӽ.od#Ca%=L!NwƟwƗݭ;67722̬'Ac,pu4䄣>o ^?Q=ȼ Rlp ,~)6J挫R}:Q*z}}k{zzdhh‡5m)8㓗wj$D1n  30!Ѳ#Dz&tGd.RvAt[!Vz}|\/c$!:/zORݛNa"e !AJ_opI@$d!\.K"v.J -|z?k׮]:Q󙫝T*}y {3 p!ӨO;LFH'l*L& oH36Dboo?]__ 8Ny|Ak`C9g3Ho )IgI BBxg ʢPp !,W riKm=\'n@DIA0 mq %wGUnp$m0~IR(ewM "46D_i /yU8 8BRjEg-D܈׹wϥ#`0s/Rs*KP"^QN2;WjSsT*;^eH$&OgBa"|_266V$"ԝhqTyjèϱ.@Q't vtT*}??N#3I8NӧCߛ瘫g"@4!uGJ[ ҁ _5=a 3s*p =n pMKΨQ=S=]3 :*#MqmL(TuIB ->;.dVDjH [Tr~r~o;I>Q6 3m0ѭ< k:L!2gs`0*\|` xp͛9Q 5V2I%]݋5^| C7UA Ӌ3yHz]PS8N^Q!ۍK9Lp6GF*8mL;cFZh%&3V}o"Xq^HDܬJOOEjZwdJ)?'0Y:eip&+Oq@jcD#(aX^^C`||<ԩ-f %`[W8vTB p THz35Ω8n-7vLi!uĩ{G HgT/6+>Y .[I |e"Zv()###m덴.KKKu'!#9d27tK ):/ |\oTeL=ȥx' fTuU PBF"5$BZ "MiIc)&D%d"!e*pQūqd«f1,w0diHwr2ycI]]ͭG[[[zG2uww+W peՅM_t 5({A.c*P_?DRS1^pXN:DvҬEFL"$ػd#aA؄SD C0#ږ5ó5baF~ڦ&Qɓ'=TD'͖3LGWWd0#6YH?"#^0(Ih, 󛜂ς>Qz3 h|%9þ ^6%0 Fzh+_uF!oQx:\eanSEaI༺6L@COB 8J~z꣨o $ھ߁@H8,)04MHՅCe0~B/"yUw5z#N`A\AFzfI=٠ eU 1zˎU>:|Nh 8PecVoB!! ϧTT2ֈ[IC+!UH) C]]]ߚNe D5ؓA~[\,8Ij!JUUa^:,UK;j@IQNKI0?="wrZ $ .ؘ7CUپ8Ɓd]zװY>:Oг .}~yUc[|TKsA՟I A~ 3~"׮] bTz1 t˪`t8O0ofuysZՊW 윴h G2kbw4)1bp3/+y` av 9cIXRBځ,]0SaDb46S(eV=p{{YHa`4E/mUaDO8\ڣCȹ1 @)AA?cq#)qPD恄8aҁ `B>g>=Jų_J%YYY#@"ᾸSF  z -T6'$*9'%!К?p6M!g8p'nnNGDA^{1/6Ͻc\aG9n>[`#+xd?T9 Ka&F8 FDMus=Q\)|*+W|ӧO٬twSWP8 ԛ@#"@vUivY+|oE"^qn.P6`9-Rvp޽L ,n|H8F 93NE8n SZ "EQ6񱾲!4NR<o٭2!'!T~&ZP(|>(?\__pB"7nHGGe;qd0%=v\raQyH\'&#P_, ~oJYP_ѳf0bP ;# #8XZLf4 Biʯit`~aVB 7!TXV]vֲDGHm,;/2#?TJ_.Lfe{.WSRU)Zz {׉DP0,}s'PPUCԀÀYپsGtkR=78Lk8c;'²݄r}{ z({d@ÈTs=lk:$=uGߟo3ҁ@| ...Y:IHXϕd0"+ *b5af\p"MERGY;|k1)NE}Abwd!,WR.cu ,Ipp +}Wb!0 ]'Zu1i/jUĺײx/k6q^_jmp"]vͶrv3_"kF c6ľ B.HU_I0gK@`) j HxA1|UmOIQxq[hl9U=-XwKV~Y8B),R5ul9]x@0=m7iT{GdoR:C#$_s^~}uu~dR\"]]]6?_ "L)I7]" 3NG `,n s*u|@>v8Z<0~\W Yd1d| |P?D Ea!ʠz/kYI+!u" M}_ү%*Mt FH ϣIꭅD"!۠s|Xd&Wy'cЎ[H?bpD +@l0 9MM9_2W$kRkB#_& ![?qƹ) r|-gʴ eN!r .}̟ͪ:9׳hCm;>Gn`:EH C'2;;+;;;~+uRGrNzⶦʳDqA+煎fPl8'^{x}BjI}7}N䞎+ÐnT* >Yڤ)(g k@/-B.{Qϙ娘E@( EO; 跅JRvBϭ7 ^y5@$$p|]1cbz6c"kg{ZP]a2!$wKFe/ad*Z!5^ h]_Υ8e@jv cw8www'dkkKj= N08`Xg4^'і@ g1z,IRM 9(wsS0(!2nGvuNE8RY >KwǝρDŽNޑq p3u@v3a!$$_ѯ8=qew믾z髾/1HM@2yV>I‘T,I;~?_oҦJ.58FKWI붦 L;CNHԕ8:*(k6 DBSUNDžt^N(4/-{9ݫcQ#h%f !2nuXX]y/2'&ЯOׯ>8`36g{t V9y^yYX# %뎤t:РO;тCl$8}`!$~gp(^YG/[pn"yB?!`pBq@ƁHYNE=SGh(} #0F3 h N@%=J}N?v(U8. ke7% `2T=fہ xb[ߛ}G:C;H~<,3\.Nuvv583>Tŭ$Bր^Ia?ryLHơ˥?cd"0FJ#^@@rQlnG'9gǻMTb{r{x;ge̎ea^CZ`:BHXI^rtt m`K|Y>F&˨LnQ<.D#/n (Wɉ Sq րFO#2> #y@`"eƊ^8$>)t"zׅ̍=^oHʮ7ʰQ!rfF9̜8:o l)[&T1x:TfFyԩ^TEzdqN@@"6{0i@RV/X6'4eHZDpXh%OFxYixI8F,K8v?Qű[3RY egcY->%0'4yahbSBH4-k\@pmg[?rר?f\1k!bER'ا-Kp%9`ԹQn(hΖ|uBH+pSKeN،-lEѦ|ea9$BA%zp->R(I  <^Q5c ;jeD$i7ptX}G\ug^Ie{ nyT`` d8ur%QM K_2rh\:̺D7w)2#%{cA H0{SO;جGPE9S͖kZH\xlOUQ`\Ҁ$"PsZ"$ Τ5Ӊp4"='9߂3^}8s֛N=ǢQ?CޒLVz7eK:yS !Aqk3:1G% J<5=zC 45Iũ"6AJN ]o3yaf)QRgYgrֺܹAپfr}6u٨+eQŒ4!`I:J9 |B ~_4mc{H;c b푞 A* .ouNmLpH=O%z?,o AjZ@ N!I2?8L h'V{7UƮeUVedC HoPd*X ٨ U.r3_5p:4B BdƱOsH}=Ihlէ !  l9WӶrXQ2+,Y@"J ;U /īƊQ 쀡yE/A普)qcBcg3Թ cCw+os); Wu="i+ YⲮN2? ȼܽBΒ0FY{UצÈJE4½3iR!WFVa\SXp@ԱkQ_$X$[Bl5MHt qY)ew~0z7X319zI}9}^n0n! @9wk8MPRC 7U2YE>@ m2C`טCi"X(Bd E=3 -"  eY϶\LxNZ1;"rV%Ŀ!*/x{pJm(F,^"mi$!J08}_Ȩ(i" zXWUR8,Y?\+K0wu)vG![|^j?b_S.ON +^7h3gODlzBTPy[uZ_.È'/~g ~Ƭ]r jk:D#D9L2ד#ǨBFQ_K0%j t3 ?%n'b#5Y&nH,PGJG@ ,bUTz!wqeUV&GXq*Rt'wus(9rD'}AUbax/]伂xQ0 RQ onЧNI9E.gMI;(0n[ ['ړց m 1G#,R=\y2ע,YG2{+Ɏ;{ۨgٗc6\X%D,0FWh=L"G H#( Iqe8=kт߫w덴&vf xMo|p [6WX#aa`m΄P^C:d0D:LߥIHd3GжI&AhC]9U-!>E  Eu!ΤI4NFwS џRS.CzנO0|類94F B~mK냄6~Qi:Lxw//!n-LB)K3Z{5y/L^R4x/B!vb&R p*=RA 2KXru}HFs†10\_uMaf(\a_es4i:@YcaSese%EL>:[UYgOF"9F#!Qz~Ezu~F< *`Ge8Zןl}N   \J1'я7 d `Yor& ZS{J.K(0.ZuM{#Vasx́U]) zXc>Xgҵ/= T6xX&N}*tW.# "#vPS|W386UVy?@!$pY#UC ϡ$WJ* alNz c5U.y\(c<{~W,^x0x?;ǟ5Yʽ08L:ⲣk7 Y O( eN!$&T>vJb U}Q]yUT/}IL9:72 p)}ev9P BRAcg`ID_a<N.q0L1D70bພ[g}-N={͐k$5}qWea.~9DφУ,ү]DlXWfG^%aRňBނ$&īKfI`"vM?SF;]_B Lϋtf#](Ts>{gd0{M! >MCJƜ#[;]vsMp`$\% !I ta0"5E*OYcﰥ 8t B. "$0.xt3AA(/{U0f/peҷCDCA\c,ѯ[f?/Βz\^FČm-}$+İ.w$`my~GQ螰d!a'2:(׈NvDW Ρ-}_t*FK*H"]Du H0%][黩LY$N )w8cb! gSe#]rAi!X<`>MqvdyȄ}WBBGJFSξ_ޟV v-S{SקO ,t BMU<#TY/MI0I`/{Ey*Bg "Q0lF( zxx\9g2gm4'|]7y!'Ҧ9? s /=CQp ]}N!2*'TV%T.Su+>m$6ЁD ^%*2IL-dD*]SEq_; mpFԮ lN2'il)U=_^[FZ~N[Ke:*ʶѡӮ{540yČ`36A!ࠞ<Iܩ챣 i(2=-t BZN}Kd P%gҥCt gxL iCܒvcBe5z3ڸE? Q3[b_=Cڱ3zwˊ.pG oO,tLY:},]^a9U`OmA3Svbt B .ǾyE&#Y4F&= B"K%gAI|8YrC}2%[6)e; wY}Ο1m5Sƚzz_ EOZT~ 4BZ'ߙt&[彬|&bdÔCY:!abQ03^P"+: K*քM,Cq8Kq1`0ޠ rQ'!)JC:5^Sߟ @?0Fdj^m=cZ hW >l aO!':rZ1П3ӈȱ*G 㵨\SF ńPϘeҊUFfЯ);@H:B#"q'Ҟ1 S7kraAg~>-mԻUnUUZ+˝u(l@NHH]ѧXVN ╢UoէWTOU`Q]> DN=+d'mLG2D6҈9E:=h(fboi7Z?3S6RFZ@m -``6>+B.}f,##@ɉu gTO76y0˕*tUPLTxΩ@'^;:Ii 7L$?Ǥ3r)Jǒ>S8&\t1B c]{xPvSEHk}BCċ45͑s*uB@Y!O*x.:yF,RzSu*i^=vI;q>P _gx[dVapH}}!ѳNw`w+Ί%LjBVr)#5`Lk# !؄1>֯aCS9]aIF`\RP -. +z>UT-]8FWN~PFq̉,NAxW!\p ޛ !6IX A]}$nT-q J|ow!U !<_*gR ij/9FØ ЯcG񚁚%N.nV". '(,zFɑ:>ցmeSL ;ڒ{?Hqؙv& pGI~GB.qT6s[ RG$1kEYS12x@!As>_(=SrD/ш: l謪 7"zA%svM-UU@׶)ʬ=-y|;a\l⿇9E>aq qH`\@vؙvO\`pPrZQf-ai"_èC #+c*?"71U90b#!A!4O R*di}){8iMUނfS%cc #:è4 lXFҧ#N0& YH*na'%RFۍYlGƋB\= iF{Tջ/g6F$nkM]y:4"KBHQM?ac@(*YNQ9Uq@&^ausY`ICBp'^i'WC;Rv}SS{ؒϝ ߤ-]Ԅs亮Ml>p!S,$.vF_{.UCLGbqYr]:*#ЁD!>%ќ*&p(!I)}B@§b]:u4[[E mL`D8>&uߒƀhB_}F•I9>XbܛmK)!0f= GFHtC6LUyC<m[$.)I^ג[+FKB'TF*OPő2q*#JUDċhW|vuBE1z=d#lFy>؂g&]8`o0S:c_DjČxe:Ug1(UUաL9k>j[0":!s(İ~m0C*=&B2N^/bnSP ==zY,I86q(,eGPZf^W[Yrq`u^ʥJd=]NZt'gFp|{zddP8LŁ]OM] WOB9#{12KK88x/a|aU~Xߓ+ d n=HuqKg[;Q`FX.\QN[bVBƔ7u#0"uՑU: !qPD!֒/*/wKOMh9(EW})q.I̕NDž(vFߖ\H|gh6x`X9 2zFf]+6$>]da=R$(*쉱ʳ B<DPW `Sf5$jR UVuw@9d=HοF683-A3G5v^1;ᱜؐ56t.pf5#-ɲE)ݧȴad#Y*nyQW}©"ؤ`B!' e*YVJlM{(p(g 1$Q, Xg>dS9tu}o|Ԍ( րɆDz6-llL|B(V< P(pзSupg:Tu~îS{nLU&+|W49e[Mw-ΟO߅AѠII )8azptaU2A\6 ΄%•D.2uSse'z}+50 ɔԠ1w3KJ k+ d5BͽN !i `%zE·>΍#A3?nn wcƷ&|n>pڝXp+ilzkJօ&A Y0„QXvnÝ'uMתp%{@o`tCA1%4^rSxӦ6%D %{np{ziaЀ&uڽ% 147fwOkƝ8Fq$nzԹjtWOj#F~Ow=*.( w Vn%Ӏ5wb™Ll9w37 _H7`p&X{g$MPbq/_;&(kŽ+É>S J:8vN[rmQ6vǭ)WLg{zTbb%4qEmHA v7\Gs7܍f7jֱV$iAp0CǎWMPfw|ҌoyX4f7Vz *뎣 Bܹl\4+V+`ʺVzZo_S&Hx8B}*%TFs})L %M});ow}ކ;~ L׸? kTҞI8}W7 2AA)T" &qB7sl>ޖyܣ=j4v ~5JM1~L $t:0ƯG^S&H8|ҏn%~GzJ5<2wĈ} 9.L{jŽEZitQ7$`o:p܅nzH }3Zpﭬ閅VQXj.dayu}ꈐ@DF9,s7`s4 ᦸ f'7Q&d"= V# 2 {k:|\$NƑ>KvOuIs|?8| 2RHCR=5K_Cg{kVp $P2I,y%+GE?DZ/J94Mnjjbz}Os%F>k UGJΏitEO%FϫDiDɣi  >*9JUMFϹ7 $0]\7)2PpF)UhֶJa\0WBI$mm@ƪl\lrt*JR|]jĽܫm' ܻG+naxe@ %]I^왇a<)EpVƹb Ha$҄-pn`5qQkc}qڰro4+ pzm^bX1lX|W8>百PHI3&}4#\UѼ҈+M'њs&CMN7(._7ݒw&043u(ѨĀK4憶XvU:'*.`9E4;\ڨ,!=<2w8^Ƹ]qNٝΛ~J MDO KqMưS=_s.=ׄ{$aCHQpERݜ [ Knz5kRɤH A5Ah&xj$kM<4q`s O*Ud%Cɺa@vgLPB6L)y0 ҄$+]wk>4,A$D7l鹱OХUI Q02@(gX:.T.\ЯJnܐJ<X Sٗz'MwU5/ܣs̼ M ȸAf]_'ܛZQXlX]c򠍇l&`}MR~m6@a7aHk]=_k{Rj;iZ%)Y~{y?,I5E$ Q7 E:'[?x6lwubA7+W")Nnn_h4^f?oԢ$K#;wӨ;lW 39tÁ\, A hv!:FxTzC>x״(HT]-c~mc3kNHZ~93+d/Ka:mYj3o=k mk6V߸2}6fp%;B/c'''BJ<%O8Klxl]m|QB`iVj5 Ъdw}e6P#}ڿHI&R1D&\_e!a Hl nhhjÝH7+4Pft:)VT^_._kJN*H*EW㍝|vVӵZmF%}~J>2Gxٟw^[ {1G@U?L&R()6DRVu{| H!SC+&8[lʿhez_ 4Ҕe[5NdBMLL||&zJ~Ad2YQI$ڳ״J&TJ=25OeُNMM1]K7M&q)>GH[w]f ˤΞ2E|s +pK ;RBFs 4!\]&f +1MFRi܊OMw/Nޜ}+a 0s=*GL0Sz鳱X$V/~:_lV:3mH$*Lf~Nl߳mo4EϞQK}K^4;guͿI*ef6}7 vfmo04 Oid~{ >-z/ku! R7GgqҠ9z}RbH%’“1cI@Ey͝K4 `;Z$?}I~ A%nV,5E=jA ;Jي %cLDzԝV"eP՞N&Y^ОKdɞT*sssq75=.pL1X{L0p|+ж;c"fUn~kM0QN}`N=UӦQ%P5T(,]6$R3&8z? ۲W E%_A͎B篭T*uɺVVVN5M|m<;b߿wuu odekU/L*sZm.?I#هgggBia 4l-(:sp3ʖhHΚ`?v5z V~6%.aз/$HavȌٻXtZu}=jrsm 1HvmLj.%vWWXTIXX$ZDDlJiYEN5?L&7zjVݕIZmZsNMMYvJ$GK&2}IMPQ5@%.F}z?u2ͱc]_H5a;s#F:%UR ;/h5HmkD $;2Oϋ%%vE!tb) & \v^^^W$sssﶟNu:VVV^n, JԏfR{G[ƅ4s&H(R'QA&H~ {Ll5@%neH:cx Z]7vg %붫wFzL|̵Q閛S?M{yAIae"`@/N/y^lGHbF-РPYQզ׵Skzz񗯬<>d2Y~QT:TVS|>么a4@LV V$ gN5AIF :?fc=!WcHtN) =~ʌ }T5AS!Eꢦ럅 #ТCGzȐ@ˆLzM"hRu[ִ#L" r&YjSFc\.JX,6l3BpYIRt666Fh%h Q)ܨ]د6~~=LD"qgJi&Xevv7Wl]ӝVt]Pr(ܿ(g= {ϯ~X=^uF N ٷ>R% V܍i858آ&f!fff<=d֔[]]=H$oll|sR~[}TRTm&XT1͘TF``,J3w :ܿQ"9EFpq[:On9peuGH!^v;T\<\4"q$s#;=QQ,veN!50riQS~}_Ѿgjm*Ad?dcFI ^h4_YY9ạ.ᴝ_kEJoBi ~:%ߒԪQx}LiO$_|vvv!3\ fӱ  ƽ.l½UV,>ڒY`~xgsq8Bɣ{䜄 TRh]gdQ= @cjjuZJeazz,,,x<~YOqXP.h(L&j9Z(OUՙJ`د7vp\u=@OVre%FN m_ӕfl^s*7Ǭ;:|WQ(xic&ATe4_0 hK+!3E:lHV.LyQp祌;~li%*<-H)J%~T*%xGM "J.;byJIm Rv{Ap]8@NE"QZɋZf]]]}աCl,N ,@f*Y1͠/2m 8d5N960J3&)υ+cZ;o:Z]]p׌;'e8o#|sp2Vʣ{d"3??KKK?Q(̡Cϸ+=XsY}w#ݻ:I{hHB1A-ʜNWpuuJٕJۏ/ߧh\cGI$%+4P7`Man0Rz.` ;,G nC>wq8τpEss}`TL\n0*ez`H cԩS?rܹd2Ü}MFL}ڟsu!BQ&5/Ǿǐ0`H cX,XZZ/NgؓG1^Q Go*OtgnWo 3o߇u:TULwKdS|}qҝ#2siQmОUӝ>FŀsV,O]x;zzK&(lp7?b?L&=& 8m43oZ=.*6XlV"KR%3ֵ IFƤYLMM}Ґ6G8[_;L`C ]:iaI!iZt=&W=SZX%uDqw<`{̥]Q&Z{ަ{6כ*@o67x91SSS/t:ch.DVZ)1H&DFjcX:]󷝭UY?Ia?T\w^z=orrKCz]aWQ5ه@D*˦dLpenݟWlw=?NwsFJ5A"|οC5##$\tuӟ@n8UM,05^Ndz|q/J  X18rJTcD"QV+MMMk6K{mZӵZ͝N#!o fZTwK&lJiPӁ[6umUڻ2_G1*nzsEMFH{ΰr;M6}kA$f@ro5[jQlfcE,gF+PL&^*z>R(LVgggؘT*ׯ%>8"ǂf1 " jVF wlR VL"w?`7C%{H%4"+uΛ칦*dѴ&=΍uwM T\Lf?0a_}YK~}q|]</MLL\E7ݒe/;4P"-Lkt>D"Q___?V_W.+{Ո , &-/J齥A%RǓΘ`zfߩpk:ߨ\9-EVjuJ+YTvQ Jq];=}DF &1ZY__4\nV0@h> “O3$ 9\N}RF\^d,k{e25=&(kt]u}^q狀zXHz$Hl&Z.w\bYXX0BaпnV~{x 1~},M,\3Ӧ;:r %ad:ڷ=V1֞Hjc!B4YxihkJ()sp3G.xʝ3CtEϻs"u9J-,/q5Ud,0HH*J4'K9r5C6ˇA!{iIK t?n=ך{sJ/Z](WRs ",䮳jp#0FH sܿ)J^ZՀ厾0RI&Z:^jd26Wv)j2]̎V*i5IJ$1Ƒĕh> s&ܠE1/a(aԻ`]G{Kn=߭X,@HBI%v lAz_mԩS{ufWhH<* iN'0nRix 1YlEszUj6.`Eh0l}D0?o; b<-ݯotW>Lߔ 'Z&_5M7QD $`-..=qOrڵ͕D{vԝxݤ+4 RRyX,VѠE"gzkEJ؋ cϙ{dVI ZtJ ɔ\5-wFHSH}>\fN)19{IU ˻:C6L }0Ξ=k|k~ŋȑ#;J"f@TzL&%Zc(I$ Is@R $%13Z^?;/ם yEqAFndGK}8WeڡkȔ;>Q~BТD閧 F;BzO?;w.vAlڏVixs534RXp?5@})TN+RƂ3-nˤ 5i`$i\%+g+Z]A$R}X$چH6]v?w^r%J IzŌjmL&c?_RvK#J:!=NkIR_Kʘ'm%Dm 9U\04xO vݽ+Q5@/U4g+R41"p~6z6uC9}8[X@u9ARQV,3A6^f {aK?v;MSpꐞkRa&>f,[0TNɣ7u^2E:Gk4 ?#a~Ě関.Z0Hfy `hIngh h^1\v' JR:scN'J.RC:華S&Whҝo\F$ߚmnH%5aX]KL0TNgLWYTMX/&@@ 3v;OS644 5@ZORt:h4Uo5sߓJiuQƝs0_t!=*GWwkF_.4J{ky?U6tX-jmK6Qް$J>v>l+L7Po}i6zIq^)FH72ۇZ6f*ئ QidҶ#6ɉӴƌΛ*U7mQh#%λ뻒Ea:];$qtik~|ъM: %m9Eݎ7j^l6_V*r+W|x?_eE~2H{oer棒GwbSVMRlll>oLR2/3-Hh!$H a`f&lHX1uk sgHaLuwkKm{IbHj5O&1ɣQb&꛾k&''}G;{+UEBLMMm.ۡ+666b+++ž3tU^r;$Ј@5{3h4"إM591iTɤgMŬT*!1 0ʆ &RHɢpcD _J ۇT[l|97gI+%tE\"JQ.׮]d2f[0`$c؛oT*s\nfApnЕHʹ~>NZ=/tMV k z}dŷ{I%>YOR&H [$ll&&| }B ;nr+|ӶU(JGi ~w+#N7-H;c̓5XTƇ40ҵN%λk0RIuNdc%|yux_U: ^a  gt:寷q:,' ->RH>Xi,k&$4ivYq= D yF`¸E6n2OH p ڃX,Q[T*>ϕ,Κ`6d$!}>moqpMPZv=%òV}dEMwRzx=nW.UxsQ:QmO4bX,oV?33Zfi{q_`6NHii.WmIkT6 pO% =^b@]!UHp )˛ r{p@xO 0mXt1𙶑wVFewliU[~ m2wU2I3D^n^4B #MP(Lcq?E9K&ot:Gl}ߏ#7&hefsxƛmf`w1<[,ިK Zkbb"-sf3gSHTI}cDeB\1A+,kwPb芻p5lPb]6RR0fv{3Y]]5W^L"ieR*5~C [xX,D"FmoԮ2;SV&aZɥ=_(%ߣ}L\h#k*pnZݣ)JU\cX;߱l6k69Ϊ"۷6FgzzzI٘!G -Z\\\*877wޠ}FH;h4T̐5/n!%J&IeSTvh=ϚT_#ƊCZ}4@ "MX67ly?`[rt;ēB*뛫ji !^ii{$؆E X,~ޘqcc%[h4&kH~]MC_×cu_5AImL 4n)wES(ܷH`Q#^<[7GX9}1 zB3bW6?Gl|FhύHjfff>_ɣr߶}ϙ`tF)$kh˗jw>]]*#?d2f}&뫍#6q=Jm ]l~:^诨dtv R*VIR%TIS4MtUHF(Raf;λH $urvN+'''I)Lf%bg&h`XeUyJ(ivV*)Rm1t]U(\Y&h`%?j6㘙hA@@`8oF?VI$ Z__?t2VeE~[U{N3᯸h;F29@JiEV!e}G|뻛({g& Z\\p~QV*z.GҠۧm|T^I{}[D+TΣ ܬn9%/`,m ~-wz&>]hS&ygRyک"kz1A2lSTi'%)>hۈp_/cz;*w7g JḬ: s.ueEN'KCjqq|_Z[[wddoL;*j|_*JϩT*G'&&f{j&_xgh\h}XIׂ64$QUWM7J)a$F<0T?m {aCܹs}b/d2ըnrPZ=aϖ;Ϋ^a\NIA )Eq#fhI V(iV(iSc&X@t[rת{=Nlw_܃)!aA !l6}(*)y'*|Tz>:Ο/--}}?ڇ_7ү{3eƶڇE$T}"F^ &H )1T J EZu=X]o0nX,ujfffF+ƩUuQCH RNRW2Q.QzZMfGG hMD"I+6=~um3Ay3Ѹ`V4b2o#O3#.]wp&w<]F~cXn>Z]]5Z,,,KBX\\bةt:3DℽY}zrrRɔ=fUČq>WVbMN>=iNsM ۰hϵTL ՞n{\!N`$Muf{t}m˭V9z>??owzzN$ԛܗN:L>c2߫hL=`oV7Wy؛Gk[m? nX&Xt\Ҋ܍&0hEEV M] _fsRzds1f|fǏK6#vm?_U|P8gof>eoPsRd8h)VWZm&LD7K&HiS%42>sFLUug7t:T*g?ڵkoԜ+bt~fsָfyߪj@TU) +iGm,O8O I0j[)}cҞRё#GgFoxCcF_zF t~j"{SYNRKsqc +<=*SgclNL>/޿nhz psX B i)0ڔR9K6VLPp7ϬbޫDN(oƘdG ѥOZ2^L&K$ vDZݬo6j6gFuIȘg{>~hI^/LŅh0Y+ LBwhߵ ]Q{2SϬ}=Jiqmsݿ;f_76Nj6gclhN7f}TiXYY@biw0BziRʽ_IM%+E w}w'Vrl I&?kO9`0H 0>4;iEs=l*b3664[+J6.3.]ڠ 18n#Bfi&`ߵn*ٸh%+` lgk̸6Wu08$_Հ5NWؖ+.~iGLLRݚ{`p jA]:cat=4=Jy7h4LR\yN?9`@Bx4^XhRBvхjh*)QIիy ,Ӿ?Q=WgPɝɱ6~] 6'NASS)蠀׋N|EDXԠisl_jGzoڇ|5{\.%Z6FP]Zm6~=50~kEu^>DfjsMaac9|ח鸾 0Ҟc^8tէz~RI %T~:Hlm{_6(sOX9H !Jtp(5$KGDJ<ħ+ժt:&o[Wٱ28џ}s?6&#(ROI_1,C$Pվ0dF,S?fw8PH+4JT 6l4iub\ $%^o>RQmwacB8aB QW76.mJvm͵GP\0˜Q&D $ @?c"kaa/zbT`k6 F8tG̺ eA$0LUD_ tR_Jم Xls`&gmh D $ Uƚ;>Msnc"aXVG&QswL,[Y__7/^ўHʣv=͕ӞG0 Q6A־Ms9pgO<Uٳg7Fڎ_yp`DLhC6^jdW na&MaC HYղ6R4 (e|څ0k6N8ncF:ZQM plQ0"QVr'is=@5l| aBGm$h Ğ~o4ߨ:)ʿmkC: tli D $D] LP.Isڅ R}KСC+)j'l[CA6Q9$c1mwwWVV3X$vx_n鬍/hH#61ؖF|oƔ7/^f[s,"bǢgn̞6AI^P٣u&To9lh,--_*^6HJ& c/eXGާL/oHaZflq 0[*rU+xiǙ3gfbkZJ&MLL|>ߏIEoѠm4i!}}@vM3O`GMj{`ptCM>^1ÌwCnqqq~!}V\NM"Hr&nuumi;m|WF $`g8n$bFffjeV#%]3A)%0T@<{cyeݾƼ}~&QD"l65jP!lMa,R)&ػ@UM@}JK&K "k/HQ,yq` $hєxQ0\>>)Ljǒ JcH@@ iѴS&Xy`)%읤$R=6 X` @Mw"% &Xa`X;(iҚ Ha.ѽi&qjyMw/#}u77&6.IU#}L 5A9&H)QF)5knUeIhHaJqI J%i}rve5\UE fA$Vi{DwRbII%R<$0r&H0Zqf!+6`$Rj UJܔ H `hߢ %,RM`Hhk6LL J-#YM(J y=n:vG ܭhJaf"J"%h)Y!y`tƼc{$Q+Λ`Jm {DI!uPlgc}>iHM`L(aT3đJ]tѤy0h$9cđ:UFU5A;qkҊؘ6A:7J#(Ѫ Ju짴aK@&XI*Jc@ܝV()R%G ['~1ݣVi#%H+L@ %`UJޅ+'>RH "88e 4` Jʤaz@n(Qt蔍C&XwwJ*]6Ap1F ۥCJi#%&H1APJLBIl,`?%V&!Hk #EI)$Q<%2II%%ues*%` $BtW٘uϕ,6#I+&7I $%MJAHV͘5:h@nHݣJ)TqA;a( 0bQ62&HrAY:v(teO> 0,RHɣI ~"M؁A[vj) +"xj F6Mw#<"i跶pݝ7ABI 0@Đ@~ B %QqqXA u\ n(s$FCIrtZausFLXRndUJ$}A `)aw?{o$K̝3l9 BH !##/!a+$!1Aa!! "D< !^'fz;sյ9:oVUfUVUfMfU[;,:eY_k#6 "A82B+*ŐxB!dHP@"BI&gHt)%YV! Ѯ<Xh B HB! _i yUGWB!YS !$,0?c+D$xo\qO=O!!2!P@"B3a4a.+A(ؤ)okxPs:斴p%L\$#< (IMD!BB!$& ,q(%rBt;Nױc.!ܛrf,8LI]mCw KFhj %B! HB!1E(Bx:F&ь^ ! xt'GRz!YRDr&'(gD%B0/1>OY- HB!ƓȄ&hdiV!P\|F^5qC*ģqh%R" x)t}"?Wo HBZH\W鲸G^Fy}qQ?zEB1eq RX2lھq @P:1 {YP &M Cnms뒶xyLXo#L.wF1@B!F3cҩ zUӉ)ҝ6뇐7ue0jZ0  1BR<)8gx{!2۷L^qvvl6|׿s||\ dmBE^0:Ft5CeLGM і`Pm*HSۄ"x`@ǢnM(W̝ &k68${ڷXImB5铓kju1rP ́DpD!XN|/^FYpEX qO%À{,H<[z ~}\K$BǦNyWܜ.Ic̃+;%;I9 2>baWujvvv^s/^ H {!JB!q+=- F.( `(Bh]GHaWbHG?9Bz)[ 9wgޙ$Y;(1^JF\jI$? !$AB -'B(CPU_QQk[ mS\5̽uF ! ay۾{xqDPv8/N|Lȸ8rEI&GҞcr#`v:)Rkyy_[վy|< .& !.Մ#1 a>-D? 0.A8q GY-ּiiw6t .g𲸆~0o?_;4kIgo[4Tz(2.p@kabqZ~GDȐB!=  P0H!²({+ -qA#Ð{MSl[=A'/ CX<G!"T<a9ߛ62nY\O8|g&nꙤ|r}||yNm>"B B/"W654Q00; *]'3<yqg9i8e]\1I½ C[^)NgJ7un/븋!&\^J$ MX ɗiB^-V!MNZ֌S> "B!u``!n܍1laNӾkp25}?ymw8zA(~^"UV!9ck/0aS hJs+OA$sdzH&.1yOEBH0דuu.w.7[|4  HBH6=`4MˆP4] |gppɬvU;x#%cNyI\1MIO^@ް~] %o Ib8־1ngODHtNsq˵Zm\.MOOF޴Zv=GCD!dC0!T؂i0liNbD-hk α\GlC / fx辭㤏3f߱z04m@eM0pFP2?h?Ѩn_=99_YYr>jٹ\CB0C&QE4ea|}%!$~ǮXpv$y1'<WLZĤ9r)-q!S8,e#aNE}m Y}=J].p{{#-,,mZNPxGBD!L&0z- z%E0-N!ũ|'qapDDF;m}>b*ȸu M2/ {:~fx!Lwɏ%-&bIx8$^JAơ=gOu]-V!o|򅭭YXXx=- dP@"B&V IwI7ɜ 6aEHM~TEG>ӏΖ߅WQ2|hP"B=Wt 5qCY5xa „JDU[Lx<䢑_/hBF;"/đ;0K` ~淋YN^& ˾ѱ^z p Q")wNyE;qј # _oۅJkkk'| f$BB,VWWR0u!n覷֙Y`0V`@5OqE;KzPI.f2޾H Аls,^Mf="hr,ڷgjڎuUu։ޑ,@  \qc't﹟q_h4{rNMV=!!ll U0߰ElC%cl^7xfo8k$|* ]-fz+r΍y$ ՛3JX_76Ladm_b֮4rwbY^^kkk_ HBHr-$Ehy}mT8 /#+`Ĩ+B`1* l qs ϣV! u;sM;x)Ad$%ϣM#ᑶ33dJV-5V.9fYt^SW*m,!# 2B!$Y$"cLal)8bD#q.9ypb'O{sDk[_Bg끇#鞿xsU a uOQ9ޙHۂ4m4IzŸ/Ph& NS^ \ 7|>w>|iObNjڅBakkkNB$B!Y,!]d^׍6_{p\Fekzox튗'ۓ(P/g$\,!%ȬbՒy傣 bA+[?*$A@r+0&u&b(RM Kw_\(u#5>P9:2;0Z<7aHxAD ᜂ^/IZUBWu-zKDŽ#$KBȘD!$_ᭃ_z Ғ{9a|>1\/ Zd @\C" "rfK×@p#B9cuAo;OHc !BPAN57;;;L= /}JS\(>/#D$|>/J弔e)Z-i6B'owvvkvvO/// >n]P7 n0fB@w "a  Ca< l_`Ր`PO$j;0}}.e}N(q/%xz((bڮU5-&2l!BZ_]]_2B#op>gskFMssѢvAH߄(uҥ/.//vںna@ko¾'`0zLu$| A u`tH R75 p LxW h=+:+#B@:.I/%{C!!dxD! Ϙ#{9<<۳kd"F+++25h;iccο^ln]ӚyFG/K4 $~Qq>kT`cKqGxBUX0kxn3y<I:8 "kH ALǤS3B2=!D"TV;xa޽{O Q)긌=q=`cBݚqD`oYWD5^JӬ6`L5v{YCU-m[N:54,B@( B&/!PaRCnc7/rT:0BR4Cb&NSƒP7~SOIicqC'nSE-`0!?0._W`o<I拖8y`_kD dp Vږ'69v !d" BȰ|CBadyy\@[nI>?};8lcX.tjy6JlЈmX!ty(M! XW'$+!BB09jZ㖈uc)?f14F^xF[WgM#2h3%q0t]Zǚn0Hv%KW)>#OO"UDiIⅶ7#%98K1~imF״|JG J>!2,^H?_lNda|94>(pIsSﰺSI/ ư Hm#_ؿwʇޏqeqsuVD/Z`R*iBa$&r.%Hu^׶$!$1P@"2LX*57;eU68к^a FFϚP tlkωaAwYs!;k|_ :`LN iG&u=͉xG $x(q kLwH{蘶뮖c5!>B\`Bkkk+++GGGWEV ~!'YWzר5^4pᡞj6]w՞Z0r5'g2ZGX\O׵0Fcb0J:~@4x!Cecc9X Ky69f}s-@RB77" K}"WR1B!\PB*J_;"+Dg\p`IdwaXnjeuD^l0Į]!9]aB4V/=.g XZדyq ܤ`h"GиYHw.nQp!)}K:~XG@=B$B!CeffgQ@r Y`gN0jjȘ&:207U # taq ^H "wW.IH ک!^Cw99 > Cݒvk>|Y0wUmFPj49.BP@"+vlkݜkkk^ٔBtqXՂM ˆUH^BD!;U4`HU{0BB 2tdWa͉gY`&nݛZ/ Ըw״LDB@hd敊nNqǷOɥK=`W/9 X-60FL\!N"(A)) UC.O%7cC?q,I|oj2/[5-:u/%K+n/!imH"%B$B!:Pl>!\0r'腔]C %MB!gӽA?{U\/I+cxvwa3cA}0LE#^V4,OQ^!$Y-z1"D Pu=_ I$cG{O:FBHAݦN!$yHq[7x$'g~?z5ZS~9#Մ-Ѧ7S6gw=@сa v`$xP/$u4$Z,Wu~">#o؆ :H0"t[ZDpE!i@#HI.6jUE!4@B 6%7pxbќEsZZ>OC 2=Yؔ`Sauck)ƸjhH!0f>'&i1 Ʃ,Bº0_Bܭk?tp66x\ kk7c`zmOH%BᾬcZFRDf+N39t+éB,\B鴸2yl[seA|>/.?Y 1R]ǾmO8ܲa&$i+KrQTBc&{~ѹsU]~!( B1h4s"NZrs;H7nj]?b°z8i/<r+$06w95+Ѓ5qOٿ1 k3k,qʗe'CalЛbg KE6q 4c2Br{O5s2],p č#sԹpJWt,D/'M6&ks92 ˇzGד0%*")kmԶ=TM!X-q k͂9uXg# `~^ \kwHuRl؝5 TcPd/ Uɶ~SO?3麉:ƽ% J&%x)$3L$K20 1:n7ҫj?8Џ;BH$h zO0&0{kga^|?˅woߧFF,{B-T*HZr<S6c k Xq᝾Scj)<)aFV/H67Ľwk1!vV/QKya89q aMC0ii1Fscp/h^;ƜcxD!hߗta aMC)(BzBLEP#uCu{{峄"&9߹plZ -뢮(IM"SSggg37t_vʵ4S~I `o/NTx"8@!$ @1̟#D{kqym(˂3ϛ5b>|d$s۬7!ێiۭ:P2vT5I]tOоΟ kC P@"]v:]NBx^z/0g/*-(Mav@,(~C255Zj*J:Zo-..bq??#'bpGXmmt~BMr(F Ƶ“}rK:02=ѵ>' !]u;G]s 3Q;I;-xJjzV@j@Jg% $P@"OѨ(Ϻ}06a^1F&BLn?ol6n+a(#cnn?qxxikk[~))_픯r?+NS~[[}7!kq0 M8LJX%}S6)8ɉu+|^M$iFprSm4ep`M﯊kTFB&}am1iZWxwg;ns}-^E"j?i[;ySqxЃLh۰ϋgz}GV# q]DIآF:{~&!>c?1jعnދA^v+)!tm2WqSj}H=?gff]%PUZ՝;w~*G(y_F ^>_` D7sύqCq1~J#zxi5 c?AW;zƕk28^?]-&YcM ҂SNxy M}*$$h$$9;`(wtK:}02Q?BQ?EB/!c9t`H2)®, 8 E/jU:˺3#Ñ ܎*'Eh{5w#d<3Lo(JX%?R7xa:}I$R{bviIN:*':88z D+gSY{~9)_Z^^dzяՁRKR@m>ƟaA~. uģ>C hB!P~Pbgd81c;C+6t+W ޷ sgP"HKMYK JH 劌>z ?y}؟=_R~ُpd%t #,.uh1ibЄ+qQr?999|>?M(I_q/Jxqʇ5\d%,HNRtAϰb#uM.J)%:)Ll?h@1GG)ewnd9bm>nj^Eo]!o4hG<I+9*uiD/۲NB8c7R[(* {+;$ ux&}ntQ:y]zt۩WGS0Bh*" Mwl19\Z0B" N'VV4ӭV+_*NF1YWgũ.tAnןfn =c;Y2g=@"׊k 70yzqvnLCD˸Z7 kG^$'B:2Ϣ`-Z2isűO:U@#`M㦘A8ȼ+Q7{aK')R:Vm5xK8 zV-] .2I,a \E;ـCH{r _$i) H5qlQ“郀!a7}+ e+!?/ #%;-~9^ <?&<^N!_q BK[B:oL%p]J&xն x"Uu}{ Q #MgexS%X<8'36 H%QͰVS^9#:1!{5x^Ju\Sv~I_u}`"$41 GBE;]{I HaCu}4H;sU:7hrI Y c0 {իPHJ񰥋b"6m&&د;{Gقad;'ģ. 10rlyDQbnחÚ!á㧱A=Ա 3nVKE&x=qZ[a1Pw':h+ ٍ !](a#Q/(龗IE<⻏CD)x^dU/Ⅶ˳yrUdIS]SEG2Q0nH)phjMXu3!w )99k摳1_j qS劸'GE-, ˗ i ɬc#>Û:ϗu\|d0v;; . ZKHD2z9$EzF. HQ:y I"ݽ H^a:Fxd^tZп;Cjv%;;zn]\.\@-C@ np0'U!ΞNiDɪeoΌdO@2Nn+lfjexK:xF5b; !I[ߵu3a$ ˜z_~:j#8AeJ&ISׅzOHfDWęnF(%L(A=zPdp^D #"uyM"8ɳBQP>dC4 A$Hń2id -Fk![l`E]<#6g0%epp&ROJPsE^x>: k'<00xڎ2Z{__¨~YSy-q<$DN<Gۿ$hTux6)GL43ģ^yGQEŐu yU< ®5pvQB/qg& Ť /%x9ur$4z vZL!\:'OZ&ˡǜ;9zqbO5[ݜ9[%%[j4zUâO^c:fֵ°1iIm oI#)"^v+(D- 9'd h+Q/Ѩp_QI<ԯQ,iАvD#LIo&{yCJAnv$tnPAш8`!F6>&t]V35ۄM2}ј}`"=ÆN{"nB^0!]RQ&m7!d JWNaDג-vDR $bݽ:yu U/آN'!Ⱦ,jNa†h@UDμv:%Xt%墈ԐNk0BI\ _am<E#DG:{}0Wn#> QWYԖdbAsg w%78E3/=v/!$7k]f{DBL>r1. UGzogߋ 0&o $ PYsXSЫB0x_@MIz„|꼅5u<2+¼Id2۵Iۀ}At=jDHX( eyuG~1.H$0"R^Gx qE4 #Jtz I}'!)HDjEwt[\򮓀)(Ҕt3XIK k?M;=݀E#0oFkrMq=v%;`%0 xvgp`%I$*Q榶Ƙ 0, 8 :^){ЁХ6s葾.긽% BAL&ykݷz` ^]]=/mummQWH⠀Y}0##=wu4t g&Qh(בH]0VLU P„{@ lx%M~ ݽl&ۉ ȳ`#8v X56ģ[B@_|$Ccªܕd2/,dNYv.r:ǜbH@yח31q pҎtв(O~IKIw3B;%\]Ҁ,Ah,]]]܈gkkkuV73FD#W(QI‹HʫQzu?B-/a')HTnw$-*R'%#wsשn˰v8F0s8rLL[`45xp꺁IMVrϋe`x YdIRS\dr! 5 :O1/z*!$u1c溮Gگ1A,׶^JdR%}dj?puuXϴ5֚>2J( e>9qM8*ܗN/ϣn^G<^HFaBi (bRg ,r(5Y!)(]gRWRk]e}S.z%56`Eog7ֳxz.;6 ;opPE⚛U\'/2Xؔݑl{az_‡guY0̫v>8ϳ+g w52ϟkKBҽoD9ɺ]x?؃Dr֧} DS-jO>V(^kZ/:{OF=g)IA(2pab:D8*IrudNazY:B=?$$}hdIP ʟ7{~A/*"C5oE d7"d?8#M7Xop. 28ou@(SF  9JZQՄjKz( gg]g5T`P*|^43 5 tOCOu`s32>Z:==mZZ֍|>_=*˥BUUƶ{}O}{{;U*[˜43px6pr݄N0!†[8 {/!퐿n!z}ضN풗`虜 ,HHcGxtoD#[0jʳBiE#}We :Ԑz:rt&[pNuӁu{ژ Cl=be8czWn$Kј~wjowř8WA^nvr??KSSS?kImGa8 AAQ/[Σ0yGW4S ;-ň3a#"uvauJ7"S8q{ZMш 8o0e-ξ\8}"= C5ɶ D5l#If؏]}~+AۼLX_{GjFШ0y#B&rN暵/ǜ.iYHzԳwkk믵ZR}UT*,r9_9ϜcF!$4&qvCz : ߨ`E@ 9_/a_miؙkN. #%# Pp{#8ٞJ"md[_OD@ȋYc':&Sآ/k oJ((1cVk,g=X59Luunmm}s QuKOggg(7Sw8V>s)R [Ⱥnl[^"R'ϣNGģnˆFq FI]`t\>NVLE;Ԗg0W[(d{QAǼg!#b|3oaH`XDNG\* n O pښ[2t;w=<3%ҩ$[a;NY`W?kj8LXEH$&VB^؄k?llSNㇽG羅 oj/,--(ic?^oMT':⺳5wʟ;==ɉ8Wq>4]`HPhOOO?qt~r/csM:EY)\_jHGRP=Z2ސvȟ3/B9goeIL{ -G}vp>9Y$!烧!$՛z$yM>WuDWք] !ςpdlZP4'cGGŢ\|y>SN x!~}VaqAƣ֖~N?_ y|o"BmzzkyOPx(?;;+ߺu}e |S)z}{k^l>{ afffRHT>=Pw|vwj?bHbmf '-qܟtBQ?Ѡ^G/?R*sz5a!}_ ė1}NugEH2xphq >oK򆶹|CàL=aWBH-QtL)?ĤEjB+ GONNf\IY>߭3O>o٢ρğQx.677ǯ^e#!p0Kl]< mNpK< Gd=Q0ax^Q(f3f/$bJ IF4 ,C#w(did@+/φ !68ڠ<^ /k#mXO#A{g;0'k ]qmɮ9p_## f!<>l0 !y:9={a.T`?jO"$oll& ^G/Ͻ;Ivn$;/R3໊tiT-B  wH(w*4~ =< a\O sJ_Cht @X1G)X>8Cs{&BJ!CXcE.S\ Y-J^R)yeY__7n$!?_Kwu"ԙx&dI먛p[Ⱥ3t0uM?^Ia$~+mg<èRKigD#B~QD"cA¼q~cC<YV@<묆saPf%\ INJVƸأԺIcg\_б^å DZn& 7WjPE9u6#Ml6Nhtʕ$GmlleU#,M!S$ G'y9ŢNG~(G~(Lt $JGHC^Iv8$ ŘHT0P ${nʳT{3($!Mq0wXvO #݂d׫.D"܁N↥!k1{Z2q-QIƦW5ڊ}a=mc$!tb>5#/zm^?ggjn:Ե)  HI-G@c{azyMKoQ'(ȰAm\B9AR71gݶa@dNEl릴VSA߳{"ҼcG8Z),j-qONp`݁ˬ ӻ: J^7bYtH Ok/-]sR=зpGbr~J![ఙ &]OD2:aPA"r1l^<[?Amc_3I( %>ţNG#:p-Q7(JȺ0‘HGd2THھd& c ԩx.8B[lu iG1/K/F^ Yk9&C׹`ny,Üe/F MQ"𜅁Iʿǩhiǜ{U]i0!d? CArxh09fl/GjʚlbOc}v6䝡Y tl'(\]pM<*Őu߲K\GHl^GmѣMkwJ`/q T"}D⚗0'⿬V.T0k655c{ɶw NgG(%/d\wd`H޽9yێu2;䄨4ǵAby\*jpzz*ӌ?.$?C.gk>cWM܂#[pSW<(p$䈯 "$H.3(WW'#xC¸ߪHwoN#֎"c^lP<,Nqx.$9Ԍ{ߜl HI_B-W@T{;^z >w%! !bl0g[2+ WaRy /B2g)uOi?{o$ٶ5]U=ݞowyO@` Y2aL`Gl0d!=d#P5Ia²f{{{uyLڝv3dV'|9U9{ڋkv H_tFx l H8^邖i2sݖ1@DDA/º٤$~uNܲ挶ag9;mBr T B@Blmm>eʵإϩX>I?uھw]6PL8bx Dc1#;]R$Y7#Җy2$KKkgymZ@& EY{ݧ IUwTvHscXHYtG 28^;.Ʈ8 Hi'fjQ9]BtD"rՀ}kസU븛!oK!}JMKM#oC8 4iccc?511q:) yZ̜6IHzᩈrJj@O[~d'/к̦Rx;jEHĝ0#maN#Τe0m/La|΀^O%Fq^،߳ cjKAD"SBa-mK _p^nb|t_~7"do "^x!\^, к I8U_cڄA[lP):JFP"5^ꕀt((䭷ޒӔvtռuW7`C=N;un{w2[pŲSeRnDi|[R\{j%=N'$Aup(%u)PPpr;|f G ޷28Nu\}®A1}p*}H3dBȠJ"}ilggVsε?r||jDrҥ~/Fe[:v*L-+z-U}% \W#bHۈ>"fGvںI|GY#[Ԋst.yLH,iܺHZKn}RLsknM<8A4B:K4`G9m0u vv轍Xd H R_gY`(9*Ø[>E" d|Q_K^_9i7?omի4vCCk׮ɃN"˹1'q]v1\QiGmS (<×ԝvYR ;|QZ,/S֑~ADŞFq{RD* XB ZF$w X@`G{Rz9&W GvS@|N;[o wbXm/H$&zsPc4Ft^*\ؘg ڠѭ[z]naa4DCZSׄmΪM@ܡޞ®|ݣGxK[K]$ݴuF@2i>Ǘ,㾔uH?G2?Y4wI$ ם E=ϑ# /r82"Y߿BOdM5)8QwBt@񛎣tWu7#v !HKRiDxԱcڞ҈T2>Ɂuɓ?<@B*˗/1 7I# @u҅:;8ĉGiQ $-I6Iv۷\wjdFi?Y nYotV l H]H6'L,ݷUߊc='5[wZ{IT¨ZBLfM:c6)2ǹVU?~ONN߾}[#R7LLL H{{{yP릢):F!lP#Ue2.Qp4*GY#_\;(7psBvJzYSeIS&褚3yPD4eB'a}v;:Jͱs&qS:ӃD 2/\ RfdZw:DQhsBHc~2u^?!( 5lw={=KGy5Q.bsԇlN)ICk mCۓ ӥԉ}|iuvQpd HYֹGYHcBqa6=PE u\<6vH}9hRq~ 9/ u]o; _X8n 8[ΊG{k  l! vvIg -JEwJba$k_J>Ҿ6y@gRGD;|}FG#\:7H)ی$֢;)JQFHCē쑎 D)ĶeTg H~хyPԠ{z.]u9%fؽEu(ܢ_k o BIL-б6 6D@@2Ιٵ[[[ߏپ?NNNpN^߾I8.FE+qA=[PlY|QZRٺMy4*E,i\M[wԅvu:pw_ff{."\-r,9tuOd0km9=ϮxR <ڂmXtѮA϶yIzpBPw}}KoIԄ+a4rl ӱMhzyww!}efK#)Du]V(.]Eģ}%fÒ:FrJ/dIm۴Vu}DrnRQ|r:s `wt4J6/Ԁ4fr|}5CxgHJ6D%9twfQBMMJV!(ALZй iWlo?5GG"\q˯Svȴӿ^vu}H{wD}RR#W񥭋Gi/(xdHYRgQ<"E'""U=MHNC+)ڊ"RpSCt ŢQGZG NKx&ٍnl"c sM^k^J`uWz Zv8o>cS=iBHkXS9_ן.v&jZN= <;lI9b_צ@L#_:_#[<#W<##n#BΟk,GoLHƲݙ!ȳLJc>_F4-QDRұDww(T}{cuQkMRmv,za?(EHɏ}PTC)[ պ 럐i !sGd" *dz9o`F PVellW<)v=O@pFȣ8mn#RdRL*ħKYή#<cy7"R>pfW΀>כ!gA3`Kv$0ҡ[W.Kr\~Nm<\YЫºHNz۶:n^HjjzZofdd;Z=Maף߂-Ve e8M]E0#;mi}X ǒUBZJ;&R3F$]oqE!]"R Nݻ98w .]5˝ p> ) E8itܛay^dDϓ/I$n`ZO(?W(q ]Pp6=k^H!Y^^--- _( ]fɎE$7=O8ׁ7F?vz-GO$uw]4i|W੗( 2r[<򥮳#_#;dG(fJwxDHHd?6)`0$_+[q:7.1@:c"#c Sם'ݝq" ). ӤƁZH3 ubj}bwj+">BzjEP-o>"҅H(Q9G&[3!Z\6Ǵ" HQHH9S˨Uh{>}0MúHIVJχ߹׷֖@t xO#ׅ; ~ |O/@Eriw: .cSG&b+%BN I"uHsgM]'*5HD7!`Ꮬ75(: vٿ/uhIXCwsMs H]yD"r0`pKm/uLHf Ck?qttɰݩVS{AV*>xɣFzt ՓNtR[[[CQ5O~K?^:_( 5A\ȍ>GM 2 qa=?}7J8ZÎD$gwu3 9c7j- w@Sv<-5ˮ8׋<N9bB3yFuBzy@cITŎjT-dKKKx|||V kГ}F>?vtt;;;߻;?}ȯܔ _YY9F\JSD 6B,j==y Z&SʼnHvv ] g~\-QGnں4[!m4r嬈f(Eaɹ5ٌ l6O{s-QQSC:S;>۔u1cPlyC5 \5ܵޏtET5SbvsDyGGDpDQ흹:<<699p_7nLj'+ʳ/_ܾ}o&uMo%vAKƚ8.u-@[=5# Yuvđ+ B#B2VK8$S_i/ͭIwug[||vͰ=ţ΁M LpS<Cf^MSq~;TӴųEjqCQXOH2Hgz+Yǘ˗/vx?,--q'=d}rr;:lҁ{+gW^x `R2Dtсimv#7;!íd#$#MagOj5miWv>'#f?.q΁s!! $7~K3JvW&}!k!Ń^֚vQM1?q#IOXZZ2)yn^"XY׋pr{rǕJe{{_-V\}mhh(͋%sa%?ta !hrr_c!Dӌh6Ibr>ƥ""n(qC|Jsff|]1}Mxc(eA~A=o #az"MBaIҕoZ6AVT޿쫫9ߖ6DNLLο~j?߾}{+oWZ}u>a`^m"lH"1j H)XGMx4Fu#ڿrV"5K[Wx;!7"=תE>%ƉEi-!pY($/6αj<;r]pګH9Sat, ;浚v9ύ ɼұ c5 !m2 *5t7o.| ARtngf7<<166vuddk~)|WȠ?!m055hvww? g^ѣ{Dji]װ* ?2|ؾ!lN2>zH7l>Dvb6' Ar l &᜿'f1&Okzxx}ttt^ݻw?Ϲ$084mJ/>SZHx Iv!{QfSQ<"$EE$ӬlM$3kr^<*d*;gF$:f; vC=(h i1%dA),뺨em ز<S=Dy֮W$FE]uξ) :뼃 I.R=j~\N:DSSSO.=99cb{{!$#m'w:o H@, orxxxks)abH3lG~N};s E&H\M:~$`( 򍢏L]lFrVq4(-ȭy6W8ċD͊H>}E8J>d>3RQ 7t.vD!$ }W*v bN<oڌ@r@"> |#ˋ88/,,t,u;KKKc<ר(􏴵= JNx~H/&)P@Wh4ј^P$r_s#dn](MD?QRk@Bk%)kaU@Iތ*"!.!]:c; vbģ:5"a]qz͔P6G UaNd `#DQwv⚴k-.$-򋋾 I!B4iD^tLD{pmc,}?P'e^)" 8Z5M|6H%ڜITo6*3`}s\n Agaa?ਧP*ժ ?ώ6oD(Mi3BRs7)@ap\ӈ+ƤFGH8!).m]+u!%IDJT&6xd PesHLeg:-4SD;e2/ϳW9C($Qd!܍4vlԕ T͏,L!o:z6IUN-ҙNua= e0 )!6Um\1%IS\@ ȷD0Z`A"|bM :Ex}|;ބ|ӬTBNR Vn|;3P߀ q|Ktzt8h٭"LKs RyNb#a#j57y. ,:ǣ9S$5N.FFF^wGj! r!1Ș99cҺ%RV@҉.p!%i4ĕ8\Wȍ>#J_ȗ*B.NH EqQHN4xW;R<BrVNτ0BpΞx3#1 Z?QcX$Q$| r hTPt6iu0_L;rs`3PW}p=qќ%(NDG8.)mqF }w:9 /\.Qf #DT'Ej(j" T*;2d; AxE]x0/p,H>"]JXAɏɇO)lNhL ,j:027TgGjNr\$>A!r2S7s 4Fu1Ҁ }Gu)L-#Smƨ}d?@;\(K:WDb#B,"R)eRR)N0rLe~ϊ>(4|UH@xhtS 7: )^ #vI_-mV΂ /s0м9>}3J +t;(V`HڧOzRS MDZZ6vttt7T*/ y[(˯'&& )![IcK]{w::I{JK7:n6'E5x䦮s[w'7i"ƅDKDH$>Le~/p-5].юcrCޟH؅hR1N#* 8.Ai+57$Hkn|99\|`%+Onhttv}2#?mTEʴ=Kz> a5h ]oHj'" y䦬c:BODg pţu!'&դ9(S*3:0+].QdHyĨv&,OΟp-#7@Y}\5 :R@8|C}lsp䚴pxxTVg'\}T*>/^;XHcϏ cjoN]5d'w I;UF#nX'X:=A&EQBLR\##״+c;\E eMe%]S~r%n D2<%D]gWxA4JξI3 Xj xWtn9uqTDun ShR1jsfɕx͂;;;oWUYYY~jjחY vԵ "Aiݕz. iM.Pe4!=q:}䦕KvL]GHqk)D$1TvqRTvf煮~>lN|F*A^;炭5pw,JFl( sc0r- ]9&Dn>tQ8>IHin)$<˝;C'''wskkk[W^+++CLH|wt>O5:AtJGdALdivB%)4[E[E I|,i뒄$Gg1WJD\4vI"щ4_.${܃>8{ wVw.2ǍRHuS¨n4l:{0u~v\ϣ٤ L e+]qL6+jC<142SFQҮXsƶk~j:WT:~|?FݟwΎnnnO<Ԅ䎚4~QEҜ7"Kt HZ܈!z`+$K}lii5dPY7!dHxeG!۲4ċGDţh$#dcTW#4◩xcab> nt2 0kR GZ[I@ڋU8 3lpůWj]O%؀$H['jDR^,:;;W3P{?hÆڪ&" ÂڭXTeq CiedʘQu4\VC#Od>E"e\*4#׼+% I&)/N$> [KC<*Y1dI&bbQ[IVu40%9/O%i}`3YCvCfPfO( e$irMToI'Q$ܱׅ"R/0av_{W*z:' 퍌<::񛐾}ilCrVPm _4I[$uʬDQRM>JJ3%ȗ'@e!v$Rٹm&]Hv=; 0GD$IحzI[`c([BUv!H;q!3id 9qC~Kڷx>D&bSG9x6Lں )ccc+_=33[[[MH_ڱfa2ނS%v.LX0QFF+D"|:GGͦc!ľdB2HY#_J|BEL]8 &8K4)]-NFm.D’HݜG2MSg@PEr;pB"#a]A19pQ|cxK~ [&_J>,t la!?f5S4ģ4D!lsB9 !ߒ(e;u[iI߁0u]a{ 3%Lds Na8ɖ7Q3  쒞GrQ6-=|&lZڴAuRu_W*ZLaal$۔H{7%܈%Q@(1]xCM]#߈ N4WKaLQRu裤L)-k=$WDJt#7 mH\I]ߒF~[y3,!v] R"+qt}A>P~JOK h-vG8R%"cHpH`A>okz\.oW顡=7zf$!OݚumJKϠ} >Lp=@FPް{F`@Mfl' ‘/ĤV%d1ͮI1cTvqQHRٙu&($^Um]Ip̱! H(tsɷ1,ܝr Zc I2Ժ.Q"蝵EH9ځ=}?6FOu%o5WTJ:ڼEtlB P7(7|lP^5UYQ)`J^~8 +hBn#so仟5m]#BǰzHILREG!"d|DSٹ⑉BѱċHf3QHUk|9D!iK86!㰽dmCcWĂ]i%N",fswķy8 o k!ea\P H (ǽuĢD"i~ظLnD}<0=f/q䦭GnQ9%EeLk&ΎBKcw, XގX2QH0e>ˎBrE(y /dk0b{֩"}Ǹ^g0_0@<ꇨ.dHCm-;Ĵ^㈔P )<{R|R OQ րi3.1uRmyyCCC?|)\.w==Rx( !ׄN6}/vHY}ܷiWb8!,RR׹#BHƸfSٙɈH&hH-"QH$5B3q{FvK+ oITzBY;q ) "RGz#U4E M z(Ե>/wҥKryukailOe{{VV0\s/L+Jް-{M=~?l, | :WNNƎƇgBH7lhMZAy5sᢈu]}'$HiR{FB=5ήTHF@:&0dC2oģ`\-$B{v]c4; R"쩣bO/)3`L;Ҷ^ Hـ@(ȭ^6lkBa=DKHLNYZZ¹yr|ի211Qky7|~?=_HGZm;t^aj' H 6v.Xk{&(U |:f#7u]\HDiψ8(4$7 iX⣐!E!᳐]?QG,n\<!mx} ņ =8|WtS("# 56B釵ʎ46,?RIؒcn& #"u5Y vZ'[Ksw<<%BH;@_*HYD$S ߴ($L.&;>S\s"SE?F`|c=yCsB #=oqY\(=eii@)!Jr[AiJQw]Jt)n}ku Wɗ.-ukB:9%sTv&IB#[X{QHsڢD&Qt+ yM+$uɆӰmfIƢ$V]H|.;RB8N"RxDH\"s9BY5QdoVQJjt6d)Hy͗.K#;`%u_KJ]#BHTvn ;_*;dEqH& ($FH2#y5Qg8(/ pStQB -Qض-B̆lúΗAD*jK Hq"JKn℣4|GqB!tcI`N>eR{F)҅>qض/t\X ;IoXrKmY[!/uiD׭jsI4+kM-)%y'U$=}Dd G&0-iH͵!4$j"ŝL }3ЬOΆs?)Ƚul8Sh$_$BH'z8iwn=$_%tuFy ]s>.Bj75]tDX)]`CZc߳`sw A$6 |3"tG%`TDuF(B!u &}A<9c۟N;/p~:L]iź%GF"tWqĸ($[<ʒ:t*S88HYDE8%ᢰ`xkgEIU1Y0gQg鞕1Is.?ұ4vk&:?3)!rqjjWs.[lܘ[ G)!t [E$](a9n^;o~U ؈ViFRټpM#F ăDrœ'M]І{/_:F~K[;}B%BH' RJ; &D$`i=o+]LcXLc vMa4Po1r4ǘdԅn#vGdEǍ{ =k)Ry QOB!6D1o#Y#7 歷sE#s"磏|R\ $3yDB(.xdj k3I'YgEgΤ1hG&# 6C#Iƭ':v+>:= - @>vEX[./`MCB]tBY }io$gd' yF!GG^B(B8mLqF,ڗh7VϪ|GF!sN fw\_~[. 8}RXr=#s?#-Rf2 ) }˗ֺ!dۘk$Jyn!B:.-=]}MR^sOZ9EݝH"I>E*5BM($_]88[M L'VltMgG_|a{A]B< 0* 8 Q7kOP&t,vHc lko/eGm-،4qޕ(R8s!!|5[Ix>߶3Bɐf$x#_gH!y($4dHt$gSܹcg<4vI{QAʎ/Aή 1:ŎqvE" m:}Ԅ"x6"ZÆi Ɛm㹻11dB! CAߴ"*^Kz8Ls6&9F$2HpjCBH;dL#?1*g#%^ElƍLcwjcwHNcF;}`~ԽiMH8֋>Vc^q~cbf% D󍨍kBH1)l#66鹤ɞOR^ke)N0r($#4$^8-|QHuO9 2K*aD⣏|ujr6gMm]m-K I\ =[Ph'B} u=I6~ QH/iH%Gyc?!>LR' .V<GvR 4R2UCqH>GYR K` 5vOɹQDR&Fq»y]Er?IT)HЁ8V䘳8 ]b^sis|d:@H.Ǥ7"aR=B!mXpthD4*/m>Ka@rE$G+ՅB!$ zo\MkvRzlC*hdN'AE҅(6~G\M;H>1)|/<"d"j}x^nWHvԓOH* 藍}K$#Ŏ:#TD" 0&tq tv5<'~ }/KLƸDQcLL!- 5;r'h Jm}w3.ɍDrk!>1[)J B!$N 7MO I"Rs{,)؉O7`A] `%8I M+Ry%QACX(Cԋ>G$͂0W3n52jHv'Ħ:cB!cđ$(q+bRR$8έ!I7 b "?FB!Mc H%ֽZ+_]Q#8#IJ>̮HeM[2sǻlbހ(],ptI$p}Uwޖ(lP#HX#B2b{o7xq"S3iz,R=$;ZȎ@E!L 4}PH" f̌q٥E(b搢Cړ¶>OG$H]g%vE*R r;>@]Kks8QQkjb&X\g#!F개|O@rEH"ݲ H$gbR &^ed&R+ng}I##+uy#-/]IDG/ NH (VvF*'z B]^/H3M?!b昑( RHhZ ""1e$!=>g`A))dMAY 4sx~C5tXv;R\_1}!TYȣVģ4v&$!ϋ= `i!6 1)tNA_#r oesbv]+P6X!Bb TFѸNA7O4r%H$)A=y~4aUiD KC<2HiG.)BH^""sOXHN2>W0Ϡ>eBi # N<.IH< i$_[!RG_Yu.ξuץiTۺ4rk$t+ShD!JB $9]RTqU҅]Hy0 *zG R=M?c ~?G<.QMvE b^(  m]HxtW.S)!uq>'r>ww.g##h;߭yoK$&B#ͦKLZCe ApӈDPkq놌 $ s5Mׅi[! Si >㊺H܁[:~!B!@JJ]W(N@r>X$^lDm#cLY۷qϹ~G)_~Hrd! ii$f,,e_|n]^E&a~:MGK. umH:H!>qJP {h"PK6îhHWe* 'ҭ";af"{WGB1BHԧHJ['|:3F',Mޗ!Mb~#BȠak&RW)I%]7wSg-yZ6wm3AcXp u|nnKRٽfD`ˮJCDg C ]v !` HiQZQIIIWsii }}:I$!IKcW.MHE!_N]Hr] ء;%tVi[ d0DξEa2v66? 3B)Ӣl\Ǟ?NW'ud5߳YD8ҢR2esBWqŚ44mӂČy"Q <=HSGml Gl? -Na+N@ |MNBbq4.}]HפԨy`[A i ģ"AsR>ZuNXcw ucD1vI.Gl4kkev񲴴N $' HiQZQ0!gZK1(δjΥG/*SJ J+:"y2"-\]E)@#FhDX 5o8Jň>H >} }E=TB(Yܨ"wqo RbH yIPTu4!;ǥHzDoK'u2t Kݐ8lZ}< Q I6 x ",} :^Gm8;aBE萤GeʩǥKڝ.kg]BHRk#%[QҼIpLcF.]ƈ>fWdNyUk?}n5 "9p_hc #1!b;y^#-X%20T"q'L~`ԬXNIr0d,/BȠ- /}]3GwEppa'ftҐnea® Dޕ. yc:ݓ}??B2pTC@zŮ( a{/loK$O D):XG!=[$ىwsI\6Rp:[!Rɝ㴔uZH>1EpJ{p/:O% E"3݋pJ1:-98- 3dm8_u*\0O#E'"!"lr!2ThR(nl5[#RoC)ɎF23sN\DRFlHP")^A !AޢDbLa|{(LX0 )NNHD(%)H@+\WB[$-M(lG:N,mz^ `GA{>-q;p|5HhQ" _ID HA50\~9_,`"2 $`-Uc:feBG*p҉GRרBKЧM!Rx\$ָ(XWHjD. i !KN)ueLg{2p2WD9k!GSB*&X#Ef'rB%繠$:(BN3B+E!-(޷]‘{-l xLz>wıhBOLW "솾8D`sl1^C6}n51lD!o /&՚W<~&!(4ɼGREA ga{e^:nw70(oFtB;:[v6ðRq|nخ;r Rڡ>6<$GFgR=.A!2KCDR¼.X彰}H:)ZߍM_"?y슖$SyHD| ~!>Z:4"B)n 8$/"ol*;E:B KBִα^E~xR- rfw *D(\ֹ$1=FHPXnjBHI$MF!XzAh#7e]{YP\eɉu[M$u w\`O }yt<û5hE)? %eH]aJ;B!@hD!DRziQHi)Z=ُL|)MF6dѹ̑6_`^|-1s qQxQ#/*m]kpA"DQfB!$ov.!\fRڹi'l )8Qb1ӺGݰ +2s"Qz'cHHH$_:e Ҿ0 D)=-H;k+נ}%JGZVBrCźOBH;ERۥgݳh^MwŨ##F%J)3ˮh " l3}]:?JM¢( `"ޕHF|tG-u/LvLY]BGT^+N!6IQ8"rQq'Hog ga{6 H1nh D>be#NtࠡCAMజ H,g Q$[BOޯcDaPD~>l_DN6>8Ȓze ?iH !9. rs|QF$7 JBi$$O`w ^M]/;Ly *o0oXiDgp?`wk|ER}F"=8hy= ְ+ GoǬ b/m0BBZ!. #'BB"8 ;O `p'5 <FfO` ivE Do1.ޓ("k15#Y؝~ Gv ૵}?pMzĄ%r#nOKE|#&C#3fMfBˆ4 \B"`?Y`c"Z14ztSlD"wZ*!ErZcs[uM2tdBJpR%MUQ˺xĨ#G.t]/%_#c/ Hs7ҋ2s!>v^o |vWmHe9lῒ|GjOA522r|ɈBip?H$"u}vDʘ.MTd^+NϡvC*pR@ pݯ.7u GMmiEZF6V;a}/Z.OЛǥR]z}OjGGG?755-phpZ^^j*'''oёjkxσ gGGG&&&W^UfBH'D! CTtE#aq2bg!b ț:'9wu03zu0, P .nk1OH9HsG(BᑎeH]tdˈBZ널9(h-v-l?djjuNQ;wDc>mib"+W~off滖)A!t $3332==J.iCS1))⭮/,..x?̺x`NuB! I<82aðEc%"v:\Z3c"RE:pxR@<` #1/a>75@/J$<2z-OHCL*"7$JYfuׯ_w 0&\zUݻwMI?,--}/BH+0BH1>qs+҈:b:/$@"́Dco$! lHLcwqk^"!iA2[/ul!74ģ1]OHq6DoNASe қMY__jկ/^\pyy !$. &nGr| |?B R]94H\^s֟Ɓ;] 'Lk=E-$ YPSj3?0)>i?ψG###r yG.o" ~:xۼ\!YD![οgNޟ^Z5{Ĉ`BSN]b AҚ0@8W%!E siD)ݐrP~XH{9 )ɕ+W2>^=8BTǏ !$ !tø=E(v69ZG'[\\A\Cj8^~-O>w?\ZZcB BH@*8%<&$O+슖X(}%9L "bpa4^BϾ'QI0CO-c&l755}qFe=HZVKKKGN"BH'ihvf#Q\"ݵkDqǁL E9ίyģyHX$JEk( l-g6]6CHiw֭غHZYHB:A Nq:!(u(i~"&H;q~Q:.enk!v !_ Ci&+6A}DR?˗/!lS >X{bD!S@,scFA}HwLhXѕYT$x %vޛIuoDgUVemnw݀"h*"ิ4(:"㾌0>nݶ,}}眪'O'"N}"223g xռt0hǵiwOl.--]d}p`=-?*GM\GQ@7ZMĒģ}RQ ?I@!;h5HPMR5zTR2H@Z5@rH}G+9 sq[\S8;W\y*YݼyikkvvvRXrHrQ;a@u_pqTt&~5{1s.&ICKvL2%0@ko atl7ωf8D FlpگNLLƍ 4>hmm-wxxE64nQQE77 4/@c4Y>~ ة\[7Hu8}ټi; Z`2qrC$ZTuvlloܺue>> {7ްrj~Hobn`@/ݢ*iElڝe^#Z6F:pd-|jIkF̐ .~gee݅B^m}@"H5L>=62]ֽpiFw[A D۷Zg9ڶL*GynÅ.^*}477c tb®_=n_ d @'# eH7R6rRA@jMF@&r6DP H8lWX}Ev) /k.2 ˟C쬭į{I\.@@@Ge3n7>U#&#'V"T. \H*c )4[x4@{.>j^Y[C[?^s1^t'fffsbyy&$ET*O%A3C`H.H}pyuH29DY =S~.?.>i"zzZ<::rm.X<;;r1QTꓣ2g.]:va>ye ?gX*:{y||禧q k׮oan8J|kX?$S zB My%;^0!⑋3R*E#D1i4;. 5)&X4JBf/X5AT_xrr.b4|_BԔ''U ʁtůAX\|[*^\vytŁ@"қoy{w'Sف5`XDVΒĐV%Q{H_JUnssnu鷻u2 `PKE_H븁V$ZVRu@B@6*c(' u&2vHGyNą߿ǟ}zzzα)`nnF1WX,~{R陽ŽvR|}$ʊhfccgGsTf❣4j}@*ZFZK͖92zپyVIE"h_}TƮL:ꃴa^QM_ʹ5N€'dB7VjÇkg|>_). 7eRΕ+Wj*ʳTsT!K u7\P|3 [+HE}Dٖ$h_xꟿ)=ʡJJHM Dt9Tm MX[[{vvvArM8sn}jcc;;;+333_~,6H0䌉D{8`GX>sB+OHP]=\#Q[k0$\~UCD.~ڷw3Yj /`$ zJ\YĽ=\00Y&DE\dq1I*:F%>t]ghߣQ{h"4@C!ѱϓ  r#qi{{-r3 &'Ν;I}\r9[X8_-Pe~ m/͘"Qhd ~?4Fo:CF0C$JAM..i90j/bT*Wkq*A *c[ h`E2u8~5 ! b?`7Hg񶨚' UHD2vJh[1\0xtW_v(KG>okk[̳ܽpeeŮ]Vs^;::[,) 0p n#XGB1) Z(=k@@ A%5?E%z( H.>f)/p̞%O#3 z%Z1|vYdy3xcf{vHgyiT$ze[ G+{<Ǐ?{oo0r]~V`h? ;NNNKfF$H8gYFh%$ ĤL׍uݢɛ{FnQ#\pq~ aCMHr?k9GO96ODZJ߿+Iz*0B`Ͼ.XaSZs'Ec܏ch]ԍԒ+|hQ;W7&fG8Q0i]& B*E} 㱿ONN0:d!LOO?{^.肀ݐZ\ɺy=P=GzHu]IICƩtnu=R #4@-Hzz) yІ?~6>>' &" 龚z# 1$A. EaHg=O9gc%H}=gU^ "r9F&:^ >~ℤw&E]JsAH=6TSᮋER CfHC AȱsMY#4IXXE!"r[[[ޮ8W%RZH4Md.W+}&QD$ > d`4A@v1k|]yFQᨙx?S"R=Q^F$tsü .'4g09$n2[>:ϟh Hk. 6Ik얋C)Fk[+iӧrrrk.]ދtl_Hd8́Gn4OFFX'ȁ< HQab'xS;/"E]1),"k@]! i`utXq-|=R(s?)94^c hLԿgtR҃poo_ۆ${vf;;;5($"Ԑh~~]ǣׇ(J#bC gqHV#M[Eq?ѩ=.V Dp 81)]II}EuuݣOHCcyClC 'q(rQ Ḇeɿxcww-wï-//MB2ڪ;7ZDՁ- @fnb:%9 ^D8b~/Z: E. Ia)*ŕ'&!$ Sj~Rt7dr4ν8}gmDԆך)'J&moo=ilnnhT=B$d$h)5*\ ju/KikT<3kMLj]XL Iq@H?Za~(-Au["q%@'H@Ё,|0n,6ȉE o }u'~MrzzjRu^k]">M]BI{aj@ļOℤ3k\ޮRTD z+or:*]7A*F e}#Ό2Y9wYdYk,8aB7q[],YET*N r- H1<K/'o{℣FnVEVŤV(^VsH}?ݡHE6gL`wBI vN$\H*{1 Cߏ닺/[~nk9y&''Sب ;&&&j<{<6O#V_].nrAc͏\|G $膸2vQ)BF$qx IDŋIc7gGo4l=K:pAwȁł#/I46ӄ#8qvGHzJ=}&"= 4errrgii7~U=Eŏ# 0Y$<-[)깎 ILAE?6*oױpհgUyhG}=_q qw:EC_10lTJVXszg뵲urq^-ݖͽ6;`̽KQ;TiOx$zΣykr' {"5Z}Iv6H&y;W7Rw)ժ>CX!]yС7H& qs>h5I8I% BT*Œ?ԓrGGG2 $ Fkkk~27gW^BИ=S:&Br#敿.[}=,sţv[F̈́8Q)\.J Hg^i(:GHC"hQ&ys! Axlc17YV/0tJb=f-Yѹ:pr٩$RqZn8בHz JjJ;Z_w\=pnbSrMhQ'R!xQF_#yycv~HLs#N|? ovCpz+q#Ʉ{x9vGOHCO>;G:BV$H Hi?cRbkz$""~ƅD_{QMD ;D‘=Hf[$IF";vjJ/>/Wގ@ @7D{5*17_qO3f>Ĥ8GR# K4f{& bq#uV9߲6hMi)3[SNUoPWxj4%rwiQ.$zJZXMbvrr;ӧq5M߸q^GE#z\۫=O]5ttK<.@< ĥQ1)**Ĥf%ZXOD ^nS{^v`ŤG;#)FRj.+]n5oICG$ur\3sr;?ZBM\+0ԔJ%'DNfʯ\/굀<r5H=E}T~n`?V%MݭWwb?SlΚ ^G DH^AqbR7BR+#'vQD:"RZw$hI;Hq V;yOgr퓊s: z͞:F\|pˆP*+5yi[tU*7FM y~G{ׯ_>TH7p5BVWW˵R;;;qB{\>*0@ @RĕB IqR {~fRĸZrvQ!iΗ FBRn HK _?E7^>I @q?E3)NPj]F FQ)RTHJN"R_ݣLΣ'_2+II*K:`P_buqŚHnޗqr\H< xBe%M@ vݾ}۶ɓ'ѲvZ(]{/h 7 %¿W-ΙWBRؕGRXHH#KՋptbHBR]ԍ &ڑu#I_=0An%n'~$pɹO?6s!11#/"=Q_"R?yFN #*YZZY{a鏻댞 v"q<"DAE",Lb2Sc&8L13 b:w&C2`[XpbF(g¡#5M*ƄW(@/,Қ! u.%aDd^?PYrcDE=Q>G }tnTf[{sb^@$iJiXg±pO~&ݻw=e~S% HüI`UG!DR=Sx rR!U1)gLQbyT GAiꕰ>'$EzNJLV=F/A9:*c'̪#I,QFRT7Y,%"{r燄zXr VVMݼy|ͨ]Ix0@4J}/*];2qqN LO_q*ӑ =1zy}& Dd{U#)㳒vCn+"pQn1!4@Γ:Gr^]02J%9>l{llu%ZeccϽV(ڵk$za-_waHS?j^9J0H>Zq&5*qJW.p|ip7s,^ivRv>~xrrrΙܮGI˵u@"樕JT?'|Iq\>u:aYzepipehT.Z.rvڅŕr FٹmZ0Lɡ)*_wF*9]IfHO9$ =Cc\!kJ%]>966ZNNZI<:;;?SaEޞZ\IaGB\>onif~VyJAO$ꒀdRrhc x4A:F-sot-T8 H8{7V?dO~X}NOO-09:j^BQt&)]d{{.]}-,,V!T"s 0jH3qNԑ®FeEDCD.hPN$w)=n z&{E H?Acd]5kH</ԯkz:׹m)#)x=:(yQ#*{:m>mJhRDrOۣu쪉hhRBw蜆 ΝOs..HdΑ^yii677\./J_5 Ks%H }-,"&5{=~9k )W6Ku%CJ17xr9ʤp*Y[9E4.kaX,{\|/Q xvBI: H2r&mll\} Msss|73xqqC@ Y$*$5F"R\IFBR+ѨOSxRf|J\1Vv'{k# 3# # =IU=C7kbtWY.Hrwȕegg/ߜքL^kBnX.nϞY[2ўGfE3`Im>o65HI7ܷɠ7G[b^0&8t~.@"$ ʫ!=2$H1b7W̌bՐc~k(Jg]8h&'k/eVv% +kW.\.x1)**rmY2vOw/Fɚ1ព5C10h4"HCt,Q,?=|KWCg}>B!D@2wZ$M./$4s#<6r(5Re7ɽϸyj%&9%T@9cpBuHE(Y-X,>l7==]+5׾=+%ԩʼnEqSf D~ߒdR#'>9 hfg4tGGR' a7hL.I X,j{]q=CBZܘBy;̇}C8H>7 d$xBR7n3k,s%ꗱ{_*1?~Wmt]uVCґTtJ (~zΙ4cb{.~c$j҅&p!ǏùJ 1D"R#Qⶹ"R'TU*]w])Q4.QzP)&Ddm$H 5{ɿfCos1@'R?y5 =@1}HBSSSvtt~y B&@@ha ?vF{%#5*aɘdڮ I?oު[MCr#IHr(P({Nد!E蚨+VgҼ&*cG/$~Yz5ceeV. )L~P!I%!3Z]7R]Fg Nn\zĕ /?)"]yhA=džBܞ +t9kz#.l166fKKKYgTjnHڣ7RB ?OG~G!njnEDr?#ǑGWm@:G}&歈WE=P mhOޡ粱@z357]zGN7NIChbq$obzI[(ߏ[@RM\E҇ m2I@_)*"u2Aikk^k.n+&赱F*R9c9 N  ypzܤ_^#G) d@hEDK[|zfbR1I6 6?}([{+ D ;Yޢƒ""Ņ(YCRY E nWDjQTvHxmi^_Hl]?{45-п`8{ʹy.$Y5mhN$1TN%  3%H!/RN$ ~;bRTT{=6^vq:/ѤzQ!h0G#C0AbV3O:z*+cM _j'''''R~n3 `pt#">ڍ+I"z1o<f\H]ޓ[uL@=+8a]5~q%Ù ylhx$p| HcccONO1C6@@,:睔;ipŊAЌ"*t-Ǥ 2v%$~t@4>-Cs ݔ^|>:ـ,`iEDU ݉s$I8!*V_8D数3s!| ]vùԪ+6D`HI  _ A3IQUI;:V+1ۋ =90Yd, #˳p!b<.@+}U(l||O }ܱAY =+"U<6buT\hۏ:r=4ωÁzMD8b߇!w'lLh^/1 ;]}68΁41 o>.,,|`c E"R]!scΣzN$4as[gv^Ċ@ oKQ>>!Cyqv0L'ϡ! =!~mpir@ ߩ'y H飙)xlY~F5/(@؊ gc{.A H~`x҆NTQ/$b|?w^GHqNLL烃 4C*E(,E3kMDH6(D,mE;.vIP!i4$'3`ѵQ}]&=GV# A0Nar:@9:: l@@o"1q>PL6 U+[p"f:HhHʤc5U%#CO e)rP >/' $z  H8=YXX7d$"*-c 'dI),fYyQ =\h7JU%H0mޢ GcD $rH+gggcwnnJ8!&IT=WήQ s ^~\兩m6̚ya H Ha'gbm16Z񯡯=ö2> fGXY 4C9]՘̪ I&NaE;8 CC#rR/2RP|>' RvwwU *HG"R؅qAп!,2E)B:r ½y#&Mϐd1ic?߯s}LR HMH+*_d pN?@Ds'"1$ZX< Jɇ?Z.u&ICbc`5Q%$fL qyaIG8ǩC @z~d<CNŝL]׬(yB"ϣne$2P3k,JS?F H꓀?huYdo1)|xx*#@ \zQXDc H(RI'(B}'E1+h=cUc`4$~l (ݱhȅtȓaj GdggU `y|'$I?QT/ tut(G" "A;z|? [<{.k0p~qss04ФxT cNU (c~&ɡiG#({}HW/iR)>1$ԡz_yrrB: 0jHEgRXD*Zg 6pٺJ(.jdm‰yb7-G?  et Pi%e"9IGfذmJm |E2`8Ffe u"\Ү y4qxߘ$1cD9؀ PH:S).i83 ARvׁ>!ʼnJq"TXD5VaEe$1q8y YT4shXHҒeT.}h؎h:H?x/i\HHHL:ruQkѤqn82h?5zi$}Y`@Dl3M"@:=E_u. &z +iר]|]vHaMD$&G% Z='!kE%VsKòQ @!Ө/RjIHfBRu,ר1b4$fʎHd Gs"Arqp!ed5ĕVYSG784 `tW.Z=RDs!xhC2qm!Qt A]Rw^H0hðTZ.>h $lҪ ^9z%QYToMv#Ę9Y4K YC.]]yB>eCXU R6 LҨR8P2vq%횕 Tm2vZUȘEDGɣcR5BZUeURJF }0W E 2K#R)*&@jEDÈU2h3!q@@,"B7:r> A72ZO yc.>}HO.8Q3(N0' <d T!E1ώ2v ߑ<驝0̿t.q'@w d(.ĤF5xv4KFG9QҔ9f + )+|_JNMM]xmSum\p.ś|݃ J1, Ahyl$E{"EgP 5b}ʮ5hq4$$=@ x_.U`􏳯D@?>~5ϑ4DtN?G HPuW..#)*${4e&G% ]'2VzK@!}G# HS"a-iݸqOAx#\.]|xG.E?0$@vhDž-_WOH#>HTN$>mI^P[=z!.?K̜XTp!A?|=}~|ȼ i]^w]D2@ "Ni$$A:bRwBWw~"1 >}4AGM4@1 In<?=F)v)i۸i;bj!or.StO\| CTɅnߋ HG׵:݃B}tmn^UHf5isM+E{pe_⿸ :j'=VW|ş=!.>/&I4#?xy&#@@@0QQ @(i',EEzej煭4aɣȘS<RQ .s> \\JFMLLؘUH< iaaO zy~Ef.>]KE5:wOx< Пc<HH$kz.4Vs =KxDe>*dn<{J@<** qu0heÅUNKw_f\,455h{{*eH8Lc; I|Ɂqe좯/s"Z.߶nOA7L$ H̄\d@xEe.R*~=|6,..^xMӧ C!1~*tݞc 8H*gT(< (Jo]駹Q= l~~>{| )2LjVwa lk"$*X|8S~p`Q.,7=C)ihȎ`vXJ҇]nJa}p2˱t?'sؽHó{Kci "N BDoywܝgMΐI,=cD.$J]V 4T*q_꾼Be~ļ]bšp\?!Rvqj̍4 tZmg9 I 2[YeʿѤ! %5WɔJMcbqq.>v߳P(=}zqޮIfMy 0SQ. H6VzV;W+hr[yf32@h,ׯ?Yvq<~T2RI %>dIb^r6g1Ji7Kwvvn Ǐ۝;wb]J!~Ш|kD$͏>9:OZq!߳ u:VgDɢޠ q$֯Ir4Ҡ Ie# RI.f$͙tVWs,DWR):QnGRTGFω,#h4/" k’1gdww;^Ύ$C# m!˼v,*`r-N9qzk4I'Qo2P! Iem=!LNN'NJɏ=rL ʿvI:KDkH@@Ns5+gW.=GF#VO!.cg`h00?277q߫T*Caa=yH`PD ts\F#W5xS/Hwݬ H㤡gH@Ǎ&OH;u oXI=k$"6ύtt@A@Vi& Efr1z"R/x0e\3T }qAKF;0uommz"A)" Hb 3@Jŕ|/*ʼnJykO)wp`蔏9h9)zo31 sdnnjjn$,HCO9  Z|=Z.W @q=j$Vy%)@giT%A0bӧO?q߫V+ћ3\p~hidq0 "<+eg1cֺ &T,7gk#h˿nQrpȩ*iT^p޽{Vp?/2,k<*czBR*X A1R3$sTR3R1P2vVWW377W螞֜HJHtqEt@VnQԊԬ5^<1}LZI8o4G%* ;T4 BZq1C*`ДJY=|D>okƢ~{\-*xy%.@&vzzZ~2t+K1 Q9Y34! @ׯ *UD$Q`<|paa333q۳Ǐe_2 Y‘Jڽl^S2@?o&E{LjT֮4|Bi;ݡr }ȱz<7y˗?ezzz7;;;FF. ]n(fU :FNfn^=mgD`/p{Di.8  ._ooo#"*=.>J*RuOq]5J 9rFT4j,YI$mB1wH@BH_T&EUI{_]]-m}idb⿓Tr"ż̹ IP]uR{fލnUGF+{K Qv,`tɘOkz%"iyo)Rj/0/ `$`ЬoQW+~!D)S @Hf^Ġ @ޢGLt${L隆0;X4lX!JK.}իWP(\JYR!YÁiGzx%%0;4@; uu޿z7JhA)r D\*c7F* mJǏڵkxjjRtxxho񆝞2DN9;.%C{kDI;ZہqFe|n&,CUcbЄ+{$8$ˉm;&\5ODbBRލ7>}qqxXDN.>F*I7+iGJЁj/ĕk~LhzݼG,8ry7@o-A҄pt %D$&!?;?-i2v߷m.>[ ;O"m>0T;0@4+/@fF}мfqozz! $D#5Ҍ/"H,HTS*v?~[nwnnBoµZ@*x=txƼ< v"dVbieS>hH-r_c@ DO~yODHr!ݻwh]8 o;FQG%nxÉC4#׃uP!wJA,sbLnCa|-0/߾}ϹsnCLE?.=Ե㲋\LH 4@/i}vhZ7Ozģ2i6Ri 腄RtkW͛?;99{r /ғ'OHT럺.̑*gWҾ\D?%c']+"6C^f)rɑ2*wH59HRך"ZW6Ѝz&I@*dM4>S*& 3J%V,BEZ*UICL}V,Ǔ-йcOH|ɿy= ڹ ?q?W~ݔj2f@*_W =?NhŮQ3-,Xv( T*s߯(B𩇇_\.|DIg~q.ϑ$^i"-[.*ew<Fu!H qOT4j2j$DEZ jp 004>H.p\MJ]:2OTҸt‡<رI;or>?zpܶ,+]@BHQ"}ka,R4 8_ݻweoopv >6=Ve)çd$Ga}m6ɩ.үKH0-Æs5VzS兑}ӣ@ed_tF C@ )xBYzѣGHZ%ĪIj>.?|cm<{n_S[, \VV22eyw.x`n N_GCDS0l入[ ̂LV ⑀($6lYTFew0^}gtYa1)^&2GE4̊ pȹ deNn $jYT3[?QD{VHw -f`.%(~\Ld/6}D E2m e  ON,$BRfb;յhNZ8ld*ko93jd)Ô? :rrϥxÿuN9U`]3nK@D v/s5gQo47S  @{pؤ ` ӐrtuYJhh8 Z q9 );f^8{>φPH@#e!yn%pX\,xÆǛѕĢxQ^òrȵ} 3@Q[7B7ZHCBp56&LqQn%KHCCLX7rcJ Fa6ukeުV?EVsn4cKRMvwE^?r`tYiZBjo$$j r>g?1]G{(0q\ElqŪzHh^ڿGKoVeihԮ%r1 V-+Jj]nv2;) vDZ=$  Gc'Ρ (>3?%YYIDcԚ]+a懒c8k gxmζ.gc?RMZQ 1n 5 2, ;XwWGt ,>y6u#Iڰ'}e=08 &I R$%ބN.hPxH fU ɶ6L6oHh'(}hg! Qǣ*t 8|]$oUCY f]%}=,ax>?]qZ)0"뺷y1b":wAF-$V۬ ^s=F򓔒L,..&!(,>eGKg&s}ru7@Su( Lx;n F ? zHjxK[Ưu^- k"Yphbqgܺnx0B`M]TSG[$2p+A/9.tҝܹ{vݵ7F3f ցd@@V Hc"`)ytv aw 귣vذc4P-mמ9[݆߰T3N Jfe) 8[?*eυ6vӢBoCC@XF4KA7Pk[t޹yp 2DYܼ?Ve_$ >fNH)(3KIfeA)Eqh8kؚ:>kc|.VrvLm# #`)]%V uo,5j@c7~#9w7z3|Ec\fe^=DVْSd ,$c)}4GPX7$eEYH f])]\c# tsl$Y~;TQ=sn HB(tZANLb pzbg8^5-,$is놅CvX~w5,:wwy|T I.53E<cُnQdMDl ɦ;m]6Rά,(gzkyȏ`flR5cM[D#8-FE\C9oV\ιxt}O\gH<dHpqUu-w ţXPJFHUPʉI%!  t }]F` ]ZmP C@樽1Bh-~7j_Y Ƴ n5rf 慢&HqVұ̚ J]깐X0=uuMRH LsX00=儢8g&sscKg Q a::цtEP7]Fk;mHx߸k@l XwH>Φ5 ^JB"4+eBxtOI<hl2muˏBR7v:n~!"I#uc "-g mfZ]&o}+[%,r%˻D$zfE!\=8|##Y.CcG<;%ϸnUMee@gn|Q&2\q x|my{'&MbiBQ-rv ch`v`<FDsǧ #Q-۷ YZԡoCw $NFFviԓQvد%'>ʂ;ĂM"ѭ瞺8kQ H91)I%^ -4I1oJHq# GQ(JD$K{nhq`Hoႀ=C'2-5-@nM/1i?"[2Fd=@a53MeڳT'"6ƎEB?>k*t nX%Gw56(h(Kst D(,XeM+kn-s҆Djji~`yQ* E#w9Q L,ŷt/kem,K[I0|G7Gn us(!IZH\h!X޵ʲ dÍuʄf'Ʀ,mI4(+=%A)qݦI=^$$m\Ql[v.+thG 4 Ѕw:yqn%B˸Ubڰ@Bzn*MU# Dс(6lbA)az7fp9 NNSu9(eaw&vl}f!a_gh#cʉCMd(+3[/AXHu Gd!~>JG$)o죜}],!$4hNw]C@X=48λՈP K<|o0@iʊ>~3_ϖ;iKQ]Q+\R⑿B!(%09&控D:(ʞRIAsoXI*_ܘ~$|R0,1ZrkVe*)8[]Ȣ[;7܉;@4TQxţa0!m]ʾ#1?ƷGaōRvA9"йkX=ݸ KtGиZHvX9[vk"⾻DaҴD3],mX8ڶ0ƒԋ~4xD)hDll]פu0/ i1`e-閑Ew`5r٭)%yr,%k:g ֳ,M]#myt~R/nImhd O*(ea<[V}4fBu6 gs  ru;\t+,?Z33lT! 3B'%)x{6)e^rF)Xb1;mюsF( WE翌tou BV£6T ~4!,$Ɓ;` >G}V}F3xx>TIu 0'|apŒY^TJ H9Q)xfAj2ޣ|8s*B}3KQl'u2ocLj~* ɿ_I8"; Vq]z.(U7'HR9lܽ^:h2l3]8I{kn7QL?١UN [Uȣ:_^ZNNejN|<%$bf!#oyţϿ. m"7fn$I(VD̺0`Y ܩy՝Dq[n֨XE*1 RH'-fn9Dnz[l$]J4 G8Uj}|j#xP /6afR/*L9(}j}7iu}]}ՉG[G|@7,/yYy$GUBVv_r*x..pŭUI"6Zb[R'.-t|6P%T' mFN  WhiK߸:RRGa-$"ģ\R,h.w((}%:٢ݼHD 4$XmZ75 7>wH/ ŋrt\ 8XJ^, H씲8(}ԏK0R.(qhGKg!!$,hwc} $uC6(6k"BzakvZeWB"]pU!~] 2xrIm( FJPw:5^)@#; V\ݡ8(M5$y HuQi;t80#:-;b"&]cW[o*(!KZg.T #gu>8#m䅣PD BdXX t8% 2-Y#dG]JvfdhJa,`s:΢$ce,cԯ%Ī%jk 8d6iO˼sz(HqpmF5B,#ÚRM,G^ R֑Q.e_l>i&>^@|XO4'P-\;  9f5v&#oaf!Bz7vRXb,}=q&ಮӮTQGd4E@ uÚ18[%ɶQ.XZu8tXO4+ehؽ:U%Ӫ UPB>?cq^">zS0tndgOle[,~l#w#`hb]glF)CMo$GGV>¾v_k=OwtBsd!:kw] -P*1Vebi5b[XD K|0ec|`k] -r}I4v2[7[a'>ţTcKי碱zk\cαn,nn8ZQe6ܸ,ާҰNrqa`ɮخ.=r_&\{hKuuQߍ4udYsѨHPe7,-b=t)`̂\OʼnIż(IcHrcwh ZHj]7zЍ{6y G@"=oݱ3a~םtD7Z_Mͮ{Xg}l55`~t|x:RYH8MwJOZYH"@u]}H鳏b\Qi%2 C>cp4=7n^+`UHHYڷټgTG醥$%x͎2k&k$mZR/@ufXnku]Q:`ޓaa\<^_kC7Ql>ch=[ܠ[60~mYY[B|pgcA(F껉 n}`k&[8+V^9s. )Oc:/)hQ}Nn !ŎaóHm4kXt_ 閛XctŪW% P]zUqg!`,ױ;ѵkwXmˋHAρppssu]<XE#7z;TQ}]*Ɍ#ކgXG:ќͨ]p 6ޱF!ufƮ[  Z%"[M(BC349OQ6vqR/hg3CLc8s 79Ժ.nxwc E &Qξ.WgkG0a3HAe1T6v\y[UoD, JUġ-iR(⑂Z޳WYD; 3 H^DHA٤]rH 8t1Dt53;?e}TRGa}u ǜG#ј/ABBuӜwK#D7V\tH+/"m-Me!U6Ţ񭠅䅪8 `qbrV908>Ba Fa֑7qMX<:t8(e_dhbCFD٢}4ko ?&V(!mAV.R,ApN\Ml[:ワ0 FaR|Q4r$X&2=YU)˸RQʂnMvB(} QGY:q9 u}uF;e75淺&>wk܇VHgP.ϯ6o [ >A}P .dtU|Cw?ece!j! ò uv̼gr.=Je Cq,gEl*(}Է \ G0#^@ڦ+fh3\Cd]WccAecխqUI;P֨_*v/B>v̍IENDB`images-actives-html5.git/src/share/themes/accordionCloud/img/unlock-icon.png000066400000000000000000000027371250410645000274070ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs  tIME PYlIDATX͙MlTUδ}W@hmB"q1@pB|$b\;\3*4q&4AP"ĝPBCD0kZδvyseSս7ss=3 Sjl6y /+D!:C} @:L<M$e>b 8Wk)97e5;ùSZs<|`y5ɝ~uN/djä ̓U`94ɡ]/tmc$%%^3$iL;7qBy ە^Hp.?*hk!7j^*DS4tv2OK)>,/;*+෿Fi#>z$]+/\f4%i(&LrwjCg1gゥұJ9= @B[_A&`&[FNI UKt YS9>7Xz\"$RD 6fS&~4rq^XYi* 28O"u>WPZ{80n~%.U_ |ɦc( ڊ/?#M%ٶMEi)xfs_'eְD^D(Qt32mYsF6̩2Z[S\ *bvQԄx1Sr)x_8۾ ,IDiZ78 \E uYSmP|ܴ ejj5Dz:: ̦M=7J$$i6׀Kt# VM`..Pd ?``A>}x; c8pL7٤Sx?Xd>(Pȋpf Jhqat\F)R1CбÝFrR.c@x4+jo ( Ms$B;% )_VLqJD MVCrF#҇JFWP@XFSYĻZ1HvT9}h ~BI t;{B/2+]?:CVg:4o^g]1eH d}!52~=NVz}!P3oXE/*U^g <3ѼEh%h%6**_zH$"F,ОO`o4.cW sd(3"r*)GP8}Eӏphb;~0c@~ ƎoNy܃O:mk{qT⩪S*C{.uW/;icgUV:)As7nxsF/@hbPiWSG7<,(M/rOCHÄٙطiιY (?L2[RC9JQ2f|.g~&ZaǜEv4#׫ bR?Ld }tUt;72{{mA 0RhCi%u׬[]v!5bʹ{[ݔ[D5+ 3Anlu/s$(yU~4E,fɍ뉴48j=%Sx~8 ۰N X9( ͣC泤Gj8kLN;Bw#uն}`eakffՖ̎7ۋt fmW`5a}$Ny4Z_H;8HA)LC؁uPF˯wzg5PJQ2Df|VsTի:]o&ڀ(q '_-Np007&TbX |'^\yA{,B!=~uӻuަ{Ë4^$zSr<520^vc/ ]Oe[J_)e,.-{FQ o,C5>ƶd`Xi@S((R4#]iPH/t00lF[wҶ)y*}xU ]_A%p!ʔTg~N#-`˃Ξ'2nj|㔆l#Tʪ$/UVwz!ס(=rsSTBjh":^{]ް53uS:oM`'z@ JmģL:3ԯiF [ﺄHQ7r2vXXcv#Ic>r<ӨW:+KkŖ.ŌGRJ|po)oU-)}yKKۭ)`>K&f)O4^|+S @m7ߏ.JD"R/O 8颱uW}_Es&M}x8=9jIdzoұV_|N% d)YrtSK ˾ j Ȉ=وg~ʎZh=U LYrcM4? uU6^'ιj/pi8DP ~0k#HЧ KC婟ϯ5 <}Heq#Ys)RIE?D+(aP0u.Yo2[{dG/07+wCv(E˙[ ǎ`Ɛpk@Jkn^Vᩘj26B\ ̡LS0ReHF9M*]b]t,If">nd`{ )>xʎ9 ǝpyB, J|augUT=#1Jezhޡ$*S YɇQ?ҹ'[c JP8{c9`॔9ֿ- .$Lhv7D{1k#ft+^ZA^@ټ襕6iN 0< [# F*.@/{"ī}RZ.v0PD8PP}9HNl:[Wsn'> k">Y,b8>nf<N>`}۽{:$=;-fJ, \\C %@:+51ÈӪF }8c _k\F_*)0cD#p+t8I+2 #Ư%' D22(ׇJ>" KYd$cO:cfQ kD9[쯏: )y:aQV* E@ֱWI <m Q@ ,G`Bwc Zk6ny" lŹ4AGcflL=8/LŋcU`M9j {&m:3/Q>urIENDB`images-actives-html5.git/src/share/themes/accordionCloud/img/xia128.png000066400000000000000000000130631250410645000261740ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs  tIME  $1XIDATxytՕo7yǖm"`08 LBd0p8ä-8!4K& $ Ɓ !Ѕ mUꪚ?ȲdIUBI)}nC@‘(ty<0 L2Hh0՚~1f4UgB.9b`)P!5+g4U1DqTـ \9]ܧʺa$O*˧j*5Ӏ`%p*[/.l 5U1@)6:p$z$ex@GX;Oٹ-H4ǜ mt'Wp$S{N.}qHa‘hVr۪_Jђl GiD |  < 9њ(AJ媷.J?p9KM? !cHTByKS9H B@50ٛJB`~!.MU&yVةB;QٓB94D_q+!$9 *`[@F\SOa;6_mc#An?B䎝@AHJ4Uil_h툲!̻L? AA;/fGo;a)?_-֍'Jɀox+VĮo԰$S*8܋dBD)Ñ:`'`MSd0x!$G_ 4Llǻ#atXDqJ`!pg~!^Hb'4H G!%P<qWA.{]DtsRHA,tˮ TKݿDW F.Lz`33q0>k‘9vf4 |Gd_x@@UJ%?Q!>w)nw5~!lL ūÑM@>2zg(3R?`20ɟh<٬Ҋ!aÑYs~Կ ^,=f*CHtj~{wlޔS`B8ߗ8^'7VS3Pɟ:!IIFH2$x/- Pӱ ;)ĆOu*f"!W?PHBdHtiaV$B_a_v?~dCG޹a`]!):O'obaU{SʔjNj=74u(;k1g-!wbVa Ț}z]e 䔑d<˖A Ӹᯘmej N` (9`;Q!z:3#d4o7NA{KLoh|U֐5r"e\NI"f2k~מn:7/d S4Ui>!h޺m-u2/T-opdkxz4ɟv>`M˘ʧ2})~jLFw8N7s[hs*O+%gl%in#m2v?yTߧL?)ׯDo4U'q?R;W8iE yEdh=B-dCׄILtW!u (=Oޞ"Ulh,b1^hoI狃@BNE[|D 0:Y ٿyNUwp!a3!s7D>g0NJYK0 cH`:O) 4b rQ 5iKφ#QKX fދhx71 qBr$TVA**fLӠCi޶ï=E~O Vr'bvS/!a_Q2%\Ϧ;> S 17PT5`A)F">pS&$`-ЫOP\#ǬKП6_o> 1|-#f_ocL#J)|+| !;o0zJ霋i!@OBYD8Rt<&^}?|!lM`ZRQ^gNewz|KCyklǖ KKν 9a"+h^W,9i$ӸjYN3P.ABe㆔ ';&3LY>\EZk>gU6_tb_C!CotEIr %xmM[n%ZB}q/z[8v?I: c~ 5]\“灞+ӸᕮDH2$Տ#Ax%Իƒ쑓͎vYfn wIN:s.=K@ f%`7CC7Td!ɟvQ FG;"p4ر=Kߺ(Kx*bgvh]#w-'t@l{~'$ aqIֽzk:94IS^sv4;۶(_ f;~)7Cج򉘺Em-eRx|0ts1 dSQWuMU:: R `rvg[V;ydZO+h&dę6y p2n 9zܱvoI Y󜞔%}opۙw ;T!2)Ŵo=5\Le K6#Qnr$#*(RSR5c*uV'>ޑ3DV#PXwMHEQ@*g`IՏM^- >FlNK%C;IW`k2Oei8RK >L1r5 aQ_7=ӣ2:ȝX=t6X$4U&g -w&g^ C C||`/^ p9Yf}_ACEBƒt qiۨ珎H%1bŞ)Lu}n:X-L ZAѶirqvQt>W9o {V-O/eGvBi5иlllz#Y}z~G3=iN"ف-?y[rsv۷YhIOh*x+#\TG.4|)cl{!v3J!|TMe=o |)Z*[^vB8BHlJ8#ֿvu\Te3Иi-0vɭI3:|"!ŅDl":uo?&Q4UWJs^@qxAeZ vVd)zkSJ 9~N=HhC\'8Oh?ਃ?M?XZ>SAҬY 5v?q+z1iS#1kZ7>?/ޞz s]&np¿\I=vƀ`($x-5'.dcc&\6X;C{`A\H>$jݏlzrPe* #h5Ҽ-j׮J41g1Knu/T帝`Dn4o%MGDsO`)Pwi‘J 5eeCr4t.s.sO>~MU2^S1 _Y>&eg_BzaO=1nR|*. nYϚUԬ/߃_z%T|nV~ظzExxLJϾIK t6^^|Tځ~' cC|r ];!gLʠ *4Ht!g&-?ʿ{r7|Sk{_U𿨩>hk{1Lf3ɅU?+Py3HlWSՃQj4U!N, D͚Խ:9*. 9^TNLB$LjrC{}k/gSX9BS"v7֍/"@70|v j׮ -L\۴u9iR~ν1'SZ |&AB;b]qj\+HVvlgdZTz숉܄ 亅ΤAd^>ɹ8zU+=|SH߉38e;љ4*AG A J0ִ WL⬮B iԃ,Y#T4Ak0V )}8IekqﰭtV$YxثGi$0K[m0#HZ)f_t%o#7+Ŏ:ĆRr@l;BxJ{)E)E|l_c bI~ {rpŕ@ΎT)_XkG*[2OYFJ?E/T#2*;ܻ*%_=^;b%#fs. B;iNC b%IENDB`images-actives-html5.git/src/share/themes/accordionCloud/img/xia32.png000066400000000000000000000026111250410645000261030ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME  %,t٧IDATXí[lTUVJ[Jkm("3E^|A}P%j"!@A@$A0DoC,Ԋ/d Z CCzkgkmAx.8v xpn66r4`?h0K`_q&dܩNb"o6lx+S6D6,3t&*P &iWZӶ{5CO=@Ur9d/MKۧ矦{[n8@|nuD'yN ]n)Hm͚8]+{0"\quϛ֢B;5=*[ v{dmV}`opZR2pWc'2jlP-6uK5fgQ,. z!Lf:֊X1s ts/MJ1j,fn:tA]f`48z=dsBR# U0kp(f!ZѶw} !2")度17,\<<{wLWR193K49ڛCJtJӨrk$Xca2xM# bγ(-/v[K'l%p*7EdRƬ-تj3! x۹{$ z9b hm)TralE-UՎ|ұUNV5#H(Ak ī\q*7Z# 3q&,~5z*D텈mci)σԭCelAZlINr!s-*Bz8@ٜExx?l"T8PfhDCar$H3c<3B@]g}df̼C2PhvBHSc&,BJsK}ܟ4,t*4»O&MS4k):pQ>_4B2ǒ؏bPkY=@T-YE`**}tcQIVC~9hV $ֱmƌT8aA`QF\W")q MɃoO>ӱ"e+>$#Vmz\=]u_%q:#kHz7׬)s hM'=,!a.ܓ4qO_w]B-8x)ٚy{L2C@zzAcN|p7 z`|q: & F'269q7WH|IENDB`images-actives-html5.git/src/share/themes/accordionCloud/img/xia48.png000066400000000000000000000046531250410645000261220ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs  tIME  %c2Y 8IDATh޽{pT?{ $( >u/[NmZ+/-UUhgtth`ŬvU¡juPƺEPcdMqMf z{!LCONFn}]U`/1 =Z跋1q`l@04X\,]Exl7 }/%(!ss]>v5 +{J =`=~b5`(< ,拱6`iDB`h+@x|(rK`* Cbԟ20u e"FϒwS_@E|,5wй`:qٱ(O lCBUiA Ν ֚ЄJsRС0x EU,LL&`th<΁}e $+(h>mM&d jv@ځu"mA G@ړe&/c)>gg%D<9 ݟw%q'B!S @04f-lٸ[BTnӁ`nifRNa$ؿnv|qLU"j*鳩MkAUǀLC՜ 9؍V᧼i>V,R慎|;bќ+q#H !ڵw^@ ~b}!v|8ZpY8zoo}ȵ Ji̺^E1(EE ogI_xtPELC?U@GW||vz۞GQS)- OM= K䯢ʱ"aȎ-XN`E3i^u?)H(=QO ? x΁m9v G(J.ȳ-9^K|M4`iEϡ/XFI UϠEAJbG:߽sWT>=̽ys1,=WEhďv1[@?k̸.ʦFZBN xBH<3,souZYmYH˚NUs;snڄnvb$i#m ;>Bܳ8i͓~7-ihU9W߰Ky(kB=7;ŎdW{oбG?v#=bې>x) u<B #?v#cEBn&_£<=s͵BR03y"áG'A2sࡌ6EA G_J;3e,Wlr޶7hUS@ ߕY 9&H!0Id2Ar ^䳗?{:_^H~1 'pw 1ʇgfFB\U";> -9o&(h*m境мz519y %;_r%vb$߷:MCo;MpЙn2NuAt}J51ijur~ԅbp0>V臻GRE@㞯oh]AyN= Пξrl, w޶H{@[(P<^j~V㩝6^eNLC7?π0 ]:AlpFۮfDgD;? `htI! q`io&eRNupy9k"zLCk!&g5/>.4 x@@x?4'rm҃+OO3Q^H B!Mn _9c"RUIWnN@g3Ҩ0 t3|B IENDB`images-actives-html5.git/src/share/themes/accordionCloud/img/xia64.png000066400000000000000000000054251250410645000261160ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs  tIME  %HC IDATx͛{t?wf7@L$1Y W COe@ Le]Sh BQgc@Gf݇뗱g+avf+;T{{ϼhXoca/f$i+I_Ͷ&>;E0K ˒3'W|s=U>7({/)':Og v [MYI;) s39m;Ɯ$s|ӓU'EEEƢ4}ʧ~ j^Qfڔ.g$co߬xCKm,$8#@(iXɡ(Urc&#XQrPr>|v߄A #ޱ]՚.a&d';>&ϢlTP +B ({|8Ҳ}%].F!ޮ|{b~>K)i? +tr#߆Rgm$܌URJZF G:+*KˢF{ ˴'AO8L wryE>AdFx9%q jKPȯz@0SI/7԰뉵5j~1#au,/gKCVZ46}tQr ц j&R"Dh% 8)9yǘ?jip I)L)>?o_ֹn \жk)՝3#H+&K '?>ط - . ?m+Wm{mwF3EnŻ7p}mEF;6㳹㉵E*BUib}uRI :?6dEq_clfvk>x* s܀P2bE5S>ce4o^a?OYohӢՍ@"݀`9:hH?~coWE | {9{k'ǒyBвy;鬟)Rwrd Nееn$%#qw;LhCi2rNSyJa`d7u+/e-!3G5lF  x ;6HeRT3!,rznkOZQCVb5p=}Fե;A&gfNN,j`U-_ ZŹ+yT^>3.>׮2tmr½N!=/W~V4o7m;7mkN.+k(:>u+NDgڥ9ta 0&|~/&ڴ3ҎPT|}V$2C$C.srg}. w:Cfxza!~st ]{){CP| =MI봫 d[ ](*t|; ];㐛w /x*Xn4:tk7eQf`^]Ӽ {{TITLE}}

xia

{{LOADING}}

{{datasJS}} images-actives-html5.git/src/share/themes/accordionCloud/js/000077500000000000000000000000001250410645000243075ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/accordionCloud/js/hooks.js000066400000000000000000000134501250410645000257730ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @constructor init specific hooks */ function hooks() { "use strict"; } /* * @param array layers * @param iaScene mainScene */ hooks.prototype.beforeMainConstructor = function(mainScene, layers) { }; /* * @param iaScene mainScene * @param array layers */ hooks.prototype.afterMainConstructor = function(mainScene, layers) { $(".infos").on("click", function(){ $("#overlay").show(); }); $("#popup_close").on("click", function(){ $("#overlay").hide(); }); var button_click = function() { var target = $(this).data("target"); if ($("#response_" + target).is(":hidden")) { if ($(this).data("password")) { $("#form_" + target).toggle(); $("#form_" + target + " input[type=text]").val(""); $("#form_" + target + " input[type=text]").focus(); } else { $("#response_" + target).toggle(); } } else { if ($(this).data("password")) { $("#response_" + target).html($("#response_" + target).data("encrypted_content")); } $("#response_" + target).toggle(); } }; var unlock_input = function(e) { e.preventDefault(); var entered_password = $(this).parent().children("input[type=text]").val(); var sha1Digest= new createJs(true); sha1Digest.update(entered_password.encode()); var hash = sha1Digest.digest(); if (hash == $(this).data("password")) { var target = $(this).data("target"); var encrypted_content = $("#response_" + target).html(); $("#response_" + target).data("encrypted_content", encrypted_content); $("#response_" + target).html(XORCipher.decode(entered_password, encrypted_content).decode()); $("#response_" + target).show(); $("#form_" + target).hide(); $(".button").off("click"); $(".button").on("click", button_click); $(".unlock input[type=submit]").off("click"); $(".unlock input[type=submit]").on("click", unlock_input); } }; $(".button").on("click", button_click); $(".unlock input[type=submit]").on("click", unlock_input); $(".accordion-toggle").on("click tap", function(){ $('.accordion-body').removeClass("slidedown").addClass("collapse"); $(this).parent().children(".accordion-body").removeClass("collapse").addClass("slidedown"); }); $("#collapsecomment-heading").on('click tap',function(){ if (mainScene.zoomActive === 0) { if ((mainScene.element !== 0) && (typeof(mainScene.element) !== 'undefined')) { for (var i in mainScene.element.kineticElement) { mainScene.element.kineticElement[i].fillPriority('color'); mainScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); mainScene.element.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); mainScene.element.kineticElement[i].setStrokeWidth(0); mainScene.element.layer.draw(); } } mainScene.element = that; layers[0].moveToBottom(); } }); document.addEventListener("click", function(ev){ if (mainScene.noPropagation) { mainScene.noPropagation = false; } else { if (mainScene.zoomActive === 1) { if ((mainScene.element !== 0) && (typeof(mainScene.element) !== 'undefined')) { mainScene.element.kineticElement[0].fire("click"); } } else if ((mainScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (mainScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { document.body.style.cursor = "default"; mainScene.cursorState = "default"; if (typeof(mainScene.element.kineticElement) != "undefined") { mainScene.element.kineticElement[0].fire("mouseleave"); } } } }); }; /* * * */ hooks.prototype.afterIaObjectConstructor = function(iaScene, idText, detail, iaObject) { /* * manage accordion events related to this element */ $("#" + idText + "-heading").on('click touchstart',function(){ if ($('#' + idText).css("height") == "0px") { iaObject.kineticElement[0].fire("click"); } else { iaObject.kineticElement[0].fire("mouseleave"); } }); }; /* * * */ hooks.prototype.afterIaObjectZoom = function(iaScene, idText, iaObject) { }; /* * * */ hooks.prototype.afterIaObjectFocus = function(iaScene, idText, iaObject) { $('.accordion-body').removeClass("slidedown").addClass("collapse"); $('#' + idText).parent().children(".accordion-body").removeClass("collapse").addClass("slidedown"); $('#' + idText + " audio").each(function(){ if ($(this).data("state") === "autostart") { $(this)[0].play(); } }); }; images-actives-html5.git/src/share/themes/accordionCloud/js/iaobject.js000066400000000000000000000736111250410645000264350ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @param {object} params * @constructor create image active object */ function IaObject(params) { "use strict"; var that = this; this.path = []; this.title = []; this.kineticElement = []; this.backgroundImage = []; this.backgroundImageOwnScaleX = []; this.backgroundImageOwnScaleY = []; this.persistent = []; this.originalX = []; this.originalY = []; this.options = []; this.stroke = []; this.strokeWidth = []; this.tween = []; this.agrandissement = 0; this.zoomActive = 0; this.minX = 10000; this.minY = 10000; this.maxX = -10000; this.maxY = -10000; this.tween_group = 0; this.group = 0; this.layer = params.layer; this.background_layer = params.background_layer; this.backgroundCache_layer = params.backgroundCache_layer; this.imageObj = params.imageObj; this.myhooks = params.myhooks; this.idText = params.idText; this.zoomLayer = params.zoomLayer; // Create kineticElements and include them in a group that.group = new Kinetic.Group(); that.layer.add(that.group); if (typeof(params.detail.path) !== 'undefined') { that.includePath(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.image) !== 'undefined') { that.includeImage(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.group) !== 'undefined') { for (var i in params.detail.group) { if (typeof(params.detail.group[i].path) !== 'undefined') { that.includePath(params.detail.group[i], i, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.group[i].image) !== 'undefined') { that.includeImage(params.detail.group[i], i, that, params.iaScene, params.baseImage, params.idText); } } that.definePathBoxSize(params.detail, that); } else { console.log(params.detail); } this.defineTweens(this, params.iaScene); this.myhooks.afterIaObjectConstructor(params.iaScene, params.idText, params.detail, this); } /* * * @param {type} detail * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includeImage = function(detail, i, that, iaScene, baseImage, idText) { that.defineImageBoxSize(detail, that); var rasterObj = new Image(); rasterObj.src = detail.image; that.title[i] = detail.title; that.backgroundImage[i] = rasterObj; that.kineticElement[i] = new Kinetic.Image({ name: detail.title, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, width: detail.width, height: detail.height, scale: {x:iaScene.coeff,y:iaScene.coeff} //fill: 'rgba(0, 0, 0, 0)' }); rasterObj.onload = function() { that.backgroundImageOwnScaleX[i] = iaScene.scale * detail.width / this.width; that.backgroundImageOwnScaleY[i] = iaScene.scale * detail.height / this.height; var zoomable = true; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#000000")) { zoomable = false; } if ((typeof(detail.options) !== 'undefined')) { that.options[i] = detail.options; } if ((typeof(detail.stroke) !== 'undefined') && (detail.stroke != 'none')) { that.stroke[i] = detail.stroke; } else { that.stroke[i] = 'rgba(0, 0, 0, 0)'; } if ((typeof(detail.strokewidth) !== 'undefined')) { that.strokeWidth[i] = detail.strokewidth; } else { that.strokeWidth[i] = '0'; } that.persistent[i] = "off-image"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#ffffff")) { that.persistent[i] = "onImage"; that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); zoomable = false; } that.group.add(that.kineticElement[i]); that.addEventsManagement(i,zoomable, that, iaScene, baseImage, idText); // define hit area excluding transparent pixels var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min(parseFloat(detail.maxX) - parseFloat(detail.minX), Math.floor(parseFloat(iaScene.originalWidth) * 1))); var cropHeight = (Math.min(parseFloat(detail.maxY) - parseFloat(detail.minY), Math.floor(parseFloat(iaScene.originalHeight) * 1))); if (cropX + cropWidth > iaScene.originalWidth * 1) { cropWidth = iaScene.originalWidth * 1 - cropX * 1; } if (cropY * 1 + cropHeight > iaScene.originalHeight * 1) { cropHeight = iaScene.originalHeight * 1 - cropY * 1; } var hitCanvas = that.layer.getHitCanvas(); iaScene.completeImage = hitCanvas.getContext().getImageData(0,0,Math.floor(hitCanvas.width),Math.floor(hitCanvas.height)); var canvas_source = document.createElement('canvas'); canvas_source.setAttribute('width', cropWidth * iaScene.coeff); canvas_source.setAttribute('height', cropHeight * iaScene.coeff); var context_source = canvas_source.getContext('2d'); context_source.drawImage(rasterObj,0,0, cropWidth * iaScene.coeff, cropHeight * iaScene.coeff); imageDataSource = context_source.getImageData(0, 0, cropWidth * iaScene.coeff, cropHeight * iaScene.coeff); len = imageDataSource.data.length; that.group.zoomActive = 0; (function(len, imageDataSource){ that.kineticElement[i].hitFunc(function(context) { if (iaScene.zoomActive == 0) { /* rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); //detach from the DOM var imageData = imageDataSource.data; // just replace scene colors by hit colors - alpha remains unchanged for(j = 0; j < len; j += 4) { imageData[j + 0] = rgbColorKey.r; imageData[j + 1] = rgbColorKey.g; imageData[j + 2] = rgbColorKey.b; // imageData[j + 3] = imageDataSource.data[j + 3]; } // reatach to the DOM imageDataSource.data = imageData; context.putImageData(imageDataSource, cropX * iaScene.coeff, cropY * iaScene.coeff); */ var imageData = imageDataSource.data; var imageDest = iaScene.completeImage.data; var position1 = 0; var position2 = 0; var maxWidth = Math.floor(cropWidth * iaScene.coeff); var maxHeight = Math.floor(cropHeight * iaScene.coeff); var startY = Math.floor(cropY * iaScene.coeff); var startX = Math.floor(cropX * iaScene.coeff); var hitCanvasWidth = Math.floor(that.layer.getHitCanvas().width); var rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); for(var varx = 0; varx < maxWidth; varx +=1) { for(var vary = 0; vary < maxHeight; vary +=1) { position1 = 4 * (vary * maxWidth + varx); position2 = 4 * ((vary + startY) * hitCanvasWidth + varx + startX); if (imageData[position1 + 3] > 100) { imageDest[position2 + 0] = rgbColorKey.r; imageDest[position2 + 1] = rgbColorKey.g; imageDest[position2 + 2] = rgbColorKey.b; imageDest[position2 + 3] = 255; } } } context.putImageData(iaScene.completeImage, 0, 0); } else { context.beginPath(); context.rect(0,0,this.width(),this.height()); context.closePath(); context.fillStrokeShape(this); } }); })(len, imageDataSource); /*that.kineticElement[i].sceneFunc(function(context) { var yo = that.layer.getHitCanvas().getContext().getImageData(0,0,iaScene.width, iaScene.height); context.putImageData(yo, 0,0); });*/ that.group.draw(); }; }; /* * * @param {type} path * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includePath = function(detail, i, that, iaScene, baseImage, idText) { that.path[i] = detail.path; //that.backgroundImage[i] = imageObj; that.title[i] = detail.title; // if detail is out of background, hack maxX and maxY if (parseFloat(detail.maxX) < 0) detail.maxX = 1; if (parseFloat(detail.maxY) < 0) detail.maxY = 1; that.kineticElement[i] = new Kinetic.Path({ name: detail.title, data: detail.path, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, scale: {x:iaScene.coeff,y:iaScene.coeff}, fill: 'rgba(0, 0, 0, 0)' }); that.definePathBoxSize(detail, that); // crop background image to suit shape box that.cropCanvas = document.createElement('canvas'); that.cropCanvas.setAttribute('width', parseFloat(detail.maxX) - parseFloat(detail.minX)); that.cropCanvas.setAttribute('height', parseFloat(detail.maxY) - parseFloat(detail.minY)); var cropCtx = that.cropCanvas.getContext('2d'); var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min((parseFloat(detail.maxX) - cropX) * iaScene.scale, Math.floor(parseFloat(iaScene.originalWidth) * iaScene.scale))); var cropHeight = (Math.min((parseFloat(detail.maxY) - cropY) * iaScene.scale, Math.floor(parseFloat(iaScene.originalHeight) * iaScene.scale))); if (cropX * iaScene.scale + cropWidth > iaScene.originalWidth * iaScene.scale) { cropWidth = iaScene.originalWidth * iaScene.scale - cropX * iaScene.scale; } if (cropY * iaScene.scale + cropHeight > iaScene.originalHeight * iaScene.scale) { cropHeight = iaScene.originalHeight * iaScene.scale - cropY * iaScene.scale; } var posX = 0; var posY = 0; if (parseFloat(detail.minX) < 0) posX = parseFloat(detail.minX) * (-1); if (parseFloat(detail.minY) < 0) posY = parseFloat(detail.minY) * (-1); // bad workaround to avoid null dimensions if (cropWidth <= 0) cropWidth = 1; if (cropHeight <= 0) cropHeight = 1; cropCtx.drawImage( that.imageObj, cropX * iaScene.scale, cropY * iaScene.scale, cropWidth, cropHeight, posX, posY, cropWidth, cropHeight ); var dataUrl = that.cropCanvas.toDataURL(); delete that.cropCanvas; var cropedImage = new Image(); cropedImage.src = dataUrl; cropedImage.onload = function() { that.backgroundImage[i] = cropedImage; that.backgroundImageOwnScaleX[i] = 1; that.backgroundImageOwnScaleY[i] = 1; that.kineticElement[i].fillPatternRepeat('no-repeat'); that.kineticElement[i].fillPatternX(detail.minX); that.kineticElement[i].fillPatternY(detail.minY); //that.kineticElement[i].draw(); }; var zoomable = true; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#000000")) { zoomable = false; } if ((typeof(detail.options) !== 'undefined')) { that.options[i] = detail.options; } if ((typeof(detail.stroke) !== 'undefined') && (detail.stroke != 'none')) { that.stroke[i] = detail.stroke; } else { that.stroke[i] = 'rgba(0, 0, 0, 0)'; } if ((typeof(detail.strokewidth) !== 'undefined')) { that.strokeWidth[i] = detail.strokewidth; } else { that.strokeWidth[i] = '0'; } that.persistent[i] = "off"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#ffffff")) { that.persistent[i] = "onPath"; that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); } that.addEventsManagement(i, zoomable, that, iaScene, baseImage, idText); that.group.add(that.kineticElement[i]); that.group.draw(); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.defineImageBoxSize = function(detail, that) { "use strict"; if (that.minX === -1) that.minX = (parseFloat(detail.x)); if (that.maxY === 10000) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); if (that.maxX === -1) that.maxX = (parseFloat(detail.x) + parseFloat(detail.width)); if (that.minY === 10000) that.minY = (parseFloat(detail.y)); if (parseFloat(detail.x) < that.minX) that.minX = parseFloat(detail.x); if (parseFloat(detail.x) + parseFloat(detail.width) > that.maxX) that.maxX = parseFloat(detail.x) + parseFloat(detail.width); if (parseFloat(detail.y) < that.minY) that.miny = parseFloat(detail.y); if (parseFloat(detail.y) + parseFloat(detail.height) > that.maxY) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.definePathBoxSize = function(detail, that) { "use strict"; if ( (typeof(detail.minX) !== 'undefined') && (typeof(detail.minY) !== 'undefined') && (typeof(detail.maxX) !== 'undefined') && (typeof(detail.maxY) !== 'undefined')) { that.minX = detail.minX; that.minY = detail.minY; that.maxX = detail.maxX; that.maxY = detail.maxY; } else { console.log('definePathBoxSize failure'); } }; /* * Define zoom rate and define tween effect for each group * @returns {undefined} */ IaObject.prototype.defineTweens = function(that, iaScene) { that.minX = that.minX * iaScene.coeff; that.minY = that.minY * iaScene.coeff; that.maxX = that.maxX * iaScene.coeff; that.maxY = that.maxY * iaScene.coeff; var largeur = that.maxX - that.minX; var hauteur = that.maxY - that.minY; that.agrandissement1 = (iaScene.height - iaScene.y) / hauteur; // beta that.agrandissement2 = iaScene.width / largeur; // alpha if (hauteur * that.agrandissement2 > iaScene.height) { that.agrandissement = that.agrandissement1; that.tweenX = (0 - (that.minX)) * that.agrandissement + (iaScene.width - largeur * that.agrandissement) / 2; that.tweenY = (0 - iaScene.y - (that.minY)) * that.agrandissement + iaScene.y; } else { that.agrandissement = that.agrandissement2; that.tweenX = (0 - (that.minX)) * that.agrandissement; that.tweenY = 1 * ((0 - iaScene.y - (that.minY)) * that.agrandissement + iaScene.y + (iaScene.height - hauteur * that.agrandissement) / 2); } }; /* * Define mouse events on the current KineticElement * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.addEventsManagement = function(i, zoomable, that, iaScene, baseImage, idText) { if (that.options[i].indexOf("disable-click") !== -1) return; /* * if mouse is over element, fill the element with semi-transparency */ that.kineticElement[i].on('mouseover', function() { var k = 0; if (iaScene.cursorState.indexOf("ZoomOut.cur") !== -1) { } else if ((iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { } else if (iaScene.cursorState.indexOf("HandPointer.cur") === -1) { document.body.style.cursor = "url(img/HandPointer.cur),auto"; iaScene.cursorState = "url(img/HandPointer.cur),auto"; for (k in that.kineticElement) { if (that.persistent[k] == "off") { that.kineticElement[k].fillPriority('color'); that.kineticElement[k].fill(iaScene.overColor); that.kineticElement[k].scale(iaScene.coeff); //that.kineticElement[k].stroke(iaScene.overColorStroke); //that.kineticElement[k].strokeWidth(2); that.kineticElement[k].stroke(that.stroke[k]); that.kineticElement[k].strokeWidth(that.strokeWidth[k]); } else if (that.persistent[k] == "onPath") { that.kineticElement[k].fillPriority('color'); that.kineticElement[k].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); } else if ((that.persistent[i] == "onImage") || (that.persistent[i] == "off-image")) { that.kineticElement[k].fillPriority('pattern'); that.kineticElement[k].fillPatternScaleX(that.backgroundImageOwnScaleX[k] * 1/iaScene.scale); that.kineticElement[k].fillPatternScaleY(that.backgroundImageOwnScaleY[k] * 1/iaScene.scale); that.kineticElement[k].fillPatternImage(that.backgroundImage[k]); } } that.layer.batchDraw(); //this.draw(); } }); /* * if we click in this element, manage zoom-in, zoom-out */ if (that.options[i].indexOf("direct-link") !== -1) { that.kineticElement[i].on('click touchstart', function(e) { location.href = that.title[i]; }); } else { that.kineticElement[i].on('click touchstart', function() { // let's zoom var k = 0; iaScene.noPropagation = true; if ((iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) && (iaScene.element === that)) { iaScene.zoomActive = 1; document.body.style.cursor = "url(img/ZoomOut.cur),auto"; iaScene.cursorState = "url(img/ZoomOut.cur),auto"; this.moveToTop(); that.group.moveToTop(); that.layer.moveToTop(); that.group.zoomActive = 1; that.originalX[0] = that.group.x(); that.originalY[0] = that.group.y(); /*that.tween_group = new Kinetic.Tween({ node: that.group, duration: 1, x: that.tweenX, y: that.tweenY, easing: iaScene.easing, scaleX: that.agrandissement, scaleY: that.agrandissement });*/ //that.tween_group.play(); that.alpha = 0; that.step = 0.1; for (k in that.kineticElement) { that.kineticElement[k].setStrokeWidth(parseFloat(that.strokeWidth[k] / that.agrandissement)); } var personalTween = function(anim, thislayer) { // linear var tempX = that.originalX[0] + that.alpha.toFixed(2) * (that.tweenX - that.originalX[0]); var tempY = that.originalY[0] + that.alpha.toFixed(2) * (that.tweenY - that.originalY[0]); var tempScale = 1 + that.alpha.toFixed(2) * (that.agrandissement - 1); var t = null; if (that.alpha.toFixed(2) <= 1) { that.alpha = that.alpha + that.step; that.group.setPosition({x:tempX, y:tempY}); that.group.scale({x:tempScale,y:tempScale}); } else { that.zoomLayer.hitGraphEnabled(true); anim.stop(); } }; that.zoomLayer.moveToTop(); that.group.moveTo(that.zoomLayer); that.layer.draw(); var anim = new Kinetic.Animation(function(frame) { personalTween(this, that.layer); }, that.zoomLayer); that.zoomLayer.hitGraphEnabled(false); anim.start(); } // let's unzoom else if (iaScene.cursorState.indexOf("ZoomOut.cur") != -1) { if ((that.group.zoomActive == 1) && (that.group.scaleX().toFixed(5) == (that.agrandissement).toFixed(5))) { iaScene.zoomActive = 0; that.group.zoomActive = 0; that.group.scaleX(1); that.group.scaleY(1); that.group.x(that.originalX[0]); that.group.y(that.originalY[0]); //that.group.clearCache(); //that.tween_group.reset(); //that.tween_group.destroy(); //delete that.tween_group; $('#' + that.idText + " audio").each(function(){ $(this)[0].pause(); }); $('#' + that.idText + " video").each(function(){ $(this)[0].pause(); }); that.backgroundCache_layer.moveToBottom(); document.body.style.cursor = "default"; iaScene.cursorState = "default"; for (k in that.kineticElement) { if (that.persistent[k] == "off") { that.kineticElement[k].fillPriority('color'); that.kineticElement[k].fill('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } else if (that.persistent[k] == "onPath") { that.kineticElement[k].fillPriority('color'); that.kineticElement[k].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } else if (that.persistent[k] == "onImage") { that.kineticElement[k].fillPriority('pattern'); that.kineticElement[k].fillPatternScaleX(that.backgroundImageOwnScaleX[k] * 1/iaScene.scale); that.kineticElement[k].fillPatternScaleY(that.backgroundImageOwnScaleY[k] * 1/iaScene.scale); that.kineticElement[k].fillPatternImage(that.backgroundImage[k]); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } } that.group.moveTo(that.layer); that.zoomLayer.moveToBottom(); that.zoomLayer.draw(); that.layer.draw(); that.backgroundCache_layer.draw(); } } // let's focus else { if (iaScene.zoomActive === 0) { if ((iaScene.element !== 0) && (typeof(iaScene.element) !== 'undefined')) { for (k in iaScene.element.kineticElement) { iaScene.element.kineticElement[k].fillPriority('color'); iaScene.element.kineticElement[k].fill('rgba(0,0,0,0)'); iaScene.element.kineticElement[k].setStroke('rgba(0, 0, 0, 0)'); iaScene.element.kineticElement[k].setStrokeWidth(0); } iaScene.element.layer.draw(); $('#' + iaScene.element.idText + " audio").each(function(){ $(this)[0].pause(); }); $('#' + iaScene.element.idText + " video").each(function(){ $(this)[0].pause(); }); } if (zoomable === true) { document.body.style.cursor = 'url("img/ZoomIn.cur"),auto'; iaScene.cursorState = 'url("img/ZoomIn.cur"),auto'; } else { iaScene.cursorState = 'url("img/ZoomFocus.cur"),auto'; } var cacheBackground = true; for (k in that.kineticElement) { if (that.persistent[k] === "onImage") cacheBackground = false; that.kineticElement[k].fillPriority('pattern'); that.kineticElement[k].fillPatternScaleX(that.backgroundImageOwnScaleX[k] * 1/iaScene.scale); that.kineticElement[k].fillPatternScaleY(that.backgroundImageOwnScaleY[k] * 1/iaScene.scale); that.kineticElement[k].fillPatternImage(that.backgroundImage[k]); //that.kineticElement[k].stroke(iaScene.overColorStroke); //that.kineticElement[k].strokeWidth(2); that.kineticElement[k].stroke(that.stroke[k]); that.kineticElement[k].strokeWidth(that.strokeWidth[k]); that.kineticElement[k].moveToTop(); } if (cacheBackground === true) that.backgroundCache_layer.moveToTop(); //that.group.moveToTop(); that.layer.moveToTop(); that.layer.draw(); iaScene.element = that; that.myhooks.afterIaObjectFocus(iaScene, idText, that); } } }); } /* * if we leave this element, just clear the scene */ that.kineticElement[i].on('mouseleave', function() { if ((iaScene.cursorState.indexOf("ZoomOut.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { } else { var mouseXY = that.layer.getStage().getPointerPosition(); if (typeof(mouseXY) == "undefined") { mouseXY = {x:0,y:0}; } if ((that.layer.getStage().getIntersection(mouseXY) != this)) { that.backgroundCache_layer.moveToBottom(); for (var i in that.kineticElement) { if ((that.persistent[i] == "off") || (that.persistent[i] == "off-image")) { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(0, 0, 0, 0)'); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } else if (that.persistent[i] == "onImage") { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } } document.body.style.cursor = "default"; iaScene.cursorState = "default"; that.layer.draw(); } } }); }; images-actives-html5.git/src/share/themes/accordionCloud/js/iascene.js000066400000000000000000000104561250410645000262620ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@crdp.ac-versailles.fr /** * * @param {type} originalWidth * @param {type} originalHeight * @constructor create image active scene */ function IaScene(originalWidth, originalHeight) { "use strict"; var that = this; // canvas width this.width = 1000; // canvas height this.height = 800; // default color used to fill shapes during mouseover var _colorOver = {red:66, green:133, blue:244, opacity:0.6}; // default color used to fill stroke around shapes during mouseover var _colorOverStroke = {red:255, green:0, blue:0, opacity:1}; // default color used to fill shapes if defined as cache this.colorPersistent = {red:124, green:154, blue:174, opacity:1}; // Image width ratio on the scene this.ratio = 0.65; // padding-top in the canvas this.y = 0; // color used over background image during focus var _colorCache = {red:255, green:255, blue:255, opacity:0.6}; // internal this.fullScreen = "off"; this.backgroundCacheColor = 'rgba(' + _colorCache.red + ',' + _colorCache.green + ',' + _colorCache.blue + ',' + _colorCache.opacity + ')'; this.overColor = 'rgba(' + _colorOver.red + ',' + _colorOver.green + ',' + _colorOver.blue + ',' + _colorOver.opacity + ')'; this.overColorStroke = 'rgba(' + _colorOverStroke.red + ',' + _colorOverStroke.green + ',' + _colorOverStroke.blue + ',' + _colorOverStroke.opacity + ')'; this.scale = 1; this.zoomActive = 0; this.element = 0; this.originalWidth = originalWidth; this.originalHeight = originalHeight; this.coeff = (this.width * this.ratio) / parseFloat(originalWidth); this.cursorState=""; this.noPropagation = false; } /* * Scale entire scene * */ IaScene.prototype.scaleScene = function(mainScene){ "use strict"; var viewportWidth = $(window).width() * 0.98; var viewportHeight = $(window).height(); var coeff_width = (viewportWidth * mainScene.ratio) / parseFloat(mainScene.originalWidth); var coeff_height = (viewportHeight) / (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top + $('#container').offset().top); if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_width) && (viewportHeight >= ((parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_width))) { mainScene.width = viewportWidth * mainScene.ratio; mainScene.coeff = (mainScene.width) / parseFloat(mainScene.originalWidth); mainScene.height = parseFloat(mainScene.originalHeight) * mainScene.coeff; } else if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_height) && (viewportHeight >= (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_height)) { mainScene.height = viewportHeight - $('#container').offset().top - $('#canvas').offset().top -5; mainScene.coeff = (mainScene.height) / parseFloat(mainScene.originalHeight); mainScene.width = parseFloat(mainScene.originalWidth) * mainScene.coeff; } mainScene.width = mainScene.width / mainScene.ratio; $('#container').css({"width": mainScene.width + 'px'}); $('#container').css({"height": (mainScene.height + $('#canvas').offset().top - $('#container').offset().top) + 'px'}); $('#canvas').css({"height": (mainScene.height) + 'px'}); $('#canvas').css({"width": mainScene.width * mainScene.ratio + 'px'}); $('#detect').css({"height": (mainScene.height) + 'px'}); $('#accordion2').css({"max-height": (mainScene.height) + 'px'}); $('#detect').css({"top": ($('#canvas').offset().top - $('#container').offset().top) + 'px'}); }; images-actives-html5.git/src/share/themes/accordionCloud/js/iframe.js000066400000000000000000000022671250410645000261170ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // Script used to load youtube resource after main page // otherwise, Chrome fails to start the page $(".videoWrapper16_9").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); }); $(".videoWrapper4_3").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); }); images-actives-html5.git/src/share/themes/accordionCloud/js/main.js000066400000000000000000000156071250410645000256020ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // @version=xxx /* * Main * Initialization * * 1rst layer : div "detect" - if clicked, enable canvas events * 2nd layer : bootstrap accordion * 3rd layer : div "canvas" containing images and paths * 4th layer : div "disablearea" - if clicked, disable events canvas */ function main(myhooks) { "use strict"; var that=window; that.canvas = document.getElementById("canvas"); // area located under the canvas. If mouse over is detected, // we must re-activate mouse events on canvas var detect = document.getElementById("detect"); detect.addEventListener("mouseover", function() { that.canvas.style.pointerEvents="auto"; if ((IaScene.element !== 0) && (typeof(IaScene.element) !== 'undefined')) { for (var i in IaScene.element.kineticElement) { IaScene.element.kineticElement[i].fillPriority('color'); IaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); } } }, false); detect.addEventListener("touchstart", function() { that.canvas.style.pointerEvents="auto"; if ((IaScene.element !== 0) && (typeof(IaScene.element) !== 'undefined')) { for (var i in IaScene.element.kineticElement) { IaScene.element.kineticElement[i].fillPriority('color'); IaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); } } }, false); //$("#collapsecomment").collapse("show"); // Load background image that.imageObj = new Image(); that.imageObj.src = scene.image; that.imageObj.onload = function() { var mainScene = new IaScene(scene.width,scene.height); mainScene.scale = 1; mainScene.scaleScene(mainScene); var stage = new Kinetic.Stage({ container: 'canvas', width: mainScene.width, height: mainScene.height }); // area containing image background var baseImage = new Kinetic.Image({ x: 0, y: mainScene.y, width: scene.width, height: scene.height, scale: {x:mainScene.coeff,y:mainScene.coeff}, image: that.imageObj }); // cache used over background image var baseCache = new Kinetic.Rect({ x: 0, y: mainScene.y, width: scene.width, height: scene.height, scale: {x:mainScene.coeff,y:mainScene.coeff}, fill: mainScene.backgroundCacheColor }); // define area to disable canvas events management when // mouse is over. Thus, we can reach div located under canvas var disableArea = new Kinetic.Rect({ x: mainScene.width * mainScene.ratio, y: mainScene.y, width: mainScene.width * (1 - mainScene.ratio), height: mainScene.height }); disableArea.on('mouseover touchstart', function() { canvas.style.pointerEvents="none"; }); var layers = []; that.layers = layers; layers[0] = new Kinetic.FastLayer(); layers[1] = new Kinetic.FastLayer(); layers[2] = new Kinetic.Layer(); layers[3] = new Kinetic.Layer(); layers[0].add(baseCache); layers[1].add(baseImage); layers[2].add(disableArea); stage.add(layers[0]); stage.add(layers[1]); stage.add(layers[2]); stage.add(layers[3]); myhooks.beforeMainConstructor(mainScene, that.layers); var indice = 4; layers[indice] = new Kinetic.Layer(); stage.add(layers[indice]); for (var i in details) { //var indice = parseInt(i+3); //layers[indice] = new Kinetic.Layer(); //stage.add(layers[indice]); var iaObj = new IaObject({ imageObj: that.imageObj, detail: details[i], layer: layers[indice], idText: "collapse" + i, baseImage: baseImage, iaScene: mainScene, background_layer: layers[1], backgroundCache_layer: layers[0], zoomLayer: layers[3], myhooks: myhooks }); } $("#splash").fadeOut("slow", function(){ $("#loader").hide(); }); myhooks.afterMainConstructor(mainScene, that.layers); // FullScreen ability // source code from http://blogs.sitepointstatic.com/examples/tech/full-screen/index.html var e = document.getElementById("title"); var div_container = document.getElementById("image-active"); e.onclick = function() { if (runPrefixMethod(document, "FullScreen") || runPrefixMethod(document, "IsFullScreen")) { runPrefixMethod(document, "CancelFullScreen"); } else { runPrefixMethod(div_container, "RequestFullScreen"); } mainScene.fullScreen = mainScene.fullScreen == "on" ? "off": "on"; /*mainScene.scaleScene(mainScene); baseImage.scale({x:mainScene.coeff,y:mainScene.coeff}); baseCache.scale({x:mainScene.coeff,y:mainScene.coeff}); disableArea.x(mainScene.width * mainScene.ratio); disableArea.width(mainScene.width * (1 - mainScene.ratio)); disableArea.height(mainScene.height); for (var i in layers) { layers[i].draw(); }*/ }; var pfx = ["webkit", "moz", "ms", "o", ""]; function runPrefixMethod(obj, method) { var p = 0, m, t; while (p < pfx.length && !obj[m]) { m = method; if (pfx[p] === "") { m = m.substr(0,1).toLowerCase() + m.substr(1); } m = pfx[p] + m; t = typeof obj[m]; if (t != "undefined") { pfx = [pfx[p]]; return (t == "function" ? obj[m]() : obj[m]); } p++; } } }; } myhooks = new hooks(); launch = new main(myhooks); images-actives-html5.git/src/share/themes/accordionCloud/js/xorcipher.js000066400000000000000000000115071250410645000266540ustar00rootroot00000000000000// XORCipher - Super simple encryption using XOR and Base64 // MODIFIED VERSION TO AVOID underscore dependancy // License : MIT // // As a warning, this is **not** a secure encryption algorythm. It uses a very // simplistic keystore and will be easy to crack. // // The Base64 algorythm is a modification of the one used in phpjs.org // * http://phpjs.org/functions/base64_encode/ // * http://phpjs.org/functions/base64_decode/ // // Examples // -------- // // XORCipher.encode("test", "foobar"); // => "EgocFhUX" // XORCipher.decode("test", "EgocFhUX"); // => "foobar" // /* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, strict:true, undef:true, unused:true, curly:true, browser:true, indent:2, maxerr:50 */ /* global _ */ (function(exports) { "use strict"; var XORCipher = { encode: function(key, data) { data = xor_encrypt(key, data); return b64_encode(data); }, decode: function(key, data) { data = b64_decode(data); return xor_decrypt(key, data); } }; var b64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; function b64_encode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, r, i = 0, enc = ""; if (!data) { return data; } do { o1 = data[i++]; o2 = data[i++]; o3 = data[i++]; bits = o1 << 16 | o2 << 8 | o3; h1 = bits >> 18 & 0x3f; h2 = bits >> 12 & 0x3f; h3 = bits >> 6 & 0x3f; h4 = bits & 0x3f; enc += b64_table.charAt(h1) + b64_table.charAt(h2) + b64_table.charAt(h3) + b64_table.charAt(h4); } while (i < data.length); r = data.length % 3; return (r ? enc.slice(0, r - 3) : enc) + "===".slice(r || 3); } function b64_decode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, result = []; if (!data) { return data; } data += ""; do { h1 = b64_table.indexOf(data.charAt(i++)); h2 = b64_table.indexOf(data.charAt(i++)); h3 = b64_table.indexOf(data.charAt(i++)); h4 = b64_table.indexOf(data.charAt(i++)); bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; o1 = bits >> 16 & 0xff; o2 = bits >> 8 & 0xff; o3 = bits & 0xff; result.push(o1); if (h3 !== 64) { result.push(o2); if (h4 !== 64) { result.push(o3); } } } while (i < data.length); return result; } function keyCharAt(key, i) { //return key.charCodeAt( Math.floor(i % key.length) ); return key.charCodeAt( i % key.length ); } function xor_encrypt(key, data) { /*return _.map(data, function(c, i) { return c.charCodeAt(0) ^ keyCharAt(key, i); });*/ var result = []; for (var indice in data) { result[indice] = data[indice].charCodeAt(0) ^ keyCharAt(key, indice); } return result; } function xor_decrypt(key, data) { /*return _.map(data, function(c, i) { return String.fromCharCode( c ^ keyCharAt(key, i) ); }).join("");*/ var result = []; for (var indice in data) { result[indice] = String.fromCharCode( data[indice] ^ keyCharAt(key, indice) ); } return result.join(""); } exports.XORCipher = XORCipher; })(this); String.prototype.decode = function(encoding) { var result = ""; var index = 0; var c = c1 = c2 = 0; while(index < this.length) { c = this.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); index++; } else if((c > 191) && (c < 224)) { c2 = this.charCodeAt(index + 1); result += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); index += 2; } else { c2 = this.charCodeAt(index + 1); c3 = this.charCodeAt(index + 2); result += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); index += 3; } } return result; }; String.prototype.encode = function(encoding) { var result = ""; var s = this.replace(/\r\n/g, "\n"); for(var index = 0; index < s.length; index++) { var c = s.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { result += String.fromCharCode((c >> 6) | 192); result += String.fromCharCode((c & 63) | 128); } else { result += String.fromCharCode((c >> 12) | 224); result += String.fromCharCode(((c >> 6) & 63) | 128); result += String.fromCharCode((c & 63) | 128); } } return result; };images-actives-html5.git/src/share/themes/accordionCloud/manifest.webapp000066400000000000000000000007001250410645000266760ustar00rootroot00000000000000{ "name": "XIA", "size" : define_package.zip_size_here, "version" : "1.0", "release_notes" : "generated with XIA", "launch_path": "/index.html", "package_path" : "http://my-webserver.com/package.zip", "developer": { "name": "Académie de Versailles" }, "icons": { "16": "/img/xia16.png", "48": "/img/xia48.png", "64": "/img/xia64.png", "128": "/img/xia128.png" } }images-actives-html5.git/src/share/themes/audioBrown/000077500000000000000000000000001250410645000230545ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/audioBrown/css/000077500000000000000000000000001250410645000236445ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/audioBrown/css/main.css000066400000000000000000000200371250410645000253040ustar00rootroot00000000000000/*fonts*/ @font-face { font-family: 'yanone_regular'; src: url('../font/yanonekaffeesatz-regular-webfont.eot'); src: url('../font/yanonekaffeesatz-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../font/yanonekaffeesatz-regular-webfont.woff') format('woff'), url('../font/yanonekaffeesatz-regular-webfont.svg#yanone_kaffeesatzregular') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'yanone_thin'; src: url('../font/yanonekaffeesatz-thin-webfont.eot'); src: url('../font/yanonekaffeesatz-thin-webfont.eot?#iefix') format('embedded-opentype'), url('../font/yanonekaffeesatz-thin-webfont.woff') format('woff'), url('../font/yanonekaffeesatz-thin-webfont.svg#yanone_kaffeesatzthin') format('svg'); font-weight: normal; font-style: normal; } /*fin de font*/ /* override Wahid */ html { margin:0; padding:0; /*background: url('../img/background.jpg') no-repeat center center fixed; background-size: cover;*/ background: rgb(130,76,48); /* Old browsers */ background-image: -moz-linear-gradient(top, rgba(100,57,38,1) 0%, rgba(100,57,38,1) 19%, rgba(130,76,48,1) 19%, rgba(130,76,48,1) 100%); /* FF3.6+ */ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(100,57,38,1)), color-stop(19%,rgba(100,57,38,1)), color-stop(19%,rgba(130,76,48,1)), color-stop(100%,rgba(130,76,48,1))); /* Chrome,Safari4+ */ background-image: -webkit-linear-gradient(top, rgba(100,57,38,1) 0%,rgba(100,57,38,1) 19%,rgba(130,76,48,1) 19%,rgba(130,76,48,1) 100%); /* Chrome10+,Safari5.1+ */ background-image: -o-linear-gradient(top, rgba(100,57,38,1) 0%,rgba(100,57,38,1) 19%,rgba(130,76,48,1) 19%,rgba(130,76,48,1) 100%); /* Opera 11.10+ */ background-image: -ms-linear-gradient(top, rgba(100,57,38,1) 0%,rgba(100,57,38,1) 19%,rgba(130,76,48,1) 19%,rgba(130,76,48,1) 100%); /* IE10+ */ background-image: linear-gradient(to bottom, rgba(100,57,38,1) 0%,rgba(100,57,38,1) 19%,rgba(130,76,48,1) 19%,rgba(130,76,48,1) 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#643926', endColorstr='#824c30',GradientType=0 ); /* IE6-9 */ background-repeat: no-repeat; } body{ background: none; margin:0; border:none; padding:0px; border-image-width: 0; } video { width:100%; } audio { width:100%; } a { color:#00c6ff; font-family: yanone_thin; font-size:1.4em; } a:active, a:focus, a:hover {color:#DDD;} header { width:100%; padding:0; margin:0 auto; /*background:#000;*/ } header h1 { margin:0; top:0; left:0px; /*background:url(../img/imagedoc-darknoise.png);*/ display:inline; /*max-width:20%;*/ padding: 0px 1em 0 5px; margin-bottom:0; color:white; font-family: yanone_thin; font-size: 1.5em; } .eyes { background:url(../img/eyes.png) center bottom no-repeat; /*margin-left: 10px;*/ padding:.3em 1em; } .eyes:hover { background:url(../img/eyes2.png) center bottom no-repeat; } .meta-doc { background:url(../img/meta-doc.png) center bottom no-repeat; /*margin-left: 10px;*/ padding:.3em 1em } .meta-doc:hover{ background:url(../img/meta-doc2.png) center bottom no-repeat; } .infos { background:url(../img/infos.png) center bottom no-repeat; /*margin-left: 10px;*/ padding:.3em 1em; } .infos:hover{ background:url(../img/infos2.png) center bottom no-repeat; } .title-document {display: block;} @media screen and (max-width: 640px) { body { font-size:0.7em; } h1 { font-size:20px; } } #detect, #canvas { margin:0; padding:0; } #container { position: relative; padding:0px; width:100%; margin:10px auto; border:0px solid #FFF3B2; border-image-width: 0; } #canvas { width:55%; margin-top: 50px; border:20px solid rgba(255,255,255,0.5); } #detect { position:absolute; /*top:50px;*/ left:0; width:100%; height:655px; } .response { display:none; } .unlock { width: 80%; margin:0px auto; } .unlock input[type="submit"]{ background-image: url(../img/unlock-icon.png) ; background-repeat: no-repeat; width: 40px; height: 40px; border:0px; background-color:transparent; } .unlock input[type="text"]{ padding: 10px; margin:10px; background-color: #ffec64; border:0px; box-shadow: inset 0px 0px 5px #ffab23; } .button { -moz-box-shadow: 0px 1px 0px 0px #fff6af; -webkit-box-shadow: 0px 1px 0px 0px #fff6af; box-shadow: 0px 1px 0px 0px #fff6af; background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffec64), color-stop(1, #ffab23)); background:-moz-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-webkit-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-o-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-ms-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:linear-gradient(to bottom, #ffec64 5%, #ffab23 100%); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffec64', endColorstr='#ffab23',GradientType=0); background-color:#ffec64; -moz-border-radius:6px; -webkit-border-radius:6px; border-radius:6px; border:1px solid #ffaa22; display:inline-block; cursor:pointer; color:#333333; font-family:arial; font-size:15px; font-weight:bold; padding:6px 24px; text-decoration:none; text-shadow:0px 1px 0px #ffee66; } .button:hover { background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffab23), color-stop(1, #ffec64)); background:-moz-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-webkit-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-o-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-ms-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:linear-gradient(to bottom, #ffab23 5%, #ffec64 100%); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffab23', endColorstr='#ffec64',GradientType=0); background-color:#ffab23; } .button:active { position:relative; top:1px; } #content article { display:none; z-index:100; position:absolute; border: 5px solid #ddd; width: 100%; left:-5px; margin: 0px auto; background:white; box-shadow: black 5px 5px 10px; overflow-x: hidden; overflow-y: auto; max-height: 65px; } #content article p, h1 { margin: 0px; width:95%; /*margin: 10px;*/ } #content article audio { max-height: 40px; margin:10px; } #content article h1 { font-family: yanone_thin; } .article_close { cursor: pointer; position:absolute; top:0px; right:0px; width:30px; } /* popup */ .overlay { position:fixed; top:0; right:0; left:0; bottom:0; background: rgba(0,0,0,0.6); } #popup { position:relative; border-radius: 20px; border: 20px solid #ddd; width: 60%; margin: 50px auto; background:white; min-height: 100px; box-shadow: black 5px 5px 10px; } #popup_text { text-align:center; } #popup_text img{ float:left; width:20%; max-width: 60px; margin: 10px; } #content #message_success { overflow-x:visible; overflow-y:visible; } #popup_close, #popup_toggle { cursor: pointer; position:absolute; top:-40px; right:-40px; width:50px; } #loader { position:fixed; display: table; text-align:center; width:100%; height:100%; top:0; right:0; left:0; bottom:0; background: black; z-index:100; } #loader div{ font-family: yanone_thin, Arial; font-size: 2em; display:table-cell; vertical-align: middle; color:white; } .videoWrapper16_9 { position: relative; padding-bottom: 56.25%; padding-top: 5px; height: 0; } .videoWrapper4_3 { position: relative; padding-bottom: 75%; padding-top: 5px; height: 0; } .videoWrapper16_9 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .videoWrapper4_3 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }images-actives-html5.git/src/share/themes/audioBrown/datas/000077500000000000000000000000001250410645000241505ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/audioBrown/datas/README.md000066400000000000000000000001221250410645000254220ustar00rootroot00000000000000# JSON datas This folder contains data.js file where paths and images are stored images-actives-html5.git/src/share/themes/audioBrown/deploy.html000066400000000000000000000006441250410645000252420ustar00rootroot00000000000000

XIA installation package

images-actives-html5.git/src/share/themes/audioBrown/font/000077500000000000000000000000001250410645000240225ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/audioBrown/font/README.md000066400000000000000000000000301250410645000252720ustar00rootroot00000000000000fonts used by this themeimages-actives-html5.git/src/share/themes/audioBrown/hook.py000066400000000000000000000153271250410645000243760ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # # @author : pascal.fautrero@crdp.ac-versailles.fr import gettext import locale class hook: """do some stuff during image active generations""" def __init__(self, root, iaobject, PageFormatter, langPath): """Init""" try: t = gettext.translation("xia-converter", langPath, languages=[locale.getdefaultlocale()[0]]) except: t = gettext.translation("xia-converter", langPath, languages=['en_US']) translate = t.ugettext self.root = root self.iaobject = iaobject self.PageFormatter = PageFormatter self.tooltip = translate("export audioBrown") self.loading = translate("loading") def generateIndex(self,filePath, templatePath): """ generate index file""" final_str = u'
\n' final_str += 'close' final_str += u'

' + self.iaobject.scene["intro_title"] + '

\n' final_str += u'

' + self.PageFormatter(self.iaobject.scene["intro_detail"]).print_html() + u'

\n' final_str += u'
\n' for i, detail in enumerate(self.iaobject.details): if detail['options'].find(u"direct-link") == -1: dataState = "full" if self.PageFormatter(detail["detail"]).print_html() == "": dataState = "void" final_str += u'
\n' final_str += 'close' if detail['title'] != "": final_str += u'

' + detail['title'] + u'

\n' final_str += u'
' + self.PageFormatter(detail["detail"]).print_html() + u'
\n' final_str += u'
\n' with open(templatePath,"r") as template: final_index = template.read().decode("utf-8") metadatas = "" if self.iaobject.scene["creator"]: metadatas += self.iaobject.scene["creator"] + "
" if self.iaobject.scene["rights"]: metadatas += self.iaobject.scene["rights"] + "
" if self.iaobject.scene["publisher"]: metadatas += self.iaobject.scene["publisher"] + "
" if self.iaobject.scene["identifier"]: metadatas += self.iaobject.scene["identifier"] + "
" if self.iaobject.scene["coverage"]: metadatas += self.iaobject.scene["coverage"] + "
" if self.iaobject.scene["source"]: metadatas += self.iaobject.scene["source"] + "
" if self.iaobject.scene["relation"]: metadatas += self.iaobject.scene["relation"] + "
" if self.iaobject.scene["language"]: metadatas += self.iaobject.scene["language"] + "
" if self.iaobject.scene["contributor"]: metadatas += self.iaobject.scene["contributor"] + "
" if self.iaobject.scene["date"]: metadatas += self.iaobject.scene["date"] + "
" final_index = final_index.replace("{{METADATAS}}", metadatas) final_index = final_index.replace("{{AUTHOR}}", self.iaobject.scene["creator"]) final_index = final_index.replace("{{DESCRIPTION}}", self.iaobject.scene["description"]) final_index = final_index.replace("{{KEYWORDS}}", self.iaobject.scene["keywords"]) final_index = final_index.replace("{{TITLE}}", self.iaobject.scene["title"]) final_index = final_index.replace("{{CONTENT}}", final_str) final_index = final_index.replace("{{LOADING}}", self.loading) if self.root.index_standalone: xiaWebsite = "http://xia.dane.ac-versailles.fr/network/delivery/audioBrown" final_index = final_index.replace("{{MainCSS}}", xiaWebsite + "/css/main.css") final_index = final_index.replace("{{LogoLoading}}", xiaWebsite + "/img/xia.png") final_index = final_index.replace("{{LogoClose}}", xiaWebsite + "/img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '') final_index = final_index.replace("{{JqueryJS}}", "https://code.jquery.com/jquery-1.11.1.min.js") final_index = final_index.replace("{{sha1JS}}", xiaWebsite + "/js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", "https://cdn.jsdelivr.net/kineticjs/5.1.0/kinetic.min.js") final_index = final_index.replace("{{xiaJS}}", xiaWebsite + "/js/xia.js") final_index = final_index.replace("{{hooksJS}}", xiaWebsite + "/js/hooks.js") final_index = final_index.replace("{{labJS}}", "https://cdnjs.cloudflare.com/ajax/libs/labjs/2.0.3/LAB.min.js") else: final_index = final_index.replace("{{MainCSS}}", "css/main.css") final_index = final_index.replace("{{LogoLoading}}", "img/xia.png") final_index = final_index.replace("{{LogoClose}}", "img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '.script("datas/data.js")') final_index = final_index.replace("{{JqueryJS}}", "js/jquery.min.js") final_index = final_index.replace("{{sha1JS}}", "js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", "js/kinetic.min.js") final_index = final_index.replace("{{xiaJS}}", "js/xia.js") final_index = final_index.replace("{{hooksJS}}", "js/hooks.js") final_index = final_index.replace("{{labJS}}", "js/LAB.min.js") with open(filePath,"w") as indexfile: indexfile.write(final_index.encode("utf-8")) images-actives-html5.git/src/share/themes/audioBrown/icon.gif000066400000000000000000000106151250410645000244760ustar00rootroot00000000000000GIF89aM&L&R%N'S&O(P(T'O)Q)U(R*Q*V)S+W*T,X+Y+U-T-Z,V.W.[-V/ X/\.Y0X0!]/Y1"^0[2Z2#_1\3[3$`2 W5#]4\4$b3!^5 ]5%_5!c4"Y7%^6&`6"d5#a7#`7(\9'b8$c9$b9)d:%e;&`<+d;+f<'b?-g>.i>)b@3i?/dA4j@0lA,fC6lB2hD1iE3hE7jF4iF9kG4pF5lH;mI6mJlN?rM:qM@tN;sOAuOT{-zi+vK_ NIsi_ ?r{&3@Yr(p™N) p[tO=OT@ XiTeSu>.r)b]ZSY5 Tk1)}07WD:*l2~6ܑ'L_iqtrZ)ڵ|-d'4iԐJê@i|M] 1Tm UH4rWip/aϖ *i̸xE2*iL߮vn<@x[i,<n[/E/wt#_i5p^C8 5Dڭd c@`Tk N UL9R?@0]xg &[|S5 ?a`Q{Vrs?ʆ8vq'*_8PCʌC3ižɐ 1E.4%avT[c5_{r?+ _ Qwl{xpa %4!(E2-`fT$s(C}b7 lJB)QF Ԡ<ܐHS"=p }hr*A/+κ~-W9@ق]:eM@^=[Ϗ?^zcJ}}{~Ŀ++̏*|Q^v_҂:t[d⯉y[O=o`01{={|Gm;7. W|}׀Hgx8 ("8w$Xgx+8؂|}· F h89(y=x?3HFx!H#h%hY,R.U燅02._1 U/{>xNShiPac(fHf<$ms1 xWȃYȄM؈OE{Hqط'Fg戵FN@qhȉg艌D}v 0ЌN xh肉zØQ8m@ N2(؋VȍŸ|R\hȊgt9؎ ( (iJh!! ,ْ.@(y92[QB D 0s ;> uXI DQ)<UY )H1! D |20jIhqZG\vYxzYP)RIW8wI 9=Yn %X E @` $1~)2Y^pYy9荴`Ù靲ɖySy:ឭ kɋcHzׄɟ!I٘y z(jQJbZ ʜԡ'Ijؖ +:i&)$Z6*8oգ))! 6Pz7sxuN 3J%bjH)'B:q"dzڨiƦm1q*EZʠNz Cz'2JI.ᦌ UyZڍ|J~ک:zvKuy&ª J:JJ*eppp[ʚYoPt ʬI( qQUI ګ Z hS :[{H8wQk+ ;l0fc e#K)ڂ.$s >@@ =$BGxZL8 I;K UWY˖A_[K]eg;images-actives-html5.git/src/share/themes/audioBrown/img/000077500000000000000000000000001250410645000236305ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/audioBrown/img/HandPointer.cur000066400000000000000000000042761250410645000265670ustar00rootroot00000000000000 ( @MMM***eeeqqq www```jjjmmm ,,,bbb =><'=>=9\!UW[ .Q4WX8ZZX!((YT4 5 7!8Z 6 NQ$34 5 7XX;@1NOPQR3TUV Q? LM112RSTQJ0%K0LM12X>U/JK0LLM1>A5H I/JK00LJ?[$),FFG-H I/J/S)?DE /FK -HO :+#D\M;"7;C+/&3KH@21B3*FA(@???? images-actives-html5.git/src/share/themes/audioBrown/img/ZoomIn.cur000066400000000000000000000042761250410645000255670ustar00rootroot00000000000000 ( @༙L@3uaL""!tSSSǨiii555^^^trr+++} ===׶-' xxxXXXcccRD6''&̬ ///mmmqܺ[[[0)#xcO%$# ```ooovvvqqqt&%%(((˪N@3 TTTݻYYY___wbNaaabbbhhhwww-(!߻Ȩ&&%RD5̫˫cbb\Z~9zq qX\_@_`%%rpM^A&%$o(J?) ppG_R8e$66jjhf8k nn_!dfws Ijkl77lR#E.3-3.Kii$s\kcL tNfg^y"9. *4t.'dm54V44tu#g_TkQ34V3> DZXa/4-+aC@T6YPtVV*3Q5l|YJxttVVv];^Y7St 8B}EYA\8Tvvvv*O\>,1WU4O_,-V,\$0<)o\,bd\\\\\\\-b`FHc,#|YV??images-actives-html5.git/src/share/themes/audioBrown/img/background.jpg000066400000000000000000002372241250410645000264630ustar00rootroot00000000000000JFIFddDucky1!Adobed yy>        %$$$%))))))))))    ##"##))))))))))" 0@!123P`"4pA#5$B!1AQ 0@aq"2rPpR`B#bs¢3Cc  q0@`!QP1A"raёR2Bb!1AQ aq0@`Pp _;`7qEn3i-Qb2Nd&398{lt=TR#{e$I ~yif;Vm8q˺]򬞷h#2+93+;yGg6'ҎlGMq-lWgcy#t;)7=Hc3_GY5*^T7ّ" 7- *Yߩ~[amles]RrV-(EmC/qA]AAXo c!|&qi\Ldry;#tO09ft Jc.%S:Nޏ+CԬZ#,+YruWt:mcm@NELq[WѧG  t5O;^#2~sSlCH~LK#P g?~mQK[[5f7tLID^fjۘ@js$O~w  ^|7[Ϧ{*.o3;Lm#./G͙E Bf| ter{MLpD[ܝ%$f:5K+:?O kZfӟV[DO3B-mY'fsa fț@1]EE|Xo cfh㳋{˅FHU)} '1vH:qǛ||zjV&ƦZPiX@5@-Y!:GT(Ng +XLw查DՓ g~/"/ &"f$X_~>=St^.L8տNsn?K[{87NU-L l@L Z&& T  8_查ЅsIBղkjt|ގˆHUh+D&wZnPk|L-[1[f'w"L|+qÅǠ=<=<(@&I =oҿ7#&-,vU{dT$?G|aA1kD1Ș_#}鱤mB׋0#qÅ }ڑ30D/@L3b:=/?<"H 펧AwcIH>nɄZa1[& @Ό~*8yۃ<@|!La.[_6}=V;'1l@iH a3 gˇ e5^TzX4=ѿ:&-=}NVDstwt5s։VWIh~1=|!Lsj,β|n/s-g7utP˧9ZAF5/I TzF%@违~@ց6 mEͶ'>99,k)`+fL}oΘH ?urmt3))OFrn8 `ʀ~>'<׀994oNI{7$%ߐ~n#z^#z~g_S(=geo?B/lx.2C9඼ϣ sJt3Q>sUg < &țGU_vȉ[oܶedw}w]^Sa'wfI9඼͢CFg9qdO>`O}} TV0Q4n ꞯ*rM;>glmM<ٖPmɈOo΅nmV^ǫ>OJ3>sz<&)~KM|J<wv[~OŖ"8_y Em :yo>ؙ}?7B7W.ZuaϗH}|y$A)˿Q:=#׏00||AK̛d{D-@ִ}Np-~h:uh:{M?M Y[Z+wWo|:"c::-@ ^=%Ql`_m?m x@'C4D/mz|@ [оv^&cC_'O4"De3=0ϴϳͅ@-RAG?G?;؆=> $_F>5cH"* qa>?2saopk /L!]z cẘtsٜdӃno\[Pa#9o3 =~#%>ߕsvu#͏?g4姯2R/ec-pl@M>~KrsAopc ?F?z>;~W8(zfan,;(ͯ'ч\n~ g+Y9/܆?M=z |qP ZI>#!57{>6/Kcf@[xSw}Hp{=3WOy}ܛ0*@ʋ"-|oGրapLՊwY0Ӓ}'O2>slwU7<HL?OO Sr;@="nK#+ՏBR/U=g?e[,-@L<˓Y6Z`||wo<`EQ᭴Oe[$->>o2>` .Kܖ :>~cv}O˽sn8{ i,Rrqz90-c~; 8{`>wy;diw(gyŹEk̷V0 }켰O,Ϗ(x6[/?Cj5Pb "B<z?'tƘXN+[=:y]^T=?;nuw=2qf[~x~^X'zg<[@~w&RL10$ ^üm='mҞ^}J] 6Rc+ss~g&,;n8` ^=N izqH_l5 w]VɋF}yǾy֝'1=2s|ZB؀c28@1},<}6:po2N+>ؙ=]yw|abb)y)Tz_/esj0Ozy@ ~op/jFNbϠmZE_Y}èbczۗ3ܯ.^:r-b#~pa[WpyM3o/O:LC6tbN:ыG .mD=\\uGysxæq5FZ}O_qB +|k1}80@}}ǷY6Z`-} 9U5;ruG`LI[D7l/Wse.f_[l@:QͿ=+;/ F>-9< l9[}d@>w%l9݋[r1>#ӞwӴkϮK|ZB؀r=aw|mHNZҼZ>"/6 A'vKz|{LL*3WJ}k b+?cUk|c7[}Iфl\[}TO-uۛs=y`𼃼Og:G<9 o%ǤǗ_#,q'[ - ('W:_OSkgH;@˃MN\0 a)_ƾ7L bۣ- \Roc&6ZTi3|^ؖs@C[-/@I0+w|k B@AO2y%9/ztz,NȘ$jB&$Fj9sO:o3}p@ycbo{}DIo^A)@ bld^ M&A@~Iߓ:'_!GVYZz9,z5ߛYu,S S|&n8yō@vGwӅ` N\{P@t}'W[8&b& ,b$ <Gx Gt`=ڪEPzN[;g͸z;c`'E}8Oir$[ʱva߀.?GZ@"`ZZ)3%&ERB~I3o!`\RU׏D[ M9:^:"U/j43}]#|.uidi S=N91zs\n=> @@Lԉe@㭾/GxՓ߁Q'=7M!z1@OV|7d_2oi|Vmj:Ϸ}E)= p&T;ajKk~c_P zDL=s}cF\Hm)`|_urtP8NL~z{9-vED"Q $V2kEnyz# bzٓq}\=ha Pٚxޯ{6x~ܭ %0f'LڕMmqV/Őo36z0h?=";v{W-a+ˣ9Sk=l [y7$L +w[#/| Z؀\~/ESLteqǡfϲRڰ@g*5ې;c*f÷-"b՚H ?v6:ILU6+$YZlY[/.g^ç`rλ&r[2^$1yފ\lD$-ڷ??u|Z؀ND_ ;xw'8//&Zr 5zn9)sjZLuǯ: ũj,iYTD.GGZ&&b,"PX.^JcXzv#c땸ͧ^#H*}BmMl3҉_'}??z<ŧZyEL_j9zAP)ސ g ~1(E%LVDZ1S,wc?ףkOL^ĉ#3Xr&@IR* Tz_[>OߠKx@E9+p] _Oy1ͮ-@I"M9* 0Ѕvb"-3S吀 7aTUDgJAs++jql`R" V _@P芊[+l*k;^Rgԯ5΃l@I[UF^M1ۇf{6W>i M Nz|7a>w3zAF;2H"jWLH \l98h e&Zy@ Y#G;/b-ZD4@L"JSCL"O{u&PLRlbH V _[M^l])|w«Y]W[SYcNjM垎Gp;NUrޞlQA Vդ[Z  @D! Y2d)xnE\NW1@5n9 0P˺WL{ah)>ff sdA+}_WGe!8!dZ'';d"U)E;MLo]Uf&ldkjgVK ^)iW .&&+HZZZc+EhJ$tVڦ3G^̶ZHDDmXLM BDXX  ~{Su_?E7)p!&W^}6Z]|H@|H _a: vD:ca~>)~鯕^͵'ta}F_݃;;yMp'm6'=J#81˶t,Vb!tD׏63EՇ eHkܴ  sy6p@I[ER$ $)DH[_ ]苂lsMp $UfG뼟RVD]5}JM涱\LED3@$[S]?GK$.lKExGVGSߩ   HD _=7|c ke 7[ddTהvlfzm||SO^Qo-O^Qڮj ^Ws;}3n~U9_l~ܘͷɎp|~Pvuj";}úmA͛op>l~Pvqfogsmc3|Ɏm[1 41gpT2brcHm jj[6#fyx@[ҷ(zO8 pfܤu,!GpY ^O4;}nۤ<R# ͎e[Ϊ&3p @ǵ[6#%y#-@9[Unm78PoVMT6q۶~$q[nY{}~ijx@^O~Pv"vU,R0Cn,osލm~.ŕ_m}FijZ|/Fh>,os դe=l׫_ Ͳǥ_mU k3zl9 qOou՗~gfvŀ&j#W{^_9כe4_ jթmul7sIͰ[ѵb/Oowe񟱚O^mk|xiMĞ&_3xԋ xJNz_{fY#^mLZ2KfXH"ק2*f޺=G{oue_.6o7z=G@)2 77Ȟ`ƅ?ɗ&'sxDGN_._o.oԝ' Zz}rƀM˛DMS||N]˛aT/+z|N}ɛ`Ⱦos=n~L?vʽz_{/)7;i$rFmɛiUa'˗|y?&m˘v$r6Ͷ(~4lH'H`pۯ^mm` ht& ۯ^m'nMOoql<_zm>za۟tk~m׫6+Z._^_aRz۟[6՛mQƺrͻmSvno@72ͻoQ2ݴc62ͻs2?W6<-s%XԞ2[6ӅIKSÓpRNl$86eR̈r2ը[5?7(8Vx4"$ ֫zi__tO3֢mǼIK1~8?dzE*h4jtW~!Vl#K)sũ?|Fi O_։݁O#?mJ4xrHkUlmZpF6BLWlzdޮigeaz8sNǥ+MiUlclm]Q@FIB$d "e\2>'@rj8wIB~og,?_xs|ٽ.tUI}!`lVJ-7Q(ZS>˦ve\d[LY/e@M*]cujRTvFڇ vmZI7qnZSTNZ{Ƶ=s`%{TUěn FT6p Â{j)z10{F.tfҖ "\H6o)\O5LJ7;Wl MptBӦX/䱔$Ԣ5$`RK3{CH֤e1!#k%{J̓Si֦V FESލ/b!jhˤ4э˨,JjT6S{䨐a@*.4HMuFr\ֶZ4QtmLHIBhQbJ#@BF)J[oz( GsH@4UG @/#)zl鍺|_xs|Ji}TAE rRԲ2 Jia7SG){B)Ld7EJjE)k]kی Cba{`p X]SFL7,,(W hCZcHSVeZ5އ[-R06Z@).jPkM kwd"Bjm[V4lYr65yk dk~OxkomRBPKUΜ.h މ'{hږ5Zc9R;ڙ sZ2hL(ʆF'bFऀ4 WWel5)52ԆEU , _",uNrBƠ苛VR;f=(l..'cÛiBu0?**W>E 152h{C@oMa50X A5"ԏ~J6P),@FW0 H ?\ ըJvPPr|MK~&TXCNV)MpU4Pb(:w F˦&l\5Y*T U-^TjK T pf& eP YEbƺXmLJ([AzЧW!|mX/=O#\O7LJ7B(ۆm~1 ꫤt>i$DŔEk`hVV* !]P)Hu`)Q(ZըB[K; +9 @Na`C[4.HP$Cd|O7LJ7b+Z2vRX-h41&D6=+BTG-/╖pGfJwQK{;Z5pu՗K]4>T YԈt gu)&&ƶ]q-(IPI@z[P֎.)uCMy<9_į4`Z^ʲKs:1nv֓˕Pj=F`BtNr.oZAt!\p qzrNRh ^,AkoW\.(?ŰP'z1Ez᭫z&z}P+/)(wzZ* 4ֵ%wrCE3C$ dַڶ@eAI3q-ˏ ̝-EHH8Cqw2Y^Pj`j&m\SliAdmkGZ-‘/S*XjB=Xtj]Vp3-~R6gVjzQMpcEݵ-W X!1"{ZH!#N,wk}|q]#7 !Zj3^$-Zڵ+ޡ0kWVFGN?JKj]trZE?pH>Pz\dJQ(i 4RH4jrز竕Nҋ+Q~@V$U km.xgeDB8*⋨u+J/WK "ƯFUg7US#7izP$Lu0$QQfckQهap+R@BҠT$`m9&8]#l !"~?4z4]w"~'eڐM{WaLю:k5QZR{Aw+UوRⷹ=zPF{ RHA4t4ijZiI>񧔵 S1cA54. **59ՂgFͺ'[ 㭲7mf] w'LaosKcBmEhBs^׺Mt4ȔA"RbtPȱ8t8jB}𶿴*E}gU2( \еXD^$}D*5ZW/Aԝ(R]g8gF,*j@i\~]k[.r_-R_%ɣG٨hƷ: Ӥ^UMik2i,4 $6>Q)7 tE{Z-~_et&.ҐXݡbV*L-@RnEm m' NRŨWORj^܍d}T $?8  ?[/K7MAli,EJ p.HQʶiPc^X˃c*cUk@j$ַP).R5Ӗ񿻈`HE鸻/ oOe"I4Xұ K~9' 3pvX駘":LbIoqv_oK0QCrSKFzT"@^S)8wNE |oJȦěqB-R Z9B9xWmcH6?ہ~˖ͮgRi\;wB34Da`PT8 kNki#灰\ÀM>[_,M:)e Rn[4#cq0ı=*j F$"SJxݦM+P|eRڑTVUd ٜ}֢֣nTL&k~ʎAd׏`boŷGI~[Qk3!9ԵGM{:O%ROpkn5?q~'CR5e͂E#TCpIfKj߷=3oП!#l6W?{ -fR"u(ɪ%Vu{h|o&-ے!wP SM{~̑婢&"|o+q%ہ7#\iG_cLAPhEc2ċ \C F4 F>/qۏ>rX]`qtXځa5#40o \C 5ۦ>/qےS>s wuͩx_5V4ɉiff9 *]IrBJy$>HYWLX Š(^!nCi;bj7vZjՏ[ "YbOT';y ȴKĽcۯuc_SzCA|4LK28PיJKApv4UA-*frWu.P·;vat$Mi* ꑋ5Km{m<1GoGmmא[7x@8x,m.ZO <%Km;mDP1nFvy#k1{,zX`?+E4!0H(jtKm~s[&M8%|Fsk/h$& ~Om+m6r%-JG#܍ؒ.P-UB c`Tԡ[=Km^zxۑ&M=-lurwre)DQf88Ժ%#Aո_owVarE.73v ]ޑCȩ}4 j[oDjX+G ~O ;oM+8+RXQ75/ɞ0Pmic^PQ7$6!9;vMu ҩ ʭZR(ϭ@ i><1ҪKr٬;Yp(TA\$0RjJKhP2sQXo6-"=4Ũ)6ommי[cۚ-)Rc lophċԫ{S#Wr:nXZNn'be]-aq-A}C@וqz0edszx(5:-lHyUTdE3FCtR;Qfo;sAǵUm1Ƒ/5_8vA{&9\1Q6X$R*T%V J ݹͿ[@/h;w|X+ZQ˫ײ6͸n@bK%MFI /]^FM[rm]}jFkDO56LJquUTڗQ H N j_"-AzH4f ;o<܂FY[؈KppƠ)?u7Eƅ YI4+<-&WT6o撠m܊LR£;mvkwI\4OR0FiFYyu}vG6m!kZC1O3ɷ^^ޯ{aZWK3m\_vl$o+m3oyy㔷3 )s۩kwiMgEbczCekl5խuV𯹀,~)&m亊lI4Zhk&'<Qk裇9!:!.r®ni2NMKacPM;m(qļz6bq-m6FZ(yX!V\UxԳ#]/$rF#CRD` &zöpv5l@,om67T]lzGJFj YAj~Ks1&+i %*@ۈ[؈#I3,,SXQ+ZWހ2hbOC:q蘍?l[mDPG* {Q7kXмDY}#! MU@rZ3ĩ]o[{ciΕcv~fa-"Q<ͷ&~쨻nY,4ǺPZT.YJ5;9 Pͦ]TTXԿ'3jmvq[ҋ[6 E[n~w~iZH̕T;\G u:S(.elJhQ&[~Nf+u,x[oV{rΤ&hq|o`@b2u;{ CZ;u4vK0ꨩPr*A\4:P3)T'5f&Ņ+idʬmzkqEy;ڄښ;Pqk! 0ʈ6fY[s퍒v5 WәĒ)ȚfU~LD7JEOn =QFgjoqBj&AGRi8FKD(fnͪ]}B*4]W\YoGnIъ 0F_WZq$ͶP,Hqv9/jz":\X}EUcl6w40 +gɡjI@Z/F#ӗHis `rʿڈ-$4Q#vxQQ+Γ|ډ7rpmR"ƿH<6.̴koĒMEcH_x8*^{o,@򊺩Hxނib"}jۃȴr+lQt}ƹr6iQICj#.46U7:!AI- Ec,0륰[M17wI3ѕ1%<ե`-W潷5$j}hUɵ|lۙl~mf,&,qX~~D]m4j,AqwLȬ{ҩce Q)H@4eibJ"7fѩ4n)nG i)V :=Mc^Ң‚)A$d;+Ґ)q;o tQB@ ;Mcqn$ȪY-̺T:iHa#oޚ4c5,zI.E}ijaeaZPeiěVjB׶cF-:Ҋ)mIs( ZF]Rq=1c̪F Vc-RmDߟDikXaGi!78w8N\HU2eM\ԢGU#(a-+&I@3 [+XQW P WK'!cnH-k;G-ΓPϷ&~7 Ի %UƤS UJi}Xcj,m~ qvE(Cj`PeT5v5pـN|.0@NlW@m6jmXmhaHSM+M.2j* )ц< qWqYz 27˛%vzUذ,Z hα]U:.ƅ V1兯WQFO|6/s=m|n 4E[v(7n4Ic.#"Bnڳ khT%"y H6hb|=sv!/ә[b#@Xp!oMO@:` \_!՝Ǯ,J(fFm ;aP vܘ6'[#+#H]>7ߏ=7p- tΩLhH╤)5 [H5poA ڀ[KX@ k_yoMmVqm#q˃rH oa~SуQpA(QRhH"#C,ͷQB8`=NFI1䓘@ܽY֤"h5-l--Vُ_'{nFKTft9^0P:uZUZkB5ڀR2)J%lˤ!@& TW`8%U1E[17ߝ&Wo‚Qi45Ϥڭ &"&#(H5Ȍ|"˫+(,eK[,yY^<[fj* 4U,2=>PQ$պKZEKdbh50mܝ(*@ډ' 60 p@4E bNsj 1׶Ԋn#EJ:VXպڂ6SZE,`S")ZHpA khSZW\-5X6e++k}=}@;7 ֡t,jB~Fii_1)7=V ދ\6}&ʺ^M<1PnчȫMTAˆ,JAcrM*hHQQzkXaZ*qLQpp)EV7cEu`UO]ѓs߀:QX HRRux=xF|uQ6ql!ԚbhEJ#]^OJhʋeAM,-t_ʙlh!q}vs԰bM\C5haZB+RHԚMjm,ސ ҆xJ-"! UM{iV l@$!j7ۡ_[=5u*պ|GtR'A Cb=˪ksB1"-4M#?QWV2Kuo M{mJVA!Zƽ őtEYm(I)r^KQCKP("'ZϦfR/9n֩af'-mX/l&ykrVmV;rU !@Y5ՀnF * ֦7(X{,8 (z(|iZV^ku7_S8 d5 M.smnz5a@Zk#jFCZu_{=or0UZ16!iqKo57 sw).]UjZ+ەa!BCumca}Um,B C_^ 5uB'= %j]XZͧj ?TRo DUU7T)뮧TUUL-T+./S*ehĩ2Fa*eL-}2TfL2_}23xZ!ݣc1beLfIӱLfIr:E1&oc7D݉)/c7Fob^<h☼-3DlZ$J-duAhuAhuAho|Ψ-|Ψ-A:YPZ#- D>K˃ DՕPZ%U\UPZ%T}T}Nj- M̲7̪_ya꠳& h >[庂'e\Y1ߕ U 5 墣,T`;;nheEGkbF+,RMEd:G쯋#+*1X4V: ?`QDBEF i QuhƒԂE:StE:;EF’'f*?->t (抌M4UE[ֽ;uPPqݓDhbu{V  cOkޭokT"vj[&U]_ } UXqxDshC[pknC{]h#I}j5'RYDE޻q;5?GhyS{)s*vq/xw*vq/"tǹv;8<*o<Ľ㟳MhySNo| ooG;8=>N <>ד4AʙO&G}y>L'}y{#pyS6pv2/w8iL_Tv3g۠!M堺lh.CHs*fd}S}2@IeL̞H>T͜$7>pdT͜2{˗˃hʙ''Rʙ'Ծ$l.^Rʙ˃I'Eʙ˃NO_zhT͜V\_w>3|iT͜V\_>PIS6q_}"|)U3gυT͜SǼ>u*lOtWױ3g_}~EC*f*o ':8S6qSy3<_L΃z3g7PCD4f*ox辜.T͜\ľ.A3g2^7}Î{hl^;0-sJl.ӛ#3g^vf4T͜Wq{LLƈ#eLLO7BS6o$ I>&Ӎ}4*f^7n'>طHzZ%o>#@4fD7@/A"$ wf4^}`ʙ& 3-b@y;M @yT͒_H;sy?G֋Un6!`2&4)AgyNh~wi4*fu{DAʑnƆ%.hpvEͱCBlgQ{tůN8ɠ3Ά%0Jq^iNƞLث[ۧ*Ksyz(D!p׿4*f^o5#WJqdܨgED6 B0m3a8zQD7XiO{/ĖʙF`)9ПrC*>#iFb҆3`?f݀@`";1>C7١S=GלR/?-ʁG4 DNLۦ yutrGs/_a*H¡v'djq77Esy:@4MD'=#M室Tι0nRF4ܨ&V;q84MGMDo`@̴TcNN~ li 6h{z 7_k43-cO mԬpGʏO764\)3tzh7~;nTJnTUyߡS:ǨMZ&wW}kDÍP`/:nk u}-ƥ~;R MޘUcW庨t*gVo5#R?_ž'5P>u^'tJsy Ojߗ ЩSlO]Gc]z#B j?aTTΧ|J幼*V znכt ;DQQNqz^rTB%.!YTKtWۼ²#u.EN`>j~j^Z>CG uNyt EF5hN'ٺF{^Zo`iS^`?V;m\>Od?e|v.`*  Bn\7k1@BO4ŔS߂qIBazN @A(w\/s5 "iS96WD(yoBY]5 {,rIN! 6 h &K9D|U1afczb;&`x(VpĬpMUjQ-tE2 d e!E=.ݠQgr(Rw Q/Nhxz)Y_b1k ތPgPE UB@F Lw)zGޢ ~9V✘OIL<òxP3L Pb+-RO$^vDXC^SH^8h&ljG]Gh4BЌ#[O.v0eM+4Ȃr9hP_`)xI;#SNe&@Z\f&P, x& ix.jD*(\@O}W 1%NǚSN$^H<Ѻ5nR4؍eD(|lWKrdFkcޣciQz)ax&peM>ՂsRMTN-Yr̞jb&`. ) Ɠ@jކY33geыս=C@. bNiJ8ȇP ezS4ac 5:x'`n av(i%yw))6צ%.[KoQ$ 0=j`i5t5:|fu%R@hcӼ^|5oE^ޡy C~lih@ԍQJJSo *j;9=V8DT9KC+͛zupY;Ө(Ef=ɀ*QMSSOr\*\%&ޣ(i&fּIeLQ='KO]U~N8bT-Nɩ[ UwPOs{|*.wOAzgEMeCQ_FlPErv(AafOQx`_cBOdfl?Hu='[?ܞk)-3xHI0M$?&1PuЛA1AzedFd6 nSec7ju- 5.gW>޷8ezB,z%1z,l>VA9E4EIͰk`ɂeS&NSs}Z탧]_kz6 x* Wþi/GƲ:Q喗0!8wv $vXyW@w1'!azR-|tdžx ,ˊ"7I$7U S:1h~vX(>6c3k!Yext9P4@L~ lU`FPn1/MQ 7UTn*gvO\ZhF6Gج~xࢡ>Ħ__~+ءp ($] M0F';WO@k> }'~\(ƫ"^"VPb,k_vZ:~v;|u݂z`W_bGg19G:w^N- j-PU=ר9g~v{|uq6DS|Sآ2 "eF3tTw+5RN~ӷ#K.Het@*]1'_QfbAO_դ2\cYQBƋ12 ?eX"0@߬zOe?tצ)=F ڑmZK1-Usy'RQ25s}^nN8j߿O*҅bn2$vq:jZY .1B9f_?.,GzfոL`uqP,O}MWeTۓNj?Qº֑0QiixPj&rW%9K~#X"z*.Jk¯ |,t1O#lP}VeМ\kUVo\0F5Nayvצ zN8GkDcY9f^vفv#*7VZ$㫂S[Q[4oO!Is zN\55h扺U cg{W\k$[/Ġ.*'M X',Qp{ ry^k I_b)\ro}oa ĮYAY#GS7~?|TTeo Gz壾CzUF{>ګ|5p>rTnڟv=uxuOm Vb ˀQP:Wg'v=uxS@8TJ(-!dza%AW_ע-5Wf?WYDހ" j=Ag.w *fi*Z$ܘYN\&MI=e@zFx q}GkHߗ)ʈ0iI c4``sQouӱ5$pvkGЍ}GkL$:"eUvf8!a G3O|ig ߧSQEU]An`cTDP}Rsb¿ne6 0}GkHs4#uUU0sC]NaSZ>uNn\u?Qq+[U`L&NrW/v'#Q)#BP鏹5[.u;5ziE=sRk_cYB6fp]JxM2AD >o@Rz4" G[W6lyPfb=uOu§ : yҩn!z&0Au;}u}#[#_ӫ%uOQI/܋l:zL rϺʸOj'_E_6γ>+-y;uzX dr0mʸu3?gS|t wYe4ڸGO>6iiL P3DMj?ڇYYěses6 Ay!Uv\u_}?_WX\Jp\#Ly$tkvkcT;,lC \u}ک3_maq( "3޲sV?VS|f>Q5_wn4v;|5MMWWWk@bNy\3DYp*qt|_S߲Ou ?# ^lYE zBs71q uOƯMj'0 \9ɻyUQ Vם'L}}Cj˵OƯ33gi#nOTpѽ8@uoݏW<51Nv_ s ^UxALU\gcUwS_ LS _ `ԘDC+L(BHAnONv.Hۚ65A 9bBPUq]N6CݷSWO5/_R걹9q:[)đ޹Jifd4_"'A9M L^ԴͬoL-/M'd*|v>kh[0uFwzJ, |Dު-za v}«`T/;4u$B6rGkJR\uP]_;WKOzǁ7~)CಈP'vr73AU_>Q:X#T萙Խ0YSOø@b>#6xySl&2MGz8 L60b1hs-YLqw Ts;>포6xS>6Y\C'OP4s*4eAʢ2OIxvNS>" ᡔ,7S,bl=Gj쿸hT1U̠!H^UYg\dgz5omTTH[.`֒.4r گȍJ*1>퇨'pzvU*f?zzCҘI)$M"יYg1|VPakƃl*I.#L\u-T-/uqkQ1c7OB U\๋M@JtU "hP@ i'Wwqkiae(e;5RIɛ]"  Mrre\}QƯkjU1 Q),EEYUTW )BԳ9lĶt/OE^#UfEz:gtA@Ioa3r5:50Fh?j$q*q?5Qק ٺ㥾A Xz$ UA8'1UK~]~Ҏf]z,qLfT[ Xs$*>:]'kG?_6&6s"5ykn[30UM~ "Ȇi|NSzu& C6\G20P2i[W6Lܴo +"<+-B7Cb v}/E> M1 ӳF@0 ! 0Nf<"FcwyzSvi|N'rk*g7M8XiGV@>_9grT )ꁽ=G3eh!sPUVwy-t5Tn Ӭ5TZ*s)&NJa5"n؋_c *r5ynD|S"3ImcIjoV^tkhJ$;'.a9AFc "Bؘ\Hj71_GP%;A9ePj;oS+'JM8 u:QynZx~ck!=bI0М,7(_m\}Pj+7՘˽e)CS}>Z;&{c#rqgJ8\Tl5S))Fb<.Y\ʸnUU9D)YhDC`<8l+壶gSڦ1[mC8r%.AQbQq[TC07\%XJH %ʄk3a4S?dH fRJzFeDN,Czʸ䥩ڷ{ 5r+ev:,K"!E0D* (piDz-z.] am\}Խ4 2 !Eؿс_K>en'GQ,S>n ˂.̓0D 5b1qM}j xk&`^om\}dj}MY™@ɝ#˦'WfYjiN:pP^Zڣc7("ajɂz%m\}dRj;oS+/JHHtPHl-'#: jd*nkAYbI(TkUL&7WrzTPj~Je޲Ӏa\B?T*N?UE)Av?D~P>i@Z3Ulo+ X'2]st:Q1ju}kjG"LIꂄLJoP9:,P4M'G0O& bDj"}A>Q@'3Ym%ʄj3o<(?-QtiNg _ӲSHE.LW:MU`o()iYzT |{(X&ڙ_V -_@bn /UEmޢOUK4J'.mo(ƒF K^YzT*E?& (Onyt{žn|}3Ke @}`5ɌN*'!P=CoMD*6ی* G^}MOJӤSNdsn:ݽ i +W:_F>1jQg5ڀ,vv{WX}ҠՉvSVs w:E4 ۇS!uJo|IӋۙ`՘͗(cedS02D:>ŴkL#wowzuUʟYi ahu:p]JMbT/ :jJb _k9ygDm6JdN%s(Kil~]<9YV0 qܳU8p?KIsW:T10-dW,ZLХVJa=4=7BHKLĺ+v'vz\Nc"gT jܟE-GT˹0$j9PFu{ QaHrWSeQ v؆i^W܅"T2jSYe%R kBY*j0 `qRtZ_eAUPZ]dw=( L}:~"}8_`/*UwG&N)ZC77L/{M"1Yk? KzBڸPy %5_{XJ*pDgs~Q@`=_Ti+ &1D37P3h7ވV*11Q7bH&)5+14"/Aj+RHo_X*1}5=Q=ldbN:w SR b/*yLŁnNڳe03MGCDG༥s䝬CA,:j;]&+qL"P,Y76BQܞ^yOaLa 7\p?S)Gj9 =Q"AÂpg=7$ZE0e-b 醵SIMԌ"G1;ItTcߩ4}Hrd?N]9Tv#EDArZIul"Puc]cהO(raH .Qb;v,N]rE & [-9{)?uDVe\voeQbS;-Q 7tc}W4l0oQ J* -s ؖL44&嚨1ÇʘP.W<%9F0Rl.kPB*.;8HB8ӤQ!WՔ|}T q7{8Q!=1LgW*y(tGEq$b2Qz6ZCI'4)ʍRu 1*ks\'Ҥp 7OĬ*E#vlpEBZ0MXSeZ 7=LX,&^;o{F`&$3ݻ1Tez&\ɳgz?:e Ҥw,US?tӀ쌖hF?PdվT2Ng`S1'31.{4H b8];[E,;vަ rrze* [B1^"pĆxk0 |9:zexmܔL#QU~U AwD`Bx.Mrlan{,ZKO4`@i~UQiGOA1 tJgszr/W|aƦ5K%ٵu*N*Ox'& Aj^Y\uѴ܍ts)*PFB*3S*iSy[ {XMKbJ* }:-T&Z CƩ'5cPL~;:aӼQ@`=O:W yK!z@7"Le j *J1\^]oq3;4N[J,O|D]C8uaӸb@ g%W?nY`.B}y*;e {^n#@N iW*3Wk쯏|I5Yr|Z'O5d Կ?5MC}ICՍw =UH0Rj%ꡳWV1р}>RbGm`X MXSVAro4,Q@rVc8pò"I_K_a:&X0}dmpS_ҠQf)@ɝ8k(YPQ,TGSuA݂-nJaiUPGYP6_K߫uͤʓ6:c96LE1L$r[IBS+/JHݩwM7Bbk Ǚ8NIej*C;4Yu#R@qv.:Ddǹ#rd)B商x+lY|&!1B#eG\P .m%.N"BSUN~JeP(wJ8G1d PRX67 ( _'O|v!". ,̙365|u/ W0` AI0Pfv\gޯ=1⢢QwtO't|MU=_(j)qd,pDMkژ,B+r{$0IPRL`B|ig'z $YSY04{Ъ$0y壉OuS&OODTM?uTUUT/_brU"B-}(6kYOv`;Ы%JH`$tͳSX:NSާɝbP$ܝ튒joS},TIRM!`u{)}tǧ҄>k0f-e-5)킪U| -Qz9 N bF -wXt W Ym딢k*s$.(&N yN̢oNP " ڨ6VZTlRLa5ZT j2NiQTjv "\⠲]`8h45|}"Ly1-@(Kǵ˘TVQ m4qAE?v,O|H(FRrN50~[p2q`JaڝRk25{XthNmsB r8;;?Ɇ |eFD&:d.QTח'VcWY I4YME6 ;Kfib9iL'y}\UɎ䧚̳T^|V$aWُGэ_ |Gɺ.F:Ke`nFPiY徥kJcY\;=>dXF{(8p}9–_fO;sgܞsW6i{gw̛ŒqBwW*5UzyUrlex銰FΈ'~?o"|,^hߟgDj8ɎVtӟ91| oI5cd޺*G~/H?'jF3 KL7*lڥ6YKjJSX6_8ؽ )nwҊkbPjժ3B+3|c8F?҂XW<~15m1]< ɹO?rྸhǛ}pT892珄--EIHc[|c<ٸA,r'/ 8<ߔǛ~3KK_ JxjėD[(&[Zx<-|] /q> |E[}|c f޴lM*w馼Xc1soJVN |!0@Vir^3_|97}q ˁӃ96?nPޱQ| cN7x)s`8FK(*o#/yseaQjZUe_|#oØ|EKo ڒ9cs|_ӌ&McoÛN97}1ߗןs=1s:;yܼ9n|Go>wg<9o?t<Gw c6o7g?`s~#n>1s8cEosÏ ߑχq>1p>|= WW7>] ߉ӟ/G|?0s|>]>_8`>y21p >1p|i<>?s"@Vz/~1d@B9ڦ<[T[ot elSJمgѥ*W<2Th O-Q4oH`/ҕUY]_x+iZ73v &[6~18 VŽjY"+|c`-_ dv;[KD xL;?^THh9 w?UpDŽ/Fy@<5& Qᦃ@ 4&xql#Zlv<9୦yBhq5]<0lRm T  GGP3$/ ](5N *q_<-hŋ@xZ'u"Ⱦ";H;AɕFةgY "Q5cAKhE@Uթ$reyKP_ZUP^[AhJUqʓE?t, ] _bPq<$*]\QJcѭ:Rr|]#84@qF9nI&y9KB8&4y:,|?Ê<."{*?t[Bx+i VT;Ә_ :_:b`wӚ FvV jp w]sVڧKn^qX'o7@[[ ջ mPԾŊ7=E{Ҹ4!-RJܿӵzP9*V0T9h5*JQ׽6MIT* M3}x54>R %}(EChRPbc"Ie,ߵu S4'3I D4]')lKj**=+ӀSlSlQ9I*5(,~155MX9~W?)s<Mx~~YRi|͹Syҵ~? Q"њu/ywv9y>SjNc8K{b7N4~s +>xul0-ƴVtE:9z_|Ᾱڒo>&'RZXwC|"/aI|Y"܃>o߷?qBwW79}^\GXy>gݜenD hABX"Ϗx)d}|ޞ/}/4x5)HRfNSJ[pm535r-ٽRDm a<3\_ TP(rCn(j$ۃꝫ4$Y;пmޑ~__sm6 H$oS E^8KZ|U%R<ӳ<(oI r~sn(oD /q##洟so(07j`|. J;n9lQv7W9|ߛ $P7ߺ1Drr;nDi)1B? >1PA_unbb4Ok}[n9DO-g)%^ 9Cɜr+n"K4yuvf%̝/xlqN'"y қ }S$[c{ @A:9_0\O SLɿz`d'Ios}9/xlPA't9~*IsPn_1_sX8h |cTJS<W9~]x9>҅x@[NoŸC4Q9ߎχ.NCkp ֞tY'~'G76?8JtII:"AW9 `ܛTI(EJrӇ9ߙσg8 mԐ i?f50O¿ ϯns~rK_Ly;W@& 2.ۤz^$νkg=nx߷~M([Yfp$P g 0愜1R\K^1_>A8L9;ڒHu " G8MD)}7ȋґew_5rm̍ބAc)#f0eOϛ?;?thyA ):f3ѫi.co߃e4ç,oPh2En'Z-8elWDGus? ڌ.Yb=TIҁ(b  jVv>{}b`}ChIRRRjDн*UF!&;OsO~ǯ OZ o8҄FM* ~Ssy:ӄ~/g,ܧ)F) ~hC )jv?57}m$KzTM$0޷m@ thOJ ӽ~;㟒ߛ~Zs~b XV,}3&sY#Pь*o~,ěE~;㟀ߘGiNw Od{R@&bۈY)X0J`os篐_xHP`iiNCx֦RN$oss?@Y혬I(ݱABvCP1Z 1S 7aMJ~S5~u҅rGnE1L\l̐C I@Փu4k| HVV˛ݭ2Jr _J"!q9qIj;b'~Fp&,ɛm+bC=)q6-zMʋLCޅ"H=Bn o^-k;tOg WԤxw5z.AZuhzfBJ1_pRƯI; UE:-R&, 2?̖o%!Zi[kD{e|ڌtݨ rv;/p|"Tw~νV眗<Ы"껰@0WS~ (,1@:]*ACoV@VVW[Cب_-MƇY}_V(Ea</ii3 m[]Pbd"OLj7^;/KWȳ۾a`oib'[t5^7jV!;Tsk'=*\^$AMm :DG ]9r.-@0pu U2M- aE@&z3z%aԱ>Վ1-t~ڀ3øKڳ<䌨=k;(e:T*[MZ2S (0Lƕb$?RǤh=w5j 8_KU ^K`<)V +C%FX=HGqڔV+>Ϩԁ?jڭXr[ږY*ߡ 2=$TTQ%*E> `b)DJޡD>j-hFo@[./F{<Jz*2?x]B`{#hӒ)$ojI'Ld-(ϬiD:/VW6*5mR@%(V.C4wE- z JP=Q&٤T,ݪTW'JnEoWC~;1d Z)OcZ DEΏߊeG62AHCI6ldoMRVx/#Xf a`w vuЩP]^J俬;$$o)+F~OLS.[,H DZ$JwvKXNBڎ܎kԄGʓu= %ߞ2[.-Ӿx"k 355)UUGO9}3ڈ y׼^ oiHwDbSJf hږ iJS&ۤRfe~pGFeh"knEmIdԩ,bz+[/{Rbe$U` Q.; 8a6#Zt[z0[/F~4Ȋz[2E A)|'NDo<06q]R@6m|FĬUOڭPlXm\yPK vY m^aP`)f<9l(գj T1;*jԘe?og"^1- i6 WjsB vtj,Q{ju]h/:H !:SSSSSjxO`Y7f?a#P+b=K'{qp&4J'_F,/zԆ5&!1:k^oa]7\imm)M\LJܣɭd)X݃5 3 I7I$O [P$= zSCȉYqCI+AX~j.•))Bdqs&i-ւ{Pb0VփRsgT6ԥ+556;[S$:Մ S`VA5ң8RXAA  HH MAM2}5.8bmLe`%y&%@wh2+P5a ߚKK_]j66փ Xj y]M yAGڌoJ_6-gw_B44虷$#֘mBM7?2|ߜ@^RD/P  B :*zn)($׃uS@- "P.Y-F$=?T@] ҟZ8ew-LSnJEEACnޯ gKKN֜N&bҍnι2D֠Kht-D열bGXZ%fڀFbw'jܫXh+3zU9ZUړ׾tpԦw:XIHHsJNm`Bvh:҆Ao-:4 \(P RɯXd6>d6 : h\ Sp>XPܜlhbqB ֑p!0m`%IPX;%JqD6Eb"gQ0 x!"d`C?t4\2أ4$eKg,_Zc`oJ!)I! S q-i%4cO"' QH憼DT4 qIt& i`̡vLJNgN &cVHwp9>WfyƔܒf ,8r̂)VRPltDQtgJ KU5K_jfm9\ҁdzbf$3 "VAI0-=PWdgNZ4 ކ`E(ti j^=(VޛK'J;!ϥ F dR)B*\(Ej^jxf% #8 wF)"P9,49/+&{M=PȖ*K| ֞H+S _ncы=KRv-u ڃeo]ikt)ҁ=ë߃nZFYYi$T٧]jz?\Y oR/CjVآ !T1BNx8%0R LBhic.];҆ڄSazd! <,'6;ш`j S!FD4hH/<-&#*DݩRBoӥMɓ5&QV !THF*BդòUGMAR V"3 7x`|nrMj l:򔮕5 *p1ϥDSNH7䷌丁8[hjFܾ/ߙӐ̇D ^<LgKA>N֭$JʬC{δ~ZPF(\m٫)FpN;z*$3"M Ҁ-*JIYZ +0PDGаhIoY[l[ЩKFB5""P0@ib±#u 1`g⬬6/C2AbY[,%Q5% B/?MukNe2!"u-G+C0P,BG2֐A3zBR/,4mDTH/,THר2nJ-g6s[D)ʙ}P!kӀ"؊PbTA$YoBHcuU]H!ާb?%B@^3-K16M(I,Qf^Ca Bi`\}04"2{R1֠BlS`@ܩȋڏZae)Vdk{^[P!`UȒ]\E*N;!8:nv4"#u^hef"4=Y6 Or;I(ԥ$X`"[)?~Ơ0-VԻЦ I rFewtS= )r,=XWND7/80>hiB]rh4`!@T7TM4l䩉*ÏF'bh,Z@J3RM( BBs RDۂ=C""iDE``EEa5H%B7"I訴gގa+ CYJ)e_Z0= gCRYDK&4٭8óLnmO2wS)|zsbL NiT΢|ȕjT,vLb&Q1u+N0! ,I~yb?!j/SDձJ33e42If" ˙M'.(ѥ!r**xg'2($6LVJ[Y,Ӽ>zɌ#3moQf tPp n+ u,R'%+W@t/.()C u&-~P. & K#lf,ԘM (Njࡷ;L!E=h+H]hD1>02[XZGCIާg?EOJAM0FN0.Љۊ @C*F8c)f:DxH^!c%ڍ܍b~fdRC ;*|1O'=EIYR4jS޴I#bUb<6 rBK@"; uI4أ?VR=)k04% T;C9t3>:e3D9@\J&bE=Uh`$rRI!4nDҵz0"D(ة#({҆PS9Cr*P DuP~KgI#2a μTe5GD uxGXHm:$(e\Q6zR}r57R^zWy7}PiH;r(gÓ! ⯤GuEboݚa$YbLffRFU=錂ҲiB0|f}t`$`TFjAK5 `7=rƔ0uCͼ Xi7_zCoUavڄC9j#,#V$—+8/4Pq4ьoNHZ+ԡ ;Rw-R`RbZ%vi;EoRf]z"t0MeJ#,PT0MikR X/xK2\E>ZPgzR!R &0Ң~,~MMIRT*u4 ޒZC1W:":HXҰݣ[jsACYI5嫵22mS{..V 8EX֘ O4XR0)%h:S6AĖx@bA!m djq?tFl8dn!uz ͚ëIRW*J C"V1"ghh SLqXb!O꬈!*B,0d@xP0E\x,t9W8>蕕7'Н8 JiRD dJ{+ P`jG@6*,ʾ &R0= = K35,Dn vi2PLLT7Z_F?, '!C;S$$qrR(o^/ԔO/ 4"7oUP ,kְNc:}_0h5 WtmT81.++05{Qe^f.Oz84.cjU=hDrAd%)?!].A%[$>'q1Ҕ Nf`VEA)c:T(bE10&F?ewB+[T&ԷJqAo]72+2EH2AT2ʂʹiTbf9~<#jZ] Ũ@d#!j##~ hُjHqB!?=[e;ʫ)RW/ (6(0hZ#v>.Sѱt5*.I[F)0ZZӈPēJ5(^y ZwqB~*i~$0C?4B$8!TF3eWbJIL`jn6S0X4;qXC b{ b`m8X7;T@ГD٩Rݭ9~WϪh~L;"PGʓҰ+~̇HE*(K8#?J.cNY)kս[#۱қA)FO'S,Ģ7 Y٠(bt&H⫀ܲhJBYI+K]y2tAqb\ 7@7G&)ń]bRɗZZTQN4!Zus\ٴfh41PPαPDCRB(SDwƆuoA#B%# @b]aփL_pX,F$[2Y=$wg%Nq4V4Z-or88IIb@LSNBԙ0ap=XS/XI udlЬ0ը+ɘu3d Tܴuk|06Y%[ҭ;P#B=]N0/URK _z ͪ3D&tY"͇ER2.1J47s~cw+l\R 7/FЇU]G1Buiw{F#*[8}bhW!C4a{crHY_數E7Q@(Dܝ"."`2'$O (isҀ@3E$wj=j CU+$M0HlAstVaԦ F_Z+4Ѥ֤ C{R4g&H,5m% h (5hbr ^2a *oOp j3ڢ@eδɂ`1)\;ij1DU`P8!GʥMS1Rǵpe3Dom:AbhYw(3y4D,e yAE͑4mc,^E0"oD~획j0Rvy.0wޗERbR @ǣH+:Tud&}:~F:N&nP\Lɤ^I6@(|0B_:T@ S ))e:GwSҖL 8+i9Mv8!$&(9W*a?z~".R%%r#$&h`ZfH!*l耥qӓ𻼟,+2uR\!t pbXH dҤjpU\(Nl-=[\94܊,</$XJBOD u)$}J;]i 5c-YJVkұfp`oB( ;ѧ(kI^Fdy9('3cހ2Aah$ /ZC ۼJTijF_+M*YJtБ6@kLi^pZ.n=p(lu$;Ng֔&J 6MiSvRmD32z]ӌIʄM2=h,td5bl٨gBLuWah ՞UJJe<- #/L% ʅb-:*,Z(/HV nj/:RY'Io"R i0Xvց~m 9V m37xQ_*7jU=.ZJmz,˥=@CmVϞAeڥS-ҮY@ `y0DG+G4Ӟ%HJE"!4xÚ"ou^jRaϗtT;y 4jMIfDVWA{z~Y ӆgo?n!<8流0|B WF ϭ3ՈDE ˓ފb\%A:,mڌˤ6ؑNuX1&eoXTг daޮXMoFvRkB"%ґ\X(:V.*Y4-(R%4*(K%uƄy"I٥YS@ ) Zsnhbti!IHgmޒƊ\w:f9zUH&w[M߳xDM@4x}^Ca@EA zp'$ 0m 1fa;NZ<Xz qN/38b 41$Q,˱z:vڬY> m`\ېAg&A!: ?'qYxP3F9$M췐1nboI#)E4IgmC fl<@1I :x"ܳ\(;zY^Z;4:3jDpplYlmJ"I;xA3Ӝfjiߜ2 RR$uZZHSoU|sR^oo&Iڮx$a˯za4If^xք!ʖc+`C&ŷFK&(u:>Y뿥7cu:L?q TQ);ĎWR37ќA(XYO$#VyIA3.PkcσG1J+*KZ1< PnO^Qv"z١bz4F =WPŭ Y*Ĝ16%[jL{PHވ g+'(#Z43$2{J#*+A{ '_[My;qXN%_KM2AMJV3| cDF:u#þJWf\/ 1T v4\qf{7JJ'4*G洃Tq"Ejǵ]^Қj^! =\g-s[NQj NdMiTX0b[71ܿBxrdtZ @cECHB!CÞkrqK"A(6-TLiUoo RCJL^eD71C.^Ze73F-"!3ϓ+0ɓm/.|9s!ԡ dJ Oj]FE*d Hz :j^Yȁ x%iK,]/jwէHj\~M HV\e୘wŤ !:W,^D!_r1ۣI m͓A<Nsh% XjL]FGԐQ i$mt S":2l@у@V&/\1Y\mʉFY 7I{(M3}T$a 1$ DYL7KKl)&JIԭ:T3Ux',bm3RN^3Jui{hsAe,`9LxDwO'kI$DU@E-GJf7{iHT@lo@N)8^0.ƥ"D7(MWRʙa Lafi5_23F#&׈ГLCJҐ+`hK;n/-Ju:U=x 2R !1{S0tllAc=iS.˜ *%0 4̡t #dXM}|]0;V}س#C'jm70"EAQa#zQ B[;x? (#e_#^8#HW/b&NtAC~?w\‹ :Qibo%qBA-cdjAJ c !=B|QEDRB!ݧ Gr?m]DS( ܤ{pX Xbx&)[SͼFo<eH"@4@7Y>J2LCL6[yI)EԨw(Gx2?7z#O҄I1~C~&^;<,CDL,)N K7mX#J$ZgR\~soXQb+߅,هm~C~l AB+a) ا Cs$4D52$FP S٤EleM|{;W_QN̵K \5b`{u0IE.C̍ +^%\DږIG\%,+늰 ͺX|n *FZ$jxuzI8 ֌཯PpXd `I:tLV["ܡCI  nTkBd)xaޚ⃃ m 踑j0Q 'CڑCoJ3w_A/:V,N~"y4jfc).|ULG$^wT SDT"4oތ|}k)g`m'q '5[x2G S5,˵ "Lp?6$fQ1dT+֠P-(]P}2G6=bܵp\($S yhYAIGJ[sj!d-]>iRr4_:Tn3K 8gnf!nM,:ܧY`~\]oo?;VQOcw jf.20#'~Y` 2SoIthBtEBb'^-oTRH,nV.O8*Lt n3Npڧ8do0S!?XolCV_/!%:@,)'i :x%mM;̗HFLhDQѡTlUQ 2Hɥ5[)bx֣CF9:LLEݘIl@Idc)$(Y1jXH}h!Z,3Qi" Ko,N Zv>vxzSq"14+K`νi"i?^ h:V56 D<1V Zt`LƠT#=o_-N#5qSnHhZeRX]A!CpDًH cߖ0mluꀈ(zD233DFNZhʍB$AxsM)m+8НjL7@d.?X߉UJ УMnք%w+!5\M[5˿BB]#$^*.-;I@3g #qtQ`Y Y*M,iq3'QP z`)eXc;x>7b/odPK^@cMl Nmm/-| u+"-y4m֮kH]"F:`!3G`daDbx}|e ~|+gK1M'aNE2 =UY)q8ΨS 0;=&[~wOOgPvl򡱔0!0ސ%,#6dNa$u 1;1x* `|#$ʈRkfHQ)> Ŀ1iQIoIxKʮ/8L_L, .SDŻԼڇOw3#t d :5 ]hEL4BwY#:ތJRU`Vl3jY=o8)*/na6b& B+(bCҠ@h@hi4>*K7mZa.Bo弑aXxy1FHbXƔN@KwhՙX0FP Zf:|Tbhhl;X\#jH2H+u2I)"[: Uݕ2~ݞkbX$nenˠ`n1l QhoW;[ԥ(zқH6D|NK1NN`i voI9[=+'e~QI޵$v$wAx͛9 Ԥ46ɒ%A% =y\y 40P R\ĢQ&ޅƣ*GX^zP(΁0F 9܏t"zqDCV {KޣN(ЬGOU>ս2쾾"4_~9V&3@zANJO4O>,a=x8% zq1W1-vh -ӤtڥIBRYNLjQ% a-8+!JEn 8X=h)vZ=@vY|wlttf " z$@yZ-> v V xx4(r$H3J,N*@T= \'*JS4MޒPƦTmj A}"`P% Ve9ήx>À ).S=j(\,]~di1XA:, #uXu e4IɲRյ6i,5Rbf#2f0j C;ҫ/ᭃ4aG?T8M1GT•JNs [Vغu4AB@8R!`fw>ND lC>UVW/$}vvԪoT&ΈyF3 %X> ףJA 2%.DEb5N-v ѵ鏼Ry-l[|dvcߕ:`CU,8A8$"&ހ/T#rAY:@Sz TЍvS3-3=ơcyu,){zu( &U@ [A0=ܗR7ھ= .R0Z;P`lj@Tiå@KA*tO JRVӀ1oX#*ǻjL3`QR岍?u q4AN7g<֒+8u^QFK&FqqIT&Iѭ3 YѤ\AfgBuaT >[4)kBj2Քe]xh{,t%߫``:P@)r 20GB$,A 6AR2Ò8kDd.`23;4 3K4I̽j3RɆ"!鎂lcְJo޷`w/2{zu( 셆Ȗ? xH+Ov+IA@LT*wyӊ.f{Zs3bj8OHV J scl35Knb/J8e,]w[S6ׯGJ `i~ZЙmX>" a{S 9k7F<pb XIℌYRDW2M T0pf KCVYzL.;T/wA1=;Reuj%Y=*8XT~=&`HurL$g=+, Z#h $YrR!#u>h1yU %U:Ft+( iX2!0M鐈79e{ řBl49ڂltvZZ,w"B#@@v%$)3Mbi29heҧ:6ցr$tI (ˠn^>Ԛ)eG1"NԉfF:ػL,t3/Bx+ֆPn+rJ2pYˆ$y#LiG0%Ws|RwLS>rz,Ek`9ϐPH-QRn{>2zObnvvZ@LA@ \^*8bًU%r~<9ድ*pܑ/J!z>؞mϼ"L6h(SiCR0Ph1X}H 6\lJMRNZc^gJKF,,D$# `h;"$ 1Iƾf&NlEý#Q8J0S.dʶ-j<OZmQP@Fи*T蒋kAU<MJEz[ygS 1:-#bǗL0a֎0q<$-qmB{8{EnPAz㡩!d&Cau q! jal[+3B$82M0-4$u(2B`I%x(Hi搤A6?*dѼ!|=WMBUtE&~Xh ~K*'"ڛZ# ue1(M)JD z4 /,{hDH1I܋t6(,}i5U8B>^(jQct' :P%lX%t ڎXlyqlIJpC8K=a`%C Dy)b%Ӕ ]+Fu$5eo`T$DNFrޓ K%8oZ~5Nu] 3Wm`B*2(mnXJb+́en[p| "[j@RWv|@rRɽΊe4S,Su4dC# @T7D#!LNX%3ʁf.as:_HGdGƽwJfǮ㷽nwf(.۔H3jvW]+$gPKIacrJ,`|Uiw1n/v/ɋX]jVYn$)8*ƔD2;[!; Eֆ:fv`Q{Ғ3=i1`|F(equbs4o Џ$ `PdH]۵f{ TYUe0b掀,Z3s./`;[+0rc8{s(zreXS=&rKoZ$erJben7Z,PHoaz.tD+帤6+ ~(VPJTfmDc21iJ'wJPϽ^IoMJY.-$ &akJ56H6D@3ᘆEb웙lvE^ % KNG8|SXD:2հ+g|hhHX5]  (IZ1VXJ's`t66M5jdŽx1#~e߃HziqP#hllآ L3 (A1³.32: ڱ 2PCvi1,Pz3)0 h`xJ`5t*L%P1aTMR{sbtUt Sw=ƧaYFV]PVʻk'҇?!Vt cݚDadeҳ.`/,-M+z  3gT`ͨTRd⌥nDE)K6*twjE20H2ݩ0I!bMZ#J@FK!֜HB^  juSQ"Ic8|R+ JP3o"{Z!uOL:]pTB~P-@}jW {6函QCwHS=xJDay1r`PiC-DC9kQ QN:72wuصE"dڲ:2A{b&uNG(c8YIoSIpC[ }*٭#JU3ť&&2/[ROJDY V,o22S&0kHZ-u S!VJziL X Yl}}j6CƈϓVs6xPR\`:20REZH-QP,TiK6z t(#iYmҌF\C~ZȯarljUlVN4X)Fɓ]2DD 5L̆;Sr@x.ԸHn9*Ii@&QK~>[̴rF!dYZ IT12P f.z܆V~E%^Pr'_jb7h[SA/f P1;t* 2]I_ved&`n*Q,DR e};jAS[e\:4~H&kEW2☒.xR1a(7h""ga3Min,{po7a "ф=lS&4Fb@ApYQHLڀ} ?_*]WФc 61t=՟X)ڐN:P%Lf%ߵF\5Mmi$dEBBi E$Ph::<؎TԤJڜl36h[BQZjD-_6] * ]1>eDRSFdHJPvBXmxoBӇp`%جءR\ϗN`eCi^lҘ qUeeroY}x5~u]AX vh/&X@!C ٲini%l'HvihB$##S]uPnGǡ~[`zrHL`= IQjDAJN4)-:E'oQׂA% $Y)$0ķ!*Cf )4\s+'j&.rC%,mo%ևƀM(wPH)}iTHBTeREomT61u󳿉sk59XPMћ@VP@u0(  ]Io,T @zDImŽWjF^.n$$F#-G+.ʄj> ۼRz D !XGp{`"rvԙ{yFK%9&IRJ,`j'O-!u%2`c,5  TBf<%'1њPIdZ$V"BB]D`\If@RC1 Fj2& Ɛ \mbVJ P KC9ҡ6 :<&KEL7kHqB@"g֕RٽWR²ҤOT Q wV+| 2\}(]֛ӱֈ1 Fq v4ُb1`{!PE )DU {?1֏@vͨ ]Zf\|QRq A}呚̂Д͵)$=xhHҤJ!g)8X"(%քI3V%-ȀD&QP0-q[j~FRR!N$vڄ1j%y4w&bz:A@K=4r$)O `$vW[@J|P"@@?!Ґ;Z0f T8dZS"RΕw@u2i^V^?Il (fD$igjTu7 ׈0#d8Hٿ"KX ?Z `?S&^} [@o?<(bhǀ.Y'Wg)_^ %p~D 5yL[sG^A3F_61z)dL=j4bQP3MfJAsҁ B֬7Z}y`4b9ja29]:MQ,s-q=)@rxLܼ`0СV /LW<&3"_ 1Wr$ru)\Y^BD|$j3,P jf]MnWң -;^X0PH:HC-)p7ZD9q&< L| 7QnE*LoWs;i,U YAAPZ/4,z^i/bL 2oDk?|Q &;LȬ,Pȹ}.u%65dbFfmd jPΑFHDKT&:,l(࢕Y% Mc+cAΠ+4 :PH8&&KȌ$HSjxܸRajCzܵL WRʮ_!,D0H#P]?ÍiYyD#48?B52 GzȪƇșt}.*r:7@&zHC$ޖ3qhL"w*/<2hb0ǴP1c|2;ܚ$ hJ˃A %XtbU҅iC ,<ݩ*<7 ` [P]W%T`h3ua֒&oSS$P`զ%i(sVi hq7q?xH[ق@S*-#bjI(|1QUQΜ$W=_Ua֞"Svv!ü| ýD> aLRZ>DIfFI* rř0h _jSf5Zd iAMx[d֜+$@9JzΈ. [gJ wU{RCJ* YODYޔ*1OE-IJ R r`F CzHңPGCQn@IiX`$-PH>M5!ً^&a(t : M%1X]ZH[f3}IK E1$ ?8iZ f tt=}o}\zRACEq$:Q"g"-#b/}9֌^V #<|i=2{ -SU wU7ټӊۛi+f؈7'VXoᄳfMON+Pszh)_`J dRɲ\?Et(bHb֡`:Ko)ek+ػFa?EE UuJ*SU/Au[ iU-"fp0@]VA)|A!5(Wvj**(IN| @O7;~yht=<AdN^'XB;~Q M P!'G<$dL1V^:rnV9БTDJ-8+Jݵ C@`Uz}^^F/m{|One@ǯFK<1koe6lXqrYn T&4)ǃs0BT#vx `й}=ۆkOw*^(mzY45hf֟RqNmh]r"^kZ(1j/~va4L_:oFE!sAPM`eR@m *Z$NTs$HiQ''ZޗՔe] 6% N 3V^h\p ]axil03ѢPYSv0X *X6hpm΄ hdiy ҟ@nQ6Hw6Q1ږVsK"zmEgM S}[b:G2at\–I|8 t"u_@'X[rb:kJ9rDT&X<4tHEJ `&'I'ۀ 5 )u(8MޔXL==رD\z'Ġ8֤%1u&( ) +gS%!HCK8[ ,i@ի2PC38U &qKRD:ҔzVB2Q6W)D" [BFC:s#d v8 aЋF`jE 5xנ*/MPPTEcX7P4GQ՜a!c|AS"%ε!,ŭ%yOgڰiAH6ny9&& tMJMD,h ,LʟF-J!Xx(e}U Sjɂ'1"j`qJY@-AS 07jDt8HsFe4H1,\ѤLS^AkKGfG(Pi!J(LgxHN;kk) ,T4iz#'^ՁةV zVWhԦ52hjV>`K".Ӡkou^*Q]j/4T3zY,AQ@!N/bqcɶVr|( ^vbL"Ks W~K(׮>(w+BVVP ڗJ}}4Da*oZv(p}`T;^_YU1Q 3Nޥڣ˱3B&- o);Q#`58LSB gMhbskT9${NlJ'%8#:U6J56XԝZPjI ݫwPYP'BiZ~i0Fi/8J8%$/S4=Md2"IbBm@qK!6:4QL+_vj@կ VbNLf#>QsQlXQ .usi#edddbbXs@@iFUlKO 543$TT.b5}jIA:V(fV\u?&a[ٿ[T!3 C#Ġ?t@"3N Җ$ӽyHm>WˀTϴy&'Z: :EL YB8yGPQ3p~,"eMJI;Tu "z2jvNJT$J֎iކ"0L_:@*㒑7&aS@֚-eiISrRPW4ү=9εza;@c;ut W/4)&Tg9LQJމQ4 ,3:x DwŧTʡ4x$T2E1!-iP &)ƕݢž)d C7fw#j0 1Q3ᴳD C,P_@S)zJ[λuDF#!lw? X. E?$ qwlqLMM},|>RM*뺋j[؀뿩16'? J<[:88#ɴ:PYTU}<Wpg:|>LR yBvf;a&>}n|*Z X.jv/&jիWXZZ:r/\hv\.ߕpRjVP(sBt]G6HOZ\gϞ%ٙ $Gu]H%YEVCTBKmò,4HmX.RZ&tBC)T*"Ldi- B8e)6^x۶\GPBE^T.,PJhٳgE5x=C5jKFFsϟh $!44kYa ^m#HHiqdPsuD_~^1 Y[[KO}b{{{۶Qcccf]#D۷o]ႽD\Wiccc ٫fgg#,*LMׯ_wMwD[3TaݝN{[r~ 0hЦ]AM2bAkkE-EQq!0 8VC}@\q`stymb-v׻%QEyk7֩yoq^ֺ0\ 5xz@[```|wG PMeQ|}Ϛ i0M3-5r 5Mkz9*Ki=x8KqΟ]j;[d27oRڗ\.8bdDs^4MSP\}}?Q\v DBW\W:TUsss8wܑ !GB[cnnҾ5ʻgffp۶m?:r윞~8΃`v"qF~[?p$<d=NRl۷4 /u3̟ʡAj FTUic2D2/^U?<L&ظbh&(~%XxI\]ظ-;3>Co]B4IENDB`images-actives-html5.git/src/share/themes/audioBrown/img/eyes.jpg000066400000000000000000000027011250410645000252770ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "i !1Aa"q2BR3 ?jzݙ]:0%:q g/*; %?xʸXC+ȯB,FjlWVqϊYZVLmQieb|zq%u>%=:]9n|{+ \_F{ {ް~Vz xCW![S1tic~S`qm]S]\<4M>hK \`ao1UӬh+IAHerY \b婖9;;images-actives-html5.git/src/share/themes/audioBrown/img/eyes.png000066400000000000000000000031451250410645000253060ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ˧IDATxb?.Ā Kr] 0H]:,wm'@$=`@CZ1 $7: @didf?"",dud4MiB1q0U⊬ SBJ'ǐ؟XZ b9 Zj$ πxo$ŀ%!}#dk@ 5U=Ԝ7"2dī)bRߤ@z2X*~B@l@M˺|bW )H#3!XOb PK"<&2Whn$E,B-d$'S@]وTr_$5V1o8ʖRԣUG.O$ .b(j!I2І7(nPР;A'>K@| y>ޖ]l؆F=FiAh@H 2Lh B}@bGGJT1#T f@Π{abn/ kd(TNJ@߀;C hfL@-V"?9"PoP3 SAXB>C2>:MNA tpZ gZ$5>]x pB 6& [mEhVD vqo@6h#xI5!X[*mIENDB`images-actives-html5.git/src/share/themes/audioBrown/img/eyes2.png000066400000000000000000000034021250410645000253640ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp L!vIDATxb?.Ā%3p] i:~({X>;l 9fS J$w$ /@<8NF( @M5Yȱ␄"̽F@| K6Bp ^yPZM<'PZT9@*>?K} g~ hB-ħRb@ S8ȱDׁWP ۡC3/&g pw @V@|CFpQh[6R@|٠Eo MB">@]XbRC+XsiRk."Ak-sHbX!;G[ErjT%@_sqMME\)3aIВ# JG+. bPKCŦBqZz"~  > RZ`ta 1 !lT0kB# <[&Z ~f91u>B7POՁ8jvb@Aj)T' LIq1aT|AqBbU>5( ;NJ: {6LH#S؀'c ukZ MjФWq8Fa;8 bL@ 4 IYX$DYI#&#D_| Q(zB'7v]MK<#&. R&{Ww`qYhqIV;*Й1V~4Hx ڶi$_"|ӦQ<>v, _I+?ࣝGi@Fс_ b4 [J%TނM V0}Hxol4gtU46ly,, L[7>$/?"* "/t ImFTV=i&y9E2;E!'ܷv%iFOoBGGcn/@3M4QR8NFPc  AKH,s2]Q>IENDB`images-actives-html5.git/src/share/themes/audioBrown/img/imagedoc-darknoise.png000066400000000000000000000057521250410645000300740ustar00rootroot00000000000000PNG  IHDRtEXtSoftwareAdobe ImageReadyqe<PLTE"""!!!### HAȫ qIDATx[ 8 yEY8f#=,gzO3WqS}Uy"psz~[fX21S 5>}OEV Z} {jygHj}Dǯ{r̎fp֙}ǚӢvk~gM}1ưhIJ>fZF/8+ɲՆ[c:E:dTGIk~t܅ĸ6°)DuF]t8R!vhЦ 5Pp;QW깚ʅ}Mi DžJ:-:kW ӌu.]*FŚjX JA 7ѢkfCTLT:l,ĦսI5!LU^kͭܢ pYwSRAd<}Bhup_iQջ 3 +F[ց~Rd+5£lnBB .2ҀFO>u*pV 6p>)9Z}R xڍq 2hl ಆB ;cex$\gJ1X 1VJRqj Y: q͚" `\#M3B[[KS6O'W&-v IGMuٔ;jb`crs}θM'cgʞj9"ty::TtL)CѩF] EʒORJcA M"u%Jj!MiDjS -iғ$q\(9rscp 8Fn3)tAܲ<ABh+tThk\KLj#G%Cj8f,a_+qœ4# v!8Q9ɐo;~Io{g2V:MjC#Q>) r9|/H0@h!w@!ЕܥtO|')q< t4tO4yP (fw4N(0D z1Ҭ1@3+\I1 Ajq$ 4ZoMA:c<ʽ+ e+`,UkIg^|ls1$Ҥ:0 "?LO& UdS\?23aG85-IVhF'<`k>uR=NsG>]ȯ9)\.CI0ŜRĒA\d ɚ5&´9ڑId>H釼$1j6’v07~w?YF2㧗*cEl*u@|[|=iL(0ĵ=n.]@(pCArDt 㪜9+npGL,w^T KdRWOprb-9z:{OLԋwW+-;? 6 Gv6u)KSWxvf0FX-P 9 =\*J~rVp~O79SF̈<%rjVcۃLMt+tw%?.itl!3IÍO10EY߉72Umd$TYa4&FӨ~'9ߛ6vwEZ( $V9/ 1q?$ڠTVȴ)A0DFDŽpI VT%\R9d<+h9egw`z­[J "!it.VÔ$퐯0~~#LF<# }([eb#]/<~^o0MKcΊN S2&S4 swΝ?aKOB +(Sޙ^~pZ/ 4ۣBݴj\E8G8:zomK8l|;kW`֋W+od~Nv\>&E{J~r MZJVR>0\DtCHTm4rV6]e'sJ%`dcIo4^VJήL^|!9DT`ߌ0=]Jgo}hc]n}fQ9㷂I,L'Wo ;?v0~Jρ Adobed         #"""#''''''''''     !! !!'''''''''' "`!A1"aQ ?[I7 o3yxnhBc'`%̉z͈5p4kֶRD%d|,^6ز* L+փVrgJ[iPqp7=qV:YPW1>Qm:7M<ԓ(0m>Vzimages-actives-html5.git/src/share/themes/audioBrown/img/infos.png000066400000000000000000000024221250410645000254540ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp *#VIDATxb?.ƟaD 0yN@8;k,#2 :S#wوd; D@K^hLL3?@#6A|A  S-b-~u0? i@ j̓8#'5bb5!h4S˘uw->7RRe_ ^Z'}X!-=hg?0eq5ia@ߴA"ɪnFKg@5Άm(zlc1> ށqP!뱿8Gdv9IK i8q;1Gc( <2?G=7%?Qx:'CT֫B?rG=F$0;^IENDB`images-actives-html5.git/src/share/themes/audioBrown/img/infos2.png000066400000000000000000000024621250410645000255420ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ;:IDATxb?.a<0EgB3I FR$p$N+pG $Y#q՝ @didv|b&RmD?Xޒ~Ɓ r";U", XH [7Lif? i2Y!=r$Ѥ4|}6|-#օ_ܙe#7RI @I?UL ?0ujNk*eH ZFP`w,GKm@5Άm(zlc훑RhU@&Àcqӏ41m7{K i8v 1= jX7cc q!_sc7=Jc+f6 y|Hz#r mݏG؍7qIENDB`images-actives-html5.git/src/share/themes/audioBrown/img/meta-doc.jpg000066400000000000000000000026451250410645000260320ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "b!1QAaq"2 ??֮\"`eZcN@,6I /;mȳA @sB1`!W9iKoDoy~wa`\l„OSXڋtm,:J~0h. "N|uAw|z bn 8H*h?Y ]4MoK۞egm0ZIj4RxS n\tIrjd' g:IDATxb?.[aF40#6p lb$ABrP'K .p\GïIrx. L DN`s"//E?g$k9 CٌDv[ڲD D\!@O~b)jƿ@, UC&hz/@ C.8@,bR# %&eS#DO˞2k ~K.v S/XCe@mȱ g6G=61{Laćѻ jT gЪrPGبh|cRc nTP6Trއ?hqH1}6 3mhdE8ঁ*IENDB`images-actives-html5.git/src/share/themes/audioBrown/img/meta-doc2.png000066400000000000000000000025351250410645000261160ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ;IDATxb?.a<ΰ ,h}qg J 9fb/X]$;$>մ 覽z@PaT"K#U @j)z`<,H 7@\e3\٩nH.`!X 0~2峠AZsRԲl3C-f &$Gnk XT@â g(l9K8;lS#=-{JOˬ-q*Za"@ S49 j 7C2k Pب(u4q FmD`+b5* UHl-#c,5)Ae)CIujX I  I-#A 02*h,@x@Q CxւֽIENDB`images-actives-html5.git/src/share/themes/audioBrown/img/microphone-icon.png000066400000000000000000000175641250410645000274440ustar00rootroot00000000000000PNG  IHDRff,LtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp IDATx]}'dd2 ŒHIIX,#%X"J(Ţt(-RiT*Jb*Ei4L& 2!Lļ9~>9>@}0@30@30@30@30@30 @  @  @  @  @  a f a f a f a f a f a0f3a0f3a0f3a0f3a0f3a0f @  @  @  @  @  @Y a f a f a f a f a f a0f3a0f3a0f3a0f3a0f3a0@30@30@30@30@30@3a f a f a f a f a f a ̬a0f3a0f3a01~Wh}3f @¬qqIqi/(tovj3f0[uyS_)çyڅ3fVBgCW屧Dٚ%t Evk VD=dz f ]憗hH[S @ͷ%ȾSc6P}a3fcAt;("~ 4a3f5Swg弈;9o0V0qWxe΢,AV?ylSO?O;bkxs03`HڂDY*kf@3~#e^W{ r*j~Tf\gXr(<{70a6>u;ly'alQ|ؒj_s70a6kKmg|Z}O=#i{YOk `_}+q1{*=޲-}e+V/AฎNm[JݝƲ @+χ\owh~. 82s#deprfnK&ʎ>ȩLlTԝ4pb^S4G̀Q6e| oEP [ijKӾvq s45M!̀T&p&7V3V?m1ef[hO7@J沾/A`G^r[gfʾ;[f.%a8 z*~a*~:b)y&f ST&7@'ezjpW 2S[wȜf P#f@&ʪ;?uw Xp;&\ab;*y<5sqlFQKXp16gUQ;84(k}3f'֩ԈkK-,f y>uwF~&}7@.jeGUV?)k`9>Q3f <;՗la ·@ ff @!̄ @ 3a&̠Zr3 -0- ̀J^1?bג!5\\ygש@~c?"OrS} ,#߳>aG^q08R1aX i-M~f0j|#f0:KE#][0pficG@cN Z?^iX&~,8Bրqd~e=t_3`ELQueyhnl}pUsf[z,(~_̻uSj#P/)1i,f R7Jm<1K0W34>zp*0Q>w8 ŒBl ̀ Z}& }&eżk[} F+ u7\' ),GK:#P- 3f@x>w>k3Tt|0o:1 y"NgHiY*뷏Ұ1=1 z7814`Qc_C- Aw5oKSoWݤ/02M X\ǽ:׍ӐCLp!2/ZwM!Rym3A_}+1 [}~ʄWy9ky_Mii#qZ5ѹG`bgo =8}Rˎ6ϖ{(OM!Ryxzݷ"\a:ST]=5gNiY[N?b]=#fXOrp #v?ki|8E:T O)+2vߊpeGBLq4T_\7Mܬ]1a?ɦ8}E2ǧSeo:1q4Y|Xv\Fc/+X,˻>:0/Aʏw]1Ŋ9MfSwmRw-_wOOx! @-߶<%MЧ5OQy[mkg_e) quaT&Sl05OϝJ]<6^DYiDY<)GY*}T`d_}+GR ;PiGq 7ë;:!Ͽ|]fk@0[y0t,k즿9.?elO;|ژ4WS=c @7uBfy P1B<_` " GG۳G0-GLnwޔok('1<9_b t\g38zzSϥ?i%bfe Z iG0alq@OnQ"-b->;K[]GeXg@0]%֍`ռSb-?^=YiИ5GTSX? @M_HjV?1;U{v[wT'S ~TFS`70aֶ%nKxS+"~?Ʈ#f ̀I1٭yܒGCzCi@0xSAik~dO?Y\-Xħ)ʘ<d <4עŵcJݕ'鏳oalI)%zJiʃc avE&ݑ1ymLBCy(˾rQ yl+Rqy"z cq@0cMKX[}] 86)Mݤ;n 3f Xnɯ[ ZY a fsW&]1E=uӜd+~6x)u?ξ7|>t~Y bU`} håV3 [pDžmK~_`u8bLbU` hZX@NeB|=+9b 3f30@30@30@30@30@3 @  @  @  @  @  a f a f a f a f a f a ̄0@30@30@30@30@30@  @  @  @  @  @ f a f a f a f a f a f3a0f3a0f3a0f3a0f3a0f3a& @  @  @  @  @  a f a f a f a f a f a0f3a0f3a0`| IENDB`images-actives-html5.git/src/share/themes/audioBrown/img/nuage.png000066400000000000000000005102351250410645000254430ustar00rootroot00000000000000PNG  IHDRD;VtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp G<IDATx eYZUWeUW> G(0n$Zͪ[@It넑<**[v 4GM9Fg]@ݺd>(wq(C;* ~:|"\sUi)w7| >ry Aɣ)fTQP1n9͍XBz|I2.zέ gR';\G1EnPc )V,RGPNQkY ~Ev:O<"yT vU#yY@*Q˨1;||7l8hG ! JfTv$:G8>=[ hƇHߑ*H <8e@{ U̎2@!T{77wQӋ~DREeLyz:8pT~C1̐y@2^` CM]kY1u5=s̿obK@Na3 z٭7 ɖ,.ZQuU-)?C"7Z tA~?an%:Z0T4ŀ[gV+FRg@ǡ@F ($@hcHZI|Dй9KFp+ˬϏ$zwa׺{:UOG5@\:sXφk _U^3/p<IGʩ;d>`ȡE|Ry$\xŏ{,J mCz 3":揶u2Z ;4 T璭[źԊH̢M@%n`pb?1M@r*P}O4B"̈1{h *Y ThJwBJЫ\EĎ xiP\pΘY&:>ÛjU,Rxp"=d $I2p` 33 ~-"P%UhxØuPK@#Hu^2_IM,n=k^2@q^~Ǽ4$BB> X"I G(눑m,E $Z:5肑<*r>"yPPCa)I$7j? ^u0 @!QFe*:VڹbuՉZ<($8;[b%60@8Dr$:D(@E}%fIGp|Ƽ{@1Y mL .rs Sdu"NT|ԅ 8s|51@KlHCF(ϨXM2_0N=N.@,:Aɣuߑtܭ)̡J$tK4J@y/T KCLTPlsdp1ydcdٝ4BEk @w{pN;e@)!hBU+Hj7{{TIU,%.ue=P_޵}4jS]$7)k2#aZv8Q>%%G#(Yt׼$ F 7AkfPp:%kY$.Zcj2{~T C#") YCub ={5VY#ywUW4A^HҲV0Rɤim ̦*[n2Lyd'꺠:~Tz,T1Đ>B F?w%T_:kp+O-?n$@Z4nf~.&") n=.?EDgfP0nx^y-Aa<'Qu.#h: m`3T7 0K*$1>S*gI)a,J REB*qK=*~Ƨw{ b꼟,EL4Jz+qt(+yO*h.o-x<)H0 hNU4$0Etᲂ9RN&1E(Hvx ,$K$ô)SGF;{et/f̢!iG2I0:-g }^SI1  ﶺEˆ8\I ¾iΐﲇdJ9WV"OO|CGw$ +D:J"Hk>+Uhk09z (İ*OaM]C"7Q'-х !#BH*Wy |suO6>y(8酬ŰTeAknP[sSeI$PRI$FC:: h/lO 1G{ ߹Q [#hE Hs+- 1D:% (s3ĎG3Ӊ%4 CQR{t(8h>@ !%N?a>DnP(Fs[ %0Eh D󫘡i:3NwU29"ɳw[.?=Fda`7z-ܻ@Kfo (i-ի٠#|^a風YLI_! k` /aT^񭛦?ذ) wggZLu5χF n)| >#CrWL(\;YG ͆dpz0MfPpTMQMC _\0*Dgq5>o4R #0C@GJM5n [rmSIӷZ*&ymsniRl:ϺQ EåNb*t5G6 Y$Ӵp J)qΣ~̑;T,h;HAw2p;s)j͟5_y@tu! x$KƂ zF:qd;a6Ln'N1h9]u ),}f?@ pU7mj;.OH0,`%\bؐDbnz g?\KޑMCzQKED½x^A7HAg?HZf6g'%1ώ||ZJdrHEH_wP@S׹`u H AzPHZ$f}hbw6_ Kg+΄d(eV"Ih#FEaVP@IU DNp (aPT8`TP۳-I DE#:s6yc/J)dHPKfD:mJ=հy2l lKѡyt^TK$l?3 AJPHC"Qg[1{,3B͚wۘU U.!  HcU+ x8əAHAC $HAs8!tR60ngRQѼWdH>y5ޒYBs?[HVn=ɞjvZ(>e^Ok.gH ",` w!ōgwQ(;^aGs滐$kw ciUZW2@H]|IIFw H͡b^)-uVL/X BWbvB7w12g7WeXXgg?P US,cXCr_9ڊUMUl?v#GdfHNw}ibI֍'ݰ)Fq $J[懒+$deVFU#@P`]f[AJ"1P(${@8|JΨ䐏~3 bs'ͫj`\=NsW9hx4JkrI2EϚ׍>jTqUwSim9Hͣ$ ݠ](;(JKrhB'y/TVX$ p1x< %$Tݭ ,+UG{=|t #;0}l P(=8h58 UkޑHC9s*9 ЁP *$3(jB0@:PncX9l>^>$Kis(܇ hT' H %Gd=U$G*{H@N%T] _C6 n]7iWu hh%%eTwuحD^c 0hzgGxEw)Ww03OWWnΣ y@G@ u#]5$p}߻IqKȆG69B)L3l4h5}a$lhz4dB ?(J W@hU?m^l8 9@Kv#dK7a sdS4oFrZFG@RDAVUH[OyBu&ٺ%y*_ Wz|2lKh/;Uq"]mmAI5P094J4+Pus z wNG@1  ͚#y@|-^v1 +(*٬gK A>0QLJqzh N PR]w )1DXHI);rv#Y{K:i @j~%e'zцo.$$ɔC({ C|:US$:2%Dġ@ݔ8 @2[2 ly7D`h=Jkm SĂ-G 0$Hɡ@y'"*N<2W~fj$`ЁXPGY#+y$' Tpt#wŪI֡*u=.nh™C7$`tBq86 yG7QPЋ$lX%ṱ3{pL8YTI;Iih I߷Z(i(sU;WYH9S탚})hnp3$19(ZC%8JBl2H:GU}|#֠H3U(z85bu+G篒o$ ):!~JFn2?" "C HAL:.ȳ%&E@@%|E yn 9e:sT֠@j#Iq&|E9tO憨\Y=V6Hq ,ҏxʼ ɣ$#0El~TG1EPЁ9H@U҇)Aݗ*# yE#I-?i~1ɣ죂_In[F $d~#-@W!w<ꖹ.6T%$֝ kl@rȏKl HR䑺u}k滏(@h?٭OUYA 滑e m )ivqS(ub, T)~̑yDeH Ht0M/\#Te~ͼl!); 2_9͡sEIs@ xCD $ 3 .11`>J -j }';p]fQ^Er~z;8@ $H3[UDf$!i+2HWGh_ɞF³ $kS|SN4hS@Ƒr9rcF,<hBCSIDf~9jӍ@x:\HTځYFsaXPL,$Tu{ ĀG*A3~݄=':}-{[(8h*:R% ]%2.&>?f4w9TIH5G™rs$:KFtvvXFpȗ,Pe0R`!딃/{-ܷ:hFYHZpԚM%h4Սt|P@@((N%L4<)-R*P?:+)fPv(tP -d$U[F,Pyɺy%x ? sJPUiF9i.@hB4GsHNݬ71E" |-L #u ~,@>ό3dЪHg6ܭ)h9NB$-F1$({2@H>G GfԅtS$rFҥ7 ӆ1C().mLCɣcn=ex{X+uj@pHu(@u18Q8QFR*S2m vh%UqHyT$]3YI EΨ!_FdNT!. I@B'T/YY61IbI=.2\dBՇ<M.S*/ }DI ;>R) c>$.JΕmbXJfS4 @7*5#DDSN}JF8RI3,Pq™.VU3k>.`h94jo/Ȓo3|D^Ou_i$ $bP ֪['Ѱy*G3s45!HT=3vdpFRa .Qq 䄬!·0FEɢ; #HBH|&R+.]  U$kQW1"NdK@S(5Ԋ:/ʁ ~* d $>_Y( )h+Wh]ts!P7ܚ MlcE][n<"(e-cvDF(}0-`@/C'ӎ.:K.<(& gĵ:V1ElGtPJ A㸑wH9uZɣq;z5(r"u]7/A s L}> sLsI*h>C_й8Jb g|:fhB jEaDEch=6ev]WY|P_LAUCR_ZFJ--%TQ{͘Kpv3i0GèW $UM%v 5z~52|&x.fc H1{:,ΌH" c@t9.ߴ }$#B7Oɗ aѾJu#q$U;]F%9!Cz3A EC=l⚥k P:lBz;8mE'EWffPZnj‚8Pv3ԍ$)0(L9^V̫;Ql hJd@jك5qΣ[ et;3὇DQɭKc;H!TA(u;8s:YRyRŭf#) wϪyiqL^s@;aX1"D8$4񡤑HnB΃g0.w$|fHPQBU+I^ .U:.SHۂ/}@N06H8t.PlhQ?"= CCR ҃;:a~dJgÙNw#@!K:Zԍך*t9aEoPIIu\Y)˪ч1GCDêbѾa$'m+KtǻOi  `xV6Q̕ 8p^n$](%Y b!.Q]07Vs47Ǝb#fTrhO5 D]CZ ҁplF%n?2@'&Qa`%[S {խB7N4+u%h( $HBў4gHe瑒ɛn]6G;EWk++F@6(yn3\:_[ Nv  3P mT(CG||,vo7*1@6cfQEGO&!gNTf59$8RȍgP7x bvB*~{.̲3Ƽ#B hQvT,"6֋B9EF{M:W#)qJQtQ@a"V/->0zҼ7ɣl֫ncHdE Ns*T/Ɂ!L*$_' u#bzp*IP@_]HF7M iz/}q| A H) 8r|ab2~U+y@cJ":T7m>t5 p𡈬wTC(#k!XP$ulƳWJi7ăԝ) B+PJSqC 7@$SP`k$ ] 4#r,5IɤSa)iA(]h1oC$1'UK~D\}#SD3ٯAE_ /` h!IyƘoE17 ЁFAKn}0bT*o"1ALQ3 ڪdHlB$<bC`%>V}\u$:Ux%G9$hE4^VpFԡ((pvͼ#QGQ\ocQw] ~5 !wB(}'@&ͫbyyټ6& ZF W`Nzg!r4oP@*b0G(}˖lRGIR|BRT½PI$ 5U,] *8YR>hT)xռ>>@/7s$QWbK(hatSs!Vl!z3Ć 'Qf%1R!ʵp\ź|Axb>d^ _5HUi7HIrg");8`QPD}MQ@mf(Oa3;;JaL) w@b^p%m%cxPuUo&=QY@`Spn3TX}&: A̺Y=m$NT>1@1!id386l.g Uek.LuoMb Am5b4xPpX $fAR]6/ {-,RQ P=@QVZFzՐH# 1Q,RS=k${@)dⳏpQI1d~@PQˬ[oCҌ (hHBI^0_ G4FTh7j4 S:%QJ] @^ `8>F'$MG|-Rf(/ł[Fg-Kw$Y792|kEsG*Gwww_,n=յyͭ7~ߨTd ^%00DD@uU {%?T)Q7گR#A"t0]@}w3Ăhu qГ~692i^3?)@LNNoڭsKKKtttXoo XwwwuuvvVFORQr;ܺÿdXArȹ}ͭn=g~{Z:&q|%Y~6䅹(ILPLj.Uʬl3)j/9Hp*QaĈΚְ[=JQN)on@ 舒Z1lرcf?Y\VKp5qD¨>OO&mCD惓SB#9yʐkUнlދ$gDԂ:\?oY./94 =c,{yw3ST7=A&iE\̌:R|l}}666Kˍuttlwuu[{?9F *Dr'ܦ w2e%?722yGRyޭqEn$ǡ0K*Pw{T[2.ڒ{ T}(t40ZH ZGcA6/ʻTw)cZ+w.//jF]JzWoG"7XↀGNrGGg;|uuݷ\w]-b;?'&3ǥcCPbo|7*a6a|Lt\7 jAvL3irx_ ; hRhѐHJ}WWWq `5xZVa;;;R? 1>>o///KmjjU2u ӭ_tF q5GBܒUP $OO<t CzW61G] I 印O}M0EMg 2FE@Gj,W X@Ø#S~}IW2ځ|񁁁vvv>qfoo^C{=w+}t?vuuͻ5o[x|ٙ~ڵkX>%vvvk{{۶lsswl299NB0ĩ:22]?Rh#GT%2ڧɭ≀Sz1GjpQ%r*EtÑHSSgw3ֳFAx=P $݇[vwwl u~˟jɓ_򋫫Th||%sLr{P.o```ѣkvvNJP@H?hI)y$̌ngFCRSF:(UIA@͔Qud Uֽ߼4Ԏ Y ܗZK{{{VںW244T-*Gj~~ڑ$:uS]]]_?$bt H eq6ǿ<ܭfT@ZUu]TPzХG 2>:.V'۞s\Pe {<yi AgMe >r˘$>[yoĐ$jIե@﹬ut_wƍk7a\f399YujyknݺU:uﹿgw#- 7778ژϞ= w|[?ēINڥP xIVt$BVnI^.uLQEtAE]/|Gf|)y$ٺȂ TDq|hs$4b2_xPc5ԅ.4nժKzzv~ĭ}~5ݗܿzvE PI1G>z~A)>lʚGF?>#<$}vQ;fN96/a3¹Ot)Fe{J0覻DU}!W /Md$n:$ҏnuM#yɠϹ+:Yu3gTOK(󍍍U|O~Wgggݻ[o^pa_gg'N8QgfyyYcCjz1AP0_U?7mj -@PϪHU1mY_hl?SfL%^?%vSTD7Vm~kb3Ca3mHjS@܅oSđ~^pKm/oB[!I);w\U-MIGjT҅7o^<ySɣjH'Of6&-̗̑C-.߻sFKW$a<BSSN8(l$A9%r" -]TH~u15kruo=>BBݨ83ҏGzíJRARfttDJ~IrNI7ns#,˧|,m}cᢕz݋}Pɣ,nMmn}Z+DDJ *=NﮅK>ԇ+'1C # Y @"TG0C g7 SqkJjѴJ;SXo>C|[ӧHEfll*wov)^moo1^ x~RƷzҰo䁏O0/O&=e~&j{Q@$n=HK-׎$|5 IՂ@` x4*\D caԱ.eL yGYyr$F='*[d J(}TDgg|i\"kΝ{~cckNuR0}uۭ7C\˗>:S}_Gb+R+[GSA^ĨDh(|J$!5i S@i(uĊ@RE)bfp?HVFd⬿a8q՘}ɢFB__ɣX]DvEAM ;;;<<<|~wwfgg%u˩9oܿ秖ӘAH ۷o? 8 |t*0|=8':i苷T%3TA {suǃվ"=hzdcF@+EsŲE_e 9y$ɣX[[~rwRQz64KjX^KxՙQwhmooWOn}ѡ?q'-[rH//vueF>H A ]rrmN$i*a,8$e'3fƂ$U_5YDQupnpm B]Β~=k̆˂O(û 4׭%N8_jDU՝;wp5a400tLɤRT]՟+J ޻ݟ2HD.^xb>Ŭ$fHNM zڃ<(@UJڇW'G1G)+7"hzOf?7I`Yt&~ (6@J7JM* Zn}wÑ#Gun|ZygVVV!T0Y픐Ҋjw~kRxKwXyt8`p/xfEARm@rKfTByOjP.kTA[n=cQXNBUyM_w#ERO/h-DJΚh? ɳ{ GFFr{JA~O%>\M$I2OInQ󝙐2<:>Uo;Ԡݑ}P=ə/v__t)tF龯yӆ {7۝K?}7_ȫlZ^ihJ&OF!i HDlO`x]HwSS2@IEM#<% \ B6h%ɭ?Wwvy].W:߳d[-IWIzoo_.JƓ.8. :.F*=}Z[[;ֿ~=9}Zuwt\sܷZ/aeHu!j~*UE0!w1 w ѩb~hzZTLD"+N!g{'@+Z sZ5ɢ(%SssW~fkk0RCwp:KVEH%cxp/νa ڜZJō;H-wH~Q'򘙯2X%/LBt}ӌ*%T^tͨ6o` $fVBHO'x$:S4@J?ʨ)JqQA%Ldݥ?y)H !+ ' B]%+`PTM\y,}xj7ڏ9R kmP*q+vwwpm_q_?c;>WXRsܹΰG<8p.ÇI{wuwwk 9O'$u+祛7oXJhPRQ`* t%"<بp[[[&=u wxs<B qoQY] Չ=kJ^Rv˰:9/[1`;= QGms>oUMt@wp}:)ytBQnOK@ovttQŨ,rVZ{[5>hm%K{ljC^FGGoV驾i{/Y:f,2Qm׊zm6zyf Rt~xeVG>nF2<<\H捻)655UM"-,,+gܗϸ%CirD$]%t ]2ʡ5h$ׄm )Z|m#(:M&P*l wRAX{»NSWbJ!% OYEӊ%*(e"%TXߦ%6Hj44|(J˴h6'eUP&(Aou_qIwvD. yH;b~7nTˉx:4M$>߿>rWŒ3>aՑtuު+䪑4Q0p|p(nlUe:#TBt`Lp(s A'wAzY w p_U*92XxJ;ݠ"k-DkXA(5@1$zK7ww~˴ҪK|LRm-\藃7fxrzzzv:i1( $!~zuSx%f|vjݻwy}ϲ@Dt=TH蛷_)YJBhMAU FʮT> : fw3gf&OSƬFj:HBc#EttwwoT*{Y"%9TbJ>)΍_YD1aCiHTɡv_2-޳G̝Ijpxʰ{}ۄޞU| ƪ9xXr%HɣʉF$j̇3G/qv1BM?i<\"LSD8ה? IT].)iLQJ {fW9$.TߣiBAjI-`Bw4l֥5m$w@T*^,TLѣ,*HW"I $Ų8"ñclvvV]nv8$-Uj)U Tr9+}UK{ݚQRԥ7A~0yUKH..8џG ꆺuV>= _~Wl)s@{u߉ Dw^a2l0rx'сGt#WlX cNK"un.L o[T=شKzQLZXjatt/#%EȴYm2yN˴։o%n2Oyi UFѴI[5 xzz:QzyK EuG}Ϝ9SmOL[h?П3|H6/cKPPo6ݻ,B;=c^^}+_5'Iv%,0)Idq&=yH}Mu$&&''bmmE#"oTG1ߝeǠ %׿Ͻ?l!afK1z[%U@sr4zV6x[@ԭ hG:IUI]WLةS3oH UᬪxC"=[ gs )p0OXB Xh@J'F;mL[\jb"ӖZ 4 Df5qsVTDuI}')6661D⥹@ U݈II EE>ds)aޭowCsyhe~ T j9f: V̽<$$;{9HÅUcrQ滑Ct38hrH =9 \FG"o 3gK.Z]ZZXjFb}ݻqUh7*bcǎ*!m|G3ERwϹg'Մ_֧'regϞmyV2sssV*yIj&3NyYVuNbHu^ _`{Zҙpc1w[4vyE)@dnq@J^YY&51䍉 !T:ܻI,:Sg @]8λIIrUoXXІ{%HWYFX4OYcusEpYĉf"s_`{QJȨ*!y1F1$G ~~_12<9H<c M GYR#*d\M+JJNz fPusՑkɃ[]1hk\\YYA,b3ϟ~:#041/_:DwӇNKj`hR`w$ H AcO I>zԉEUJ&r߭Y(KOVA$iXeo677jŗ*i^CK4h(!ͣnC%nbPWl-<I:.(fhs!W7sl,ݝu4kHGB|`yyY{VK CNWq򍍍";1y%{­!'F>$~ͫ8| HNR[]]&$ XԞl5Ў|eckќ>4/E隇)j;̣|hejt:Pl 3ԍoAC%<;B\.kkkՙND^$ Ix_)KP%saS!;mbb"jQ!GgԑSBWMMMUzv``n (,w:hJxʭ I;hI\5$*kAq qH ENFX ~|>c!19Rd"Up'e233ӱ*o_(u!A |vvkTommmLv)( 3uQ*$G/U]WL[mDAp9zխF-gy)' &@ǬjULQ{.u!iWG)-rϔ|$]# $]p DrӅq$YFJbcggKJҽ-mـIݗ:,c_H^(~VkgZDN@R'RZ9@D ɱ1/l9|(#8:o~6q rB qZ!wJ#sn3Mټt4zU,4mi1\6/Yn &8Y__j}j rK mooE o e u0K?coo/oCcJmmm}hrBZP`Brvo6&i9զ64HjI ( ȼI٩G)R;7CW0C}ɦΘtޱz˭LI7Jⴋ!:HJIB&W.E?+ѡqjƍӜ[sDrY{־ @>cIxl&G`ZP|dSnSG|Esfh OzQ jgIoHAG'RyQ\@$FT:ie2s7uoYĉU]՛7o4ѪLоk@ П5D3_QLu")K-(Έhz3GbJG`uQ=<2U>9RG$-!ir %vvvJEKֻfs]H~O wD%*ݳwرc3 ()ϙCҮM^tK;QGdskt}Jrl*@~?yYJTtΖ<%1pЂK.nG[^^JWu:>>KI iT9)րeS4TVv1I[PoS\2jA-?]HJ 8}T;l>FAn%$*y¼lI!e7+EHaHdp;֗Ek6:wBWWW[[\.#oGpIڎtt(ϺuaP%C 8:f/Hdny¨il\i#*:IQddUÜry=*9A춷 WHBb]]]O` yh>RUqϸ9%t-2Kdfh>[2CGfrt IMAus+JR)qZ$Ŋvu)k!b${NNNm3٭+niȚ`֟՚٢Cp^5BN(xҼ||ErjOBW^k8*p/bdA=gSjtK:ӯOȲC۞rL@]G͢z jx=r`XQذUu`0%>̼@lKJ<$R#h&@ûhW,ͰH Q}ed1՚2)2|kUs)hLJ2_89 twwK* uٴkRiԾV_tsst\=$&$711Ì'< (Q 4<Λ E)d|˼ 痄 GAAͰ\{7J5(KuZ}l_AF{ȴy9aCU<}dJ^P8RDݑ#GKӘrpa\$,g ]PGn#F7?( >Gw(J"d |B $SJΌQǭOCzQYGq9 Mܼy422@2(YRggX%Yg姣%ݖ7R8󶲲r/q9OSSS'0m6 X*ku#ubU&-"vsc9ޟޏ&k}ӛZ}fF3ofzr$ה;CC%6Kc\8;cxc!]5T ~73M.Zjs}WhI->_[ݒfQ]aiٞ 89 gNSZ\L{dGd >bzzzossaf07!mZJpX#9 'fG6ZXXj꿬d||Xp2) 1uf[wQBu9{\Y>)S<[Y+0q*}+0iܗL38f333+}}}skkkDisāaJ`rQBR=";;p)܁U:r GfS@x;md]^reRF Eq4ߓL-dq$\рeHAÛS{xˁ15q{R'n*b7p.LP:DY!9j6, ~cwr>`fv820_`'#TڼUa _7;;FRIFIHXX_QD_;ga*CHE͔jG^\\<Of8@1aNGh@  qP(/Jr79#4 *[C2UA!W»KƁL&hZ5'G`ddDif8r@dq#Z*UQG p2 dF$:}784o| @q@ E>NG(43Ba1qRh*z3B}000볳h :duLޥM2 yUWc#s.;lzYI5NKKKB#`' ⣸YHz k '#B'yAf29m(y&YrȻfFyDbOPIR_(g󳰰p𾫫kghhc9 nލyg0xUlnПL&;2QΣ/J֍eA xS@#U9-[^Wa 4j" xE)kj:NBAr* tַD"p,4hٷ ߯t'leoύ]|tt8h3}N#T@c:֔Kh>vB {ӺCy8p/|S@! L;cU܈+#mq uQHpsS\lB(dIJQ40wg,3/ߠ\,3+ tx(@@,P( Zov^aBQŦ\D"!cccyOTWɪ(iic"M%_뤾G{c lD")̊h%'kf#b׾{"?.=}ac; ˒X F٫mBPu}DB{9o[֝>>;;[cccs]]]Ԩ 3%nvѫ*!mX@Jӟ0@Bju:eBN:_ᔴL&@ZV[g[#DQA:LV5r9ewLXA* igʽ~ ϣ))!ĥP(V>gG>'V&Э}:`A˔y`@t/P $$ d*E[>/4Jɓ'׮]}sGB0x:#bB@:1}N_`=ntlkk+|=LmG?HlsL@qL!nOԾEeR G00!L9U .m HG_iUs3jx%,:3>`!!P(??᳢SqqFpMTJeUZpG92z߯_tuvv }dQawwWPZ(p :g !ōGh zi3*:x 4HX$,a?a6, &G@[k~BqjSs*Za%Qr`A~Gv9!Q $ 7?{Lzzz-& B-UΈ}UFaK SïS^V".V%ohtt4I񮮮FQN!͕3E U0)(A;ž''d!Ix*q`¾h!H ^18m dN\OH) |>ۏEKd=dFvvvdqqQ&&&Ϝo}>[e_H5O^O[rhGDX.$b Hz]6pJdHbx?^$_[|/+H>mNAYHq5-AoK_:Vtӑ|65=@{ :!P(?=q3cIgggz@2_y_ "%^QqPw:N#sCeP'7d]= yۡH$ZMVV_yduH#Fi $Pp@xSjšBJ,1'$ܔUcrJ]oS,9dC:BG8pآt)#]a2څ<"$ J{rm%P\ Z=sohh;1bّT*Bsߪ,oi3lem`,Dʔ3^ukVxA1[eX:Jy%>Ҫ j%?ӻϞ=7n`c8HpGDBB̘ Q gR8Df%T9~q ()T) (nP<:Gi 8%q6pMIl KbHg3X>󛛛!LR8V : )ߠʇoЦ(ҦIg|J.0ô_8\:UgOysð4uxP2ps쏍}?G_$8_2b ~.!T1Τ+*8{NҎ&P@q轧!|nBҁz>⹤gKP(S\mgOeguDȎ_?tk4BB;d![WWW0lPx guv4U==rA d%AF;x*?ʆx@ NkߝN433:l︮a'<`-!dG,,PGc24Qf] #u3|jHܠ> <B.s"84FvRMyDg?7A?Lo'R;Zط6%HHH^U#nY:ğ7HrA c'&Hex< ,zzzםHۂL$l9в[Dp*Kz6ńT(e]E6T'lt Mr:DdS|G)A{c B~g(]]]-Kcd`` ]wV#3zEߣ-F!{haaԃ#RD!8+W|g&)ÉSVzF:` ~SAH!\oUA#P iT8D_fkaB* KBidTly6 zIOf)E(ҌFEg|PHb`E?2}n) a2 IN#daԥ$DDT# &1($M(q9}r;;;@S!GDҾTIpwJ!PaM$*$"- 9i*qt]I.́ˈcSq?gͰGiѨ/e4R`IXr27Tt@;-?( nӯ6uêhRuҔ=/E# $ FB/]?XV`y =DB 8)Hy= _hÏHQ{剸 x5xH(WsK—AΖftz\4ߩ$4tH'FYlxRdTouumkBYr[Qe"蟛V,27XrGׇctCs1P+8 pLg?rzeeSHqt'dn'YjOcQq3atFQdž^,CHJOJaS xGzdJtz r:hkJ!}L壩]!)̠;JFu(>@R{m DF񴸁W !(k FuUc6bX@,LB0(tdҸ I|6U aEE~('g}}} ΝуǾ2 D?ߐ .u #=HlSѱ2xNF_Fw=lꮄ9&tT+Q|~aY PSL勂5gKc_uTQ˜BH@_r_V= ! _j*t:õZr]\. Y_xҟ$2t a6dN7qv 8g b:I8`gө|Ճl6۔߱ O8㟉uV"d%XB $84`eAQQt"C>!Sz | adhe=w1Ӽ.od#Ca%=L!NwƟwƗݭ;67722̬'Ac,pu4䄣>o ^?Q=ȼ Rlp ,~)6J挫R}:Q*z}}k{zzdhh‡5m)8㓗wj$D1n  30!Ѳ#Dz&tGd.RvAt[!Vz}|\/c$!:/zORݛNa"e !AJ_opI@$d!\.K"v.J -|z?k׮]:Q󙫝T*}y {3 p!ӨO;LFH'l*L& oH36Dboo?]__ 8Ny|Ak`C9g3Ho )IgI BBxg ʢPp !,W riKm=\'n@DIA0 mq %wGUnp$m0~IR(ewM "46D_i /yU8 8BRjEg-D܈׹wϥ#`0s/Rs*KP"^QN2;WjSsT*;^eH$&OgBa"|_266V$"ԝhqTyjèϱ.@Q't vtT*}??N#3I8NӧCߛ瘫g"@4!uGJ[ ҁ _5=a 3s*p =n pMKΨQ=S=]3 :*#MqmL(TuIB ->;.dVDjH [Tr~r~o;I>Q6 3m0ѭ< k:L!2gs`0*\|` xp͛9Q 5V2I%]݋5^| C7UA Ӌ3yHz]PS8N^Q!ۍK9Lp6GF*8mL;cFZh%&3V}o"Xq^HDܬJOOEjZwdJ)?'0Y:eip&+Oq@jcD#(aX^^C`||<ԩ-f %`[W8vTB p THz35Ω8n-7vLi!uĩ{G HgT/6+>Y .[I |e"Zv()###m덴.KKKu'!#9d27tK ):/ |\oTeL=ȥx' fTuU PBF"5$BZ "MiIc)&D%d"!e*pQūqd«f1,w0diHwr2ycI]]ͭG[[[zG2uww+W peՅM_t 5({A.c*P_?DRS1^pXN:DvҬEFL"$ػd#aA؄SD C0#ږ5ó5baF~ڦ&Qɓ'=TD'͖3LGWWd0#6YH?"#^0(Ih, 󛜂ς>Qz3 h|%9þ ^6%0 Fzh+_uF!oQx:\eanSEaI༺6L@COB 8J~z꣨o $ھ߁@H8,)04MHՅCe0~B/"yUw5z#N`A\AFzfI=٠ eU 1zˎU>:|Nh 8PecVoB!! ϧTT2ֈ[IC+!UH) C]]]ߚNe D5ؓA~[\,8Ij!JUUa^:,UK;j@IQNKI0?="wrZ $ .ؘ7CUپ8Ɓd]zװY>:Oг .}~yUc[|TKsA՟I A~ 3~"׮] bTz1 t˪`t8O0ofuysZՊW 윴h G2kbw4)1bp3/+y` av 9cIXRBځ,]0SaDb46S(eV=p{{YHa`4E/mUaDO8\ڣCȹ1 @)AA?cq#)qPD恄8aҁ `B>g>=Jų_J%YYY#@"ᾸSF  z -T6'$*9'%!К?p6M!g8p'nnNGDA^{1/6Ͻc\aG9n>[`#+xd?T9 Ka&F8 FDMus=Q\)|*+W|ӧO٬twSWP8 ԛ@#"@vUivY+|oE"^qn.P6`9-Rvp޽L ,n|H8F 93NE8n SZ "EQ6񱾲!4NR<o٭2!'!T~&ZP(|>(?\__pB"7nHGGe;qd0%=v\raQyH\'&#P_, ~oJYP_ѳf0bP ;# #8XZLf4 Biʯit`~aVB 7!TXV]vֲDGHm,;/2#?TJ_.Lfe{.WSRU)Zz {׉DP0,}s'PPUCԀÀYپsGtkR=78Lk8c;'²݄r}{ z({d@ÈTs=lk:$=uGߟo3ҁ@| ...Y:IHXϕd0"+ *b5af\p"MERGY;|k1)NE}Abwd!,WR.cu ,Ipp +}Wb!0 ]'Zu1i/jUĺײx/k6q^_jmp"]vͶrv3_"kF c6ľ B.HU_I0gK@`) j HxA1|UmOIQxq[hl9U=-XwKV~Y8B),R5ul9]x@0=m7iT{GdoR:C#$_s^~}uu~dR\"]]]6?_ "L)I7]" 3NG `,n s*u|@>v8Z<0~\W Yd1d| |P?D Ea!ʠz/kYI+!u" M}_ү%*Mt FH ϣIꭅD"!۠s|Xd&Wy'cЎ[H?bpD +@l0 9MM9_2W$kRkB#_& ![?qƹ) r|-gʴ eN!r .}̟ͪ:9׳hCm;>Gn`:EH C'2;;+;;;~+uRGrNzⶦʳDqA+煎fPl8'^{x}BjI}7}N䞎+ÐnT* >Yڤ)(g k@/-B.{Qϙ娘E@( EO; 跅JRvBϭ7 ^y5@$$p|]1cbz6c"kg{ZP]a2!$wKFe/ad*Z!5^ h]_Υ8e@jv cw8www'dkkKj= N08`Xg4^'і@ g1z,IRM 9(wsS0(!2nGvuNE8RY >KwǝρDŽNޑq p3u@v3a!$$_ѯ8=qew믾z髾/1HM@2yV>I‘T,I;~?_oҦJ.58FKWI붦 L;CNHԕ8:*(k6 DBSUNDžt^N(4/-{9ݫcQ#h%f !2nuXX]y/2'&ЯOׯ>8`36g{t V9y^yYX# %뎤t:РO;тCl$8}`!$~gp(^YG/[pn"yB?!`pBq@ƁHYNE=SGh(} #0F3 h N@%=J}N?v(U8. ke7% `2T=fہ xb[ߛ}G:C;H~<,3\.Nuvv583>Tŭ$Bր^Ia?ryLHơ˥?cd"0FJ#^@@rQlnG'9gǻMTb{r{x;ge̎ea^CZ`:BHXI^rtt m`K|Y>F&˨LnQ<.D#/n (Wɉ Sq րFO#2> #y@`"eƊ^8$>)t"zׅ̍=^oHʮ7ʰQ!rfF9̜8:o l)[&T1x:TfFyԩ^TEzdqN@@"6{0i@RV/X6'4eHZDpXh%OFxYixI8F,K8v?Qű[3RY egcY->%0'4yahbSBH4-k\@pmg[?rר?f\1k!bER'ا-Kp%9`ԹQn(hΖ|uBH+pSKeN،-lEѦ|ea9$BA%zp->R(I  <^Q5c ;jeD$i7ptX}G\ug^Ie{ nyT`` d8ur%QM K_2rh\:̺D7w)2#%{cA H0{SO;جGPE9S͖kZH\xlOUQ`\Ҁ$"PsZ"$ Τ5Ӊp4"='9߂3^}8s֛N=ǢQ?CޒLVz7eK:yS !Aqk3:1G% J<5=zC 45Iũ"6AJN ]o3yaf)QRgYgrֺܹAپfr}6u٨+eQŒ4!`I:J9 |B ~_4mc{H;c b푞 A* .ouNmLpH=O%z?,o AjZ@ N!I2?8L h'V{7UƮeUVedC HoPd*X ٨ U.r3_5p:4B BdƱOsH}=Ihlէ !  l9WӶrXQ2+,Y@"J ;U /īƊQ 쀡yE/A普)qcBcg3Թ cCw+os); Wu="i+ YⲮN2? ȼܽBΒ0FY{UצÈJE4½3iR!WFVa\SXp@ԱkQ_$X$[Bl5MHt qY)ew~0z7X319zI}9}^n0n! @9wk8MPRC 7U2YE>@ m2C`טCi"X(Bd E=3 -"  eY϶\LxNZ1;"rV%Ŀ!*/x{pJm(F,^"mi$!J08}_Ȩ(i" zXWUR8,Y?\+K0wu)vG![|^j?b_S.ON +^7h3gODlzBTPy[uZ_.È'/~g ~Ƭ]r jk:D#D9L2ד#ǨBFQ_K0%j t3 ?%n'b#5Y&nH,PGJG@ ,bUTz!wqeUV&GXq*Rt'wus(9rD'}AUbax/]伂xQ0 RQ onЧNI9E.gMI;(0n[ ['ړց m 1G#,R=\y2ע,YG2{+Ɏ;{ۨgٗc6\X%D,0FWh=L"G H#( Iqe8=kт߫w덴&vf xMo|p [6WX#aa`m΄P^C:d0D:LߥIHd3GжI&AhC]9U-!>E  Eu!ΤI4NFwS џRS.CzנO0|類94F B~mK냄6~Qi:Lxw//!n-LB)K3Z{5y/L^R4x/B!vb&R p*=RA 2KXru}HFs†10\_uMaf(\a_es4i:@YcaSese%EL>:[UYgOF"9F#!Qz~Ezu~F< *`Ge8Zןl}N   \J1'я7 d `Yor& ZS{J.K(0.ZuM{#Vasx́U]) zXc>Xgҵ/= T6xX&N}*tW.# "#vPS|W386UVy?@!$pY#UC ϡ$WJ* alNz c5U.y\(c<{~W,^x0x?;ǟ5Yʽ08L:ⲣk7 Y O( eN!$&T>vJb U}Q]yUT/}IL9:72 p)}ev9P BRAcg`ID_a<N.q0L1D70bພ[g}-N={͐k$5}qWea.~9DφУ,ү]DlXWfG^%aRňBނ$&īKfI`"vM?SF;]_B Lϋtf#](Ts>{gd0{M! >MCJƜ#[;]vsMp`$\% !I ta0"5E*OYcﰥ 8t B. "$0.xt3AA(/{U0f/peҷCDCA\c,ѯ[f?/Βz\^FČm-}$+İ.w$`my~GQ螰d!a'2:(׈NvDW Ρ-}_t*FK*H"]Du H0%][黩LY$N )w8cb! gSe#]rAi!X<`>MqvdyȄ}WBBGJFSξ_ޟV v-S{SקO ,t BMU<#TY/MI0I`/{Ey*Bg "Q0lF( zxx\9g2gm4'|]7y!'Ҧ9? s /=CQp ]}N!2*'TV%T.Su+>m$6ЁD ^%*2IL-dD*]SEq_; mpFԮ lN2'il)U=_^[FZ~N[Ke:*ʶѡӮ{540yČ`36A!ࠞ<Iܩ챣 i(2=-t BZN}Kd P%gҥCt gxL iCܒvcBe5z3ڸE? Q3[b_=Cڱ3zwˊ.pG oO,tLY:},]^a9U`OmA3Svbt B .ǾyE&#Y4F&= B"K%gAI|8YrC}2%[6)e; wY}Ο1m5Sƚzz_ EOZT~ 4BZ'ߙt&[彬|&bdÔCY:!abQ03^P"+: K*քM,Cq8Kq1`0ޠ rQ'!)JC:5^Sߟ @?0Fdj^m=cZ hW >l aO!':rZ1П3ӈȱ*G 㵨\SF ńPϘeҊUFfЯ);@H:B#"q'Ҟ1 S7kraAg~>-mԻUnUUZ+˝u(l@NHH]ѧXVN ╢UoէWTOU`Q]> DN=+d'mLG2D6҈9E:=h(fboi7Z?3S6RFZ@m -``6>+B.}f,##@ɉu gTO76y0˕*tUPLTxΩ@'^;:Ii 7L$?Ǥ3r)Jǒ>S8&\t1B c]{xPvSEHk}BCċ45͑s*uB@Y!O*x.:yF,RzSu*i^=vI;q>P _gx[dVapH}}!ѳNw`w+Ί%LjBVr)#5`Lk# !؄1>֯aCS9]aIF`\RP -. +z>UT-]8FWN~PFq̉,NAxW!\p ޛ !6IX A]}$nT-q J|ow!U !<_*gR ij/9FØ ЯcG񚁚%N.nV". '(,zFɑ:>ցmeSL ;ڒ{?Hqؙv& pGI~GB.qT6s[ RG$1kEYS12x@!As>_(=SrD/ш: l謪 7"zA%svM-UU@׶)ʬ=-y|;a\l⿇9E>aq qH`\@vؙvO\`pPrZQf-ai"_èC #+c*?"71U90b#!A!4O R*di}){8iMUނfS%cc #:è4 lXFҧ#N0& YH*na'%RFۍYlGƋB\= iF{Tջ/g6F$nkM]y:4"KBHQM?ac@(*YNQ9Uq@&^ausY`ICBp'^i'WC;Rv}SS{ؒϝ ߤ-]Ԅs亮Ml>p!S,$.vF_{.UCLGbqYr]:*#ЁD!>%ќ*&p(!I)}B@§b]:u4[[E mL`D8>&uߒƀhB_}F•I9>XbܛmK)!0f= GFHtC6LUyC<m[$.)I^ג[+FKB'TF*OPő2q*#JUDċhW|vuBE1z=d#lFy>؂g&]8`o0S:c_DjČxe:Ug1(UUաL9k>j[0":!s(İ~m0C*=&B2N^/bnSP ==zY,I86q(,eGPZf^W[Yrq`u^ʥJd=]NZt'gFp|{zddP8LŁ]OM] WOB9#{12KK88x/a|aU~Xߓ+ d n=HuqKg[;Q`FX.\QN[bVBƔ7u#0"uՑU: !qPD!֒/*/wKOMh9(EW})q.I̕NDž(vFߖ\H|gh6x`X9 2zFf]+6$>]da=R$(*쉱ʳ B<DPW `Sf5$jR UVuw@9d=HοF683-A3G5v^1;ᱜؐ56t.pf5#-ɲE)ݧȴad#Y*nyQW}©"ؤ`B!' e*YVJlM{(p(g 1$Q, Xg>dS9tu}o|Ԍ( րɆDz6-llL|B(V< P(pзSupg:Tu~îS{nLU&+|W49e[Mw-ΟO߅AѠII )8azptaU2A\6 ΄%•D.2uSse'z}+50 ɔԠ1w3KJ k+ d5BͽN !i `%zE·>΍#A3?nn wcƷ&|n>pڝXp+ilzkJօ&A Y0„QXvnÝ'uMתp%{@o`tCA1%4^rSxӦ6%D %{np{ziaЀ&uڽ% 147fwOkƝ8Fq$nzԹjtWOj#F~Ow=*.( w Vn%Ӏ5wb™Ll9w37 _H7`p&X{g$MPbq/_;&(kŽ+É>S J:8vN[rmQ6vǭ)WLg{zTbb%4qEmHA v7\Gs7܍f7jֱV$iAp0CǎWMPfw|ҌoyX4f7Vz *뎣 Bܹl\4+V+`ʺVzZo_S&Hx8B}*%TFs})L %M});ow}ކ;~ L׸? kTҞI8}W7 2AA)T" &qB7sl>ޖyܣ=j4v ~5JM1~L $t:0ƯG^S&H8|ҏn%~GzJ5<2wĈ} 9.L{jŽEZitQ7$`o:p܅nzH }3Zpﭬ閅VQXj.dayu}ꈐ@DF9,s7`s4 ᦸ f'7Q&d"= V# 2 {k:|\$NƑ>KvOuIs|?8| 2RHCR=5K_Cg{kVp $P2I,y%+GE?DZ/J94Mnjjbz}Os%F>k UGJΏitEO%FϫDiDɣi  >*9JUMFϹ7 $0]\7)2PpF)UhֶJa\0WBI$mm@ƪl\lrt*JR|]jĽܫm' ܻG+naxe@ %]I^왇a<)EpVƹb Ha$҄-pn`5qQkc}qڰro4+ pzm^bX1lX|W8>百PHI3&}4#\UѼ҈+M'њs&CMN7(._7ݒw&043u(ѨĀK4憶XvU:'*.`9E4;\ڨ,!=<2w8^Ƹ]qNٝΛ~J MDO KqMưS=_s.=ׄ{$aCHQpERݜ [ Knz5kRɤH A5Ah&xj$kM<4q`s O*Ud%Cɺa@vgLPB6L)y0 ҄$+]wk>4,A$D7l鹱OХUI Q02@(gX:.T.\ЯJnܐJ<X Sٗz'MwU5/ܣs̼ M ȸAf]_'ܛZQXlX]c򠍇l&`}MR~m6@a7aHk]=_k{Rj;iZ%)Y~{y?,I5E$ Q7 E:'[?x6lwubA7+W")Nnn_h4^f?oԢ$K#;wӨ;lW 39tÁ\, A hv!:FxTzC>x״(HT]-c~mc3kNHZ~93+d/Ka:mYj3o=k mk6V߸2}6fp%;B/c'''BJ<%O8Klxl]m|QB`iVj5 Ъdw}e6P#}ڿHI&R1D&\_e!a Hl nhhjÝH7+4Pft:)VT^_._kJN*H*EW㍝|vVӵZmF%}~J>2Gxٟw^[ {1G@U?L&R()6DRVu{| H!SC+&8[lʿhez_ 4Ҕe[5NdBMLL||&zJ~Ad2YQI$ڳ״J&TJ=25OeُNMM1]K7M&q)>GH[w]f ˤΞ2E|s +pK ;RBFs 4!\]&f +1MFRi܊OMw/Nޜ}+a 0s=*GL0Sz鳱X$V/~:_lV:3mH$*Lf~Nl߳mo4EϞQK}K^4;guͿI*ef6}7 vfmo04 Oid~{ >-z/ku! R7GgqҠ9z}RbH%’“1cI@Ey͝K4 `;Z$?}I~ A%nV,5E=jA ;Jي %cLDzԝV"eP՞N&Y^ОKdɞT*sssq75=.pL1X{L0p|+ж;c"fUn~kM0QN}`N=UӦQ%P5T(,]6$R3&8z? ۲W E%_A͎B篭T*uɺVVVN5M|m<;b߿wuu odekU/L*sZm.?I#هgggBia 4l-(:sp3ʖhHΚ`?v5z V~6%.aз/$HavȌٻXtZu}=jrsm 1HvmLj.%vWWXTIXX$ZDDlJiYEN5?L&7zjVݕIZmZsNMMYvJ$GK&2}IMPQ5@%.F}z?u2ͱc]_H5a;s#F:%UR ;/h5HmkD $;2Oϋ%%vE!tb) & \v^^^W$sssﶟNu:VVV^n, JԏfR{G[ƅ4s&H(R'QA&H~ {Ll5@%neH:cx Z]7vg %붫wFzL|̵Q閛S?M{yAIae"`@/N/y^lGHbF-РPYQզ׵Skzz񗯬<>d2Y~QT:TVS|>么a4@LV V$ gN5AIF :?fc=!WcHtN) =~ʌ }T5AS!Eꢦ럅 #ТCGzȐ@ˆLzM"hRu[ִ#L" r&YjSFc\.JX,6l3BpYIRt666Fh%h Q)ܨ]د6~~=LD"qgJi&Xevv7Wl]ӝVt]Pr(ܿ(g= {ϯ~X=^uF N ٷ>R% V܍i858آ&f!fff<=d֔[]]=H$oll|sR~[}TRTm&XT1͘TF``,J3w :ܿQ"9EFpq[:On9peuGH!^v;T\<\4"q$s#;=QQ,veN!50riQS~}_Ѿgjm*Ad?dcFI ^h4_YY9ạ.ᴝ_kEJoBi ~:%ߒԪQx}LiO$_|vvv!3\ fӱ  ƽ.l½UV,>ڒY`~xgsq8Bɣ{䜄 TRh]gdQ= @cjjuZJeazz,,,x<~YOqXP.h(L&j9Z(OUՙJ`د7vp\u=@OVre%FN m_ӕfl^s*7Ǭ;:|WQ(xic&ATe4_0 hK+!3E:lHV.LyQp祌;~li%*<-H)J%~T*%xGM "J.;byJIm Rv{Ap]8@NE"QZɋZf]]]}աCl,N ,@f*Y1͠/2m 8d5N960J3&)υ+cZ;o:Z]]p׌;'e8o#|sp2Vʣ{d"3??KKK?Q(̡Cϸ+=XsY}w#ݻ:I{hHB1A-ʜNWpuuJٕJۏ/ߧh\cGI$%+4P7`Man0Rz.` ;,G nC>wq8τpEss}`TL\n0*ez`H cԩS?rܹd2Ü}MFL}ڟsu!BQ&5/Ǿǐ0`H cX,XZZ/NgؓG1^Q Go*OtgnWo 3o߇u:TULwKdS|}qҝ#2siQmОUӝ>FŀsV,O]x;zzK&(lp7?b?L&=& 8m43oZ=.*6XlV"KR%3ֵ IFƤYLMM}Ґ6G8[_;L`C ]:iaI!iZt=&W=SZX%uDqw<`{̥]Q&Z{ަ{6כ*@o67x91SSS/t:ch.DVZ)1H&DFjcX:]󷝭UY?Ia?T\w^z=orrKCz]aWQ5ه@D*˦dLpenݟWlw=?NwsFJ5A"|οC5##$\tuӟ@n8UM,05^Ndz|q/J  X18rJTcD"QV+MMMk6K{mZӵZ͝N#!o fZTwK&lJiPӁ[6umUڻ2_G1*nzsEMFH{ΰr;M6}kA$f@ro5[jQlfcE,gF+PL&^*z>R(LVgggؘT*ׯ%>8"ǂf1 " jVF wlR VL"w?`7C%{H%4"+uΛ칦*dѴ&=΍uwM T\Lf?0a_}YK~}q|]</MLL\E7ݒe/;4P"-Lkt>D"Q___?V_W.+{Ո , &-/J齥A%RǓΘ`zfߩpk:ߨ\9-EVjuJ+YTvQ Jq];=}DF &1ZY__4\nV0@h> “O3$ 9\N}RF\^d,k{e25=&(kt]u}^q狀zXHz$Hl&Z.w\bYXX0BaпnV~{x 1~},M,\3Ӧ;:r %ad:ڷ=V1֞Hjc!B4YxihkJ()sp3G.xʝ3CtEϻs"u9J-,/q5Ud,0HH*J4'K9r5C6ˇA!{iIK t?n=ך{sJ/Z](WRs ",䮳jp#0FH sܿ)J^ZՀ厾0RI&Z:^jd26Wv)j2]̎V*i5IJ$1Ƒĕh> s&ܠE1/a(aԻ`]G{Kn=߭X,@HBI%v lAz_mԩS{ufWhH<* iN'0nRix 1YlEszUj6.`Eh0l}D0?o; b<-ݯotW>Lߔ 'Z&_5M7QD $`-..=qOrڵ͕D{vԝxݤ+4 RRyX,VѠE"gzkEJ؋ cϙ{dVI ZtJ ɔ\5-wFHSH}>\fN)19{IU ˻:C6L }0Ξ=k|k~ŋȑ#;J"f@TzL&%Zc(I$ Is@R $%13Z^?;/ם yEqAFndGK}8WeڡkȔ;>Q~BТD閧 F;BzO?;w.vAlڏVixs534RXp?5@})TN+RƂ3-nˤ 5i`$i\%+g+Z]A$R}X$چH6]v?w^r%J IzŌjmL&c?_RvK#J:!=NkIR_Kʘ'm%Dm 9U\04xO vݽ+Q5@/U4g+R41"p~6z6uC9}8[X@u9ARQV,3A6^f {aK?v;MSpꐞkRa&>f,[0TNɣ7u^2E:Gk4 ?#a~Ě関.Z0Hfy `hIngh h^1\v' JR:scN'J.RC:華S&Whҝo\F$ߚmnH%5aX]KL0TNgLWYTMX/&@@ 3v;OS644 5@ZORt:h4Uo5sߓJiuQƝs0_t!=*GWwkF_.4J{ky?U6tX-jmK6Qް$J>v>l+L7Po}i6zIq^)FH72ۇZ6f*ئ QidҶ#6ɉӴƌΛ*U7mQh#%λ뻒Ea:];$qtik~|ъM: %m9Eݎ7j^l6_V*r+W|x?_eE~2H{oer棒GwbSVMRlll>oLR2/3-Hh!$H a`f&lHX1uk sgHaLuwkKm{IbHj5O&1ɣQb&꛾k&''}G;{+UEBLMMm.ۡ+666b+++ž3tU^r;$Ј@5{3h4"إM591iTɤgMŬT*!1 0ʆ &RHɢpcD _J ۇT[l|97gI+%tE\"JQ.׮]d2f[0`$c؛oT*s\nfApnЕHʹ~>NZ=/tMV k z}dŷ{I%>YOR&H [$ll&&| }B ;nr+|ӶU(JGi ~w+#N7-H;c̓5XTƇ40ҵN%λk0RIuNdc%|yux_U: ^a  gt:寷q:,' ->RH>Xi,k&$4ivYq= D yF`¸E6n2OH p ڃX,Q[T*>ϕ,Κ`6d$!}>moqpMPZv=%òV}dEMwRzx=nW.UxsQ:QmO4bX,oV?33Zfi{q_`6NHii.WmIkT6 pO% =^b@]!UHp )˛ r{p@xO 0mXt1𙶑wVFewliU[~ m2wU2I3D^n^4B #MP(Lcq?E9K&ot:Gl}ߏ#7&hefsxƛmf`w1<[,ިK Zkbb"-sf3gSHTI}cDeB\1A+,kwPb芻p5lPb]6RR0fv{3Y]]5W^L"ieR*5~C [xX,D"FmoԮ2;SV&aZɥ=_(%ߣ}L\h#k*pnZݣ)JU\cX;߱l6k69Ϊ"۷6FgzzzI٘!G -Z\\\*877wޠ}FH;h4T̐5/n!%J&IeSTvh=ϚT_#ƊCZ}4@ "MX67ly?`[rt;ēB*뛫ji !^ii{$؆E X,~ޘqcc%[h4&kH~]MC_×cu_5AImL 4n)wES(ܷH`Q#^<[7GX9}1 zB3bW6?Gl|FhύHjfff>_ɣr߶}ϙ`tF)$kh˗jw>]]*#?d2f}&뫍#6q=Jm ]l~:^诨dtv R*VIR%TIS4MtUHF(Raf;λH $urvN+'''I)Lf%bg&h`XeUyJ(ivV*)Rm1t]U(\Y&h`%?j6㘙hA@@`8oF?VI$ Z__?t2VeE~[U{N3᯸h;F29@JiEV!e}G|뻛({g& Z\\p~QV*z.GҠۧm|T^I{}[D+TΣ ܬn9%/`,m ~-wz&>]hS&ygRyک"kz1A2lSTi'%)>hۈp_/cz;*w7g JḬ: s.ueEN'KCjqq|_Z[[wddoL;*j|_*JϩT*G'&&f{j&_xgh\h}XIׂ64$QUWM7J)a$F<0T?m {aCܹs}b/d2ըnrPZ=aϖ;Ϋ^a\NIA )Eq#fhI V(iV(iSc&X@t[rת{=Nlw_܃)!aA !l6}(*)y'*|Tz>:Ο/--}}?ڇ_7ү{3eƶڇE$T}"F^ &H )1T J EZu=X]o0nX,ujfffF+ƩUuQCH RNRW2Q.QzZMfGG hMD"I+6=~um3Ay3Ѹ`V4b2o#O3#.]wp&w<]F~cXn>Z]]5Z,,,KBX\\bةt:3DℽY}zrrRɔ=fUČq>WVbMN>=iNsM ۰hϵTL ՞n{\!N`$Muf{t}m˭V9z>??owzzN$ԛܗN:L>c2߫hL=`oV7Wy؛Gk[m? nX&Xt\Ҋ܍&0hEEV M] _fsRzds1f|fǏK6#vm?_U|P8gof>eoPsRd8h)VWZm&LD7K&HiS%42>sFLUug7t:T*g?ڵkoԜ+bt~fsָfyߪj@TU) +iGm,O8O I0j[)}cҞRё#GgFoxCcF_zF t~j"{SYNRKsqc +<=*SgclNL>/޿nhz psX B i)0ڔR9K6VLPp7ϬbޫDN(oƘdG ѥOZ2^L&K$ vDZݬo6j6gFuIȘg{>~hI^/LŅh0Y+ LBwhߵ ]Q{2SϬ}=Jiqmsݿ;f_76Nj6gclhN7f}TiXYY@biw0BziRʽ_IM%+E w}w'Vrl I&?kO9`0H 0>4;iEs=l*b3664[+J6.3.]ڠ 18n#Bfi&`ߵn*ٸh%+` lgk̸6Wu08$_Հ5NWؖ+.~iGLLRݚ{`p jA]:cat=4=Jy7h4LR\yN?9`@Bx4^XhRBvхjh*)QIիy ,Ӿ?Q=WgPɝɱ6~] 6'NASS)蠀׋N|EDXԠisl_jGzoڇ|5{\.%Z6FP]Zm6~=50~kEu^>DfjsMaac9|ח鸾 0Ҟc^8tէz~RI %T~:Hlm{_6(sOX9H !Jtp(5$KGDJ<ħ+ժt:&o[Wٱ28џ}s?6&#(ROI_1,C$Pվ0dF,S?fw8PH+4JT 6l4iub\ $%^o>RQmwacB8aB QW76.mJvm͵GP\0˜Q&D $ @?c"kaa/zbT`k6 F8tG̺ eA$0LUD_ tR_Jم Xls`&gmh D $ Uƚ;>Msnc"aXVG&QswL,[Y__7/^ўHʣv=͕ӞG0 Q6A־Ms9pgO<Uٳg7Fڎ_yp`DLhC6^jdW na&MaC HYղ6R4 (e|څ0k6N8ncF:ZQM plQ0"QVr'is=@5l| aBGm$h Ğ~o4ߨ:)ʿmkC: tli D $D] LP.Isڅ R}KСC+)j'l[CA6Q9$c1mwwWVV3X$vx_n鬍/hH#61ؖF|oƔ7/^f[s,"bǢgn̞6AI^P٣u&To9lh,--_*^6HJ& c/eXGާL/oHaZflq 0[*rU+xiǙ3gfbkZJ&MLL|>ߏIEoѠm4i!}}@vM3O`GMj{`ptCM>^1ÌwCnqqq~!}V\NM"Hr&nuumi;m|WF $`g8n$bFffjeV#%]3A)%0T@<{cyeݾƼ}~&QD"l65jP!lMa,R)&ػ@UM@}JK&K "k/HQ,yq` $hєxQ0\>>)Ljǒ JcH@@ iѴS&Xy`)%읤$R=6 X` @Mw"% &Xa`X;(iҚ Ha.ѽi&qjyMw/#}u77&6.IU#}L 5A9&H)QF)5knUeIhHaJqI J%i}rve5\UE fA$Vi{DwRbII%R<$0r&H0Zqf!+6`$Rj UJܔ H `hߢ %,RM`Hhk6LL J-#YM(J y=n:vG ܭhJaf"J"%h)Y!y`tƼc{$Q+Λ`Jm {DI!uPlgc}>iHM`L(aT3đJ]tѤy0h$9cđ:UFU5A;qkҊؘ6A:7J#(Ѫ Ju짴aK@&XI*Jc@ܝV()R%G ['~1ݣVi#%H+L@ %`UJޅ+'>RH "88e 4` Jʤaz@n(Qt蔍C&XwwJ*]6Ap1F ۥCJi#%&H1APJLBIl,`?%V&!Hk #EI)$Q<%2II%%ues*%` $BtW٘uϕ,6#I+&7I $%MJAHV͘5:h@nHݣJ)TqA;a( 0bQ62&HrAY:v(teO> 0,RHɣI ~"M؁A[vj) +"xj F6Mw#<"i跶pݝ7ABI 0@Đ@~ B %QqqXA u\ n(s$FCIrtZausFLXRndUJ$}A `)aw?{o$K̝3l9 BH !##/!a+$!1Aa!! "D< !^'fz;sյ9:oVUfUVUfMfU[;,:eY_k#6 "A82B+*ŐxB!dHP@"BI&gHt)%YV! Ѯ<Xh B HB! _i yUGWB!YS !$,0?c+D$xo\qO=O!!2!P@"B3a4a.+A(ؤ)okxPs:斴p%L\$#< (IMD!BB!$& ,q(%rBt;Nױc.!ܛrf,8LI]mCw KFhj %B! HB!1E(Bx:F&ь^ ! xt'GRz!YRDr&'(gD%B0/1>OY- HB!ƓȄ&hdiV!P\|F^5qC*ģqh%R" x)t}"?Wo HBZH\W鲸G^Fy}qQ?zEB1eq RX2lھq @P:1 {YP &M Cnms뒶xyLXo#L.wF1@B!F3cҩ zUӉ)ҝ6뇐7ue0jZ0  1BR<)8gx{!2۷L^qvvl6|׿s||\ dmBE^0:Ft5CeLGM і`Pm*HSۄ"x`@ǢnM(W̝ &k68${ڷXImB5铓kju1rP ́DpD!XN|/^FYpEX qO%À{,H<[z ~}\K$BǦNyWܜ.Ic̃+;%;I9 2>baWujvvv^s/^ H {!JB!q+=- F.( `(Bh]GHaWbHG?9Bz)[ 9wgޙ$Y;(1^JF\jI$? !$AB -'B(CPU_QQk[ mS\5̽uF ! ay۾{xqDPv8/N|Lȸ8rEI&GҞcr#`v:)Rkyy_[վy|< .& !.Մ#1 a>-D? 0.A8q GY-ּiiw6t .g𲸆~0o?_;4kIgo[4Tz(2.p@kabqZ~GDȐB!=  P0H!²({+ -qA#Ð{MSl[=A'/ CX<G!"T<a9ߛ62nY\O8|g&nꙤ|r}||yNm>"B B/"W654Q00; *]'3<yqg9i8e]\1I½ C[^)NgJ7un/븋!&\^J$ MX ɗiB^-V!MNZ֌S> "B!u``!n܍1laNӾkp25}?ymw8zA(~^"UV!9ck/0aS hJs+OA$sdzH&.1yOEBH0דuu.w.7[|4  HBH6=`4MˆP4] |gppɬvU;x#%cNyI\1MIO^@ް~] %o Ib8־1ngODHtNsq˵Zm\.MOOF޴Zv=GCD!dC0!T؂i0liNbD-hk α\GlC / fx辭㤏3f߱z04m@eM0pFP2?h?Ѩn_=99_YYr>jٹ\CB0C&QE4ea|}%!$~ǮXpv$y1'<WLZĤ9r)-q!S8,e#aNE}m Y}=J].p{{#-,,mZNPxGBD!L&0z- z%E0-N!ũ|'qapDDF;m}>b*ȸu M2/ {:~fx!Lwɏ%-&bIx8$^JAơ=gOu]-V!o|򅭭YXXx=- dP@"B&V IwI7ɜ 6aEHM~TEG>ӏΖ߅WQ2|hP"B=Wt 5qCY5xa „JDU[Lx<䢑_/hBF;"/đ;0K` ~淋YN^& ˾ѱ^z p Q")wNyE;qј # _oۅJkkk'| f$BB,VWWR0u!n覷֙Y`0V`@5OqE;KzPI.f2޾H Аls,^Mf="hr,ڷgjڎuUu։ޑ,@  \qc't﹟q_h4{rNMV=!!ll U0߰ElC%cl^7xfo8k$|* ]-fz+r΍y$ ՛3JX_76Ladm_b֮4rwbY^^kkk_ HBHr-$Ehy}mT8 /#+`Ĩ+B`1* l qs ϣV! u;sM;x)Ad$%ϣM#ᑶ33dJV-5V.9fYt^SW*m,!# 2B!$Y$"cLal)8bD#q.9ypb'O{sDk[_Bg끇#鞿xsU a uOQ9ޙHۂ4m4IzŸ/Ph& NS^ \ 7|>w>|iObNjڅBakkkNB$B!Y,!]d^׍6_{p\Fekzox튗'ۓ(P/g$\,!%ȬbՒy傣 bA+[?*$A@r+0&u&b(RM Kw_\(u#5>P9:2;0Z<7aHxAD ᜂ^/IZUBWu-zKDŽ#$KBȘD!$_ᭃ_z Ғ{9a|>1\/ Zd @\C" "rfK×@p#B9cuAo;OHc !BPAN57;;;L= /}JS\(>/#D$|>/J弔e)Z-i6B'owvvkvvO/// >n]P7 n0fB@w "a  Ca< l_`Ր`PO$j;0}}.e}N(q/%xz((bڮU5-&2l!BZ_]]_2B#op>gskFMssѢvAH߄(uҥ/.//vںna@ko¾'`0zLu$| A u`tH R75 p LxW h=+:+#B@:.I/%{C!!dxD! Ϙ#{9<<۳kd"F+++25h;iccο^ln]ӚyFG/K4 $~Qq>kT`cKqGxBUX0kxn3y<I:8 "kH ALǤS3B2=!D"TV;xa޽{O Q)긌=q=`cBݚqD`oYWD5^JӬ6`L5v{YCU-m[N:54,B@( B&/!PaRCnc7/rT:0BR4Cb&NSƒP7~SOIicqC'nSE-`0!?0._W`o<I拖8y`_kD dp Vږ'69v !d" BȰ|CBadyy\@[nI>?};8lcX.tjy6JlЈmX!ty(M! XW'$+!BB09jZ㖈uc)?f14F^xF[WgM#2h3%q0t]Zǚn0Hv%KW)>#OO"UDiIⅶ7#%98K1~imF״|JG J>!2,^H?_lNda|94>(pIsSﰺSI/ ư Hm#_ؿwʇޏqeqsuVD/Z`R*iBa$&r.%Hu^׶$!$1P@"2LX*57;eU68к^a FFϚP tlkωaAwYs!;k|_ :`LN iG&u=͉xG $x(q kLwH{蘶뮖c5!>B\`Bkkk+++GGGWEV ~!'YWzר5^4pᡞj6]w՞Z0r5'g2ZGX\O׵0Fcb0J:~@4x!Cecc9X Ky69f}s-@RB77" K}"WR1B!\PB*J_;"+Dg\p`IdwaXnjeuD^l0Į]!9]aB4V/=.g XZדyq ܤ`h"GиYHw.nQp!)}K:~XG@=B$B!CeffgQ@r Y`gN0jjȘ&:207U # taq ^H "wW.IH ک!^Cw99 > Cݒvk>|Y0wUmFPj49.BP@"+vlkݜkkk^ٔBtqXՂM ˆUH^BD!;U4`HU{0BB 2tdWa͉gY`&nݛZ/ Ըw״LDB@hd敊nNqǷOɥK=`W/9 X-60FL\!N"(A)) UC.O%7cC?q,I|oj2/[5-:u/%K+n/!imH"%B$B!:Pl>!\0r'腔]C %MB!gӽA?{U\/I+cxvwa3cA}0LE#^V4,OQ^!$Y-z1"D Pu=_ I$cG{O:FBHAݦN!$yHq[7x$'g~?z5ZS~9#Մ-Ѧ7S6gw=@сa v`$xP/$u4$Z,Wu~">#o؆ :H0"t[ZDpE!i@#HI.6jUE!4@B 6%7pxbќEsZZ>OC 2=Yؔ`Sauck)ƸjhH!0f>'&i1 Ʃ,Bº0_Bܭk?tp66x\ kk7c`zmOH%BᾬcZFRDf+N39t+éB,\B鴸2yl[seA|>/.?Y 1R]ǾmO8ܲa&$i+KrQTBc&{~ѹsU]~!( B1h4s"NZrs;H7nj]?b°z8i/<r+$06w95+Ѓ5qOٿ1 k3k,qʗe'CalЛbg KE6q 4c2Br{O5s2],p č#sԹpJWt,D/'M6&ks92 ˇzGד0%*")kmԶ=TM!X-q k͂9uXg# `~^ \kwHuRl؝5 TcPd/ Uɶ~SO?3麉:ƽ% J&%x)$3L$K20 1:n7ҫj?8Џ;BH$h zO0&0{kga^|?˅woߧFF,{B-T*HZr<S6c k Xq᝾Scj)<)aFV/H67Ľwk1!vV/QKya89q aMC0ii1Fscp/h^;ƜcxD!hߗta aMC)(BzBLEP#uCu{{峄"&9߹plZ -뢮(IM"SSggg37t_vʵ4S~I `o/NTx"8@!$ @1̟#D{kqym(˂3ϛ5b>|d$s۬7!ێiۭ:P2vT5I]tOоΟ kC P@"]v:]NBx^z/0g/*-(Mav@,(~C255Zj*J:Zo-..bq??#'bpGXmmt~BMr(F Ƶ“}rK:02=ѵ>' !]u;G]s 3Q;I;-xJjzV@j@Jg% $P@"OѨ(Ϻ}06a^1F&BLn?ol6n+a(#cnn?qxxikk[~))_픯r?+NS~[[}7!kq0 M8LJX%}S6)8ɉu+|^M$iFprSm4ep`M﯊kTFB&}am1iZWxwg;ns}-^E"j?i[;ySqxЃLh۰ϋgz}GV# q]DIآF:{~&!>c?1jعnދA^v+)!tm2WqSj}H=?gff]%PUZ՝;w~*G(y_F ^>_` D7sύqCq1~J#zxi5 c?AW;zƕk28^?]-&YcM ҂SNxy M}*$$h$$9;`(wtK:}02Q?BQ?EB/!c9t`H2)®, 8 E/jU:˺3#Ñ ܎*'Eh{5w#d<3Lo(JX%?R7xa:}I$R{bviIN:*':88z D+gSY{~9)_Z^^dzяՁRKR@m>ƟaA~. uģ>C hB!P~Pbgd81c;C+6t+W ޷ sgP"HKMYK JH 劌>z ?y}؟=_R~ُpd%t #,.uh1ibЄ+qQr?999|>?M(I_q/Jxqʇ5\d%,HNRtAϰb#uM.J)%:)Ll?h@1GG)ewnd9bm>nj^Eo]!o4hG<I+9*uiD/۲NB8c7R[(* {+;$ ux&}ntQ:y]zt۩WGS0Bh*" Mwl19\Z0B" N'VV4ӭV+_*NF1YWgũ.tAnןfn =c;Y2g=@"׊k 70yzqvnLCD˸Z7 kG^$'B:2Ϣ`-Z2isűO:U@#`M㦘A8ȼ+Q7{aK')R:Vm5xK8 zV-] .2I,a \E;ـCH{r _$i) H5qlQ“郀!a7}+ e+!?/ #%;-~9^ <?&<^N!_q BK[B:oL%p]J&xն x"Uu}{ Q #MgexS%X<8'36 H%QͰVS^9#:1!{5x^Ju\Sv~I_u}`"$41 GBE;]{I HaCu}4H;sU:7hrI Y c0 {իPHJ񰥋b"6m&&د;{Gقad;'ģ. 10rlyDQbnחÚ!á㧱A=Ա 3nVKE&x=qZ[a1Pw':h+ ٍ !](a#Q/(龗IE<⻏CD)x^dU/Ⅶ˳yrUdIS]SEG2Q0nH)phjMXu3!w )99k摳1_j qS劸'GE-, ˗ i ɬc#>Û:ϗu\|d0v;; . ZKHD2z9$EzF. HQ:y I"ݽ H^a:Fxd^tZп;Cjv%;;zn]\.\@-C@ np0'U!ΞNiDɪeoΌdO@2Nn+lfjexK:xF5b; !I[ߵu3a$ ˜z_~:j#8AeJ&ISׅzOHfDWęnF(%L(A=zPdp^D #"uyM"8ɳBQP>dC4 A$Hń2id -Fk![l`E]<#6g0%epp&ROJPsE^x>: k'<00xڎ2Z{__¨~YSy-q<$DN<Gۿ$hTux6)GL43ģ^yGQEŐu yU< ®5pvQB/qg& Ť /%x9ur$4z vZL!\:'OZ&ˡǜ;9zqbO5[ݜ9[%%[j4zUâO^c:fֵ°1iIm oI#)"^v+(D- 9'd h+Q/Ѩp_QI<ԯQ,iАvD#LIo&{yCJAnv$tnPAш8`!F6>&t]V35ۄM2}ј}`"=ÆN{"nB^0!]RQ&m7!d JWNaDג-vDR $bݽ:yu U/آN'!Ⱦ,jNa†h@UDμv:%Xt%墈ԐNk0BI\ _am<E#DG:{}0Wn#> QWYԖdbAsg w%78E3/=v/!$7k]f{DBL>r1. UGzogߋ 0&o $ PYsXSЫB0x_@MIz„|꼅5u<2+¼Id2۵Iۀ}At=jDHX( eyuG~1.H$0"R^Gx qE4 #Jtz I}'!)HDjEwt[\򮓀)(Ҕt3XIK k?M;=݀E#0oFkrMq=v%;`%0 xvgp`%I$*Q榶Ƙ 0, 8 :^){ЁХ6s葾.긽% BAL&ykݷz` ^]]=/mummQWH⠀Y}0##=wu4t g&Qh(בH]0VLU P„{@ lx%M~ ݽl&ۉ ȳ`#8v X56ģ[B@_|$Ccªܕd2/,dNYv.r:ǜbH@yח31q pҎtв(O~IKIw3B;%\]Ҁ,Ah,]]]܈gkkkuV73FD#W(QI‹HʫQzu?B-/a')HTnw$-*R'%#wsשn˰v8F0s8rLL[`45xp꺁IMVrϋe`x YdIRS\dr! 5 :O1/z*!$u1c溮Gگ1A,׶^JdR%}dj?puuXϴ5֚>2J( e>9qM8*ܗN/ϣn^G<^HFaBi (bRg ,r(5Y!)(]gRWRk]e}S.z%56`Eog7ֳxz.;6 ;opPE⚛U\'/2Xؔݑl{az_‡guY0̫v>8ϳ+g w52ϟkKBҽoD9ɺ]x?؃Dr֧} DS-jO>V(^kZ/:{OF=g)IA(2pab:D8*IrudNazY:B=?$$}hdIP ʟ7{~A/*"C5oE d7"d?8#M7Xop. 28ou@(SF  9JZQՄjKz( gg]g5T`P*|^43 5 tOCOu`s32>Z:==mZZ֍|>_=*˥BUUƶ{}O}{{;U*[˜43px6pr݄N0!†[8 {/!퐿n!z}ضN풗`虜 ,HHcGxtoD#[0jʳBiE#}We :Ԑz:rt&[pNuӁu{ژ Cl=be8czWn$Kј~wjowř8WA^nvr??KSSS?kImGa8 AAQ/[Σ0yGW4S ;-ň3a#"uvauJ7"S8q{ZMш 8o0e-ξ\8}"= C5ɶ D5l#If؏]}~+AۼLX_{GjFШ0y#B&rN暵/ǜ.iYHzԳwkk믵ZR}UT*,r9_9ϜcF!$4&qvCz : ߨ`E@ 9_/a_miؙkN. #%# Pp{#8ٞJ"md[_OD@ȋYc':&Sآ/k oJ((1cVk,g=X59Luunmm}s QuKOggg(7Sw8V>s)R [Ⱥnl[^"R'ϣNGģnˆFq FI]`t\>NVLE;Ԗg0W[(d{QAǼg!#b|3oaH`XDNG\* n O pښ[2t;w=<3%ҩ$[a;NY`W?kj8LXEH$&VB^؄k?llSNㇽG羅 oj/,--(ic?^oMT':⺳5wʟ;==ɉ8Wq>4]`HPhOOO?qt~r/csM:EY)\_jHGRP=Z2ސvȟ3/B9goeIL{ -G}vp>9Y$!烧!$՛z$yM>WuDWք] !ςpdlZP4'cGGŢ\|y>SN x!~}VaqAƣ֖~N?_ y|o"BmzzkyOPx(?;;+ߺu}e |S)z}{k^l>{ afffRHT>=Pw|vwj?bHbmf '-qܟtBQ?Ѡ^G/?R*sz5a!}_ ė1}NugEH2xphq >oK򆶹|CàL=aWBH-QtL)?ĤEjB+ GONNf\IY>߭3O>o٢ρğQx.677ǯ^e#!p0Kl]< mNpK< Gd=Q0ax^Q(f3f/$bJ IF4 ,C#w(did@+/φ !68ڠ<^ /k#mXO#A{g;0'k ]qmɮ9p_## f!<>l0 !y:9={a.T`?jO"$oll& ^G/Ͻ;Ivn$;/R3໊tiT-B  wH(w*4~ =< a\O sJ_Cht @X1G)X>8Cs{&BJ!CXcE.S\ Y-J^R)yeY__7n$!?_Kwu"ԙx&dI먛p[Ⱥ3t0uM?^Ia$~+mg<èRKigD#B~QD"cA¼q~cC<YV@<묆saPf%\ INJVƸأԺIcg\_б^å DZn& 7WjPE9u6#Ml6Nhtʕ$GmlleU#,M!S$ G'y9ŢNG~(G~(Lt $JGHC^Iv8$ ŘHT0P ${nʳT{3($!Mq0wXvO #݂d׫.D"܁N↥!k1{Z2q-QIƦW5ڊ}a=mc$!tb>5#/zm^?ggjn:Ե)  HI-G@c{azyMKoQ'(ȰAm\B9AR71gݶa@dNEl릴VSA߳{"ҼcG8Z),j-qONp`݁ˬ ӻ: J^7bYtH Ok/-]sR=зpGbr~J![ఙ &]OD2:aPA"r1l^<[?Amc_3I( %>ţNG#:p-Q7(JȺ0‘HGd2THھd& c ԩx.8B[lu iG1/K/F^ Yk9&C׹`ny,Üe/F MQ"𜅁Iʿǩhiǜ{U]i0!d? CArxh09fl/GjʚlbOc}v6䝡Y tl'(\]pM<*Őu߲K\GHl^GmѣMkwJ`/q T"}D⚗0'⿬V.T0k655c{ɶw NgG(%/d\wd`H޽9yێu2;䄨4ǵAby\*jpzz*ӌ?.$?C.gk>cWM܂#[pSW<(p$䈯 "$H.3(WW'#xC¸ߪHwoN#֎"c^lP<,Nqx.$9Ԍ{ߜl HI_B-W@T{;^z >w%! !bl0g[2+ WaRy /B2g)uOi?{o$ٶ5]U=ݞowyO@` Y2aL`Gl0d!=d#P5Ia²f{{{uyLڝv3dV'|9U9{ڋkv H_tFx l H8^邖i2sݖ1@DDA/º٤$~uNܲ挶ag9;mBr T B@Blmm>eʵإϩX>I?uھw]6PL8bx Dc1#;]R$Y7#Җy2$KKkgymZ@& EY{ݧ IUwTvHscXHYtG 28^;.Ʈ8 Hi'fjQ9]BtD"rՀ}kസU븛!oK!}JMKM#oC8 4iccc?511q:) yZ̜6IHzᩈrJj@O[~d'/к̦Rx;jEHĝ0#maN#Τe0m/La|΀^O%Fq^،߳ cjKAD"SBa-mK _p^nb|t_~7"do "^x!\^, к I8U_cڄA[lP):JFP"5^ꕀt((䭷ޒӔvtռuW7`C=N;un{w2[pŲSeRnDi|[R\{j%=N'$Aup(%u)PPpr;|f G ޷28Nu\}®A1}p*}H3dBȠJ"}ilggVsε?r||jDrҥ~/Fe[:v*L-+z-U}% \W#bHۈ>"fGvںI|GY#[Ԋst.yLH,iܺHZKn}RLsknM<8A4B:K4`G9m0u vv轍Xd H R_gY`(9*Ø[>E" d|Q_K^_9i7?omի4vCCk׮ɃN"˹1'q]v1\QiGmS (<×ԝvYR ;|QZ,/S֑~ADŞFq{RD* XB ZF$w X@`G{Rz9&W GvS@|N;[o wbXm/H$&zsPc4Ft^*\ؘg ڠѭ[z]naa4DCZSׄmΪM@ܡޞ®|ݣGxK[K]$ݴuF@2i>Ǘ,㾔uH?G2?Y4wI$ ם E=ϑ# /r82"Y߿BOdM5)8QwBt@񛎣tWu7#v !HKRiDxԱcڞ҈T2>Ɂuɓ?<@B*˗/1 7I# @u҅:;8ĉGiQ $-I6Iv۷\wjdFi?Y nYotV l H]H6'L,ݷUߊc='5[wZ{IT¨ZBLfM:c6)2ǹVU?~ONN߾}[#R7LLL H{{{yP릢):F!lP#Ue2.Qp4*GY#_\;(7psBvJzYSeIS&褚3yPD4eB'a}v;:Jͱs&qS:ӃD 2/\ RfdZw:DQhsBHc~2u^?!( 5lw={=KGy5Q.bsԇlN)ICk mCۓ ӥԉ}|iuvQpd HYֹGYHcBqa6=PE u\<6vH}9hRq~ 9/ u]o; _X8n 8[ΊG{k  l! vvIg -JEwJba$k_J>Ҿ6y@gRGD;|}FG#\:7H)ی$֢;)JQFHCē쑎 D)ĶeTg H~хyPԠ{z.]u9%fؽEu(ܢ_k o BIL-б6 6D@@2Ιٵ[[[ߏپ?NNNpN^߾I8.FE+qA=[PlY|QZRٺMy4*E,i\M[wԅvu:pw_ff{."\-r,9tuOd0km9=ϮxR <ڂmXtѮA϶yIzpBPw}}KoIԄ+a4rl ӱMhzyww!}efK#)Du]V(.]Eģ}%fÒ:FrJ/dIm۴Vu}DrnRQ|r:s `wt4J6/Ԁ4fr|}5CxgHJ6D%9twfQBMMJV!(ALZй iWlo?5GG"\q˯Svȴӿ^vu}H{wD}RR#W񥭋Gi/(xdHYRgQ<"E'""U=MHNC+)ڊ"RpSCt ŢQGZG NKx&ٍnl"c sM^k^J`uWz Zv8o>cS=iBHkXS9_ן.v&jZN= <;lI9b_צ@L#_:_#[<#W<##n#BΟk,GoLHƲݙ!ȳLJc>_F4-QDRұDww(T}{cuQkMRmv,za?(EHɏ}PTC)[ պ 럐i !sGd" *dz9o`F PVellW<)v=O@pFȣ8mn#RdRL*ħKYή#<cy7"R>pfW΀>כ!gA3`Kv$0ҡ[W.Kr\~Nm<\YЫºHNz۶:n^HjjzZofdd;Z=Maף߂-Ve e8M]E0#;mi}X ǒUBZJ;&R3F$]oqE!]"R Nݻ98w .]5˝ p> ) E8itܛay^dDϓ/I$n`ZO(?W(q ]Pp6=k^H!Y^^--- _( ]fɎE$7=O8ׁ7F?vz-GO$uw]4i|W੗( 2r[<򥮳#_#;dG(fJwxDHHd?6)`0$_+[q:7.1@:c"#c Sם'ݝq" ). ӤƁZH3 ubj}bwj+">BzjEP-o>"҅H(Q9G&[3!Z\6Ǵ" HQHH9S˨Uh{>}0MúHIVJχ߹׷֖@t xO#ׅ; ~ |O/@Eriw: .cSG&b+%BN I"uHsgM]'*5HD7!`Ꮬ75(: vٿ/uhIXCwsMs H]yD"r0`pKm/uLHf Ck?qttɰݩVS{AV*>xɣFzt ՓNtR[[[CQ5O~K?^:_( 5A\ȍ>GM 2 qa=?}7J8ZÎD$gwu3 9c7j- w@Sv<-5ˮ8׋<N9bB3yFuBzy@cITŎjT-dKKKx|||V kГ}F>?vtt;;;߻;?}ȯܔ _YY9F\JSD 6B,j==y Z&SʼnHvv ] g~\-QGnں4[!m4r嬈f(Eaɹ5ٌ l6O{s-QQSC:S;>۔u1cPlyC5 \5ܵޏtET5SbvsDyGGDpDQ흹:<<699p_7nLj'+ʳ/_ܾ}o&uMo%vAKƚ8.u-@[=5# Yuvđ+ B#B2VK8$S_i/ͭIwug[||vͰ=ţ΁M LpS<Cf^MSq~;TӴųEjqCQXOH2Hgz+Yǘ˗/vx?,--q'=d}rr;:lҁ{+gW^x `R2Dtсimv#7;!íd#$#MagOj5miWv>'#f?.q΁s!! $7~K3JvW&}!k!Ń^֚vQM1?q#IOXZZ2)yn^"XY׋pr{rǕJe{{_-V\}mhh(͋%sa%?ta !hrr_c!Dӌh6Ibr>ƥ""n(qC|Jsff|]1}Mxc(eA~A=o #az"MBaIҕoZ6AVT޿쫫9ߖ6DNLLο~j?߾}{+oWZ}u>a`^m"lH"1j H)XGMx4Fu#ڿrV"5K[Wx;!7"=תE>%ƉEi-!pY($/6αj<;r]pګH9Sat, ;浚v9ύ ɼұ c5 !m2 *5t7o.| ARtngf7<<166vuddk~)|WȠ?!m055hvww? g^ѣ{Dji]װ* ?2|ؾ!lN2>zH7l>Dvb6' Ar l &᜿'f1&Okzxx}ttt^ݻw?Ϲ$084mJ/>SZHx Iv!{QfSQ<"$EE$ӬlM$3kr^<*d*;gF$:f; vC=(h i1%dA),뺨em ز<S=Dy֮W$FE]uξ) :뼃 I.R=j~\N:DSSSO.=99cb{{!$#m'w:o H@, orxxxks)abH3lG~N};s E&H\M:~$`( 򍢏L]lFrVq4(-ȭy6W8ċD͊H>}E8J>d>3RQ 7t.vD!$ }W*v bN<oڌ@r@"> |#ˋ88/,,t,u;KKKc<ר(􏴵= JNx~H/&)P@Wh4ј^P$r_s#dn](MD?QRk@Bk%)kaU@Iތ*"!.!]:c; vbģ:5"a]qz͔P6G UaNd `#DQwv⚴k-.$-򋋾 I!B4iD^tLD{pmc,}?P'e^)" 8Z5M|6H%ڜITo6*3`}s\n Agaa?ਧP*ժ ?ώ6oD(Mi3BRs7)@ap\ӈ+ƤFGH8!).m]+u!%IDJT&6xd PesHLeg:-4SD;e2/ϳW9C($Qd!܍4vlԕ T͏,L!o:z6IUN-ҙNua= e0 )!6Um\1%IS\@ ȷD0Z`A"|bM :Ex}|;ބ|ӬTBNR Vn|;3P߀ q|Ktzt8h٭"LKs RyNb#a#j57y. ,:ǣ9S$5N.FFF^wGj! r!1Ș99cҺ%RV@҉.p!%i4ĕ8\Wȍ>#J_ȗ*B.NH EqQHN4xW;R<BrVNτ0BpΞx3#1 Z?QcX$Q$| r hTPt6iu0_L;rs`3PW}p=qќ%(NDG8.)mqF }w:9 /\.Qf #DT'Ej(j" T*;2d; AxE]x0/p,H>"]JXAɏɇO)lNhL ,j:027TgGjNr\$>A!r2S7s 4Fu1Ҁ }Gu)L-#Smƨ}d?@;\(K:WDb#B,"R)eRR)N0rLe~ϊ>(4|UH@xhtS 7: )^ #vI_-mV΂ /s0м9>}3J +t;(V`HڧOzRS MDZZ6vttt7T*/ y[(˯'&& )![IcK]{w::I{JK7:n6'E5x䦮s[w'7i"ƅDKDH$>Le~/p-5].юcrCޟH؅hR1N#* 8.Ai+57$Hkn|99\|`%+Onhttv}2#?mTEʴ=Kz> a5h ]oHj'" y䦬c:BODg pţu!'&դ9(S*3:0+].QdHyĨv&,OΟp-#7@Y}\5 :R@8|C}lsp䚴pxxTVg'\}T*>/^;XHcϏ cjoN]5d'w I;UF#nX'X:=A&EQBLR\##״+c;\E eMe%]S~r%n D2<%D]gWxA4JξI3 Xj xWtn9uqTDun ShR1jsfɕx͂;;;oWUYYY~jjחY vԵ "Aiݕz. iM.Pe4!=q:}䦕KvL]GHqk)D$1TvqRTvf煮~>lN|F*A^;炭5pw,JFl( sc0r- ]9&Dn>tQ8>IHin)$<˝;C'''wskkk[W^+++CLH|wt>O5:AtJGdALdivB%)4[E[E I|,i뒄$Gg1WJD\4vI"щ4_.${܃>8{ wVw.2ǍRHuS¨n4l:{0u~v\ϣ٤ L e+]qL6+jC<142SFQҮXsƶk~j:WT:~|?FݟwΎnnnO<Ԅ䎚4~QEҜ7"Kt HZ܈!z`+$K}lii5dPY7!dHxeG!۲4ċGDţh$#dcTW#4◩xcab> nt2 0kR GZ[I@ڋU8 3lpůWj]O%؀$H['jDR^,:;;W3P{?hÆڪ&" ÂڭXTeq CiedʘQu4\VC#Od>E"e\*4#׼+% I&)/N$> [KC<*Y1dI&bbQ[IVu40%9/O%i}`3YCvCfPfO( e$irMToI'Q$ܱׅ"R/0av_{W*z:' 퍌<::񛐾}ilCrVPm _4I[$uʬDQRM>JJ3%ȗ'@e!v$Rٹm&]Hv=; 0GD$IحzI[`c([BUv!H;q!3id 9qC~Kڷx>D&bSG9x6Lں )ccc+_=33[[[MH_ڱfa2ނS%v.LX0QFF+D"|:GGͦc!ľdB2HY#_J|BEL]8 &8K4)]-NFm.D’HݜG2MSg@PEr;pB"#a]A19pQ|cxK~ [&_J>,t la!?f5S4ģ4D!lsB9 !ߒ(e;u[iI߁0u]a{ 3%Lds Na8ɖ7Q3  쒞GrQ6-=|&lZڴAuRu_W*ZLaal$۔H{7%܈%Q@(1]xCM]#߈ N4WKaLQRu裤L)-k=$WDJt#7 mH\I]ߒF~[y3,!v] R"+qt}A>P~JOK h-vG8R%"cHpH`A>okz\.oW顡=7zf$!OݚumJKϠ} >Lp=@FPް{F`@Mfl' ‘/ĤV%d1ͮI1cTvqQHRٙu&($^Um]Ip̱! H(tsɷ1,ܝr Zc I2Ժ.Q"蝵EH9ځ=}?6FOu%o5WTJ:ڼEtlB P7(7|lP^5UYQ)`J^~8 +hBn#so仟5m]#BǰzHILREG!"d|DSٹ⑉BѱċHf3QHUk|9D!iK86!㰽dmCcWĂ]i%N",fswķy8 o k!ea\P H (ǽuĢD"i~ظLnD}<0=f/q䦭GnQ9%EeLk&ΎBKcw, XގX2QH0e>ˎBrE(y /dk0b{֩"}Ǹ^g0_0@<ꇨ.dHCm-;Ĵ^㈔P )<{R|R OQ րi3.1uRmyyCCC?|)\.w==Rx( !ׄN6}/vHY}ܷiWb8!,RR׹#BHƸfSٙɈH&hH-"QH$5B3q{FvK+ oITzBY;q ) "RGz#U4E M z(Ե>/wҥKryukailOe{{VV0\s/L+Jް-{M=~?l, | :WNNƎƇgBH7lhMZAy5sᢈu]}'$HiR{FB=5ήTHF@:&0dC2oģ`\-$B{v]c4; R"쩣bO/)3`L;Ҷ^ Hـ@(ȭ^6lkBa=DKHLNYZZ¹yr|ի211Qky7|~?=_HGZm;t^aj' H 6v.Xk{&(U |:f#7u]\HDiψ8(4$7 iX⣐!E!᳐]?QG,n\<!mx} ņ =8|WtS("# 56B釵ʎ46,?RIؒcn& #"u5Y vZ'[Ksw<<%BH;@_*HYD$S ߴ($L.&;>S\s"SE?F`|c=yCsB #=oqY\(=eii@)!Jr[AiJQw]Jt)n}ku Wɗ.-ukB:9%sTv&IB#[X{QHsڢD&Qt+ yM+$uɆӰmfIƢ$V]H|.;RB8N"RxDH\"s9BY5QdoVQJjt6d)Hy͗.K#;`%u_KJ]#BHTvn ;_*;dEqH& ($FH2#y5Qg8(/ pStQB -Qض-B̆lúΗAD*jK Hq"JKn℣4|GqB!tcI`N>eR{F)҅>qض/t\X ;IoXrKmY[!/uiD׭jsI4+kM-)%y'U$=}Dd G&0-iH͵!4$j"ŝL }3ЬOΆs?)Ƚul8Sh$_$BH'z8iwn=$_%tuFy ]s>.Bj75]tDX)]`CZc߳`sw A$6 |3"tG%`TDuF(B!u &}A<9c۟N;/p~:L]iź%GF"tWqĸ($[<ʒ:t*S88HYDE8%ᢰ`xkgEIU1Y0gQg鞕1Is.?ұ4vk&:?3)!rqjjWs.[lܘ[ G)!t [E$](a9n^;o~U ؈ViFRټpM#F ăDrœ'M]І{/_:F~K[;}B%BH' RJ; &D$`i=o+]LcXLc vMa4Po1r4ǘdԅn#vGdEǍ{ =k)Ry QOB!6D1o#Y#7 歷sE#s"磏|R\ $3yDB(.xdj k3I'YgEgΤ1hG&# 6C#Iƭ':v+>:= - @>vEX[./`MCB]tBY }io$gd' yF!GG^B(B8mLqF,ڗh7VϪ|GF!sN fw\_~[. 8}RXr=#s?#-Rf2 ) }˗ֺ!dۘk$Jyn!B:.-=]}MR^sOZ9EݝH"I>E*5BM($_]88[M L'VltMgG_|a{A]B< 0* 8 Q7kOP&t,vHc lko/eGm-،4qޕ(R8s!!|5[Ix>߶3Bɐf$x#_gH!y($4dHt$gSܹcg<4vI{QAʎ/Aή 1:ŎqvE" m:}Ԅ"x6"ZÆi Ɛm㹻11dB! CAߴ"*^Kz8Ls6&9F$2HpjCBH;dL#?1*g#%^ElƍLcwjcwHNcF;}`~ԽiMH8֋>Vc^q~cbf% D󍨍kBH1)l#66鹤ɞOR^ke)N0r($#4$^8-|QHuO9 2K*aD⣏|ujr6gMm]m-K I\ =[Ph'B} u=I6~ QH/iH%Gyc?!>LR' .V<GvR 4R2UCqH>GYR K` 5vOɹQDR&Fq»y]Er?IT)HЁ8V䘳8 ]b^sis|d:@H.Ǥ7"aR=B!mXpthD4*/m>Ka@rE$G+ՅB!$ zo\MkvRzlC*hdN'AE҅(6~G\M;H>1)|/<"d"j}x^nWHvԓOH* 藍}K$#Ŏ:#TD" 0&tq tv5<'~ }/KLƸDQcLL!- 5;r'h Jm}w3.ɍDrk!>1[)J B!$N 7MO I"Rs{,)؉O7`A] `%8I M+Ry%QACX(Cԋ>G$͂0W3n52jHv'Ħ:cB!cđ$(q+bRR$8έ!I7 b "?FB!Mc H%ֽZ+_]Q#8#IJ>̮HeM[2sǻlbހ(],ptI$p}Uwޖ(lP#HX#B2b{o7xq"S3iz,R=$;ZȎ@E!L 4}PH" f̌q٥E(b搢Cړ¶>OG$H]g%vE*R r;>@]Kks8QQkjb&X\g#!F개|O@rEH"ݲ H$gbR &^ed&R+ng}I##+uy#-/]IDG/ NH (VvF*'z B]^/H3M?!b昑( RHhZ ""1e$!=>g`A))dMAY 4sx~C5tXv;R\_1}!TYȣVģ4v&$!ϋ= `i!6 1)tNA_#r oesbv]+P6X!Bb TFѸNA7O4r%H$)A=y~4aUiD KC<2HiG.)BH^""sOXHN2>W0Ϡ>eBi # N<.IH< i$_[!RG_Yu.ξuץiTۺ4rk$t+ShD!JB $9]RTqU҅]Hy0 *zG R=M?c ~?G<.QMvE b^(  m]HxtW.S)!uq>'r>ww.g##h;߭yoK$&B#ͦKLZCe ApӈDPkq놌 $ s5Mׅi[! Si >㊺H܁[:~!B!@JJ]W(N@r>X$^lDm#cLY۷qϹ~G)_~Hrd! ii$f,,e_|n]^E&a~:MGK. umH:H!>qJP {h"PK6îhHWe* 'ҭ";af"{WGB1BHԧHJ['|:3F',Mޗ!Mb~#BȠak&RW)I%]7wSg-yZ6wm3AcXp u|nnKRٽfD`ˮJCDg C ]v !` HiQZQIIIWsii }}:I$!IKcW.MHE!_N]Hr] ء;%tVi[ d0DξEa2v66? 3B)Ӣl\Ǟ?NW'ud5߳YD8ҢR2esBWqŚ44mӂČy"Q <=HSGml Gl? -Na+N@ |MNBbq4.}]HפԨy`[A i ģ"AsR>ZuNXcw ucD1vI.Gl4kkev񲴴N $' HiQZQ0!gZK1(δjΥG/*SJ J+:"y2"-\]E)@#FhDX 5o8Jň>H >} }E=TB(Yܨ"wqo RbH yIPTu4!;ǥHzDoK'u2t Kݐ8lZ}< Q I6 x ",} :^Gm8;aBE萤GeʩǥKڝ.kg]BHRk#%[QҼIpLcF.]ƈ>fWdNyUk?}n5 "9p_hc #1!b;y^#-X%20T"q'L~`ԬXNIr0d,/BȠ- /}]3GwEppa'ftҐnea® Dޕ. yc:ݓ}??B2pTC@zŮ( a{/loK$O D):XG!=[$ىwsI\6Rp:[!Rɝ㴔uZH>1EpJ{p/:O% E"3݋pJ1:-98- 3dm8_u*\0O#E'"!"lr!2ThR(nl5[#RoC)ɎF23sN\DRFlHP")^A !AޢDbLa|{(LX0 )NNHD(%)H@+\WB[$-M(lG:N,mz^ `GA{>-q;p|5HhQ" _ID HA50\~9_,`"2 $`-Uc:feBG*p҉GRרBKЧM!Rx\$ָ(XWHjD. i !KN)ueLg{2p2WD9k!GSB*&X#Ef'rB%繠$:(BN3B+E!-(޷]‘{-l xLz>wıhBOLW "솾8D`sl1^C6}n51lD!o /&՚W<~&!(4ɼGREA ga{e^:nw70(oFtB;:[v6ðRq|nخ;r Rڡ>6<$GFgR=.A!2KCDR¼.X彰}H:)ZߍM_"?y슖$SyHD| ~!>Z:4"B)n 8$/"ol*;E:B KBִα^E~xR- rfw *D(\ֹ$1=FHPXnjBHI$MF!XzAh#7e]{YP\eɉu[M$u w\`O }yt<û5hE)? %eH]aJ;B!@hD!DRziQHi)Z=ُL|)MF6dѹ̑6_`^|-1s qQxQ#/*m]kpA"DQfB!$ov.!\fRڹi'l )8Qb1ӺGݰ +2s"Qz'cHHH$_:e Ҿ0 D)=-H;k+נ}%JGZVBrCźOBH;ERۥgݳh^MwŨ##F%J)3ˮh " l3}]:?JM¢( `"ޕHF|tG-u/LvLY]BGT^+N!6IQ8"rQq'Hog ga{6 H1nh D>be#NtࠡCAMజ H,g Q$[BOޯcDaPD~>l_DN6>8Ȓze ?iH !9. rs|QF$7 JBi$$O`w ^M]/;Ly *o0oXiDgp?`wk|ER}F"=8hy= ְ+ GoǬ b/m0BBZ!. #'BB"8 ;O `p'5 <FfO` ivE Do1.ޓ("k15#Y؝~ Gv ૵}?pMzĄ%r#nOKE|#&C#3fMfBˆ4 \B"`?Y`c"Z14ztSlD"wZ*!ErZcs[uM2tdBJpR%MUQ˺xĨ#G.t]/%_#c/ Hs7ҋ2s!>v^o |vWmHe9lῒ|GjOA522r|ɈBip?H$"u}vDʘ.MTd^+NϡvC*pR@ pݯ.7u GMmiEZF6V;a}/Z.OЛǥR]z}OjGGG?755-phpZ^^j*'''oёjkxσ gGGG&&&W^UfBH'D! CTtE#aq2bg!b ț:'9wu03zu0, P .nk1OH9HsG(BᑎeH]tdˈBZ널9(h-v-l?djjuNQ;wDc>mib"+W~off滖)A!t $3332==J.iCS1))⭮/,..x?̺x`NuB! I<82aðEc%"v:\Z3c"RE:pxR@<` #1/a>75@/J$<2z-OHCL*"7$JYfuׯ_w 0&\zUݻwMI?,--}/BH+0BH1>qs+҈:b:/$@"́Dco$! lHLcwqk^"!iA2[/ul!74ģ1]OHq6DoNASe қMY__jկ/^\pyy !$. &nGr| |?B R]94H\^s֟Ɓ;] 'Lk=E-$ YPSj3?0)>i?ψG###r yG.o" ~:xۼ\!YD![οgNޟ^Z5{Ĉ`BSN]b AҚ0@8W%!E siD)ݐrP~XH{9 )ɕ+W2>^=8BTǏ !$ !tø=E(v69ZG'[\\A\Cj8^~-O>w?\ZZcB BH@*8%<&$O+슖X(}%9L "bpa4^BϾ'QI0CO-c&l755}qFe=HZVKKKGN"BH'ihvf#Q\"ݵkDqǁL E9ίyģyHX$JEk( l-g6]6CHiw֭غHZYHB:A Nq:!(u(i~"&H;q~Q:.enk!v !_ Ci&+6A}DR?˗/!lS >X{bD!S@,scFA}HwLhXѕYT$x %vޛIuoDgUVemnw݀"h*"ิ4(:"㾌0>nݶ,}}眪'O'"N}"223g xռt0hǵiwOl.--]d}p`=-?*GM\GQ@7ZMĒģ}RQ ?I@!;h5HPMR5zTR2H@Z5@rH}G+9 sq[\S8;W\y*YݼyikkvvvRXrHrQ;a@u_pqTt&~5{1s.&ICKvL2%0@ko atl7ωf8D FlpگNLLƍ 4>hmm-wxxE64nQQE77 4/@c4Y>~ ة\[7Hu8}ټi; Z`2qrC$ZTuvlloܺue>> {7ްrj~Hobn`@/ݢ*iElڝe^#Z6F:pd-|jIkF̐ .~gee݅B^m}@"H5L>=62]ֽpiFw[A D۷Zg9ڶL*GynÅ.^*}477c tb®_=n_ d @'# eH7R6rRA@jMF@&r6DP H8lWX}Ev) /k.2 ˟C쬭į{I\.@@@Ge3n7>U#&#'V"T. \H*c )4[x4@{.>j^Y[C[?^s1^t'fffsbyy&$ET*O%A3C`H.H}pyuH29DY =S~.?.>i"zzZ<::rm.X<;;r1QTꓣ2g.]:va>ye ?gX*:{y||禧q k׮oan8J|kX?$S zB My%;^0!⑋3R*E#D1i4;. 5)&X4JBf/X5AT_xrr.b4|_BԔ''U ʁtůAX\|[*^\vytŁ@"қoy{w'Sف5`XDVΒĐV%Q{H_JUnssnu鷻u2 `PKE_H븁V$ZVRu@B@6*c(' u&2vHGyNą߿ǟ}zzzα)`nnF1WX,~{R陽ŽvR|}$ʊhfccgGsTf❣4j}@*ZFZK͖92zپyVIE"h_}TƮL:ꃴa^QM_ʹ5N€'dB7VjÇkg|>_). 7eRΕ+Wj*ʳTsT!K u7\P|3 [+HE}Dٖ$h_xꟿ)=ʡJJHM Dt9Tm MX[[{vvvArM8sn}jcc;;;+333_~,6H0䌉D{8`GX>sB+OHP]=\#Q[k0$\~UCD.~ڷw3Yj /`$ zJ\YĽ=\00Y&DE\dq1I*:F%>t]ghߣQ{h"4@C!ѱϓ  r#qi{{-r3 &'Ν;I}\r9[X8_-Pe~ m/͘"Qhd ~?4Fo:CF0C$JAM..i90j/bT*Wkq*A *c[ h`E2u8~5 ! b?`7Hg񶨚' UHD2vJh[1\0xtW_v(KG>okk[̳ܽpeeŮ]Vs^;::[,) 0p n#XGB1) Z(=k@@ A%5?E%z( H.>f)/p̞%O#3 z%Z1|vYdy3xcf{vHgyiT$ze[ G+{<Ǐ?{oo0r]~V`h? ;NNNKfF$H8gYFh%$ ĤL׍uݢɛ{FnQ#\pq~ aCMHr?k9GO96ODZJ߿+Iz*0B`Ͼ.XaSZs'Ec܏ch]ԍԒ+|hQ;W7&fG8Q0i]& B*E} 㱿ONN0:d!LOO?{^.肀ݐZ\ɺy=P=GzHu]IICƩtnu=R #4@-Hzz) yІ?~6>>' &" 龚z# 1$A. EaHg=O9gc%H}=gU^ "r9F&:^ >~ℤw&E]JsAH=6TSᮋER CfHC AȱsMY#4IXXE!"r[[[ޮ8W%RZH4Md.W+}&QD$ > d`4A@v1k|]yFQᨙx?S"R=Q^F$tsü .'4g09$n2[>:ϟh Hk. 6Ik얋C)Fk[+iӧrrrk.]ދtl_Hd8́Gn4OFFX'ȁ< HQab'xS;/"E]1),"k@]! i`utXq-|=R(s?)94^c hLԿgtR҃poo_ۆ${vf;;;5($"Ԑh~~]ǣׇ(J#bC gqHV#M[Eq?ѩ=.V Dp 81)]II}EuuݣOHCcyClC 'q(rQ Ḇeɿxcww-wï-//MB2ڪ;7ZDՁ- @fnb:%9 ^D8b~/Z: E. Ia)*ŕ'&!$ Sj~Rt7dr4ν8}gmDԆך)'J&moo=ilnnhT=B$d$h)5*\ ju/KikT<3kMLj]XL Iq@H?Za~(-Au["q%@'H@Ё,|0n,6ȉE o }u'~MrzzjRu^k]">M]BI{aj@ļOℤ3k\ޮRTD z+or:*]7A*F e}#Ό2Y9wYdYk,8aB7q[],YET*N r- H1<K/'o{℣FnVEVŤV(^VsH}?ݡHE6gL`wBI vN$\H*{1 Cߏ닺/[~nk9y&''Sب ;&&&j<{<6O#V_].nrAc͏\|G $膸2vQ)BF$qx IDŋIc7gGo4l=K:pAwȁł#/I46ӄ#8qvGHzJ=}&"= 4errrgii7~U=Eŏ# 0Y$<-[)깎 ILAE?6*oױpհgUyhG}=_q qw:EC_10lTJVXszg뵲urq^-ݖͽ6;`̽KQ;TiOx$zΣykr' {"5Z}Iv6H&y;W7Rw)ժ>CX!]yС7H& qs>h5I8I% BT*Œ?ԓrGGG2 $ Fkkk~27gW^BИ=S:&Br#敿.[}=,sţv[F̈́8Q)\.J Hg^i(:GHC"hQ&ys! Axlc17YV/0tJb=f-Yѹ:pr٩$RqZn8בHz JjJ;Z_w\=pnbSrMhQ'R!xQF_#yycv~HLs#N|? ovCpz+q#Ʉ{x9vGOHCO>;G:BV$H Hi?cRbkz$""~ƅD_{QMD ;D‘=Hf[$IF";vjJ/>/Wގ@ @7D{5*17_qO3f>Ĥ8GR# K4f{& bq#uV9߲6hMi)3[SNUoPWxj4%rwiQ.$zJZXMbvrr;ӧq5M߸q^GE#z\۫=O]5ttK<.@< ĥQ1)**Ĥf%ZXOD ^nS{^v`ŤG;#)FRj.+]n5oICG$ur\3sr;?ZBM\+0ԔJ%'DNfʯ\/굀<r5H=E}T~n`?V%MݭWwb?SlΚ ^G DH^AqbR7BR+#'vQD:"RZw$hI;Hq V;yOgr퓊s: z͞:F\|pˆP*+5yi[tU*7FM y~G{ׯ_>TH7p5BVWW˵R;;;qB{\>*0@ @RĕB IqR {~fRĸZrvQ!iΗ FBRn HK _?E7^>I @q?E3)NPj]F FQ)RTHJN"R_ݣLΣ'_2+II*K:`P_buqŚHnޗqr\H< xBe%M@ vݾ}۶ɓ'ѲvZ(]{/h 7 %¿W-ΙWBRؕGRXHH#KՋptbHBR]ԍ &ڑu#I_=0An%n'~$pɹO?6s!11#/"=Q_"R?yFN #*YZZY{a鏻댞 v"q<"DAE",Lb2Sc&8L13 b:w&C2`[XpbF(g¡#5M*ƄW(@/,Қ! u.%aDd^?PYrcDE=Q>G }tnTf[{sb^@$iJiXg±pO~&ݻw=e~S% HüI`UG!DR=Sx rR!U1)gLQbyT GAiꕰ>'$EzNJLV=F/A9:*c'̪#I,QFRT7Y,%"{r燄zXr VVMݼy|ͨ]Ix0@4J}/*];2qqN LO_q*ӑ =1zy}& Dd{U#)㳒vCn+"pQn1!4@Γ:Gr^]02J%9>l{llu%ZeccϽV(ڵk$za-_waHS?j^9J0H>Zq&5*qJW.p|ip7s,^ivRv>~xrrrΙܮGI˵u@"樕JT?'|Iq\>u:aYzepipehT.Z.rvڅŕr FٹmZ0Lɡ)*_wF*9]IfHO9$ =Cc\!kJ%]>966ZNNZI<:;;?SaEޞZ\IaGB\>onif~VyJAO$ꒀdRrhc x4A:F-sot-T8 H8{7V?dO~X}NOO-09:j^BQt&)]d{{.]}-,,V!T"s 0jH3qNԑ®FeEDCD.hPN$w)=n z&{E H?Acd]5kH</ԯkz:׹m)#)x=:(yQ#*{:m>mJhRDrOۣu쪉hhRBw蜆 ΝOs..HdΑ^yii677\./J_5 Ks%H }-,"&5{=~9k )W6Ku%CJ17xr9ʤp*Y[9E4.kaX,{\|/Q xvBI: H2r&mll\} Msss|73xqqC@ Y$*$5F"R\IFBR+ѨOSxRf|J\1Vv'{k# 3# # =IU=C7kbtWY.Hrwȕegg/ߜքL^kBnX.nϞY[2ўGfE3`Im>o65HI7ܷɠ7G[b^0&8t~.@"$ ʫ!=2$H1b7W̌bՐc~k(Jg]8h&'k/eVv% +kW.\.x1)**rmY2vOw/Fɚ1ព5C10h4"HCt,Q,?=|KWCg}>B!D@2wZ$M./$4s#<6r(5Re7ɽϸyj%&9%T@9cpBuHE(Y-X,>l7==]+5׾=+%ԩʼnEqSf D~ߒdR#'>9 hfg4tGGR' a7hL.I X,j{]q=CBZܘBy;̇}C8H>7 d$xBR7n3k,s%ꗱ{_*1?~Wmt]uVCґTtJ (~zΙ4cb{.~c$j҅&p!ǏùJ 1D"R#Qⶹ"R'TU*]w])Q4.QzP)&Ddm$H 5{ɿfCos1@'R?y5 =@1}HBSSSvtt~y B&@@ha ?vF{%#5*aɘdڮ I?oު[MCr#IHr(P({Nد!E蚨+VgҼ&*cG/$~Yz5ceeV. )L~P!I%!3Z]7R]Fg Nn\zĕ /?)"]yhA=džBܞ +t9kz#.l166fKKKYgTjnHڣ7RB ?OG~G!njnEDr?#ǑGWm@:G}&歈WE=P mhOޡ粱@z357]zGN7NIChbq$obzI[(ߏ[@RM\E҇ m2I@_)*"u2Aikk^k.n+&赱F*R9c9 N  ypzܤ_^#G) d@hEDK[|zfbR1I6 6?}([{+ D ;Yޢƒ""Ņ(YCRY E nWDjQTvHxmi^_Hl]?{45-п`8{ʹy.$Y5mhN$1TN%  3%H!/RN$ ~;bRTT{=6^vq:/ѤzQ!h0G#C0AbV3O:z*+cM _j'''''R~n3 `pt#">ڍ+I"z1o<f\H]ޓ[uL@=+8a]5~q%Ù ylhx$p| HcccONO1C6@@,:睔;ipŊAЌ"*t-Ǥ 2v%$~t@4>-Cs ݔ^|>:ـ,`iEDU ݉s$I8!*V_8D数3s!| ]vùԪ+6D`HI  _ A3IQUI;:V+1ۋ =90Yd, #˳p!b<.@+}U(l||O }ܱAY =+"U<6buT\hۏ:r=4ωÁzMD8b߇!w'lLh^/1 ;]}68΁41 o>.,,|`c E"R]!scΣzN$4as[gv^Ċ@ oKQ>>!Cyqv0L'ϡ! =!~mpir@ ߩ'y H飙)xlY~F5/(@؊ gc{.A H~`x҆NTQ/$b|?w^GHqNLL烃 4C*E(,E3kMDH6(D,mE;.vIP!i4$'3`ѵQ}]&=GV# A0Nar:@9:: l@@o"1q>PL6 U+[p"f:HhHʤc5U%#CO e)rP >/' $z  H8=YXX7d$"*-c 'dI),fYyQ =\h7JU%H0mޢ GcD $rH+gggcwnnJ8!&IT=WήQ s ^~\兩m6̚ya H Ha'gbm16Z񯡯=ö2> fGXY 4C9]՘̪ I&NaE;8 CC#rR/2RP|>' RvwwU *HG"R؅qAп!,2E)B:r ½y#&Mϐd1ic?߯s}LR HMH+*_d pN?@Ds'"1$ZX< Jɇ?Z.u&ICbc`5Q%$fL qyaIG8ǩC @z~d<CNŝL]׬(yB"ϣne$2P3k,JS?F H꓀?huYdo1)|xx*#@ \zQXDc H(RI'(B}'E1+h=cUc`4$~l (ݱhȅtȓaj GdggU `y|'$I?QT/ tut(G" "A;z|? [<{.k0p~qss04ФxT cNU (c~&ɡiG#({}HW/iR)>1$ԡz_yrrB: 0jHEgRXD*Zg 6pٺJ(.jdm‰yb7-G?  et Pi%e"9IGfذmJm |E2`8Ffe u"\Ү y4qxߘ$1cD9؀ PH:S).i83 ARvׁ>!ʼnJq"TXD5VaEe$1q8y YT4shXHҒeT.}h؎h:H?x/i\HHHL:ruQkѤqn82h?5zi$}Y`@Dl3M"@:=E_u. &z +iר]|]vHaMD$&G% Z='!kE%VsKòQ @!Ө/RjIHfBRu,ר1b4$fʎHd Gs"Arqp!ed5ĕVYSG784 `tW.Z=RDs!xhC2qm!Qt A]Rw^H0hðTZ.>h $lҪ ^9z%QYToMv#Ę9Y4K YC.]]yB>eCXU R6 LҨR8P2vq%횕 Tm2vZUȘEDGɣcR5BZUeURJF }0W E 2K#R)*&@jEDÈU2h3!q@@,"B7:r> A72ZO yc.>}HO.8Q3(N0' <d T!E1ώ2v ߑ<驝0̿t.q'@w d(.ĤF5xv4KFG9QҔ9f + )+|_JNMM]xmSum\p.ś|݃ J1, Ahyl$E{"EgP 5b}ʮ5hq4$$=@ x_.U`􏳯D@?>~5ϑ4DtN?G HPuW..#)*${4e&G% ]'2VzK@!}G# HS"a-iݸqOAx#\.]|xG.E?0$@vhDž-_WOH#>HTN$>mI^P[=z!.?K̜XTp!A?|=}~|ȼ i]^w]D2@ "Ni$$A:bRwBWw~"1 >}4AGM4@1 In<?=F)v)i۸i;bj!or.StO\| CTɅnߋ HG׵:݃B}tmn^UHf5isM+E{pe_⿸ :j'=VW|ş=!.>/&I4#?xy&#@@@0QQ @(i',EEzej煭4aɣȘS<RQ .s> \\JFMLLؘUH< iaaO zy~Ef.>]KE5:wOx< Пc<HH$kz.4Vs =KxDe>*dn<{J@<** qu0heÅUNKw_f\,455h{{*eH8Lc; I|Ɂqe좯/s"Z.߶nOA7L$ H̄\d@xEe.R*~=|6,..^xMӧ C!1~*tݞc 8H*gT(< (Jo]駹Q= l~~>{| )2LjVwa lk"$*X|8S~p`Q.,7=C)ihȎ`vXJ҇]nJa}p2˱t?'sؽHó{Kci "N BDoywܝgMΐI,=cD.$J]V 4T*q_꾼Be~ļ]bšp\?!Rvqj̍4 tZmg9 I 2[YeʿѤ! %5WɔJMcbqq.>v߳P(=}zqޮIfMy 0SQ. H6VzV;W+hr[yf32@h,ׯ?Yvq<~T2RI %>dIb^r6g1Ji7Kwvvn Ǐ۝;wb]J!~Ш|kD$͏>9:OZq!߳ u:VgDɢޠ q$֯Ir4Ҡ Ie# RI.f$͙tVWs,DWR):QnGRTGFω,#h4/" k’1gdww;^Ύ$C# m!˼v,*`r-N9qzk4I'Qo2P! Iem=!LNN'NJɏ=rL ʿvI:KDkH@@Ns5+gW.=GF#VO!.cg`h00?277q߫T*Caa=yH`PD ts\F#W5xS/Hwݬ H㤡gH@Ǎ&OH;u oXI=k$"6ύtt@A@Vi& Efr1z"R/x0e\3T }qAKF;0uommz"A)" Hb 3@Jŕ|/*ʼnJykO)wp`蔏9h9)zo31 sdnnjjn$,HCO9  Z|=Z.W @q=j$Vy%)@giT%A0bӧO?q߫V+ћ3\p~hidq0 "<+eg1cֺ &T,7gk#h˿nQrpȩ*iT^p޽{Vp?/2,k<*czBR*X A1R3$sTR3R1P2vVWW377W螞֜HJHtqEt@VnQԊԬ5^<1}LZI8o4G%* ;T4 BZq1C*`ДJY=|D>okƢ~{\-*xy%.@&vzzZ~2t+K1 Q9Y34! @ׯ *UD$Q`<|paa333q۳Ǐe_2 Y‘Jڽl^S2@?o&E{LjT֮4|Bi;ݡr }ȱz<7y˗?ezzz7;;;FF. ]n(fU :FNfn^=mgD`/p{Di.8  ._ooo#"*=.>J*RuOq]5J 9rFT4j,YI$mB1wH@BH_T&EUI{_]]-m}idb⿓Tr"ż̹ IP]uR{fލnUGF+{K Qv,`tɘOkz%"iyo)Rj/0/ `$`ЬoQW+~!D)S @Hf^Ġ @ޢGLt${L隆0;X4lX!JK.}իWP(\JYR!YÁiGzx%%0;4@; uu޿z7JhA)r D\*c7F* mJǏڵkxjjRtxxho񆝞2DN9;.%C{kDI;ZہqFe|n&,CUcbЄ+{$8$ˉm;&\5ODbBRލ7>}qqxXDN.>F*I7+iGJЁj/ĕk~LhzݼG,8ry7@o-A҄pt %D$&!?;?-i2v߷m.>[ ;O"m>0T;0@4+/@fF}мfqozz! $D#5Ҍ/"H,HTS*v?~[nwnnBoµZ@*x=txƼ< v"dVbieS>hH-r_c@ DO~yODHr!ݻwh]8 o;FQG%nxÉC4#׃uP!wJA,sbLnCa|-0/߾}ϹsnCLE?.=Ե㲋\LH 4@/i}vhZ7Ozģ2i6Ri 腄RtkW͛?;99{r /ғ'OHT럺.̑*gWҾ\D?%c']+"6C^f)rɑ2*wH59HRך"ZW6Ѝz&I@*dM4>S*& 3J%V,BEZ*UICL}V,Ǔ-йcOH|ɿy= ڹ ?q?W~ݔj2f@*_W =?NhŮQ3-,Xv( T*s߯(B𩇇_\.|DIg~q.ϑ$^i"-[.*ew<Fu!H qOT4j2j$DEZ jp 004>H.p\MJ]:2OTҸt‡<رI;or>?zpܶ,+]@BHQ"}ka,R4 8_ݻweoopv >6=Ve)çd$Ga}m6ɩ.үKH0-Æs5VzS兑}ӣ@ed_tF C@ )xBYzѣGHZ%ĪIj>.?|cm<{n_S[, \VV22eyw.x`n N_GCDS0l入[ ̂LV ⑀($6lYTFew0^}gtYa1)^&2GE4̊ pȹ deNn $jYT3[?QD{VHw -f`.%(~\Ld/6}D E2m e  ON,$BRfb;յhNZ8ld*ko93jd)Ô? :rrϥxÿuN9U`]3nK@D v/s5gQo47S  @{pؤ ` ӐrtuYJhh8 Z q9 );f^8{>φPH@#e!yn%pX\,xÆǛѕĢxQ^òrȵ} 3@Q[7B7ZHCBp56&LqQn%KHCCLX7rcJ Fa6ukeުV?EVsn4cKRMvwE^?r`tYiZBjo$$j r>g?1]G{(0q\ElqŪzHh^ڿGKoVeihԮ%r1 V-+Jj]nv2;) vDZ=$  Gc'Ρ (>3?%YYIDcԚ]+a懒c8k gxmζ.gc?RMZQ 1n 5 2, ;XwWGt ,>y6u#Iڰ'}e=08 &I R$%ބN.hPxH fU ɶ6L6oHh'(}hg! Qǣ*t 8|]$oUCY f]%}=,ax>?]qZ)0"뺷y1b":wAF-$V۬ ^s=F򓔒L,..&!(,>eGKg&s}ru7@Su( Lx;n F ? zHjxK[Ưu^- k"Yphbqgܺnx0B`M]TSG[$2p+A/9.tҝܹ{vݵ7F3f ցd@@V Hc"`)ytv aw 귣vذc4P-mמ9[݆߰T3N Jfe) 8[?*eυ6vӢBoCC@XF4KA7Pk[t޹yp 2DYܼ?Ve_$ >fNH)(3KIfeA)Eqh8kؚ:>kc|.VrvLm# #`)]%V uo,5j@c7~#9w7z3|Ec\fe^=DVْSd ,$c)}4GPX7$eEYH f])]\c# tsl$Y~;TQ=sn HB(tZANLb pzbg8^5-,$is놅CvX~w5,:wwy|T I.53E<cُnQdMDl ɦ;m]6Rά,(gzkyȏ`flR5cM[D#8-FE\C9oV\ιxt}O\gH<dHpqUu-w ţXPJFHUPʉI%!  t }]F` ]ZmP C@樽1Bh-~7j_Y Ƴ n5rf 慢&HqVұ̚ J]깐X0=uuMRH LsX00=儢8g&sscKg Q a::цtEP7]Fk;mHx߸k@l XwH>Φ5 ^JB"4+eBxtOI<hl2muˏBR7v:n~!"I#uc "-g mfZ]&o}+[%,r%˻D$zfE!\=8|##Y.CcG<;%ϸnUMee@gn|Q&2\q x|my{'&MbiBQ-rv ch`v`<FDsǧ #Q-۷ YZԡoCw $NFFviԓQvد%'>ʂ;ĂM"ѭ瞺8kQ H91)I%^ -4I1oJHq# GQ(JD$K{nhq`Hoႀ=C'2-5-@nM/1i?"[2Fd=@a53MeڳT'"6ƎEB?>k*t nX%Gw56(h(Kst D(,XeM+kn-s҆Djji~`yQ* E#w9Q L,ŷt/kem,K[I0|G7Gn us(!IZH\h!X޵ʲ dÍuʄf'Ʀ,mI4(+=%A)qݦI=^$$m\Ql[v.+thG 4 Ѕw:yqn%B˸Ubڰ@Bzn*MU# Dс(6lbA)az7fp9 NNSu9(eaw&vl}f!a_gh#cʉCMd(+3[/AXHu Gd!~>JG$)o죜}],!$4hNw]C@X=48λՈP K<|o0@iʊ>~3_ϖ;iKQ]Q+\R⑿B!(%09&控D:(ʞRIAsoXI*_ܘ~$|R0,1ZrkVe*)8[]Ȣ[;7܉;@4TQxţa0!m]ʾ#1?ƷGaōRvA9"йkX=ݸ KtGиZHvX9[vk"⾻DaҴD3],mX8ڶ0ƒԋ~4xD)hDll]פu0/ i1`e-閑Ew`5r٭)%yr,%k:g ֳ,M]#myt~R/nImhd O*(ea<[V}4fBu6 gs  ru;\t+,?Z33lT! 3B'%)x{6)e^rF)Xb1;mюsF( WE翌tou BV£6T ~4!,$Ɓ;` >G}V}F3xx>TIu 0'|apŒY^TJ H9Q)xfAj2ޣ|8s*B}3KQl'u2ocLj~* ɿ_I8"; Vq]z.(U7'HR9lܽ^:h2l3]8I{kn7QL?١UN [Uȣ:_^ZNNejN|<%$bf!#oyţϿ. m"7fn$I(VD̺0`Y ܩy՝Dq[n֨XE*1 RH'-fn9Dnz[l$]J4 G8Uj}|j#xP /6afR/*L9(}j}7iu}]}ՉG[G|@7,/yYy$GUBVv_r*x..pŭUI"6Zb[R'.-t|6P%T' mFN  WhiK߸:RRGa-$"ģ\R,h.w((}%:٢ݼHD 4$XmZ75 7>wH/ ŋrt\ 8XJ^, H씲8(}ԏK0R.(qhGKg!!$,hwc} $uC6(6k"BzakvZeWB"]pU!~] 2xrIm( FJPw:5^)@#; V\ݡ8(M5$y HuQi;t80#:-;b"&]cW[o*(!KZg.T #gu>8#m䅣PD BdXX t8% 2-Y#dG]JvfdhJa,`s:΢$ce,cԯ%Ī%jk 8d6iO˼sz(HqpmF5B,#ÚRM,G^ R֑Q.e_l>i&>^@|XO4'P-\;  9f5v&#oaf!Bz7vRXb,}=q&ಮӮTQGd4E@ uÚ18[%ɶQ.XZu8tXO4+ehؽ:U%Ӫ UPB>?cq^">zS0tndgOle[,~l#w#`hb]glF)CMo$GGV>¾v_k=OwtBsd!:kw] -P*1Vebi5b[XD K|0ec|`k] -r}I4v2[7[a'>ţTcKי碱zk\cαn,nn8ZQe6ܸ,ާҰNrqa`ɮخ.=r_&\{hKuuQߍ4udYsѨHPe7,-b=t)`̂\OʼnIż(IcHrcwh ZHj]7zЍ{6y G@"=oݱ3a~םtD7Z_Mͮ{Xg}l55`~t|x:RYH8MwJOZYH"@u]}H鳏b\Qi%2 C>cp4=7n^+`UHHYڷټgTG醥$%x͎2k&k$mZR/@ufXnku]Q:`ޓaa\<^_kC7Ql>ch=[ܠ[60~mYY[B|pgcA(F껉 n}`k&[8+V^9s. )Oc:/)hQ}Nn !ŎaóHm4kXt_ 閛XctŪW% P]zUqg!`,ױ;ѵkwXmˋHAρppssu]<XE#7z;TQ}]*Ɍ#ކgXG:ќͨ]p 6ޱF!ufƮ[  Z%"[M(BC349OQ6vqR/hg3CLc8s 79Ժ.nxwc E &Qξ.WgkG0a3HAe1T6v\y[UoD, JUġ-iR(⑂Z޳WYD; 3 H^DHA٤]rH 8t1Dt53;?e}TRGa}u ǜG#ј/ABBuӜwK#D7V\tH+/"m-Me!U6Ţ񭠅䅪8 `qbrV908>Ba Fa֑7qMX<:t8(e_dhbCFD٢}4ko ?&V(!mAV.R,ApN\Ml[:ワ0 FaR|Q4r$X&2=YU)˸RQʂnMvB(} QGY:q9 u}uF;e75淺&>wk܇VHgP.ϯ6o [ >A}P .dtU|Cw?ece!j! ò uv̼gr.=Je Cq,gEl*(}Է \ G0#^@ڦ+fh3\Cd]WccAecխqUI;P֨_*v/B>v̍IENDB`images-actives-html5.git/src/share/themes/audioBrown/img/unlock-icon.png000066400000000000000000000027371250410645000265700ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs  tIME PYlIDATX͙MlTUδ}W@hmB"q1@pB|$b\;\3*4q&4AP"ĝPBCD0kZδvyseSս7ss=3 Sjl6y /+D!:C} @:L<M$e>b 8Wk)97e5;ùSZs<|`y5ɝ~uN/djä ̓U`94ɡ]/tmc$%%^3$iL;7qBy ە^Hp.?*hk!7j^*DS4tv2OK)>,/;*+෿Fi#>z$]+/\f4%i(&LrwjCg1gゥұJ9= @B[_A&`&[FNI UKt YS9>7Xz\"$RD 6fS&~4rq^XYi* 28O"u>WPZ{80n~%.U_ |ɦc( ڊ/?#M%ٶMEi)xfs_'eְD^D(Qt32mYsF6̩2Z[S\ *bvQԄx1Sr)x_8۾ ,IDiZ78 \E uYSmP|ܴ ejj5Dz:: ̦M=7J$$i6׀Kt# VM`..Pd ?``A>}x; c8pL7٤Sx?Xd>(Pȋpf Jhqat\F)R1CбÝFrR.c@x4+jo ( Ms$B;% )_VLqJD MVCrF#҇JFWP@XFSYĻZ1HvT9}h ~BI t;{B/2+]?:CVg:4o^g]1eH d}!52~=NVz}!P3oXE/*U^g <3ѼEh%h%6**_zH$"F,ОO`o4.cW sd(3"r*)GP8}Eӏphb;~0c@~ ƎoNy܃O:mk{qT⩪S*C{.uW/;icgUV:)As7nxsF/@hbPiWSG7<,(M/rOCHÄٙطiιY (?L2[RC9JQ2f|.g~&ZaǜEv4#׫ bR?Ld }tUt;72{{mA 0RhCi%u׬[]v!5bʹ{[ݔ[D5+ 3Anlu/s$(yU~4E,fɍ뉴48j=%Sx~8 ۰N X9( ͣC泤Gj8kLN;Bw#uն}`eakffՖ̎7ۋt fmW`5a}$Ny4Z_H;8HA)LC؁uPF˯wzg5PJQ2Df|VsTի:]o&ڀ(q '_-Np007&TbX |'^\yA{,B!=~uӻuަ{Ë4^$zSr<520^vc/ ]Oe[J_)e,.-{FQ o,C5>ƶd`Xi@S((R4#]iPH/t00lF[wҶ)y*}xU ]_A%p!ʔTg~N#-`˃Ξ'2nj|㔆l#Tʪ$/UVwz!ס(=rsSTBjh":^{]ް53uS:oM`'z@ JmģL:3ԯiF [ﺄHQ7r2vXXcv#Ic>r<ӨW:+KkŖ.ŌGRJ|po)oU-)}yKKۭ)`>K&f)O4^|+S @m7ߏ.JD"R/O 8颱uW}_Es&M}x8=9jIdzoұV_|N% d)YrtSK ˾ j Ȉ=وg~ʎZh=U LYrcM4? uU6^'ιj/pi8DP ~0k#HЧ KC婟ϯ5 <}Heq#Ys)RIE?D+(aP0u.Yo2[{dG/07+wCv(E˙[ ǎ`Ɛpk@Jkn^Vᩘj26B\ ̡LS0ReHF9M*]b]t,If">nd`{ )>xʎ9 ǝpyB, J|augUT=#1Jezhޡ$*S YɇQ?ҹ'[c JP8{c9`॔9ֿ- .$Lhv7D{1k#ft+^ZA^@ټ襕6iN 0< [# F*.@/{"ī}RZ.v0PD8PP}9HNl:[Wsn'> k">Y,b8>nf<N>`}۽{:$=;-fJ, \\C %@:+51ÈӪF }8c _k\F_*)0cD#p+t8I+2 #Ư%' D22(ׇJ>" KYd$cO:cfQ kD9[쯏: )y:aQV* E@ֱWI <m Q@ ,G`Bwc Zk6ny" lŹ4AGcflL=8/LŋcU`M9j {&m:3/Q>urIENDB`images-actives-html5.git/src/share/themes/audioBrown/img/xia128.png000066400000000000000000000130631250410645000253550ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs  tIME  $1XIDATxytՕo7yǖm"`08 LBd0p8ä-8!4K& $ Ɓ !Ѕ mUꪚ?ȲdIUBI)}nC@‘(ty<0 L2Hh0՚~1f4UgB.9b`)P!5+g4U1DqTـ \9]ܧʺa$O*˧j*5Ӏ`%p*[/.l 5U1@)6:p$z$ex@GX;Oٹ-H4ǜ mt'Wp$S{N.}qHa‘hVr۪_Jђl GiD |  < 9њ(AJ媷.J?p9KM? !cHTByKS9H B@50ٛJB`~!.MU&yVةB;QٓB94D_q+!$9 *`[@F\SOa;6_mc#An?B䎝@AHJ4Uil_h툲!̻L? AA;/fGo;a)?_-֍'Jɀox+VĮo԰$S*8܋dBD)Ñ:`'`MSd0x!$G_ 4Llǻ#atXDqJ`!pg~!^Hb'4H G!%P<qWA.{]DtsRHA,tˮ TKݿDW F.Lz`33q0>k‘9vf4 |Gd_x@@UJ%?Q!>w)nw5~!lL ūÑM@>2zg(3R?`20ɟh<٬Ҋ!aÑYs~Կ ^,=f*CHtj~{wlޔS`B8ߗ8^'7VS3Pɟ:!IIFH2$x/- Pӱ ;)ĆOu*f"!W?PHBdHtiaV$B_a_v?~dCG޹a`]!):O'obaU{SʔjNj=74u(;k1g-!wbVa Ț}z]e 䔑d<˖A Ӹᯘmej N` (9`;Q!z:3#d4o7NA{KLoh|U֐5r"e\NI"f2k~מn:7/d S4Ui>!h޺m-u2/T-opdkxz4ɟv>`M˘ʧ2})~jLFw8N7s[hs*O+%gl%in#m2v?yTߧL?)ׯDo4U'q?R;W8iE yEdh=B-dCׄILtW!u (=Oޞ"Ulh,b1^hoI狃@BNE[|D 0:Y ٿyNUwp!a3!s7D>g0NJYK0 cH`:O) 4b rQ 5iKφ#QKX fދhx71 qBr$TVA**fLӠCi޶ï=E~O Vr'bvS/!a_Q2%\Ϧ;> S 17PT5`A)F">pS&$`-ЫOP\#ǬKП6_o> 1|-#f_ocL#J)|+| !;o0zJ霋i!@OBYD8Rt<&^}?|!lM`ZRQ^gNewz|KCyklǖ KKν 9a"+h^W,9i$ӸjYN3P.ABe㆔ ';&3LY>\EZk>gU6_tb_C!CotEIr %xmM[n%ZB}q/z[8v?I: c~ 5]\“灞+ӸᕮDH2$Տ#Ax%Իƒ쑓͎vYfn wIN:s.=K@ f%`7CC7Td!ɟvQ FG;"p4ر=Kߺ(Kx*bgvh]#w-'t@l{~'$ aqIֽzk:94IS^sv4;۶(_ f;~)7Cج򉘺Em-eRx|0ts1 dSQWuMU:: R `rvg[V;ydZO+h&dę6y p2n 9zܱvoI Y󜞔%}opۙw ;T!2)Ŵo=5\Le K6#Qnr$#*(RSR5c*uV'>ޑ3DV#PXwMHEQ@*g`IՏM^- >FlNK%C;IW`k2Oei8RK >L1r5 aQ_7=ӣ2:ȝX=t6X$4U&g -w&g^ C C||`/^ p9Yf}_ACEBƒt qiۨ珎H%1bŞ)Lu}n:X-L ZAѶirqvQt>W9o {V-O/eGvBi5иlllz#Y}z~G3=iN"ف-?y[rsv۷YhIOh*x+#\TG.4|)cl{!v3J!|TMe=o |)Z*[^vB8BHlJ8#ֿvu\Te3Иi-0vɭI3:|"!ŅDl":uo?&Q4UWJs^@qxAeZ vVd)zkSJ 9~N=HhC\'8Oh?ਃ?M?XZ>SAҬY 5v?q+z1iS#1kZ7>?/ޞz s]&np¿\I=vƀ`($x-5'.dcc&\6X;C{`A\H>$jݏlzrPe* #h5Ҽ-j׮J41g1Knu/T帝`Dn4o%MGDsO`)Pwi‘J 5eeCr4t.s.sO>~MU2^S1 _Y>&eg_BzaO=1nR|*. nYϚUԬ/߃_z%T|nV~ظzExxLJϾIK t6^^|Tځ~' cC|r ];!gLʠ *4Ht!g&-?ʿ{r7|Sk{_U𿨩>hk{1Lf3ɅU?+Py3HlWSՃQj4U!N, D͚Խ:9*. 9^TNLB$LjrC{}k/gSX9BS"v7֍/"@70|v j׮ -L\۴u9iR~ν1'SZ |&AB;b]qj\+HVvlgdZTz숉܄ 亅ΤAd^>ɹ8zU+=|SH߉38e;љ4*AG A J0ִ WL⬮B iԃ,Y#T4Ak0V )}8IekqﰭtV$YxثGi$0K[m0#HZ)f_t%o#7+Ŏ:ĆRr@l;BxJ{)E)E|l_c bI~ {rpŕ@ΎT)_XkG*[2OYFJ?E/T#2*;ܻ*%_=^;b%#fs. B;iNC b%IENDB`images-actives-html5.git/src/share/themes/audioBrown/img/xia32.png000066400000000000000000000026111250410645000252640ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME  %,t٧IDATXí[lTUVJ[Jkm("3E^|A}P%j"!@A@$A0DoC,Ԋ/d Z CCzkgkmAx.8v xpn66r4`?h0K`_q&dܩNb"o6lx+S6D6,3t&*P &iWZӶ{5CO=@Ur9d/MKۧ矦{[n8@|nuD'yN ]n)Hm͚8]+{0"\quϛ֢B;5=*[ v{dmV}`opZR2pWc'2jlP-6uK5fgQ,. z!Lf:֊X1s ts/MJ1j,fn:tA]f`48z=dsBR# U0kp(f!ZѶw} !2")度17,\<<{wLWR193K49ڛCJtJӨrk$Xca2xM# bγ(-/v[K'l%p*7EdRƬ-تj3! x۹{$ z9b hm)TralE-UՎ|ұUNV5#H(Ak ī\q*7Z# 3q&,~5z*D텈mci)σԭCelAZlINr!s-*Bz8@ٜExx?l"T8PfhDCar$H3c<3B@]g}df̼C2PhvBHSc&,BJsK}ܟ4,t*4»O&MS4k):pQ>_4B2ǒ؏bPkY=@T-YE`**}tcQIVC~9hV $ֱmƌT8aA`QF\W")q MɃoO>ӱ"e+>$#Vmz\=]u_%q:#kHz7׬)s hM'=,!a.ܓ4qO_w]B-8x)ٚy{L2C@zzAcN|p7 z`|q: & F'269q7WH|IENDB`images-actives-html5.git/src/share/themes/audioBrown/img/xia48.png000066400000000000000000000046531250410645000253030ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs  tIME  %c2Y 8IDATh޽{pT?{ $( >u/[NmZ+/-UUhgtth`ŬvU¡juPƺEPcdMqMf z{!LCONFn}]U`/1 =Z跋1q`l@04X\,]Exl7 }/%(!ss]>v5 +{J =`=~b5`(< ,拱6`iDB`h+@x|(rK`* Cbԟ20u e"FϒwS_@E|,5wй`:qٱ(O lCBUiA Ν ֚ЄJsRС0x EU,LL&`th<΁}e $+(h>mM&d jv@ځu"mA G@ړe&/c)>gg%D<9 ݟw%q'B!S @04f-lٸ[BTnӁ`nifRNa$ؿnv|qLU"j*鳩MkAUǀLC՜ 9؍V᧼i>V,R慎|;bќ+q#H !ڵw^@ ~b}!v|8ZpY8zoo}ȵ Ji̺^E1(EE ogI_xtPELC?U@GW||vz۞GQS)- OM= K䯢ʱ"aȎ-XN`E3i^u?)H(=QO ? x΁m9v G(J.ȳ-9^K|M4`iEϡ/XFI UϠEAJbG:߽sWT>=̽ys1,=WEhďv1[@?k̸.ʦFZBN xBH<3,souZYmYH˚NUs;snڄnvb$i#m ;>Bܳ8i͓~7-ihU9W߰Ky(kB=7;ŎdW{oбG?v#=bې>x) u<B #?v#cEBn&_£<=s͵BR03y"áG'A2sࡌ6EA G_J;3e,Wlr޶7hUS@ ߕY 9&H!0Id2Ar ^䳗?{:_^H~1 'pw 1ʇgfFB\U";> -9o&(h*m境мz519y %;_r%vb$߷:MCo;MpЙn2NuAt}J51ijur~ԅbp0>V臻GRE@㞯oh]AyN= Пξrl, w޶H{@[(P<^j~V㩝6^eNLC7?π0 ]:AlpFۮfDgD;? `htI! q`io&eRNupy9k"zLCk!&g5/>.4 x@@x?4'rm҃+OO3Q^H B!Mn _9c"RUIWnN@g3Ҩ0 t3|B IENDB`images-actives-html5.git/src/share/themes/audioBrown/img/xia64.png000066400000000000000000000054251250410645000252770ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs  tIME  %HC IDATx͛{t?wf7@L$1Y W COe@ Le]Sh BQgc@Gf݇뗱g+avf+;T{{ϼhXoca/f$i+I_Ͷ&>;E0K ˒3'W|s=U>7({/)':Og v [MYI;) s39m;Ɯ$s|ӓU'EEEƢ4}ʧ~ j^Qfڔ.g$co߬xCKm,$8#@(iXɡ(Urc&#XQrPr>|v߄A #ޱ]՚.a&d';>&ϢlTP +B ({|8Ҳ}%].F!ޮ|{b~>K)i? +tr#߆Rgm$܌URJZF G:+*KˢF{ ˴'AO8L wryE>AdFx9%q jKPȯz@0SI/7԰뉵5j~1#au,/gKCVZ46}tQr ц j&R"Dh% 8)9yǘ?jip I)L)>?o_ֹn \жk)՝3#H+&K '?>ط - . ?m+Wm{mwF3EnŻ7p}mEF;6㳹㉵E*BUib}uRI :?6dEq_clfvk>x* s܀P2bE5S>ce4o^a?OYohӢՍ@"݀`9:hH?~coWE | {9{k'ǒyBвy;鬟)Rwrd Nееn$%#qw;LhCi2rNSyJa`d7u+/e-!3G5lF  x ;6HeRT3!,rznkOZQCVb5p=}Fե;A&gfNN,j`U-_ ZŹ+yT^>3.>׮2tmr½N!=/W~V4o7m;7mkN.+k(:>u+NDgڥ9ta 0&|~/&ڴ3ҎPT|}V$2C$C.srg}. w:Cfxza!~st ]{){CP| =MI봫 d[ ](*t|; ];㐛w /x*Xn4:tk7eQf`^]Ӽ {{TITLE}}

xia

{{LOADING}}

{{datasJS}} images-actives-html5.git/src/share/themes/audioBrown/js/000077500000000000000000000000001250410645000234705ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/audioBrown/js/hooks.js000066400000000000000000000124401250410645000251520ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @constructor init specific hooks */ function hooks() { "use strict"; } /* * @param array layers * @param iaScene mainScene */ hooks.prototype.beforeMainConstructor = function(mainScene, layers) { }; /* * @param iaScene mainScene * @param array layers */ hooks.prototype.afterMainConstructor = function(mainScene, layers) { // some stuff to manage popin windows var viewportHeight = $(window).height(); var button_click = function() { var target = $(this).data("target"); if ($("#response_" + target).is(":hidden")) { if ($(this).data("password")) { $("#form_" + target).toggle(); $("#form_" + target + " input[type=text]").val(""); $("#form_" + target + " input[type=text]").focus(); } else { $("#response_" + target).toggle(); } } else { if ($(this).data("password")) { $("#response_" + target).html($("#response_" + target).data("encrypted_content")); } $("#response_" + target).toggle(); } }; var unlock_input = function(e) { e.preventDefault(); var entered_password = $(this).parent().children("input[type=text]").val(); var sha1Digest= new createJs(true); sha1Digest.update(entered_password.encode()); var hash = sha1Digest.digest(); if (hash == $(this).data("password")) { var target = $(this).data("target"); var encrypted_content = $("#response_" + target).html(); $("#response_" + target).data("encrypted_content", encrypted_content); $("#response_" + target).html(XORCipher.decode(entered_password, encrypted_content).decode()); $("#response_" + target).show(); $("#form_" + target).hide(); $(".button").off("click"); $(".button").on("click", button_click); $(".unlock input[type=submit]").off("click"); $(".unlock input[type=submit]").on("click", unlock_input); } }; $(".button").on("click", button_click); $(".unlock input[type=submit]").on("click", unlock_input); $(".meta-doc").on("click", function(){ $("#content").show(); $(".detail_content").hide(); $("#general").show(); //var general_border = $("#general").css("border-top-width").substr(0,$("#general").css("border-top-width").length - 2); //var general_offset = $("#general").offset(); //var content_offset = $("#content").offset(); //$("#general").css({'max-height':(viewportHeight - general_offset.top - content_offset.top - 2 * general_border)}); }); $(".overlay").hide(); $(".infos").on("click", function(){ $("#rights").show(); }); $("#popup_close").on("click", function(){ $("#rights").hide(); }); $(".article_close").on("click", function(){ $(".detail_content").hide(); $("#content").hide(); $(this).parent().children("audio").each(function(){ $(this)[0].pause(); }); $(this).parent().children("video").each(function(){ $(this)[0].pause(); }); }); document.addEventListener("click", function(ev){ if (mainScene.noPropagation) { mainScene.noPropagation = false; } else { if (mainScene.zoomActive === 1) { if ((mainScene.element !== 0) && (typeof(mainScene.element) !== 'undefined')) { mainScene.element.kineticElement[0].fire("click"); } } else if ((mainScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (mainScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { document.body.style.cursor = "default"; mainScene.cursorState = "default"; mainScene.element.kineticElement[0].fire("mouseleave"); } } }); }; /* * * */ hooks.prototype.afterIaObjectConstructor = function(iaScene, idText, detail, iaObject) { }; /* * * */ hooks.prototype.afterIaObjectZoom = function(iaScene, idText, iaObject) { }; /* * * */ hooks.prototype.afterIaObjectFocus = function(iaScene, idText, iaObject) { if ($('#' + idText).data("state") != "void") { $("#content").show(); $(".detail_content").hide(); $('#' + idText).show(); $('#' + idText + " audio").each(function(){ if ($(this).data("state") === "autostart") { $(this)[0].play(); } }); } }; images-actives-html5.git/src/share/themes/audioBrown/js/iaobject.js000066400000000000000000000726771250410645000256310ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @param {object} params * @constructor create image active object */ function IaObject(params) { "use strict"; var that = this; this.path = []; this.title = []; this.kineticElement = []; this.backgroundImage = []; this.backgroundImageOwnScaleX = []; this.backgroundImageOwnScaleY = []; this.persistent = []; this.originalX = []; this.originalY = []; this.options = []; this.stroke = []; this.strokeWidth = []; this.agrandissement = 0; this.zoomActive = 0; this.minX = 10000; this.minY = 10000; this.maxX = -10000; this.maxY = -10000; this.tween = []; this.tween_group = 0; this.group = 0; this.layer = params.layer; this.background_layer = params.background_layer; this.backgroundCache_layer = params.backgroundCache_layer; this.zoomLayer = params.zoomLayer; this.imageObj = params.imageObj; this.myhooks = params.myhooks; this.idText = params.idText; // Create kineticElements and include them in a group that.group = new Kinetic.Group(); that.layer.add(that.group); if (typeof(params.detail.path) !== 'undefined') { that.includePath(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.image) !== 'undefined') { that.includeImage(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.group) !== 'undefined') { for (var i in params.detail.group) { if (typeof(params.detail.group[i].path) !== 'undefined') { that.includePath(params.detail.group[i], i, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.group[i].image) !== 'undefined') { that.includeImage(params.detail.group[i], i, that, params.iaScene, params.baseImage, params.idText); } } that.definePathBoxSize(params.detail, that); } else { console.log(params.detail); } this.defineTweens(this, params.iaScene); this.myhooks.afterIaObjectConstructor(params.iaScene, params.idText, params.detail, this); } /* * * @param {type} detail * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includeImage = function(detail, i, that, iaScene, baseImage, idText) { that.defineImageBoxSize(detail, that); var rasterObj = new Image(); rasterObj.src = detail.image; that.title[i] = detail.title; that.backgroundImage[i] = rasterObj; that.kineticElement[i] = new Kinetic.Image({ name: detail.title, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, width: detail.width, height: detail.height, scale: {x:iaScene.coeff,y:iaScene.coeff} }); rasterObj.onload = function() { that.backgroundImageOwnScaleX[i] = iaScene.scale * detail.width / this.width; that.backgroundImageOwnScaleY[i] = iaScene.scale * detail.height / this.height; var zoomable = true; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#000000")) { zoomable = false; } if ((typeof(detail.options) !== 'undefined')) { that.options[i] = detail.options; } if ((typeof(detail.stroke) !== 'undefined') && (detail.stroke != 'none')) { that.stroke[i] = detail.stroke; } else { that.stroke[i] = 'rgba(0, 0, 0, 0)'; } if ((typeof(detail.strokewidth) !== 'undefined')) { that.strokeWidth[i] = detail.strokewidth; } else { that.strokeWidth[i] = '0'; } that.persistent[i] = "off-image"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#ffffff")) { that.persistent[i] = "onImage"; that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); zoomable = false; } that.group.add(that.kineticElement[i]); that.addEventsManagement(i,zoomable, that, iaScene, baseImage, idText); // define hit area excluding transparent pixels // ============================================================= var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min(parseFloat(detail.maxX) - parseFloat(detail.minX), Math.floor(parseFloat(iaScene.originalWidth) * 1))); var cropHeight = (Math.min(parseFloat(detail.maxY) - parseFloat(detail.minY), Math.floor(parseFloat(iaScene.originalHeight) * 1))); if (cropX + cropWidth > iaScene.originalWidth * 1) { cropWidth = iaScene.originalWidth * 1 - cropX * 1; } if (cropY * 1 + cropHeight > iaScene.originalHeight * 1) { cropHeight = iaScene.originalHeight * 1 - cropY * 1; } var hitCanvas = that.layer.getHitCanvas(); iaScene.completeImage = hitCanvas.getContext().getImageData(0,0,Math.floor(hitCanvas.width),Math.floor(hitCanvas.height)); var canvas_source = document.createElement('canvas'); canvas_source.setAttribute('width', cropWidth * iaScene.coeff); canvas_source.setAttribute('height', cropHeight * iaScene.coeff); var context_source = canvas_source.getContext('2d'); context_source.drawImage(rasterObj,0,0, cropWidth * iaScene.coeff, cropHeight * iaScene.coeff); imageDataSource = context_source.getImageData(0, 0, cropWidth * iaScene.coeff, cropHeight * iaScene.coeff); len = imageDataSource.data.length; that.group.zoomActive = 0; (function(len, imageDataSource){ that.kineticElement[i].hitFunc(function(context) { if (iaScene.zoomActive == 0) { /* rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); //detach from the DOM var imageData = imageDataSource.data; // just replace scene colors by hit colors - alpha remains unchanged for(j = 0; j < len; j += 4) { imageData[j + 0] = rgbColorKey.r; imageData[j + 1] = rgbColorKey.g; imageData[j + 2] = rgbColorKey.b; // imageData[j + 3] = imageDataSource.data[j + 3]; } // reatach to the DOM imageDataSource.data = imageData; context.putImageData(imageDataSource, cropX * iaScene.coeff, cropY * iaScene.coeff); */ var imageData = imageDataSource.data; var imageDest = iaScene.completeImage.data; var position1 = 0; var position2 = 0; var maxWidth = Math.floor(cropWidth * iaScene.coeff); var maxHeight = Math.floor(cropHeight * iaScene.coeff); var startY = Math.floor(cropY * iaScene.coeff); var startX = Math.floor(cropX * iaScene.coeff); var hitCanvasWidth = Math.floor(that.layer.getHitCanvas().width); var rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); for(var varx = 0; varx < maxWidth; varx +=1) { for(var vary = 0; vary < maxHeight; vary +=1) { position1 = 4 * (vary * maxWidth + varx); position2 = 4 * ((vary + startY) * hitCanvasWidth + varx + startX); if (imageData[position1 + 3] > 100) { imageDest[position2 + 0] = rgbColorKey.r; imageDest[position2 + 1] = rgbColorKey.g; imageDest[position2 + 2] = rgbColorKey.b; imageDest[position2 + 3] = 255; } } } context.putImageData(iaScene.completeImage, 0, 0); } else { context.beginPath(); context.rect(0,0,this.width(),this.height()); context.closePath(); context.fillStrokeShape(this); } }); })(len, imageDataSource); /*that.kineticElement[i].sceneFunc(function(context) { var yo = that.layer.getHitCanvas().getContext().getImageData(0,0,iaScene.width, iaScene.height); context.putImageData(yo, 0,0); });*/ // ============================================================= that.group.draw(); }; }; /* * * @param {type} path * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includePath = function(detail, i, that, iaScene, baseImage, idText) { that.path[i] = detail.path; that.title[i] = detail.title; // if detail is out of background, hack maxX and maxY if (parseFloat(detail.maxX) < 0) detail.maxX = 1; if (parseFloat(detail.maxY) < 0) detail.maxY = 1; that.kineticElement[i] = new Kinetic.Path({ name: detail.title, data: detail.path, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, scale: {x:iaScene.coeff,y:iaScene.coeff}, fill: 'rgba(0, 0, 0, 0)' }); that.definePathBoxSize(detail, that); // crop background image to suit shape box that.cropCanvas = document.createElement('canvas'); that.cropCanvas.setAttribute('width', parseFloat(detail.maxX) - parseFloat(detail.minX)); that.cropCanvas.setAttribute('height', parseFloat(detail.maxY) - parseFloat(detail.minY)); var cropCtx = that.cropCanvas.getContext('2d'); var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min((parseFloat(detail.maxX) - cropX) * iaScene.scale, Math.floor(parseFloat(iaScene.originalWidth) * iaScene.scale))); var cropHeight = (Math.min((parseFloat(detail.maxY) - cropY) * iaScene.scale, Math.floor(parseFloat(iaScene.originalHeight) * iaScene.scale))); if (cropX * iaScene.scale + cropWidth > iaScene.originalWidth * iaScene.scale) { cropWidth = iaScene.originalWidth * iaScene.scale - cropX * iaScene.scale; } if (cropY * iaScene.scale + cropHeight > iaScene.originalHeight * iaScene.scale) { cropHeight = iaScene.originalHeight * iaScene.scale - cropY * iaScene.scale; } var posX = 0; var posY = 0; if (parseFloat(detail.minX) < 0) posX = parseFloat(detail.minX) * (-1); if (parseFloat(detail.minY) < 0) posY = parseFloat(detail.minY) * (-1); // bad workaround to avoid null dimensions if (cropWidth <= 0) cropWidth = 1; if (cropHeight <= 0) cropHeight = 1; cropCtx.drawImage( that.imageObj, cropX * iaScene.scale, cropY * iaScene.scale, cropWidth, cropHeight, posX, posY, cropWidth, cropHeight ); var dataUrl = that.cropCanvas.toDataURL(); delete that.cropCanvas; var cropedImage = new Image(); cropedImage.src = dataUrl; cropedImage.onload = function() { that.backgroundImage[i] = cropedImage; that.backgroundImageOwnScaleX[i] = 1; that.backgroundImageOwnScaleY[i] = 1; that.kineticElement[i].fillPatternRepeat('no-repeat'); that.kineticElement[i].fillPatternX(detail.minX); that.kineticElement[i].fillPatternY(detail.minY); }; var zoomable = true; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#000000")) { zoomable = false; } if ((typeof(detail.options) !== 'undefined')) { that.options[i] = detail.options; } if ((typeof(detail.stroke) !== 'undefined') && (detail.stroke != 'none')) { that.stroke[i] = detail.stroke; } else { that.stroke[i] = 'rgba(0, 0, 0, 0)'; } if ((typeof(detail.strokewidth) !== 'undefined')) { that.strokeWidth[i] = detail.strokewidth; } else { that.strokeWidth[i] = '0'; } that.persistent[i] = "off"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#ffffff")) { that.persistent[i] = "onPath"; that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); } that.addEventsManagement(i, zoomable, that, iaScene, baseImage, idText); that.group.add(that.kineticElement[i]); that.group.draw(); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.defineImageBoxSize = function(detail, that) { "use strict"; if (that.minX === -1) that.minX = (parseFloat(detail.x)); if (that.maxY === 10000) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); if (that.maxX === -1) that.maxX = (parseFloat(detail.x) + parseFloat(detail.width)); if (that.minY === 10000) that.minY = (parseFloat(detail.y)); if (parseFloat(detail.x) < that.minX) that.minX = parseFloat(detail.x); if (parseFloat(detail.x) + parseFloat(detail.width) > that.maxX) that.maxX = parseFloat(detail.x) + parseFloat(detail.width); if (parseFloat(detail.y) < that.minY) that.miny = parseFloat(detail.y); if (parseFloat(detail.y) + parseFloat(detail.height) > that.maxY) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.definePathBoxSize = function(detail, that) { "use strict"; if ( (typeof(detail.minX) !== 'undefined') && (typeof(detail.minY) !== 'undefined') && (typeof(detail.maxX) !== 'undefined') && (typeof(detail.maxY) !== 'undefined')) { that.minX = detail.minX; that.minY = detail.minY; that.maxX = detail.maxX; that.maxY = detail.maxY; } else { console.log('definePathBoxSize failure'); } }; /* * Define zoom rate and define tween effect for each group * @returns {undefined} */ IaObject.prototype.defineTweens = function(that, iaScene) { that.minX = that.minX * iaScene.coeff; that.minY = that.minY * iaScene.coeff; that.maxX = that.maxX * iaScene.coeff; that.maxY = that.maxY * iaScene.coeff; var largeur = that.maxX - that.minX; var hauteur = that.maxY - that.minY; that.agrandissement1 = (iaScene.height - iaScene.y) / hauteur; // beta that.agrandissement2 = iaScene.width / largeur; // alpha if (hauteur * that.agrandissement2 > iaScene.height) { that.agrandissement = that.agrandissement1; that.tweenX = (0 - (that.minX)) * that.agrandissement + (iaScene.width - largeur * that.agrandissement) / 2; that.tweenY = (0 - iaScene.y - (that.minY)) * that.agrandissement + iaScene.y; } else { that.agrandissement = that.agrandissement2; that.tweenX = (0 - (that.minX)) * that.agrandissement; that.tweenY = 1 * ((0 - iaScene.y - (that.minY)) * that.agrandissement + iaScene.y + (iaScene.height - hauteur * that.agrandissement) / 2); } }; /* * Define mouse events on the current KineticElement * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.addEventsManagement = function(i, zoomable, that, iaScene, baseImage, idText) { if (that.options[i].indexOf("disable-click") !== -1) return; /* * if mouse is over element, fill the element with semi-transparency */ that.kineticElement[i].on('mouseover', function() { if (iaScene.cursorState.indexOf("ZoomOut.cur") !== -1) { } else if ((iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { } else if (iaScene.cursorState.indexOf("HandPointer.cur") === -1) { document.body.style.cursor = "url(img/HandPointer.cur),auto"; iaScene.cursorState = "url(img/HandPointer.cur),auto"; for (var i in that.kineticElement) { if (that.persistent[i] == "off") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill(iaScene.overColor); that.kineticElement[i].scale(iaScene.coeff); //that.kineticElement[i].stroke(iaScene.overColorStroke); //that.kineticElement[i].strokeWidth(2); that.kineticElement[i].stroke(that.stroke[i]); that.kineticElement[i].strokeWidth(that.strokeWidth[i]); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); } else if ((that.persistent[i] == "onImage") || (that.persistent[i] == "off-image")) { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); } } that.layer.batchDraw(); //this.draw(); } }); /* * if we click in this element, manage zoom-in, zoom-out */ if (that.options[i].indexOf("direct-link") !== -1) { that.kineticElement[i].on('click touchstart', function(e) { location.href = that.title[i]; }); } else { that.kineticElement[i].on('click touchstart', function() { var i = 0; iaScene.noPropagation = true; // let's zoom if ((iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) && (iaScene.element === that)) { iaScene.zoomActive = 1; document.body.style.cursor = "url(img/ZoomOut.cur),auto"; iaScene.cursorState = "url(img/ZoomOut.cur),auto"; this.moveToTop(); that.group.moveToTop(); that.layer.moveToTop(); that.group.zoomActive = 1; that.originalX[0] = that.group.x(); that.originalY[0] = that.group.y(); that.alpha = 0; that.step = 0.1; var personalTween = function(anim, thislayer) { // linear var tempX = that.originalX[0] + that.alpha.toFixed(2) * (that.tweenX - that.originalX[0]); var tempY = that.originalY[0] + that.alpha.toFixed(2) * (that.tweenY - that.originalY[0]); var tempScale = 1 + that.alpha.toFixed(2) * (that.agrandissement - 1); var t = null; if (that.alpha.toFixed(2) <= 1) { that.alpha = that.alpha + that.step; that.group.setPosition({x:tempX, y:tempY}); that.group.scale({x:tempScale,y:tempScale}); } else { that.zoomLayer.hitGraphEnabled(true); anim.stop(); } }; that.zoomLayer.moveToTop(); that.group.moveTo(that.zoomLayer); that.layer.draw(); var anim = new Kinetic.Animation(function(frame) { personalTween(this, that.layer); }, that.zoomLayer); that.zoomLayer.hitGraphEnabled(false); anim.start(); } // let's unzoom else if (iaScene.cursorState.indexOf("ZoomOut.cur") != -1) { if ((that.group.zoomActive == 1)) { iaScene.zoomActive = 0; that.group.zoomActive = 0; that.group.scaleX(1); that.group.scaleY(1); that.group.x(that.originalX[0]); that.group.y(that.originalY[0]); $('#' + that.idText + " audio").each(function(){ $(this)[0].pause(); }); $('#' + that.idText + " video").each(function(){ $(this)[0].pause(); }); that.backgroundCache_layer.moveToBottom(); document.body.style.cursor = "default"; iaScene.cursorState = "default"; for (i in that.kineticElement) { if (that.persistent[i] == "off") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } else if (that.persistent[i] == "onImage") { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } } that.group.moveTo(that.layer); that.zoomLayer.moveToBottom(); that.zoomLayer.draw(); that.layer.draw(); that.backgroundCache_layer.draw(); } } // let's focus else { if (iaScene.zoomActive === 0) { if ((iaScene.element !== 0) && (typeof(iaScene.element) !== 'undefined')) { for (i in iaScene.element.kineticElement) { iaScene.element.kineticElement[i].fillPriority('color'); iaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); iaScene.element.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); iaScene.element.kineticElement[i].setStrokeWidth(0); } iaScene.element.layer.draw(); $('#' + iaScene.element.idText + " audio").each(function(){ $(this)[0].pause(); }); $('#' + iaScene.element.idText + " video").each(function(){ $(this)[0].pause(); }); } if (zoomable === true) { document.body.style.cursor = 'url("img/ZoomIn.cur"),auto'; iaScene.cursorState = 'url("img/ZoomIn.cur"),auto'; } else { iaScene.cursorState = 'url("img/ZoomFocus.cur"),auto'; } var cacheBackground = true; for (i in that.kineticElement) { if (that.persistent[i] === "onImage") cacheBackground = false; that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); //that.kineticElement[i].stroke(iaScene.overColorStroke); //that.kineticElement[i].strokeWidth(2); that.kineticElement[i].stroke(that.stroke[i]); that.kineticElement[i].strokeWidth(that.strokeWidth[i]); that.kineticElement[i].moveToTop(); } if (cacheBackground === true) that.backgroundCache_layer.moveToTop(); //that.group.moveToTop(); that.layer.moveToTop(); that.layer.draw(); iaScene.element = that; that.myhooks.afterIaObjectFocus(iaScene, idText, that); //var viewportHeight = $(window).height(); //var article_border = $('#' + idText).css("border-top-width").substr(0,$('#' + idText).css("border-top-width").length - 2); //var article_offset = $('#' + idText).offset(); //var content_offset = $("#content").offset(); //$('#' + idText).css({'max-height':(viewportHeight - article_offset.top - content_offset.top - 2 * article_border)}); } } }); } /* * if we leave this element, just clear the scene */ that.kineticElement[i].on('mouseleave', function() { if ((iaScene.cursorState.indexOf("ZoomOut.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { } else { var mouseXY = that.layer.getStage().getPointerPosition(); if (typeof(mouseXY) == "undefined") { mouseXY = {x:0,y:0}; } if ((that.layer.getStage().getIntersection(mouseXY) != this)) { that.backgroundCache_layer.moveToBottom(); for (var i in that.kineticElement) { if ((that.persistent[i] == "off") || (that.persistent[i] == "off-image")) { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(0, 0, 0, 0)'); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } else if (that.persistent[i] == "onImage") { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } } document.body.style.cursor = "default"; iaScene.cursorState = "default"; that.layer.draw(); } } }); }; images-actives-html5.git/src/share/themes/audioBrown/js/iascene.js000066400000000000000000000115021250410645000254340ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@crdp.ac-versailles.fr /** * * @param {type} originalWidth * @param {type} originalHeight * @constructor create image active scene */ function IaScene(originalWidth, originalHeight) { "use strict"; var that = this; // canvas width this.width = 1000; // canvas height this.height = 800; // default color used to fill shapes during mouseover var _colorOver = {red:66, green:133, blue:244, opacity:0.6}; // default color used to fill stroke around shapes during mouseover var _colorOverStroke = {red:255, green:0, blue:0, opacity:1}; // default color used to fill shapes if defined as cache this.colorPersistent = {red:124, green:154, blue:174, opacity:1}; // Image ratio on the scene this.ratio = 1.00; // padding-top in the canvas this.y = 0; // color used over background image during focus var _colorCache = {red:0, green:0, blue:0, opacity:0.6}; // internal this.fullScreen = "off"; this.backgroundCacheColor = 'rgba(' + _colorCache.red + ',' + _colorCache.green + ',' + _colorCache.blue + ',' + _colorCache.opacity + ')'; this.overColor = 'rgba(' + _colorOver.red + ',' + _colorOver.green + ',' + _colorOver.blue + ',' + _colorOver.opacity + ')'; this.overColorStroke = 'rgba(' + _colorOverStroke.red + ',' + _colorOverStroke.green + ',' + _colorOverStroke.blue + ',' + _colorOverStroke.opacity + ')'; this.scale = 1; this.zoomActive = 0; this.element = 0; this.originalWidth = originalWidth; this.originalHeight = originalHeight; this.coeff = (this.width * this.ratio) / parseFloat(originalWidth); this.cursorState=""; this.noPropagation = false; } /* * Scale entire scene * */ IaScene.prototype.scaleScene = function(mainScene){ "use strict"; var viewportWidth = $(window).width(); var viewportHeight = $(window).height(); var coeff_width = (viewportWidth * mainScene.ratio) / parseFloat(mainScene.originalWidth); var coeff_height = (viewportHeight) / (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top + $('#container').offset().top); var canvas_border_left = parseFloat($("#canvas").css("border-left-width").substr(0,$("#canvas").css("border-left-width").length - 2)); var canvas_border_right = parseFloat($("#canvas").css("border-right-width").substr(0,$("#canvas").css("border-right-width").length - 2)); var canvas_border_top = parseFloat($("#canvas").css("border-top-width").substr(0,$("#canvas").css("border-top-width").length - 2)); var canvas_border_bottom = parseFloat($("#canvas").css("border-bottom-width").substr(0,$("#canvas").css("border-bottom-width").length - 2)); if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_width) && (viewportHeight >= ((parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_width))) { mainScene.width = viewportWidth - canvas_border_left - canvas_border_right; mainScene.coeff = (mainScene.width * mainScene.ratio) / parseFloat(mainScene.originalWidth); mainScene.height = parseFloat(mainScene.originalHeight) * mainScene.coeff; } else if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_height) && (viewportHeight >= (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_height)) { mainScene.height = viewportHeight - $('#container').offset().top - $('#canvas').offset().top - canvas_border_top - canvas_border_bottom - 2; mainScene.coeff = (mainScene.height) / parseFloat(mainScene.originalHeight); mainScene.width = parseFloat(mainScene.originalWidth) * mainScene.coeff; } $('#container').css({"width": (mainScene.width + canvas_border_left + canvas_border_right) + 'px'}); $('#container').css({"height": (mainScene.height + $('#canvas').offset().top - $('#container').offset().top + canvas_border_top + canvas_border_bottom) + 'px'}); $('#canvas').css({"height": (mainScene.height) + 'px'}); $('#canvas').css({"width": mainScene.width + 'px'}); $('#detect').css({"height": (mainScene.height) + 'px'}); $('#detect').css({"top": ($('#canvas').offset().top) + 'px'}); }; images-actives-html5.git/src/share/themes/audioBrown/js/iframe.js000066400000000000000000000022671250410645000253000ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // Script used to load youtube resource after main page // otherwise, Chrome fails to start the page $(".videoWrapper16_9").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); }); $(".videoWrapper4_3").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); }); images-actives-html5.git/src/share/themes/audioBrown/js/main.js000066400000000000000000000146231250410645000247600ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // @version=xxx /* * Main * Initialization * * 1rst layer : div "detect" - if clicked, enable canvas events * 2nd layer : bootstrap accordion * 3rd layer : div "canvas" containing images and paths * 4th layer : div "disablearea" - if clicked, disable events canvas */ function main(myhooks) { "use strict"; var that=main; that.canvas = document.getElementById("canvas"); // area located under the canvas. If mouse over is detected, // we must re-activate mouse events on canvas var detect = document.getElementById("detect"); detect.addEventListener("mouseover", function() { that.canvas.style.pointerEvents="auto"; if ((IaScene.element !== 0) && (typeof(IaScene.element) !== 'undefined')) { for (var i in IaScene.element.kineticElement) { IaScene.element.kineticElement[i].fillPriority('color'); IaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); } } }, false); detect.addEventListener("touchstart", function() { that.canvas.style.pointerEvents="auto"; if ((IaScene.element !== 0) && (typeof(IaScene.element) !== 'undefined')) { for (var i in IaScene.element.kineticElement) { IaScene.element.kineticElement[i].fillPriority('color'); IaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); } } }, false); // Load background image that.imageObj = new Image(); that.imageObj.src = scene.image; that.imageObj.onload = function() { var mainScene = new IaScene(scene.width,scene.height); mainScene.scale = 1; mainScene.scaleScene(mainScene); var stage = new Kinetic.Stage({ container: 'canvas', width: mainScene.width, height: mainScene.height }); // area containing image background var baseImage = new Kinetic.Image({ x: 0, y: mainScene.y, width: scene.width, height: scene.height, scale: {x:mainScene.coeff,y:mainScene.coeff}, image: that.imageObj }); // cache used over background image var baseCache = new Kinetic.Rect({ x: 0, y: mainScene.y, width: scene.width, height: scene.height, scale: {x:mainScene.coeff,y:mainScene.coeff}, fill: mainScene.backgroundCacheColor }); // define area to disable canvas events management when // mouse is over. Thus, we can reach div located under canvas var disableArea = new Kinetic.Rect({ x: mainScene.width * mainScene.ratio, y: mainScene.y, width: mainScene.width * (1 - mainScene.ratio), height: mainScene.height }); disableArea.on('mouseover touchstart', function() { canvas.style.pointerEvents="none"; }); var layers = []; that.layers = layers; layers[0] = new Kinetic.FastLayer(); layers[1] = new Kinetic.FastLayer(); layers[2] = new Kinetic.Layer(); layers[3] = new Kinetic.Layer(); layers[0].add(baseCache); layers[1].add(baseImage); layers[2].add(disableArea); stage.add(layers[0]); stage.add(layers[1]); stage.add(layers[2]); stage.add(layers[3]); myhooks.beforeMainConstructor(mainScene, that.layers); var indice = 4; layers[indice] = new Kinetic.Layer(); stage.add(layers[indice]); for (var i in details) { //var indice = parseInt(i+3); //layers[indice] = new Kinetic.Layer(); //stage.add(layers[indice]); var iaObj = new IaObject({ imageObj: that.imageObj, detail: details[i], layer: layers[indice], idText: "article-" + i, baseImage: baseImage, iaScene: mainScene, background_layer: layers[1], backgroundCache_layer: layers[0], zoomLayer: layers[3], myhooks: myhooks }); } myhooks.afterMainConstructor(mainScene, that.layers); $("#splash").fadeOut("slow", function(){ $("#loader").hide(); }); // FullScreen ability // source code from http://blogs.sitepointstatic.com/examples/tech/full-screen/index.html var e = document.getElementById("title"); var div_container = document.getElementById("image-active"); e.onclick = function() { if (runPrefixMethod(document, "FullScreen") || runPrefixMethod(document, "IsFullScreen")) { runPrefixMethod(document, "CancelFullScreen"); } else { runPrefixMethod(div_container, "RequestFullScreen"); } mainScene.fullScreen = mainScene.fullScreen == "on" ? "off": "on"; }; var pfx = ["webkit", "moz", "ms", "o", ""]; function runPrefixMethod(obj, method) { var p = 0, m, t; while (p < pfx.length && !obj[m]) { m = method; if (pfx[p] === "") { m = m.substr(0,1).toLowerCase() + m.substr(1); } m = pfx[p] + m; t = typeof obj[m]; if (t != "undefined") { pfx = [pfx[p]]; return (t == "function" ? obj[m]() : obj[m]); } p++; } } }; } myhooks = new hooks(); launch = new main(myhooks); images-actives-html5.git/src/share/themes/audioBrown/js/xorcipher.js000066400000000000000000000115071250410645000260350ustar00rootroot00000000000000// XORCipher - Super simple encryption using XOR and Base64 // MODIFIED VERSION TO AVOID underscore dependancy // License : MIT // // As a warning, this is **not** a secure encryption algorythm. It uses a very // simplistic keystore and will be easy to crack. // // The Base64 algorythm is a modification of the one used in phpjs.org // * http://phpjs.org/functions/base64_encode/ // * http://phpjs.org/functions/base64_decode/ // // Examples // -------- // // XORCipher.encode("test", "foobar"); // => "EgocFhUX" // XORCipher.decode("test", "EgocFhUX"); // => "foobar" // /* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, strict:true, undef:true, unused:true, curly:true, browser:true, indent:2, maxerr:50 */ /* global _ */ (function(exports) { "use strict"; var XORCipher = { encode: function(key, data) { data = xor_encrypt(key, data); return b64_encode(data); }, decode: function(key, data) { data = b64_decode(data); return xor_decrypt(key, data); } }; var b64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; function b64_encode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, r, i = 0, enc = ""; if (!data) { return data; } do { o1 = data[i++]; o2 = data[i++]; o3 = data[i++]; bits = o1 << 16 | o2 << 8 | o3; h1 = bits >> 18 & 0x3f; h2 = bits >> 12 & 0x3f; h3 = bits >> 6 & 0x3f; h4 = bits & 0x3f; enc += b64_table.charAt(h1) + b64_table.charAt(h2) + b64_table.charAt(h3) + b64_table.charAt(h4); } while (i < data.length); r = data.length % 3; return (r ? enc.slice(0, r - 3) : enc) + "===".slice(r || 3); } function b64_decode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, result = []; if (!data) { return data; } data += ""; do { h1 = b64_table.indexOf(data.charAt(i++)); h2 = b64_table.indexOf(data.charAt(i++)); h3 = b64_table.indexOf(data.charAt(i++)); h4 = b64_table.indexOf(data.charAt(i++)); bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; o1 = bits >> 16 & 0xff; o2 = bits >> 8 & 0xff; o3 = bits & 0xff; result.push(o1); if (h3 !== 64) { result.push(o2); if (h4 !== 64) { result.push(o3); } } } while (i < data.length); return result; } function keyCharAt(key, i) { //return key.charCodeAt( Math.floor(i % key.length) ); return key.charCodeAt( i % key.length ); } function xor_encrypt(key, data) { /*return _.map(data, function(c, i) { return c.charCodeAt(0) ^ keyCharAt(key, i); });*/ var result = []; for (var indice in data) { result[indice] = data[indice].charCodeAt(0) ^ keyCharAt(key, indice); } return result; } function xor_decrypt(key, data) { /*return _.map(data, function(c, i) { return String.fromCharCode( c ^ keyCharAt(key, i) ); }).join("");*/ var result = []; for (var indice in data) { result[indice] = String.fromCharCode( data[indice] ^ keyCharAt(key, indice) ); } return result.join(""); } exports.XORCipher = XORCipher; })(this); String.prototype.decode = function(encoding) { var result = ""; var index = 0; var c = c1 = c2 = 0; while(index < this.length) { c = this.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); index++; } else if((c > 191) && (c < 224)) { c2 = this.charCodeAt(index + 1); result += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); index += 2; } else { c2 = this.charCodeAt(index + 1); c3 = this.charCodeAt(index + 2); result += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); index += 3; } } return result; }; String.prototype.encode = function(encoding) { var result = ""; var s = this.replace(/\r\n/g, "\n"); for(var index = 0; index < s.length; index++) { var c = s.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { result += String.fromCharCode((c >> 6) | 192); result += String.fromCharCode((c & 63) | 128); } else { result += String.fromCharCode((c >> 12) | 224); result += String.fromCharCode(((c >> 6) & 63) | 128); result += String.fromCharCode((c & 63) | 128); } } return result; };images-actives-html5.git/src/share/themes/audioBrown/manifest.webapp000066400000000000000000000007001250410645000260570ustar00rootroot00000000000000{ "name": "XIA", "size" : define_package.zip_size_here, "version" : "1.0", "release_notes" : "generated with XIA", "launch_path": "/index.html", "package_path" : "http://my-webserver.com/package.zip", "developer": { "name": "Académie de Versailles" }, "icons": { "16": "/img/xia16.png", "48": "/img/xia48.png", "64": "/img/xia64.png", "128": "/img/xia128.png" } }images-actives-html5.git/src/share/themes/buttonBlue/000077500000000000000000000000001250410645000230665ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/buttonBlue/css/000077500000000000000000000000001250410645000236565ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/buttonBlue/css/main.css000066400000000000000000000225001250410645000253130ustar00rootroot00000000000000/*fonts*/ @font-face { font-family: 'yanone_regular'; src: url('../font/yanonekaffeesatz-regular-webfont.eot'); src: url('../font/yanonekaffeesatz-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../font/yanonekaffeesatz-regular-webfont.woff') format('woff'), url('../font/yanonekaffeesatz-regular-webfont.svg#yanone_kaffeesatzregular') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'yanone_thin'; src: url('../font/yanonekaffeesatz-thin-webfont.eot'); src: url('../font/yanonekaffeesatz-thin-webfont.eot?#iefix') format('embedded-opentype'), url('../font/yanonekaffeesatz-thin-webfont.woff') format('woff'), url('../font/yanonekaffeesatz-thin-webfont.svg#yanone_kaffeesatzthin') format('svg'); font-weight: normal; font-style: normal; } /*fin de font*/ /* override Wahid */ html { margin:0; padding:0; /*background: url('../img/background.jpg') no-repeat center center fixed; background-size: cover;*/ background: rgb(35,158,202); /* Old browsers */ background-image: -moz-linear-gradient(top, rgba(3,96,130,1) 0%, rgba(3,96,130,1) 20%, rgba(35,158,202,1) 20%, rgba(35,158,202,1) 100%); /* FF3.6+ */ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(3,96,130,1)), color-stop(20%,rgba(3,96,130,1)), color-stop(20%,rgba(35,158,202,1)), color-stop(100%,rgba(35,158,202,1))); /* Chrome,Safari4+ */ background-image: -webkit-linear-gradient(top, rgba(3,96,130,1) 0%,rgba(3,96,130,1) 20%,rgba(35,158,202,1) 20%,rgba(35,158,202,1) 100%); /* Chrome10+,Safari5.1+ */ background-image: -o-linear-gradient(top, rgba(3,96,130,1) 0%,rgba(3,96,130,1) 20%,rgba(35,158,202,1) 20%,rgba(35,158,202,1) 100%); /* Opera 11.10+ */ background-image: -ms-linear-gradient(top, rgba(3,96,130,1) 0%,rgba(3,96,130,1) 20%,rgba(35,158,202,1) 20%,rgba(35,158,202,1) 100%); /* IE10+ */ background-image: linear-gradient(to bottom, rgba(3,96,130,1) 0%,rgba(3,96,130,1) 20%,rgba(35,158,202,1) 20%,rgba(35,158,202,1) 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#036082', endColorstr='#239eca',GradientType=0 ); /* IE6-9 */ background-repeat: no-repeat; } body{ background: none; margin:0; border:none; padding:0px; border-image-width: 0; } video { width:100%; } audio { width:100%; } a { color:#00c6ff; font-family: yanone_thin; font-size:1.4em; } a:active, a:focus, a:hover {color:#DDD;} header { width:100%; padding:0; margin:0 auto; /*background:#000;*/ } header h1 { margin:0; top:0; left:0px; /*background:url(../img/imagedoc-darknoise.png);*/ display:inline; /*max-width:20%;*/ padding: 0px 1em 0 5px; margin-bottom:0; color:white; font-family: yanone_thin; font-size: 1.5em; } .eyes { background:url(../img/eyes.png) center bottom no-repeat; /*margin-left: 10px;*/ padding:.3em 1em; } .eyes:hover { background:url(../img/eyes2.png) center bottom no-repeat; } .meta-doc { background:url(../img/meta-doc.png) center bottom no-repeat; /*margin-left: 10px;*/ padding:.3em 1em } .meta-doc:hover{ background:url(../img/meta-doc2.png) center bottom no-repeat; } .infos { background:url(../img/infos.png) center bottom no-repeat; /*margin-left: 10px;*/ padding:.3em 1em; } .infos:hover{ background:url(../img/infos2.png) center bottom no-repeat; } .title-document {display: block;} @media screen and (max-width: 640px) { body { font-size:0.7em; } h1 { font-size:20px; } } #detect, #canvas { margin:0; padding:0; } #container { position: relative; padding:0px; width:100%; margin:10px auto; border:0px solid #FFF3B2; border-image-width: 0; } #canvas { width:55%; margin-top: 5px; border:0px solid rgba(255,255,255,0.5); } #detect { position:absolute; left:0; width:100%; height:655px; } .response { display:none; } .unlock { width: 80%; margin:0px auto; } .unlock input[type="submit"]{ background-image: url(../img/unlock-icon.png) ; background-repeat: no-repeat; width: 40px; height: 40px; border:0px; background-color:transparent; } .unlock input[type="text"]{ padding: 10px; margin:10px; background-color: #ffec64; border:0px; box-shadow: inset 0px 0px 5px #ffab23; } .button { -moz-box-shadow: 0px 1px 0px 0px #fff6af; -webkit-box-shadow: 0px 1px 0px 0px #fff6af; box-shadow: 0px 1px 0px 0px #fff6af; background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffec64), color-stop(1, #ffab23)); background:-moz-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-webkit-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-o-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-ms-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:linear-gradient(to bottom, #ffec64 5%, #ffab23 100%); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffec64', endColorstr='#ffab23',GradientType=0); background-color:#ffec64; -moz-border-radius:6px; -webkit-border-radius:6px; border-radius:6px; border:1px solid #ffaa22; display:inline-block; cursor:pointer; color:#333333; font-family:arial; font-size:15px; font-weight:bold; padding:6px 24px; text-decoration:none; text-shadow:0px 1px 0px #ffee66; } .button:hover { background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffab23), color-stop(1, #ffec64)); background:-moz-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-webkit-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-o-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-ms-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:linear-gradient(to bottom, #ffab23 5%, #ffec64 100%); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffab23', endColorstr='#ffec64',GradientType=0); background-color:#ffab23; } .button:active { position:relative; top:1px; } /* popup */ .overlay { position:fixed; top:0; right:0; left:0; bottom:0; background: rgba(0,0,0,0.6); } #popup { position:relative; border-radius: 20px; border: 20px solid #ddd; width: 60%; margin: 50px auto; background:white; min-height: 100px; box-shadow: black 5px 5px 10px; } #content article { display:none; z-index:100; position:absolute; border: 20px solid #ddd; border-radius:20px; width: calc(100% - 40px); margin: 0px auto; background:rgba(255,255,255,1); box-shadow: black 5px 5px 10px; overflow-y: auto; overflow-x: hidden; } #content article p, h1 { margin: 10px; } #content article h1 { font-family: yanone_thin; } #article_move { background-image: url(../img/move.png); background-repeat: no-repeat; z-index:500; cursor: pointer; height:40px; width:40px; display:inline-block; } #article_close { background-image: url(../img/close.png); background-repeat: no-repeat; z-index:500; cursor: pointer; height:40px; width:40px; display:inline-block; } .buttons_container { display: none; z-index:200; position:absolute; text-align : center; } #popup_text { text-align:center; } #popup_text img{ float:left; width:20%; max-width: 60px; margin: 10px; } #content #message_success { overflow-x:visible; overflow-y:visible; } #popup_close, #popup_toggle { cursor: pointer; position:absolute; top:-40px; right:-40px; width:50px; } #loader { position:fixed; display: table; text-align:center; width:100%; height:100%; top:0; right:0; left:0; bottom:0; background: black; z-index:100; } #loader div{ font-family: yanone_thin, Arial; font-size: 2em; display:table-cell; vertical-align: middle; color:white; } ul { margin:0; margin-top: 5px; padding:0; } .button-unselected { font-family: 'yanone_regular'; list-style:none; background:#CCE8FF; display:inline-block; margin-left:2px; margin-right:2px; padding: 0.4em; padding-top:0.5em; border:0px solid #263868; width: 1.5em; height: 1.5em; border-radius: 1.3em; text-align:center; transition: 0.5s; box-shadow: 3px 3px 4px rgba(0,0,0,0.6); } .button-selected { font-family: 'yanone_regular'; list-style:none; background:#1A2948; display:inline-block; margin-left:2px; margin-right:2px; padding: 0.4em; padding-top:0.5em; border:0px solid #263868; width: 1.5em; height: 1.5em; border-radius: 1.3em; text-align:center; transition: 0.5s; box-shadow: 3px 3px 4px rgba(0,0,0,0.6); color:white; } li:hover { cursor:pointer; color:white; background:#4A6FC7; box-shadow: 0px 0px 3px rgba(0,0,0,0.9); } #buttons { text-align: center; } .videoWrapper16_9 { position: relative; padding-bottom: 56.25%; padding-top: 5px; height: 0; } .videoWrapper4_3 { position: relative; padding-bottom: 75%; padding-top: 5px; height: 0; } .videoWrapper16_9 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .videoWrapper4_3 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }images-actives-html5.git/src/share/themes/buttonBlue/datas/000077500000000000000000000000001250410645000241625ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/buttonBlue/datas/README.md000066400000000000000000000001221250410645000254340ustar00rootroot00000000000000# JSON datas This folder contains data.js file where paths and images are stored images-actives-html5.git/src/share/themes/buttonBlue/deploy.html000066400000000000000000000006441250410645000252540ustar00rootroot00000000000000

XIA installation package

images-actives-html5.git/src/share/themes/buttonBlue/font/000077500000000000000000000000001250410645000240345ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/buttonBlue/font/README.md000066400000000000000000000000301250410645000253040ustar00rootroot00000000000000fonts used by this themeimages-actives-html5.git/src/share/themes/buttonBlue/hook.py000066400000000000000000000150361250410645000244050ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # # @author : pascal.fautrero@crdp.ac-versailles.fr import gettext import locale class hook: """do some stuff during image active generations""" def __init__(self, root, iaobject, PageFormatter, langPath): """Init""" try: t = gettext.translation("xia-converter", langPath, languages=[locale.getdefaultlocale()[0]]) except: t = gettext.translation("xia-converter", langPath, languages=['en_US']) translate = t.ugettext self.root = root self.iaobject = iaobject self.PageFormatter = PageFormatter self.tooltip = translate("export buttonBlue") self.loading = translate("loading") def generateIndex(self,filePath, templatePath): """ generate index file""" final_str = '' final_str += u'
\n' final_str += u'

' + self.iaobject.scene["intro_title"] + '

\n' final_str += u'

' + self.PageFormatter(self.iaobject.scene["intro_detail"]).print_html() + u'

\n' final_str += u'
\n' for i, detail in enumerate(self.iaobject.details): if detail['options'].find(u"direct-link") == -1: dataState = "full" if self.PageFormatter(detail["detail"]).print_html() == "": dataState = "void" final_str += u'
\n' final_str += u'

' + detail['title'] + u'

\n' final_str += u'
' + self.PageFormatter(detail["detail"]).print_html() + u'
\n' final_str += u'
\n' with open(templatePath,"r") as template: final_index = template.read().decode("utf-8") metadatas = "" if self.iaobject.scene["creator"]: metadatas += self.iaobject.scene["creator"] + "
" if self.iaobject.scene["rights"]: metadatas += self.iaobject.scene["rights"] + "
" if self.iaobject.scene["publisher"]: metadatas += self.iaobject.scene["publisher"] + "
" if self.iaobject.scene["identifier"]: metadatas += self.iaobject.scene["identifier"] + "
" if self.iaobject.scene["coverage"]: metadatas += self.iaobject.scene["coverage"] + "
" if self.iaobject.scene["source"]: metadatas += self.iaobject.scene["source"] + "
" if self.iaobject.scene["relation"]: metadatas += self.iaobject.scene["relation"] + "
" if self.iaobject.scene["language"]: metadatas += self.iaobject.scene["language"] + "
" if self.iaobject.scene["contributor"]: metadatas += self.iaobject.scene["contributor"] + "
" if self.iaobject.scene["date"]: metadatas += self.iaobject.scene["date"] + "
" final_index = final_index.replace("{{METADATAS}}", metadatas) final_index = final_index.replace("{{AUTHOR}}", self.iaobject.scene["creator"]) final_index = final_index.replace("{{DESCRIPTION}}", self.iaobject.scene["description"]) final_index = final_index.replace("{{KEYWORDS}}", self.iaobject.scene["keywords"]) final_index = final_index.replace("{{TITLE}}", self.iaobject.scene["title"]) final_index = final_index.replace("{{CONTENT}}", final_str) final_index = final_index.replace("{{LOADING}}", self.loading) if self.root.index_standalone: xiaWebsite = "http://xia.dane.ac-versailles.fr/network/delivery/buttonBlue" final_index = final_index.replace("{{MainCSS}}", xiaWebsite + "/css/main.css") final_index = final_index.replace("{{LogoLoading}}", xiaWebsite + "/img/xia.png") final_index = final_index.replace("{{LogoClose}}", xiaWebsite + "/img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '') final_index = final_index.replace("{{JqueryJS}}", "https://code.jquery.com/jquery-1.11.1.min.js") final_index = final_index.replace("{{sha1JS}}", xiaWebsite + "/js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", "https://cdn.jsdelivr.net/kineticjs/5.1.0/kinetic.min.js") final_index = final_index.replace("{{xiaJS}}", xiaWebsite + "/js/xia.js") final_index = final_index.replace("{{hooksJS}}", xiaWebsite + "/js/hooks.js") final_index = final_index.replace("{{labJS}}", "https://cdnjs.cloudflare.com/ajax/libs/labjs/2.0.3/LAB.min.js") else: final_index = final_index.replace("{{MainCSS}}", "css/main.css") final_index = final_index.replace("{{LogoLoading}}", "img/xia.png") final_index = final_index.replace("{{LogoClose}}", "img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '.script("datas/data.js")') final_index = final_index.replace("{{JqueryJS}}", "js/jquery.min.js") final_index = final_index.replace("{{sha1JS}}", "js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", "js/kinetic.min.js") final_index = final_index.replace("{{xiaJS}}", "js/xia.js") final_index = final_index.replace("{{hooksJS}}", "js/hooks.js") final_index = final_index.replace("{{labJS}}", "js/LAB.min.js") with open(filePath,"w") as indexfile: indexfile.write(final_index.encode("utf-8")) images-actives-html5.git/src/share/themes/buttonBlue/icon.gif000066400000000000000000000102611250410645000245050ustar00rootroot00000000000000GIF89aBXDYEZF[GaF\HbIc G]IdJe H^KfLgMhNiOjLbPkRrNdQkSsOeTt RlUuPe SmVuQfQgWvTnXwUoUpYxZtYyTjZzWr\v [{ WmYt \|"XnZu]}#Yob^~]r`z_d%[q^s,Zk`_tf(]s)^tbc~avg"cx if-ax$ezhk&f|l jm"l2izo,kp&o0nr!t3q#u-t?u3xHuAw5z1o\6Y/9Ն ALZ,Hk)(f` zr:9%L,cN֬!x3TnU#ڨkpf \χ2CLeǝ`4~3g7!bY{܎~*cIEzr-%C -$I3"t`hZ4 xD(bhtwGPجVxN6%2#Q6dA>I!Tt$eIHQ6p~L92@%41^HWAKykNjx/BY`7E+-%P>ڂL@iƔ[ "4>hL(<ـA+-9&  oc+3ړl")w`p"# `X V-ox"+9#8F F@8^@}0 N t;J5WN&1\J)W~14N14xH0ҼfYΊ<'xX>T;m|@K# C7Q ZbK<Y+CZŔ׆ծ~=}G؀o}K>E@%`̆M`}ꕖo7(.P9bk7[-X pc X[ In:ϭ%!!`(8?#ܺMMsZv7p켣Wٸom50:+y9/xm˖Gv1pg\bd0|=>KDcG9LLo`]~0bug5.lMw3~,*(Ae`7yMo:۟W1J_1j1i{F_Û6Sz,HQ9|7 d q(IJ|_rJm~Su75W,vg6%eX0K ؀ssn\OI'GR!XLD%hwM:!u)+G10xdJP<؃f78HE-OxpUKXgsх`}Ra4UJt.GlH&n`HEc ؈Kw2{(,Ї~H'B>(5 d530Qo*(af$Q(0`ϑQt88dM*4$pQQpy80  9؋>؁5hۓ MHи8b88a~F`𸉰H!Aᐸ F w}q؇Y(ظ I"xXF0 ,9GQQq 1 :I yB)0ɑ3O p5P !SDiFZ! `Iai)UDo 6sɏvY !z|)i0z Y9]yٓəh陎9W "^9ɚ. QI7!yIiiʥ !N)/YAyιٝ+)yiYؗa6yjaٞM й sfZ9 ʠ깞jy"&JM* Z!#J j*i\voQѹXA1 >1DC@= dPgфBʃS  jlڦlz ^`ْX `&QO*Q zw~ZJ '|wkI Z2|w(1g p ڪ P> jfq :9GWګj Z`tQZΪɪ;images-actives-html5.git/src/share/themes/buttonBlue/img/000077500000000000000000000000001250410645000236425ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/buttonBlue/img/HandPointer.cur000066400000000000000000000042761250410645000266010ustar00rootroot00000000000000 ( @MMM***eeeqqq www```jjjmmm ,,,bbb =><'=>=9\!UW[ .Q4WX8ZZX!((YT4 5 7!8Z 6 NQ$34 5 7XX;@1NOPQR3TUV Q? LM112RSTQJ0%K0LM12X>U/JK0LLM1>A5H I/JK00LJ?[$),FFG-H I/J/S)?DE /FK -HO :+#D\M;"7;C+/&3KH@21B3*FA(@???? images-actives-html5.git/src/share/themes/buttonBlue/img/ZoomIn.cur000066400000000000000000000042761250410645000256010ustar00rootroot00000000000000 ( @༙L@3uaL""!tSSSǨiii555^^^trr+++} ===׶-' xxxXXXcccRD6''&̬ ///mmmqܺ[[[0)#xcO%$# ```ooovvvqqqt&%%(((˪N@3 TTTݻYYY___wbNaaabbbhhhwww-(!߻Ȩ&&%RD5̫˫cbb\Z~9zq qX\_@_`%%rpM^A&%$o(J?) ppG_R8e$66jjhf8k nn_!dfws Ijkl77lR#E.3-3.Kii$s\kcL tNfg^y"9. *4t.'dm54V44tu#g_TkQ34V3> DZXa/4-+aC@T6YPtVV*3Q5l|YJxttVVv];^Y7St 8B}EYA\8Tvvvv*O\>,1WU4O_,-V,\$0<)o\,bd\\\\\\\-b`FHc,#|YV??images-actives-html5.git/src/share/themes/buttonBlue/img/background.jpg000066400000000000000000002434701250410645000264750ustar00rootroot00000000000000JFIFHHExifII*JR(:ZiHHUtilisable et modifiable - utilisation commercial permise02100100ohttp://ns.adobe.com/xap/1.0/ False AB471B4FF95292ECDB3C25FC5C6BBB84 xmp.iid:1EF9569239BB11E4A5E7A6A3DD7479B7 AB471B4FF95292ECDB3C25FC5C6BBB84 xmp.iid:1EF9569239BB11E4A5E7A6A3DD7479B7 x-default Wahid Mendil x-default infographiste web Adobe Photoshop CS6 Windows XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC  !"$"$C8 x$D*!IJą$jDQDEJ"6B).TT\el*JI$FIHHRHHD!HH"*D"Ib" " %""% "%  Ph @)BP% %eX B` R )B R"X X)B#ˮT)T) BH) $"Ԉ#R" "(bJIJ+pk+jE"$J+D"!HE"!+$bY*!"""(""%" " "R "PXB`% X!Ah`%  %"ZX% b< D %P5 $6$ؒCJ""%J()Rh$EFD*̸k+.V"$JD!H*FHHH"!$(b(%X B)BX%R"P%h BP`B"R %"XbD %I Eb$(J"H) 4R#b) r4B#b("$)  sRD%JD$ "Eb" D$BI$HDIDDDD@K@DE(DD D@J@(P-,@ D)(P,P,yuFIHQ+HlQFDjDQDIQEɛDDQRHQ*RDX^msk $IDBT) %IBBTBI I  QDDDZDJD@ D @KJ)(@KJ,RA,  )(AP]uJHJĄE!JDJEiE!DQP3mP"j+E*E!DE!HR!HJ06k TBCe $5$2TBDDI BI U,E-)(A,@Rh B% R X"Ph( B(kI%JB$5"6CH#d( R""(҈Cb((iERFE!HQ!D!H6,"D5$$HBDB $BDDDDDD DKDJ@E(@@R@K,,,@J (@@ J,Gj"DHD!!FDDRE+DFQFDQ+H͹IDlE!DR*Q!HE""$\& 5BD)U $BDDI JE,J@ @(P@R-,(@A佫HE*HllDDjQQRDEFR5bH#JH5ͰؑRFą!HRR!"$ɾS\ͱ$DDEI P UEQDDDQK@P(Q,@@ʩ(DK(P,),K*JJJQ+DđFFđlDQjEDi2b֤EDQ$HlHHRHHH&ɱD""!"*HR"""""P H`)BZXPXXh`X( H`R"{%R$CbH5")R$X%b(T(H4JFiDQI5I"sQ!DIi$EJ$HlHRRY!"Mk+UDDBI,DDE DDD QK,P(P,,JKҲ@)-ZD,HHFȆiHQR!HiDHiDQ4)R6$$EQE+Q4"CJ$(BHґ BB DD) ɮ-oPU  $DDD0#T@K$DEDD)(P,,@KDJ)(P,J ,,Q,J$DQ*QF+DQiDIQHQ4V(4Ԉ6"ٕŨH$HҐ5HCI D($BDTDTEZ7I"""""$X(% X H ``X""P PX H B%X% `B)@({CP5"Cd%b"(HI""4#d(4҈i*QEQDal4"2T$JBBBEI "DH 6EDDro|[ $$DDDDQ%D-(P(@ ,( C,J,,(@RdIlHliDRBҊ#JH#b"4"T(؈F--E!DE!DJbFHQ"!HHR"$@5, ETDED $DD(DJ D@ D)(KK(JD @@KJ+*R!!JRDFElQ!FDlRiDQ4$4(4(؊") TIE!DD+IHHR!H!""""2[$D DDCH,E-, @@ ((RK(@Rx!"F!DEHlFFERDlQDQH4؈(J bꤑ!DJbIDVDQ"D%""!"H`|87 %"""""(H""bB(( `X"PR VPXXB%"ze@Z%-B"X(%Hh(P" ^R1V3q-b)+bHҕ"BJ"6%fFE46((ؒhE4#c "( B61 b!HIHH""HB "" d""Z%BEľY:f B"" Z b%"PZX%H%c: Bq5"T6"ҍHؕ6"Hb(ԚHՐf$F(J0B(ҐB"49ڒDB$ ETDDI T DJQ(P, ) (μ3 DDDAK)K(P,@@A, D+TX!DFIDFQMRؒhEVH(#b R"HB(2"EBb5%T6BJ$IT$DD,P@(,@,).L5^3y `X "HB` B)B)@% R X5HjHHΛ!FDDlIFQDEEDlEI5dhRQ"(#LؐB+ 6#FmŢ%d+$$BDDUETP,@(.NMs׎v(PJD @DD DJ--D5 "BTSI"5"T6$)R(V"lQFQQ4V24&I4#c *d(4I HQ$fQIBK DD,EDDA,@@DH,@@K(RoɞXZ "b Z )`("B BB%  Z{"\saRJEQ+D(Ҋ"6"iiElI5dhD(؈$DJD$HƮmH!"""D"%P` BRIB\,J(WzysD@K@E,D@@(JD D@A,  $$$5$"FNY5"5"#b҉X5 6&QDllSB6HJ"(HlHlEFRIHIj$H,k!$HR"!"$Z`HBX`X(R2|g h`%%%H hh (hzm$HHRxA"T%b(46"(Ҋ4#bCb!EQJQdiDiDRDiHQDF$jI!DȌ-ͲBB DD) A,@İD )(D,(@ ,(Q-,(Q(A(kzHjHDI*H9HJlEFFQFFEVCb4("6"R(("Q"DI"Tkb!HR!$"%"" " X hZ"-%@%P @P5^3`@KDDJDJD  D@JDDJFj"!J\*IR4(ZDlDlIMY#J"Ғ4"҈6" B(ҐB)4ĕDG;p$$$$DDDDDDD@DI,@ JD$ )(@ ,( D(p9E%"% PX"P%%"%%T"TxQ#P؊UQFEilEIY 6"#JB) "B(DX5IT -) ,(Q,H@JJ) ,P( @ឞ\tʐ,PP(A,D(@@P,AP,GMJ!Hi!HxgDU#H6"V&Q$"5E*HؚEHlQ4$$jHQDDR$ITHlT @HRHHbH "` XPb ` B BP"P/|ؠD@K@J)-  KۢI!!IQ!"8MbXRFQQDQ!DSU 6")HQQJDj!!"HH-"I%"% X%%)@B "P PH %@@Rs^LuK@KKKۡ*b!!!*/ kFFEREb(#JHb(؈j$6HҊCLH") "V""$BI $UyBDHD@DUJ@,P   JD8~\uĤ D JJ-,Qߩ$IJH>ujRDlREjDlI5dijM6")X")XTF!HIj$HE""!Hbq\Դ""Hb "X X B PQ` "PhHs/ge hX"PPԉ BR 'R"(ԉFDU (,46&DJQIQ$HQ*E!$QJ"M "DBE%Q(bj"Y"!HR"""%H% ` )E @ `R%Qq/8gb)JKD"%R!!!!!yJԉRb")R(4؈؊6"" #bJR$D$E*R!$"DHż*Y""Y!HPX b"H X b)@ XH X E"PH)@Hכ9g@--J-,"!!!!H5XI (ؤ(CbhRlR!4Y) #P$$ID)S$EHj[DE,JD@  ,, @JD@D)s6:s"Z "b%%ʒԤ$$6BD#R$"H0ˉbFQR5R#J"%fFH#I"HJB6C#P5"$(D41)5EdB$$AQAnW E )DKP(@K@JD  D@  ,μEX%"Z Z"%u5CQ #P"%L4"BUo2"FąDQE*QIJH$#J1[BB"4 $$1Y,ż*PIF* "P P HR R%+HHP ^RBRE(DA/!!*I!!!!DV$/^QR"҈ؐ6B(#PT"5"%d(""D$$EJBIBEQPPRD@(E$"bR"PX( `"P` )@Qh HrK7w: X"Xh]$$5$"6D$"T"B%bB$#b$$"V#/"$HEE*QJFfղ)ؐH2U")R6"RD$VBDD1DETDD\[X" % h `P"P`@)@X PX@3/5"PP b}B%d$$6B$)R$$"V$$"4"B)T& FDlD4"W(%bB(i"DE"D!"R"""!*"`CX""(  `%"XX)B"X  HRrιAJ}NR!!!HiJ!HD!L#DFđEjDR*Q!HHD!!Jj!H""""*R$V H""( 渺"P (BP`@R%  H` @%" `X %X̼Yeh2*CP#PH V"5!HH+pDR"%J(ҐHBBȩFbFE*R!""""HHH %(dʀJEPCb(@@@ JP(JD @ K(J@J@ysΉ`% ">V$"$)$"BB)RH 0"$I/2Eb"bd") RD!$I$j"""$H " *"%\(,DTD@,,A,D (@P(A, K҈,^pԈ  ))B5%HCTs8RDLV$(% H DD$E " DCRDET D$ DEKDD-.  B B BX% PH` %P%y%bBTB)""B)R$%b$""H0(H("B" Eq8&l"$HI*bDHDj"F""!""" X " X %q. @@ @J JK(@ (@JD @JC$DEIDlHDlIQbR$$"$"UB 6s9'e"jR""D""""% X %%P&  @)(AP,(JDK-)JDJG(lJĄRIHR!E!aU!!jQ!#D$5CLTBTD qNHI$IU"HEQ*PD)đB@E,DZD@@@AirDJJ-JA,(@DKK)!HFDjHQD!DDHDlTDHE%E+Y$҂ TJ'4rNFR"H"bHJHJ""!H**"$" " Y)k`"Z XLR @JK,,@@JD D @J)rHE!!$i!D$i4HRB"B6PR#"B$"BBPԑ DTӑ9Y̐"B$""b$""XY%"""" "Rd X`$ ‹@ J,(@ K J-)KJ!HDDJHFHla*DQIaHEbbHDIBB+"C DDDa9r$H "DB!LDBU,D@ DH "P" %R2p(A(J DJ-K(A(@JOF$HFHlHlDDDQU%RQ*bHHDRR#DBFHHDJHrIf "$R)`E`H" " ")B"%)BQd P@pj @h(Z %% X `@(cT#PBT""Cb"B) ")R)#j) S $).!!!$IQ!!IaR"""@r9'*$R@DEQKBDDDDDKHK@ J-(@(Hbk+H*h X"X% Xh>n(( $؈*HB $#R"$""$"CLBCc,5B5 BB) * D$DG4\9АDD@@$I,I, DARQ %(DJ%s-J\.W2 (R @@JD @K@SR!!!JFD4XH 5CT$TZBD"DP@T';9@ %(b"$IB BX "HX$$ i@2+r)(P(K@, @JD @KK;Q*I!+!+HDJD*DRTRDHQ%i+THDJ!V+Q"!XF" "*Ƀ`Ř9h)-e(@  (D7!@KK\ (@P,(}^JHFDHRE!Q#U "B)R")R"B"B$ 1 $1R(R P,(@EA;0`\,"B*Xbdb`Y"P"XfZh+r")Bb `)B>:%H#R$"6$%b""") P"4HB4L5 + "$B$$*$B$$DD$$RD$DC,H-aP`s1g3晠@ %$bR `JPD`("P hP \˕̹X P%b `)B#T")R$4B"$(Ԉ J؈4BB#PBB$$"B$BBB$) BBK$"D$QZD$KH,KD@@P:g:`(F@@ X "ZPRJ )BR !.W2BR X"PP%Hz8($T XP6"4"$#bB("0B)ȉ*$JD$$$"B%  ıDDDDDDE,DQιӑʹ,,,B!(Q( @@̢HB)B>̉RHԈ"$4%J"B""("$"$ I + B5BBBD"$H**DBK"BK$+,BBBCJPu DK e8 \¸W&B@ZABZ% "R+H%2IrJDtR!HiRERDlT"4CH "B$"B$) 0JR%ZD"!"%"%!!ܻ˸j]FhHX  @dN5¸+¸[P -( I),,JDE (A,}GHiFlHDDER*CHB(""( "Hc4I B$"$4JĈ% 1#k$B ELDDK # 雸ܻ˨Ia%" IB $@ dƸ/ p @KRf %B(" QsyHQE!%dHiHiDlITHE$4"5T"B)1"5"V*J!%I%T%!"%a!%]%% ,$KDDB@ # Fm #!A2Ng x8/P@IXDJP(A,@JDqRDjDDjHiDHEHQ!QQYa!DHiJHD"!(JHHJ#Qz^tQ + D@DD@DJ,,)DT@ Qh+2A '8/`"dP% @ H`R " _߅J$5 %J$"6$҉R)ؐԚ$DFDDE"ITDRTRXbH^n]D%*D$DD$@KED,JP(((@Qɓx9DJ@,Q*Q!*R!MT6B$Ґ(R) "5 5 4"$") B0R% $ D$0.tVHHT"%*""Z*"" X X`2@ fB*P\^G/# @ -O¥!!!R$i!FDjDDDDHBH FTHRUXDIjH!"VD]glf"BBE DDKQ,,@DDD@H P( 3(d\2eC/#1@@ D GpiHHiHEFE*DlbRERDJHD*@%ZȊ!"IaDa]I3]:C$2U DD$JD@Q,D@EZ@( D@KDD3P JPC0P2ב9/#  % #8%J$5 #R$#d"V"HB"CbBRX * aHJHHFH!bg\ٝr陡TbDHb"")b""%*B`(6(((QP,ѐsf H eCs^QyFAB~) B)ؐP%H45V@U H BB)RB$Cd"Bȑc*").ٝ:hFV"(HJR""""""%"X% (I`P`Q%P@(( P P@ P  &Wr\=$jFlHIlFȅHE*J!!*E!!*D#d(B ٝ!a"(jH"!"""""X (ZP% HY `Q 3)D ( (ͼ㔾HJąJĩ *kHIRUFJ"HI4BHQ3g\ hHF!!!"""*"Zb b  BP@%A*@ )ADKD @(o!*Q!!"*jFYJ!J!J$DjDEglιfXҤ0$BBDBBDDRD$DD,D@QE-@(PPJAh(  @ H(@RRP")bJX ^*"T45"%EEU$)RHBCb$T5Cd"TBH"B""1;fv똈$J$#U *DDDDD KP,@(@ADZ@ ʐ((@KQQHjJjJ*HiHDJFHlFDDE*DQcgl'I40D$"DBBDPD$2DDDDKDK,@,P @@ ETfR Pd@Rʀ(FT@@RP%@(H^"ԅVUBTCR%R44ԉI CbB$(ҒRB( 6&I3sF4#$$$$$BIDD"DUDEJ( (PP @JQd KR3@JD$pHj+*!DHDjJ!DD4i:vz&HDJ!%R!"b"!""""AbIhIJ" P@JP J P @(@ @P%%B , G+JF!R!*HlHHDRHՐM u33FF"4B1* SH DDDDD@,R樌 @J@ P@ @(D Kp+"FHlJHjjF!I!!N|rhDF+QHD$DJDVJ("!""!"X""%P "PP BP%)reBFA@ @c+@J((@ P X^ %I #PR$6D4DCI"CP5 #l)RBCd(="(CJJ$"(Ɖ"!(V"""""% b %XJPB R % Hc @)( @J,),wH"F+DHiH!$J!*HHFQ'lТ"B0%ICJBBB$$(H ,1TBDP,DDD@U), A( (@@ H%H@P P@R%Xx BCd)RTԐ)")R$D%b%R45'I\Cc+!$DI!"$HH""!"""!""""X b(B% @ `Xh(Ph( P% @@(@J))߷!HlD!*HRIDi*RMGYIEH$$(ؔB$BD$DD$DD$,DDA@DD PR@ )(i J,fPH@  PP" `P=xT5ԈCR$5$%HԉRIԐIRCI"(tiHQR!DDHJF$Ia*RX!!""*""% ")d" X(*X %H@ @%R @B@RXB@B׃dB$6!I T6PԐ5 #R$5 #PI (YDQHE*HQ!HDJHHJ!bI%!*H""FXP" "%X *"PPh D P@ RPRR H@P P%B` ׄRISPT RHB$5I 5 Y tse4(" 4$( 6BHJBDBBDBD),$BDDDK(D@RZP@ @JD (K-"RP RR@rJ!(JJ((A @-^"+*!D+!"JHHDSlh"(B 5D*)+ BK$$BBDTD%Q1U,DDQ,@DD AT (P((J ADJ@ D@ )(GI+!*I!l!R=u"#Di!IH$DHEHH"R""b"""(B"Xb X( @ R H(((@ @ (  @  -(AȆ*!ljD'I;g:E4)ؐ5 "BH "D"$EI $$DD Em,D@D@K(@)Q(@ ( @R`B PI@PP%% bӅd%R%IYCQRH%d%PRRB(YjE!DD*DHEDDDRHjH" "Y%""""P("%` RH@XJJ.b P P% HB B`R#ӃdT%jY$$5#QHIR"s:DHQ*QFIT"T"H$$"H$$CBB‘  TDP ,@DDDQD@KU(D@  (P((.H@P  PR@zpHF!"*IYH( %J$5"#d"(%P"BBU"BD$BBD$$KDDDKD$@DK$DA,@@,   @, J)((@ U*IJH$*RHHjDM")R( XT#I"B%cԉ"$%I BBBTBD$$BTB  D,DDDE,H,@KD U(@@ @J, @-P(@ @ D-(P)!j!H*HHSigR#R"Cb(4"BHH#I"U BCQ1S2EQK 1,DDDDDQ,D@D@(D -,J .HB@( R%P H@)@ ZR % P"P=]8EPTRD)T6EI$BIFJE!!!!$DD"D!"!*HbRX!*!%%H( b "h X%%`R  %(JD @JD @KHJJ!*IIRjDHHlHRHR!U!!$H!"$j"*Ib"% hX% "P@( B RB@)@P%B @B=}8DHBCQ BIRB$:HHiHE*E!Hj!DJlHHHR!"EaR!j!""U"b""Y% ""X"P` )BP BPB(%%(BP`@B)B R )Dcվ DVD5 %PԉHf3JĄDR"F$jDJĆ*R!*HRXH*!JY%""" "%dZB ZB% %@)@  %@@``)@X R )B׾BEQX"U Dҝs%J$#d$TT)"H"HPT1X BBT$$Cd+ U"BD$DD$DEQDDDED@DK@@J- @@K- @@- -@JK+"*HJN;DY*R5R$%JB) R TRD"CP$U RH T1$DRQDQUUET@P@KTA,K)(JKJK,-,((PKJJ*I"*HTtE*R*HlRQ"!jD"!D$HEa$J"!*%"" b XPB %b )B% P% H B BB `(`@` X _N)TBBU t6$RI+d"B6BBBH" CP$ TJ H RDCdK"E DKDDBKKT@Q@J@A-,   -@@D @@Q,zpj"Ek"*IiDJĄFȄFHRI!*HR!!*I"ĈR""(""Y"Y"X* (%h B P"PX %%`( @( P(`X XTBBVD4ɴԕ) Y  T) H%I)%P) D) B DU,BEII,)-Q ,@DAJ,QA(D@J(@(A,D@RA,KJ*I7&JHJJDJDJDHJDJ+$H""""*Hb""""""""R* %P" B "P" PH` b B R ( RIB XPӌU%QHHRVR*I!JHIHRHHlVDI!!""X* ""( %ZP` )B ZY X%% X" %"WN0D&Q+!!JHjJ$J+!!!"!!"*HHI*JHHd@H"""%""%*%b%"%`B @ Z"% P%" R""bRBAh"%tTB)J$j!!$$j!*ĈQ*RHHH*D$H""""*""X- "X *%( B b)` `( X" Z X"P %"" ` (h h "WN TjM"BVBVBD%P5 BV%bBEI$5$HEH Y T$BRH D%RD$BET%TERDDEIEQEQ-$UD Ei @@ D@ D D@@D@JD, @E,,TKMȥlRI T$)RHTD D5BCR$%bD%JD5EI +THRDBIDDBDDDDDBAHDD@,@D@DK,P,A- (D,(@PU(A,P@K@J@Dzƨd$TBU D5CPQ"U CQ Y T$)$$V$$)TBD%d$CbDBU D EI,),I,DDD-D DD-D@D)-  DR D@E,KG%`pP@0 !QG3/k(ԏS=r8ۯ֣O\OQ]_''Fz.ͯCG.ǎ#3-#b^vf{333ٙsfff{k36ض l[[OIط~6<Žg63l[fsCvs[iB?B"""""""""9sHDDDDG[kiDDDD{B""#{lb""#X-}AD|knfD}fۘ[i}yii[v۶6nOlg=nmgYn{s۞{s۞*a)!1p2AQ`P3@?u'Eqbqbqe^.e"xˇK\=))q񁔋kϰ=å=w]/&{"x,חcx׋x׋x׋Vkɽ漛٫{oj7M &1ޱokɇ{^l=y: ^00x:^02xEvt`ee"xaax!)ЋT)1$yBTyjRFS-u6%5QtC\2܎wA Asr`I9OiОCs'|,ē#zq4'ji⺌N ːhT#hT~*đhz Fz-)蓠=sB3trbVL^c|#lPM|~c wy-fȄ'snsB3tO<蓧pQRcP xMpmQjr[u7o,cayMXOUtwD&Q= o"ox z4i/,*jv| $j ᗪ=gt896!<*r֊XCk(4zYg\c?N5< QgX-Þ~,AqK4׈o;*\2BoÞ?Z|w_ٷ !;x[ǻᦜ|2*1|1Qh/B| Eh,{#S>Dhr!jI]G5gܡ';,2δ+2\,LᛊK|7θEZLo4+ƍACe\BFh˯> IMU5|-]% l/<7x?45ђƚѾ%N` WCMhi5DiƧs?Bt%U鏉bܼ [S.[^msÝ5Z ;#Mi^#7UV'/U^CMo7;7դ:I!| v9N>5xXťKm}hj' -*_ba/Q|p+`W;F7| mr=϶\bF}Z4c>i/jҾ !ou|63 pKҽIH܎f=w IpQu$1-+מf=^ONm苭5w;#Mos#-]9u_DpkڿF3B[|5^後"Bj-Ui1LkQ>ƺ >&V51h_j?@ߗ[la3i34/S}BlzMDqKKԽ-!w7|1eե0hz!8 F/P~D!I7~BƧ.B࿡MzgO~:`! _r4ccOBܗk9{B[6u!B Bc^CqBKB ћ3^'~Dyu! ƾ5}eׂB {^:A?u!B <vƟBwktצr(COwjc_7X!NK2Ð!Bflg$hCjyƍĄ!B.yvn4 pKAj,p!B=ocDbB!Ba:/5b!B&&콣?;&3^H~І݄G  eamւ+! e Ϲ?7BZCo2/ȤA ź͆AiK@l4u%W B]YvD!BD!:7~ѱwC _ 4<!N,h?؏ Ve. x!B ɱ;_RAs_syDBa < !4Apw13/B!1zd]#K^BL!?0,%lz3BCQٿތM'߉?BA(qˠBAk;+zĎQ%^W a>߉|ѿ$1BxP sHH$[$CV,zI܎諹JRRy^gw7sk؇ؗ.Q`Gzq]q\Eec;sFŶNJRѸ\nJ\..7 Wrv= GtR^Gx<݇5UX!M׾JGt}_Xq]x$1)O&)JR)J}Q}R>>;pqzp_zggB}Gv]JAWl Wܽp K"[)z%p..4Q]B>#W|h#ף.WźkGrOBaW~$/RbnKq-)JRݟq_Gܫx<rn6;z_rJZ,ب%K:ӽ^-/sһQAi= +RX#lC+K^&ܔzW=/G?g\ITвesBn.[^)xܲBJw$,dC]E{zzT#t @Y,{!"4=/x<.gWrƑ.Û}b˧K:][.7x>O^̎T/!l)JRK)K=oT͈pN׺;xCBLEx.r^{#6E)sr\Br>Q7V)K7-.sܷ9rE+K\ ^cKei2tirRKtnҾ&ZYur\FRR)uj\ZBx,5z.x9{ t;uZRsR.kB Rq.о8lwpJ]jR p}/"*贸)JRiu t.3lu)s\JԹ)rRnKwۏJܔ4.4)s\nr{C%QܷJҥ)sҗBpR^^9-u.KxR.K.R R-;s^ RRJ\5.K|J=tnKKpR5)Kir\iqpƗ%.k ]t.ZR )s\iJ\iq.7%pJ]*] \ R7=.=)J\iKx;lu˞^.Kqiq\-Ѿ2S=. ]+JR)JRJ\.Ɣ|ιtKйiJRKҥ)q)Ku[5)p\RƔ)JRR)J\ R7 \-ět; J\.)sҔ-)J^]{ዸ]"\.Z kƗ Q)][\N%եiuJ_$KC]+K %)J]\ipTRK^ԅ׮—%Ɣ:\iu.zRqҸku[]:\x RХѥx+ 5кBҔ”TХx˞Zt)sR)KƗ=.//и^.Z\o%N.o 6w?$52\]#HQc(GP|(SO->mIKw$&) MtGi?Qs8!BjyM9Pay<6BeFvxX(pKh guSѢc*EiH$K}Te FF}Ї;sC(N,G[JièrG/k;"|g# dl$nKZ_J76 N$I/I[20DhPC'TGGxo U|cua;q&WaP\ ̜_ye6Kq2W䛲$&&%ͦi#r~^w0r8`n#kkOͩY"p8)S9aDA$Ta߄Hxd0Ji0dl 4lFi'j՗z+B%t2qؾIba/Õ(AzsJ!?RZ*.a &6C%U Ā@ ndK6$ܗ/𰦧G|`t*.?Q\8HxKxdQ ^V!*D^2H((3n(=B/dޒY C[$G||wNcã/Qm҂jC|F4T? @]2RnT;PwVDʕ!`-[i%,$խxα]2s!jNqv"e1Y" 8րuTH(bXLIkM&I Yd,I(}Ȱ1;!SdU*a1Ơ-ݱF3spdR'Vב$¶(TkC?&OmoM'p+ffj.wN7v-νGQs-(Pw9UF!0uBI]$M0NiAurP ̅upwpһl[_C[5i )$6yz3R$ͯ|7R.%`ݞ]9Y†V@HQ ~SXXP->j1fYm$ $o"IK{M J5dUZLh,raǨ!3 \sTAչ0/r Zt^Xo~ͶLdl/o[nׅX@HvsSNH2 zոؽv-ADqrM%s=ߠ`S@/KOdfމm>[t^>ɈUN1:;XS~*v %5b!%ȦVT1o6%`Em2mm-_Rm(BV +1r8|C_gPb<]rz[o:_s]\hJI\ !<*Uad.큑(?bͤ`>bgQӏ74w3͙6rAG b̗p@ %}-XL&h)IF *UT-B8 u'x.?jb>Ȧ#f< T18"E)?NKLbI ,$%ZvtN!U!;'j{)."`]^nC ͋rfI Ŷ6ץ5mf } }b72]jǮ}_ B"**`&|l'̂YM%@pI mT ~{4_WKeNW`u42Un=,T&.꼸bk۪! t&I`}?d16NԬI,MjT@K& r6CPQ-@BǴc ٩! $rt TqEidKoHHfhtW$DiyPA0Q!FKL6JGY` G6t1afQe8x Fd@l%%A$wK za~LJWD~sQj=0ZZ @?nEQq @ Euv> @MؒI@$$[؛c[Y6u$Z,b3P[n &$!=`E0qD>nELEMm$eGMQz2\7\۱%,YY/t@^!.B 5'nI:Y";)'>a i$&.@Q +`$ K8G{rΘy0+W>nf+ٍ+H#x[CI~ɴfnAoIfJszD* g љ rt|A؄KN OǭC,zPEEshn Ƽ$|F@{A0eh5f̓U ߟ7?`P)fm@&QF@l>B|0Pbig.;v6&Jg BaD"<OZ\H++BplvJeu=(Fcn)ZB~y!]i֥ArOim-25S:b:8Bs)3Ǧ&0iB"Y f>^G3=]!0webIv[0hBA7fdԵPWK(yW-;l+ G8 J7Abbsoa8;؝f~`E̓/@kDUF/*I#%^[Jm[D:$ <;P\cԍT뇂':' xCu!CKD4ͩlGI xqXẃ$X韃'%k}.NIvfw>OA1{{{լY 2!pIf9tӷ$`Wt&'xN3+Fo]W*f&R<9 J7S(zatցrjN7K] Hl'U60k -ql &l]$2thk݋$[\=l @bG nmֳj~M%$I,:w!H2՝>ΊPTĨtf?U)?Pw}@ݑ \Mգ|`i@ˋHΞ('BIH $Q4'ܝmbF?2:9AoXCOnB=&'b= :y|\ KnD rrE)#|53./@1ԣ;llƎB5+xH/PNg/nK>l.FM  :77l& " (/mY$Y/if]l)LXEp:A?DbfJ!CRQ>q?e6I"Yl=GbYٳ;ke-,W`.J-y-]*v\VʣIi3qPhX6&"Ym܄@'BwQ ȴ K+?[kv@1wĖ ʞ*f6D*AXqAcz;>3a6$nWU-IF]`Sl/8s$$@K!&D#ˇ!J)+B(c1ڻ9ʑ]2- w}%Pƽ 56!(<$ H -$" R[WK:@CCӍHȩb0ܗU  t ͆#  ! ! 220b-XR%g\gXH>HF6$6 PQ-&eo\ݮCFlHZJ䀔ut2ʗK@4E2 NI vi*G3KiB=z:G1m1EE7(?pjݫmceh J(h͒ARc-n`RmH&ϼʷqF;A:AeƑsH6YEqX omCM΂B!6@)6cV݂gwͦLFb} AF Aٴ/N#'%%D0OjGu M4>ld )_Io܅gз"#U>b=pwWj6,FpG%Brۭ#& )m yybE$eɦ2+d^w%K, 0sLǫM"CZRak7:zu*=r1oO3?@pJ| mZU!oHX*<0KAm2bDuM{!m-iQ ׹x̹;Tg/|F[ؑ5JA4+ `$ Qćā,6LP1*OUxO–kLlsT@z4Pl} 9 vdEϕ X 'Z`!'jVnmzy(y@Pz0I44IV2EXW @nmHl%XbYt qD Aú)(0D)2[`$idӱ?{I6SGy;pDr kzR5($SxUA{ HUX鐈mͯ{Hal֓ }i*H&6&`AR9'ŵc0iU.D|KF͛ <=-O6oa)%is@=dl ѱ\_*=~ ./) @28@d̞dfgK!m_d6ΚYA46yt-Xۑ1mgΟM')| Vd:Bdo4l|A'<xWB_kWs(`qY4PWjVg3ق8 Y0r %1/L'+[goIP,aɳ #I{ .D0d&e,4pߏh sGiݒ-bZ V-YR`vM 鷋1'Iio@ p~x|%?; Z;<'pJ΅Hr.m(FɮuϺR*iGLpQc6[ܒn*0P$aCFI/_[}m6d׽cF5&PH?@Re'OQu*eLKw~1~d) ila7[vMܔ& s ybHR,0Bu 8`4C#@ݡK2y-1cr S@DȞ,=`$[m l #}Ah z ;fԉf$T3ρ m/Ϥmlw+X0&$IL$ސď,Ϯ-" oOSn!Nd/zlUH925[)ITرD9>2H-Z7'Rp6dI7i[umwW+OlPhW,_I!"!'NA Tѱˁ;9sf>) "UT>fu[ $BH"]y7Dh IfJV'n"nXG [7̼ AHO=rOšV#2ZLؐ 53JLٴY`ox8'_bW,BTRsR:_" vsz()dNm/cm2݀,Z7@! k&~-.JZx[(V=CÞ;V'GbXn}doYbYoM23AР$OpHM۵y(pZ:_ƨ3ޤhť+B V$g#yK=mwL@ 7.oAgICw)s*N;HKl~)c;0(c3yfNmMc3$I-OʹZp4Tii-ɼfK/`.S<(W93r0't@^Z7k) @I-$!(f+lB tYe<,KVgAh{Rz/ .yFs-t[ZVn5#i4x&K<ͯK.~JA=2씠v7'ف[!gGG9@g5b5jY2Ě),Գ3K>뾥Nmm$T14gTo m PQ@d-R0}XLA96<.d+ 4ṃxD޶X ăm7$O ښo _:H-R\~k ռbAH<C^)UZFBY8NԉH~&'rK\@>Į Fx1RoO%%U $OJ,˵p`q X6ٓyY[ &#?i֤F`E}З);֒@%_>|CNO24 HK2^(F_S%U B.9.O%!7D`$+g˥R$6 m}G6%',yo=$2$kyĹHZۥ V`)55R줥S`)^~#>I@ @M8 > )_&jX :Utv/#tȍ1|3WKZRGн=AF@I$풒 +8J؍?sg'b){NH>4Z7jU%YihԤ{! &MMY?#r\J\fP4!7apOF(NC_&0Dq CV&D{gA4%H0I $hOda_Ļ]FB6rԅNrD7WvsF'VjqHbi:Qok6Ȳmd@l 1CV\B`|p%e#MH "nGfKM@ʮ+xpǭz"+—Qs%5䨊7ݰ bP쐯L 'ƘYYl@QhrvW-78OV^JpEFu'M2$6Nzr.^xֱf(4ݘINZ@wT1v8:7;,vUf#?>bczJlOowGB30>(rd۵Linۚ>dѼZALWdi1J:W9-Y8V ^a< #+}.C .̃>l4I$ޒ[ldψR90'')CZe_m2 e} BȷQ] 9Xş=@Ntr)x@ bE'ݶ oߐ@ HXD/,=-Zv;pF[J1KW0MӀ*/AX#Q;~!>藸i %H77@Ђ I-H'o@s1e=b G #+bj1ԫ"L$IMᢏN5+VD)j쭄7XB>#̑$2BKkH!} `_O֬!r1] V0pՠ"5)Kk~xG٠ׄ%H&o $$II h3a nnm;:2l\b4vp"328[&JÒh|eb-SĶ=/E43(.k+@G௷LBmҟL7#?Yכ;`$bHQ-jk^tV֘3(xqXvY#~1NQ$I@MPM&HI6)/Tܗr.O*UW+臊r0*G"RDl& ~R f4m;+ԑ, H ,KmE`fD%0v Եd,\ [W! 0@1!AQPaq?ͬ98Y4rhPH'5`'>xxv9x|ٳӎ:ab? {vxrp+:T+zx{yxyv |qGXGo$|"?Ѐtal./.y|>cChѣn8c8`BOq =ۧ6AءY9㏳ddh0ۣ@ލ::tNn:>@?c:~7q>"8QCoFG'͛4hѣ//` @~G:{Z^OoOYѣ΍0ѣG/N|M;qdž@? qEܨ.>/ #񞦍4lنlv?1ptxvphGg;0:{Xqێ8㎜p!0qxvƝ ]ɣGFNOGptQ AN8㏂O6q6talѣGGF ӷv㎜t!qN8 {.qqψ`_a`Yຌ8.W@,<>gf8zaPtz:{\_`?|c~j\ۃCx:6 .8Fl{|v8_&?8]X|]}G@СB4h1C 1ن0ۃ#f=8;xqǷq |S;^EF>u9;8ta 4pyy @Ay6ph|TQZT|CO|!0ht| 4l4là t0~WN8xtӢ >!{WPOlxM4h͞՘x/(:Pf:99<f0ٳG&Ny:z|8Ͽ lpjڇ ;6hçf6l pǕT_@!?!Ebc"  G4pzpvph٣ 4mx^uP;`ѣF4rppa*i{x6|_geЏ62629rhhҊ 0NMy. > (ʋ|g-s!P0v  +99X91ed٣8mb!ECŊ8-j=TaF0ѥj8(n89!`=[ZV6,q,e6fMpaMpaѣ ʋO~bSă?`/QEE(hZBލvlamY6h٥`pZ.#AU|YV(hddpTg0ѣplч|Xʋ8*^Tц4P l6b5P"*PC.8 '200p ц tl؆1h>p`1OQEXvsX(,X! <A@ra 6vpaa-ay*.j(E .•,CA-PiX|G4hЇ(hvmE:q梊VFC" P~#\V "794hÃFaɣf1Q\YPVEkiqZB]ƅ:qz94rlà ;4zpyJEj,|/E  X\'& ;:84h٥G&=Uҥ,J(ePڂ< ,mXA>ن,Ta 'g-E%kҿ:,}"ڋJū{|;4 vvvlYF64hyD`dePJ+^Qcgk ?;/.ڣGGG&՘CtEK QdP`PB>@QPb Xtl$lpF]N1EVTǁ (qT,aXʊ,dPF%jƟwgҳFM6paF(pvrF9ZQEQ` Ҋ+\FVIҵx gT óC kVy,J(xYT#KJ(`Z,`AC"}Vo.=8 TprplYF0ɆKG&՘v , TaEJ*V-s\(P2±Y}͂\ abN*YYXQEgXe%jX8 92Amxv|`(lF6x9;Pц# -((+T0 YV( +_X)lZʱ2 ه K*խQE7C *]ՍV(P9@3_AoD fcf QdRj*ZQEQEJNQEjqb(AX !~Qm;|\vvvvhCF#DQ(EQEXQEU- I V)PZ4P,p(h>A kxQl҇ɳ 4pEF-(ҋ+ (Qq0l9EJ ӱB+QyΟaThr0ڵF(ʊTEQEQEq@/T6p0X`> v-ӷOİE^4 QeZ (bҊ*DPZDV?" p$H(BMpzxكO>^("^ѢXTŠVPP6"D )Kb A. #ry)ۏŠ!-(ŠQaEj,(ʵQEBAA #Jֆ,]_so&8r`i|<*(\TC(*QZ(*\Х(i b({N3B{oçq&.**QEj,0BƖE 8}Ï*-<"(BhQETإ`!T(P,`c-Aq=M;y|U>t|xq{rDb4V(EJ(QET(RhBFF4(XlтN hs7n߀vqLJxqb6$QET(QR !œ#Flb T`ɵfy-4x5G/?p|N=#A (>KETaE Dj f51gx>*(ۂ'p#q‹Cɂ#Fg.8cN8vNzqE[Zq9c1YhDQRJ-G#gg'hዉ-#÷cqVEJ7*1!ۉFhmqtn=88qqxyvx88gkf+<#DD"-+c1*_'N~iӎ;|]=X2P8gF5!]լ>:JmW>c/+ 1f8)E:+Y PYU !^NK?(p~5CK,GGzp!Gg Ak8x4xˊÆ&xF0ÕE^\T|Tx?ixV)lɄf+>%J*t?/>+#,qV-pThaeYx0;[j-4 (8,. ,*V/J=+@BIypJ%KXvzJ[.+Vay${Pk*.(Š(j(ҋK*+QR,ZVuV2.+҆͒/1u4R \ (¥JQE(*(~ßʊ%ZTy\1?k +VⰢ䲸eqT(-(`RkȂ֕ ^R8Z\q\ZQZŠT6eE?cҊ%QC%QE,,ENQtX*]]>PDRZ. XQmEQEXTEQvQavT+T"ڵi@; ~E,EV`ZQEKJ\VYQE^%ZYQmEKZ+R䲹JժT{XYP. kKjE((j(ڥ⢊(DQEVE`rTaiqEa.խjTZ[ZX[XQZ *QE[QvQE,(iEEK TXVZ+TaxFKgCeqVpV *X\TXQEQZQpQR(((*,,RYVRuKiSɄ.^%U(ʏʋ (*QR(2(ʥQEk*X\Et[]VFlaEjρET\%J/ࢊ-+QEQE,8jTʋ*.*- \WEQQEXQEJ(eEVQEJ(QEQR䴺(eZസ,,+QaeR-)ɥ^%JYXZQETXQ`(R,QE%.**QR⢊+Vʊ-(Z.JZQR-atX\\I[VEj+QmrXZYQqQZ梊((*]QeRլQaR9BJլ-(Rڊ(iEK+ (EV*QR(. *YQE\T(ʊUj-)+eeOky+XZQmRj*QaaETr+\(EQamzTQEV-,*խ ^ ʊ# (Rը((Z袊\Ejը"K! 0@!1APQaq?PO J$XhV/J\ .KKz>X]FWF*Y\%EKaROJQEkʋK k !_\"Qmu\ͮJ%(mZcڵXZXQ_FuR?ZKȼ(/ *ZXQpTiaqXY# EP0,ExPEX\ЉG+ఢ/?YQpYTJ9XX\<~20.-EqX/Q .z,. "dB;.4"ڥqYV (Ҋ(B.<HCJ, . ĢRۆ,. կfc oc갭GpXQpVktZzX\[Vڊ+YTF[TŬ+\zȱF0ZҊ. Т没b఺96 22)XיX]T]VWj. ֖yWaRhid |x졳Q󟸢*QEJQEy^k ƻ掏PȂBDF?x‹Ƽ/.?Yذx&;#`ȡc00<"keE]`^)lOQYomEnկ( N16,tP`yT*/"/| Ϩœ4 (xPCp[QEyQE^6iq#GG*.ƺZpxU-,r+k TtE /8ұt5T-'ٳÅd<8}XAd@Tv_S=PNCˡ_w0:\ViizEvxπP쇁b,ellP5nz^FTE5tt6x0ɳlPXB?zb<8VkJmϏƍ8 X6: ŎT6o?0|?~3n>WC ="D:VpUQE\t((az?\DyFp|<(>|J.בqCgvtvy8l#22=eK.v[Tb?βpp}'hPuArQx~a*\Hpfχ'*vaбC&kON?**\Txbū=ء2,xExpA`?QeZˋ - _= f'Z\2,s0-p{T49 |(ǚr a!ON#fyylCv ^GOmڳXPGO01sqǕOߕl:T|Vp>5Y x\Ś<t YplW[iǥ6x(z0&|x6r£ BachrۏPxA㥷V"&a0ˎ|NY-Pӡx]<|ETSzS?GcG)E y OE;Xq:ah?np٣4p|“>,lPG1|].K~Zr{*=Q{80x hls8= EgF ohÃC(4/gnEn~y >.OSF_dC#qQZm? k'!8:;vog'`_dptXƅ 2㳇'C4rl&w6tBLkȯ~XpN>|q#A?P|'><(E c !c|tqpz8rpi6xqvl,dX{+ɧta~BC C>qGx}M:H}pt+!B>4(`ds''ߩO"ƞ#cO m '4@1cCOŊ#:tyxx8q94iCG'gFQn;x|O(,chp4(ax좊(qۧ|ևm @0 80-|t5tc'~>t໭amtO'@b͎B9<bp[<^Or2<ŽnQO8Cftx0A}V^U?4;-Xq\xGv>'o҆"a!_}VF. 1 ӧ =y}N^F0C["4429 z*AN8㏙aptm=L'## /?ծ8F@ޟ8ӷNsgGѵf0e^<~dmϾ/yt˟rxig8} vi"4>x= }?y~COG5q}S6t14Vp[ -pOӏOf94mxFv\?"rcˎ8p|^E)vhiCÎ;|7Qψێx}#K"רv,ay N8ӏN;<xwӷ"%Kb8n<;qtgpvrpleNj-Pm:q:=vci6iͻt2plÎݝc<й 86$H8GۆN͜ <>Onň?gNMZ]qh8>;> t|L<#c-hhC*v|ʟ#qh G8÷xqtӣ_#;QGCjeK'XQE=ݸ㍂#<;q{>Gb0iێ<=8m+FA g+㧧qޱ"Gqq<=8t.`8#94}(8qqD$O/-Iţ8O>ރ4-Xإ9\]8HB,Z'cC=4hH"D"T"(EFp!3EQEQEQEQEQEը(Š!$]Ej((|.9[qE%Ѱ$QAj+VEE PIQE(+YQE%j*QZj-,*QE("dBpERp!4%𭨢Ȳ(B!QiapzTJ41R<bD"O?|.+sQ \Z]H * k7gۄ# B]()RQEծK 'J(c|cBC:~BF8{/JC}8!J,,JL^v6@BxV~k((("' ux tサJ VuQv^J(J>886x q{"=]XXQeEQqQEQr\WyVNs:< |JF TTĢ^f,G,A憟!a$уkCʹcE|ţT⢊+ yVpyv,lp49 qeP((K߭yNP>'IC+|w?"#ʋ*(Kٵmǃ8C"?ÂQiE[>z߀];8`O[XQz}TQr9Y^p>Gg+AR<׀hxW'ӱQEY^EX>FPauq}Vi8[^kvy5c.|]>? ,QEeS궿|&͸8.+jTQEREapXy>cцQE5}t(of>bqn1qV,O6988As'|ʊ+{T÷N>ongĝ<qy_7{{:yx|n]o?W՘pvk='n=j.~.)!1 AQaq0ѱ@?8tzå""#H!1~DD\YoKdﶿ7 A#"/qÇqw?Grlg26s;I''|Yě9ML'#2Lnjܟq'_Ç=:zpA"#A b YAKIo/9&YdYDY""#DDFp?y&&,YܒI9I8Y̒9ORK8Iŧs'Y?vIg3ijԳed2Ys~$DDpp"#DG Ae^8YdEYA 0?{3SSOK0'YYg "#qӧ>e;s8LI9|S$I̙q>I>YĒz׭xNg=OSpÁ#AG"DDs " AAdOƓ?sg?Փ󖏯0YeA܈9 G<^:|O̲',ǾܒgK&xCgIxx|x#68<#p8p"""8A 8AyĂ" C,G 7捏ۧo-"?dY>$pg;e>~xs:$N6LdĒxpdž?fN68DDd  ADٷ#P?ik",c#p|sd$2w9I&xԲfIg zdO3lj3ds:;ÄpG=DGq:8DDDDDDDA'^}~` "#p, ~&y?K)l:&q6Yg?|Ӟ>?<Ϛw>6[ę:I{N3<>Rxg?g'dGB#GB """"""=p"  {8lAG2 62 yL8ի oȇ>F|?mg,?YܾII%:tÇYp"#" ,H" Ap""Ѓ 9Ew Ֆ~/' ԏ% p̳#?|-'3x:3$9fd׉~Nz9zp0G"8"#"""""",D0B<}~`DG2~b=Ђ d[̲,՟,C+??~1Z,xsxp&Yώ|R~ =ffL̓x&I$g#pDDGNH""""#Dϑd@_DpVAw,9,,p>M"?La/fyww/,[ d{!~y~ Ǐ_}O^33Ԓfg3׌> 'Ǐ^Ç##"""""""8DDELDGB8GX^9Ye>{ɌM~fsRI$9N?7_}qux~xž7^,$'$[xI'moᄎ?NG8=Dp"!#:p ?8#g, ,,p 1475鷌$g~ovߎ8_gA; ,<^/s?$I3ʻ|/"&&Yyq~k||z^3׌3=x<ɘ[>fBc"΄p,8A"b""b8Abp? IdIn?\  $~ =ϛ^~3=g3dnj!>2gpp"#G"""##0"?/ֿ'gÑ8|HφYco9O̒lI0?6$o6mvl}w}^珙'}L1~'"">DDGb#tG#"#1"3$_/b8G#:Y m7lYd &(%~=ϟy&$v{q9{]8GG"""#"< p~<~xYӄ-?,s9 wx&Km?cIfOw36xYggx~p_G#p=GϨ:"8p!#ż8y6|# \o7Ywr<ܒq&I$x N8$習~/_ͼxgx3?tm"8G#DGp""#D8D1G8AD|D,1x["|߱?< >D86#Yeϟyz$?vg OI2ymm}=gAρ",?Q,~ g'$ZT}$O\mmmgg "<#DDDC=D<"#"#ӄD"8GL|wȎ&A8[,ݟ,{szz^yDpo",^`O>>;sm8xg&gBM?'KpIͶm׋׋?>'e8x }dlYex#Gq=GDD1!~{ C(xg|ݿeώ^޼xgI/-kI>fefe>}=g!dY/q^;o\o]ݿxϩ $ğzs=}"y O'DG#{ÄGpGDD[""ގ8DC"߁w,  ^--m~o?YmǏ$)%7܃?oxͼ]ǯ33|܂gyO3" Gxt"""#GDDG8G[8Dp/N"8Eq_ YgE-<ŷ=g3dݬ}B~Kmm={zŞ}w"8EAoϰ,/oOQ8Dph1qzDDDt=C8tzܐbl/Ԉ|6m-o}~>Ǭo|fٞ3Kz3z6fg$ mͼml7x/,s D8zyE8Cx8zqm8G-͏Qo}G7oymx>9 +-Ymy~ɽM%t"=[פ1؈8G=C pH#lG~Q7sx_v#υ}~Y`̲;,1G2ȏ/b=DzGC!\ݶ:|}mm1ͷfkml,%mϻ6>͞>m6s393̒[I[fճŗm{9,Ydp 8D /!/Lx#D[Dp:DGxz#E(pa?Qюpxsmmo׍->\7:l/l3xͶoy3m>ͳ3,xe`N2!aDD1 lG 1o"b-8p߆6n[|[mz37c#~Dfgۑyl<[fx\x^>fzo祳3a&g7AeY AAp"A c_ok8p|C#Gl68<#ռy"mmmm6wymL^7s>9[m6~ 2x[eY=fxg'z+LŸqK[f[eY[mxYgmfg6Kma 0ml[հl>"mm[ͷmmmxO=9~<8>Ŷ/ٶ66[g'm=Y̲-ǯ33fe},, =AppMW/0c[,GDE 1!l6m=my\-mͶxͷI߅~٘rxy<}/ŶYeYz׏2 8GG6"8tl珹ŞLϹx~xAdAdp>" y"9Ad , ?pA ,iOτ#H ,>Fcwsa< ml6~[m=߂.gw:c~mffm[rYxx̳g<,|g]gϹx "8AYy/# AdB#G d ){~|!z8pvo7طoz>cmomme[mż/3m3/oųo6[fٖfxYx3ﯫfzDtϨ"6"8YÄ#D _,q1e DsmyamͿ|ŶmmommͶ-l!}gϻ}x#A|sRrϾ>x=ffxV|ٙ3,> 8DA8DDp# <,1{8" =DyA'l?NCtщg8GP mmmmmmͶٶyyb dXg3Ŷ_6ٖz6lmgm/f3=gyt#b8DAb8DD@Ä8pA8AǕy}xx>~۞'q3Yd8[mmm\ܷomem{e? mYem[|y?k/h8ymm3mK<}}m/m[gYY?ÄDtp"?8D{ AÇ x,2΅8G3Y~mogypʒ?fM3eGmmmm=mmmm}0̾g,>oS0>W#iͲml=x3,[z<~,|z/8_tq =zDE숈"8}Y}GGsg_we@@>߇&썽۷݆l6yo6mmͶŶym/xled `=[m-3~ 3׻3.sg<}Dt{"#YbdDy8gsms?<e-mmmmzo7Ͷlml/6m[eٙ,0$^ zvOa&glYelyLg_ogY3>emٶmxxx6GH}#/8Gg"8p#3";Ye:5)~RC?+qoLb'%m/6yŶmmٶśf_<[m}6Ͷh[ϹHH> &ffe/xx^//3G "8GHxeϙaym˛moxme^e=Jgf}[oٙzs׋Ǭll3xp1Ä^#"##dDz8D|G"8G#Hq8z"=G #~, pLA\?|g oBԆ!~eIleٷmxmmemf_m~I{dzR`n/g>:]o,gDE8GäG"#"<#tG_\#HӇ\} ?2Ye|kz23_09#Q۴ *?y ,̟}[mll2m3meYexmW3e{})0ObK6ͳYoAeP/F ??ߴ?pc~ƒzg%MkO2n%lez ~D8{ qpb#Gz"18s"8Fp:sGCXeR?Ŀg7_=~oHϛGtO,/OPpӇ[>G8GN Gvls͖YdB!Qp$oE սw:2$mm,a32pId1|BdC_ԃm=O7!_jdI<3,? fzOC?g-""8{Α/ÇF"8? s#ܑ|9Yepp<}mw?/oS0,,φmm,-e,,$$$omѿ2?  q?j?|AjJ=%$Ǐ6z3ÄpQ#p G>8GzDC#ӟPp:Lb&y,ə믩v`,̘I33=fge#1Ӄ؈Q""!Gyǎ <80l=m߻x>/ۖޛL/ȗ#ڏz?~m_M~O?7A~GGoߵW[/п~W_Og6?6mٛlf{Lf-,-YeYe-R,/ H6HhmT>B!5 &LI'c33lͼ[m"8>8po0lC{؆aam:~_O/7'//ܿv?刏0__PlO? qoHmbۃ|C_mxwgK~ _W[gwoߵV~1be,[e/eYK)eYeYfYexf} 'TC?by3?Do}(I$3=y~=.# sxE z"#{lE 7՗#~ݯOŅoߟ߸v&omm(N/?b_g/@f}y^?ow18{æg"=06,_wV}lpml01ض!xxcGGDs_`|/A?pm 6m|mmkmo6me%mm-,,-_f,,Ŷb,-,/Բ_1V~VS?-~ރ,,,/L Ŀ&ю-8GF 6h{Y#wmaa 0Ͷy{]<` ?,m G"-60ammmm[mimm?oe,lm[e,-[eYeeYm_2RYeYY|K,K_{_,)Z}-=#,leer,2"9"an~}[-~ֿ0l6!cmztb9 ~b#c_<ߛ?>VAD1Ͷ mm͇mmm-[mܕfmm,e,lll,YeeY|/̲,,1eYeYe̲,,lұ YR,eӧc 2hYGamZim-pl-l0ÌAaam|tmmmmam6vm6m~m8m-mmf3e/[eܗebl-̶oYm^,YfYmY,,eYeYx,-/6mmo mհm <l1o~[=ŀ >mr!maaammmmKmmx[i m[mmm--[l,,YeKl-,Y|,,,͖YeYeYm,3YeYfeM2fxsaxt CÃ6=^g1o2(Cl0x6 Comax| Ͷmƶmmm[mmmmm^zm|-,1mYm˖/YeYeYeYeYfY,,l)YeYeY,2x~;oHlzl0Dpx1 |^[7baax0[mamKm؛l6oam6mx8immlm=-Kl[mf3^,,o ulŶf˖Ym|,1e_ܲ-,,-_2,-/̳>Ymee|G=Gm|xGطA|a>wz!aa-vm l06[ mm&mmzmæm6mm,pmmmb͖vŲlŶY6˞llYeY|/eY[|K,,,1uYvYeYeee^,,2og m[9͏qk+aDC 0l0ll6 6l6 6 6mm qoVm|8]6[omlm|o獿IeflmYe_Ͷ[eYeYee%R21eYmYm2,̲Yfef_2fY/oNwm<<a! Y/n =a 0m l0l0 ClMmramm mm,ooexޟkkmxYmܲ-[eYf,:Ym/eYeً,,,,̲1eŖYrfmYxՖx3f,6[e[mYeem2ŖYemYf_2l<^-23- lMamCgGm6bammvaal00m؛ oAK?l62ݿltջ6fo/m,lmgxm/ ,eYe,,,.[l[ee˳/6~~V{!/6>5[m6l0l6 ~Pmmݶxݾ-mm-m mmm~oſvmml [mm-m,lVlŘ/emYeܙ,,l-YmMV-l/<_~ }caa<m6o|ېl60l?P16pammlMmammmmimmo[immmmeeYfo[mbf3f-,m,eee,՗e]e?-l08CamaÄV a [m 6m؛l6mmovemomml6=-mem8_ݶș.K,ommYemee[e,,mYIJlǍ=߃Ǐlw? X. E?$ qwlqLMM},|>RM*뺋j[؀뿩16'? J<[:88#ɴ:PYTU}<Wpg:|>LR yBvf;a&>}n|*Z X.jv/&jիWXZZ:r/\hv\.ߕpRjVP(sBt]G6HOZ\gϞ%ٙ $Gu]H%YEVCTBKmò,4HmX.RZ&tBC)T*"Ldi- B8e)6^x۶\GPBE^T.,PJhٳgE5x=C5jKFFsϟh $!44kYa ^m#HHiqdPsuD_~^1 Y[[KO}b{{{۶Qcccf]#D۷o]ႽD\Wiccc ٫fgg#,*LMׯ_wMwD[3TaݝN{[r~ 0hЦ]AM2bAkkE-EQq!0 8VC}@\q`stymb-v׻%QEyk7֩yoq^ֺ0\ 5xz@[```|wG PMeQ|}Ϛ i0M3-5r 5Mkz9*Ki=x8KqΟ]j;[d27oRڗ\.8bdDs^4MSP\}}?Q\v DBW\W:TUsss8wܑ !GB[cnnҾ5ʻgffp۶m?:r윞~8΃`v"qF~[?p$<d=NRl۷4 /u3̟ʡAj FTUic2D2/^U?<L&ظbh&(~%XxI\]ظ-;3>Co]B4IENDB`images-actives-html5.git/src/share/themes/buttonBlue/img/eyes.jpg000066400000000000000000000027011250410645000253110ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "i !1Aa"q2BR3 ?jzݙ]:0%:q g/*; %?xʸXC+ȯB,FjlWVqϊYZVLmQieb|zq%u>%=:]9n|{+ \_F{ {ް~Vz xCW![S1tic~S`qm]S]\<4M>hK \`ao1UӬh+IAHerY \b婖9;;images-actives-html5.git/src/share/themes/buttonBlue/img/eyes.png000066400000000000000000000031451250410645000253200ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ˧IDATxb?.Ā Kr] 0H]:,wm'@$=`@CZ1 $7: @didf?"",dud4MiB1q0U⊬ SBJ'ǐ؟XZ b9 Zj$ πxo$ŀ%!}#dk@ 5U=Ԝ7"2dī)bRߤ@z2X*~B@l@M˺|bW )H#3!XOb PK"<&2Whn$E,B-d$'S@]وTr_$5V1o8ʖRԣUG.O$ .b(j!I2І7(nPР;A'>K@| y>ޖ]l؆F=FiAh@H 2Lh B}@bGGJT1#T f@Π{abn/ kd(TNJ@߀;C hfL@-V"?9"PoP3 SAXB>C2>:MNA tpZ gZ$5>]x pB 6& [mEhVD vqo@6h#xI5!X[*mIENDB`images-actives-html5.git/src/share/themes/buttonBlue/img/eyes2.png000066400000000000000000000034021250410645000253760ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp L!vIDATxb?.Ā%3p] i:~({X>;l 9fS J$w$ /@<8NF( @M5Yȱ␄"̽F@| K6Bp ^yPZM<'PZT9@*>?K} g~ hB-ħRb@ S8ȱDׁWP ۡC3/&g pw @V@|CFpQh[6R@|٠Eo MB">@]XbRC+XsiRk."Ak-sHbX!;G[ErjT%@_sqMME\)3aIВ# JG+. bPKCŦBqZz"~  > RZ`ta 1 !lT0kB# <[&Z ~f91u>B7POՁ8jvb@Aj)T' LIq1aT|AqBbU>5( ;NJ: {6LH#S؀'c ukZ MjФWq8Fa;8 bL@ 4 IYX$DYI#&#D_| Q(zB'7v]MK<#&. R&{Ww`qYhqIV;*Й1V~4Hx ڶi$_"|ӦQ<>v, _I+?ࣝGi@Fс_ b4 [J%TނM V0}Hxol4gtU46ly,, L[7>$/?"* "/t ImFTV=i&y9E2;E!'ܷv%iFOoBGGcn/@3M4QR8NFPc  AKH,s2]Q>IENDB`images-actives-html5.git/src/share/themes/buttonBlue/img/imagedoc-darknoise.png000066400000000000000000000057521250410645000301060ustar00rootroot00000000000000PNG  IHDRtEXtSoftwareAdobe ImageReadyqe<PLTE"""!!!### HAȫ qIDATx[ 8 yEY8f#=,gzO3WqS}Uy"psz~[fX21S 5>}OEV Z} {jygHj}Dǯ{r̎fp֙}ǚӢvk~gM}1ưhIJ>fZF/8+ɲՆ[c:E:dTGIk~t܅ĸ6°)DuF]t8R!vhЦ 5Pp;QW깚ʅ}Mi DžJ:-:kW ӌu.]*FŚjX JA 7ѢkfCTLT:l,ĦսI5!LU^kͭܢ pYwSRAd<}Bhup_iQջ 3 +F[ց~Rd+5£lnBB .2ҀFO>u*pV 6p>)9Z}R xڍq 2hl ಆB ;cex$\gJ1X 1VJRqj Y: q͚" `\#M3B[[KS6O'W&-v IGMuٔ;jb`crs}θM'cgʞj9"ty::TtL)CѩF] EʒORJcA M"u%Jj!MiDjS -iғ$q\(9rscp 8Fn3)tAܲ<ABh+tThk\KLj#G%Cj8f,a_+qœ4# v!8Q9ɐo;~Io{g2V:MjC#Q>) r9|/H0@h!w@!ЕܥtO|')q< t4tO4yP (fw4N(0D z1Ҭ1@3+\I1 Ajq$ 4ZoMA:c<ʽ+ e+`,UkIg^|ls1$Ҥ:0 "?LO& UdS\?23aG85-IVhF'<`k>uR=NsG>]ȯ9)\.CI0ŜRĒA\d ɚ5&´9ڑId>H釼$1j6’v07~w?YF2㧗*cEl*u@|[|=iL(0ĵ=n.]@(pCArDt 㪜9+npGL,w^T KdRWOprb-9z:{OLԋwW+-;? 6 Gv6u)KSWxvf0FX-P 9 =\*J~rVp~O79SF̈<%rjVcۃLMt+tw%?.itl!3IÍO10EY߉72Umd$TYa4&FӨ~'9ߛ6vwEZ( $V9/ 1q?$ڠTVȴ)A0DFDŽpI VT%\R9d<+h9egw`z­[J "!it.VÔ$퐯0~~#LF<# }([eb#]/<~^o0MKcΊN S2&S4 swΝ?aKOB +(Sޙ^~pZ/ 4ۣBݴj\E8G8:zomK8l|;kW`֋W+od~Nv\>&E{J~r MZJVR>0\DtCHTm4rV6]e'sJ%`dcIo4^VJήL^|!9DT`ߌ0=]Jgo}hc]n}fQ9㷂I,L'Wo ;?v0~Jρ Adobed         #"""#''''''''''     !! !!'''''''''' "`!A1"aQ ?[I7 o3yxnhBc'`%̉z͈5p4kֶRD%d|,^6ز* L+փVrgJ[iPqp7=qV:YPW1>Qm:7M<ԓ(0m>Vzimages-actives-html5.git/src/share/themes/buttonBlue/img/infos.png000066400000000000000000000024221250410645000254660ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp *#VIDATxb?.ƟaD 0yN@8;k,#2 :S#wوd; D@K^hLL3?@#6A|A  S-b-~u0? i@ j̓8#'5bb5!h4S˘uw->7RRe_ ^Z'}X!-=hg?0eq5ia@ߴA"ɪnFKg@5Άm(zlc1> ށqP!뱿8Gdv9IK i8q;1Gc( <2?G=7%?Qx:'CT֫B?rG=F$0;^IENDB`images-actives-html5.git/src/share/themes/buttonBlue/img/infos2.png000066400000000000000000000024621250410645000255540ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ;:IDATxb?.a<0EgB3I FR$p$N+pG $Y#q՝ @didv|b&RmD?Xޒ~Ɓ r";U", XH [7Lif? i2Y!=r$Ѥ4|}6|-#օ_ܙe#7RI @I?UL ?0ujNk*eH ZFP`w,GKm@5Άm(zlc훑RhU@&Àcqӏ41m7{K i8v 1= jX7cc q!_sc7=Jc+f6 y|Hz#r mݏG؍7qIENDB`images-actives-html5.git/src/share/themes/buttonBlue/img/meta-doc.jpg000066400000000000000000000026451250410645000260440ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "b!1QAaq"2 ??֮\"`eZcN@,6I /;mȳA @sB1`!W9iKoDoy~wa`\l„OSXڋtm,:J~0h. "N|uAw|z bn 8H*h?Y ]4MoK۞egm0ZIj4RxS n\tIrjd' g:IDATxb?.[aF40#6p lb$ABrP'K .p\GïIrx. L DN`s"//E?g$k9 CٌDv[ڲD D\!@O~b)jƿ@, UC&hz/@ C.8@,bR# %&eS#DO˞2k ~K.v S/XCe@mȱ g6G=61{Laćѻ jT gЪrPGبh|cRc nTP6Trއ?hqH1}6 3mhdE8ঁ*IENDB`images-actives-html5.git/src/share/themes/buttonBlue/img/meta-doc2.png000066400000000000000000000025351250410645000261300ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ;IDATxb?.a<ΰ ,h}qg J 9fb/X]$;$>մ 覽z@PaT"K#U @j)z`<,H 7@\e3\٩nH.`!X 0~2峠AZsRԲl3C-f &$Gnk XT@â g(l9K8;lS#=-{JOˬ-q*Za"@ S49 j 7C2k Pب(u4q FmD`+b5* UHl-#c,5)Ae)CIujX I  I-#A 02*h,@x@Q CxւֽIENDB`images-actives-html5.git/src/share/themes/buttonBlue/img/move.png000066400000000000000000000033461250410645000253240ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs  tIME ;|N-tEXtCommentCreated with GIMPWNIDATXřO?3%PAHM 1@ѽ"?看\9  IPPh1 Ri#h+Syι833J}~yoJY 4}w@jU S@P$IJ'0%[H4_V,-_i3,S]]KG7}IV Pa1]_+m4%x<AE/i$~@YEW{yP(L&'͢i/O,acHӾbdk5drr%***hllgd2*[JsKY( |>.\3gX^~O.~WEے$w{"l\KEEG)8Nka7$͋zo}ٳgܾ}X,fC4McssYFFFxiYQoիW fff{.tlScccD"A۷>_4%R/?.*;f766XXXP(X?4dQ p ٹFN'/^p6I&'|rrҖi555tvv=9b>>>^\ae޼yc 枞#+WrL[lh4jUImB{@#t: pl6kƘ d24i`0Qӧ)G4<Fԉlgih)k~It03|EׯvI%Ǐ2湲^9D}m˪P((Gn{{i[wttXUQ_ hkknJ?~yv\\tɪ,W^yqeeVz%߿'ۼ700Q_4A[[[eڹ9vvvN:ɓ' oaË(nDȇ\.g>*++2C, P1ߔǏ8q7oޤlkjj f }T*E24U7LmуDUU4%VNG~r188HCCCyRLUUD"<܌93 %0K4r9S(RIsHoуUIENDB`images-actives-html5.git/src/share/themes/buttonBlue/img/nuage.png000066400000000000000000005102351250410645000254550ustar00rootroot00000000000000PNG  IHDRD;VtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp G<IDATx eYZUWeUW> G(0n$Zͪ[@It넑<**[v 4GM9Fg]@ݺd>(wq(C;* ~:|"\sUi)w7| >ry Aɣ)fTQP1n9͍XBz|I2.zέ gR';\G1EnPc )V,RGPNQkY ~Ev:O<"yT vU#yY@*Q˨1;||7l8hG ! JfTv$:G8>=[ hƇHߑ*H <8e@{ U̎2@!T{77wQӋ~DREeLyz:8pT~C1̐y@2^` CM]kY1u5=s̿obK@Na3 z٭7 ɖ,.ZQuU-)?C"7Z tA~?an%:Z0T4ŀ[gV+FRg@ǡ@F ($@hcHZI|Dй9KFp+ˬϏ$zwa׺{:UOG5@\:sXφk _U^3/p<IGʩ;d>`ȡE|Ry$\xŏ{,J mCz 3":揶u2Z ;4 T璭[źԊH̢M@%n`pb?1M@r*P}O4B"̈1{h *Y ThJwBJЫ\EĎ xiP\pΘY&:>ÛjU,Rxp"=d $I2p` 33 ~-"P%UhxØuPK@#Hu^2_IM,n=k^2@q^~Ǽ4$BB> X"I G(눑m,E $Z:5肑<*r>"yPPCa)I$7j? ^u0 @!QFe*:VڹbuՉZ<($8;[b%60@8Dr$:D(@E}%fIGp|Ƽ{@1Y mL .rs Sdu"NT|ԅ 8s|51@KlHCF(ϨXM2_0N=N.@,:Aɣuߑtܭ)̡J$tK4J@y/T KCLTPlsdp1ydcdٝ4BEk @w{pN;e@)!hBU+Hj7{{TIU,%.ue=P_޵}4jS]$7)k2#aZv8Q>%%G#(Yt׼$ F 7AkfPp:%kY$.Zcj2{~T C#") YCub ={5VY#ywUW4A^HҲV0Rɤim ̦*[n2Lyd'꺠:~Tz,T1Đ>B F?w%T_:kp+O-?n$@Z4nf~.&") n=.?EDgfP0nx^y-Aa<'Qu.#h: m`3T7 0K*$1>S*gI)a,J REB*qK=*~Ƨw{ b꼟,EL4Jz+qt(+yO*h.o-x<)H0 hNU4$0Etᲂ9RN&1E(Hvx ,$K$ô)SGF;{et/f̢!iG2I0:-g }^SI1  ﶺEˆ8\I ¾iΐﲇdJ9WV"OO|CGw$ +D:J"Hk>+Uhk09z (İ*OaM]C"7Q'-х !#BH*Wy |suO6>y(8酬ŰTeAknP[sSeI$PRI$FC:: h/lO 1G{ ߹Q [#hE Hs+- 1D:% (s3ĎG3Ӊ%4 CQR{t(8h>@ !%N?a>DnP(Fs[ %0Eh D󫘡i:3NwU29"ɳw[.?=Fda`7z-ܻ@Kfo (i-ի٠#|^a風YLI_! k` /aT^񭛦?ذ) wggZLu5χF n)| >#CrWL(\;YG ͆dpz0MfPpTMQMC _\0*Dgq5>o4R #0C@GJM5n [rmSIӷZ*&ymsniRl:ϺQ EåNb*t5G6 Y$Ӵp J)qΣ~̑;T,h;HAw2p;s)j͟5_y@tu! x$KƂ zF:qd;a6Ln'N1h9]u ),}f?@ pU7mj;.OH0,`%\bؐDbnz g?\KޑMCzQKED½x^A7HAg?HZf6g'%1ώ||ZJdrHEH_wP@S׹`u H AzPHZ$f}hbw6_ Kg+΄d(eV"Ih#FEaVP@IU DNp (aPT8`TP۳-I DE#:s6yc/J)dHPKfD:mJ=հy2l lKѡyt^TK$l?3 AJPHC"Qg[1{,3B͚wۘU U.!  HcU+ x8əAHAC $HAs8!tR60ngRQѼWdH>y5ޒYBs?[HVn=ɞjvZ(>e^Ok.gH ",` w!ōgwQ(;^aGs滐$kw ciUZW2@H]|IIFw H͡b^)-uVL/X BWbvB7w12g7WeXXgg?P US,cXCr_9ڊUMUl?v#GdfHNw}ibI֍'ݰ)Fq $J[懒+$deVFU#@P`]f[AJ"1P(${@8|JΨ䐏~3 bs'ͫj`\=NsW9hx4JkrI2EϚ׍>jTqUwSim9Hͣ$ ݠ](;(JKrhB'y/TVX$ p1x< %$Tݭ ,+UG{=|t #;0}l P(=8h58 UkޑHC9s*9 ЁP *$3(jB0@:PncX9l>^>$Kis(܇ hT' H %Gd=U$G*{H@N%T] _C6 n]7iWu hh%%eTwuحD^c 0hzgGxEw)Ww03OWWnΣ y@G@ u#]5$p}߻IqKȆG69B)L3l4h5}a$lhz4dB ?(J W@hU?m^l8 9@Kv#dK7a sdS4oFrZFG@RDAVUH[OyBu&ٺ%y*_ Wz|2lKh/;Uq"]mmAI5P094J4+Pus z wNG@1  ͚#y@|-^v1 +(*٬gK A>0QLJqzh N PR]w )1DXHI);rv#Y{K:i @j~%e'zцo.$$ɔC({ C|:US$:2%Dġ@ݔ8 @2[2 ly7D`h=Jkm SĂ-G 0$Hɡ@y'"*N<2W~fj$`ЁXPGY#+y$' Tpt#wŪI֡*u=.nh™C7$`tBq86 yG7QPЋ$lX%ṱ3{pL8YTI;Iih I߷Z(i(sU;WYH9S탚})hnp3$19(ZC%8JBl2H:GU}|#֠H3U(z85bu+G篒o$ ):!~JFn2?" "C HAL:.ȳ%&E@@%|E yn 9e:sT֠@j#Iq&|E9tO憨\Y=V6Hq ,ҏxʼ ɣ$#0El~TG1EPЁ9H@U҇)Aݗ*# yE#I-?i~1ɣ죂_In[F $d~#-@W!w<ꖹ.6T%$֝ kl@rȏKl HR䑺u}k滏(@h?٭OUYA 滑e m )ivqS(ub, T)~̑yDeH Ht0M/\#Te~ͼl!); 2_9͡sEIs@ xCD $ 3 .11`>J -j }';p]fQ^Er~z;8@ $H3[UDf$!i+2HWGh_ɞF³ $kS|SN4hS@Ƒr9rcF,<hBCSIDf~9jӍ@x:\HTځYFsaXPL,$Tu{ ĀG*A3~݄=':}-{[(8h*:R% ]%2.&>?f4w9TIH5G™rs$:KFtvvXFpȗ,Pe0R`!딃/{-ܷ:hFYHZpԚM%h4Սt|P@@((N%L4<)-R*P?:+)fPv(tP -d$U[F,Pyɺy%x ? sJPUiF9i.@hB4GsHNݬ71E" |-L #u ~,@>ό3dЪHg6ܭ)h9NB$-F1$({2@H>G GfԅtS$rFҥ7 ӆ1C().mLCɣcn=ex{X+uj@pHu(@u18Q8QFR*S2m vh%UqHyT$]3YI EΨ!_FdNT!. I@B'T/YY61IbI=.2\dBՇ<M.S*/ }DI ;>R) c>$.JΕmbXJfS4 @7*5#DDSN}JF8RI3,Pq™.VU3k>.`h94jo/Ȓo3|D^Ou_i$ $bP ֪['Ѱy*G3s45!HT=3vdpFRa .Qq 䄬!·0FEɢ; #HBH|&R+.]  U$kQW1"NdK@S(5Ԋ:/ʁ ~* d $>_Y( )h+Wh]ts!P7ܚ MlcE][n<"(e-cvDF(}0-`@/C'ӎ.:K.<(& gĵ:V1ElGtPJ A㸑wH9uZɣq;z5(r"u]7/A s L}> sLsI*h>C_й8Jb g|:fhB jEaDEch=6ev]WY|P_LAUCR_ZFJ--%TQ{͘Kpv3i0GèW $UM%v 5z~52|&x.fc H1{:,ΌH" c@t9.ߴ }$#B7Oɗ aѾJu#q$U;]F%9!Cz3A EC=l⚥k P:lBz;8mE'EWffPZnj‚8Pv3ԍ$)0(L9^V̫;Ql hJd@jك5qΣ[ et;3὇DQɭKc;H!TA(u;8s:YRyRŭf#) wϪyiqL^s@;aX1"D8$4񡤑HnB΃g0.w$|fHPQBU+I^ .U:.SHۂ/}@N06H8t.PlhQ?"= CCR ҃;:a~dJgÙNw#@!K:Zԍך*t9aEoPIIu\Y)˪ч1GCDêbѾa$'m+KtǻOi  `xV6Q̕ 8p^n$](%Y b!.Q]07Vs47Ǝb#fTrhO5 D]CZ ҁplF%n?2@'&Qa`%[S {խB7N4+u%h( $HBў4gHe瑒ɛn]6G;EWk++F@6(yn3\:_[ Nv  3P mT(CG||,vo7*1@6cfQEGO&!gNTf59$8RȍgP7x bvB*~{.̲3Ƽ#B hQvT,"6֋B9EF{M:W#)qJQtQ@a"V/->0zҼ7ɣl֫ncHdE Ns*T/Ɂ!L*$_' u#bzp*IP@_]HF7M iz/}q| A H) 8r|ab2~U+y@cJ":T7m>t5 p𡈬wTC(#k!XP$ulƳWJi7ăԝ) B+PJSqC 7@$SP`k$ ] 4#r,5IɤSa)iA(]h1oC$1'UK~D\}#SD3ٯAE_ /` h!IyƘoE17 ЁFAKn}0bT*o"1ALQ3 ڪdHlB$<bC`%>V}\u$:Ux%G9$hE4^VpFԡ((pvͼ#QGQ\ocQw] ~5 !wB(}'@&ͫbyyټ6& ZF W`Nzg!r4oP@*b0G(}˖lRGIR|BRT½PI$ 5U,] *8YR>hT)xռ>>@/7s$QWbK(hatSs!Vl!z3Ć 'Qf%1R!ʵp\ź|Axb>d^ _5HUi7HIrg");8`QPD}MQ@mf(Oa3;;JaL) w@b^p%m%cxPuUo&=QY@`Spn3TX}&: A̺Y=m$NT>1@1!id386l.g Uek.LuoMb Am5b4xPpX $fAR]6/ {-,RQ P=@QVZFzՐH# 1Q,RS=k${@)dⳏpQI1d~@PQˬ[oCҌ (hHBI^0_ G4FTh7j4 S:%QJ] @^ `8>F'$MG|-Rf(/ł[Fg-Kw$Y792|kEsG*Gwww_,n=յyͭ7~ߨTd ^%00DD@uU {%?T)Q7گR#A"t0]@}w3Ăhu qГ~692i^3?)@LNNoڭsKKKtttXoo XwwwuuvvVFORQr;ܺÿdXArȹ}ͭn=g~{Z:&q|%Y~6䅹(ILPLj.Uʬl3)j/9Hp*QaĈΚְ[=JQN)on@ 舒Z1lرcf?Y\VKp5qD¨>OO&mCD惓SB#9yʐkUнlދ$gDԂ:\?oY./94 =c,{yw3ST7=A&iE\̌:R|l}}666Kˍuttlwuu[{?9F *Dr'ܦ w2e%?722yGRyޭqEn$ǡ0K*Pw{T[2.ڒ{ T}(t40ZH ZGcA6/ʻTw)cZ+w.//jF]JzWoG"7XↀGNrGGg;|uuݷ\w]-b;?'&3ǥcCPbo|7*a6a|Lt\7 jAvL3irx_ ; hRhѐHJ}WWWq `5xZVa;;;R? 1>>o///KmjjU2u ӭ_tF q5GBܒUP $OO<t CzW61G] I 印O}M0EMg 2FE@Gj,W X@Ø#S~}IW2ځ|񁁁vvv>qfoo^C{=w+}t?vuuͻ5o[x|ٙ~ڵkX>%vvvk{{۶lsswl299NB0ĩ:22]?Rh#GT%2ڧɭ≀Sz1GjpQ%r*EtÑHSSgw3ֳFAx=P $݇[vwwl u~˟jɓ_򋫫Th||%sLr{P.o```ѣkvvNJP@H?hI)y$̌ngFCRSF:(UIA@͔Qud Uֽ߼4Ԏ Y ܗZK{{{VںW244T-*Gj~~ڑ$:uS]]]_?$bt H eq6ǿ<ܭfT@ZUu]TPzХG 2>:.V'۞s\Pe {<yi AgMe >r˘$>[yoĐ$jIե@﹬ut_wƍk7a\f399YujyknݺU:uﹿgw#- 7778ژϞ= w|[?ēINڥP xIVt$BVnI^.uLQEtAE]/|Gf|)y$ٺȂ TDq|hs$4b2_xPc5ԅ.4nժKzzv~ĭ}~5ݗܿzvE PI1G>z~A)>lʚGF?>#<$}vQ;fN96/a3¹Ot)Fe{J0覻DU}!W /Md$n:$ҏnuM#yɠϹ+:Yu3gTOK(󍍍U|O~Wgggݻ[o^pa_gg'N8QgfyyYcCjz1AP0_U?7mj -@PϪHU1mY_hl?SfL%^?%vSTD7Vm~kb3Ca3mHjS@܅oSđ~^pKm/oB[!I);w\U-MIGjT҅7o^<ySɣjH'Of6&-̗̑C-.߻sFKW$a<BSSN8(l$A9%r" -]TH~u15kruo=>BBݨ83ҏGzíJRARfttDJ~IrNI7ns#,˧|,m}cᢕz݋}Pɣ,nMmn}Z+DDJ *=NﮅK>ԇ+'1C # Y @"TG0C g7 SqkJjѴJ;SXo>C|[ӧHEfll*wov)^moo1^ x~RƷzҰo䁏O0/O&=e~&j{Q@$n=HK-׎$|5 IՂ@` x4*\D caԱ.eL yGYyr$F='*[d J(}TDgg|i\"kΝ{~cckNuR0}uۭ7C\˗>:S}_Gb+R+[GSA^ĨDh(|J$!5i S@i(uĊ@RE)bfp?HVFd⬿a8q՘}ɢFB__ɣX]DvEAM ;;;<<<|~wwfgg%u˩9oܿ秖ӘAH ۷o? 8 |t*0|=8':i苷T%3TA {suǃվ"=hzdcF@+EsŲE_e 9y$ɣX[[~rwRQz64KjX^KxՙQwhmooWOn}ѡ?q'-[rH//vueF>H A ]rrmN$i*a,8$e'3fƂ$U_5YDQupnpm B]Β~=k̆˂O(û 4׭%N8_jDU՝;wp5a400tLɤRT]՟+J ޻ݟ2HD.^xb>Ŭ$fHNM zڃ<(@UJڇW'G1G)+7"hzOf?7I`Yt&~ (6@J7JM* Zn}wÑ#Gun|ZygVVV!T0Y픐Ҋjw~kRxKwXyt8`p/xfEARm@rKfTByOjP.kTA[n=cQXNBUyM_w#ERO/h-DJΚh? ɳ{ GFFr{JA~O%>\M$I2OInQ󝙐2<:>Uo;Ԡݑ}P=ə/v__t)tF龯yӆ {7۝K?}7_ȫlZ^ihJ&OF!i HDlO`x]HwSS2@IEM#<% \ B6h%ɭ?Wwvy].W:߳d[-IWIzoo_.JƓ.8. :.F*=}Z[[;ֿ~=9}Zuwt\sܷZ/aeHu!j~*UE0!w1 w ѩb~hzZTLD"+N!g{'@+Z sZ5ɢ(%SssW~fkk0RCwp:KVEH%cxp/νa ڜZJō;H-wH~Q'򘙯2X%/LBt}ӌ*%T^tͨ6o` $fVBHO'x$:S4@J?ʨ)JqQA%Ldݥ?y)H !+ ' B]%+`PTM\y,}xj7ڏ9R kmP*q+vwwpm_q_?c;>WXRsܹΰG<8p.ÇI{wuwwk 9O'$u+祛7oXJhPRQ`* t%"<بp[[[&=u wxs<B qoQY] Չ=kJ^Rv˰:9/[1`;= QGms>oUMt@wp}:)ytBQnOK@ovttQŨ,rVZ{[5>hm%K{ljC^FGGoV驾i{/Y:f,2Qm׊zm6zyf Rt~xeVG>nF2<<\H捻)655UM"-,,+gܗϸ%CirD$]%t ]2ʡ5h$ׄm )Z|m#(:M&P*l wRAX{»NSWbJ!% OYEӊ%*(e"%TXߦ%6Hj44|(J˴h6'eUP&(Aou_qIwvD. yH;b~7nTˉx:4M$>߿>rWŒ3>aՑtuު+䪑4Q0p|p(nlUe:#TBt`Lp(s A'wAzY w p_U*92XxJ;ݠ"k-DkXA(5@1$zK7ww~˴ҪK|LRm-\藃7fxrzzzv:i1( $!~zuSx%f|vjݻwy}ϲ@Dt=TH蛷_)YJBhMAU FʮT> : fw3gf&OSƬFj:HBc#EttwwoT*{Y"%9TbJ>)΍_YD1aCiHTɡv_2-޳G̝Ijpxʰ{}ۄޞU| ƪ9xXr%HɣʉF$j̇3G/qv1BM?i<\"LSD8ה? IT].)iLQJ {fW9$.TߣiBAjI-`Bw4l֥5m$w@T*^,TLѣ,*HW"I $Ų8"ñclvvV]nv8$-Uj)U Tr9+}UK{ݚQRԥ7A~0yUKH..8џG ꆺuV>= _~Wl)s@{u߉ Dw^a2l0rx'сGt#WlX cNK"un.L o[T=شKzQLZXjatt/#%EȴYm2yN˴։o%n2Oyi UFѴI[5 xzz:QzyK EuG}Ϝ9SmOL[h?П3|H6/cKPPo6ݻ,B;=c^^}+_5'Iv%,0)Idq&=yH}Mu$&&''bmmE#"oTG1ߝeǠ %׿Ͻ?l!afK1z[%U@sr4zV6x[@ԭ hG:IUI]WLةS3oH UᬪxC"=[ gs )p0OXB Xh@J'F;mL[\jb"ӖZ 4 Df5qsVTDuI}')6661D⥹@ U݈II EE>ds)aޭowCsyhe~ T j9f: V̽<$$;{9HÅUcrQ滑Ct38hrH =9 \FG"o 3gK.Z]ZZXjFb}ݻqUh7*bcǎ*!m|G3ERwϹg'Մ_֧'regϞmyV2sssV*yIj&3NyYVuNbHu^ _`{Zҙpc1w[4vyE)@dnq@J^YY&51䍉 !T:ܻI,:Sg @]8λIIrUoXXІ{%HWYFX4OYcusEpYĉf"s_`{QJȨ*!y1F1$G ~~_12<9H<c M GYR#*d\M+JJNz fPusՑkɃ[]1hk\\YYA,b3ϟ~:#041/_:DwӇNKj`hR`w$ H AcO I>zԉEUJ&r߭Y(KOVA$iXeo677jŗ*i^CK4h(!ͣnC%nbPWl-<I:.(fhs!W7sl,ݝu4kHGB|`yyY{VK CNWq򍍍";1y%{­!'F>$~ͫ8| HNR[]]&$ XԞl5Ў|eckќ>4/E隇)j;̣|hejt:Pl 3ԍoAC%<;B\.kkkՙND^$ Ix_)KP%saS!;mbb"jQ!GgԑSBWMMMUzv``n (,w:hJxʭ I;hI\5$*kAq qH ENFX ~|>c!19Rd"Up'e233ӱ*o_(u!A |vvkTommmLv)( 3uQ*$G/U]WL[mDAp9zխF-gy)' &@ǬjULQ{.u!iWG)-rϔ|$]# $]p DrӅq$YFJbcggKJҽ-mـIݗ:,c_H^(~VkgZDN@R'RZ9@D ɱ1/l9|(#8:o~6q rB qZ!wJ#sn3Mټt4zU,4mi1\6/Yn &8Y__j}j rK mooE o e u0K?coo/oCcJmmm}hrBZP`Brvo6&i9զ64HjI ( ȼI٩G)R;7CW0C}ɦΘtޱz˭LI7Jⴋ!:HJIB&W.E?+ѡqjƍӜ[sDrY{־ @>cIxl&G`ZP|dSnSG|Esfh OzQ jgIoHAG'RyQ\@$FT:ie2s7uoYĉU]՛7o4ѪLоk@ П5D3_QLu")K-(Έhz3GbJG`uQ=<2U>9RG$-!ir %vvvJEKֻfs]H~O wD%*ݳwرc3 ()ϙCҮM^tK;QGdskt}Jrl*@~?yYJTtΖ<%1pЂK.nG[^^JWu:>>KI iT9)րeS4TVv1I[PoS\2jA-?]HJ 8}T;l>FAn%$*y¼lI!e7+EHaHdp;֗Ek6:wBWWW[[\.#oGpIڎtt(ϺuaP%C 8:f/Hdny¨il\i#*:IQddUÜry=*9A춷 WHBb]]]O` yh>RUqϸ9%t-2Kdfh>[2CGfrt IMAus+JR)qZ$Ŋvu)k!b${NNNm3٭+niȚ`֟՚٢Cp^5BN(xҼ||ErjOBW^k8*p/bdA=gSjtK:ӯOȲC۞rL@]G͢z jx=r`XQذUu`0%>̼@lKJ<$R#h&@ûhW,ͰH Q}ed1՚2)2|kUs)hLJ2_89 twwK* uٴkRiԾV_tsst\=$&$711Ì'< (Q 4<Λ E)d|˼ 痄 GAAͰ\{7J5(KuZ}l_AF{ȴy9aCU<}dJ^P8RDݑ#GKӘrpa\$,g ]PGn#F7?( >Gw(J"d |B $SJΌQǭOCzQYGq9 Mܼy422@2(YRggX%Yg姣%ݖ7R8󶲲r/q9OSSS'0m6 X*ku#ubU&-"vsc9ޟޏ&k}ӛZ}fF3ofzr$ה;CC%6Kc\8;cxc!]5T ~73M.Zjs}WhI->_[ݒfQ]aiٞ 89 gNSZ\L{dGd >bzzzossaf07!mZJpX#9 'fG6ZXXj꿬d||Xp2) 1uf[wQBu9{\Y>)S<[Y+0q*}+0iܗL38f333+}}}skkkDisāaJ`rQBR=";;p)܁U:r GfS@x;md]^reRF Eq4ߓL-dq$\рeHAÛS{xˁ15q{R'n*b7p.LP:DY!9j6, ~cwr>`fv820_`'#TڼUa _7;;FRIFIHXX_QD_;ga*CHE͔jG^\\<Of8@1aNGh@  qP(/Jr79#4 *[C2UA!W»KƁL&hZ5'G`ddDif8r@dq#Z*UQG p2 dF$:}784o| @q@ E>NG(43Ba1qRh*z3B}000볳h :duLޥM2 yUWc#s.;lzYI5NKKKB#`' ⣸YHz k '#B'yAf29m(y&YrȻfFyDbOPIR_(g󳰰p𾫫kghhc9 nލyg0xUlnПL&;2QΣ/J֍eA xS@#U9-[^Wa 4j" xE)kj:NBAr* tַD"p,4hٷ ߯t'leoύ]|tt8h3}N#T@c:֔Kh>vB {ӺCy8p/|S@! L;cU܈+#mq uQHpsS\lB(dIJQ40wg,3/ߠ\,3+ tx(@@,P( Zov^aBQŦ\D"!cccyOTWɪ(iic"M%_뤾G{c lD")̊h%'kf#b׾{"?.=}ac; ˒X F٫mBPu}DB{9o[֝>>;;[cccs]]]Ԩ 3%nvѫ*!mX@Jӟ0@Bju:eBN:_ᔴL&@ZV[g[#DQA:LV5r9ewLXA* igʽ~ ϣ))!ĥP(V>gG>'V&Э}:`A˔y`@t/P $$ d*E[>/4Jɓ'׮]}sGB0x:#bB@:1}N_`=ntlkk+|=LmG?HlsL@qL!nOԾEeR G00!L9U .m HG_iUs3jx%,:3>`!!P(??᳢SqqFpMTJeUZpG92z߯_tuvv }dQawwWPZ(p :g !ōGh zi3*:x 4HX$,a?a6, &G@[k~BqjSs*Za%Qr`A~Gv9!Q $ 7?{Lzzz-& B-UΈ}UFaK SïS^V".V%ohtt4I񮮮FQN!͕3E U0)(A;ž''d!Ix*q`¾h!H ^18m dN\OH) |>ۏEKd=dFvvvdqqQ&&&Ϝo}>[e_H5O^O[rhGDX.$b Hz]6pJdHbx?^$_[|/+H>mNAYHq5-AoK_:Vtӑ|65=@{ :!P(?=q3cIgggz@2_y_ "%^QqPw:N#sCeP'7d]= yۡH$ZMVV_yduH#Fi $Pp@xSjšBJ,1'$ܔUcrJ]oS,9dC:BG8pآt)#]a2څ<"$ J{rm%P\ Z=sohh;1bّT*Bsߪ,oi3lem`,Dʔ3^ukVxA1[eX:Jy%>Ҫ j%?ӻϞ=7n`c8HpGDBB̘ Q gR8Df%T9~q ()T) (nP<:Gi 8%q6pMIl KbHg3X>󛛛!LR8V : )ߠʇoЦ(ҦIg|J.0ô_8\:UgOysð4uxP2ps쏍}?G_$8_2b ~.!T1Τ+*8{NҎ&P@q轧!|nBҁz>⹤gKP(S\mgOeguDȎ_?tk4BB;d![WWW0lPx guv4U==rA d%AF;x*?ʆx@ NkߝN433:l︮a'<`-!dG,,PGc24Qf] #u3|jHܠ> <B.s"84FvRMyDg?7A?Lo'R;Zط6%HHH^U#nY:ğ7HrA c'&Hex< ,zzzםHۂL$l9в[Dp*Kz6ńT(e]E6T'lt Mr:DdS|G)A{c B~g(]]]-Kcd`` ]wV#3zEߣ-F!{haaԃ#RD!8+W|g&)ÉSVzF:` ~SAH!\oUA#P iT8D_fkaB* KBidTly6 zIOf)E(ҌFEg|PHb`E?2}n) a2 IN#daԥ$DDT# &1($M(q9}r;;;@S!GDҾTIpwJ!PaM$*$"- 9i*qt]I.́ˈcSq?gͰGiѨ/e4R`IXr27Tt@;-?( nӯ6uêhRuҔ=/E# $ FB/]?XV`y =DB 8)Hy= _hÏHQ{剸 x5xH(WsK—AΖftz\4ߩ$4tH'FYlxRdTouumkBYr[Qe"蟛V,27XrGׇctCs1P+8 pLg?rzeeSHqt'dn'YjOcQq3atFQdž^,CHJOJaS xGzdJtz r:hkJ!}L壩]!)̠;JFu(>@R{m DF񴸁W !(k FuUc6bX@,LB0(tdҸ I|6U aEE~('g}}} ΝуǾ2 D?ߐ .u #=HlSѱ2xNF_Fw=lꮄ9&tT+Q|~aY PSL勂5gKc_uTQ˜BH@_r_V= ! _j*t:õZr]\. Y_xҟ$2t a6dN7qv 8g b:I8`gө|Ճl6۔߱ O8㟉uV"d%XB $84`eAQQt"C>!Sz | adhe=w1Ӽ.od#Ca%=L!NwƟwƗݭ;67722̬'Ac,pu4䄣>o ^?Q=ȼ Rlp ,~)6J挫R}:Q*z}}k{zzdhh‡5m)8㓗wj$D1n  30!Ѳ#Dz&tGd.RvAt[!Vz}|\/c$!:/zORݛNa"e !AJ_opI@$d!\.K"v.J -|z?k׮]:Q󙫝T*}y {3 p!ӨO;LFH'l*L& oH36Dboo?]__ 8Ny|Ak`C9g3Ho )IgI BBxg ʢPp !,W riKm=\'n@DIA0 mq %wGUnp$m0~IR(ewM "46D_i /yU8 8BRjEg-D܈׹wϥ#`0s/Rs*KP"^QN2;WjSsT*;^eH$&OgBa"|_266V$"ԝhqTyjèϱ.@Q't vtT*}??N#3I8NӧCߛ瘫g"@4!uGJ[ ҁ _5=a 3s*p =n pMKΨQ=S=]3 :*#MqmL(TuIB ->;.dVDjH [Tr~r~o;I>Q6 3m0ѭ< k:L!2gs`0*\|` xp͛9Q 5V2I%]݋5^| C7UA Ӌ3yHz]PS8N^Q!ۍK9Lp6GF*8mL;cFZh%&3V}o"Xq^HDܬJOOEjZwdJ)?'0Y:eip&+Oq@jcD#(aX^^C`||<ԩ-f %`[W8vTB p THz35Ω8n-7vLi!uĩ{G HgT/6+>Y .[I |e"Zv()###m덴.KKKu'!#9d27tK ):/ |\oTeL=ȥx' fTuU PBF"5$BZ "MiIc)&D%d"!e*pQūqd«f1,w0diHwr2ycI]]ͭG[[[zG2uww+W peՅM_t 5({A.c*P_?DRS1^pXN:DvҬEFL"$ػd#aA؄SD C0#ږ5ó5baF~ڦ&Qɓ'=TD'͖3LGWWd0#6YH?"#^0(Ih, 󛜂ς>Qz3 h|%9þ ^6%0 Fzh+_uF!oQx:\eanSEaI༺6L@COB 8J~z꣨o $ھ߁@H8,)04MHՅCe0~B/"yUw5z#N`A\AFzfI=٠ eU 1zˎU>:|Nh 8PecVoB!! ϧTT2ֈ[IC+!UH) C]]]ߚNe D5ؓA~[\,8Ij!JUUa^:,UK;j@IQNKI0?="wrZ $ .ؘ7CUپ8Ɓd]zװY>:Oг .}~yUc[|TKsA՟I A~ 3~"׮] bTz1 t˪`t8O0ofuysZՊW 윴h G2kbw4)1bp3/+y` av 9cIXRBځ,]0SaDb46S(eV=p{{YHa`4E/mUaDO8\ڣCȹ1 @)AA?cq#)qPD恄8aҁ `B>g>=Jų_J%YYY#@"ᾸSF  z -T6'$*9'%!К?p6M!g8p'nnNGDA^{1/6Ͻc\aG9n>[`#+xd?T9 Ka&F8 FDMus=Q\)|*+W|ӧO٬twSWP8 ԛ@#"@vUivY+|oE"^qn.P6`9-Rvp޽L ,n|H8F 93NE8n SZ "EQ6񱾲!4NR<o٭2!'!T~&ZP(|>(?\__pB"7nHGGe;qd0%=v\raQyH\'&#P_, ~oJYP_ѳf0bP ;# #8XZLf4 Biʯit`~aVB 7!TXV]vֲDGHm,;/2#?TJ_.Lfe{.WSRU)Zz {׉DP0,}s'PPUCԀÀYپsGtkR=78Lk8c;'²݄r}{ z({d@ÈTs=lk:$=uGߟo3ҁ@| ...Y:IHXϕd0"+ *b5af\p"MERGY;|k1)NE}Abwd!,WR.cu ,Ipp +}Wb!0 ]'Zu1i/jUĺײx/k6q^_jmp"]vͶrv3_"kF c6ľ B.HU_I0gK@`) j HxA1|UmOIQxq[hl9U=-XwKV~Y8B),R5ul9]x@0=m7iT{GdoR:C#$_s^~}uu~dR\"]]]6?_ "L)I7]" 3NG `,n s*u|@>v8Z<0~\W Yd1d| |P?D Ea!ʠz/kYI+!u" M}_ү%*Mt FH ϣIꭅD"!۠s|Xd&Wy'cЎ[H?bpD +@l0 9MM9_2W$kRkB#_& ![?qƹ) r|-gʴ eN!r .}̟ͪ:9׳hCm;>Gn`:EH C'2;;+;;;~+uRGrNzⶦʳDqA+煎fPl8'^{x}BjI}7}N䞎+ÐnT* >Yڤ)(g k@/-B.{Qϙ娘E@( EO; 跅JRvBϭ7 ^y5@$$p|]1cbz6c"kg{ZP]a2!$wKFe/ad*Z!5^ h]_Υ8e@jv cw8www'dkkKj= N08`Xg4^'і@ g1z,IRM 9(wsS0(!2nGvuNE8RY >KwǝρDŽNޑq p3u@v3a!$$_ѯ8=qew믾z髾/1HM@2yV>I‘T,I;~?_oҦJ.58FKWI붦 L;CNHԕ8:*(k6 DBSUNDžt^N(4/-{9ݫcQ#h%f !2nuXX]y/2'&ЯOׯ>8`36g{t V9y^yYX# %뎤t:РO;тCl$8}`!$~gp(^YG/[pn"yB?!`pBq@ƁHYNE=SGh(} #0F3 h N@%=J}N?v(U8. ke7% `2T=fہ xb[ߛ}G:C;H~<,3\.Nuvv583>Tŭ$Bր^Ia?ryLHơ˥?cd"0FJ#^@@rQlnG'9gǻMTb{r{x;ge̎ea^CZ`:BHXI^rtt m`K|Y>F&˨LnQ<.D#/n (Wɉ Sq րFO#2> #y@`"eƊ^8$>)t"zׅ̍=^oHʮ7ʰQ!rfF9̜8:o l)[&T1x:TfFyԩ^TEzdqN@@"6{0i@RV/X6'4eHZDpXh%OFxYixI8F,K8v?Qű[3RY egcY->%0'4yahbSBH4-k\@pmg[?rר?f\1k!bER'ا-Kp%9`ԹQn(hΖ|uBH+pSKeN،-lEѦ|ea9$BA%zp->R(I  <^Q5c ;jeD$i7ptX}G\ug^Ie{ nyT`` d8ur%QM K_2rh\:̺D7w)2#%{cA H0{SO;جGPE9S͖kZH\xlOUQ`\Ҁ$"PsZ"$ Τ5Ӊp4"='9߂3^}8s֛N=ǢQ?CޒLVz7eK:yS !Aqk3:1G% J<5=zC 45Iũ"6AJN ]o3yaf)QRgYgrֺܹAپfr}6u٨+eQŒ4!`I:J9 |B ~_4mc{H;c b푞 A* .ouNmLpH=O%z?,o AjZ@ N!I2?8L h'V{7UƮeUVedC HoPd*X ٨ U.r3_5p:4B BdƱOsH}=Ihlէ !  l9WӶrXQ2+,Y@"J ;U /īƊQ 쀡yE/A普)qcBcg3Թ cCw+os); Wu="i+ YⲮN2? ȼܽBΒ0FY{UצÈJE4½3iR!WFVa\SXp@ԱkQ_$X$[Bl5MHt qY)ew~0z7X319zI}9}^n0n! @9wk8MPRC 7U2YE>@ m2C`טCi"X(Bd E=3 -"  eY϶\LxNZ1;"rV%Ŀ!*/x{pJm(F,^"mi$!J08}_Ȩ(i" zXWUR8,Y?\+K0wu)vG![|^j?b_S.ON +^7h3gODlzBTPy[uZ_.È'/~g ~Ƭ]r jk:D#D9L2ד#ǨBFQ_K0%j t3 ?%n'b#5Y&nH,PGJG@ ,bUTz!wqeUV&GXq*Rt'wus(9rD'}AUbax/]伂xQ0 RQ onЧNI9E.gMI;(0n[ ['ړց m 1G#,R=\y2ע,YG2{+Ɏ;{ۨgٗc6\X%D,0FWh=L"G H#( Iqe8=kт߫w덴&vf xMo|p [6WX#aa`m΄P^C:d0D:LߥIHd3GжI&AhC]9U-!>E  Eu!ΤI4NFwS џRS.CzנO0|類94F B~mK냄6~Qi:Lxw//!n-LB)K3Z{5y/L^R4x/B!vb&R p*=RA 2KXru}HFs†10\_uMaf(\a_es4i:@YcaSese%EL>:[UYgOF"9F#!Qz~Ezu~F< *`Ge8Zןl}N   \J1'я7 d `Yor& ZS{J.K(0.ZuM{#Vasx́U]) zXc>Xgҵ/= T6xX&N}*tW.# "#vPS|W386UVy?@!$pY#UC ϡ$WJ* alNz c5U.y\(c<{~W,^x0x?;ǟ5Yʽ08L:ⲣk7 Y O( eN!$&T>vJb U}Q]yUT/}IL9:72 p)}ev9P BRAcg`ID_a<N.q0L1D70bພ[g}-N={͐k$5}qWea.~9DφУ,ү]DlXWfG^%aRňBނ$&īKfI`"vM?SF;]_B Lϋtf#](Ts>{gd0{M! >MCJƜ#[;]vsMp`$\% !I ta0"5E*OYcﰥ 8t B. "$0.xt3AA(/{U0f/peҷCDCA\c,ѯ[f?/Βz\^FČm-}$+İ.w$`my~GQ螰d!a'2:(׈NvDW Ρ-}_t*FK*H"]Du H0%][黩LY$N )w8cb! gSe#]rAi!X<`>MqvdyȄ}WBBGJFSξ_ޟV v-S{SקO ,t BMU<#TY/MI0I`/{Ey*Bg "Q0lF( zxx\9g2gm4'|]7y!'Ҧ9? s /=CQp ]}N!2*'TV%T.Su+>m$6ЁD ^%*2IL-dD*]SEq_; mpFԮ lN2'il)U=_^[FZ~N[Ke:*ʶѡӮ{540yČ`36A!ࠞ<Iܩ챣 i(2=-t BZN}Kd P%gҥCt gxL iCܒvcBe5z3ڸE? Q3[b_=Cڱ3zwˊ.pG oO,tLY:},]^a9U`OmA3Svbt B .ǾyE&#Y4F&= B"K%gAI|8YrC}2%[6)e; wY}Ο1m5Sƚzz_ EOZT~ 4BZ'ߙt&[彬|&bdÔCY:!abQ03^P"+: K*քM,Cq8Kq1`0ޠ rQ'!)JC:5^Sߟ @?0Fdj^m=cZ hW >l aO!':rZ1П3ӈȱ*G 㵨\SF ńPϘeҊUFfЯ);@H:B#"q'Ҟ1 S7kraAg~>-mԻUnUUZ+˝u(l@NHH]ѧXVN ╢UoէWTOU`Q]> DN=+d'mLG2D6҈9E:=h(fboi7Z?3S6RFZ@m -``6>+B.}f,##@ɉu gTO76y0˕*tUPLTxΩ@'^;:Ii 7L$?Ǥ3r)Jǒ>S8&\t1B c]{xPvSEHk}BCċ45͑s*uB@Y!O*x.:yF,RzSu*i^=vI;q>P _gx[dVapH}}!ѳNw`w+Ί%LjBVr)#5`Lk# !؄1>֯aCS9]aIF`\RP -. +z>UT-]8FWN~PFq̉,NAxW!\p ޛ !6IX A]}$nT-q J|ow!U !<_*gR ij/9FØ ЯcG񚁚%N.nV". '(,zFɑ:>ցmeSL ;ڒ{?Hqؙv& pGI~GB.qT6s[ RG$1kEYS12x@!As>_(=SrD/ш: l謪 7"zA%svM-UU@׶)ʬ=-y|;a\l⿇9E>aq qH`\@vؙvO\`pPrZQf-ai"_èC #+c*?"71U90b#!A!4O R*di}){8iMUނfS%cc #:è4 lXFҧ#N0& YH*na'%RFۍYlGƋB\= iF{Tջ/g6F$nkM]y:4"KBHQM?ac@(*YNQ9Uq@&^ausY`ICBp'^i'WC;Rv}SS{ؒϝ ߤ-]Ԅs亮Ml>p!S,$.vF_{.UCLGbqYr]:*#ЁD!>%ќ*&p(!I)}B@§b]:u4[[E mL`D8>&uߒƀhB_}F•I9>XbܛmK)!0f= GFHtC6LUyC<m[$.)I^ג[+FKB'TF*OPő2q*#JUDċhW|vuBE1z=d#lFy>؂g&]8`o0S:c_DjČxe:Ug1(UUաL9k>j[0":!s(İ~m0C*=&B2N^/bnSP ==zY,I86q(,eGPZf^W[Yrq`u^ʥJd=]NZt'gFp|{zddP8LŁ]OM] WOB9#{12KK88x/a|aU~Xߓ+ d n=HuqKg[;Q`FX.\QN[bVBƔ7u#0"uՑU: !qPD!֒/*/wKOMh9(EW})q.I̕NDž(vFߖ\H|gh6x`X9 2zFf]+6$>]da=R$(*쉱ʳ B<DPW `Sf5$jR UVuw@9d=HοF683-A3G5v^1;ᱜؐ56t.pf5#-ɲE)ݧȴad#Y*nyQW}©"ؤ`B!' e*YVJlM{(p(g 1$Q, Xg>dS9tu}o|Ԍ( րɆDz6-llL|B(V< P(pзSupg:Tu~îS{nLU&+|W49e[Mw-ΟO߅AѠII )8azptaU2A\6 ΄%•D.2uSse'z}+50 ɔԠ1w3KJ k+ d5BͽN !i `%zE·>΍#A3?nn wcƷ&|n>pڝXp+ilzkJօ&A Y0„QXvnÝ'uMתp%{@o`tCA1%4^rSxӦ6%D %{np{ziaЀ&uڽ% 147fwOkƝ8Fq$nzԹjtWOj#F~Ow=*.( w Vn%Ӏ5wb™Ll9w37 _H7`p&X{g$MPbq/_;&(kŽ+É>S J:8vN[rmQ6vǭ)WLg{zTbb%4qEmHA v7\Gs7܍f7jֱV$iAp0CǎWMPfw|ҌoyX4f7Vz *뎣 Bܹl\4+V+`ʺVzZo_S&Hx8B}*%TFs})L %M});ow}ކ;~ L׸? kTҞI8}W7 2AA)T" &qB7sl>ޖyܣ=j4v ~5JM1~L $t:0ƯG^S&H8|ҏn%~GzJ5<2wĈ} 9.L{jŽEZitQ7$`o:p܅nzH }3Zpﭬ閅VQXj.dayu}ꈐ@DF9,s7`s4 ᦸ f'7Q&d"= V# 2 {k:|\$NƑ>KvOuIs|?8| 2RHCR=5K_Cg{kVp $P2I,y%+GE?DZ/J94Mnjjbz}Os%F>k UGJΏitEO%FϫDiDɣi  >*9JUMFϹ7 $0]\7)2PpF)UhֶJa\0WBI$mm@ƪl\lrt*JR|]jĽܫm' ܻG+naxe@ %]I^왇a<)EpVƹb Ha$҄-pn`5qQkc}qڰro4+ pzm^bX1lX|W8>百PHI3&}4#\UѼ҈+M'њs&CMN7(._7ݒw&043u(ѨĀK4憶XvU:'*.`9E4;\ڨ,!=<2w8^Ƹ]qNٝΛ~J MDO KqMưS=_s.=ׄ{$aCHQpERݜ [ Knz5kRɤH A5Ah&xj$kM<4q`s O*Ud%Cɺa@vgLPB6L)y0 ҄$+]wk>4,A$D7l鹱OХUI Q02@(gX:.T.\ЯJnܐJ<X Sٗz'MwU5/ܣs̼ M ȸAf]_'ܛZQXlX]c򠍇l&`}MR~m6@a7aHk]=_k{Rj;iZ%)Y~{y?,I5E$ Q7 E:'[?x6lwubA7+W")Nnn_h4^f?oԢ$K#;wӨ;lW 39tÁ\, A hv!:FxTzC>x״(HT]-c~mc3kNHZ~93+d/Ka:mYj3o=k mk6V߸2}6fp%;B/c'''BJ<%O8Klxl]m|QB`iVj5 Ъdw}e6P#}ڿHI&R1D&\_e!a Hl nhhjÝH7+4Pft:)VT^_._kJN*H*EW㍝|vVӵZmF%}~J>2Gxٟw^[ {1G@U?L&R()6DRVu{| H!SC+&8[lʿhez_ 4Ҕe[5NdBMLL||&zJ~Ad2YQI$ڳ״J&TJ=25OeُNMM1]K7M&q)>GH[w]f ˤΞ2E|s +pK ;RBFs 4!\]&f +1MFRi܊OMw/Nޜ}+a 0s=*GL0Sz鳱X$V/~:_lV:3mH$*Lf~Nl߳mo4EϞQK}K^4;guͿI*ef6}7 vfmo04 Oid~{ >-z/ku! R7GgqҠ9z}RbH%’“1cI@Ey͝K4 `;Z$?}I~ A%nV,5E=jA ;Jي %cLDzԝV"eP՞N&Y^ОKdɞT*sssq75=.pL1X{L0p|+ж;c"fUn~kM0QN}`N=UӦQ%P5T(,]6$R3&8z? ۲W E%_A͎B篭T*uɺVVVN5M|m<;b߿wuu odekU/L*sZm.?I#هgggBia 4l-(:sp3ʖhHΚ`?v5z V~6%.aз/$HavȌٻXtZu}=jrsm 1HvmLj.%vWWXTIXX$ZDDlJiYEN5?L&7zjVݕIZmZsNMMYvJ$GK&2}IMPQ5@%.F}z?u2ͱc]_H5a;s#F:%UR ;/h5HmkD $;2Oϋ%%vE!tb) & \v^^^W$sssﶟNu:VVV^n, JԏfR{G[ƅ4s&H(R'QA&H~ {Ll5@%neH:cx Z]7vg %붫wFzL|̵Q閛S?M{yAIae"`@/N/y^lGHbF-РPYQզ׵Skzz񗯬<>d2Y~QT:TVS|>么a4@LV V$ gN5AIF :?fc=!WcHtN) =~ʌ }T5AS!Eꢦ럅 #ТCGzȐ@ˆLzM"hRu[ִ#L" r&YjSFc\.JX,6l3BpYIRt666Fh%h Q)ܨ]د6~~=LD"qgJi&Xevv7Wl]ӝVt]Pr(ܿ(g= {ϯ~X=^uF N ٷ>R% V܍i858آ&f!fff<=d֔[]]=H$oll|sR~[}TRTm&XT1͘TF``,J3w :ܿQ"9EFpq[:On9peuGH!^v;T\<\4"q$s#;=QQ,veN!50riQS~}_Ѿgjm*Ad?dcFI ^h4_YY9ạ.ᴝ_kEJoBi ~:%ߒԪQx}LiO$_|vvv!3\ fӱ  ƽ.l½UV,>ڒY`~xgsq8Bɣ{䜄 TRh]gdQ= @cjjuZJeazz,,,x<~YOqXP.h(L&j9Z(OUՙJ`د7vp\u=@OVre%FN m_ӕfl^s*7Ǭ;:|WQ(xic&ATe4_0 hK+!3E:lHV.LyQp祌;~li%*<-H)J%~T*%xGM "J.;byJIm Rv{Ap]8@NE"QZɋZf]]]}աCl,N ,@f*Y1͠/2m 8d5N960J3&)υ+cZ;o:Z]]p׌;'e8o#|sp2Vʣ{d"3??KKK?Q(̡Cϸ+=XsY}w#ݻ:I{hHB1A-ʜNWpuuJٕJۏ/ߧh\cGI$%+4P7`Man0Rz.` ;,G nC>wq8τpEss}`TL\n0*ez`H cԩS?rܹd2Ü}MFL}ڟsu!BQ&5/Ǿǐ0`H cX,XZZ/NgؓG1^Q Go*OtgnWo 3o߇u:TULwKdS|}qҝ#2siQmОUӝ>FŀsV,O]x;zzK&(lp7?b?L&=& 8m43oZ=.*6XlV"KR%3ֵ IFƤYLMM}Ґ6G8[_;L`C ]:iaI!iZt=&W=SZX%uDqw<`{̥]Q&Z{ަ{6כ*@o67x91SSS/t:ch.DVZ)1H&DFjcX:]󷝭UY?Ia?T\w^z=orrKCz]aWQ5ه@D*˦dLpenݟWlw=?NwsFJ5A"|οC5##$\tuӟ@n8UM,05^Ndz|q/J  X18rJTcD"QV+MMMk6K{mZӵZ͝N#!o fZTwK&lJiPӁ[6umUڻ2_G1*nzsEMFH{ΰr;M6}kA$f@ro5[jQlfcE,gF+PL&^*z>R(LVgggؘT*ׯ%>8"ǂf1 " jVF wlR VL"w?`7C%{H%4"+uΛ칦*dѴ&=΍uwM T\Lf?0a_}YK~}q|]</MLL\E7ݒe/;4P"-Lkt>D"Q___?V_W.+{Ո , &-/J齥A%RǓΘ`zfߩpk:ߨ\9-EVjuJ+YTvQ Jq];=}DF &1ZY__4\nV0@h> “O3$ 9\N}RF\^d,k{e25=&(kt]u}^q狀zXHz$Hl&Z.w\bYXX0BaпnV~{x 1~},M,\3Ӧ;:r %ad:ڷ=V1֞Hjc!B4YxihkJ()sp3G.xʝ3CtEϻs"u9J-,/q5Ud,0HH*J4'K9r5C6ˇA!{iIK t?n=ך{sJ/Z](WRs ",䮳jp#0FH sܿ)J^ZՀ厾0RI&Z:^jd26Wv)j2]̎V*i5IJ$1Ƒĕh> s&ܠE1/a(aԻ`]G{Kn=߭X,@HBI%v lAz_mԩS{ufWhH<* iN'0nRix 1YlEszUj6.`Eh0l}D0?o; b<-ݯotW>Lߔ 'Z&_5M7QD $`-..=qOrڵ͕D{vԝxݤ+4 RRyX,VѠE"gzkEJ؋ cϙ{dVI ZtJ ɔ\5-wFHSH}>\fN)19{IU ˻:C6L }0Ξ=k|k~ŋȑ#;J"f@TzL&%Zc(I$ Is@R $%13Z^?;/ם yEqAFndGK}8WeڡkȔ;>Q~BТD閧 F;BzO?;w.vAlڏVixs534RXp?5@})TN+RƂ3-nˤ 5i`$i\%+g+Z]A$R}X$چH6]v?w^r%J IzŌjmL&c?_RvK#J:!=NkIR_Kʘ'm%Dm 9U\04xO vݽ+Q5@/U4g+R41"p~6z6uC9}8[X@u9ARQV,3A6^f {aK?v;MSpꐞkRa&>f,[0TNɣ7u^2E:Gk4 ?#a~Ě関.Z0Hfy `hIngh h^1\v' JR:scN'J.RC:華S&Whҝo\F$ߚmnH%5aX]KL0TNgLWYTMX/&@@ 3v;OS644 5@ZORt:h4Uo5sߓJiuQƝs0_t!=*GWwkF_.4J{ky?U6tX-jmK6Qް$J>v>l+L7Po}i6zIq^)FH72ۇZ6f*ئ QidҶ#6ɉӴƌΛ*U7mQh#%λ뻒Ea:];$qtik~|ъM: %m9Eݎ7j^l6_V*r+W|x?_eE~2H{oer棒GwbSVMRlll>oLR2/3-Hh!$H a`f&lHX1uk sgHaLuwkKm{IbHj5O&1ɣQb&꛾k&''}G;{+UEBLMMm.ۡ+666b+++ž3tU^r;$Ј@5{3h4"إM591iTɤgMŬT*!1 0ʆ &RHɢpcD _J ۇT[l|97gI+%tE\"JQ.׮]d2f[0`$c؛oT*s\nfApnЕHʹ~>NZ=/tMV k z}dŷ{I%>YOR&H [$ll&&| }B ;nr+|ӶU(JGi ~w+#N7-H;c̓5XTƇ40ҵN%λk0RIuNdc%|yux_U: ^a  gt:寷q:,' ->RH>Xi,k&$4ivYq= D yF`¸E6n2OH p ڃX,Q[T*>ϕ,Κ`6d$!}>moqpMPZv=%òV}dEMwRzx=nW.UxsQ:QmO4bX,oV?33Zfi{q_`6NHii.WmIkT6 pO% =^b@]!UHp )˛ r{p@xO 0mXt1𙶑wVFewliU[~ m2wU2I3D^n^4B #MP(Lcq?E9K&ot:Gl}ߏ#7&hefsxƛmf`w1<[,ިK Zkbb"-sf3gSHTI}cDeB\1A+,kwPb芻p5lPb]6RR0fv{3Y]]5W^L"ieR*5~C [xX,D"FmoԮ2;SV&aZɥ=_(%ߣ}L\h#k*pnZݣ)JU\cX;߱l6k69Ϊ"۷6FgzzzI٘!G -Z\\\*877wޠ}FH;h4T̐5/n!%J&IeSTvh=ϚT_#ƊCZ}4@ "MX67ly?`[rt;ēB*뛫ji !^ii{$؆E X,~ޘqcc%[h4&kH~]MC_×cu_5AImL 4n)wES(ܷH`Q#^<[7GX9}1 zB3bW6?Gl|FhύHjfff>_ɣr߶}ϙ`tF)$kh˗jw>]]*#?d2f}&뫍#6q=Jm ]l~:^诨dtv R*VIR%TIS4MtUHF(Raf;λH $urvN+'''I)Lf%bg&h`XeUyJ(ivV*)Rm1t]U(\Y&h`%?j6㘙hA@@`8oF?VI$ Z__?t2VeE~[U{N3᯸h;F29@JiEV!e}G|뻛({g& Z\\p~QV*z.GҠۧm|T^I{}[D+TΣ ܬn9%/`,m ~-wz&>]hS&ygRyک"kz1A2lSTi'%)>hۈp_/cz;*w7g JḬ: s.ueEN'KCjqq|_Z[[wddoL;*j|_*JϩT*G'&&f{j&_xgh\h}XIׂ64$QUWM7J)a$F<0T?m {aCܹs}b/d2ըnrPZ=aϖ;Ϋ^a\NIA )Eq#fhI V(iV(iSc&X@t[rת{=Nlw_܃)!aA !l6}(*)y'*|Tz>:Ο/--}}?ڇ_7ү{3eƶڇE$T}"F^ &H )1T J EZu=X]o0nX,ujfffF+ƩUuQCH RNRW2Q.QzZMfGG hMD"I+6=~um3Ay3Ѹ`V4b2o#O3#.]wp&w<]F~cXn>Z]]5Z,,,KBX\\bةt:3DℽY}zrrRɔ=fUČq>WVbMN>=iNsM ۰hϵTL ՞n{\!N`$Muf{t}m˭V9z>??owzzN$ԛܗN:L>c2߫hL=`oV7Wy؛Gk[m? nX&Xt\Ҋ܍&0hEEV M] _fsRzds1f|fǏK6#vm?_U|P8gof>eoPsRd8h)VWZm&LD7K&HiS%42>sFLUug7t:T*g?ڵkoԜ+bt~fsָfyߪj@TU) +iGm,O8O I0j[)}cҞRё#GgFoxCcF_zF t~j"{SYNRKsqc +<=*SgclNL>/޿nhz psX B i)0ڔR9K6VLPp7ϬbޫDN(oƘdG ѥOZ2^L&K$ vDZݬo6j6gFuIȘg{>~hI^/LŅh0Y+ LBwhߵ ]Q{2SϬ}=Jiqmsݿ;f_76Nj6gclhN7f}TiXYY@biw0BziRʽ_IM%+E w}w'Vrl I&?kO9`0H 0>4;iEs=l*b3664[+J6.3.]ڠ 18n#Bfi&`ߵn*ٸh%+` lgk̸6Wu08$_Հ5NWؖ+.~iGLLRݚ{`p jA]:cat=4=Jy7h4LR\yN?9`@Bx4^XhRBvхjh*)QIիy ,Ӿ?Q=WgPɝɱ6~] 6'NASS)蠀׋N|EDXԠisl_jGzoڇ|5{\.%Z6FP]Zm6~=50~kEu^>DfjsMaac9|ח鸾 0Ҟc^8tէz~RI %T~:Hlm{_6(sOX9H !Jtp(5$KGDJ<ħ+ժt:&o[Wٱ28џ}s?6&#(ROI_1,C$Pվ0dF,S?fw8PH+4JT 6l4iub\ $%^o>RQmwacB8aB QW76.mJvm͵GP\0˜Q&D $ @?c"kaa/zbT`k6 F8tG̺ eA$0LUD_ tR_Jم Xls`&gmh D $ Uƚ;>Msnc"aXVG&QswL,[Y__7/^ўHʣv=͕ӞG0 Q6A־Ms9pgO<Uٳg7Fڎ_yp`DLhC6^jdW na&MaC HYղ6R4 (e|څ0k6N8ncF:ZQM plQ0"QVr'is=@5l| aBGm$h Ğ~o4ߨ:)ʿmkC: tli D $D] LP.Isڅ R}KСC+)j'l[CA6Q9$c1mwwWVV3X$vx_n鬍/hH#61ؖF|oƔ7/^f[s,"bǢgn̞6AI^P٣u&To9lh,--_*^6HJ& c/eXGާL/oHaZflq 0[*rU+xiǙ3gfbkZJ&MLL|>ߏIEoѠm4i!}}@vM3O`GMj{`ptCM>^1ÌwCnqqq~!}V\NM"Hr&nuumi;m|WF $`g8n$bFffjeV#%]3A)%0T@<{cyeݾƼ}~&QD"l65jP!lMa,R)&ػ@UM@}JK&K "k/HQ,yq` $hєxQ0\>>)Ljǒ JcH@@ iѴS&Xy`)%읤$R=6 X` @Mw"% &Xa`X;(iҚ Ha.ѽi&qjyMw/#}u77&6.IU#}L 5A9&H)QF)5knUeIhHaJqI J%i}rve5\UE fA$Vi{DwRbII%R<$0r&H0Zqf!+6`$Rj UJܔ H `hߢ %,RM`Hhk6LL J-#YM(J y=n:vG ܭhJaf"J"%h)Y!y`tƼc{$Q+Λ`Jm {DI!uPlgc}>iHM`L(aT3đJ]tѤy0h$9cđ:UFU5A;qkҊؘ6A:7J#(Ѫ Ju짴aK@&XI*Jc@ܝV()R%G ['~1ݣVi#%H+L@ %`UJޅ+'>RH "88e 4` Jʤaz@n(Qt蔍C&XwwJ*]6Ap1F ۥCJi#%&H1APJLBIl,`?%V&!Hk #EI)$Q<%2II%%ues*%` $BtW٘uϕ,6#I+&7I $%MJAHV͘5:h@nHݣJ)TqA;a( 0bQ62&HrAY:v(teO> 0,RHɣI ~"M؁A[vj) +"xj F6Mw#<"i跶pݝ7ABI 0@Đ@~ B %QqqXA u\ n(s$FCIrtZausFLXRndUJ$}A `)aw?{o$K̝3l9 BH !##/!a+$!1Aa!! "D< !^'fz;sյ9:oVUfUVUfMfU[;,:eY_k#6 "A82B+*ŐxB!dHP@"BI&gHt)%YV! Ѯ<Xh B HB! _i yUGWB!YS !$,0?c+D$xo\qO=O!!2!P@"B3a4a.+A(ؤ)okxPs:斴p%L\$#< (IMD!BB!$& ,q(%rBt;Nױc.!ܛrf,8LI]mCw KFhj %B! HB!1E(Bx:F&ь^ ! xt'GRz!YRDr&'(gD%B0/1>OY- HB!ƓȄ&hdiV!P\|F^5qC*ģqh%R" x)t}"?Wo HBZH\W鲸G^Fy}qQ?zEB1eq RX2lھq @P:1 {YP &M Cnms뒶xyLXo#L.wF1@B!F3cҩ zUӉ)ҝ6뇐7ue0jZ0  1BR<)8gx{!2۷L^qvvl6|׿s||\ dmBE^0:Ft5CeLGM і`Pm*HSۄ"x`@ǢnM(W̝ &k68${ڷXImB5铓kju1rP ́DpD!XN|/^FYpEX qO%À{,H<[z ~}\K$BǦNyWܜ.Ic̃+;%;I9 2>baWujvvv^s/^ H {!JB!q+=- F.( `(Bh]GHaWbHG?9Bz)[ 9wgޙ$Y;(1^JF\jI$? !$AB -'B(CPU_QQk[ mS\5̽uF ! ay۾{xqDPv8/N|Lȸ8rEI&GҞcr#`v:)Rkyy_[վy|< .& !.Մ#1 a>-D? 0.A8q GY-ּiiw6t .g𲸆~0o?_;4kIgo[4Tz(2.p@kabqZ~GDȐB!=  P0H!²({+ -qA#Ð{MSl[=A'/ CX<G!"T<a9ߛ62nY\O8|g&nꙤ|r}||yNm>"B B/"W654Q00; *]'3<yqg9i8e]\1I½ C[^)NgJ7un/븋!&\^J$ MX ɗiB^-V!MNZ֌S> "B!u``!n܍1laNӾkp25}?ymw8zA(~^"UV!9ck/0aS hJs+OA$sdzH&.1yOEBH0דuu.w.7[|4  HBH6=`4MˆP4] |gppɬvU;x#%cNyI\1MIO^@ް~] %o Ib8־1ngODHtNsq˵Zm\.MOOF޴Zv=GCD!dC0!T؂i0liNbD-hk α\GlC / fx辭㤏3f߱z04m@eM0pFP2?h?Ѩn_=99_YYr>jٹ\CB0C&QE4ea|}%!$~ǮXpv$y1'<WLZĤ9r)-q!S8,e#aNE}m Y}=J].p{{#-,,mZNPxGBD!L&0z- z%E0-N!ũ|'qapDDF;m}>b*ȸu M2/ {:~fx!Lwɏ%-&bIx8$^JAơ=gOu]-V!o|򅭭YXXx=- dP@"B&V IwI7ɜ 6aEHM~TEG>ӏΖ߅WQ2|hP"B=Wt 5qCY5xa „JDU[Lx<䢑_/hBF;"/đ;0K` ~淋YN^& ˾ѱ^z p Q")wNyE;qј # _oۅJkkk'| f$BB,VWWR0u!n覷֙Y`0V`@5OqE;KzPI.f2޾H Аls,^Mf="hr,ڷgjڎuUu։ޑ,@  \qc't﹟q_h4{rNMV=!!ll U0߰ElC%cl^7xfo8k$|* ]-fz+r΍y$ ՛3JX_76Ladm_b֮4rwbY^^kkk_ HBHr-$Ehy}mT8 /#+`Ĩ+B`1* l qs ϣV! u;sM;x)Ad$%ϣM#ᑶ33dJV-5V.9fYt^SW*m,!# 2B!$Y$"cLal)8bD#q.9ypb'O{sDk[_Bg끇#鞿xsU a uOQ9ޙHۂ4m4IzŸ/Ph& NS^ \ 7|>w>|iObNjڅBakkkNB$B!Y,!]d^׍6_{p\Fekzox튗'ۓ(P/g$\,!%ȬbՒy傣 bA+[?*$A@r+0&u&b(RM Kw_\(u#5>P9:2;0Z<7aHxAD ᜂ^/IZUBWu-zKDŽ#$KBȘD!$_ᭃ_z Ғ{9a|>1\/ Zd @\C" "rfK×@p#B9cuAo;OHc !BPAN57;;;L= /}JS\(>/#D$|>/J弔e)Z-i6B'owvvkvvO/// >n]P7 n0fB@w "a  Ca< l_`Ր`PO$j;0}}.e}N(q/%xz((bڮU5-&2l!BZ_]]_2B#op>gskFMssѢvAH߄(uҥ/.//vںna@ko¾'`0zLu$| A u`tH R75 p LxW h=+:+#B@:.I/%{C!!dxD! Ϙ#{9<<۳kd"F+++25h;iccο^ln]ӚyFG/K4 $~Qq>kT`cKqGxBUX0kxn3y<I:8 "kH ALǤS3B2=!D"TV;xa޽{O Q)긌=q=`cBݚqD`oYWD5^JӬ6`L5v{YCU-m[N:54,B@( B&/!PaRCnc7/rT:0BR4Cb&NSƒP7~SOIicqC'nSE-`0!?0._W`o<I拖8y`_kD dp Vږ'69v !d" BȰ|CBadyy\@[nI>?};8lcX.tjy6JlЈmX!ty(M! XW'$+!BB09jZ㖈uc)?f14F^xF[WgM#2h3%q0t]Zǚn0Hv%KW)>#OO"UDiIⅶ7#%98K1~imF״|JG J>!2,^H?_lNda|94>(pIsSﰺSI/ ư Hm#_ؿwʇޏqeqsuVD/Z`R*iBa$&r.%Hu^׶$!$1P@"2LX*57;eU68к^a FFϚP tlkωaAwYs!;k|_ :`LN iG&u=͉xG $x(q kLwH{蘶뮖c5!>B\`Bkkk+++GGGWEV ~!'YWzר5^4pᡞj6]w՞Z0r5'g2ZGX\O׵0Fcb0J:~@4x!Cecc9X Ky69f}s-@RB77" K}"WR1B!\PB*J_;"+Dg\p`IdwaXnjeuD^l0Į]!9]aB4V/=.g XZדyq ܤ`h"GиYHw.nQp!)}K:~XG@=B$B!CeffgQ@r Y`gN0jjȘ&:207U # taq ^H "wW.IH ک!^Cw99 > Cݒvk>|Y0wUmFPj49.BP@"+vlkݜkkk^ٔBtqXՂM ˆUH^BD!;U4`HU{0BB 2tdWa͉gY`&nݛZ/ Ըw״LDB@hd敊nNqǷOɥK=`W/9 X-60FL\!N"(A)) UC.O%7cC?q,I|oj2/[5-:u/%K+n/!imH"%B$B!:Pl>!\0r'腔]C %MB!gӽA?{U\/I+cxvwa3cA}0LE#^V4,OQ^!$Y-z1"D Pu=_ I$cG{O:FBHAݦN!$yHq[7x$'g~?z5ZS~9#Մ-Ѧ7S6gw=@сa v`$xP/$u4$Z,Wu~">#o؆ :H0"t[ZDpE!i@#HI.6jUE!4@B 6%7pxbќEsZZ>OC 2=Yؔ`Sauck)ƸjhH!0f>'&i1 Ʃ,Bº0_Bܭk?tp66x\ kk7c`zmOH%BᾬcZFRDf+N39t+éB,\B鴸2yl[seA|>/.?Y 1R]ǾmO8ܲa&$i+KrQTBc&{~ѹsU]~!( B1h4s"NZrs;H7nj]?b°z8i/<r+$06w95+Ѓ5qOٿ1 k3k,qʗe'CalЛbg KE6q 4c2Br{O5s2],p č#sԹpJWt,D/'M6&ks92 ˇzGד0%*")kmԶ=TM!X-q k͂9uXg# `~^ \kwHuRl؝5 TcPd/ Uɶ~SO?3麉:ƽ% J&%x)$3L$K20 1:n7ҫj?8Џ;BH$h zO0&0{kga^|?˅woߧFF,{B-T*HZr<S6c k Xq᝾Scj)<)aFV/H67Ľwk1!vV/QKya89q aMC0ii1Fscp/h^;ƜcxD!hߗta aMC)(BzBLEP#uCu{{峄"&9߹plZ -뢮(IM"SSggg37t_vʵ4S~I `o/NTx"8@!$ @1̟#D{kqym(˂3ϛ5b>|d$s۬7!ێiۭ:P2vT5I]tOоΟ kC P@"]v:]NBx^z/0g/*-(Mav@,(~C255Zj*J:Zo-..bq??#'bpGXmmt~BMr(F Ƶ“}rK:02=ѵ>' !]u;G]s 3Q;I;-xJjzV@j@Jg% $P@"OѨ(Ϻ}06a^1F&BLn?ol6n+a(#cnn?qxxikk[~))_픯r?+NS~[[}7!kq0 M8LJX%}S6)8ɉu+|^M$iFprSm4ep`M﯊kTFB&}am1iZWxwg;ns}-^E"j?i[;ySqxЃLh۰ϋgz}GV# q]DIآF:{~&!>c?1jعnދA^v+)!tm2WqSj}H=?gff]%PUZ՝;w~*G(y_F ^>_` D7sύqCq1~J#zxi5 c?AW;zƕk28^?]-&YcM ҂SNxy M}*$$h$$9;`(wtK:}02Q?BQ?EB/!c9t`H2)®, 8 E/jU:˺3#Ñ ܎*'Eh{5w#d<3Lo(JX%?R7xa:}I$R{bviIN:*':88z D+gSY{~9)_Z^^dzяՁRKR@m>ƟaA~. uģ>C hB!P~Pbgd81c;C+6t+W ޷ sgP"HKMYK JH 劌>z ?y}؟=_R~ُpd%t #,.uh1ibЄ+qQr?999|>?M(I_q/Jxqʇ5\d%,HNRtAϰb#uM.J)%:)Ll?h@1GG)ewnd9bm>nj^Eo]!o4hG<I+9*uiD/۲NB8c7R[(* {+;$ ux&}ntQ:y]zt۩WGS0Bh*" Mwl19\Z0B" N'VV4ӭV+_*NF1YWgũ.tAnןfn =c;Y2g=@"׊k 70yzqvnLCD˸Z7 kG^$'B:2Ϣ`-Z2isűO:U@#`M㦘A8ȼ+Q7{aK')R:Vm5xK8 zV-] .2I,a \E;ـCH{r _$i) H5qlQ“郀!a7}+ e+!?/ #%;-~9^ <?&<^N!_q BK[B:oL%p]J&xն x"Uu}{ Q #MgexS%X<8'36 H%QͰVS^9#:1!{5x^Ju\Sv~I_u}`"$41 GBE;]{I HaCu}4H;sU:7hrI Y c0 {իPHJ񰥋b"6m&&د;{Gقad;'ģ. 10rlyDQbnחÚ!á㧱A=Ա 3nVKE&x=qZ[a1Pw':h+ ٍ !](a#Q/(龗IE<⻏CD)x^dU/Ⅶ˳yrUdIS]SEG2Q0nH)phjMXu3!w )99k摳1_j qS劸'GE-, ˗ i ɬc#>Û:ϗu\|d0v;; . ZKHD2z9$EzF. HQ:y I"ݽ H^a:Fxd^tZп;Cjv%;;zn]\.\@-C@ np0'U!ΞNiDɪeoΌdO@2Nn+lfjexK:xF5b; !I[ߵu3a$ ˜z_~:j#8AeJ&ISׅzOHfDWęnF(%L(A=zPdp^D #"uyM"8ɳBQP>dC4 A$Hń2id -Fk![l`E]<#6g0%epp&ROJPsE^x>: k'<00xڎ2Z{__¨~YSy-q<$DN<Gۿ$hTux6)GL43ģ^yGQEŐu yU< ®5pvQB/qg& Ť /%x9ur$4z vZL!\:'OZ&ˡǜ;9zqbO5[ݜ9[%%[j4zUâO^c:fֵ°1iIm oI#)"^v+(D- 9'd h+Q/Ѩp_QI<ԯQ,iАvD#LIo&{yCJAnv$tnPAш8`!F6>&t]V35ۄM2}ј}`"=ÆN{"nB^0!]RQ&m7!d JWNaDג-vDR $bݽ:yu U/آN'!Ⱦ,jNa†h@UDμv:%Xt%墈ԐNk0BI\ _am<E#DG:{}0Wn#> QWYԖdbAsg w%78E3/=v/!$7k]f{DBL>r1. UGzogߋ 0&o $ PYsXSЫB0x_@MIz„|꼅5u<2+¼Id2۵Iۀ}At=jDHX( eyuG~1.H$0"R^Gx qE4 #Jtz I}'!)HDjEwt[\򮓀)(Ҕt3XIK k?M;=݀E#0oFkrMq=v%;`%0 xvgp`%I$*Q榶Ƙ 0, 8 :^){ЁХ6s葾.긽% BAL&ykݷz` ^]]=/mummQWH⠀Y}0##=wu4t g&Qh(בH]0VLU P„{@ lx%M~ ݽl&ۉ ȳ`#8v X56ģ[B@_|$Ccªܕd2/,dNYv.r:ǜbH@yח31q pҎtв(O~IKIw3B;%\]Ҁ,Ah,]]]܈gkkkuV73FD#W(QI‹HʫQzu?B-/a')HTnw$-*R'%#wsשn˰v8F0s8rLL[`45xp꺁IMVrϋe`x YdIRS\dr! 5 :O1/z*!$u1c溮Gگ1A,׶^JdR%}dj?puuXϴ5֚>2J( e>9qM8*ܗN/ϣn^G<^HFaBi (bRg ,r(5Y!)(]gRWRk]e}S.z%56`Eog7ֳxz.;6 ;opPE⚛U\'/2Xؔݑl{az_‡guY0̫v>8ϳ+g w52ϟkKBҽoD9ɺ]x?؃Dr֧} DS-jO>V(^kZ/:{OF=g)IA(2pab:D8*IrudNazY:B=?$$}hdIP ʟ7{~A/*"C5oE d7"d?8#M7Xop. 28ou@(SF  9JZQՄjKz( gg]g5T`P*|^43 5 tOCOu`s32>Z:==mZZ֍|>_=*˥BUUƶ{}O}{{;U*[˜43px6pr݄N0!†[8 {/!퐿n!z}ضN풗`虜 ,HHcGxtoD#[0jʳBiE#}We :Ԑz:rt&[pNuӁu{ژ Cl=be8czWn$Kј~wjowř8WA^nvr??KSSS?kImGa8 AAQ/[Σ0yGW4S ;-ň3a#"uvauJ7"S8q{ZMш 8o0e-ξ\8}"= C5ɶ D5l#If؏]}~+AۼLX_{GjFШ0y#B&rN暵/ǜ.iYHzԳwkk믵ZR}UT*,r9_9ϜcF!$4&qvCz : ߨ`E@ 9_/a_miؙkN. #%# Pp{#8ٞJ"md[_OD@ȋYc':&Sآ/k oJ((1cVk,g=X59Luunmm}s QuKOggg(7Sw8V>s)R [Ⱥnl[^"R'ϣNGģnˆFq FI]`t\>NVLE;Ԗg0W[(d{QAǼg!#b|3oaH`XDNG\* n O pښ[2t;w=<3%ҩ$[a;NY`W?kj8LXEH$&VB^؄k?llSNㇽG羅 oj/,--(ic?^oMT':⺳5wʟ;==ɉ8Wq>4]`HPhOOO?qt~r/csM:EY)\_jHGRP=Z2ސvȟ3/B9goeIL{ -G}vp>9Y$!烧!$՛z$yM>WuDWք] !ςpdlZP4'cGGŢ\|y>SN x!~}VaqAƣ֖~N?_ y|o"BmzzkyOPx(?;;+ߺu}e |S)z}{k^l>{ afffRHT>=Pw|vwj?bHbmf '-qܟtBQ?Ѡ^G/?R*sz5a!}_ ė1}NugEH2xphq >oK򆶹|CàL=aWBH-QtL)?ĤEjB+ GONNf\IY>߭3O>o٢ρğQx.677ǯ^e#!p0Kl]< mNpK< Gd=Q0ax^Q(f3f/$bJ IF4 ,C#w(did@+/φ !68ڠ<^ /k#mXO#A{g;0'k ]qmɮ9p_## f!<>l0 !y:9={a.T`?jO"$oll& ^G/Ͻ;Ivn$;/R3໊tiT-B  wH(w*4~ =< a\O sJ_Cht @X1G)X>8Cs{&BJ!CXcE.S\ Y-J^R)yeY__7n$!?_Kwu"ԙx&dI먛p[Ⱥ3t0uM?^Ia$~+mg<èRKigD#B~QD"cA¼q~cC<YV@<묆saPf%\ INJVƸأԺIcg\_б^å DZn& 7WjPE9u6#Ml6Nhtʕ$GmlleU#,M!S$ G'y9ŢNG~(G~(Lt $JGHC^Iv8$ ŘHT0P ${nʳT{3($!Mq0wXvO #݂d׫.D"܁N↥!k1{Z2q-QIƦW5ڊ}a=mc$!tb>5#/zm^?ggjn:Ե)  HI-G@c{azyMKoQ'(ȰAm\B9AR71gݶa@dNEl릴VSA߳{"ҼcG8Z),j-qONp`݁ˬ ӻ: J^7bYtH Ok/-]sR=зpGbr~J![ఙ &]OD2:aPA"r1l^<[?Amc_3I( %>ţNG#:p-Q7(JȺ0‘HGd2THھd& c ԩx.8B[lu iG1/K/F^ Yk9&C׹`ny,Üe/F MQ"𜅁Iʿǩhiǜ{U]i0!d? CArxh09fl/GjʚlbOc}v6䝡Y tl'(\]pM<*Őu߲K\GHl^GmѣMkwJ`/q T"}D⚗0'⿬V.T0k655c{ɶw NgG(%/d\wd`H޽9yێu2;䄨4ǵAby\*jpzz*ӌ?.$?C.gk>cWM܂#[pSW<(p$䈯 "$H.3(WW'#xC¸ߪHwoN#֎"c^lP<,Nqx.$9Ԍ{ߜl HI_B-W@T{;^z >w%! !bl0g[2+ WaRy /B2g)uOi?{o$ٶ5]U=ݞowyO@` Y2aL`Gl0d!=d#P5Ia²f{{{uyLڝv3dV'|9U9{ڋkv H_tFx l H8^邖i2sݖ1@DDA/º٤$~uNܲ挶ag9;mBr T B@Blmm>eʵإϩX>I?uھw]6PL8bx Dc1#;]R$Y7#Җy2$KKkgymZ@& EY{ݧ IUwTvHscXHYtG 28^;.Ʈ8 Hi'fjQ9]BtD"rՀ}kസU븛!oK!}JMKM#oC8 4iccc?511q:) yZ̜6IHzᩈrJj@O[~d'/к̦Rx;jEHĝ0#maN#Τe0m/La|΀^O%Fq^،߳ cjKAD"SBa-mK _p^nb|t_~7"do "^x!\^, к I8U_cڄA[lP):JFP"5^ꕀt((䭷ޒӔvtռuW7`C=N;un{w2[pŲSeRnDi|[R\{j%=N'$Aup(%u)PPpr;|f G ޷28Nu\}®A1}p*}H3dBȠJ"}ilggVsε?r||jDrҥ~/Fe[:v*L-+z-U}% \W#bHۈ>"fGvںI|GY#[Ԋst.yLH,iܺHZKn}RLsknM<8A4B:K4`G9m0u vv轍Xd H R_gY`(9*Ø[>E" d|Q_K^_9i7?omի4vCCk׮ɃN"˹1'q]v1\QiGmS (<×ԝvYR ;|QZ,/S֑~ADŞFq{RD* XB ZF$w X@`G{Rz9&W GvS@|N;[o wbXm/H$&zsPc4Ft^*\ؘg ڠѭ[z]naa4DCZSׄmΪM@ܡޞ®|ݣGxK[K]$ݴuF@2i>Ǘ,㾔uH?G2?Y4wI$ ם E=ϑ# /r82"Y߿BOdM5)8QwBt@񛎣tWu7#v !HKRiDxԱcڞ҈T2>Ɂuɓ?<@B*˗/1 7I# @u҅:;8ĉGiQ $-I6Iv۷\wjdFi?Y nYotV l H]H6'L,ݷUߊc='5[wZ{IT¨ZBLfM:c6)2ǹVU?~ONN߾}[#R7LLL H{{{yP릢):F!lP#Ue2.Qp4*GY#_\;(7psBvJzYSeIS&褚3yPD4eB'a}v;:Jͱs&qS:ӃD 2/\ RfdZw:DQhsBHc~2u^?!( 5lw={=KGy5Q.bsԇlN)ICk mCۓ ӥԉ}|iuvQpd HYֹGYHcBqa6=PE u\<6vH}9hRq~ 9/ u]o; _X8n 8[ΊG{k  l! vvIg -JEwJba$k_J>Ҿ6y@gRGD;|}FG#\:7H)ی$֢;)JQFHCē쑎 D)ĶeTg H~хyPԠ{z.]u9%fؽEu(ܢ_k o BIL-б6 6D@@2Ιٵ[[[ߏپ?NNNpN^߾I8.FE+qA=[PlY|QZRٺMy4*E,i\M[wԅvu:pw_ff{."\-r,9tuOd0km9=ϮxR <ڂmXtѮA϶yIzpBPw}}KoIԄ+a4rl ӱMhzyww!}efK#)Du]V(.]Eģ}%fÒ:FrJ/dIm۴Vu}DrnRQ|r:s `wt4J6/Ԁ4fr|}5CxgHJ6D%9twfQBMMJV!(ALZй iWlo?5GG"\q˯Svȴӿ^vu}H{wD}RR#W񥭋Gi/(xdHYRgQ<"E'""U=MHNC+)ڊ"RpSCt ŢQGZG NKx&ٍnl"c sM^k^J`uWz Zv8o>cS=iBHkXS9_ן.v&jZN= <;lI9b_צ@L#_:_#[<#W<##n#BΟk,GoLHƲݙ!ȳLJc>_F4-QDRұDww(T}{cuQkMRmv,za?(EHɏ}PTC)[ պ 럐i !sGd" *dz9o`F PVellW<)v=O@pFȣ8mn#RdRL*ħKYή#<cy7"R>pfW΀>כ!gA3`Kv$0ҡ[W.Kr\~Nm<\YЫºHNz۶:n^HjjzZofdd;Z=Maף߂-Ve e8M]E0#;mi}X ǒUBZJ;&R3F$]oqE!]"R Nݻ98w .]5˝ p> ) E8itܛay^dDϓ/I$n`ZO(?W(q ]Pp6=k^H!Y^^--- _( ]fɎE$7=O8ׁ7F?vz-GO$uw]4i|W੗( 2r[<򥮳#_#;dG(fJwxDHHd?6)`0$_+[q:7.1@:c"#c Sם'ݝq" ). ӤƁZH3 ubj}bwj+">BzjEP-o>"҅H(Q9G&[3!Z\6Ǵ" HQHH9S˨Uh{>}0MúHIVJχ߹׷֖@t xO#ׅ; ~ |O/@Eriw: .cSG&b+%BN I"uHsgM]'*5HD7!`Ꮬ75(: vٿ/uhIXCwsMs H]yD"r0`pKm/uLHf Ck?qttɰݩVS{AV*>xɣFzt ՓNtR[[[CQ5O~K?^:_( 5A\ȍ>GM 2 qa=?}7J8ZÎD$gwu3 9c7j- w@Sv<-5ˮ8׋<N9bB3yFuBzy@cITŎjT-dKKKx|||V kГ}F>?vtt;;;߻;?}ȯܔ _YY9F\JSD 6B,j==y Z&SʼnHvv ] g~\-QGnں4[!m4r嬈f(Eaɹ5ٌ l6O{s-QQSC:S;>۔u1cPlyC5 \5ܵޏtET5SbvsDyGGDpDQ흹:<<699p_7nLj'+ʳ/_ܾ}o&uMo%vAKƚ8.u-@[=5# Yuvđ+ B#B2VK8$S_i/ͭIwug[||vͰ=ţ΁M LpS<Cf^MSq~;TӴųEjqCQXOH2Hgz+Yǘ˗/vx?,--q'=d}rr;:lҁ{+gW^x `R2Dtсimv#7;!íd#$#MagOj5miWv>'#f?.q΁s!! $7~K3JvW&}!k!Ń^֚vQM1?q#IOXZZ2)yn^"XY׋pr{rǕJe{{_-V\}mhh(͋%sa%?ta !hrr_c!Dӌh6Ibr>ƥ""n(qC|Jsff|]1}Mxc(eA~A=o #az"MBaIҕoZ6AVT޿쫫9ߖ6DNLLο~j?߾}{+oWZ}u>a`^m"lH"1j H)XGMx4Fu#ڿrV"5K[Wx;!7"=תE>%ƉEi-!pY($/6αj<;r]pګH9Sat, ;浚v9ύ ɼұ c5 !m2 *5t7o.| ARtngf7<<166vuddk~)|WȠ?!m055hvww? g^ѣ{Dji]װ* ?2|ؾ!lN2>zH7l>Dvb6' Ar l &᜿'f1&Okzxx}ttt^ݻw?Ϲ$084mJ/>SZHx Iv!{QfSQ<"$EE$ӬlM$3kr^<*d*;gF$:f; vC=(h i1%dA),뺨em ز<S=Dy֮W$FE]uξ) :뼃 I.R=j~\N:DSSSO.=99cb{{!$#m'w:o H@, orxxxks)abH3lG~N};s E&H\M:~$`( 򍢏L]lFrVq4(-ȭy6W8ċD͊H>}E8J>d>3RQ 7t.vD!$ }W*v bN<oڌ@r@"> |#ˋ88/,,t,u;KKKc<ר(􏴵= JNx~H/&)P@Wh4ј^P$r_s#dn](MD?QRk@Bk%)kaU@Iތ*"!.!]:c; vbģ:5"a]qz͔P6G UaNd `#DQwv⚴k-.$-򋋾 I!B4iD^tLD{pmc,}?P'e^)" 8Z5M|6H%ڜITo6*3`}s\n Agaa?ਧP*ժ ?ώ6oD(Mi3BRs7)@ap\ӈ+ƤFGH8!).m]+u!%IDJT&6xd PesHLeg:-4SD;e2/ϳW9C($Qd!܍4vlԕ T͏,L!o:z6IUN-ҙNua= e0 )!6Um\1%IS\@ ȷD0Z`A"|bM :Ex}|;ބ|ӬTBNR Vn|;3P߀ q|Ktzt8h٭"LKs RyNb#a#j57y. ,:ǣ9S$5N.FFF^wGj! r!1Ș99cҺ%RV@҉.p!%i4ĕ8\Wȍ>#J_ȗ*B.NH EqQHN4xW;R<BrVNτ0BpΞx3#1 Z?QcX$Q$| r hTPt6iu0_L;rs`3PW}p=qќ%(NDG8.)mqF }w:9 /\.Qf #DT'Ej(j" T*;2d; AxE]x0/p,H>"]JXAɏɇO)lNhL ,j:027TgGjNr\$>A!r2S7s 4Fu1Ҁ }Gu)L-#Smƨ}d?@;\(K:WDb#B,"R)eRR)N0rLe~ϊ>(4|UH@xhtS 7: )^ #vI_-mV΂ /s0м9>}3J +t;(V`HڧOzRS MDZZ6vttt7T*/ y[(˯'&& )![IcK]{w::I{JK7:n6'E5x䦮s[w'7i"ƅDKDH$>Le~/p-5].юcrCޟH؅hR1N#* 8.Ai+57$Hkn|99\|`%+Onhttv}2#?mTEʴ=Kz> a5h ]oHj'" y䦬c:BODg pţu!'&դ9(S*3:0+].QdHyĨv&,OΟp-#7@Y}\5 :R@8|C}lsp䚴pxxTVg'\}T*>/^;XHcϏ cjoN]5d'w I;UF#nX'X:=A&EQBLR\##״+c;\E eMe%]S~r%n D2<%D]gWxA4JξI3 Xj xWtn9uqTDun ShR1jsfɕx͂;;;oWUYYY~jjחY vԵ "Aiݕz. iM.Pe4!=q:}䦕KvL]GHqk)D$1TvqRTvf煮~>lN|F*A^;炭5pw,JFl( sc0r- ]9&Dn>tQ8>IHin)$<˝;C'''wskkk[W^+++CLH|wt>O5:AtJGdALdivB%)4[E[E I|,i뒄$Gg1WJD\4vI"щ4_.${܃>8{ wVw.2ǍRHuS¨n4l:{0u~v\ϣ٤ L e+]qL6+jC<142SFQҮXsƶk~j:WT:~|?FݟwΎnnnO<Ԅ䎚4~QEҜ7"Kt HZ܈!z`+$K}lii5dPY7!dHxeG!۲4ċGDţh$#dcTW#4◩xcab> nt2 0kR GZ[I@ڋU8 3lpůWj]O%؀$H['jDR^,:;;W3P{?hÆڪ&" ÂڭXTeq CiedʘQu4\VC#Od>E"e\*4#׼+% I&)/N$> [KC<*Y1dI&bbQ[IVu40%9/O%i}`3YCvCfPfO( e$irMToI'Q$ܱׅ"R/0av_{W*z:' 퍌<::񛐾}ilCrVPm _4I[$uʬDQRM>JJ3%ȗ'@e!v$Rٹm&]Hv=; 0GD$IحzI[`c([BUv!H;q!3id 9qC~Kڷx>D&bSG9x6Lں )ccc+_=33[[[MH_ڱfa2ނS%v.LX0QFF+D"|:GGͦc!ľdB2HY#_J|BEL]8 &8K4)]-NFm.D’HݜG2MSg@PEr;pB"#a]A19pQ|cxK~ [&_J>,t la!?f5S4ģ4D!lsB9 !ߒ(e;u[iI߁0u]a{ 3%Lds Na8ɖ7Q3  쒞GrQ6-=|&lZڴAuRu_W*ZLaal$۔H{7%܈%Q@(1]xCM]#߈ N4WKaLQRu裤L)-k=$WDJt#7 mH\I]ߒF~[y3,!v] R"+qt}A>P~JOK h-vG8R%"cHpH`A>okz\.oW顡=7zf$!OݚumJKϠ} >Lp=@FPް{F`@Mfl' ‘/ĤV%d1ͮI1cTvqQHRٙu&($^Um]Ip̱! H(tsɷ1,ܝr Zc I2Ժ.Q"蝵EH9ځ=}?6FOu%o5WTJ:ڼEtlB P7(7|lP^5UYQ)`J^~8 +hBn#so仟5m]#BǰzHILREG!"d|DSٹ⑉BѱċHf3QHUk|9D!iK86!㰽dmCcWĂ]i%N",fswķy8 o k!ea\P H (ǽuĢD"i~ظLnD}<0=f/q䦭GnQ9%EeLk&ΎBKcw, XގX2QH0e>ˎBrE(y /dk0b{֩"}Ǹ^g0_0@<ꇨ.dHCm-;Ĵ^㈔P )<{R|R OQ րi3.1uRmyyCCC?|)\.w==Rx( !ׄN6}/vHY}ܷiWb8!,RR׹#BHƸfSٙɈH&hH-"QH$5B3q{FvK+ oITzBY;q ) "RGz#U4E M z(Ե>/wҥKryukailOe{{VV0\s/L+Jް-{M=~?l, | :WNNƎƇgBH7lhMZAy5sᢈu]}'$HiR{FB=5ήTHF@:&0dC2oģ`\-$B{v]c4; R"쩣bO/)3`L;Ҷ^ Hـ@(ȭ^6lkBa=DKHLNYZZ¹yr|ի211Qky7|~?=_HGZm;t^aj' H 6v.Xk{&(U |:f#7u]\HDiψ8(4$7 iX⣐!E!᳐]?QG,n\<!mx} ņ =8|WtS("# 56B釵ʎ46,?RIؒcn& #"u5Y vZ'[Ksw<<%BH;@_*HYD$S ߴ($L.&;>S\s"SE?F`|c=yCsB #=oqY\(=eii@)!Jr[AiJQw]Jt)n}ku Wɗ.-ukB:9%sTv&IB#[X{QHsڢD&Qt+ yM+$uɆӰmfIƢ$V]H|.;RB8N"RxDH\"s9BY5QdoVQJjt6d)Hy͗.K#;`%u_KJ]#BHTvn ;_*;dEqH& ($FH2#y5Qg8(/ pStQB -Qض-B̆lúΗAD*jK Hq"JKn℣4|GqB!tcI`N>eR{F)҅>qض/t\X ;IoXrKmY[!/uiD׭jsI4+kM-)%y'U$=}Dd G&0-iH͵!4$j"ŝL }3ЬOΆs?)Ƚul8Sh$_$BH'z8iwn=$_%tuFy ]s>.Bj75]tDX)]`CZc߳`sw A$6 |3"tG%`TDuF(B!u &}A<9c۟N;/p~:L]iź%GF"tWqĸ($[<ʒ:t*S88HYDE8%ᢰ`xkgEIU1Y0gQg鞕1Is.?ұ4vk&:?3)!rqjjWs.[lܘ[ G)!t [E$](a9n^;o~U ؈ViFRټpM#F ăDrœ'M]І{/_:F~K[;}B%BH' RJ; &D$`i=o+]LcXLc vMa4Po1r4ǘdԅn#vGdEǍ{ =k)Ry QOB!6D1o#Y#7 歷sE#s"磏|R\ $3yDB(.xdj k3I'YgEgΤ1hG&# 6C#Iƭ':v+>:= - @>vEX[./`MCB]tBY }io$gd' yF!GG^B(B8mLqF,ڗh7VϪ|GF!sN fw\_~[. 8}RXr=#s?#-Rf2 ) }˗ֺ!dۘk$Jyn!B:.-=]}MR^sOZ9EݝH"I>E*5BM($_]88[M L'VltMgG_|a{A]B< 0* 8 Q7kOP&t,vHc lko/eGm-،4qޕ(R8s!!|5[Ix>߶3Bɐf$x#_gH!y($4dHt$gSܹcg<4vI{QAʎ/Aή 1:ŎqvE" m:}Ԅ"x6"ZÆi Ɛm㹻11dB! CAߴ"*^Kz8Ls6&9F$2HpjCBH;dL#?1*g#%^ElƍLcwjcwHNcF;}`~ԽiMH8֋>Vc^q~cbf% D󍨍kBH1)l#66鹤ɞOR^ke)N0r($#4$^8-|QHuO9 2K*aD⣏|ujr6gMm]m-K I\ =[Ph'B} u=I6~ QH/iH%Gyc?!>LR' .V<GvR 4R2UCqH>GYR K` 5vOɹQDR&Fq»y]Er?IT)HЁ8V䘳8 ]b^sis|d:@H.Ǥ7"aR=B!mXpthD4*/m>Ka@rE$G+ՅB!$ zo\MkvRzlC*hdN'AE҅(6~G\M;H>1)|/<"d"j}x^nWHvԓOH* 藍}K$#Ŏ:#TD" 0&tq tv5<'~ }/KLƸDQcLL!- 5;r'h Jm}w3.ɍDrk!>1[)J B!$N 7MO I"Rs{,)؉O7`A] `%8I M+Ry%QACX(Cԋ>G$͂0W3n52jHv'Ħ:cB!cđ$(q+bRR$8έ!I7 b "?FB!Mc H%ֽZ+_]Q#8#IJ>̮HeM[2sǻlbހ(],ptI$p}Uwޖ(lP#HX#B2b{o7xq"S3iz,R=$;ZȎ@E!L 4}PH" f̌q٥E(b搢Cړ¶>OG$H]g%vE*R r;>@]Kks8QQkjb&X\g#!F개|O@rEH"ݲ H$gbR &^ed&R+ng}I##+uy#-/]IDG/ NH (VvF*'z B]^/H3M?!b昑( RHhZ ""1e$!=>g`A))dMAY 4sx~C5tXv;R\_1}!TYȣVģ4v&$!ϋ= `i!6 1)tNA_#r oesbv]+P6X!Bb TFѸNA7O4r%H$)A=y~4aUiD KC<2HiG.)BH^""sOXHN2>W0Ϡ>eBi # N<.IH< i$_[!RG_Yu.ξuץiTۺ4rk$t+ShD!JB $9]RTqU҅]Hy0 *zG R=M?c ~?G<.QMvE b^(  m]HxtW.S)!uq>'r>ww.g##h;߭yoK$&B#ͦKLZCe ApӈDPkq놌 $ s5Mׅi[! Si >㊺H܁[:~!B!@JJ]W(N@r>X$^lDm#cLY۷qϹ~G)_~Hrd! ii$f,,e_|n]^E&a~:MGK. umH:H!>qJP {h"PK6îhHWe* 'ҭ";af"{WGB1BHԧHJ['|:3F',Mޗ!Mb~#BȠak&RW)I%]7wSg-yZ6wm3AcXp u|nnKRٽfD`ˮJCDg C ]v !` HiQZQIIIWsii }}:I$!IKcW.MHE!_N]Hr] ء;%tVi[ d0DξEa2v66? 3B)Ӣl\Ǟ?NW'ud5߳YD8ҢR2esBWqŚ44mӂČy"Q <=HSGml Gl? -Na+N@ |MNBbq4.}]HפԨy`[A i ģ"AsR>ZuNXcw ucD1vI.Gl4kkev񲴴N $' HiQZQ0!gZK1(δjΥG/*SJ J+:"y2"-\]E)@#FhDX 5o8Jň>H >} }E=TB(Yܨ"wqo RbH yIPTu4!;ǥHzDoK'u2t Kݐ8lZ}< Q I6 x ",} :^Gm8;aBE萤GeʩǥKڝ.kg]BHRk#%[QҼIpLcF.]ƈ>fWdNyUk?}n5 "9p_hc #1!b;y^#-X%20T"q'L~`ԬXNIr0d,/BȠ- /}]3GwEppa'ftҐnea® Dޕ. yc:ݓ}??B2pTC@zŮ( a{/loK$O D):XG!=[$ىwsI\6Rp:[!Rɝ㴔uZH>1EpJ{p/:O% E"3݋pJ1:-98- 3dm8_u*\0O#E'"!"lr!2ThR(nl5[#RoC)ɎF23sN\DRFlHP")^A !AޢDbLa|{(LX0 )NNHD(%)H@+\WB[$-M(lG:N,mz^ `GA{>-q;p|5HhQ" _ID HA50\~9_,`"2 $`-Uc:feBG*p҉GRרBKЧM!Rx\$ָ(XWHjD. i !KN)ueLg{2p2WD9k!GSB*&X#Ef'rB%繠$:(BN3B+E!-(޷]‘{-l xLz>wıhBOLW "솾8D`sl1^C6}n51lD!o /&՚W<~&!(4ɼGREA ga{e^:nw70(oFtB;:[v6ðRq|nخ;r Rڡ>6<$GFgR=.A!2KCDR¼.X彰}H:)ZߍM_"?y슖$SyHD| ~!>Z:4"B)n 8$/"ol*;E:B KBִα^E~xR- rfw *D(\ֹ$1=FHPXnjBHI$MF!XzAh#7e]{YP\eɉu[M$u w\`O }yt<û5hE)? %eH]aJ;B!@hD!DRziQHi)Z=ُL|)MF6dѹ̑6_`^|-1s qQxQ#/*m]kpA"DQfB!$ov.!\fRڹi'l )8Qb1ӺGݰ +2s"Qz'cHHH$_:e Ҿ0 D)=-H;k+נ}%JGZVBrCźOBH;ERۥgݳh^MwŨ##F%J)3ˮh " l3}]:?JM¢( `"ޕHF|tG-u/LvLY]BGT^+N!6IQ8"rQq'Hog ga{6 H1nh D>be#NtࠡCAMజ H,g Q$[BOޯcDaPD~>l_DN6>8Ȓze ?iH !9. rs|QF$7 JBi$$O`w ^M]/;Ly *o0oXiDgp?`wk|ER}F"=8hy= ְ+ GoǬ b/m0BBZ!. #'BB"8 ;O `p'5 <FfO` ivE Do1.ޓ("k15#Y؝~ Gv ૵}?pMzĄ%r#nOKE|#&C#3fMfBˆ4 \B"`?Y`c"Z14ztSlD"wZ*!ErZcs[uM2tdBJpR%MUQ˺xĨ#G.t]/%_#c/ Hs7ҋ2s!>v^o |vWmHe9lῒ|GjOA522r|ɈBip?H$"u}vDʘ.MTd^+NϡvC*pR@ pݯ.7u GMmiEZF6V;a}/Z.OЛǥR]z}OjGGG?755-phpZ^^j*'''oёjkxσ gGGG&&&W^UfBH'D! CTtE#aq2bg!b ț:'9wu03zu0, P .nk1OH9HsG(BᑎeH]tdˈBZ널9(h-v-l?djjuNQ;wDc>mib"+W~off滖)A!t $3332==J.iCS1))⭮/,..x?̺x`NuB! I<82aðEc%"v:\Z3c"RE:pxR@<` #1/a>75@/J$<2z-OHCL*"7$JYfuׯ_w 0&\zUݻwMI?,--}/BH+0BH1>qs+҈:b:/$@"́Dco$! lHLcwqk^"!iA2[/ul!74ģ1]OHq6DoNASe қMY__jկ/^\pyy !$. &nGr| |?B R]94H\^s֟Ɓ;] 'Lk=E-$ YPSj3?0)>i?ψG###r yG.o" ~:xۼ\!YD![οgNޟ^Z5{Ĉ`BSN]b AҚ0@8W%!E siD)ݐrP~XH{9 )ɕ+W2>^=8BTǏ !$ !tø=E(v69ZG'[\\A\Cj8^~-O>w?\ZZcB BH@*8%<&$O+슖X(}%9L "bpa4^BϾ'QI0CO-c&l755}qFe=HZVKKKGN"BH'ihvf#Q\"ݵkDqǁL E9ίyģyHX$JEk( l-g6]6CHiw֭غHZYHB:A Nq:!(u(i~"&H;q~Q:.enk!v !_ Ci&+6A}DR?˗/!lS >X{bD!S@,scFA}HwLhXѕYT$x %vޛIuoDgUVemnw݀"h*"ิ4(:"㾌0>nݶ,}}眪'O'"N}"223g xռt0hǵiwOl.--]d}p`=-?*GM\GQ@7ZMĒģ}RQ ?I@!;h5HPMR5zTR2H@Z5@rH}G+9 sq[\S8;W\y*YݼyikkvvvRXrHrQ;a@u_pqTt&~5{1s.&ICKvL2%0@ko atl7ωf8D FlpگNLLƍ 4>hmm-wxxE64nQQE77 4/@c4Y>~ ة\[7Hu8}ټi; Z`2qrC$ZTuvlloܺue>> {7ްrj~Hobn`@/ݢ*iElڝe^#Z6F:pd-|jIkF̐ .~gee݅B^m}@"H5L>=62]ֽpiFw[A D۷Zg9ڶL*GynÅ.^*}477c tb®_=n_ d @'# eH7R6rRA@jMF@&r6DP H8lWX}Ev) /k.2 ˟C쬭į{I\.@@@Ge3n7>U#&#'V"T. \H*c )4[x4@{.>j^Y[C[?^s1^t'fffsbyy&$ET*O%A3C`H.H}pyuH29DY =S~.?.>i"zzZ<::rm.X<;;r1QTꓣ2g.]:va>ye ?gX*:{y||禧q k׮oan8J|kX?$S zB My%;^0!⑋3R*E#D1i4;. 5)&X4JBf/X5AT_xrr.b4|_BԔ''U ʁtůAX\|[*^\vytŁ@"қoy{w'Sف5`XDVΒĐV%Q{H_JUnssnu鷻u2 `PKE_H븁V$ZVRu@B@6*c(' u&2vHGyNą߿ǟ}zzzα)`nnF1WX,~{R陽ŽvR|}$ʊhfccgGsTf❣4j}@*ZFZK͖92zپyVIE"h_}TƮL:ꃴa^QM_ʹ5N€'dB7VjÇkg|>_). 7eRΕ+Wj*ʳTsT!K u7\P|3 [+HE}Dٖ$h_xꟿ)=ʡJJHM Dt9Tm MX[[{vvvArM8sn}jcc;;;+333_~,6H0䌉D{8`GX>sB+OHP]=\#Q[k0$\~UCD.~ڷw3Yj /`$ zJ\YĽ=\00Y&DE\dq1I*:F%>t]ghߣQ{h"4@C!ѱϓ  r#qi{{-r3 &'Ν;I}\r9[X8_-Pe~ m/͘"Qhd ~?4Fo:CF0C$JAM..i90j/bT*Wkq*A *c[ h`E2u8~5 ! b?`7Hg񶨚' UHD2vJh[1\0xtW_v(KG>okk[̳ܽpeeŮ]Vs^;::[,) 0p n#XGB1) Z(=k@@ A%5?E%z( H.>f)/p̞%O#3 z%Z1|vYdy3xcf{vHgyiT$ze[ G+{<Ǐ?{oo0r]~V`h? ;NNNKfF$H8gYFh%$ ĤL׍uݢɛ{FnQ#\pq~ aCMHr?k9GO96ODZJ߿+Iz*0B`Ͼ.XaSZs'Ec܏ch]ԍԒ+|hQ;W7&fG8Q0i]& B*E} 㱿ONN0:d!LOO?{^.肀ݐZ\ɺy=P=GzHu]IICƩtnu=R #4@-Hzz) yІ?~6>>' &" 龚z# 1$A. EaHg=O9gc%H}=gU^ "r9F&:^ >~ℤw&E]JsAH=6TSᮋER CfHC AȱsMY#4IXXE!"r[[[ޮ8W%RZH4Md.W+}&QD$ > d`4A@v1k|]yFQᨙx?S"R=Q^F$tsü .'4g09$n2[>:ϟh Hk. 6Ik얋C)Fk[+iӧrrrk.]ދtl_Hd8́Gn4OFFX'ȁ< HQab'xS;/"E]1),"k@]! i`utXq-|=R(s?)94^c hLԿgtR҃poo_ۆ${vf;;;5($"Ԑh~~]ǣׇ(J#bC gqHV#M[Eq?ѩ=.V Dp 81)]II}EuuݣOHCcyClC 'q(rQ Ḇeɿxcww-wï-//MB2ڪ;7ZDՁ- @fnb:%9 ^D8b~/Z: E. Ia)*ŕ'&!$ Sj~Rt7dr4ν8}gmDԆך)'J&moo=ilnnhT=B$d$h)5*\ ju/KikT<3kMLj]XL Iq@H?Za~(-Au["q%@'H@Ё,|0n,6ȉE o }u'~MrzzjRu^k]">M]BI{aj@ļOℤ3k\ޮRTD z+or:*]7A*F e}#Ό2Y9wYdYk,8aB7q[],YET*N r- H1<K/'o{℣FnVEVŤV(^VsH}?ݡHE6gL`wBI vN$\H*{1 Cߏ닺/[~nk9y&''Sب ;&&&j<{<6O#V_].nrAc͏\|G $膸2vQ)BF$qx IDŋIc7gGo4l=K:pAwȁł#/I46ӄ#8qvGHzJ=}&"= 4errrgii7~U=Eŏ# 0Y$<-[)깎 ILAE?6*oױpհgUyhG}=_q qw:EC_10lTJVXszg뵲urq^-ݖͽ6;`̽KQ;TiOx$zΣykr' {"5Z}Iv6H&y;W7Rw)ժ>CX!]yС7H& qs>h5I8I% BT*Œ?ԓrGGG2 $ Fkkk~27gW^BИ=S:&Br#敿.[}=,sţv[F̈́8Q)\.J Hg^i(:GHC"hQ&ys! Axlc17YV/0tJb=f-Yѹ:pr٩$RqZn8בHz JjJ;Z_w\=pnbSrMhQ'R!xQF_#yycv~HLs#N|? ovCpz+q#Ʉ{x9vGOHCO>;G:BV$H Hi?cRbkz$""~ƅD_{QMD ;D‘=Hf[$IF";vjJ/>/Wގ@ @7D{5*17_qO3f>Ĥ8GR# K4f{& bq#uV9߲6hMi)3[SNUoPWxj4%rwiQ.$zJZXMbvrr;ӧq5M߸q^GE#z\۫=O]5ttK<.@< ĥQ1)**Ĥf%ZXOD ^nS{^v`ŤG;#)FRj.+]n5oICG$ur\3sr;?ZBM\+0ԔJ%'DNfʯ\/굀<r5H=E}T~n`?V%MݭWwb?SlΚ ^G DH^AqbR7BR+#'vQD:"RZw$hI;Hq V;yOgr퓊s: z͞:F\|pˆP*+5yi[tU*7FM y~G{ׯ_>TH7p5BVWW˵R;;;qB{\>*0@ @RĕB IqR {~fRĸZrvQ!iΗ FBRn HK _?E7^>I @q?E3)NPj]F FQ)RTHJN"R_ݣLΣ'_2+II*K:`P_buqŚHnޗqr\H< xBe%M@ vݾ}۶ɓ'ѲvZ(]{/h 7 %¿W-ΙWBRؕGRXHH#KՋptbHBR]ԍ &ڑu#I_=0An%n'~$pɹO?6s!11#/"=Q_"R?yFN #*YZZY{a鏻댞 v"q<"DAE",Lb2Sc&8L13 b:w&C2`[XpbF(g¡#5M*ƄW(@/,Қ! u.%aDd^?PYrcDE=Q>G }tnTf[{sb^@$iJiXg±pO~&ݻw=e~S% HüI`UG!DR=Sx rR!U1)gLQbyT GAiꕰ>'$EzNJLV=F/A9:*c'̪#I,QFRT7Y,%"{r燄zXr VVMݼy|ͨ]Ix0@4J}/*];2qqN LO_q*ӑ =1zy}& Dd{U#)㳒vCn+"pQn1!4@Γ:Gr^]02J%9>l{llu%ZeccϽV(ڵk$za-_waHS?j^9J0H>Zq&5*qJW.p|ip7s,^ivRv>~xrrrΙܮGI˵u@"樕JT?'|Iq\>u:aYzepipehT.Z.rvڅŕr FٹmZ0Lɡ)*_wF*9]IfHO9$ =Cc\!kJ%]>966ZNNZI<:;;?SaEޞZ\IaGB\>onif~VyJAO$ꒀdRrhc x4A:F-sot-T8 H8{7V?dO~X}NOO-09:j^BQt&)]d{{.]}-,,V!T"s 0jH3qNԑ®FeEDCD.hPN$w)=n z&{E H?Acd]5kH</ԯkz:׹m)#)x=:(yQ#*{:m>mJhRDrOۣu쪉hhRBw蜆 ΝOs..HdΑ^yii677\./J_5 Ks%H }-,"&5{=~9k )W6Ku%CJ17xr9ʤp*Y[9E4.kaX,{\|/Q xvBI: H2r&mll\} Msss|73xqqC@ Y$*$5F"R\IFBR+ѨOSxRf|J\1Vv'{k# 3# # =IU=C7kbtWY.Hrwȕegg/ߜքL^kBnX.nϞY[2ўGfE3`Im>o65HI7ܷɠ7G[b^0&8t~.@"$ ʫ!=2$H1b7W̌bՐc~k(Jg]8h&'k/eVv% +kW.\.x1)**rmY2vOw/Fɚ1ព5C10h4"HCt,Q,?=|KWCg}>B!D@2wZ$M./$4s#<6r(5Re7ɽϸyj%&9%T@9cpBuHE(Y-X,>l7==]+5׾=+%ԩʼnEqSf D~ߒdR#'>9 hfg4tGGR' a7hL.I X,j{]q=CBZܘBy;̇}C8H>7 d$xBR7n3k,s%ꗱ{_*1?~Wmt]uVCґTtJ (~zΙ4cb{.~c$j҅&p!ǏùJ 1D"R#Qⶹ"R'TU*]w])Q4.QzP)&Ddm$H 5{ɿfCos1@'R?y5 =@1}HBSSSvtt~y B&@@ha ?vF{%#5*aɘdڮ I?oު[MCr#IHr(P({Nد!E蚨+VgҼ&*cG/$~Yz5ceeV. )L~P!I%!3Z]7R]Fg Nn\zĕ /?)"]yhA=džBܞ +t9kz#.l166fKKKYgTjnHڣ7RB ?OG~G!njnEDr?#ǑGWm@:G}&歈WE=P mhOޡ粱@z357]zGN7NIChbq$obzI[(ߏ[@RM\E҇ m2I@_)*"u2Aikk^k.n+&赱F*R9c9 N  ypzܤ_^#G) d@hEDK[|zfbR1I6 6?}([{+ D ;Yޢƒ""Ņ(YCRY E nWDjQTvHxmi^_Hl]?{45-п`8{ʹy.$Y5mhN$1TN%  3%H!/RN$ ~;bRTT{=6^vq:/ѤzQ!h0G#C0AbV3O:z*+cM _j'''''R~n3 `pt#">ڍ+I"z1o<f\H]ޓ[uL@=+8a]5~q%Ù ylhx$p| HcccONO1C6@@,:睔;ipŊAЌ"*t-Ǥ 2v%$~t@4>-Cs ݔ^|>:ـ,`iEDU ݉s$I8!*V_8D数3s!| ]vùԪ+6D`HI  _ A3IQUI;:V+1ۋ =90Yd, #˳p!b<.@+}U(l||O }ܱAY =+"U<6buT\hۏ:r=4ωÁzMD8b߇!w'lLh^/1 ;]}68΁41 o>.,,|`c E"R]!scΣzN$4as[gv^Ċ@ oKQ>>!Cyqv0L'ϡ! =!~mpir@ ߩ'y H飙)xlY~F5/(@؊ gc{.A H~`x҆NTQ/$b|?w^GHqNLL烃 4C*E(,E3kMDH6(D,mE;.vIP!i4$'3`ѵQ}]&=GV# A0Nar:@9:: l@@o"1q>PL6 U+[p"f:HhHʤc5U%#CO e)rP >/' $z  H8=YXX7d$"*-c 'dI),fYyQ =\h7JU%H0mޢ GcD $rH+gggcwnnJ8!&IT=WήQ s ^~\兩m6̚ya H Ha'gbm16Z񯡯=ö2> fGXY 4C9]՘̪ I&NaE;8 CC#rR/2RP|>' RvwwU *HG"R؅qAп!,2E)B:r ½y#&Mϐd1ic?߯s}LR HMH+*_d pN?@Ds'"1$ZX< Jɇ?Z.u&ICbc`5Q%$fL qyaIG8ǩC @z~d<CNŝL]׬(yB"ϣne$2P3k,JS?F H꓀?huYdo1)|xx*#@ \zQXDc H(RI'(B}'E1+h=cUc`4$~l (ݱhȅtȓaj GdggU `y|'$I?QT/ tut(G" "A;z|? [<{.k0p~qss04ФxT cNU (c~&ɡiG#({}HW/iR)>1$ԡz_yrrB: 0jHEgRXD*Zg 6pٺJ(.jdm‰yb7-G?  et Pi%e"9IGfذmJm |E2`8Ffe u"\Ү y4qxߘ$1cD9؀ PH:S).i83 ARvׁ>!ʼnJq"TXD5VaEe$1q8y YT4shXHҒeT.}h؎h:H?x/i\HHHL:ruQkѤqn82h?5zi$}Y`@Dl3M"@:=E_u. &z +iר]|]vHaMD$&G% Z='!kE%VsKòQ @!Ө/RjIHfBRu,ר1b4$fʎHd Gs"Arqp!ed5ĕVYSG784 `tW.Z=RDs!xhC2qm!Qt A]Rw^H0hðTZ.>h $lҪ ^9z%QYToMv#Ę9Y4K YC.]]yB>eCXU R6 LҨR8P2vq%횕 Tm2vZUȘEDGɣcR5BZUeURJF }0W E 2K#R)*&@jEDÈU2h3!q@@,"B7:r> A72ZO yc.>}HO.8Q3(N0' <d T!E1ώ2v ߑ<驝0̿t.q'@w d(.ĤF5xv4KFG9QҔ9f + )+|_JNMM]xmSum\p.ś|݃ J1, Ahyl$E{"EgP 5b}ʮ5hq4$$=@ x_.U`􏳯D@?>~5ϑ4DtN?G HPuW..#)*${4e&G% ]'2VzK@!}G# HS"a-iݸqOAx#\.]|xG.E?0$@vhDž-_WOH#>HTN$>mI^P[=z!.?K̜XTp!A?|=}~|ȼ i]^w]D2@ "Ni$$A:bRwBWw~"1 >}4AGM4@1 In<?=F)v)i۸i;bj!or.StO\| CTɅnߋ HG׵:݃B}tmn^UHf5isM+E{pe_⿸ :j'=VW|ş=!.>/&I4#?xy&#@@@0QQ @(i',EEzej煭4aɣȘS<RQ .s> \\JFMLLؘUH< iaaO zy~Ef.>]KE5:wOx< Пc<HH$kz.4Vs =KxDe>*dn<{J@<** qu0heÅUNKw_f\,455h{{*eH8Lc; I|Ɂqe좯/s"Z.߶nOA7L$ H̄\d@xEe.R*~=|6,..^xMӧ C!1~*tݞc 8H*gT(< (Jo]駹Q= l~~>{| )2LjVwa lk"$*X|8S~p`Q.,7=C)ihȎ`vXJ҇]nJa}p2˱t?'sؽHó{Kci "N BDoywܝgMΐI,=cD.$J]V 4T*q_꾼Be~ļ]bšp\?!Rvqj̍4 tZmg9 I 2[YeʿѤ! %5WɔJMcbqq.>v߳P(=}zqޮIfMy 0SQ. H6VzV;W+hr[yf32@h,ׯ?Yvq<~T2RI %>dIb^r6g1Ji7Kwvvn Ǐ۝;wb]J!~Ш|kD$͏>9:OZq!߳ u:VgDɢޠ q$֯Ir4Ҡ Ie# RI.f$͙tVWs,DWR):QnGRTGFω,#h4/" k’1gdww;^Ύ$C# m!˼v,*`r-N9qzk4I'Qo2P! Iem=!LNN'NJɏ=rL ʿvI:KDkH@@Ns5+gW.=GF#VO!.cg`h00?277q߫T*Caa=yH`PD ts\F#W5xS/Hwݬ H㤡gH@Ǎ&OH;u oXI=k$"6ύtt@A@Vi& Efr1z"R/x0e\3T }qAKF;0uommz"A)" Hb 3@Jŕ|/*ʼnJykO)wp`蔏9h9)zo31 sdnnjjn$,HCO9  Z|=Z.W @q=j$Vy%)@giT%A0bӧO?q߫V+ћ3\p~hidq0 "<+eg1cֺ &T,7gk#h˿nQrpȩ*iT^p޽{Vp?/2,k<*czBR*X A1R3$sTR3R1P2vVWW377W螞֜HJHtqEt@VnQԊԬ5^<1}LZI8o4G%* ;T4 BZq1C*`ДJY=|D>okƢ~{\-*xy%.@&vzzZ~2t+K1 Q9Y34! @ׯ *UD$Q`<|paa333q۳Ǐe_2 Y‘Jڽl^S2@?o&E{LjT֮4|Bi;ݡr }ȱz<7y˗?ezzz7;;;FF. ]n(fU :FNfn^=mgD`/p{Di.8  ._ooo#"*=.>J*RuOq]5J 9rFT4j,YI$mB1wH@BH_T&EUI{_]]-m}idb⿓Tr"ż̹ IP]uR{fލnUGF+{K Qv,`tɘOkz%"iyo)Rj/0/ `$`ЬoQW+~!D)S @Hf^Ġ @ޢGLt${L隆0;X4lX!JK.}իWP(\JYR!YÁiGzx%%0;4@; uu޿z7JhA)r D\*c7F* mJǏڵkxjjRtxxho񆝞2DN9;.%C{kDI;ZہqFe|n&,CUcbЄ+{$8$ˉm;&\5ODbBRލ7>}qqxXDN.>F*I7+iGJЁj/ĕk~LhzݼG,8ry7@o-A҄pt %D$&!?;?-i2v߷m.>[ ;O"m>0T;0@4+/@fF}мfqozz! $D#5Ҍ/"H,HTS*v?~[nwnnBoµZ@*x=txƼ< v"dVbieS>hH-r_c@ DO~yODHr!ݻwh]8 o;FQG%nxÉC4#׃uP!wJA,sbLnCa|-0/߾}ϹsnCLE?.=Ե㲋\LH 4@/i}vhZ7Ozģ2i6Ri 腄RtkW͛?;99{r /ғ'OHT럺.̑*gWҾ\D?%c']+"6C^f)rɑ2*wH59HRך"ZW6Ѝz&I@*dM4>S*& 3J%V,BEZ*UICL}V,Ǔ-йcOH|ɿy= ڹ ?q?W~ݔj2f@*_W =?NhŮQ3-,Xv( T*s߯(B𩇇_\.|DIg~q.ϑ$^i"-[.*ew<Fu!H qOT4j2j$DEZ jp 004>H.p\MJ]:2OTҸt‡<رI;or>?zpܶ,+]@BHQ"}ka,R4 8_ݻweoopv >6=Ve)çd$Ga}m6ɩ.үKH0-Æs5VzS兑}ӣ@ed_tF C@ )xBYzѣGHZ%ĪIj>.?|cm<{n_S[, \VV22eyw.x`n N_GCDS0l入[ ̂LV ⑀($6lYTFew0^}gtYa1)^&2GE4̊ pȹ deNn $jYT3[?QD{VHw -f`.%(~\Ld/6}D E2m e  ON,$BRfb;յhNZ8ld*ko93jd)Ô? :rrϥxÿuN9U`]3nK@D v/s5gQo47S  @{pؤ ` ӐrtuYJhh8 Z q9 );f^8{>φPH@#e!yn%pX\,xÆǛѕĢxQ^òrȵ} 3@Q[7B7ZHCBp56&LqQn%KHCCLX7rcJ Fa6ukeުV?EVsn4cKRMvwE^?r`tYiZBjo$$j r>g?1]G{(0q\ElqŪzHh^ڿGKoVeihԮ%r1 V-+Jj]nv2;) vDZ=$  Gc'Ρ (>3?%YYIDcԚ]+a懒c8k gxmζ.gc?RMZQ 1n 5 2, ;XwWGt ,>y6u#Iڰ'}e=08 &I R$%ބN.hPxH fU ɶ6L6oHh'(}hg! Qǣ*t 8|]$oUCY f]%}=,ax>?]qZ)0"뺷y1b":wAF-$V۬ ^s=F򓔒L,..&!(,>eGKg&s}ru7@Su( Lx;n F ? zHjxK[Ưu^- k"Yphbqgܺnx0B`M]TSG[$2p+A/9.tҝܹ{vݵ7F3f ցd@@V Hc"`)ytv aw 귣vذc4P-mמ9[݆߰T3N Jfe) 8[?*eυ6vӢBoCC@XF4KA7Pk[t޹yp 2DYܼ?Ve_$ >fNH)(3KIfeA)Eqh8kؚ:>kc|.VrvLm# #`)]%V uo,5j@c7~#9w7z3|Ec\fe^=DVْSd ,$c)}4GPX7$eEYH f])]\c# tsl$Y~;TQ=sn HB(tZANLb pzbg8^5-,$is놅CvX~w5,:wwy|T I.53E<cُnQdMDl ɦ;m]6Rά,(gzkyȏ`flR5cM[D#8-FE\C9oV\ιxt}O\gH<dHpqUu-w ţXPJFHUPʉI%!  t }]F` ]ZmP C@樽1Bh-~7j_Y Ƴ n5rf 慢&HqVұ̚ J]깐X0=uuMRH LsX00=儢8g&sscKg Q a::цtEP7]Fk;mHx߸k@l XwH>Φ5 ^JB"4+eBxtOI<hl2muˏBR7v:n~!"I#uc "-g mfZ]&o}+[%,r%˻D$zfE!\=8|##Y.CcG<;%ϸnUMee@gn|Q&2\q x|my{'&MbiBQ-rv ch`v`<FDsǧ #Q-۷ YZԡoCw $NFFviԓQvد%'>ʂ;ĂM"ѭ瞺8kQ H91)I%^ -4I1oJHq# GQ(JD$K{nhq`Hoႀ=C'2-5-@nM/1i?"[2Fd=@a53MeڳT'"6ƎEB?>k*t nX%Gw56(h(Kst D(,XeM+kn-s҆Djji~`yQ* E#w9Q L,ŷt/kem,K[I0|G7Gn us(!IZH\h!X޵ʲ dÍuʄf'Ʀ,mI4(+=%A)qݦI=^$$m\Ql[v.+thG 4 Ѕw:yqn%B˸Ubڰ@Bzn*MU# Dс(6lbA)az7fp9 NNSu9(eaw&vl}f!a_gh#cʉCMd(+3[/AXHu Gd!~>JG$)o죜}],!$4hNw]C@X=48λՈP K<|o0@iʊ>~3_ϖ;iKQ]Q+\R⑿B!(%09&控D:(ʞRIAsoXI*_ܘ~$|R0,1ZrkVe*)8[]Ȣ[;7܉;@4TQxţa0!m]ʾ#1?ƷGaōRvA9"йkX=ݸ KtGиZHvX9[vk"⾻DaҴD3],mX8ڶ0ƒԋ~4xD)hDll]פu0/ i1`e-閑Ew`5r٭)%yr,%k:g ֳ,M]#myt~R/nImhd O*(ea<[V}4fBu6 gs  ru;\t+,?Z33lT! 3B'%)x{6)e^rF)Xb1;mюsF( WE翌tou BV£6T ~4!,$Ɓ;` >G}V}F3xx>TIu 0'|apŒY^TJ H9Q)xfAj2ޣ|8s*B}3KQl'u2ocLj~* ɿ_I8"; Vq]z.(U7'HR9lܽ^:h2l3]8I{kn7QL?١UN [Uȣ:_^ZNNejN|<%$bf!#oyţϿ. m"7fn$I(VD̺0`Y ܩy՝Dq[n֨XE*1 RH'-fn9Dnz[l$]J4 G8Uj}|j#xP /6afR/*L9(}j}7iu}]}ՉG[G|@7,/yYy$GUBVv_r*x..pŭUI"6Zb[R'.-t|6P%T' mFN  WhiK߸:RRGa-$"ģ\R,h.w((}%:٢ݼHD 4$XmZ75 7>wH/ ŋrt\ 8XJ^, H씲8(}ԏK0R.(qhGKg!!$,hwc} $uC6(6k"BzakvZeWB"]pU!~] 2xrIm( FJPw:5^)@#; V\ݡ8(M5$y HuQi;t80#:-;b"&]cW[o*(!KZg.T #gu>8#m䅣PD BdXX t8% 2-Y#dG]JvfdhJa,`s:΢$ce,cԯ%Ī%jk 8d6iO˼sz(HqpmF5B,#ÚRM,G^ R֑Q.e_l>i&>^@|XO4'P-\;  9f5v&#oaf!Bz7vRXb,}=q&ಮӮTQGd4E@ uÚ18[%ɶQ.XZu8tXO4+ehؽ:U%Ӫ UPB>?cq^">zS0tndgOle[,~l#w#`hb]glF)CMo$GGV>¾v_k=OwtBsd!:kw] -P*1Vebi5b[XD K|0ec|`k] -r}I4v2[7[a'>ţTcKי碱zk\cαn,nn8ZQe6ܸ,ާҰNrqa`ɮخ.=r_&\{hKuuQߍ4udYsѨHPe7,-b=t)`̂\OʼnIż(IcHrcwh ZHj]7zЍ{6y G@"=oݱ3a~םtD7Z_Mͮ{Xg}l55`~t|x:RYH8MwJOZYH"@u]}H鳏b\Qi%2 C>cp4=7n^+`UHHYڷټgTG醥$%x͎2k&k$mZR/@ufXnku]Q:`ޓaa\<^_kC7Ql>ch=[ܠ[60~mYY[B|pgcA(F껉 n}`k&[8+V^9s. )Oc:/)hQ}Nn !ŎaóHm4kXt_ 閛XctŪW% P]zUqg!`,ױ;ѵkwXmˋHAρppssu]<XE#7z;TQ}]*Ɍ#ކgXG:ќͨ]p 6ޱF!ufƮ[  Z%"[M(BC349OQ6vqR/hg3CLc8s 79Ժ.nxwc E &Qξ.WgkG0a3HAe1T6v\y[UoD, JUġ-iR(⑂Z޳WYD; 3 H^DHA٤]rH 8t1Dt53;?e}TRGa}u ǜG#ј/ABBuӜwK#D7V\tH+/"m-Me!U6Ţ񭠅䅪8 `qbrV908>Ba Fa֑7qMX<:t8(e_dhbCFD٢}4ko ?&V(!mAV.R,ApN\Ml[:ワ0 FaR|Q4r$X&2=YU)˸RQʂnMvB(} QGY:q9 u}uF;e75淺&>wk܇VHgP.ϯ6o [ >A}P .dtU|Cw?ece!j! ò uv̼gr.=Je Cq,gEl*(}Է \ G0#^@ڦ+fh3\Cd]WccAecխqUI;P֨_*v/B>v̍IENDB`images-actives-html5.git/src/share/themes/buttonBlue/img/unlock-icon.png000066400000000000000000000027371250410645000266020ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs  tIME PYlIDATX͙MlTUδ}W@hmB"q1@pB|$b\;\3*4q&4AP"ĝPBCD0kZδvyseSս7ss=3 Sjl6y /+D!:C} @:L<M$e>b 8Wk)97e5;ùSZs<|`y5ɝ~uN/djä ̓U`94ɡ]/tmc$%%^3$iL;7qBy ە^Hp.?*hk!7j^*DS4tv2OK)>,/;*+෿Fi#>z$]+/\f4%i(&LrwjCg1gゥұJ9= @B[_A&`&[FNI UKt YS9>7Xz\"$RD 6fS&~4rq^XYi* 28O"u>WPZ{80n~%.U_ |ɦc( ڊ/?#M%ٶMEi)xfs_'eְD^D(Qt32mYsF6̩2Z[S\ *bvQԄx1Sr)x_8۾ ,IDiZ78 \E uYSmP|ܴ ejj5Dz:: ̦M=7J$$i6׀Kt# VM`..Pd ?``A>}x; c8pL7٤Sx?Xd>(Pȋpf Jhqat\F)R1CбÝFrR.c@x4+jo ( Ms$B;% )_VLqJD MVCrF#҇JFWP@XFSYĻZ1HvT9}h ~BI t;{B/2+]?:CVg:4o^g]1eH d}!52~=NVz}!P3oXE/*U^g <3ѼEh%h%6**_zH$"F,ОO`o4.cW sd(3"r*)GP8}Eӏphb;~0c@~ ƎoNy܃O:mk{qT⩪S*C{.uW/;icgUV:)As7nxsF/@hbPiWSG7<,(M/rOCHÄٙطiιY (?L2[RC9JQ2f|.g~&ZaǜEv4#׫ bR?Ld }tUt;72{{mA 0RhCi%u׬[]v!5bʹ{[ݔ[D5+ 3Anlu/s$(yU~4E,fɍ뉴48j=%Sx~8 ۰N X9( ͣC泤Gj8kLN;Bw#uն}`eakffՖ̎7ۋt fmW`5a}$Ny4Z_H;8HA)LC؁uPF˯wzg5PJQ2Df|VsTի:]o&ڀ(q '_-Np007&TbX |'^\yA{,B!=~uӻuަ{Ë4^$zSr<520^vc/ ]Oe[J_)e,.-{FQ o,C5>ƶd`Xi@S((R4#]iPH/t00lF[wҶ)y*}xU ]_A%p!ʔTg~N#-`˃Ξ'2nj|㔆l#Tʪ$/UVwz!ס(=rsSTBjh":^{]ް53uS:oM`'z@ JmģL:3ԯiF [ﺄHQ7r2vXXcv#Ic>r<ӨW:+KkŖ.ŌGRJ|po)oU-)}yKKۭ)`>K&f)O4^|+S @m7ߏ.JD"R/O 8颱uW}_Es&M}x8=9jIdzoұV_|N% d)YrtSK ˾ j Ȉ=وg~ʎZh=U LYrcM4? uU6^'ιj/pi8DP ~0k#HЧ KC婟ϯ5 <}Heq#Ys)RIE?D+(aP0u.Yo2[{dG/07+wCv(E˙[ ǎ`Ɛpk@Jkn^Vᩘj26B\ ̡LS0ReHF9M*]b]t,If">nd`{ )>xʎ9 ǝpyB, J|augUT=#1Jezhޡ$*S YɇQ?ҹ'[c JP8{c9`॔9ֿ- .$Lhv7D{1k#ft+^ZA^@ټ襕6iN 0< [# F*.@/{"ī}RZ.v0PD8PP}9HNl:[Wsn'> k">Y,b8>nf<N>`}۽{:$=;-fJ, \\C %@:+51ÈӪF }8c _k\F_*)0cD#p+t8I+2 #Ư%' D22(ׇJ>" KYd$cO:cfQ kD9[쯏: )y:aQV* E@ֱWI <m Q@ ,G`Bwc Zk6ny" lŹ4AGcflL=8/LŋcU`M9j {&m:3/Q>urIENDB`images-actives-html5.git/src/share/themes/buttonBlue/img/xia128.png000066400000000000000000000130631250410645000253670ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs  tIME  $1XIDATxytՕo7yǖm"`08 LBd0p8ä-8!4K& $ Ɓ !Ѕ mUꪚ?ȲdIUBI)}nC@‘(ty<0 L2Hh0՚~1f4UgB.9b`)P!5+g4U1DqTـ \9]ܧʺa$O*˧j*5Ӏ`%p*[/.l 5U1@)6:p$z$ex@GX;Oٹ-H4ǜ mt'Wp$S{N.}qHa‘hVr۪_Jђl GiD |  < 9њ(AJ媷.J?p9KM? !cHTByKS9H B@50ٛJB`~!.MU&yVةB;QٓB94D_q+!$9 *`[@F\SOa;6_mc#An?B䎝@AHJ4Uil_h툲!̻L? AA;/fGo;a)?_-֍'Jɀox+VĮo԰$S*8܋dBD)Ñ:`'`MSd0x!$G_ 4Llǻ#atXDqJ`!pg~!^Hb'4H G!%P<qWA.{]DtsRHA,tˮ TKݿDW F.Lz`33q0>k‘9vf4 |Gd_x@@UJ%?Q!>w)nw5~!lL ūÑM@>2zg(3R?`20ɟh<٬Ҋ!aÑYs~Կ ^,=f*CHtj~{wlޔS`B8ߗ8^'7VS3Pɟ:!IIFH2$x/- Pӱ ;)ĆOu*f"!W?PHBdHtiaV$B_a_v?~dCG޹a`]!):O'obaU{SʔjNj=74u(;k1g-!wbVa Ț}z]e 䔑d<˖A Ӹᯘmej N` (9`;Q!z:3#d4o7NA{KLoh|U֐5r"e\NI"f2k~מn:7/d S4Ui>!h޺m-u2/T-opdkxz4ɟv>`M˘ʧ2})~jLFw8N7s[hs*O+%gl%in#m2v?yTߧL?)ׯDo4U'q?R;W8iE yEdh=B-dCׄILtW!u (=Oޞ"Ulh,b1^hoI狃@BNE[|D 0:Y ٿyNUwp!a3!s7D>g0NJYK0 cH`:O) 4b rQ 5iKφ#QKX fދhx71 qBr$TVA**fLӠCi޶ï=E~O Vr'bvS/!a_Q2%\Ϧ;> S 17PT5`A)F">pS&$`-ЫOP\#ǬKП6_o> 1|-#f_ocL#J)|+| !;o0zJ霋i!@OBYD8Rt<&^}?|!lM`ZRQ^gNewz|KCyklǖ KKν 9a"+h^W,9i$ӸjYN3P.ABe㆔ ';&3LY>\EZk>gU6_tb_C!CotEIr %xmM[n%ZB}q/z[8v?I: c~ 5]\“灞+ӸᕮDH2$Տ#Ax%Իƒ쑓͎vYfn wIN:s.=K@ f%`7CC7Td!ɟvQ FG;"p4ر=Kߺ(Kx*bgvh]#w-'t@l{~'$ aqIֽzk:94IS^sv4;۶(_ f;~)7Cج򉘺Em-eRx|0ts1 dSQWuMU:: R `rvg[V;ydZO+h&dę6y p2n 9zܱvoI Y󜞔%}opۙw ;T!2)Ŵo=5\Le K6#Qnr$#*(RSR5c*uV'>ޑ3DV#PXwMHEQ@*g`IՏM^- >FlNK%C;IW`k2Oei8RK >L1r5 aQ_7=ӣ2:ȝX=t6X$4U&g -w&g^ C C||`/^ p9Yf}_ACEBƒt qiۨ珎H%1bŞ)Lu}n:X-L ZAѶirqvQt>W9o {V-O/eGvBi5иlllz#Y}z~G3=iN"ف-?y[rsv۷YhIOh*x+#\TG.4|)cl{!v3J!|TMe=o |)Z*[^vB8BHlJ8#ֿvu\Te3Иi-0vɭI3:|"!ŅDl":uo?&Q4UWJs^@qxAeZ vVd)zkSJ 9~N=HhC\'8Oh?ਃ?M?XZ>SAҬY 5v?q+z1iS#1kZ7>?/ޞz s]&np¿\I=vƀ`($x-5'.dcc&\6X;C{`A\H>$jݏlzrPe* #h5Ҽ-j׮J41g1Knu/T帝`Dn4o%MGDsO`)Pwi‘J 5eeCr4t.s.sO>~MU2^S1 _Y>&eg_BzaO=1nR|*. nYϚUԬ/߃_z%T|nV~ظzExxLJϾIK t6^^|Tځ~' cC|r ];!gLʠ *4Ht!g&-?ʿ{r7|Sk{_U𿨩>hk{1Lf3ɅU?+Py3HlWSՃQj4U!N, D͚Խ:9*. 9^TNLB$LjrC{}k/gSX9BS"v7֍/"@70|v j׮ -L\۴u9iR~ν1'SZ |&AB;b]qj\+HVvlgdZTz숉܄ 亅ΤAd^>ɹ8zU+=|SH߉38e;љ4*AG A J0ִ WL⬮B iԃ,Y#T4Ak0V )}8IekqﰭtV$YxثGi$0K[m0#HZ)f_t%o#7+Ŏ:ĆRr@l;BxJ{)E)E|l_c bI~ {rpŕ@ΎT)_XkG*[2OYFJ?E/T#2*;ܻ*%_=^;b%#fs. B;iNC b%IENDB`images-actives-html5.git/src/share/themes/buttonBlue/img/xia32.png000066400000000000000000000026111250410645000252760ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME  %,t٧IDATXí[lTUVJ[Jkm("3E^|A}P%j"!@A@$A0DoC,Ԋ/d Z CCzkgkmAx.8v xpn66r4`?h0K`_q&dܩNb"o6lx+S6D6,3t&*P &iWZӶ{5CO=@Ur9d/MKۧ矦{[n8@|nuD'yN ]n)Hm͚8]+{0"\quϛ֢B;5=*[ v{dmV}`opZR2pWc'2jlP-6uK5fgQ,. z!Lf:֊X1s ts/MJ1j,fn:tA]f`48z=dsBR# U0kp(f!ZѶw} !2")度17,\<<{wLWR193K49ڛCJtJӨrk$Xca2xM# bγ(-/v[K'l%p*7EdRƬ-تj3! x۹{$ z9b hm)TralE-UՎ|ұUNV5#H(Ak ī\q*7Z# 3q&,~5z*D텈mci)σԭCelAZlINr!s-*Bz8@ٜExx?l"T8PfhDCar$H3c<3B@]g}df̼C2PhvBHSc&,BJsK}ܟ4,t*4»O&MS4k):pQ>_4B2ǒ؏bPkY=@T-YE`**}tcQIVC~9hV $ֱmƌT8aA`QF\W")q MɃoO>ӱ"e+>$#Vmz\=]u_%q:#kHz7׬)s hM'=,!a.ܓ4qO_w]B-8x)ٚy{L2C@zzAcN|p7 z`|q: & F'269q7WH|IENDB`images-actives-html5.git/src/share/themes/buttonBlue/img/xia48.png000066400000000000000000000046531250410645000253150ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs  tIME  %c2Y 8IDATh޽{pT?{ $( >u/[NmZ+/-UUhgtth`ŬvU¡juPƺEPcdMqMf z{!LCONFn}]U`/1 =Z跋1q`l@04X\,]Exl7 }/%(!ss]>v5 +{J =`=~b5`(< ,拱6`iDB`h+@x|(rK`* Cbԟ20u e"FϒwS_@E|,5wй`:qٱ(O lCBUiA Ν ֚ЄJsRС0x EU,LL&`th<΁}e $+(h>mM&d jv@ځu"mA G@ړe&/c)>gg%D<9 ݟw%q'B!S @04f-lٸ[BTnӁ`nifRNa$ؿnv|qLU"j*鳩MkAUǀLC՜ 9؍V᧼i>V,R慎|;bќ+q#H !ڵw^@ ~b}!v|8ZpY8zoo}ȵ Ji̺^E1(EE ogI_xtPELC?U@GW||vz۞GQS)- OM= K䯢ʱ"aȎ-XN`E3i^u?)H(=QO ? x΁m9v G(J.ȳ-9^K|M4`iEϡ/XFI UϠEAJbG:߽sWT>=̽ys1,=WEhďv1[@?k̸.ʦFZBN xBH<3,souZYmYH˚NUs;snڄnvb$i#m ;>Bܳ8i͓~7-ihU9W߰Ky(kB=7;ŎdW{oбG?v#=bې>x) u<B #?v#cEBn&_£<=s͵BR03y"áG'A2sࡌ6EA G_J;3e,Wlr޶7hUS@ ߕY 9&H!0Id2Ar ^䳗?{:_^H~1 'pw 1ʇgfFB\U";> -9o&(h*m境мz519y %;_r%vb$߷:MCo;MpЙn2NuAt}J51ijur~ԅbp0>V臻GRE@㞯oh]AyN= Пξrl, w޶H{@[(P<^j~V㩝6^eNLC7?π0 ]:AlpFۮfDgD;? `htI! q`io&eRNupy9k"zLCk!&g5/>.4 x@@x?4'rm҃+OO3Q^H B!Mn _9c"RUIWnN@g3Ҩ0 t3|B IENDB`images-actives-html5.git/src/share/themes/buttonBlue/img/xia64.png000066400000000000000000000054251250410645000253110ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs  tIME  %HC IDATx͛{t?wf7@L$1Y W COe@ Le]Sh BQgc@Gf݇뗱g+avf+;T{{ϼhXoca/f$i+I_Ͷ&>;E0K ˒3'W|s=U>7({/)':Og v [MYI;) s39m;Ɯ$s|ӓU'EEEƢ4}ʧ~ j^Qfڔ.g$co߬xCKm,$8#@(iXɡ(Urc&#XQrPr>|v߄A #ޱ]՚.a&d';>&ϢlTP +B ({|8Ҳ}%].F!ޮ|{b~>K)i? +tr#߆Rgm$܌URJZF G:+*KˢF{ ˴'AO8L wryE>AdFx9%q jKPȯz@0SI/7԰뉵5j~1#au,/gKCVZ46}tQr ц j&R"Dh% 8)9yǘ?jip I)L)>?o_ֹn \жk)՝3#H+&K '?>ط - . ?m+Wm{mwF3EnŻ7p}mEF;6㳹㉵E*BUib}uRI :?6dEq_clfvk>x* s܀P2bE5S>ce4o^a?OYohӢՍ@"݀`9:hH?~coWE | {9{k'ǒyBвy;鬟)Rwrd Nееn$%#qw;LhCi2rNSyJa`d7u+/e-!3G5lF  x ;6HeRT3!,rznkOZQCVb5p=}Fե;A&gfNN,j`U-_ ZŹ+yT^>3.>׮2tmr½N!=/W~V4o7m;7mkN.+k(:>u+NDgڥ9ta 0&|~/&ڴ3ҎPT|}V$2C$C.srg}. w:Cfxza!~st ]{){CP| =MI봫 d[ ](*t|; ];㐛w /x*Xn4:tk7eQf`^]Ӽ {{TITLE}}

xia

{{LOADING}}

{{datasJS}} images-actives-html5.git/src/share/themes/buttonBlue/js/000077500000000000000000000000001250410645000235025ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/buttonBlue/js/hooks.js000066400000000000000000000204271250410645000251700ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @constructor init specific hooks */ var hooks = function() { "use strict"; this.dragwindow = false; this.popvisible = 0; this.deltaX = 0; this.deltaY = 0; }; /* * @param array layers * @param iaScene mainScene */ hooks.prototype.beforeMainConstructor = function(mainScene, layers) { var buttons = "
    "; for (var i in details) { if (details[i].options.indexOf("direct-link") == -1) { buttons += '
  • ' + (parseInt(i)+1) + '
  • '; } } buttons += '
'; $("#buttons").html(buttons); }; /* * @param iaScene mainScene * @param array layers */ hooks.prototype.afterMainConstructor = function(mainScene, layers) { // some stuff to manage popin windows var viewportHeight = $(window).height(); var that = this; var button_click = function() { var target = $(this).data("target"); if ($("#response_" + target).is(":hidden")) { if ($(this).data("password")) { $("#form_" + target).toggle(); $("#form_" + target + " input[type=text]").val(""); $("#form_" + target + " input[type=text]").focus(); } else { $("#response_" + target).toggle(); } } else { if ($(this).data("password")) { $("#response_" + target).html($("#response_" + target).data("encrypted_content")); } $("#response_" + target).toggle(); } }; var unlock_input = function(e) { e.preventDefault(); var entered_password = $(this).parent().children("input[type=text]").val(); var sha1Digest= new createJs(true); sha1Digest.update(entered_password.encode()); var hash = sha1Digest.digest(); if (hash == $(this).data("password")) { var target = $(this).data("target"); var encrypted_content = $("#response_" + target).html(); $("#response_" + target).data("encrypted_content", encrypted_content); $("#response_" + target).html(XORCipher.decode(entered_password, encrypted_content).decode()); $("#response_" + target).show(); $("#form_" + target).hide(); $(".button").off("click"); $(".button").on("click", button_click); $(".unlock input[type=submit]").off("click"); $(".unlock input[type=submit]").on("click", unlock_input); } }; $(".button").on("click", button_click); $(".unlock input[type=submit]").on("click", unlock_input); $(".meta-doc").on("click", function(){ $(".detail_content").hide(); that.popvisible = "general"; $("#content").show(); $("#general").show(); var general_border = $("#general").css("border-top-width").substr(0,$("#general").css("border-top-width").length - 2); var general_offset = $("#general").offset(); var content_offset = $("#content").offset(); $("#general").css({'max-height':(viewportHeight - general_offset.top - content_offset.top - 2 * general_border)}); $('.buttons_container').show(); $('.buttons_container').css({"top":$('#general').offset().top - 10}); $('.buttons_container').css({"left": $('#general').offset().left + ($('#content').width() - $('.buttons_container').width()) / 2}); }); $(".overlay").hide(); $(".infos").on("click", function(){ $("#rights").show(); }); $("#popup_close").on("click", function(){ $("#rights").hide(); }); $("#article_close").on("click", function(){ $(".buttons_container").hide(); $(".detail_content").hide(); $("#content").hide(); $(this).parent().children("audio").each(function(){ $(this)[0].pause(); }); $(this).parent().children("video").each(function(){ $(this)[0].pause(); }); }); $("#article_move").on("mousedown", function(evt){ that.dragwindow = true; that.deltaX = Math.abs(evt.pageX - $(".buttons_container").offset().left); that.deltaY = Math.abs(evt.pageY - $(".buttons_container").offset().top); $(".buttons_container").offset().top = $("#" + that.popvisible).offset().top; $(".buttons_container").offset().left = $("#" + that.popvisible).offset().left + $("#container").offset().left; // disable text selection return false; }); $(document).on("mousemove", function(evt){ if (that.dragwindow) { $("#" + that.popvisible).css({"top":evt.pageY}); $("#" + that.popvisible).css({"left":evt.pageX - $("#container").offset().left - ($('#content').width() - $('.buttons_container').width()) / 2 - that.deltaX}); $(".buttons_container").css({"top":evt.pageY - 10}); $(".buttons_container").css({"left":evt.pageX - that.deltaX}); } }); $(document).on("mouseup", function(evt){ that.dragwindow = false; }); document.addEventListener("click", function(ev){ if (mainScene.noPropagation) { mainScene.noPropagation = false; } else { if (mainScene.zoomActive === 1) { if ((mainScene.element !== 0) && (typeof(mainScene.element) !== 'undefined')) { mainScene.element.kineticElement[0].fire("click"); } } else if ((mainScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (mainScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { document.body.style.cursor = "default"; mainScene.cursorState = "default"; mainScene.element.kineticElement[0].fire("mouseleave"); } } }); }; /* * * */ hooks.prototype.afterIaObjectConstructor = function(iaScene, idText, detail, iaObject) { $("#li-" + idText).on("click", function(){ $(".button-li").removeClass("button-selected").addClass("button-unselected"); $(this).addClass("button-selected").removeClass("button-unselected"); iaObject.kineticElement[0].fire("click"); }); }; /* * * */ hooks.prototype.afterIaObjectZoom = function(iaScene, idText, iaObject) { }; /* * * */ hooks.prototype.afterIaObjectFocus = function(iaScene, idText, iaObject) { if ($('#' + idText).data("state") != "void") { var viewportHeight = $(window).height(); var that = this; that.popvisible = idText; $("#content").show(); $(".detail_content").hide(); $('#' + idText).show(); $('.buttons_container').show(); $('.buttons_container').css({"top":$('#' + idText).offset().top - 10}); $('.buttons_container').css({"left":$('#' + idText).offset().left + ($('#content').width() - $('.buttons_container').width()) / 2}); $('#' + idText + " audio").each(function(){ if ($(this).data("state") === "autostart") { $(this)[0].play(); } }); var article_border = $('#' + idText).css("border-top-width").substr(0,$('#' + idText).css("border-top-width").length - 2); var article_offset = $('#' + idText).offset(); var content_offset = $("#content").offset(); $('#' + idText).css({'max-height':(viewportHeight - article_offset.top - content_offset.top - 2 * article_border)}); $(".button-li").removeClass("button-selected").addClass("button-unselected"); $("#li-" + idText).addClass("button-selected").removeClass("button-unselected"); } }; images-actives-html5.git/src/share/themes/buttonBlue/js/iaobject.js000066400000000000000000000716131250410645000256300ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @param {object} params * @constructor create image active object */ function IaObject(params) { "use strict"; var that = this; this.path = []; this.title = []; this.kineticElement = []; this.backgroundImage = []; this.backgroundImageOwnScaleX = []; this.backgroundImageOwnScaleY = []; this.persistent = []; this.originalX = []; this.originalY = []; this.options = []; this.stroke = []; this.strokeWidth = []; this.tween = []; this.agrandissement = 0; this.zoomActive = 0; this.minX = 10000; this.minY = 10000; this.maxX = -10000; this.maxY = -10000; this.tween_group = 0; this.group = 0; this.layer = params.layer; this.background_layer = params.background_layer; this.backgroundCache_layer = params.backgroundCache_layer; this.imageObj = params.imageObj; this.idText = params.idText; this.myhooks = params.myhooks; this.zoomLayer = params.zoomLayer; // Create kineticElements and include them in a group that.group = new Kinetic.Group(); that.layer.add(that.group); if (typeof(params.detail.path) !== 'undefined') { that.includePath(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.image) !== 'undefined') { that.includeImage(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.group) !== 'undefined') { for (var i in params.detail.group) { if (typeof(params.detail.group[i].path) !== 'undefined') { that.includePath(params.detail.group[i], i, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.group[i].image) !== 'undefined') { that.includeImage(params.detail.group[i], i, that, params.iaScene, params.baseImage, params.idText); } } that.definePathBoxSize(params.detail, that); } else { console.log(params.detail); } this.defineTweens(this, params.iaScene); this.myhooks.afterIaObjectConstructor(params.iaScene, params.idText, params.detail, this); } /* * * @param {type} detail * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includeImage = function(detail, i, that, iaScene, baseImage, idText) { that.defineImageBoxSize(detail, that); var rasterObj = new Image(); rasterObj.src = detail.image; that.title[i] = detail.title; that.backgroundImage[i] = rasterObj; that.kineticElement[i] = new Kinetic.Image({ name: detail.title, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, width: detail.width, height: detail.height, scale: {x:iaScene.coeff,y:iaScene.coeff} }); rasterObj.onload = function() { that.backgroundImageOwnScaleX[i] = iaScene.scale * detail.width / this.width; that.backgroundImageOwnScaleY[i] = iaScene.scale * detail.height / this.height; var zoomable = true; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#000000")) { zoomable = false; } if ((typeof(detail.options) !== 'undefined')) { that.options[i] = detail.options; } if ((typeof(detail.stroke) !== 'undefined') && (detail.stroke != 'none')) { that.stroke[i] = detail.stroke; } else { that.stroke[i] = 'rgba(0, 0, 0, 0)'; } if ((typeof(detail.strokewidth) !== 'undefined')) { that.strokeWidth[i] = detail.strokewidth; } else { that.strokeWidth[i] = '0'; } that.persistent[i] = "off-image"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#ffffff")) { that.persistent[i] = "onImage"; that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); zoomable = false; } that.group.add(that.kineticElement[i]); that.addEventsManagement(i,zoomable, that, iaScene, baseImage, idText); // define hit area excluding transparent pixels // ============================================================= var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min(parseFloat(detail.maxX) - parseFloat(detail.minX), Math.floor(parseFloat(iaScene.originalWidth) * 1))); var cropHeight = (Math.min(parseFloat(detail.maxY) - parseFloat(detail.minY), Math.floor(parseFloat(iaScene.originalHeight) * 1))); if (cropX + cropWidth > iaScene.originalWidth * 1) { cropWidth = iaScene.originalWidth * 1 - cropX * 1; } if (cropY * 1 + cropHeight > iaScene.originalHeight * 1) { cropHeight = iaScene.originalHeight * 1 - cropY * 1; } var hitCanvas = that.layer.getHitCanvas(); iaScene.completeImage = hitCanvas.getContext().getImageData(0,0,Math.floor(hitCanvas.width),Math.floor(hitCanvas.height)); var canvas_source = document.createElement('canvas'); canvas_source.setAttribute('width', cropWidth * iaScene.coeff); canvas_source.setAttribute('height', cropHeight * iaScene.coeff); var context_source = canvas_source.getContext('2d'); context_source.drawImage(rasterObj,0,0, cropWidth * iaScene.coeff, cropHeight * iaScene.coeff); imageDataSource = context_source.getImageData(0, 0, cropWidth * iaScene.coeff, cropHeight * iaScene.coeff); len = imageDataSource.data.length; that.group.zoomActive = 0; (function(len, imageDataSource){ that.kineticElement[i].hitFunc(function(context) { if (iaScene.zoomActive == 0) { /*rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); //detach from the DOM var imageData = imageDataSource.data; // just replace scene colors by hit colors - alpha remains unchanged for(j = 0; j < len; j += 4) { imageData[j + 0] = rgbColorKey.r; imageData[j + 1] = rgbColorKey.g; imageData[j + 2] = rgbColorKey.b; // imageData[j + 3] = imageDataSource.data[j + 3]; } // reatach to the DOM imageDataSource.data = imageData; context.putImageData(imageDataSource, cropX * iaScene.coeff, cropY * iaScene.coeff); */ var imageData = imageDataSource.data; var imageDest = iaScene.completeImage.data; var position1 = 0; var position2 = 0; var maxWidth = Math.floor(cropWidth * iaScene.coeff); var maxHeight = Math.floor(cropHeight * iaScene.coeff); var startY = Math.floor(cropY * iaScene.coeff); var startX = Math.floor(cropX * iaScene.coeff); var hitCanvasWidth = Math.floor(that.layer.getHitCanvas().width); var rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); for(var varx = 0; varx < maxWidth; varx +=1) { for(var vary = 0; vary < maxHeight; vary +=1) { position1 = 4 * (vary * maxWidth + varx); position2 = 4 * ((vary + startY) * hitCanvasWidth + varx + startX); if (imageData[position1 + 3] > 100) { imageDest[position2 + 0] = rgbColorKey.r; imageDest[position2 + 1] = rgbColorKey.g; imageDest[position2 + 2] = rgbColorKey.b; imageDest[position2 + 3] = 255; } } } context.putImageData(iaScene.completeImage, 0, 0); } else { context.beginPath(); context.rect(0,0,this.width(),this.height()); context.closePath(); context.fillStrokeShape(this); } }); })(len, imageDataSource); /*that.kineticElement[i].sceneFunc(function(context) { var yo = that.layer.getHitCanvas().getContext().getImageData(0,0,iaScene.width, iaScene.height); context.putImageData(yo, 0,0); });*/ // ============================================================= that.group.draw(); }; }; /* * * @param {type} path * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includePath = function(detail, i, that, iaScene, baseImage, idText) { that.path[i] = detail.path; that.title[i] = detail.title; // if detail is out of background, hack maxX and maxY if (parseFloat(detail.maxX) < 0) detail.maxX = 1; if (parseFloat(detail.maxY) < 0) detail.maxY = 1; that.kineticElement[i] = new Kinetic.Path({ name: detail.title, data: detail.path, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, scale: {x:iaScene.coeff,y:iaScene.coeff}, fill: 'rgba(0, 0, 0, 0)' }); that.definePathBoxSize(detail, that); // crop background image to suit shape box that.cropCanvas = document.createElement('canvas'); that.cropCanvas.setAttribute('width', parseFloat(detail.maxX) - parseFloat(detail.minX)); that.cropCanvas.setAttribute('height', parseFloat(detail.maxY) - parseFloat(detail.minY)); var cropCtx = that.cropCanvas.getContext('2d'); var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min((parseFloat(detail.maxX) - cropX) * iaScene.scale, Math.floor(parseFloat(iaScene.originalWidth) * iaScene.scale))); var cropHeight = (Math.min((parseFloat(detail.maxY) - cropY) * iaScene.scale, Math.floor(parseFloat(iaScene.originalHeight) * iaScene.scale))); if (cropX * iaScene.scale + cropWidth > iaScene.originalWidth * iaScene.scale) { cropWidth = iaScene.originalWidth * iaScene.scale - cropX * iaScene.scale; } if (cropY * iaScene.scale + cropHeight > iaScene.originalHeight * iaScene.scale) { cropHeight = iaScene.originalHeight * iaScene.scale - cropY * iaScene.scale; } var posX = 0; var posY = 0; if (parseFloat(detail.minX) < 0) posX = parseFloat(detail.minX) * (-1); if (parseFloat(detail.minY) < 0) posY = parseFloat(detail.minY) * (-1); // bad workaround to avoid null dimensions if (cropWidth <= 0) cropWidth = 1; if (cropHeight <= 0) cropHeight = 1; cropCtx.drawImage( that.imageObj, cropX * iaScene.scale, cropY * iaScene.scale, cropWidth, cropHeight, posX, posY, cropWidth, cropHeight ); var dataUrl = that.cropCanvas.toDataURL(); delete that.cropCanvas; var cropedImage = new Image(); cropedImage.src = dataUrl; cropedImage.onload = function() { that.backgroundImage[i] = cropedImage; that.backgroundImageOwnScaleX[i] = 1; that.backgroundImageOwnScaleY[i] = 1; that.kineticElement[i].fillPatternRepeat('no-repeat'); that.kineticElement[i].fillPatternX(detail.minX); that.kineticElement[i].fillPatternY(detail.minY); }; var zoomable = true; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#000000")) { zoomable = false; } if ((typeof(detail.options) !== 'undefined')) { that.options[i] = detail.options; } if ((typeof(detail.stroke) !== 'undefined') && (detail.stroke != 'none')) { that.stroke[i] = detail.stroke; } else { that.stroke[i] = 'rgba(0, 0, 0, 0)'; } if ((typeof(detail.strokewidth) !== 'undefined')) { that.strokeWidth[i] = detail.strokewidth; } else { that.strokeWidth[i] = '0'; } that.persistent[i] = "off"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#ffffff")) { that.persistent[i] = "onPath"; that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); } that.addEventsManagement(i, zoomable, that, iaScene, baseImage, idText); that.group.add(that.kineticElement[i]); that.group.draw(); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.defineImageBoxSize = function(detail, that) { "use strict"; if (that.minX === -1) that.minX = (parseFloat(detail.x)); if (that.maxY === 10000) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); if (that.maxX === -1) that.maxX = (parseFloat(detail.x) + parseFloat(detail.width)); if (that.minY === 10000) that.minY = (parseFloat(detail.y)); if (parseFloat(detail.x) < that.minX) that.minX = parseFloat(detail.x); if (parseFloat(detail.x) + parseFloat(detail.width) > that.maxX) that.maxX = parseFloat(detail.x) + parseFloat(detail.width); if (parseFloat(detail.y) < that.minY) that.miny = parseFloat(detail.y); if (parseFloat(detail.y) + parseFloat(detail.height) > that.maxY) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.definePathBoxSize = function(detail, that) { "use strict"; if ( (typeof(detail.minX) !== 'undefined') && (typeof(detail.minY) !== 'undefined') && (typeof(detail.maxX) !== 'undefined') && (typeof(detail.maxY) !== 'undefined')) { that.minX = detail.minX; that.minY = detail.minY; that.maxX = detail.maxX; that.maxY = detail.maxY; } else { console.log('definePathBoxSize failure'); } }; /* * Define zoom rate and define tween effect for each group * @returns {undefined} */ IaObject.prototype.defineTweens = function(that, iaScene) { that.minX = that.minX * iaScene.coeff; that.minY = that.minY * iaScene.coeff; that.maxX = that.maxX * iaScene.coeff; that.maxY = that.maxY * iaScene.coeff; var largeur = that.maxX - that.minX; var hauteur = that.maxY - that.minY; that.agrandissement1 = (iaScene.height - iaScene.y) / hauteur; // beta that.agrandissement2 = iaScene.width / largeur; // alpha if (hauteur * that.agrandissement2 > iaScene.height) { that.agrandissement = that.agrandissement1; that.tweenX = (0 - (that.minX)) * that.agrandissement + (iaScene.width - largeur * that.agrandissement) / 2; that.tweenY = (0 - iaScene.y - (that.minY)) * that.agrandissement + iaScene.y; } else { that.agrandissement = that.agrandissement2; that.tweenX = (0 - (that.minX)) * that.agrandissement; that.tweenY = 1 * ((0 - iaScene.y - (that.minY)) * that.agrandissement + iaScene.y + (iaScene.height - hauteur * that.agrandissement) / 2); } }; /* * Define mouse events on the current KineticElement * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.addEventsManagement = function(i, zoomable, that, iaScene, baseImage, idText) { if (that.options[i].indexOf("disable-click") !== -1) return; /* * if mouse is over element, fill the element with semi-transparency */ that.kineticElement[i].on('mouseover', function() { if (iaScene.cursorState.indexOf("ZoomOut.cur") !== -1) { } else if ((iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { } else if (iaScene.cursorState.indexOf("HandPointer.cur") === -1) { document.body.style.cursor = "url(img/HandPointer.cur),auto"; iaScene.cursorState = "url(img/HandPointer.cur),auto"; for (var i in that.kineticElement) { if (that.persistent[i] == "off") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill(iaScene.overColor); that.kineticElement[i].scale(iaScene.coeff); //that.kineticElement[i].stroke(iaScene.overColorStroke); //that.kineticElement[i].strokeWidth(2); that.kineticElement[i].stroke(that.stroke[i]); that.kineticElement[i].strokeWidth(that.strokeWidth[i]); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); } else if ((that.persistent[i] == "onImage") || (that.persistent[i] == "off-image")) { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); } } that.layer.batchDraw(); //this.draw(); } }); /* * if we click in this element, manage zoom-in, zoom-out */ if (that.options[i].indexOf("direct-link") !== -1) { that.kineticElement[i].on('click touchstart', function(e) { location.href = that.title[i]; }); } else { that.kineticElement[i].on('click touchstart', function() { // let's zoom var i = 0; iaScene.noPropagation = true; if ((iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) && (iaScene.element === that)) { iaScene.zoomActive = 1; document.body.style.cursor = "url(img/ZoomOut.cur),auto"; iaScene.cursorState = "url(img/ZoomOut.cur),auto"; this.moveToTop(); that.group.moveToTop(); that.layer.moveToTop(); that.group.zoomActive = 1; that.originalX[0] = that.group.x(); that.originalY[0] = that.group.y(); that.alpha = 0; that.step = 0.1; var personalTween = function(anim, thislayer) { // linear var tempX = that.originalX[0] + that.alpha.toFixed(2) * (that.tweenX - that.originalX[0]); var tempY = that.originalY[0] + that.alpha.toFixed(2) * (that.tweenY - that.originalY[0]); var tempScale = 1 + that.alpha.toFixed(2) * (that.agrandissement - 1); var t = null; if (that.alpha.toFixed(2) <= 1) { that.alpha = that.alpha + that.step; that.group.setPosition({x:tempX, y:tempY}); that.group.scale({x:tempScale,y:tempScale}); } else { that.zoomLayer.hitGraphEnabled(true); anim.stop(); } }; that.zoomLayer.moveToTop(); that.group.moveTo(that.zoomLayer); that.layer.draw(); var anim = new Kinetic.Animation(function(frame) { personalTween(this, that.layer); }, that.zoomLayer); that.zoomLayer.hitGraphEnabled(false); anim.start(); } // let's unzoom else if (iaScene.cursorState.indexOf("ZoomOut.cur") != -1) { if ((that.group.zoomActive == 1)) { iaScene.zoomActive = 0; that.group.zoomActive = 0; that.group.scaleX(1); that.group.scaleY(1); that.group.x(that.originalX[0]); that.group.y(that.originalY[0]); $('#' + that.idText + " audio").each(function(){ $(this)[0].pause(); }); $('#' + that.idText + " video").each(function(){ $(this)[0].pause(); }); that.backgroundCache_layer.moveToBottom(); document.body.style.cursor = "default"; iaScene.cursorState = "default"; for (i in that.kineticElement) { if (that.persistent[i] == "off") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(0, 0, 0, 0)'); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } else if (that.persistent[i] == "onImage") { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } } that.group.moveTo(that.layer); that.zoomLayer.moveToBottom(); that.zoomLayer.draw(); that.layer.draw(); that.backgroundCache_layer.draw(); } } // let's focus else { if (iaScene.zoomActive === 0) { if ((iaScene.element !== 0) && (typeof(iaScene.element) !== 'undefined')) { for (i in iaScene.element.kineticElement) { iaScene.element.kineticElement[i].fillPriority('color'); iaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); iaScene.element.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); iaScene.element.kineticElement[i].setStrokeWidth(0); } iaScene.element.layer.draw(); $('#' + iaScene.element.idText + " audio").each(function(){ $(this)[0].pause(); }); $('#' + iaScene.element.idText + " video").each(function(){ $(this)[0].pause(); }); } if (zoomable === true) { document.body.style.cursor = 'url("img/ZoomIn.cur"),auto'; iaScene.cursorState = 'url("img/ZoomIn.cur"),auto'; } else { iaScene.cursorState = 'url("img/ZoomFocus.cur"),auto'; } var cacheBackground = true; for (i in that.kineticElement) { if (that.persistent[i] === "onImage") cacheBackground = false; that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); //that.kineticElement[i].stroke(iaScene.overColorStroke); //that.kineticElement[i].strokeWidth(2); that.kineticElement[i].stroke(that.stroke[i]); that.kineticElement[i].strokeWidth(that.strokeWidth[i]); that.kineticElement[i].moveToTop(); } if (cacheBackground === true) that.backgroundCache_layer.moveToTop(); //that.group.moveToTop(); that.layer.moveToTop(); that.layer.draw(); iaScene.element = that; that.myhooks.afterIaObjectFocus(iaScene, idText, that); } } }); } /* * if we leave this element, just clear the scene */ that.kineticElement[i].on('mouseleave', function() { if ((iaScene.cursorState.indexOf("ZoomOut.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { } else { var mouseXY = that.layer.getStage().getPointerPosition(); if (typeof(mouseXY) == "undefined") { mouseXY = {x:0,y:0}; } if ((that.layer.getStage().getIntersection(mouseXY) != this)) { that.backgroundCache_layer.moveToBottom(); for (var i in that.kineticElement) { if ((that.persistent[i] == "off") || (that.persistent[i] == "off-image")) { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(0, 0, 0, 0)'); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } else if (that.persistent[i] == "onImage") { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } } document.body.style.cursor = "default"; iaScene.cursorState = "default"; that.layer.draw(); } } }); }; images-actives-html5.git/src/share/themes/buttonBlue/js/iascene.js000066400000000000000000000115001250410645000254440ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@crdp.ac-versailles.fr /** * * @param {type} originalWidth * @param {type} originalHeight * @constructor create image active scene */ function IaScene(originalWidth, originalHeight) { "use strict"; var that = this; // canvas width this.width = 1000; // canvas height this.height = 800; // default color used to fill shapes during mouseover var _colorOver = {red:66, green:133, blue:244, opacity:0.6}; // default color used to fill stroke around shapes during mouseover var _colorOverStroke = {red:255, green:0, blue:0, opacity:1}; // default color used to fill shapes if defined as cache this.colorPersistent = {red:124, green:154, blue:174, opacity:1}; // Image ratio on the scene this.ratio = 1.00; // padding-top in the canvas this.y = 0; // color used over background image during focus var _colorCache = {red:0, green:0, blue:0, opacity:0.6}; // internal this.fullScreen = "off"; this.backgroundCacheColor = 'rgba(' + _colorCache.red + ',' + _colorCache.green + ',' + _colorCache.blue + ',' + _colorCache.opacity + ')'; this.overColor = 'rgba(' + _colorOver.red + ',' + _colorOver.green + ',' + _colorOver.blue + ',' + _colorOver.opacity + ')'; this.overColorStroke = 'rgba(' + _colorOverStroke.red + ',' + _colorOverStroke.green + ',' + _colorOverStroke.blue + ',' + _colorOverStroke.opacity + ')'; this.scale = 1; this.zoomActive = 0; this.element = 0; this.originalWidth = originalWidth; this.originalHeight = originalHeight; this.coeff = (this.width * this.ratio) / parseFloat(originalWidth); this.cursorState=""; this.noPropagation = false; } /* * Scale entire scene * */ IaScene.prototype.scaleScene = function(mainScene){ "use strict"; var viewportWidth = $(window).width(); var viewportHeight = $(window).height() * 0.98; var coeff_width = (viewportWidth * mainScene.ratio) / parseFloat(mainScene.originalWidth); var coeff_height = (viewportHeight) / (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top + $('#container').offset().top); var canvas_border_left = parseFloat($("#canvas").css("border-left-width").substr(0,$("#canvas").css("border-left-width").length - 2)); var canvas_border_right = parseFloat($("#canvas").css("border-right-width").substr(0,$("#canvas").css("border-right-width").length - 2)); var canvas_border_top = parseFloat($("#canvas").css("border-top-width").substr(0,$("#canvas").css("border-top-width").length - 2)); var canvas_border_bottom = parseFloat($("#canvas").css("border-bottom-width").substr(0,$("#canvas").css("border-bottom-width").length - 2)); if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_width) && (viewportHeight >= ((parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_width))) { mainScene.width = viewportWidth - canvas_border_left - canvas_border_right; mainScene.coeff = (mainScene.width * mainScene.ratio) / parseFloat(mainScene.originalWidth); mainScene.height = parseFloat(mainScene.originalHeight) * mainScene.coeff; } else if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_height) && (viewportHeight >= (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_height)) { mainScene.height = viewportHeight - $('#container').offset().top - $('#canvas').offset().top - canvas_border_top - canvas_border_bottom - 2; mainScene.coeff = (mainScene.height) / parseFloat(mainScene.originalHeight); mainScene.width = parseFloat(mainScene.originalWidth) * mainScene.coeff; } $('#container').css({"width": (mainScene.width + canvas_border_left + canvas_border_right) + 'px'}); $('#container').css({"height": (mainScene.height + $('#canvas').offset().top - $('#container').offset().top + canvas_border_top + canvas_border_bottom) + 'px'}); $('#canvas').css({"height": (mainScene.height) + 'px'}); $('#canvas').css({"width": mainScene.width + 'px'}); $('#detect').css({"height": (mainScene.height) + 'px'}); $('#detect').css({"top": ($('#canvas').offset().top) + 'px'}); }; images-actives-html5.git/src/share/themes/buttonBlue/js/iframe.js000066400000000000000000000022671250410645000253120ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // Script used to load youtube resource after main page // otherwise, Chrome fails to start the page $(".videoWrapper16_9").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); }); $(".videoWrapper4_3").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); }); images-actives-html5.git/src/share/themes/buttonBlue/js/main.js000066400000000000000000000146131250410645000247710ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // @version=xxx /* * Main * Initialization * * 1rst layer : div "detect" - if clicked, enable canvas events * 2nd layer : bootstrap accordion * 3rd layer : div "canvas" containing images and paths * 4th layer : div "disablearea" - if clicked, disable events canvas */ function main(myhooks) { "use strict"; var that=window; that.canvas = document.getElementById("canvas"); // area located under the canvas. If mouse over is detected, // we must re-activate mouse events on canvas var detect = document.getElementById("detect"); detect.addEventListener("mouseover", function() { that.canvas.style.pointerEvents="auto"; if ((IaScene.element !== 0) && (typeof(IaScene.element) !== 'undefined')) { for (var i in IaScene.element.kineticElement) { IaScene.element.kineticElement[i].fillPriority('color'); IaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); } } }, false); detect.addEventListener("touchstart", function() { that.canvas.style.pointerEvents="auto"; if ((IaScene.element !== 0) && (typeof(IaScene.element) !== 'undefined')) { for (var i in IaScene.element.kineticElement) { IaScene.element.kineticElement[i].fillPriority('color'); IaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); } } }, false); // Load background image that.imageObj = new Image(); that.imageObj.src = scene.image; that.imageObj.onload = function() { var mainScene = new IaScene(scene.width,scene.height); mainScene.scale = 1; mainScene.scaleScene(mainScene); var stage = new Kinetic.Stage({ container: 'canvas', width: mainScene.width, height: mainScene.height }); // area containing image background var baseImage = new Kinetic.Image({ x: 0, y: mainScene.y, width: scene.width, height: scene.height, scale: {x:mainScene.coeff,y:mainScene.coeff}, image: that.imageObj }); // cache used over background image var baseCache = new Kinetic.Rect({ x: 0, y: mainScene.y, width: scene.width, height: scene.height, scale: {x:mainScene.coeff,y:mainScene.coeff}, fill: mainScene.backgroundCacheColor }); // define area to disable canvas events management when // mouse is over. Thus, we can reach div located under canvas var disableArea = new Kinetic.Rect({ x: mainScene.width * mainScene.ratio, y: mainScene.y, width: mainScene.width * (1 - mainScene.ratio), height: mainScene.height }); disableArea.on('mouseover touchstart', function() { canvas.style.pointerEvents="none"; }); var layers = []; that.layers = layers; layers[0] = new Kinetic.FastLayer(); layers[1] = new Kinetic.FastLayer(); layers[2] = new Kinetic.Layer(); layers[3] = new Kinetic.Layer(); layers[0].add(baseCache); layers[1].add(baseImage); layers[2].add(disableArea); stage.add(layers[0]); stage.add(layers[1]); stage.add(layers[2]); stage.add(layers[3]); myhooks.beforeMainConstructor(mainScene, that.layers); var indice = 4; layers[indice] = new Kinetic.Layer(); stage.add(layers[indice]); for (var i in details) { //var indice = parseInt(i+3); //layers[indice] = new Kinetic.Layer(); //stage.add(layers[indice]); var iaObj = new IaObject({ imageObj: that.imageObj, detail: details[i], layer: layers[indice], idText: "article-" + i, baseImage: baseImage, iaScene: mainScene, background_layer: layers[1], backgroundCache_layer: layers[0], zoomLayer: layers[3], myhooks: myhooks }); } myhooks.afterMainConstructor(mainScene, that.layers); $("#splash").fadeOut("slow", function(){ $("#loader").hide(); }); // FullScreen ability // source code from http://blogs.sitepointstatic.com/examples/tech/full-screen/index.html var e = document.getElementById("title"); var div_container = document.getElementById("image-active"); e.onclick = function() { if (runPrefixMethod(document, "FullScreen") || runPrefixMethod(document, "IsFullScreen")) { runPrefixMethod(document, "CancelFullScreen"); } else { runPrefixMethod(div_container, "RequestFullScreen"); } mainScene.fullScreen = mainScene.fullScreen == "on" ? "off": "on"; }; var pfx = ["webkit", "moz", "ms", "o", ""]; function runPrefixMethod(obj, method) { var p = 0, m, t; while (p < pfx.length && !obj[m]) { m = method; if (pfx[p] === "") { m = m.substr(0,1).toLowerCase() + m.substr(1); } m = pfx[p] + m; t = typeof obj[m]; if (t != "undefined") { pfx = [pfx[p]]; return (t == "function" ? obj[m]() : obj[m]); } p++; } } }; } myhooks = new hooks(); launch = new main(myhooks); images-actives-html5.git/src/share/themes/buttonBlue/js/xorcipher.js000066400000000000000000000115071250410645000260470ustar00rootroot00000000000000// XORCipher - Super simple encryption using XOR and Base64 // MODIFIED VERSION TO AVOID underscore dependancy // License : MIT // // As a warning, this is **not** a secure encryption algorythm. It uses a very // simplistic keystore and will be easy to crack. // // The Base64 algorythm is a modification of the one used in phpjs.org // * http://phpjs.org/functions/base64_encode/ // * http://phpjs.org/functions/base64_decode/ // // Examples // -------- // // XORCipher.encode("test", "foobar"); // => "EgocFhUX" // XORCipher.decode("test", "EgocFhUX"); // => "foobar" // /* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, strict:true, undef:true, unused:true, curly:true, browser:true, indent:2, maxerr:50 */ /* global _ */ (function(exports) { "use strict"; var XORCipher = { encode: function(key, data) { data = xor_encrypt(key, data); return b64_encode(data); }, decode: function(key, data) { data = b64_decode(data); return xor_decrypt(key, data); } }; var b64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; function b64_encode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, r, i = 0, enc = ""; if (!data) { return data; } do { o1 = data[i++]; o2 = data[i++]; o3 = data[i++]; bits = o1 << 16 | o2 << 8 | o3; h1 = bits >> 18 & 0x3f; h2 = bits >> 12 & 0x3f; h3 = bits >> 6 & 0x3f; h4 = bits & 0x3f; enc += b64_table.charAt(h1) + b64_table.charAt(h2) + b64_table.charAt(h3) + b64_table.charAt(h4); } while (i < data.length); r = data.length % 3; return (r ? enc.slice(0, r - 3) : enc) + "===".slice(r || 3); } function b64_decode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, result = []; if (!data) { return data; } data += ""; do { h1 = b64_table.indexOf(data.charAt(i++)); h2 = b64_table.indexOf(data.charAt(i++)); h3 = b64_table.indexOf(data.charAt(i++)); h4 = b64_table.indexOf(data.charAt(i++)); bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; o1 = bits >> 16 & 0xff; o2 = bits >> 8 & 0xff; o3 = bits & 0xff; result.push(o1); if (h3 !== 64) { result.push(o2); if (h4 !== 64) { result.push(o3); } } } while (i < data.length); return result; } function keyCharAt(key, i) { //return key.charCodeAt( Math.floor(i % key.length) ); return key.charCodeAt( i % key.length ); } function xor_encrypt(key, data) { /*return _.map(data, function(c, i) { return c.charCodeAt(0) ^ keyCharAt(key, i); });*/ var result = []; for (var indice in data) { result[indice] = data[indice].charCodeAt(0) ^ keyCharAt(key, indice); } return result; } function xor_decrypt(key, data) { /*return _.map(data, function(c, i) { return String.fromCharCode( c ^ keyCharAt(key, i) ); }).join("");*/ var result = []; for (var indice in data) { result[indice] = String.fromCharCode( data[indice] ^ keyCharAt(key, indice) ); } return result.join(""); } exports.XORCipher = XORCipher; })(this); String.prototype.decode = function(encoding) { var result = ""; var index = 0; var c = c1 = c2 = 0; while(index < this.length) { c = this.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); index++; } else if((c > 191) && (c < 224)) { c2 = this.charCodeAt(index + 1); result += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); index += 2; } else { c2 = this.charCodeAt(index + 1); c3 = this.charCodeAt(index + 2); result += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); index += 3; } } return result; }; String.prototype.encode = function(encoding) { var result = ""; var s = this.replace(/\r\n/g, "\n"); for(var index = 0; index < s.length; index++) { var c = s.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { result += String.fromCharCode((c >> 6) | 192); result += String.fromCharCode((c & 63) | 128); } else { result += String.fromCharCode((c >> 12) | 224); result += String.fromCharCode(((c >> 6) & 63) | 128); result += String.fromCharCode((c & 63) | 128); } } return result; };images-actives-html5.git/src/share/themes/buttonBlue/manifest.webapp000066400000000000000000000007001250410645000260710ustar00rootroot00000000000000{ "name": "XIA", "size" : define_package.zip_size_here, "version" : "1.0", "release_notes" : "generated with XIA", "launch_path": "/index.html", "package_path" : "http://my-webserver.com/package.zip", "developer": { "name": "Académie de Versailles" }, "icons": { "16": "/img/xia16.png", "48": "/img/xia48.png", "64": "/img/xia64.png", "128": "/img/xia128.png" } }images-actives-html5.git/src/share/themes/game1clic/000077500000000000000000000000001250410645000225705ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/game1clic/README.md000066400000000000000000000010601250410645000240440ustar00rootroot00000000000000## Principe du jeu Ce jeu fait partie des images actives à 1 clic avec mémorisation de l'état. Ceci permet de créer des jeux du type : - Observation : Jeu des 7 différences - Observation : Jeu du "Où est charlie ?" - Jeu des intrus - Inversement, Jeu des éléments de la même famille ## Syntaxe pour définir le jeu Le texte xml suivant est à écrire dans la description de l'image support. 5 Bravo ! Voyons si tu te débrouilles aussi bien avec le jeu suivant : [http://jeusuivant.com Passer au jeu numéro 2] images-actives-html5.git/src/share/themes/game1clic/css/000077500000000000000000000000001250410645000233605ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/game1clic/css/main.css000066400000000000000000000207471250410645000250300ustar00rootroot00000000000000/*fonts*/ @font-face { font-family: 'yanone_regular'; src: url('../font/yanonekaffeesatz-regular-webfont.eot'); src: url('../font/yanonekaffeesatz-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../font/yanonekaffeesatz-regular-webfont.woff') format('woff'), url('../font/yanonekaffeesatz-regular-webfont.svg#yanone_kaffeesatzregular') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'yanone_thin'; src: url('../font/yanonekaffeesatz-thin-webfont.eot'); src: url('../font/yanonekaffeesatz-thin-webfont.eot?#iefix') format('embedded-opentype'), url('../font/yanonekaffeesatz-thin-webfont.woff') format('woff'), url('../font/yanonekaffeesatz-thin-webfont.svg#yanone_kaffeesatzthin') format('svg'); font-weight: normal; font-style: normal; } /*fin de font*/ /* override Wahid */ html { margin:0; padding:0; background: rgb(133,167,40); /* Old browsers */ background: -moz-linear-gradient(45deg, rgba(133,167,40,1) 0%, rgba(133,167,40,1) 50%, rgba(118,150,32,1) 50%, rgba(118,150,32,1) 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left bottom, right top, color-stop(0%,rgba(133,167,40,1)), color-stop(50%,rgba(133,167,40,1)), color-stop(50%,rgba(118,150,32,1)), color-stop(100%,rgba(118,150,32,1))); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(45deg, rgba(133,167,40,1) 0%,rgba(133,167,40,1) 50%,rgba(118,150,32,1) 50%,rgba(118,150,32,1) 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(45deg, rgba(133,167,40,1) 0%,rgba(133,167,40,1) 50%,rgba(118,150,32,1) 50%,rgba(118,150,32,1) 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(45deg, rgba(133,167,40,1) 0%,rgba(133,167,40,1) 50%,rgba(118,150,32,1) 50%,rgba(118,150,32,1) 100%); /* IE10+ */ background: linear-gradient(45deg, rgba(133,167,40,1) 0%,rgba(133,167,40,1) 50%,rgba(118,150,32,1) 50%,rgba(118,150,32,1) 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#85a728', endColorstr='#769620',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */ /*background: url('../img/background.jpg') no-repeat center center fixed; background-size: cover;*/ } body{ background: none; margin:0; border:none; padding:0px; border-image-width: 0; } video { width:100%; } audio { width:100%; } a { color:#00c6ff; font-family: yanone_thin; font-size:1.4em; } a:active, a:focus, a:hover {color:#ddd;} header { width:100%; padding:0; margin:0 auto; /*background:#000;*/ } header h1 { margin:0; top:0; left:0px; /*background:url(../img/imagedoc-darknoise.png);*/ display:inline; /*max-width:20%;*/ padding: 0px 1em 0 5px; margin-bottom:0; color:black; font-family: yanone_thin; font-size: 1.5em; } .eyes { background:url(../img/eyes.png) center bottom no-repeat; /*margin-left: 10px;*/ padding:.3em 1em; } .eyes:hover { background:url(../img/eyes2.png) center bottom no-repeat; } .meta-doc { background:url(../img/meta-doc.png) center bottom no-repeat; /*margin-left: 10px;*/ padding:.3em 1em } .meta-doc:hover{ background:url(../img/meta-doc2.png) center bottom no-repeat; } .infos { background:url(../img/infos.png) center bottom no-repeat; /*margin-left: 10px;*/ padding:.3em 1em; } .infos:hover{ background:url(../img/infos2.png) center bottom no-repeat; } .title-document {display: block;} @media screen and (max-width: 640px) { body { font-size:0.7em; } h1 { font-size:20px; } } #detect, #canvas { margin:0; padding:0; } #container { position: relative; padding:0px; width:100%; margin:10px auto; border:0px solid #FFF3B2; border-image-width: 0; } #canvas { width:55%; margin-top: 10px; border:10px solid rgba(255,255,255,0.2); } #detect { position:absolute; /*top:50px;*/ left:0; width:100%; height:655px; } .response { display:none; } .unlock { width: 80%; margin:0px auto; } .unlock input[type="submit"]{ background-image: url(../img/unlock-icon.png) ; background-repeat: no-repeat; width: 40px; height: 40px; border:0px; background-color:transparent; } .unlock input[type="text"]{ padding: 10px; margin:10px; background-color: #ffec64; border:0px; box-shadow: inset 0px 0px 5px #ffab23; } .button { -moz-box-shadow: 0px 1px 0px 0px #fff6af; -webkit-box-shadow: 0px 1px 0px 0px #fff6af; box-shadow: 0px 1px 0px 0px #fff6af; background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffec64), color-stop(1, #ffab23)); background:-moz-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-webkit-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-o-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-ms-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:linear-gradient(to bottom, #ffec64 5%, #ffab23 100%); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffec64', endColorstr='#ffab23',GradientType=0); background-color:#ffec64; -moz-border-radius:6px; -webkit-border-radius:6px; border-radius:6px; border:1px solid #ffaa22; display:inline-block; cursor:pointer; color:#333333; font-family:arial; font-size:15px; font-weight:bold; padding:6px 24px; text-decoration:none; text-shadow:0px 1px 0px #ffee66; } .button:hover { background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffab23), color-stop(1, #ffec64)); background:-moz-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-webkit-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-o-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-ms-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:linear-gradient(to bottom, #ffab23 5%, #ffec64 100%); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffab23', endColorstr='#ffec64',GradientType=0); background-color:#ffab23; } .button:active { position:relative; top:1px; } /* popup */ .overlay { position:fixed; top:0; right:0; left:0; bottom:0; background: rgba(0,0,0,0.6); } #popup { z-index:200; position:relative; border-radius: 20px; border: 20px solid #ddd; width: 60%; margin: 50px auto; background:white; min-height: 100px; box-shadow: black 5px 5px 10px; } #popup_intro { z-index:200; position:relative; border-radius: 20px; border: 20px solid #ddd; width: 40%; margin: 0px auto; background:white; min-height: 100px; box-shadow: black 5px 5px 10px; padding:10px; font-family: yanone_thin; font-size: 2em; text-align:center; } #content article { display:none; z-index:100; position:absolute; border: 20px solid #ddd; border-radius:20px; width: calc(100% - 40px); margin: 0px auto; background:rgba(255,255,255,1); box-shadow: black 5px 5px 10px; overflow-y: auto; overflow-x: hidden; } #content article p, h1 { margin: 10px; } #content article h1 { font-family: yanone_thin; } .article_close { z-index:200; display: none; cursor: pointer; position:absolute; top:0px; height:40px; text-align:center; } #popup_text { text-align:center; } #popup_text img{ float:left; width:20%; max-width: 60px; margin: 10px; } #content #message_success, #content #message_success2 { overflow-x:visible; overflow-y:visible; } #content #message_success_content, #content #message_success_content2 { margin:10px; } #popup_close, #popup_close_intro, #popup_toggle, #popup_toggle2 { cursor: pointer; position:absolute; top:-40px; right:-40px; width:50px; } #loader { position:fixed; display: table; text-align:center; width:100%; height:100%; top:0; right:0; left:0; bottom:0; background: black; z-index:1000; } #loader div{ font-family: yanone_thin, Arial; font-size: 2em; display:table-cell; vertical-align: middle; color:white; } .videoWrapper16_9 { position: relative; padding-bottom: 56.25%; padding-top: 5px; height: 0; } .videoWrapper4_3 { position: relative; padding-bottom: 75%; padding-top: 5px; height: 0; } .videoWrapper16_9 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .videoWrapper4_3 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }images-actives-html5.git/src/share/themes/game1clic/datas/000077500000000000000000000000001250410645000236645ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/game1clic/datas/README.md000066400000000000000000000001221250410645000251360ustar00rootroot00000000000000# JSON datas This folder contains data.js file where paths and images are stored images-actives-html5.git/src/share/themes/game1clic/deploy.html000066400000000000000000000006441250410645000247560ustar00rootroot00000000000000

XIA installation package

images-actives-html5.git/src/share/themes/game1clic/font/000077500000000000000000000000001250410645000235365ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/game1clic/font/README.md000066400000000000000000000000301250410645000250060ustar00rootroot00000000000000fonts used by this themeimages-actives-html5.git/src/share/themes/game1clic/hook.py000066400000000000000000000205141250410645000241040ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # # @author : pascal.fautrero@crdp.ac-versailles.fr # dom manipulation from xml.dom import minidom import re import gettext import locale class hook: """do some stuff during image active generations""" def __init__(self, root, iaobject, PageFormatter, langPath): """Init""" try: t = gettext.translation("xia-converter", langPath, languages=[locale.getdefaultlocale()[0]]) except: t = gettext.translation("xia-converter", langPath, languages=['en_US']) translate = t.ugettext self.root = root self.iaobject = iaobject self.PageFormatter = PageFormatter self.tooltip = translate("export game1clic") self.score = "0" self.game_not_configured = translate("You win !") self.message = self.game_not_configured self.loading = translate("loading") def generateIndex(self,filePath, templatePath): """ generate index file""" self.score = "0" self.message = self.game_not_configured self.score2 = "0" self.message2 = self.game_not_configured score = re.search('(.*?)', self.iaobject.scene["intro_detail"], re.IGNORECASE|re.DOTALL) if score: self.score = score.group(1) message = re.search('(.*?)', self.iaobject.scene["intro_detail"], re.IGNORECASE|re.DOTALL) if message: self.message = message.group(1) score2 = re.search('(.*?)', self.iaobject.scene["intro_detail"], re.IGNORECASE|re.DOTALL) if score2: self.score2 = score2.group(1) message2 = re.search('(.*?)', self.iaobject.scene["intro_detail"], re.IGNORECASE|re.DOTALL) if message2: self.message2 = message2.group(1) final_str = u'
\n' final_str += 'toggle\n' final_str += u'
' + self.PageFormatter(self.message).print_html() + u'
\n' final_str += u'
\n' final_str += u'
\n' final_str += 'toggle\n' final_str += u'
' + self.PageFormatter(self.message2).print_html() + u'
\n' final_str += u'
\n' for i, detail in enumerate(self.iaobject.details): tooltip_state = "" tooltip = re.search('(.*)', detail["detail"], re.IGNORECASE|re.DOTALL) if tooltip: tooltip_state = tooltip.group(1) final_str += u'
\n' final_str += u'

' + detail['title'] + u'

\n' final_str += u'

' + self.PageFormatter(detail["detail"]).print_html() + u'

\n' final_str += u'

\n' with open(templatePath,"r") as template: final_index = template.read().decode("utf-8") metadatas = "" if self.iaobject.scene["creator"]: metadatas += self.iaobject.scene["creator"] + "
" if self.iaobject.scene["rights"]: metadatas += self.iaobject.scene["rights"] + "
" if self.iaobject.scene["publisher"]: metadatas += self.iaobject.scene["publisher"] + "
" if self.iaobject.scene["identifier"]: metadatas += self.iaobject.scene["identifier"] + "
" if self.iaobject.scene["coverage"]: metadatas += self.iaobject.scene["coverage"] + "
" if self.iaobject.scene["source"]: metadatas += self.iaobject.scene["source"] + "
" if self.iaobject.scene["relation"]: metadatas += self.iaobject.scene["relation"] + "
" if self.iaobject.scene["language"]: metadatas += self.iaobject.scene["language"] + "
" if self.iaobject.scene["contributor"]: metadatas += self.iaobject.scene["contributor"] + "
" if self.iaobject.scene["date"]: metadatas += self.iaobject.scene["date"] + "
" final_index = final_index.replace("{{METADATAS}}", metadatas) final_index = final_index.replace("{{AUTHOR}}", self.iaobject.scene["creator"]) final_index = final_index.replace("{{DESCRIPTION}}", self.iaobject.scene["description"]) final_index = final_index.replace("{{INTRODUCTION}}", self.PageFormatter(self.iaobject.scene["description"]).print_html()) final_index = final_index.replace("{{KEYWORDS}}", self.iaobject.scene["keywords"]) final_index = final_index.replace("{{TITLE}}", self.iaobject.scene["title"]) final_index = final_index.replace("{{CONTENT}}", final_str) final_index = final_index.replace("{{LOADING}}", self.loading) if self.root.index_standalone: xiaWebsite = "http://xia.dane.ac-versailles.fr/network/delivery/game1clic" final_index = final_index.replace("{{MainCSS}}", xiaWebsite + "/css/main.css") final_index = final_index.replace("{{LogoLoading}}", xiaWebsite + "/img/xia.png") final_index = final_index.replace("{{LogoHide}}", xiaWebsite + "/img/hide.png") final_index = final_index.replace("{{LogoClose}}", xiaWebsite + "/img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '') final_index = final_index.replace("{{JqueryJS}}", "https://code.jquery.com/jquery-1.11.1.min.js") final_index = final_index.replace("{{sha1JS}}", xiaWebsite + "/js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", xiaWebsite + "/js/kinetic-xia.min.js") final_index = final_index.replace("{{xiaJS}}", xiaWebsite + "/js/xia.js") final_index = final_index.replace("{{hooksJS}}", xiaWebsite + "/js/hooks.js") final_index = final_index.replace("{{labJS}}", "https://cdnjs.cloudflare.com/ajax/libs/labjs/2.0.3/LAB.min.js") else: final_index = final_index.replace("{{MainCSS}}", "css/main.css") final_index = final_index.replace("{{LogoLoading}}", "img/xia.png") final_index = final_index.replace("{{LogoHide}}", "img/hide.png") final_index = final_index.replace("{{LogoClose}}", "img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '.script("datas/data.js")') final_index = final_index.replace("{{JqueryJS}}", "js/jquery.min.js") final_index = final_index.replace("{{sha1JS}}", "js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", "js/kinetic-xia.min.js") final_index = final_index.replace("{{xiaJS}}", "js/xia.js") final_index = final_index.replace("{{hooksJS}}", "js/hooks.js") final_index = final_index.replace("{{labJS}}", "js/LAB.min.js") with open(filePath,"w") as indexfile: indexfile.write(final_index.encode("utf-8")) images-actives-html5.git/src/share/themes/game1clic/icon.gif000066400000000000000000000074351250410645000242200ustar00rootroot00000000000000GIF89aZ\`]ba ^c_d`ead fbegchgdhjeikfjlg km ln onpoqprsr ts!uw*vt"y+u#z,wv${-u-xw&x'z6}/w/y(|7x0~0{)}8y11~923~,4<5.=>?8F9G:;BIlTFDmg~=!cU苎^TZ-Q2缺4E?WN #5[_Tހ_ 'z4"$~ؕCS?b I!^}Pj@`6pmެx%jlA=cNX AK ;0Ht-<0m8%nbcX3Ed`ze tZff|FMtfP7=d?DxP=Ɇwcdc(Yfnb'HoZǎ==d(d5ޘc(Y)8} \@dHv|Qpm1„X3r#JF%4זj l:cu嘡|v_-ڠCMע`-5f= w޼# 6)"@^z' . "A@l& `9 T dr L@#ĠBw11 *P%#84^$@JdbĐ E|! Ia->X1BE?r \a@HćS8y(>cGh;хza'cQY(r#'H"Br|L2Gm z>h@l$O9FE ᱇b^-5L\a<"3(ݠO$ -siGhp@mÌKZ-@4ÿov`l(uH0u*6xS8t&?M Fч  ;?v: Ds1Yd>AJLzRFtpjFfAkjLVv H>YJQ #8`6!0jޑVWVUsV4 !pg$lᘟm"Z%}bzϟֵҌdWHD"P[;q>,cevYW@% hҮԮҔjYA-mj[cw5bk;וv{ +k=ѝ-ikt sk7%.y&qu{+Z:-jX%:pU2ZX iqɉ[/60GP V']`w5GLb8]q]3qmaWgr alYC15<_cq&U`{9&Fq\?^#e/FV0KQ?8Zsf"Ydfq|g_zN` Y*-j|_C:)h.s=^c:Ӛ^4O厾vV>jJ?CdGFC@P4.{P׹!sx2ӟ>w[SWtS{1{7m7W~dߐP&OH?wgۗ9+~,oH-$ӊ\2g~S~_}qng^~qWy7xzsc ( q*0i>D%(0*X*Ђ.38\Zw"CH{G|wƄ9hwRQV~FzZxw\Ua(GHhsY~[H'NrXPHeȂhշ7zL0Qq8El؆>5'ax}1xunXHchhlhuw؈~E*aȌ舏XXɨȋy؊ׇ(|U%h瘍騎U؍(8x渂ȊW؏(.H ha9 pVȎ}va!I+ɒ븐1[3I LٔNN1 .ȉ.ɇDe#p$A=UiXɍ[z f_Y`TV?B]6ߠ@vyW-\ٖ.:P 0YY` k? axo#Иaᙟz) xyyٚbɚCygfIY);images-actives-html5.git/src/share/themes/game1clic/img/000077500000000000000000000000001250410645000233445ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/game1clic/img/HandPointer.cur000066400000000000000000000042761250410645000263030ustar00rootroot00000000000000 ( @MMM***eeeqqq www```jjjmmm ,,,bbb =><'=>=9\!UW[ .Q4WX8ZZX!((YT4 5 7!8Z 6 NQ$34 5 7XX;@1NOPQR3TUV Q? LM112RSTQJ0%K0LM12X>U/JK0LLM1>A5H I/JK00LJ?[$),FFG-H I/J/S)?DE /FK -HO :+#D\M;"7;C+/&3KH@21B3*FA(@???? images-actives-html5.git/src/share/themes/game1clic/img/ZoomIn.cur000066400000000000000000000042761250410645000253030ustar00rootroot00000000000000 ( @༙L@3uaL""!tSSSǨiii555^^^trr+++} ===׶-' xxxXXXcccRD6''&̬ ///mmmqܺ[[[0)#xcO%$# ```ooovvvqqqt&%%(((˪N@3 TTTݻYYY___wbNaaabbbhhhwww-(!߻Ȩ&&%RD5̫˫cbb\Z~9zq qX\_@_`%%rpM^A&%$o(J?) ppG_R8e$66jjhf8k nn_!dfws Ijkl77lR#E.3-3.Kii$s\kcL tNfg^y"9. *4t.'dm54V44tu#g_TkQ34V3> DZXa/4-+aC@T6YPtVV*3Q5l|YJxttVVv];^Y7St 8B}EYA\8Tvvvv*O\>,1WU4O_,-V,\$0<)o\,bd\\\\\\\-b`FHc,#|YV??images-actives-html5.git/src/share/themes/game1clic/img/background.jpg000066400000000000000000002410341250410645000261710ustar00rootroot00000000000000JFIFddDucky#!Adobed<B    # ))--))=;;;=@@@@@@@@@@ !!**&)###)&//**//::8::@@@@@@@@@@"0 @45#3P!1"$6`2p%7E !10AQaq @"Rr2Bbs4#P3`CSct$pⓣDӄd% QQ]@ʶȔ!@H\utbq|&yH3̠P!5wB w4 sPUk˳Ӥ!L›^> Ɵ0Ua_`j]9w8FuvuttK>}0l@%EXrVĴ-j |:s=_ ?LUKL\C:>w~+g[ G3q:-q4 ,Va_`j]9Ôw|B^f8dv1̒tsp_l# tr;Ӄ}>9>r8tS'_a\Dti'F~>il+,N]5ԧm]tt:-N>'߀Rnz ZʵW#v_'h]VP ¾Ԅ*;0>vK"Xt(y14$:q}7Egoga$w:ݟNg#}ӊd/݄^r;$*~>pP8:>Cvu߁+l>}u!L"ϒ$+z98u9|>#sD||..1w:@ʶԄ*;0o9g >}O.Sz>>ï!LD$tưK|-2PC>yy| r"ƱZW%OMYE Zw"꣨;,/J?k/>i)_H=3c4ѭSUF ZtTw`Ƀgaˏ߃;Obi?$*{v@|:+:.@}>;f۔#HimA8*.<>Ϡ2@rӔ߁Jq:@E/@$8E*xȎFOg!e[djBςlrI1)M twhHy_+` &FβؿV&2|w1Eo˧#!K7Y.Wa['dc8);`fxH!&CΰA':;M^H;v xs|}vwJB;5#=Ƹ0H,:WBd~mm"e鵹C2:( *#RSɌ:-Kr9>rtr ]h P+F7!gSz`W̶8v2)sr.~Z>.Cʀ_P+k0ȽwL= a ?*ﲺ&Gg:C|RSZyTU\x T:>}cʿ~2:y( *&.vgX!Q@.ʎ}w2ήߠc|Ƽ3;z^hgX*J]b>%[İ ޠO ǐ|8wW{XW%tY6Y'?ԅgs'Ϡ_Gπ{}EK3c P9\݉9R֑I9}=F\c5%H>#/i@!L;m*m.3V_e@aWhzk$kqWExC^7ˀ!L'm;%AQBcȁ@Ldi;Dt{:hs|@:%e]} K%42F\5q#}yLXE̦.u{ JlRcȁ@YV@Ȓo'@_\@[T̵M|sWOyF\ZS\2̱T1ML=NWϠ ֗kbrH6$,.P<ayA~3Z\f+(<c]|z e+@Dc\ ~CV]C-c[=S<|X̆R/oP;OIvzۚ`O8{~;; 1Y +5yMIK~ N[fkO_S}NjҔMeP4ٝ^= yL,sRj <3Mp@ J*(ޓ#4vQ%wi6h8mNdݦEYNiJ &=ljOHʚo-ף 545 9d08ukTE铧gV&&cȁ@Jm]Di1~Yzs:[98 wGxK(--gtT uy=Y Bh 7Yz')xuu8㤒Fhs@yF`ޤ\[G_gX2=̖yy) 8CHI=FD 1_-'_Ptԗ"wׯ@kxmtD,ru>8,xXfr~}mwt`'ǐɾ=na7p5d!:z3Wh! 7^l574: 1)ʜ@\Z(,2A@~)dܝD J"mJi3%Ӽw*dW6G@VcS>Vpj67eQG®a_ F@;{0eu`/ :WzSn.%ƨπ'7 K WX 13'H [zk>(}?y4wb&0QQC۟J-)ɀ>}꽮t徤2ڞ|c  6gHH8ɚMQg#L &j*Vʐm>䭋zkZb4ٝ!Cs#cI7gH<`w؃͂Qz|w@ QC2ա't]ݕ@ ,p ޓ$G[}hf0 +:\No>lqPY;%t1Qz0l+.$F p:i)H49 .hMA:, 1病 uH--:_:6vU̜k3|8uY@;}s}xg4 +tZM62:Lww@AzOv&^t,'K[iVL [@d}C|z(yzBuf5pAK,*,Zκ+#]=JfĞj,[^F=Ѧ8h@9wH|{@!\8uNU]B^SV1[,3p5(( kBIYtIquTFw`l1=ϠעeK+F(Sa q%ClHSl#kuݦiy( .kzz@)*mI4f'd;;_)9oI# d`==xKuNU]?w~r2n#{(ERH1Rv#=e<|i3pAbU[uٓr=6$}g?e5(qAvD%׌%cm>b$YSnQP ;|mc k6vgۺbysu@̽7̸P_ڦ8F b7LWr(LP׼׎`%HzF\AbJ3W+u% P\.`#7Pmr^} Lr yy#XE8w昬OTƭ͎GzǁDi-È@{w0 Vv7+2vz9& =wȽl)5yMQ2 KQkwj >'E:n4(@ /|i h..F2+ '`ŐgW6|}C\Sw"8}9>}>[*=ؼwM@8rhz]VTuv@u#RpDN!M~3P6s听 ULx7fEadTz=ZLpkK:@`G@+lJP .kHH!̌` 1|$ T ;@qOpzH:rFx8i֦ (|8sT5&Њtci 6`). .kFIb!.5pxϰf4c&`zzih[eXShXrpd9f +in)ޠU-b@+ DB􏝠 &S>gYbk]ݤ7Ϡ@Sl<-gz侦kB1"Y2/HB/**p ~xwO Qd0 ʮ jUR>~Tc /2D+<;:{C#hs`VxPz_zœ}{EOBuQ@8e[S!UZԕ 7X%EO @} okUjRWMH QF5Z ;1uf4e ֗0u__ yPn"B⫈fzb| z-@ ;Vm*- ;:i@=A TPs;zg_`9EgYhl@+ py >c8jS@ 3:lZi3wR].nK0z-ti56`5 `~ap@9ZZחf`y_y i1[DXUEX=* jP_爀 Ư(d94 Z ;[|[$ {Z, 7D_P ;c(>44)-*t"?#3zLoQnZq@&CLޮNÓ| j;Y'I]:YiVՀ ;yGxX78Q=ʒUZ֙@2-Ez q,;z @3ˈayGxFMπThsU`PBSsLԀy&lwIvXETe޾T\F\̃8:L-|D : PsՀϼ ,/( y@;TEΰmIo6p4[Y85boW^sMpZg~yP8ß`rYQ̐RxFi3`ڦضnqepO<Ǘ( ;+z\z]=&B5uEl !̌WҀoID@[?<_Q'+jBOxxװbɂA@>}e}>y09zs̍l Η4m^7da &oL_ oW#Ga<}̖z&u,CB*2~?_a΀K EyXXw4Wtuy@'Ͱ^!OӘ+s,i~w*+@ lLirP]=ѐq< XEyǐ)GWPv:\giĨ4e~c]bHK洠3|S6TtٵݦC ?NX]c\RO,ˈ4uv3J8c{n!`'>yOHC|:;/juvju S=ϐ4Yh<0f ad`׼Չ`WiLVws"W\S49|%H.-{ ގcIC[̆3]@L)^GXW@ 6gDJ 8F-@VV%-0=3 -|iMQ^掀X_ϽKZF`L05̐.Yv5V&WcXW%W%ePgY<z/. EOoP hk@̮6#=̀4r<&_P/!PյY:}m%t Ɵ.B?]Y$YU,hoX}>XiW`^ */q:{ (j-jM,Ҁ [:);@3,i3چ|f 2@|K@!V3"6aL&wPSS:k9 57?1#}Cvjz'gXE'_˂_Q .beiJ6l|Ћhuy=A/ϑI`s5<t^sg4yc `hsǡ :.ix93`sMj[Jf@2cD6pgtTH|Fۀyp7~M!̶(DZR P8tِ4g]cPU>| *نSk@_LWyZ\S jK3Iv +QS`]R=dRWJ-@eˌV ~Q Ku! ;#y!=x ; $Ƙfz'S@eQPcvp<;0twZ[&zg¸*kY8ʶq|-+[5r+E7̀4,}9a_fdv }5<^ (h 'pxۼ95`6Z{zxG|C<`!;:u /U&Wfz@HgY<̆ f| {{2g9 z+K'e`=@QQI?O]CϸeV 丹9w+EAhK5̮ުi:"PymnHAFW o@rHT zg:#ey F!MeӼ}%gM<(n4 5`ϔ|jNL=tSٞƋ.(hX켢8sLSAjb[Sϝtˣ8|; 'FoMgh<܉JwUA_OюM,.R6;I<&¾ )2wi\i<9XPޟ@F-=Wy=Y{p7o3+H:69!aey^Մ_] OTG'RsucA>a-ķWa((U 5vT;{ˍC/,SFzv=\ԁWAYne|'w`J]XNMf:E1g0&x_{f<(pwZ҉bdKZ m=zXfPsqQnpv?yLBkɗfF@v`ZU,k.IA+fͤ8>g?ׄވ'MFH8=6etJ;F'}=Kra__c0Ҭ[_ ::sZU|[gȉ1W4{CrJB=Rܺ.8zj)-+K, 5WicʰhʙIqd7-\^/7fqgWwqBLkSMiZh m;שm^,dy]-rV0P=$_yiV$/ M6cˈ%E+ a^XO.cv%@eCxrPh$?)aYML)DZ~RVm=}_#=%--i.w|ƚ>D:%+\_^KqH_>A:N,F l2TvV|hS@X}-@߂\@Z ziҤtc_\@~oP~>.\oJ@%2\@&,qF= =C ].o둤\U>&L|.$ wWvαX,+Hs%Ek2sIWŨf/i ;1{LXlًb`_ U4 Aġ^ 5^ 5^ 5^ 5^ 5^%ҁhij>fjFeM6dڱjQeZjFYeځiaf_mƋh}^(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx(ׂx-#Ik`?|.ŨY#Qtd 4cI"$fdv2:U4H3bo9Oט$B*J(sh) F݇-.@wEM"2n|C)󟀹״6oY#ZEI n{c}@gOakM0CRMK]-6,7pӡv8|&i2'd8>']d%VQIY|$y["?Dpd~R?QBdUQe:3tb[3S?r;!iy/[ ?Dp|/AhuӇn\I*RS?|;7_K )r 㻍 Cf0VmKo9OD߲oA"6-h7%K❻Q Xmg)Hum$^)8OD*e `wqkӆpZmg)<7'H^G"zHt$jpc$u6'(밞i~)en2TS&jƣ'mg)❦aG @bcE0L;A$a=No9O{LC]4@',D .Dtdi5T:,;#}E@No9O Vrਔ17 'Ih5)TTHh %ZM*Sپ5?2?5v ԭ6Dߺe% _ZڅJH@1H zR`!BQB_7e$.c˰^iwwn"%Uv8U!Ak*j-o.L&s2~zZmg)Ũ?kSWTE5APD4%DQ{g7r!/RS;}x72Q1!'Rnvx/D@̝VMt-,l5d>~Zmg)r8 ]Hr(&{$dn UY3Kn?u)ʾ*J j>Gt%tp![]rʵZ>If'hD ""( XCNAzr9s}8 }ĩ~B2~֤դ*`%(l._ n<~=x?fnM䴥z:(@CQD1OHxЀ|5U%TDEtW%8O^F7L]+M>rJ@D7KS !xQ(\[/'&n%D@*eXCm !9QPdrnTڤG3@\92 4)DLQ)tiHE.i%Dd.+x*t/RS/),>"ja>9Dπ* pP dC 6$*,RfPݤП "b;U&+,CD;Q~]"7Tx1!C&v"H7S(Q!$=* gGy^i^ i W{fمAWl+صw [`4'@ i#"S(RiLDjhD{Lc&bp"TȖ#sTK˱?#`]4PZ'g9Ws]Ue:Іӂ(?fB8mPpNv-6ˡ6j]eP^&~7UBB?9 HST@(-3 IB&f)nPn4Jt0* dćtfBeB@8q ~b(Q (ɈeL AL@$T nJV߰SM<@] xKY8;(T`ʘlDr D*;[~ >*StųraY|嶂Q2P72C{Fq8LUrp)Cs:D:b@J{"a!DY5QKĺvshs;PPLs)|Ȧ N&\(2 DVR&EE0'["\jdwP",UVA }P]mÑjb3GbT2(7;ږ)1'h9w1LS^ d(nS,P1G"E3RLS MC/tpdW $ 6 59E9D"cs&L!H3DJD#w lB)ĥ50=Dpm@ #K5]bilJrUS~b0G\l&P$}P !fea*YLc8CIO=F ^E~4L}Ң-ilHH)%l:?NU"NL*6;OzAl[Z\#}E4BEE9t m;OCA b6"4v 2 ]"s=ai]EERR4ۑ?r5vR9DJm1W`=CB>H4j'*11)7Qg,;[ n-\Qjݱo= NrM Ut -*#Lȵ1] xH [hЧ#uS* a@ݍԨ13NJh;* T$4rFa1GfM m6A4X|-a!؀nc6pt혤s7Qf"k1W`=CB/C"RzG.j~S5շ"[%Z"Q! B~Q , ʚjR D Mfaeh.m(7*`Sm/vvZm8 eLѥ0h*j'Ht4 $t) Z7U",Mg5d mV,1i[ٚ7(!@ "PHǩ]H[]ʌ Co9OP$L3qr;Wcռx$IDOar `?+ Gtls5l"C1R@,:M="JRzA#:}Diͼ%3!^9n>1CDUq`%AB f~/ 񱅡 @(Ha( I i1W`=BI4iOg",`UVnrtmg)J h'%-f&FFbxK(xgkd)C| CmPNTߵn 2pK0dD7r *DQF+X(n@:X7dy@ TL&>c>ܓ8& !J`é42rYF5fY|B@PH ɁJR$N1&}Bw.I%<|9^X`?xn"=؇?vB(buŖleLE6\PU!( ubVnݠlfEvP`n ura13&((@@{)_PAgctRCKo9O(1HS&bwMŵƉmzpd.g e5fRZEˈpa콦ꠝ4pydv%(놦k6Z)`rO ~]߶/4 цչBÀܗ.L @T@OJQSnjjA-ɭ7xR ?)TJQ@Y[nOҝ̶B]7lEM8:pܖ"g8}0M"^/lLI5Tz$tD2`r ]x*{8n[)rh8f\H'}B[TݻA e<(S'>*^#VID=@礒I\ckDvVlN;bcsov]Ġ朳p#@)r0:p4e ' =6 .JRQe+`=Bo9/.l0ہu ՜kb9@ QZMg6cMɗb93rB57xᰶLgKM Ca6[YL%0[ClPZ]_P?My|4ٛFi 4ł尉1ػ*&Y6; .vWNZIUQ;<]3d鞜]/ {e476v]La%}BZmfkw :h'E)J^lGtG,a6_f6N8QٍK^X|+b(ܣmv]\$e&R>f:bP+`Jo3C 7Ĵ=g?aXMΒ}n!'dxaHFeYPn.JgbܢL*Ne*E 9s65_PVYyj OXh?*(eCvVag]݆fx^,ـ݇cf2ېIGA&# _PVYɷEP!?|a MNVV=19nnrgf$v{Il&;ч%na6\a^*= бvp1 nW.zfG7'a7oa-ȵKmv. ɽe.<fF mN am̔=MA{CgڋYlMP+LEmJ_Sߩw͜}?"q+{ ?Dh& G;v0YRi0r-h?e!,C-+"rNE ٺ]5nV461C~WZrYulTy69]dHCUgG+aJo3@l K ?ME2("Iivl3vSag&h8_LTc2I QE&v*?lIE 5ch.BAUfODᦙ_P;HZmfwfax bُtDNqwa~l>CL4хB"bٳ6 HKHWցa#XrX6{d#34 T|Ql)bGd ummi"{`)ݭݖza(Ydc_IlS(t> P6>`v2:bs鞣)˕M6Ÿ t%0Ymf{46r͢&0[ՐoT7a:~,2 g@wX7gf,wc1BVI3Fn^-LcH+4groe`mx%rl>-{$1)~Vh@j#))_Pmf$H"Ch.[to!>ĴYMl;Ďo%,zvJc YzlջDu9ˏ KYLwMDȡ' 2vCJoV|#d7mf8weؘ9 +/f!4svӫo2J")[Uf*xTڒnP3~3ڐ#nG #lVf-Shǡ%U.BoUE7OᱷxZ1p2>" *"6*=ISsdO5#gn@ϲp8?G0c/K,L[x!mʪZ9*g0$ ZJGP9OQhn;8&aG_!/*BԈlE<2i Mzl>%?\_P7N(drC=nTx&WiCء_]C'+K p3즷( H59x$fFV@TA xQI`K[O11Nȶa͘ ODRg"xҪ=8GKEiX7GJ s^čzȆf~ɂ؉vfLP,ZP6SL>n2vB2ki4J=#gKA&/K,Eϻ)9yRYqӅz;nP-nRAEE2p&e?/}m`ԤԊr2]+#QҸl\ba+R! 1YR"m~;m[rE;!óoiw zu½bݥ3\w[vhHH.dY\PܿB񯁏Z}\ˤ9iTd;fɳ$ 9 Ԡl@Y>i<F0;D)H[y7gĎeO>VdsL64e5~n7nÏ wܹrˣݵ/mB^Hăˀ_s^ip֟`/'Ո2R6uDRCbPmBLes( l~ݞ qBen[~e"RI&-͇vuMy[7ɱ+):1p6hۢ6Q7@Aۣ2;ZAV ,?'h۱-~RۯZH ޯ  O|މeL()^ aFϨCzR=dIVU$;l޶?LZ]l8o#@R4ptٍH ݜ (S!K8ob@}dP7% ~k(8i2JP3“#D~n2Knk 4d'NR"; VDHb4Rrz)LY355h)i8)|)G  {e1BK"X9~|SV6cǔ?:pM9șSP !qlh5cAt%Cp^l*oQ|r3Nl8$iWe"RiѨ7Z۫m-.嘵 Hn' [3a񵝺'FUVƤI_G,I3,&pU VM4|IE+”yHjFyelEMg/n(=wez8M̋7ȣU\\()3f(z]B wHQPzt߳:I$Fc!S_?C‰]j.Z~ۡ[qC(E h RL#_Y2~T\D\QrM2M g%O~Uz86j8dy;' ʍIuU# O^Sԧǽ(D%Ń6`M;Am+* Ny)U"IJAh8vpt=9БfccCG ,q[z]$|'?*~v2:,,$'L[(2O\a {h1Gc1ƥ1VTTz4zE02@( R_|pOb&blΆ.)i6E]&n4^@B !O8w~E|\:N`"H,dL|U ;3X ~)kcY$Z/yK-Gv݌.;G=v7[ߑu) qg r878j 7tGrr(C&zŜ=u_jG\r{_8l&ߑd  3~?;AR"b2x`a$h4hRDʑ.PhXN `H!ȡmK򝌿4;0Ոz~n#\'x$EOD0; gnZ)'`a5$\";XQ@ƃ"2]kzN)U`߰fM>?)foY K a󺈀󒔤-$Ǟz>5j6,hؠPP+X5/}<;2Ոz~n~_\'~g[ͦH;j*n4\8YTk 5̕4dA{ B"#X+cz'Vx[C[HE`bu6fUGto#1A,x2;i`ݕ%=s]XWs7?11dٴEnx"GcGP6(Sg OKѯ_H⚤eb;y70߮nހ+rJQ:ZK?r~&afl> ûk+[ێ4fP&Ti_%f,yMyRŊrֿ掸V9/A\ŖYZ*l!6trL#c% _rW {zS v|\`ly{,vxl>m9p 2$9J+1#.d!۫YzKQw%__-p^PE`M^RRME<^6Ʋ쥴nIy8ٚX l>b9$v{J+1>kGՊNfv (IV=Y$FYn]O\S1nʮrٙYaEG!;:9 l^޿9_0ח;伛jR2hێom+;!+*“CTCOYtI=L;<2$q ݘ͖j&d81LC_+U4fGy ٹAٚf4wc|ȶ6L_fVa|c6?^Acf9<QyS؉QH,UA-`ڠ"R2~$@P-KlƎcvi:V{o(Uy3r7Ŏ{ښ$U;=_/ jDŽkR*NIFl]ZjQʿbY4Ȓvwb DF#QC+'X*3Rq A뽘W/ foY]S;;0+ݮY<[ t F4dՒ:V\jg۠dnHlxש:$$d,)g,icr`Q=>6fG%KKSZxa4ו?k6YG~N ! Bx;4>>{nىKm7o&$Fu~ۮh`KfvgT66?0װȋ3K!m4?e,;?u} x%7N܀ڱU'%29\ 2cIJDd2:?}DǨ3c,^'.:^of1jGo4Hdf6_ՎŵWycD\4 ;9qٞKYYT_aYyp+0ûyS MzXvgf@?=XpWav~Zyh~=OB;?=mDL+/jƃy+cPS^ja6O| g6?F@LYY]N]GZy`wwfv C"1f>gnKCMyn9O>}C2ǟ/wa?װȋ^M/&zEtA]mqn_1ʗ-Aa"hnG{P}8KҏDv Pk/vZB2;O4^ /:d*=&y]aGkҽCZz^m4K)-AO ޖ/IGcvIZ]x;>vl'2Qh(W]T }ObaA;3 Q& ['j/-,>^ôP7N/f xϡZ^v9Zb&:9l %θPh/8|kF\Qd@CTcb[vk< A;GD%A>KP}xa$;nZv3Dݾ݆TD`-Icre ,D(5HS[(ZAҤMP6PqOv`]蘎 '!<F-@"A09uICAd#^&7}ɄBO%Bq{1 uMA%wmڬ^+Y}y23O@^?=dج2 }2-cJ4U:O)x>>P?;d=4dF Q+ TUzxa.Jv_ݯa"?߱K,~N>x.3цo,ۣogF9fJCDt)x]8TEv%+V?,+]51U//`alUv:݆8k {07icuF{Yb{f+ nxRN_`mS> 6'̊j1LAՊ&^Lb2ۦ~J,>x7\UFx4K5IoY%ҙ.z""^/l;e[1kw d9'GEʦA3szH^U"*W @4.ke&IYHy1|=?GI^ >ˠIdOu|T7e0eؙ&ά4G7Fx;(2oqXjj@6z;$DϧK%՗AN)xvͫ'ݬ(.0i%RYa͆W7"t) 'e/|"힆/bY(F?q0KɕrsGK/;L`;c/ (Q Nó-xz'/M1ӊ{iktpۖn*RR%Nwy/8Wg胅G-Of}Ďֹy!es,N e5Egqe!bJ"zA~tOuxswclx8ъ{MŽR$y3חdoMRLa=.苅3yL=nsX0q5NJ8Hhe517lAױPԧ PrGˡJ*rzT/Mśg#dMŕn_GbXɥ3[sH<_#R&m(>!h|~TjF:k '垷-Mɷc_#YG{Y_;f$weI-N95]ØA^k8+nm^h#g;( K6 {0Z {C Q9w*]yαtn=?<{F(#gmq_^t~^8խ]q`wPRX4ȟ+P9haq{}62c>ܘ?p1A Lfv"mqW -v扏QXi?ͳa፳\ZZfn.;α~uF(?ZSrmu^Zpn9d?(ng1=i?n/{#d!5śgn*_?c 0a%OaJ~"nLeŠ-IvNP M c2}+?]Fuc 0KrŸl@ń>^Ag;fLq#'c*n,.Cv݂tt&nd;즏! I9[s&`#jbڛv8^؜ipsƭe>r>#N_iK;8#{r߷W d~HR9wu°5ʎnjo..l˵9KgYO_O#LϗvK깹rX6Yp ONq{unE推abFftljs6yv~+xn:U% Vevw}Gv>|s['YO lgX2sCDHL8cc:%۴ƜrۚYBź,uq)%s4Lf%MZՊ!NğU"IȿHsMJMeьRyRNDPIK+MjX7eỶ~ @nT%AUu6cO#9#Vȧzc"M" @@AÔLtDzW+Ij]D\NHX&Tz <*B En'wUtw ɑr, F%DrMxW)J'Q#SEu: Ts3rSK. ȹ+W 5q$ET}ohR9wz4DrV"*mT:fs *(c&^VtʪZ#UIA2.wP+FdMEO\ip -VnAaoLbD,r3D*4b[:$ GRݩ0o(c;]Dz&dSvSubMX⩢Lcɑr>VUԮNŷh@crjjG29kv8wDUAQRt=DJ 19JSIb5Yl"ɽ "/lp$eJ9E:QꆧNlECrN 3 Q5I^"`jv8tOjHCaAˆSn1Y.6zWl[;+w GM*ڒU5E$u(ɛ>xK%)URӒ 2meWQE&; $5[$?&QuEe(n N=7MD̕MЪBs+7ԧ9CUgNƘŨR:* )-6]'c$ᑥTn x*I^8pmEh_7ra]wlGsruRQ4!&FD6FM?ˣwJ (ťRHtU F9 F C î&QU5.@XISF:u b* c dfdSYA1ƤVUDDiu@"InsCtE,JEePVi)4}Sn}HbVC1REn s4s|Tzu#w2P=Z\U5;"$Q&6I".Q&Ρ4!Ȝ]W 0q7XfZeN5tAOJ)&Ք &;rQp: m*ēY~P2 !bAUBеX5D=mY߀*ED?1}b2JL,Ή w-MpI9Z.GJ% "a""99exp; 81c_>3տo87}o>zws=[;󏹞Vgxq3տo8`^J>*LhpyQ(pY!@r`2pfd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚Wz +'d쌚`% ױ*6A^şb`Y4{b/^ƖkJD)^ʓeIײRu:\{.N eIײRu:L{"R)^Ȕcױkij^1^ƙcLױfpY,{zcdl%{%dd윚 p+ٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɫٙ5{3&fd̚W2jfM^ɩ?0???# fa-s<۝viēArBFQ:ޗZ`);[&20yT# fw0wM!2-[$6T;"liOw)$(@MhwLɬ5 ~z *³wCRO)O^ѿ~U:lm8H}ӽMmϹ c If!TZM@Px2؃6hy*QSoi]i'|G| c-;($ð2ZiZFx}E8iOwaXhkܗ&TZ*m&0*g.1-4V%clCI!32z<*A'V~U5e=9_ #IN9%~)i݀zVϒ\)|ÞU$/cEGnàs%>pU0.4 t3&wkI%sZĝb[Ϭ9RO#]X0{ r9V #s͆6klBKϢrP_yi>a|4V)K öإ4i8@U*y|ÞU$/#@C,LhAqhpރ2@p FI|yi%6rtyT#)'W0{D DɄ|gw (, h1wF,yT#W"YQ!e#HH:LAA)9M"W{,zv0wRk6ǚxG }a*~h CFf(5*MH1׎XPzmy2 ν46:Vwħ8Ðjv: )GcӃ}a*~xHDq#HUمgH(V-Ӹ+˃a켰1 z(ѽN%.}"4ID).U6,M"ʙ70jh ׿My^N4 yT#vE'P p z9i0 661(t4eWn@o m܆*m,<1^IJNNS7%7]d  8ReB_ާxs|tn9P40cz*&jQM[ L8&-KR$Ě@bL v_1|ɂeNX0#(4%1G0%T{ܗAܛ/캌7$G# L\4 yT#cP$QfAS>4Q!=4 qRTmQ XLFQRЧhiiV|u6X8MhfZ+;y+a(HRƑ]kyI<|)syx.SXaXѰ ƥ;9 2@1 :I⨛saS (%DljFEvO*(4GLBzrjK=#^Y!hƶch^0N*짬Ί@VMBM2.qS.M͹NQ50'"|䫒'1h[H}=K>I?K8x-!2Tv}%MbCfQHYdkaHbB"(X`@:D(Ҧ2y +&(=ĩRV80qS"(rH x4ČZ6E'H0<n[V1MXbuF; 1R>!AV:h)ym dրĸ6ޥ"b " )A@m*:XbJ4mєB6C6{LC.jqjM;$e58Ȫ9#Ӄ}a*~puSF h&E#02Xa:Bj/I=8Gø:x+4nr PIYr-,r3E](W%GN:6-^y)iAE4mHDi9yaWhURh?[PUjQ4_1*.~;9&Ge 0Aֱ88ņ#2GqBQ7lԣ@̚=Io@7kYH *(4UBNaC{k# h4/+`u`AP<-6uh1o&h_taqwϬ9ROԉ8 Ʀ"#1tf@IzHh# ly;:#Wj\Ԁ [M6卙N@8 Vx2(؋;GSalPQԊ8`UV1}pʭ ҺL\jDjC4y#MkBuKx)0.<`T6ЩFТTZhi4Q^:xkXQ9XCE*o.aPe{/9aTLH@q7%wȔ6c1&mNr6 @Y@ ɠ{*;p`j8@PzfT\{Ljqg.8J*=M|wCb,e04 yQ5{CC@%ϠV|[4/0ø;'|G -FAVy+?^;ֺ1&=`B6AWㆎ&Ch/lL[M 8˨6Pl"n۸ ctS`yOiîA1JPČDr(8XG-Mdo='{{)VQG*by KhT"F3#vr89hXQAG0M[Ap5d2H#5'h24 6q:I$TCaaD0q\0|UZ+4Ee"8DRYfh_ht m>klZ #X(s^QbUnYVt2kQP02StbV9і"Θ|ノ3HjӂѾ$Zi+4cGR, hFB0SF\j ˙c_>Zu*¢@撣nOvT!>I?K8XVVQPSEw^p715jyB%@ ɧ{%+9rP &+T4 O1Qi0p͏U6#Ek}iN,:[@6kvD5lb f9=KU"h1 XZW1]`C#CdèIZM&ѴqQoV0e41l)STX㮒J.bرE@i`t@E#tȴtEhQ9苍:3)mf4rmduWI"ko%9XCG"WH3jCSnslQhPfi4xٝDyiPb2LJ@L^A2(Z0HR d` LQPTTD= v∢ZC/UFa9"E*aмחy"Z>I?K8O2j7[ҬG&zFC<RBu儗 G̼s ΑA7oM&ůȄGeFqC0a*AC=Hl…M)c3]#Nca·vf QC,֐SEu0e˟>$i6#AƌE{0$f43`HGU{h lGtљd =Yd(R:d+Q$1.cVG)eP5$nj zhvfȊ:բ4c?E5EG:VL؊v,LNd=2}#䠗%(ɏOq>lM& .q:#Vm6h찎hG06,*) Q,weT]: JcN|T6- H>:d0B wz KiWq|IA}a*~pjl`B착>QC*hۗ Aqᶕ#uFIcɧbxp=(_)4r*P lb hZT xmcYW$C!Q&fhe Ւ --2p <!1gEvt  M境,͖8ʱ`09E #ļ9ڛ0أEHm+f*_76cr7gCW~ Y!HLQ|,Ė5k&OzI?K; h㭊myɗBgRj,I:JIdݘM ^mākc92P.S8}  P& Z6dgM=`2D9F? -%X&&{=4ۇV;1m <Ծ `#ôhg(6ƶБYoT]WKėDiL0DvB3@Q ,G]!qAxFq)` Z"Ûrfm&v6㼵dN3Di(ҘӢ2;2&֯MtIRe3*MZTpl.Vi-ZyBDa0*0y J3XIwYsUӝO%?#R , f&J2l0,AvAQWi'pU#ExuZÊ:(@BD9U&u8jL/"lN:D&1g?؎L,5 g~Դ:aDI)c.K6/UTX@pr8>y[ ,?2/c`B|ߖQ>.RXɁɰ˓-N8Y']xrIݏj5a&f*yFPbXM*=ml\YM6p^N<(l{ä.Ec& !QH >A@ Wh̥eMl~4"dB;LA vD,6L㿆>I_DLJNnӱN tәG9d"cU1Ǔ?Feg5bC.Mt|0vYvL0צ(4T!ކ-5!*%6 Sgi[^a)!ՍLl-"c FU(=`$훞KΞm'UWEӁ/ {xYnSKՙcQn9Khjum)f ;ى0m.06fYY6F#XX)=5 ]6c Mr5(8 j\,A=cbl $2gU5yǒN,*AETYiflֱW[/>fm  6ˌ40±C~/&J{TBz1g,41#ڼ5{^? K> % rvX ㊋s;6.*/wcɝ1:T˹oH1]mw1;w(*jSa88Iٙ0zgjVXGr50wx ٠u p59s⸉ux~]w#ڇF٘q5Jȗ2.={5l=EǦxWT>|[pI^ By2aTApVe" Q" mvE\(`LDH&g^cYcfNai5ZO5',T,* lϽwƀ <]mԵ3gh@qDлXŎhӍH M#rIŲy{$p;n!=;Otm'ޝ/(= r&9O,0Rm{Ɨ5ȎuL9\܅ѥ~ܞ<,-6 N:=l'N.Nj XAVjaQ5+)لO.㿇ju_>Km,c`is("ud6Xi4Qr(#2QQcujSto mI {+>#{4eQѲ5ClTN4fS\InMpv܉J < ,OcYfQP姉{ѨwVŸAf& 4Y&U@GE)lU.'Ӏ28Y'=sQPA FDY3oGE({䖑9mGFq-0"[mm2&\M[@z'8y4\cu` .[fXRM?KR1)0ѯ5?kJq.+G9X=fK›C0sa쒽+v}-c(&;LLLLqb0iWß.H ";y,c\c]wvKy89 `Ayx:#]'lmC+RTт)v(ơZvR:`$3(V@+Dl2&w>O8޸:y-0. Iʋ8Gٜ IAӀ{:`"#[['x=or_OF@˶ ,xk)FآnJJZBq pھd=ep5oˤRZ `* ]iEf,p/sO*Z0%Nĭ`zĒ?I"UX8ua˵ӂ}a*ny2D LDcJ)h&+K>䯒9I8`w*A`mFzamp]ozr ❪K Bc[PcI%E<1ۜx]@/3% `1(<)C~kI="A?w>t!#XX)=5p)*0L:1eȭӾ%j[MuxLP}Tq 8dv0]vц!)=֟(i~5:JWH_$%:bwGZՔAE bmbbOrv^:+s]P6EDa3֡)j',"vj 6U]INʘk)bVRHrSe2V :)TЧ#:)՜pN],67nȩsf/!T^ɠklS2KT=+,{b. *9(כQ 3w=hTڦL|w77C1JO#(#4d#leUz7U"k*a D#Puׁ~.aǴ}Ӆs OwTYAрe ѧ~N5-(ӗE<+ݤ^n늏&PTGN <\T, *6Qw!*PAw2EgY:J/>K$ KB[(DⲠ`᫖fNc" qJdtH$XQi}\9iT:b)m(kj(j^g{+rr2X`a;/$UofKϲ(0]Y0:8)_8=ldpH o qh/..%byg 8/jY$6,ziaI !dF<\?wԀsTi~JK@"gN3\9i6q?(E䉤@ufsKҟЎ0CҜ8)ՕHI3v\&gz@$uci6!" TI[nT 'Yi&,E IW$ua@9Nl>hʌ90Z`=_u֚#UXݛn}˹1Q|51b=4+vS9F~TsXWeѵvU6|XBSüb7qлvOAW2fR@&BrɒYHT!4EcKdt:ojǯrX#əAE @Ξq6-d*ب:#D؄51VbhmICf&*V(08-yπ^>cr:yr` `p agn&bÐT3kܚ3?f0G}|\aɇrρmvυal2kJNta1KB#Bʛ%*̙;:uJ16j(׃T$6uT!Gbw%wk 3Z% e`6|P!K-Pv}䡗5J0z8;BQ\tZuL6h KwNB:r-_XM9Xj)heM$4)"v]UЉ5շ ښF*J0 P6-DWyBu׀N>cC?#(#4d#K;CaIm=&+Crfp$Y&)9 bC}|1jK q(96 h ?Aۑ,sVu=zYʤɆ %!.^R%x+rIA115bXÔ}2-M+>s;Ϭ9R}'EN`1͈GThenS'w&1кشw ;Rve 1Wi 8Te> hl)s@tmiRIud ^>I^ mm'G-'H]9hZOVPk.sMuT&h⡀k;8!BFx{LLioqJLc[<{_-!D:RVж\afi}RbK#QV/Q>`P4Ш{N>cR, py#=oӽ )YQCw!GEU8?Mkg~ui;d]Wѹ;&ް2rDpr8l 0_/i#9_xL @$Qo?wjTwϢ3[e$Q:g;1@_-5 PM/nT_aED \yXѱ/4NRh2W[)>NewG;a<)DW;G3'L5c$4{̻*mD436a&pSG9PacG|fմi9s\—!fLݓD `%GDCDqVt5Ŵmxt`樂pcqtd^jNU8o*uzpbDF}ɒɁg9\[k` Y@C.C ]~xaw۟4z<R LOYڿ&"=D6zoP^f@ģFdو0ΤJ-:;l؂ e8Κv9=8UE-'~@7XEMD k.4XkF##| ;&^a/1"XO o j0Myr9h^L%M=Ŋqp2 Az='t ݐK@ywNO.fbi~Nt`\z#cZrFEI 2{lhUL3 ,WMaO.8+tsMf8IRFX;oZfVoh-+#NJ~yxxaEHьtxFM+f΢jŅk`0sGns3/Or?F8Otroy:9)9͖(⠛y&DX_MgPhafg Vr)5Chf]N|- 6~ֺPcUڔ1礅ȬuN<wG9]~xaruHt<r|B{Ƈɇ2yS&ǃC[s"“N1(Zmx栭@I?$S#;y(Z5^, z#}_W_[ skvg0냝'^`ʽ<fuOt`h;5OYP2tӤl}O)Qk<NES<,nWgMJE3\QM7~uWp_/S:{Eydeh@8BuD(B;[t8{#Yr;{q~\O)]J8I3pDU^W:<69 t3dJH罦q NhO@|P}0dvOl[d wajB8``Xey֑Ť(biss?04湂KR͚͠ܘI 9;AjN&̀]}+{zle8|s 4P_'L9+Imi3ShLĊvֵ\x_p0+]~xa|[@P̚`rŊ(rR*âX0N-?ìmsXJ?i$ CbJmN<[rÐ=8 #9޳xI,eAϳ4ic֔s4AJH{DXltYBK֚h a^v.;\Źj}&餹L#-z[W2-t(IG6$%"fl:6a1Ig^/px/,Z-0UFS hr»EfR*Z3S+wfHVT(BaZeىahݒrL^q]]UXp߸^V\=\~7hi?-|gLX0\HY$ ,8 G(-`#n~ыe4):VVMkJlhpe8#f$$5Ѳl>!Wcpzҫ'NF'ꤤ$+TdPiZϟgiU:ȲWa̻T<,C@VHf檐X)u8h;qùvKF9K[IX˻՗j c.1lʒ%8 l x Ȥٞ{1@ DL7W  {-UJY*OHKzkFLԙ`y Aho`ZkeW%DstChB7&=<蜂u,k*fRۿ~礮w@+vÆ8>9UG,pOm]d4 1ق0YB7E?32ʞͣҹ׿}_hd*bSiSyt<]xӭ!Ƃʜ`㧛4f5 ˻m`sٺG09]@ n]Om0 m_ojDRY T8%"=သlݙW^G- T2Xab)l y4WHCxSӬRoyalnvXB%YH*A6CCa1&#ì#RɾHV㇖&JZyhc:u^SN-)P4Q{ ~I]"jF\Z c'P3fPژ|>ArWt]^MM#@`/eC/47T#k/a#+s&_4ɌE*i @dbі`u[HkaAwu,9*ˡLiSM] +J{@K.b֝[tacG6 I˵e<wcE$IkE(^f3`yap`kK9vDu'*R5t0SCOul[@0٧^ oU@PF/%1& 㯞U@w1]zKf!UKM@Ɔv%n¦k *UԐ3sdPN]]Ͻ3%@-+M)!"oL*V5 YɸI0h.n)Q 5mV$]y\F!8WW@}lKD~ڿ% ӄ}bjCw=21NV/TQQ`7H~'P  $ɐ8w1# ž^,^G|sp# Gٞ< `.=%܁ْ$ƽh]*R y+y~,nc6X Hd҅Bp{A61f>Cd5:4d%Xgs&_þh1yWFC q+\%aUdAA&]B|Jh$AN2x#o'Pup dV )'Ktp9&0z7 M $4eȘ͌H@ PmWN}*G3 upi׻2`yY&Ф{ԭt*5qδJF20z`6vQ˿ݙπ:G>>c+$ {(ǛX@u#`y&)gHL0,m8#@*tWyֻJJUs5*C|ө:`Ӳz:iNN#ҩҿ7OI䧀1b¡{'x`<9#3<ǟ\wt易3]A # eJu^NJn&׻+hr>N]%+J?_夶9X1ŏ=*u) toLԄTO ,XV2܈k$]ۻ5qfՁXR4\=kc-pi^f\9f6i7 ;Aژ9p M=т<)g*n8(Oo<4=QGhʵ,8׃b)Z9G0Y#38A,D$DH7<рz+Wdɔ3e4YDm8M:򑴨4/@aOltӪSC4^t<ЧRJiB d#O4k9G9Ŷ&,L֫l[$dkGB 2F(xy8rԔj# :`IcLPy#$kx+D X 4魵1~AAy/K@w)c^uci,5)g#t`À^)p }|,S3Iw^⫖lъ|Nqa)4Y25yMs&ccɀ8)=-=<+ pk 4/5<{z`b:u5JАy(x⭟6J↊mo);@`㼍$ׅU\Xam$-{d8c'<+I _p lU76WWs!1]RVisTΈ=Kzskr >Ǫy6V x4‘16ci,ƛOy:vF/ s Opn`XA8A[ŦMkKHDe3ՙ)̹bb(y+1Md3L@yS$cNG`vJ8g00edL8,r )nqpR'98ZLnM#k4P6<77}+ς$lduzlJ"Ǡi[`f,FYޕ<6I~=֛9ĹH" ɏ qܦ,*DqM5I.m:efLl( 2 CI.d킓x 9=je9Ub?oqYr5 :u0eaAWrL^%;s 8v;2"r#0R+G1VأiݚSkO%#&}Jg<ÁK+sϼonA̘Y,͜8øVcdf-Xؼtfؐ)!|ќzcK֛SD%BJ@o <=F9QN|= שR-+0zth<|AoFrϻ @/ *`TF^ v&MNJi&<[v<aϼ(\ϨF#,en+C&Lz#.}l'xlϮF#{s1;c.䋰2mXmUfo8(QYЕS ż_s `͐gȐ\T[~&0TErl)+vCkl]P#Pق`h>.f➝Y tN(.c1J  wXb1tueNg?idoȉP°$&$cK,bX!NJI&`5aFI'%ݏbqF^v+yRm{ǀ[`rՅ]'s)% SFBj f*vh~46f&(sl,+ϾBysh8'Et?}Q.ZDUg)_lH &$N.>mjQo_yX.NБfL/T~y[BX{ & &;nmOgMRʖ1 IMߺyODc0ɒ2@ ,# Žeyw]?r_Un>M:`:C˕47yk2T"mϲJI5m)ښG|8diŝf'94YrԼ0TPI$RsJz qmBY7Ry7a&5f('Kt`xqIpq8g^,d^I'mrKwjX5 ܤ4.畔ɗHg=dĀzޥ;GEK_{iȍpOͿtwՂM-π ֖y~/.[{,N^L%XEMkyC+6n%L&^knj,x =Qܖr]Xp8$giÀ^sְH{pΧZ߷w}'fNק(ȃ']%4@vko,/EbJLiAT  wqF Ϳt% f^V:,wV#H/ts3n\ Ò==wt?vS\VE[N -fvI0wI}7ef5 - V C!<pB2;Ϋ&&!KIL!#Q{Ѿ@|8)N>I}ah1XvYG,pHto׸Y`"vc|\HIy@X骋?IF&]u$r{ c?.F s lpw7{䌀S[+HciPO(;76qV 0^V1R5o* 1 )5 ,'x)oH/Qq*:͝ǾJ,uC˽CX\VeF^̪0S{Û#-?Q=匉dG? ^r[8 $L'iK? Ow-0ϲ?0 =cT^-Rj cHQۂI{$B5r6Fr/vzpS3l0SG9 V::w~{Ã'38 y7s.Lq?a@\0Zߟ9`| Ӏf[&[DPpoS~ +ysl{ڬ q+f!NgI QH/<[`.$MTO\4ȑO\9%1:aG|sap[AP0s!)$ѽr3 `p~8ςzx fSttDsqtZT`d6A=цУ7>{Ʌ==0lZY#t͐Wf^ߥ/ޛ$oe֭ecbs O. v7ӝB;7~8pOϼ m ]6`'ToBQ03l0m2/Fmj; 4]ps,cSLDl `cnmiRε893S5}#}++yx G, Q# {{KY'U{$Q8evm޸p.5wܮ!>`N dNBMd.kdF<906a|wLZ:)0F\)&8DV 1;,QOlɅ#X^/D?X#6ē0`ǷрMcv?&512y0nqQ=BuW3)ÀIBXԠ`'wO.qryoϼڃ`}yo}қ*=NЅ *"@xh,aw>Ӳj;̶fƗ}VIh9)oNR4X6vk y>=r)̀ _NrVA>)Oǧ{ˀ[lIwbvZ HTE #=SiH`l"I-&0rЫhIn#{L4ᕣ ޔu/+YӪy!Is&S1@E`wgŸ0Raob##XyFDwG;pY4Gy?S;ps;'Zǘo0M:$~Èl̼ k$s\ѼN8?2Q *`e)6gb6Km]8d䧟iQ%ńxCNϒCcӗ- u9 ޼G^IvQR)h/sm)^jфUr4eќx2zs2tI$bBkιDxg;JW|Is6ԩ- uo&3e>.grfX1<1b\&IF <̱Lj)#y!}'O_ѕrg@#|7NT^n 1r18S2#3J,2HfiO Օ%#e@ƕ).yl4N9aE"c2ia˳{o %D/`u0e0e5F#HJm$kŐ osU42uB5IΒJ12Ga+o`ǹ+5b>5_] a6u'eYn?)7L:)+C^vR,jc'U\p^wNS$6l!U VOPؘflbT\Հyf:vbtӬ"fMI#IMfᕱD{C&[cp28Jɕ:'Z@/23ALk>M1@!חrsy}ow#LFRTDݦu,Ω;k520Kd,5ɼncvӚe, G79];Y?1{AO$:0I'a0G?R*=YҘ 9 A+0 #4W<M]SM#Loˆ@#P:&§*T3duQ7p,XQ DFlT~+piYd(NH&]LXg_MǗ|;$KBgJ Nӳ_%t%8(e#y8RSo{> єqt%L>M;21<SR5炕ӆwAb&;"1ѡ2[P4WB+ݜ2;suRlyjYVbpFR 4b#-1i^{inA7R.6,)_Dj8ʬ*;{21V`HߍPc N}F6h<%:6W+t-eμۋu̗*Kͬc͒2[#Hݻv|# ;F; b>4qB4QB ?x $2LFaA0G:q:|4`piohk' cpa  0PMi-!CNU^r&h^bqsyﭩ͟y\o3.1!OTO_oeL dǹ+I*/~2/R̷L276IN5:K0avXBU&%֦tqseO_:S*vLUAp.Cy_!wW*> 9r0RFST%#35fJn V00 Aږ*9fL%&uc"l;eu>_nAzB.2ɂNZѸh;r\Xad#^GݱZ+E#Sa#qY=ib;*1{HXI9y,F wCGn|' *u; YN\(w6C"o2tdⶒ#3lͬ͟lç`!jv]w6kdF<9G19ddpHA2DE&JE`<\7H7˃+>Nyl Fphk; i44桃#%"o2t&EU6L|@b9 aVAwuᠱ;ѤX upy֎/7fu͉b8ƃBZVo8i,"\مLFf6[n3:[j`p?͂04;];|sa0;,GONt"9. 'zG0T롨DIA/. t0+Up3FGa˂VW֠FݖQ3(憢GcoK2L>xа,-k * Q\X0Dpҗ+<OvN]9{Nwro:p _wE:W=4-i8pHE-_'w۟)p"{rչףz4l|/6 GdGߒ˱0iQEI6hciӲ#g`e4-O+/Fi)' |퍌x^^{&`3|E4FxSqDm2GGŤ3,HLmކ!{xY([v]N"ҌBxۙ4m\RuL^W#.h[F4V }4aTG+ȑzt`'.PT|szk+r0\tB!_F[Pކ3[xTLl܀a"((v-:DQ;<Ha#mهrdC{;.-ۓ-A*j;HG1W6Nw`v `5u0rOY#~. W\,ycWF'.to#s\ʓ,,ʋ̀!9N~R0o0wQڒ=4g6'Y>K%=RǎS}`Yɼ4t%ʗ 5nQ@02{8b7v'Xb@=8GSc!"F1|,̋C (#Q#*$Dygd]=˝s\ /̽<kdC 0Lо2{jfk$;Oy끮 W|]8Dn҃a3<Wvۖz0_č rMxh;ɣN\,3\(#.-s >Ρ8{q>ja14WZՀ#A89c|y%(co"#V [!W::(coflf"C $j40!</θG~ʓadX uR2mjYL?2#eI0#XX >Sw>)nle37NO$4kU?8|s@uozRu ,(:e=4PUl| ߰e1LYTp2(8Yme:#ۖν2$]Xi< ]3q~G9_>iy;SX<8%Obhmaofeh(>L,ꁪ4 jQNQ Gx'^n3+Xv\ 36@N vcфE?  vۖFy$e?##Q3T#uJ(G w'|F`c- ZH'ɾr# zxwT?d}v(H!FQFG!S>L4wr̅~+ӄp\f5_yvl]^" 9Gh0F^]'#鑭9O))⒧42h#9Ce 5C$PYRG(Nrq(a@r0ޫe<ZvTgafUQxi˂07'>\tmvPs45ux 16Q ` .SG̽9?K;w'%֯<FCd,5.R;٧!uag.B\x =4.ç9#Ӆi=ih`e2$( 7,{k@Ju:0rtFIς]@Y3"T1;qr~wmJϾ&P>1/)vAwu,ʱ23sǪy7;C`'.B\xFYY58)g8);rѵ89a 5-!]б͐Mrhha9G#ɆVA^T\4Cʧ p$h:`_ RU" U9%6G^نHrѧ ~ ,tDS[eHj'˾ce<52C3u+n'PCtpnSB27jPue1ׅ}u0NQK`<6I(L5Wi@x0ު8̓C1ëen7$6anح4 #ٷVY] nyY,*"A"M,֩Di`Zx9!k5QI&q5xHz?~Vş4:?LzMT[;vKe 5C˾=X p[ԟ":>0ҎRFG3!#zWx2 cdRy0ݒaɂ9N 1u$%kfՓqS@:c˽ ҘkAKDf!OE%_n*h5l}y_ܥ2XexY2e0v2$צ wb,bI84GxD$̚ I6e qS@X Y ioM)_6J1kTNRmEUC够sjimUܻ\ŗ1 4n)@Q^ʀ9n$U;qҎJg˺[ST-^;'4ܱrM(>bNӰQMs_ չ$E椉wyuL„`Zܴ$42 urۯPMuf:P uDHu$)P=Fuf_m%|ڲѦLb,bI84/sVTTHWc9]v5^ϗ)vHؼ7*h(r)I] Re$'K -[ 0bU/R  m# :G6'}'/>OMa-w"ЫA-{6Lgy(t]21 MfG>ȟ2)͉hvD5̝1eK[]UI"v0؉93ͻiTD3Utõ2cv8ٌI)wmnJ *L 2{26P 6TV`cO8t6# Gyx$F-숚l 1 ^FBÖ8Q$y z|)˕k^UoL{͸fH"h@7!yoc }>q`]F ]yXآ(;ub%!H5Ձ^ZRXEXV8Bld|=kA*7ۉpdhhOwrjMsb lZ,C);Ux$K,зTi_[4 .g7)VxQI09 )"t" D4rf[1WY`b5U?4#yS䡓/hΗh' z1EDPτvWseR "IˬG|tP*  xRB>#I* Q|T׶qO&N6Z LsrYs g5NJ"l>T٘V#m<0vLIbFlk+y "qyhA" 1=|)U 1@&]oblyٗ 7XI0v@ǹ̋f`Vw lj{%xq8r"I `!Cr v2TM5 N!|U,A2Q%S)v_z7cdipNK.dj(=e!4fQTI&[c c" Q$S&0UɅ%ݥ؃ݦ>sqBY@i4*$U-D?;-&^R"Qe(]˽ˆ wܦׂLAv2 %WSaQcx ܡ vƚI>5R_e\Df\GXrI[+w)ѢW#umS趋~4ہ%8IKYrdmh7?oyLOutQ3,,(Iי̞1,yv(e+iךp-jѼ3g0D\PMm P0ٷ](-$Yd*) i^eLPYj Umg8Rj5ܑ|Bl˺{0$9ho2L󥺕aio!=V! F#OxIdܙGz)l#q趋!_e @DQ@ @,QV5YO\Y>NZbj|S9P/-*:VgMCZar:ZJ~kVQeXg&Mj8րO6he\zt=hYf5k'rO/4nk+923nň)icFPF2$Gj}Y[GhW[tcsY?  $ 4*oIl"Z)UY9#xSa38aTҷi£EwfjXqLlo olƱX ;⟶=jf6SA%JPB( t[be_ٖإOKh;⅜7U #q £ @OӏNg‘ajzQs~(/Rb8QQgܤ1c_L6pJ1gHWYRj$-u/ 60?ߗ~_WAO5@5*4=:g:YGIV $JKZ@AI4.Z~5(k5SG+A*(K0Y}`ơ4C cdPM 1AdĹseưVcK)˚l?oSm~jM/O65"PcdTc4\5qlcF5Jae لG_F-TWJXy)a䥇A0ZV i4I:AZVaxU]NbJgԬu |F{ RSWHNۮď6^?ߗKR.eh&^$FC4#.V̕1<[OʎsO׽L}E9vD f FTSOKU=-Tꢝ@a³(U!yHƥxfc*Ua +cEL\xE%eϒv11A6RT䬕nxM*HPp2 "rufYU+JT\)w,,|8fx7dVǢiYh0˺{M{  ɮ6 W:}U6;I >`FiQմ4dyjhQ G= Gm:^e1IC+ AqH?Q `}eF>X*-li>%< Hf>sDDRd X W $];2vVjf'ƞ6 )S.Ds< >6& ?JhOHF+y;Jro"[1*R  `zC[_Nxq;1g6괙`%ɪimRDaŹ`iRBbIk.iђ\(wb,``h% h%Y!MZW<˸?=Y*%)F0w 3I$@!%< 8qOk9NC}AΔzosljyV*a@j5w%c&Dhf2#(͔. O3g h싰Ī7g_,Yd(;o jck6էrw#vWfvޣ08R"@@A6(ub޴cV4\F,熺]cVYN8-3ǹmNSF`a+Ns1B)6x%\2̥6Dń"9h3؀a$Y rJy. :TIFa L"bA(F҇d6ƌ&K6JBU@⷏y{30C u%YH*EtI掬vr]npĦ<4:+Ug8Gsek֒tfj>n"QCAOsB(9fl%ɨ:1qPv'4f%Nc2firct2!5\ikƽuoK#sP00#8a"`pĶ⡖\u(09"`(%RcTiX^_-'5ᶋq$HwFQıISo'kqWȊKF#)?fG" )N%RU" %$tE]@keI֡6c3ܑw]fLB $[λm4:nˬZM"*"E6 Z !SVvkm-a7*ճEw!-8p6{.ZRlˬ*Cth!!Lsy0hNZYיlr  fm5s "H\רyi!D̥@/R!Ʈ"Ml͂k[bjt)4=JEk\F"Z4D <@|Hh8󥚘SfrD5L4;bU3$X2 :5a/֘di ELHZ)16 ,m+0beae%Xm-:mx[+jpmGjNJĥĊ\d% `1UE]r Yث"9W#8dtPF"(%OQ)Ϛ٩2icheXXB%Д@Y7ˣ%֒)B EDE6嘡~t (2Ԓ9 X,xqF0soT (5%Q,F1B▸ɒ*urQLt0amb,"LGƛ1 b֪#-;R,td4KIϜ;':%k"s  TGt>k.CE.=jDҤ:Rr*^숬夤(i~LqVnfJ1e߬;.*F")̄8(Ҧ)WC{22^!kXȣ4wO8ݫSin8O41]mSEuw:IEajG6@ R 5A&&@ mL1 `kyZ0lAi(g9$KUF H˵гbNsHI5d'roMIkJ9in J7쐛=v Fљ$Uᱪ*c$;d(a$ke0 5`# (]gc&w"*"O *f3[1 ^Aږȃ #H&T5b' me1Ib--/ͽi{}Q9emyıЫA.]jp @U$(szGz7ppdMdV@c1K6枱PZ%LHk6nkEjEzҘq}ɉG Leq讑6ȽҬYrx ]A@1лeNjqmhRlj(H?hteƃ<*XaQy!'Xo!ucM}AiXwHR+֔|a2,MfUe3mZe+ɔ6 态>iB@P"I N,F#dptnr,eFp`E`лINԣ" w6SuO.10W*mK62ՔPX-=WPx%K)S$Ě;aX")bi TsP* F\TIr9Hƫ_9]gQ_>KZF(vt%]LUSlB$N4GV11/r*bWpNU0' Q`Hxrr="6*@C(IjY͊-8l @$侴1 G~Ҧ>%!ioF4AEt2桊͗qB)V*$@GPAmrl!5;AB&,f"æ\)SycǮ$I"[l_&\u@]6Kl4 r**Uu_->ȟƟ5>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>=>O/ٟm>j}_->|OSε~zW!'J7>z}Oݦ{IRj_k7ۗOyi={iSOdOm~z}k__` 폞` 폞`񏞟bؿ=>/Om>j}iS{iS&{iLO?->o.]{RiԿ-*֟5>O>T=?ߓS >zUw:۝kS2iU/kOٟm>j}1rz}{rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz}Rz~kYo+2TYAjOimages-actives-html5.git/src/share/themes/game1clic/img/close.png000066400000000000000000000030671250410645000251650ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs  tIMETtEXtCommentCreated with GIMPWIDATXՙk[ƿ{gnӱ0 T鴚<EqѕVDžhnʿQ|m@cR 誋EGbb)Nv:wIΝo9},"ar]w1v1v@Fa(2 B={yފizkH?+%JiRzGQ)B.eSyqrrrNPQ널B=B!>lw? X. E?$ qwlqLMM},|>RM*뺋j[؀뿩16'? J<[:88#ɴ:PYTU}<Wpg:|>LR yBvf;a&>}n|*Z X.jv/&jիWXZZ:r/\hv\.ߕpRjVP(sBt]G6HOZ\gϞ%ٙ $Gu]H%YEVCTBKmò,4HmX.RZ&tBC)T*"Ldi- B8e)6^x۶\GPBE^T.,PJhٳgE5x=C5jKFFsϟh $!44kYa ^m#HHiqdPsuD_~^1 Y[[KO}b{{{۶Qcccf]#D۷o]ႽD\Wiccc ٫fgg#,*LMׯ_wMwD[3TaݝN{[r~ 0hЦ]AM2bAkkE-EQq!0 8VC}@\q`stymb-v׻%QEyk7֩yoq^ֺ0\ 5xz@[```|wG PMeQ|}Ϛ i0M3-5r 5Mkz9*Ki=x8KqΟ]j;[d27oRڗ\.8bdDs^4MSP\}}?Q\v DBW\W:TUsss8wܑ !GB[cnnҾ5ʻgffp۶m?:r윞~8΃`v"qF~[?p$<d=NRl۷4 /u3̟ʡAj FTUic2D2/^U?<L&ظbh&(~%XxI\]ظ-;3>Co]B4IENDB`images-actives-html5.git/src/share/themes/game1clic/img/eyes.jpg000066400000000000000000000027011250410645000250130ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "i !1Aa"q2BR3 ?jzݙ]:0%:q g/*; %?xʸXC+ȯB,FjlWVqϊYZVLmQieb|zq%u>%=:]9n|{+ \_F{ {ް~Vz xCW![S1tic~S`qm]S]\<4M>hK \`ao1UӬh+IAHerY \b婖9;;images-actives-html5.git/src/share/themes/game1clic/img/eyes.png000066400000000000000000000031451250410645000250220ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ˧IDATxb?.Ā Kr] 0H]:,wm'@$=`@CZ1 $7: @didf?"",dud4MiB1q0U⊬ SBJ'ǐ؟XZ b9 Zj$ πxo$ŀ%!}#dk@ 5U=Ԝ7"2dī)bRߤ@z2X*~B@l@M˺|bW )H#3!XOb PK"<&2Whn$E,B-d$'S@]وTr_$5V1o8ʖRԣUG.O$ .b(j!I2І7(nPР;A'>K@| y>ޖ]l؆F=FiAh@H 2Lh B}@bGGJT1#T f@Π{abn/ kd(TNJ@߀;C hfL@-V"?9"PoP3 SAXB>C2>:MNA tpZ gZ$5>]x pB 6& [mEhVD vqo@6h#xI5!X[*mIENDB`images-actives-html5.git/src/share/themes/game1clic/img/eyes2.png000066400000000000000000000034021250410645000251000ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp L!vIDATxb?.Ā%3p] i:~({X>;l 9fS J$w$ /@<8NF( @M5Yȱ␄"̽F@| K6Bp ^yPZM<'PZT9@*>?K} g~ hB-ħRb@ S8ȱDׁWP ۡC3/&g pw @V@|CFpQh[6R@|٠Eo MB">@]XbRC+XsiRk."Ak-sHbX!;G[ErjT%@_sqMME\)3aIВ# JG+. bPKCŦBqZz"~  > RZ`ta 1 !lT0kB# <[&Z ~f91u>B7POՁ8jvb@Aj)T' LIq1aT|AqBbU>5( ;NJ: {6LH#S؀'c ukZ MjФWq8Fa;8 bL@ 4 IYX$DYI#&#D_| Q(zB'7v]MK<#&. R&{Ww`qYhqIV;*Й1V~4Hx ڶi$_"|ӦQ<>v, _I+?ࣝGi@Fс_ b4 [J%TނM V0}Hxol4gtU46ly,, L[7>$/?"* "/t ImFTV=i&y9E2;E!'ܷv%iFOoBGGcn/@3M4QR8NFPc  AKH,s2]Q>IENDB`images-actives-html5.git/src/share/themes/game1clic/img/hide.png000066400000000000000000000024361250410645000247700ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs B(xtIME  % K.IDATX͘kU?δ5M7٤䀶'_D|4Kh~?OTԪWRMv7+(Hdjq61͌ Lh,ΙϽsν(eYHﻁ@z,_ȹfqL%xxdfD|\Pg,jck(T[pOo!~hiYa㼵Zy^\NC˲ފRRE$o3 iCD=0 "^& RBmT*Ja$|β,,h\ϞQ.q5J)!'fsL6KU\iR(p' wKqkyJ%l<9x kkkq${nnq"cM)mۜ:u uddU qM$8NLP'\ץX,b6Zkd w޸sYDN+˲n"z=;9::gܮ{z. \p7KKKLOOǩes]:lv 4UJL5Gv\..jMkkkcrr2zv1СC[*bdd$0sRT*bY $|Zk,f PJqEfgg\thok`ǎgϞX墱@;uXR)rinQz{{gpgg'\nӢ&&&HӑֿV0 d$LLL`a055E&R d~dduuXt\.뺤RVQN!F^qWUy^\sغo9`m9"nqcPfXu PDVSUDM/ }6|]D2PpGD}00~Wq:hKZnݲ#초"TFҥK0ؽ;  ;̶14i- +ÿ8U$iE+",I. "ZD*aH␝mm~a.ଈ}OEV Z} {jygHj}Dǯ{r̎fp֙}ǚӢvk~gM}1ưhIJ>fZF/8+ɲՆ[c:E:dTGIk~t܅ĸ6°)DuF]t8R!vhЦ 5Pp;QW깚ʅ}Mi DžJ:-:kW ӌu.]*FŚjX JA 7ѢkfCTLT:l,ĦսI5!LU^kͭܢ pYwSRAd<}Bhup_iQջ 3 +F[ց~Rd+5£lnBB .2ҀFO>u*pV 6p>)9Z}R xڍq 2hl ಆB ;cex$\gJ1X 1VJRqj Y: q͚" `\#M3B[[KS6O'W&-v IGMuٔ;jb`crs}θM'cgʞj9"ty::TtL)CѩF] EʒORJcA M"u%Jj!MiDjS -iғ$q\(9rscp 8Fn3)tAܲ<ABh+tThk\KLj#G%Cj8f,a_+qœ4# v!8Q9ɐo;~Io{g2V:MjC#Q>) r9|/H0@h!w@!ЕܥtO|')q< t4tO4yP (fw4N(0D z1Ҭ1@3+\I1 Ajq$ 4ZoMA:c<ʽ+ e+`,UkIg^|ls1$Ҥ:0 "?LO& UdS\?23aG85-IVhF'<`k>uR=NsG>]ȯ9)\.CI0ŜRĒA\d ɚ5&´9ڑId>H釼$1j6’v07~w?YF2㧗*cEl*u@|[|=iL(0ĵ=n.]@(pCArDt 㪜9+npGL,w^T KdRWOprb-9z:{OLԋwW+-;? 6 Gv6u)KSWxvf0FX-P 9 =\*J~rVp~O79SF̈<%rjVcۃLMt+tw%?.itl!3IÍO10EY߉72Umd$TYa4&FӨ~'9ߛ6vwEZ( $V9/ 1q?$ڠTVȴ)A0DFDŽpI VT%\R9d<+h9egw`z­[J "!it.VÔ$퐯0~~#LF<# }([eb#]/<~^o0MKcΊN S2&S4 swΝ?aKOB +(Sޙ^~pZ/ 4ۣBݴj\E8G8:zomK8l|;kW`֋W+od~Nv\>&E{J~r MZJVR>0\DtCHTm4rV6]e'sJ%`dcIo4^VJήL^|!9DT`ߌ0=]Jgo}hc]n}fQ9㷂I,L'Wo ;?v0~Jρ Adobed         #"""#''''''''''     !! !!'''''''''' "`!A1"aQ ?[I7 o3yxnhBc'`%̉z͈5p4kֶRD%d|,^6ز* L+փVrgJ[iPqp7=qV:YPW1>Qm:7M<ԓ(0m>Vzimages-actives-html5.git/src/share/themes/game1clic/img/infos.png000066400000000000000000000024221250410645000251700ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp *#VIDATxb?.ƟaD 0yN@8;k,#2 :S#wوd; D@K^hLL3?@#6A|A  S-b-~u0? i@ j̓8#'5bb5!h4S˘uw->7RRe_ ^Z'}X!-=hg?0eq5ia@ߴA"ɪnFKg@5Άm(zlc1> ށqP!뱿8Gdv9IK i8q;1Gc( <2?G=7%?Qx:'CT֫B?rG=F$0;^IENDB`images-actives-html5.git/src/share/themes/game1clic/img/infos2.png000066400000000000000000000024621250410645000252560ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ;:IDATxb?.a<0EgB3I FR$p$N+pG $Y#q՝ @didv|b&RmD?Xޒ~Ɓ r";U", XH [7Lif? i2Y!=r$Ѥ4|}6|-#օ_ܙe#7RI @I?UL ?0ujNk*eH ZFP`w,GKm@5Άm(zlc훑RhU@&Àcqӏ41m7{K i8v 1= jX7cc q!_sc7=Jc+f6 y|Hz#r mݏG؍7qIENDB`images-actives-html5.git/src/share/themes/game1clic/img/meta-doc.jpg000066400000000000000000000026451250410645000255460ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "b!1QAaq"2 ??֮\"`eZcN@,6I /;mȳA @sB1`!W9iKoDoy~wa`\l„OSXڋtm,:J~0h. "N|uAw|z bn 8H*h?Y ]4MoK۞egm0ZIj4RxS n\tIrjd' g:IDATxb?.[aF40#6p lb$ABrP'K .p\GïIrx. L DN`s"//E?g$k9 CٌDv[ڲD D\!@O~b)jƿ@, UC&hz/@ C.8@,bR# %&eS#DO˞2k ~K.v S/XCe@mȱ g6G=61{Laćѻ jT gЪrPGبh|cRc nTP6Trއ?hqH1}6 3mhdE8ঁ*IENDB`images-actives-html5.git/src/share/themes/game1clic/img/meta-doc2.png000066400000000000000000000025351250410645000256320ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ;IDATxb?.a<ΰ ,h}qg J 9fb/X]$;$>մ 覽z@PaT"K#U @j)z`<,H 7@\e3\٩nH.`!X 0~2峠AZsRԲl3C-f &$Gnk XT@â g(l9K8;lS#=-{JOˬ-q*Za"@ S49 j 7C2k Pب(u4q FmD`+b5* UHl-#c,5)Ae)CIujX I  I-#A 02*h,@x@Q CxւֽIENDB`images-actives-html5.git/src/share/themes/game1clic/img/nuage.png000066400000000000000000005102351250410645000251570ustar00rootroot00000000000000PNG  IHDRD;VtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp G<IDATx eYZUWeUW> G(0n$Zͪ[@It넑<**[v 4GM9Fg]@ݺd>(wq(C;* ~:|"\sUi)w7| >ry Aɣ)fTQP1n9͍XBz|I2.zέ gR';\G1EnPc )V,RGPNQkY ~Ev:O<"yT vU#yY@*Q˨1;||7l8hG ! JfTv$:G8>=[ hƇHߑ*H <8e@{ U̎2@!T{77wQӋ~DREeLyz:8pT~C1̐y@2^` CM]kY1u5=s̿obK@Na3 z٭7 ɖ,.ZQuU-)?C"7Z tA~?an%:Z0T4ŀ[gV+FRg@ǡ@F ($@hcHZI|Dй9KFp+ˬϏ$zwa׺{:UOG5@\:sXφk _U^3/p<IGʩ;d>`ȡE|Ry$\xŏ{,J mCz 3":揶u2Z ;4 T璭[źԊH̢M@%n`pb?1M@r*P}O4B"̈1{h *Y ThJwBJЫ\EĎ xiP\pΘY&:>ÛjU,Rxp"=d $I2p` 33 ~-"P%UhxØuPK@#Hu^2_IM,n=k^2@q^~Ǽ4$BB> X"I G(눑m,E $Z:5肑<*r>"yPPCa)I$7j? ^u0 @!QFe*:VڹbuՉZ<($8;[b%60@8Dr$:D(@E}%fIGp|Ƽ{@1Y mL .rs Sdu"NT|ԅ 8s|51@KlHCF(ϨXM2_0N=N.@,:Aɣuߑtܭ)̡J$tK4J@y/T KCLTPlsdp1ydcdٝ4BEk @w{pN;e@)!hBU+Hj7{{TIU,%.ue=P_޵}4jS]$7)k2#aZv8Q>%%G#(Yt׼$ F 7AkfPp:%kY$.Zcj2{~T C#") YCub ={5VY#ywUW4A^HҲV0Rɤim ̦*[n2Lyd'꺠:~Tz,T1Đ>B F?w%T_:kp+O-?n$@Z4nf~.&") n=.?EDgfP0nx^y-Aa<'Qu.#h: m`3T7 0K*$1>S*gI)a,J REB*qK=*~Ƨw{ b꼟,EL4Jz+qt(+yO*h.o-x<)H0 hNU4$0Etᲂ9RN&1E(Hvx ,$K$ô)SGF;{et/f̢!iG2I0:-g }^SI1  ﶺEˆ8\I ¾iΐﲇdJ9WV"OO|CGw$ +D:J"Hk>+Uhk09z (İ*OaM]C"7Q'-х !#BH*Wy |suO6>y(8酬ŰTeAknP[sSeI$PRI$FC:: h/lO 1G{ ߹Q [#hE Hs+- 1D:% (s3ĎG3Ӊ%4 CQR{t(8h>@ !%N?a>DnP(Fs[ %0Eh D󫘡i:3NwU29"ɳw[.?=Fda`7z-ܻ@Kfo (i-ի٠#|^a風YLI_! k` /aT^񭛦?ذ) wggZLu5χF n)| >#CrWL(\;YG ͆dpz0MfPpTMQMC _\0*Dgq5>o4R #0C@GJM5n [rmSIӷZ*&ymsniRl:ϺQ EåNb*t5G6 Y$Ӵp J)qΣ~̑;T,h;HAw2p;s)j͟5_y@tu! x$KƂ zF:qd;a6Ln'N1h9]u ),}f?@ pU7mj;.OH0,`%\bؐDbnz g?\KޑMCzQKED½x^A7HAg?HZf6g'%1ώ||ZJdrHEH_wP@S׹`u H AzPHZ$f}hbw6_ Kg+΄d(eV"Ih#FEaVP@IU DNp (aPT8`TP۳-I DE#:s6yc/J)dHPKfD:mJ=հy2l lKѡyt^TK$l?3 AJPHC"Qg[1{,3B͚wۘU U.!  HcU+ x8əAHAC $HAs8!tR60ngRQѼWdH>y5ޒYBs?[HVn=ɞjvZ(>e^Ok.gH ",` w!ōgwQ(;^aGs滐$kw ciUZW2@H]|IIFw H͡b^)-uVL/X BWbvB7w12g7WeXXgg?P US,cXCr_9ڊUMUl?v#GdfHNw}ibI֍'ݰ)Fq $J[懒+$deVFU#@P`]f[AJ"1P(${@8|JΨ䐏~3 bs'ͫj`\=NsW9hx4JkrI2EϚ׍>jTqUwSim9Hͣ$ ݠ](;(JKrhB'y/TVX$ p1x< %$Tݭ ,+UG{=|t #;0}l P(=8h58 UkޑHC9s*9 ЁP *$3(jB0@:PncX9l>^>$Kis(܇ hT' H %Gd=U$G*{H@N%T] _C6 n]7iWu hh%%eTwuحD^c 0hzgGxEw)Ww03OWWnΣ y@G@ u#]5$p}߻IqKȆG69B)L3l4h5}a$lhz4dB ?(J W@hU?m^l8 9@Kv#dK7a sdS4oFrZFG@RDAVUH[OyBu&ٺ%y*_ Wz|2lKh/;Uq"]mmAI5P094J4+Pus z wNG@1  ͚#y@|-^v1 +(*٬gK A>0QLJqzh N PR]w )1DXHI);rv#Y{K:i @j~%e'zцo.$$ɔC({ C|:US$:2%Dġ@ݔ8 @2[2 ly7D`h=Jkm SĂ-G 0$Hɡ@y'"*N<2W~fj$`ЁXPGY#+y$' Tpt#wŪI֡*u=.nh™C7$`tBq86 yG7QPЋ$lX%ṱ3{pL8YTI;Iih I߷Z(i(sU;WYH9S탚})hnp3$19(ZC%8JBl2H:GU}|#֠H3U(z85bu+G篒o$ ):!~JFn2?" "C HAL:.ȳ%&E@@%|E yn 9e:sT֠@j#Iq&|E9tO憨\Y=V6Hq ,ҏxʼ ɣ$#0El~TG1EPЁ9H@U҇)Aݗ*# yE#I-?i~1ɣ죂_In[F $d~#-@W!w<ꖹ.6T%$֝ kl@rȏKl HR䑺u}k滏(@h?٭OUYA 滑e m )ivqS(ub, T)~̑yDeH Ht0M/\#Te~ͼl!); 2_9͡sEIs@ xCD $ 3 .11`>J -j }';p]fQ^Er~z;8@ $H3[UDf$!i+2HWGh_ɞF³ $kS|SN4hS@Ƒr9rcF,<hBCSIDf~9jӍ@x:\HTځYFsaXPL,$Tu{ ĀG*A3~݄=':}-{[(8h*:R% ]%2.&>?f4w9TIH5G™rs$:KFtvvXFpȗ,Pe0R`!딃/{-ܷ:hFYHZpԚM%h4Սt|P@@((N%L4<)-R*P?:+)fPv(tP -d$U[F,Pyɺy%x ? sJPUiF9i.@hB4GsHNݬ71E" |-L #u ~,@>ό3dЪHg6ܭ)h9NB$-F1$({2@H>G GfԅtS$rFҥ7 ӆ1C().mLCɣcn=ex{X+uj@pHu(@u18Q8QFR*S2m vh%UqHyT$]3YI EΨ!_FdNT!. I@B'T/YY61IbI=.2\dBՇ<M.S*/ }DI ;>R) c>$.JΕmbXJfS4 @7*5#DDSN}JF8RI3,Pq™.VU3k>.`h94jo/Ȓo3|D^Ou_i$ $bP ֪['Ѱy*G3s45!HT=3vdpFRa .Qq 䄬!·0FEɢ; #HBH|&R+.]  U$kQW1"NdK@S(5Ԋ:/ʁ ~* d $>_Y( )h+Wh]ts!P7ܚ MlcE][n<"(e-cvDF(}0-`@/C'ӎ.:K.<(& gĵ:V1ElGtPJ A㸑wH9uZɣq;z5(r"u]7/A s L}> sLsI*h>C_й8Jb g|:fhB jEaDEch=6ev]WY|P_LAUCR_ZFJ--%TQ{͘Kpv3i0GèW $UM%v 5z~52|&x.fc H1{:,ΌH" c@t9.ߴ }$#B7Oɗ aѾJu#q$U;]F%9!Cz3A EC=l⚥k P:lBz;8mE'EWffPZnj‚8Pv3ԍ$)0(L9^V̫;Ql hJd@jك5qΣ[ et;3὇DQɭKc;H!TA(u;8s:YRyRŭf#) wϪyiqL^s@;aX1"D8$4񡤑HnB΃g0.w$|fHPQBU+I^ .U:.SHۂ/}@N06H8t.PlhQ?"= CCR ҃;:a~dJgÙNw#@!K:Zԍך*t9aEoPIIu\Y)˪ч1GCDêbѾa$'m+KtǻOi  `xV6Q̕ 8p^n$](%Y b!.Q]07Vs47Ǝb#fTrhO5 D]CZ ҁplF%n?2@'&Qa`%[S {խB7N4+u%h( $HBў4gHe瑒ɛn]6G;EWk++F@6(yn3\:_[ Nv  3P mT(CG||,vo7*1@6cfQEGO&!gNTf59$8RȍgP7x bvB*~{.̲3Ƽ#B hQvT,"6֋B9EF{M:W#)qJQtQ@a"V/->0zҼ7ɣl֫ncHdE Ns*T/Ɂ!L*$_' u#bzp*IP@_]HF7M iz/}q| A H) 8r|ab2~U+y@cJ":T7m>t5 p𡈬wTC(#k!XP$ulƳWJi7ăԝ) B+PJSqC 7@$SP`k$ ] 4#r,5IɤSa)iA(]h1oC$1'UK~D\}#SD3ٯAE_ /` h!IyƘoE17 ЁFAKn}0bT*o"1ALQ3 ڪdHlB$<bC`%>V}\u$:Ux%G9$hE4^VpFԡ((pvͼ#QGQ\ocQw] ~5 !wB(}'@&ͫbyyټ6& ZF W`Nzg!r4oP@*b0G(}˖lRGIR|BRT½PI$ 5U,] *8YR>hT)xռ>>@/7s$QWbK(hatSs!Vl!z3Ć 'Qf%1R!ʵp\ź|Axb>d^ _5HUi7HIrg");8`QPD}MQ@mf(Oa3;;JaL) w@b^p%m%cxPuUo&=QY@`Spn3TX}&: A̺Y=m$NT>1@1!id386l.g Uek.LuoMb Am5b4xPpX $fAR]6/ {-,RQ P=@QVZFzՐH# 1Q,RS=k${@)dⳏpQI1d~@PQˬ[oCҌ (hHBI^0_ G4FTh7j4 S:%QJ] @^ `8>F'$MG|-Rf(/ł[Fg-Kw$Y792|kEsG*Gwww_,n=յyͭ7~ߨTd ^%00DD@uU {%?T)Q7گR#A"t0]@}w3Ăhu qГ~692i^3?)@LNNoڭsKKKtttXoo XwwwuuvvVFORQr;ܺÿdXArȹ}ͭn=g~{Z:&q|%Y~6䅹(ILPLj.Uʬl3)j/9Hp*QaĈΚְ[=JQN)on@ 舒Z1lرcf?Y\VKp5qD¨>OO&mCD惓SB#9yʐkUнlދ$gDԂ:\?oY./94 =c,{yw3ST7=A&iE\̌:R|l}}666Kˍuttlwuu[{?9F *Dr'ܦ w2e%?722yGRyޭqEn$ǡ0K*Pw{T[2.ڒ{ T}(t40ZH ZGcA6/ʻTw)cZ+w.//jF]JzWoG"7XↀGNrGGg;|uuݷ\w]-b;?'&3ǥcCPbo|7*a6a|Lt\7 jAvL3irx_ ; hRhѐHJ}WWWq `5xZVa;;;R? 1>>o///KmjjU2u ӭ_tF q5GBܒUP $OO<t CzW61G] I 印O}M0EMg 2FE@Gj,W X@Ø#S~}IW2ځ|񁁁vvv>qfoo^C{=w+}t?vuuͻ5o[x|ٙ~ڵkX>%vvvk{{۶lsswl299NB0ĩ:22]?Rh#GT%2ڧɭ≀Sz1GjpQ%r*EtÑHSSgw3ֳFAx=P $݇[vwwl u~˟jɓ_򋫫Th||%sLr{P.o```ѣkvvNJP@H?hI)y$̌ngFCRSF:(UIA@͔Qud Uֽ߼4Ԏ Y ܗZK{{{VںW244T-*Gj~~ڑ$:uS]]]_?$bt H eq6ǿ<ܭfT@ZUu]TPzХG 2>:.V'۞s\Pe {<yi AgMe >r˘$>[yoĐ$jIե@﹬ut_wƍk7a\f399YujyknݺU:uﹿgw#- 7778ژϞ= w|[?ēINڥP xIVt$BVnI^.uLQEtAE]/|Gf|)y$ٺȂ TDq|hs$4b2_xPc5ԅ.4nժKzzv~ĭ}~5ݗܿzvE PI1G>z~A)>lʚGF?>#<$}vQ;fN96/a3¹Ot)Fe{J0覻DU}!W /Md$n:$ҏnuM#yɠϹ+:Yu3gTOK(󍍍U|O~Wgggݻ[o^pa_gg'N8QgfyyYcCjz1AP0_U?7mj -@PϪHU1mY_hl?SfL%^?%vSTD7Vm~kb3Ca3mHjS@܅oSđ~^pKm/oB[!I);w\U-MIGjT҅7o^<ySɣjH'Of6&-̗̑C-.߻sFKW$a<BSSN8(l$A9%r" -]TH~u15kruo=>BBݨ83ҏGzíJRARfttDJ~IrNI7ns#,˧|,m}cᢕz݋}Pɣ,nMmn}Z+DDJ *=NﮅK>ԇ+'1C # Y @"TG0C g7 SqkJjѴJ;SXo>C|[ӧHEfll*wov)^moo1^ x~RƷzҰo䁏O0/O&=e~&j{Q@$n=HK-׎$|5 IՂ@` x4*\D caԱ.eL yGYyr$F='*[d J(}TDgg|i\"kΝ{~cckNuR0}uۭ7C\˗>:S}_Gb+R+[GSA^ĨDh(|J$!5i S@i(uĊ@RE)bfp?HVFd⬿a8q՘}ɢFB__ɣX]DvEAM ;;;<<<|~wwfgg%u˩9oܿ秖ӘAH ۷o? 8 |t*0|=8':i苷T%3TA {suǃվ"=hzdcF@+EsŲE_e 9y$ɣX[[~rwRQz64KjX^KxՙQwhmooWOn}ѡ?q'-[rH//vueF>H A ]rrmN$i*a,8$e'3fƂ$U_5YDQupnpm B]Β~=k̆˂O(û 4׭%N8_jDU՝;wp5a400tLɤRT]՟+J ޻ݟ2HD.^xb>Ŭ$fHNM zڃ<(@UJڇW'G1G)+7"hzOf?7I`Yt&~ (6@J7JM* Zn}wÑ#Gun|ZygVVV!T0Y픐Ҋjw~kRxKwXyt8`p/xfEARm@rKfTByOjP.kTA[n=cQXNBUyM_w#ERO/h-DJΚh? ɳ{ GFFr{JA~O%>\M$I2OInQ󝙐2<:>Uo;Ԡݑ}P=ə/v__t)tF龯yӆ {7۝K?}7_ȫlZ^ihJ&OF!i HDlO`x]HwSS2@IEM#<% \ B6h%ɭ?Wwvy].W:߳d[-IWIzoo_.JƓ.8. :.F*=}Z[[;ֿ~=9}Zuwt\sܷZ/aeHu!j~*UE0!w1 w ѩb~hzZTLD"+N!g{'@+Z sZ5ɢ(%SssW~fkk0RCwp:KVEH%cxp/νa ڜZJō;H-wH~Q'򘙯2X%/LBt}ӌ*%T^tͨ6o` $fVBHO'x$:S4@J?ʨ)JqQA%Ldݥ?y)H !+ ' B]%+`PTM\y,}xj7ڏ9R kmP*q+vwwpm_q_?c;>WXRsܹΰG<8p.ÇI{wuwwk 9O'$u+祛7oXJhPRQ`* t%"<بp[[[&=u wxs<B qoQY] Չ=kJ^Rv˰:9/[1`;= QGms>oUMt@wp}:)ytBQnOK@ovttQŨ,rVZ{[5>hm%K{ljC^FGGoV驾i{/Y:f,2Qm׊zm6zyf Rt~xeVG>nF2<<\H捻)655UM"-,,+gܗϸ%CirD$]%t ]2ʡ5h$ׄm )Z|m#(:M&P*l wRAX{»NSWbJ!% OYEӊ%*(e"%TXߦ%6Hj44|(J˴h6'eUP&(Aou_qIwvD. yH;b~7nTˉx:4M$>߿>rWŒ3>aՑtuު+䪑4Q0p|p(nlUe:#TBt`Lp(s A'wAzY w p_U*92XxJ;ݠ"k-DkXA(5@1$zK7ww~˴ҪK|LRm-\藃7fxrzzzv:i1( $!~zuSx%f|vjݻwy}ϲ@Dt=TH蛷_)YJBhMAU FʮT> : fw3gf&OSƬFj:HBc#EttwwoT*{Y"%9TbJ>)΍_YD1aCiHTɡv_2-޳G̝Ijpxʰ{}ۄޞU| ƪ9xXr%HɣʉF$j̇3G/qv1BM?i<\"LSD8ה? IT].)iLQJ {fW9$.TߣiBAjI-`Bw4l֥5m$w@T*^,TLѣ,*HW"I $Ų8"ñclvvV]nv8$-Uj)U Tr9+}UK{ݚQRԥ7A~0yUKH..8џG ꆺuV>= _~Wl)s@{u߉ Dw^a2l0rx'сGt#WlX cNK"un.L o[T=شKzQLZXjatt/#%EȴYm2yN˴։o%n2Oyi UFѴI[5 xzz:QzyK EuG}Ϝ9SmOL[h?П3|H6/cKPPo6ݻ,B;=c^^}+_5'Iv%,0)Idq&=yH}Mu$&&''bmmE#"oTG1ߝeǠ %׿Ͻ?l!afK1z[%U@sr4zV6x[@ԭ hG:IUI]WLةS3oH UᬪxC"=[ gs )p0OXB Xh@J'F;mL[\jb"ӖZ 4 Df5qsVTDuI}')6661D⥹@ U݈II EE>ds)aޭowCsyhe~ T j9f: V̽<$$;{9HÅUcrQ滑Ct38hrH =9 \FG"o 3gK.Z]ZZXjFb}ݻqUh7*bcǎ*!m|G3ERwϹg'Մ_֧'regϞmyV2sssV*yIj&3NyYVuNbHu^ _`{Zҙpc1w[4vyE)@dnq@J^YY&51䍉 !T:ܻI,:Sg @]8λIIrUoXXІ{%HWYFX4OYcusEpYĉf"s_`{QJȨ*!y1F1$G ~~_12<9H<c M GYR#*d\M+JJNz fPusՑkɃ[]1hk\\YYA,b3ϟ~:#041/_:DwӇNKj`hR`w$ H AcO I>zԉEUJ&r߭Y(KOVA$iXeo677jŗ*i^CK4h(!ͣnC%nbPWl-<I:.(fhs!W7sl,ݝu4kHGB|`yyY{VK CNWq򍍍";1y%{­!'F>$~ͫ8| HNR[]]&$ XԞl5Ў|eckќ>4/E隇)j;̣|hejt:Pl 3ԍoAC%<;B\.kkkՙND^$ Ix_)KP%saS!;mbb"jQ!GgԑSBWMMMUzv``n (,w:hJxʭ I;hI\5$*kAq qH ENFX ~|>c!19Rd"Up'e233ӱ*o_(u!A |vvkTommmLv)( 3uQ*$G/U]WL[mDAp9zխF-gy)' &@ǬjULQ{.u!iWG)-rϔ|$]# $]p DrӅq$YFJbcggKJҽ-mـIݗ:,c_H^(~VkgZDN@R'RZ9@D ɱ1/l9|(#8:o~6q rB qZ!wJ#sn3Mټt4zU,4mi1\6/Yn &8Y__j}j rK mooE o e u0K?coo/oCcJmmm}hrBZP`Brvo6&i9զ64HjI ( ȼI٩G)R;7CW0C}ɦΘtޱz˭LI7Jⴋ!:HJIB&W.E?+ѡqjƍӜ[sDrY{־ @>cIxl&G`ZP|dSnSG|Esfh OzQ jgIoHAG'RyQ\@$FT:ie2s7uoYĉU]՛7o4ѪLоk@ П5D3_QLu")K-(Έhz3GbJG`uQ=<2U>9RG$-!ir %vvvJEKֻfs]H~O wD%*ݳwرc3 ()ϙCҮM^tK;QGdskt}Jrl*@~?yYJTtΖ<%1pЂK.nG[^^JWu:>>KI iT9)րeS4TVv1I[PoS\2jA-?]HJ 8}T;l>FAn%$*y¼lI!e7+EHaHdp;֗Ek6:wBWWW[[\.#oGpIڎtt(ϺuaP%C 8:f/Hdny¨il\i#*:IQddUÜry=*9A춷 WHBb]]]O` yh>RUqϸ9%t-2Kdfh>[2CGfrt IMAus+JR)qZ$Ŋvu)k!b${NNNm3٭+niȚ`֟՚٢Cp^5BN(xҼ||ErjOBW^k8*p/bdA=gSjtK:ӯOȲC۞rL@]G͢z jx=r`XQذUu`0%>̼@lKJ<$R#h&@ûhW,ͰH Q}ed1՚2)2|kUs)hLJ2_89 twwK* uٴkRiԾV_tsst\=$&$711Ì'< (Q 4<Λ E)d|˼ 痄 GAAͰ\{7J5(KuZ}l_AF{ȴy9aCU<}dJ^P8RDݑ#GKӘrpa\$,g ]PGn#F7?( >Gw(J"d |B $SJΌQǭOCzQYGq9 Mܼy422@2(YRggX%Yg姣%ݖ7R8󶲲r/q9OSSS'0m6 X*ku#ubU&-"vsc9ޟޏ&k}ӛZ}fF3ofzr$ה;CC%6Kc\8;cxc!]5T ~73M.Zjs}WhI->_[ݒfQ]aiٞ 89 gNSZ\L{dGd >bzzzossaf07!mZJpX#9 'fG6ZXXj꿬d||Xp2) 1uf[wQBu9{\Y>)S<[Y+0q*}+0iܗL38f333+}}}skkkDisāaJ`rQBR=";;p)܁U:r GfS@x;md]^reRF Eq4ߓL-dq$\рeHAÛS{xˁ15q{R'n*b7p.LP:DY!9j6, ~cwr>`fv820_`'#TڼUa _7;;FRIFIHXX_QD_;ga*CHE͔jG^\\<Of8@1aNGh@  qP(/Jr79#4 *[C2UA!W»KƁL&hZ5'G`ddDif8r@dq#Z*UQG p2 dF$:}784o| @q@ E>NG(43Ba1qRh*z3B}000볳h :duLޥM2 yUWc#s.;lzYI5NKKKB#`' ⣸YHz k '#B'yAf29m(y&YrȻfFyDbOPIR_(g󳰰p𾫫kghhc9 nލyg0xUlnПL&;2QΣ/J֍eA xS@#U9-[^Wa 4j" xE)kj:NBAr* tַD"p,4hٷ ߯t'leoύ]|tt8h3}N#T@c:֔Kh>vB {ӺCy8p/|S@! L;cU܈+#mq uQHpsS\lB(dIJQ40wg,3/ߠ\,3+ tx(@@,P( Zov^aBQŦ\D"!cccyOTWɪ(iic"M%_뤾G{c lD")̊h%'kf#b׾{"?.=}ac; ˒X F٫mBPu}DB{9o[֝>>;;[cccs]]]Ԩ 3%nvѫ*!mX@Jӟ0@Bju:eBN:_ᔴL&@ZV[g[#DQA:LV5r9ewLXA* igʽ~ ϣ))!ĥP(V>gG>'V&Э}:`A˔y`@t/P $$ d*E[>/4Jɓ'׮]}sGB0x:#bB@:1}N_`=ntlkk+|=LmG?HlsL@qL!nOԾEeR G00!L9U .m HG_iUs3jx%,:3>`!!P(??᳢SqqFpMTJeUZpG92z߯_tuvv }dQawwWPZ(p :g !ōGh zi3*:x 4HX$,a?a6, &G@[k~BqjSs*Za%Qr`A~Gv9!Q $ 7?{Lzzz-& B-UΈ}UFaK SïS^V".V%ohtt4I񮮮FQN!͕3E U0)(A;ž''d!Ix*q`¾h!H ^18m dN\OH) |>ۏEKd=dFvvvdqqQ&&&Ϝo}>[e_H5O^O[rhGDX.$b Hz]6pJdHbx?^$_[|/+H>mNAYHq5-AoK_:Vtӑ|65=@{ :!P(?=q3cIgggz@2_y_ "%^QqPw:N#sCeP'7d]= yۡH$ZMVV_yduH#Fi $Pp@xSjšBJ,1'$ܔUcrJ]oS,9dC:BG8pآt)#]a2څ<"$ J{rm%P\ Z=sohh;1bّT*Bsߪ,oi3lem`,Dʔ3^ukVxA1[eX:Jy%>Ҫ j%?ӻϞ=7n`c8HpGDBB̘ Q gR8Df%T9~q ()T) (nP<:Gi 8%q6pMIl KbHg3X>󛛛!LR8V : )ߠʇoЦ(ҦIg|J.0ô_8\:UgOysð4uxP2ps쏍}?G_$8_2b ~.!T1Τ+*8{NҎ&P@q轧!|nBҁz>⹤gKP(S\mgOeguDȎ_?tk4BB;d![WWW0lPx guv4U==rA d%AF;x*?ʆx@ NkߝN433:l︮a'<`-!dG,,PGc24Qf] #u3|jHܠ> <B.s"84FvRMyDg?7A?Lo'R;Zط6%HHH^U#nY:ğ7HrA c'&Hex< ,zzzםHۂL$l9в[Dp*Kz6ńT(e]E6T'lt Mr:DdS|G)A{c B~g(]]]-Kcd`` ]wV#3zEߣ-F!{haaԃ#RD!8+W|g&)ÉSVzF:` ~SAH!\oUA#P iT8D_fkaB* KBidTly6 zIOf)E(ҌFEg|PHb`E?2}n) a2 IN#daԥ$DDT# &1($M(q9}r;;;@S!GDҾTIpwJ!PaM$*$"- 9i*qt]I.́ˈcSq?gͰGiѨ/e4R`IXr27Tt@;-?( nӯ6uêhRuҔ=/E# $ FB/]?XV`y =DB 8)Hy= _hÏHQ{剸 x5xH(WsK—AΖftz\4ߩ$4tH'FYlxRdTouumkBYr[Qe"蟛V,27XrGׇctCs1P+8 pLg?rzeeSHqt'dn'YjOcQq3atFQdž^,CHJOJaS xGzdJtz r:hkJ!}L壩]!)̠;JFu(>@R{m DF񴸁W !(k FuUc6bX@,LB0(tdҸ I|6U aEE~('g}}} ΝуǾ2 D?ߐ .u #=HlSѱ2xNF_Fw=lꮄ9&tT+Q|~aY PSL勂5gKc_uTQ˜BH@_r_V= ! _j*t:õZr]\. Y_xҟ$2t a6dN7qv 8g b:I8`gө|Ճl6۔߱ O8㟉uV"d%XB $84`eAQQt"C>!Sz | adhe=w1Ӽ.od#Ca%=L!NwƟwƗݭ;67722̬'Ac,pu4䄣>o ^?Q=ȼ Rlp ,~)6J挫R}:Q*z}}k{zzdhh‡5m)8㓗wj$D1n  30!Ѳ#Dz&tGd.RvAt[!Vz}|\/c$!:/zORݛNa"e !AJ_opI@$d!\.K"v.J -|z?k׮]:Q󙫝T*}y {3 p!ӨO;LFH'l*L& oH36Dboo?]__ 8Ny|Ak`C9g3Ho )IgI BBxg ʢPp !,W riKm=\'n@DIA0 mq %wGUnp$m0~IR(ewM "46D_i /yU8 8BRjEg-D܈׹wϥ#`0s/Rs*KP"^QN2;WjSsT*;^eH$&OgBa"|_266V$"ԝhqTyjèϱ.@Q't vtT*}??N#3I8NӧCߛ瘫g"@4!uGJ[ ҁ _5=a 3s*p =n pMKΨQ=S=]3 :*#MqmL(TuIB ->;.dVDjH [Tr~r~o;I>Q6 3m0ѭ< k:L!2gs`0*\|` xp͛9Q 5V2I%]݋5^| C7UA Ӌ3yHz]PS8N^Q!ۍK9Lp6GF*8mL;cFZh%&3V}o"Xq^HDܬJOOEjZwdJ)?'0Y:eip&+Oq@jcD#(aX^^C`||<ԩ-f %`[W8vTB p THz35Ω8n-7vLi!uĩ{G HgT/6+>Y .[I |e"Zv()###m덴.KKKu'!#9d27tK ):/ |\oTeL=ȥx' fTuU PBF"5$BZ "MiIc)&D%d"!e*pQūqd«f1,w0diHwr2ycI]]ͭG[[[zG2uww+W peՅM_t 5({A.c*P_?DRS1^pXN:DvҬEFL"$ػd#aA؄SD C0#ږ5ó5baF~ڦ&Qɓ'=TD'͖3LGWWd0#6YH?"#^0(Ih, 󛜂ς>Qz3 h|%9þ ^6%0 Fzh+_uF!oQx:\eanSEaI༺6L@COB 8J~z꣨o $ھ߁@H8,)04MHՅCe0~B/"yUw5z#N`A\AFzfI=٠ eU 1zˎU>:|Nh 8PecVoB!! ϧTT2ֈ[IC+!UH) C]]]ߚNe D5ؓA~[\,8Ij!JUUa^:,UK;j@IQNKI0?="wrZ $ .ؘ7CUپ8Ɓd]zװY>:Oг .}~yUc[|TKsA՟I A~ 3~"׮] bTz1 t˪`t8O0ofuysZՊW 윴h G2kbw4)1bp3/+y` av 9cIXRBځ,]0SaDb46S(eV=p{{YHa`4E/mUaDO8\ڣCȹ1 @)AA?cq#)qPD恄8aҁ `B>g>=Jų_J%YYY#@"ᾸSF  z -T6'$*9'%!К?p6M!g8p'nnNGDA^{1/6Ͻc\aG9n>[`#+xd?T9 Ka&F8 FDMus=Q\)|*+W|ӧO٬twSWP8 ԛ@#"@vUivY+|oE"^qn.P6`9-Rvp޽L ,n|H8F 93NE8n SZ "EQ6񱾲!4NR<o٭2!'!T~&ZP(|>(?\__pB"7nHGGe;qd0%=v\raQyH\'&#P_, ~oJYP_ѳf0bP ;# #8XZLf4 Biʯit`~aVB 7!TXV]vֲDGHm,;/2#?TJ_.Lfe{.WSRU)Zz {׉DP0,}s'PPUCԀÀYپsGtkR=78Lk8c;'²݄r}{ z({d@ÈTs=lk:$=uGߟo3ҁ@| ...Y:IHXϕd0"+ *b5af\p"MERGY;|k1)NE}Abwd!,WR.cu ,Ipp +}Wb!0 ]'Zu1i/jUĺײx/k6q^_jmp"]vͶrv3_"kF c6ľ B.HU_I0gK@`) j HxA1|UmOIQxq[hl9U=-XwKV~Y8B),R5ul9]x@0=m7iT{GdoR:C#$_s^~}uu~dR\"]]]6?_ "L)I7]" 3NG `,n s*u|@>v8Z<0~\W Yd1d| |P?D Ea!ʠz/kYI+!u" M}_ү%*Mt FH ϣIꭅD"!۠s|Xd&Wy'cЎ[H?bpD +@l0 9MM9_2W$kRkB#_& ![?qƹ) r|-gʴ eN!r .}̟ͪ:9׳hCm;>Gn`:EH C'2;;+;;;~+uRGrNzⶦʳDqA+煎fPl8'^{x}BjI}7}N䞎+ÐnT* >Yڤ)(g k@/-B.{Qϙ娘E@( EO; 跅JRvBϭ7 ^y5@$$p|]1cbz6c"kg{ZP]a2!$wKFe/ad*Z!5^ h]_Υ8e@jv cw8www'dkkKj= N08`Xg4^'і@ g1z,IRM 9(wsS0(!2nGvuNE8RY >KwǝρDŽNޑq p3u@v3a!$$_ѯ8=qew믾z髾/1HM@2yV>I‘T,I;~?_oҦJ.58FKWI붦 L;CNHԕ8:*(k6 DBSUNDžt^N(4/-{9ݫcQ#h%f !2nuXX]y/2'&ЯOׯ>8`36g{t V9y^yYX# %뎤t:РO;тCl$8}`!$~gp(^YG/[pn"yB?!`pBq@ƁHYNE=SGh(} #0F3 h N@%=J}N?v(U8. ke7% `2T=fہ xb[ߛ}G:C;H~<,3\.Nuvv583>Tŭ$Bր^Ia?ryLHơ˥?cd"0FJ#^@@rQlnG'9gǻMTb{r{x;ge̎ea^CZ`:BHXI^rtt m`K|Y>F&˨LnQ<.D#/n (Wɉ Sq րFO#2> #y@`"eƊ^8$>)t"zׅ̍=^oHʮ7ʰQ!rfF9̜8:o l)[&T1x:TfFyԩ^TEzdqN@@"6{0i@RV/X6'4eHZDpXh%OFxYixI8F,K8v?Qű[3RY egcY->%0'4yahbSBH4-k\@pmg[?rר?f\1k!bER'ا-Kp%9`ԹQn(hΖ|uBH+pSKeN،-lEѦ|ea9$BA%zp->R(I  <^Q5c ;jeD$i7ptX}G\ug^Ie{ nyT`` d8ur%QM K_2rh\:̺D7w)2#%{cA H0{SO;جGPE9S͖kZH\xlOUQ`\Ҁ$"PsZ"$ Τ5Ӊp4"='9߂3^}8s֛N=ǢQ?CޒLVz7eK:yS !Aqk3:1G% J<5=zC 45Iũ"6AJN ]o3yaf)QRgYgrֺܹAپfr}6u٨+eQŒ4!`I:J9 |B ~_4mc{H;c b푞 A* .ouNmLpH=O%z?,o AjZ@ N!I2?8L h'V{7UƮeUVedC HoPd*X ٨ U.r3_5p:4B BdƱOsH}=Ihlէ !  l9WӶrXQ2+,Y@"J ;U /īƊQ 쀡yE/A普)qcBcg3Թ cCw+os); Wu="i+ YⲮN2? ȼܽBΒ0FY{UצÈJE4½3iR!WFVa\SXp@ԱkQ_$X$[Bl5MHt qY)ew~0z7X319zI}9}^n0n! @9wk8MPRC 7U2YE>@ m2C`טCi"X(Bd E=3 -"  eY϶\LxNZ1;"rV%Ŀ!*/x{pJm(F,^"mi$!J08}_Ȩ(i" zXWUR8,Y?\+K0wu)vG![|^j?b_S.ON +^7h3gODlzBTPy[uZ_.È'/~g ~Ƭ]r jk:D#D9L2ד#ǨBFQ_K0%j t3 ?%n'b#5Y&nH,PGJG@ ,bUTz!wqeUV&GXq*Rt'wus(9rD'}AUbax/]伂xQ0 RQ onЧNI9E.gMI;(0n[ ['ړց m 1G#,R=\y2ע,YG2{+Ɏ;{ۨgٗc6\X%D,0FWh=L"G H#( Iqe8=kт߫w덴&vf xMo|p [6WX#aa`m΄P^C:d0D:LߥIHd3GжI&AhC]9U-!>E  Eu!ΤI4NFwS џRS.CzנO0|類94F B~mK냄6~Qi:Lxw//!n-LB)K3Z{5y/L^R4x/B!vb&R p*=RA 2KXru}HFs†10\_uMaf(\a_es4i:@YcaSese%EL>:[UYgOF"9F#!Qz~Ezu~F< *`Ge8Zןl}N   \J1'я7 d `Yor& ZS{J.K(0.ZuM{#Vasx́U]) zXc>Xgҵ/= T6xX&N}*tW.# "#vPS|W386UVy?@!$pY#UC ϡ$WJ* alNz c5U.y\(c<{~W,^x0x?;ǟ5Yʽ08L:ⲣk7 Y O( eN!$&T>vJb U}Q]yUT/}IL9:72 p)}ev9P BRAcg`ID_a<N.q0L1D70bພ[g}-N={͐k$5}qWea.~9DφУ,ү]DlXWfG^%aRňBނ$&īKfI`"vM?SF;]_B Lϋtf#](Ts>{gd0{M! >MCJƜ#[;]vsMp`$\% !I ta0"5E*OYcﰥ 8t B. "$0.xt3AA(/{U0f/peҷCDCA\c,ѯ[f?/Βz\^FČm-}$+İ.w$`my~GQ螰d!a'2:(׈NvDW Ρ-}_t*FK*H"]Du H0%][黩LY$N )w8cb! gSe#]rAi!X<`>MqvdyȄ}WBBGJFSξ_ޟV v-S{SקO ,t BMU<#TY/MI0I`/{Ey*Bg "Q0lF( zxx\9g2gm4'|]7y!'Ҧ9? s /=CQp ]}N!2*'TV%T.Su+>m$6ЁD ^%*2IL-dD*]SEq_; mpFԮ lN2'il)U=_^[FZ~N[Ke:*ʶѡӮ{540yČ`36A!ࠞ<Iܩ챣 i(2=-t BZN}Kd P%gҥCt gxL iCܒvcBe5z3ڸE? Q3[b_=Cڱ3zwˊ.pG oO,tLY:},]^a9U`OmA3Svbt B .ǾyE&#Y4F&= B"K%gAI|8YrC}2%[6)e; wY}Ο1m5Sƚzz_ EOZT~ 4BZ'ߙt&[彬|&bdÔCY:!abQ03^P"+: K*քM,Cq8Kq1`0ޠ rQ'!)JC:5^Sߟ @?0Fdj^m=cZ hW >l aO!':rZ1П3ӈȱ*G 㵨\SF ńPϘeҊUFfЯ);@H:B#"q'Ҟ1 S7kraAg~>-mԻUnUUZ+˝u(l@NHH]ѧXVN ╢UoէWTOU`Q]> DN=+d'mLG2D6҈9E:=h(fboi7Z?3S6RFZ@m -``6>+B.}f,##@ɉu gTO76y0˕*tUPLTxΩ@'^;:Ii 7L$?Ǥ3r)Jǒ>S8&\t1B c]{xPvSEHk}BCċ45͑s*uB@Y!O*x.:yF,RzSu*i^=vI;q>P _gx[dVapH}}!ѳNw`w+Ί%LjBVr)#5`Lk# !؄1>֯aCS9]aIF`\RP -. +z>UT-]8FWN~PFq̉,NAxW!\p ޛ !6IX A]}$nT-q J|ow!U !<_*gR ij/9FØ ЯcG񚁚%N.nV". '(,zFɑ:>ցmeSL ;ڒ{?Hqؙv& pGI~GB.qT6s[ RG$1kEYS12x@!As>_(=SrD/ш: l謪 7"zA%svM-UU@׶)ʬ=-y|;a\l⿇9E>aq qH`\@vؙvO\`pPrZQf-ai"_èC #+c*?"71U90b#!A!4O R*di}){8iMUނfS%cc #:è4 lXFҧ#N0& YH*na'%RFۍYlGƋB\= iF{Tջ/g6F$nkM]y:4"KBHQM?ac@(*YNQ9Uq@&^ausY`ICBp'^i'WC;Rv}SS{ؒϝ ߤ-]Ԅs亮Ml>p!S,$.vF_{.UCLGbqYr]:*#ЁD!>%ќ*&p(!I)}B@§b]:u4[[E mL`D8>&uߒƀhB_}F•I9>XbܛmK)!0f= GFHtC6LUyC<m[$.)I^ג[+FKB'TF*OPő2q*#JUDċhW|vuBE1z=d#lFy>؂g&]8`o0S:c_DjČxe:Ug1(UUաL9k>j[0":!s(İ~m0C*=&B2N^/bnSP ==zY,I86q(,eGPZf^W[Yrq`u^ʥJd=]NZt'gFp|{zddP8LŁ]OM] WOB9#{12KK88x/a|aU~Xߓ+ d n=HuqKg[;Q`FX.\QN[bVBƔ7u#0"uՑU: !qPD!֒/*/wKOMh9(EW})q.I̕NDž(vFߖ\H|gh6x`X9 2zFf]+6$>]da=R$(*쉱ʳ B<DPW `Sf5$jR UVuw@9d=HοF683-A3G5v^1;ᱜؐ56t.pf5#-ɲE)ݧȴad#Y*nyQW}©"ؤ`B!' e*YVJlM{(p(g 1$Q, Xg>dS9tu}o|Ԍ( րɆDz6-llL|B(V< P(pзSupg:Tu~îS{nLU&+|W49e[Mw-ΟO߅AѠII )8azptaU2A\6 ΄%•D.2uSse'z}+50 ɔԠ1w3KJ k+ d5BͽN !i `%zE·>΍#A3?nn wcƷ&|n>pڝXp+ilzkJօ&A Y0„QXvnÝ'uMתp%{@o`tCA1%4^rSxӦ6%D %{np{ziaЀ&uڽ% 147fwOkƝ8Fq$nzԹjtWOj#F~Ow=*.( w Vn%Ӏ5wb™Ll9w37 _H7`p&X{g$MPbq/_;&(kŽ+É>S J:8vN[rmQ6vǭ)WLg{zTbb%4qEmHA v7\Gs7܍f7jֱV$iAp0CǎWMPfw|ҌoyX4f7Vz *뎣 Bܹl\4+V+`ʺVzZo_S&Hx8B}*%TFs})L %M});ow}ކ;~ L׸? kTҞI8}W7 2AA)T" &qB7sl>ޖyܣ=j4v ~5JM1~L $t:0ƯG^S&H8|ҏn%~GzJ5<2wĈ} 9.L{jŽEZitQ7$`o:p܅nzH }3Zpﭬ閅VQXj.dayu}ꈐ@DF9,s7`s4 ᦸ f'7Q&d"= V# 2 {k:|\$NƑ>KvOuIs|?8| 2RHCR=5K_Cg{kVp $P2I,y%+GE?DZ/J94Mnjjbz}Os%F>k UGJΏitEO%FϫDiDɣi  >*9JUMFϹ7 $0]\7)2PpF)UhֶJa\0WBI$mm@ƪl\lrt*JR|]jĽܫm' ܻG+naxe@ %]I^왇a<)EpVƹb Ha$҄-pn`5qQkc}qڰro4+ pzm^bX1lX|W8>百PHI3&}4#\UѼ҈+M'њs&CMN7(._7ݒw&043u(ѨĀK4憶XvU:'*.`9E4;\ڨ,!=<2w8^Ƹ]qNٝΛ~J MDO KqMưS=_s.=ׄ{$aCHQpERݜ [ Knz5kRɤH A5Ah&xj$kM<4q`s O*Ud%Cɺa@vgLPB6L)y0 ҄$+]wk>4,A$D7l鹱OХUI Q02@(gX:.T.\ЯJnܐJ<X Sٗz'MwU5/ܣs̼ M ȸAf]_'ܛZQXlX]c򠍇l&`}MR~m6@a7aHk]=_k{Rj;iZ%)Y~{y?,I5E$ Q7 E:'[?x6lwubA7+W")Nnn_h4^f?oԢ$K#;wӨ;lW 39tÁ\, A hv!:FxTzC>x״(HT]-c~mc3kNHZ~93+d/Ka:mYj3o=k mk6V߸2}6fp%;B/c'''BJ<%O8Klxl]m|QB`iVj5 Ъdw}e6P#}ڿHI&R1D&\_e!a Hl nhhjÝH7+4Pft:)VT^_._kJN*H*EW㍝|vVӵZmF%}~J>2Gxٟw^[ {1G@U?L&R()6DRVu{| H!SC+&8[lʿhez_ 4Ҕe[5NdBMLL||&zJ~Ad2YQI$ڳ״J&TJ=25OeُNMM1]K7M&q)>GH[w]f ˤΞ2E|s +pK ;RBFs 4!\]&f +1MFRi܊OMw/Nޜ}+a 0s=*GL0Sz鳱X$V/~:_lV:3mH$*Lf~Nl߳mo4EϞQK}K^4;guͿI*ef6}7 vfmo04 Oid~{ >-z/ku! R7GgqҠ9z}RbH%’“1cI@Ey͝K4 `;Z$?}I~ A%nV,5E=jA ;Jي %cLDzԝV"eP՞N&Y^ОKdɞT*sssq75=.pL1X{L0p|+ж;c"fUn~kM0QN}`N=UӦQ%P5T(,]6$R3&8z? ۲W E%_A͎B篭T*uɺVVVN5M|m<;b߿wuu odekU/L*sZm.?I#هgggBia 4l-(:sp3ʖhHΚ`?v5z V~6%.aз/$HavȌٻXtZu}=jrsm 1HvmLj.%vWWXTIXX$ZDDlJiYEN5?L&7zjVݕIZmZsNMMYvJ$GK&2}IMPQ5@%.F}z?u2ͱc]_H5a;s#F:%UR ;/h5HmkD $;2Oϋ%%vE!tb) & \v^^^W$sssﶟNu:VVV^n, JԏfR{G[ƅ4s&H(R'QA&H~ {Ll5@%neH:cx Z]7vg %붫wFzL|̵Q閛S?M{yAIae"`@/N/y^lGHbF-РPYQզ׵Skzz񗯬<>d2Y~QT:TVS|>么a4@LV V$ gN5AIF :?fc=!WcHtN) =~ʌ }T5AS!Eꢦ럅 #ТCGzȐ@ˆLzM"hRu[ִ#L" r&YjSFc\.JX,6l3BpYIRt666Fh%h Q)ܨ]د6~~=LD"qgJi&Xevv7Wl]ӝVt]Pr(ܿ(g= {ϯ~X=^uF N ٷ>R% V܍i858آ&f!fff<=d֔[]]=H$oll|sR~[}TRTm&XT1͘TF``,J3w :ܿQ"9EFpq[:On9peuGH!^v;T\<\4"q$s#;=QQ,veN!50riQS~}_Ѿgjm*Ad?dcFI ^h4_YY9ạ.ᴝ_kEJoBi ~:%ߒԪQx}LiO$_|vvv!3\ fӱ  ƽ.l½UV,>ڒY`~xgsq8Bɣ{䜄 TRh]gdQ= @cjjuZJeazz,,,x<~YOqXP.h(L&j9Z(OUՙJ`د7vp\u=@OVre%FN m_ӕfl^s*7Ǭ;:|WQ(xic&ATe4_0 hK+!3E:lHV.LyQp祌;~li%*<-H)J%~T*%xGM "J.;byJIm Rv{Ap]8@NE"QZɋZf]]]}աCl,N ,@f*Y1͠/2m 8d5N960J3&)υ+cZ;o:Z]]p׌;'e8o#|sp2Vʣ{d"3??KKK?Q(̡Cϸ+=XsY}w#ݻ:I{hHB1A-ʜNWpuuJٕJۏ/ߧh\cGI$%+4P7`Man0Rz.` ;,G nC>wq8τpEss}`TL\n0*ez`H cԩS?rܹd2Ü}MFL}ڟsu!BQ&5/Ǿǐ0`H cX,XZZ/NgؓG1^Q Go*OtgnWo 3o߇u:TULwKdS|}qҝ#2siQmОUӝ>FŀsV,O]x;zzK&(lp7?b?L&=& 8m43oZ=.*6XlV"KR%3ֵ IFƤYLMM}Ґ6G8[_;L`C ]:iaI!iZt=&W=SZX%uDqw<`{̥]Q&Z{ަ{6כ*@o67x91SSS/t:ch.DVZ)1H&DFjcX:]󷝭UY?Ia?T\w^z=orrKCz]aWQ5ه@D*˦dLpenݟWlw=?NwsFJ5A"|οC5##$\tuӟ@n8UM,05^Ndz|q/J  X18rJTcD"QV+MMMk6K{mZӵZ͝N#!o fZTwK&lJiPӁ[6umUڻ2_G1*nzsEMFH{ΰr;M6}kA$f@ro5[jQlfcE,gF+PL&^*z>R(LVgggؘT*ׯ%>8"ǂf1 " jVF wlR VL"w?`7C%{H%4"+uΛ칦*dѴ&=΍uwM T\Lf?0a_}YK~}q|]</MLL\E7ݒe/;4P"-Lkt>D"Q___?V_W.+{Ո , &-/J齥A%RǓΘ`zfߩpk:ߨ\9-EVjuJ+YTvQ Jq];=}DF &1ZY__4\nV0@h> “O3$ 9\N}RF\^d,k{e25=&(kt]u}^q狀zXHz$Hl&Z.w\bYXX0BaпnV~{x 1~},M,\3Ӧ;:r %ad:ڷ=V1֞Hjc!B4YxihkJ()sp3G.xʝ3CtEϻs"u9J-,/q5Ud,0HH*J4'K9r5C6ˇA!{iIK t?n=ך{sJ/Z](WRs ",䮳jp#0FH sܿ)J^ZՀ厾0RI&Z:^jd26Wv)j2]̎V*i5IJ$1Ƒĕh> s&ܠE1/a(aԻ`]G{Kn=߭X,@HBI%v lAz_mԩS{ufWhH<* iN'0nRix 1YlEszUj6.`Eh0l}D0?o; b<-ݯotW>Lߔ 'Z&_5M7QD $`-..=qOrڵ͕D{vԝxݤ+4 RRyX,VѠE"gzkEJ؋ cϙ{dVI ZtJ ɔ\5-wFHSH}>\fN)19{IU ˻:C6L }0Ξ=k|k~ŋȑ#;J"f@TzL&%Zc(I$ Is@R $%13Z^?;/ם yEqAFndGK}8WeڡkȔ;>Q~BТD閧 F;BzO?;w.vAlڏVixs534RXp?5@})TN+RƂ3-nˤ 5i`$i\%+g+Z]A$R}X$چH6]v?w^r%J IzŌjmL&c?_RvK#J:!=NkIR_Kʘ'm%Dm 9U\04xO vݽ+Q5@/U4g+R41"p~6z6uC9}8[X@u9ARQV,3A6^f {aK?v;MSpꐞkRa&>f,[0TNɣ7u^2E:Gk4 ?#a~Ě関.Z0Hfy `hIngh h^1\v' JR:scN'J.RC:華S&Whҝo\F$ߚmnH%5aX]KL0TNgLWYTMX/&@@ 3v;OS644 5@ZORt:h4Uo5sߓJiuQƝs0_t!=*GWwkF_.4J{ky?U6tX-jmK6Qް$J>v>l+L7Po}i6zIq^)FH72ۇZ6f*ئ QidҶ#6ɉӴƌΛ*U7mQh#%λ뻒Ea:];$qtik~|ъM: %m9Eݎ7j^l6_V*r+W|x?_eE~2H{oer棒GwbSVMRlll>oLR2/3-Hh!$H a`f&lHX1uk sgHaLuwkKm{IbHj5O&1ɣQb&꛾k&''}G;{+UEBLMMm.ۡ+666b+++ž3tU^r;$Ј@5{3h4"إM591iTɤgMŬT*!1 0ʆ &RHɢpcD _J ۇT[l|97gI+%tE\"JQ.׮]d2f[0`$c؛oT*s\nfApnЕHʹ~>NZ=/tMV k z}dŷ{I%>YOR&H [$ll&&| }B ;nr+|ӶU(JGi ~w+#N7-H;c̓5XTƇ40ҵN%λk0RIuNdc%|yux_U: ^a  gt:寷q:,' ->RH>Xi,k&$4ivYq= D yF`¸E6n2OH p ڃX,Q[T*>ϕ,Κ`6d$!}>moqpMPZv=%òV}dEMwRzx=nW.UxsQ:QmO4bX,oV?33Zfi{q_`6NHii.WmIkT6 pO% =^b@]!UHp )˛ r{p@xO 0mXt1𙶑wVFewliU[~ m2wU2I3D^n^4B #MP(Lcq?E9K&ot:Gl}ߏ#7&hefsxƛmf`w1<[,ިK Zkbb"-sf3gSHTI}cDeB\1A+,kwPb芻p5lPb]6RR0fv{3Y]]5W^L"ieR*5~C [xX,D"FmoԮ2;SV&aZɥ=_(%ߣ}L\h#k*pnZݣ)JU\cX;߱l6k69Ϊ"۷6FgzzzI٘!G -Z\\\*877wޠ}FH;h4T̐5/n!%J&IeSTvh=ϚT_#ƊCZ}4@ "MX67ly?`[rt;ēB*뛫ji !^ii{$؆E X,~ޘqcc%[h4&kH~]MC_×cu_5AImL 4n)wES(ܷH`Q#^<[7GX9}1 zB3bW6?Gl|FhύHjfff>_ɣr߶}ϙ`tF)$kh˗jw>]]*#?d2f}&뫍#6q=Jm ]l~:^诨dtv R*VIR%TIS4MtUHF(Raf;λH $urvN+'''I)Lf%bg&h`XeUyJ(ivV*)Rm1t]U(\Y&h`%?j6㘙hA@@`8oF?VI$ Z__?t2VeE~[U{N3᯸h;F29@JiEV!e}G|뻛({g& Z\\p~QV*z.GҠۧm|T^I{}[D+TΣ ܬn9%/`,m ~-wz&>]hS&ygRyک"kz1A2lSTi'%)>hۈp_/cz;*w7g JḬ: s.ueEN'KCjqq|_Z[[wddoL;*j|_*JϩT*G'&&f{j&_xgh\h}XIׂ64$QUWM7J)a$F<0T?m {aCܹs}b/d2ըnrPZ=aϖ;Ϋ^a\NIA )Eq#fhI V(iV(iSc&X@t[rת{=Nlw_܃)!aA !l6}(*)y'*|Tz>:Ο/--}}?ڇ_7ү{3eƶڇE$T}"F^ &H )1T J EZu=X]o0nX,ujfffF+ƩUuQCH RNRW2Q.QzZMfGG hMD"I+6=~um3Ay3Ѹ`V4b2o#O3#.]wp&w<]F~cXn>Z]]5Z,,,KBX\\bةt:3DℽY}zrrRɔ=fUČq>WVbMN>=iNsM ۰hϵTL ՞n{\!N`$Muf{t}m˭V9z>??owzzN$ԛܗN:L>c2߫hL=`oV7Wy؛Gk[m? nX&Xt\Ҋ܍&0hEEV M] _fsRzds1f|fǏK6#vm?_U|P8gof>eoPsRd8h)VWZm&LD7K&HiS%42>sFLUug7t:T*g?ڵkoԜ+bt~fsָfyߪj@TU) +iGm,O8O I0j[)}cҞRё#GgFoxCcF_zF t~j"{SYNRKsqc +<=*SgclNL>/޿nhz psX B i)0ڔR9K6VLPp7ϬbޫDN(oƘdG ѥOZ2^L&K$ vDZݬo6j6gFuIȘg{>~hI^/LŅh0Y+ LBwhߵ ]Q{2SϬ}=Jiqmsݿ;f_76Nj6gclhN7f}TiXYY@biw0BziRʽ_IM%+E w}w'Vrl I&?kO9`0H 0>4;iEs=l*b3664[+J6.3.]ڠ 18n#Bfi&`ߵn*ٸh%+` lgk̸6Wu08$_Հ5NWؖ+.~iGLLRݚ{`p jA]:cat=4=Jy7h4LR\yN?9`@Bx4^XhRBvхjh*)QIիy ,Ӿ?Q=WgPɝɱ6~] 6'NASS)蠀׋N|EDXԠisl_jGzoڇ|5{\.%Z6FP]Zm6~=50~kEu^>DfjsMaac9|ח鸾 0Ҟc^8tէz~RI %T~:Hlm{_6(sOX9H !Jtp(5$KGDJ<ħ+ժt:&o[Wٱ28џ}s?6&#(ROI_1,C$Pվ0dF,S?fw8PH+4JT 6l4iub\ $%^o>RQmwacB8aB QW76.mJvm͵GP\0˜Q&D $ @?c"kaa/zbT`k6 F8tG̺ eA$0LUD_ tR_Jم Xls`&gmh D $ Uƚ;>Msnc"aXVG&QswL,[Y__7/^ўHʣv=͕ӞG0 Q6A־Ms9pgO<Uٳg7Fڎ_yp`DLhC6^jdW na&MaC HYղ6R4 (e|څ0k6N8ncF:ZQM plQ0"QVr'is=@5l| aBGm$h Ğ~o4ߨ:)ʿmkC: tli D $D] LP.Isڅ R}KСC+)j'l[CA6Q9$c1mwwWVV3X$vx_n鬍/hH#61ؖF|oƔ7/^f[s,"bǢgn̞6AI^P٣u&To9lh,--_*^6HJ& c/eXGާL/oHaZflq 0[*rU+xiǙ3gfbkZJ&MLL|>ߏIEoѠm4i!}}@vM3O`GMj{`ptCM>^1ÌwCnqqq~!}V\NM"Hr&nuumi;m|WF $`g8n$bFffjeV#%]3A)%0T@<{cyeݾƼ}~&QD"l65jP!lMa,R)&ػ@UM@}JK&K "k/HQ,yq` $hєxQ0\>>)Ljǒ JcH@@ iѴS&Xy`)%읤$R=6 X` @Mw"% &Xa`X;(iҚ Ha.ѽi&qjyMw/#}u77&6.IU#}L 5A9&H)QF)5knUeIhHaJqI J%i}rve5\UE fA$Vi{DwRbII%R<$0r&H0Zqf!+6`$Rj UJܔ H `hߢ %,RM`Hhk6LL J-#YM(J y=n:vG ܭhJaf"J"%h)Y!y`tƼc{$Q+Λ`Jm {DI!uPlgc}>iHM`L(aT3đJ]tѤy0h$9cđ:UFU5A;qkҊؘ6A:7J#(Ѫ Ju짴aK@&XI*Jc@ܝV()R%G ['~1ݣVi#%H+L@ %`UJޅ+'>RH "88e 4` Jʤaz@n(Qt蔍C&XwwJ*]6Ap1F ۥCJi#%&H1APJLBIl,`?%V&!Hk #EI)$Q<%2II%%ues*%` $BtW٘uϕ,6#I+&7I $%MJAHV͘5:h@nHݣJ)TqA;a( 0bQ62&HrAY:v(teO> 0,RHɣI ~"M؁A[vj) +"xj F6Mw#<"i跶pݝ7ABI 0@Đ@~ B %QqqXA u\ n(s$FCIrtZausFLXRndUJ$}A `)aw?{o$K̝3l9 BH !##/!a+$!1Aa!! "D< !^'fz;sյ9:oVUfUVUfMfU[;,:eY_k#6 "A82B+*ŐxB!dHP@"BI&gHt)%YV! Ѯ<Xh B HB! _i yUGWB!YS !$,0?c+D$xo\qO=O!!2!P@"B3a4a.+A(ؤ)okxPs:斴p%L\$#< (IMD!BB!$& ,q(%rBt;Nױc.!ܛrf,8LI]mCw KFhj %B! HB!1E(Bx:F&ь^ ! xt'GRz!YRDr&'(gD%B0/1>OY- HB!ƓȄ&hdiV!P\|F^5qC*ģqh%R" x)t}"?Wo HBZH\W鲸G^Fy}qQ?zEB1eq RX2lھq @P:1 {YP &M Cnms뒶xyLXo#L.wF1@B!F3cҩ zUӉ)ҝ6뇐7ue0jZ0  1BR<)8gx{!2۷L^qvvl6|׿s||\ dmBE^0:Ft5CeLGM і`Pm*HSۄ"x`@ǢnM(W̝ &k68${ڷXImB5铓kju1rP ́DpD!XN|/^FYpEX qO%À{,H<[z ~}\K$BǦNyWܜ.Ic̃+;%;I9 2>baWujvvv^s/^ H {!JB!q+=- F.( `(Bh]GHaWbHG?9Bz)[ 9wgޙ$Y;(1^JF\jI$? !$AB -'B(CPU_QQk[ mS\5̽uF ! ay۾{xqDPv8/N|Lȸ8rEI&GҞcr#`v:)Rkyy_[վy|< .& !.Մ#1 a>-D? 0.A8q GY-ּiiw6t .g𲸆~0o?_;4kIgo[4Tz(2.p@kabqZ~GDȐB!=  P0H!²({+ -qA#Ð{MSl[=A'/ CX<G!"T<a9ߛ62nY\O8|g&nꙤ|r}||yNm>"B B/"W654Q00; *]'3<yqg9i8e]\1I½ C[^)NgJ7un/븋!&\^J$ MX ɗiB^-V!MNZ֌S> "B!u``!n܍1laNӾkp25}?ymw8zA(~^"UV!9ck/0aS hJs+OA$sdzH&.1yOEBH0דuu.w.7[|4  HBH6=`4MˆP4] |gppɬvU;x#%cNyI\1MIO^@ް~] %o Ib8־1ngODHtNsq˵Zm\.MOOF޴Zv=GCD!dC0!T؂i0liNbD-hk α\GlC / fx辭㤏3f߱z04m@eM0pFP2?h?Ѩn_=99_YYr>jٹ\CB0C&QE4ea|}%!$~ǮXpv$y1'<WLZĤ9r)-q!S8,e#aNE}m Y}=J].p{{#-,,mZNPxGBD!L&0z- z%E0-N!ũ|'qapDDF;m}>b*ȸu M2/ {:~fx!Lwɏ%-&bIx8$^JAơ=gOu]-V!o|򅭭YXXx=- dP@"B&V IwI7ɜ 6aEHM~TEG>ӏΖ߅WQ2|hP"B=Wt 5qCY5xa „JDU[Lx<䢑_/hBF;"/đ;0K` ~淋YN^& ˾ѱ^z p Q")wNyE;qј # _oۅJkkk'| f$BB,VWWR0u!n覷֙Y`0V`@5OqE;KzPI.f2޾H Аls,^Mf="hr,ڷgjڎuUu։ޑ,@  \qc't﹟q_h4{rNMV=!!ll U0߰ElC%cl^7xfo8k$|* ]-fz+r΍y$ ՛3JX_76Ladm_b֮4rwbY^^kkk_ HBHr-$Ehy}mT8 /#+`Ĩ+B`1* l qs ϣV! u;sM;x)Ad$%ϣM#ᑶ33dJV-5V.9fYt^SW*m,!# 2B!$Y$"cLal)8bD#q.9ypb'O{sDk[_Bg끇#鞿xsU a uOQ9ޙHۂ4m4IzŸ/Ph& NS^ \ 7|>w>|iObNjڅBakkkNB$B!Y,!]d^׍6_{p\Fekzox튗'ۓ(P/g$\,!%ȬbՒy傣 bA+[?*$A@r+0&u&b(RM Kw_\(u#5>P9:2;0Z<7aHxAD ᜂ^/IZUBWu-zKDŽ#$KBȘD!$_ᭃ_z Ғ{9a|>1\/ Zd @\C" "rfK×@p#B9cuAo;OHc !BPAN57;;;L= /}JS\(>/#D$|>/J弔e)Z-i6B'owvvkvvO/// >n]P7 n0fB@w "a  Ca< l_`Ր`PO$j;0}}.e}N(q/%xz((bڮU5-&2l!BZ_]]_2B#op>gskFMssѢvAH߄(uҥ/.//vںna@ko¾'`0zLu$| A u`tH R75 p LxW h=+:+#B@:.I/%{C!!dxD! Ϙ#{9<<۳kd"F+++25h;iccο^ln]ӚyFG/K4 $~Qq>kT`cKqGxBUX0kxn3y<I:8 "kH ALǤS3B2=!D"TV;xa޽{O Q)긌=q=`cBݚqD`oYWD5^JӬ6`L5v{YCU-m[N:54,B@( B&/!PaRCnc7/rT:0BR4Cb&NSƒP7~SOIicqC'nSE-`0!?0._W`o<I拖8y`_kD dp Vږ'69v !d" BȰ|CBadyy\@[nI>?};8lcX.tjy6JlЈmX!ty(M! XW'$+!BB09jZ㖈uc)?f14F^xF[WgM#2h3%q0t]Zǚn0Hv%KW)>#OO"UDiIⅶ7#%98K1~imF״|JG J>!2,^H?_lNda|94>(pIsSﰺSI/ ư Hm#_ؿwʇޏqeqsuVD/Z`R*iBa$&r.%Hu^׶$!$1P@"2LX*57;eU68к^a FFϚP tlkωaAwYs!;k|_ :`LN iG&u=͉xG $x(q kLwH{蘶뮖c5!>B\`Bkkk+++GGGWEV ~!'YWzר5^4pᡞj6]w՞Z0r5'g2ZGX\O׵0Fcb0J:~@4x!Cecc9X Ky69f}s-@RB77" K}"WR1B!\PB*J_;"+Dg\p`IdwaXnjeuD^l0Į]!9]aB4V/=.g XZדyq ܤ`h"GиYHw.nQp!)}K:~XG@=B$B!CeffgQ@r Y`gN0jjȘ&:207U # taq ^H "wW.IH ک!^Cw99 > Cݒvk>|Y0wUmFPj49.BP@"+vlkݜkkk^ٔBtqXՂM ˆUH^BD!;U4`HU{0BB 2tdWa͉gY`&nݛZ/ Ըw״LDB@hd敊nNqǷOɥK=`W/9 X-60FL\!N"(A)) UC.O%7cC?q,I|oj2/[5-:u/%K+n/!imH"%B$B!:Pl>!\0r'腔]C %MB!gӽA?{U\/I+cxvwa3cA}0LE#^V4,OQ^!$Y-z1"D Pu=_ I$cG{O:FBHAݦN!$yHq[7x$'g~?z5ZS~9#Մ-Ѧ7S6gw=@сa v`$xP/$u4$Z,Wu~">#o؆ :H0"t[ZDpE!i@#HI.6jUE!4@B 6%7pxbќEsZZ>OC 2=Yؔ`Sauck)ƸjhH!0f>'&i1 Ʃ,Bº0_Bܭk?tp66x\ kk7c`zmOH%BᾬcZFRDf+N39t+éB,\B鴸2yl[seA|>/.?Y 1R]ǾmO8ܲa&$i+KrQTBc&{~ѹsU]~!( B1h4s"NZrs;H7nj]?b°z8i/<r+$06w95+Ѓ5qOٿ1 k3k,qʗe'CalЛbg KE6q 4c2Br{O5s2],p č#sԹpJWt,D/'M6&ks92 ˇzGד0%*")kmԶ=TM!X-q k͂9uXg# `~^ \kwHuRl؝5 TcPd/ Uɶ~SO?3麉:ƽ% J&%x)$3L$K20 1:n7ҫj?8Џ;BH$h zO0&0{kga^|?˅woߧFF,{B-T*HZr<S6c k Xq᝾Scj)<)aFV/H67Ľwk1!vV/QKya89q aMC0ii1Fscp/h^;ƜcxD!hߗta aMC)(BzBLEP#uCu{{峄"&9߹plZ -뢮(IM"SSggg37t_vʵ4S~I `o/NTx"8@!$ @1̟#D{kqym(˂3ϛ5b>|d$s۬7!ێiۭ:P2vT5I]tOоΟ kC P@"]v:]NBx^z/0g/*-(Mav@,(~C255Zj*J:Zo-..bq??#'bpGXmmt~BMr(F Ƶ“}rK:02=ѵ>' !]u;G]s 3Q;I;-xJjzV@j@Jg% $P@"OѨ(Ϻ}06a^1F&BLn?ol6n+a(#cnn?qxxikk[~))_픯r?+NS~[[}7!kq0 M8LJX%}S6)8ɉu+|^M$iFprSm4ep`M﯊kTFB&}am1iZWxwg;ns}-^E"j?i[;ySqxЃLh۰ϋgz}GV# q]DIآF:{~&!>c?1jعnދA^v+)!tm2WqSj}H=?gff]%PUZ՝;w~*G(y_F ^>_` D7sύqCq1~J#zxi5 c?AW;zƕk28^?]-&YcM ҂SNxy M}*$$h$$9;`(wtK:}02Q?BQ?EB/!c9t`H2)®, 8 E/jU:˺3#Ñ ܎*'Eh{5w#d<3Lo(JX%?R7xa:}I$R{bviIN:*':88z D+gSY{~9)_Z^^dzяՁRKR@m>ƟaA~. uģ>C hB!P~Pbgd81c;C+6t+W ޷ sgP"HKMYK JH 劌>z ?y}؟=_R~ُpd%t #,.uh1ibЄ+qQr?999|>?M(I_q/Jxqʇ5\d%,HNRtAϰb#uM.J)%:)Ll?h@1GG)ewnd9bm>nj^Eo]!o4hG<I+9*uiD/۲NB8c7R[(* {+;$ ux&}ntQ:y]zt۩WGS0Bh*" Mwl19\Z0B" N'VV4ӭV+_*NF1YWgũ.tAnןfn =c;Y2g=@"׊k 70yzqvnLCD˸Z7 kG^$'B:2Ϣ`-Z2isűO:U@#`M㦘A8ȼ+Q7{aK')R:Vm5xK8 zV-] .2I,a \E;ـCH{r _$i) H5qlQ“郀!a7}+ e+!?/ #%;-~9^ <?&<^N!_q BK[B:oL%p]J&xն x"Uu}{ Q #MgexS%X<8'36 H%QͰVS^9#:1!{5x^Ju\Sv~I_u}`"$41 GBE;]{I HaCu}4H;sU:7hrI Y c0 {իPHJ񰥋b"6m&&د;{Gقad;'ģ. 10rlyDQbnחÚ!á㧱A=Ա 3nVKE&x=qZ[a1Pw':h+ ٍ !](a#Q/(龗IE<⻏CD)x^dU/Ⅶ˳yrUdIS]SEG2Q0nH)phjMXu3!w )99k摳1_j qS劸'GE-, ˗ i ɬc#>Û:ϗu\|d0v;; . ZKHD2z9$EzF. HQ:y I"ݽ H^a:Fxd^tZп;Cjv%;;zn]\.\@-C@ np0'U!ΞNiDɪeoΌdO@2Nn+lfjexK:xF5b; !I[ߵu3a$ ˜z_~:j#8AeJ&ISׅzOHfDWęnF(%L(A=zPdp^D #"uyM"8ɳBQP>dC4 A$Hń2id -Fk![l`E]<#6g0%epp&ROJPsE^x>: k'<00xڎ2Z{__¨~YSy-q<$DN<Gۿ$hTux6)GL43ģ^yGQEŐu yU< ®5pvQB/qg& Ť /%x9ur$4z vZL!\:'OZ&ˡǜ;9zqbO5[ݜ9[%%[j4zUâO^c:fֵ°1iIm oI#)"^v+(D- 9'd h+Q/Ѩp_QI<ԯQ,iАvD#LIo&{yCJAnv$tnPAш8`!F6>&t]V35ۄM2}ј}`"=ÆN{"nB^0!]RQ&m7!d JWNaDג-vDR $bݽ:yu U/آN'!Ⱦ,jNa†h@UDμv:%Xt%墈ԐNk0BI\ _am<E#DG:{}0Wn#> QWYԖdbAsg w%78E3/=v/!$7k]f{DBL>r1. UGzogߋ 0&o $ PYsXSЫB0x_@MIz„|꼅5u<2+¼Id2۵Iۀ}At=jDHX( eyuG~1.H$0"R^Gx qE4 #Jtz I}'!)HDjEwt[\򮓀)(Ҕt3XIK k?M;=݀E#0oFkrMq=v%;`%0 xvgp`%I$*Q榶Ƙ 0, 8 :^){ЁХ6s葾.긽% BAL&ykݷz` ^]]=/mummQWH⠀Y}0##=wu4t g&Qh(בH]0VLU P„{@ lx%M~ ݽl&ۉ ȳ`#8v X56ģ[B@_|$Ccªܕd2/,dNYv.r:ǜbH@yח31q pҎtв(O~IKIw3B;%\]Ҁ,Ah,]]]܈gkkkuV73FD#W(QI‹HʫQzu?B-/a')HTnw$-*R'%#wsשn˰v8F0s8rLL[`45xp꺁IMVrϋe`x YdIRS\dr! 5 :O1/z*!$u1c溮Gگ1A,׶^JdR%}dj?puuXϴ5֚>2J( e>9qM8*ܗN/ϣn^G<^HFaBi (bRg ,r(5Y!)(]gRWRk]e}S.z%56`Eog7ֳxz.;6 ;opPE⚛U\'/2Xؔݑl{az_‡guY0̫v>8ϳ+g w52ϟkKBҽoD9ɺ]x?؃Dr֧} DS-jO>V(^kZ/:{OF=g)IA(2pab:D8*IrudNazY:B=?$$}hdIP ʟ7{~A/*"C5oE d7"d?8#M7Xop. 28ou@(SF  9JZQՄjKz( gg]g5T`P*|^43 5 tOCOu`s32>Z:==mZZ֍|>_=*˥BUUƶ{}O}{{;U*[˜43px6pr݄N0!†[8 {/!퐿n!z}ضN풗`虜 ,HHcGxtoD#[0jʳBiE#}We :Ԑz:rt&[pNuӁu{ژ Cl=be8czWn$Kј~wjowř8WA^nvr??KSSS?kImGa8 AAQ/[Σ0yGW4S ;-ň3a#"uvauJ7"S8q{ZMш 8o0e-ξ\8}"= C5ɶ D5l#If؏]}~+AۼLX_{GjFШ0y#B&rN暵/ǜ.iYHzԳwkk믵ZR}UT*,r9_9ϜcF!$4&qvCz : ߨ`E@ 9_/a_miؙkN. #%# Pp{#8ٞJ"md[_OD@ȋYc':&Sآ/k oJ((1cVk,g=X59Luunmm}s QuKOggg(7Sw8V>s)R [Ⱥnl[^"R'ϣNGģnˆFq FI]`t\>NVLE;Ԗg0W[(d{QAǼg!#b|3oaH`XDNG\* n O pښ[2t;w=<3%ҩ$[a;NY`W?kj8LXEH$&VB^؄k?llSNㇽG羅 oj/,--(ic?^oMT':⺳5wʟ;==ɉ8Wq>4]`HPhOOO?qt~r/csM:EY)\_jHGRP=Z2ސvȟ3/B9goeIL{ -G}vp>9Y$!烧!$՛z$yM>WuDWք] !ςpdlZP4'cGGŢ\|y>SN x!~}VaqAƣ֖~N?_ y|o"BmzzkyOPx(?;;+ߺu}e |S)z}{k^l>{ afffRHT>=Pw|vwj?bHbmf '-qܟtBQ?Ѡ^G/?R*sz5a!}_ ė1}NugEH2xphq >oK򆶹|CàL=aWBH-QtL)?ĤEjB+ GONNf\IY>߭3O>o٢ρğQx.677ǯ^e#!p0Kl]< mNpK< Gd=Q0ax^Q(f3f/$bJ IF4 ,C#w(did@+/φ !68ڠ<^ /k#mXO#A{g;0'k ]qmɮ9p_## f!<>l0 !y:9={a.T`?jO"$oll& ^G/Ͻ;Ivn$;/R3໊tiT-B  wH(w*4~ =< a\O sJ_Cht @X1G)X>8Cs{&BJ!CXcE.S\ Y-J^R)yeY__7n$!?_Kwu"ԙx&dI먛p[Ⱥ3t0uM?^Ia$~+mg<èRKigD#B~QD"cA¼q~cC<YV@<묆saPf%\ INJVƸأԺIcg\_б^å DZn& 7WjPE9u6#Ml6Nhtʕ$GmlleU#,M!S$ G'y9ŢNG~(G~(Lt $JGHC^Iv8$ ŘHT0P ${nʳT{3($!Mq0wXvO #݂d׫.D"܁N↥!k1{Z2q-QIƦW5ڊ}a=mc$!tb>5#/zm^?ggjn:Ե)  HI-G@c{azyMKoQ'(ȰAm\B9AR71gݶa@dNEl릴VSA߳{"ҼcG8Z),j-qONp`݁ˬ ӻ: J^7bYtH Ok/-]sR=зpGbr~J![ఙ &]OD2:aPA"r1l^<[?Amc_3I( %>ţNG#:p-Q7(JȺ0‘HGd2THھd& c ԩx.8B[lu iG1/K/F^ Yk9&C׹`ny,Üe/F MQ"𜅁Iʿǩhiǜ{U]i0!d? CArxh09fl/GjʚlbOc}v6䝡Y tl'(\]pM<*Őu߲K\GHl^GmѣMkwJ`/q T"}D⚗0'⿬V.T0k655c{ɶw NgG(%/d\wd`H޽9yێu2;䄨4ǵAby\*jpzz*ӌ?.$?C.gk>cWM܂#[pSW<(p$䈯 "$H.3(WW'#xC¸ߪHwoN#֎"c^lP<,Nqx.$9Ԍ{ߜl HI_B-W@T{;^z >w%! !bl0g[2+ WaRy /B2g)uOi?{o$ٶ5]U=ݞowyO@` Y2aL`Gl0d!=d#P5Ia²f{{{uyLڝv3dV'|9U9{ڋkv H_tFx l H8^邖i2sݖ1@DDA/º٤$~uNܲ挶ag9;mBr T B@Blmm>eʵإϩX>I?uھw]6PL8bx Dc1#;]R$Y7#Җy2$KKkgymZ@& EY{ݧ IUwTvHscXHYtG 28^;.Ʈ8 Hi'fjQ9]BtD"rՀ}kസU븛!oK!}JMKM#oC8 4iccc?511q:) yZ̜6IHzᩈrJj@O[~d'/к̦Rx;jEHĝ0#maN#Τe0m/La|΀^O%Fq^،߳ cjKAD"SBa-mK _p^nb|t_~7"do "^x!\^, к I8U_cڄA[lP):JFP"5^ꕀt((䭷ޒӔvtռuW7`C=N;un{w2[pŲSeRnDi|[R\{j%=N'$Aup(%u)PPpr;|f G ޷28Nu\}®A1}p*}H3dBȠJ"}ilggVsε?r||jDrҥ~/Fe[:v*L-+z-U}% \W#bHۈ>"fGvںI|GY#[Ԋst.yLH,iܺHZKn}RLsknM<8A4B:K4`G9m0u vv轍Xd H R_gY`(9*Ø[>E" d|Q_K^_9i7?omի4vCCk׮ɃN"˹1'q]v1\QiGmS (<×ԝvYR ;|QZ,/S֑~ADŞFq{RD* XB ZF$w X@`G{Rz9&W GvS@|N;[o wbXm/H$&zsPc4Ft^*\ؘg ڠѭ[z]naa4DCZSׄmΪM@ܡޞ®|ݣGxK[K]$ݴuF@2i>Ǘ,㾔uH?G2?Y4wI$ ם E=ϑ# /r82"Y߿BOdM5)8QwBt@񛎣tWu7#v !HKRiDxԱcڞ҈T2>Ɂuɓ?<@B*˗/1 7I# @u҅:;8ĉGiQ $-I6Iv۷\wjdFi?Y nYotV l H]H6'L,ݷUߊc='5[wZ{IT¨ZBLfM:c6)2ǹVU?~ONN߾}[#R7LLL H{{{yP릢):F!lP#Ue2.Qp4*GY#_\;(7psBvJzYSeIS&褚3yPD4eB'a}v;:Jͱs&qS:ӃD 2/\ RfdZw:DQhsBHc~2u^?!( 5lw={=KGy5Q.bsԇlN)ICk mCۓ ӥԉ}|iuvQpd HYֹGYHcBqa6=PE u\<6vH}9hRq~ 9/ u]o; _X8n 8[ΊG{k  l! vvIg -JEwJba$k_J>Ҿ6y@gRGD;|}FG#\:7H)ی$֢;)JQFHCē쑎 D)ĶeTg H~хyPԠ{z.]u9%fؽEu(ܢ_k o BIL-б6 6D@@2Ιٵ[[[ߏپ?NNNpN^߾I8.FE+qA=[PlY|QZRٺMy4*E,i\M[wԅvu:pw_ff{."\-r,9tuOd0km9=ϮxR <ڂmXtѮA϶yIzpBPw}}KoIԄ+a4rl ӱMhzyww!}efK#)Du]V(.]Eģ}%fÒ:FrJ/dIm۴Vu}DrnRQ|r:s `wt4J6/Ԁ4fr|}5CxgHJ6D%9twfQBMMJV!(ALZй iWlo?5GG"\q˯Svȴӿ^vu}H{wD}RR#W񥭋Gi/(xdHYRgQ<"E'""U=MHNC+)ڊ"RpSCt ŢQGZG NKx&ٍnl"c sM^k^J`uWz Zv8o>cS=iBHkXS9_ן.v&jZN= <;lI9b_צ@L#_:_#[<#W<##n#BΟk,GoLHƲݙ!ȳLJc>_F4-QDRұDww(T}{cuQkMRmv,za?(EHɏ}PTC)[ պ 럐i !sGd" *dz9o`F PVellW<)v=O@pFȣ8mn#RdRL*ħKYή#<cy7"R>pfW΀>כ!gA3`Kv$0ҡ[W.Kr\~Nm<\YЫºHNz۶:n^HjjzZofdd;Z=Maף߂-Ve e8M]E0#;mi}X ǒUBZJ;&R3F$]oqE!]"R Nݻ98w .]5˝ p> ) E8itܛay^dDϓ/I$n`ZO(?W(q ]Pp6=k^H!Y^^--- _( ]fɎE$7=O8ׁ7F?vz-GO$uw]4i|W੗( 2r[<򥮳#_#;dG(fJwxDHHd?6)`0$_+[q:7.1@:c"#c Sם'ݝq" ). ӤƁZH3 ubj}bwj+">BzjEP-o>"҅H(Q9G&[3!Z\6Ǵ" HQHH9S˨Uh{>}0MúHIVJχ߹׷֖@t xO#ׅ; ~ |O/@Eriw: .cSG&b+%BN I"uHsgM]'*5HD7!`Ꮬ75(: vٿ/uhIXCwsMs H]yD"r0`pKm/uLHf Ck?qttɰݩVS{AV*>xɣFzt ՓNtR[[[CQ5O~K?^:_( 5A\ȍ>GM 2 qa=?}7J8ZÎD$gwu3 9c7j- w@Sv<-5ˮ8׋<N9bB3yFuBzy@cITŎjT-dKKKx|||V kГ}F>?vtt;;;߻;?}ȯܔ _YY9F\JSD 6B,j==y Z&SʼnHvv ] g~\-QGnں4[!m4r嬈f(Eaɹ5ٌ l6O{s-QQSC:S;>۔u1cPlyC5 \5ܵޏtET5SbvsDyGGDpDQ흹:<<699p_7nLj'+ʳ/_ܾ}o&uMo%vAKƚ8.u-@[=5# Yuvđ+ B#B2VK8$S_i/ͭIwug[||vͰ=ţ΁M LpS<Cf^MSq~;TӴųEjqCQXOH2Hgz+Yǘ˗/vx?,--q'=d}rr;:lҁ{+gW^x `R2Dtсimv#7;!íd#$#MagOj5miWv>'#f?.q΁s!! $7~K3JvW&}!k!Ń^֚vQM1?q#IOXZZ2)yn^"XY׋pr{rǕJe{{_-V\}mhh(͋%sa%?ta !hrr_c!Dӌh6Ibr>ƥ""n(qC|Jsff|]1}Mxc(eA~A=o #az"MBaIҕoZ6AVT޿쫫9ߖ6DNLLο~j?߾}{+oWZ}u>a`^m"lH"1j H)XGMx4Fu#ڿrV"5K[Wx;!7"=תE>%ƉEi-!pY($/6αj<;r]pګH9Sat, ;浚v9ύ ɼұ c5 !m2 *5t7o.| ARtngf7<<166vuddk~)|WȠ?!m055hvww? g^ѣ{Dji]װ* ?2|ؾ!lN2>zH7l>Dvb6' Ar l &᜿'f1&Okzxx}ttt^ݻw?Ϲ$084mJ/>SZHx Iv!{QfSQ<"$EE$ӬlM$3kr^<*d*;gF$:f; vC=(h i1%dA),뺨em ز<S=Dy֮W$FE]uξ) :뼃 I.R=j~\N:DSSSO.=99cb{{!$#m'w:o H@, orxxxks)abH3lG~N};s E&H\M:~$`( 򍢏L]lFrVq4(-ȭy6W8ċD͊H>}E8J>d>3RQ 7t.vD!$ }W*v bN<oڌ@r@"> |#ˋ88/,,t,u;KKKc<ר(􏴵= JNx~H/&)P@Wh4ј^P$r_s#dn](MD?QRk@Bk%)kaU@Iތ*"!.!]:c; vbģ:5"a]qz͔P6G UaNd `#DQwv⚴k-.$-򋋾 I!B4iD^tLD{pmc,}?P'e^)" 8Z5M|6H%ڜITo6*3`}s\n Agaa?ਧP*ժ ?ώ6oD(Mi3BRs7)@ap\ӈ+ƤFGH8!).m]+u!%IDJT&6xd PesHLeg:-4SD;e2/ϳW9C($Qd!܍4vlԕ T͏,L!o:z6IUN-ҙNua= e0 )!6Um\1%IS\@ ȷD0Z`A"|bM :Ex}|;ބ|ӬTBNR Vn|;3P߀ q|Ktzt8h٭"LKs RyNb#a#j57y. ,:ǣ9S$5N.FFF^wGj! r!1Ș99cҺ%RV@҉.p!%i4ĕ8\Wȍ>#J_ȗ*B.NH EqQHN4xW;R<BrVNτ0BpΞx3#1 Z?QcX$Q$| r hTPt6iu0_L;rs`3PW}p=qќ%(NDG8.)mqF }w:9 /\.Qf #DT'Ej(j" T*;2d; AxE]x0/p,H>"]JXAɏɇO)lNhL ,j:027TgGjNr\$>A!r2S7s 4Fu1Ҁ }Gu)L-#Smƨ}d?@;\(K:WDb#B,"R)eRR)N0rLe~ϊ>(4|UH@xhtS 7: )^ #vI_-mV΂ /s0м9>}3J +t;(V`HڧOzRS MDZZ6vttt7T*/ y[(˯'&& )![IcK]{w::I{JK7:n6'E5x䦮s[w'7i"ƅDKDH$>Le~/p-5].юcrCޟH؅hR1N#* 8.Ai+57$Hkn|99\|`%+Onhttv}2#?mTEʴ=Kz> a5h ]oHj'" y䦬c:BODg pţu!'&դ9(S*3:0+].QdHyĨv&,OΟp-#7@Y}\5 :R@8|C}lsp䚴pxxTVg'\}T*>/^;XHcϏ cjoN]5d'w I;UF#nX'X:=A&EQBLR\##״+c;\E eMe%]S~r%n D2<%D]gWxA4JξI3 Xj xWtn9uqTDun ShR1jsfɕx͂;;;oWUYYY~jjחY vԵ "Aiݕz. iM.Pe4!=q:}䦕KvL]GHqk)D$1TvqRTvf煮~>lN|F*A^;炭5pw,JFl( sc0r- ]9&Dn>tQ8>IHin)$<˝;C'''wskkk[W^+++CLH|wt>O5:AtJGdALdivB%)4[E[E I|,i뒄$Gg1WJD\4vI"щ4_.${܃>8{ wVw.2ǍRHuS¨n4l:{0u~v\ϣ٤ L e+]qL6+jC<142SFQҮXsƶk~j:WT:~|?FݟwΎnnnO<Ԅ䎚4~QEҜ7"Kt HZ܈!z`+$K}lii5dPY7!dHxeG!۲4ċGDţh$#dcTW#4◩xcab> nt2 0kR GZ[I@ڋU8 3lpůWj]O%؀$H['jDR^,:;;W3P{?hÆڪ&" ÂڭXTeq CiedʘQu4\VC#Od>E"e\*4#׼+% I&)/N$> [KC<*Y1dI&bbQ[IVu40%9/O%i}`3YCvCfPfO( e$irMToI'Q$ܱׅ"R/0av_{W*z:' 퍌<::񛐾}ilCrVPm _4I[$uʬDQRM>JJ3%ȗ'@e!v$Rٹm&]Hv=; 0GD$IحzI[`c([BUv!H;q!3id 9qC~Kڷx>D&bSG9x6Lں )ccc+_=33[[[MH_ڱfa2ނS%v.LX0QFF+D"|:GGͦc!ľdB2HY#_J|BEL]8 &8K4)]-NFm.D’HݜG2MSg@PEr;pB"#a]A19pQ|cxK~ [&_J>,t la!?f5S4ģ4D!lsB9 !ߒ(e;u[iI߁0u]a{ 3%Lds Na8ɖ7Q3  쒞GrQ6-=|&lZڴAuRu_W*ZLaal$۔H{7%܈%Q@(1]xCM]#߈ N4WKaLQRu裤L)-k=$WDJt#7 mH\I]ߒF~[y3,!v] R"+qt}A>P~JOK h-vG8R%"cHpH`A>okz\.oW顡=7zf$!OݚumJKϠ} >Lp=@FPް{F`@Mfl' ‘/ĤV%d1ͮI1cTvqQHRٙu&($^Um]Ip̱! H(tsɷ1,ܝr Zc I2Ժ.Q"蝵EH9ځ=}?6FOu%o5WTJ:ڼEtlB P7(7|lP^5UYQ)`J^~8 +hBn#so仟5m]#BǰzHILREG!"d|DSٹ⑉BѱċHf3QHUk|9D!iK86!㰽dmCcWĂ]i%N",fswķy8 o k!ea\P H (ǽuĢD"i~ظLnD}<0=f/q䦭GnQ9%EeLk&ΎBKcw, XގX2QH0e>ˎBrE(y /dk0b{֩"}Ǹ^g0_0@<ꇨ.dHCm-;Ĵ^㈔P )<{R|R OQ րi3.1uRmyyCCC?|)\.w==Rx( !ׄN6}/vHY}ܷiWb8!,RR׹#BHƸfSٙɈH&hH-"QH$5B3q{FvK+ oITzBY;q ) "RGz#U4E M z(Ե>/wҥKryukailOe{{VV0\s/L+Jް-{M=~?l, | :WNNƎƇgBH7lhMZAy5sᢈu]}'$HiR{FB=5ήTHF@:&0dC2oģ`\-$B{v]c4; R"쩣bO/)3`L;Ҷ^ Hـ@(ȭ^6lkBa=DKHLNYZZ¹yr|ի211Qky7|~?=_HGZm;t^aj' H 6v.Xk{&(U |:f#7u]\HDiψ8(4$7 iX⣐!E!᳐]?QG,n\<!mx} ņ =8|WtS("# 56B釵ʎ46,?RIؒcn& #"u5Y vZ'[Ksw<<%BH;@_*HYD$S ߴ($L.&;>S\s"SE?F`|c=yCsB #=oqY\(=eii@)!Jr[AiJQw]Jt)n}ku Wɗ.-ukB:9%sTv&IB#[X{QHsڢD&Qt+ yM+$uɆӰmfIƢ$V]H|.;RB8N"RxDH\"s9BY5QdoVQJjt6d)Hy͗.K#;`%u_KJ]#BHTvn ;_*;dEqH& ($FH2#y5Qg8(/ pStQB -Qض-B̆lúΗAD*jK Hq"JKn℣4|GqB!tcI`N>eR{F)҅>qض/t\X ;IoXrKmY[!/uiD׭jsI4+kM-)%y'U$=}Dd G&0-iH͵!4$j"ŝL }3ЬOΆs?)Ƚul8Sh$_$BH'z8iwn=$_%tuFy ]s>.Bj75]tDX)]`CZc߳`sw A$6 |3"tG%`TDuF(B!u &}A<9c۟N;/p~:L]iź%GF"tWqĸ($[<ʒ:t*S88HYDE8%ᢰ`xkgEIU1Y0gQg鞕1Is.?ұ4vk&:?3)!rqjjWs.[lܘ[ G)!t [E$](a9n^;o~U ؈ViFRټpM#F ăDrœ'M]І{/_:F~K[;}B%BH' RJ; &D$`i=o+]LcXLc vMa4Po1r4ǘdԅn#vGdEǍ{ =k)Ry QOB!6D1o#Y#7 歷sE#s"磏|R\ $3yDB(.xdj k3I'YgEgΤ1hG&# 6C#Iƭ':v+>:= - @>vEX[./`MCB]tBY }io$gd' yF!GG^B(B8mLqF,ڗh7VϪ|GF!sN fw\_~[. 8}RXr=#s?#-Rf2 ) }˗ֺ!dۘk$Jyn!B:.-=]}MR^sOZ9EݝH"I>E*5BM($_]88[M L'VltMgG_|a{A]B< 0* 8 Q7kOP&t,vHc lko/eGm-،4qޕ(R8s!!|5[Ix>߶3Bɐf$x#_gH!y($4dHt$gSܹcg<4vI{QAʎ/Aή 1:ŎqvE" m:}Ԅ"x6"ZÆi Ɛm㹻11dB! CAߴ"*^Kz8Ls6&9F$2HpjCBH;dL#?1*g#%^ElƍLcwjcwHNcF;}`~ԽiMH8֋>Vc^q~cbf% D󍨍kBH1)l#66鹤ɞOR^ke)N0r($#4$^8-|QHuO9 2K*aD⣏|ujr6gMm]m-K I\ =[Ph'B} u=I6~ QH/iH%Gyc?!>LR' .V<GvR 4R2UCqH>GYR K` 5vOɹQDR&Fq»y]Er?IT)HЁ8V䘳8 ]b^sis|d:@H.Ǥ7"aR=B!mXpthD4*/m>Ka@rE$G+ՅB!$ zo\MkvRzlC*hdN'AE҅(6~G\M;H>1)|/<"d"j}x^nWHvԓOH* 藍}K$#Ŏ:#TD" 0&tq tv5<'~ }/KLƸDQcLL!- 5;r'h Jm}w3.ɍDrk!>1[)J B!$N 7MO I"Rs{,)؉O7`A] `%8I M+Ry%QACX(Cԋ>G$͂0W3n52jHv'Ħ:cB!cđ$(q+bRR$8έ!I7 b "?FB!Mc H%ֽZ+_]Q#8#IJ>̮HeM[2sǻlbހ(],ptI$p}Uwޖ(lP#HX#B2b{o7xq"S3iz,R=$;ZȎ@E!L 4}PH" f̌q٥E(b搢Cړ¶>OG$H]g%vE*R r;>@]Kks8QQkjb&X\g#!F개|O@rEH"ݲ H$gbR &^ed&R+ng}I##+uy#-/]IDG/ NH (VvF*'z B]^/H3M?!b昑( RHhZ ""1e$!=>g`A))dMAY 4sx~C5tXv;R\_1}!TYȣVģ4v&$!ϋ= `i!6 1)tNA_#r oesbv]+P6X!Bb TFѸNA7O4r%H$)A=y~4aUiD KC<2HiG.)BH^""sOXHN2>W0Ϡ>eBi # N<.IH< i$_[!RG_Yu.ξuץiTۺ4rk$t+ShD!JB $9]RTqU҅]Hy0 *zG R=M?c ~?G<.QMvE b^(  m]HxtW.S)!uq>'r>ww.g##h;߭yoK$&B#ͦKLZCe ApӈDPkq놌 $ s5Mׅi[! Si >㊺H܁[:~!B!@JJ]W(N@r>X$^lDm#cLY۷qϹ~G)_~Hrd! ii$f,,e_|n]^E&a~:MGK. umH:H!>qJP {h"PK6îhHWe* 'ҭ";af"{WGB1BHԧHJ['|:3F',Mޗ!Mb~#BȠak&RW)I%]7wSg-yZ6wm3AcXp u|nnKRٽfD`ˮJCDg C ]v !` HiQZQIIIWsii }}:I$!IKcW.MHE!_N]Hr] ء;%tVi[ d0DξEa2v66? 3B)Ӣl\Ǟ?NW'ud5߳YD8ҢR2esBWqŚ44mӂČy"Q <=HSGml Gl? -Na+N@ |MNBbq4.}]HפԨy`[A i ģ"AsR>ZuNXcw ucD1vI.Gl4kkev񲴴N $' HiQZQ0!gZK1(δjΥG/*SJ J+:"y2"-\]E)@#FhDX 5o8Jň>H >} }E=TB(Yܨ"wqo RbH yIPTu4!;ǥHzDoK'u2t Kݐ8lZ}< Q I6 x ",} :^Gm8;aBE萤GeʩǥKڝ.kg]BHRk#%[QҼIpLcF.]ƈ>fWdNyUk?}n5 "9p_hc #1!b;y^#-X%20T"q'L~`ԬXNIr0d,/BȠ- /}]3GwEppa'ftҐnea® Dޕ. yc:ݓ}??B2pTC@zŮ( a{/loK$O D):XG!=[$ىwsI\6Rp:[!Rɝ㴔uZH>1EpJ{p/:O% E"3݋pJ1:-98- 3dm8_u*\0O#E'"!"lr!2ThR(nl5[#RoC)ɎF23sN\DRFlHP")^A !AޢDbLa|{(LX0 )NNHD(%)H@+\WB[$-M(lG:N,mz^ `GA{>-q;p|5HhQ" _ID HA50\~9_,`"2 $`-Uc:feBG*p҉GRרBKЧM!Rx\$ָ(XWHjD. i !KN)ueLg{2p2WD9k!GSB*&X#Ef'rB%繠$:(BN3B+E!-(޷]‘{-l xLz>wıhBOLW "솾8D`sl1^C6}n51lD!o /&՚W<~&!(4ɼGREA ga{e^:nw70(oFtB;:[v6ðRq|nخ;r Rڡ>6<$GFgR=.A!2KCDR¼.X彰}H:)ZߍM_"?y슖$SyHD| ~!>Z:4"B)n 8$/"ol*;E:B KBִα^E~xR- rfw *D(\ֹ$1=FHPXnjBHI$MF!XzAh#7e]{YP\eɉu[M$u w\`O }yt<û5hE)? %eH]aJ;B!@hD!DRziQHi)Z=ُL|)MF6dѹ̑6_`^|-1s qQxQ#/*m]kpA"DQfB!$ov.!\fRڹi'l )8Qb1ӺGݰ +2s"Qz'cHHH$_:e Ҿ0 D)=-H;k+נ}%JGZVBrCźOBH;ERۥgݳh^MwŨ##F%J)3ˮh " l3}]:?JM¢( `"ޕHF|tG-u/LvLY]BGT^+N!6IQ8"rQq'Hog ga{6 H1nh D>be#NtࠡCAMజ H,g Q$[BOޯcDaPD~>l_DN6>8Ȓze ?iH !9. rs|QF$7 JBi$$O`w ^M]/;Ly *o0oXiDgp?`wk|ER}F"=8hy= ְ+ GoǬ b/m0BBZ!. #'BB"8 ;O `p'5 <FfO` ivE Do1.ޓ("k15#Y؝~ Gv ૵}?pMzĄ%r#nOKE|#&C#3fMfBˆ4 \B"`?Y`c"Z14ztSlD"wZ*!ErZcs[uM2tdBJpR%MUQ˺xĨ#G.t]/%_#c/ Hs7ҋ2s!>v^o |vWmHe9lῒ|GjOA522r|ɈBip?H$"u}vDʘ.MTd^+NϡvC*pR@ pݯ.7u GMmiEZF6V;a}/Z.OЛǥR]z}OjGGG?755-phpZ^^j*'''oёjkxσ gGGG&&&W^UfBH'D! CTtE#aq2bg!b ț:'9wu03zu0, P .nk1OH9HsG(BᑎeH]tdˈBZ널9(h-v-l?djjuNQ;wDc>mib"+W~off滖)A!t $3332==J.iCS1))⭮/,..x?̺x`NuB! I<82aðEc%"v:\Z3c"RE:pxR@<` #1/a>75@/J$<2z-OHCL*"7$JYfuׯ_w 0&\zUݻwMI?,--}/BH+0BH1>qs+҈:b:/$@"́Dco$! lHLcwqk^"!iA2[/ul!74ģ1]OHq6DoNASe қMY__jկ/^\pyy !$. &nGr| |?B R]94H\^s֟Ɓ;] 'Lk=E-$ YPSj3?0)>i?ψG###r yG.o" ~:xۼ\!YD![οgNޟ^Z5{Ĉ`BSN]b AҚ0@8W%!E siD)ݐrP~XH{9 )ɕ+W2>^=8BTǏ !$ !tø=E(v69ZG'[\\A\Cj8^~-O>w?\ZZcB BH@*8%<&$O+슖X(}%9L "bpa4^BϾ'QI0CO-c&l755}qFe=HZVKKKGN"BH'ihvf#Q\"ݵkDqǁL E9ίyģyHX$JEk( l-g6]6CHiw֭غHZYHB:A Nq:!(u(i~"&H;q~Q:.enk!v !_ Ci&+6A}DR?˗/!lS >X{bD!S@,scFA}HwLhXѕYT$x %vޛIuoDgUVemnw݀"h*"ิ4(:"㾌0>nݶ,}}眪'O'"N}"223g xռt0hǵiwOl.--]d}p`=-?*GM\GQ@7ZMĒģ}RQ ?I@!;h5HPMR5zTR2H@Z5@rH}G+9 sq[\S8;W\y*YݼyikkvvvRXrHrQ;a@u_pqTt&~5{1s.&ICKvL2%0@ko atl7ωf8D FlpگNLLƍ 4>hmm-wxxE64nQQE77 4/@c4Y>~ ة\[7Hu8}ټi; Z`2qrC$ZTuvlloܺue>> {7ްrj~Hobn`@/ݢ*iElڝe^#Z6F:pd-|jIkF̐ .~gee݅B^m}@"H5L>=62]ֽpiFw[A D۷Zg9ڶL*GynÅ.^*}477c tb®_=n_ d @'# eH7R6rRA@jMF@&r6DP H8lWX}Ev) /k.2 ˟C쬭į{I\.@@@Ge3n7>U#&#'V"T. \H*c )4[x4@{.>j^Y[C[?^s1^t'fffsbyy&$ET*O%A3C`H.H}pyuH29DY =S~.?.>i"zzZ<::rm.X<;;r1QTꓣ2g.]:va>ye ?gX*:{y||禧q k׮oan8J|kX?$S zB My%;^0!⑋3R*E#D1i4;. 5)&X4JBf/X5AT_xrr.b4|_BԔ''U ʁtůAX\|[*^\vytŁ@"қoy{w'Sف5`XDVΒĐV%Q{H_JUnssnu鷻u2 `PKE_H븁V$ZVRu@B@6*c(' u&2vHGyNą߿ǟ}zzzα)`nnF1WX,~{R陽ŽvR|}$ʊhfccgGsTf❣4j}@*ZFZK͖92zپyVIE"h_}TƮL:ꃴa^QM_ʹ5N€'dB7VjÇkg|>_). 7eRΕ+Wj*ʳTsT!K u7\P|3 [+HE}Dٖ$h_xꟿ)=ʡJJHM Dt9Tm MX[[{vvvArM8sn}jcc;;;+333_~,6H0䌉D{8`GX>sB+OHP]=\#Q[k0$\~UCD.~ڷw3Yj /`$ zJ\YĽ=\00Y&DE\dq1I*:F%>t]ghߣQ{h"4@C!ѱϓ  r#qi{{-r3 &'Ν;I}\r9[X8_-Pe~ m/͘"Qhd ~?4Fo:CF0C$JAM..i90j/bT*Wkq*A *c[ h`E2u8~5 ! b?`7Hg񶨚' UHD2vJh[1\0xtW_v(KG>okk[̳ܽpeeŮ]Vs^;::[,) 0p n#XGB1) Z(=k@@ A%5?E%z( H.>f)/p̞%O#3 z%Z1|vYdy3xcf{vHgyiT$ze[ G+{<Ǐ?{oo0r]~V`h? ;NNNKfF$H8gYFh%$ ĤL׍uݢɛ{FnQ#\pq~ aCMHr?k9GO96ODZJ߿+Iz*0B`Ͼ.XaSZs'Ec܏ch]ԍԒ+|hQ;W7&fG8Q0i]& B*E} 㱿ONN0:d!LOO?{^.肀ݐZ\ɺy=P=GzHu]IICƩtnu=R #4@-Hzz) yІ?~6>>' &" 龚z# 1$A. EaHg=O9gc%H}=gU^ "r9F&:^ >~ℤw&E]JsAH=6TSᮋER CfHC AȱsMY#4IXXE!"r[[[ޮ8W%RZH4Md.W+}&QD$ > d`4A@v1k|]yFQᨙx?S"R=Q^F$tsü .'4g09$n2[>:ϟh Hk. 6Ik얋C)Fk[+iӧrrrk.]ދtl_Hd8́Gn4OFFX'ȁ< HQab'xS;/"E]1),"k@]! i`utXq-|=R(s?)94^c hLԿgtR҃poo_ۆ${vf;;;5($"Ԑh~~]ǣׇ(J#bC gqHV#M[Eq?ѩ=.V Dp 81)]II}EuuݣOHCcyClC 'q(rQ Ḇeɿxcww-wï-//MB2ڪ;7ZDՁ- @fnb:%9 ^D8b~/Z: E. Ia)*ŕ'&!$ Sj~Rt7dr4ν8}gmDԆך)'J&moo=ilnnhT=B$d$h)5*\ ju/KikT<3kMLj]XL Iq@H?Za~(-Au["q%@'H@Ё,|0n,6ȉE o }u'~MrzzjRu^k]">M]BI{aj@ļOℤ3k\ޮRTD z+or:*]7A*F e}#Ό2Y9wYdYk,8aB7q[],YET*N r- H1<K/'o{℣FnVEVŤV(^VsH}?ݡHE6gL`wBI vN$\H*{1 Cߏ닺/[~nk9y&''Sب ;&&&j<{<6O#V_].nrAc͏\|G $膸2vQ)BF$qx IDŋIc7gGo4l=K:pAwȁł#/I46ӄ#8qvGHzJ=}&"= 4errrgii7~U=Eŏ# 0Y$<-[)깎 ILAE?6*oױpհgUyhG}=_q qw:EC_10lTJVXszg뵲urq^-ݖͽ6;`̽KQ;TiOx$zΣykr' {"5Z}Iv6H&y;W7Rw)ժ>CX!]yС7H& qs>h5I8I% BT*Œ?ԓrGGG2 $ Fkkk~27gW^BИ=S:&Br#敿.[}=,sţv[F̈́8Q)\.J Hg^i(:GHC"hQ&ys! Axlc17YV/0tJb=f-Yѹ:pr٩$RqZn8בHz JjJ;Z_w\=pnbSrMhQ'R!xQF_#yycv~HLs#N|? ovCpz+q#Ʉ{x9vGOHCO>;G:BV$H Hi?cRbkz$""~ƅD_{QMD ;D‘=Hf[$IF";vjJ/>/Wގ@ @7D{5*17_qO3f>Ĥ8GR# K4f{& bq#uV9߲6hMi)3[SNUoPWxj4%rwiQ.$zJZXMbvrr;ӧq5M߸q^GE#z\۫=O]5ttK<.@< ĥQ1)**Ĥf%ZXOD ^nS{^v`ŤG;#)FRj.+]n5oICG$ur\3sr;?ZBM\+0ԔJ%'DNfʯ\/굀<r5H=E}T~n`?V%MݭWwb?SlΚ ^G DH^AqbR7BR+#'vQD:"RZw$hI;Hq V;yOgr퓊s: z͞:F\|pˆP*+5yi[tU*7FM y~G{ׯ_>TH7p5BVWW˵R;;;qB{\>*0@ @RĕB IqR {~fRĸZrvQ!iΗ FBRn HK _?E7^>I @q?E3)NPj]F FQ)RTHJN"R_ݣLΣ'_2+II*K:`P_buqŚHnޗqr\H< xBe%M@ vݾ}۶ɓ'ѲvZ(]{/h 7 %¿W-ΙWBRؕGRXHH#KՋptbHBR]ԍ &ڑu#I_=0An%n'~$pɹO?6s!11#/"=Q_"R?yFN #*YZZY{a鏻댞 v"q<"DAE",Lb2Sc&8L13 b:w&C2`[XpbF(g¡#5M*ƄW(@/,Қ! u.%aDd^?PYrcDE=Q>G }tnTf[{sb^@$iJiXg±pO~&ݻw=e~S% HüI`UG!DR=Sx rR!U1)gLQbyT GAiꕰ>'$EzNJLV=F/A9:*c'̪#I,QFRT7Y,%"{r燄zXr VVMݼy|ͨ]Ix0@4J}/*];2qqN LO_q*ӑ =1zy}& Dd{U#)㳒vCn+"pQn1!4@Γ:Gr^]02J%9>l{llu%ZeccϽV(ڵk$za-_waHS?j^9J0H>Zq&5*qJW.p|ip7s,^ivRv>~xrrrΙܮGI˵u@"樕JT?'|Iq\>u:aYzepipehT.Z.rvڅŕr FٹmZ0Lɡ)*_wF*9]IfHO9$ =Cc\!kJ%]>966ZNNZI<:;;?SaEޞZ\IaGB\>onif~VyJAO$ꒀdRrhc x4A:F-sot-T8 H8{7V?dO~X}NOO-09:j^BQt&)]d{{.]}-,,V!T"s 0jH3qNԑ®FeEDCD.hPN$w)=n z&{E H?Acd]5kH</ԯkz:׹m)#)x=:(yQ#*{:m>mJhRDrOۣu쪉hhRBw蜆 ΝOs..HdΑ^yii677\./J_5 Ks%H }-,"&5{=~9k )W6Ku%CJ17xr9ʤp*Y[9E4.kaX,{\|/Q xvBI: H2r&mll\} Msss|73xqqC@ Y$*$5F"R\IFBR+ѨOSxRf|J\1Vv'{k# 3# # =IU=C7kbtWY.Hrwȕegg/ߜքL^kBnX.nϞY[2ўGfE3`Im>o65HI7ܷɠ7G[b^0&8t~.@"$ ʫ!=2$H1b7W̌bՐc~k(Jg]8h&'k/eVv% +kW.\.x1)**rmY2vOw/Fɚ1ព5C10h4"HCt,Q,?=|KWCg}>B!D@2wZ$M./$4s#<6r(5Re7ɽϸyj%&9%T@9cpBuHE(Y-X,>l7==]+5׾=+%ԩʼnEqSf D~ߒdR#'>9 hfg4tGGR' a7hL.I X,j{]q=CBZܘBy;̇}C8H>7 d$xBR7n3k,s%ꗱ{_*1?~Wmt]uVCґTtJ (~zΙ4cb{.~c$j҅&p!ǏùJ 1D"R#Qⶹ"R'TU*]w])Q4.QzP)&Ddm$H 5{ɿfCos1@'R?y5 =@1}HBSSSvtt~y B&@@ha ?vF{%#5*aɘdڮ I?oު[MCr#IHr(P({Nد!E蚨+VgҼ&*cG/$~Yz5ceeV. )L~P!I%!3Z]7R]Fg Nn\zĕ /?)"]yhA=džBܞ +t9kz#.l166fKKKYgTjnHڣ7RB ?OG~G!njnEDr?#ǑGWm@:G}&歈WE=P mhOޡ粱@z357]zGN7NIChbq$obzI[(ߏ[@RM\E҇ m2I@_)*"u2Aikk^k.n+&赱F*R9c9 N  ypzܤ_^#G) d@hEDK[|zfbR1I6 6?}([{+ D ;Yޢƒ""Ņ(YCRY E nWDjQTvHxmi^_Hl]?{45-п`8{ʹy.$Y5mhN$1TN%  3%H!/RN$ ~;bRTT{=6^vq:/ѤzQ!h0G#C0AbV3O:z*+cM _j'''''R~n3 `pt#">ڍ+I"z1o<f\H]ޓ[uL@=+8a]5~q%Ù ylhx$p| HcccONO1C6@@,:睔;ipŊAЌ"*t-Ǥ 2v%$~t@4>-Cs ݔ^|>:ـ,`iEDU ݉s$I8!*V_8D数3s!| ]vùԪ+6D`HI  _ A3IQUI;:V+1ۋ =90Yd, #˳p!b<.@+}U(l||O }ܱAY =+"U<6buT\hۏ:r=4ωÁzMD8b߇!w'lLh^/1 ;]}68΁41 o>.,,|`c E"R]!scΣzN$4as[gv^Ċ@ oKQ>>!Cyqv0L'ϡ! =!~mpir@ ߩ'y H飙)xlY~F5/(@؊ gc{.A H~`x҆NTQ/$b|?w^GHqNLL烃 4C*E(,E3kMDH6(D,mE;.vIP!i4$'3`ѵQ}]&=GV# A0Nar:@9:: l@@o"1q>PL6 U+[p"f:HhHʤc5U%#CO e)rP >/' $z  H8=YXX7d$"*-c 'dI),fYyQ =\h7JU%H0mޢ GcD $rH+gggcwnnJ8!&IT=WήQ s ^~\兩m6̚ya H Ha'gbm16Z񯡯=ö2> fGXY 4C9]՘̪ I&NaE;8 CC#rR/2RP|>' RvwwU *HG"R؅qAп!,2E)B:r ½y#&Mϐd1ic?߯s}LR HMH+*_d pN?@Ds'"1$ZX< Jɇ?Z.u&ICbc`5Q%$fL qyaIG8ǩC @z~d<CNŝL]׬(yB"ϣne$2P3k,JS?F H꓀?huYdo1)|xx*#@ \zQXDc H(RI'(B}'E1+h=cUc`4$~l (ݱhȅtȓaj GdggU `y|'$I?QT/ tut(G" "A;z|? [<{.k0p~qss04ФxT cNU (c~&ɡiG#({}HW/iR)>1$ԡz_yrrB: 0jHEgRXD*Zg 6pٺJ(.jdm‰yb7-G?  et Pi%e"9IGfذmJm |E2`8Ffe u"\Ү y4qxߘ$1cD9؀ PH:S).i83 ARvׁ>!ʼnJq"TXD5VaEe$1q8y YT4shXHҒeT.}h؎h:H?x/i\HHHL:ruQkѤqn82h?5zi$}Y`@Dl3M"@:=E_u. &z +iר]|]vHaMD$&G% Z='!kE%VsKòQ @!Ө/RjIHfBRu,ר1b4$fʎHd Gs"Arqp!ed5ĕVYSG784 `tW.Z=RDs!xhC2qm!Qt A]Rw^H0hðTZ.>h $lҪ ^9z%QYToMv#Ę9Y4K YC.]]yB>eCXU R6 LҨR8P2vq%횕 Tm2vZUȘEDGɣcR5BZUeURJF }0W E 2K#R)*&@jEDÈU2h3!q@@,"B7:r> A72ZO yc.>}HO.8Q3(N0' <d T!E1ώ2v ߑ<驝0̿t.q'@w d(.ĤF5xv4KFG9QҔ9f + )+|_JNMM]xmSum\p.ś|݃ J1, Ahyl$E{"EgP 5b}ʮ5hq4$$=@ x_.U`􏳯D@?>~5ϑ4DtN?G HPuW..#)*${4e&G% ]'2VzK@!}G# HS"a-iݸqOAx#\.]|xG.E?0$@vhDž-_WOH#>HTN$>mI^P[=z!.?K̜XTp!A?|=}~|ȼ i]^w]D2@ "Ni$$A:bRwBWw~"1 >}4AGM4@1 In<?=F)v)i۸i;bj!or.StO\| CTɅnߋ HG׵:݃B}tmn^UHf5isM+E{pe_⿸ :j'=VW|ş=!.>/&I4#?xy&#@@@0QQ @(i',EEzej煭4aɣȘS<RQ .s> \\JFMLLؘUH< iaaO zy~Ef.>]KE5:wOx< Пc<HH$kz.4Vs =KxDe>*dn<{J@<** qu0heÅUNKw_f\,455h{{*eH8Lc; I|Ɂqe좯/s"Z.߶nOA7L$ H̄\d@xEe.R*~=|6,..^xMӧ C!1~*tݞc 8H*gT(< (Jo]駹Q= l~~>{| )2LjVwa lk"$*X|8S~p`Q.,7=C)ihȎ`vXJ҇]nJa}p2˱t?'sؽHó{Kci "N BDoywܝgMΐI,=cD.$J]V 4T*q_꾼Be~ļ]bšp\?!Rvqj̍4 tZmg9 I 2[YeʿѤ! %5WɔJMcbqq.>v߳P(=}zqޮIfMy 0SQ. H6VzV;W+hr[yf32@h,ׯ?Yvq<~T2RI %>dIb^r6g1Ji7Kwvvn Ǐ۝;wb]J!~Ш|kD$͏>9:OZq!߳ u:VgDɢޠ q$֯Ir4Ҡ Ie# RI.f$͙tVWs,DWR):QnGRTGFω,#h4/" k’1gdww;^Ύ$C# m!˼v,*`r-N9qzk4I'Qo2P! Iem=!LNN'NJɏ=rL ʿvI:KDkH@@Ns5+gW.=GF#VO!.cg`h00?277q߫T*Caa=yH`PD ts\F#W5xS/Hwݬ H㤡gH@Ǎ&OH;u oXI=k$"6ύtt@A@Vi& Efr1z"R/x0e\3T }qAKF;0uommz"A)" Hb 3@Jŕ|/*ʼnJykO)wp`蔏9h9)zo31 sdnnjjn$,HCO9  Z|=Z.W @q=j$Vy%)@giT%A0bӧO?q߫V+ћ3\p~hidq0 "<+eg1cֺ &T,7gk#h˿nQrpȩ*iT^p޽{Vp?/2,k<*czBR*X A1R3$sTR3R1P2vVWW377W螞֜HJHtqEt@VnQԊԬ5^<1}LZI8o4G%* ;T4 BZq1C*`ДJY=|D>okƢ~{\-*xy%.@&vzzZ~2t+K1 Q9Y34! @ׯ *UD$Q`<|paa333q۳Ǐe_2 Y‘Jڽl^S2@?o&E{LjT֮4|Bi;ݡr }ȱz<7y˗?ezzz7;;;FF. ]n(fU :FNfn^=mgD`/p{Di.8  ._ooo#"*=.>J*RuOq]5J 9rFT4j,YI$mB1wH@BH_T&EUI{_]]-m}idb⿓Tr"ż̹ IP]uR{fލnUGF+{K Qv,`tɘOkz%"iyo)Rj/0/ `$`ЬoQW+~!D)S @Hf^Ġ @ޢGLt${L隆0;X4lX!JK.}իWP(\JYR!YÁiGzx%%0;4@; uu޿z7JhA)r D\*c7F* mJǏڵkxjjRtxxho񆝞2DN9;.%C{kDI;ZہqFe|n&,CUcbЄ+{$8$ˉm;&\5ODbBRލ7>}qqxXDN.>F*I7+iGJЁj/ĕk~LhzݼG,8ry7@o-A҄pt %D$&!?;?-i2v߷m.>[ ;O"m>0T;0@4+/@fF}мfqozz! $D#5Ҍ/"H,HTS*v?~[nwnnBoµZ@*x=txƼ< v"dVbieS>hH-r_c@ DO~yODHr!ݻwh]8 o;FQG%nxÉC4#׃uP!wJA,sbLnCa|-0/߾}ϹsnCLE?.=Ե㲋\LH 4@/i}vhZ7Ozģ2i6Ri 腄RtkW͛?;99{r /ғ'OHT럺.̑*gWҾ\D?%c']+"6C^f)rɑ2*wH59HRך"ZW6Ѝz&I@*dM4>S*& 3J%V,BEZ*UICL}V,Ǔ-йcOH|ɿy= ڹ ?q?W~ݔj2f@*_W =?NhŮQ3-,Xv( T*s߯(B𩇇_\.|DIg~q.ϑ$^i"-[.*ew<Fu!H qOT4j2j$DEZ jp 004>H.p\MJ]:2OTҸt‡<رI;or>?zpܶ,+]@BHQ"}ka,R4 8_ݻweoopv >6=Ve)çd$Ga}m6ɩ.үKH0-Æs5VzS兑}ӣ@ed_tF C@ )xBYzѣGHZ%ĪIj>.?|cm<{n_S[, \VV22eyw.x`n N_GCDS0l入[ ̂LV ⑀($6lYTFew0^}gtYa1)^&2GE4̊ pȹ deNn $jYT3[?QD{VHw -f`.%(~\Ld/6}D E2m e  ON,$BRfb;յhNZ8ld*ko93jd)Ô? :rrϥxÿuN9U`]3nK@D v/s5gQo47S  @{pؤ ` ӐrtuYJhh8 Z q9 );f^8{>φPH@#e!yn%pX\,xÆǛѕĢxQ^òrȵ} 3@Q[7B7ZHCBp56&LqQn%KHCCLX7rcJ Fa6ukeުV?EVsn4cKRMvwE^?r`tYiZBjo$$j r>g?1]G{(0q\ElqŪzHh^ڿGKoVeihԮ%r1 V-+Jj]nv2;) vDZ=$  Gc'Ρ (>3?%YYIDcԚ]+a懒c8k gxmζ.gc?RMZQ 1n 5 2, ;XwWGt ,>y6u#Iڰ'}e=08 &I R$%ބN.hPxH fU ɶ6L6oHh'(}hg! Qǣ*t 8|]$oUCY f]%}=,ax>?]qZ)0"뺷y1b":wAF-$V۬ ^s=F򓔒L,..&!(,>eGKg&s}ru7@Su( Lx;n F ? zHjxK[Ưu^- k"Yphbqgܺnx0B`M]TSG[$2p+A/9.tҝܹ{vݵ7F3f ցd@@V Hc"`)ytv aw 귣vذc4P-mמ9[݆߰T3N Jfe) 8[?*eυ6vӢBoCC@XF4KA7Pk[t޹yp 2DYܼ?Ve_$ >fNH)(3KIfeA)Eqh8kؚ:>kc|.VrvLm# #`)]%V uo,5j@c7~#9w7z3|Ec\fe^=DVْSd ,$c)}4GPX7$eEYH f])]\c# tsl$Y~;TQ=sn HB(tZANLb pzbg8^5-,$is놅CvX~w5,:wwy|T I.53E<cُnQdMDl ɦ;m]6Rά,(gzkyȏ`flR5cM[D#8-FE\C9oV\ιxt}O\gH<dHpqUu-w ţXPJFHUPʉI%!  t }]F` ]ZmP C@樽1Bh-~7j_Y Ƴ n5rf 慢&HqVұ̚ J]깐X0=uuMRH LsX00=儢8g&sscKg Q a::цtEP7]Fk;mHx߸k@l XwH>Φ5 ^JB"4+eBxtOI<hl2muˏBR7v:n~!"I#uc "-g mfZ]&o}+[%,r%˻D$zfE!\=8|##Y.CcG<;%ϸnUMee@gn|Q&2\q x|my{'&MbiBQ-rv ch`v`<FDsǧ #Q-۷ YZԡoCw $NFFviԓQvد%'>ʂ;ĂM"ѭ瞺8kQ H91)I%^ -4I1oJHq# GQ(JD$K{nhq`Hoႀ=C'2-5-@nM/1i?"[2Fd=@a53MeڳT'"6ƎEB?>k*t nX%Gw56(h(Kst D(,XeM+kn-s҆Djji~`yQ* E#w9Q L,ŷt/kem,K[I0|G7Gn us(!IZH\h!X޵ʲ dÍuʄf'Ʀ,mI4(+=%A)qݦI=^$$m\Ql[v.+thG 4 Ѕw:yqn%B˸Ubڰ@Bzn*MU# Dс(6lbA)az7fp9 NNSu9(eaw&vl}f!a_gh#cʉCMd(+3[/AXHu Gd!~>JG$)o죜}],!$4hNw]C@X=48λՈP K<|o0@iʊ>~3_ϖ;iKQ]Q+\R⑿B!(%09&控D:(ʞRIAsoXI*_ܘ~$|R0,1ZrkVe*)8[]Ȣ[;7܉;@4TQxţa0!m]ʾ#1?ƷGaōRvA9"йkX=ݸ KtGиZHvX9[vk"⾻DaҴD3],mX8ڶ0ƒԋ~4xD)hDll]פu0/ i1`e-閑Ew`5r٭)%yr,%k:g ֳ,M]#myt~R/nImhd O*(ea<[V}4fBu6 gs  ru;\t+,?Z33lT! 3B'%)x{6)e^rF)Xb1;mюsF( WE翌tou BV£6T ~4!,$Ɓ;` >G}V}F3xx>TIu 0'|apŒY^TJ H9Q)xfAj2ޣ|8s*B}3KQl'u2ocLj~* ɿ_I8"; Vq]z.(U7'HR9lܽ^:h2l3]8I{kn7QL?١UN [Uȣ:_^ZNNejN|<%$bf!#oyţϿ. m"7fn$I(VD̺0`Y ܩy՝Dq[n֨XE*1 RH'-fn9Dnz[l$]J4 G8Uj}|j#xP /6afR/*L9(}j}7iu}]}ՉG[G|@7,/yYy$GUBVv_r*x..pŭUI"6Zb[R'.-t|6P%T' mFN  WhiK߸:RRGa-$"ģ\R,h.w((}%:٢ݼHD 4$XmZ75 7>wH/ ŋrt\ 8XJ^, H씲8(}ԏK0R.(qhGKg!!$,hwc} $uC6(6k"BzakvZeWB"]pU!~] 2xrIm( FJPw:5^)@#; V\ݡ8(M5$y HuQi;t80#:-;b"&]cW[o*(!KZg.T #gu>8#m䅣PD BdXX t8% 2-Y#dG]JvfdhJa,`s:΢$ce,cԯ%Ī%jk 8d6iO˼sz(HqpmF5B,#ÚRM,G^ R֑Q.e_l>i&>^@|XO4'P-\;  9f5v&#oaf!Bz7vRXb,}=q&ಮӮTQGd4E@ uÚ18[%ɶQ.XZu8tXO4+ehؽ:U%Ӫ UPB>?cq^">zS0tndgOle[,~l#w#`hb]glF)CMo$GGV>¾v_k=OwtBsd!:kw] -P*1Vebi5b[XD K|0ec|`k] -r}I4v2[7[a'>ţTcKי碱zk\cαn,nn8ZQe6ܸ,ާҰNrqa`ɮخ.=r_&\{hKuuQߍ4udYsѨHPe7,-b=t)`̂\OʼnIż(IcHrcwh ZHj]7zЍ{6y G@"=oݱ3a~םtD7Z_Mͮ{Xg}l55`~t|x:RYH8MwJOZYH"@u]}H鳏b\Qi%2 C>cp4=7n^+`UHHYڷټgTG醥$%x͎2k&k$mZR/@ufXnku]Q:`ޓaa\<^_kC7Ql>ch=[ܠ[60~mYY[B|pgcA(F껉 n}`k&[8+V^9s. )Oc:/)hQ}Nn !ŎaóHm4kXt_ 閛XctŪW% P]zUqg!`,ױ;ѵkwXmˋHAρppssu]<XE#7z;TQ}]*Ɍ#ކgXG:ќͨ]p 6ޱF!ufƮ[  Z%"[M(BC349OQ6vqR/hg3CLc8s 79Ժ.nxwc E &Qξ.WgkG0a3HAe1T6v\y[UoD, JUġ-iR(⑂Z޳WYD; 3 H^DHA٤]rH 8t1Dt53;?e}TRGa}u ǜG#ј/ABBuӜwK#D7V\tH+/"m-Me!U6Ţ񭠅䅪8 `qbrV908>Ba Fa֑7qMX<:t8(e_dhbCFD٢}4ko ?&V(!mAV.R,ApN\Ml[:ワ0 FaR|Q4r$X&2=YU)˸RQʂnMvB(} QGY:q9 u}uF;e75淺&>wk܇VHgP.ϯ6o [ >A}P .dtU|Cw?ece!j! ò uv̼gr.=Je Cq,gEl*(}Է \ G0#^@ڦ+fh3\Cd]WccAecխqUI;P֨_*v/B>v̍IENDB`images-actives-html5.git/src/share/themes/game1clic/img/show.png000066400000000000000000000024571250410645000250420ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs B(xtIME  #4En@IDATX͘oe?3;Kq!t y ƫ^ؤe!a=A" 1xhh,BHI"xs1..4mwvw7O<J%9zfةAqO|ET*eoOIO\N–=F ) rbq]D$\+uN2&O߈HXa'ʕܢ_wj.jDv#i JDݴTP՝Q3TS3"r;SUea`u\ݿGg%u ?IENDB`images-actives-html5.git/src/share/themes/game1clic/img/unlock-icon.png000066400000000000000000000027371250410645000263040ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs  tIME PYlIDATX͙MlTUδ}W@hmB"q1@pB|$b\;\3*4q&4AP"ĝPBCD0kZδvyseSս7ss=3 Sjl6y /+D!:C} @:L<M$e>b 8Wk)97e5;ùSZs<|`y5ɝ~uN/djä ̓U`94ɡ]/tmc$%%^3$iL;7qBy ە^Hp.?*hk!7j^*DS4tv2OK)>,/;*+෿Fi#>z$]+/\f4%i(&LrwjCg1gゥұJ9= @B[_A&`&[FNI UKt YS9>7Xz\"$RD 6fS&~4rq^XYi* 28O"u>WPZ{80n~%.U_ |ɦc( ڊ/?#M%ٶMEi)xfs_'eְD^D(Qt32mYsF6̩2Z[S\ *bvQԄx1Sr)x_8۾ ,IDiZ78 \E uYSmP|ܴ ejj5Dz:: ̦M=7J$$i6׀Kt# VM`..Pd ?``A>}x; c8pL7٤Sx?Xd>(Pȋpf Jhqat\F)R1CбÝFrR.c@x4+jo ( Ms$B;% )_VLqJD MVCrF#҇JFWP@XFSYĻZ1HvT9}h ~BI t;{B/2+]?:CVg:4o^g]1eH d}!52~=NVz}!P3oXE/*U^g <3ѼEh%h%6**_zH$"F,ОO`o4.cW sd(3"r*)GP8}Eӏphb;~0c@~ ƎoNy܃O:mk{qT⩪S*C{.uW/;icgUV:)As7nxsF/@hbPiWSG7<,(M/rOCHÄٙطiιY (?L2[RC9JQ2f|.g~&ZaǜEv4#׫ bR?Ld }tUt;72{{mA 0RhCi%u׬[]v!5bʹ{[ݔ[D5+ 3Anlu/s$(yU~4E,fɍ뉴48j=%Sx~8 ۰N X9( ͣC泤Gj8kLN;Bw#uն}`eakffՖ̎7ۋt fmW`5a}$Ny4Z_H;8HA)LC؁uPF˯wzg5PJQ2Df|VsTի:]o&ڀ(q '_-Np007&TbX |'^\yA{,B!=~uӻuަ{Ë4^$zSr<520^vc/ ]Oe[J_)e,.-{FQ o,C5>ƶd`Xi@S((R4#]iPH/t00lF[wҶ)y*}xU ]_A%p!ʔTg~N#-`˃Ξ'2nj|㔆l#Tʪ$/UVwz!ס(=rsSTBjh":^{]ް53uS:oM`'z@ JmģL:3ԯiF [ﺄHQ7r2vXXcv#Ic>r<ӨW:+KkŖ.ŌGRJ|po)oU-)}yKKۭ)`>K&f)O4^|+S @m7ߏ.JD"R/O 8颱uW}_Es&M}x8=9jIdzoұV_|N% d)YrtSK ˾ j Ȉ=وg~ʎZh=U LYrcM4? uU6^'ιj/pi8DP ~0k#HЧ KC婟ϯ5 <}Heq#Ys)RIE?D+(aP0u.Yo2[{dG/07+wCv(E˙[ ǎ`Ɛpk@Jkn^Vᩘj26B\ ̡LS0ReHF9M*]b]t,If">nd`{ )>xʎ9 ǝpyB, J|augUT=#1Jezhޡ$*S YɇQ?ҹ'[c JP8{c9`॔9ֿ- .$Lhv7D{1k#ft+^ZA^@ټ襕6iN 0< [# F*.@/{"ī}RZ.v0PD8PP}9HNl:[Wsn'> k">Y,b8>nf<N>`}۽{:$=;-fJ, \\C %@:+51ÈӪF }8c _k\F_*)0cD#p+t8I+2 #Ư%' D22(ׇJ>" KYd$cO:cfQ kD9[쯏: )y:aQV* E@ֱWI <m Q@ ,G`Bwc Zk6ny" lŹ4AGcflL=8/LŋcU`M9j {&m:3/Q>urIENDB`images-actives-html5.git/src/share/themes/game1clic/img/xia128.png000066400000000000000000000130631250410645000250710ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs  tIME  $1XIDATxytՕo7yǖm"`08 LBd0p8ä-8!4K& $ Ɓ !Ѕ mUꪚ?ȲdIUBI)}nC@‘(ty<0 L2Hh0՚~1f4UgB.9b`)P!5+g4U1DqTـ \9]ܧʺa$O*˧j*5Ӏ`%p*[/.l 5U1@)6:p$z$ex@GX;Oٹ-H4ǜ mt'Wp$S{N.}qHa‘hVr۪_Jђl GiD |  < 9њ(AJ媷.J?p9KM? !cHTByKS9H B@50ٛJB`~!.MU&yVةB;QٓB94D_q+!$9 *`[@F\SOa;6_mc#An?B䎝@AHJ4Uil_h툲!̻L? AA;/fGo;a)?_-֍'Jɀox+VĮo԰$S*8܋dBD)Ñ:`'`MSd0x!$G_ 4Llǻ#atXDqJ`!pg~!^Hb'4H G!%P<qWA.{]DtsRHA,tˮ TKݿDW F.Lz`33q0>k‘9vf4 |Gd_x@@UJ%?Q!>w)nw5~!lL ūÑM@>2zg(3R?`20ɟh<٬Ҋ!aÑYs~Կ ^,=f*CHtj~{wlޔS`B8ߗ8^'7VS3Pɟ:!IIFH2$x/- Pӱ ;)ĆOu*f"!W?PHBdHtiaV$B_a_v?~dCG޹a`]!):O'obaU{SʔjNj=74u(;k1g-!wbVa Ț}z]e 䔑d<˖A Ӹᯘmej N` (9`;Q!z:3#d4o7NA{KLoh|U֐5r"e\NI"f2k~מn:7/d S4Ui>!h޺m-u2/T-opdkxz4ɟv>`M˘ʧ2})~jLFw8N7s[hs*O+%gl%in#m2v?yTߧL?)ׯDo4U'q?R;W8iE yEdh=B-dCׄILtW!u (=Oޞ"Ulh,b1^hoI狃@BNE[|D 0:Y ٿyNUwp!a3!s7D>g0NJYK0 cH`:O) 4b rQ 5iKφ#QKX fދhx71 qBr$TVA**fLӠCi޶ï=E~O Vr'bvS/!a_Q2%\Ϧ;> S 17PT5`A)F">pS&$`-ЫOP\#ǬKП6_o> 1|-#f_ocL#J)|+| !;o0zJ霋i!@OBYD8Rt<&^}?|!lM`ZRQ^gNewz|KCyklǖ KKν 9a"+h^W,9i$ӸjYN3P.ABe㆔ ';&3LY>\EZk>gU6_tb_C!CotEIr %xmM[n%ZB}q/z[8v?I: c~ 5]\“灞+ӸᕮDH2$Տ#Ax%Իƒ쑓͎vYfn wIN:s.=K@ f%`7CC7Td!ɟvQ FG;"p4ر=Kߺ(Kx*bgvh]#w-'t@l{~'$ aqIֽzk:94IS^sv4;۶(_ f;~)7Cج򉘺Em-eRx|0ts1 dSQWuMU:: R `rvg[V;ydZO+h&dę6y p2n 9zܱvoI Y󜞔%}opۙw ;T!2)Ŵo=5\Le K6#Qnr$#*(RSR5c*uV'>ޑ3DV#PXwMHEQ@*g`IՏM^- >FlNK%C;IW`k2Oei8RK >L1r5 aQ_7=ӣ2:ȝX=t6X$4U&g -w&g^ C C||`/^ p9Yf}_ACEBƒt qiۨ珎H%1bŞ)Lu}n:X-L ZAѶirqvQt>W9o {V-O/eGvBi5иlllz#Y}z~G3=iN"ف-?y[rsv۷YhIOh*x+#\TG.4|)cl{!v3J!|TMe=o |)Z*[^vB8BHlJ8#ֿvu\Te3Иi-0vɭI3:|"!ŅDl":uo?&Q4UWJs^@qxAeZ vVd)zkSJ 9~N=HhC\'8Oh?ਃ?M?XZ>SAҬY 5v?q+z1iS#1kZ7>?/ޞz s]&np¿\I=vƀ`($x-5'.dcc&\6X;C{`A\H>$jݏlzrPe* #h5Ҽ-j׮J41g1Knu/T帝`Dn4o%MGDsO`)Pwi‘J 5eeCr4t.s.sO>~MU2^S1 _Y>&eg_BzaO=1nR|*. nYϚUԬ/߃_z%T|nV~ظzExxLJϾIK t6^^|Tځ~' cC|r ];!gLʠ *4Ht!g&-?ʿ{r7|Sk{_U𿨩>hk{1Lf3ɅU?+Py3HlWSՃQj4U!N, D͚Խ:9*. 9^TNLB$LjrC{}k/gSX9BS"v7֍/"@70|v j׮ -L\۴u9iR~ν1'SZ |&AB;b]qj\+HVvlgdZTz숉܄ 亅ΤAd^>ɹ8zU+=|SH߉38e;љ4*AG A J0ִ WL⬮B iԃ,Y#T4Ak0V )}8IekqﰭtV$YxثGi$0K[m0#HZ)f_t%o#7+Ŏ:ĆRr@l;BxJ{)E)E|l_c bI~ {rpŕ@ΎT)_XkG*[2OYFJ?E/T#2*;ܻ*%_=^;b%#fs. B;iNC b%IENDB`images-actives-html5.git/src/share/themes/game1clic/img/xia32.png000066400000000000000000000026111250410645000250000ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME  %,t٧IDATXí[lTUVJ[Jkm("3E^|A}P%j"!@A@$A0DoC,Ԋ/d Z CCzkgkmAx.8v xpn66r4`?h0K`_q&dܩNb"o6lx+S6D6,3t&*P &iWZӶ{5CO=@Ur9d/MKۧ矦{[n8@|nuD'yN ]n)Hm͚8]+{0"\quϛ֢B;5=*[ v{dmV}`opZR2pWc'2jlP-6uK5fgQ,. z!Lf:֊X1s ts/MJ1j,fn:tA]f`48z=dsBR# U0kp(f!ZѶw} !2")度17,\<<{wLWR193K49ڛCJtJӨrk$Xca2xM# bγ(-/v[K'l%p*7EdRƬ-تj3! x۹{$ z9b hm)TralE-UՎ|ұUNV5#H(Ak ī\q*7Z# 3q&,~5z*D텈mci)σԭCelAZlINr!s-*Bz8@ٜExx?l"T8PfhDCar$H3c<3B@]g}df̼C2PhvBHSc&,BJsK}ܟ4,t*4»O&MS4k):pQ>_4B2ǒ؏bPkY=@T-YE`**}tcQIVC~9hV $ֱmƌT8aA`QF\W")q MɃoO>ӱ"e+>$#Vmz\=]u_%q:#kHz7׬)s hM'=,!a.ܓ4qO_w]B-8x)ٚy{L2C@zzAcN|p7 z`|q: & F'269q7WH|IENDB`images-actives-html5.git/src/share/themes/game1clic/img/xia48.png000066400000000000000000000046531250410645000250170ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs  tIME  %c2Y 8IDATh޽{pT?{ $( >u/[NmZ+/-UUhgtth`ŬvU¡juPƺEPcdMqMf z{!LCONFn}]U`/1 =Z跋1q`l@04X\,]Exl7 }/%(!ss]>v5 +{J =`=~b5`(< ,拱6`iDB`h+@x|(rK`* Cbԟ20u e"FϒwS_@E|,5wй`:qٱ(O lCBUiA Ν ֚ЄJsRС0x EU,LL&`th<΁}e $+(h>mM&d jv@ځu"mA G@ړe&/c)>gg%D<9 ݟw%q'B!S @04f-lٸ[BTnӁ`nifRNa$ؿnv|qLU"j*鳩MkAUǀLC՜ 9؍V᧼i>V,R慎|;bќ+q#H !ڵw^@ ~b}!v|8ZpY8zoo}ȵ Ji̺^E1(EE ogI_xtPELC?U@GW||vz۞GQS)- OM= K䯢ʱ"aȎ-XN`E3i^u?)H(=QO ? x΁m9v G(J.ȳ-9^K|M4`iEϡ/XFI UϠEAJbG:߽sWT>=̽ys1,=WEhďv1[@?k̸.ʦFZBN xBH<3,souZYmYH˚NUs;snڄnvb$i#m ;>Bܳ8i͓~7-ihU9W߰Ky(kB=7;ŎdW{oбG?v#=bې>x) u<B #?v#cEBn&_£<=s͵BR03y"áG'A2sࡌ6EA G_J;3e,Wlr޶7hUS@ ߕY 9&H!0Id2Ar ^䳗?{:_^H~1 'pw 1ʇgfFB\U";> -9o&(h*m境мz519y %;_r%vb$߷:MCo;MpЙn2NuAt}J51ijur~ԅbp0>V臻GRE@㞯oh]AyN= Пξrl, w޶H{@[(P<^j~V㩝6^eNLC7?π0 ]:AlpFۮfDgD;? `htI! q`io&eRNupy9k"zLCk!&g5/>.4 x@@x?4'rm҃+OO3Q^H B!Mn _9c"RUIWnN@g3Ҩ0 t3|B IENDB`images-actives-html5.git/src/share/themes/game1clic/img/xia64.png000066400000000000000000000054251250410645000250130ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs  tIME  %HC IDATx͛{t?wf7@L$1Y W COe@ Le]Sh BQgc@Gf݇뗱g+avf+;T{{ϼhXoca/f$i+I_Ͷ&>;E0K ˒3'W|s=U>7({/)':Og v [MYI;) s39m;Ɯ$s|ӓU'EEEƢ4}ʧ~ j^Qfڔ.g$co߬xCKm,$8#@(iXɡ(Urc&#XQrPr>|v߄A #ޱ]՚.a&d';>&ϢlTP +B ({|8Ҳ}%].F!ޮ|{b~>K)i? +tr#߆Rgm$܌URJZF G:+*KˢF{ ˴'AO8L wryE>AdFx9%q jKPȯz@0SI/7԰뉵5j~1#au,/gKCVZ46}tQr ц j&R"Dh% 8)9yǘ?jip I)L)>?o_ֹn \жk)՝3#H+&K '?>ط - . ?m+Wm{mwF3EnŻ7p}mEF;6㳹㉵E*BUib}uRI :?6dEq_clfvk>x* s܀P2bE5S>ce4o^a?OYohӢՍ@"݀`9:hH?~coWE | {9{k'ǒyBвy;鬟)Rwrd Nееn$%#qw;LhCi2rNSyJa`d7u+/e-!3G5lF  x ;6HeRT3!,rznkOZQCVb5p=}Fե;A&gfNN,j`U-_ ZŹ+yT^>3.>׮2tmr½N!=/W~V4o7m;7mkN.+k(:>u+NDgڥ9ta 0&|~/&ڴ3ҎPT|}V$2C$C.srg}. w:Cfxza!~st ]{){CP| =MI봫 d[ ](*t|; ];㐛w /x*Xn4:tk7eQf`^]Ӽ {{TITLE}}

xia

{{LOADING}}

{{datasJS}} images-actives-html5.git/src/share/themes/game1clic/js/000077500000000000000000000000001250410645000232045ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/game1clic/js/hooks.js000066400000000000000000000136671250410645000247020ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @constructor init specific hooks */ function hooks() { "use strict"; } /* * @param array layers * @param iaScene mainScene */ hooks.prototype.beforeMainConstructor = function(mainScene, layers) { }; /* * @param iaScene mainScene * @param array layers */ hooks.prototype.afterMainConstructor = function(mainScene, layers) { // some stuff to manage popin windows var button_click = function() { var target = $(this).data("target"); if ($("#response_" + target).is(":hidden")) { if ($(this).data("password")) { $("#form_" + target).toggle(); $("#form_" + target + " input[type=text]").val(""); $("#form_" + target + " input[type=text]").focus(); } else { $("#response_" + target).toggle(); } } else { if ($(this).data("password")) { $("#response_" + target).html($("#response_" + target).data("encrypted_content")); } $("#response_" + target).toggle(); } }; var unlock_input = function(e) { e.preventDefault(); var entered_password = $(this).parent().children("input[type=text]").val(); var sha1Digest= new createJs(true); sha1Digest.update(entered_password.encode()); var hash = sha1Digest.digest(); if (hash == $(this).data("password")) { var target = $(this).data("target"); var encrypted_content = $("#response_" + target).html(); $("#response_" + target).data("encrypted_content", encrypted_content); $("#response_" + target).html(XORCipher.decode(entered_password, encrypted_content).decode()); $("#response_" + target).show(); $("#form_" + target).hide(); $(".button").off("click"); $(".button").on("click", button_click); $(".unlock input[type=submit]").off("click"); $(".unlock input[type=submit]").on("click", unlock_input); } }; $(".button").on("click", button_click); $(".unlock input[type=submit]").on("click", unlock_input); mainScene.score = $("#message_success").data("score"); mainScene.score2 = $("#message_success2").data("score"); $(".overlay").hide(); $(".infos").on("click", function(){ $("#rights").show(); $("#popup").show(); $("#popup_intro").hide(); }); $("#popup_close").on("click", function(){ $("#rights").hide(); }); $("#popup_toggle").on("click", function(){ $("#message_success_content").toggle(); if ($(this).attr('src') == 'img/hide.png') { $(this).attr('src', 'img/show.png'); } else { $(this).attr('src', 'img/hide.png'); } }); $("#popup_toggle2").on("click", function(){ $("#message_success_content2").toggle(); if ($(this).attr('src') == 'img/hide.png') { $(this).attr('src', 'img/show.png'); } else { $(this).attr('src', 'img/hide.png'); } }); }; /* * * */ hooks.prototype.afterIaObjectConstructor = function(iaScene, idText, detail, iaObject) { }; /* * * */ hooks.prototype.afterIaObjectZoom = function(iaScene, idText, iaObject) { }; /* * * */ hooks.prototype.afterIaObjectFocus = function(iaScene, idText, iaObject, kineticElement) { var viewportHeight = $(window).height(); $('#' + idText + " audio").each(function(){ if ($(this).data("state") === "autostart") { $(this)[0].play(); } }); //var options = $('#' + idText).data("options"); var options = kineticElement.getXiaParent().options; if (typeof(options) != "undefined") { if (options.indexOf("score2") != -1) { iaScene.currentScore2 += 1; } else if (options.indexOf("disable-score") == -1) { iaScene.currentScore += 1; } } if ((iaScene.score2 == iaScene.currentScore2) && (iaScene.score2 != 0)) { iaScene.currentScore = -1; $("#content").show(); $("#message_success2").show(); var general_border = $("#message_success2").css("border-top-width").substr(0,$("#message_success").css("border-top-width").length - 2); var general_offset = $("#message_success2").offset(); var content_offset = $("#content").offset(); $("#message_success2").css({'max-height':(viewportHeight - general_offset.top - content_offset.top - 2 * general_border)}); } if ((iaScene.score == iaScene.currentScore) && (iaScene.score != 0)) { $("#content").show(); $("#message_success").show(); var general_border = $("#message_success").css("border-top-width").substr(0,$("#message_success").css("border-top-width").length - 2); var general_offset = $("#message_success").offset(); var content_offset = $("#content").offset(); $("#message_success").css({'max-height':(viewportHeight - general_offset.top - content_offset.top - 2 * general_border)}); } if ((iaScene.score != 0) || (iaScene.score2 != 0)) { for (var i in iaObject.xiaDetail) { iaObject.xiaDetail[i].click = "off"; } } }; images-actives-html5.git/src/share/themes/game1clic/js/iaobject.js000066400000000000000000000346631250410645000253360ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @param {object} params * @constructor create image active object */ function IaObject(params) { "use strict"; var that = this; this.path = []; this.xiaDetail = []; this.persistent = []; this.minX = 10000; this.minY = 10000; this.maxX = -10000; this.maxY = -10000; this.group = 0; this.layer = params.layer; this.background_layer = params.background_layer; this.imageObj = params.imageObj; this.idText = params.idText; this.myhooks = params.myhooks; // Create kineticElements and include them in a group that.group = new Kinetic.Group(); that.layer.add(that.group); if (typeof(params.detail.path) !== 'undefined') { that.includePath(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.image) !== 'undefined') { that.includeImage(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.group) !== 'undefined') { for (var i in params.detail.group) { if (typeof(params.detail.group[i].path) !== 'undefined') { that.includePath(params.detail.group[i], i, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.group[i].image) !== 'undefined') { that.includeImage(params.detail.group[i], i, that, params.iaScene, params.baseImage, params.idText); } } that.definePathBoxSize(params.detail, that); } else { console.log(params.detail); } this.scaleBox(this, params.iaScene); this.myhooks.afterIaObjectConstructor(params.iaScene, params.idText, params.detail, this); } /* * * @param {type} detail * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includeImage = function(detail, i, that, iaScene, baseImage, idText) { that.defineImageBoxSize(detail, that); that.xiaDetail[i] = new XiaDetail(detail, idText); var rasterObj = new Image(); rasterObj.src = detail.image; that.xiaDetail[i].kineticElement = new Kinetic.Image({ id: detail.id, name: detail.title, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, width: detail.width, height: detail.height, scale: {x:iaScene.coeff,y:iaScene.coeff} }); that.xiaDetail[i].kineticElement.setXiaParent(that.xiaDetail[i]); that.xiaDetail[i].kineticElement.setIaObject(that); that.xiaDetail[i].kineticElement.backgroundImage = rasterObj; that.xiaDetail[i].kineticElement.tooltip = ""; rasterObj.onload = function() { that.xiaDetail[i].kineticElement.backgroundImageOwnScaleX = iaScene.scale * detail.width / this.width; that.xiaDetail[i].kineticElement.backgroundImageOwnScaleY = iaScene.scale * detail.height / this.height; var zoomable = true; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#000000")) { zoomable = false; } that.persistent[i] = "off"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#ffffff")) { that.persistent[i] = "onImage"; that.xiaDetail[i].kineticElement.fillPriority('pattern'); that.xiaDetail[i].kineticElement.fillPatternScaleX(that.xiaDetail[i].kineticElement.backgroundImageOwnScaleX * 1/iaScene.scale); that.xiaDetail[i].kineticElement.fillPatternScaleY(that.xiaDetail[i].kineticElement.backgroundImageOwnScaleY * 1/iaScene.scale); that.xiaDetail[i].kineticElement.fillPatternImage(that.xiaDetail[i].kineticElement.backgroundImage); zoomable = false; } that.group.add(that.xiaDetail[i].kineticElement); // define hit area excluding transparent pixels var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min(parseFloat(detail.maxX) - parseFloat(detail.minX), Math.floor(parseFloat(iaScene.originalWidth) * 1))); var cropHeight = (Math.min(parseFloat(detail.maxY) - parseFloat(detail.minY), Math.floor(parseFloat(iaScene.originalHeight) * 1))); if (cropX + cropWidth > iaScene.originalWidth * 1) { cropWidth = iaScene.originalWidth * 1 - cropX * 1; } if (cropY * 1 + cropHeight > iaScene.originalHeight * 1) { cropHeight = iaScene.originalHeight * 1 - cropY * 1; } var hitCanvas = that.layer.getHitCanvas(); iaScene.completeImage = hitCanvas.getContext().getImageData(0,0,Math.floor(hitCanvas.width),Math.floor(hitCanvas.height)); var canvas_source = document.createElement('canvas'); canvas_source.setAttribute('width', cropWidth * iaScene.coeff); canvas_source.setAttribute('height', cropHeight * iaScene.coeff); var context_source = canvas_source.getContext('2d'); context_source.drawImage(rasterObj,0,0, cropWidth * iaScene.coeff, cropHeight * iaScene.coeff); imageDataSource = context_source.getImageData(0, 0, Math.floor(cropWidth * iaScene.coeff), Math.floor(cropHeight * iaScene.coeff)); (function(imageDataSource){ that.xiaDetail[i].kineticElement.hitFunc(function(context) { var imageData = imageDataSource.data; var imageDest = iaScene.completeImage.data; var position1 = 0; var position2 = 0; var maxWidth = Math.floor(cropWidth * iaScene.coeff); var maxHeight = Math.floor(cropHeight * iaScene.coeff); var startY = Math.floor(cropY * iaScene.coeff); var startX = Math.floor(cropX * iaScene.coeff); var hitCanvasWidth = Math.floor(that.layer.getHitCanvas().width); var rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); for(var varx = 0; varx < maxWidth; varx +=1) { for(var vary = 0; vary < maxHeight; vary +=1) { position1 = 4 * (vary * maxWidth + varx); position2 = 4 * ((vary + startY) * hitCanvasWidth + varx + startX); if (imageData[position1 + 3] > 100) { imageDest[position2 + 0] = rgbColorKey.r; imageDest[position2 + 1] = rgbColorKey.g; imageDest[position2 + 2] = rgbColorKey.b; imageDest[position2 + 3] = 255; } } } context.putImageData(iaScene.completeImage, 0, 0); }); })(imageDataSource); /* that.xiaDetail[i].kineticElement.sceneFunc(function(context) { var yo = that.layer.getHitCanvas().getContext().getImageData(0,0,iaScene.width, iaScene.height); context.putImageData(yo, 0,0); });*/ that.addEventsManagement(i,zoomable, that, iaScene, baseImage, idText); that.group.draw(); }; }; /* * * @param {type} path * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includePath = function(detail, i, that, iaScene, baseImage, idText) { var that=this; that.xiaDetail[i] = new XiaDetail(detail, idText); that.path[i] = detail.path; // if detail is out of background, hack maxX and maxY if (parseFloat(detail.maxX) < 0) detail.maxX = 1; if (parseFloat(detail.maxY) < 0) detail.maxY = 1; that.xiaDetail[i].kineticElement = new Kinetic.Path({ id: detail.id, name: detail.title, data: detail.path, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, scale: {x:iaScene.coeff,y:iaScene.coeff}, fill: 'rgba(0, 0, 0, 0)' }); that.xiaDetail[i].kineticElement.setXiaParent(that.xiaDetail[i]); that.xiaDetail[i].kineticElement.setIaObject(that); that.xiaDetail[i].kineticElement.tooltip = ""; that.definePathBoxSize(detail, that); // crop background image to suit shape box that.cropCanvas = document.createElement('canvas'); that.cropCanvas.setAttribute('width', parseFloat(detail.maxX) - parseFloat(detail.minX)); that.cropCanvas.setAttribute('height', parseFloat(detail.maxY) - parseFloat(detail.minY)); var cropCtx = that.cropCanvas.getContext('2d'); var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min((parseFloat(detail.maxX) - parseFloat(detail.minX)) * iaScene.scale, Math.floor(parseFloat(iaScene.originalWidth) * iaScene.scale))); var cropHeight = (Math.min((parseFloat(detail.maxY) - parseFloat(detail.minY)) * iaScene.scale, Math.floor(parseFloat(iaScene.originalHeight) * iaScene.scale))); if (cropX * iaScene.scale + cropWidth > iaScene.originalWidth * iaScene.scale) { cropWidth = iaScene.originalWidth * iaScene.scale - cropX * iaScene.scale; } if (cropY * iaScene.scale + cropHeight > iaScene.originalHeight * iaScene.scale) { cropHeight = iaScene.originalHeight * iaScene.scale - cropY * iaScene.scale; } // bad workaround to avoid null dimensions if (cropWidth <= 0) cropWidth = 1; if (cropHeight <= 0) cropHeight = 1; cropCtx.drawImage( that.imageObj, cropX * iaScene.scale, cropY * iaScene.scale, cropWidth, cropHeight, 0, 0, cropWidth, cropHeight ); var dataUrl = that.cropCanvas.toDataURL(); delete that.cropCanvas; var cropedImage = new Image(); cropedImage.src = dataUrl; that.xiaDetail[i].kineticElement.tooltip = ""; cropedImage.onload = function() { that.xiaDetail[i].kineticElement.backgroundImage = cropedImage; that.xiaDetail[i].kineticElement.backgroundImageOwnScaleX = 1; that.xiaDetail[i].kineticElement.backgroundImageOwnScaleY = 1; that.xiaDetail[i].kineticElement.fillPatternRepeat('no-repeat'); that.xiaDetail[i].kineticElement.fillPatternX(detail.minX); that.xiaDetail[i].kineticElement.fillPatternY(detail.minY); }; var zoomable = true; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#000000")) { zoomable = false; } that.persistent[i] = "off"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#ffffff")) { that.persistent[i] = "onPath"; that.xiaDetail[i].kineticElement.fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); } that.addEventsManagement(i, zoomable, that, iaScene, baseImage, idText); that.group.add(that.xiaDetail[i].kineticElement); that.group.draw(); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.defineImageBoxSize = function(detail, that) { "use strict"; var that = this; if (that.minX === -1) that.minX = (parseFloat(detail.x)); if (that.maxY === 10000) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); if (that.maxX === -1) that.maxX = (parseFloat(detail.x) + parseFloat(detail.width)); if (that.minY === 10000) that.minY = (parseFloat(detail.y)); if (parseFloat(detail.x) < that.minX) that.minX = parseFloat(detail.x); if (parseFloat(detail.x) + parseFloat(detail.width) > that.maxX) that.maxX = parseFloat(detail.x) + parseFloat(detail.width); if (parseFloat(detail.y) < that.minY) that.miny = parseFloat(detail.y); if (parseFloat(detail.y) + parseFloat(detail.height) > that.maxY) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.definePathBoxSize = function(detail, that) { "use strict"; if ( (typeof(detail.minX) !== 'undefined') && (typeof(detail.minY) !== 'undefined') && (typeof(detail.maxX) !== 'undefined') && (typeof(detail.maxY) !== 'undefined')) { that.minX = detail.minX; that.minY = detail.minY; that.maxX = detail.maxX; that.maxY = detail.maxY; } else { console.log('definePathBoxSize failure'); } }; /* * */ IaObject.prototype.scaleBox = function(that, iaScene) { that.minX = that.minX * iaScene.coeff; that.minY = that.minY * iaScene.coeff; that.maxX = that.maxX * iaScene.coeff; that.maxY = that.maxY * iaScene.coeff; }; /* * Define mouse events on the current KineticElement * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.addEventsManagement = function(i, zoomable, that, iaScene, baseImage, idText) { var that=this; that.xiaDetail[i].kineticElement.droparea = false; that.xiaDetail[i].kineticElement.tooltip_area = false; // if current detail is a drop area, disable drag and drop if ($('article[data-target="' + $("#" + idText).data("kinetic_id") + '"]').length != 0) { that.xiaDetail[i].kineticElement.droparea = true; } // tooltip must be at the bottom if ($('article[data-tooltip="' + $("#" + idText).data("kinetic_id") + '"]').length != 0) { that.xiaDetail[i].kineticElement.getParent().moveToBottom(); that.xiaDetail[i].options += " disable-click "; that.xiaDetail[i].kineticElement.tooltip_area = true; // disable hitArea for tooltip that.xiaDetail[i].kineticElement.hitFunc(function(context){ context.beginPath(); context.rect(0,0,0,0); context.closePath(); context.fillStrokeShape(this); }); } }; images-actives-html5.git/src/share/themes/game1clic/js/iascene.js000066400000000000000000000260561250410645000251620ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@crdp.ac-versailles.fr /** * * @param {type} originalWidth * @param {type} originalHeight * @constructor create image active scene */ function IaScene(originalWidth, originalHeight) { "use strict"; var that = this; // canvas width this.width = 1000; // canvas height this.height = 800; // default color used to fill shapes during mouseover var _colorOver = {red:66, green:133, blue:244, opacity:0.6}; // default color used to fill stroke around shapes during mouseover var _colorOverStroke = {red:255, green:0, blue:0, opacity:1}; // default color used to fill shapes if defined as cache this.colorPersistent = {red:124, green:154, blue:174, opacity:1}; // Image ratio on the scene this.ratio = 1.00; // padding-top in the canvas this.y = 0; // internal this.score = 0; this.score2 = 0; this.currentShape = ""; this.currentScore = 0; this.currentScore2 = 0; this.fullScreen = "off"; this.overColor = 'rgba(' + _colorOver.red + ',' + _colorOver.green + ',' + _colorOver.blue + ',' + _colorOver.opacity + ')'; this.overColorStroke = 'rgba(' + _colorOverStroke.red + ',' + _colorOverStroke.green + ',' + _colorOverStroke.blue + ',' + _colorOverStroke.opacity + ')'; this.scale = 1; this.zoomActive = 0; this.element = 0; this.originalWidth = originalWidth; this.originalHeight = originalHeight; this.coeff = (this.width * this.ratio) / parseFloat(originalWidth); this.cursorState=""; this.noPropagation = false; } /* * Scale entire scene * */ IaScene.prototype.scaleScene = function(mainScene){ "use strict"; var viewportWidth = $(window).width(); var viewportHeight = $(window).height(); var coeff_width = (viewportWidth * mainScene.ratio) / parseFloat(mainScene.originalWidth); var coeff_height = (viewportHeight) / (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top + $('#container').offset().top); var canvas_border_left = parseFloat($("#canvas").css("border-left-width").substr(0,$("#canvas").css("border-left-width").length - 2)); var canvas_border_right = parseFloat($("#canvas").css("border-right-width").substr(0,$("#canvas").css("border-right-width").length - 2)); var canvas_border_top = parseFloat($("#canvas").css("border-top-width").substr(0,$("#canvas").css("border-top-width").length - 2)); var canvas_border_bottom = parseFloat($("#canvas").css("border-bottom-width").substr(0,$("#canvas").css("border-bottom-width").length - 2)); if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_width) && (viewportHeight >= ((parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_width))) { mainScene.width = viewportWidth - canvas_border_left - canvas_border_right; mainScene.coeff = (mainScene.width * mainScene.ratio) / parseFloat(mainScene.originalWidth); mainScene.height = parseFloat(mainScene.originalHeight) * mainScene.coeff; } else if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_height) && (viewportHeight >= (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_height)) { mainScene.height = viewportHeight - $('#container').offset().top - $('#canvas').offset().top - canvas_border_top - canvas_border_bottom - 2; mainScene.coeff = (mainScene.height) / parseFloat(mainScene.originalHeight); mainScene.width = parseFloat(mainScene.originalWidth) * mainScene.coeff; } $('#container').css({"width": (mainScene.width + canvas_border_left + canvas_border_right) + 'px'}); $('#container').css({"height": (mainScene.height + $('#canvas').offset().top - $('#container').offset().top + canvas_border_top + canvas_border_bottom) + 'px'}); $('#canvas').css({"height": (mainScene.height) + 'px'}); $('#canvas').css({"width": mainScene.width + 'px'}); $('#detect').css({"height": (mainScene.height) + 'px'}); $('#detect').css({"top": ($('#canvas').offset().top) + 'px'}); }; IaScene.prototype.mouseover = function(kineticElement) { if (this.cursorState.indexOf("ZoomOut.cur") !== -1) { } else if (this.cursorState.indexOf("ZoomIn.cur") !== -1) { } else if (this.cursorState.indexOf("HandPointer.cur") === -1) { if ((kineticElement.getXiaParent().options.indexOf("pointer") !== -1) && (!this.tooltip_area)) { document.body.style.cursor = "pointer"; } this.cursorState = "url(img/HandPointer.cur),auto"; // manage tooltips if present var tooltip = false; if (kineticElement.tooltip != "") { tooltip = true; } else if ($("#" + kineticElement.getXiaParent().idText).data("tooltip") != "") { var tooltip_id = $("#" + kineticElement.getXiaParent().idText).data("tooltip"); kineticElement.tooltip = kineticElement.getStage().find("#" + tooltip_id)[0]; tooltip = true; } if (tooltip) { kineticElement.tooltip.clearCache(); kineticElement.tooltip.fillPriority('pattern'); if ((kineticElement.tooltip.backgroundImageOwnScaleX != "undefined") && (kineticElement.tooltip.backgroundImageOwnScaleY != "undefined")) { kineticElement.tooltip.fillPatternScaleX(kineticElement.tooltip.backgroundImageOwnScaleX * 1/this.scale); kineticElement.tooltip.fillPatternScaleY(kineticElement.tooltip.backgroundImageOwnScaleY * 1/this.scale); } kineticElement.tooltip.fillPatternImage(kineticElement.tooltip.backgroundImage); kineticElement.tooltip.getParent().moveToTop(); //that.group.draw(); kineticElement.tooltip.draw(); } //kineticElement.getIaObject().layer.batchDraw(); //kineticElement.draw(); } }; IaScene.prototype.mouseout = function(kineticElement) { if ((this.cursorState.indexOf("ZoomOut.cur") !== -1) || (this.cursorState.indexOf("ZoomIn.cur") !== -1)){ } else { var mouseXY = kineticElement.getStage().getPointerPosition(); if (typeof(mouseXY) == "undefined") { mouseXY = {x:0,y:0}; } //if ((kineticElement.getStage().getIntersection(mouseXY) != kineticElement)) { // manage tooltips if present var tooltip = false; if (kineticElement.tooltip != "") { tooltip = true; } else if ($("#" + kineticElement.getXiaParent().idText).data("tooltip") != "") { var tooltip_id = $("#" + kineticElement.getXiaParent().idText).data("tooltip"); kineticElement.tooltip = kineticElement.getStage().find("#" + tooltip_id)[0]; tooltip = true; } if (tooltip) { kineticElement.tooltip.fillPriority('color'); kineticElement.tooltip.fill('rgba(0, 0, 0, 0)'); kineticElement.tooltip.getParent().moveToBottom(); kineticElement.tooltip.draw(); kineticElement.getIaObject().layer.draw(); } document.body.style.cursor = "default"; this.cursorState = "default"; //} document.body.style.cursor = "default"; } }; IaScene.prototype.click = function(kineticElement) { if (kineticElement.getXiaParent().click == "off") return; /* * if we click in this element, manage zoom-in, zoom-out */ if (kineticElement.getXiaParent().options.indexOf("direct-link") !== -1) { location.href = kineticElement.getXiaParent().title; } else { this.noPropagation = true; var iaobject = kineticElement.getIaObject(); for (var i in iaobject.xiaDetail) { if (iaobject.persistent[i] == "off") { if (iaobject.xiaDetail[i].kineticElement instanceof Kinetic.Image) { iaobject.xiaDetail[i].kineticElement.fillPriority('pattern'); iaobject.xiaDetail[i].kineticElement.fillPatternScaleX(iaobject.xiaDetail[i].kineticElement.backgroundImageOwnScaleX * 1/this.scale); iaobject.xiaDetail[i].kineticElement.fillPatternScaleY(iaobject.xiaDetail[i].kineticElement.backgroundImageOwnScaleY * 1/this.scale); iaobject.xiaDetail[i].kineticElement.fillPatternImage(iaobject.xiaDetail[i].kineticElement.backgroundImage); } else { iaobject.xiaDetail[i].kineticElement.fillPriority('color'); iaobject.xiaDetail[i].kineticElement.fill(this.overColor); iaobject.xiaDetail[i].kineticElement.scale(this.coeff); iaobject.xiaDetail[i].kineticElement.stroke(this.overColorStroke); iaobject.xiaDetail[i].kineticElement.strokeWidth(2); } } else if (iaobject.persistent[i] == "onPath") { iaobject.xiaDetail[i].kineticElement.fillPriority('color'); iaobject.xiaDetail[i].kineticElement.fill('rgba(' + this.colorPersistent.red + ',' + this.colorPersistent.green + ',' + this.colorPersistent.blue + ',' + this.colorPersistent.opacity + ')'); } else if (iaobject.persistent[i] == "onImage") { iaobject.xiaDetail[i].kineticElement.fillPriority('pattern'); iaobject.xiaDetail[i].kineticElement.fillPatternScaleX(iaobject.xiaDetail[i].kineticElement.backgroundImageOwnScaleX * 1/this.scale); iaobject.xiaDetail[i].kineticElement.fillPatternScaleY(iaobject.xiaDetail[i].kineticElement.backgroundImageOwnScaleY * 1/this.scale); iaobject.xiaDetail[i].kineticElement.fillPatternImage(iaobject.xiaDetail[i].kineticElement.backgroundImage); } iaobject.xiaDetail[i].kineticElement.moveToTop(); iaobject.xiaDetail[i].kineticElement.draw(); } iaobject.group.moveToTop(); //iaobject.layer.draw(); this.element = iaobject; iaobject.myhooks.afterIaObjectFocus(this, kineticElement.getXiaParent().idText, iaobject, kineticElement); iaobject.layer.getStage().completeImage = "redefine"; } }; images-actives-html5.git/src/share/themes/game1clic/js/iframe.js000066400000000000000000000022671250410645000250140ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // Script used to load youtube resource after main page // otherwise, Chrome fails to start the page $(".videoWrapper16_9").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); }); $(".videoWrapper4_3").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); }); images-actives-html5.git/src/share/themes/game1clic/js/kinetic-xia.js000066400000000000000000017566061250410645000257740ustar00rootroot00000000000000 /* * KineticJS JavaScript Framework v5.1.0 * http://www.kineticjs.com/ * Copyright 2013, Eric Rowell * Licensed under the MIT or GPL Version 2 licenses. * Date: 2014-03-27 * * Copyright (C) 2011 - 2013 by Eric Rowell * * 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. */ /** * @namespace Kinetic */ /*jshint -W079, -W020*/ var Kinetic = {}; (function(root) { var PI_OVER_180 = Math.PI / 180; Kinetic = { // public version: '5.1.0', // private stages: [], idCounter: 0, ids: {}, names: {}, shapes: {}, listenClickTap: false, inDblClickWindow: false, // configurations enableTrace: false, traceArrMax: 100, dblClickWindow: 400, pixelRatio: undefined, dragDistance : 0, angleDeg: true, // user agent UA: (function() { var userAgent = (root.navigator && root.navigator.userAgent) || ''; var ua = userAgent.toLowerCase(), // jQuery UA regex match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || /(webkit)[ \/]([\w.]+)/.exec( ua ) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || /(msie) ([\w.]+)/.exec( ua ) || ua.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || [], // adding mobile flag as well mobile = !!(userAgent.match(/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile/i)); return { browser: match[ 1 ] || '', version: match[ 2 ] || '0', // adding mobile flab mobile: mobile }; })(), /** * @namespace Filters * @memberof Kinetic */ Filters: {}, /** * Node constructor. Nodes are entities that can be transformed, layered, * and have bound events. The stage, layers, groups, and shapes all extend Node. * @constructor * @memberof Kinetic * @abstract * @param {Object} config * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] */ Node: function(config) { this._init(config); }, /** * Shape constructor. Shapes are primitive objects such as rectangles, * circles, text, lines, etc. * @constructor * @memberof Kinetic * @augments Kinetic.Node * @param {Object} config * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var customShape = new Kinetic.Shape({
* x: 5,
* y: 10,
* fill: 'red',
* // a Kinetic.Canvas renderer is passed into the drawFunc function
* drawFunc: function(context) {
* context.beginPath();
* context.moveTo(200, 50);
* context.lineTo(420, 80);
* context.quadraticCurveTo(300, 100, 260, 170);
* context.closePath();
* context.fillStrokeShape(this);
* }
*}); */ Shape: function(config) { this.__init(config); }, /** * Container constructor.  Containers are used to contain nodes or other containers * @constructor * @memberof Kinetic * @augments Kinetic.Node * @abstract * @param {Object} config * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @param {Function} [config.clipFunc] clipping function */ Container: function(config) { this.__init(config); }, /** * Stage constructor. A stage is used to contain multiple layers * @constructor * @memberof Kinetic * @augments Kinetic.Container * @param {Object} config * @param {String|DomElement} config.container Container id or DOM element * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @param {Function} [config.clipFunc] clipping function * @example * var stage = new Kinetic.Stage({
* width: 500,
* height: 800,
* container: 'containerId'
* }); */ Stage: function(config) { this.___init(config); }, /** * BaseLayer constructor. * @constructor * @memberof Kinetic * @augments Kinetic.Container * @param {Object} config * @param {Boolean} [config.clearBeforeDraw] set this property to false if you don't want * to clear the canvas before each layer draw. The default value is true. * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @param {Function} [config.clipFunc] clipping function * @example * var layer = new Kinetic.Layer(); */ BaseLayer: function(config) { this.___init(config); }, /** * Layer constructor. Layers are tied to their own canvas element and are used * to contain groups or shapes * @constructor * @memberof Kinetic * @augments Kinetic.Container * @param {Object} config * @param {Boolean} [config.clearBeforeDraw] set this property to false if you don't want * to clear the canvas before each layer draw. The default value is true. * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @param {Function} [config.clipFunc] clipping function * @example * var layer = new Kinetic.Layer(); */ Layer: function(config) { this.____init(config); }, /** * FastLayer constructor. Layers are tied to their own canvas element and are used * to contain groups or shapes * @constructor * @memberof Kinetic * @augments Kinetic.Container * @param {Object} config * @param {Boolean} [config.clearBeforeDraw] set this property to false if you don't want * to clear the canvas before each layer draw. The default value is true. * @example * var layer = new Kinetic.FastLayer(); */ FastLayer: function(config) { this.____init(config); }, /** * Group constructor. Groups are used to contain shapes or other groups. * @constructor * @memberof Kinetic * @augments Kinetic.Container * @param {Object} config * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @param {Function} [config.clipFunc] clipping function * @example * var group = new Kinetic.Group(); */ Group: function(config) { this.___init(config); }, /** * returns whether or not drag and drop is currently active * @method * @memberof Kinetic */ isDragging: function() { var dd = Kinetic.DD; // if DD is not included with the build, then // drag and drop is not even possible if (!dd) { return false; } // if DD is included with the build else { return dd.isDragging; } }, /** * returns whether or not a drag and drop operation is ready, but may * not necessarily have started * @method * @memberof Kinetic */ isDragReady: function() { var dd = Kinetic.DD; // if DD is not included with the build, then // drag and drop is not even possible if (!dd) { return false; } // if DD is included with the build else { return !!dd.node; } }, _addId: function(node, id) { if(id !== undefined) { this.ids[id] = node; } }, _removeId: function(id) { if(id !== undefined) { delete this.ids[id]; } }, _addName: function(node, name) { if(name !== undefined) { if(this.names[name] === undefined) { this.names[name] = []; } this.names[name].push(node); } }, _removeName: function(name, _id) { if(name !== undefined) { var nodes = this.names[name]; if(nodes !== undefined) { for(var n = 0; n < nodes.length; n++) { var no = nodes[n]; if(no._id === _id) { nodes.splice(n, 1); } } if(nodes.length === 0) { delete this.names[name]; } } } }, getAngle: function(angle) { return this.angleDeg ? angle * PI_OVER_180 : angle; } }; })(this); // Uses Node, AMD or browser globals to create a module. // If you want something that will work in other stricter CommonJS environments, // or if you need to create a circular dependency, see commonJsStrict.js // Defines a module "returnExports" that depends another module called "b". // Note that the name of the module is implied by the file name. It is best // if the file name and the exported global have matching names. // If the 'b' module also uses this type of boilerplate, then // in the browser, it will create a global .b that is used below. // If you do not want to support the browser global path, then you // can remove the `root` use and the passing `this` as the first arg to // the top function. // if the module has no dependencies, the above pattern can be simplified to ( function(root, factory) { if( typeof exports === 'object') { // Node. Does not work with strict CommonJS, but // only CommonJS-like enviroments that support module.exports, // like Node. var Canvas = require('canvas'); var jsdom = require('jsdom').jsdom; var doc = jsdom(''); var KineticJS = factory(); Kinetic.document = doc; Kinetic.window = Kinetic.document.createWindow(); Kinetic.window.Image = Canvas.Image; Kinetic.root = root; Kinetic._nodeCanvas = Canvas; module.exports = KineticJS; return; } else if( typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(factory); } Kinetic.document = document; Kinetic.window = window; Kinetic.root = root; }((1, eval)('this'), function() { // Just return a value to define the module export. // This example returns an object, but the module // can return a function as the exported value. return Kinetic; })); ;(function() { /** * Collection constructor. Collection extends * Array. This class is used in conjunction with {@link Kinetic.Container#get} * @constructor * @memberof Kinetic */ Kinetic.Collection = function() { var args = [].slice.call(arguments), length = args.length, i = 0; this.length = length; for(; i < length; i++) { this[i] = args[i]; } return this; }; Kinetic.Collection.prototype = []; /** * iterate through node array and run a function for each node. * The node and index is passed into the function * @method * @memberof Kinetic.Collection.prototype * @param {Function} func * @example * // get all nodes with name foo inside layer, and set x to 10 for each * layer.get('.foo').each(function(shape, n) {
* shape.setX(10);
* }); */ Kinetic.Collection.prototype.each = function(func) { for(var n = 0; n < this.length; n++) { func(this[n], n); } }; /** * convert collection into an array * @method * @memberof Kinetic.Collection.prototype */ Kinetic.Collection.prototype.toArray = function() { var arr = [], len = this.length, n; for(n = 0; n < len; n++) { arr.push(this[n]); } return arr; }; /** * convert array into a collection * @method * @memberof Kinetic.Collection * @param {Array} arr */ Kinetic.Collection.toCollection = function(arr) { var collection = new Kinetic.Collection(), len = arr.length, n; for(n = 0; n < len; n++) { collection.push(arr[n]); } return collection; }; // map one method by it's name Kinetic.Collection._mapMethod = function(methodName) { Kinetic.Collection.prototype[methodName] = function() { var len = this.length, i; var args = [].slice.call(arguments); for(i = 0; i < len; i++) { this[i][methodName].apply(this[i], args); } return this; }; }; Kinetic.Collection.mapMethods = function(constructor) { var prot = constructor.prototype; for(var methodName in prot) { Kinetic.Collection._mapMethod(methodName); } }; /* * Last updated November 2011 * By Simon Sarris * www.simonsarris.com * sarris@acm.org * * Free to use and distribute at will * So long as you are nice to people, etc */ /* * The usage of this class was inspired by some of the work done by a forked * project, KineticJS-Ext by Wappworks, which is based on Simon's Transform * class. Modified by Eric Rowell */ /** * Transform constructor * @constructor * @param {Array} Optional six-element matrix * @memberof Kinetic */ Kinetic.Transform = function(m) { this.m = (m && m.slice()) || [1, 0, 0, 1, 0, 0]; }; Kinetic.Transform.prototype = { /** * Copy Kinetic.Transform object * @method * @memberof Kinetic.Transform.prototype * @returns {Kinetic.Transform} */ copy: function() { return new Kinetic.Transform(this.m); }, /** * Transform point * @method * @memberof Kinetic.Transform.prototype * @param {Object} 2D point(x, y) * @returns {Object} 2D point(x, y) */ point: function(p) { var m = this.m; return { x: m[0] * p.x + m[2] * p.y + m[4], y: m[1] * p.x + m[3] * p.y + m[5] }; }, /** * Apply translation * @method * @memberof Kinetic.Transform.prototype * @param {Number} x * @param {Number} y * @returns {Kinetic.Transform} */ translate: function(x, y) { this.m[4] += this.m[0] * x + this.m[2] * y; this.m[5] += this.m[1] * x + this.m[3] * y; return this; }, /** * Apply scale * @method * @memberof Kinetic.Transform.prototype * @param {Number} sx * @param {Number} sy * @returns {Kinetic.Transform} */ scale: function(sx, sy) { this.m[0] *= sx; this.m[1] *= sx; this.m[2] *= sy; this.m[3] *= sy; return this; }, /** * Apply rotation * @method * @memberof Kinetic.Transform.prototype * @param {Number} rad Angle in radians * @returns {Kinetic.Transform} */ rotate: function(rad) { var c = Math.cos(rad); var s = Math.sin(rad); var m11 = this.m[0] * c + this.m[2] * s; var m12 = this.m[1] * c + this.m[3] * s; var m21 = this.m[0] * -s + this.m[2] * c; var m22 = this.m[1] * -s + this.m[3] * c; this.m[0] = m11; this.m[1] = m12; this.m[2] = m21; this.m[3] = m22; return this; }, /** * Returns the translation * @method * @memberof Kinetic.Transform.prototype * @returns {Object} 2D point(x, y) */ getTranslation: function() { return { x: this.m[4], y: this.m[5] }; }, /** * Apply skew * @method * @memberof Kinetic.Transform.prototype * @param {Number} sx * @param {Number} sy * @returns {Kinetic.Transform} */ skew: function(sx, sy) { var m11 = this.m[0] + this.m[2] * sy; var m12 = this.m[1] + this.m[3] * sy; var m21 = this.m[2] + this.m[0] * sx; var m22 = this.m[3] + this.m[1] * sx; this.m[0] = m11; this.m[1] = m12; this.m[2] = m21; this.m[3] = m22; return this; }, /** * Transform multiplication * @method * @memberof Kinetic.Transform.prototype * @param {Kinetic.Transform} matrix * @returns {Kinetic.Transform} */ multiply: function(matrix) { var m11 = this.m[0] * matrix.m[0] + this.m[2] * matrix.m[1]; var m12 = this.m[1] * matrix.m[0] + this.m[3] * matrix.m[1]; var m21 = this.m[0] * matrix.m[2] + this.m[2] * matrix.m[3]; var m22 = this.m[1] * matrix.m[2] + this.m[3] * matrix.m[3]; var dx = this.m[0] * matrix.m[4] + this.m[2] * matrix.m[5] + this.m[4]; var dy = this.m[1] * matrix.m[4] + this.m[3] * matrix.m[5] + this.m[5]; this.m[0] = m11; this.m[1] = m12; this.m[2] = m21; this.m[3] = m22; this.m[4] = dx; this.m[5] = dy; return this; }, /** * Invert the matrix * @method * @memberof Kinetic.Transform.prototype * @returns {Kinetic.Transform} */ invert: function() { var d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]); var m0 = this.m[3] * d; var m1 = -this.m[1] * d; var m2 = -this.m[2] * d; var m3 = this.m[0] * d; var m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]); var m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]); this.m[0] = m0; this.m[1] = m1; this.m[2] = m2; this.m[3] = m3; this.m[4] = m4; this.m[5] = m5; return this; }, /** * return matrix * @method * @memberof Kinetic.Transform.prototype */ getMatrix: function() { return this.m; }, /** * set to absolute position via translation * @method * @memberof Kinetic.Transform.prototype * @returns {Kinetic.Transform} * @author ericdrowell */ setAbsolutePosition: function(x, y) { var m0 = this.m[0], m1 = this.m[1], m2 = this.m[2], m3 = this.m[3], m4 = this.m[4], m5 = this.m[5], yt = ((m0 * (y - m5)) - (m1 * (x - m4))) / ((m0 * m3) - (m1 * m2)), xt = (x - m4 - (m2 * yt)) / m0; return this.translate(xt, yt); } }; // CONSTANTS var CANVAS = 'canvas', CONTEXT_2D = '2d', OBJECT_ARRAY = '[object Array]', OBJECT_NUMBER = '[object Number]', OBJECT_STRING = '[object String]', PI_OVER_DEG180 = Math.PI / 180, DEG180_OVER_PI = 180 / Math.PI, HASH = '#', EMPTY_STRING = '', ZERO = '0', KINETIC_WARNING = 'Kinetic warning: ', KINETIC_ERROR = 'Kinetic error: ', RGB_PAREN = 'rgb(', COLORS = { aqua: [0,255,255], lime: [0,255,0], silver: [192,192,192], black: [0,0,0], maroon: [128,0,0], teal: [0,128,128], blue: [0,0,255], navy: [0,0,128], white: [255,255,255], fuchsia: [255,0,255], olive:[128,128,0], yellow: [255,255,0], orange: [255,165,0], gray: [128,128,128], purple: [128,0,128], green: [0,128,0], red: [255,0,0], pink: [255,192,203], cyan: [0,255,255], transparent: [255,255,255,0] }, RGB_REGEX = /rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/; /** * @namespace Util * @memberof Kinetic */ Kinetic.Util = { /* * cherry-picked utilities from underscore.js */ _isElement: function(obj) { return !!(obj && obj.nodeType == 1); }, _isFunction: function(obj) { return !!(obj && obj.constructor && obj.call && obj.apply); }, _isObject: function(obj) { return (!!obj && obj.constructor == Object); }, _isArray: function(obj) { return Object.prototype.toString.call(obj) == OBJECT_ARRAY; }, _isNumber: function(obj) { return Object.prototype.toString.call(obj) == OBJECT_NUMBER; }, _isString: function(obj) { return Object.prototype.toString.call(obj) == OBJECT_STRING; }, // Returns a function, that, when invoked, will only be triggered at most once // during a given window of time. Normally, the throttled function will run // as much as it can, without ever going more than once per `wait` duration; // but if you'd like to disable the execution on the leading edge, pass // `{leading: false}`. To disable execution on the trailing edge, ditto. _throttle: function(func, wait, options) { var context, args, result; var timeout = null; var previous = 0; options || (options = {}); var later = function() { previous = options.leading === false ? 0 : new Date().getTime(); timeout = null; result = func.apply(context, args); context = args = null; }; return function() { var now = new Date().getTime(); if (!previous && options.leading === false) previous = now; var remaining = wait - (now - previous); context = this; args = arguments; if (remaining <= 0) { clearTimeout(timeout); timeout = null; previous = now; result = func.apply(context, args); context = args = null; } else if (!timeout && options.trailing !== false) { timeout = setTimeout(later, remaining); } return result; }; }, /* * other utils */ _hasMethods: function(obj) { var names = [], key; for(key in obj) { if(this._isFunction(obj[key])) { names.push(key); } } return names.length > 0; }, createCanvasElement: function() { var canvas = Kinetic.document.createElement('canvas'); canvas.style = canvas.style || {}; return canvas; }, isBrowser: function() { return (typeof exports !== 'object'); }, _isInDocument: function(el) { while(el = el.parentNode) { if(el == Kinetic.document) { return true; } } return false; }, _simplifyArray: function(arr) { var retArr = [], len = arr.length, util = Kinetic.Util, n, val; for (n=0; n> 16) & 255, g: (bigint >> 8) & 255, b: bigint & 255 }; }, /** * return random hex color * @method * @memberof Kinetic.Util.prototype */ getRandomColor: function() { var randColor = (Math.random() * 0xFFFFFF << 0).toString(16); while (randColor.length < 6) { randColor = ZERO + randColor; } return HASH + randColor; }, /** * return value with default fallback * @method * @memberof Kinetic.Util.prototype */ get: function(val, def) { if (val === undefined) { return def; } else { return val; } }, /** * get RGB components of a color * @method * @memberof Kinetic.Util.prototype * @param {String} color * @example * // each of the following examples return {r:0, g:0, b:255}
* var rgb = Kinetic.Util.getRGB('blue');
* var rgb = Kinetic.Util.getRGB('#0000ff');
* var rgb = Kinetic.Util.getRGB('rgb(0,0,255)'); */ getRGB: function(color) { var rgb; // color string if (color in COLORS) { rgb = COLORS[color]; return { r: rgb[0], g: rgb[1], b: rgb[2] }; } // hex else if (color[0] === HASH) { return this._hexToRgb(color.substring(1)); } // rgb string else if (color.substr(0, 4) === RGB_PAREN) { rgb = RGB_REGEX.exec(color.replace(/ /g,'')); return { r: parseInt(rgb[1], 10), g: parseInt(rgb[2], 10), b: parseInt(rgb[3], 10) }; } // default else { return { r: 0, g: 0, b: 0 }; } }, // o1 takes precedence over o2 _merge: function(o1, o2) { var retObj = this._clone(o2); for(var key in o1) { if(this._isObject(o1[key])) { retObj[key] = this._merge(o1[key], retObj[key]); } else { retObj[key] = o1[key]; } } return retObj; }, cloneObject: function(obj) { var retObj = {}; for(var key in obj) { if(this._isObject(obj[key])) { retObj[key] = this.cloneObject(obj[key]); } else if (this._isArray(obj[key])) { retObj[key] = this.cloneArray(obj[key]); } else { retObj[key] = obj[key]; } } return retObj; }, cloneArray: function(arr) { return arr.slice(0); }, _degToRad: function(deg) { return deg * PI_OVER_DEG180; }, _radToDeg: function(rad) { return rad * DEG180_OVER_PI; }, _capitalize: function(str) { return str.charAt(0).toUpperCase() + str.slice(1); }, error: function(str) { throw new Error(KINETIC_ERROR + str); }, warn: function(str) { /* * IE9 on Windows7 64bit will throw a JS error * if we don't use window.console in the conditional */ if(Kinetic.root.console && console.warn) { console.warn(KINETIC_WARNING + str); } }, extend: function(c1, c2) { for(var key in c2.prototype) { if(!( key in c1.prototype)) { c1.prototype[key] = c2.prototype[key]; } } }, /** * adds methods to a constructor prototype * @method * @memberof Kinetic.Util.prototype * @param {Function} constructor * @param {Object} methods */ addMethods: function(constructor, methods) { var key; for (key in methods) { constructor.prototype[key] = methods[key]; } }, _getControlPoints: function(x0, y0, x1, y1, x2, y2, t) { var d01 = Math.sqrt(Math.pow(x1 - x0, 2) + Math.pow(y1 - y0, 2)), d12 = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)), fa = t * d01 / (d01 + d12), fb = t * d12 / (d01 + d12), p1x = x1 - fa * (x2 - x0), p1y = y1 - fa * (y2 - y0), p2x = x1 + fb * (x2 - x0), p2y = y1 + fb * (y2 - y0); return [p1x ,p1y, p2x, p2y]; }, _expandPoints: function(p, tension) { var len = p.length, allPoints = [], n, cp; for (n=2; n= Kinetic.traceArrMax) { traceArr.shift(); } }, /** * reset canvas context transform * @method * @memberof Kinetic.Context.prototype */ reset: function() { var pixelRatio = this.getCanvas().getPixelRatio(); this.setTransform(1 * pixelRatio, 0, 0, 1 * pixelRatio, 0, 0); }, /** * get canvas * @method * @memberof Kinetic.Context.prototype * @returns {Kinetic.Canvas} */ getCanvas: function() { return this.canvas; }, /** * clear canvas * @method * @memberof Kinetic.Context.prototype * @param {Object} [bounds] * @param {Number} [bounds.x] * @param {Number} [bounds.y] * @param {Number} [bounds.width] * @param {Number} [bounds.height] */ clear: function(bounds) { var canvas = this.getCanvas(); if (bounds) { this.clearRect(bounds.x || 0, bounds.y || 0, bounds.width || 0, bounds.height || 0); } else { this.clearRect(0, 0, canvas.getWidth(), canvas.getHeight()); } }, _applyLineCap: function(shape) { var lineCap = shape.getLineCap(); if(lineCap) { this.setAttr('lineCap', lineCap); } }, _applyOpacity: function(shape) { var absOpacity = shape.getAbsoluteOpacity(); if(absOpacity !== 1) { this.setAttr('globalAlpha', absOpacity); } }, _applyLineJoin: function(shape) { var lineJoin = shape.getLineJoin(); if(lineJoin) { this.setAttr('lineJoin', lineJoin); } }, setAttr: function(attr, val) { this._context[attr] = val; }, // context pass through methods arc: function() { var a = arguments; this._context.arc(a[0], a[1], a[2], a[3], a[4], a[5]); }, beginPath: function() { this._context.beginPath(); }, bezierCurveTo: function() { var a = arguments; this._context.bezierCurveTo(a[0], a[1], a[2], a[3], a[4], a[5]); }, clearRect: function() { var a = arguments; this._context.clearRect(a[0], a[1], a[2], a[3]); }, clip: function() { this._context.clip(); }, closePath: function() { this._context.closePath(); }, createImageData: function() { var a = arguments; if(a.length === 2) { return this._context.createImageData(a[0], a[1]); } else if(a.length === 1) { return this._context.createImageData(a[0]); } }, createLinearGradient: function() { var a = arguments; return this._context.createLinearGradient(a[0], a[1], a[2], a[3]); }, createPattern: function() { var a = arguments; return this._context.createPattern(a[0], a[1]); }, createRadialGradient: function() { var a = arguments; return this._context.createRadialGradient(a[0], a[1], a[2], a[3], a[4], a[5]); }, drawImage: function() { var a = arguments, _context = this._context; if(a.length === 3) { _context.drawImage(a[0], a[1], a[2]); } else if(a.length === 5) { _context.drawImage(a[0], a[1], a[2], a[3], a[4]); } else if(a.length === 9) { _context.drawImage(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]); } }, fill: function() { this._context.fill(); }, fillText: function() { var a = arguments; this._context.fillText(a[0], a[1], a[2]); }, getImageData: function() { var a = arguments; return this._context.getImageData(a[0], a[1], a[2], a[3]); }, lineTo: function() { var a = arguments; this._context.lineTo(a[0], a[1]); }, moveTo: function() { var a = arguments; this._context.moveTo(a[0], a[1]); }, rect: function() { var a = arguments; this._context.rect(a[0], a[1], a[2], a[3]); }, putImageData: function() { var a = arguments; this._context.putImageData(a[0], a[1], a[2]); }, quadraticCurveTo: function() { var a = arguments; this._context.quadraticCurveTo(a[0], a[1], a[2], a[3]); }, restore: function() { this._context.restore(); }, rotate: function() { var a = arguments; this._context.rotate(a[0]); }, save: function() { this._context.save(); }, scale: function() { var a = arguments; this._context.scale(a[0], a[1]); }, setLineDash: function() { var a = arguments, _context = this._context; // works for Chrome and IE11 if(this._context.setLineDash) { _context.setLineDash(a[0]); } // verified that this works in firefox else if('mozDash' in _context) { _context.mozDash = a[0]; } // does not currently work for Safari else if('webkitLineDash' in _context) { _context.webkitLineDash = a[0]; } // no support for IE9 and IE10 }, setTransform: function() { var a = arguments; this._context.setTransform(a[0], a[1], a[2], a[3], a[4], a[5]); }, stroke: function() { this._context.stroke(); }, strokeText: function() { var a = arguments; this._context.strokeText(a[0], a[1], a[2]); }, transform: function() { var a = arguments; this._context.transform(a[0], a[1], a[2], a[3], a[4], a[5]); }, translate: function() { var a = arguments; this._context.translate(a[0], a[1]); }, _enableTrace: function() { var that = this, len = CONTEXT_METHODS.length, _simplifyArray = Kinetic.Util._simplifyArray, origSetter = this.setAttr, n, args; // to prevent creating scope function at each loop var func = function(methodName) { var origMethod = that[methodName], ret; that[methodName] = function() { args = _simplifyArray(Array.prototype.slice.call(arguments, 0)); ret = origMethod.apply(that, arguments); that._trace({ method: methodName, args: args }); return ret; }; }; // methods for (n=0; n 255) { return 255; } else if (val < 0) { return 0; } else { return Math.round(val); } }, alphaComponent: function(val) { if (val > 1) { return 1; } // chrome does not honor alpha values of 0 else if (val < 0.0001) { return 0.0001; } else { return val; } } }; })();;(function() { // CONSTANTS var ABSOLUTE_OPACITY = 'absoluteOpacity', ABSOLUTE_TRANSFORM = 'absoluteTransform', BEFORE = 'before', CHANGE = 'Change', CHILDREN = 'children', DOT = '.', EMPTY_STRING = '', GET = 'get', ID = 'id', KINETIC = 'kinetic', LISTENING = 'listening', MOUSEENTER = 'mouseenter', MOUSELEAVE = 'mouseleave', NAME = 'name', SET = 'set', SHAPE = 'Shape', SPACE = ' ', STAGE = 'stage', TRANSFORM = 'transform', UPPER_STAGE = 'Stage', VISIBLE = 'visible', CLONE_BLACK_LIST = ['id'], TRANSFORM_CHANGE_STR = [ 'xChange.kinetic', 'yChange.kinetic', 'scaleXChange.kinetic', 'scaleYChange.kinetic', 'skewXChange.kinetic', 'skewYChange.kinetic', 'rotationChange.kinetic', 'offsetXChange.kinetic', 'offsetYChange.kinetic', 'transformsEnabledChange.kinetic' ].join(SPACE); Kinetic.Util.addMethods(Kinetic.Node, { _init: function(config) { var that = this; this._id = Kinetic.idCounter++; this.eventListeners = {}; this.attrs = {}; this._cache = {}; this._filterUpToDate = false; this.setAttrs(config); // event bindings for cache handling this.on(TRANSFORM_CHANGE_STR, function() { this._clearCache(TRANSFORM); that._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM); }); this.on('visibleChange.kinetic', function() { that._clearSelfAndDescendantCache(VISIBLE); }); this.on('listeningChange.kinetic', function() { that._clearSelfAndDescendantCache(LISTENING); }); this.on('opacityChange.kinetic', function() { that._clearSelfAndDescendantCache(ABSOLUTE_OPACITY); }); }, _clearCache: function(attr){ if (attr) { delete this._cache[attr]; } else { this._cache = {}; } }, _getCache: function(attr, privateGetter){ var cache = this._cache[attr]; // if not cached, we need to set it using the private getter method. if (cache === undefined) { this._cache[attr] = privateGetter.call(this); } return this._cache[attr]; }, /* * when the logic for a cached result depends on ancestor propagation, use this * method to clear self and children cache */ _clearSelfAndDescendantCache: function(attr) { this._clearCache(attr); if (this.children) { this.getChildren().each(function(node) { node._clearSelfAndDescendantCache(attr); }); } }, /** * clear cached canvas * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Node} * @example * node.clearCache(); */ clearCache: function() { delete this._cache.canvas; this._filterUpToDate = false; return this; }, /** * cache node to improve drawing performance, apply filters, or create more accurate * hit regions * @method * @memberof Kinetic.Node.prototype * @param {Object} config * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.drawBorder] when set to true, a red border will be drawn around the cached * region for debugging purposes * @returns {Kinetic.Node} * @example * // cache a shape with the x,y position of the bounding box at the center and
* // the width and height of the bounding box equal to the width and height of
* // the shape obtained from shape.width() and shape.height()
* image.cache();

* * // cache a node and define the bounding box position and size
* node.cache({
* x: -30,
* y: -30,
* width: 100,
* height: 200
* });

* * // cache a node and draw a red border around the bounding box
* // for debugging purposes
* node.cache({
* x: -30,
* y: -30,
* width: 100,
* height: 200,
* drawBorder: true
* }); */ cache: function(config) { var conf = config || {}, x = conf.x || 0, y = conf.y || 0, width = conf.width || this.width(), height = conf.height || this.height(), drawBorder = conf.drawBorder || false, layer = this.getLayer(); if (width === 0 || height === 0) { Kinetic.Util.warn('Width or height of caching configuration equals 0. Cache is ignored.'); return; } var cachedSceneCanvas = new Kinetic.SceneCanvas({ pixelRatio: 1, width: width, height: height }), cachedFilterCanvas = new Kinetic.SceneCanvas({ pixelRatio: 1, width: width, height: height }), cachedHitCanvas = new Kinetic.HitCanvas({ width: width, height: height }), origTransEnabled = this.transformsEnabled(), origX = this.x(), origY = this.y(), sceneContext = cachedSceneCanvas.getContext(), hitContext = cachedHitCanvas.getContext(); this.clearCache(); sceneContext.save(); hitContext.save(); // this will draw a red border around the cached box for // debugging purposes if (drawBorder) { sceneContext.save(); sceneContext.beginPath(); sceneContext.rect(0, 0, width, height); sceneContext.closePath(); sceneContext.setAttr('strokeStyle', 'red'); sceneContext.setAttr('lineWidth', 5); sceneContext.stroke(); sceneContext.restore(); } sceneContext.translate(x * -1, y * -1); hitContext.translate(x * -1, y * -1); if (this.nodeType === 'Shape') { sceneContext.translate(this.x() * -1, this.y() * -1); hitContext.translate(this.x() * -1, this.y() * -1); } this.drawScene(cachedSceneCanvas, this); this.drawHit(cachedHitCanvas, this); sceneContext.restore(); hitContext.restore(); this._cache.canvas = { scene: cachedSceneCanvas, filter: cachedFilterCanvas, hit: cachedHitCanvas }; return this; }, _drawCachedSceneCanvas: function(context) { context.save(); this.getLayer()._applyTransform(this, context); context.drawImage(this._getCachedSceneCanvas()._canvas, 0, 0); context.restore(); }, _getCachedSceneCanvas: function() { var filters = this.filters(), cachedCanvas = this._cache.canvas, sceneCanvas = cachedCanvas.scene, filterCanvas = cachedCanvas.filter, filterContext = filterCanvas.getContext(), len, imageData, n, filter; if (filters) { if (!this._filterUpToDate) { try { len = filters.length; filterContext.clear(); // copy cached canvas onto filter context filterContext.drawImage(sceneCanvas._canvas, 0, 0); imageData = filterContext.getImageData(0, 0, filterCanvas.getWidth(), filterCanvas.getHeight()); // apply filters to filter context for (n=0; n * node.on('click', function() {
* console.log('you clicked me!');
* });

* * // get the target node
* node.on('click', function(evt) {
* console.log(evt.target);
* });

* * // stop event propagation
* node.on('click', function(evt) {
* evt.cancelBubble = true;
* });

* * // bind multiple listeners
* node.on('click touchstart', function() {
* console.log('you clicked/touched me!');
* });

* * // namespace listener
* node.on('click.foo', function() {
* console.log('you clicked/touched me!');
* });

* * // get the event type
* node.on('click tap', function(evt) {
* var eventType = evt.type;
* });

* * // get native event object
* node.on('click tap', function(evt) {
* var nativeEvent = evt.evt;
* });

* * // for change events, get the old and new val
* node.on('xChange', function(evt) {
* var oldVal = evt.oldVal;
* var newVal = evt.newVal;
* }); */ on: function(evtStr, handler) { var events = evtStr.split(SPACE), len = events.length, n, event, parts, baseEvent, name; /* * loop through types and attach event listeners to * each one. eg. 'click mouseover.namespace mouseout' * will create three event bindings */ for(n = 0; n < len; n++) { event = events[n]; parts = event.split(DOT); baseEvent = parts[0]; name = parts[1] || EMPTY_STRING; // create events array if it doesn't exist if(!this.eventListeners[baseEvent]) { this.eventListeners[baseEvent] = []; } this.eventListeners[baseEvent].push({ name: name, handler: handler }); // NOTE: this flag is set to true when any event handler is added, even non // mouse or touch gesture events. This improves performance for most // cases where users aren't using events, but is still very light weight. // To ensure perfect accuracy, devs can explicitly set listening to false. /* if (name !== KINETIC) { this._listeningEnabled = true; this._clearSelfAndAncestorCache(LISTENING_ENABLED); } */ } return this; }, /** * remove event bindings from the node. Pass in a string of * event types delimmited by a space to remove multiple event * bindings at once such as 'mousedown mouseup mousemove'. * include a namespace to remove an event binding by name * such as 'click.foobar'. If you only give a name like '.foobar', * all events in that namespace will be removed. * @method * @memberof Kinetic.Node.prototype * @param {String} evtStr e.g. 'click', 'mousedown touchstart', '.foobar' * @returns {Kinetic.Node} * @example * // remove listener
* node.off('click');

* * // remove multiple listeners
* node.off('click touchstart');

* * // remove listener by name
* node.off('click.foo'); */ off: function(evtStr) { var events = evtStr.split(SPACE), len = events.length, n, t, event, parts, baseEvent, name; for(n = 0; n < len; n++) { event = events[n]; parts = event.split(DOT); baseEvent = parts[0]; name = parts[1]; if(baseEvent) { if(this.eventListeners[baseEvent]) { this._off(baseEvent, name); } } else { for(t in this.eventListeners) { this._off(t, name); } } } return this; }, // some event aliases for third party integration like HammerJS dispatchEvent: function(evt) { var e = { target: this, type: evt.type, evt: evt }; this.fire(evt.type, e); }, addEventListener: function(type, handler) { // we to pass native event to handler this.on(type, function(evt){ handler.call(this, evt.evt); }); }, /** * remove self from parent, but don't destroy * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Node} * @example * node.remove(); */ remove: function() { var parent = this.getParent(); if(parent && parent.children) { parent.children.splice(this.index, 1); parent._setChildrenIndices(); delete this.parent; } // every cached attr that is calculated via node tree // traversal must be cleared when removing a node this._clearSelfAndDescendantCache(STAGE); this._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM); this._clearSelfAndDescendantCache(VISIBLE); this._clearSelfAndDescendantCache(LISTENING); this._clearSelfAndDescendantCache(ABSOLUTE_OPACITY); return this; }, /** * remove and destroy self * @method * @memberof Kinetic.Node.prototype * @example * node.destroy(); */ destroy: function() { // remove from ids and names hashes Kinetic._removeId(this.getId()); Kinetic._removeName(this.getName(), this._id); this.remove(); }, /** * get attr * @method * @memberof Kinetic.Node.prototype * @param {String} attr * @returns {Integer|String|Object|Array} * @example * var x = node.getAttr('x'); */ getAttr: function(attr) { var method = GET + Kinetic.Util._capitalize(attr); if(Kinetic.Util._isFunction(this[method])) { return this[method](); } // otherwise get directly else { return this.attrs[attr]; } }, /** * get ancestors * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Collection} * @example * shape.getAncestors().each(function(node) { * console.log(node.getId()); * }) */ getAncestors: function() { var parent = this.getParent(), ancestors = new Kinetic.Collection(); while (parent) { ancestors.push(parent); parent = parent.getParent(); } return ancestors; }, /** * get attrs object literal * @method * @memberof Kinetic.Node.prototype * @returns {Object} */ getAttrs: function() { return this.attrs || {}; }, /** * set multiple attrs at once using an object literal * @method * @memberof Kinetic.Node.prototype * @param {Object} config object containing key value pairs * @returns {Kinetic.Node} * @example * node.setAttrs({
* x: 5,
* fill: 'red'
* });
*/ setAttrs: function(config) { var key, method; if(config) { for(key in config) { if (key === CHILDREN) { } else { method = SET + Kinetic.Util._capitalize(key); // use setter if available if(Kinetic.Util._isFunction(this[method])) { this[method](config[key]); } // otherwise set directly else { this._setAttr(key, config[key]); } } } } return this; }, /** * determine if node is listening for events by taking into account ancestors. * * Parent | Self | isListening * listening | listening | * ----------+-----------+------------ * T | T | T * T | F | F * F | T | T * F | F | F * ----------+-----------+------------ * T | I | T * F | I | F * I | I | T * * @method * @memberof Kinetic.Node.prototype * @returns {Boolean} */ isListening: function() { return this._getCache(LISTENING, this._isListening); }, _isListening: function() { var listening = this.getListening(), parent = this.getParent(); // the following conditions are a simplification of the truth table above. // please modify carefully if (listening === 'inherit') { if (parent) { return parent.isListening(); } else { return true; } } else { return listening; } }, /** * determine if node is visible by taking into account ancestors. * * Parent | Self | isVisible * visible | visible | * ----------+-----------+------------ * T | T | T * T | F | F * F | T | T * F | F | F * ----------+-----------+------------ * T | I | T * F | I | F * I | I | T * @method * @memberof Kinetic.Node.prototype * @returns {Boolean} */ isVisible: function() { return this._getCache(VISIBLE, this._isVisible); }, _isVisible: function() { var visible = this.getVisible(), parent = this.getParent(); // the following conditions are a simplification of the truth table above. // please modify carefully if (visible === 'inherit') { if (parent) { return parent.isVisible(); } else { return true; } } else { return visible; } }, /** * determine if listening is enabled by taking into account descendants. If self or any children * have _isListeningEnabled set to true, then self also has listening enabled. * @method * @memberof Kinetic.Node.prototype * @returns {Boolean} */ shouldDrawHit: function() { var layer = this.getLayer(); return layer && layer.hitGraphEnabled() && this.isListening() && this.isVisible() && !Kinetic.isDragging(); }, /** * show node * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Node} */ show: function() { this.setVisible(true); return this; }, /** * hide node. Hidden nodes are no longer detectable * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Node} */ hide: function() { this.setVisible(false); return this; }, /** * get zIndex relative to the node's siblings who share the same parent * @method * @memberof Kinetic.Node.prototype * @returns {Integer} */ getZIndex: function() { return this.index || 0; }, /** * get absolute z-index which takes into account sibling * and ancestor indices * @method * @memberof Kinetic.Node.prototype * @returns {Integer} */ getAbsoluteZIndex: function() { var depth = this.getDepth(), that = this, index = 0, nodes, len, n, child; function addChildren(children) { nodes = []; len = children.length; for(n = 0; n < len; n++) { child = children[n]; index++; if(child.nodeType !== SHAPE) { nodes = nodes.concat(child.getChildren().toArray()); } if(child._id === that._id) { n = len; } } if(nodes.length > 0 && nodes[0].getDepth() <= depth) { addChildren(nodes); } } if(that.nodeType !== UPPER_STAGE) { addChildren(that.getStage().getChildren()); } return index; }, /** * get node depth in node tree. Returns an integer.

* e.g. Stage depth will always be 0. Layers will always be 1. Groups and Shapes will always * be >= 2 * @method * @memberof Kinetic.Node.prototype * @returns {Integer} */ getDepth: function() { var depth = 0, parent = this.parent; while(parent) { depth++; parent = parent.parent; } return depth; }, setPosition: function(pos) { this.setX(pos.x); this.setY(pos.y); return this; }, getPosition: function() { return { x: this.getX(), y: this.getY() }; }, /** * get absolute position relative to the top left corner of the stage container div * @method * @memberof Kinetic.Node.prototype * @returns {Object} */ getAbsolutePosition: function() { var absoluteMatrix = this.getAbsoluteTransform().getMatrix(), absoluteTransform = new Kinetic.Transform(), offset = this.offset(); // clone the matrix array absoluteTransform.m = absoluteMatrix.slice(); absoluteTransform.translate(offset.x, offset.y); return absoluteTransform.getTranslation(); }, /** * set absolute position * @method * @memberof Kinetic.Node.prototype * @param {Object} pos * @param {Number} pos.x * @param {Number} pos.y * @returns {Kinetic.Node} */ setAbsolutePosition: function(pos) { var origTrans = this._clearTransform(), it; // don't clear translation this.attrs.x = origTrans.x; this.attrs.y = origTrans.y; delete origTrans.x; delete origTrans.y; // unravel transform it = this.getAbsoluteTransform(); it.invert(); it.translate(pos.x, pos.y); pos = { x: this.attrs.x + it.getTranslation().x, y: this.attrs.y + it.getTranslation().y }; this.setPosition({x:pos.x, y:pos.y}); this._setTransform(origTrans); return this; }, _setTransform: function(trans) { var key; for(key in trans) { this.attrs[key] = trans[key]; } this._clearCache(TRANSFORM); this._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM); }, _clearTransform: function() { var trans = { x: this.getX(), y: this.getY(), rotation: this.getRotation(), scaleX: this.getScaleX(), scaleY: this.getScaleY(), offsetX: this.getOffsetX(), offsetY: this.getOffsetY(), skewX: this.getSkewX(), skewY: this.getSkewY() }; this.attrs.x = 0; this.attrs.y = 0; this.attrs.rotation = 0; this.attrs.scaleX = 1; this.attrs.scaleY = 1; this.attrs.offsetX = 0; this.attrs.offsetY = 0; this.attrs.skewX = 0; this.attrs.skewY = 0; this._clearCache(TRANSFORM); this._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM); // return original transform return trans; }, /** * move node by an amount relative to its current position * @method * @memberof Kinetic.Node.prototype * @param {Object} change * @param {Number} change.x * @param {Number} change.y * @returns {Kinetic.Node} * @example * // move node in x direction by 1px and y direction by 2px
* node.move({
* x: 1,
* y: 2)
* }); */ move: function(change) { var changeX = change.x, changeY = change.y, x = this.getX(), y = this.getY(); if(changeX !== undefined) { x += changeX; } if(changeY !== undefined) { y += changeY; } this.setPosition({x:x, y:y}); return this; }, _eachAncestorReverse: function(func, top) { var family = [], parent = this.getParent(), len, n; // if top node is defined, and this node is top node, // there's no need to build a family tree. just execute // func with this because it will be the only node if (top && top._id === this._id) { func(this); return true; } family.unshift(this); while(parent && (!top || parent._id !== top._id)) { family.unshift(parent); parent = parent.parent; } len = family.length; for(n = 0; n < len; n++) { func(family[n]); } }, /** * rotate node by an amount in degrees relative to its current rotation * @method * @memberof Kinetic.Node.prototype * @param {Number} theta * @returns {Kinetic.Node} */ rotate: function(theta) { this.setRotation(this.getRotation() + theta); return this; }, /** * move node to the top of its siblings * @method * @memberof Kinetic.Node.prototype * @returns {Boolean} */ moveToTop: function() { if (!this.parent) { Kinetic.Util.warn('Node has no parent. moveToTop function is ignored.'); return; } var index = this.index; this.parent.children.splice(index, 1); this.parent.children.push(this); this.parent._setChildrenIndices(); return true; }, /** * move node up * @method * @memberof Kinetic.Node.prototype * @returns {Boolean} */ moveUp: function() { if (!this.parent) { Kinetic.Util.warn('Node has no parent. moveUp function is ignored.'); return; } var index = this.index, len = this.parent.getChildren().length; if(index < len - 1) { this.parent.children.splice(index, 1); this.parent.children.splice(index + 1, 0, this); this.parent._setChildrenIndices(); return true; } return false; }, /** * move node down * @method * @memberof Kinetic.Node.prototype * @returns {Boolean} */ moveDown: function() { if (!this.parent) { Kinetic.Util.warn('Node has no parent. moveDown function is ignored.'); return; } var index = this.index; if(index > 0) { this.parent.children.splice(index, 1); this.parent.children.splice(index - 1, 0, this); this.parent._setChildrenIndices(); return true; } return false; }, /** * move node to the bottom of its siblings * @method * @memberof Kinetic.Node.prototype * @returns {Boolean} */ moveToBottom: function() { if (!this.parent) { Kinetic.Util.warn('Node has no parent. moveToBottom function is ignored.'); return; } var index = this.index; if(index > 0) { this.parent.children.splice(index, 1); this.parent.children.unshift(this); this.parent._setChildrenIndices(); return true; } return false; }, /** * set zIndex relative to siblings * @method * @memberof Kinetic.Node.prototype * @param {Integer} zIndex * @returns {Kinetic.Node} */ setZIndex: function(zIndex) { if (!this.parent) { Kinetic.Util.warn('Node has no parent. zIndex parameter is ignored.'); return; } var index = this.index; this.parent.children.splice(index, 1); this.parent.children.splice(zIndex, 0, this); this.parent._setChildrenIndices(); return this; }, /** * get absolute opacity * @method * @memberof Kinetic.Node.prototype * @returns {Number} */ getAbsoluteOpacity: function() { return this._getCache(ABSOLUTE_OPACITY, this._getAbsoluteOpacity); }, _getAbsoluteOpacity: function() { var absOpacity = this.getOpacity(); if(this.getParent()) { absOpacity *= this.getParent().getAbsoluteOpacity(); } return absOpacity; }, /** * move node to another container * @method * @memberof Kinetic.Node.prototype * @param {Container} newContainer * @returns {Kinetic.Node} * @example * // move node from current layer into layer2
* node.moveTo(layer2); */ moveTo: function(newContainer) { Kinetic.Node.prototype.remove.call(this); newContainer.add(this); return this; }, /** * convert Node into an object for serialization. Returns an object. * @method * @memberof Kinetic.Node.prototype * @returns {Object} */ toObject: function() { var type = Kinetic.Util, obj = {}, attrs = this.getAttrs(), key, val, getter, defaultValue; obj.attrs = {}; // serialize only attributes that are not function, image, DOM, or objects with methods for(key in attrs) { val = attrs[key]; if (!type._isFunction(val) && !type._isElement(val) && !(type._isObject(val) && type._hasMethods(val))) { getter = this[key]; // remove attr value so that we can extract the default value from the getter delete attrs[key]; defaultValue = getter ? getter.call(this) : null; // restore attr value attrs[key] = val; if (defaultValue !== val) { obj.attrs[key] = val; } } } obj.className = this.getClassName(); return obj; }, /** * convert Node into a JSON string. Returns a JSON string. * @method * @memberof Kinetic.Node.prototype * @returns {String}} */ toJSON: function() { return JSON.stringify(this.toObject()); }, /** * get parent container * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Node} */ getParent: function() { return this.parent; }, /** * get layer ancestor * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Layer} */ getLayer: function() { var parent = this.getParent(); return parent ? parent.getLayer() : null; }, /** * get stage ancestor * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Stage} */ getStage: function() { return this._getCache(STAGE, this._getStage); }, _getStage: function() { var parent = this.getParent(); if(parent) { return parent.getStage(); } else { return undefined; } }, /** * fire event * @method * @memberof Kinetic.Node.prototype * @param {String} eventType event type. can be a regular event, like click, mouseover, or mouseout, or it can be a custom event, like myCustomEvent * @param {EventObject} [evt] event object * @param {Boolean} [bubble] setting the value to false, or leaving it undefined, will result in the event * not bubbling. Setting the value to true will result in the event bubbling. * @returns {Kinetic.Node} * @example * // manually fire click event
* node.fire('click');

* * // fire custom event
* node.fire('foo');

* * // fire custom event with custom event object
* node.fire('foo', {
* bar: 10
* });

* * // fire click event that bubbles
* node.fire('click', null, true); */ fire: function(eventType, evt, bubble) { // bubble if (bubble) { this._fireAndBubble(eventType, evt || {}); } // no bubble else { this._fire(eventType, evt || {}); } return this; }, /** * get absolute transform of the node which takes into * account its ancestor transforms * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Transform} */ getAbsoluteTransform: function(top) { // if using an argument, we can't cache the result. if (top) { return this._getAbsoluteTransform(top); } // if no argument, we can cache the result else { return this._getCache(ABSOLUTE_TRANSFORM, this._getAbsoluteTransform); } }, _getAbsoluteTransform: function(top) { var at = new Kinetic.Transform(), transformsEnabled, trans; // start with stage and traverse downwards to self this._eachAncestorReverse(function(node) { transformsEnabled = node.transformsEnabled(); trans = node.getTransform(); if (transformsEnabled === 'all') { at.multiply(trans); } else if (transformsEnabled === 'position') { at.translate(node.x(), node.y()); } }, top); return at; }, /** * get transform of the node * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Transform} */ getTransform: function() { return this._getCache(TRANSFORM, this._getTransform); }, _getTransform: function() { var m = new Kinetic.Transform(), x = this.getX(), y = this.getY(), rotation = Kinetic.getAngle(this.getRotation()), scaleX = this.getScaleX(), scaleY = this.getScaleY(), skewX = this.getSkewX(), skewY = this.getSkewY(), offsetX = this.getOffsetX(), offsetY = this.getOffsetY(); if(x !== 0 || y !== 0) { m.translate(x, y); } if(rotation !== 0) { m.rotate(rotation); } if(skewX !== 0 || skewY !== 0) { m.skew(skewX, skewY); } if(scaleX !== 1 || scaleY !== 1) { m.scale(scaleX, scaleY); } if(offsetX !== 0 || offsetY !== 0) { m.translate(-1 * offsetX, -1 * offsetY); } return m; }, /** * clone node. Returns a new Node instance with identical attributes. You can also override * the node properties with an object literal, enabling you to use an existing node as a template * for another node * @method * @memberof Kinetic.Node.prototype * @param {Object} attrs override attrs * @returns {Kinetic.Node} * @example * // simple clone
* var clone = node.clone();

* * // clone a node and override the x position
* var clone = rect.clone({
* x: 5
* }); */ clone: function(obj) { // instantiate new node var className = this.getClassName(), attrs = Kinetic.Util.cloneObject(this.attrs), key, allListeners, len, n, listener; // filter black attrs for (var i in CLONE_BLACK_LIST) { var blockAttr = CLONE_BLACK_LIST[i]; delete attrs[blockAttr]; } // apply attr overrides for (key in obj) { attrs[key] = obj[key]; } var node = new Kinetic[className](attrs); // copy over listeners for(key in this.eventListeners) { allListeners = this.eventListeners[key]; len = allListeners.length; for(n = 0; n < len; n++) { listener = allListeners[n]; /* * don't include kinetic namespaced listeners because * these are generated by the constructors */ if(listener.name.indexOf(KINETIC) < 0) { // if listeners array doesn't exist, then create it if(!node.eventListeners[key]) { node.eventListeners[key] = []; } node.eventListeners[key].push(listener); } } } return node; }, /** * Creates a composite data URL. If MIME type is not * specified, then "image/png" will result. For "image/jpeg", specify a quality * level as quality (range 0.0 - 1.0) * @method * @memberof Kinetic.Node.prototype * @param {Object} config * @param {String} [config.mimeType] can be "image/png" or "image/jpeg". * "image/png" is the default * @param {Number} [config.x] x position of canvas section * @param {Number} [config.y] y position of canvas section * @param {Number} [config.width] width of canvas section * @param {Number} [config.height] height of canvas section * @param {Number} [config.quality] jpeg quality. If using an "image/jpeg" mimeType, * you can specify the quality from 0 to 1, where 0 is very poor quality and 1 * is very high quality * @returns {String} */ toDataURL: function(config) { config = config || {}; var mimeType = config.mimeType || null, quality = config.quality || null, stage = this.getStage(), x = config.x || 0, y = config.y || 0, canvas = new Kinetic.SceneCanvas({ width: config.width || this.getWidth() || (stage ? stage.getWidth() : 0), height: config.height || this.getHeight() || (stage ? stage.getHeight() : 0), pixelRatio: 1 }), context = canvas.getContext(); context.save(); if(x || y) { context.translate(-1 * x, -1 * y); } this.drawScene(canvas); context.restore(); return canvas.toDataURL(mimeType, quality); }, /** * converts node into an image. Since the toImage * method is asynchronous, a callback is required. toImage is most commonly used * to cache complex drawings as an image so that they don't have to constantly be redrawn * @method * @memberof Kinetic.Node.prototype * @param {Object} config * @param {Function} config.callback function executed when the composite has completed * @param {String} [config.mimeType] can be "image/png" or "image/jpeg". * "image/png" is the default * @param {Number} [config.x] x position of canvas section * @param {Number} [config.y] y position of canvas section * @param {Number} [config.width] width of canvas section * @param {Number} [config.height] height of canvas section * @param {Number} [config.quality] jpeg quality. If using an "image/jpeg" mimeType, * you can specify the quality from 0 to 1, where 0 is very poor quality and 1 * is very high quality * @example * var image = node.toImage({
* callback: function(img) {
* // do stuff with img
* }
* }); */ toImage: function(config) { Kinetic.Util._getImage(this.toDataURL(config), function(img) { config.callback(img); }); }, setSize: function(size) { this.setWidth(size.width); this.setHeight(size.height); return this; }, getSize: function() { return { width: this.getWidth(), height: this.getHeight() }; }, /** * get width * @method * @memberof Kinetic.Node.prototype * @returns {Integer} */ getWidth: function() { return this.attrs.width || 0; }, /** * get height * @method * @memberof Kinetic.Node.prototype * @returns {Integer} */ getHeight: function() { return this.attrs.height || 0; }, /** * get class name, which may return Stage, Layer, Group, or shape class names like Rect, Circle, Text, etc. * @method * @memberof Kinetic.Node.prototype * @returns {String} */ getClassName: function() { return this.className || this.nodeType; }, /** * get the node type, which may return Stage, Layer, Group, or Node * @method * @memberof Kinetic.Node.prototype * @returns {String} */ getType: function() { return this.nodeType; }, getDragDistance: function() { // compare with undefined because we need to track 0 value if (this.attrs.dragDistance !== undefined) { return this.attrs.dragDistance; } else if (this.parent) { return this.parent.getDragDistance(); } else { return Kinetic.dragDistance; } }, _get: function(selector) { return this.nodeType === selector ? [this] : []; }, _off: function(type, name) { var evtListeners = this.eventListeners[type], i, evtName; for(i = 0; i < evtListeners.length; i++) { evtName = evtListeners[i].name; // the following two conditions must be true in order to remove a handler: // 1) the current event name cannot be kinetic unless the event name is kinetic // this enables developers to force remove a kinetic specific listener for whatever reason // 2) an event name is not specified, or if one is specified, it matches the current event name if((evtName !== 'kinetic' || name === 'kinetic') && (!name || evtName === name)) { evtListeners.splice(i, 1); if(evtListeners.length === 0) { delete this.eventListeners[type]; break; } i--; } } }, _fireChangeEvent: function(attr, oldVal, newVal) { this._fire(attr + CHANGE, { oldVal: oldVal, newVal: newVal }); }, /** * set id * @method * @memberof Kinetic.Node.prototype * @param {String} id * @returns {Kinetic.Node} */ setId: function(id) { var oldId = this.getId(); Kinetic._removeId(oldId); Kinetic._addId(this, id); this._setAttr(ID, id); return this; }, setName: function(name) { var oldName = this.getName(); Kinetic._removeName(oldName, this._id); Kinetic._addName(this, name); this._setAttr(NAME, name); return this; }, /** * set attr * @method * @memberof Kinetic.Node.prototype * @param {String} attr * @param {*} val * @returns {Kinetic.Node} * @example * node.setAttr('x', 5); */ setAttr: function() { var args = Array.prototype.slice.call(arguments), attr = args[0], val = args[1], method = SET + Kinetic.Util._capitalize(attr), func = this[method]; if(Kinetic.Util._isFunction(func)) { func.call(this, val); } // otherwise set directly else { this._setAttr(attr, val); } return this; }, _setAttr: function(key, val) { var oldVal; if(val !== undefined) { oldVal = this.attrs[key]; this.attrs[key] = val; this._fireChangeEvent(key, oldVal, val); } }, _setComponentAttr: function(key, component, val) { var oldVal; if(val !== undefined) { oldVal = this.attrs[key]; if (!oldVal) { // set value to default value using getAttr this.attrs[key] = this.getAttr(key); } this.attrs[key][component] = val; this._fireChangeEvent(key, oldVal, val); } }, _fireAndBubble: function(eventType, evt, compareShape) { var okayToRun = true; if(evt && this.nodeType === SHAPE) { evt.target = this; } if(eventType === MOUSEENTER && compareShape && this._id === compareShape._id) { okayToRun = false; } else if(eventType === MOUSELEAVE && compareShape && this._id === compareShape._id) { okayToRun = false; } if(okayToRun) { this._fire(eventType, evt); // simulate event bubbling if(evt && !evt.cancelBubble && this.parent) { if(compareShape && compareShape.parent) { this._fireAndBubble.call(this.parent, eventType, evt, compareShape.parent); } else { this._fireAndBubble.call(this.parent, eventType, evt); } } } }, _fire: function(eventType, evt) { var events = this.eventListeners[eventType], i; evt.type = eventType; if (events) { for(i = 0; i < events.length; i++) { events[i].handler.call(this, evt); } } }, /** * draw both scene and hit graphs. If the node being drawn is the stage, all of the layers will be cleared and redrawn * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Node} */ draw: function() { this.drawScene(); this.drawHit(); return this; } }); /** * create node with JSON string. De-serializtion does not generate custom * shape drawing functions, images, or event handlers (this would make the * serialized object huge). If your app uses custom shapes, images, and * event handlers (it probably does), then you need to select the appropriate * shapes after loading the stage and set these properties via on(), setDrawFunc(), * and setImage() methods * @method * @memberof Kinetic.Node * @param {String} JSON string * @param {DomElement} [container] optional container dom element used only if you're * creating a stage node */ Kinetic.Node.create = function(json, container) { return this._createNode(JSON.parse(json), container); }; Kinetic.Node._createNode = function(obj, container) { var className = Kinetic.Node.prototype.getClassName.call(obj), children = obj.children, no, len, n; // if container was passed in, add it to attrs if(container) { obj.attrs.container = container; } no = new Kinetic[className](obj.attrs); if(children) { len = children.length; for(n = 0; n < len; n++) { no.add(this._createNode(children[n])); } } return no; }; // =========================== add getters setters =========================== Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'position'); /** * get/set node position relative to parent * @name position * @method * @memberof Kinetic.Node.prototype * @param {Object} pos * @param {Number} pos.x * @param {Nubmer} pos.y * @returns {Object} * @example * // get position
* var position = node.position();

* * // set position
* node.position({
* x: 5
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'x', 0); /** * get/set x position * @name x * @method * @memberof Kinetic.Node.prototype * @param {Number} x * @returns {Object} * @example * // get x
* var x = node.x();

* * // set x
* node.x(5); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'y', 0); /** * get/set y position * @name y * @method * @memberof Kinetic.Node.prototype * @param {Number} y * @returns {Integer} * @example * // get y
* var y = node.y();

* * // set y
* node.y(5); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'opacity', 1); /** * get/set opacity. Opacity values range from 0 to 1. * A node with an opacity of 0 is fully transparent, and a node * with an opacity of 1 is fully opaque * @name opacity * @method * @memberof Kinetic.Node.prototype * @param {Object} opacity * @returns {Number} * @example * // get opacity
* var opacity = node.opacity();

* * // set opacity
* node.opacity(0.5); */ Kinetic.Factory.addGetter(Kinetic.Node, 'name'); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'name'); /** * get/set name * @name name * @method * @memberof Kinetic.Node.prototype * @param {String} name * @returns {String} * @example * // get name
* var name = node.name();

* * // set name
* node.name('foo'); */ Kinetic.Factory.addGetter(Kinetic.Node, 'id'); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'id'); /** * get/set id * @name id * @method * @memberof Kinetic.Node.prototype * @param {String} id * @returns {String} * @example * // get id
* var name = node.id();

* * // set id
* node.id('foo'); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'rotation', 0); /** * get/set rotation in degrees * @name rotation * @method * @memberof Kinetic.Node.prototype * @param {Number} rotation * @returns {Number} * @example * // get rotation in degrees
* var rotation = node.rotation();

* * // set rotation in degrees
* node.rotation(45); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Node, 'scale', ['x', 'y']); /** * get/set scale * @name scale * @param {Object} scale * @param {Number} scale.x * @param {Number} scale.y * @method * @memberof Kinetic.Node.prototype * @returns {Object} * @example * // get scale
* var scale = node.scale();

* * // set scale
* shape.scale({
* x: 2
* y: 3
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'scaleX', 1); /** * get/set scale x * @name scaleX * @param {Number} x * @method * @memberof Kinetic.Node.prototype * @returns {Number} * @example * // get scale x
* var scaleX = node.scaleX();

* * // set scale x
* node.scaleX(2); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'scaleY', 1); /** * get/set scale y * @name scaleY * @param {Number} y * @method * @memberof Kinetic.Node.prototype * @returns {Number} * @example * // get scale y
* var scaleY = node.scaleY();

* * // set scale y
* node.scaleY(2); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Node, 'skew', ['x', 'y']); /** * get/set skew * @name skew * @param {Object} skew * @param {Number} skew.x * @param {Number} skew.y * @method * @memberof Kinetic.Node.prototype * @returns {Object} * @example * // get skew
* var skew = node.skew();

* * // set skew
* node.skew({
* x: 20
* y: 10 * }); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'skewX', 0); /** * get/set skew x * @name skewX * @param {Number} x * @method * @memberof Kinetic.Node.prototype * @returns {Number} * @example * // get skew x
* var skewX = node.skewX();

* * // set skew x
* node.skewX(3); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'skewY', 0); /** * get/set skew y * @name skewY * @param {Number} y * @method * @memberof Kinetic.Node.prototype * @returns {Number} * @example * // get skew y
* var skewY = node.skewY();

* * // set skew y
* node.skewY(3); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Node, 'offset', ['x', 'y']); /** * get/set offset. Offsets the default position and rotation point * @method * @memberof Kinetic.Node.prototype * @param {Object} offset * @param {Number} offset.x * @param {Number} offset.y * @returns {Object} * @example * // get offset
* var offset = node.offset();

* * // set offset
* node.offset({
* x: 20
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'offsetX', 0); /** * get/set offset x * @name offsetX * @memberof Kinetic.Node.prototype * @param {Number} x * @returns {Number} * @example * // get offset x
* var offsetX = node.offsetX();

* * // set offset x
* node.offsetX(3); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'offsetY', 0); /** * get/set drag distance * @name dragDistance * @memberof Kinetic.Node.prototype * @param {Number} distance * @returns {Number} * @example * // get drag distance
* var dragDistance = node.dragDistance();

* * // set distance
* // node starts dragging only if pointer moved more then 3 pixels
* node.dragDistance(3);
* // or set globally
* Kinetic.dragDistance = 3; */ Kinetic.Factory.addSetter(Kinetic.Node, 'dragDistance'); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'dragDistance'); /** * get/set offset y * @name offsetY * @method * @memberof Kinetic.Node.prototype * @param {Number} y * @returns {Number} * @example * // get offset y
* var offsetY = node.offsetY();

* * // set offset y
* node.offsetY(3); */ Kinetic.Factory.addSetter(Kinetic.Node, 'width', 0); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'width'); /** * get/set width * @name width * @method * @memberof Kinetic.Node.prototype * @param {Number} width * @returns {Number} * @example * // get width
* var width = node.width();

* * // set width
* node.width(100); */ Kinetic.Factory.addSetter(Kinetic.Node, 'height', 0); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'height'); /** * get/set height * @name height * @method * @memberof Kinetic.Node.prototype * @param {Number} height * @returns {Number} * @example * // get height
* var height = node.height();

* * // set height
* node.height(100); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'listening', 'inherit'); /** * get/set listenig attr. If you need to determine if a node is listening or not * by taking into account its parents, use the isListening() method * @name listening * @method * @memberof Kinetic.Node.prototype * @param {Boolean|String} listening Can be "inherit", true, or false. The default is "inherit". * @returns {Boolean|String} * @example * // get listening attr
* var listening = node.listening();

* * // stop listening for events
* node.listening(false);

* * // listen for events
* node.listening(true);

* * // listen to events according to the parent
* node.listening('inherit'); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'filters', undefined, function(val) {this._filterUpToDate = false;return val;}); /** * get/set filters. Filters are applied to cached canvases * @name filters * @method * @memberof Kinetic.Node.prototype * @param {Array} filters array of filters * @returns {Array} * @example * // get filters
* var filters = node.filters();

* * // set a single filter
* node.cache();
* node.filters([Kinetic.Filters.Blur]);

* * // set multiple filters
* node.cache();
* node.filters([
* Kinetic.Filters.Blur,
* Kinetic.Filters.Sepia,
* Kinetic.Filters.Invert
* ]); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'visible', 'inherit'); /** * get/set visible attr. Can be "inherit", true, or false. The default is "inherit". * If you need to determine if a node is visible or not * by taking into account its parents, use the isVisible() method * @name visible * @method * @memberof Kinetic.Node.prototype * @param {Boolean|String} visible * @returns {Boolean|String} * @example * // get visible attr
* var visible = node.visible();

* * // make invisible
* node.visible(false);

* * // make visible
* node.visible(true);

* * // make visible according to the parent
* node.visible('inherit'); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'transformsEnabled', 'all'); /** * get/set transforms that are enabled. Can be "all", "none", or "position". The default * is "all" * @name transformsEnabled * @method * @memberof Kinetic.Node.prototype * @param {String} enabled * @returns {String} * @example * // enable position transform only to improve draw performance
* node.transformsEnabled('position');

* * // enable all transforms
* node.transformsEnabled('all'); */ /** * get/set node size * @name size * @method * @memberof Kinetic.Node.prototype * @param {Object} size * @param {Number} size.width * @param {Number} size.height * @returns {Object} * @example * // get node size
* var size = node.size();
* var x = size.x;
* var y = size.y;

* * // set size
* node.size({
* width: 100,
* height: 200
* }); */ Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'size'); Kinetic.Factory.backCompat(Kinetic.Node, { rotateDeg: 'rotate', setRotationDeg: 'setRotation', getRotationDeg: 'getRotation' }); Kinetic.Collection.mapMethods(Kinetic.Node); })(); ;(function() { /** * Grayscale Filter * @function * @memberof Kinetic.Filters * @param {Object} imageData */ Kinetic.Filters.Grayscale = function(imageData) { var data = imageData.data, len = data.length, i, brightness; for(i = 0; i < len; i += 4) { brightness = 0.34 * data[i] + 0.5 * data[i + 1] + 0.16 * data[i + 2]; // red data[i] = brightness; // green data[i + 1] = brightness; // blue data[i + 2] = brightness; } }; })(); ;(function() { /** * Brighten Filter. * @function * @memberof Kinetic.Filters * @param {Object} imageData */ Kinetic.Filters.Brighten = function(imageData) { var brightness = this.brightness() * 255, data = imageData.data, len = data.length, i; for(i = 0; i < len; i += 4) { // red data[i] += brightness; // green data[i + 1] += brightness; // blue data[i + 2] += brightness; } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'brightness', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set filter brightness. The brightness is a number between -1 and 1.  Positive values * brighten the pixels and negative values darken them. * @name brightness * @method * @memberof Kinetic.Image.prototype * @param {Number} brightness value between -1 and 1 * @returns {Number} */ })(); ;(function() { /** * Invert Filter * @function * @memberof Kinetic.Filters * @param {Object} imageData */ Kinetic.Filters.Invert = function(imageData) { var data = imageData.data, len = data.length, i; for(i = 0; i < len; i += 4) { // red data[i] = 255 - data[i]; // green data[i + 1] = 255 - data[i + 1]; // blue data[i + 2] = 255 - data[i + 2]; } }; })();;/* the Gauss filter master repo: https://github.com/pavelpower/kineticjsGaussFilter/ */ (function() { /* StackBlur - a fast almost Gaussian Blur For Canvas Version: 0.5 Author: Mario Klingemann Contact: mario@quasimondo.com Website: http://www.quasimondo.com/StackBlurForCanvas Twitter: @quasimondo In case you find this class useful - especially in commercial projects - I am not totally unhappy for a small donation to my PayPal account mario@quasimondo.de Or support me on flattr: https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript Copyright (c) 2010 Mario Klingemann 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. */ function BlurStack() { this.r = 0; this.g = 0; this.b = 0; this.a = 0; this.next = null; } var mul_table = [ 512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512, 454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512, 482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456, 437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512, 497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328, 320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456, 446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335, 329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512, 505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405, 399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328, 324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271, 268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456, 451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388, 385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335, 332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292, 289,287,285,282,280,278,275,273,271,269,267,265,263,261,259 ]; var shg_table = [ 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 ]; function filterGaussBlurRGBA( imageData, radius) { var pixels = imageData.data, width = imageData.width, height = imageData.height; var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, a_sum, r_out_sum, g_out_sum, b_out_sum, a_out_sum, r_in_sum, g_in_sum, b_in_sum, a_in_sum, pr, pg, pb, pa, rbs; var div = radius + radius + 1, widthMinus1 = width - 1, heightMinus1 = height - 1, radiusPlus1 = radius + 1, sumFactor = radiusPlus1 * ( radiusPlus1 + 1 ) / 2, stackStart = new BlurStack(), stackEnd = null, stack = stackStart, stackIn = null, stackOut = null, mul_sum = mul_table[radius], shg_sum = shg_table[radius]; for ( i = 1; i < div; i++ ) { stack = stack.next = new BlurStack(); if ( i == radiusPlus1 ){ stackEnd = stack; } } stack.next = stackStart; yw = yi = 0; for ( y = 0; y < height; y++ ) { r_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0; r_out_sum = radiusPlus1 * ( pr = pixels[yi] ); g_out_sum = radiusPlus1 * ( pg = pixels[yi+1] ); b_out_sum = radiusPlus1 * ( pb = pixels[yi+2] ); a_out_sum = radiusPlus1 * ( pa = pixels[yi+3] ); r_sum += sumFactor * pr; g_sum += sumFactor * pg; b_sum += sumFactor * pb; a_sum += sumFactor * pa; stack = stackStart; for( i = 0; i < radiusPlus1; i++ ) { stack.r = pr; stack.g = pg; stack.b = pb; stack.a = pa; stack = stack.next; } for( i = 1; i < radiusPlus1; i++ ) { p = yi + (( widthMinus1 < i ? widthMinus1 : i ) << 2 ); r_sum += ( stack.r = ( pr = pixels[p])) * ( rbs = radiusPlus1 - i ); g_sum += ( stack.g = ( pg = pixels[p+1])) * rbs; b_sum += ( stack.b = ( pb = pixels[p+2])) * rbs; a_sum += ( stack.a = ( pa = pixels[p+3])) * rbs; r_in_sum += pr; g_in_sum += pg; b_in_sum += pb; a_in_sum += pa; stack = stack.next; } stackIn = stackStart; stackOut = stackEnd; for ( x = 0; x < width; x++ ) { pixels[yi+3] = pa = (a_sum * mul_sum) >> shg_sum; if ( pa !== 0 ) { pa = 255 / pa; pixels[yi] = ((r_sum * mul_sum) >> shg_sum) * pa; pixels[yi+1] = ((g_sum * mul_sum) >> shg_sum) * pa; pixels[yi+2] = ((b_sum * mul_sum) >> shg_sum) * pa; } else { pixels[yi] = pixels[yi+1] = pixels[yi+2] = 0; } r_sum -= r_out_sum; g_sum -= g_out_sum; b_sum -= b_out_sum; a_sum -= a_out_sum; r_out_sum -= stackIn.r; g_out_sum -= stackIn.g; b_out_sum -= stackIn.b; a_out_sum -= stackIn.a; p = ( yw + ( ( p = x + radius + 1 ) < widthMinus1 ? p : widthMinus1 ) ) << 2; r_in_sum += ( stackIn.r = pixels[p]); g_in_sum += ( stackIn.g = pixels[p+1]); b_in_sum += ( stackIn.b = pixels[p+2]); a_in_sum += ( stackIn.a = pixels[p+3]); r_sum += r_in_sum; g_sum += g_in_sum; b_sum += b_in_sum; a_sum += a_in_sum; stackIn = stackIn.next; r_out_sum += ( pr = stackOut.r ); g_out_sum += ( pg = stackOut.g ); b_out_sum += ( pb = stackOut.b ); a_out_sum += ( pa = stackOut.a ); r_in_sum -= pr; g_in_sum -= pg; b_in_sum -= pb; a_in_sum -= pa; stackOut = stackOut.next; yi += 4; } yw += width; } for ( x = 0; x < width; x++ ) { g_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0; yi = x << 2; r_out_sum = radiusPlus1 * ( pr = pixels[yi]); g_out_sum = radiusPlus1 * ( pg = pixels[yi+1]); b_out_sum = radiusPlus1 * ( pb = pixels[yi+2]); a_out_sum = radiusPlus1 * ( pa = pixels[yi+3]); r_sum += sumFactor * pr; g_sum += sumFactor * pg; b_sum += sumFactor * pb; a_sum += sumFactor * pa; stack = stackStart; for( i = 0; i < radiusPlus1; i++ ) { stack.r = pr; stack.g = pg; stack.b = pb; stack.a = pa; stack = stack.next; } yp = width; for( i = 1; i <= radius; i++ ) { yi = ( yp + x ) << 2; r_sum += ( stack.r = ( pr = pixels[yi])) * ( rbs = radiusPlus1 - i ); g_sum += ( stack.g = ( pg = pixels[yi+1])) * rbs; b_sum += ( stack.b = ( pb = pixels[yi+2])) * rbs; a_sum += ( stack.a = ( pa = pixels[yi+3])) * rbs; r_in_sum += pr; g_in_sum += pg; b_in_sum += pb; a_in_sum += pa; stack = stack.next; if( i < heightMinus1 ) { yp += width; } } yi = x; stackIn = stackStart; stackOut = stackEnd; for ( y = 0; y < height; y++ ) { p = yi << 2; pixels[p+3] = pa = (a_sum * mul_sum) >> shg_sum; if ( pa > 0 ) { pa = 255 / pa; pixels[p] = ((r_sum * mul_sum) >> shg_sum ) * pa; pixels[p+1] = ((g_sum * mul_sum) >> shg_sum ) * pa; pixels[p+2] = ((b_sum * mul_sum) >> shg_sum ) * pa; } else { pixels[p] = pixels[p+1] = pixels[p+2] = 0; } r_sum -= r_out_sum; g_sum -= g_out_sum; b_sum -= b_out_sum; a_sum -= a_out_sum; r_out_sum -= stackIn.r; g_out_sum -= stackIn.g; b_out_sum -= stackIn.b; a_out_sum -= stackIn.a; p = ( x + (( ( p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1 ) * width )) << 2; r_sum += ( r_in_sum += ( stackIn.r = pixels[p])); g_sum += ( g_in_sum += ( stackIn.g = pixels[p+1])); b_sum += ( b_in_sum += ( stackIn.b = pixels[p+2])); a_sum += ( a_in_sum += ( stackIn.a = pixels[p+3])); stackIn = stackIn.next; r_out_sum += ( pr = stackOut.r ); g_out_sum += ( pg = stackOut.g ); b_out_sum += ( pb = stackOut.b ); a_out_sum += ( pa = stackOut.a ); r_in_sum -= pr; g_in_sum -= pg; b_in_sum -= pb; a_in_sum -= pa; stackOut = stackOut.next; yi += width; } } } /** * Blur Filter * @function * @memberof Kinetic.Filters * @param {Object} imageData */ Kinetic.Filters.Blur = function(imageData) { var radius = Math.round(this.blurRadius()); if (radius > 0) { filterGaussBlurRGBA(imageData, radius); } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'blurRadius', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set blur radius * @name blurRadius * @method * @memberof Kinetic.Node.prototype * @param {Integer} radius * @returns {Integer} */ })();;(function() { function pixelAt(idata, x, y) { var idx = (y * idata.width + x) * 4; var d = []; d.push(idata.data[idx++], idata.data[idx++], idata.data[idx++], idata.data[idx++]); return d; } function rgbDistance(p1, p2) { return Math.sqrt(Math.pow(p1[0] - p2[0], 2) + Math.pow(p1[1] - p2[1], 2) + Math.pow(p1[2] - p2[2], 2)); } function rgbMean(pTab) { var m = [0, 0, 0]; for (var i = 0; i < pTab.length; i++) { m[0] += pTab[i][0]; m[1] += pTab[i][1]; m[2] += pTab[i][2]; } m[0] /= pTab.length; m[1] /= pTab.length; m[2] /= pTab.length; return m; } function backgroundMask(idata, threshold) { var rgbv_no = pixelAt(idata, 0, 0); var rgbv_ne = pixelAt(idata, idata.width - 1, 0); var rgbv_so = pixelAt(idata, 0, idata.height - 1); var rgbv_se = pixelAt(idata, idata.width - 1, idata.height - 1); var thres = threshold || 10; if (rgbDistance(rgbv_no, rgbv_ne) < thres && rgbDistance(rgbv_ne, rgbv_se) < thres && rgbDistance(rgbv_se, rgbv_so) < thres && rgbDistance(rgbv_so, rgbv_no) < thres) { // Mean color var mean = rgbMean([rgbv_ne, rgbv_no, rgbv_se, rgbv_so]); // Mask based on color distance var mask = []; for (var i = 0; i < idata.width * idata.height; i++) { var d = rgbDistance(mean, [idata.data[i * 4], idata.data[i * 4 + 1], idata.data[i * 4 + 2]]); mask[i] = (d < thres) ? 0 : 255; } return mask; } } function applyMask(idata, mask) { for (var i = 0; i < idata.width * idata.height; i++) { idata.data[4 * i + 3] = mask[i]; } } function erodeMask(mask, sw, sh) { var weights = [1, 1, 1, 1, 0, 1, 1, 1, 1]; var side = Math.round(Math.sqrt(weights.length)); var halfSide = Math.floor(side / 2); var maskResult = []; for (var y = 0; y < sh; y++) { for (var x = 0; x < sw; x++) { var so = y * sw + x; var a = 0; for (var cy = 0; cy < side; cy++) { for (var cx = 0; cx < side; cx++) { var scy = y + cy - halfSide; var scx = x + cx - halfSide; if (scy >= 0 && scy < sh && scx >= 0 && scx < sw) { var srcOff = scy * sw + scx; var wt = weights[cy * side + cx]; a += mask[srcOff] * wt; } } } maskResult[so] = (a === 255 * 8) ? 255 : 0; } } return maskResult; } function dilateMask(mask, sw, sh) { var weights = [1, 1, 1, 1, 1, 1, 1, 1, 1]; var side = Math.round(Math.sqrt(weights.length)); var halfSide = Math.floor(side / 2); var maskResult = []; for (var y = 0; y < sh; y++) { for (var x = 0; x < sw; x++) { var so = y * sw + x; var a = 0; for (var cy = 0; cy < side; cy++) { for (var cx = 0; cx < side; cx++) { var scy = y + cy - halfSide; var scx = x + cx - halfSide; if (scy >= 0 && scy < sh && scx >= 0 && scx < sw) { var srcOff = scy * sw + scx; var wt = weights[cy * side + cx]; a += mask[srcOff] * wt; } } } maskResult[so] = (a >= 255 * 4) ? 255 : 0; } } return maskResult; } function smoothEdgeMask(mask, sw, sh) { var weights = [1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9]; var side = Math.round(Math.sqrt(weights.length)); var halfSide = Math.floor(side / 2); var maskResult = []; for (var y = 0; y < sh; y++) { for (var x = 0; x < sw; x++) { var so = y * sw + x; var a = 0; for (var cy = 0; cy < side; cy++) { for (var cx = 0; cx < side; cx++) { var scy = y + cy - halfSide; var scx = x + cx - halfSide; if (scy >= 0 && scy < sh && scx >= 0 && scx < sw) { var srcOff = scy * sw + scx; var wt = weights[cy * side + cx]; a += mask[srcOff] * wt; } } } maskResult[so] = a; } } return maskResult; } /** * Mask Filter * @function * @memberof Kinetic.Filters * @param {Object} imageData */ Kinetic.Filters.Mask = function(imageData) { // Detect pixels close to the background color var threshold = this.threshold(), mask = backgroundMask(imageData, threshold); if (mask) { // Erode mask = erodeMask(mask, imageData.width, imageData.height); // Dilate mask = dilateMask(mask, imageData.width, imageData.height); // Gradient mask = smoothEdgeMask(mask, imageData.width, imageData.height); // Apply mask applyMask(imageData, mask); // todo : Update hit region function according to mask } return imageData; }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'threshold', 0, null, Kinetic.Factory.afterSetFilter); })(); ;(function () { /** * RGB Filter * @function * @memberof Kinetic.Filters * @param {Object} imageData * @author ippo615 */ Kinetic.Filters.RGB = function (imageData) { var data = imageData.data, nPixels = data.length, red = this.red(), green = this.green(), blue = this.blue(), i, brightness; for (i = 0; i < nPixels; i += 4) { brightness = (0.34 * data[i] + 0.5 * data[i + 1] + 0.16 * data[i + 2])/255; data[i ] = brightness*red; // r data[i + 1] = brightness*green; // g data[i + 2] = brightness*blue; // b data[i + 3] = data[i + 3]; // alpha } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'red', 0, function(val) { this._filterUpToDate = false; if (val > 255) { return 255; } else if (val < 0) { return 0; } else { return Math.round(val); } }); /** * get/set filter red value * @name red * @method * @memberof Kinetic.Node.prototype * @param {Integer} red value between 0 and 255 * @returns {Integer} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'green', 0, function(val) { this._filterUpToDate = false; if (val > 255) { return 255; } else if (val < 0) { return 0; } else { return Math.round(val); } }); /** * get/set filter green value * @name green * @method * @memberof Kinetic.Node.prototype * @param {Integer} green value between 0 and 255 * @returns {Integer} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'blue', 0, Kinetic.Validators.RGBComponent, Kinetic.Factory.afterSetFilter); /** * get/set filter blue value * @name blue * @method * @memberof Kinetic.Node.prototype * @param {Integer} blue value between 0 and 255 * @returns {Integer} */ })(); ;(function () { /** * HSV Filter. Adjusts the hue, saturation and value * @function * @memberof Kinetic.Filters * @param {Object} imageData * @author ippo615 */ Kinetic.Filters.HSV = function (imageData) { var data = imageData.data, nPixels = data.length, v = Math.pow(2,this.value()), s = Math.pow(2,this.saturation()), h = Math.abs((this.hue()) + 360) % 360, i; // Basis for the technique used: // http://beesbuzz.biz/code/hsv_color_transforms.php // V is the value multiplier (1 for none, 2 for double, 0.5 for half) // S is the saturation multiplier (1 for none, 2 for double, 0.5 for half) // H is the hue shift in degrees (0 to 360) // vsu = V*S*cos(H*PI/180); // vsw = V*S*sin(H*PI/180); //[ .299V+.701vsu+.168vsw .587V-.587vsu+.330vsw .114V-.114vsu-.497vsw ] [R] //[ .299V-.299vsu-.328vsw .587V+.413vsu+.035vsw .114V-.114vsu+.292vsw ]*[G] //[ .299V-.300vsu+1.25vsw .587V-.588vsu-1.05vsw .114V+.886vsu-.203vsw ] [B] // Precompute the values in the matrix: var vsu = v*s*Math.cos(h*Math.PI/180), vsw = v*s*Math.sin(h*Math.PI/180); // (result spot)(source spot) var rr = 0.299*v+0.701*vsu+0.167*vsw, rg = 0.587*v-0.587*vsu+0.330*vsw, rb = 0.114*v-0.114*vsu-0.497*vsw; var gr = 0.299*v-0.299*vsu-0.328*vsw, gg = 0.587*v+0.413*vsu+0.035*vsw, gb = 0.114*v-0.114*vsu+0.293*vsw; var br = 0.299*v-0.300*vsu+1.250*vsw, bg = 0.587*v-0.586*vsu-1.050*vsw, bb = 0.114*v+0.886*vsu-0.200*vsw; var r,g,b,a; for (i = 0; i < nPixels; i += 4) { r = data[i+0]; g = data[i+1]; b = data[i+2]; a = data[i+3]; data[i+0] = rr*r + rg*g + rb*b; data[i+1] = gr*r + gg*g + gb*b; data[i+2] = br*r + bg*g + bb*b; data[i+3] = a; // alpha } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'hue', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set hsv hue in degrees * @name hue * @method * @memberof Kinetic.Node.prototype * @param {Number} hue value between 0 and 359 * @returns {Number} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'saturation', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set hsv saturation * @name saturation * @method * @memberof Kinetic.Node.prototype * @param {Number} saturation 0 is no change, -1.0 halves the saturation, 1.0 doubles, etc.. * @returns {Number} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'value', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set hsv value * @name value * @method * @memberof Kinetic.Node.prototype * @param {Number} value 0 is no change, -1.0 halves the value, 1.0 doubles, etc.. * @returns {Number} */ })(); ;(function () { Kinetic.Factory.addGetterSetter(Kinetic.Node, 'hue', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set hsv hue in degrees * @name hue * @method * @memberof Kinetic.Node.prototype * @param {Number} hue value between 0 and 359 * @returns {Number} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'saturation', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set hsv saturation * @name saturation * @method * @memberof Kinetic.Node.prototype * @param {Number} saturation 0 is no change, -1.0 halves the saturation, 1.0 doubles, etc.. * @returns {Number} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'luminance', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set hsl luminance * @name value * @method * @memberof Kinetic.Node.prototype * @param {Number} value 0 is no change, -1.0 halves the value, 1.0 doubles, etc.. * @returns {Number} */ /** * HSL Filter. Adjusts the hue, saturation and luminance (or lightness) * @function * @memberof Kinetic.Filters * @param {Object} imageData * @author ippo615 */ Kinetic.Filters.HSL = function (imageData) { var data = imageData.data, nPixels = data.length, v = 1, s = Math.pow(2,this.saturation()), h = Math.abs((this.hue()) + 360) % 360, l = this.luminance()*127, i; // Basis for the technique used: // http://beesbuzz.biz/code/hsv_color_transforms.php // V is the value multiplier (1 for none, 2 for double, 0.5 for half) // S is the saturation multiplier (1 for none, 2 for double, 0.5 for half) // H is the hue shift in degrees (0 to 360) // vsu = V*S*cos(H*PI/180); // vsw = V*S*sin(H*PI/180); //[ .299V+.701vsu+.168vsw .587V-.587vsu+.330vsw .114V-.114vsu-.497vsw ] [R] //[ .299V-.299vsu-.328vsw .587V+.413vsu+.035vsw .114V-.114vsu+.292vsw ]*[G] //[ .299V-.300vsu+1.25vsw .587V-.588vsu-1.05vsw .114V+.886vsu-.203vsw ] [B] // Precompute the values in the matrix: var vsu = v*s*Math.cos(h*Math.PI/180), vsw = v*s*Math.sin(h*Math.PI/180); // (result spot)(source spot) var rr = 0.299*v+0.701*vsu+0.167*vsw, rg = 0.587*v-0.587*vsu+0.330*vsw, rb = 0.114*v-0.114*vsu-0.497*vsw; var gr = 0.299*v-0.299*vsu-0.328*vsw, gg = 0.587*v+0.413*vsu+0.035*vsw, gb = 0.114*v-0.114*vsu+0.293*vsw; var br = 0.299*v-0.300*vsu+1.250*vsw, bg = 0.587*v-0.586*vsu-1.050*vsw, bb = 0.114*v+0.886*vsu-0.200*vsw; var r,g,b,a; for (i = 0; i < nPixels; i += 4) { r = data[i+0]; g = data[i+1]; b = data[i+2]; a = data[i+3]; data[i+0] = rr*r + rg*g + rb*b + l; data[i+1] = gr*r + gg*g + gb*b + l; data[i+2] = br*r + bg*g + bb*b + l; data[i+3] = a; // alpha } }; })(); ;(function () { /** * Emboss Filter * @function * @memberof Kinetic.Filters * @param {Object} imageData * Pixastic Lib - Emboss filter - v0.1.0 * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ * License: [http://www.pixastic.com/lib/license.txt] */ Kinetic.Filters.Emboss = function (imageData) { // pixastic strength is between 0 and 10. I want it between 0 and 1 // pixastic greyLevel is between 0 and 255. I want it between 0 and 1. Also, // a max value of greyLevel yields a white emboss, and the min value yields a black // emboss. Therefore, I changed greyLevel to whiteLevel var strength = this.embossStrength() * 10, greyLevel = this.embossWhiteLevel() * 255, direction = this.embossDirection(), blend = this.embossBlend(), dirY = 0, dirX = 0, data = imageData.data, w = imageData.width, h = imageData.height, w4 = w*4, y = h; switch (direction) { case 'top-left': dirY = -1; dirX = -1; break; case 'top': dirY = -1; dirX = 0; break; case 'top-right': dirY = -1; dirX = 1; break; case 'right': dirY = 0; dirX = 1; break; case 'bottom-right': dirY = 1; dirX = 1; break; case 'bottom': dirY = 1; dirX = 0; break; case 'bottom-left': dirY = 1; dirX = -1; break; case 'left': dirY = 0; dirX = -1; break; } do { var offsetY = (y-1)*w4; var otherY = dirY; if (y + otherY < 1){ otherY = 0; } if (y + otherY > h) { otherY = 0; } var offsetYOther = (y-1+otherY)*w*4; var x = w; do { var offset = offsetY + (x-1)*4; var otherX = dirX; if (x + otherX < 1){ otherX = 0; } if (x + otherX > w) { otherX = 0; } var offsetOther = offsetYOther + (x-1+otherX)*4; var dR = data[offset] - data[offsetOther]; var dG = data[offset+1] - data[offsetOther+1]; var dB = data[offset+2] - data[offsetOther+2]; var dif = dR; var absDif = dif > 0 ? dif : -dif; var absG = dG > 0 ? dG : -dG; var absB = dB > 0 ? dB : -dB; if (absG > absDif) { dif = dG; } if (absB > absDif) { dif = dB; } dif *= strength; if (blend) { var r = data[offset] + dif; var g = data[offset+1] + dif; var b = data[offset+2] + dif; data[offset] = (r > 255) ? 255 : (r < 0 ? 0 : r); data[offset+1] = (g > 255) ? 255 : (g < 0 ? 0 : g); data[offset+2] = (b > 255) ? 255 : (b < 0 ? 0 : b); } else { var grey = greyLevel - dif; if (grey < 0) { grey = 0; } else if (grey > 255) { grey = 255; } data[offset] = data[offset+1] = data[offset+2] = grey; } } while (--x); } while (--y); }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'embossStrength', 0.5, null, Kinetic.Factory.afterSetFilter); /** * get/set emboss strength * @name embossStrength * @method * @memberof Kinetic.Node.prototype * @param {Number} level between 0 and 1. Default is 0.5 * @returns {Number} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'embossWhiteLevel', 0.5, null, Kinetic.Factory.afterSetFilter); /** * get/set emboss white level * @name embossWhiteLevel * @method * @memberof Kinetic.Node.prototype * @param {Number} embossWhiteLevel between 0 and 1. Default is 0.5 * @returns {Number} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'embossDirection', 'top-left', null, Kinetic.Factory.afterSetFilter); /** * get/set emboss direction * @name embossDirection * @method * @memberof Kinetic.Node.prototype * @param {String} embossDirection can be top-left, top, top-right, right, bottom-right, bottom, bottom-left or left * The default is top-left * @returns {String} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'embossBlend', false, null, Kinetic.Factory.afterSetFilter); /** * get/set emboss blend * @name embossBlend * @method * @memberof Kinetic.Node.prototype * @param {Boolean} embossBlend * @returns {Boolean} */ })(); ;(function () { function remap(fromValue, fromMin, fromMax, toMin, toMax) { // Compute the range of the data var fromRange = fromMax - fromMin, toRange = toMax - toMin, toValue; // If either range is 0, then the value can only be mapped to 1 value if (fromRange === 0) { return toMin + toRange / 2; } if (toRange === 0) { return toMin; } // (1) untranslate, (2) unscale, (3) rescale, (4) retranslate toValue = (fromValue - fromMin) / fromRange; toValue = (toRange * toValue) + toMin; return toValue; } /** * Enhance Filter. Adjusts the colors so that they span the widest * possible range (ie 0-255). Performs w*h pixel reads and w*h pixel * writes. * @function * @memberof Kinetic.Filters * @param {Object} imageData * @author ippo615 */ Kinetic.Filters.Enhance = function (imageData) { var data = imageData.data, nSubPixels = data.length, rMin = data[0], rMax = rMin, r, gMin = data[1], gMax = gMin, g, bMin = data[2], bMax = bMin, b, aMin = data[3], aMax = aMin, i; // If we are not enhancing anything - don't do any computation var enhanceAmount = this.enhance(); if( enhanceAmount === 0 ){ return; } // 1st Pass - find the min and max for each channel: for (i = 0; i < nSubPixels; i += 4) { r = data[i + 0]; if (r < rMin) { rMin = r; } else if (r > rMax) { rMax = r; } g = data[i + 1]; if (g < gMin) { gMin = g; } else if (g > gMax) { gMax = g; } b = data[i + 2]; if (b < bMin) { bMin = b; } else if (b > bMax) { bMax = b; } //a = data[i + 3]; //if (a < aMin) { aMin = a; } else //if (a > aMax) { aMax = a; } } // If there is only 1 level - don't remap if( rMax === rMin ){ rMax = 255; rMin = 0; } if( gMax === gMin ){ gMax = 255; gMin = 0; } if( bMax === bMin ){ bMax = 255; bMin = 0; } if( aMax === aMin ){ aMax = 255; aMin = 0; } var rMid, rGoalMax,rGoalMin, gMid, gGoalMax,gGoalMin, bMid, bGoalMax,aGoalMin, aMid, aGoalMax,bGoalMin; // If the enhancement is positive - stretch the histogram if ( enhanceAmount > 0 ){ rGoalMax = rMax + enhanceAmount*(255-rMax); rGoalMin = rMin - enhanceAmount*(rMin-0); gGoalMax = gMax + enhanceAmount*(255-gMax); gGoalMin = gMin - enhanceAmount*(gMin-0); bGoalMax = bMax + enhanceAmount*(255-bMax); bGoalMin = bMin - enhanceAmount*(bMin-0); aGoalMax = aMax + enhanceAmount*(255-aMax); aGoalMin = aMin - enhanceAmount*(aMin-0); // If the enhancement is negative - compress the histogram } else { rMid = (rMax + rMin)*0.5; rGoalMax = rMax + enhanceAmount*(rMax-rMid); rGoalMin = rMin + enhanceAmount*(rMin-rMid); gMid = (gMax + gMin)*0.5; gGoalMax = gMax + enhanceAmount*(gMax-gMid); gGoalMin = gMin + enhanceAmount*(gMin-gMid); bMid = (bMax + bMin)*0.5; bGoalMax = bMax + enhanceAmount*(bMax-bMid); bGoalMin = bMin + enhanceAmount*(bMin-bMid); aMid = (aMax + aMin)*0.5; aGoalMax = aMax + enhanceAmount*(aMax-aMid); aGoalMin = aMin + enhanceAmount*(aMin-aMid); } // Pass 2 - remap everything, except the alpha for (i = 0; i < nSubPixels; i += 4) { data[i + 0] = remap(data[i + 0], rMin, rMax, rGoalMin, rGoalMax); data[i + 1] = remap(data[i + 1], gMin, gMax, gGoalMin, gGoalMax); data[i + 2] = remap(data[i + 2], bMin, bMax, bGoalMin, bGoalMax); //data[i + 3] = remap(data[i + 3], aMin, aMax, aGoalMin, aGoalMax); } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'enhance', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set enhance * @name enhance * @method * @memberof Kinetic.Node.prototype * @param {Float} amount * @returns {Float} */ })(); ;(function () { /** * Posterize Filter. Adjusts the channels so that there are no more * than n different values for that channel. This is also applied * to the alpha channel. * @function * @author ippo615 * @memberof Kinetic.Filters * @param {Object} imageData */ Kinetic.Filters.Posterize = function (imageData) { // level must be between 1 and 255 var levels = Math.round(this.levels() * 254) + 1, data = imageData.data, len = data.length, scale = (255 / levels), i; for (i = 0; i < len; i += 1) { data[i] = Math.floor(data[i] / scale) * scale; } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'levels', 0.5, null, Kinetic.Factory.afterSetFilter); /** * get/set levels. Must be a number between 0 and 1 * @name levels * @method * @memberof Kinetic.Node.prototype * @param {Number} level between 0 and 1 * @returns {Number} */ })();;(function () { /** * Noise Filter. Randomly adds or substracts to the color channels * @function * @memberof Kinetic.Filters * @param {Object} imagedata * @author ippo615 */ Kinetic.Filters.Noise = function (imageData) { var amount = this.noise() * 255, data = imageData.data, nPixels = data.length, half = amount / 2, i; for (i = 0; i < nPixels; i += 4) { data[i + 0] += half - 2 * half * Math.random(); data[i + 1] += half - 2 * half * Math.random(); data[i + 2] += half - 2 * half * Math.random(); } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'noise', 0.2, null, Kinetic.Factory.afterSetFilter); /** * get/set noise amount. Must be a value between 0 and 1 * @name noise * @method * @memberof Kinetic.Node.prototype * @param {Number} noise * @returns {Number} */ })(); ;(function () { /** * Pixelate Filter. Averages groups of pixels and redraws * them as larger pixels * @function * @memberof Kinetic.Filters * @param {Object} imageData * @author ippo615 */ Kinetic.Filters.Pixelate = function (imageData) { var pixelSize = Math.ceil(this.pixelSize()), width = imageData.width, height = imageData.height, x, y, i, //pixelsPerBin = pixelSize * pixelSize, red, green, blue, alpha, nBinsX = Math.ceil(width / pixelSize), nBinsY = Math.ceil(height / pixelSize), xBinStart, xBinEnd, yBinStart, yBinEnd, xBin, yBin, pixelsInBin; imageData = imageData.data; for (xBin = 0; xBin < nBinsX; xBin += 1) { for (yBin = 0; yBin < nBinsY; yBin += 1) { // Initialize the color accumlators to 0 red = 0; green = 0; blue = 0; alpha = 0; // Determine which pixels are included in this bin xBinStart = xBin * pixelSize; xBinEnd = xBinStart + pixelSize; yBinStart = yBin * pixelSize; yBinEnd = yBinStart + pixelSize; // Add all of the pixels to this bin! pixelsInBin = 0; for (x = xBinStart; x < xBinEnd; x += 1) { if( x >= width ){ continue; } for (y = yBinStart; y < yBinEnd; y += 1) { if( y >= height ){ continue; } i = (width * y + x) * 4; red += imageData[i + 0]; green += imageData[i + 1]; blue += imageData[i + 2]; alpha += imageData[i + 3]; pixelsInBin += 1; } } // Make sure the channels are between 0-255 red = red / pixelsInBin; green = green / pixelsInBin; blue = blue / pixelsInBin; // Draw this bin for (x = xBinStart; x < xBinEnd; x += 1) { if( x >= width ){ continue; } for (y = yBinStart; y < yBinEnd; y += 1) { if( y >= height ){ continue; } i = (width * y + x) * 4; imageData[i + 0] = red; imageData[i + 1] = green; imageData[i + 2] = blue; imageData[i + 3] = alpha; } } } } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'pixelSize', 8, null, Kinetic.Factory.afterSetFilter); /** * get/set pixel size * @name pixelSize * @method * @memberof Kinetic.Node.prototype * @param {Integer} pixelSize * @returns {Integer} */ })();;(function () { /** * Threshold Filter. Pushes any value above the mid point to * the max and any value below the mid point to the min. * This affects the alpha channel. * @function * @memberof Kinetic.Filters * @param {Object} imageData * @author ippo615 */ Kinetic.Filters.Threshold = function (imageData) { var level = this.threshold() * 255, data = imageData.data, len = data.length, i; for (i = 0; i < len; i += 1) { data[i] = data[i] < level ? 0 : 255; } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'threshold', 0.5, null, Kinetic.Factory.afterSetFilter); /** * get/set threshold. Must be a value between 0 and 1 * @name threshold * @method * @memberof Kinetic.Node.prototype * @param {Number} threshold * @returns {Number} */ })();;(function() { /** * Sepia Filter * Based on: Pixastic Lib - Sepia filter - v0.1.0 * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ * @function * @memberof Kinetic.Filters * @param {Object} imageData * @author Jacob Seidelin * @license MPL v1.1 [http://www.pixastic.com/lib/license.txt] */ Kinetic.Filters.Sepia = function (imageData) { var data = imageData.data, w = imageData.width, y = imageData.height, w4 = w*4, offsetY, x, offset, or, og, ob, r, g, b; do { offsetY = (y-1)*w4; x = w; do { offset = offsetY + (x-1)*4; or = data[offset]; og = data[offset+1]; ob = data[offset+2]; r = or * 0.393 + og * 0.769 + ob * 0.189; g = or * 0.349 + og * 0.686 + ob * 0.168; b = or * 0.272 + og * 0.534 + ob * 0.131; data[offset] = r > 255 ? 255 : r; data[offset+1] = g > 255 ? 255 : g; data[offset+2] = b > 255 ? 255 : b; data[offset+3] = data[offset+3]; } while (--x); } while (--y); }; })(); ;(function () { /** * Solarize Filter * @function * @memberof Kinetic.Filters * @param {Object} imageData * Pixastic Lib - Solarize filter - v0.1.0 * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ * License: [http://www.pixastic.com/lib/license.txt] */ Kinetic.Filters.Solarize = function (imageData) { var data = imageData.data, w = imageData.width, h = imageData.height, w4 = w*4, y = h; do { var offsetY = (y-1)*w4; var x = w; do { var offset = offsetY + (x-1)*4; var r = data[offset]; var g = data[offset+1]; var b = data[offset+2]; if (r > 127) { r = 255 - r; } if (g > 127) { g = 255 - g; } if (b > 127) { b = 255 - b; } data[offset] = r; data[offset+1] = g; data[offset+2] = b; } while (--x); } while (--y); }; })(); ;/*jshint newcap:false */ (function () { /* * ToPolar Filter. Converts image data to polar coordinates. Performs * w*h*4 pixel reads and w*h pixel writes. The r axis is placed along * what would be the y axis and the theta axis along the x axis. * @function * @author ippo615 * @memberof Kinetic.Filters * @param {ImageData} src, the source image data (what will be transformed) * @param {ImageData} dst, the destination image data (where it will be saved) * @param {Object} opt * @param {Number} [opt.polarCenterX] horizontal location for the center of the circle, * default is in the middle * @param {Number} [opt.polarCenterY] vertical location for the center of the circle, * default is in the middle */ var ToPolar = function(src,dst,opt){ var srcPixels = src.data, dstPixels = dst.data, xSize = src.width, ySize = src.height, xMid = opt.polarCenterX || xSize/2, yMid = opt.polarCenterY || ySize/2, i, x, y, r=0,g=0,b=0,a=0; // Find the largest radius var rad, rMax = Math.sqrt( xMid*xMid + yMid*yMid ); x = xSize - xMid; y = ySize - yMid; rad = Math.sqrt( x*x + y*y ); rMax = (rad > rMax)?rad:rMax; // We'll be uisng y as the radius, and x as the angle (theta=t) var rSize = ySize, tSize = xSize, radius, theta; // We want to cover all angles (0-360) and we need to convert to // radians (*PI/180) var conversion = 360/tSize*Math.PI/180, sin, cos; // var x1, x2, x1i, x2i, y1, y2, y1i, y2i, scale; for( theta=0; theta rMax)?rad:rMax; // We'll be uisng x as the radius, and y as the angle (theta=t) var rSize = ySize, tSize = xSize, radius, theta, phaseShift = opt.polarRotation || 0; // We need to convert to degrees and we need to make sure // it's between (0-360) // var conversion = tSize/360*180/Math.PI; //var conversion = tSize/360*180/Math.PI; var x1, y1; for( x=0; x xSize ){ xStart = sectionSize; xEnd = 0; xDelta = -1; } for( y=0; y * var velocity = 50;

* * var anim = new Kinetic.Animation(function(frame) {
* var dist = velocity * (frame.timeDiff / 1000);
* node.move(dist, 0);
* }, layer);

* * anim.start(); */ Kinetic.Animation = function(func, layers) { var Anim = Kinetic.Animation; this.func = func; this.setLayers(layers); this.id = Anim.animIdCounter++; this.frame = { time: 0, timeDiff: 0, lastTime: now() }; }; /* * Animation methods */ Kinetic.Animation.prototype = { /** * set layers to be redrawn on each animation frame * @method * @memberof Kinetic.Animation.prototype * @param {Kinetic.Layer|Array} [layers] layer(s) to be redrawn.  Can be a layer, an array of layers, or null. Not specifying a node will result in no redraw. */ setLayers: function(layers) { var lays = []; // if passing in no layers if (!layers) { lays = []; } // if passing in an array of Layers // NOTE: layers could be an array or Kinetic.Collection. for simplicity, I'm just inspecting // the length property to check for both cases else if (layers.length > 0) { lays = layers; } // if passing in a Layer else { lays = [layers]; } this.layers = lays; }, /** * get layers * @method * @memberof Kinetic.Animation.prototype */ getLayers: function() { return this.layers; }, /** * add layer. Returns true if the layer was added, and false if it was not * @method * @memberof Kinetic.Animation.prototype * @param {Kinetic.Layer} layer */ addLayer: function(layer) { var layers = this.layers, len, n; if (layers) { len = layers.length; // don't add the layer if it already exists for (n = 0; n < len; n++) { if (layers[n]._id === layer._id) { return false; } } } else { this.layers = []; } this.layers.push(layer); return true; }, /** * determine if animation is running or not. returns true or false * @method * @memberof Kinetic.Animation.prototype */ isRunning: function() { var a = Kinetic.Animation, animations = a.animations, len = animations.length, n; for(n = 0; n < len; n++) { if(animations[n].id === this.id) { return true; } } return false; }, /** * start animation * @method * @memberof Kinetic.Animation.prototype */ start: function() { var Anim = Kinetic.Animation; this.stop(); this.frame.timeDiff = 0; this.frame.lastTime = now(); Anim._addAnimation(this); }, /** * stop animation * @method * @memberof Kinetic.Animation.prototype */ stop: function() { Kinetic.Animation._removeAnimation(this); }, _updateFrameObject: function(time) { this.frame.timeDiff = time - this.frame.lastTime; this.frame.lastTime = time; this.frame.time += this.frame.timeDiff; this.frame.frameRate = 1000 / this.frame.timeDiff; } }; Kinetic.Animation.animations = []; Kinetic.Animation.animIdCounter = 0; Kinetic.Animation.animRunning = false; Kinetic.Animation._addAnimation = function(anim) { this.animations.push(anim); this._handleAnimation(); }; Kinetic.Animation._removeAnimation = function(anim) { var id = anim.id, animations = this.animations, len = animations.length, n; for(n = 0; n < len; n++) { if(animations[n].id === id) { this.animations.splice(n, 1); break; } } }; Kinetic.Animation._runFrames = function() { var layerHash = {}, animations = this.animations, anim, layers, func, n, i, layersLen, layer, key; /* * loop through all animations and execute animation * function. if the animation object has specified node, * we can add the node to the nodes hash to eliminate * drawing the same node multiple times. The node property * can be the stage itself or a layer */ /* * WARNING: don't cache animations.length because it could change while * the for loop is running, causing a JS error */ for(n = 0; n < animations.length; n++) { anim = animations[n]; layers = anim.layers; func = anim.func; anim._updateFrameObject(now()); layersLen = layers.length; for (i=0; i BATCH_DRAW_STOP_TIME_DIFF) { that.batchAnim.stop(); } }, this); } this.lastBatchDrawTime = now(); if (!this.batchAnim.isRunning()) { this.draw(); this.batchAnim.start(); } }; /** * batch draw * @method * @memberof Kinetic.Stage.prototype */ Kinetic.Stage.prototype.batchDraw = function() { this.getChildren().each(function(layer) { layer.batchDraw(); }); }; })((1,eval)('this'));;(function() { var blacklist = { node: 1, duration: 1, easing: 1, onFinish: 1, yoyo: 1 }, PAUSED = 1, PLAYING = 2, REVERSING = 3, idCounter = 0; /** * Tween constructor. Tweens enable you to animate a node between the current state and a new state. * You can play, pause, reverse, seek, reset, and finish tweens. By default, tweens are animated using * a linear easing. For more tweening options, check out {@link Kinetic.Easings} * @constructor * @memberof Kinetic * @example * // instantiate new tween which fully rotates a node in 1 second * var tween = new Kinetic.Tween({
* node: node,
* rotationDeg: 360,
* duration: 1,
* easing: Kinetic.Easings.EaseInOut
* });

* * // play tween
* tween.play();

* * // pause tween
* tween.pause(); */ Kinetic.Tween = function(config) { var that = this, node = config.node, nodeId = node._id, duration = config.duration || 1, easing = config.easing || Kinetic.Easings.Linear, yoyo = !!config.yoyo, key; this.node = node; this._id = idCounter++; this.anim = new Kinetic.Animation(function() { that.tween.onEnterFrame(); }, node.getLayer()); this.tween = new Tween(key, function(i) { that._tweenFunc(i); }, easing, 0, 1, duration * 1000, yoyo); this._addListeners(); // init attrs map if (!Kinetic.Tween.attrs[nodeId]) { Kinetic.Tween.attrs[nodeId] = {}; } if (!Kinetic.Tween.attrs[nodeId][this._id]) { Kinetic.Tween.attrs[nodeId][this._id] = {}; } // init tweens map if (!Kinetic.Tween.tweens[nodeId]) { Kinetic.Tween.tweens[nodeId] = {}; } for (key in config) { if (blacklist[key] === undefined) { this._addAttr(key, config[key]); } } this.reset(); // callbacks this.onFinish = config.onFinish; this.onReset = config.onReset; }; // start/diff object = attrs.nodeId.tweenId.attr Kinetic.Tween.attrs = {}; // tweenId = tweens.nodeId.attr Kinetic.Tween.tweens = {}; Kinetic.Tween.prototype = { _addAttr: function(key, end) { var node = this.node, nodeId = node._id, start, diff, tweenId, n, len; // remove conflict from tween map if it exists tweenId = Kinetic.Tween.tweens[nodeId][key]; if (tweenId) { delete Kinetic.Tween.attrs[nodeId][tweenId][key]; } // add to tween map start = node.getAttr(key); if (Kinetic.Util._isArray(end)) { diff = []; len = end.length; for (n=0; n this.duration) { if(this.yoyo) { this._time = this.duration; this.reverse(); } else { this.finish(); } } else if(t < 0) { if(this.yoyo) { this._time = 0; this.play(); } else { this.reset(); } } else { this._time = t; this.update(); } }, getTime: function() { return this._time; }, setPosition: function(p) { this.prevPos = this._pos; this.propFunc(p); this._pos = p; }, getPosition: function(t) { if(t === undefined) { t = this._time; } return this.func(t, this.begin, this._change, this.duration); }, play: function() { this.state = PLAYING; this._startTime = this.getTimer() - this._time; this.onEnterFrame(); this.fire('onPlay'); }, reverse: function() { this.state = REVERSING; this._time = this.duration - this._time; this._startTime = this.getTimer() - this._time; this.onEnterFrame(); this.fire('onReverse'); }, seek: function(t) { this.pause(); this._time = t; this.update(); this.fire('onSeek'); }, reset: function() { this.pause(); this._time = 0; this.update(); this.fire('onReset'); }, finish: function() { this.pause(); this._time = this.duration; this.update(); this.fire('onFinish'); }, update: function() { this.setPosition(this.getPosition(this._time)); }, onEnterFrame: function() { var t = this.getTimer() - this._startTime; if(this.state === PLAYING) { this.setTime(t); } else if (this.state === REVERSING) { this.setTime(this.duration - t); } }, pause: function() { this.state = PAUSED; this.fire('onPause'); }, getTimer: function() { return new Date().getTime(); } }; /* * These eases were ported from an Adobe Flash tweening library to JavaScript * by Xaric */ /** * @namespace Easings * @memberof Kinetic */ Kinetic.Easings = { /** * back ease in * @function * @memberof Kinetic.Easings */ 'BackEaseIn': function(t, b, c, d) { var s = 1.70158; return c * (t /= d) * t * ((s + 1) * t - s) + b; }, /** * back ease out * @function * @memberof Kinetic.Easings */ 'BackEaseOut': function(t, b, c, d) { var s = 1.70158; return c * (( t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; }, /** * back ease in out * @function * @memberof Kinetic.Easings */ 'BackEaseInOut': function(t, b, c, d) { var s = 1.70158; if((t /= d / 2) < 1) { return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b; } return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; }, /** * elastic ease in * @function * @memberof Kinetic.Easings */ 'ElasticEaseIn': function(t, b, c, d, a, p) { // added s = 0 var s = 0; if(t === 0) { return b; } if((t /= d) == 1) { return b + c; } if(!p) { p = d * 0.3; } if(!a || a < Math.abs(c)) { a = c; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(c / a); } return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; }, /** * elastic ease out * @function * @memberof Kinetic.Easings */ 'ElasticEaseOut': function(t, b, c, d, a, p) { // added s = 0 var s = 0; if(t === 0) { return b; } if((t /= d) == 1) { return b + c; } if(!p) { p = d * 0.3; } if(!a || a < Math.abs(c)) { a = c; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(c / a); } return (a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b); }, /** * elastic ease in out * @function * @memberof Kinetic.Easings */ 'ElasticEaseInOut': function(t, b, c, d, a, p) { // added s = 0 var s = 0; if(t === 0) { return b; } if((t /= d / 2) == 2) { return b + c; } if(!p) { p = d * (0.3 * 1.5); } if(!a || a < Math.abs(c)) { a = c; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(c / a); } if(t < 1) { return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; } return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b; }, /** * bounce ease out * @function * @memberof Kinetic.Easings */ 'BounceEaseOut': function(t, b, c, d) { if((t /= d) < (1 / 2.75)) { return c * (7.5625 * t * t) + b; } else if(t < (2 / 2.75)) { return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b; } else if(t < (2.5 / 2.75)) { return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b; } else { return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b; } }, /** * bounce ease in * @function * @memberof Kinetic.Easings */ 'BounceEaseIn': function(t, b, c, d) { return c - Kinetic.Easings.BounceEaseOut(d - t, 0, c, d) + b; }, /** * bounce ease in out * @function * @memberof Kinetic.Easings */ 'BounceEaseInOut': function(t, b, c, d) { if(t < d / 2) { return Kinetic.Easings.BounceEaseIn(t * 2, 0, c, d) * 0.5 + b; } else { return Kinetic.Easings.BounceEaseOut(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b; } }, /** * ease in * @function * @memberof Kinetic.Easings */ 'EaseIn': function(t, b, c, d) { return c * (t /= d) * t + b; }, /** * ease out * @function * @memberof Kinetic.Easings */ 'EaseOut': function(t, b, c, d) { return -c * (t /= d) * (t - 2) + b; }, /** * ease in out * @function * @memberof Kinetic.Easings */ 'EaseInOut': function(t, b, c, d) { if((t /= d / 2) < 1) { return c / 2 * t * t + b; } return -c / 2 * ((--t) * (t - 2) - 1) + b; }, /** * strong ease in * @function * @memberof Kinetic.Easings */ 'StrongEaseIn': function(t, b, c, d) { return c * (t /= d) * t * t * t * t + b; }, /** * strong ease out * @function * @memberof Kinetic.Easings */ 'StrongEaseOut': function(t, b, c, d) { return c * (( t = t / d - 1) * t * t * t * t + 1) + b; }, /** * strong ease in out * @function * @memberof Kinetic.Easings */ 'StrongEaseInOut': function(t, b, c, d) { if((t /= d / 2) < 1) { return c / 2 * t * t * t * t * t + b; } return c / 2 * ((t -= 2) * t * t * t * t + 2) + b; }, /** * linear * @function * @memberof Kinetic.Easings */ 'Linear': function(t, b, c, d) { return c * t / d + b; } }; })(); ;(function() { Kinetic.DD = { // properties anim: new Kinetic.Animation(), isDragging: false, offset: { x: 0, y: 0 }, node: null, // methods _drag: function(evt) { var dd = Kinetic.DD, node = dd.node; if(node) { if(!dd.isDragging) { var pos = node.getStage().getPointerPosition(); var dragDistance = node.dragDistance(); var distance = Math.max( Math.abs(pos.x - dd.startPointerPos.x), Math.abs(pos.y - dd.startPointerPos.y) ); if (distance < dragDistance) { return; } } node._setDragPosition(evt); if(!dd.isDragging) { dd.isDragging = true; node.fire('dragstart', { type : 'dragstart', target : node, evt : evt }, true); } // execute ondragmove if defined node.fire('dragmove', { type : 'dragmove', target : node, evt : evt }, true); } }, _endDragBefore: function(evt) { var dd = Kinetic.DD, node = dd.node, nodeType, layer; if(node) { nodeType = node.nodeType; layer = node.getLayer(); dd.anim.stop(); // only fire dragend event if the drag and drop // operation actually started. if(dd.isDragging) { dd.isDragging = false; Kinetic.listenClickTap = false; if (evt) { evt.dragEndNode = node; } } delete dd.node; (layer || node).draw(); } }, _endDragAfter: function(evt) { evt = evt || {}; var dragEndNode = evt.dragEndNode; if (evt && dragEndNode) { dragEndNode.fire('dragend', { type : 'dragend', target : dragEndNode, evt : evt }, true); } } }; // Node extenders /** * initiate drag and drop * @method * @memberof Kinetic.Node.prototype */ Kinetic.Node.prototype.startDrag = function() { var dd = Kinetic.DD, stage = this.getStage(), layer = this.getLayer(), pos = stage.getPointerPosition(), ap = this.getAbsolutePosition(); if(pos) { if (dd.node) { dd.node.stopDrag(); } dd.node = this; dd.startPointerPos = pos; dd.offset.x = pos.x - ap.x; dd.offset.y = pos.y - ap.y; dd.anim.setLayers(layer || this.getLayers()); dd.anim.start(); this._setDragPosition(); } }; Kinetic.Node.prototype._setDragPosition = function(evt) { var dd = Kinetic.DD, pos = this.getStage().getPointerPosition(), dbf = this.getDragBoundFunc(); if (!pos) { return; } var newNodePos = { x: pos.x - dd.offset.x, y: pos.y - dd.offset.y }; if(dbf !== undefined) { newNodePos = dbf.call(this, newNodePos, evt); } this.setAbsolutePosition(newNodePos); }; /** * stop drag and drop * @method * @memberof Kinetic.Node.prototype */ Kinetic.Node.prototype.stopDrag = function() { var dd = Kinetic.DD, evt = {}; dd._endDragBefore(evt); dd._endDragAfter(evt); }; Kinetic.Node.prototype.setDraggable = function(draggable) { this._setAttr('draggable', draggable); this._dragChange(); }; var origDestroy = Kinetic.Node.prototype.destroy; Kinetic.Node.prototype.destroy = function() { var dd = Kinetic.DD; // stop DD if(dd.node && dd.node._id === this._id) { this.stopDrag(); } origDestroy.call(this); }; /** * determine if node is currently in drag and drop mode * @method * @memberof Kinetic.Node.prototype */ Kinetic.Node.prototype.isDragging = function() { var dd = Kinetic.DD; return dd.node && dd.node._id === this._id && dd.isDragging; }; Kinetic.Node.prototype._listenDrag = function() { var that = this; this._dragCleanup(); if (this.getClassName() === 'Stage') { this.on('contentMousedown.kinetic contentTouchstart.kinetic', function(evt) { if(!Kinetic.DD.node) { that.startDrag(evt); } }); } else { this.on('mousedown.kinetic touchstart.kinetic', function(evt) { if(!Kinetic.DD.node) { that.startDrag(evt); } }); } // listening is required for drag and drop /* this._listeningEnabled = true; this._clearSelfAndAncestorCache('listeningEnabled'); */ }; Kinetic.Node.prototype._dragChange = function() { if(this.attrs.draggable) { this._listenDrag(); } else { // remove event listeners this._dragCleanup(); /* * force drag and drop to end * if this node is currently in * drag and drop mode */ var stage = this.getStage(); var dd = Kinetic.DD; if(stage && dd.node && dd.node._id === this._id) { dd.node.stopDrag(); } } }; Kinetic.Node.prototype._dragCleanup = function() { if (this.getClassName() === 'Stage') { this.off('contentMousedown.kinetic'); this.off('contentTouchstart.kinetic'); } else { this.off('mousedown.kinetic'); this.off('touchstart.kinetic'); } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'dragBoundFunc'); /** * get/set drag bound function. This is used to override the default * drag and drop position * @name dragBoundFunc * @method * @memberof Kinetic.Node.prototype * @param {Function} dragBoundFunc * @returns {Function} * @example * // get drag bound function
* var dragBoundFunc = node.dragBoundFunc();

* * // create vertical drag and drop
* node.dragBoundFunc(function(){
* return {
* x: this.getAbsolutePosition().x,
* y: pos.y
* };
* }); */ Kinetic.Factory.addGetter(Kinetic.Node, 'draggable', false); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'draggable'); /** * get/set draggable flag * @name draggable * @method * @memberof Kinetic.Node.prototype * @param {Boolean} draggable * @returns {Boolean} * @example * // get draggable flag
* var draggable = node.draggable();

* * // enable drag and drop
* node.draggable(true);

* * // disable drag and drop
* node.draggable(false); */ var html = Kinetic.document.documentElement; html.addEventListener('mouseup', Kinetic.DD._endDragBefore, true); html.addEventListener('touchend', Kinetic.DD._endDragBefore, true); html.addEventListener('mouseup', Kinetic.DD._endDragAfter, false); html.addEventListener('touchend', Kinetic.DD._endDragAfter, false); })(); ;(function() { Kinetic.Util.addMethods(Kinetic.Container, { __init: function(config) { this.children = new Kinetic.Collection(); Kinetic.Node.call(this, config); }, /** * returns a {@link Kinetic.Collection} of direct descendant nodes * @method * @memberof Kinetic.Container.prototype * @param {Function} [filterFunc] filter function * @returns {Kinetic.Collection} * @example * // get all children
* var children = layer.getChildren();

* * // get only circles
* var circles = layer.getChildren(function(node){
* return node.getClassName() === 'Circle';
* }); */ getChildren: function(predicate) { if (!predicate) { return this.children; } else { var results = new Kinetic.Collection(); this.children.each(function(child){ if (predicate(child)) { results.push(child); } }); return results; } }, /** * determine if node has children * @method * @memberof Kinetic.Container.prototype * @returns {Boolean} */ hasChildren: function() { return this.getChildren().length > 0; }, /** * remove all children * @method * @memberof Kinetic.Container.prototype */ removeChildren: function() { var children = Kinetic.Collection.toCollection(this.children); var child; for (var i = 0; i < children.length; i++) { child = children[i]; // reset parent to prevent many _setChildrenIndices calls delete child.parent; child.index = 0; if (child.hasChildren()) { child.removeChildren(); } child.remove(); } children = null; this.children = new Kinetic.Collection(); return this; }, /** * destroy all children * @method * @memberof Kinetic.Container.prototype */ destroyChildren: function() { var children = Kinetic.Collection.toCollection(this.children); var child; for (var i = 0; i < children.length; i++) { child = children[i]; // reset parent to prevent many _setChildrenIndices calls delete child.parent; child.index = 0; child.destroy(); } children = null; this.children = new Kinetic.Collection(); return this; }, /** * Add node or nodes to container. * @method * @memberof Kinetic.Container.prototype * @param {...Kinetic.Node} child * @returns {Container} * @example * layer.add(shape1, shape2, shape3); */ add: function(child) { if (arguments.length > 1) { for (var i = 0; i < arguments.length; i++) { this.add(arguments[i]); } return; } if (child.getParent()) { child.moveTo(this); return; } var children = this.children; this._validateAdd(child); child.index = children.length; child.parent = this; children.push(child); this._fire('add', { child: child }); // chainable return this; }, destroy: function() { // destroy children if (this.hasChildren()) { this.destroyChildren(); } // then destroy self Kinetic.Node.prototype.destroy.call(this); }, /** * return a {@link Kinetic.Collection} of nodes that match the selector. Use '#' for id selections * and '.' for name selections. You can also select by type or class name. Pass multiple selectors * separated by a space. * @method * @memberof Kinetic.Container.prototype * @param {String} selector * @returns {Collection} * @example * // select node with id foo
* var node = stage.find('#foo');

* * // select nodes with name bar inside layer
* var nodes = layer.find('.bar');

* * // select all groups inside layer
* var nodes = layer.find('Group');

* * // select all rectangles inside layer
* var nodes = layer.find('Rect');

* * // select node with an id of foo or a name of bar inside layer
* var nodes = layer.find('#foo, .bar'); */ find: function(selector) { var retArr = [], selectorArr = selector.replace(/ /g, '').split(','), len = selectorArr.length, n, i, sel, arr, node, children, clen; for (n = 0; n < len; n++) { sel = selectorArr[n]; // id selector if(sel.charAt(0) === '#') { node = this._getNodeById(sel.slice(1)); if(node) { retArr.push(node); } } // name selector else if(sel.charAt(0) === '.') { arr = this._getNodesByName(sel.slice(1)); retArr = retArr.concat(arr); } // unrecognized selector, pass to children else { children = this.getChildren(); clen = children.length; for(i = 0; i < clen; i++) { retArr = retArr.concat(children[i]._get(sel)); } } } return Kinetic.Collection.toCollection(retArr); }, _getNodeById: function(key) { var node = Kinetic.ids[key]; if(node !== undefined && this.isAncestorOf(node)) { return node; } return null; }, _getNodesByName: function(key) { var arr = Kinetic.names[key] || []; return this._getDescendants(arr); }, _get: function(selector) { var retArr = Kinetic.Node.prototype._get.call(this, selector); var children = this.getChildren(); var len = children.length; for(var n = 0; n < len; n++) { retArr = retArr.concat(children[n]._get(selector)); } return retArr; }, // extenders toObject: function() { var obj = Kinetic.Node.prototype.toObject.call(this); obj.children = []; var children = this.getChildren(); var len = children.length; for(var n = 0; n < len; n++) { var child = children[n]; obj.children.push(child.toObject()); } return obj; }, _getDescendants: function(arr) { var retArr = []; var len = arr.length; for(var n = 0; n < len; n++) { var node = arr[n]; if(this.isAncestorOf(node)) { retArr.push(node); } } return retArr; }, /** * determine if node is an ancestor * of descendant * @method * @memberof Kinetic.Container.prototype * @param {Kinetic.Node} node */ isAncestorOf: function(node) { var parent = node.getParent(); while(parent) { if(parent._id === this._id) { return true; } parent = parent.getParent(); } return false; }, clone: function(obj) { // call super method var node = Kinetic.Node.prototype.clone.call(this, obj); this.getChildren().each(function(no) { node.add(no.clone()); }); return node; }, /** * get all shapes that intersect a point. Note: because this method must clear a temporary * canvas and redraw every shape inside the container, it should only be used for special sitations * because it performs very poorly. Please use the {@link Kinetic.Stage#getIntersection} method if at all possible * because it performs much better * @method * @memberof Kinetic.Container.prototype * @param {Object} pos * @param {Number} pos.x * @param {Number} pos.y * @returns {Array} array of shapes */ getAllIntersections: function(pos) { var arr = []; this.find('Shape').each(function(shape) { if(shape.isVisible() && shape.intersects(pos)) { arr.push(shape); } }); return arr; }, _setChildrenIndices: function() { this.children.each(function(child, n) { child.index = n; }); }, drawScene: function(can, top) { var layer = this.getLayer(), canvas = can || (layer && layer.getCanvas()), context = canvas && canvas.getContext(), cachedCanvas = this._cache.canvas, cachedSceneCanvas = cachedCanvas && cachedCanvas.scene; if (this.isVisible()) { if (cachedSceneCanvas) { this._drawCachedSceneCanvas(context); } else { this._drawChildren(canvas, 'drawScene', top); } } return this; }, drawHit: function(can, top) { var layer = this.getLayer(), canvas = can || (layer && layer.hitCanvas), context = canvas && canvas.getContext(), cachedCanvas = this._cache.canvas, cachedHitCanvas = cachedCanvas && cachedCanvas.hit; if (this.shouldDrawHit()) { if (cachedHitCanvas) { this._drawCachedHitCanvas(context); } else { this._drawChildren(canvas, 'drawHit', top); } } return this; }, _drawChildren: function(canvas, drawMethod, top) { var layer = this.getLayer(), context = canvas && canvas.getContext(), clipWidth = this.getClipWidth(), clipHeight = this.getClipHeight(), hasClip = clipWidth && clipHeight, clipX, clipY; if (hasClip && layer) { clipX = this.getClipX(); clipY = this.getClipY(); context.save(); layer._applyTransform(this, context); context.beginPath(); context.rect(clipX, clipY, clipWidth, clipHeight); context.clip(); context.reset(); } this.children.each(function(child) { child[drawMethod](canvas, top); }); if (hasClip) { context.restore(); } } }); Kinetic.Util.extend(Kinetic.Container, Kinetic.Node); // deprecated methods Kinetic.Container.prototype.get = Kinetic.Container.prototype.find; // add getters setters Kinetic.Factory.addComponentsGetterSetter(Kinetic.Container, 'clip', ['x', 'y', 'width', 'height']); /** * get/set clip * @method * @name clip * @memberof Kinetic.Container.prototype * @param {Object} clip * @param {Number} clip.x * @param {Number} clip.y * @param {Number} clip.width * @param {Number} clip.height * @returns {Object} * @example * // get clip
* var clip = container.clip();

* * // set clip
* container.setClip({
* x: 20,
* y: 20,
* width: 20,
* height: 20
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Container, 'clipX'); /** * get/set clip x * @name clipX * @method * @memberof Kinetic.Container.prototype * @param {Number} x * @returns {Number} * @example * // get clip x
* var clipX = container.clipX();

* * // set clip x
* container.clipX(10); */ Kinetic.Factory.addGetterSetter(Kinetic.Container, 'clipY'); /** * get/set clip y * @name clipY * @method * @memberof Kinetic.Container.prototype * @param {Number} y * @returns {Number} * @example * // get clip y
* var clipY = container.clipY();

* * // set clip y
* container.clipY(10); */ Kinetic.Factory.addGetterSetter(Kinetic.Container, 'clipWidth'); /** * get/set clip width * @name clipWidth * @method * @memberof Kinetic.Container.prototype * @param {Number} width * @returns {Number} * @example * // get clip width
* var clipWidth = container.clipWidth();

* * // set clip width
* container.clipWidth(100); */ Kinetic.Factory.addGetterSetter(Kinetic.Container, 'clipHeight'); /** * get/set clip height * @name clipHeight * @method * @memberof Kinetic.Container.prototype * @param {Number} height * @returns {Number} * @example * // get clip height
* var clipHeight = container.clipHeight();

* * // set clip height
* container.clipHeight(100); */ Kinetic.Collection.mapMethods(Kinetic.Container); })(); ;(function() { var HAS_SHADOW = 'hasShadow'; function _fillFunc(context) { context.fill(); } function _strokeFunc(context) { context.stroke(); } function _fillFuncHit(context) { context.fill(); } function _strokeFuncHit(context) { context.stroke(); } function _clearHasShadowCache() { this._clearCache(HAS_SHADOW); } Kinetic.Util.addMethods(Kinetic.Shape, { __init: function(config) { this.nodeType = 'Shape'; this._fillFunc = _fillFunc; this._strokeFunc = _strokeFunc; this._fillFuncHit = _fillFuncHit; this._strokeFuncHit = _strokeFuncHit; // set colorKey var shapes = Kinetic.shapes; var key; while(true) { key = Kinetic.Util.getRandomColor(); if(key && !( key in shapes)) { break; } } this.colorKey = key; shapes[key] = this; // call super constructor Kinetic.Node.call(this, config); this.on('shadowColorChange.kinetic shadowBlurChange.kinetic shadowOffsetChange.kinetic shadowOpacityChange.kinetic shadowEnabledChange.kinetic', _clearHasShadowCache); }, hasChildren: function() { return false; }, getChildren: function() { return []; }, /** * get canvas context tied to the layer * @method * @memberof Kinetic.Shape.prototype * @returns {Kinetic.Context} */ getContext: function() { return this.getLayer().getContext(); }, /** * get canvas renderer tied to the layer. Note that this returns a canvas renderer, not a canvas element * @method * @memberof Kinetic.Shape.prototype * @returns {Kinetic.Canvas} */ getCanvas: function() { return this.getLayer().getCanvas(); }, /** * returns whether or not a shadow will be rendered * @method * @memberof Kinetic.Shape.prototype * @returns {Boolean} */ hasShadow: function() { return this._getCache(HAS_SHADOW, this._hasShadow); }, _hasShadow: function() { return this.getShadowEnabled() && (this.getShadowOpacity() !== 0 && !!(this.getShadowColor() || this.getShadowBlur() || this.getShadowOffsetX() || this.getShadowOffsetY())); }, /** * returns whether or not the shape will be filled * @method * @memberof Kinetic.Shape.prototype * @returns {Boolean} */ hasFill: function() { return !!(this.getFill() || this.getFillPatternImage() || this.getFillLinearGradientColorStops() || this.getFillRadialGradientColorStops()); }, /** * returns whether or not the shape will be stroked * @method * @memberof Kinetic.Shape.prototype * @returns {Boolean} */ hasStroke: function() { return !!(this.stroke() || this.strokeRed() || this.strokeGreen() || this.strokeBlue()); }, _get: function(selector) { return this.className === selector || this.nodeType === selector ? [this] : []; }, /** * determines if point is in the shape, regardless if other shapes are on top of it. Note: because * this method clears a temporary canvas and then redraws the shape, it performs very poorly if executed many times * consecutively. Please use the {@link Kinetic.Stage#getIntersection} method if at all possible * because it performs much better * @method * @memberof Kinetic.Shape.prototype * @param {Object} point * @param {Number} point.x * @param {Number} point.y * @returns {Boolean} */ intersects: function(pos) { var stage = this.getStage(), bufferHitCanvas = stage.bufferHitCanvas, p; bufferHitCanvas.getContext().clear(); this.drawScene(bufferHitCanvas); p = bufferHitCanvas.context.getImageData(Math.round(pos.x), Math.round(pos.y), 1, 1).data; return p[3] > 0; }, // extends Node.prototype.destroy destroy: function() { Kinetic.Node.prototype.destroy.call(this); delete Kinetic.shapes[this.colorKey]; }, _useBufferCanvas: function() { return (this.hasShadow() || this.getAbsoluteOpacity() !== 1) && this.hasFill() && this.hasStroke() && this.getStage(); }, drawScene: function(can, top) { var layer = this.getLayer(), canvas = can || layer.getCanvas(), context = canvas.getContext(), cachedCanvas = this._cache.canvas, drawFunc = this.sceneFunc(), hasShadow = this.hasShadow(), stage, bufferCanvas, bufferContext; if(this.isVisible()) { if (cachedCanvas) { this._drawCachedSceneCanvas(context); } else if (drawFunc) { context.save(); // if buffer canvas is needed if (this._useBufferCanvas()) { stage = this.getStage(); bufferCanvas = stage.bufferCanvas; bufferContext = bufferCanvas.getContext(); bufferContext.clear(); bufferContext.save(); bufferContext._applyLineJoin(this); layer._applyTransform(this, bufferContext, top); drawFunc.call(this, bufferContext); bufferContext.restore(); if (hasShadow) { context.save(); context._applyShadow(this); context.drawImage(bufferCanvas._canvas, 0, 0); context.restore(); } context._applyOpacity(this); context.drawImage(bufferCanvas._canvas, 0, 0); } // if buffer canvas is not needed else { context._applyLineJoin(this); layer._applyTransform(this, context, top); if (hasShadow) { context.save(); context._applyShadow(this); drawFunc.call(this, context); context.restore(); } context._applyOpacity(this); drawFunc.call(this, context); } context.restore(); } } return this; }, drawHit: function(can, top) { var layer = this.getLayer(), canvas = can || layer.hitCanvas, context = canvas.getContext(), drawFunc = this.hitFunc() || this.sceneFunc(), cachedCanvas = this._cache.canvas, cachedHitCanvas = cachedCanvas && cachedCanvas.hit; if(this.shouldDrawHit()) { if (cachedHitCanvas) { this._drawCachedHitCanvas(context); } else if (drawFunc) { context.save(); context._applyLineJoin(this); layer._applyTransform(this, context, top); drawFunc.call(this, context); context.restore(); } } return this; }, /** * draw hit graph using the cached scene canvas * @method * @memberof Kinetic.Shape.prototype * @param {Integer} alphaThreshold alpha channel threshold that determines whether or not * a pixel should be drawn onto the hit graph. Must be a value between 0 and 255. * The default is 0 * @returns {Kinetic.Shape} * @example * shape.cache(); * shape.drawHitFromCache(); */ drawHitFromCache: function(alphaThreshold) { var threshold = alphaThreshold || 0, cachedCanvas = this._cache.canvas, sceneCanvas = this._getCachedSceneCanvas(), sceneContext = sceneCanvas.getContext(), hitCanvas = cachedCanvas.hit, hitContext = hitCanvas.getContext(), width = sceneCanvas.getWidth(), height = sceneCanvas.getHeight(), sceneImageData, sceneData, hitImageData, hitData, len, rgbColorKey, i, alpha; hitContext.clear(); try { sceneImageData = sceneContext.getImageData(0, 0, width, height); sceneData = sceneImageData.data; hitImageData = hitContext.getImageData(0, 0, width, height); hitData = hitImageData.data; len = sceneData.length; rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); // replace non transparent pixels with color key for(i = 0; i < len; i += 4) { alpha = sceneData[i + 3]; if (alpha > threshold) { hitData[i] = rgbColorKey.r; hitData[i + 1] = rgbColorKey.g; hitData[i + 2] = rgbColorKey.b; hitData[i + 3] = 255; } } hitContext.putImageData(hitImageData, 0, 0); } catch(e) { Kinetic.Util.warn('Unable to draw hit graph from cached scene canvas. ' + e.message); } return this; }, }); Kinetic.Util.extend(Kinetic.Shape, Kinetic.Node); // add getters and setters Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'stroke'); /** * get/set stroke color * @name stroke * @method * @memberof Kinetic.Shape.prototype * @param {String} color * @returns {String} * @example * // get stroke color
* var stroke = shape.stroke();

* * // set stroke color with color string
* shape.stroke('green');

* * // set stroke color with hex
* shape.stroke('#00ff00');

* * // set stroke color with rgb
* shape.stroke('rgb(0,255,0)');

* * // set stroke color with rgba and make it 50% opaque
* shape.stroke('rgba(0,255,0,0.5'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'strokeRed', 0, Kinetic.Validators.RGBComponent); /** * get/set stroke red component * @name strokeRed * @method * @memberof Kinetic.Shape.prototype * @param {Integer} red * @returns {Integer} * @example * // get stroke red component
* var strokeRed = shape.strokeRed();

* * // set stroke red component
* shape.strokeRed(0); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'strokeGreen', 0, Kinetic.Validators.RGBComponent); /** * get/set stroke green component * @name strokeGreen * @method * @memberof Kinetic.Shape.prototype * @param {Integer} green * @returns {Integer} * @example * // get stroke green component
* var strokeGreen = shape.strokeGreen();

* * // set stroke green component
* shape.strokeGreen(255); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'strokeBlue', 0, Kinetic.Validators.RGBComponent); /** * get/set stroke blue component * @name strokeBlue * @method * @memberof Kinetic.Shape.prototype * @param {Integer} blue * @returns {Integer} * @example * // get stroke blue component
* var strokeBlue = shape.strokeBlue();

* * // set stroke blue component
* shape.strokeBlue(0); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'strokeAlpha', 1, Kinetic.Validators.alphaComponent); /** * get/set stroke alpha component. Alpha is a real number between 0 and 1. The default * is 1. * @name strokeAlpha * @method * @memberof Kinetic.Shape.prototype * @param {Number} alpha * @returns {Number} * @example * // get stroke alpha component
* var strokeAlpha = shape.strokeAlpha();

* * // set stroke alpha component
* shape.strokeAlpha(0.5); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'strokeWidth', 2); /** * get/set stroke width * @name strokeWidth * @method * @memberof Kinetic.Shape.prototype * @param {Number} strokeWidth * @returns {Number} * @example * // get stroke width
* var strokeWidth = shape.strokeWidth();

* * // set stroke width
* shape.strokeWidth(); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'lineJoin'); /** * get/set line join. Can be miter, round, or bevel. The * default is miter * @name lineJoin * @method * @memberof Kinetic.Shape.prototype * @param {String} lineJoin * @returns {String} * @example * // get line join
* var lineJoin = shape.lineJoin();

* * // set line join
* shape.lineJoin('round'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'lineCap'); /** * get/set line cap. Can be butt, round, or square * @name lineCap * @method * @memberof Kinetic.Shape.prototype * @param {String} lineCap * @returns {String} * @example * // get line cap
* var lineCap = shape.lineCap();

* * // set line cap
* shape.lineCap('round'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'sceneFunc'); /** * get/set scene draw function * @name sceneFunc * @method * @memberof Kinetic.Shape.prototype * @param {Function} drawFunc drawing function * @returns {Function} * @example * // get scene draw function
* var sceneFunc = shape.sceneFunc();

* * // set scene draw function
* shape.sceneFunc(function(context) {
* context.beginPath();
* context.rect(0, 0, this.width(), this.height());
* context.closePath();
* context.fillStrokeShape(this);
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'hitFunc'); /** * get/set hit draw function * @name hitFunc * @method * @memberof Kinetic.Shape.prototype * @param {Function} drawFunc drawing function * @returns {Function} * @example * // get hit draw function
* var hitFunc = shape.hitFunc();

* * // set hit draw function
* shape.hitFunc(function(context) {
* context.beginPath();
* context.rect(0, 0, this.width(), this.height());
* context.closePath();
* context.fillStrokeShape(this);
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'dash'); /** * get/set dash array for stroke. * @name dash * @method * @memberof Kinetic.Shape.prototype * @param {Array} dash * @returns {Array} * @example * // apply dashed stroke that is 10px long and 5 pixels apart
* line.dash([10, 5]);

* * // apply dashed stroke that is made up of alternating dashed
* // lines that are 10px long and 20px apart, and dots that have
* // a radius of 5px and are 20px apart
* line.dash([10, 20, 0.001, 20]); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowColor'); /** * get/set shadow color * @name shadowColor * @method * @memberof Kinetic.Shape.prototype * @param {String} color * @returns {String} * @example * // get shadow color
* var shadow = shape.shadowColor();

* * // set shadow color with color string
* shape.shadowColor('green');

* * // set shadow color with hex
* shape.shadowColor('#00ff00');

* * // set shadow color with rgb
* shape.shadowColor('rgb(0,255,0)');

* * // set shadow color with rgba and make it 50% opaque
* shape.shadowColor('rgba(0,255,0,0.5'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowRed', 0, Kinetic.Validators.RGBComponent); /** * get/set shadow red component * @name shadowRed * @method * @memberof Kinetic.Shape.prototype * @param {Integer} red * @returns {Integer} * @example * // get shadow red component
* var shadowRed = shape.shadowRed();

* * // set shadow red component
* shape.shadowRed(0); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowGreen', 0, Kinetic.Validators.RGBComponent); /** * get/set shadow green component * @name shadowGreen * @method * @memberof Kinetic.Shape.prototype * @param {Integer} green * @returns {Integer} * @example * // get shadow green component
* var shadowGreen = shape.shadowGreen();

* * // set shadow green component
* shape.shadowGreen(255); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowBlue', 0, Kinetic.Validators.RGBComponent); /** * get/set shadow blue component * @name shadowBlue * @method * @memberof Kinetic.Shape.prototype * @param {Integer} blue * @returns {Integer} * @example * // get shadow blue component
* var shadowBlue = shape.shadowBlue();

* * // set shadow blue component
* shape.shadowBlue(0); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowAlpha', 1, Kinetic.Validators.alphaComponent); /** * get/set shadow alpha component. Alpha is a real number between 0 and 1. The default * is 1. * @name shadowAlpha * @method * @memberof Kinetic.Shape.prototype * @param {Number} alpha * @returns {Number} * @example * // get shadow alpha component
* var shadowAlpha = shape.shadowAlpha();

* * // set shadow alpha component
* shape.shadowAlpha(0.5); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowBlur'); /** * get/set shadow blur * @name shadowBlur * @method * @memberof Kinetic.Shape.prototype * @param {Number} blur * @returns {Number} * @example * // get shadow blur
* var shadowBlur = shape.shadowBlur();

* * // set shadow blur
* shape.shadowBlur(10); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowOpacity'); /** * get/set shadow opacity. must be a value between 0 and 1 * @name shadowOpacity * @method * @memberof Kinetic.Shape.prototype * @param {Number} opacity * @returns {Number} * @example * // get shadow opacity
* var shadowOpacity = shape.shadowOpacity();

* * // set shadow opacity
* shape.shadowOpacity(0.5); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape, 'shadowOffset', ['x', 'y']); /** * get/set shadow offset * @name shadowOffset * @method * @memberof Kinetic.Shape.prototype * @param {Object} offset * @param {Number} offset.x * @param {Number} offset.y * @returns {Object} * @example * // get shadow offset
* var shadowOffset = shape.shadowOffset();

* * // set shadow offset
* shape.shadowOffset({
* x: 20
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowOffsetX', 0); /** * get/set shadow offset x * @name shadowOffsetX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get shadow offset x
* var shadowOffsetX = shape.shadowOffsetX();

* * // set shadow offset x
* shape.shadowOffsetX(5); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowOffsetY', 0); /** * get/set shadow offset y * @name shadowOffsetY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get shadow offset y
* var shadowOffsetY = shape.shadowOffsetY();

* * // set shadow offset y
* shape.shadowOffsetY(5); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternImage'); /** * get/set fill pattern image * @name fillPatternImage * @method * @memberof Kinetic.Shape.prototype * @param {Image} image object * @returns {Image} * @example * // get fill pattern image
* var fillPatternImage = shape.fillPatternImage();

* * // set fill pattern image
* var imageObj = new Image();
* imageObj.onload = function() {
* shape.fillPatternImage(imageObj);
* };
* imageObj.src = 'path/to/image/jpg'; */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fill'); /** * get/set fill color * @name fill * @method * @memberof Kinetic.Shape.prototype * @param {String} color * @returns {String} * @example * // get fill color
* var fill = shape.fill();

* * // set fill color with color string
* shape.fill('green');

* * // set fill color with hex
* shape.fill('#00ff00');

* * // set fill color with rgb
* shape.fill('rgb(0,255,0)');

* * // set fill color with rgba and make it 50% opaque
* shape.fill('rgba(0,255,0,0.5'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRed', 0, Kinetic.Validators.RGBComponent); /** * get/set fill red component * @name fillRed * @method * @memberof Kinetic.Shape.prototype * @param {Integer} red * @returns {Integer} * @example * // get fill red component
* var fillRed = shape.fillRed();

* * // set fill red component
* shape.fillRed(0); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillGreen', 0, Kinetic.Validators.RGBComponent); /** * get/set fill green component * @name fillGreen * @method * @memberof Kinetic.Shape.prototype * @param {Integer} green * @returns {Integer} * @example * // get fill green component
* var fillGreen = shape.fillGreen();

* * // set fill green component
* shape.fillGreen(255); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillBlue', 0, Kinetic.Validators.RGBComponent); /** * get/set fill blue component * @name fillBlue * @method * @memberof Kinetic.Shape.prototype * @param {Integer} blue * @returns {Integer} * @example * // get fill blue component
* var fillBlue = shape.fillBlue();

* * // set fill blue component
* shape.fillBlue(0); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillAlpha', 1, Kinetic.Validators.alphaComponent); /** * get/set fill alpha component. Alpha is a real number between 0 and 1. The default * is 1. * @name fillAlpha * @method * @memberof Kinetic.Shape.prototype * @param {Number} alpha * @returns {Number} * @example * // get fill alpha component
* var fillAlpha = shape.fillAlpha();

* * // set fill alpha component
* shape.fillAlpha(0.5); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternX', 0); /** * get/set fill pattern x * @name fillPatternX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get fill pattern x
* var fillPatternX = shape.fillPatternX();

* * // set fill pattern x
* shape.fillPatternX(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternY', 0); /** * get/set fill pattern y * @name fillPatternY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get fill pattern y
* var fillPatternY = shape.fillPatternY();

* * // set fill pattern y
* shape.fillPatternY(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillLinearGradientColorStops'); /** * get/set fill linear gradient color stops * @name fillLinearGradientColorStops * @method * @memberof Kinetic.Shape.prototype * @param {Array} colorStops * @returns {Array} colorStops * @example * // get fill linear gradient color stops
* var colorStops = shape.fillLinearGradientColorStops();

* * // create a linear gradient that starts with red, changes to blue
* // halfway through, and then changes to green
* shape.fillLinearGradientColorStops(0, 'red', 0.5, 'blue', 1, 'green'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRadialGradientStartRadius', 0); /** * get/set fill radial gradient start radius * @name fillRadialGradientStartRadius * @method * @memberof Kinetic.Shape.prototype * @param {Number} radius * @returns {Number} * @example * // get radial gradient start radius
* var startRadius = shape.fillRadialGradientStartRadius();

* * // set radial gradient start radius
* shape.fillRadialGradientStartRadius(0); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRadialGradientEndRadius', 0); /** * get/set fill radial gradient end radius * @name fillRadialGradientEndRadius * @method * @memberof Kinetic.Shape.prototype * @param {Number} radius * @returns {Number} * @example * // get radial gradient end radius
* var endRadius = shape.fillRadialGradientEndRadius();

* * // set radial gradient end radius
* shape.fillRadialGradientEndRadius(100); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRadialGradientColorStops'); /** * get/set fill radial gradient color stops * @name fillRadialGradientColorStops * @method * @memberof Kinetic.Shape.prototype * @param {Number} colorStops * @returns {Array} * @example * // get fill radial gradient color stops
* var colorStops = shape.fillRadialGradientColorStops();

* * // create a radial gradient that starts with red, changes to blue
* // halfway through, and then changes to green
* shape.fillRadialGradientColorStops(0, 'red', 0.5, 'blue', 1, 'green'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternRepeat', 'repeat'); /** * get/set fill pattern repeat. Can be 'repeat', 'repeat-x', 'repeat-y', or 'no-repeat'. The default is 'repeat' * @name fillPatternRepeat * @method * @memberof Kinetic.Shape.prototype * @param {String} repeat * @returns {String} * @example * // get fill pattern repeat
* var repeat = shape.fillPatternRepeat();

* * // repeat pattern in x direction only
* shape.fillPatternRepeat('repeat-x');

* * // do not repeat the pattern
* shape.fillPatternRepeat('no repeat'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillEnabled', true); /** * get/set fill enabled flag * @name fillEnabled * @method * @memberof Kinetic.Shape.prototype * @param {Boolean} enabled * @returns {Boolean} * @example * // get fill enabled flag
* var fillEnabled = shape.fillEnabled();

* * // disable fill
* shape.fillEnabled(false);

* * // enable fill
* shape.fillEnabled(true); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'strokeEnabled', true); /** * get/set stroke enabled flag * @name strokeEnabled * @method * @memberof Kinetic.Shape.prototype * @param {Boolean} enabled * @returns {Boolean} * @example * // get stroke enabled flag
* var strokeEnabled = shape.strokeEnabled();

* * // disable stroke
* shape.strokeEnabled(false);

* * // enable stroke
* shape.strokeEnabled(true); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowEnabled', true); /** * get/set shadow enabled flag * @name shadowEnabled * @method * @memberof Kinetic.Shape.prototype * @param {Boolean} enabled * @returns {Boolean} * @example * // get shadow enabled flag
* var shadowEnabled = shape.shadowEnabled();

* * // disable shadow
* shape.shadowEnabled(false);

* * // enable shadow
* shape.shadowEnabled(true); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'dashEnabled', true); /** * get/set dash enabled flag * @name dashEnabled * @method * @memberof Kinetic.Shape.prototype * @param {Boolean} enabled * @returns {Boolean} * @example * // get dash enabled flag
* var dashEnabled = shape.dashEnabled();

* * // disable dash
* shape.dashEnabled(false);

* * // enable dash
* shape.dashEnabled(true); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'strokeScaleEnabled', true); /** * get/set strokeScale enabled flag * @name strokeScaleEnabled * @method * @memberof Kinetic.Shape.prototype * @param {Boolean} enabled * @returns {Boolean} * @example * // get stroke scale enabled flag
* var strokeScaleEnabled = shape.strokeScaleEnabled();

* * // disable stroke scale
* shape.strokeScaleEnabled(false);

* * // enable stroke scale
* shape.strokeScaleEnabled(true); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPriority', 'color'); /** * get/set fill priority. can be color, pattern, linear-gradient, or radial-gradient. The default is color. * This is handy if you want to toggle between different fill types. * @name fillPriority * @method * @memberof Kinetic.Shape.prototype * @param {String} priority * @returns {String} * @example * // get fill priority
* var fillPriority = shape.fillPriority();

* * // set fill priority
* shape.fillPriority('linear-gradient'); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape, 'fillPatternOffset', ['x', 'y']); /** * get/set fill pattern offset * @name fillPatternOffset * @method * @memberof Kinetic.Shape.prototype * @param {Object} offset * @param {Number} offset.x * @param {Number} offset.y * @returns {Object} * @example * // get fill pattern offset
* var patternOffset = shape.fillPatternOffset();

* * // set fill pattern offset
* shape.fillPatternOffset({
* x: 20
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternOffsetX', 0); /** * get/set fill pattern offset x * @name fillPatternOffsetX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get fill pattern offset x
* var patternOffsetX = shape.fillPatternOffsetX();

* * // set fill pattern offset x
* shape.fillPatternOffsetX(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternOffsetY', 0); /** * get/set fill pattern offset y * @name fillPatternOffsetY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get fill pattern offset y
* var patternOffsetY = shape.fillPatternOffsetY();

* * // set fill pattern offset y
* shape.fillPatternOffsetY(10); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape, 'fillPatternScale', ['x', 'y']); /** * get/set fill pattern scale * @name fillPatternScale * @method * @memberof Kinetic.Shape.prototype * @param {Object} scale * @param {Number} scale.x * @param {Number} scale.y * @returns {Object} * @example * // get fill pattern scale
* var patternScale = shape.fillPatternScale();

* * // set fill pattern scale
* shape.fillPatternScale({
* x: 2
* y: 2
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternScaleX', 1); /** * get/set fill pattern scale x * @name fillPatternScaleX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get fill pattern scale x
* var patternScaleX = shape.fillPatternScaleX();

* * // set fill pattern scale x
* shape.fillPatternScaleX(2); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternScaleY', 1); /** * get/set fill pattern scale y * @name fillPatternScaleY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get fill pattern scale y
* var patternScaleY = shape.fillPatternScaleY();

* * // set fill pattern scale y
* shape.fillPatternScaleY(2); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape, 'fillLinearGradientStartPoint', ['x', 'y']); /** * get/set fill linear gradient start point * @name fillLinearGradientStartPoint * @method * @memberof Kinetic.Shape.prototype * @param {Object} startPoint * @param {Number} startPoint.x * @param {Number} startPoint.y * @returns {Object} * @example * // get fill linear gradient start point
* var startPoint = shape.fillLinearGradientStartPoint();

* * // set fill linear gradient start point
* shape.fillLinearGradientStartPoint({
* x: 20
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillLinearGradientStartPointX', 0); /** * get/set fill linear gradient start point x * @name fillLinearGradientStartPointX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get fill linear gradient start point x
* var startPointX = shape.fillLinearGradientStartPointX();

* * // set fill linear gradient start point x
* shape.fillLinearGradientStartPointX(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillLinearGradientStartPointY', 0); /** * get/set fill linear gradient start point y * @name fillLinearGradientStartPointY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get fill linear gradient start point y
* var startPointY = shape.fillLinearGradientStartPointY();

* * // set fill linear gradient start point y
* shape.fillLinearGradientStartPointY(20); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape, 'fillLinearGradientEndPoint', ['x', 'y']); /** * get/set fill linear gradient end point * @name fillLinearGradientEndPoint * @method * @memberof Kinetic.Shape.prototype * @param {Object} endPoint * @param {Number} endPoint.x * @param {Number} endPoint.y * @returns {Object} * @example * // get fill linear gradient end point
* var endPoint = shape.fillLinearGradientEndPoint();

* * // set fill linear gradient end point
* shape.fillLinearGradientEndPoint({
* x: 20
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillLinearGradientEndPointX', 0); /** * get/set fill linear gradient end point x * @name fillLinearGradientEndPointX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get fill linear gradient end point x
* var endPointX = shape.fillLinearGradientEndPointX();

* * // set fill linear gradient end point x
* shape.fillLinearGradientEndPointX(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillLinearGradientEndPointY', 0); /** * get/set fill linear gradient end point y * @name fillLinearGradientEndPointY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get fill linear gradient end point y
* var endPointY = shape.fillLinearGradientEndPointY();

* * // set fill linear gradient end point y
* shape.fillLinearGradientEndPointY(20); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape, 'fillRadialGradientStartPoint', ['x', 'y']); /** * get/set fill radial gradient start point * @name fillRadialGradientStartPoint * @method * @memberof Kinetic.Shape.prototype * @param {Object} startPoint * @param {Number} startPoint.x * @param {Number} startPoint.y * @returns {Object} * @example * // get fill radial gradient start point
* var startPoint = shape.fillRadialGradientStartPoint();

* * // set fill radial gradient start point
* shape.fillRadialGradientStartPoint({
* x: 20
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRadialGradientStartPointX', 0); /** * get/set fill radial gradient start point x * @name fillRadialGradientStartPointX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get fill radial gradient start point x
* var startPointX = shape.fillRadialGradientStartPointX();

* * // set fill radial gradient start point x
* shape.fillRadialGradientStartPointX(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRadialGradientStartPointY', 0); /** * get/set fill radial gradient start point y * @name fillRadialGradientStartPointY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get fill radial gradient start point y
* var startPointY = shape.fillRadialGradientStartPointY();

* * // set fill radial gradient start point y
* shape.fillRadialGradientStartPointY(20); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape, 'fillRadialGradientEndPoint', ['x', 'y']); /** * get/set fill radial gradient end point * @name fillRadialGradientEndPoint * @method * @memberof Kinetic.Shape.prototype * @param {Object} endPoint * @param {Number} endPoint.x * @param {Number} endPoint.y * @returns {Object} * @example * // get fill radial gradient end point
* var endPoint = shape.fillRadialGradientEndPoint();

* * // set fill radial gradient end point
* shape.fillRadialGradientEndPoint({
* x: 20
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRadialGradientEndPointX', 0); /** * get/set fill radial gradient end point x * @name fillRadialGradientEndPointX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get fill radial gradient end point x
* var endPointX = shape.fillRadialGradientEndPointX();

* * // set fill radial gradient end point x
* shape.fillRadialGradientEndPointX(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRadialGradientEndPointY', 0); /** * get/set fill radial gradient end point y * @name fillRadialGradientEndPointY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get fill radial gradient end point y
* var endPointY = shape.fillRadialGradientEndPointY();

* * // set fill radial gradient end point y
* shape.fillRadialGradientEndPointY(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternRotation', 0); /** * get/set fill pattern rotation in degrees * @name fillPatternRotation * @method * @memberof Kinetic.Shape.prototype * @param {Number} rotation * @returns {Kinetic.Shape} * @example * // get fill pattern rotation
* var patternRotation = shape.fillPatternRotation();

* * // set fill pattern rotation
* shape.fillPatternRotation(20); */ Kinetic.Factory.backCompat(Kinetic.Shape, { dashArray: 'dash', getDashArray: 'getDash', setDashArray: 'getDash', drawFunc: 'sceneFunc', getDrawFunc: 'getSceneFunc', setDrawFunc: 'setSceneFunc', drawHitFunc: 'hitFunc', getDrawHitFunc: 'getHitFunc', setDrawHitFunc: 'setHitFunc' }); Kinetic.Collection.mapMethods(Kinetic.Shape); })(); ;/*jshint unused:false */ (function() { // CONSTANTS var STAGE = 'Stage', STRING = 'string', PX = 'px', MOUSEOUT = 'mouseout', MOUSELEAVE = 'mouseleave', MOUSEOVER = 'mouseover', MOUSEENTER = 'mouseenter', MOUSEMOVE = 'mousemove', MOUSEDOWN = 'mousedown', MOUSEUP = 'mouseup', CLICK = 'click', DBL_CLICK = 'dblclick', TOUCHSTART = 'touchstart', TOUCHEND = 'touchend', TAP = 'tap', DBL_TAP = 'dbltap', TOUCHMOVE = 'touchmove', CONTENT_MOUSEOUT = 'contentMouseout', CONTENT_MOUSELEAVE = 'contentMouseleave', CONTENT_MOUSEOVER = 'contentMouseover', CONTENT_MOUSEENTER = 'contentMouseenter', CONTENT_MOUSEMOVE = 'contentMousemove', CONTENT_MOUSEDOWN = 'contentMousedown', CONTENT_MOUSEUP = 'contentMouseup', CONTENT_CLICK = 'contentClick', CONTENT_DBL_CLICK = 'contentDblclick', CONTENT_TOUCHSTART = 'contentTouchstart', CONTENT_TOUCHEND = 'contentTouchend', CONTENT_TAP = 'contentTap', CONTENT_DBL_TAP = 'contentDbltap', CONTENT_TOUCHMOVE = 'contentTouchmove', DIV = 'div', RELATIVE = 'relative', INLINE_BLOCK = 'inline-block', KINETICJS_CONTENT = 'kineticjs-content', SPACE = ' ', UNDERSCORE = '_', CONTAINER = 'container', EMPTY_STRING = '', EVENTS = [MOUSEDOWN, MOUSEMOVE, MOUSEUP, MOUSEOUT, TOUCHSTART, TOUCHMOVE, TOUCHEND, MOUSEOVER], // cached variables eventsLength = EVENTS.length; function addEvent(ctx, eventName) { ctx.content.addEventListener(eventName, function(evt) { ctx[UNDERSCORE + eventName](evt); }, false); } Kinetic.Util.addMethods(Kinetic.Stage, { ___init: function(config) { this.nodeType = STAGE; // call super constructor Kinetic.Container.call(this, config); this._id = Kinetic.idCounter++; this._buildDOM(); this._bindContentEvents(); this._enableNestedTransforms = false; Kinetic.stages.push(this); }, _validateAdd: function(child) { if (child.getType() !== 'Layer') { Kinetic.Util.error('You may only add layers to the stage.'); } }, /** * set container dom element which contains the stage wrapper div element * @method * @memberof Kinetic.Stage.prototype * @param {DomElement} container can pass in a dom element or id string */ setContainer: function(container) { if( typeof container === STRING) { var id = container; container = Kinetic.document.getElementById(container); if (!container) { throw 'Can not find container in document with id ' + id; } } this._setAttr(CONTAINER, container); return this; }, shouldDrawHit: function() { return true; }, draw: function() { Kinetic.Node.prototype.draw.call(this); return this; }, /** * draw layer scene graphs * @name draw * @method * @memberof Kinetic.Stage.prototype */ /** * draw layer hit graphs * @name drawHit * @method * @memberof Kinetic.Stage.prototype */ /** * set height * @method * @memberof Kinetic.Stage.prototype * @param {Number} height */ setHeight: function(height) { Kinetic.Node.prototype.setHeight.call(this, height); this._resizeDOM(); return this; }, /** * set width * @method * @memberof Kinetic.Stage.prototype * @param {Number} width */ setWidth: function(width) { Kinetic.Node.prototype.setWidth.call(this, width); this._resizeDOM(); return this; }, /** * clear all layers * @method * @memberof Kinetic.Stage.prototype */ clear: function() { var layers = this.children, len = layers.length, n; for(n = 0; n < len; n++) { layers[n].clear(); } return this; }, clone: function(obj) { if (!obj) { obj = {}; } obj.container = Kinetic.document.createElement(DIV); return Kinetic.Container.prototype.clone.call(this, obj); }, /** * destroy stage * @method * @memberof Kinetic.Stage.prototype */ destroy: function() { var content = this.content; Kinetic.Container.prototype.destroy.call(this); if(content && Kinetic.Util._isInDocument(content)) { this.getContainer().removeChild(content); } var index = Kinetic.stages.indexOf(this); if (index > -1) { Kinetic.stages.splice(index, 1); } }, /** * get pointer position which can be a touch position or mouse position * @method * @memberof Kinetic.Stage.prototype * @returns {Object} */ getPointerPosition: function() { return this.pointerPos; }, getStage: function() { return this; }, /** * get stage content div element which has the * the class name "kineticjs-content" * @method * @memberof Kinetic.Stage.prototype */ getContent: function() { return this.content; }, /** * Creates a composite data URL and requires a callback because the composite is generated asynchronously. * @method * @memberof Kinetic.Stage.prototype * @param {Object} config * @param {Function} config.callback function executed when the composite has completed * @param {String} [config.mimeType] can be "image/png" or "image/jpeg". * "image/png" is the default * @param {Number} [config.x] x position of canvas section * @param {Number} [config.y] y position of canvas section * @param {Number} [config.width] width of canvas section * @param {Number} [config.height] height of canvas section * @param {Number} [config.quality] jpeg quality. If using an "image/jpeg" mimeType, * you can specify the quality from 0 to 1, where 0 is very poor quality and 1 * is very high quality */ toDataURL: function(config) { config = config || {}; var mimeType = config.mimeType || null, quality = config.quality || null, x = config.x || 0, y = config.y || 0, canvas = new Kinetic.SceneCanvas({ width: config.width || this.getWidth(), height: config.height || this.getHeight(), pixelRatio: 1 }), _context = canvas.getContext()._context, layers = this.children; if(x || y) { _context.translate(-1 * x, -1 * y); } function drawLayer(n) { var layer = layers[n], layerUrl = layer.toDataURL(), imageObj = new Kinetic.window.Image(); imageObj.onload = function() { _context.drawImage(imageObj, 0, 0); if(n < layers.length - 1) { drawLayer(n + 1); } else { config.callback(canvas.toDataURL(mimeType, quality)); } }; imageObj.src = layerUrl; } drawLayer(0); }, /** * converts stage into an image. * @method * @memberof Kinetic.Stage.prototype * @param {Object} config * @param {Function} config.callback function executed when the composite has completed * @param {String} [config.mimeType] can be "image/png" or "image/jpeg". * "image/png" is the default * @param {Number} [config.x] x position of canvas section * @param {Number} [config.y] y position of canvas section * @param {Number} [config.width] width of canvas section * @param {Number} [config.height] height of canvas section * @param {Number} [config.quality] jpeg quality. If using an "image/jpeg" mimeType, * you can specify the quality from 0 to 1, where 0 is very poor quality and 1 * is very high quality */ toImage: function(config) { var cb = config.callback; config.callback = function(dataUrl) { Kinetic.Util._getImage(dataUrl, function(img) { cb(img); }); }; this.toDataURL(config); }, /** * get visible intersection shape. This is the preferred * method for determining if a point intersects a shape or not * @method * @memberof Kinetic.Stage.prototype * @param {Object} pos * @param {Number} pos.x * @param {Number} pos.y * @returns {Kinetic.Shape} */ getIntersection: function(pos) { var layers = this.getChildren(), len = layers.length, end = len - 1, n, shape; for(n = end; n >= 0; n--) { shape = layers[n].getIntersection(pos); if (shape) { return shape; } } return null; }, _resizeDOM: function() { if(this.content) { var width = this.getWidth(), height = this.getHeight(), layers = this.getChildren(), len = layers.length, n, layer; // set content dimensions this.content.style.width = width + PX; this.content.style.height = height + PX; this.bufferCanvas.setSize(width, height); this.bufferHitCanvas.setSize(width, height); // set layer dimensions for(n = 0; n < len; n++) { layer = layers[n]; layer.getCanvas().setSize(width, height); layer.hitCanvas.setSize(width, height); layer.draw(); } } }, /** * add layer or layers to stage * @method * @memberof Kinetic.Stage.prototype * @param {...Kinetic.Layer} layer * @example * stage.add(layer1, layer2, layer3); */ add: function(layer) { if (arguments.length > 1) { for (var i = 0; i < arguments.length; i++) { this.add(arguments[i]); } return; } Kinetic.Container.prototype.add.call(this, layer); layer._setCanvasSize(this.width(), this.height()); // draw layer and append canvas to container layer.draw(); this.content.appendChild(layer.canvas._canvas); // chainable return this; }, getParent: function() { return null; }, getLayer: function() { return null; }, /** * returns a {@link Kinetic.Collection} of layers * @method * @memberof Kinetic.Stage.prototype */ getLayers: function() { return this.getChildren(); }, _bindContentEvents: function() { for (var n = 0; n < eventsLength; n++) { addEvent(this, EVENTS[n]); } }, _mouseover: function(evt) { if (!Kinetic.UA.mobile) { this._setPointerPosition(evt); this._fire(CONTENT_MOUSEOVER, {evt: evt}); } }, _mouseout: function(evt) { if (!Kinetic.UA.mobile) { this._setPointerPosition(evt); var targetShape = this.targetShape; if(targetShape && !Kinetic.isDragging()) { targetShape._fireAndBubble(MOUSEOUT, {evt: evt}); targetShape._fireAndBubble(MOUSELEAVE, {evt: evt}); this.targetShape = null; } this.pointerPos = undefined; this._fire(CONTENT_MOUSEOUT, {evt: evt}); } }, _mousemove: function(evt) { if (!Kinetic.UA.mobile) { this._setPointerPosition(evt); var dd = Kinetic.DD, shape = this.getIntersection(this.getPointerPosition()); if(shape && shape.isListening()) { if(!Kinetic.isDragging() && (!this.targetShape || this.targetShape._id !== shape._id)) { if(this.targetShape) { this.targetShape._fireAndBubble(MOUSEOUT, {evt: evt}, shape); this.targetShape._fireAndBubble(MOUSELEAVE, {evt: evt}, shape); } shape._fireAndBubble(MOUSEOVER, {evt: evt}, this.targetShape); shape._fireAndBubble(MOUSEENTER, {evt: evt}, this.targetShape); this.targetShape = shape; } else { shape._fireAndBubble(MOUSEMOVE, {evt: evt}); } } /* * if no shape was detected, clear target shape and try * to run mouseout from previous target shape */ else { if(this.targetShape && !Kinetic.isDragging()) { this.targetShape._fireAndBubble(MOUSEOUT, {evt: evt}); this.targetShape._fireAndBubble(MOUSELEAVE, {evt: evt}); this.targetShape = null; } } // content event this._fire(CONTENT_MOUSEMOVE, {evt: evt}); if(dd) { dd._drag(evt); } } // always call preventDefault for desktop events because some browsers // try to drag and drop the canvas element if (evt.preventDefault) { evt.preventDefault(); } }, _mousedown: function(evt) { if (!Kinetic.UA.mobile) { this._setPointerPosition(evt); var shape = this.getIntersection(this.getPointerPosition()); Kinetic.listenClickTap = true; if (shape && shape.isListening()) { this.clickStartShape = shape; shape._fireAndBubble(MOUSEDOWN, {evt: evt}); } // content event this._fire(CONTENT_MOUSEDOWN, {evt: evt}); } // always call preventDefault for desktop events because some browsers // try to drag and drop the canvas element if (evt.preventDefault) { evt.preventDefault(); } }, _mouseup: function(evt) { if (!Kinetic.UA.mobile) { this._setPointerPosition(evt); var that = this, shape = this.getIntersection(this.getPointerPosition()), clickStartShape = this.clickStartShape, fireDblClick = false; if(Kinetic.inDblClickWindow) { fireDblClick = true; Kinetic.inDblClickWindow = false; } else { Kinetic.inDblClickWindow = true; } setTimeout(function() { Kinetic.inDblClickWindow = false; }, Kinetic.dblClickWindow); if (shape && shape.isListening()) { shape._fireAndBubble(MOUSEUP, {evt: evt}); // detect if click or double click occurred if(Kinetic.listenClickTap && clickStartShape && clickStartShape._id === shape._id) { shape._fireAndBubble(CLICK, {evt: evt}); if(fireDblClick) { shape._fireAndBubble(DBL_CLICK, {evt: evt}); } } } // content events this._fire(CONTENT_MOUSEUP, {evt: evt}); if (Kinetic.listenClickTap) { this._fire(CONTENT_CLICK, {evt: evt}); if(fireDblClick) { this._fire(CONTENT_DBL_CLICK, {evt: evt}); } } Kinetic.listenClickTap = false; } // always call preventDefault for desktop events because some browsers // try to drag and drop the canvas element if (evt.preventDefault) { evt.preventDefault(); } }, _touchstart: function(evt) { this._setPointerPosition(evt); var shape = this.getIntersection(this.getPointerPosition()); Kinetic.listenClickTap = true; if (shape && shape.isListening()) { this.tapStartShape = shape; shape._fireAndBubble(TOUCHSTART, {evt: evt}); // only call preventDefault if the shape is listening for events if (shape.isListening() && evt.preventDefault) { evt.preventDefault(); } } // content event this._fire(CONTENT_TOUCHSTART, {evt: evt}); }, _touchend: function(evt) { this._setPointerPosition(evt); var shape = this.getIntersection(this.getPointerPosition()), fireDblClick = false; if(Kinetic.inDblClickWindow) { fireDblClick = true; Kinetic.inDblClickWindow = false; } else { Kinetic.inDblClickWindow = true; } setTimeout(function() { Kinetic.inDblClickWindow = false; }, Kinetic.dblClickWindow); if (shape && shape.isListening()) { shape._fireAndBubble(TOUCHEND, {evt: evt}); // detect if tap or double tap occurred if(Kinetic.listenClickTap && shape._id === this.tapStartShape._id) { shape._fireAndBubble(TAP, {evt: evt}); if(fireDblClick) { shape._fireAndBubble(DBL_TAP, {evt: evt}); } } // only call preventDefault if the shape is listening for events if (shape.isListening() && evt.preventDefault) { evt.preventDefault(); } } // content events if (Kinetic.listenClickTap) { this._fire(CONTENT_TOUCHEND, {evt: evt}); if(fireDblClick) { this._fire(CONTENT_DBL_TAP, {evt: evt}); } } Kinetic.listenClickTap = false; }, _touchmove: function(evt) { this._setPointerPosition(evt); var dd = Kinetic.DD, shape = this.getIntersection(this.getPointerPosition()); if (shape && shape.isListening()) { shape._fireAndBubble(TOUCHMOVE, {evt: evt}); // only call preventDefault if the shape is listening for events if (shape.isListening() && evt.preventDefault) { evt.preventDefault(); } } this._fire(CONTENT_TOUCHMOVE, {evt: evt}); // start drag and drop if(dd) { dd._drag(evt); } }, _setPointerPosition: function(evt) { var contentPosition = this._getContentPosition(), offsetX = evt.offsetX, clientX = evt.clientX, x = null, y = null, touch; evt = evt ? evt : window.event; // touch events if(evt.touches !== undefined) { // currently, only handle one finger if (evt.touches.length > 0) { touch = evt.touches[0]; // get the information for finger #1 x = touch.clientX - contentPosition.left; y = touch.clientY - contentPosition.top; } } // mouse events else { // if offsetX is defined, assume that offsetY is defined as well if (offsetX !== undefined) { x = offsetX; y = evt.offsetY; } // we unforunately have to use UA detection here because accessing // the layerX or layerY properties in newer veresions of Chrome // throws a JS warning. layerX and layerY are required for FF // when the container is transformed via CSS. else if (Kinetic.UA.browser === 'mozilla') { x = evt.layerX; y = evt.layerY; } // if clientX is defined, assume that clientY is defined as well else if (clientX !== undefined && contentPosition) { x = clientX - contentPosition.left; y = evt.clientY - contentPosition.top; } } if (x !== null && y !== null) { this.pointerPos = { x: x, y: y }; } }, _getContentPosition: function() { var rect = this.content.getBoundingClientRect ? this.content.getBoundingClientRect() : { top: 0, left: 0 }; return { top: rect.top, left: rect.left }; }, _buildDOM: function() { var container = this.getContainer(); if (!container) { if (Kinetic.Util.isBrowser()) { throw 'Stage has not container. But container is required'; } else { // automatically create element for jsdom in nodejs env container = Kinetic.document.createElement(DIV); } } // clear content inside container container.innerHTML = EMPTY_STRING; // content this.content = Kinetic.document.createElement(DIV); this.content.style.position = RELATIVE; this.content.style.display = INLINE_BLOCK; this.content.className = KINETICJS_CONTENT; this.content.setAttribute('role', 'presentation'); container.appendChild(this.content); // the buffer canvas pixel ratio must be 1 because it is used as an // intermediate canvas before copying the result onto a scene canvas. // not setting it to 1 will result in an over compensation this.bufferCanvas = new Kinetic.SceneCanvas({ pixelRatio: 1 }); this.bufferHitCanvas = new Kinetic.HitCanvas(); this._resizeDOM(); }, _onContent: function(typesStr, handler) { var types = typesStr.split(SPACE), len = types.length, n, baseEvent; for(n = 0; n < len; n++) { baseEvent = types[n]; this.content.addEventListener(baseEvent, handler, false); } }, // currently cache function is now working for stage, because stage has no its own canvas element // TODO: may be it is better to cache all children layers? cache: function() { Kinetic.Util.warn('Cache function is not allowed for stage. You may use cache only for layers, groups and shapes.'); return; }, clearCache : function() { } }); Kinetic.Util.extend(Kinetic.Stage, Kinetic.Container); // add getters and setters Kinetic.Factory.addGetter(Kinetic.Stage, 'container'); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Stage, 'container'); /** * get container DOM element * @name container * @method * @memberof Kinetic.Stage.prototype * @returns {DomElement} container * @example * // get container
* var container = stage.container();

* * // set container
* var container = document.createElement('div');
* body.appendChild(container);
* stage.container(container); */ })(); ;(function() { Kinetic.Util.addMethods(Kinetic.BaseLayer, { ___init: function(config) { this.nodeType = 'Layer'; Kinetic.Container.call(this, config); }, createPNGStream : function() { return this.canvas._canvas.createPNGStream(); }, /** * get layer canvas * @method * @memberof Kinetic.BaseLayer.prototype */ getCanvas: function() { return this.canvas; }, /** * get layer hit canvas * @method * @memberof Kinetic.BaseLayer.prototype */ getHitCanvas: function() { return this.hitCanvas; }, /** * get layer canvas context * @method * @memberof Kinetic.BaseLayer.prototype */ getContext: function() { return this.getCanvas().getContext(); }, /** * clear scene and hit canvas contexts tied to the layer * @method * @memberof Kinetic.BaseLayer.prototype * @param {Object} [bounds] * @param {Number} [bounds.x] * @param {Number} [bounds.y] * @param {Number} [bounds.width] * @param {Number} [bounds.height] * @example * layer.clear();
* layer.clear(0, 0, 100, 100); */ clear: function(bounds) { this.getContext().clear(bounds); this.getHitCanvas().getContext().clear(bounds); return this; }, // extend Node.prototype.setZIndex setZIndex: function(index) { Kinetic.Node.prototype.setZIndex.call(this, index); var stage = this.getStage(); if(stage) { stage.content.removeChild(this.getCanvas()._canvas); if(index < stage.getChildren().length - 1) { stage.content.insertBefore(this.getCanvas()._canvas, stage.getChildren()[index + 1].getCanvas()._canvas); } else { stage.content.appendChild(this.getCanvas()._canvas); } } return this; }, // extend Node.prototype.moveToTop moveToTop: function() { Kinetic.Node.prototype.moveToTop.call(this); var stage = this.getStage(); if(stage) { stage.content.removeChild(this.getCanvas()._canvas); stage.content.appendChild(this.getCanvas()._canvas); } }, // extend Node.prototype.moveUp moveUp: function() { if(Kinetic.Node.prototype.moveUp.call(this)) { var stage = this.getStage(); if(stage) { stage.content.removeChild(this.getCanvas()._canvas); if(this.index < stage.getChildren().length - 1) { stage.content.insertBefore(this.getCanvas()._canvas, stage.getChildren()[this.index + 1].getCanvas()._canvas); } else { stage.content.appendChild(this.getCanvas()._canvas); } } } }, // extend Node.prototype.moveDown moveDown: function() { if(Kinetic.Node.prototype.moveDown.call(this)) { var stage = this.getStage(); if(stage) { var children = stage.getChildren(); stage.content.removeChild(this.getCanvas()._canvas); stage.content.insertBefore(this.getCanvas()._canvas, children[this.index + 1].getCanvas()._canvas); } } }, // extend Node.prototype.moveToBottom moveToBottom: function() { if(Kinetic.Node.prototype.moveToBottom.call(this)) { var stage = this.getStage(); if(stage) { var children = stage.getChildren(); stage.content.removeChild(this.getCanvas()._canvas); stage.content.insertBefore(this.getCanvas()._canvas, children[1].getCanvas()._canvas); } } }, getLayer: function() { return this; }, remove: function() { var _canvas = this.getCanvas()._canvas; Kinetic.Node.prototype.remove.call(this); if(_canvas && _canvas.parentNode && Kinetic.Util._isInDocument(_canvas)) { _canvas.parentNode.removeChild(_canvas); } return this; }, getStage: function() { return this.parent; } }); Kinetic.Util.extend(Kinetic.BaseLayer, Kinetic.Container); // add getters and setters Kinetic.Factory.addGetterSetter(Kinetic.BaseLayer, 'clearBeforeDraw', true); /** * get/set clearBeforeDraw flag which determines if the layer is cleared or not * before drawing * @name clearBeforeDraw * @method * @memberof Kinetic.BaseLayer.prototype * @param {Boolean} clearBeforeDraw * @returns {Boolean} * @example * // get clearBeforeDraw flag
* var clearBeforeDraw = layer.clearBeforeDraw();

* * // disable clear before draw
* layer.clearBeforeDraw(false);

* * // enable clear before draw
* layer.clearBeforeDraw(true); */ Kinetic.Collection.mapMethods(Kinetic.BaseLayer); })(); ;(function() { // constants var HASH = '#', BEFORE_DRAW ='beforeDraw', DRAW = 'draw', /* * 2 - 3 - 4 * | | * 1 - 0 5 * | * 8 - 7 - 6 */ INTERSECTION_OFFSETS = [ {x: 0, y: 0}, // 0 {x: -1, y: 0}, // 1 {x: -1, y: -1}, // 2 {x: 0, y: -1}, // 3 {x: 1, y: -1}, // 4 {x: 1, y: 0}, // 5 {x: 1, y: 1}, // 6 {x: 0, y: 1}, // 7 {x: -1, y: 1} // 8 ], INTERSECTION_OFFSETS_LEN = INTERSECTION_OFFSETS.length; Kinetic.Util.addMethods(Kinetic.Layer, { ____init: function(config) { this.nodeType = 'Layer'; this.canvas = new Kinetic.SceneCanvas(); this.hitCanvas = new Kinetic.HitCanvas(); // call super constructor Kinetic.BaseLayer.call(this, config); }, _setCanvasSize: function(width, height) { this.canvas.setSize(width, height); this.hitCanvas.setSize(width, height); }, _validateAdd: function(child) { var type = child.getType(); if (type !== 'Group' && type !== 'Shape') { Kinetic.Util.error('You may only add groups and shapes to a layer.'); } }, /** * get visible intersection shape. This is the preferred * method for determining if a point intersects a shape or not * @method * @memberof Kinetic.Layer.prototype * @param {Object} pos * @param {Number} pos.x * @param {Number} pos.y * @returns {Kinetic.Shape} */ getIntersection: function(pos) { var obj, i, intersectionOffset, shape; if(this.hitGraphEnabled() && this.isVisible()) { for (i=0; i 0) { return { antialiased: true }; } // empty pixel else { return {}; } }, drawScene: function(can, top) { var layer = this.getLayer(), canvas = can || (layer && layer.getCanvas()); this._fire(BEFORE_DRAW, { node: this }); if(this.getClearBeforeDraw()) { canvas.getContext().clear(); } Kinetic.Container.prototype.drawScene.call(this, canvas, top); this._fire(DRAW, { node: this }); return this; }, // the apply transform method is handled by the Layer and FastLayer class // because it is up to the layer to decide if an absolute or relative transform // should be used _applyTransform: function(shape, context, top) { var m = shape.getAbsoluteTransform(top).getMatrix(); context.transform(m[0], m[1], m[2], m[3], m[4], m[5]); }, drawHit: function(can, top) { var layer = this.getLayer(), canvas = can || (layer && layer.hitCanvas); if(layer && layer.getClearBeforeDraw()) { layer.getHitCanvas().getContext().clear(); } Kinetic.Container.prototype.drawHit.call(this, canvas, top); return this; }, /** * clear scene and hit canvas contexts tied to the layer * @method * @memberof Kinetic.Layer.prototype * @param {Object} [bounds] * @param {Number} [bounds.x] * @param {Number} [bounds.y] * @param {Number} [bounds.width] * @param {Number} [bounds.height] * @example * layer.clear();
* layer.clear(0, 0, 100, 100); */ clear: function(bounds) { this.getContext().clear(bounds); this.getHitCanvas().getContext().clear(bounds); return this; }, // extend Node.prototype.setVisible setVisible: function(visible) { Kinetic.Node.prototype.setVisible.call(this, visible); if(visible) { this.getCanvas()._canvas.style.display = 'block'; this.hitCanvas._canvas.style.display = 'block'; } else { this.getCanvas()._canvas.style.display = 'none'; this.hitCanvas._canvas.style.display = 'none'; } return this; }, /** * enable hit graph * @name enableHitGraph * @method * @memberof Kinetic.Layer.prototype * @returns {Node} */ enableHitGraph: function() { this.setHitGraphEnabled(true); return this; }, /** * disable hit graph * @name enableHitGraph * @method * @memberof Kinetic.Layer.prototype * @returns {Node} */ disableHitGraph: function() { this.setHitGraphEnabled(false); return this; } }); Kinetic.Util.extend(Kinetic.Layer, Kinetic.BaseLayer); Kinetic.Factory.addGetterSetter(Kinetic.Layer, 'hitGraphEnabled', true); /** * get/set hitGraphEnabled flag. Disabling the hit graph will greatly increase * draw performance because the hit graph will not be redrawn each time the layer is * drawn. This, however, also disables mouse/touch event detection * @name hitGraphEnabled * @method * @memberof Kinetic.Layer.prototype * @param {Boolean} enabled * @returns {Boolean} * @example * // get hitGraphEnabled flag
* var hitGraphEnabled = layer.hitGraphEnabled();

* * // disable hit graph
* layer.hitGraphEnabled(false);

* * // enable hit graph
* layer.hitGraphEnabled(true); */ Kinetic.Collection.mapMethods(Kinetic.Layer); })(); ;(function() { // constants var HASH = '#', BEFORE_DRAW ='beforeDraw', DRAW = 'draw'; Kinetic.Util.addMethods(Kinetic.FastLayer, { ____init: function(config) { this.nodeType = 'Layer'; this.canvas = new Kinetic.SceneCanvas(); // call super constructor Kinetic.BaseLayer.call(this, config); }, _validateAdd: function(child) { var type = child.getType(); if (type !== 'Shape') { Kinetic.Util.error('You may only add shapes to a fast layer.'); } }, _setCanvasSize: function(width, height) { this.canvas.setSize(width, height); }, hitGraphEnabled: function() { return false; }, getIntersection: function() { return null; }, drawScene: function(can) { var layer = this.getLayer(), canvas = can || (layer && layer.getCanvas()); if(this.getClearBeforeDraw()) { canvas.getContext().clear(); } Kinetic.Container.prototype.drawScene.call(this, canvas); return this; }, // the apply transform method is handled by the Layer and FastLayer class // because it is up to the layer to decide if an absolute or relative transform // should be used _applyTransform: function(shape, context, top) { if (!top || top._id !== this._id) { var m = shape.getTransform().getMatrix(); context.transform(m[0], m[1], m[2], m[3], m[4], m[5]); } }, draw: function() { this.drawScene(); return this; }, /** * clear scene and hit canvas contexts tied to the layer * @method * @memberof Kinetic.FastLayer.prototype * @param {Object} [bounds] * @param {Number} [bounds.x] * @param {Number} [bounds.y] * @param {Number} [bounds.width] * @param {Number} [bounds.height] * @example * layer.clear();
* layer.clear(0, 0, 100, 100); */ clear: function(bounds) { this.getContext().clear(bounds); return this; }, // extend Node.prototype.setVisible setVisible: function(visible) { Kinetic.Node.prototype.setVisible.call(this, visible); if(visible) { this.getCanvas()._canvas.style.display = 'block'; } else { this.getCanvas()._canvas.style.display = 'none'; } return this; } }); Kinetic.Util.extend(Kinetic.FastLayer, Kinetic.BaseLayer); Kinetic.Collection.mapMethods(Kinetic.FastLayer); })(); ;(function() { Kinetic.Util.addMethods(Kinetic.Group, { ___init: function(config) { this.nodeType = 'Group'; // call super constructor Kinetic.Container.call(this, config); }, _validateAdd: function(child) { var type = child.getType(); if (type !== 'Group' && type !== 'Shape') { Kinetic.Util.error('You may only add groups and shapes to groups.'); } } }); Kinetic.Util.extend(Kinetic.Group, Kinetic.Container); Kinetic.Collection.mapMethods(Kinetic.Group); })(); ;(function() { /** * Rect constructor * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {Number} [config.cornerRadius] * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var rect = new Kinetic.Rect({
* width: 100,
* height: 50,
* fill: 'red',
* stroke: 'black',
* strokeWidth: 5
* }); */ Kinetic.Rect = function(config) { this.___init(config); }; Kinetic.Rect.prototype = { ___init: function(config) { Kinetic.Shape.call(this, config); this.className = 'Rect'; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var cornerRadius = this.getCornerRadius(), width = this.getWidth(), height = this.getHeight(); context.beginPath(); if(!cornerRadius) { // simple rect - don't bother doing all that complicated maths stuff. context.rect(0, 0, width, height); } else { // arcTo would be nicer, but browser support is patchy (Opera) context.moveTo(cornerRadius, 0); context.lineTo(width - cornerRadius, 0); context.arc(width - cornerRadius, cornerRadius, cornerRadius, Math.PI * 3 / 2, 0, false); context.lineTo(width, height - cornerRadius); context.arc(width - cornerRadius, height - cornerRadius, cornerRadius, 0, Math.PI / 2, false); context.lineTo(cornerRadius, height); context.arc(cornerRadius, height - cornerRadius, cornerRadius, Math.PI / 2, Math.PI, false); context.lineTo(0, cornerRadius); context.arc(cornerRadius, cornerRadius, cornerRadius, Math.PI, Math.PI * 3 / 2, false); } context.closePath(); context.fillStrokeShape(this); } }; Kinetic.Util.extend(Kinetic.Rect, Kinetic.Shape); Kinetic.Factory.addGetterSetter(Kinetic.Rect, 'cornerRadius', 0); /** * get/set corner radius * @name cornerRadius * @method * @memberof Kinetic.Rect.prototype * @param {Number} cornerRadius * @returns {Number} * @example * // get corner radius
* var cornerRadius = rect.cornerRadius();

* * // set corner radius
* rect.cornerRadius(10); */ Kinetic.Collection.mapMethods(Kinetic.Rect); })(); ;(function() { // the 0.0001 offset fixes a bug in Chrome 27 var PIx2 = (Math.PI * 2) - 0.0001, CIRCLE = 'Circle'; /** * Circle constructor * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {Number} config.radius * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * // create circle * var circle = new Kinetic.Circle({
* radius: 40,
* fill: 'red',
* stroke: 'black'
* strokeWidth: 5
* }); */ Kinetic.Circle = function(config) { this.___init(config); }; Kinetic.Circle.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = CIRCLE; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { context.beginPath(); context.arc(0, 0, this.getRadius(), 0, PIx2, false); context.closePath(); context.fillStrokeShape(this); }, // implements Shape.prototype.getWidth() getWidth: function() { return this.getRadius() * 2; }, // implements Shape.prototype.getHeight() getHeight: function() { return this.getRadius() * 2; }, // implements Shape.prototype.setWidth() setWidth: function(width) { Kinetic.Node.prototype.setWidth.call(this, width); this.setRadius(width / 2); }, // implements Shape.prototype.setHeight() setHeight: function(height) { Kinetic.Node.prototype.setHeight.call(this, height); this.setRadius(height / 2); } }; Kinetic.Util.extend(Kinetic.Circle, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Circle, 'radius', 0); /** * get/set radius * @name radius * @method * @memberof Kinetic.Circle.prototype * @param {Number} radius * @returns {Number} * @example * // get radius
* var radius = circle.radius();

* * // set radius
* circle.radius(10);
*/ Kinetic.Collection.mapMethods(Kinetic.Circle); })(); ;(function() { // the 0.0001 offset fixes a bug in Chrome 27 var PIx2 = (Math.PI * 2) - 0.0001, ELLIPSE = 'Ellipse'; /** * Ellipse constructor * @constructor * @augments Kinetic.Shape * @param {Object} config * @param {Object} config.radius defines x and y radius * @@ShapeParams * @@NodeParams * @example * var ellipse = new Kinetic.Ellipse({
* radius : {
* x : 50,
* y : 50
* },
* fill: 'red'
* }); */ Kinetic.Ellipse = function(config) { this.___init(config); }; Kinetic.Ellipse.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = ELLIPSE; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var r = this.getRadius(), rx = r.x, ry = r.y; context.beginPath(); context.save(); if(rx !== ry) { context.scale(1, ry / rx); } context.arc(0, 0, rx, 0, PIx2, false); context.restore(); context.closePath(); context.fillStrokeShape(this); }, // implements Shape.prototype.getWidth() getWidth: function() { return this.getRadius().x * 2; }, // implements Shape.prototype.getHeight() getHeight: function() { return this.getRadius().y * 2; }, // implements Shape.prototype.setWidth() setWidth: function(width) { Kinetic.Node.prototype.setWidth.call(this, width); this.setRadius({ x: width / 2 }); }, // implements Shape.prototype.setHeight() setHeight: function(height) { Kinetic.Node.prototype.setHeight.call(this, height); this.setRadius({ y: height / 2 }); } }; Kinetic.Util.extend(Kinetic.Ellipse, Kinetic.Shape); // add getters setters Kinetic.Factory.addComponentsGetterSetter(Kinetic.Ellipse, 'radius', ['x', 'y']); /** * get/set radius * @name radius * @method * @memberof Kinetic.Ellipse.prototype * @param {Object} radius * @param {Number} radius.x * @param {Number} radius.y * @returns {Object} * @example * // get radius
* var radius = ellipse.radius();

* * // set radius
* ellipse.radius({
* x: 200,
* y: 100
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Ellipse, 'radiusX', 0); /** * get/set radius x * @name radiusX * @method * @memberof Kinetic.Ellipse.prototype * @param {Number} x * @returns {Number} * @example * // get radius x
* var radiusX = ellipse.radiusX();

* * // set radius x
* ellipse.radiusX(200); */ Kinetic.Factory.addGetterSetter(Kinetic.Ellipse, 'radiusY', 0); /** * get/set radius y * @name radiusY * @method * @memberof Kinetic.Ellipse.prototype * @param {Number} y * @returns {Number} * @example * // get radius y
* var radiusY = ellipse.radiusY();

* * // set radius y
* ellipse.radiusY(200); */ Kinetic.Collection.mapMethods(Kinetic.Ellipse); })();;(function() { // the 0.0001 offset fixes a bug in Chrome 27 var PIx2 = (Math.PI * 2) - 0.0001; /** * Ring constructor * @constructor * @augments Kinetic.Shape * @param {Object} config * @param {Number} config.innerRadius * @param {Number} config.outerRadius * @param {Boolean} [config.clockwise] * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var ring = new Kinetic.Ring({
* innerRadius: 40,
* outerRadius: 80,
* fill: 'red',
* stroke: 'black',
* strokeWidth: 5
* }); */ Kinetic.Ring = function(config) { this.___init(config); }; Kinetic.Ring.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = 'Ring'; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { context.beginPath(); context.arc(0, 0, this.getInnerRadius(), 0, PIx2, false); context.moveTo(this.getOuterRadius(), 0); context.arc(0, 0, this.getOuterRadius(), PIx2, 0, true); context.closePath(); context.fillStrokeShape(this); }, // implements Shape.prototype.getWidth() getWidth: function() { return this.getOuterRadius() * 2; }, // implements Shape.prototype.getHeight() getHeight: function() { return this.getOuterRadius() * 2; }, // implements Shape.prototype.setWidth() setWidth: function(width) { Kinetic.Node.prototype.setWidth.call(this, width); this.setOuterRadius(width / 2); }, // implements Shape.prototype.setHeight() setHeight: function(height) { Kinetic.Node.prototype.setHeight.call(this, height); this.setOuterRadius(height / 2); } }; Kinetic.Util.extend(Kinetic.Ring, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Ring, 'innerRadius', 0); /** * get/set innerRadius * @name innerRadius * @method * @memberof Kinetic.Ring.prototype * @param {Number} innerRadius * @returns {Number} * @example * // get inner radius
* var innerRadius = ring.innerRadius();

* * // set inner radius
* ring.innerRadius(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Ring, 'outerRadius', 0); /** * get/set outerRadius * @name outerRadius * @method * @memberof Kinetic.Ring.prototype * @param {Number} outerRadius * @returns {Number} * @example * // get outer radius
* var outerRadius = ring.outerRadius();

* * // set outer radius
* ring.outerRadius(20); */ Kinetic.Collection.mapMethods(Kinetic.Ring); })(); ;(function() { /** * Wedge constructor * @constructor * @augments Kinetic.Shape * @param {Object} config * @param {Number} config.angle in degrees * @param {Number} config.radius * @param {Boolean} [config.clockwise] * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * // draw a wedge that's pointing downwards
* var wedge = new Kinetic.Wedge({
* radius: 40,
* fill: 'red',
* stroke: 'black'
* strokeWidth: 5,
* angleDeg: 60,
* rotationDeg: -120
* }); */ Kinetic.Wedge = function(config) { this.___init(config); }; Kinetic.Wedge.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = 'Wedge'; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { context.beginPath(); context.arc(0, 0, this.getRadius(), 0, Kinetic.getAngle(this.getAngle()), this.getClockwise()); context.lineTo(0, 0); context.closePath(); context.fillStrokeShape(this); } }; Kinetic.Util.extend(Kinetic.Wedge, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Wedge, 'radius', 0); /** * get/set radius * @name radius * @method * @memberof Kinetic.Wedge.prototype * @param {Number} radius * @returns {Number} * @example * // get radius
* var radius = wedge.radius();

* * // set radius
* wedge.radius(10);
*/ Kinetic.Factory.addGetterSetter(Kinetic.Wedge, 'angle', 0); /** * get/set angle in degrees * @name angle * @method * @memberof Kinetic.Wedge.prototype * @param {Number} angle * @returns {Number} * @example * // get angle
* var angle = wedge.angle();

* * // set angle
* wedge.angle(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Wedge, 'clockwise', false); /** * get/set clockwise flag * @name clockwise * @method * @memberof Kinetic.Wedge.prototype * @param {Number} clockwise * @returns {Number} * @example * // get clockwise flag
* var clockwise = wedge.clockwise();

* * // draw wedge counter-clockwise
* wedge.clockwise(false);

* * // draw wedge clockwise
* wedge.clockwise(true); */ Kinetic.Factory.backCompat(Kinetic.Wedge, { angleDeg: 'angle', getAngleDeg: 'getAngle', setAngleDeg: 'setAngle' }); Kinetic.Collection.mapMethods(Kinetic.Wedge); })(); ;(function() { var PI_OVER_180 = Math.PI / 180; /** * Arc constructor * @constructor * @augments Kinetic.Shape * @param {Object} config * @param {Number} config.angle in degrees * @param {Number} config.innerRadius * @param {Number} config.outerRadius * @param {Boolean} [config.clockwise] * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * // draw a Arc that's pointing downwards
* var arc = new Kinetic.Arc({
* innerRadius: 40,
* outerRadius: 80,
* fill: 'red',
* stroke: 'black'
* strokeWidth: 5,
* angle: 60,
* rotationDeg: -120
* }); */ Kinetic.Arc = function(config) { this.___init(config); }; Kinetic.Arc.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = 'Arc'; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var angle = Kinetic.getAngle(this.angle()), clockwise = this.clockwise(); context.beginPath(); context.arc(0, 0, this.getOuterRadius(), 0, angle, clockwise); context.arc(0, 0, this.getInnerRadius(), angle, 0, !clockwise); context.closePath(); context.fillStrokeShape(this); } }; Kinetic.Util.extend(Kinetic.Arc, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Arc, 'innerRadius', 0); /** * get/set innerRadius * @name innerRadius * @method * @memberof Kinetic.Arc.prototype * @param {Number} innerRadius * @returns {Number} * @example * // get inner radius * var innerRadius = arc.innerRadius(); * * // set inner radius * arc.innerRadius(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Arc, 'outerRadius', 0); /** * get/set outerRadius * @name outerRadius * @method * @memberof Kinetic.Arc.prototype * @param {Number} outerRadius * @returns {Number} * @example * // get outer radius
* var outerRadius = arc.outerRadius();

* * // set outer radius
* arc.outerRadius(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Arc, 'angle', 0); /** * get/set angle in degrees * @name angle * @method * @memberof Kinetic.Arc.prototype * @param {Number} angle * @returns {Number} * @example * // get angle
* var angle = arc.angle();

* * // set angle
* arc.angle(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Arc, 'clockwise', false); /** * get/set clockwise flag * @name clockwise * @method * @memberof Kinetic.Arc.prototype * @param {Boolean} clockwise * @returns {Boolean} * @example * // get clockwise flag
* var clockwise = arc.clockwise();

* * // draw arc counter-clockwise
* arc.clockwise(false);

* * // draw arc clockwise
* arc.clockwise(true); */ Kinetic.Collection.mapMethods(Kinetic.Arc); })(); ;(function() { // CONSTANTS var IMAGE = 'Image'; /** * Image constructor * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {ImageObject} config.image * @param {Object} [config.crop] * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var imageObj = new Image();
* imageObj.onload = function() {
* var image = new Kinetic.Image({
* x: 200,
* y: 50,
* image: imageObj,
* width: 100,
* height: 100
* });
* };
* imageObj.src = '/path/to/image.jpg' */ Kinetic.Image = function(config) { this.___init(config); }; Kinetic.Image.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = IMAGE; this.sceneFunc(this._sceneFunc); this.hitFunc(this._hitFunc); }, _useBufferCanvas: function() { return (this.hasShadow() || this.getAbsoluteOpacity() !== 1) && this.hasStroke(); }, _sceneFunc: function(context) { var width = this.getWidth(), height = this.getHeight(), image = this.getImage(), crop, cropWidth, cropHeight, params; if (image) { crop = this.getCrop(); cropWidth = crop.width; cropHeight = crop.height; if (cropWidth && cropHeight) { params = [image, crop.x, crop.y, cropWidth, cropHeight, 0, 0, width, height]; } else { params = [image, 0, 0, width, height]; } } context.beginPath(); context.rect(0, 0, width, height); context.closePath(); context.fillStrokeShape(this); if (image) { context.drawImage.apply(context, params); } }, _hitFunc: function(context) { var width = this.getWidth(), height = this.getHeight(); context.beginPath(); context.rect(0, 0, width, height); context.closePath(); context.fillStrokeShape(this); }, getWidth: function() { var image = this.getImage(); return this.attrs.width || (image ? image.width : 0); }, getHeight: function() { var image = this.getImage(); return this.attrs.height || (image ? image.height : 0); } }; Kinetic.Util.extend(Kinetic.Image, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Image, 'image'); /** * set image * @name setImage * @method * @memberof Kinetic.Image.prototype * @param {ImageObject} image */ /** * get image * @name getImage * @method * @memberof Kinetic.Image.prototype * @returns {ImageObject} */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Image, 'crop', ['x', 'y', 'width', 'height']); /** * get/set crop * @method * @name crop * @memberof Kinetic.Image.prototype * @param {Object} crop * @param {Number} crop.x * @param {Number} crop.y * @param {Number} crop.width * @param {Number} crop.height * @returns {Object} * @example * // get crop
* var crop = image.crop();

* * // set crop
* image.crop({
* x: 20,
* y: 20,
* width: 20,
* height: 20
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Image, 'cropX', 0); /** * get/set crop x * @method * @name cropX * @memberof Kinetic.Image.prototype * @param {Number} x * @returns {Number} * @example * // get crop x
* var cropX = image.cropX();

* * // set crop x
* image.cropX(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Image, 'cropY', 0); /** * get/set crop y * @name cropY * @method * @memberof Kinetic.Image.prototype * @param {Number} y * @returns {Number} * @example * // get crop y
* var cropY = image.cropY();

* * // set crop y
* image.cropY(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Image, 'cropWidth', 0); /** * get/set crop width * @name cropWidth * @method * @memberof Kinetic.Image.prototype * @param {Number} width * @returns {Number} * @example * // get crop width
* var cropWidth = image.cropWidth();

* * // set crop width
* image.cropWidth(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Image, 'cropHeight', 0); /** * get/set crop height * @name cropHeight * @method * @memberof Kinetic.Image.prototype * @param {Number} height * @returns {Number} * @example * // get crop height
* var cropHeight = image.cropHeight();

* * // set crop height
* image.cropHeight(20); */ Kinetic.Collection.mapMethods(Kinetic.Image); })(); ;(function() { // constants var AUTO = 'auto', //CANVAS = 'canvas', CENTER = 'center', CHANGE_KINETIC = 'Change.kinetic', CONTEXT_2D = '2d', DASH = '-', EMPTY_STRING = '', LEFT = 'left', TEXT = 'text', TEXT_UPPER = 'Text', MIDDLE = 'middle', NORMAL = 'normal', PX_SPACE = 'px ', SPACE = ' ', RIGHT = 'right', WORD = 'word', CHAR = 'char', NONE = 'none', ATTR_CHANGE_LIST = ['fontFamily', 'fontSize', 'fontStyle', 'fontVariant', 'padding', 'align', 'lineHeight', 'text', 'width', 'height', 'wrap'], // cached variables attrChangeListLen = ATTR_CHANGE_LIST.length, dummyContext = Kinetic.Util.createCanvasElement().getContext(CONTEXT_2D); /** * Text constructor * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {String} [config.fontFamily] default is Arial * @param {Number} [config.fontSize] in pixels. Default is 12 * @param {String} [config.fontStyle] can be normal, bold, or italic. Default is normal * @param {String} [config.fontVariant] can be normal or small-caps. Default is normal * @param {String} config.text * @param {String} [config.align] can be left, center, or right * @param {Number} [config.padding] * @param {Number} [config.width] default is auto * @param {Number} [config.height] default is auto * @param {Number} [config.lineHeight] default is 1 * @param {String} [config.wrap] can be word, char, or none. Default is word * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var text = new Kinetic.Text({
* x: 10,
* y: 15,
* text: 'Simple Text',
* fontSize: 30,
* fontFamily: 'Calibri',
* fill: 'green'
* }); */ Kinetic.Text = function(config) { this.___init(config); }; function _fillFunc(context) { context.fillText(this.partialText, 0, 0); } function _strokeFunc(context) { context.strokeText(this.partialText, 0, 0); } Kinetic.Text.prototype = { ___init: function(config) { var that = this; if (config.width === undefined) { config.width = AUTO; } if (config.height === undefined) { config.height = AUTO; } // call super constructor Kinetic.Shape.call(this, config); this._fillFunc = _fillFunc; this._strokeFunc = _strokeFunc; this.className = TEXT_UPPER; // update text data for certain attr changes for(var n = 0; n < attrChangeListLen; n++) { this.on(ATTR_CHANGE_LIST[n] + CHANGE_KINETIC, that._setTextData); } this._setTextData(); this.sceneFunc(this._sceneFunc); this.hitFunc(this._hitFunc); }, _sceneFunc: function(context) { var p = this.getPadding(), textHeight = this.getTextHeight(), lineHeightPx = this.getLineHeight() * textHeight, textArr = this.textArr, textArrLen = textArr.length, totalWidth = this.getWidth(), n; context.setAttr('font', this._getContextFont()); context.setAttr('textBaseline', MIDDLE); context.setAttr('textAlign', LEFT); context.save(); context.translate(p, 0); context.translate(0, p + textHeight / 2); // draw text lines for(n = 0; n < textArrLen; n++) { var obj = textArr[n], text = obj.text, width = obj.width; // horizontal alignment context.save(); if(this.getAlign() === RIGHT) { context.translate(totalWidth - width - p * 2, 0); } else if(this.getAlign() === CENTER) { context.translate((totalWidth - width - p * 2) / 2, 0); } this.partialText = text; context.fillStrokeShape(this); context.restore(); context.translate(0, lineHeightPx); } context.restore(); }, _hitFunc: function(context) { var width = this.getWidth(), height = this.getHeight(); context.beginPath(); context.rect(0, 0, width, height); context.closePath(); context.fillStrokeShape(this); }, setText: function(text) { var str = Kinetic.Util._isString(text) ? text : text.toString(); this._setAttr(TEXT, str); return this; }, /** * get width of text area, which includes padding * @method * @memberof Kinetic.Text.prototype * @returns {Number} */ getWidth: function() { return this.attrs.width === AUTO ? this.getTextWidth() + this.getPadding() * 2 : this.attrs.width; }, /** * get the height of the text area, which takes into account multi-line text, line heights, and padding * @method * @memberof Kinetic.Text.prototype * @returns {Number} */ getHeight: function() { return this.attrs.height === AUTO ? (this.getTextHeight() * this.textArr.length * this.getLineHeight()) + this.getPadding() * 2 : this.attrs.height; }, /** * get text width * @method * @memberof Kinetic.Text.prototype * @returns {Number} */ getTextWidth: function() { return this.textWidth; }, /** * get text height * @method * @memberof Kinetic.Text.prototype * @returns {Number} */ getTextHeight: function() { return this.textHeight; }, _getTextSize: function(text) { var _context = dummyContext, fontSize = this.getFontSize(), metrics; _context.save(); _context.font = this._getContextFont(); metrics = _context.measureText(text); _context.restore(); return { width: metrics.width, height: parseInt(fontSize, 10) }; }, _getContextFont: function() { return this.getFontStyle() + SPACE + this.getFontVariant() + SPACE + this.getFontSize() + PX_SPACE + this.getFontFamily(); }, _addTextLine: function (line, width) { return this.textArr.push({text: line, width: width}); }, _getTextWidth: function (text) { return dummyContext.measureText(text).width; }, _setTextData: function () { var lines = this.getText().split('\n'), fontSize = +this.getFontSize(), textWidth = 0, lineHeightPx = this.getLineHeight() * fontSize, width = this.attrs.width, height = this.attrs.height, fixedWidth = width !== AUTO, fixedHeight = height !== AUTO, padding = this.getPadding(), maxWidth = width - padding * 2, maxHeightPx = height - padding * 2, currentHeightPx = 0, wrap = this.getWrap(), shouldWrap = wrap !== NONE, wrapAtWord = wrap !== CHAR && shouldWrap; this.textArr = []; dummyContext.save(); dummyContext.font = this._getContextFont(); for (var i = 0, max = lines.length; i < max; ++i) { var line = lines[i], lineWidth = this._getTextWidth(line); if (fixedWidth && lineWidth > maxWidth) { /* * if width is fixed and line does not fit entirely * break the line into multiple fitting lines */ while (line.length > 0) { /* * use binary search to find the longest substring that * that would fit in the specified width */ var low = 0, high = line.length, match = '', matchWidth = 0; while (low < high) { var mid = (low + high) >>> 1, substr = line.slice(0, mid + 1), substrWidth = this._getTextWidth(substr); if (substrWidth <= maxWidth) { low = mid + 1; match = substr; matchWidth = substrWidth; } else { high = mid; } } /* * 'low' is now the index of the substring end * 'match' is the substring * 'matchWidth' is the substring width in px */ if (match) { // a fitting substring was found if (wrapAtWord) { // try to find a space or dash where wrapping could be done var wrapIndex = Math.max(match.lastIndexOf(SPACE), match.lastIndexOf(DASH)) + 1; if (wrapIndex > 0) { // re-cut the substring found at the space/dash position low = wrapIndex; match = match.slice(0, low); matchWidth = this._getTextWidth(match); } } this._addTextLine(match, matchWidth); textWidth = Math.max(textWidth, matchWidth); currentHeightPx += lineHeightPx; if (!shouldWrap || (fixedHeight && currentHeightPx + lineHeightPx > maxHeightPx)) { /* * stop wrapping if wrapping is disabled or if adding * one more line would overflow the fixed height */ break; } line = line.slice(low); if (line.length > 0) { // Check if the remaining text would fit on one line lineWidth = this._getTextWidth(line); if (lineWidth <= maxWidth) { // if it does, add the line and break out of the loop this._addTextLine(line, lineWidth); currentHeightPx += lineHeightPx; textWidth = Math.max(textWidth, lineWidth); break; } } } else { // not even one character could fit in the element, abort break; } } } else { // element width is automatically adjusted to max line width this._addTextLine(line, lineWidth); currentHeightPx += lineHeightPx; textWidth = Math.max(textWidth, lineWidth); } // if element height is fixed, abort if adding one more line would overflow if (fixedHeight && currentHeightPx + lineHeightPx > maxHeightPx) { break; } } dummyContext.restore(); this.textHeight = fontSize; this.textWidth = textWidth; } }; Kinetic.Util.extend(Kinetic.Text, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Text, 'fontFamily', 'Arial'); /** * get/set font family * @name fontFamily * @method * @memberof Kinetic.Text.prototype * @param {String} fontFamily * @returns {String} * @example * // get font family
* var fontFamily = text.fontFamily();


* * // set font family
* text.fontFamily('Arial'); */ Kinetic.Factory.addGetterSetter(Kinetic.Text, 'fontSize', 12); /** * get/set font size in pixels * @name fontSize * @method * @memberof Kinetic.Text.prototype * @param {Number} fontSize * @returns {Number} * @example * // get font size
* var fontSize = text.fontSize();

* * // set font size to 22px
* text.fontSize(22); */ Kinetic.Factory.addGetterSetter(Kinetic.Text, 'fontStyle', NORMAL); /** * set font style. Can be 'normal', 'italic', or 'bold'. 'normal' is the default. * @name fontStyle * @method * @memberof Kinetic.Text.prototype * @param {String} fontStyle * @returns {String} * @example * // get font style
* var fontStyle = text.fontStyle();

* * // set font style
* text.fontStyle('bold'); */ Kinetic.Factory.addGetterSetter(Kinetic.Text, 'fontVariant', NORMAL); /** * set font variant. Can be 'normal' or 'small-caps'. 'normal' is the default. * @name fontVariant * @method * @memberof Kinetic.Text.prototype * @param {String} fontVariant * @returns {String} * @example * // get font variant
* var fontVariant = text.fontVariant();

* * // set font variant
* text.fontVariant('small-caps'); */ Kinetic.Factory.addGetterSetter(Kinetic.Text, 'padding', 0); /** * set padding * @name padding * @method * @memberof Kinetic.Text.prototype * @param {Number} padding * @returns {Number} * @example * // get padding
* var padding = text.padding();

* * // set padding to 10 pixels
* text.padding(10); */ Kinetic.Factory.addGetterSetter(Kinetic.Text, 'align', LEFT); /** * get/set horizontal align of text. Can be 'left', 'center', or 'right' * @name align * @method * @memberof Kinetic.Text.prototype * @param {String} align * @returns {String} * @example * // get text align
* var align = text.align();

* * // center text
* text.align('center');

* * // align text to right
* text.align('right'); */ Kinetic.Factory.addGetterSetter(Kinetic.Text, 'lineHeight', 1); /** * get/set line height. The default is 1. * @name lineHeight * @method * @memberof Kinetic.Text.prototype * @param {Number} lineHeight * @returns {Number} * @example * // get line height
* var lineHeight = text.lineHeight();


* * // set the line height
* text.lineHeight(2); */ Kinetic.Factory.addGetterSetter(Kinetic.Text, 'wrap', WORD); /** * get/set wrap. Can be word, char, or none. Default is word. * @name wrap * @method * @memberof Kinetic.Text.prototype * @param {String} wrap * @returns {String} * @example * // get wrap
* var wrap = text.wrap();

* * // set wrap
* text.wrap('word'); */ Kinetic.Factory.addGetter(Kinetic.Text, 'text', EMPTY_STRING); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Text, 'text'); /** * get/set text * @name getText * @method * @memberof Kinetic.Text.prototype * @param {String} text * @returns {String} * @example * // get text
* var text = text.text();

* * // set text
* text.text('Hello world!'); */ Kinetic.Collection.mapMethods(Kinetic.Text); })(); ;(function() { /** * Line constructor.  Lines are defined by an array of points and * a tension * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {Array} config.points * @param {Number} [config.tension] Higher values will result in a more curvy line. A value of 0 will result in no interpolation. * The default is 0 * @param {Boolean} [config.closed] defines whether or not the line shape is closed, creating a polygon or blob * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var line = new Kinetic.Line({
* x: 100,
* y: 50,
* points: [73, 70, 340, 23, 450, 60, 500, 20],
* stroke: 'red',
* tension: 1
* }); */ Kinetic.Line = function(config) { this.___init(config); }; Kinetic.Line.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = 'Line'; this.on('pointsChange.kinetic tensionChange.kinetic closedChange.kinetic', function() { this._clearCache('tensionPoints'); }); this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var points = this.getPoints(), length = points.length, tension = this.getTension(), closed = this.getClosed(), tp, len, n; context.beginPath(); context.moveTo(points[0], points[1]); // tension if(tension !== 0 && length > 4) { tp = this.getTensionPoints(); len = tp.length; n = closed ? 0 : 4; if (!closed) { context.quadraticCurveTo(tp[0], tp[1], tp[2], tp[3]); } while(n < len - 2) { context.bezierCurveTo(tp[n++], tp[n++], tp[n++], tp[n++], tp[n++], tp[n++]); } if (!closed) { context.quadraticCurveTo(tp[len-2], tp[len-1], points[length-2], points[length-1]); } } // no tension else { for(n = 2; n < length; n+=2) { context.lineTo(points[n], points[n+1]); } } // closed e.g. polygons and blobs if (closed) { context.closePath(); context.fillStrokeShape(this); } // open e.g. lines and splines else { context.strokeShape(this); } }, getTensionPoints: function() { return this._getCache('tensionPoints', this._getTensionPoints); }, _getTensionPoints: function() { if (this.getClosed()) { return this._getTensionPointsClosed(); } else { return Kinetic.Util._expandPoints(this.getPoints(), this.getTension()); } }, _getTensionPointsClosed: function() { var p = this.getPoints(), len = p.length, tension = this.getTension(), util = Kinetic.Util, firstControlPoints = util._getControlPoints( p[len-2], p[len-1], p[0], p[1], p[2], p[3], tension ), lastControlPoints = util._getControlPoints( p[len-4], p[len-3], p[len-2], p[len-1], p[0], p[1], tension ), middle = Kinetic.Util._expandPoints(p, tension), tp = [ firstControlPoints[2], firstControlPoints[3] ] .concat(middle) .concat([ lastControlPoints[0], lastControlPoints[1], p[len-2], p[len-1], lastControlPoints[2], lastControlPoints[3], firstControlPoints[0], firstControlPoints[1], p[0], p[1] ]); return tp; } }; Kinetic.Util.extend(Kinetic.Line, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Line, 'closed', false); /** * get/set closed flag. The default is false * @name closed * @method * @memberof Kinetic.Line.prototype * @param {Boolean} closed * @returns {Boolean} * @example * // get closed flag
* var closed = line.closed();

* * // close the shape
* line.closed(true);

* * // open the shape
* line.closed(false); */ Kinetic.Factory.addGetterSetter(Kinetic.Line, 'tension', 0); /** * get/set tension * @name tension * @method * @memberof Kinetic.Line.prototype * @param {Number} Higher values will result in a more curvy line. A value of 0 will result in no interpolation. * The default is 0 * @returns {Number} * @example * // get tension
* var tension = line.tension();

* * // set tension
* line.tension(3); */ Kinetic.Factory.addGetterSetter(Kinetic.Line, 'points'); /** * get/set points array * @name points * @method * @memberof Kinetic.Line.prototype * @param {Array} points * @returns {Array} * @example * // get points
* var points = line.points();

* * // set points
* line.points([10, 20, 30, 40, 50, 60]);

* * // push a new point
* line.points(line.points().concat([70, 80])); */ Kinetic.Collection.mapMethods(Kinetic.Line); })();;(function() { /** * Sprite constructor * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {String} config.animation animation key * @param {Object} config.animations animation map * @param {Integer} [config.frameIndex] animation frame index * @param {Image} config.image image object * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var imageObj = new Image();
* imageObj.onload = function() {
* var sprite = new Kinetic.Sprite({
* x: 200,
* y: 100,
* image: imageObj,
* animation: 'standing',
* animations: {
* standing: [
* // x, y, width, height (6 frames)
* 0, 0, 49, 109,
* 52, 0, 49, 109,
* 105, 0, 49, 109,
* 158, 0, 49, 109,
* 210, 0, 49, 109,
* 262, 0, 49, 109
* ],
* kicking: [
* // x, y, width, height (6 frames)
* 0, 109, 45, 98,
* 45, 109, 45, 98,
* 95, 109, 63, 98,
* 156, 109, 70, 98,
* 229, 109, 60, 98,
* 287, 109, 41, 98
* ]
* },
* frameRate: 7,
* frameIndex: 0
* });
* };
* imageObj.src = '/path/to/image.jpg' */ Kinetic.Sprite = function(config) { this.___init(config); }; Kinetic.Sprite.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = 'Sprite'; this.anim = new Kinetic.Animation(); this.on('animationChange.kinetic', function() { // reset index when animation changes this.frameIndex(0); }); // smooth change for frameRate this.on('frameRateChange.kinetic', function() { if (!this.anim.isRunning()) { return; } clearInterval(this.interval); this._setInterval(); }); this.sceneFunc(this._sceneFunc); this.hitFunc(this._hitFunc); }, _sceneFunc: function(context) { var anim = this.getAnimation(), index = this.frameIndex(), ix4 = index * 4, set = this.getAnimations()[anim], x = set[ix4 + 0], y = set[ix4 + 1], width = set[ix4 + 2], height = set[ix4 + 3], image = this.getImage(); if(image) { context.drawImage(image, x, y, width, height, 0, 0, width, height); } }, _hitFunc: function(context) { var anim = this.getAnimation(), index = this.frameIndex(), ix4 = index * 4, set = this.getAnimations()[anim], width = set[ix4 + 2], height = set[ix4 + 3]; context.beginPath(); context.rect(0, 0, width, height); context.closePath(); context.fillShape(this); }, _useBufferCanvas: function() { return (this.hasShadow() || this.getAbsoluteOpacity() !== 1) && this.hasStroke(); }, _setInterval: function() { var that = this; this.interval = setInterval(function() { that._updateIndex(); }, 1000 / this.getFrameRate()); }, /** * start sprite animation * @method * @memberof Kinetic.Sprite.prototype */ start: function() { var layer = this.getLayer(); /* * animation object has no executable function because * the updates are done with a fixed FPS with the setInterval * below. The anim object only needs the layer reference for * redraw */ this.anim.setLayers(layer); this._setInterval(); this.anim.start(); }, /** * stop sprite animation * @method * @memberof Kinetic.Sprite.prototype */ stop: function() { this.anim.stop(); clearInterval(this.interval); }, /** * determine if animation of sprite is running or not. returns true or false * @method * @memberof Kinetic.Animation.prototype * @returns {Boolean} */ isRunning: function() { return this.anim.isRunning(); }, _updateIndex: function() { var index = this.frameIndex(), animation = this.getAnimation(), animations = this.getAnimations(), anim = animations[animation], len = anim.length / 4; if(index < len - 1) { this.frameIndex(index + 1); } else { this.frameIndex(0); } } }; Kinetic.Util.extend(Kinetic.Sprite, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Sprite, 'animation'); /** * get/set animation key * @name animation * @method * @memberof Kinetic.Sprite.prototype * @param {String} anim animation key * @returns {String} * @example * // get animation key
* var animation = sprite.animation();

* * // set animation key
* sprite.animation('kicking'); */ Kinetic.Factory.addGetterSetter(Kinetic.Sprite, 'animations'); /** * get/set animations map * @name animations * @method * @memberof Kinetic.Sprite.prototype * @param {Object} animations * @returns {Object} * @example * // get animations map
* var animations = sprite.animations();

* * // set animations map
* sprite.animations({
* standing: [
* // x, y, width, height (6 frames)
* 0, 0, 49, 109,
* 52, 0, 49, 109,
* 105, 0, 49, 109,
* 158, 0, 49, 109,
* 210, 0, 49, 109,
* 262, 0, 49, 109
* ],
* kicking: [
* // x, y, width, height (6 frames)
* 0, 109, 45, 98,
* 45, 109, 45, 98,
* 95, 109, 63, 98,
* 156, 109, 70, 98,
* 229, 109, 60, 98,
* 287, 109, 41, 98
* ]
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Sprite, 'image'); /** * get/set image * @name image * @method * @memberof Kinetic.Sprite.prototype * @param {Image} image * @returns {Image} * @example * // get image * var image = sprite.image();

* * // set image
* sprite.image(imageObj); */ Kinetic.Factory.addGetterSetter(Kinetic.Sprite, 'frameIndex', 0); /** * set/set animation frame index * @name frameIndex * @method * @memberof Kinetic.Sprite.prototype * @param {Integer} frameIndex * @returns {Integer} * @example * // get animation frame index
* var frameIndex = sprite.frameIndex();

* * // set animation frame index
* sprite.frameIndex(3); */ Kinetic.Factory.addGetterSetter(Kinetic.Sprite, 'frameRate', 17); /** * get/set frame rate in frames per second. Increase this number to make the sprite * animation run faster, and decrease the number to make the sprite animation run slower * The default is 17 frames per second * @name frameRate * @method * @memberof Kinetic.Sprite.prototype * @param {Integer} frameRate * @returns {Integer} * @example * // get frame rate
* var frameRate = sprite.frameRate();

* * // set frame rate to 2 frames per second
* sprite.frameRate(2); */ Kinetic.Factory.backCompat(Kinetic.Sprite, { index: 'frameIndex', getIndex: 'getFrameIndex', setIndex: 'setFrameIndex' }); Kinetic.Collection.mapMethods(Kinetic.Sprite); })(); ;(function () { /** * Path constructor. * @author Jason Follas * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {String} config.data SVG data string * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var path = new Kinetic.Path({
* x: 240,
* y: 40,
* data: 'M12.582,9.551C3.251,16.237,0.921,29.021,7.08,38.564l-2.36,1.689l4.893,2.262l4.893,2.262l-0.568-5.36l-0.567-5.359l-2.365,1.694c-4.657-7.375-2.83-17.185,4.352-22.33c7.451-5.338,17.817-3.625,23.156,3.824c5.337,7.449,3.625,17.813-3.821,23.152l2.857,3.988c9.617-6.893,11.827-20.277,4.935-29.896C35.591,4.87,22.204,2.658,12.582,9.551z',
* fill: 'green',
* scale: 2
* }); */ Kinetic.Path = function (config) { this.___init(config); }; Kinetic.Path.prototype = { ___init: function (config) { this.dataArray = []; var that = this; // call super constructor Kinetic.Shape.call(this, config); this.className = 'Path'; this.dataArray = Kinetic.Path.parsePathData(this.getData()); this.on('dataChange.kinetic', function () { that.dataArray = Kinetic.Path.parsePathData(this.getData()); }); this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var ca = this.dataArray, closedPath = false; // context position context.beginPath(); for (var n = 0; n < ca.length; n++) { var c = ca[n].command; var p = ca[n].points; switch (c) { case 'L': context.lineTo(p[0], p[1]); break; case 'M': context.moveTo(p[0], p[1]); break; case 'C': context.bezierCurveTo(p[0], p[1], p[2], p[3], p[4], p[5]); break; case 'Q': context.quadraticCurveTo(p[0], p[1], p[2], p[3]); break; case 'A': var cx = p[0], cy = p[1], rx = p[2], ry = p[3], theta = p[4], dTheta = p[5], psi = p[6], fs = p[7]; var r = (rx > ry) ? rx : ry; var scaleX = (rx > ry) ? 1 : rx / ry; var scaleY = (rx > ry) ? ry / rx : 1; context.translate(cx, cy); context.rotate(psi); context.scale(scaleX, scaleY); context.arc(0, 0, r, theta, theta + dTheta, 1 - fs); context.scale(1 / scaleX, 1 / scaleY); context.rotate(-psi); context.translate(-cx, -cy); break; case 'z': context.closePath(); closedPath = true; break; } } if (closedPath) { context.fillStrokeShape(this); } else { context.strokeShape(this); } } }; Kinetic.Util.extend(Kinetic.Path, Kinetic.Shape); Kinetic.Path.getLineLength = function(x1, y1, x2, y2) { return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); }; Kinetic.Path.getPointOnLine = function(dist, P1x, P1y, P2x, P2y, fromX, fromY) { if(fromX === undefined) { fromX = P1x; } if(fromY === undefined) { fromY = P1y; } var m = (P2y - P1y) / ((P2x - P1x) + 0.00000001); var run = Math.sqrt(dist * dist / (1 + m * m)); if(P2x < P1x) { run *= -1; } var rise = m * run; var pt; if (P2x === P1x) { // vertical line pt = { x: fromX, y: fromY + rise }; } else if((fromY - P1y) / ((fromX - P1x) + 0.00000001) === m) { pt = { x: fromX + run, y: fromY + rise }; } else { var ix, iy; var len = this.getLineLength(P1x, P1y, P2x, P2y); if(len < 0.00000001) { return undefined; } var u = (((fromX - P1x) * (P2x - P1x)) + ((fromY - P1y) * (P2y - P1y))); u = u / (len * len); ix = P1x + u * (P2x - P1x); iy = P1y + u * (P2y - P1y); var pRise = this.getLineLength(fromX, fromY, ix, iy); var pRun = Math.sqrt(dist * dist - pRise * pRise); run = Math.sqrt(pRun * pRun / (1 + m * m)); if(P2x < P1x) { run *= -1; } rise = m * run; pt = { x: ix + run, y: iy + rise }; } return pt; }; Kinetic.Path.getPointOnCubicBezier = function(pct, P1x, P1y, P2x, P2y, P3x, P3y, P4x, P4y) { function CB1(t) { return t * t * t; } function CB2(t) { return 3 * t * t * (1 - t); } function CB3(t) { return 3 * t * (1 - t) * (1 - t); } function CB4(t) { return (1 - t) * (1 - t) * (1 - t); } var x = P4x * CB1(pct) + P3x * CB2(pct) + P2x * CB3(pct) + P1x * CB4(pct); var y = P4y * CB1(pct) + P3y * CB2(pct) + P2y * CB3(pct) + P1y * CB4(pct); return { x: x, y: y }; }; Kinetic.Path.getPointOnQuadraticBezier = function(pct, P1x, P1y, P2x, P2y, P3x, P3y) { function QB1(t) { return t * t; } function QB2(t) { return 2 * t * (1 - t); } function QB3(t) { return (1 - t) * (1 - t); } var x = P3x * QB1(pct) + P2x * QB2(pct) + P1x * QB3(pct); var y = P3y * QB1(pct) + P2y * QB2(pct) + P1y * QB3(pct); return { x: x, y: y }; }; Kinetic.Path.getPointOnEllipticalArc = function(cx, cy, rx, ry, theta, psi) { var cosPsi = Math.cos(psi), sinPsi = Math.sin(psi); var pt = { x: rx * Math.cos(theta), y: ry * Math.sin(theta) }; return { x: cx + (pt.x * cosPsi - pt.y * sinPsi), y: cy + (pt.x * sinPsi + pt.y * cosPsi) }; }; /* * get parsed data array from the data * string. V, v, H, h, and l data are converted to * L data for the purpose of high performance Path * rendering */ Kinetic.Path.parsePathData = function(data) { // Path Data Segment must begin with a moveTo //m (x y)+ Relative moveTo (subsequent points are treated as lineTo) //M (x y)+ Absolute moveTo (subsequent points are treated as lineTo) //l (x y)+ Relative lineTo //L (x y)+ Absolute LineTo //h (x)+ Relative horizontal lineTo //H (x)+ Absolute horizontal lineTo //v (y)+ Relative vertical lineTo //V (y)+ Absolute vertical lineTo //z (closepath) //Z (closepath) //c (x1 y1 x2 y2 x y)+ Relative Bezier curve //C (x1 y1 x2 y2 x y)+ Absolute Bezier curve //q (x1 y1 x y)+ Relative Quadratic Bezier //Q (x1 y1 x y)+ Absolute Quadratic Bezier //t (x y)+ Shorthand/Smooth Relative Quadratic Bezier //T (x y)+ Shorthand/Smooth Absolute Quadratic Bezier //s (x2 y2 x y)+ Shorthand/Smooth Relative Bezier curve //S (x2 y2 x y)+ Shorthand/Smooth Absolute Bezier curve //a (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+ Relative Elliptical Arc //A (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+ Absolute Elliptical Arc // return early if data is not defined if(!data) { return []; } // command string var cs = data; // command chars var cc = ['m', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z', 'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A']; // convert white spaces to commas cs = cs.replace(new RegExp(' ', 'g'), ','); // create pipes so that we can split the data for(var n = 0; n < cc.length; n++) { cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]); } // create array var arr = cs.split('|'); var ca = []; // init context point var cpx = 0; var cpy = 0; for( n = 1; n < arr.length; n++) { var str = arr[n]; var c = str.charAt(0); str = str.slice(1); // remove ,- for consistency str = str.replace(new RegExp(',-', 'g'), '-'); // add commas so that it's easy to split str = str.replace(new RegExp('-', 'g'), ',-'); str = str.replace(new RegExp('e,-', 'g'), 'e-'); var p = str.split(','); if(p.length > 0 && p[0] === '') { p.shift(); } // convert strings to floats for(var i = 0; i < p.length; i++) { p[i] = parseFloat(p[i]); } while(p.length > 0) { if(isNaN(p[0])) {// case for a trailing comma before next command break; } var cmd = null; var points = []; var startX = cpx, startY = cpy; // Move var from within the switch to up here (jshint) var prevCmd, ctlPtx, ctlPty; // Ss, Tt var rx, ry, psi, fa, fs, x1, y1; // Aa // convert l, H, h, V, and v to L switch (c) { // Note: Keep the lineTo's above the moveTo's in this switch case 'l': cpx += p.shift(); cpy += p.shift(); cmd = 'L'; points.push(cpx, cpy); break; case 'L': cpx = p.shift(); cpy = p.shift(); points.push(cpx, cpy); break; // Note: lineTo handlers need to be above this point case 'm': var dx = p.shift(); var dy = p.shift(); cpx += dx; cpy += dy; cmd = 'M'; // After closing the path move the current position // to the the first point of the path (if any). if(ca.length>2 && ca[ca.length-1].command==='z'){ for(var idx=ca.length-2;idx>=0;idx--){ if(ca[idx].command==='M'){ cpx=ca[idx].points[0]+dx; cpy=ca[idx].points[1]+dy; break; } } } points.push(cpx, cpy); c = 'l'; // subsequent points are treated as relative lineTo break; case 'M': cpx = p.shift(); cpy = p.shift(); cmd = 'M'; points.push(cpx, cpy); c = 'L'; // subsequent points are treated as absolute lineTo break; case 'h': cpx += p.shift(); cmd = 'L'; points.push(cpx, cpy); break; case 'H': cpx = p.shift(); cmd = 'L'; points.push(cpx, cpy); break; case 'v': cpy += p.shift(); cmd = 'L'; points.push(cpx, cpy); break; case 'V': cpy = p.shift(); cmd = 'L'; points.push(cpx, cpy); break; case 'C': points.push(p.shift(), p.shift(), p.shift(), p.shift()); cpx = p.shift(); cpy = p.shift(); points.push(cpx, cpy); break; case 'c': points.push(cpx + p.shift(), cpy + p.shift(), cpx + p.shift(), cpy + p.shift()); cpx += p.shift(); cpy += p.shift(); cmd = 'C'; points.push(cpx, cpy); break; case 'S': ctlPtx = cpx; ctlPty = cpy; prevCmd = ca[ca.length - 1]; if(prevCmd.command === 'C') { ctlPtx = cpx + (cpx - prevCmd.points[2]); ctlPty = cpy + (cpy - prevCmd.points[3]); } points.push(ctlPtx, ctlPty, p.shift(), p.shift()); cpx = p.shift(); cpy = p.shift(); cmd = 'C'; points.push(cpx, cpy); break; case 's': ctlPtx = cpx; ctlPty = cpy; prevCmd = ca[ca.length - 1]; if(prevCmd.command === 'C') { ctlPtx = cpx + (cpx - prevCmd.points[2]); ctlPty = cpy + (cpy - prevCmd.points[3]); } points.push(ctlPtx, ctlPty, cpx + p.shift(), cpy + p.shift()); cpx += p.shift(); cpy += p.shift(); cmd = 'C'; points.push(cpx, cpy); break; case 'Q': points.push(p.shift(), p.shift()); cpx = p.shift(); cpy = p.shift(); points.push(cpx, cpy); break; case 'q': points.push(cpx + p.shift(), cpy + p.shift()); cpx += p.shift(); cpy += p.shift(); cmd = 'Q'; points.push(cpx, cpy); break; case 'T': ctlPtx = cpx; ctlPty = cpy; prevCmd = ca[ca.length - 1]; if(prevCmd.command === 'Q') { ctlPtx = cpx + (cpx - prevCmd.points[0]); ctlPty = cpy + (cpy - prevCmd.points[1]); } cpx = p.shift(); cpy = p.shift(); cmd = 'Q'; points.push(ctlPtx, ctlPty, cpx, cpy); break; case 't': ctlPtx = cpx; ctlPty = cpy; prevCmd = ca[ca.length - 1]; if(prevCmd.command === 'Q') { ctlPtx = cpx + (cpx - prevCmd.points[0]); ctlPty = cpy + (cpy - prevCmd.points[1]); } cpx += p.shift(); cpy += p.shift(); cmd = 'Q'; points.push(ctlPtx, ctlPty, cpx, cpy); break; case 'A': rx = p.shift(); ry = p.shift(); psi = p.shift(); fa = p.shift(); fs = p.shift(); x1 = cpx; y1 = cpy; cpx = p.shift(); cpy = p.shift(); cmd = 'A'; points = this.convertEndpointToCenterParameterization(x1, y1, cpx, cpy, fa, fs, rx, ry, psi); break; case 'a': rx = p.shift(); ry = p.shift(); psi = p.shift(); fa = p.shift(); fs = p.shift(); x1 = cpx; y1 = cpy; cpx += p.shift(); cpy += p.shift(); cmd = 'A'; points = this.convertEndpointToCenterParameterization(x1, y1, cpx, cpy, fa, fs, rx, ry, psi); break; } ca.push({ command: cmd || c, points: points, start: { x: startX, y: startY }, pathLength: this.calcLength(startX, startY, cmd || c, points) }); } if(c === 'z' || c === 'Z') { ca.push({ command: 'z', points: [], start: undefined, pathLength: 0 }); } } return ca; }; Kinetic.Path.calcLength = function(x, y, cmd, points) { var len, p1, p2, t; var path = Kinetic.Path; switch (cmd) { case 'L': return path.getLineLength(x, y, points[0], points[1]); case 'C': // Approximates by breaking curve into 100 line segments len = 0.0; p1 = path.getPointOnCubicBezier(0, x, y, points[0], points[1], points[2], points[3], points[4], points[5]); for( t = 0.01; t <= 1; t += 0.01) { p2 = path.getPointOnCubicBezier(t, x, y, points[0], points[1], points[2], points[3], points[4], points[5]); len += path.getLineLength(p1.x, p1.y, p2.x, p2.y); p1 = p2; } return len; case 'Q': // Approximates by breaking curve into 100 line segments len = 0.0; p1 = path.getPointOnQuadraticBezier(0, x, y, points[0], points[1], points[2], points[3]); for( t = 0.01; t <= 1; t += 0.01) { p2 = path.getPointOnQuadraticBezier(t, x, y, points[0], points[1], points[2], points[3]); len += path.getLineLength(p1.x, p1.y, p2.x, p2.y); p1 = p2; } return len; case 'A': // Approximates by breaking curve into line segments len = 0.0; var start = points[4]; // 4 = theta var dTheta = points[5]; // 5 = dTheta var end = points[4] + dTheta; var inc = Math.PI / 180.0; // 1 degree resolution if(Math.abs(start - end) < inc) { inc = Math.abs(start - end); } // Note: for purpose of calculating arc length, not going to worry about rotating X-axis by angle psi p1 = path.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], start, 0); if(dTheta < 0) {// clockwise for( t = start - inc; t > end; t -= inc) { p2 = path.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0); len += path.getLineLength(p1.x, p1.y, p2.x, p2.y); p1 = p2; } } else {// counter-clockwise for( t = start + inc; t < end; t += inc) { p2 = path.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0); len += path.getLineLength(p1.x, p1.y, p2.x, p2.y); p1 = p2; } } p2 = path.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], end, 0); len += path.getLineLength(p1.x, p1.y, p2.x, p2.y); return len; } return 0; }; Kinetic.Path.convertEndpointToCenterParameterization = function(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg) { // Derived from: http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes var psi = psiDeg * (Math.PI / 180.0); var xp = Math.cos(psi) * (x1 - x2) / 2.0 + Math.sin(psi) * (y1 - y2) / 2.0; var yp = -1 * Math.sin(psi) * (x1 - x2) / 2.0 + Math.cos(psi) * (y1 - y2) / 2.0; var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry); if(lambda > 1) { rx *= Math.sqrt(lambda); ry *= Math.sqrt(lambda); } var f = Math.sqrt((((rx * rx) * (ry * ry)) - ((rx * rx) * (yp * yp)) - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp) + (ry * ry) * (xp * xp))); if(fa === fs) { f *= -1; } if(isNaN(f)) { f = 0; } var cxp = f * rx * yp / ry; var cyp = f * -ry * xp / rx; var cx = (x1 + x2) / 2.0 + Math.cos(psi) * cxp - Math.sin(psi) * cyp; var cy = (y1 + y2) / 2.0 + Math.sin(psi) * cxp + Math.cos(psi) * cyp; var vMag = function(v) { return Math.sqrt(v[0] * v[0] + v[1] * v[1]); }; var vRatio = function(u, v) { return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)); }; var vAngle = function(u, v) { return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vRatio(u, v)); }; var theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]); var u = [(xp - cxp) / rx, (yp - cyp) / ry]; var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry]; var dTheta = vAngle(u, v); if(vRatio(u, v) <= -1) { dTheta = Math.PI; } if(vRatio(u, v) >= 1) { dTheta = 0; } if(fs === 0 && dTheta > 0) { dTheta = dTheta - 2 * Math.PI; } if(fs === 1 && dTheta < 0) { dTheta = dTheta + 2 * Math.PI; } return [cx, cy, rx, ry, theta, dTheta, psi, fs]; }; // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Path, 'data'); /** * set SVG path data string. This method * also automatically parses the data string * into a data array. Currently supported SVG data: * M, m, L, l, H, h, V, v, Q, q, T, t, C, c, S, s, A, a, Z, z * @name setData * @method * @memberof Kinetic.Path.prototype * @param {String} SVG path command string */ /** * get SVG path data string * @name getData * @method * @memberof Kinetic.Path.prototype */ Kinetic.Collection.mapMethods(Kinetic.Path); })(); ;(function() { var EMPTY_STRING = '', //CALIBRI = 'Calibri', NORMAL = 'normal'; /** * Path constructor. * @author Jason Follas * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {String} [config.fontFamily] default is Calibri * @param {Number} [config.fontSize] default is 12 * @param {String} [config.fontStyle] can be normal, bold, or italic. Default is normal * @param {String} [config.fontVariant] can be normal or small-caps. Default is normal * @param {String} config.text * @param {String} config.data SVG data string * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var textpath = new Kinetic.TextPath({
* x: 100,
* y: 50,
* fill: '#333',
* fontSize: '24',
* fontFamily: 'Arial',
* text: 'All the world\'s a stage, and all the men and women merely players.',
* data: 'M10,10 C0,0 10,150 100,100 S300,150 400,50'
* }); */ Kinetic.TextPath = function(config) { this.___init(config); }; function _fillFunc(context) { context.fillText(this.partialText, 0, 0); } function _strokeFunc(context) { context.strokeText(this.partialText, 0, 0); } Kinetic.TextPath.prototype = { ___init: function(config) { var that = this; this.dummyCanvas = Kinetic.Util.createCanvasElement(); this.dataArray = []; // call super constructor Kinetic.Shape.call(this, config); // overrides // TODO: shouldn't this be on the prototype? this._fillFunc = _fillFunc; this._strokeFunc = _strokeFunc; this._fillFuncHit = _fillFunc; this._strokeFuncHit = _strokeFunc; this.className = 'TextPath'; this.dataArray = Kinetic.Path.parsePathData(this.attrs.data); this.on('dataChange.kinetic', function() { that.dataArray = Kinetic.Path.parsePathData(this.attrs.data); }); // update text data for certain attr changes this.on('textChange.kinetic textStroke.kinetic textStrokeWidth.kinetic', that._setTextData); that._setTextData(); this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { context.setAttr('font', this._getContextFont()); context.setAttr('textBaseline', 'middle'); context.setAttr('textAlign', 'left'); context.save(); var glyphInfo = this.glyphInfo; for(var i = 0; i < glyphInfo.length; i++) { context.save(); var p0 = glyphInfo[i].p0; context.translate(p0.x, p0.y); context.rotate(glyphInfo[i].rotation); this.partialText = glyphInfo[i].text; context.fillStrokeShape(this); context.restore(); //// To assist with debugging visually, uncomment following // context.beginPath(); // if (i % 2) // context.strokeStyle = 'cyan'; // else // context.strokeStyle = 'green'; // var p1 = glyphInfo[i].p1; // context.moveTo(p0.x, p0.y); // context.lineTo(p1.x, p1.y); // context.stroke(); } context.restore(); }, /** * get text width in pixels * @method * @memberof Kinetic.TextPath.prototype */ getTextWidth: function() { return this.textWidth; }, /** * get text height in pixels * @method * @memberof Kinetic.TextPath.prototype */ getTextHeight: function() { return this.textHeight; }, /** * set text * @method * @memberof Kinetic.TextPath.prototype * @param {String} text */ setText: function(text) { Kinetic.Text.prototype.setText.call(this, text); }, _getTextSize: function(text) { var dummyCanvas = this.dummyCanvas; var _context = dummyCanvas.getContext('2d'); _context.save(); _context.font = this._getContextFont(); var metrics = _context.measureText(text); _context.restore(); return { width: metrics.width, height: parseInt(this.attrs.fontSize, 10) }; }, _setTextData: function() { var that = this; var size = this._getTextSize(this.attrs.text); this.textWidth = size.width; this.textHeight = size.height; this.glyphInfo = []; var charArr = this.attrs.text.split(''); var p0, p1, pathCmd; var pIndex = -1; var currentT = 0; var getNextPathSegment = function() { currentT = 0; var pathData = that.dataArray; for(var i = pIndex + 1; i < pathData.length; i++) { if(pathData[i].pathLength > 0) { pIndex = i; return pathData[i]; } else if(pathData[i].command == 'M') { p0 = { x: pathData[i].points[0], y: pathData[i].points[1] }; } } return {}; }; var findSegmentToFitCharacter = function(c) { var glyphWidth = that._getTextSize(c).width; var currLen = 0; var attempts = 0; p1 = undefined; while(Math.abs(glyphWidth - currLen) / glyphWidth > 0.01 && attempts < 25) { attempts++; var cumulativePathLength = currLen; while(pathCmd === undefined) { pathCmd = getNextPathSegment(); if(pathCmd && cumulativePathLength + pathCmd.pathLength < glyphWidth) { cumulativePathLength += pathCmd.pathLength; pathCmd = undefined; } } if(pathCmd === {} || p0 === undefined) { return undefined; } var needNewSegment = false; switch (pathCmd.command) { case 'L': if(Kinetic.Path.getLineLength(p0.x, p0.y, pathCmd.points[0], pathCmd.points[1]) > glyphWidth) { p1 = Kinetic.Path.getPointOnLine(glyphWidth, p0.x, p0.y, pathCmd.points[0], pathCmd.points[1], p0.x, p0.y); } else { pathCmd = undefined; } break; case 'A': var start = pathCmd.points[4]; // 4 = theta var dTheta = pathCmd.points[5]; // 5 = dTheta var end = pathCmd.points[4] + dTheta; if(currentT === 0){ currentT = start + 0.00000001; } // Just in case start is 0 else if(glyphWidth > currLen) { currentT += (Math.PI / 180.0) * dTheta / Math.abs(dTheta); } else { currentT -= Math.PI / 360.0 * dTheta / Math.abs(dTheta); } // Credit for bug fix: @therth https://github.com/ericdrowell/KineticJS/issues/249 // Old code failed to render text along arc of this path: "M 50 50 a 150 50 0 0 1 250 50 l 50 0" if(dTheta < 0 && currentT < end || dTheta >= 0 && currentT > end) { currentT = end; needNewSegment = true; } p1 = Kinetic.Path.getPointOnEllipticalArc(pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3], currentT, pathCmd.points[6]); break; case 'C': if(currentT === 0) { if(glyphWidth > pathCmd.pathLength) { currentT = 0.00000001; } else { currentT = glyphWidth / pathCmd.pathLength; } } else if(glyphWidth > currLen) { currentT += (glyphWidth - currLen) / pathCmd.pathLength; } else { currentT -= (currLen - glyphWidth) / pathCmd.pathLength; } if(currentT > 1.0) { currentT = 1.0; needNewSegment = true; } p1 = Kinetic.Path.getPointOnCubicBezier(currentT, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3], pathCmd.points[4], pathCmd.points[5]); break; case 'Q': if(currentT === 0) { currentT = glyphWidth / pathCmd.pathLength; } else if(glyphWidth > currLen) { currentT += (glyphWidth - currLen) / pathCmd.pathLength; } else { currentT -= (currLen - glyphWidth) / pathCmd.pathLength; } if(currentT > 1.0) { currentT = 1.0; needNewSegment = true; } p1 = Kinetic.Path.getPointOnQuadraticBezier(currentT, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3]); break; } if(p1 !== undefined) { currLen = Kinetic.Path.getLineLength(p0.x, p0.y, p1.x, p1.y); } if(needNewSegment) { needNewSegment = false; pathCmd = undefined; } } }; for(var i = 0; i < charArr.length; i++) { // Find p1 such that line segment between p0 and p1 is approx. width of glyph findSegmentToFitCharacter(charArr[i]); if(p0 === undefined || p1 === undefined) { break; } var width = Kinetic.Path.getLineLength(p0.x, p0.y, p1.x, p1.y); // Note: Since glyphs are rendered one at a time, any kerning pair data built into the font will not be used. // Can foresee having a rough pair table built in that the developer can override as needed. var kern = 0; // placeholder for future implementation var midpoint = Kinetic.Path.getPointOnLine(kern + width / 2.0, p0.x, p0.y, p1.x, p1.y); var rotation = Math.atan2((p1.y - p0.y), (p1.x - p0.x)); this.glyphInfo.push({ transposeX: midpoint.x, transposeY: midpoint.y, text: charArr[i], rotation: rotation, p0: p0, p1: p1 }); p0 = p1; } } }; // map TextPath methods to Text Kinetic.TextPath.prototype._getContextFont = Kinetic.Text.prototype._getContextFont; Kinetic.Util.extend(Kinetic.TextPath, Kinetic.Shape); // add setters and getters Kinetic.Factory.addGetterSetter(Kinetic.TextPath, 'fontFamily', 'Arial'); /** * set font family * @name setFontFamily * @method * @memberof Kinetic.TextPath.prototype * @param {String} fontFamily */ /** * get font family * @name getFontFamily * @method * @memberof Kinetic.TextPath.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.TextPath, 'fontSize', 12); /** * set font size * @name setFontSize * @method * @memberof Kinetic.TextPath.prototype * @param {int} fontSize */ /** * get font size * @name getFontSize * @method * @memberof Kinetic.TextPath.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.TextPath, 'fontStyle', NORMAL); /** * set font style. Can be 'normal', 'italic', or 'bold'. 'normal' is the default. * @name setFontStyle * @method * @memberof Kinetic.TextPath.prototype * @param {String} fontStyle */ /** * get font style * @name getFontStyle * @method * @memberof Kinetic.TextPath.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.TextPath, 'fontVariant', NORMAL); /** * set font variant. Can be 'normal' or 'small-caps'. 'normal' is the default. * @name setFontVariant * @method * @memberof Kinetic.TextPath.prototype * @param {String} fontVariant */ /** * @get font variant * @name getFontVariant * @method * @memberof Kinetic.TextPath.prototype */ Kinetic.Factory.addGetter(Kinetic.TextPath, 'text', EMPTY_STRING); /** * get text * @name getText * @method * @memberof Kinetic.TextPath.prototype */ Kinetic.Collection.mapMethods(Kinetic.TextPath); })(); ;(function() { /** * RegularPolygon constructor.  Examples include triangles, squares, pentagons, hexagons, etc. * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {Number} config.sides * @param {Number} config.radius * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var hexagon = new Kinetic.RegularPolygon({
* x: 100,
* y: 200,
* sides: 6,
* radius: 70,
* fill: 'red',
* stroke: 'black',
* strokeWidth: 4
* }); */ Kinetic.RegularPolygon = function(config) { this.___init(config); }; Kinetic.RegularPolygon.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = 'RegularPolygon'; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var sides = this.attrs.sides, radius = this.attrs.radius, n, x, y; context.beginPath(); context.moveTo(0, 0 - radius); for(n = 1; n < sides; n++) { x = radius * Math.sin(n * 2 * Math.PI / sides); y = -1 * radius * Math.cos(n * 2 * Math.PI / sides); context.lineTo(x, y); } context.closePath(); context.fillStrokeShape(this); } }; Kinetic.Util.extend(Kinetic.RegularPolygon, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.RegularPolygon, 'radius', 0); /** * set radius * @name setRadius * @method * @memberof Kinetic.RegularPolygon.prototype * @param {Number} radius */ /** * get radius * @name getRadius * @method * @memberof Kinetic.RegularPolygon.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.RegularPolygon, 'sides', 0); /** * set number of sides * @name setSides * @method * @memberof Kinetic.RegularPolygon.prototype * @param {int} sides */ /** * get number of sides * @name getSides * @method * @memberof Kinetic.RegularPolygon.prototype */ Kinetic.Collection.mapMethods(Kinetic.RegularPolygon); })(); ;(function() { /** * Star constructor * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {Integer} config.numPoints * @param {Number} config.innerRadius * @param {Number} config.outerRadius * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var star = new Kinetic.Star({
* x: 100,
* y: 200,
* numPoints: 5,
* innerRadius: 70,
* outerRadius: 70,
* fill: 'red',
* stroke: 'black',
* strokeWidth: 4
* }); */ Kinetic.Star = function(config) { this.___init(config); }; Kinetic.Star.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = 'Star'; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var innerRadius = this.innerRadius(), outerRadius = this.outerRadius(), numPoints = this.numPoints(); context.beginPath(); context.moveTo(0, 0 - outerRadius); for(var n = 1; n < numPoints * 2; n++) { var radius = n % 2 === 0 ? outerRadius : innerRadius; var x = radius * Math.sin(n * Math.PI / numPoints); var y = -1 * radius * Math.cos(n * Math.PI / numPoints); context.lineTo(x, y); } context.closePath(); context.fillStrokeShape(this); } }; Kinetic.Util.extend(Kinetic.Star, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Star, 'numPoints', 5); /** * set number of points * @name setNumPoints * @method * @memberof Kinetic.Star.prototype * @param {Integer} points */ /** * get number of points * @name getNumPoints * @method * @memberof Kinetic.Star.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.Star, 'innerRadius', 0); /** * set inner radius * @name setInnerRadius * @method * @memberof Kinetic.Star.prototype * @param {Number} radius */ /** * get inner radius * @name getInnerRadius * @method * @memberof Kinetic.Star.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.Star, 'outerRadius', 0); /** * set outer radius * @name setOuterRadius * @method * @memberof Kinetic.Star.prototype * @param {Number} radius */ /** * get outer radius * @name getOuterRadius * @method * @memberof Kinetic.Star.prototype */ Kinetic.Collection.mapMethods(Kinetic.Star); })(); ;(function() { // constants var ATTR_CHANGE_LIST = ['fontFamily', 'fontSize', 'fontStyle', 'padding', 'lineHeight', 'text'], CHANGE_KINETIC = 'Change.kinetic', NONE = 'none', UP = 'up', RIGHT = 'right', DOWN = 'down', LEFT = 'left', LABEL = 'Label', // cached variables attrChangeListLen = ATTR_CHANGE_LIST.length; /** * Label constructor.  Labels are groups that contain a Text and Tag shape * @constructor * @memberof Kinetic * @param {Object} config * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * // create label * var label = new Kinetic.Label({
* x: 100,
* y: 100,
* draggable: true
* });

* * // add a tag to the label
* label.add(new Kinetic.Tag({
* fill: '#bbb',
* stroke: '#333',
* shadowColor: 'black',
* shadowBlur: 10,
* shadowOffset: [10, 10],
* shadowOpacity: 0.2,
* lineJoin: 'round',
* pointerDirection: 'up',
* pointerWidth: 20,
* pointerHeight: 20,
* cornerRadius: 5
* }));

* * // add text to the label
* label.add(new Kinetic.Text({
* text: 'Hello World!',
* fontSize: 50,
* lineHeight: 1.2,
* padding: 10,
* fill: 'green'
* })); */ Kinetic.Label = function(config) { this.____init(config); }; Kinetic.Label.prototype = { ____init: function(config) { var that = this; this.className = LABEL; Kinetic.Group.call(this, config); this.on('add.kinetic', function(evt) { that._addListeners(evt.child); that._sync(); }); }, /** * get Text shape for the label. You need to access the Text shape in order to update * the text properties * @name getText * @method * @memberof Kinetic.Label.prototype */ getText: function() { return this.find('Text')[0]; }, /** * get Tag shape for the label. You need to access the Tag shape in order to update * the pointer properties and the corner radius * @name getTag * @method * @memberof Kinetic.Label.prototype */ getTag: function() { return this.find('Tag')[0]; }, _addListeners: function(text) { var that = this, n; var func = function(){ that._sync(); }; // update text data for certain attr changes for(n = 0; n < attrChangeListLen; n++) { text.on(ATTR_CHANGE_LIST[n] + CHANGE_KINETIC, func); } }, getWidth: function() { return this.getText().getWidth(); }, getHeight: function() { return this.getText().getHeight(); }, _sync: function() { var text = this.getText(), tag = this.getTag(), width, height, pointerDirection, pointerWidth, x, y, pointerHeight; if (text && tag) { width = text.getWidth(); height = text.getHeight(); pointerDirection = tag.getPointerDirection(); pointerWidth = tag.getPointerWidth(); pointerHeight = tag.getPointerHeight(); x = 0; y = 0; switch(pointerDirection) { case UP: x = width / 2; y = -1 * pointerHeight; break; case RIGHT: x = width + pointerWidth; y = height / 2; break; case DOWN: x = width / 2; y = height + pointerHeight; break; case LEFT: x = -1 * pointerWidth; y = height / 2; break; } tag.setAttrs({ x: -1 * x, y: -1 * y, width: width, height: height }); text.setAttrs({ x: -1 * x, y: -1 * y }); } } }; Kinetic.Util.extend(Kinetic.Label, Kinetic.Group); Kinetic.Collection.mapMethods(Kinetic.Label); /** * Tag constructor.  A Tag can be configured * to have a pointer element that points up, right, down, or left * @constructor * @memberof Kinetic * @param {Object} config * @param {String} [config.pointerDirection] can be up, right, down, left, or none; the default * is none. When a pointer is present, the positioning of the label is relative to the tip of the pointer. * @param {Number} [config.pointerWidth] * @param {Number} [config.pointerHeight] * @param {Number} [config.cornerRadius] */ Kinetic.Tag = function(config) { this.___init(config); }; Kinetic.Tag.prototype = { ___init: function(config) { Kinetic.Shape.call(this, config); this.className = 'Tag'; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var width = this.getWidth(), height = this.getHeight(), pointerDirection = this.getPointerDirection(), pointerWidth = this.getPointerWidth(), pointerHeight = this.getPointerHeight(); //cornerRadius = this.getCornerRadius(); context.beginPath(); context.moveTo(0,0); if (pointerDirection === UP) { context.lineTo((width - pointerWidth)/2, 0); context.lineTo(width/2, -1 * pointerHeight); context.lineTo((width + pointerWidth)/2, 0); } context.lineTo(width, 0); if (pointerDirection === RIGHT) { context.lineTo(width, (height - pointerHeight)/2); context.lineTo(width + pointerWidth, height/2); context.lineTo(width, (height + pointerHeight)/2); } context.lineTo(width, height); if (pointerDirection === DOWN) { context.lineTo((width + pointerWidth)/2, height); context.lineTo(width/2, height + pointerHeight); context.lineTo((width - pointerWidth)/2, height); } context.lineTo(0, height); if (pointerDirection === LEFT) { context.lineTo(0, (height + pointerHeight)/2); context.lineTo(-1 * pointerWidth, height/2); context.lineTo(0, (height - pointerHeight)/2); } context.closePath(); context.fillStrokeShape(this); } }; Kinetic.Util.extend(Kinetic.Tag, Kinetic.Shape); Kinetic.Factory.addGetterSetter(Kinetic.Tag, 'pointerDirection', NONE); /** * set pointer Direction * @name setPointerDirection * @method * @memberof Kinetic.Tag.prototype * @param {String} pointerDirection can be up, right, down, left, or none. The * default is none */ /** * get pointer Direction * @name getPointerDirection * @method * @memberof Kinetic.Tag.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.Tag, 'pointerWidth', 0); /** * set pointer width * @name setPointerWidth * @method * @memberof Kinetic.Tag.prototype * @param {Number} pointerWidth */ /** * get pointer width * @name getPointerWidth * @method * @memberof Kinetic.Tag.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.Tag, 'pointerHeight', 0); /** * set pointer height * @name setPointerHeight * @method * @memberof Kinetic.Tag.prototype * @param {Number} pointerHeight */ /** * get pointer height * @name getPointerHeight * @method * @memberof Kinetic.Tag.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.Tag, 'cornerRadius', 0); /** * set corner radius * @name setCornerRadius * @method * @memberof Kinetic.Tag.prototype * @param {Number} corner radius */ /** * get corner radius * @name getCornerRadius * @method * @memberof Kinetic.Tag.prototype */ Kinetic.Collection.mapMethods(Kinetic.Tag); })(); images-actives-html5.git/src/share/themes/game1clic/js/main.js000066400000000000000000000202551250410645000244720ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // @version=xxx /* * Main * Initialization * * 1rst layer : div "detect" - if clicked, enable canvas events * 2nd layer : bootstrap accordion * 3rd layer : div "canvas" containing images and paths * 4th layer : div "disablearea" - if clicked, disable events canvas */ function main(myhooks) { "use strict"; var that=window; that.canvas = document.getElementById("canvas"); // fix bug in retina and amoled screens Kinetic.pixelRatio = 1; Kinetic.Util.addMethods(Kinetic.Path,{ setIaObject: function(iaobject) { this.iaobject = iaobject; }, getIaObject: function() { return this.iaobject; } }); Kinetic.Util.addMethods(Kinetic.Image,{ setIaObject: function(iaobject) { this.iaobject = iaobject; }, getIaObject: function() { return this.iaobject; } }); Kinetic.Util.addMethods(Kinetic.Path,{ setXiaParent: function(xiaparent) { this.xiaparent = xiaparent; }, getXiaParent: function() { return this.xiaparent; } }); Kinetic.Util.addMethods(Kinetic.Image,{ setXiaParent: function(xiaparent) { this.xiaparent = xiaparent; }, getXiaParent: function() { return this.xiaparent; } }); // Load background image that.imageObj = new Image(); that.imageObj.src = scene.image; that.imageObj.onload = function() { var mainScene = new IaScene(scene.width,scene.height); mainScene.scale = 1; mainScene.scaleScene(mainScene); var stage = new Kinetic.Stage({ container: 'canvas', width: mainScene.width, height: mainScene.height }); stage.on("mouseout touchend", function(){ var shape = Kinetic.shapes[mainScene.currentShape]; if (typeof(shape) != "undefined") { mainScene.mouseout(shape); } mainScene.currentShape = ""; }); stage.on("click tap", function(){ mainScene.currentShape = ""; if ((mainScene.currentShape == "") || (typeof(mainScene.currentShape) == "undefined")) { var mousePos = this.getPointerPosition(); var imageDest = mainScene.completeImage.data; var position1 = 0; position1 = 4 * (Math.floor(mousePos.y) * Math.floor(mainScene.width) + Math.floor(mousePos.x)); mainScene.currentShape = "#" + Kinetic.Util._rgbToHex(imageDest[position1 + 0], imageDest[position1 + 1], imageDest[position1 + 2]); } var shape = Kinetic.shapes[mainScene.currentShape]; if (typeof(shape) != "undefined") { mainScene.click(shape); } }); stage.on("mousemove touchstart", function(){ var mousePos = this.getPointerPosition(); var imageDest = mainScene.completeImage.data; var position1 = 0; position1 = 4 * (Math.floor(mousePos.y) * Math.floor(mainScene.width) + Math.floor(mousePos.x)); var shape_id = Kinetic.Util._rgbToHex(imageDest[position1 + 0], imageDest[position1 + 1], imageDest[position1 + 2]); var shape = Kinetic.shapes["#" + shape_id]; if (typeof(shape) != "undefined") { if (shape.colorKey != mainScene.currentShape) { if (mainScene.currentShape != "") { var oldShape = Kinetic.shapes[mainScene.currentShape]; if (typeof(oldShape) != "undefined") { mainScene.mouseout(oldShape); } } mainScene.currentShape = shape.colorKey; mainScene.mouseover(shape); } } else { var shape = Kinetic.shapes[mainScene.currentShape]; if (typeof(shape) != "undefined") { mainScene.mouseout(shape); } mainScene.currentShape = ""; } }); // area containing image background var baseImage = new Kinetic.Image({ x: 0, y: mainScene.y, width: scene.width, height: scene.height, scale: {x:mainScene.coeff,y:mainScene.coeff}, image: that.imageObj }); var layers = []; that.layers = layers; layers[0] = new Kinetic.FastLayer(); layers[0].add(baseImage); stage.add(layers[0]); myhooks.beforeMainConstructor(mainScene, that.layers); var indice = 1; layers[indice] = new Kinetic.Layer(); stage.add(layers[indice]); for (var i in details) { var iaObj = new IaObject({ imageObj: that.imageObj, detail: details[i], layer: layers[indice], idText: "article-" + i, baseImage: baseImage, iaScene: mainScene, background_layer: layers[0], myhooks: myhooks }); } var hitCanvas = layers[indice].getHitCanvas(); mainScene.completeImage = hitCanvas.getContext().getImageData(0,0,Math.floor(hitCanvas.width),Math.floor(hitCanvas.height)); myhooks.afterMainConstructor(mainScene, that.layers); $("#splash").fadeOut("slow", function(){ $("#loader").hide(); }); var viewportHeight = $(window).height(); if (scene.description != "") { $("#rights").show(); var content_offset = $("#rights").offset(); var message_height = $("#popup_intro").css('height').substr(0,$("#popup_intro").css("height").length - 2); $("#popup_intro").css({'top':(viewportHeight - content_offset.top - message_height)/ 2 - 40}); $("#popup_intro").show(); $("#popup").hide(); $("#popup_close_intro").on("click", function(){ $("#rights").hide(); }); } // FullScreen ability // source code from http://blogs.sitepointstatic.com/examples/tech/full-screen/index.html var e = document.getElementById("title"); var div_container = document.getElementById("image-active"); e.onclick = function() { if (runPrefixMethod(document, "FullScreen") || runPrefixMethod(document, "IsFullScreen")) { runPrefixMethod(document, "CancelFullScreen"); } else { runPrefixMethod(div_container, "RequestFullScreen"); } mainScene.fullScreen = mainScene.fullScreen == "on" ? "off": "on"; }; var pfx = ["webkit", "moz", "ms", "o", ""]; function runPrefixMethod(obj, method) { var p = 0, m, t; while (p < pfx.length && !obj[m]) { m = method; if (pfx[p] === "") { m = m.substr(0,1).toLowerCase() + m.substr(1); } m = pfx[p] + m; t = typeof obj[m]; if (t != "undefined") { pfx = [pfx[p]]; return (t == "function" ? obj[m]() : obj[m]); } p++; } } }; } myhooks = new hooks(); launch = new main(myhooks); images-actives-html5.git/src/share/themes/game1clic/js/xiadetail.js000066400000000000000000000023461250410645000255130ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * */ function XiaDetail(detail, idText) { "use strict"; var that = this; this.click = "on"; this.title = detail.title; this.idText = idText; this.path = ""; this.kineticElement = null; this.persistent = ""; this.options = ""; this.backgroundImage = null; this.tooltip = null; if ((typeof(detail.options) !== 'undefined')) { this.options = detail.options; } if (this.options.indexOf("disable-click") !== -1) { this.click = "off"; } } images-actives-html5.git/src/share/themes/game1clic/js/xorcipher.js000066400000000000000000000115071250410645000255510ustar00rootroot00000000000000// XORCipher - Super simple encryption using XOR and Base64 // MODIFIED VERSION TO AVOID underscore dependancy // License : MIT // // As a warning, this is **not** a secure encryption algorythm. It uses a very // simplistic keystore and will be easy to crack. // // The Base64 algorythm is a modification of the one used in phpjs.org // * http://phpjs.org/functions/base64_encode/ // * http://phpjs.org/functions/base64_decode/ // // Examples // -------- // // XORCipher.encode("test", "foobar"); // => "EgocFhUX" // XORCipher.decode("test", "EgocFhUX"); // => "foobar" // /* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, strict:true, undef:true, unused:true, curly:true, browser:true, indent:2, maxerr:50 */ /* global _ */ (function(exports) { "use strict"; var XORCipher = { encode: function(key, data) { data = xor_encrypt(key, data); return b64_encode(data); }, decode: function(key, data) { data = b64_decode(data); return xor_decrypt(key, data); } }; var b64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; function b64_encode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, r, i = 0, enc = ""; if (!data) { return data; } do { o1 = data[i++]; o2 = data[i++]; o3 = data[i++]; bits = o1 << 16 | o2 << 8 | o3; h1 = bits >> 18 & 0x3f; h2 = bits >> 12 & 0x3f; h3 = bits >> 6 & 0x3f; h4 = bits & 0x3f; enc += b64_table.charAt(h1) + b64_table.charAt(h2) + b64_table.charAt(h3) + b64_table.charAt(h4); } while (i < data.length); r = data.length % 3; return (r ? enc.slice(0, r - 3) : enc) + "===".slice(r || 3); } function b64_decode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, result = []; if (!data) { return data; } data += ""; do { h1 = b64_table.indexOf(data.charAt(i++)); h2 = b64_table.indexOf(data.charAt(i++)); h3 = b64_table.indexOf(data.charAt(i++)); h4 = b64_table.indexOf(data.charAt(i++)); bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; o1 = bits >> 16 & 0xff; o2 = bits >> 8 & 0xff; o3 = bits & 0xff; result.push(o1); if (h3 !== 64) { result.push(o2); if (h4 !== 64) { result.push(o3); } } } while (i < data.length); return result; } function keyCharAt(key, i) { //return key.charCodeAt( Math.floor(i % key.length) ); return key.charCodeAt( i % key.length ); } function xor_encrypt(key, data) { /*return _.map(data, function(c, i) { return c.charCodeAt(0) ^ keyCharAt(key, i); });*/ var result = []; for (var indice in data) { result[indice] = data[indice].charCodeAt(0) ^ keyCharAt(key, indice); } return result; } function xor_decrypt(key, data) { /*return _.map(data, function(c, i) { return String.fromCharCode( c ^ keyCharAt(key, i) ); }).join("");*/ var result = []; for (var indice in data) { result[indice] = String.fromCharCode( data[indice] ^ keyCharAt(key, indice) ); } return result.join(""); } exports.XORCipher = XORCipher; })(this); String.prototype.decode = function(encoding) { var result = ""; var index = 0; var c = c1 = c2 = 0; while(index < this.length) { c = this.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); index++; } else if((c > 191) && (c < 224)) { c2 = this.charCodeAt(index + 1); result += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); index += 2; } else { c2 = this.charCodeAt(index + 1); c3 = this.charCodeAt(index + 2); result += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); index += 3; } } return result; }; String.prototype.encode = function(encoding) { var result = ""; var s = this.replace(/\r\n/g, "\n"); for(var index = 0; index < s.length; index++) { var c = s.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { result += String.fromCharCode((c >> 6) | 192); result += String.fromCharCode((c & 63) | 128); } else { result += String.fromCharCode((c >> 12) | 224); result += String.fromCharCode(((c >> 6) & 63) | 128); result += String.fromCharCode((c & 63) | 128); } } return result; };images-actives-html5.git/src/share/themes/game1clic/manifest.webapp000066400000000000000000000007001250410645000255730ustar00rootroot00000000000000{ "name": "XIA", "size" : define_package.zip_size_here, "version" : "1.0", "release_notes" : "generated with XIA", "launch_path": "/index.html", "package_path" : "http://my-webserver.com/package.zip", "developer": { "name": "Académie de Versailles" }, "icons": { "16": "/img/xia16.png", "48": "/img/xia48.png", "64": "/img/xia64.png", "128": "/img/xia128.png" } }images-actives-html5.git/src/share/themes/game1clic/sounds/000077500000000000000000000000001250410645000241035ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/game1clic/sounds/beep.mp3000066400000000000000000000612641250410645000254500ustar00rootroot00000000000000ID3MTIT2 beeps-18 1TPE1ThanTDRL2008TSSE Lavf53.21.1Xing(d"x %PEH5?(% "` O# "[........ ~..bn 4 19w7#b n{G>7\tDqqqqqw}?wwtqqwqs=@1c1cDwwwwtD~B8'(`> (|Ð|?PyOcP_`!S!LsR0 #0O\0 '   |P[  Ԡ = p0)+XbAZRdYȁ$fCj}sSGƊWڞ_I5S=~|I4 sŵY. ?JtsKCQg UuXA˵( %Zn*jh9{JFYi +` Lc\LrL̏ McMv /$IUyĂ;O]a)p@8%P(Y9C$ p\ `f`RffSF(-;Ȗ7&r>> Sb0,U>/+YE6NX氆W.~*󚙔T;WL{3w3Ղ#|n_>}I<>zB'gz  qSWvlqY fs6u3ځ0G&l^)Ŀ8QQJGTahgz6e[t=0y d(ȽFƪXA[!pPD#7 7{΍V=oLd.{\bY9,#\Yo[U +W]G_woUk7{[uUm:E11cU-?C #~z9$[ٽ {h{niVߨ  ![```eh&tfkXfod`{'2j\<>j.ndZc`D ` 1mÆ!-6_l]˥'/Y7&+s:z%/>Uh3..8*oz`/}M(;$k% Eeʻmg Xkl]Di'ěQTP$FX:HZNhM2valJy/ٌtoqHw3v[2F_2tV{%ʛ0 $Cm6-2 3#80u ,3p1 0dGIBWFp \ /x4y /7/3;46cQ+0p X4jZ6,5.kQ7۷p)">8hwWMm=C~WwQ1Du{sq?Vz.'Fd=?qv$O=uA;ս2;rs8EFҗyZ!V 808Lg w39 0 >LFX570 nxdaV[rc )`^@}){ Aecp 2|x"LP4XZ`ADi}Fxa&Gc 'bzaFa^&( K}-z'=wE._3fK4vźV6!nS铢rObj}8S=r TQnnwKkD/ $%<8ic*I/_Iptlde9?IOuT3]t/ n=}o=:6 Ko}XG(dQA02 #&u7 4 51#0P0a#12s1R2 'AxqCqA~֐Uڌ^S{K7} 11K=D~s]@⥐(THXRG)k^HP=>nԠ8w-$]$=`~m>x$gK]У67UvvSN8"X355>`,%44;-%"~:чzwj0raтs h0н4 ;G1@\7>410dE(K]P` &\XH"rkfaq0\{S óF"C:s &NNëNB HaF6`9uўvD2J+|u }'_k=^aU '=Lii<l$2DJ,$;bQ%?XL,<,fQ ZSM̺ؗW/^8HۻUtw*mI$E.uw81ȶ>gf,ۀ0|DtiD1 6Lm N=;LsZ +33GN2B?1Y…`<4"4=؈FMq3sdȓYB fDLV78ijbPdR`,tPk3AI2LI֓?KVN$1plR1'To64CPb'[(Хнg mDЕy xf7b|]Ƌ5)(AA4@4d .DhaVc0} ֻglZ]m~ս4 X" l  ,. Z"@Xc%f p`YAd 'PR$#\H)k Ahc 0AG *CJL&l'%ojK4D@X6h$<DmbGt䢋seNX:8]F; 1O`R헗>QQxtVaq XCo]1]Ռµ6[kj%:%ѕQb/E>WVZA$URVzon H& E!.E "ZqxWD5baD3޳0Z SbSfi|uJ9):X+,Y 7Ǿޅ0u4-5¼+L T P\AxЩL818\`IW/J橾s7Ffi5V4I@aڱ=;NFH1Pf|uZ ?%dDEP@J[$0Q;gx_c!A%I77.S]>}./vRajz҅dvqF3rV0%(LiMWdd()IG+u d2vr@7~-@ b,L/-N10JX5r00Ɓwf̮xw*g-x>3}W3-T:1ّݴJ=T3wyOFGMZg얥גwZ^miZBX[1:VTuP `4+Mh4Ҥ5{LE1JR[25m7}խ\U@\ m\ a.c,OB&zQ9yC#NnDlf5!30s1000 NfW f6Á1\Ġ"t"x =OyXo" X/RrWnkŚ6,]lIj GEhXD#hcCэR~ԕ骓B|.'&(Ëz|E)UMhQȸ }ڦݳ >̥GfkCydA&"a bIF$DF EdaA,XaHRa@c0iery-g.<}H3;JG4] A- r7z+7bh度FI :yG&d&RāXLW pmɐ'&yt3Mē`Ɣ!@)Q"ok-ڰ/EZJsr/8kP- E=ݓmn?z;3ow{ij|o6iT.G':kE`uKɚ N2 i !il|hYQI+ &Tɣ"KU~횺n$uEAjKgRM[Lx߷wܓr7];ӌzچ'a'I@ 02GLp I5p<Ф0X1W(d3wBrj Y!^Q "'x[j"8\%CP}'cO4RbN ?#UEaci+@2 yv,wdauDEBnG<7"5zvu : a$$c34„`h >Wf4YҹbȦ`%e$R-k\(51 ”k&ku]ҤG ÐJ2RayIc[*zyImQyzyv*f|oy| ߷k%I昇d'yiKr{i%^e L 0qx|10B *2PRQJɄ˕qBRBX1ƴ_3qqB|\3ϗO]3}|o*/۪8<")4w+#脹f\J"DEN@ɟ=ZujW+R4zvZ՛6LU;G6\GSUYZI^}"H2m6L! va,@ZxnFOtAiK{Z29rd+B9ϋ7؋j1%Iʦ71& @x$0vJiH|M$ nνE(;5u=GYUzB͆ԧnM("h2;Ifn6^*Y72Pк%IsP_ o R0z`Py%{lȽ`A*oE,~?ZS;UsᬵZJZy '*6ǣN {q@ek5 -m(dR>]@G1!G QL\1W̼#dH4374mYQSvd9yZKr~)H=^E`!&ǙxC02;g8VN._:9PnaV Zfzy$85ufӹA$E3Ar.K{7j"Df2R+ݣL TYvEÂAx\:6MPsIFѡIE\RT.Fc=Q+yƳT_֨/ǩzzb9u;H+Dsyɱ~f[5Ρ)>߂)rXEnh֠  mM<ѠK sq [m!m(LFpghb6F-)rPhXi.%mHqDtCiT#L,ccԠ*agv[(aa4Ԅhsљ9_QH$Dz @ Ąxs#H4II`$Y:'5c,&ƏJ ߵѐܿV<N4Khg=! jO'iiD6I CY?)nNaTž߉Ejv> zvkwɗʰ qRdN\£3rȘ%n Hc*⤗y6f"r`k r'ULCmiUkUh\e_cExȡmB+bllETZT6t<<ЍS{jvnAE\hɦ˜ʜ#VrbKҲyd_ŨQ/im╀07 bd0G0cdvRJRZ53CgZW Fݡ8~!P_k@–z>خ`K'=xط'v[\) p=A3ӽz3F`@J7..esZ+l~zǰ"Hu H/-"+0q.T-fdvY(%%"5vX,/Z;-;蠅^^u[e] {ugb:g˦ʎԄKMH",⩽E9rtmgVB(+x(UA>3qēWGwr,G~|:1kc9.@(eQŐX36 liI F(8$p6U"Zp>//0793djA MlX`1nO5mab %S ?3.t8a W!밫hQDjE& $] SB NХSm$G"|+AK,X}珚ࠔ %$MZҭ$0 сw+ 7k q:k8(?8%2OU̻3,]^-80Vmʬ&UneZtԭ:CBukmwQ:krIs5OgVcT%i46_jV.L|/ GùJ'c`"PKdKQXVšN2K$bjrtooFX:aCq=TZ?`i4ά; S۵'OqG* dܱaCh16K}RzȒ;V[zaZ؎&%6iwaRJt1l1Ln3(}`Aj4Ϙ{;o>/+Zn7ƺZ`I\\(LuKo4^AVX:Y^3KscZymdyv+>PH?-ddv@HKr @=n}ʗ-%0j"LR$,+0/3yx~>-&jD,Yc71i Ģ릯!cp@(ibABSɒS (lF.B UffcU41 ?ն$%檯JW4Yi;sɵAf JS=FO\\ȡZje Lv/2=rUv5RN+el"Y~q)}aEqOHKrfE';Yn\gz(OB|^0mBJ2^0JK0^gAQ#~3~ r8*g#?nI<5c#5&*ˢ̃;.f`lbgy ҔwJIr*M}ƈfļ<]{'>u.%\=:do#3rX`1)nOʄ0%Bۮ.5GFJT9Ôy *TS[q1#Bq.|fjLj PX=bLtuaKO6W@tM 2i*!.a7 o%UBǔm.縌ie j-19:{kI簬o\G֕vFe-~Ҿv6+vwU= Ỡd9ȩ㆜)LF^4L ڈOE8AOi&e#iStKl\WSo8.UnGsnxk|ƿ4c7|}E F0OjD[[,cf+#NL7  5$ǘd؇nA#3rˈu%niO+`ę *+*MI3%@ܱ5YJO v. !0,aZYHĀ^+- &N(8?󶜬yEe,Wt?S9Uוp^ TX $lWoE>@TԢRh/7ӳ׺ɮTE\Ynn^a)%-Y9Ca44FwS\\ F׾гFOm̃Ql>ۭiּn~U8E@IPc큑i=lC)$P2rmx~G=Ӭ[QJRe]Bu%dcĒHNM/_\'Ps FS?Ja@>.ei)˨~Ӌ.>Y"^݌!uܷ|뮳I6ٔ˛DJoa9DIDةrC@4B"/<8J}Y#9nZE%02H*]"^%i{Rdmb$<ܼ&SLݬyVi]o6^S6KOigmzf %b\BN"HZtDI4d쇴Ao &3rxU1n? %NG{6S-}:hF.WvpFk%}j2CQ`Bs^HF I2.ND,QVghk*ha#̯{l36<);,結X˷@Rt' qK^;N>[zO4<IĬ;(e "]xQ*3Hf/`ml'xnHE')c 6(ѐ9"d֍t) re'2ecR//;.Ws?/*0X\Cr X\% BCx\PoeYbpYh~5<,5gJ$^t#ڦܐW!=$!^/t#wELkYa[7OSk))K2:j+{r3g5Qۘ < |cO~kfo)(%,:VCs36QVS$Ysm>WLWskv(/EBH,02LmcrrbFkFB0UU)-DP3"XfS}3 3UpYUj%$Y&~9vTX%AozvHv#Ù8ْo14皂,Z̋i}Imf-$EluF һ&[+rB߲St Ikr]74wQc=1CF{˖ϵM nLF`nz(P 'd3u#3r,Hx%)nf*b %x=iykB Ca,ś;12γCHKVBΝU &(`G!QD9%HӛDE#̫qE EMOF&p$s 3D/Yhqĵ'^]g#Z<ǣ R1ap 88HڣkMJ7D)eBfNIu*:^iɝ˶JMn1KN񏍥L{\!?/.3J1"fwt`VO?.%L*7D~r8ZgR>+YJ=38vMd>qʛik Fa @q2$uG4AOm,ޕ*c_2q˥je%g&ag]2_rt N-T@ ["ܣQ -ot(+ kc{%E3 #gf7'S7:ͦ!'gtWjzۦ櫚s=v޻5漷|X.>ds L~lij#aDd⋳iB #rle%nOuʋ-%;g'u;vV"[萑z*<6$,H\]hdl4e5N܃U@jed*يG<ܭOn GTA@˃=:OU52ˢl+\?#e_U{!nr|q>qQ`){B43ˍ 9,0H1/@@HfP%i6I~vCf<qn)!,9!p@SBMBDESP 1Qn R ey?q8 3gVh?:|aJ:Yj0Offdu'D)Wjr1,߫`R#UE 7)1-ߓS9*oYTdP9ߏmgqu vܽ_C zж˻S1N6g%5+{]oh!8r%DdmA#3rKe1nN2!@1G@Ȁ(\ .=j"h $̼̜C+~kx%HeC!譭69$PeXZJS+сTW%ZseI)i] [g =3ޱ9lC;[so޶fjL]i1_K9%m0=rX'6DnGjEV""BJΏ.೘TJP۹{+b%v^e${Zک&&3t/˛2_eh7!K q 8CPp X*,$g˭ Jq9HsSq.:B&K;Ł[B"rBN>#81A&0$! 5oUcKahKt3k}m Y^:zk<_Vbwu٧OvyųL9˓>Is@Ю&Gb||gbXx^uU;i^Ugc)J &B9ΥYlV>&WU!F6$]n)djA%3r,P%nO%@1M3:sp"L& I(!yTы #e#lKDI!(N;NJŽ_ fZI2!uQJHTמ0G'%(*.CX0IAl4&DB׉I xusZi\N-C3kNBsZu⽶|Ղ{&󕟮0ߠC R , +z(#DCvQLNljà1{ϳzREvs?7PNMQ#c{iM5ڣn*ke>׾f8r{\fl&F=O'V!BK)h#CXt~W!*ES1Xy:HH*̒eDnB#T Ƿʤ[ Y-3sRYBB:8i$\I]yVQ0Sݧ,i![o k|<:~D@{CsLKHYFl!~x X0>?'ē%NH\A! Z'AOږsu[2_H־{ˌs$JvAx|J@CЬg2 Exd%Ό!-B!]N]O&E$k D<*]9B,u6FGbDHYx#J>!V v[/@ڛTcCK<cy~9\U~{~Zzr=uLo+#WGIn>͖!Y锂&Fd12WHs˨y@sH''Ʉ7Kׅ^#Mg]bz190λׂt(q|"ht~T[8?S :l˧UΑ 2GvIL k=lk}Cf@0i VrE )6F X85I'bF&,lƓb2eWTLFO 8ުF},ӓ#h4~*U8km;*w)L@Ԣ-f}Cq&vV&aOE%BdpA#3rh1nO0@G{89Xl8#..Kc~(^%׵QOF ͕Krϝ#Y3wT4*ĵRnj1ZɍmIid8\°hwpDG9. @p6L .6SE֝=BIJ`Gd S D5*i$ds tC?4Q`ל/XCP%K6mTFyYsk6"a_ Ͼ~.^rיCd+S?NPnPb́;5dpAc3rP1nO 1!@DZ͟&ތ`bTN>Q$\ObsG'5~e%G^|/@Z#XWQMSβf7[_XL= >aLUSwgAd56 Nst@'{5b U^gT.XZC}i2ǒdkGu*BOaUeƒZ(Z;>\Q$Й-u+ߋEw5gf77bۭS"~Uv"y۹x< 8쿬(YKBQNs6E"Fly maeU@|@@AeFs(( xɩ 5UqIwElHQWdt(gbQT*xb$1&y= rP7Lࠉa+T80 -FhC%ӔDq,v6eOjH/7I|X @H sdlU,vQDBmeULM\l@2H07"dRSN*&Bu`?.Fqكd$*c&97Ng4;U#d3ecrU1nNq  m߱!DZPM4+CMeL Gն+ᝍ"X'n m`l H9V$j Ltւ04 RE ԦͪNj"匜tvk +ER8m[ p #4a0Q)p:dg:|T*KvЌAڑM*KgQ 5S,[uaĈǖ`J"TۺOiiLF<}ZbM֘DԺؾ%g}Rޒ{Nيu/~V6ޣج8ؙ4&E::ۣ^z4L=ݒ{8rIg#|u%2ƮSwx#:ӭPƣY+^h0i]rw o4byVliD{,Z2R!QλV5ATM 2(TsC|,En|z))ӕIY@Ž[EJYZ)z$F"lqФh6q:XY(lQ$f͕ե⎐'dsXBkr Xu=nI k¹0+=:I<-I^BPJ93qr[jw)B6prbb,7V !aT,B螅w\ y4erAKUJtYGs.ߩ!C24SR7f:फ>bC)u;v!3 T|ѸR/05cbwU>tN.1QRPG ^G[ TO M㢛T,aOΜls:6AQ _s?V͙0)P 1 -~| L 0H#Œ5 hrMa% '+%f3&.щaP'OKR Vҫ2$ƒڌ "l3?"H\aS$'/y7~q`%Vd*mvwW2HÐ%{]AϤA,c1٩[ƭ]#sf:qsRQI ȸt\*cX@lj$xH6!sbfe$QA:lRցۙlb GgTr;;"訋*!b2 ⢄oHT2ďgP{LAME3.99.5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUimages-actives-html5.git/src/share/themes/game1clic/sounds/beep.ogg000066400000000000000000000453371250410645000255300ustar00rootroot00000000000000OggSs<vorbisDOggSsRaY<vorbis-Xiph.Org libVorbis I 20101101 (Schaufenugget)ENCODER=VLC media playervorbis)BCV"LĀАU7{Ƚ{G{{Gz{{˽s 4d)rBQ*ǽ0=Z!B= Y@!RH!RH!RH)b)b)s1 :褓PB )PJ*RJ-ZssA B!B!BBCV B!dB!RH!b)АU I˱%Q%2-R5S3=UTETUWU]]wmvmՖmVmvmVmYm۶m۶m۶m۶m۶m 4d #9#)")8d(8H%ifyg詞 xxgyxgyiiiiiiiiiiiiiii@h*@@qqqGr$ Y@R$r,Gs4s =9IA#U`AKEmW 1߇tB?oŇ]w6f, Kêm ;F "ah<5$I0@2)Q!A uv.l5ИZȬ1VJ+"t^cZt/ḱ Mz$VXP,$(T 1e a !pQΎ{d܍o Nh.ex9̣lHKv4Ŏ0V=e(`Kt\)4rzXbŲ}4ZӶUK% X"}oZA7vT2]rTg"}6jT*0+|92.Y8hvW}:=6\U hSN~ z`N'" d$QUUk5%SZkEDiEF&f-Yh`ѢeK6VUD2Z `kE{|foSgS>.ܛ)7llv5vk|gi~ Yԫ'~lغ '1KQLN\JՊl`t1V(A6E #}f"iCd=ҧm*n =/-Ј# %I ZTE U@,l[1LŠΈ@ JyUaY~*'#'t?_ϐM~N1#sM70_>|7|5sTwvfSm6d8PC'8MO g}7:=OB$` dB%FIUI:ʙ_U+}Ѝ;𕰞IY#:C|>`@s^m.Tk rsC tsJ3pNww3L1(XzHDLkۆm[vVvV[bj"B; @P<[&)Q5b&w8o3m0 ؆>V}fs?p:+>AgCn:T/sj-??|::ap~I!JA?9I] U[VL@Pl[PT # -l ahQ~Oy+5ks%41 S>=_=)*I604pA)ÿ(fz/.~goNra>ӛ:p8|fx/DkAAQ}(w!}Io?ūeMDzݟ^{HF2Ҹ~ @q4v[~017n#2J cxO~|>fddoQUѠA˫'۝O ~^0sYaU[vZ1Q)qHy9qAE#Fv`YYX CIA4 ; +` 2PT䤮UdNsv>sC!ϞsrgsM9=3̙w;4oL]m!uz |dɱ;T0-/ Jh 1`Gw2NVmLέ|3#uS_-|}3~$>!Os{y g2\= Ch^ ڌ-7-j KI2x98ߪB-P_x] ~ $x1N>Stڮ`4Kc!am.\1#~l.L"K/Hxg'22fWz^ ^u6bng;8Yjkb4ͷ?NZ}6 o_}Hlnc=sԇ#+gs&|BFؗߍ ^m.3ë@f>Rb7~O2*?@يزssBGm~t7 `t -fj!ijWòVU%zv F`q٭a8myv>,.sfj`'Zbaۖ m"Yf*Noup8<&Ά$as uw OI:Ib[9ɷٜ6|tu)vUd7/h'cׇL3 +P\;( `dgW;Х 6`[)DZoWXdJɘGM㞄[]B9_;;j~ b ^%Ixau12U C eS`9@n9rսUVB t}_x`DWŰcnfP`J0(CA`QKFwana-W 7/.x?_4_48ӿ잡sA &[p7ߛn/>0o=@LGj*6{:Cxw}y=O$d4p.g_ܛb^1÷9@_Mw0}qϡ7 ίgP kNSyޛ|5;sc `|ce_%@`^?-͗>Ȁ/cZom6`!×K%}Z.>s+ .@6VE\,[0a Ј OggSZsyTW>Eܘ%~hj}1d 7R/7A\h(\ۜE)eh*"i{p{ݝ/au-aiaXb4 rn -}" G%rc+&n$P~#+-۳E|?_U}#5OGׇA|77ԩC}4_} {9 _@Gӑl> 5bt|s~^^8Nrٓw՟]UȽur ~ؿdWڎ|} 3!XH¿``(r(_6 #Y G?>~?[2\("* |Ȁ%| }O >Yhd{U̮4-s"˧M[]-,Q̵Tk媪pM+ N>5ӟmBR Y2DLGa$U p Ue90nHȎE(gLZcϹ$ȹx-2I8$Og}=ow{f LWQ"`:}7aQ|o7.}G03: Pp>̹rIk g+LM~ ՜ݟdO5sN;͆ߦ8kjC$Zm c%X`@oI a!c`,Yz>``Y!?^c-Xg[,l ,>2-}PD&ϢD*xU$' WE ƾBPo9xRU%f4ryƶ݋ŨlOYgrmu/wQA_'Baw# ;‘Y:> қT2=yy/>lj*I\+.mcwjHr2$=^M-:}ozv }>{wcC/99}g->&Ϸ_>sol氧 pNs||o|]=̙ߦ~zNfm>{wP}7f+qWw`'Kퟄ 6`$}X KW}ۖ`㥂$cw~ے!}v , 1C=y6!,vX4^Elld F2&;P0 $uir,4XՋ/<ۧ(;Oq1~/9?8iOg1<]=pNvo6_a ÷]gNI>l6 [?E~|6 æi99|#?5=O齇]`|K _??ae, e}@%]dcK`!@0o̗$$Ba }3V x E^ELGSE0E3e @_kUUwq*^Ue eJF\^Ĝ8zPl=7u=UWNS4^L13tgC pT⏍w# 0| 0w! @Bl` _/€dw[' Xdh~Ec^xUWıFLcMP7 rCG cݫ{]5UUUQ @t?~6~9.Ϻ+?(yc()GqM%W\3r΂!&<sLSj=gsN9l;<ݛ{σy8\L0O:g?pz\QQ8_@v|:po >>qqtūPo.gg; 뗝fgt`tu9 zW'Շ $c˘06nE-_;eT->lXBd`Xl@1G-7 %,+03>ES|_09")/2+)8>xUV-D `W30ݛO?mO._dVV۽??Z/us]%s_.Gs1M `sqsen7}l|͇ &|=o{|w6͆v1_~93'9sz:a|8 oۧl${rNmjib9s>4a39 y+O\%q1{? 0. eY/@!QEv;2X IB6K,,K`M׶#n&o2n $IDswd^El= S*bSePn TlUTUQEM<===rGb,4]R`?k{_I71b2sS'4扯iSlηoη/hzMoshN6|q9f;o7_?l`MS]?'3'qvV proNΞ_=96gٰI6Onw}ϢsvqN_c$ w_Hp//076!@X|c϶B%mŲ󌞮Rkek}-`Y(܇:TlZ%x"|?yx_3?u47_}]_1毧_ݻ7;|+`w1131kyf`WL0x}f7P?9vrޛ/m>mw|r`SsN\i }z=`ϜgW}rH6[36ug>. ƾL[Eu Ӗ)H ْAdbrv+ <ui|8^ElSm,X`]ǣEG֪RUU+Z#~NǟY7BovH9MWt s<1qwk_M齿| /6_́vsߘy~]u߆ϦOg{{~u9';gO;av1a?{$_/uήCҹprN>p'99uhN}O2.O=s741s:/uw(u͹ڟٽr Ȁ/a~2/敢ȥ^*K|,XO܇z }lbXOm,aa$ _Ȫ@FJve͘ `,㴧o.'rέ^= Y7~S~=yhږ|?fχ_g7ް9g&&N3w.̯&η/߾6癯)9{ް7_/v}?4Ir8|_=w9lPg7so3_s"ԁ=TNA{_UĚ-Z8v)إg~OggSsVPSb[Z~EG" +b&|-Q8YUW*vOl*ƮcG;r7mw[?t./yizf.zv7 9olη++iߛ> [~8v9߿{~]99]pt33=f.f=og gϟCl8Mg|9>~%__;󽚘b&|~`j9'0o!,cac ]`@mf>3WF~ myF]U^S[`~l '_x@1iRܐ<#eqX>ev(Gk+*n0 ~.ZڤH-ӳ%t˟@KL3W_y>&al90C13p8to˙jss6pw8p8go43 {眳77w8zC¿49w7{Wy9 /sd|eRP!_;aćlZ`Yۈsrtwh$%}|Q{v .n?-%q1qMO^EAUqJX ǢCKܼApBJBH%|4]:nEk7Lˁ3vW]8;lNaf׿7}[OϞ&yy~[Þ.pkp`_tw7g`Þ!aL: ~{WGv}_bs]Ч.%_b*=>l497ާ3|0>sfW2}7Μg=t?Oio䆩*Z#Ų>-[Ac2$/I`f(` ]Z ` @jS[ykde lǣX:ӟx+JVO5g!?g?km#gM,֟a]ZƖO>}gvwb&+io؛7dsp~އ];_ s;Ο'>0g͜ Cfby>=ٜ=_ͷ{P u60 '|}]$Ɨ>1߅ph8tB6oĊ13E^R}VQK_2#jW{kL)v-Z_ϩ C^Els*b,]+>y. eWJ_VQEQο<]?MmYxpݯcz~ >ޛsoyݛzifj4ͼ䜳>G0ݽtK`oްޛ9{)/9o߾sΡC z Lu|ߜ};|a=io'>8y֯{>41sMz쓟1{>d:.j]Eqgv}ϩ:{i/j8~92]2mIF$l$-fl}l,cKF%AۀF?ixqz2P]4|b Xe4@*N{CQZk<ƻ8/((R1g|x%]w/ON?u_W3_{L\\__ӽk;ol8asϟ9DL /7r87ٙ0Ӑayٿ{?W޳|ol;3|o6쉂..i)f)`8Yq~xϟ{@e|-((oQ634qϦ˖3jY@V%@c-uX k2 E  \ѱPJxUV窊J}6rg-==88m3|KrFrqw>i&毹sr=7|zV:9 9L roki}8 7]|cW}6pfvlN||v95Vn@/iN}o쩳pr95( 6~ mAla@,[6WB`s IB` }$I˼Fwd|˝0|+֖ieL,d|$C9KPJGT*QUN0sl;kӃvt3<ׯ<}}i6:97u8|}f4sd}p7p9gg{8~:]NL\w7L{Wp彉iN|W]'7{_î>=a뚦y"u|0gSló:`ﯖlˁ tԺ7xXd! w6+|5[oФҟ#ճ!mJUt >00: EANYy_7pT8C({<^JkU ]wCrӳD؞PwSS洴?goo5M~O|81U1Գwtx s}5OSްC78eiWه}>~f겙Sso8?{f:7쯓P3~"f6:p'Wn:^1symg0?|7߾8ל>9un6Ϳ8gIQ_5t40J9 7fW7a7!/m̉Sױ7 'n6\6ϷDULyЮUl{2YvbA17 8U:TyTP}nET:~h_ws?goږ3O7ٲ=fy~oas7)ఙg& pGM\>MWw1O&zf;Mg6g3?i }}͡t_17lv}O` |21?E|o>pÆ= 9pr3࿟&&&}k["C[?#gY@B*<<2ϡ~H%c?.{#mIcmUT6M5RJsnV^EcɘRzI C UPWj*E/h:-g)gI??wX{}vJgu- _սi4S_ݝg{3=brϿsޜ{rll$ ͦ89z?]35ׇ{033~?__v>0!?|gurg9f{_ ,K?a/X'X.06$lO*DU }R}-,@/`#i0>OggSs4My \`be t5`P*8ut<^񪊳PUS7?s?ݝmA8[ru|齃:=#ph>&ӽiyޛ} lNg9w>7rO0L>)|v>p6og]{a E >?N|+r7ϙg^SMRsrkW=@gk3|={OgHIL5?B!`O|qQB|Ə_= :bFR (Vvڽ;'Qf^ESmJ?%]ֺ+Uw R'qmzC׶o`jpMw}}8'fr|=s7SߛMf20{<4}u4M>6٧a3~y7}? |y&  49T9kūns! 6$rl8vrq×:C~߆98c OL;6'zu9q1_|r_N>g˖@`% ? /}0~OƖl,ldxK`! e[cqu3=aLm5Ulgy'`d>t(c>*q<{^q)&CUJwx]5t#t˟7slgb:閴,=boi{_ttob=ݻ܃iv>pos{l}ͷszϞ |Ӱ̽i{P'ay`W=Ct9gS՜Or]sLf$|э WޝnUx]]O.|3L iFN4`2^hL/ZDeX 8^{`¡ / rt,Zl*HEUp ޝ\Nßv5{*{_믹w!:7}}=^ݝ{wL|}Ӝfη N~s`| |69out2{s~;{~pr4MW+ ?4zzu~zΞ;ԁ<C&D G?mn}H/c0!Bk?tFW #͚cHo".קG^rwl .OGi ESU:,pPT8xy~ǫ5UUZU жtsgK֖,vgtMU7ҷ)=ﯧi{!M5?]sf7>@}>4 ||{Lw/~]?33s^a66ٳ6g's?89ff_!{9?_c|owvџ: pW밁|c}Ao.ʁM}//I %`>2f ?X2 o'? @6/6XH[5_9l#mp?]OggSs6W=MIȭ8TgqڢB -#I'ɰD3 ZN;c+>! H,(J)9dBl зJ4k6o޸{mJHC{C5;`OXQQoY޾w÷15Y*85tPJ`p e3DӄQ>$&&bXe,.v&"ݤ[ XĄ8Zƣ^}bۅ#`A~igTYKFx,ztۭg4|eO< 59+J@98QIB(g j=eJDPxXV+R[d2BSwwqkrzr!gM\5e</ wf  E,ў?i:b-m|yd~7\YYc>v(KKuC5I}.^K +aMU1L=(){OcE)DQJDfhJMZu]*$X/MWW/_LaP ,=B]m'i Un8xE Sյo2h%< p1K4^.+DcI;"؊V,Ҍ:[KQEb\B (e*]\nX(\b"|@e֏)j1wȊ0 3MPd^Ⲥ!qamkމ#6O[ R@RuI4ibP,MeAFP _5IE*bNc/`~S ^b2𷌵GZME yI&->:~jUXs\Í̥ouvXX<{=_|m%8Gu{ޢ䵅aJKCITW'r/*ts  caḈ m>Hҁy)Sq+Av٬):9iu|;XweSU:łW`wޑ5q^Ux R3Ea<ͧKnJ."1ucPNrVYn9[M3JÚK7w$nOsXi@p݉tvI˲;5չZ$ѩDՌ'+؇Tvj9KwTΚHEE/Tה,u\8IQBN¤:4Zg|Bc,"dh)JE(?8̅_O]FI 9sb` J=TU}^lʡT.?muE^mN蓒5M230Ӵ/)<61REؓr|rn._=p=v_~3;[tߝOvv.ݨ-Y_/+U(ƓkǦN` (2 mXI$S4AGA%_cm ="=aUJ>?GA%VIo?UU8iQa2 0jn;DN3+(ёN%iȒ9A&Y\](2d#JUԲ5 XNh ^'N'2čK!@] ~7QuD)xrvh2Υ-&N! lW6('C3:<ϛ^ݪ;OY-sw'HL~壮jweUFGpć gpx|hQ)Fxl`cB $_" $4c𜐑 hl4Rr+'2rU6/ lNYɡ1⥻JP"K~zʤ9,!'!Ϥ)L:ۘGaI":Vc1y8>^6d!Y8C:IL5'\`+JoVr~8z6گH; cfVw l*3=jx[ Yث̍n(\7RD7ӡ L2iX$~.E75 9BaZ=aǽ-.K+5,h-"un,,g7B-5*3YWa2C|7M0z2%[,JI6TZN1+a',8,q/q=L@I B/2C(Lc* 1K<'xrU@FVV.LVZk*N!ʴuOXI*TGP,$c+z"`n DԈ TT=\KCdbL(i6p8:%C-Xg9 5E>i o܋{Zi FIҙA-8ѭ)ӭPd(6T) CLmMRz@հ, &[R2CitB D!eDaGqË 7ʯEAHWf4FDR>p_9Q Y VtzJQA7Rj3D ǜ6LEhBQ#D Jҕ+p#I aŸߤ2.&kB(@;>cr,<}$^V 5)Yf&C9SNu}2!)b@inja2"}tc'HR9C#9z?kTؗլ>4 ?&ѦN['[R3ℹzh4%Zz1 mS [L#0`+Q!姮4/TLf7Md 1 a R_>l\Q90 (?@nq,E(059Qw Eu BXQ/b_)X/M.*W."3:QTP]~ANL7N\ֆ4QF&5%JE) .HGq5<正eeVU3lO_gb+S-lfu bR~DK=]?TK5,Ϩkt\(aĞ,,io~bٮ7\nXcyiif+"%LAME3.99.5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUimages-actives-html5.git/src/share/themes/game1clic/sounds/toc.ogv000066400000000000000000000215761250410645000254200ustar00rootroot00000000000000OggS%ɑB3FLACfLaC"$ OggS%ɑ~C.* Lavf53.21.1encoder=Lavf53.21.1OggSc#%ɑ\$ZN溩ȴ9D[  . @1v `$@D $qij-[ ,pti8Lj~stk~3UQj `)DR-:,P{% F C,hY E2$x,@HGT,ue%Ti¾`[-%n@]C9@u{f=t(n]6"'cW=~%>șSnd 9Pu8tsVIuѲdd I bҩXH•HMlpW^vQMWʨw-?UPEvQL"t('Ʉ.ȡ-~QB&D }!`id(M@e7)mfx$Vц@2dr pdFtg˞t <M }x{{8E,X.L";8.`c+!9 mQK'(P;W:z 3sgހZʊw(WP;cX,JݺG>`DM Hp֦&;1cIjAKy} 0ܜŁ>D6{SGqoQ8-7p|*< =46Nԓ'\!?І؆kV_Wٕ̦,On&peՂyJ]}IC9εz .aoXQϠ1:o2v) nbYEpYV_Sv0\K]K:rU?Ņ1`oݚoF܄F߂"(kyl[ae0T+3[ʶ80sNmif)b64ςIMۄ>&%n5z;\'k*V'HȾYq7tAvEPʳHot1rF 2"]eR/J_'W.wf*]W*[ۧTL.N-]7-[:C1G"$y6ؠC'̫g Bž^hJ-lϳAŠEvWXVƌ4޼v#ߔI|w1=xX04X]ZE8n`;0Vq#S+񰻿nZRyژ+Hfi@5!c0Z:p/_ˡU%i*,N(ڭ @nSMFG`x˧1@!HuwoB{x'~֭>w z,JD<:¥2f5Ƿʰ:!߫jv4Cpj  5Q"QkMR~>b5Rwmo|C$x5S\(ahdӊS."dLަY9)/e ɳs`tܖjO-f =W/-_:q~H'HvEhҽ۸ZHw؞nVtmJ`g6j0n,PdviAc>@X:0Bf$R!o; 芄"B 8'q[&A}"3"9|23jg7L(5"r_erIWz~&aҞMFR%iQh,,TBB2\-D?cMf:㘓#'@,3[bkF I=g"}3\k<O'BfOv% GKYOA(szPȡnifHBJVsʅ8ݽ{!oߙdO2޲*8D LK/򂩯X uJDʒ#-A2Ž _KIZ"5Az!1(6蹢T§ I|3-P6( ك& ]'8Xɦe%^$OE)Ӎfeom"ئ mC[$kv&@-^g.Mlay"`FXdH\LDawQ^' tyKymq2H#GkNb鐗Bf9 ]pL0m~e N3 ѵRPK[%N$ŵ Dj펆RL D:+LT ̠RCJ5'bnmhu&ܹ_sc2??8ڦ2";|\RFW؜>"زu]B{^qVlP  ġ8cKTN?grqηdH#M_[V`gPJԞ/~~%/enz)ˉЯX9//b9>v0lzOwHNP۝$Dj\IlU[0S4c6%հU65`*[( b<ij&g: YZgLm< byڏŧ%ǑFZ`*I;wj 0#Lľ (t%NJ4E&ӎb1Q<8KS_( )Vwj0l+͞XVuF*x%Y4a&t}}2Tmj*$2Qu?ATLF\&b8s9P挚C%A*KG-B%sSˑQÊ.gAT7JyWwSz?d vzR"yw~c4ZdHq^ĻFTB.h~hf>#>l$Y{#`זKEu-v~98GQ^/,VbDجpUJ& P9/ Ѳ[Kq}?hbљDy|~MII^wOgD4~0}aK;4i̕{L]Jƾ$rE V"c2U!kȪ}G#eګ!ƫ ggC3y:G>ll]QK]%Qmѷ*P2GDmdsLŽ& FɕI࿔#i I23FFAT#=33o\T7r >={{B 4y$u.7)'ޫRmM E2Jɴ2Y*ǀ/.ب*_čf Bk˘꫘I&i`Db2&%޽ }mA+DAdJ-^!~ U!IPEJzY> c'P/M0ix}SQŒhav!ql/S#[ jXBrK(D8f/2К"= IA PB ?r=$gB,+z~RTd efU ~5bű6%1=%qZ#1tj`CrQ}*qD80gobZv8~21+B}:d^j8{k M؝߉- lTf\vD1.wQVJ59[mq B*.אPZGUGk m)b L!BrQt&1&7"/W(\)bXNjX!=R6BFԄH8}=$L$DNe_Q{1$܋Ȱ+sۓi^ PHd"AeIebaŖ =4--UPLKbwaO— 7ȓRrOKL$XAUwqE)dMY?g;ifK?2]H1je9FTj "Wϊlˆ{ v'V@;IIU=B_# ab@4Q q0qC](28/V^QG6tb/#Y([k7X3XA-=J߈K#"KQ g#تċPwo3Iɼz,>_\T{tF_,إfq-ۏS-A24~#Z3_ϵc&ךj%9tZCVnԴ1Yfd/<& 1f!S,AT)&@Hy)8aԬ9`oj1QbGkE#(2<8j:HiՈ5K[eh\)!b8\4h"K$vSq@CBeY* |N〾եN[ _3@ `uaϭٖ4 l$'d\؅LEk^j*"w'q|C!\u!_OY !dKmgVYJ.b$iDbF g>X7U5eg"^D2-c 2dInDUHE) F\Rhp.2zbL,<:.|7τ-24  (B@@۰xc L P8h9@<$HPxh4РB %````O(H OGeˠc <$ 8PFOx nDH nAp8;Pxz`$\L X `)c@y I( $,IIaqI , $Lj`$$ WF s4,h(`%"PJOa5`Bfō 2}U( $r@$BwH`п@,@$ZHXp@@1<h*F@) ha@C( 8@@n G@ama1AavH43,ke4 1zHm| G!@ 8x|`4H!Xvh=@Ŝ qDhSEu>*ӈ \D[@,$ = ,&C<`  P3 '81bN~R'1n!pE8! 8qyrB9# 4P XF~n ]$ F 'mZW" `So8`Am x֣( o hX{|haC3„0BF J,g g `G$HdÊ[!ʒ8IH/f,-CaYP z銘6-mĵK(÷إF r$#Ev(Ê yj>)IDp('$Ps!pzab(4GkЄE49'X5)QhC 6p%[2*. HtK!ܚ0Ye@c585Dz@NI'LiFBZ ,,k*C?nҁKd?jJAжlyäDHQ18(t4I2S"x!fCiP 2SK֡519'Ԯ+tc)רG鐯H0Nξ$q4!c‹,XTN* 91M ,4$G\e { MoOCɧ9Aei"NbPZ`Wq/߫+i">tE[&d4DhԔ>PbJT,oiK\MwW0&c*bWxWj"LAҩ"I mjJ+_;Z&;';7[63s3Pjɘ"Q 3|J:kݻK׿Mzhڹ[u+[ PZXHr;*]cy;2D\&gd(%<$ %NT MI:,rH2θQ*Ie-ѕym+dm^"E(c)-K"\Bw_~+ nj랋cpfeV;kj+}5

{{TITLE}}

{{CONTENT}}

{{TITLE}}

{{CONTENT}}

{{TITLE}}

{{CONTENT}}

{{TITLE}}

 

{{TITLE}}

Bravo ! Voyons si tu te débrouilles aussi bien avec le jeu suivant : [http://jeusuivant.com Passer au jeu numéro 2] images-actives-html5.git/src/share/themes/gameDragAndDrop/css/000077500000000000000000000000001250410645000245125ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/gameDragAndDrop/css/main.css000066400000000000000000000206211250410645000261510ustar00rootroot00000000000000/*fonts*/ @font-face { font-family: 'yanone_regular'; src: url('../font/yanonekaffeesatz-regular-webfont.eot'); src: url('../font/yanonekaffeesatz-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../font/yanonekaffeesatz-regular-webfont.woff') format('woff'), url('../font/yanonekaffeesatz-regular-webfont.svg#yanone_kaffeesatzregular') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'yanone_thin'; src: url('../font/yanonekaffeesatz-thin-webfont.eot'); src: url('../font/yanonekaffeesatz-thin-webfont.eot?#iefix') format('embedded-opentype'), url('../font/yanonekaffeesatz-thin-webfont.woff') format('woff'), url('../font/yanonekaffeesatz-thin-webfont.svg#yanone_kaffeesatzthin') format('svg'); font-weight: normal; font-style: normal; } /*fin de font*/ /* override Wahid */ html { margin:0; padding:0; background: rgb(255,170,41); /* Old browsers */ background: -moz-linear-gradient(45deg, rgba(255,170,41,1) 0%, rgba(255,170,41,1) 50%, rgba(232,127,9,1) 50%, rgba(232,127,9,1) 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left bottom, right top, color-stop(0%,rgba(255,170,41,1)), color-stop(50%,rgba(255,170,41,1)), color-stop(50%,rgba(232,127,9,1)), color-stop(100%,rgba(232,127,9,1))); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(45deg, rgba(255,170,41,1) 0%,rgba(255,170,41,1) 50%,rgba(232,127,9,1) 50%,rgba(232,127,9,1) 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(45deg, rgba(255,170,41,1) 0%,rgba(255,170,41,1) 50%,rgba(232,127,9,1) 50%,rgba(232,127,9,1) 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(45deg, rgba(255,170,41,1) 0%,rgba(255,170,41,1) 50%,rgba(232,127,9,1) 50%,rgba(232,127,9,1) 100%); /* IE10+ */ background: linear-gradient(45deg, rgba(255,170,41,1) 0%,rgba(255,170,41,1) 50%,rgba(232,127,9,1) 50%,rgba(232,127,9,1) 100%); /* W3C */ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffaa29', endColorstr='#e87f09',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */ /*background: url('../img/background.jpg') no-repeat center center fixed; background-size: cover;*/ } body{ background: none; margin:0; border:none; padding:0px; border-image-width: 0; } video { width:100%; } audio { width:100%; } a { color:#00c6ff; font-family: yanone_thin; font-size:1.4em; } a:active, a:focus, a:hover {color:#DDD;} header { width:100%; padding:0; margin:0 auto; } header h1 { margin:0; top:0; left:0px; display:inline; padding: 0px 1em 0 5px; margin-bottom:0; color:white; font-family: yanone_thin; font-size: 1.5em; } .eyes { background:url(../img/eyes.png) center bottom no-repeat; padding:.3em 1em; } .eyes:hover { background:url(../img/eyes2.png) center bottom no-repeat; } .meta-doc { background:url(../img/meta-doc.png) center bottom no-repeat; padding:.3em 1em } .meta-doc:hover{ background:url(../img/meta-doc2.png) center bottom no-repeat; } .infos { background:url(../img/infos.png) center bottom no-repeat; padding:.3em 1em; } .infos:hover{ background:url(../img/infos2.png) center bottom no-repeat; } .title-document {display: block;} @media screen and (max-width: 640px) { body { font-size:0.7em; } h1 { font-size:20px; } } #detect, #canvas { margin:0; padding:0; } #container { position: relative; padding:0px; width:100%; margin:10px auto; border:0px solid #FFF3B2; border-image-width: 0; } #canvas { width:55%; margin-top: 10px; border:10px solid rgba(255,255,255,0.3); } #detect { position:absolute; /*top:50px;*/ left:0; width:100%; height:655px; } .response { display:none; } .unlock { width: 80%; margin:0px auto; } .unlock input[type="submit"]{ background-image: url(../img/unlock-icon.png) ; background-repeat: no-repeat; width: 40px; height: 40px; border:0px; background-color:transparent; } .unlock input[type="text"]{ padding: 10px; margin:10px; background-color: #ffec64; border:0px; box-shadow: inset 0px 0px 5px #ffab23; } .button { -moz-box-shadow: 0px 1px 0px 0px #fff6af; -webkit-box-shadow: 0px 1px 0px 0px #fff6af; box-shadow: 0px 1px 0px 0px #fff6af; background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffec64), color-stop(1, #ffab23)); background:-moz-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-webkit-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-o-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-ms-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:linear-gradient(to bottom, #ffec64 5%, #ffab23 100%); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffec64', endColorstr='#ffab23',GradientType=0); background-color:#ffec64; -moz-border-radius:6px; -webkit-border-radius:6px; border-radius:6px; border:1px solid #ffaa22; display:inline-block; cursor:pointer; color:#333333; font-family:arial; font-size:15px; font-weight:bold; padding:6px 24px; text-decoration:none; text-shadow:0px 1px 0px #ffee66; } .button:hover { background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffab23), color-stop(1, #ffec64)); background:-moz-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-webkit-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-o-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-ms-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:linear-gradient(to bottom, #ffab23 5%, #ffec64 100%); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffab23', endColorstr='#ffec64',GradientType=0); background-color:#ffab23; } .button:active { position:relative; top:1px; } /* popup */ .overlay { position:fixed; top:0; right:0; left:0; bottom:0; background: rgba(0,0,0,0.6); } #popup { z-index:200; position:relative; border-radius: 20px; border: 20px solid #ddd; width: 60%; margin: 50px auto; background:white; min-height: 100px; box-shadow: black 5px 5px 10px; } #popup_intro { z-index:200; position:relative; border-radius: 20px; border: 20px solid #ddd; width: 40%; margin: 0px auto; background:white; min-height: 100px; box-shadow: black 5px 5px 10px; padding:10px; font-family: yanone_thin; font-size: 2em; text-align:center; } #content article { display:none; z-index:100; position:absolute; border: 0px solid #ddd; border-radius:0px; width: 100%; margin: 0px auto; background:rgba(255,255,255,0); box-shadow: none; overflow-y: auto; overflow-x: hidden; } .message_success_border { position:relative; width:60%; border: 20px solid #ddd; border-radius:20px; margin: 20px auto; background:rgba(255,255,255,1); box-shadow: black 5px 5px 10px; padding:10px; font-family: yanone_thin; font-size: 2em; } #content article p, h1 { margin: 10px; } #content article h1 { font-family: yanone_thin; } .article_close { z-index:200; display: none; cursor: pointer; position:absolute; top:0px; height:40px; text-align:center; } #popup_text { text-align:center; } #popup_text img{ float:left; width:20%; max-width: 60px; margin: 10px; } #content #message_success { overflow-x:visible; overflow-y:visible; } #popup_close, #popup_close_intro, #popup_toggle { cursor: pointer; position:absolute; top:-40px; right:-40px; width:50px; } #loader { position:fixed; display: table; text-align:center; width:100%; height:100%; top:0; right:0; left:0; bottom:0; background: black; z-index:1000; } #loader div{ font-family: yanone_thin, Arial; font-size: 2em; display:table-cell; vertical-align: middle; color:white; } .videoWrapper16_9 { position: relative; padding-bottom: 56.25%; padding-top: 5px; height: 0; } .videoWrapper4_3 { position: relative; padding-bottom: 75%; padding-top: 5px; height: 0; } .videoWrapper16_9 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .videoWrapper4_3 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }images-actives-html5.git/src/share/themes/gameDragAndDrop/datas/000077500000000000000000000000001250410645000250165ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/gameDragAndDrop/datas/README.md000066400000000000000000000001221250410645000262700ustar00rootroot00000000000000# JSON datas This folder contains data.js file where paths and images are stored images-actives-html5.git/src/share/themes/gameDragAndDrop/deploy.html000066400000000000000000000006441250410645000261100ustar00rootroot00000000000000

XIA installation package

images-actives-html5.git/src/share/themes/gameDragAndDrop/font/000077500000000000000000000000001250410645000246705ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/gameDragAndDrop/font/README.md000066400000000000000000000000301250410645000261400ustar00rootroot00000000000000fonts used by this themeimages-actives-html5.git/src/share/themes/gameDragAndDrop/hook.py000066400000000000000000000213501250410645000252350ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # # @author : pascal.fautrero@crdp.ac-versailles.fr # dom manipulation from xml.dom import minidom import re import gettext import locale class hook: """do some stuff during image active generations""" def __init__(self, root, iaobject, PageFormatter, langPath): """Init""" try: t = gettext.translation("xia-converter", langPath, languages=[locale.getdefaultlocale()[0]]) except: t = gettext.translation("xia-converter", langPath, languages=['en_US']) translate = t.ugettext self.root = root self.iaobject = iaobject self.PageFormatter = PageFormatter self.tooltip = translate("export gameDragAndDrop") self.score = "0" self.collisions = "off" self.message = translate("You win !") self.loading = translate("loading") def generateIndex(self,filePath, templatePath): """ generate index file""" self.score = "0" self.collisions = "off" self.magnet = "off" score = re.search('(.*)', self.iaobject.scene["intro_detail"], re.IGNORECASE|re.DOTALL) if score: self.score = score.group(1) message = re.search('(.*)', self.iaobject.scene["intro_detail"], re.IGNORECASE|re.DOTALL) if message: self.message = message.group(1) collisions = re.search('(.*)', self.iaobject.scene["intro_detail"], re.IGNORECASE|re.DOTALL) if collisions: self.collisions = collisions.group(1) magnet = re.search('(.*)', self.iaobject.scene["intro_detail"], re.IGNORECASE|re.DOTALL) if magnet: self.magnet = magnet.group(1) final_str = u'
\n' final_str += '
\n' final_str += 'toggle\n' final_str += u'
' + self.PageFormatter(self.message).print_html() + u'
\n' final_str += '
\n' final_str += u'
\n' for i, detail in enumerate(self.iaobject.details): target_id = "" target = re.search('(.*)', detail["detail"], re.IGNORECASE|re.DOTALL) if target: target_id = target.group(1) magnet_state = "off" magnet = re.search('(.*)', detail["detail"], re.IGNORECASE|re.DOTALL) if magnet: magnet_state = magnet.group(1) collision_state = "on" collision = re.search('(.*)', detail["detail"], re.IGNORECASE|re.DOTALL) if collision: collision_state = collision.group(1) tooltip_state = "" tooltip = re.search('(.*)', detail["detail"], re.IGNORECASE|re.DOTALL) if tooltip: tooltip_state = tooltip.group(1) final_str += u'
\n' final_str += u'

' + detail['title'] + u'

\n' final_str += u'

' + self.PageFormatter(detail["detail"]).print_html() + u'

\n' final_str += u'

\n' with open(templatePath,"r") as template: final_index = template.read().decode("utf-8") metadatas = "" if self.iaobject.scene["creator"]: metadatas += self.iaobject.scene["creator"] + "
" if self.iaobject.scene["rights"]: metadatas += self.iaobject.scene["rights"] + "
" if self.iaobject.scene["publisher"]: metadatas += self.iaobject.scene["publisher"] + "
" if self.iaobject.scene["identifier"]: metadatas += self.iaobject.scene["identifier"] + "
" if self.iaobject.scene["coverage"]: metadatas += self.iaobject.scene["coverage"] + "
" if self.iaobject.scene["source"]: metadatas += self.iaobject.scene["source"] + "
" if self.iaobject.scene["relation"]: metadatas += self.iaobject.scene["relation"] + "
" if self.iaobject.scene["language"]: metadatas += self.iaobject.scene["language"] + "
" if self.iaobject.scene["contributor"]: metadatas += self.iaobject.scene["contributor"] + "
" if self.iaobject.scene["date"]: metadatas += self.iaobject.scene["date"] + "
" final_index = final_index.replace("{{METADATAS}}", metadatas) final_index = final_index.replace("{{AUTHOR}}", self.iaobject.scene["creator"]) final_index = final_index.replace("{{DESCRIPTION}}", self.iaobject.scene["description"]) final_index = final_index.replace("{{INTRODUCTION}}", self.PageFormatter(self.iaobject.scene["description"]).print_html()) final_index = final_index.replace("{{KEYWORDS}}", self.iaobject.scene["keywords"]) final_index = final_index.replace("{{TITLE}}", self.iaobject.scene["title"]) final_index = final_index.replace("{{CONTENT}}", final_str) final_index = final_index.replace("{{LOADING}}", self.loading) if self.root.index_standalone: xiaWebsite = "http://xia.dane.ac-versailles.fr/network/delivery/gameDragAndDrop" final_index = final_index.replace("{{MainCSS}}", xiaWebsite + "/css/main.css") final_index = final_index.replace("{{LogoHide}}", xiaWebsite + "/img/hide.png") final_index = final_index.replace("{{LogoLoading}}", xiaWebsite + "/img/xia.png") final_index = final_index.replace("{{LogoClose}}", xiaWebsite + "/img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '') final_index = final_index.replace("{{JqueryJS}}", "https://code.jquery.com/jquery-1.11.1.min.js") final_index = final_index.replace("{{sha1JS}}", xiaWebsite + "/js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", xiaWebsite + "/js/kinetic-xia.min.js") final_index = final_index.replace("{{xiaJS}}", xiaWebsite + "/js/xia.js") final_index = final_index.replace("{{hooksJS}}", xiaWebsite + "/js/hooks.js") final_index = final_index.replace("{{labJS}}", "https://cdnjs.cloudflare.com/ajax/libs/labjs/2.0.3/LAB.min.js") else: final_index = final_index.replace("{{MainCSS}}", "css/main.css") final_index = final_index.replace("{{LogoLoading}}", "img/xia.png") final_index = final_index.replace("{{LogoHide}}", "img/hide.png") final_index = final_index.replace("{{LogoClose}}", "img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '.script("datas/data.js")') final_index = final_index.replace("{{JqueryJS}}", "js/jquery.min.js") final_index = final_index.replace("{{sha1JS}}", "js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", "js/kinetic-xia.min.js") final_index = final_index.replace("{{xiaJS}}", "js/xia.js") final_index = final_index.replace("{{hooksJS}}", "js/hooks.js") final_index = final_index.replace("{{labJS}}", "js/LAB.min.js") with open(filePath,"w") as indexfile: indexfile.write(final_index.encode("utf-8")) images-actives-html5.git/src/share/themes/gameDragAndDrop/icon.gif000066400000000000000000000066131250410645000253470ustar00rootroot00000000000000GIF89aop q s sr t tsu uvvywxv xzw xyxy|z|{ˀ |ʀ(́!}~͂+΃# Є$ ҆'߄͈6҇7Ή7Չ2Ћ9'ь:(эA)ӎC"ϐC)"БDՐEސ1+$4,%ْ@ԔF5056=0ԗU>טP?2@35HמTI=֟[J>KءcSG٢dSHTզl\]R^٩o_تueTe٫vڬw\gݭrۭxhn]o^߰{pw}rಃ۴xhݶzݷ{緂踃rߺ໏麄ἐ껅꼍⾘|濍쾏šĢ׆ęÇŚʨȒȘʤ˙˥˫ͥ̚Φ͛ϲϭѯѤӶӱԽովֹծ׻ؼٽڸ!Created with GIMP! ,KH*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳa=]mH2.;j`&ZJѢ-;֒MAIǐ#?' +}J փwSK6fk@bvO{!g+$G*o6ZkN}ruꐠ_i  A8WC@c $haS~]CSP͓k%2 $xph[QE#Ãy{)& G] ⤆v3ł7 D~S:Dj@hN;l C]Pg,)LO_9(u? N>ꗒ#@9HA&| [U0jI5("h2B0U)DaVH] _,#&( TH\[AX@H)#Ja%FB->xD  ;pfQ?F1<S"P"8,#?' H * E`B-BT#}+?,=؃IP~2i u:f?UdT)`L-=f/}J ( Аe*R#wTNT87h|g*9Y:\'<)yhŻS@`zz|6UK]PP>$C rh:QDB1%IMjRԆlPM;R 4hD8m`0>6 XZi[Bs򒃜' rH|e,P2`!ȳld~3+Y"`#d?9"63tKg$3&fAoq=4E L7zӏ^qMPc <'=>=9\!UW[ .Q4WX8ZZX!((YT4 5 7!8Z 6 NQ$34 5 7XX;@1NOPQR3TUV Q? LM112RSTQJ0%K0LM12X>U/JK0LLM1>A5H I/JK00LJ?[$),FFG-H I/J/S)?DE /FK -HO :+#D\M;"7;C+/&3KH@21B3*FA(@???? images-actives-html5.git/src/share/themes/gameDragAndDrop/img/ZoomIn.cur000066400000000000000000000042761250410645000264350ustar00rootroot00000000000000 ( @༙L@3uaL""!tSSSǨiii555^^^trr+++} ===׶-' xxxXXXcccRD6''&̬ ///mmmqܺ[[[0)#xcO%$# ```ooovvvqqqt&%%(((˪N@3 TTTݻYYY___wbNaaabbbhhhwww-(!߻Ȩ&&%RD5̫˫cbb\Z~9zq qX\_@_`%%rpM^A&%$o(J?) ppG_R8e$66jjhf8k nn_!dfws Ijkl77lR#E.3-3.Kii$s\kcL tNfg^y"9. *4t.'dm54V44tu#g_TkQ34V3> DZXa/4-+aC@T6YPtVV*3Q5l|YJxttVVv];^Y7St 8B}EYA\8Tvvvv*O\>,1WU4O_,-V,\$0<)o\,bd\\\\\\\-b`FHc,#|YV??images-actives-html5.git/src/share/themes/gameDragAndDrop/img/background.jpg000066400000000000000000002436151250410645000273320ustar00rootroot00000000000000JFIFddDucky!AdobedkjG##""'#!!#''.030.'>>AA>>AAAAAAAAAAAAAAA!!1!!$!!1>-''''->8;333;8AA>>AAAAAAAAAAAAAAAAA8" 012@!"3P#4A$`5BC%p!1AQ 0aq@"RP2BbrႲ`#3sSc4Cp !q01Q@Aa"P2`rBRb ne[I9diV>7_n+ΠOtqy~W_>^/<[s={ݾ'?XRɷ5X˫xO%|o|_,kc <:wylՆ]MYWҳn>/dL@w^WPo?:9B=XN+:tq@ ToH,#K޳ ԨDa]K~:PՂtQG't8"9{W~G7PV85muy76۟-@ ssl<p[]7g2gh5:^{FTuqy_Up G:yH8})|^vSI0+Kޞ+_[oқ|@z]Zx`'O'?9@Rtkךw9|$4TM8O@mfx[n>Qt{ۯoä3=oBޮ01zuu}&0 drk@th8ΐig{E(ݾ'WCyCXs /2N;^zyHgyOW̧q|nNϤ>/)إl>矮[0x}'O@mf_R>mRh >C:C=@]{&~9k0u:lpB~2ZVqߞcj=9҅Z_3Vw;`s`pkޣ)_[gӓ`D=s?_mkTts<ץ9Ű>/g/󞏛 A>%weם\%jes펪.Ǡ2=oC XŷFzZYREyIⴞr({jWo!i:15["+&!{|t͐;Kbj=@O,3Zǟ.*K5,S[[[3*K]*WNXu[-9Cmx3 >wmmzֿ/>0z?9ѳ^a*ϚmoXIqߛfi^/]/m϶:>kwgyG8iŴ8P9Űv7wy r[\۞;:W)] p:}7cж|מ3/} L׍zv(𞋘N:sZxaw ΀οv߮ܺ7iy 'k~?bq{\rmUutMޫs3i=rt.P^?/gWΝO5|tm]qrrSk_y_]1/t)cgKЦB@l1e+{:6t9}N>`t(v&Vω* kEꖽSt"1'&ߣku'GnOP<ϥ[w֨'gmogMxBmnO|qrsy}~GWHku6^ߚg,ã`xc(Mnp5[OOLv{ߞ+oSynajPė m"qvr`J2Π:7B \n75fM{c-jngjsyU“yC`ǚg}w磈 r׻KMV0D H~pM i .7sh^JǢ^c`^_bWnѷ˾`eX`VԧLW@1j[\\Z'~gH^?39a +}}=?lY^/a\2uy]>˯܋9hRFw}c^wk[rnO_OSd} NUV-:JW2=< ׾8+}6՜M^l*vxrs`6yzpFۧ&C r`6ӸTqrjZv+}g9];CΥ׽*+/pz;7ۏ,T'SgS߭e3L<@yE'S^Nj^~ZfNN`wWO9|Fz.mCψa i>C^W_WG:g3 3, 2, 25Gεp{E>y`{mb;rzܜPۖ;:=o/͎8 Uw@[l]^_;@X]5mR&]kzdR3v_KBE/>1XrG. sC={7^uz4oq*oJ [b:yr`eX`eX' Ǚ~>{t5ݳ">ma;s:|P˽,2s8}9;ϣϹϘ8dOTkf՚v\<뤑ޏj.Fݛ0RC pYJ9G +)|_׊Z֟'k6ڿs96m@vԷ 5Wu S, 2, 2×Oors*zTutп7gWCG;|@ |[zCKzuiXpEKo8@1[5%,J:7o_I[}96kE{1F4V1+P_~ϸ0JV=v͵s~Os]/يs)H%ϽG<ǧߜ/ί*+|9=nn[UZ"~Emz6׫-T1Owuٻq*0pxmf]-> O?wqQ̀CZ%SO m}Hu9;uп3jY N7F=v9;yJ^^^p qد>jy F[Z_M9bL @tz./8ex㷯\gޏ13V|wl6Uu<#;r|ҝ+QN 8ԭUt98ճk[5=󆘀y~GXi~O UFޫWy9: (ZU-|>wҰrsyr@X Ut_xs7mK[8@KػJ<\Ν͏7hJ>P@Pͽcޣ{3zCSȰ@ 8^~2zk8dv;k$t/;ҥ:,]iPl[^Ϥ󾋣ozI[L1٭j&#9n/'^0v\^p 9Ӹ~NpNߟKwFo\tN_OC]0fK} 6˳VyhSIƒ-t8^*i$ծA>1[l/PRי^ޟ.]f\;=oy1Z֜RC3Λk89O T+pn1ڰr1ɹkӡrSPSr6kYjelNyg_HZ[ `~f%N;/`:7gͳ[vCp{kGC6쐉 49g@AXRy>3`c WS릃ً̀c+utXr:gej_86碑5V$׷PX1"9|5:[; c[C&#Z1Yx֖d (r/}7Ο'5^sU!Y}=㓋Ύާc>o_^UޖS[Uν ؚ55ɘ'sG_?CI&4xU)c-}ݸg@{-][O cɖ~;{q Mi^>=lokN1g@V+ Hm_;×3Z݀ޏ1b$1 r:}4:: Wxi܍z\,A6󃻭3HrsԦȎVi66|7z9Ƞ dr$;\ n lOw8~"BG~Du*͚j2&:3<ΠڎcK} jAzt+V Y3 {v3vyAf]j)y9\U{:'$84qpy:yӦ99 yB1+CəN4:619t6>:9Ƞ3ƾӽ]/\?&tH:^{8:Әi,gS,sy5 &3_79 rWϝ`5Q<צ0,W:ޟluHr9cSP8vr CKKcQE-rBwI踽|y1ӿX8y8#usDrsŻtmk?WybjGisw/`˃P^?mZ//|;u&x]2[?F~ xyc#6ףl݌|gQZ&^K7~z43;mtfۗ΀1RG q/=y r˟CKy[jv؀^Mpsx*Tǽ+Y` x=jk8Ӱ+Pfnk 6k]Nk<\7<ֺ`Fޖ\dss?۳x<ϴW٦oz8u03<_A6k>drťdϾдQ|/+|;o:w7$tH7yѹ^| z~VrF͵n睟,tv:iiph=}A{u0 }w2NWz@ =^"1}zCM&/L?cib:/źrk{.]̛[#CZב퇔s8bמbF|e]|c뤮U|^g>y%;foS[/3(~x@`jJkFx]tORG0֑]WFq@E}?hGFn@gM#mD Ʉ{ZQe,|O=\GٰmM43=v-P3v8v'Fش`@NoX':%JHsWs+xOksV:Rٷjocg}XX~:t;jN'cKy] s-|;.S@s}7 paX:yS|#"it8/ڎǚ w6o"%[>&ןV<(á|ץqkg^Z_>Z1仾{SNe}9@j[^w,u ]`:)k^8۠davNJN]vnId{w^v=/X򻞝涗yeV "({hxֹ1LBk]kZPiF5xϘ")a$CǦDH};jic>d3A6K84t{ ߼<{)r}wR?c>BG&wjg=见~?@$7|=z/K}vGPZrC@Z3# 0KutAdh6^x82&zbŜ!iF5HϘ"!+m0 6VWwultD%uPvuʼֶ&o$rE)ӭq̄l9qXmiB [3&336g/-}w(rҾzy? [k|z: 4 dN+lk-`&Q\ bXg^:e v]5V&4h=7}7!#^o36qC4Mڹi&\ ]v"MW8=:Bݞs|;:e?Ϥ5:ɍOz0֭V:omv2O\uƾuy:MwK*Oj\@[uXN'mwLLk`% (1~}۫G9Zus[Īட.Ѷ ZzއQRkq@^y_M7kkqW΋nfk8kvhWHJ#`ɰKAbxSoJ3\sm:^[5Ο2鱜s^۳V(zW]^x&nQKK7R'۝\[gHH͊٪1WC[ן:Z jix5M]W8RzP紑me˷_lT#L2m_[]6p)3Qπ `eX`e2T'sx5:ۦv>2J0 4k5i~qr/`UW3Ùzx'E.u3R=4ߟݪE[U /Q3 y൯ rSR:z];trG==ۏډ]I5)Y &g% Pd|!!̨Gi{9JZFzmzmv@u9,1 ]dJM Q&bBjsֽ,W޵^`krt9 a)Q a*1'6?]m٧=)'. 4f-^}hN)wcz#վm9BΔk è99tn^g+[7)ڥvjv'׾1Z{Z\jcB1 +$]&zu[U㤇kk2'Z?>ٝ1{8Ӗof3jk}X)Z6c , ZKp/o^^~]"7ƣhfw4a (ݥ&Zg;xׇ}6 Y<V#XĖMvv)iFyՎX XqEt^-QSMf^hjvV"x{r(V▯?=ATqd[ѓj7dȂ.a'B?8g@=V+Ei3\㯫\@| ֕jtgH֯n5cӷS]^2ҥksm34GP b0 }D\S5[Ya }iU:ҿI1܅{ȱb4<!k GB~XmnnC3Af`8mܨ.fE$}20g]dae1r:Hj9yIhfƉ %95o"̹"t5Tm5W4kԯ/л21VmO{9aiƙhF0;1agM9&+KKHQ\m}3tߟDIDIzi EʊTK"mh"fq1cIq(҈.H(yk`:| 4gݦb7.3MfB=/38Ɏ+[qms5^μ~O,ba4h&G2fm1&M[d& 34jIe3H1;/}948Z\z| uc4 ; d ԇWH5=0#< ݦM=9.^7 oRv>ѡ`GQf kirkuR?8g@c8FZle[ɷ2 t :m$D6tjns:|yhy㯨t2/mtl@ hjh9s[gMq7i2Xfym%qN@- elcsFh藣Igt*SM&LגLm@9>v`m:9L_P4GU y}vj5 9 Է5X&cc1 1̷Zz[kWH%+lss0eQF*tuJvڵѾF,m]dĴoMCKUVsgb}۟3Ai:k$DXsǶJngF-iyZrE8ɰkN:81coDRŵ\xgcxVgVVׯg)71K| Hհ|H@9 :ivds +ZWHL/' @k[21]io8mIf sH C<2ky 1@-Ҿ= = p;2ɮJFUSf2d$JKި[j9k5mj vnpcLI^U3yto@Lv@o(5))Ǿjm3,A<KkAf},UHm0IF;wX͓;#\ 6#Q6k4kZlhn kλajLutUJ\-j#Os,0 m^7ikHk6ru9meMkYt \Qv9oNuoό2ձ1eeТF-ic65RPielBo75nҶg1vX. VMClk,Wk4m3F{"}╨gjD6c)2@& {Zhi[C4S<HTRj ;-6V A4ZױT2mS7mƚI\|#^"޳r6WJ&#A ByG asbyy[f%=kǩkLmgX̖ѦȦnIc,ƺkY4fX@iEtٍd"J` Qk6{½'1w#\o]񑌒 vdN m#0f4 U.)#6_xk=[J)j :wpQvjssɍQ\mef91U}ujmFXZm渒2]qY{:류Ě[ff&3MuYpa_M]hX ;2Vqʹi.33ͦ+؇ֻ787c]Zm$1ILe 鬓Wȳ,I5sXRG,F3f })RT,VڵhS71nD`+b)Ա ŵՙ2Ya{9 ^KLǶ1Go٪Yf#m$RG-l!m}s- mj0 ԐD+2h],$6,`!͢5CZ!kH)#ZR{in7n$L" WzHơVa(vB~wJW.8>QwE(~eO׀tcҥSoLAȌ ,t%~(AI)Jeyᇺ^їk%0!1 qa!+T:T `Z{qaFY b*SC^Oˆz^lt}0pФT1Hߤ .Uj (˱kj FZZ@{90T9X:?o KݠKunzw*.tXFw鎪Rt),IѐU]er @ m7o ]q"Ce0 jոk'~V:jraeHdhdQL= ջ !m7H86Jq"ߢCߣkeOd(q}'}{Lk:>hȢPtnziw9# Kӌ TT|oEU7(WTYWR&FbǂI = SN)ϾFy@*3QVW]%^4ѕ@XsD>=N=_{ˋt>1H~dqޤ}}d=tEjvڼ\"fWC<ΰnGJ~P =tAߪ7,ԐڙI>Kߤc멺pB=]܏Az<1P5e2OHijAg Ÿ$!2TX$нHܱi'~ɉٽQ@@Tt 4JLfLZ Y}uGʕ>.HtEUK -zԈ\ 6X{OG1iuL>틷gki~ݤ#驻uxJ)F%r#Tj M0 #I;#?Q;EAS1b{ǎDcL"&ݣiTݚ,WzܹeXSNTz( -AU 4nyR $ajIoIߠ1{ fR  NPJ 4`Od4,]9*n(JB60EI^ R"k1$Lv/е&#tEҧuHn.4{T#^c&[Xt 8ځ&?JR4=*>ڽ_E͵xbIҡIߤ}Hл`I$V+}~hqMQ*3fER0Hܱ}Rwc4n"#!|`J@L pCԋpy֧ (MGS}SpQ_X+:XB=ݣ7M%xŗtH ܷ@+N꟬]\+=xoWxQ(1h$ufKP"ݴnФmPY Rif;#u*>i=ޟe$`8&Bq鏺"ޤ?M'o"L# ݪY9)@qMF,~QZo~Q7 ^{PZ8ԽJX̋MlT(դڇNJBU4vk7q}=\$$Mr$ؚ|hI/p#_}={XAp/f=,YJv08SDTǖ=`j,v7uIYuN&ȅ۸E[*ne9AwTݺ4e%\SƎ@XB~%HMoI J=Ӈ3wF ,kH}-T:^ G׍5N@M(.׊n*NBUTcΐD K]ӭ7w1X6(*Ր54L(+I<[j#kRJnpGӐw\֠de&(zֵD@pZ-CЫI(t{%zuә"oFׂ=hdVFeERchÁ;y()*nePX6/ѕ{~]9UDH ~hݩN֏Z9P}N@ʠI߀)$ rt?WTT LPD:: b5%mzV&dH] hQ6_>l);C?jt~ۧ4tj4n[V9FnLx#:4nXTb%UH N =҅H}:~i;WNt^=9mևNN_# քEԎfD%k@˓Y@2)if= ^G{V[މ7ܳ_{VzWR PYE3)E7~_:IzRA/,QE|ukJdkZn"+{Sqh^ `R .zZ "N5|‹e t7ct䎒u*,9Ds͏qӁPMׁyЩoaN AթiMWuZH jȢA<'J͖**W\1WV{W+EWz\\Вh{\U\TfCҁ.nkދ^Wq[6,4a[qW"oG)ޯ6rjz_K#V.sW5sWZޯW>ɡ@"ԢAz.1Tט˴ozs:uZ {/Dc{KC]צ^ԃQ>D=Nb:~XZZQzh&}oDjz>=lCڟඈ.__U'kt}'؁]iXO_ZnH@j%ѥ؏k:u>I7%}n_7>cWz/VsCF@n5q[ַ ѠoW5үDկV[փm{ޯށ~[ X{GB.[ ]^,귵[WBoAhmƍF -M4 CD~z҈:j^=_s@؞H,OOmA^Lht[j(P5hW&AorE[ȽSZKmho{v>(u:u_ɏY?vT훂}. ߪc7z.1!^U}[idjlEF^N!Rk}9pE۫q[(>xAf.,5I7uOvԝnMlcnrwH,;5^S/Mc/p6 K T}ߦERjN,ܰ.xX[z4^ nJn8&QKܞE}ߦER{յJ.OlpoPNբAqF@^ӣ-> G/t'UNGR~xn)EQ%~!ӀmDߊ.w!XIQN GjAe3fu^ ~mK׀t~B`DډmE4j=yu#(-T/l\..IbP/]P]]d4Ph-UCNrACדI H:M‡;bQSw-zJDIs4A}u f $RcG^[St᏶. ^ެ)h%lTѓG1Խ #뫵<^@*=8b.76Zc7kIN,a/N+W \#Iջfv}l]?vwT8#]f>ЃEG!NnnzAv2d`y}\ /w*FhE5Qs~TTݱvԣ騻?W81Wvaf.ݨװ;n"{upSFF7&t~?EF~ZBj] ^I/w*Qn2ij7v>T]]ڄK(VŽL]ڟnشlXqu7p<^?vXTQ/MA"BK@GWbTג cSP3ᵛIGJ.KE/M- 'l2nnLfRүuHn .ߤڢVwhnQz^uoR:Խi(ѥ }ߣD5~Cv+AQ( ѐ=:T͚Owxb~B,cѺwZ"[0! ZEG-ac}/z(”pE@ۖX#\n 2 / CS࿩^ꗬ}NFt8vՏ j1*N\ڵnm@mQm_V<);^bznVT@ᔩU[EMFu?po~FG:!sR?"4Imk|$AeS4W yqTvqQ;x ,5@E*EJ.Hǽr$S@D̋#X/Wᗷ@.x%>˞+d}E_TU'Q׷e7* [.I+`E*.OZ@R^F. njƭVȡ]ۅ7TYO]jNڋf"ƯҸnMӕl5D侃 8U-b-A n*SZjN8_Ov/AӅIE[$ Rɪ/ 8[pHŗWZY'9EwTK0mՈ~~$8d;yv/Znj@H #3Ľh:k'NA Q#X^+v}ZEG}.JN>au~^m(n V4#;_[Q;x%[yՁ-E"=m㋮^Q=/Y:G]vטxb؝ܓ҇J=ym#>#'ZAs: Qr#X);^oی}ZsRvt\ҏZNusO_Bܳ>֌M1ӘZVnK1QzJN~;>ֿ=-zSu^W{A&djIS>\\}گWҤ>IM?jvVM,NnCrj^Wz^W5sQz8e6^RwT4N .P'jvQn׷:rOXSz[Q6b(Qa/5;NqzjĐ+xN֢.6n){y->'_@ːpD[w tZVNꓻ;8S4* {ŸI;WZwEջ^}Nꓧ:}>"VAаZw$ZH>~/XCҢn֟t\Tz-Qv\H~~h_HHX&9j4NꓺVP|K/Xۣv]ܽݺ QsTGۨQ Qs^悚'u7m@⋞ [Tۗj'Uô_'uK׃|K/XjOQrwQዡs/Y{]}蠭^GkDLp^Q< |I't}/QTܝQvu~{*.L ݩ@kewr@ l R /qGuԝ;u~~Gɗq 4WIBx&CSݪN ;x~贋I;hSIzRwG'r/m/NFW"1ʓ 9t}/o]_-#;t}T:piIt;2v6(oȓ ':r$7nl]0{?t]TZ~E#)/i.;6j9#"Cvm]luQ^d۝1긣nBr ʤe !5s[b5Au/w0,yt8s͗׉"F`ȴd^ZrOBjȧ*Ú̔s~uINQ<ӖΏ^GRv smځ*0Ե6G7oܩG0O,dQ_(W_(hu$ czbjKE{7?H{[14ZXpE-J(.;YP6aBFu ɲe_vKm3!H^~`ˑ}mJkq@^\('K7\XG:vTsIL,x_'o1zw҇V;Zd sd_ -7o2%["5qFE⃃k7&ۆhb(F2cqmאޕS!H,(U{ApIgm):"E’řr)mFv_v5=GߏlߥF쌬dȎ:#Mʏž!S|xa<ɿ;_LYxpՙjh8<{H>L#q~F֏s)2tbI㇭xlo S{A1')輩0ئRev9M0q9hx*>"s! P:euȎ:A#_ㅱxcFNAf!P|9Wm'ǟϯ &31a39 ]޶|I!ZZb{䌦XGjI O'aer|w|A+ƫ6 .WS@I,kl^.Bɚ) BKC# MBg_ȡ<_HX21mȬ 0>E_ǿ;$.#]!OV+*R#d.-;|eP]\UW6/&^Wb[QͶt1JZ<ʆ !/I`ם>L0L8_+PH(paܯح':KfiLlj*eFnx|7\זNHI"<<+%_}>E9he@oۋ,V7߯M4Q|X;Vے ԙYX9`<גw8s_GSNeCz}E8O?#OOx0GqbHbF/DP~[3I@( FEı3 )r<׋\/)ɋivw4V:'+׶NO8z~;Sf
x^a6y_><5\,x0/xOw,.]ǖ&+Ɖp$v^@_ >9g nFrFFYUx3r|SmCܺx_G3e3_8wyǑ&\&Ixj\QȒ/(/A Nj2Bdxc1q{"M*ʕ_LlŖ//#-&0|_'ekW~Er0D1G#-wci_nNĉ7ǼԱU2H\+h֧͂e.Dq4NyQN[yRH`ܤXle[RÁ`j$^H6(O+gזDzF<L&rw)5mH"ʕ咱X~5ښؼXsVđ@68$㸧(i!v06KH9yb>/520nVOg^%&`7}u(FL& |y'; yCLlËi5^.?ǚ_x29*2|fH:&\?33^/nJVđl>4[o72WRٓY8g/|"~A̪z{PLAurs?X12x"UQu"lIU *\ā#S6٤]rua^oذjP49Yȕx?ʥҼ\Z6N)Ξ('Cnb0^WkPJc/(>ikL%`|7"i\"I1T~/oΊɳ&f͞]$#Wʟ)#shrd5FIG՚Ozm?R}n><ķ;#A'wWlO$!8χTk3_BMxֲ&*xȎ&|\*?ceQ7<3T m|l1Hck x( ѕXIOgkcpx|~Mbgx~ A8ȱM[dW7wT\xtoL_򼀾'9EJ-/7'm~S(,67,@HAyS8~x@$㘗L><~?;L(_0,:e/:Ai*Y}̻(C:=G`@%6L?x-v|b@ZOʒ駁x<8; +y٫Qɜ'k\888j,ieYaxsO^=bWtDNcR> Θ_dW7vcpGdM>6O>i <8O3nwTYX#(ݟ{Hf9Dhbb$-7/'iVxDp{c/ʔ^> *\FR^#^j iW7m\E":c9oc_v7Sv1U&4뎻`c](}rl#xۇǛr),iOgp epx\^Modُm,ƙLV\5$8t yfghdI*Yo'/d_M`̮"1GyfXSŵ ƿkdl\VtE?\"\,Ŝ۲.Gt~2aH ?4*hkG&OP}mMώ]cb2_ɌL gdbAk[Adx;cDD'P[#modr`hAzG7z]9lɍȶ@xy%k['俵^Bz^Wz^Wz: 9Y}?:@ʏNۋy2" dp-3 8OyI'D~Sh˻#_$rkŽLLy 0 zDK#mnqKq5Ǎ2Gɻ(ןǟ9GUFH_Sɵ9P_{cx~&gu9[Ftwl7/8dE"Y8FHy9)kSҕK2 Dvڜqh5ǃ*5bA5d`MbyJ07O^=JSގE&YX2nHey$$#y}1x8h43nQƳ!6\2bȬyC|LϜM5"t@x(\>);o~?oʟaEqǻf9w42gTOxdߍ\CͷigXYε*|rko@CpcG?E}:e>~-쇋A;$\d2ic6\yrKY!zco$+$8/ItA|qpHE,DшWnF=b49tlUW۩9tmlmM&]Ɓ Z :sdG8-ɭȂN2ب&?ٍ۬<Hے0e%qji[ O;YxB :<~J-kI&B/9!$yL<&#^f[o_nnO#ǯ,~58cQ"xC )?.lyHQ84 zl]@6ʯ&ql{|SLVݍSŎHV+,_\_n6P,f)4lI  Mh y7>3>4/1"Iklz+l{z苵8vW8De7U3L7>@H!LSlyG$=4uluH #-AT4N1ޚYV(䑤}q|s9()%ꪣ7#b!LY:]d9o ORzuSYշIѧʬS0Tw^TΞ0[Sh>_'6DP.vZk ;aȚU@.OE>L $Z+OA rՙLNEeRkpV"Y$ȝ ?&#ɱfcX,) 3E &*㦾UGKCSF!V`ki/|ޯ!J weW?N<[oi .ch!(T1x(y3 N&*T(7-L^T}|OoQqg${g+6.%1ɖ-i%&1ws^%udžy!tS2|̱fdD?n/ & XHQ6d-Z8J Ɇy!|ll]1/ēU 4$bU3Ǜku_97LLOqtE͆ ?"J$Ҫ|'{CR\!e`NjbWoOqkțR}|Is};3?/~nTt9~lM%]d5M$-kU8|\ȏS@`1D+'l0D^E'D4K|nA0ۏtdzb_G$dxA'x9LOCH[#5_vVk4+Hkx|i l_yg]dau~?/u85uB4 3<2c$O*oE_@#6Yy9&IsWv/ F~8%pbW7ʄZ.6`PdP&7{rM<>H' cT>ylOzNfzm⍷#?/y~$GI3qx|/JO'H <~mL0)/ )(FXt<+^㇑1|E8$!7>?2ɖ   j2<ie8ceƦ'7@,3MuC3[vWnoc* 3bj_׬%{qai9.#f: eLxk%'_X@#/Ǖ5 d=< 4:)ܼ>s%&UơY3 W}X:%M/4c$<|` \d|1m),I&D_Ɇ<* [bxj]ؼ^5_vO@ld))T$2Fۃ!xI FY )wU <_%t) XYyDC$i6z".Yf~5vNf"ޛʏ]ۋ,Ég#gf`&]>+Yl58b"/>%hEJלOSqT;YKUr6O/c-jr* |wT9~:_ rgL|yL_!qq%}g$t):dI_7F#ЛJ1G$_j &n6<'Ǘb[+_?\S|_J@"oԘyreLFۂ◇3C;"5\LAcG5 RM/+ a /N(-?Ə0?n7#?+2!CYC3"B?(o~ogqem2Il? k=p 8>Zy9R-xa͞Bԙ0>ĮFeRMEO漌I'ξ?qSDb*yan"up@7b4xHO'tP˶DZ7ǴGQ<|r8>TύyTm*,i 1V6|^;O~NWI?Lۉ]Rz~;%!#x%4s|[nQVCmY}4xQ?7)mS_Iɩ#!>H9ir2֦G(5s_#rcVF |P#%Q(_'ģ>d^9 O11ƞZ?voI$He 0Ի_ÅDb[uD1>71zGXEƩ)4ݟ_گœ˾#Y3Op~LHp_$|s=0W lGo6#7ީ]e)heZs&ɏ]GOR hM>nTqQ&[&a9$G/E6 M3̎] o)VQƏk8 qpO''_za-*~0?f ta-9W <ȷ/_/4-}m8|oH3K#e4Ǯ V*|g'oCO<-|V\m/o_-FImՏ$(c2p6C _-:zۺXBװ‹Yxa=]/{S_ݑċY8:bAU(ͫ#qv%~P?{D$T6x?9$88cHZٲt _|e~R -Tn+bGzA>,r1tx3A|zC$Fq@p#MÈw8v?aH>k$O7'ɨ6/Y.v56`W$^f-~O~D|n˳~@o'k,p[aNO#W]3BwC^^?kH>/OV Upb+rTyYyP3㰱&zm3'>/'ǿZ~0O lj@'#*(J} |M!L6FQB%~PyF_/~NHwW('ˬ݃1 8{|mg@PDP‡/R#K{Ra+q~Di菵xsb|n I<($W 7OX IE^I=Uu}y T|ߓ$&kQ@ϯfhyM hyU^U/*_ͯfcC8C3!|?F}h~Gq$?%4?%JdK"MFE/Aoؓ|Ok&n5~^Gx5X H+ <zL~N_ԫ?II#u}p$Red' IsVƼϒ==($x c,:f5$S^Sɜ`p2Ī~ZK6AvNTS 2/,"h2Ky ?hK*RGkeǗ4_#Գq^Mn?4_Emx&]z?_ǻ_N~.4|Ә%L6OcoB΋Mcƭ7M&8'~ y "p$Zee>t*NbfZIM3G۬}tn]֟OWȶsks@!"/C*yfp!񟋱t ?^j?k3]^Ӛ Q6LbK 8(gf G8P⇗"&|?FGcv9 beCKk}ڷvԝuJgf'KIrג|܏ JyԞK9|(ЀFfZCʞ7ʓ/eK?AuɏRmGڤ/9Ecsm_Y'!;Iה:j_4I>tH}jB΋|:0GXzIQӁ+&%O1Rt'/*o\<:+?oȏ?}OQs~"?}sc>St^^\:ȅJ@K_p"A=*>H8>۫wV ŚY79MKLi>,Фmzq`:1lǐcL!k9! frz[1_|f5m>NGגݩ=GFH$Ma2$J/e(LI!N(8v۩M,)k'ˋ7*An@<1UܤFvXb&䓟?35ߕUlZ+㭆5X}y/w8u{w"M]iZIFV T"5뭈+ۣ'n?lzoqοI|OVch;K;Ts֠P 0$*e)D,xxK-B<"%TzXUf,}GNQRHc֬锞 ql+brdw5WO_ȱEvݺׁe,Ic5&4KۣGۯWxK/%ma(mh;9a@鏋,)!\Lc`U`cƄO\J~QHyZ,kvvh%12mGuN*̍ dPeƆD'GOªb'FhBDMRb0 eGI8IңNG%Qvu?l|1+/8C#jO#?n͆-jpޡğO)si|DZHh(zUU)`T%y\tovÎpr-/fYtCgmjձcVH !j|f3_|u u| _W,pi~颌,kDDUvTTC7ƕeULWƕ#|q|QM,UHcc:&4j%*hUc@qR@c=ڤ]%/tnG^T9ِT?eC9xIK "Շ$ʍ߽VM.j+i/SdE˪zXqQГ!ȘDrvqәc[Mmjձj|u+Zֶ-lZ J2b*-$a\٦gg3'?kI''}ڛb}r5v:YT?ε)G>~X'Ίq~)QSdCu^1Rb\,Qvu9.5cWlZصjfu 2'3 ƹ_jZKp48v\c#CbA'oikJc::_J̇XNX,iixF'J%I^GU2U 2fzjzsrI>2 O`9 ۮ_ۨ~֒}>2'ݬ߮_qI3&DSHY^,сӒP- Rbm:=A^h)/lGNMsK[r2<@o"_ywI>餆'cyki/!{u~֎n}eOY?gk7I=8ps1c,$1RJ۝WgFC'7s׉yB&2G|uصjF:spB{G,J2:Y$:bsw<ܣ}1hM'Cw_\!Z}4q>ޏΓKb9hI.220nn?wĆvڨW%VCq[nV[nV[-nZ*3\3<܃y5*Sh1>ބ)]93zXv'3b#j16S^`ʱ_VŭPǽ@r2'2O稲h4A5IALqq?,oZ޵jcyp(YaQ6a[\Ϩp$Wy淚kyS1+|+쬃pci3Y5VܺL?s;C_%oVAvnjbmXO1#i75nj1-?]d6عiXf,}4z3?e˓#Nf8J^DA$/ܣC>Y1uoX'eGSMV$R(E }|QK*xShIVA~[54lWKYMLM|YcŢ=ݕnsd^'cdfUƺ >:!hc g쨍K6tM?# q8$} V?u&l ˎm6VRI6y-'m[ڷojC#*i@5sI# 6΂>D ?Έ՝:#ƩP*˜GJo7۬vVC{T_nCdr2Ԑ75y*iS*,I.8K񰑈$rѧ~LnSkV֫*#CA@ӟ,e+6vLscMG}wP]\Ec[:ص`4k `(Jp|F긫p+ou{ Սmjհ[ l5; RG#;F pD9k2`rF2\Eb$F!*q൨1VEd,}hxqX(ЌP MɿID.dqoFz5kVƭ[ |u_յcP-XDY"4bBZNݦkiV[(G_(jq[\UD$4)DdnlZصV[NCgᱭ[ |uVŭ ڵaJH{&h74GApenZǙg9hAD5pqRqPj5F€S[Em6k*A7 @/P[ ljհ[9ۇ Mj o1^j3x{vFVXpXU[hia[ko7&"7 K +unoONJ׋eIUXUmUڷ5n817ṢMmzlqP_ukKI)gF>duMuڮ(\Q7*S dSP1[VQ88

.G0>=ct掜vIVe+¿s6S.@ߙO^r\UX[NޜL_Ha2Pu(p ?#ٽ.GPI=['SbE .e7[_睌 EjfgHi1G +YU\~5b}&OqdejD(" ha.3-#20uY hNXqna xIڷV[~7@mDMXhz¶ XQҴx188t0a*_I} ixWP~1- )'/pI4J@XSО˥~`\DއOӉZWAӓnvH}S6 ~ҥ}ySbEm9%Z7=` i*>JЛòrߤmz`׀}Ec0Vx".SxHJЏj$cŗ9.} ;0}zIީ0VhDy)Q蛟Nmq9E7 nub@ KJ$ۏ$^t" &ÀP7е}/WL_TZ/ZF&YS@/^p6/\]TJ5 ؈[**I"ۇ6\s9ob}Ac*!z]j%O*.@\FqzI~b\Iwm\R`Euau4 qoX[Rl9dR)sJS@rmԮw1*A P7Lzzq[:iŔX\0U$sv4-Ώh0,$P. wDH ƻPԍG`\Qj'[/P( 4ҵnP{#See.MS^*wjT;THmXVҩ;V4!I 9?g$6Bff6./%FZ-*QG#Ob%mZhqMyEeH䐯Ƃ3HeȈ2qC"]ݺPQEډ$]ca︄^^fTjvJLKs'Ҁ\oG[TcAQr!&#i(̫`)+ VTF,;}0 oV`0NڇPAu_g\>S?oҖy7͙\m"4A4ƍMAP<vM|͋GHJ'/1:=IoYUYP^;mi15w=\> R'$8dzz1.@>jQ2H.kf"j,nb\"H5{.daj'E׍S)evApLkA'oW4q뵂&.ckPwYh#z'kL)އD$ZAYP5:/,lŌ TL*YUpF`[4Ln!aIj&M‚>C($ ?DN>!vc4.{)7gXD#`Rmd:XMxdm]@Xzc6=.QZz~קƗr#Ӂ±F{Y[jm "~ ?ZƈG$mVtY6bVuPUhYt ?=̣cv=/G݅a({lJٸ,ҥ\#؛eapZKԭI준dbYu+HA5׸4waf\>S/X2ӆTTqkJ. Rzme@ DZศՒ\&Qu%QXhJ{PL=h{Ԃ7Y F$;Wٕ"@D`t)Q[]DJ B(@Yf{ ER]nhƥ[!sm.KXnl?X?^}}LkcK P%:n [t hIPw>F%Qd^0cz.&:D^pIk؃trC 2Bܓk2a["86|u(  o1e`Hf 1_䙭A@WYzLj3f5n@'lkeg mpTk˽}ЎB5c@6if"R+66_e*nR:{@Z{2Rm( 3K_lbUы˥G WP"JAdf oq~"Xة J$},Uw3G,w6~ RQï=86㱫hmJ /v.Xi$JH@,CujV;{HF PCGꍏ62,?ɽpYz[؂KIlvBf FU CsVk#j%gt\"˺Ц6vךHmǗcz&'^,x,jLjƁܫ(z}]J6-rJyDXY@S ELY16&;kpFX{sHA*7ElihQY$ I-OKT03@?E~ARɣ7գZgC3Kz/[khЋ^+ +h"/:TQp^zmDگ@]If]r+}S}-Q BĤ!Cu"Ёs*3Vf5ciP%i̻ Ћ,j]P\e ]]-m %]rbcyT ^@WxqMH'*2?? |PM oSEr+EJjJH+m{%jƬh rPMm'[_pȤrxv 1FVW>rRT1F`CJzpJ΅8#V[FF!)*d,Jc:6R-ԀE'$ξ:[/~HGWyFcMɝ,bm@ Jsr‰u no_Jڜ$@_⽟Bތkm30eu,̤"HscY#b(}j7MH2NPo Rd4Hm+K^IVaH7K,{_TPd7C̶z@m"7^ -#<* @LP@ߊSN͟.%Fk4M۞_`w.'z%-]x@(`A)VM6[k|Je|Եdh.wWm$q]1dmYal/䙷<+\^)c$]L$U4㏤BՍ6E |@@ZCR4,G~]q@)V 8,$% 1aitH̎@-+pڼJn_Mi?P(Cb, ŝH4rl*Y7XcЁ|q"NPC*E2GZ䝥aJCZEsA F5#nz,t سX]ҩIr#_#hM(P-LwVPoH7&8uَ=.`'F!N#"]JB ,4oR)mvR) ],`czqch2r VAzOj}Nʤ XaR5/m qD^F74RUH(@X)"9T{{ *&1,\Չf _u.E E\^Mh0a0֐oQi ahrոԩ$M@z$^]rtƙlQ- 0,͵! iy@r͕Ita&2J=iLD'I,Gi/}E'Px>GC!E ~b}&D#̎H:nWqLvy.#3tZ߻G?? O`Q(LAA@9N dz{k\F:W0 en 5Dzhqѐ;pyl>S7O>= f K|2,S<|(m<=#9^&6EfP>nPhSi|_Re/;[$hD@On'd `0@5Lf 2y  Db|Hl .si7) 7Gd}CUd#|׏̔ho16L: Id4f@Cdn/t#< +Ƴ왕y1^=BqQCo2?*'/n98t҉Ea Q'W(@t 疈r7:@=$"Z Q 17DϗsSzͼ@P4l荖 rl@%Q(g)GYKUZxu!Ϻh$~D` Pl,.]#q[uG)(2W=U+eTWOEUs., Cv`с"SI NXвlzɆb`@@t-e8;&'};?d%aGiFHU ;'dPǙY<ٳo@Dh#`-_VkPVl2??;A-J I@#SE^<[~$,k5YYYk2+2?+2YǕB{pD*U 5F[b'Lx J[uVEdWug./deS܃xhOci؋f)dJ\ 2Y1!(YP9𦠡j!d:Oea ^#GYe8.zLC'z߱8B7-JjSQ(h>i\۱00z~BvcwMDW%n` ܯ^@P3^jL101 n"S/=N~ѧpr͗7ŬDUM9Q rܪ&N0~n!U.g@rU T#C@웈>eV`y ֞J]"{rr @OBr(@eTӉJZ*!'n?5EL7NSu9,V6Cs*0E F.\e/*,4*>M153T6(Adn(Xw}G/Vd* Dʹ'd-do{q)sy-֔௷% m1H>89~& @2da]U$(c@P8 Q͢gi$7M1~?݆F35^^(:⍐o`ƒQW8jr1/P@B󻪚'Md}h(YӢEbr ؍u&&)=qFxn%l3~#s%71L Oh&=AE hS l0z}\/^9D^&"$uV;oWףrk(=8FrH/ ,M'_@Esv! ӍV1^>Elzv|L/QuA8[ tw"azg)10&&"[`O4ǥ<|Ϩi tSmB-!FPD/4@}6"g/ NN"|12u/@] z &d}QC׈l(^hp17y>92~S7I~@tN g<@h9:a/U cn/Gh3m?`Gxۢ7_Y`6U P4H7/|8y|* [ JOT]h( Q!nF#x7+fec ev[@!>(] A~b,6(#|G,0V'#cE2 H?-,o<" 0/@J1Eep81(ZCdQFdNFt b6>[@M QBn8W1  "qDp(t/)Fdo( zjȑ 3!yв t/%WnFTZ]B!XRZ@^g2QlAt,@^'7E"˔B6EY@J6C"B uD$f&Q3^QFAdn(Xq{8" NE `0Dង` BQ1`UYuCm".()fY7D8E H9۪'9*16D!]J "t [8.Έi&`lU#x}RB퍶1㞰`d}p_LsG@/O<J,e12-/ɱ)*>rYY Pqa>ʮ!Hwu{>BtUM0LV+SdVK%YPeTC⒉=L{Q7gDʫ2H(&gN7AH8 UTِ:u) MLdʹdU1E0;9 GlC*Onyi?X-%:p֠LN]6 P^SX UImFyS8H?M}ޜtn%)x8'UPDD "5Fh/o-9O7Z 43^̹"` n,BԽǚiēۤ-(61,7~N9jG4gv,4In qGW!ػ/sn.??6>)^uYئW\0uإ,kIpRF=;(w%8(4k @q*-0Aۣ8FQZeJ9?-=tDh=A0€EIhgޥ1qQg/x~(M`h~CX)5`^ږP SqihejkH# \c۔ah/hTYIl[o+1o>4+y\y/y<d|UPj.bs\IFl>=MIt~O~}]. t e#ԃX6tU+hA7^a `k$^4MfGS| x43!Ax)NОoy;w+sΙ BbH.v TE<RF# 8񇪙o{FT~f&_p놣ɮ18&I/yRrRR7hY^bRbǁe[|]Juńp?77tVׂӸԟ) ipŭ< %4y74hMBCzPS%?ŪwD|q;4 @E}*㊋H#b% sU\tA 0$vXÃ[r҈@))ߧEM3T8NfkGu- |)>l"I&?)D efe=|.5cؼCrVKX,hf1sv-}dV Ƌ!DW@21 0U7'5&)۩p$q ? [5Ĵ( X'68b/ i\aO|@ NW5fG#Lgg]?Q8 t>Ǵ;_;81pCN--j2;:-F:mQM1x*7qՃ"|@T4ݰL/n#Gf[*~bLq_c [W-[GЛ,ws`?N: t|R_+efᙝ_h#S-2ZcCs|SƞQ'qGY`1(5-YY6ƺִ xX/Ee:[@?Dw_` S791Ljf H2s=RdV׈$+?\9Sj|GD7J h(hӟ(Zr 0]')߸]¡֢`j>˅L+9+/}s_lٮ @5աMx//L`ѵh&Az>b3Aj$;qK6[a:3 v-*Mo)6G }BYAh, u;Bll*Vwb;Fl.1up'K/ZMCxИǞsL&+ߡ?SxeۘlC`!>Ӊ@D!SL6ZuDZ+fa00sEN 9RGC-sp` Y!8*@ 6 €S"+od<Faāj2 1i#M&:p~2>vJmM7+`)߹Br-ѷ^Q{lphmq0ƉgiA6x%i͍n%N:ciLj8h;aB\l"\-M7<5 #,hp6@lGUB*myh!疃6qf[Bl;&:?2vU2rp0GT!fa|.Lv@Z9#DIE =ۏ*e|VCFY·Gnc1Ie^xS<舨*uGYXPE?'ny18( MӮS6gwDf^"6 1"$5]0@^gݣ?2w^9Ou2Wg@:@g_: 'D;Kw/ Ibpc|B\aG9Oc\ZOQ'fc.mC*a ms\77joKS|>b6q*30.ЙT߫>rC],| F  !eDS?cG򻻠@ޡiV+?hGQ ~Z%!g퇵VkAk; Aw<`_~P tbX 1 E·G)q Lق-.Қ~r__#xŧZ{bhRX4ߵqZ (O3gZqDl$v&pl0ڿx3/!B[!Ǹ(D\=KwpT\\6.|ϕIVQ-9EMg`GxZNi~H~cD8ZJi$Tº^ϔ͑upҗy]ke鵦[Hm>W8xh9i;B9LhwF1dB Yb1Ϙ轞WGcqi;+ bf? }eeѲasNADni L{UY'yBEŤr4L9@Kqlx7i8`Hї)xkOCeͲ\[Osy8v%BKr3< lo4Q[>cYߝf 8VkVޥh4^Q61'<\zI޲# ˳@aeo1b; 7aKUC6vipq#X}f.G]-;b0#ֽ6O{w$53?zQc_Dڄ} gM`;t2 TxVV v 5EE 4 UZNn"*:;+.K ;:XZ#H7]$h:{=[-Fieg \4&7qC f\O`m6£$Ͻ5LIљznoz3ߦ@K#ƽS̃GUӍ0uyP@0`PiMh17LMw:%tKn$pA2hyr kҘU,{Cl?՘(?\M֚v' M\] z2pNbDXkގWaSxQi4۴z3HhmoQwH:1A΃Oڅ"{DŽ{&|Fi{y,`ԗ =HLO^0`O#FaIp;TZb1 $cy/k|)SyoRb_A<i9t A {Ybi/ i;{J,xv6GԀ[ c j?SA{0-puRibPvwih 9jKE0-:Xe4n# (.mwEj5 lb DÕ¢7]_91`:Sh{Et0N^:$^KX\`:Kf08xKF9[A8 7s *5 ZTMn,_Gr `EӮ8{!!0aCAZci~B? ]a^R"_ Mc+?ٺ(ưRfNwE4=EP-# Ж'03 N-J{ s3+mHkcP+-6BcqTELLfmލT[0A8s:;t3t%ƈ\I=z6q?pAPjB*+D֦[ph p~;# +80\ӥ֘!iڣP>Wt`byHE#_--'2pP%f5h\bPhE5컠Ɛp(yr ^)"CИ~"8T1չ7}s&9<jG¥jKGϪ;/RQ?q{#{^A&`4Y?L;!ƭl'YVrhMaxZ2*d0"ZAfުp׀.AP]{)wy68¥s'7qrY*n`Aᣘe"[1(ށsk Dlk6[H_ۃy͑u9Mmj3m޲hnp:2Q҇wMʺywzy: %ICyCF__:Rۼ{,{'su9[PsqFE?=ms 5x]JarS2f.@ ~K^u~{d88'ф"x#{A)+&7f_&CDZ&y{p8s)="^'}֢(Nfha<|?幀K{4r Cs]aVI,7Fø@^ aBk:+(b;ØMyhd0q$tA =  e״B` ax"c819ax w>},Swz!Y+ϼk[ӨGsÁV11%k.D>y7w-Zס-x84nG=TtK.ڢI;4M:|_;Г4cn}0Dp|^#NFc pu-7Cs{P.7wRglgy4`̧[c]ZDy 9cN2,3ߖ6Ubډ0" Rŧi ŭ=ڂ1A²cD;zk0 snʈsͮ$q 8b ^ x0^8j-ygt$Q]JV{#*o;Cei5 #zrGn 3җ'xhiE'0,Ƀp7*-`6VBĊY 9hﶈeѹ>agX^p3{&ÁZN9}1 jM`Se(a5؀x @5фWo(4]]L}zE)ڠuŬ15#D Y '33 q1 kfjS7TL!Ή_&mU&bQG:f POd4~ozPڳMeָQ4Ohs({qӴ%\zԽgCz-qHzEub VgcbhF>n^pl8&u~C 6DžtKyRͱTϔ-q0 lY :d#X7.X<Ѧ iqo g~BUF0 \HqeXh^Ǒ`hPַ7}?n?x B-pK\/2{ҢSxǪxf:Y%@U-mv "4Z`[׻Ŕ66yg ]`թ/"'Wȅ6'T`kT@D@i֛6:)~\7 f#1 j&נ@T4@]YGXi{Fͧ1ظ҉'<Ğ:{`5 d c|=旜]m#hp0I 0l{M2Q?<&o-cX@5ĭnI0A5c\ h!V5-w -< 3'm8+v1σfAPY24U* tD G[GM4rPN0cnkp ;:4\;ڊ*@VfE8{Mtm vβ.ph`(Jh`Vg|U;%l wiLvV60Uޟo9cr-1ؐ8)0cy'n<&o20DB@i3K0C){o{ 1y:040ldkN֠)E[Γw2@Wa`:>[OZbOwu*X0h䝸К>^|9Q3v9KUӖvÍJ`ŧLKwº^3H4 -LXw R aSFh2ۃG%"P^M\BmQ݆ïԃAPKY'yݫVNL#2够+JskԵP 0#CdjNd=P^_hcYRNAPWbRdJlbZ-X+@<($Z/h|=<]‚qh9|N-B{|#cp< # k[7#:Qķuc+7xK^n(Ecm( Ekgmp= .kO|l+( v^VUV+B`:0Ҙ닌7 [qp[1<`@@ZlMi8i:cX,Zř4Q 8Ex`Ġk*0 1Gu3~ciߑܴ&^`;8C6s~s 9(˱?:ƛ]N$Zyh%qc.;2@HaԠ VA+- e{x=P*|Nh+YYo:%!h-v|@cI7/n-#V8' ' cKA 4bM(`5Ef!ie^ 4v5A@0,=)1ܸ)_(D#No 'w:@L'Baāh;aA3lOj;{$XEQl|&AsP1dAii? 8Tv1{G3DED َ3\QnZF?laޢ*p4" 2Hoevz.!xGp L25m0DtH?aw Et`&ભ("0U+Y|~nq'ZvR Y3l#WGkrf.W\ tOUz#Z;2QL85ܩ|Hhz\vz;cN.'sĞ%Jh8HkΘ8DeہNCV{R'AHS~wsHp{c Mdx5޺A׍9 lk&K0[ {zkV<ͳm pֆ6`P5m(V+[Zcբ~I=Zetu>ى}(55ᨘ0q窗G#}:e8X"As|z^钍fӎoFi;ʗ'?ĬVƪ^ 0f}h[10X|bbOYoGB^؞'AQ)9B2ew%WMX Ḧ́b¦?L <+t r06V?5@9 adE\;ZFn%_^8^ },=*LC+p}bf6~亟{qPrgpLe֝1չi1݌:=Ls=.'4&}cA$V½LXl`qQӋkiaT Y{r hc&Y8X&\4֎{wACDل0޽ԄB$\lhĬ^}wIciA8솪__:.De1D:\ /"oL B̺ T!;(PrJ\Ӄ"ǐx:exRy60ئel%OX%t K{Z#,-i Cq qA'9%GHoc lRjO:?q)'&8 ҧ1ntJx3wkJ<;Xl*lQN&Z9S6Gm5\oyS&_oО$ b@n@6;nA5Z@F59+o-p"A76gdt5Szh#$ .ZJ͐Gr/i6I&U2XhCjcZw-D_r 84 ,"МB 4v}kcpst>SN" `8‰4&C0]6]dzG+Z?=nMS_oM\5--ah;3|BcK#cN,0jU081 79繾4Y~_j1&z?SOugnѣI33X>=zvK,B t\ LsIq'A# XD"^7Bn_MQ%+o*22kM0 ͠ZT75؀xi5YP]R |]zhfy%Hw[d3D~Rcٗwlx'fcMxbh!'k[kc/w?U󱧛{kH<5҅iM384 u ^AFx"B&wxo$"Ɵ{Sn*:[6bZZ/$AU>ۻ8qժ `$5KG{*;q J mO}Fx{/}̖x؀{rdhQ؅w-򈛅KQ-q' sK9 \d$ƢEw!-ʕ+yP%^"r۲ hJpq8?l3ʗ;,Z(qxG?Ǝ~ܿQL|q;4ǟ4ϙk[N6h?K81ǐG&+=:q/n_p%>5̇]_] UTC YkZm 2aV77z [1V Jlc+h5݄j;Bdiw5Y:|kGWCc Y^ P.YhcmqkZb-pR{ZѧTȼ"F-5Qҕ /y_致xH"=9Ιh͕טQE_KdHY_8S4(.j.6IDMtΙ~_ף%̏Z?i> x p ng7/?>h߁x=y}]Ck[͍|A#h5i'6[jUR h.sT\<|i~Zp,poPZ 9y, " s' ^msxUP"Gv9~pPƀq.\88C?HD 3!`+c giLO:0`Vg]5h͝{H t&2KGmܽ:|Mh6:i`)~O}[)al?lK w68#B7-rn׺n]E4K{t$n?<{Iecܲ0U~蹀Yo i~-X=~̧۪J R\w2h;NR,60D4Ľ n>sB5aAsZKC$nPYpAŮ_n~8Us MNi&N(ˎYւoL3pؚu#Mc#۶(Dh04aKe g8{a,1}>bG7}o.9ǰ nS h}ŁWGl0Zn^qkOd`QНİpMhW+i|>Cϕ={("]nBFLU2~*$g?4"@d?8}@~:%oVV9?jYU[Eu e&1şL9ZNƎ1a?5f6- 6j&@ }#`psDzj\}t Nڜ"04<`֏lIcn-howh}FZ$-@VGCֈ=%3ƎF@!nf Hݠ^A*cԡwK_}A\EaŠQ BD0?4~t Cѝ/@eٔ@5̔/wڣ6c`=2Z=wG}quR??[:4TǩK8M]LpOF/hq mMC[dxD:tu&4j8:P1یue|JyB|s@X,huQ!5lj-& Gۺz>ZfGO`ѕw6?~C}4+O*Fpe>IIiQFokEvgwExR,+}Jӽ[%^) t;IpA*ۼ9PׄH{zD#,T _Mtbsxv@@ty,pVD~/Dk[=ӄ٣>/ֲAڟ6tXH0!V q=wxUg;+ؘwԪ8p J>+-W7{;dխWR,75pk /WϨQ_~z߭޵H_;փfLs1H]$KbCI}NL_;ֿ3wgZ؛ֿ&noq_>iscrf2$~zٕͫl}-VVKOW.T7;\Czrw8_s*#;0qD h6G`Bol !䌰e/  e9rS;ȭMw!lwfmPs0qpD+~|YK훉yKwzRM\? ^~e%R~8NCiGEbm~G9shÿ/׷sq;w0Aq $·0W[ۺ˖NrE%6\= ϸ6ַcQ-c bj599 G# T2\w=k) DAna,:lƵNQs = E*iwqP6(:ZVW:Ep&"˜4\8žN{C15hK>Cj^)nt{K7͗CFjJCkÉ7BWKp׆c][|ͯm?qsp1Q2E4w6:ߨ۷ L>Y=1È0Okd4&2?SGРm* 5 XY_o m.ٛP6B87yO6fUpqYݹK^{!jE1TE;<&[ p>+b9(:bjraaPp z9 h4c]Q#~Gŵt\[f1 ॗ00Tch2XNQ\7Ƅx9;dGiI8"Oz" [phy=SpsO}Tp}G}DHv3ap`2j{TDǏTD;ֿ3q_Y3{RfYJl;zrZwOkw4TUp^9v8QV+HօxP3l)?+ΩB"q_-- /0ښ|&*HknAQ4IC@( >`٘#hi^&vG"״4l$͚Cey*Y4ExgP_p昴yXAqR" tˋr)-A%)mЃkܶ`? e3~$Cv86_o 6#} Mg~+0Ս `%Dz9a* hv{LNN4`5T~`s ?x mwq l1*d 5Q xp=xkkE֞wtI#4͗{S Io= Y#NYR(}uE yAdXhNaI3>` !NJeS9Koi*2vۃ G N%JZH8I9jp2d{. IMXCH15F ~ḻ7317:$4#ycfjը]oPP`$^u-;B[we6b NJf =sYq,?ݾ ׷ dwE~k0"f"2: Mǚ&8v4kOf^ 3ɽ:A@,< ^5a,b1o%]o-;hPYL VPK6ᨃ|(7` $I&ƗƳdw$Je˴ ݢ㻤جB0O];x(4NԆ\m>a\  l^&ՈR5g)a7_0xzK]TkX CB|3CquE0fp& OAآgr0ڲێ4@DјZrDJGPoeoY(Ly;s[*nYXsMxHmѲz)B`-U0sYK~ZHH9XP-}sDXE ~-,7CC@Ri:Ph$+Q|6xq5@%f(&c r söyXׂ斖kr.Com2׌ZCgH@ĕv 5Cdh "Lemڢ^WbuUҼ-'mXc\lM ]r1^b$>n8ěI-t;(^Pр^r,غjspvAE~x__`zRYiڲqE1s4 xxFU%~ܻ,$r:ĆZYVs-et5AX4Y(h7kIEZ+3 i!T~I]tJ:0h.86PH~I8UN#|Gr1 2ZI 꼢cOs lء1wfoe}Sn: +1p'Ԣ^v;ѰBF'U -uA"3 ^th}K+ڠF[ ~: m@anKwbe jqBUjJJmIجDb@@6ݵ~@$ڄ :BBhb"cܽ {>V+ i",qWJs5" UEZSl¥v+Un+(q  _9]Bk0c;FFfWؿ58_ z@krnAfvڭr8F48\!Fc`hCyE cHCx߹4xnn+  N++}f۽bYMj_Em]cE0N Jn+_SP?kQ44o:;g}Kw]Άz?7p\hvur9Z5YtN׌Zr88ӭ;hwP\oehaåE ԈyhcFu.;Jo_=vNc~nKGY۹jF 3pRѵPz4An_- tGj:Qڳ88p0PcKZal<*ksQ6"DC nV܀C\QQj[zA4]] ƃn47p qxV+NT7pVh;Guz|:#:ZM `h h%?pbree׷'N, 4D\2]mC.Q}5Wm*k}OM:$aCwk]w7uDHTQ PMƋ*ԷPZ|tMcV4w=B1˺@tGn< vW謨Jng\4qru^-rZGX.U]XQbDVu+h TdhPN bEDT):W9QW}P<Gzρ #05"(֛6 TE1zwnN6FD bln(mnYe][BڪG0-k}ܚ`Ĩ6¤[(hDZTP( ( e)B6a6E5جEDo(Ej !D}2N&:N҃8X}) 7Czӎ0[EqE`- (`7ӹAn 7܀IDu 0Cw0[E 8cbPN喌§4`(*D]S|#ԡp6h"4Xc5yQ6/q.8tMbz\{=_D ڈ'ӉꠋƖ%[[AnQ**FRXv-d m MMg@*\Su&aQfX/) 6ތlfuf/euj# 3;*zOPY=4F$  :l*"*=T fiu9biU-n̎YkƜQEFb։؃ PFculMhD`A]fj0Q+YR b(Vg_ܠnCo5,Ɗ艱D}aRœxC}yDءMnL/e6FvՊDM.5V([r`C`޼Vh.0hAï*ӫ_^l-YMiޢ:#zhسEw* 68:%DZe%E2ካ@8Ya #-DZ T.(uh7@v5q 8@W,UjQ6SFn*4o+iDTFBOj*$‚`!En1aD[ˆaLJl[cZkiQun䲋]JsUrh@m-b B-67\Ad@(є,[KwV/7xADoD_c`+`fTvE(>뎔E@aQq)2͞mvnU(ЌԈQqm4Z*qۢӁ"k6#a]E "rGwE QAx[M(**AVl 4F1@ -%[DE +TqyS}I,QE9#z.Xۊ(En=*]TdmG/쒁DV J(#m*0Rj#v*ЁЁ7 yY,-5"{DhHtGBa[ u(Dܠ,QDԠ=LUޫ<q*b+l`mPP6*P( TW-FFZqU֣`pAC1 Pڜް6ֳ 5⃱Wr˼"pQ7WA(ri'\q1Փ/8BfѱDYAVSa}(dh*'kMb֛"Mw=7mL` aQtB*XnQ!WxJlYMQI=A A&jF6芈bTT'(⣂5*4bQ4Vx6#UȹՒznGr-P6ZڈD&cկ#L월EmD kPh܈Ua(h6 u 1PQ ZkQQ أpNu &YYEf)QK5ܣDoU+[Ew"@J1@(EA+.p!l Byl+;+UӆҠ؆}唈bZ,NvPXQ8"֣6 uQ hضRt/Q7j %\h4=\nQw( G*F(*UtgF+aD`⢎*'*UQZܠPmB$6(1pUYbxq(/ &6@ކjU\/@ڪ´q4o+5戛j46rNVn*͖PUmE`]"Рm 5т8"/```}IGZ"n@QZ*"VѵmP5!r*[zh֕Y VTTt o Uw&1 lUVҢ. vcTJqBjXh6ւ'jU܉70 6Y:nDlj^m/7zhqQCSpNކا3mqB&.*8r(a^4*tF(֫IDF("*;(ThVQ`ԢL=Сimages-actives-html5.git/src/share/themes/gameDragAndDrop/img/close.png000066400000000000000000000030671250410645000263170ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs  tIMETtEXtCommentCreated with GIMPWIDATXՙk[ƿ{gnӱ0 T鴚<EqѕVDžhnʿQ|m@cR 誋EGbb)Nv:wIΝo9},"ar]w1v1v@Fa(2 B={yފizkH?+%JiRzGQ)B.eSyqrrrNPQ널B=B!>lw? X. E?$ qwlqLMM},|>RM*뺋j[؀뿩16'? J<[:88#ɴ:PYTU}<Wpg:|>LR yBvf;a&>}n|*Z X.jv/&jիWXZZ:r/\hv\.ߕpRjVP(sBt]G6HOZ\gϞ%ٙ $Gu]H%YEVCTBKmò,4HmX.RZ&tBC)T*"Ldi- B8e)6^x۶\GPBE^T.,PJhٳgE5x=C5jKFFsϟh $!44kYa ^m#HHiqdPsuD_~^1 Y[[KO}b{{{۶Qcccf]#D۷o]ႽD\Wiccc ٫fgg#,*LMׯ_wMwD[3TaݝN{[r~ 0hЦ]AM2bAkkE-EQq!0 8VC}@\q`stymb-v׻%QEyk7֩yoq^ֺ0\ 5xz@[```|wG PMeQ|}Ϛ i0M3-5r 5Mkz9*Ki=x8KqΟ]j;[d27oRڗ\.8bdDs^4MSP\}}?Q\v DBW\W:TUsss8wܑ !GB[cnnҾ5ʻgffp۶m?:r윞~8΃`v"qF~[?p$<d=NRl۷4 /u3̟ʡAj FTUic2D2/^U?<L&ظbh&(~%XxI\]ظ-;3>Co]B4IENDB`images-actives-html5.git/src/share/themes/gameDragAndDrop/img/eyes.jpg000066400000000000000000000027011250410645000261450ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "i !1Aa"q2BR3 ?jzݙ]:0%:q g/*; %?xʸXC+ȯB,FjlWVqϊYZVLmQieb|zq%u>%=:]9n|{+ \_F{ {ް~Vz xCW![S1tic~S`qm]S]\<4M>hK \`ao1UӬh+IAHerY \b婖9;;images-actives-html5.git/src/share/themes/gameDragAndDrop/img/eyes.png000066400000000000000000000031451250410645000261540ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ˧IDATxb?.Ā Kr] 0H]:,wm'@$=`@CZ1 $7: @didf?"",dud4MiB1q0U⊬ SBJ'ǐ؟XZ b9 Zj$ πxo$ŀ%!}#dk@ 5U=Ԝ7"2dī)bRߤ@z2X*~B@l@M˺|bW )H#3!XOb PK"<&2Whn$E,B-d$'S@]وTr_$5V1o8ʖRԣUG.O$ .b(j!I2І7(nPР;A'>K@| y>ޖ]l؆F=FiAh@H 2Lh B}@bGGJT1#T f@Π{abn/ kd(TNJ@߀;C hfL@-V"?9"PoP3 SAXB>C2>:MNA tpZ gZ$5>]x pB 6& [mEhVD vqo@6h#xI5!X[*mIENDB`images-actives-html5.git/src/share/themes/gameDragAndDrop/img/eyes2.png000066400000000000000000000034021250410645000262320ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp L!vIDATxb?.Ā%3p] i:~({X>;l 9fS J$w$ /@<8NF( @M5Yȱ␄"̽F@| K6Bp ^yPZM<'PZT9@*>?K} g~ hB-ħRb@ S8ȱDׁWP ۡC3/&g pw @V@|CFpQh[6R@|٠Eo MB">@]XbRC+XsiRk."Ak-sHbX!;G[ErjT%@_sqMME\)3aIВ# JG+. bPKCŦBqZz"~  > RZ`ta 1 !lT0kB# <[&Z ~f91u>B7POՁ8jvb@Aj)T' LIq1aT|AqBbU>5( ;NJ: {6LH#S؀'c ukZ MjФWq8Fa;8 bL@ 4 IYX$DYI#&#D_| Q(zB'7v]MK<#&. R&{Ww`qYhqIV;*Й1V~4Hx ڶi$_"|ӦQ<>v, _I+?ࣝGi@Fс_ b4 [J%TނM V0}Hxol4gtU46ly,, L[7>$/?"* "/t ImFTV=i&y9E2;E!'ܷv%iFOoBGGcn/@3M4QR8NFPc  AKH,s2]Q>IENDB`images-actives-html5.git/src/share/themes/gameDragAndDrop/img/hide.png000066400000000000000000000024361250410645000261220ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs B(xtIME  % K.IDATX͘kU?δ5M7٤䀶'_D|4Kh~?OTԪWRMv7+(Hdjq61͌ Lh,ΙϽsν(eYHﻁ@z,_ȹfqL%xxdfD|\Pg,jck(T[pOo!~hiYa㼵Zy^\NC˲ފRRE$o3 iCD=0 "^& RBmT*Ja$|β,,h\ϞQ.q5J)!'fsL6KU\iR(p' wKqkyJ%l<9x kkkq${nnq"cM)mۜ:u uddU qM$8NLP'\ץX,b6Zkd w޸sYDN+˲n"z=;9::gܮ{z. \p7KKKLOOǩes]:lv 4UJL5Gv\..jMkkkcrr2zv1СC[*bdd$0sRT*bY $|Zk,f PJqEfgg\thok`ǎgϞX墱@;uXR)rinQz{{gpgg'\nӢ&&&HӑֿV0 d$LLL`a055E&R d~dduuXt\.뺤RVQN!F^qWUy^\sغo9`m9"nqcPfXu PDVSUDM/ }6|]D2PpGD}00~Wq:hKZnݲ#초"TFҥK0ؽ;  ;̶14i- +ÿ8U$iE+",I. "ZD*aH␝mm~a.ଈ}OEV Z} {jygHj}Dǯ{r̎fp֙}ǚӢvk~gM}1ưhIJ>fZF/8+ɲՆ[c:E:dTGIk~t܅ĸ6°)DuF]t8R!vhЦ 5Pp;QW깚ʅ}Mi DžJ:-:kW ӌu.]*FŚjX JA 7ѢkfCTLT:l,ĦսI5!LU^kͭܢ pYwSRAd<}Bhup_iQջ 3 +F[ց~Rd+5£lnBB .2ҀFO>u*pV 6p>)9Z}R xڍq 2hl ಆB ;cex$\gJ1X 1VJRqj Y: q͚" `\#M3B[[KS6O'W&-v IGMuٔ;jb`crs}θM'cgʞj9"ty::TtL)CѩF] EʒORJcA M"u%Jj!MiDjS -iғ$q\(9rscp 8Fn3)tAܲ<ABh+tThk\KLj#G%Cj8f,a_+qœ4# v!8Q9ɐo;~Io{g2V:MjC#Q>) r9|/H0@h!w@!ЕܥtO|')q< t4tO4yP (fw4N(0D z1Ҭ1@3+\I1 Ajq$ 4ZoMA:c<ʽ+ e+`,UkIg^|ls1$Ҥ:0 "?LO& UdS\?23aG85-IVhF'<`k>uR=NsG>]ȯ9)\.CI0ŜRĒA\d ɚ5&´9ڑId>H釼$1j6’v07~w?YF2㧗*cEl*u@|[|=iL(0ĵ=n.]@(pCArDt 㪜9+npGL,w^T KdRWOprb-9z:{OLԋwW+-;? 6 Gv6u)KSWxvf0FX-P 9 =\*J~rVp~O79SF̈<%rjVcۃLMt+tw%?.itl!3IÍO10EY߉72Umd$TYa4&FӨ~'9ߛ6vwEZ( $V9/ 1q?$ڠTVȴ)A0DFDŽpI VT%\R9d<+h9egw`z­[J "!it.VÔ$퐯0~~#LF<# }([eb#]/<~^o0MKcΊN S2&S4 swΝ?aKOB +(Sޙ^~pZ/ 4ۣBݴj\E8G8:zomK8l|;kW`֋W+od~Nv\>&E{J~r MZJVR>0\DtCHTm4rV6]e'sJ%`dcIo4^VJήL^|!9DT`ߌ0=]Jgo}hc]n}fQ9㷂I,L'Wo ;?v0~Jρ Adobed         #"""#''''''''''     !! !!'''''''''' "`!A1"aQ ?[I7 o3yxnhBc'`%̉z͈5p4kֶRD%d|,^6ز* L+փVrgJ[iPqp7=qV:YPW1>Qm:7M<ԓ(0m>Vzimages-actives-html5.git/src/share/themes/gameDragAndDrop/img/infos.png000066400000000000000000000024221250410645000263220ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp *#VIDATxb?.ƟaD 0yN@8;k,#2 :S#wوd; D@K^hLL3?@#6A|A  S-b-~u0? i@ j̓8#'5bb5!h4S˘uw->7RRe_ ^Z'}X!-=hg?0eq5ia@ߴA"ɪnFKg@5Άm(zlc1> ށqP!뱿8Gdv9IK i8q;1Gc( <2?G=7%?Qx:'CT֫B?rG=F$0;^IENDB`images-actives-html5.git/src/share/themes/gameDragAndDrop/img/infos2.png000066400000000000000000000024621250410645000264100ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ;:IDATxb?.a<0EgB3I FR$p$N+pG $Y#q՝ @didv|b&RmD?Xޒ~Ɓ r";U", XH [7Lif? i2Y!=r$Ѥ4|}6|-#օ_ܙe#7RI @I?UL ?0ujNk*eH ZFP`w,GKm@5Άm(zlc훑RhU@&Àcqӏ41m7{K i8v 1= jX7cc q!_sc7=Jc+f6 y|Hz#r mݏG؍7qIENDB`images-actives-html5.git/src/share/themes/gameDragAndDrop/img/meta-doc.jpg000066400000000000000000000026451250410645000267000ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "b!1QAaq"2 ??֮\"`eZcN@,6I /;mȳA @sB1`!W9iKoDoy~wa`\l„OSXڋtm,:J~0h. "N|uAw|z bn 8H*h?Y ]4MoK۞egm0ZIj4RxS n\tIrjd' g:IDATxb?.[aF40#6p lb$ABrP'K .p\GïIrx. L DN`s"//E?g$k9 CٌDv[ڲD D\!@O~b)jƿ@, UC&hz/@ C.8@,bR# %&eS#DO˞2k ~K.v S/XCe@mȱ g6G=61{Laćѻ jT gЪrPGبh|cRc nTP6Trއ?hqH1}6 3mhdE8ঁ*IENDB`images-actives-html5.git/src/share/themes/gameDragAndDrop/img/meta-doc2.png000066400000000000000000000025351250410645000267640ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ;IDATxb?.a<ΰ ,h}qg J 9fb/X]$;$>մ 覽z@PaT"K#U @j)z`<,H 7@\e3\٩nH.`!X 0~2峠AZsRԲl3C-f &$Gnk XT@â g(l9K8;lS#=-{JOˬ-q*Za"@ S49 j 7C2k Pب(u4q FmD`+b5* UHl-#c,5)Ae)CIujX I  I-#A 02*h,@x@Q CxւֽIENDB`images-actives-html5.git/src/share/themes/gameDragAndDrop/img/nuage.png000066400000000000000000005102351250410645000263110ustar00rootroot00000000000000PNG  IHDRD;VtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp G<IDATx eYZUWeUW> G(0n$Zͪ[@It넑<**[v 4GM9Fg]@ݺd>(wq(C;* ~:|"\sUi)w7| >ry Aɣ)fTQP1n9͍XBz|I2.zέ gR';\G1EnPc )V,RGPNQkY ~Ev:O<"yT vU#yY@*Q˨1;||7l8hG ! JfTv$:G8>=[ hƇHߑ*H <8e@{ U̎2@!T{77wQӋ~DREeLyz:8pT~C1̐y@2^` CM]kY1u5=s̿obK@Na3 z٭7 ɖ,.ZQuU-)?C"7Z tA~?an%:Z0T4ŀ[gV+FRg@ǡ@F ($@hcHZI|Dй9KFp+ˬϏ$zwa׺{:UOG5@\:sXφk _U^3/p<IGʩ;d>`ȡE|Ry$\xŏ{,J mCz 3":揶u2Z ;4 T璭[źԊH̢M@%n`pb?1M@r*P}O4B"̈1{h *Y ThJwBJЫ\EĎ xiP\pΘY&:>ÛjU,Rxp"=d $I2p` 33 ~-"P%UhxØuPK@#Hu^2_IM,n=k^2@q^~Ǽ4$BB> X"I G(눑m,E $Z:5肑<*r>"yPPCa)I$7j? ^u0 @!QFe*:VڹbuՉZ<($8;[b%60@8Dr$:D(@E}%fIGp|Ƽ{@1Y mL .rs Sdu"NT|ԅ 8s|51@KlHCF(ϨXM2_0N=N.@,:Aɣuߑtܭ)̡J$tK4J@y/T KCLTPlsdp1ydcdٝ4BEk @w{pN;e@)!hBU+Hj7{{TIU,%.ue=P_޵}4jS]$7)k2#aZv8Q>%%G#(Yt׼$ F 7AkfPp:%kY$.Zcj2{~T C#") YCub ={5VY#ywUW4A^HҲV0Rɤim ̦*[n2Lyd'꺠:~Tz,T1Đ>B F?w%T_:kp+O-?n$@Z4nf~.&") n=.?EDgfP0nx^y-Aa<'Qu.#h: m`3T7 0K*$1>S*gI)a,J REB*qK=*~Ƨw{ b꼟,EL4Jz+qt(+yO*h.o-x<)H0 hNU4$0Etᲂ9RN&1E(Hvx ,$K$ô)SGF;{et/f̢!iG2I0:-g }^SI1  ﶺEˆ8\I ¾iΐﲇdJ9WV"OO|CGw$ +D:J"Hk>+Uhk09z (İ*OaM]C"7Q'-х !#BH*Wy |suO6>y(8酬ŰTeAknP[sSeI$PRI$FC:: h/lO 1G{ ߹Q [#hE Hs+- 1D:% (s3ĎG3Ӊ%4 CQR{t(8h>@ !%N?a>DnP(Fs[ %0Eh D󫘡i:3NwU29"ɳw[.?=Fda`7z-ܻ@Kfo (i-ի٠#|^a風YLI_! k` /aT^񭛦?ذ) wggZLu5χF n)| >#CrWL(\;YG ͆dpz0MfPpTMQMC _\0*Dgq5>o4R #0C@GJM5n [rmSIӷZ*&ymsniRl:ϺQ EåNb*t5G6 Y$Ӵp J)qΣ~̑;T,h;HAw2p;s)j͟5_y@tu! x$KƂ zF:qd;a6Ln'N1h9]u ),}f?@ pU7mj;.OH0,`%\bؐDbnz g?\KޑMCzQKED½x^A7HAg?HZf6g'%1ώ||ZJdrHEH_wP@S׹`u H AzPHZ$f}hbw6_ Kg+΄d(eV"Ih#FEaVP@IU DNp (aPT8`TP۳-I DE#:s6yc/J)dHPKfD:mJ=հy2l lKѡyt^TK$l?3 AJPHC"Qg[1{,3B͚wۘU U.!  HcU+ x8əAHAC $HAs8!tR60ngRQѼWdH>y5ޒYBs?[HVn=ɞjvZ(>e^Ok.gH ",` w!ōgwQ(;^aGs滐$kw ciUZW2@H]|IIFw H͡b^)-uVL/X BWbvB7w12g7WeXXgg?P US,cXCr_9ڊUMUl?v#GdfHNw}ibI֍'ݰ)Fq $J[懒+$deVFU#@P`]f[AJ"1P(${@8|JΨ䐏~3 bs'ͫj`\=NsW9hx4JkrI2EϚ׍>jTqUwSim9Hͣ$ ݠ](;(JKrhB'y/TVX$ p1x< %$Tݭ ,+UG{=|t #;0}l P(=8h58 UkޑHC9s*9 ЁP *$3(jB0@:PncX9l>^>$Kis(܇ hT' H %Gd=U$G*{H@N%T] _C6 n]7iWu hh%%eTwuحD^c 0hzgGxEw)Ww03OWWnΣ y@G@ u#]5$p}߻IqKȆG69B)L3l4h5}a$lhz4dB ?(J W@hU?m^l8 9@Kv#dK7a sdS4oFrZFG@RDAVUH[OyBu&ٺ%y*_ Wz|2lKh/;Uq"]mmAI5P094J4+Pus z wNG@1  ͚#y@|-^v1 +(*٬gK A>0QLJqzh N PR]w )1DXHI);rv#Y{K:i @j~%e'zцo.$$ɔC({ C|:US$:2%Dġ@ݔ8 @2[2 ly7D`h=Jkm SĂ-G 0$Hɡ@y'"*N<2W~fj$`ЁXPGY#+y$' Tpt#wŪI֡*u=.nh™C7$`tBq86 yG7QPЋ$lX%ṱ3{pL8YTI;Iih I߷Z(i(sU;WYH9S탚})hnp3$19(ZC%8JBl2H:GU}|#֠H3U(z85bu+G篒o$ ):!~JFn2?" "C HAL:.ȳ%&E@@%|E yn 9e:sT֠@j#Iq&|E9tO憨\Y=V6Hq ,ҏxʼ ɣ$#0El~TG1EPЁ9H@U҇)Aݗ*# yE#I-?i~1ɣ죂_In[F $d~#-@W!w<ꖹ.6T%$֝ kl@rȏKl HR䑺u}k滏(@h?٭OUYA 滑e m )ivqS(ub, T)~̑yDeH Ht0M/\#Te~ͼl!); 2_9͡sEIs@ xCD $ 3 .11`>J -j }';p]fQ^Er~z;8@ $H3[UDf$!i+2HWGh_ɞF³ $kS|SN4hS@Ƒr9rcF,<hBCSIDf~9jӍ@x:\HTځYFsaXPL,$Tu{ ĀG*A3~݄=':}-{[(8h*:R% ]%2.&>?f4w9TIH5G™rs$:KFtvvXFpȗ,Pe0R`!딃/{-ܷ:hFYHZpԚM%h4Սt|P@@((N%L4<)-R*P?:+)fPv(tP -d$U[F,Pyɺy%x ? sJPUiF9i.@hB4GsHNݬ71E" |-L #u ~,@>ό3dЪHg6ܭ)h9NB$-F1$({2@H>G GfԅtS$rFҥ7 ӆ1C().mLCɣcn=ex{X+uj@pHu(@u18Q8QFR*S2m vh%UqHyT$]3YI EΨ!_FdNT!. I@B'T/YY61IbI=.2\dBՇ<M.S*/ }DI ;>R) c>$.JΕmbXJfS4 @7*5#DDSN}JF8RI3,Pq™.VU3k>.`h94jo/Ȓo3|D^Ou_i$ $bP ֪['Ѱy*G3s45!HT=3vdpFRa .Qq 䄬!·0FEɢ; #HBH|&R+.]  U$kQW1"NdK@S(5Ԋ:/ʁ ~* d $>_Y( )h+Wh]ts!P7ܚ MlcE][n<"(e-cvDF(}0-`@/C'ӎ.:K.<(& gĵ:V1ElGtPJ A㸑wH9uZɣq;z5(r"u]7/A s L}> sLsI*h>C_й8Jb g|:fhB jEaDEch=6ev]WY|P_LAUCR_ZFJ--%TQ{͘Kpv3i0GèW $UM%v 5z~52|&x.fc H1{:,ΌH" c@t9.ߴ }$#B7Oɗ aѾJu#q$U;]F%9!Cz3A EC=l⚥k P:lBz;8mE'EWffPZnj‚8Pv3ԍ$)0(L9^V̫;Ql hJd@jك5qΣ[ et;3὇DQɭKc;H!TA(u;8s:YRyRŭf#) wϪyiqL^s@;aX1"D8$4񡤑HnB΃g0.w$|fHPQBU+I^ .U:.SHۂ/}@N06H8t.PlhQ?"= CCR ҃;:a~dJgÙNw#@!K:Zԍך*t9aEoPIIu\Y)˪ч1GCDêbѾa$'m+KtǻOi  `xV6Q̕ 8p^n$](%Y b!.Q]07Vs47Ǝb#fTrhO5 D]CZ ҁplF%n?2@'&Qa`%[S {խB7N4+u%h( $HBў4gHe瑒ɛn]6G;EWk++F@6(yn3\:_[ Nv  3P mT(CG||,vo7*1@6cfQEGO&!gNTf59$8RȍgP7x bvB*~{.̲3Ƽ#B hQvT,"6֋B9EF{M:W#)qJQtQ@a"V/->0zҼ7ɣl֫ncHdE Ns*T/Ɂ!L*$_' u#bzp*IP@_]HF7M iz/}q| A H) 8r|ab2~U+y@cJ":T7m>t5 p𡈬wTC(#k!XP$ulƳWJi7ăԝ) B+PJSqC 7@$SP`k$ ] 4#r,5IɤSa)iA(]h1oC$1'UK~D\}#SD3ٯAE_ /` h!IyƘoE17 ЁFAKn}0bT*o"1ALQ3 ڪdHlB$<bC`%>V}\u$:Ux%G9$hE4^VpFԡ((pvͼ#QGQ\ocQw] ~5 !wB(}'@&ͫbyyټ6& ZF W`Nzg!r4oP@*b0G(}˖lRGIR|BRT½PI$ 5U,] *8YR>hT)xռ>>@/7s$QWbK(hatSs!Vl!z3Ć 'Qf%1R!ʵp\ź|Axb>d^ _5HUi7HIrg");8`QPD}MQ@mf(Oa3;;JaL) w@b^p%m%cxPuUo&=QY@`Spn3TX}&: A̺Y=m$NT>1@1!id386l.g Uek.LuoMb Am5b4xPpX $fAR]6/ {-,RQ P=@QVZFzՐH# 1Q,RS=k${@)dⳏpQI1d~@PQˬ[oCҌ (hHBI^0_ G4FTh7j4 S:%QJ] @^ `8>F'$MG|-Rf(/ł[Fg-Kw$Y792|kEsG*Gwww_,n=յyͭ7~ߨTd ^%00DD@uU {%?T)Q7گR#A"t0]@}w3Ăhu qГ~692i^3?)@LNNoڭsKKKtttXoo XwwwuuvvVFORQr;ܺÿdXArȹ}ͭn=g~{Z:&q|%Y~6䅹(ILPLj.Uʬl3)j/9Hp*QaĈΚְ[=JQN)on@ 舒Z1lرcf?Y\VKp5qD¨>OO&mCD惓SB#9yʐkUнlދ$gDԂ:\?oY./94 =c,{yw3ST7=A&iE\̌:R|l}}666Kˍuttlwuu[{?9F *Dr'ܦ w2e%?722yGRyޭqEn$ǡ0K*Pw{T[2.ڒ{ T}(t40ZH ZGcA6/ʻTw)cZ+w.//jF]JzWoG"7XↀGNrGGg;|uuݷ\w]-b;?'&3ǥcCPbo|7*a6a|Lt\7 jAvL3irx_ ; hRhѐHJ}WWWq `5xZVa;;;R? 1>>o///KmjjU2u ӭ_tF q5GBܒUP $OO<t CzW61G] I 印O}M0EMg 2FE@Gj,W X@Ø#S~}IW2ځ|񁁁vvv>qfoo^C{=w+}t?vuuͻ5o[x|ٙ~ڵkX>%vvvk{{۶lsswl299NB0ĩ:22]?Rh#GT%2ڧɭ≀Sz1GjpQ%r*EtÑHSSgw3ֳFAx=P $݇[vwwl u~˟jɓ_򋫫Th||%sLr{P.o```ѣkvvNJP@H?hI)y$̌ngFCRSF:(UIA@͔Qud Uֽ߼4Ԏ Y ܗZK{{{VںW244T-*Gj~~ڑ$:uS]]]_?$bt H eq6ǿ<ܭfT@ZUu]TPzХG 2>:.V'۞s\Pe {<yi AgMe >r˘$>[yoĐ$jIե@﹬ut_wƍk7a\f399YujyknݺU:uﹿgw#- 7778ژϞ= w|[?ēINڥP xIVt$BVnI^.uLQEtAE]/|Gf|)y$ٺȂ TDq|hs$4b2_xPc5ԅ.4nժKzzv~ĭ}~5ݗܿzvE PI1G>z~A)>lʚGF?>#<$}vQ;fN96/a3¹Ot)Fe{J0覻DU}!W /Md$n:$ҏnuM#yɠϹ+:Yu3gTOK(󍍍U|O~Wgggݻ[o^pa_gg'N8QgfyyYcCjz1AP0_U?7mj -@PϪHU1mY_hl?SfL%^?%vSTD7Vm~kb3Ca3mHjS@܅oSđ~^pKm/oB[!I);w\U-MIGjT҅7o^<ySɣjH'Of6&-̗̑C-.߻sFKW$a<BSSN8(l$A9%r" -]TH~u15kruo=>BBݨ83ҏGzíJRARfttDJ~IrNI7ns#,˧|,m}cᢕz݋}Pɣ,nMmn}Z+DDJ *=NﮅK>ԇ+'1C # Y @"TG0C g7 SqkJjѴJ;SXo>C|[ӧHEfll*wov)^moo1^ x~RƷzҰo䁏O0/O&=e~&j{Q@$n=HK-׎$|5 IՂ@` x4*\D caԱ.eL yGYyr$F='*[d J(}TDgg|i\"kΝ{~cckNuR0}uۭ7C\˗>:S}_Gb+R+[GSA^ĨDh(|J$!5i S@i(uĊ@RE)bfp?HVFd⬿a8q՘}ɢFB__ɣX]DvEAM ;;;<<<|~wwfgg%u˩9oܿ秖ӘAH ۷o? 8 |t*0|=8':i苷T%3TA {suǃվ"=hzdcF@+EsŲE_e 9y$ɣX[[~rwRQz64KjX^KxՙQwhmooWOn}ѡ?q'-[rH//vueF>H A ]rrmN$i*a,8$e'3fƂ$U_5YDQupnpm B]Β~=k̆˂O(û 4׭%N8_jDU՝;wp5a400tLɤRT]՟+J ޻ݟ2HD.^xb>Ŭ$fHNM zڃ<(@UJڇW'G1G)+7"hzOf?7I`Yt&~ (6@J7JM* Zn}wÑ#Gun|ZygVVV!T0Y픐Ҋjw~kRxKwXyt8`p/xfEARm@rKfTByOjP.kTA[n=cQXNBUyM_w#ERO/h-DJΚh? ɳ{ GFFr{JA~O%>\M$I2OInQ󝙐2<:>Uo;Ԡݑ}P=ə/v__t)tF龯yӆ {7۝K?}7_ȫlZ^ihJ&OF!i HDlO`x]HwSS2@IEM#<% \ B6h%ɭ?Wwvy].W:߳d[-IWIzoo_.JƓ.8. :.F*=}Z[[;ֿ~=9}Zuwt\sܷZ/aeHu!j~*UE0!w1 w ѩb~hzZTLD"+N!g{'@+Z sZ5ɢ(%SssW~fkk0RCwp:KVEH%cxp/νa ڜZJō;H-wH~Q'򘙯2X%/LBt}ӌ*%T^tͨ6o` $fVBHO'x$:S4@J?ʨ)JqQA%Ldݥ?y)H !+ ' B]%+`PTM\y,}xj7ڏ9R kmP*q+vwwpm_q_?c;>WXRsܹΰG<8p.ÇI{wuwwk 9O'$u+祛7oXJhPRQ`* t%"<بp[[[&=u wxs<B qoQY] Չ=kJ^Rv˰:9/[1`;= QGms>oUMt@wp}:)ytBQnOK@ovttQŨ,rVZ{[5>hm%K{ljC^FGGoV驾i{/Y:f,2Qm׊zm6zyf Rt~xeVG>nF2<<\H捻)655UM"-,,+gܗϸ%CirD$]%t ]2ʡ5h$ׄm )Z|m#(:M&P*l wRAX{»NSWbJ!% OYEӊ%*(e"%TXߦ%6Hj44|(J˴h6'eUP&(Aou_qIwvD. yH;b~7nTˉx:4M$>߿>rWŒ3>aՑtuު+䪑4Q0p|p(nlUe:#TBt`Lp(s A'wAzY w p_U*92XxJ;ݠ"k-DkXA(5@1$zK7ww~˴ҪK|LRm-\藃7fxrzzzv:i1( $!~zuSx%f|vjݻwy}ϲ@Dt=TH蛷_)YJBhMAU FʮT> : fw3gf&OSƬFj:HBc#EttwwoT*{Y"%9TbJ>)΍_YD1aCiHTɡv_2-޳G̝Ijpxʰ{}ۄޞU| ƪ9xXr%HɣʉF$j̇3G/qv1BM?i<\"LSD8ה? IT].)iLQJ {fW9$.TߣiBAjI-`Bw4l֥5m$w@T*^,TLѣ,*HW"I $Ų8"ñclvvV]nv8$-Uj)U Tr9+}UK{ݚQRԥ7A~0yUKH..8џG ꆺuV>= _~Wl)s@{u߉ Dw^a2l0rx'сGt#WlX cNK"un.L o[T=شKzQLZXjatt/#%EȴYm2yN˴։o%n2Oyi UFѴI[5 xzz:QzyK EuG}Ϝ9SmOL[h?П3|H6/cKPPo6ݻ,B;=c^^}+_5'Iv%,0)Idq&=yH}Mu$&&''bmmE#"oTG1ߝeǠ %׿Ͻ?l!afK1z[%U@sr4zV6x[@ԭ hG:IUI]WLةS3oH UᬪxC"=[ gs )p0OXB Xh@J'F;mL[\jb"ӖZ 4 Df5qsVTDuI}')6661D⥹@ U݈II EE>ds)aޭowCsyhe~ T j9f: V̽<$$;{9HÅUcrQ滑Ct38hrH =9 \FG"o 3gK.Z]ZZXjFb}ݻqUh7*bcǎ*!m|G3ERwϹg'Մ_֧'regϞmyV2sssV*yIj&3NyYVuNbHu^ _`{Zҙpc1w[4vyE)@dnq@J^YY&51䍉 !T:ܻI,:Sg @]8λIIrUoXXІ{%HWYFX4OYcusEpYĉf"s_`{QJȨ*!y1F1$G ~~_12<9H<c M GYR#*d\M+JJNz fPusՑkɃ[]1hk\\YYA,b3ϟ~:#041/_:DwӇNKj`hR`w$ H AcO I>zԉEUJ&r߭Y(KOVA$iXeo677jŗ*i^CK4h(!ͣnC%nbPWl-<I:.(fhs!W7sl,ݝu4kHGB|`yyY{VK CNWq򍍍";1y%{­!'F>$~ͫ8| HNR[]]&$ XԞl5Ў|eckќ>4/E隇)j;̣|hejt:Pl 3ԍoAC%<;B\.kkkՙND^$ Ix_)KP%saS!;mbb"jQ!GgԑSBWMMMUzv``n (,w:hJxʭ I;hI\5$*kAq qH ENFX ~|>c!19Rd"Up'e233ӱ*o_(u!A |vvkTommmLv)( 3uQ*$G/U]WL[mDAp9zխF-gy)' &@ǬjULQ{.u!iWG)-rϔ|$]# $]p DrӅq$YFJbcggKJҽ-mـIݗ:,c_H^(~VkgZDN@R'RZ9@D ɱ1/l9|(#8:o~6q rB qZ!wJ#sn3Mټt4zU,4mi1\6/Yn &8Y__j}j rK mooE o e u0K?coo/oCcJmmm}hrBZP`Brvo6&i9զ64HjI ( ȼI٩G)R;7CW0C}ɦΘtޱz˭LI7Jⴋ!:HJIB&W.E?+ѡqjƍӜ[sDrY{־ @>cIxl&G`ZP|dSnSG|Esfh OzQ jgIoHAG'RyQ\@$FT:ie2s7uoYĉU]՛7o4ѪLоk@ П5D3_QLu")K-(Έhz3GbJG`uQ=<2U>9RG$-!ir %vvvJEKֻfs]H~O wD%*ݳwرc3 ()ϙCҮM^tK;QGdskt}Jrl*@~?yYJTtΖ<%1pЂK.nG[^^JWu:>>KI iT9)րeS4TVv1I[PoS\2jA-?]HJ 8}T;l>FAn%$*y¼lI!e7+EHaHdp;֗Ek6:wBWWW[[\.#oGpIڎtt(ϺuaP%C 8:f/Hdny¨il\i#*:IQddUÜry=*9A춷 WHBb]]]O` yh>RUqϸ9%t-2Kdfh>[2CGfrt IMAus+JR)qZ$Ŋvu)k!b${NNNm3٭+niȚ`֟՚٢Cp^5BN(xҼ||ErjOBW^k8*p/bdA=gSjtK:ӯOȲC۞rL@]G͢z jx=r`XQذUu`0%>̼@lKJ<$R#h&@ûhW,ͰH Q}ed1՚2)2|kUs)hLJ2_89 twwK* uٴkRiԾV_tsst\=$&$711Ì'< (Q 4<Λ E)d|˼ 痄 GAAͰ\{7J5(KuZ}l_AF{ȴy9aCU<}dJ^P8RDݑ#GKӘrpa\$,g ]PGn#F7?( >Gw(J"d |B $SJΌQǭOCzQYGq9 Mܼy422@2(YRggX%Yg姣%ݖ7R8󶲲r/q9OSSS'0m6 X*ku#ubU&-"vsc9ޟޏ&k}ӛZ}fF3ofzr$ה;CC%6Kc\8;cxc!]5T ~73M.Zjs}WhI->_[ݒfQ]aiٞ 89 gNSZ\L{dGd >bzzzossaf07!mZJpX#9 'fG6ZXXj꿬d||Xp2) 1uf[wQBu9{\Y>)S<[Y+0q*}+0iܗL38f333+}}}skkkDisāaJ`rQBR=";;p)܁U:r GfS@x;md]^reRF Eq4ߓL-dq$\рeHAÛS{xˁ15q{R'n*b7p.LP:DY!9j6, ~cwr>`fv820_`'#TڼUa _7;;FRIFIHXX_QD_;ga*CHE͔jG^\\<Of8@1aNGh@  qP(/Jr79#4 *[C2UA!W»KƁL&hZ5'G`ddDif8r@dq#Z*UQG p2 dF$:}784o| @q@ E>NG(43Ba1qRh*z3B}000볳h :duLޥM2 yUWc#s.;lzYI5NKKKB#`' ⣸YHz k '#B'yAf29m(y&YrȻfFyDbOPIR_(g󳰰p𾫫kghhc9 nލyg0xUlnПL&;2QΣ/J֍eA xS@#U9-[^Wa 4j" xE)kj:NBAr* tַD"p,4hٷ ߯t'leoύ]|tt8h3}N#T@c:֔Kh>vB {ӺCy8p/|S@! L;cU܈+#mq uQHpsS\lB(dIJQ40wg,3/ߠ\,3+ tx(@@,P( Zov^aBQŦ\D"!cccyOTWɪ(iic"M%_뤾G{c lD")̊h%'kf#b׾{"?.=}ac; ˒X F٫mBPu}DB{9o[֝>>;;[cccs]]]Ԩ 3%nvѫ*!mX@Jӟ0@Bju:eBN:_ᔴL&@ZV[g[#DQA:LV5r9ewLXA* igʽ~ ϣ))!ĥP(V>gG>'V&Э}:`A˔y`@t/P $$ d*E[>/4Jɓ'׮]}sGB0x:#bB@:1}N_`=ntlkk+|=LmG?HlsL@qL!nOԾEeR G00!L9U .m HG_iUs3jx%,:3>`!!P(??᳢SqqFpMTJeUZpG92z߯_tuvv }dQawwWPZ(p :g !ōGh zi3*:x 4HX$,a?a6, &G@[k~BqjSs*Za%Qr`A~Gv9!Q $ 7?{Lzzz-& B-UΈ}UFaK SïS^V".V%ohtt4I񮮮FQN!͕3E U0)(A;ž''d!Ix*q`¾h!H ^18m dN\OH) |>ۏEKd=dFvvvdqqQ&&&Ϝo}>[e_H5O^O[rhGDX.$b Hz]6pJdHbx?^$_[|/+H>mNAYHq5-AoK_:Vtӑ|65=@{ :!P(?=q3cIgggz@2_y_ "%^QqPw:N#sCeP'7d]= yۡH$ZMVV_yduH#Fi $Pp@xSjšBJ,1'$ܔUcrJ]oS,9dC:BG8pآt)#]a2څ<"$ J{rm%P\ Z=sohh;1bّT*Bsߪ,oi3lem`,Dʔ3^ukVxA1[eX:Jy%>Ҫ j%?ӻϞ=7n`c8HpGDBB̘ Q gR8Df%T9~q ()T) (nP<:Gi 8%q6pMIl KbHg3X>󛛛!LR8V : )ߠʇoЦ(ҦIg|J.0ô_8\:UgOysð4uxP2ps쏍}?G_$8_2b ~.!T1Τ+*8{NҎ&P@q轧!|nBҁz>⹤gKP(S\mgOeguDȎ_?tk4BB;d![WWW0lPx guv4U==rA d%AF;x*?ʆx@ NkߝN433:l︮a'<`-!dG,,PGc24Qf] #u3|jHܠ> <B.s"84FvRMyDg?7A?Lo'R;Zط6%HHH^U#nY:ğ7HrA c'&Hex< ,zzzםHۂL$l9в[Dp*Kz6ńT(e]E6T'lt Mr:DdS|G)A{c B~g(]]]-Kcd`` ]wV#3zEߣ-F!{haaԃ#RD!8+W|g&)ÉSVzF:` ~SAH!\oUA#P iT8D_fkaB* KBidTly6 zIOf)E(ҌFEg|PHb`E?2}n) a2 IN#daԥ$DDT# &1($M(q9}r;;;@S!GDҾTIpwJ!PaM$*$"- 9i*qt]I.́ˈcSq?gͰGiѨ/e4R`IXr27Tt@;-?( nӯ6uêhRuҔ=/E# $ FB/]?XV`y =DB 8)Hy= _hÏHQ{剸 x5xH(WsK—AΖftz\4ߩ$4tH'FYlxRdTouumkBYr[Qe"蟛V,27XrGׇctCs1P+8 pLg?rzeeSHqt'dn'YjOcQq3atFQdž^,CHJOJaS xGzdJtz r:hkJ!}L壩]!)̠;JFu(>@R{m DF񴸁W !(k FuUc6bX@,LB0(tdҸ I|6U aEE~('g}}} ΝуǾ2 D?ߐ .u #=HlSѱ2xNF_Fw=lꮄ9&tT+Q|~aY PSL勂5gKc_uTQ˜BH@_r_V= ! _j*t:õZr]\. Y_xҟ$2t a6dN7qv 8g b:I8`gө|Ճl6۔߱ O8㟉uV"d%XB $84`eAQQt"C>!Sz | adhe=w1Ӽ.od#Ca%=L!NwƟwƗݭ;67722̬'Ac,pu4䄣>o ^?Q=ȼ Rlp ,~)6J挫R}:Q*z}}k{zzdhh‡5m)8㓗wj$D1n  30!Ѳ#Dz&tGd.RvAt[!Vz}|\/c$!:/zORݛNa"e !AJ_opI@$d!\.K"v.J -|z?k׮]:Q󙫝T*}y {3 p!ӨO;LFH'l*L& oH36Dboo?]__ 8Ny|Ak`C9g3Ho )IgI BBxg ʢPp !,W riKm=\'n@DIA0 mq %wGUnp$m0~IR(ewM "46D_i /yU8 8BRjEg-D܈׹wϥ#`0s/Rs*KP"^QN2;WjSsT*;^eH$&OgBa"|_266V$"ԝhqTyjèϱ.@Q't vtT*}??N#3I8NӧCߛ瘫g"@4!uGJ[ ҁ _5=a 3s*p =n pMKΨQ=S=]3 :*#MqmL(TuIB ->;.dVDjH [Tr~r~o;I>Q6 3m0ѭ< k:L!2gs`0*\|` xp͛9Q 5V2I%]݋5^| C7UA Ӌ3yHz]PS8N^Q!ۍK9Lp6GF*8mL;cFZh%&3V}o"Xq^HDܬJOOEjZwdJ)?'0Y:eip&+Oq@jcD#(aX^^C`||<ԩ-f %`[W8vTB p THz35Ω8n-7vLi!uĩ{G HgT/6+>Y .[I |e"Zv()###m덴.KKKu'!#9d27tK ):/ |\oTeL=ȥx' fTuU PBF"5$BZ "MiIc)&D%d"!e*pQūqd«f1,w0diHwr2ycI]]ͭG[[[zG2uww+W peՅM_t 5({A.c*P_?DRS1^pXN:DvҬEFL"$ػd#aA؄SD C0#ږ5ó5baF~ڦ&Qɓ'=TD'͖3LGWWd0#6YH?"#^0(Ih, 󛜂ς>Qz3 h|%9þ ^6%0 Fzh+_uF!oQx:\eanSEaI༺6L@COB 8J~z꣨o $ھ߁@H8,)04MHՅCe0~B/"yUw5z#N`A\AFzfI=٠ eU 1zˎU>:|Nh 8PecVoB!! ϧTT2ֈ[IC+!UH) C]]]ߚNe D5ؓA~[\,8Ij!JUUa^:,UK;j@IQNKI0?="wrZ $ .ؘ7CUپ8Ɓd]zװY>:Oг .}~yUc[|TKsA՟I A~ 3~"׮] bTz1 t˪`t8O0ofuysZՊW 윴h G2kbw4)1bp3/+y` av 9cIXRBځ,]0SaDb46S(eV=p{{YHa`4E/mUaDO8\ڣCȹ1 @)AA?cq#)qPD恄8aҁ `B>g>=Jų_J%YYY#@"ᾸSF  z -T6'$*9'%!К?p6M!g8p'nnNGDA^{1/6Ͻc\aG9n>[`#+xd?T9 Ka&F8 FDMus=Q\)|*+W|ӧO٬twSWP8 ԛ@#"@vUivY+|oE"^qn.P6`9-Rvp޽L ,n|H8F 93NE8n SZ "EQ6񱾲!4NR<o٭2!'!T~&ZP(|>(?\__pB"7nHGGe;qd0%=v\raQyH\'&#P_, ~oJYP_ѳf0bP ;# #8XZLf4 Biʯit`~aVB 7!TXV]vֲDGHm,;/2#?TJ_.Lfe{.WSRU)Zz {׉DP0,}s'PPUCԀÀYپsGtkR=78Lk8c;'²݄r}{ z({d@ÈTs=lk:$=uGߟo3ҁ@| ...Y:IHXϕd0"+ *b5af\p"MERGY;|k1)NE}Abwd!,WR.cu ,Ipp +}Wb!0 ]'Zu1i/jUĺײx/k6q^_jmp"]vͶrv3_"kF c6ľ B.HU_I0gK@`) j HxA1|UmOIQxq[hl9U=-XwKV~Y8B),R5ul9]x@0=m7iT{GdoR:C#$_s^~}uu~dR\"]]]6?_ "L)I7]" 3NG `,n s*u|@>v8Z<0~\W Yd1d| |P?D Ea!ʠz/kYI+!u" M}_ү%*Mt FH ϣIꭅD"!۠s|Xd&Wy'cЎ[H?bpD +@l0 9MM9_2W$kRkB#_& ![?qƹ) r|-gʴ eN!r .}̟ͪ:9׳hCm;>Gn`:EH C'2;;+;;;~+uRGrNzⶦʳDqA+煎fPl8'^{x}BjI}7}N䞎+ÐnT* >Yڤ)(g k@/-B.{Qϙ娘E@( EO; 跅JRvBϭ7 ^y5@$$p|]1cbz6c"kg{ZP]a2!$wKFe/ad*Z!5^ h]_Υ8e@jv cw8www'dkkKj= N08`Xg4^'і@ g1z,IRM 9(wsS0(!2nGvuNE8RY >KwǝρDŽNޑq p3u@v3a!$$_ѯ8=qew믾z髾/1HM@2yV>I‘T,I;~?_oҦJ.58FKWI붦 L;CNHԕ8:*(k6 DBSUNDžt^N(4/-{9ݫcQ#h%f !2nuXX]y/2'&ЯOׯ>8`36g{t V9y^yYX# %뎤t:РO;тCl$8}`!$~gp(^YG/[pn"yB?!`pBq@ƁHYNE=SGh(} #0F3 h N@%=J}N?v(U8. ke7% `2T=fہ xb[ߛ}G:C;H~<,3\.Nuvv583>Tŭ$Bր^Ia?ryLHơ˥?cd"0FJ#^@@rQlnG'9gǻMTb{r{x;ge̎ea^CZ`:BHXI^rtt m`K|Y>F&˨LnQ<.D#/n (Wɉ Sq րFO#2> #y@`"eƊ^8$>)t"zׅ̍=^oHʮ7ʰQ!rfF9̜8:o l)[&T1x:TfFyԩ^TEzdqN@@"6{0i@RV/X6'4eHZDpXh%OFxYixI8F,K8v?Qű[3RY egcY->%0'4yahbSBH4-k\@pmg[?rר?f\1k!bER'ا-Kp%9`ԹQn(hΖ|uBH+pSKeN،-lEѦ|ea9$BA%zp->R(I  <^Q5c ;jeD$i7ptX}G\ug^Ie{ nyT`` d8ur%QM K_2rh\:̺D7w)2#%{cA H0{SO;جGPE9S͖kZH\xlOUQ`\Ҁ$"PsZ"$ Τ5Ӊp4"='9߂3^}8s֛N=ǢQ?CޒLVz7eK:yS !Aqk3:1G% J<5=zC 45Iũ"6AJN ]o3yaf)QRgYgrֺܹAپfr}6u٨+eQŒ4!`I:J9 |B ~_4mc{H;c b푞 A* .ouNmLpH=O%z?,o AjZ@ N!I2?8L h'V{7UƮeUVedC HoPd*X ٨ U.r3_5p:4B BdƱOsH}=Ihlէ !  l9WӶrXQ2+,Y@"J ;U /īƊQ 쀡yE/A普)qcBcg3Թ cCw+os); Wu="i+ YⲮN2? ȼܽBΒ0FY{UצÈJE4½3iR!WFVa\SXp@ԱkQ_$X$[Bl5MHt qY)ew~0z7X319zI}9}^n0n! @9wk8MPRC 7U2YE>@ m2C`טCi"X(Bd E=3 -"  eY϶\LxNZ1;"rV%Ŀ!*/x{pJm(F,^"mi$!J08}_Ȩ(i" zXWUR8,Y?\+K0wu)vG![|^j?b_S.ON +^7h3gODlzBTPy[uZ_.È'/~g ~Ƭ]r jk:D#D9L2ד#ǨBFQ_K0%j t3 ?%n'b#5Y&nH,PGJG@ ,bUTz!wqeUV&GXq*Rt'wus(9rD'}AUbax/]伂xQ0 RQ onЧNI9E.gMI;(0n[ ['ړց m 1G#,R=\y2ע,YG2{+Ɏ;{ۨgٗc6\X%D,0FWh=L"G H#( Iqe8=kт߫w덴&vf xMo|p [6WX#aa`m΄P^C:d0D:LߥIHd3GжI&AhC]9U-!>E  Eu!ΤI4NFwS џRS.CzנO0|類94F B~mK냄6~Qi:Lxw//!n-LB)K3Z{5y/L^R4x/B!vb&R p*=RA 2KXru}HFs†10\_uMaf(\a_es4i:@YcaSese%EL>:[UYgOF"9F#!Qz~Ezu~F< *`Ge8Zןl}N   \J1'я7 d `Yor& ZS{J.K(0.ZuM{#Vasx́U]) zXc>Xgҵ/= T6xX&N}*tW.# "#vPS|W386UVy?@!$pY#UC ϡ$WJ* alNz c5U.y\(c<{~W,^x0x?;ǟ5Yʽ08L:ⲣk7 Y O( eN!$&T>vJb U}Q]yUT/}IL9:72 p)}ev9P BRAcg`ID_a<N.q0L1D70bພ[g}-N={͐k$5}qWea.~9DφУ,ү]DlXWfG^%aRňBނ$&īKfI`"vM?SF;]_B Lϋtf#](Ts>{gd0{M! >MCJƜ#[;]vsMp`$\% !I ta0"5E*OYcﰥ 8t B. "$0.xt3AA(/{U0f/peҷCDCA\c,ѯ[f?/Βz\^FČm-}$+İ.w$`my~GQ螰d!a'2:(׈NvDW Ρ-}_t*FK*H"]Du H0%][黩LY$N )w8cb! gSe#]rAi!X<`>MqvdyȄ}WBBGJFSξ_ޟV v-S{SקO ,t BMU<#TY/MI0I`/{Ey*Bg "Q0lF( zxx\9g2gm4'|]7y!'Ҧ9? s /=CQp ]}N!2*'TV%T.Su+>m$6ЁD ^%*2IL-dD*]SEq_; mpFԮ lN2'il)U=_^[FZ~N[Ke:*ʶѡӮ{540yČ`36A!ࠞ<Iܩ챣 i(2=-t BZN}Kd P%gҥCt gxL iCܒvcBe5z3ڸE? Q3[b_=Cڱ3zwˊ.pG oO,tLY:},]^a9U`OmA3Svbt B .ǾyE&#Y4F&= B"K%gAI|8YrC}2%[6)e; wY}Ο1m5Sƚzz_ EOZT~ 4BZ'ߙt&[彬|&bdÔCY:!abQ03^P"+: K*քM,Cq8Kq1`0ޠ rQ'!)JC:5^Sߟ @?0Fdj^m=cZ hW >l aO!':rZ1П3ӈȱ*G 㵨\SF ńPϘeҊUFfЯ);@H:B#"q'Ҟ1 S7kraAg~>-mԻUnUUZ+˝u(l@NHH]ѧXVN ╢UoէWTOU`Q]> DN=+d'mLG2D6҈9E:=h(fboi7Z?3S6RFZ@m -``6>+B.}f,##@ɉu gTO76y0˕*tUPLTxΩ@'^;:Ii 7L$?Ǥ3r)Jǒ>S8&\t1B c]{xPvSEHk}BCċ45͑s*uB@Y!O*x.:yF,RzSu*i^=vI;q>P _gx[dVapH}}!ѳNw`w+Ί%LjBVr)#5`Lk# !؄1>֯aCS9]aIF`\RP -. +z>UT-]8FWN~PFq̉,NAxW!\p ޛ !6IX A]}$nT-q J|ow!U !<_*gR ij/9FØ ЯcG񚁚%N.nV". '(,zFɑ:>ցmeSL ;ڒ{?Hqؙv& pGI~GB.qT6s[ RG$1kEYS12x@!As>_(=SrD/ш: l謪 7"zA%svM-UU@׶)ʬ=-y|;a\l⿇9E>aq qH`\@vؙvO\`pPrZQf-ai"_èC #+c*?"71U90b#!A!4O R*di}){8iMUނfS%cc #:è4 lXFҧ#N0& YH*na'%RFۍYlGƋB\= iF{Tջ/g6F$nkM]y:4"KBHQM?ac@(*YNQ9Uq@&^ausY`ICBp'^i'WC;Rv}SS{ؒϝ ߤ-]Ԅs亮Ml>p!S,$.vF_{.UCLGbqYr]:*#ЁD!>%ќ*&p(!I)}B@§b]:u4[[E mL`D8>&uߒƀhB_}F•I9>XbܛmK)!0f= GFHtC6LUyC<m[$.)I^ג[+FKB'TF*OPő2q*#JUDċhW|vuBE1z=d#lFy>؂g&]8`o0S:c_DjČxe:Ug1(UUաL9k>j[0":!s(İ~m0C*=&B2N^/bnSP ==zY,I86q(,eGPZf^W[Yrq`u^ʥJd=]NZt'gFp|{zddP8LŁ]OM] WOB9#{12KK88x/a|aU~Xߓ+ d n=HuqKg[;Q`FX.\QN[bVBƔ7u#0"uՑU: !qPD!֒/*/wKOMh9(EW})q.I̕NDž(vFߖ\H|gh6x`X9 2zFf]+6$>]da=R$(*쉱ʳ B<DPW `Sf5$jR UVuw@9d=HοF683-A3G5v^1;ᱜؐ56t.pf5#-ɲE)ݧȴad#Y*nyQW}©"ؤ`B!' e*YVJlM{(p(g 1$Q, Xg>dS9tu}o|Ԍ( րɆDz6-llL|B(V< P(pзSupg:Tu~îS{nLU&+|W49e[Mw-ΟO߅AѠII )8azptaU2A\6 ΄%•D.2uSse'z}+50 ɔԠ1w3KJ k+ d5BͽN !i `%zE·>΍#A3?nn wcƷ&|n>pڝXp+ilzkJօ&A Y0„QXvnÝ'uMתp%{@o`tCA1%4^rSxӦ6%D %{np{ziaЀ&uڽ% 147fwOkƝ8Fq$nzԹjtWOj#F~Ow=*.( w Vn%Ӏ5wb™Ll9w37 _H7`p&X{g$MPbq/_;&(kŽ+É>S J:8vN[rmQ6vǭ)WLg{zTbb%4qEmHA v7\Gs7܍f7jֱV$iAp0CǎWMPfw|ҌoyX4f7Vz *뎣 Bܹl\4+V+`ʺVzZo_S&Hx8B}*%TFs})L %M});ow}ކ;~ L׸? kTҞI8}W7 2AA)T" &qB7sl>ޖyܣ=j4v ~5JM1~L $t:0ƯG^S&H8|ҏn%~GzJ5<2wĈ} 9.L{jŽEZitQ7$`o:p܅nzH }3Zpﭬ閅VQXj.dayu}ꈐ@DF9,s7`s4 ᦸ f'7Q&d"= V# 2 {k:|\$NƑ>KvOuIs|?8| 2RHCR=5K_Cg{kVp $P2I,y%+GE?DZ/J94Mnjjbz}Os%F>k UGJΏitEO%FϫDiDɣi  >*9JUMFϹ7 $0]\7)2PpF)UhֶJa\0WBI$mm@ƪl\lrt*JR|]jĽܫm' ܻG+naxe@ %]I^왇a<)EpVƹb Ha$҄-pn`5qQkc}qڰro4+ pzm^bX1lX|W8>百PHI3&}4#\UѼ҈+M'њs&CMN7(._7ݒw&043u(ѨĀK4憶XvU:'*.`9E4;\ڨ,!=<2w8^Ƹ]qNٝΛ~J MDO KqMưS=_s.=ׄ{$aCHQpERݜ [ Knz5kRɤH A5Ah&xj$kM<4q`s O*Ud%Cɺa@vgLPB6L)y0 ҄$+]wk>4,A$D7l鹱OХUI Q02@(gX:.T.\ЯJnܐJ<X Sٗz'MwU5/ܣs̼ M ȸAf]_'ܛZQXlX]c򠍇l&`}MR~m6@a7aHk]=_k{Rj;iZ%)Y~{y?,I5E$ Q7 E:'[?x6lwubA7+W")Nnn_h4^f?oԢ$K#;wӨ;lW 39tÁ\, A hv!:FxTzC>x״(HT]-c~mc3kNHZ~93+d/Ka:mYj3o=k mk6V߸2}6fp%;B/c'''BJ<%O8Klxl]m|QB`iVj5 Ъdw}e6P#}ڿHI&R1D&\_e!a Hl nhhjÝH7+4Pft:)VT^_._kJN*H*EW㍝|vVӵZmF%}~J>2Gxٟw^[ {1G@U?L&R()6DRVu{| H!SC+&8[lʿhez_ 4Ҕe[5NdBMLL||&zJ~Ad2YQI$ڳ״J&TJ=25OeُNMM1]K7M&q)>GH[w]f ˤΞ2E|s +pK ;RBFs 4!\]&f +1MFRi܊OMw/Nޜ}+a 0s=*GL0Sz鳱X$V/~:_lV:3mH$*Lf~Nl߳mo4EϞQK}K^4;guͿI*ef6}7 vfmo04 Oid~{ >-z/ku! R7GgqҠ9z}RbH%’“1cI@Ey͝K4 `;Z$?}I~ A%nV,5E=jA ;Jي %cLDzԝV"eP՞N&Y^ОKdɞT*sssq75=.pL1X{L0p|+ж;c"fUn~kM0QN}`N=UӦQ%P5T(,]6$R3&8z? ۲W E%_A͎B篭T*uɺVVVN5M|m<;b߿wuu odekU/L*sZm.?I#هgggBia 4l-(:sp3ʖhHΚ`?v5z V~6%.aз/$HavȌٻXtZu}=jrsm 1HvmLj.%vWWXTIXX$ZDDlJiYEN5?L&7zjVݕIZmZsNMMYvJ$GK&2}IMPQ5@%.F}z?u2ͱc]_H5a;s#F:%UR ;/h5HmkD $;2Oϋ%%vE!tb) & \v^^^W$sssﶟNu:VVV^n, JԏfR{G[ƅ4s&H(R'QA&H~ {Ll5@%neH:cx Z]7vg %붫wFzL|̵Q閛S?M{yAIae"`@/N/y^lGHbF-РPYQզ׵Skzz񗯬<>d2Y~QT:TVS|>么a4@LV V$ gN5AIF :?fc=!WcHtN) =~ʌ }T5AS!Eꢦ럅 #ТCGzȐ@ˆLzM"hRu[ִ#L" r&YjSFc\.JX,6l3BpYIRt666Fh%h Q)ܨ]د6~~=LD"qgJi&Xevv7Wl]ӝVt]Pr(ܿ(g= {ϯ~X=^uF N ٷ>R% V܍i858آ&f!fff<=d֔[]]=H$oll|sR~[}TRTm&XT1͘TF``,J3w :ܿQ"9EFpq[:On9peuGH!^v;T\<\4"q$s#;=QQ,veN!50riQS~}_Ѿgjm*Ad?dcFI ^h4_YY9ạ.ᴝ_kEJoBi ~:%ߒԪQx}LiO$_|vvv!3\ fӱ  ƽ.l½UV,>ڒY`~xgsq8Bɣ{䜄 TRh]gdQ= @cjjuZJeazz,,,x<~YOqXP.h(L&j9Z(OUՙJ`د7vp\u=@OVre%FN m_ӕfl^s*7Ǭ;:|WQ(xic&ATe4_0 hK+!3E:lHV.LyQp祌;~li%*<-H)J%~T*%xGM "J.;byJIm Rv{Ap]8@NE"QZɋZf]]]}աCl,N ,@f*Y1͠/2m 8d5N960J3&)υ+cZ;o:Z]]p׌;'e8o#|sp2Vʣ{d"3??KKK?Q(̡Cϸ+=XsY}w#ݻ:I{hHB1A-ʜNWpuuJٕJۏ/ߧh\cGI$%+4P7`Man0Rz.` ;,G nC>wq8τpEss}`TL\n0*ez`H cԩS?rܹd2Ü}MFL}ڟsu!BQ&5/Ǿǐ0`H cX,XZZ/NgؓG1^Q Go*OtgnWo 3o߇u:TULwKdS|}qҝ#2siQmОUӝ>FŀsV,O]x;zzK&(lp7?b?L&=& 8m43oZ=.*6XlV"KR%3ֵ IFƤYLMM}Ґ6G8[_;L`C ]:iaI!iZt=&W=SZX%uDqw<`{̥]Q&Z{ަ{6כ*@o67x91SSS/t:ch.DVZ)1H&DFjcX:]󷝭UY?Ia?T\w^z=orrKCz]aWQ5ه@D*˦dLpenݟWlw=?NwsFJ5A"|οC5##$\tuӟ@n8UM,05^Ndz|q/J  X18rJTcD"QV+MMMk6K{mZӵZ͝N#!o fZTwK&lJiPӁ[6umUڻ2_G1*nzsEMFH{ΰr;M6}kA$f@ro5[jQlfcE,gF+PL&^*z>R(LVgggؘT*ׯ%>8"ǂf1 " jVF wlR VL"w?`7C%{H%4"+uΛ칦*dѴ&=΍uwM T\Lf?0a_}YK~}q|]</MLL\E7ݒe/;4P"-Lkt>D"Q___?V_W.+{Ո , &-/J齥A%RǓΘ`zfߩpk:ߨ\9-EVjuJ+YTvQ Jq];=}DF &1ZY__4\nV0@h> “O3$ 9\N}RF\^d,k{e25=&(kt]u}^q狀zXHz$Hl&Z.w\bYXX0BaпnV~{x 1~},M,\3Ӧ;:r %ad:ڷ=V1֞Hjc!B4YxihkJ()sp3G.xʝ3CtEϻs"u9J-,/q5Ud,0HH*J4'K9r5C6ˇA!{iIK t?n=ך{sJ/Z](WRs ",䮳jp#0FH sܿ)J^ZՀ厾0RI&Z:^jd26Wv)j2]̎V*i5IJ$1Ƒĕh> s&ܠE1/a(aԻ`]G{Kn=߭X,@HBI%v lAz_mԩS{ufWhH<* iN'0nRix 1YlEszUj6.`Eh0l}D0?o; b<-ݯotW>Lߔ 'Z&_5M7QD $`-..=qOrڵ͕D{vԝxݤ+4 RRyX,VѠE"gzkEJ؋ cϙ{dVI ZtJ ɔ\5-wFHSH}>\fN)19{IU ˻:C6L }0Ξ=k|k~ŋȑ#;J"f@TzL&%Zc(I$ Is@R $%13Z^?;/ם yEqAFndGK}8WeڡkȔ;>Q~BТD閧 F;BzO?;w.vAlڏVixs534RXp?5@})TN+RƂ3-nˤ 5i`$i\%+g+Z]A$R}X$چH6]v?w^r%J IzŌjmL&c?_RvK#J:!=NkIR_Kʘ'm%Dm 9U\04xO vݽ+Q5@/U4g+R41"p~6z6uC9}8[X@u9ARQV,3A6^f {aK?v;MSpꐞkRa&>f,[0TNɣ7u^2E:Gk4 ?#a~Ě関.Z0Hfy `hIngh h^1\v' JR:scN'J.RC:華S&Whҝo\F$ߚmnH%5aX]KL0TNgLWYTMX/&@@ 3v;OS644 5@ZORt:h4Uo5sߓJiuQƝs0_t!=*GWwkF_.4J{ky?U6tX-jmK6Qް$J>v>l+L7Po}i6zIq^)FH72ۇZ6f*ئ QidҶ#6ɉӴƌΛ*U7mQh#%λ뻒Ea:];$qtik~|ъM: %m9Eݎ7j^l6_V*r+W|x?_eE~2H{oer棒GwbSVMRlll>oLR2/3-Hh!$H a`f&lHX1uk sgHaLuwkKm{IbHj5O&1ɣQb&꛾k&''}G;{+UEBLMMm.ۡ+666b+++ž3tU^r;$Ј@5{3h4"إM591iTɤgMŬT*!1 0ʆ &RHɢpcD _J ۇT[l|97gI+%tE\"JQ.׮]d2f[0`$c؛oT*s\nfApnЕHʹ~>NZ=/tMV k z}dŷ{I%>YOR&H [$ll&&| }B ;nr+|ӶU(JGi ~w+#N7-H;c̓5XTƇ40ҵN%λk0RIuNdc%|yux_U: ^a  gt:寷q:,' ->RH>Xi,k&$4ivYq= D yF`¸E6n2OH p ڃX,Q[T*>ϕ,Κ`6d$!}>moqpMPZv=%òV}dEMwRzx=nW.UxsQ:QmO4bX,oV?33Zfi{q_`6NHii.WmIkT6 pO% =^b@]!UHp )˛ r{p@xO 0mXt1𙶑wVFewliU[~ m2wU2I3D^n^4B #MP(Lcq?E9K&ot:Gl}ߏ#7&hefsxƛmf`w1<[,ިK Zkbb"-sf3gSHTI}cDeB\1A+,kwPb芻p5lPb]6RR0fv{3Y]]5W^L"ieR*5~C [xX,D"FmoԮ2;SV&aZɥ=_(%ߣ}L\h#k*pnZݣ)JU\cX;߱l6k69Ϊ"۷6FgzzzI٘!G -Z\\\*877wޠ}FH;h4T̐5/n!%J&IeSTvh=ϚT_#ƊCZ}4@ "MX67ly?`[rt;ēB*뛫ji !^ii{$؆E X,~ޘqcc%[h4&kH~]MC_×cu_5AImL 4n)wES(ܷH`Q#^<[7GX9}1 zB3bW6?Gl|FhύHjfff>_ɣr߶}ϙ`tF)$kh˗jw>]]*#?d2f}&뫍#6q=Jm ]l~:^诨dtv R*VIR%TIS4MtUHF(Raf;λH $urvN+'''I)Lf%bg&h`XeUyJ(ivV*)Rm1t]U(\Y&h`%?j6㘙hA@@`8oF?VI$ Z__?t2VeE~[U{N3᯸h;F29@JiEV!e}G|뻛({g& Z\\p~QV*z.GҠۧm|T^I{}[D+TΣ ܬn9%/`,m ~-wz&>]hS&ygRyک"kz1A2lSTi'%)>hۈp_/cz;*w7g JḬ: s.ueEN'KCjqq|_Z[[wddoL;*j|_*JϩT*G'&&f{j&_xgh\h}XIׂ64$QUWM7J)a$F<0T?m {aCܹs}b/d2ըnrPZ=aϖ;Ϋ^a\NIA )Eq#fhI V(iV(iSc&X@t[rת{=Nlw_܃)!aA !l6}(*)y'*|Tz>:Ο/--}}?ڇ_7ү{3eƶڇE$T}"F^ &H )1T J EZu=X]o0nX,ujfffF+ƩUuQCH RNRW2Q.QzZMfGG hMD"I+6=~um3Ay3Ѹ`V4b2o#O3#.]wp&w<]F~cXn>Z]]5Z,,,KBX\\bةt:3DℽY}zrrRɔ=fUČq>WVbMN>=iNsM ۰hϵTL ՞n{\!N`$Muf{t}m˭V9z>??owzzN$ԛܗN:L>c2߫hL=`oV7Wy؛Gk[m? nX&Xt\Ҋ܍&0hEEV M] _fsRzds1f|fǏK6#vm?_U|P8gof>eoPsRd8h)VWZm&LD7K&HiS%42>sFLUug7t:T*g?ڵkoԜ+bt~fsָfyߪj@TU) +iGm,O8O I0j[)}cҞRё#GgFoxCcF_zF t~j"{SYNRKsqc +<=*SgclNL>/޿nhz psX B i)0ڔR9K6VLPp7ϬbޫDN(oƘdG ѥOZ2^L&K$ vDZݬo6j6gFuIȘg{>~hI^/LŅh0Y+ LBwhߵ ]Q{2SϬ}=Jiqmsݿ;f_76Nj6gclhN7f}TiXYY@biw0BziRʽ_IM%+E w}w'Vrl I&?kO9`0H 0>4;iEs=l*b3664[+J6.3.]ڠ 18n#Bfi&`ߵn*ٸh%+` lgk̸6Wu08$_Հ5NWؖ+.~iGLLRݚ{`p jA]:cat=4=Jy7h4LR\yN?9`@Bx4^XhRBvхjh*)QIիy ,Ӿ?Q=WgPɝɱ6~] 6'NASS)蠀׋N|EDXԠisl_jGzoڇ|5{\.%Z6FP]Zm6~=50~kEu^>DfjsMaac9|ח鸾 0Ҟc^8tէz~RI %T~:Hlm{_6(sOX9H !Jtp(5$KGDJ<ħ+ժt:&o[Wٱ28џ}s?6&#(ROI_1,C$Pվ0dF,S?fw8PH+4JT 6l4iub\ $%^o>RQmwacB8aB QW76.mJvm͵GP\0˜Q&D $ @?c"kaa/zbT`k6 F8tG̺ eA$0LUD_ tR_Jم Xls`&gmh D $ Uƚ;>Msnc"aXVG&QswL,[Y__7/^ўHʣv=͕ӞG0 Q6A־Ms9pgO<Uٳg7Fڎ_yp`DLhC6^jdW na&MaC HYղ6R4 (e|څ0k6N8ncF:ZQM plQ0"QVr'is=@5l| aBGm$h Ğ~o4ߨ:)ʿmkC: tli D $D] LP.Isڅ R}KСC+)j'l[CA6Q9$c1mwwWVV3X$vx_n鬍/hH#61ؖF|oƔ7/^f[s,"bǢgn̞6AI^P٣u&To9lh,--_*^6HJ& c/eXGާL/oHaZflq 0[*rU+xiǙ3gfbkZJ&MLL|>ߏIEoѠm4i!}}@vM3O`GMj{`ptCM>^1ÌwCnqqq~!}V\NM"Hr&nuumi;m|WF $`g8n$bFffjeV#%]3A)%0T@<{cyeݾƼ}~&QD"l65jP!lMa,R)&ػ@UM@}JK&K "k/HQ,yq` $hєxQ0\>>)Ljǒ JcH@@ iѴS&Xy`)%읤$R=6 X` @Mw"% &Xa`X;(iҚ Ha.ѽi&qjyMw/#}u77&6.IU#}L 5A9&H)QF)5knUeIhHaJqI J%i}rve5\UE fA$Vi{DwRbII%R<$0r&H0Zqf!+6`$Rj UJܔ H `hߢ %,RM`Hhk6LL J-#YM(J y=n:vG ܭhJaf"J"%h)Y!y`tƼc{$Q+Λ`Jm {DI!uPlgc}>iHM`L(aT3đJ]tѤy0h$9cđ:UFU5A;qkҊؘ6A:7J#(Ѫ Ju짴aK@&XI*Jc@ܝV()R%G ['~1ݣVi#%H+L@ %`UJޅ+'>RH "88e 4` Jʤaz@n(Qt蔍C&XwwJ*]6Ap1F ۥCJi#%&H1APJLBIl,`?%V&!Hk #EI)$Q<%2II%%ues*%` $BtW٘uϕ,6#I+&7I $%MJAHV͘5:h@nHݣJ)TqA;a( 0bQ62&HrAY:v(teO> 0,RHɣI ~"M؁A[vj) +"xj F6Mw#<"i跶pݝ7ABI 0@Đ@~ B %QqqXA u\ n(s$FCIrtZausFLXRndUJ$}A `)aw?{o$K̝3l9 BH !##/!a+$!1Aa!! "D< !^'fz;sյ9:oVUfUVUfMfU[;,:eY_k#6 "A82B+*ŐxB!dHP@"BI&gHt)%YV! Ѯ<Xh B HB! _i yUGWB!YS !$,0?c+D$xo\qO=O!!2!P@"B3a4a.+A(ؤ)okxPs:斴p%L\$#< (IMD!BB!$& ,q(%rBt;Nױc.!ܛrf,8LI]mCw KFhj %B! HB!1E(Bx:F&ь^ ! xt'GRz!YRDr&'(gD%B0/1>OY- HB!ƓȄ&hdiV!P\|F^5qC*ģqh%R" x)t}"?Wo HBZH\W鲸G^Fy}qQ?zEB1eq RX2lھq @P:1 {YP &M Cnms뒶xyLXo#L.wF1@B!F3cҩ zUӉ)ҝ6뇐7ue0jZ0  1BR<)8gx{!2۷L^qvvl6|׿s||\ dmBE^0:Ft5CeLGM і`Pm*HSۄ"x`@ǢnM(W̝ &k68${ڷXImB5铓kju1rP ́DpD!XN|/^FYpEX qO%À{,H<[z ~}\K$BǦNyWܜ.Ic̃+;%;I9 2>baWujvvv^s/^ H {!JB!q+=- F.( `(Bh]GHaWbHG?9Bz)[ 9wgޙ$Y;(1^JF\jI$? !$AB -'B(CPU_QQk[ mS\5̽uF ! ay۾{xqDPv8/N|Lȸ8rEI&GҞcr#`v:)Rkyy_[վy|< .& !.Մ#1 a>-D? 0.A8q GY-ּiiw6t .g𲸆~0o?_;4kIgo[4Tz(2.p@kabqZ~GDȐB!=  P0H!²({+ -qA#Ð{MSl[=A'/ CX<G!"T<a9ߛ62nY\O8|g&nꙤ|r}||yNm>"B B/"W654Q00; *]'3<yqg9i8e]\1I½ C[^)NgJ7un/븋!&\^J$ MX ɗiB^-V!MNZ֌S> "B!u``!n܍1laNӾkp25}?ymw8zA(~^"UV!9ck/0aS hJs+OA$sdzH&.1yOEBH0דuu.w.7[|4  HBH6=`4MˆP4] |gppɬvU;x#%cNyI\1MIO^@ް~] %o Ib8־1ngODHtNsq˵Zm\.MOOF޴Zv=GCD!dC0!T؂i0liNbD-hk α\GlC / fx辭㤏3f߱z04m@eM0pFP2?h?Ѩn_=99_YYr>jٹ\CB0C&QE4ea|}%!$~ǮXpv$y1'<WLZĤ9r)-q!S8,e#aNE}m Y}=J].p{{#-,,mZNPxGBD!L&0z- z%E0-N!ũ|'qapDDF;m}>b*ȸu M2/ {:~fx!Lwɏ%-&bIx8$^JAơ=gOu]-V!o|򅭭YXXx=- dP@"B&V IwI7ɜ 6aEHM~TEG>ӏΖ߅WQ2|hP"B=Wt 5qCY5xa „JDU[Lx<䢑_/hBF;"/đ;0K` ~淋YN^& ˾ѱ^z p Q")wNyE;qј # _oۅJkkk'| f$BB,VWWR0u!n覷֙Y`0V`@5OqE;KzPI.f2޾H Аls,^Mf="hr,ڷgjڎuUu։ޑ,@  \qc't﹟q_h4{rNMV=!!ll U0߰ElC%cl^7xfo8k$|* ]-fz+r΍y$ ՛3JX_76Ladm_b֮4rwbY^^kkk_ HBHr-$Ehy}mT8 /#+`Ĩ+B`1* l qs ϣV! u;sM;x)Ad$%ϣM#ᑶ33dJV-5V.9fYt^SW*m,!# 2B!$Y$"cLal)8bD#q.9ypb'O{sDk[_Bg끇#鞿xsU a uOQ9ޙHۂ4m4IzŸ/Ph& NS^ \ 7|>w>|iObNjڅBakkkNB$B!Y,!]d^׍6_{p\Fekzox튗'ۓ(P/g$\,!%ȬbՒy傣 bA+[?*$A@r+0&u&b(RM Kw_\(u#5>P9:2;0Z<7aHxAD ᜂ^/IZUBWu-zKDŽ#$KBȘD!$_ᭃ_z Ғ{9a|>1\/ Zd @\C" "rfK×@p#B9cuAo;OHc !BPAN57;;;L= /}JS\(>/#D$|>/J弔e)Z-i6B'owvvkvvO/// >n]P7 n0fB@w "a  Ca< l_`Ր`PO$j;0}}.e}N(q/%xz((bڮU5-&2l!BZ_]]_2B#op>gskFMssѢvAH߄(uҥ/.//vںna@ko¾'`0zLu$| A u`tH R75 p LxW h=+:+#B@:.I/%{C!!dxD! Ϙ#{9<<۳kd"F+++25h;iccο^ln]ӚyFG/K4 $~Qq>kT`cKqGxBUX0kxn3y<I:8 "kH ALǤS3B2=!D"TV;xa޽{O Q)긌=q=`cBݚqD`oYWD5^JӬ6`L5v{YCU-m[N:54,B@( B&/!PaRCnc7/rT:0BR4Cb&NSƒP7~SOIicqC'nSE-`0!?0._W`o<I拖8y`_kD dp Vږ'69v !d" BȰ|CBadyy\@[nI>?};8lcX.tjy6JlЈmX!ty(M! XW'$+!BB09jZ㖈uc)?f14F^xF[WgM#2h3%q0t]Zǚn0Hv%KW)>#OO"UDiIⅶ7#%98K1~imF״|JG J>!2,^H?_lNda|94>(pIsSﰺSI/ ư Hm#_ؿwʇޏqeqsuVD/Z`R*iBa$&r.%Hu^׶$!$1P@"2LX*57;eU68к^a FFϚP tlkωaAwYs!;k|_ :`LN iG&u=͉xG $x(q kLwH{蘶뮖c5!>B\`Bkkk+++GGGWEV ~!'YWzר5^4pᡞj6]w՞Z0r5'g2ZGX\O׵0Fcb0J:~@4x!Cecc9X Ky69f}s-@RB77" K}"WR1B!\PB*J_;"+Dg\p`IdwaXnjeuD^l0Į]!9]aB4V/=.g XZדyq ܤ`h"GиYHw.nQp!)}K:~XG@=B$B!CeffgQ@r Y`gN0jjȘ&:207U # taq ^H "wW.IH ک!^Cw99 > Cݒvk>|Y0wUmFPj49.BP@"+vlkݜkkk^ٔBtqXՂM ˆUH^BD!;U4`HU{0BB 2tdWa͉gY`&nݛZ/ Ըw״LDB@hd敊nNqǷOɥK=`W/9 X-60FL\!N"(A)) UC.O%7cC?q,I|oj2/[5-:u/%K+n/!imH"%B$B!:Pl>!\0r'腔]C %MB!gӽA?{U\/I+cxvwa3cA}0LE#^V4,OQ^!$Y-z1"D Pu=_ I$cG{O:FBHAݦN!$yHq[7x$'g~?z5ZS~9#Մ-Ѧ7S6gw=@сa v`$xP/$u4$Z,Wu~">#o؆ :H0"t[ZDpE!i@#HI.6jUE!4@B 6%7pxbќEsZZ>OC 2=Yؔ`Sauck)ƸjhH!0f>'&i1 Ʃ,Bº0_Bܭk?tp66x\ kk7c`zmOH%BᾬcZFRDf+N39t+éB,\B鴸2yl[seA|>/.?Y 1R]ǾmO8ܲa&$i+KrQTBc&{~ѹsU]~!( B1h4s"NZrs;H7nj]?b°z8i/<r+$06w95+Ѓ5qOٿ1 k3k,qʗe'CalЛbg KE6q 4c2Br{O5s2],p č#sԹpJWt,D/'M6&ks92 ˇzGד0%*")kmԶ=TM!X-q k͂9uXg# `~^ \kwHuRl؝5 TcPd/ Uɶ~SO?3麉:ƽ% J&%x)$3L$K20 1:n7ҫj?8Џ;BH$h zO0&0{kga^|?˅woߧFF,{B-T*HZr<S6c k Xq᝾Scj)<)aFV/H67Ľwk1!vV/QKya89q aMC0ii1Fscp/h^;ƜcxD!hߗta aMC)(BzBLEP#uCu{{峄"&9߹plZ -뢮(IM"SSggg37t_vʵ4S~I `o/NTx"8@!$ @1̟#D{kqym(˂3ϛ5b>|d$s۬7!ێiۭ:P2vT5I]tOоΟ kC P@"]v:]NBx^z/0g/*-(Mav@,(~C255Zj*J:Zo-..bq??#'bpGXmmt~BMr(F Ƶ“}rK:02=ѵ>' !]u;G]s 3Q;I;-xJjzV@j@Jg% $P@"OѨ(Ϻ}06a^1F&BLn?ol6n+a(#cnn?qxxikk[~))_픯r?+NS~[[}7!kq0 M8LJX%}S6)8ɉu+|^M$iFprSm4ep`M﯊kTFB&}am1iZWxwg;ns}-^E"j?i[;ySqxЃLh۰ϋgz}GV# q]DIآF:{~&!>c?1jعnދA^v+)!tm2WqSj}H=?gff]%PUZ՝;w~*G(y_F ^>_` D7sύqCq1~J#zxi5 c?AW;zƕk28^?]-&YcM ҂SNxy M}*$$h$$9;`(wtK:}02Q?BQ?EB/!c9t`H2)®, 8 E/jU:˺3#Ñ ܎*'Eh{5w#d<3Lo(JX%?R7xa:}I$R{bviIN:*':88z D+gSY{~9)_Z^^dzяՁRKR@m>ƟaA~. uģ>C hB!P~Pbgd81c;C+6t+W ޷ sgP"HKMYK JH 劌>z ?y}؟=_R~ُpd%t #,.uh1ibЄ+qQr?999|>?M(I_q/Jxqʇ5\d%,HNRtAϰb#uM.J)%:)Ll?h@1GG)ewnd9bm>nj^Eo]!o4hG<I+9*uiD/۲NB8c7R[(* {+;$ ux&}ntQ:y]zt۩WGS0Bh*" Mwl19\Z0B" N'VV4ӭV+_*NF1YWgũ.tAnןfn =c;Y2g=@"׊k 70yzqvnLCD˸Z7 kG^$'B:2Ϣ`-Z2isűO:U@#`M㦘A8ȼ+Q7{aK')R:Vm5xK8 zV-] .2I,a \E;ـCH{r _$i) H5qlQ“郀!a7}+ e+!?/ #%;-~9^ <?&<^N!_q BK[B:oL%p]J&xն x"Uu}{ Q #MgexS%X<8'36 H%QͰVS^9#:1!{5x^Ju\Sv~I_u}`"$41 GBE;]{I HaCu}4H;sU:7hrI Y c0 {իPHJ񰥋b"6m&&د;{Gقad;'ģ. 10rlyDQbnחÚ!á㧱A=Ա 3nVKE&x=qZ[a1Pw':h+ ٍ !](a#Q/(龗IE<⻏CD)x^dU/Ⅶ˳yrUdIS]SEG2Q0nH)phjMXu3!w )99k摳1_j qS劸'GE-, ˗ i ɬc#>Û:ϗu\|d0v;; . ZKHD2z9$EzF. HQ:y I"ݽ H^a:Fxd^tZп;Cjv%;;zn]\.\@-C@ np0'U!ΞNiDɪeoΌdO@2Nn+lfjexK:xF5b; !I[ߵu3a$ ˜z_~:j#8AeJ&ISׅzOHfDWęnF(%L(A=zPdp^D #"uyM"8ɳBQP>dC4 A$Hń2id -Fk![l`E]<#6g0%epp&ROJPsE^x>: k'<00xڎ2Z{__¨~YSy-q<$DN<Gۿ$hTux6)GL43ģ^yGQEŐu yU< ®5pvQB/qg& Ť /%x9ur$4z vZL!\:'OZ&ˡǜ;9zqbO5[ݜ9[%%[j4zUâO^c:fֵ°1iIm oI#)"^v+(D- 9'd h+Q/Ѩp_QI<ԯQ,iАvD#LIo&{yCJAnv$tnPAш8`!F6>&t]V35ۄM2}ј}`"=ÆN{"nB^0!]RQ&m7!d JWNaDג-vDR $bݽ:yu U/آN'!Ⱦ,jNa†h@UDμv:%Xt%墈ԐNk0BI\ _am<E#DG:{}0Wn#> QWYԖdbAsg w%78E3/=v/!$7k]f{DBL>r1. UGzogߋ 0&o $ PYsXSЫB0x_@MIz„|꼅5u<2+¼Id2۵Iۀ}At=jDHX( eyuG~1.H$0"R^Gx qE4 #Jtz I}'!)HDjEwt[\򮓀)(Ҕt3XIK k?M;=݀E#0oFkrMq=v%;`%0 xvgp`%I$*Q榶Ƙ 0, 8 :^){ЁХ6s葾.긽% BAL&ykݷz` ^]]=/mummQWH⠀Y}0##=wu4t g&Qh(בH]0VLU P„{@ lx%M~ ݽl&ۉ ȳ`#8v X56ģ[B@_|$Ccªܕd2/,dNYv.r:ǜbH@yח31q pҎtв(O~IKIw3B;%\]Ҁ,Ah,]]]܈gkkkuV73FD#W(QI‹HʫQzu?B-/a')HTnw$-*R'%#wsשn˰v8F0s8rLL[`45xp꺁IMVrϋe`x YdIRS\dr! 5 :O1/z*!$u1c溮Gگ1A,׶^JdR%}dj?puuXϴ5֚>2J( e>9qM8*ܗN/ϣn^G<^HFaBi (bRg ,r(5Y!)(]gRWRk]e}S.z%56`Eog7ֳxz.;6 ;opPE⚛U\'/2Xؔݑl{az_‡guY0̫v>8ϳ+g w52ϟkKBҽoD9ɺ]x?؃Dr֧} DS-jO>V(^kZ/:{OF=g)IA(2pab:D8*IrudNazY:B=?$$}hdIP ʟ7{~A/*"C5oE d7"d?8#M7Xop. 28ou@(SF  9JZQՄjKz( gg]g5T`P*|^43 5 tOCOu`s32>Z:==mZZ֍|>_=*˥BUUƶ{}O}{{;U*[˜43px6pr݄N0!†[8 {/!퐿n!z}ضN풗`虜 ,HHcGxtoD#[0jʳBiE#}We :Ԑz:rt&[pNuӁu{ژ Cl=be8czWn$Kј~wjowř8WA^nvr??KSSS?kImGa8 AAQ/[Σ0yGW4S ;-ň3a#"uvauJ7"S8q{ZMш 8o0e-ξ\8}"= C5ɶ D5l#If؏]}~+AۼLX_{GjFШ0y#B&rN暵/ǜ.iYHzԳwkk믵ZR}UT*,r9_9ϜcF!$4&qvCz : ߨ`E@ 9_/a_miؙkN. #%# Pp{#8ٞJ"md[_OD@ȋYc':&Sآ/k oJ((1cVk,g=X59Luunmm}s QuKOggg(7Sw8V>s)R [Ⱥnl[^"R'ϣNGģnˆFq FI]`t\>NVLE;Ԗg0W[(d{QAǼg!#b|3oaH`XDNG\* n O pښ[2t;w=<3%ҩ$[a;NY`W?kj8LXEH$&VB^؄k?llSNㇽG羅 oj/,--(ic?^oMT':⺳5wʟ;==ɉ8Wq>4]`HPhOOO?qt~r/csM:EY)\_jHGRP=Z2ސvȟ3/B9goeIL{ -G}vp>9Y$!烧!$՛z$yM>WuDWք] !ςpdlZP4'cGGŢ\|y>SN x!~}VaqAƣ֖~N?_ y|o"BmzzkyOPx(?;;+ߺu}e |S)z}{k^l>{ afffRHT>=Pw|vwj?bHbmf '-qܟtBQ?Ѡ^G/?R*sz5a!}_ ė1}NugEH2xphq >oK򆶹|CàL=aWBH-QtL)?ĤEjB+ GONNf\IY>߭3O>o٢ρğQx.677ǯ^e#!p0Kl]< mNpK< Gd=Q0ax^Q(f3f/$bJ IF4 ,C#w(did@+/φ !68ڠ<^ /k#mXO#A{g;0'k ]qmɮ9p_## f!<>l0 !y:9={a.T`?jO"$oll& ^G/Ͻ;Ivn$;/R3໊tiT-B  wH(w*4~ =< a\O sJ_Cht @X1G)X>8Cs{&BJ!CXcE.S\ Y-J^R)yeY__7n$!?_Kwu"ԙx&dI먛p[Ⱥ3t0uM?^Ia$~+mg<èRKigD#B~QD"cA¼q~cC<YV@<묆saPf%\ INJVƸأԺIcg\_б^å DZn& 7WjPE9u6#Ml6Nhtʕ$GmlleU#,M!S$ G'y9ŢNG~(G~(Lt $JGHC^Iv8$ ŘHT0P ${nʳT{3($!Mq0wXvO #݂d׫.D"܁N↥!k1{Z2q-QIƦW5ڊ}a=mc$!tb>5#/zm^?ggjn:Ե)  HI-G@c{azyMKoQ'(ȰAm\B9AR71gݶa@dNEl릴VSA߳{"ҼcG8Z),j-qONp`݁ˬ ӻ: J^7bYtH Ok/-]sR=зpGbr~J![ఙ &]OD2:aPA"r1l^<[?Amc_3I( %>ţNG#:p-Q7(JȺ0‘HGd2THھd& c ԩx.8B[lu iG1/K/F^ Yk9&C׹`ny,Üe/F MQ"𜅁Iʿǩhiǜ{U]i0!d? CArxh09fl/GjʚlbOc}v6䝡Y tl'(\]pM<*Őu߲K\GHl^GmѣMkwJ`/q T"}D⚗0'⿬V.T0k655c{ɶw NgG(%/d\wd`H޽9yێu2;䄨4ǵAby\*jpzz*ӌ?.$?C.gk>cWM܂#[pSW<(p$䈯 "$H.3(WW'#xC¸ߪHwoN#֎"c^lP<,Nqx.$9Ԍ{ߜl HI_B-W@T{;^z >w%! !bl0g[2+ WaRy /B2g)uOi?{o$ٶ5]U=ݞowyO@` Y2aL`Gl0d!=d#P5Ia²f{{{uyLڝv3dV'|9U9{ڋkv H_tFx l H8^邖i2sݖ1@DDA/º٤$~uNܲ挶ag9;mBr T B@Blmm>eʵإϩX>I?uھw]6PL8bx Dc1#;]R$Y7#Җy2$KKkgymZ@& EY{ݧ IUwTvHscXHYtG 28^;.Ʈ8 Hi'fjQ9]BtD"rՀ}kസU븛!oK!}JMKM#oC8 4iccc?511q:) yZ̜6IHzᩈrJj@O[~d'/к̦Rx;jEHĝ0#maN#Τe0m/La|΀^O%Fq^،߳ cjKAD"SBa-mK _p^nb|t_~7"do "^x!\^, к I8U_cڄA[lP):JFP"5^ꕀt((䭷ޒӔvtռuW7`C=N;un{w2[pŲSeRnDi|[R\{j%=N'$Aup(%u)PPpr;|f G ޷28Nu\}®A1}p*}H3dBȠJ"}ilggVsε?r||jDrҥ~/Fe[:v*L-+z-U}% \W#bHۈ>"fGvںI|GY#[Ԋst.yLH,iܺHZKn}RLsknM<8A4B:K4`G9m0u vv轍Xd H R_gY`(9*Ø[>E" d|Q_K^_9i7?omի4vCCk׮ɃN"˹1'q]v1\QiGmS (<×ԝvYR ;|QZ,/S֑~ADŞFq{RD* XB ZF$w X@`G{Rz9&W GvS@|N;[o wbXm/H$&zsPc4Ft^*\ؘg ڠѭ[z]naa4DCZSׄmΪM@ܡޞ®|ݣGxK[K]$ݴuF@2i>Ǘ,㾔uH?G2?Y4wI$ ם E=ϑ# /r82"Y߿BOdM5)8QwBt@񛎣tWu7#v !HKRiDxԱcڞ҈T2>Ɂuɓ?<@B*˗/1 7I# @u҅:;8ĉGiQ $-I6Iv۷\wjdFi?Y nYotV l H]H6'L,ݷUߊc='5[wZ{IT¨ZBLfM:c6)2ǹVU?~ONN߾}[#R7LLL H{{{yP릢):F!lP#Ue2.Qp4*GY#_\;(7psBvJzYSeIS&褚3yPD4eB'a}v;:Jͱs&qS:ӃD 2/\ RfdZw:DQhsBHc~2u^?!( 5lw={=KGy5Q.bsԇlN)ICk mCۓ ӥԉ}|iuvQpd HYֹGYHcBqa6=PE u\<6vH}9hRq~ 9/ u]o; _X8n 8[ΊG{k  l! vvIg -JEwJba$k_J>Ҿ6y@gRGD;|}FG#\:7H)ی$֢;)JQFHCē쑎 D)ĶeTg H~хyPԠ{z.]u9%fؽEu(ܢ_k o BIL-б6 6D@@2Ιٵ[[[ߏپ?NNNpN^߾I8.FE+qA=[PlY|QZRٺMy4*E,i\M[wԅvu:pw_ff{."\-r,9tuOd0km9=ϮxR <ڂmXtѮA϶yIzpBPw}}KoIԄ+a4rl ӱMhzyww!}efK#)Du]V(.]Eģ}%fÒ:FrJ/dIm۴Vu}DrnRQ|r:s `wt4J6/Ԁ4fr|}5CxgHJ6D%9twfQBMMJV!(ALZй iWlo?5GG"\q˯Svȴӿ^vu}H{wD}RR#W񥭋Gi/(xdHYRgQ<"E'""U=MHNC+)ڊ"RpSCt ŢQGZG NKx&ٍnl"c sM^k^J`uWz Zv8o>cS=iBHkXS9_ן.v&jZN= <;lI9b_צ@L#_:_#[<#W<##n#BΟk,GoLHƲݙ!ȳLJc>_F4-QDRұDww(T}{cuQkMRmv,za?(EHɏ}PTC)[ պ 럐i !sGd" *dz9o`F PVellW<)v=O@pFȣ8mn#RdRL*ħKYή#<cy7"R>pfW΀>כ!gA3`Kv$0ҡ[W.Kr\~Nm<\YЫºHNz۶:n^HjjzZofdd;Z=Maף߂-Ve e8M]E0#;mi}X ǒUBZJ;&R3F$]oqE!]"R Nݻ98w .]5˝ p> ) E8itܛay^dDϓ/I$n`ZO(?W(q ]Pp6=k^H!Y^^--- _( ]fɎE$7=O8ׁ7F?vz-GO$uw]4i|W੗( 2r[<򥮳#_#;dG(fJwxDHHd?6)`0$_+[q:7.1@:c"#c Sם'ݝq" ). ӤƁZH3 ubj}bwj+">BzjEP-o>"҅H(Q9G&[3!Z\6Ǵ" HQHH9S˨Uh{>}0MúHIVJχ߹׷֖@t xO#ׅ; ~ |O/@Eriw: .cSG&b+%BN I"uHsgM]'*5HD7!`Ꮬ75(: vٿ/uhIXCwsMs H]yD"r0`pKm/uLHf Ck?qttɰݩVS{AV*>xɣFzt ՓNtR[[[CQ5O~K?^:_( 5A\ȍ>GM 2 qa=?}7J8ZÎD$gwu3 9c7j- w@Sv<-5ˮ8׋<N9bB3yFuBzy@cITŎjT-dKKKx|||V kГ}F>?vtt;;;߻;?}ȯܔ _YY9F\JSD 6B,j==y Z&SʼnHvv ] g~\-QGnں4[!m4r嬈f(Eaɹ5ٌ l6O{s-QQSC:S;>۔u1cPlyC5 \5ܵޏtET5SbvsDyGGDpDQ흹:<<699p_7nLj'+ʳ/_ܾ}o&uMo%vAKƚ8.u-@[=5# Yuvđ+ B#B2VK8$S_i/ͭIwug[||vͰ=ţ΁M LpS<Cf^MSq~;TӴųEjqCQXOH2Hgz+Yǘ˗/vx?,--q'=d}rr;:lҁ{+gW^x `R2Dtсimv#7;!íd#$#MagOj5miWv>'#f?.q΁s!! $7~K3JvW&}!k!Ń^֚vQM1?q#IOXZZ2)yn^"XY׋pr{rǕJe{{_-V\}mhh(͋%sa%?ta !hrr_c!Dӌh6Ibr>ƥ""n(qC|Jsff|]1}Mxc(eA~A=o #az"MBaIҕoZ6AVT޿쫫9ߖ6DNLLο~j?߾}{+oWZ}u>a`^m"lH"1j H)XGMx4Fu#ڿrV"5K[Wx;!7"=תE>%ƉEi-!pY($/6αj<;r]pګH9Sat, ;浚v9ύ ɼұ c5 !m2 *5t7o.| ARtngf7<<166vuddk~)|WȠ?!m055hvww? g^ѣ{Dji]װ* ?2|ؾ!lN2>zH7l>Dvb6' Ar l &᜿'f1&Okzxx}ttt^ݻw?Ϲ$084mJ/>SZHx Iv!{QfSQ<"$EE$ӬlM$3kr^<*d*;gF$:f; vC=(h i1%dA),뺨em ز<S=Dy֮W$FE]uξ) :뼃 I.R=j~\N:DSSSO.=99cb{{!$#m'w:o H@, orxxxks)abH3lG~N};s E&H\M:~$`( 򍢏L]lFrVq4(-ȭy6W8ċD͊H>}E8J>d>3RQ 7t.vD!$ }W*v bN<oڌ@r@"> |#ˋ88/,,t,u;KKKc<ר(􏴵= JNx~H/&)P@Wh4ј^P$r_s#dn](MD?QRk@Bk%)kaU@Iތ*"!.!]:c; vbģ:5"a]qz͔P6G UaNd `#DQwv⚴k-.$-򋋾 I!B4iD^tLD{pmc,}?P'e^)" 8Z5M|6H%ڜITo6*3`}s\n Agaa?ਧP*ժ ?ώ6oD(Mi3BRs7)@ap\ӈ+ƤFGH8!).m]+u!%IDJT&6xd PesHLeg:-4SD;e2/ϳW9C($Qd!܍4vlԕ T͏,L!o:z6IUN-ҙNua= e0 )!6Um\1%IS\@ ȷD0Z`A"|bM :Ex}|;ބ|ӬTBNR Vn|;3P߀ q|Ktzt8h٭"LKs RyNb#a#j57y. ,:ǣ9S$5N.FFF^wGj! r!1Ș99cҺ%RV@҉.p!%i4ĕ8\Wȍ>#J_ȗ*B.NH EqQHN4xW;R<BrVNτ0BpΞx3#1 Z?QcX$Q$| r hTPt6iu0_L;rs`3PW}p=qќ%(NDG8.)mqF }w:9 /\.Qf #DT'Ej(j" T*;2d; AxE]x0/p,H>"]JXAɏɇO)lNhL ,j:027TgGjNr\$>A!r2S7s 4Fu1Ҁ }Gu)L-#Smƨ}d?@;\(K:WDb#B,"R)eRR)N0rLe~ϊ>(4|UH@xhtS 7: )^ #vI_-mV΂ /s0м9>}3J +t;(V`HڧOzRS MDZZ6vttt7T*/ y[(˯'&& )![IcK]{w::I{JK7:n6'E5x䦮s[w'7i"ƅDKDH$>Le~/p-5].юcrCޟH؅hR1N#* 8.Ai+57$Hkn|99\|`%+Onhttv}2#?mTEʴ=Kz> a5h ]oHj'" y䦬c:BODg pţu!'&դ9(S*3:0+].QdHyĨv&,OΟp-#7@Y}\5 :R@8|C}lsp䚴pxxTVg'\}T*>/^;XHcϏ cjoN]5d'w I;UF#nX'X:=A&EQBLR\##״+c;\E eMe%]S~r%n D2<%D]gWxA4JξI3 Xj xWtn9uqTDun ShR1jsfɕx͂;;;oWUYYY~jjחY vԵ "Aiݕz. iM.Pe4!=q:}䦕KvL]GHqk)D$1TvqRTvf煮~>lN|F*A^;炭5pw,JFl( sc0r- ]9&Dn>tQ8>IHin)$<˝;C'''wskkk[W^+++CLH|wt>O5:AtJGdALdivB%)4[E[E I|,i뒄$Gg1WJD\4vI"щ4_.${܃>8{ wVw.2ǍRHuS¨n4l:{0u~v\ϣ٤ L e+]qL6+jC<142SFQҮXsƶk~j:WT:~|?FݟwΎnnnO<Ԅ䎚4~QEҜ7"Kt HZ܈!z`+$K}lii5dPY7!dHxeG!۲4ċGDţh$#dcTW#4◩xcab> nt2 0kR GZ[I@ڋU8 3lpůWj]O%؀$H['jDR^,:;;W3P{?hÆڪ&" ÂڭXTeq CiedʘQu4\VC#Od>E"e\*4#׼+% I&)/N$> [KC<*Y1dI&bbQ[IVu40%9/O%i}`3YCvCfPfO( e$irMToI'Q$ܱׅ"R/0av_{W*z:' 퍌<::񛐾}ilCrVPm _4I[$uʬDQRM>JJ3%ȗ'@e!v$Rٹm&]Hv=; 0GD$IحzI[`c([BUv!H;q!3id 9qC~Kڷx>D&bSG9x6Lں )ccc+_=33[[[MH_ڱfa2ނS%v.LX0QFF+D"|:GGͦc!ľdB2HY#_J|BEL]8 &8K4)]-NFm.D’HݜG2MSg@PEr;pB"#a]A19pQ|cxK~ [&_J>,t la!?f5S4ģ4D!lsB9 !ߒ(e;u[iI߁0u]a{ 3%Lds Na8ɖ7Q3  쒞GrQ6-=|&lZڴAuRu_W*ZLaal$۔H{7%܈%Q@(1]xCM]#߈ N4WKaLQRu裤L)-k=$WDJt#7 mH\I]ߒF~[y3,!v] R"+qt}A>P~JOK h-vG8R%"cHpH`A>okz\.oW顡=7zf$!OݚumJKϠ} >Lp=@FPް{F`@Mfl' ‘/ĤV%d1ͮI1cTvqQHRٙu&($^Um]Ip̱! H(tsɷ1,ܝr Zc I2Ժ.Q"蝵EH9ځ=}?6FOu%o5WTJ:ڼEtlB P7(7|lP^5UYQ)`J^~8 +hBn#so仟5m]#BǰzHILREG!"d|DSٹ⑉BѱċHf3QHUk|9D!iK86!㰽dmCcWĂ]i%N",fswķy8 o k!ea\P H (ǽuĢD"i~ظLnD}<0=f/q䦭GnQ9%EeLk&ΎBKcw, XގX2QH0e>ˎBrE(y /dk0b{֩"}Ǹ^g0_0@<ꇨ.dHCm-;Ĵ^㈔P )<{R|R OQ րi3.1uRmyyCCC?|)\.w==Rx( !ׄN6}/vHY}ܷiWb8!,RR׹#BHƸfSٙɈH&hH-"QH$5B3q{FvK+ oITzBY;q ) "RGz#U4E M z(Ե>/wҥKryukailOe{{VV0\s/L+Jް-{M=~?l, | :WNNƎƇgBH7lhMZAy5sᢈu]}'$HiR{FB=5ήTHF@:&0dC2oģ`\-$B{v]c4; R"쩣bO/)3`L;Ҷ^ Hـ@(ȭ^6lkBa=DKHLNYZZ¹yr|ի211Qky7|~?=_HGZm;t^aj' H 6v.Xk{&(U |:f#7u]\HDiψ8(4$7 iX⣐!E!᳐]?QG,n\<!mx} ņ =8|WtS("# 56B釵ʎ46,?RIؒcn& #"u5Y vZ'[Ksw<<%BH;@_*HYD$S ߴ($L.&;>S\s"SE?F`|c=yCsB #=oqY\(=eii@)!Jr[AiJQw]Jt)n}ku Wɗ.-ukB:9%sTv&IB#[X{QHsڢD&Qt+ yM+$uɆӰmfIƢ$V]H|.;RB8N"RxDH\"s9BY5QdoVQJjt6d)Hy͗.K#;`%u_KJ]#BHTvn ;_*;dEqH& ($FH2#y5Qg8(/ pStQB -Qض-B̆lúΗAD*jK Hq"JKn℣4|GqB!tcI`N>eR{F)҅>qض/t\X ;IoXrKmY[!/uiD׭jsI4+kM-)%y'U$=}Dd G&0-iH͵!4$j"ŝL }3ЬOΆs?)Ƚul8Sh$_$BH'z8iwn=$_%tuFy ]s>.Bj75]tDX)]`CZc߳`sw A$6 |3"tG%`TDuF(B!u &}A<9c۟N;/p~:L]iź%GF"tWqĸ($[<ʒ:t*S88HYDE8%ᢰ`xkgEIU1Y0gQg鞕1Is.?ұ4vk&:?3)!rqjjWs.[lܘ[ G)!t [E$](a9n^;o~U ؈ViFRټpM#F ăDrœ'M]І{/_:F~K[;}B%BH' RJ; &D$`i=o+]LcXLc vMa4Po1r4ǘdԅn#vGdEǍ{ =k)Ry QOB!6D1o#Y#7 歷sE#s"磏|R\ $3yDB(.xdj k3I'YgEgΤ1hG&# 6C#Iƭ':v+>:= - @>vEX[./`MCB]tBY }io$gd' yF!GG^B(B8mLqF,ڗh7VϪ|GF!sN fw\_~[. 8}RXr=#s?#-Rf2 ) }˗ֺ!dۘk$Jyn!B:.-=]}MR^sOZ9EݝH"I>E*5BM($_]88[M L'VltMgG_|a{A]B< 0* 8 Q7kOP&t,vHc lko/eGm-،4qޕ(R8s!!|5[Ix>߶3Bɐf$x#_gH!y($4dHt$gSܹcg<4vI{QAʎ/Aή 1:ŎqvE" m:}Ԅ"x6"ZÆi Ɛm㹻11dB! CAߴ"*^Kz8Ls6&9F$2HpjCBH;dL#?1*g#%^ElƍLcwjcwHNcF;}`~ԽiMH8֋>Vc^q~cbf% D󍨍kBH1)l#66鹤ɞOR^ke)N0r($#4$^8-|QHuO9 2K*aD⣏|ujr6gMm]m-K I\ =[Ph'B} u=I6~ QH/iH%Gyc?!>LR' .V<GvR 4R2UCqH>GYR K` 5vOɹQDR&Fq»y]Er?IT)HЁ8V䘳8 ]b^sis|d:@H.Ǥ7"aR=B!mXpthD4*/m>Ka@rE$G+ՅB!$ zo\MkvRzlC*hdN'AE҅(6~G\M;H>1)|/<"d"j}x^nWHvԓOH* 藍}K$#Ŏ:#TD" 0&tq tv5<'~ }/KLƸDQcLL!- 5;r'h Jm}w3.ɍDrk!>1[)J B!$N 7MO I"Rs{,)؉O7`A] `%8I M+Ry%QACX(Cԋ>G$͂0W3n52jHv'Ħ:cB!cđ$(q+bRR$8έ!I7 b "?FB!Mc H%ֽZ+_]Q#8#IJ>̮HeM[2sǻlbހ(],ptI$p}Uwޖ(lP#HX#B2b{o7xq"S3iz,R=$;ZȎ@E!L 4}PH" f̌q٥E(b搢Cړ¶>OG$H]g%vE*R r;>@]Kks8QQkjb&X\g#!F개|O@rEH"ݲ H$gbR &^ed&R+ng}I##+uy#-/]IDG/ NH (VvF*'z B]^/H3M?!b昑( RHhZ ""1e$!=>g`A))dMAY 4sx~C5tXv;R\_1}!TYȣVģ4v&$!ϋ= `i!6 1)tNA_#r oesbv]+P6X!Bb TFѸNA7O4r%H$)A=y~4aUiD KC<2HiG.)BH^""sOXHN2>W0Ϡ>eBi # N<.IH< i$_[!RG_Yu.ξuץiTۺ4rk$t+ShD!JB $9]RTqU҅]Hy0 *zG R=M?c ~?G<.QMvE b^(  m]HxtW.S)!uq>'r>ww.g##h;߭yoK$&B#ͦKLZCe ApӈDPkq놌 $ s5Mׅi[! Si >㊺H܁[:~!B!@JJ]W(N@r>X$^lDm#cLY۷qϹ~G)_~Hrd! ii$f,,e_|n]^E&a~:MGK. umH:H!>qJP {h"PK6îhHWe* 'ҭ";af"{WGB1BHԧHJ['|:3F',Mޗ!Mb~#BȠak&RW)I%]7wSg-yZ6wm3AcXp u|nnKRٽfD`ˮJCDg C ]v !` HiQZQIIIWsii }}:I$!IKcW.MHE!_N]Hr] ء;%tVi[ d0DξEa2v66? 3B)Ӣl\Ǟ?NW'ud5߳YD8ҢR2esBWqŚ44mӂČy"Q <=HSGml Gl? -Na+N@ |MNBbq4.}]HפԨy`[A i ģ"AsR>ZuNXcw ucD1vI.Gl4kkev񲴴N $' HiQZQ0!gZK1(δjΥG/*SJ J+:"y2"-\]E)@#FhDX 5o8Jň>H >} }E=TB(Yܨ"wqo RbH yIPTu4!;ǥHzDoK'u2t Kݐ8lZ}< Q I6 x ",} :^Gm8;aBE萤GeʩǥKڝ.kg]BHRk#%[QҼIpLcF.]ƈ>fWdNyUk?}n5 "9p_hc #1!b;y^#-X%20T"q'L~`ԬXNIr0d,/BȠ- /}]3GwEppa'ftҐnea® Dޕ. yc:ݓ}??B2pTC@zŮ( a{/loK$O D):XG!=[$ىwsI\6Rp:[!Rɝ㴔uZH>1EpJ{p/:O% E"3݋pJ1:-98- 3dm8_u*\0O#E'"!"lr!2ThR(nl5[#RoC)ɎF23sN\DRFlHP")^A !AޢDbLa|{(LX0 )NNHD(%)H@+\WB[$-M(lG:N,mz^ `GA{>-q;p|5HhQ" _ID HA50\~9_,`"2 $`-Uc:feBG*p҉GRרBKЧM!Rx\$ָ(XWHjD. i !KN)ueLg{2p2WD9k!GSB*&X#Ef'rB%繠$:(BN3B+E!-(޷]‘{-l xLz>wıhBOLW "솾8D`sl1^C6}n51lD!o /&՚W<~&!(4ɼGREA ga{e^:nw70(oFtB;:[v6ðRq|nخ;r Rڡ>6<$GFgR=.A!2KCDR¼.X彰}H:)ZߍM_"?y슖$SyHD| ~!>Z:4"B)n 8$/"ol*;E:B KBִα^E~xR- rfw *D(\ֹ$1=FHPXnjBHI$MF!XzAh#7e]{YP\eɉu[M$u w\`O }yt<û5hE)? %eH]aJ;B!@hD!DRziQHi)Z=ُL|)MF6dѹ̑6_`^|-1s qQxQ#/*m]kpA"DQfB!$ov.!\fRڹi'l )8Qb1ӺGݰ +2s"Qz'cHHH$_:e Ҿ0 D)=-H;k+נ}%JGZVBrCźOBH;ERۥgݳh^MwŨ##F%J)3ˮh " l3}]:?JM¢( `"ޕHF|tG-u/LvLY]BGT^+N!6IQ8"rQq'Hog ga{6 H1nh D>be#NtࠡCAMజ H,g Q$[BOޯcDaPD~>l_DN6>8Ȓze ?iH !9. rs|QF$7 JBi$$O`w ^M]/;Ly *o0oXiDgp?`wk|ER}F"=8hy= ְ+ GoǬ b/m0BBZ!. #'BB"8 ;O `p'5 <FfO` ivE Do1.ޓ("k15#Y؝~ Gv ૵}?pMzĄ%r#nOKE|#&C#3fMfBˆ4 \B"`?Y`c"Z14ztSlD"wZ*!ErZcs[uM2tdBJpR%MUQ˺xĨ#G.t]/%_#c/ Hs7ҋ2s!>v^o |vWmHe9lῒ|GjOA522r|ɈBip?H$"u}vDʘ.MTd^+NϡvC*pR@ pݯ.7u GMmiEZF6V;a}/Z.OЛǥR]z}OjGGG?755-phpZ^^j*'''oёjkxσ gGGG&&&W^UfBH'D! CTtE#aq2bg!b ț:'9wu03zu0, P .nk1OH9HsG(BᑎeH]tdˈBZ널9(h-v-l?djjuNQ;wDc>mib"+W~off滖)A!t $3332==J.iCS1))⭮/,..x?̺x`NuB! I<82aðEc%"v:\Z3c"RE:pxR@<` #1/a>75@/J$<2z-OHCL*"7$JYfuׯ_w 0&\zUݻwMI?,--}/BH+0BH1>qs+҈:b:/$@"́Dco$! lHLcwqk^"!iA2[/ul!74ģ1]OHq6DoNASe қMY__jկ/^\pyy !$. &nGr| |?B R]94H\^s֟Ɓ;] 'Lk=E-$ YPSj3?0)>i?ψG###r yG.o" ~:xۼ\!YD![οgNޟ^Z5{Ĉ`BSN]b AҚ0@8W%!E siD)ݐrP~XH{9 )ɕ+W2>^=8BTǏ !$ !tø=E(v69ZG'[\\A\Cj8^~-O>w?\ZZcB BH@*8%<&$O+슖X(}%9L "bpa4^BϾ'QI0CO-c&l755}qFe=HZVKKKGN"BH'ihvf#Q\"ݵkDqǁL E9ίyģyHX$JEk( l-g6]6CHiw֭غHZYHB:A Nq:!(u(i~"&H;q~Q:.enk!v !_ Ci&+6A}DR?˗/!lS >X{bD!S@,scFA}HwLhXѕYT$x %vޛIuoDgUVemnw݀"h*"ิ4(:"㾌0>nݶ,}}眪'O'"N}"223g xռt0hǵiwOl.--]d}p`=-?*GM\GQ@7ZMĒģ}RQ ?I@!;h5HPMR5zTR2H@Z5@rH}G+9 sq[\S8;W\y*YݼyikkvvvRXrHrQ;a@u_pqTt&~5{1s.&ICKvL2%0@ko atl7ωf8D FlpگNLLƍ 4>hmm-wxxE64nQQE77 4/@c4Y>~ ة\[7Hu8}ټi; Z`2qrC$ZTuvlloܺue>> {7ްrj~Hobn`@/ݢ*iElڝe^#Z6F:pd-|jIkF̐ .~gee݅B^m}@"H5L>=62]ֽpiFw[A D۷Zg9ڶL*GynÅ.^*}477c tb®_=n_ d @'# eH7R6rRA@jMF@&r6DP H8lWX}Ev) /k.2 ˟C쬭į{I\.@@@Ge3n7>U#&#'V"T. \H*c )4[x4@{.>j^Y[C[?^s1^t'fffsbyy&$ET*O%A3C`H.H}pyuH29DY =S~.?.>i"zzZ<::rm.X<;;r1QTꓣ2g.]:va>ye ?gX*:{y||禧q k׮oan8J|kX?$S zB My%;^0!⑋3R*E#D1i4;. 5)&X4JBf/X5AT_xrr.b4|_BԔ''U ʁtůAX\|[*^\vytŁ@"қoy{w'Sف5`XDVΒĐV%Q{H_JUnssnu鷻u2 `PKE_H븁V$ZVRu@B@6*c(' u&2vHGyNą߿ǟ}zzzα)`nnF1WX,~{R陽ŽvR|}$ʊhfccgGsTf❣4j}@*ZFZK͖92zپyVIE"h_}TƮL:ꃴa^QM_ʹ5N€'dB7VjÇkg|>_). 7eRΕ+Wj*ʳTsT!K u7\P|3 [+HE}Dٖ$h_xꟿ)=ʡJJHM Dt9Tm MX[[{vvvArM8sn}jcc;;;+333_~,6H0䌉D{8`GX>sB+OHP]=\#Q[k0$\~UCD.~ڷw3Yj /`$ zJ\YĽ=\00Y&DE\dq1I*:F%>t]ghߣQ{h"4@C!ѱϓ  r#qi{{-r3 &'Ν;I}\r9[X8_-Pe~ m/͘"Qhd ~?4Fo:CF0C$JAM..i90j/bT*Wkq*A *c[ h`E2u8~5 ! b?`7Hg񶨚' UHD2vJh[1\0xtW_v(KG>okk[̳ܽpeeŮ]Vs^;::[,) 0p n#XGB1) Z(=k@@ A%5?E%z( H.>f)/p̞%O#3 z%Z1|vYdy3xcf{vHgyiT$ze[ G+{<Ǐ?{oo0r]~V`h? ;NNNKfF$H8gYFh%$ ĤL׍uݢɛ{FnQ#\pq~ aCMHr?k9GO96ODZJ߿+Iz*0B`Ͼ.XaSZs'Ec܏ch]ԍԒ+|hQ;W7&fG8Q0i]& B*E} 㱿ONN0:d!LOO?{^.肀ݐZ\ɺy=P=GzHu]IICƩtnu=R #4@-Hzz) yІ?~6>>' &" 龚z# 1$A. EaHg=O9gc%H}=gU^ "r9F&:^ >~ℤw&E]JsAH=6TSᮋER CfHC AȱsMY#4IXXE!"r[[[ޮ8W%RZH4Md.W+}&QD$ > d`4A@v1k|]yFQᨙx?S"R=Q^F$tsü .'4g09$n2[>:ϟh Hk. 6Ik얋C)Fk[+iӧrrrk.]ދtl_Hd8́Gn4OFFX'ȁ< HQab'xS;/"E]1),"k@]! i`utXq-|=R(s?)94^c hLԿgtR҃poo_ۆ${vf;;;5($"Ԑh~~]ǣׇ(J#bC gqHV#M[Eq?ѩ=.V Dp 81)]II}EuuݣOHCcyClC 'q(rQ Ḇeɿxcww-wï-//MB2ڪ;7ZDՁ- @fnb:%9 ^D8b~/Z: E. Ia)*ŕ'&!$ Sj~Rt7dr4ν8}gmDԆך)'J&moo=ilnnhT=B$d$h)5*\ ju/KikT<3kMLj]XL Iq@H?Za~(-Au["q%@'H@Ё,|0n,6ȉE o }u'~MrzzjRu^k]">M]BI{aj@ļOℤ3k\ޮRTD z+or:*]7A*F e}#Ό2Y9wYdYk,8aB7q[],YET*N r- H1<K/'o{℣FnVEVŤV(^VsH}?ݡHE6gL`wBI vN$\H*{1 Cߏ닺/[~nk9y&''Sب ;&&&j<{<6O#V_].nrAc͏\|G $膸2vQ)BF$qx IDŋIc7gGo4l=K:pAwȁł#/I46ӄ#8qvGHzJ=}&"= 4errrgii7~U=Eŏ# 0Y$<-[)깎 ILAE?6*oױpհgUyhG}=_q qw:EC_10lTJVXszg뵲urq^-ݖͽ6;`̽KQ;TiOx$zΣykr' {"5Z}Iv6H&y;W7Rw)ժ>CX!]yС7H& qs>h5I8I% BT*Œ?ԓrGGG2 $ Fkkk~27gW^BИ=S:&Br#敿.[}=,sţv[F̈́8Q)\.J Hg^i(:GHC"hQ&ys! Axlc17YV/0tJb=f-Yѹ:pr٩$RqZn8בHz JjJ;Z_w\=pnbSrMhQ'R!xQF_#yycv~HLs#N|? ovCpz+q#Ʉ{x9vGOHCO>;G:BV$H Hi?cRbkz$""~ƅD_{QMD ;D‘=Hf[$IF";vjJ/>/Wގ@ @7D{5*17_qO3f>Ĥ8GR# K4f{& bq#uV9߲6hMi)3[SNUoPWxj4%rwiQ.$zJZXMbvrr;ӧq5M߸q^GE#z\۫=O]5ttK<.@< ĥQ1)**Ĥf%ZXOD ^nS{^v`ŤG;#)FRj.+]n5oICG$ur\3sr;?ZBM\+0ԔJ%'DNfʯ\/굀<r5H=E}T~n`?V%MݭWwb?SlΚ ^G DH^AqbR7BR+#'vQD:"RZw$hI;Hq V;yOgr퓊s: z͞:F\|pˆP*+5yi[tU*7FM y~G{ׯ_>TH7p5BVWW˵R;;;qB{\>*0@ @RĕB IqR {~fRĸZrvQ!iΗ FBRn HK _?E7^>I @q?E3)NPj]F FQ)RTHJN"R_ݣLΣ'_2+II*K:`P_buqŚHnޗqr\H< xBe%M@ vݾ}۶ɓ'ѲvZ(]{/h 7 %¿W-ΙWBRؕGRXHH#KՋptbHBR]ԍ &ڑu#I_=0An%n'~$pɹO?6s!11#/"=Q_"R?yFN #*YZZY{a鏻댞 v"q<"DAE",Lb2Sc&8L13 b:w&C2`[XpbF(g¡#5M*ƄW(@/,Қ! u.%aDd^?PYrcDE=Q>G }tnTf[{sb^@$iJiXg±pO~&ݻw=e~S% HüI`UG!DR=Sx rR!U1)gLQbyT GAiꕰ>'$EzNJLV=F/A9:*c'̪#I,QFRT7Y,%"{r燄zXr VVMݼy|ͨ]Ix0@4J}/*];2qqN LO_q*ӑ =1zy}& Dd{U#)㳒vCn+"pQn1!4@Γ:Gr^]02J%9>l{llu%ZeccϽV(ڵk$za-_waHS?j^9J0H>Zq&5*qJW.p|ip7s,^ivRv>~xrrrΙܮGI˵u@"樕JT?'|Iq\>u:aYzepipehT.Z.rvڅŕr FٹmZ0Lɡ)*_wF*9]IfHO9$ =Cc\!kJ%]>966ZNNZI<:;;?SaEޞZ\IaGB\>onif~VyJAO$ꒀdRrhc x4A:F-sot-T8 H8{7V?dO~X}NOO-09:j^BQt&)]d{{.]}-,,V!T"s 0jH3qNԑ®FeEDCD.hPN$w)=n z&{E H?Acd]5kH</ԯkz:׹m)#)x=:(yQ#*{:m>mJhRDrOۣu쪉hhRBw蜆 ΝOs..HdΑ^yii677\./J_5 Ks%H }-,"&5{=~9k )W6Ku%CJ17xr9ʤp*Y[9E4.kaX,{\|/Q xvBI: H2r&mll\} Msss|73xqqC@ Y$*$5F"R\IFBR+ѨOSxRf|J\1Vv'{k# 3# # =IU=C7kbtWY.Hrwȕegg/ߜքL^kBnX.nϞY[2ўGfE3`Im>o65HI7ܷɠ7G[b^0&8t~.@"$ ʫ!=2$H1b7W̌bՐc~k(Jg]8h&'k/eVv% +kW.\.x1)**rmY2vOw/Fɚ1ព5C10h4"HCt,Q,?=|KWCg}>B!D@2wZ$M./$4s#<6r(5Re7ɽϸyj%&9%T@9cpBuHE(Y-X,>l7==]+5׾=+%ԩʼnEqSf D~ߒdR#'>9 hfg4tGGR' a7hL.I X,j{]q=CBZܘBy;̇}C8H>7 d$xBR7n3k,s%ꗱ{_*1?~Wmt]uVCґTtJ (~zΙ4cb{.~c$j҅&p!ǏùJ 1D"R#Qⶹ"R'TU*]w])Q4.QzP)&Ddm$H 5{ɿfCos1@'R?y5 =@1}HBSSSvtt~y B&@@ha ?vF{%#5*aɘdڮ I?oު[MCr#IHr(P({Nد!E蚨+VgҼ&*cG/$~Yz5ceeV. )L~P!I%!3Z]7R]Fg Nn\zĕ /?)"]yhA=džBܞ +t9kz#.l166fKKKYgTjnHڣ7RB ?OG~G!njnEDr?#ǑGWm@:G}&歈WE=P mhOޡ粱@z357]zGN7NIChbq$obzI[(ߏ[@RM\E҇ m2I@_)*"u2Aikk^k.n+&赱F*R9c9 N  ypzܤ_^#G) d@hEDK[|zfbR1I6 6?}([{+ D ;Yޢƒ""Ņ(YCRY E nWDjQTvHxmi^_Hl]?{45-п`8{ʹy.$Y5mhN$1TN%  3%H!/RN$ ~;bRTT{=6^vq:/ѤzQ!h0G#C0AbV3O:z*+cM _j'''''R~n3 `pt#">ڍ+I"z1o<f\H]ޓ[uL@=+8a]5~q%Ù ylhx$p| HcccONO1C6@@,:睔;ipŊAЌ"*t-Ǥ 2v%$~t@4>-Cs ݔ^|>:ـ,`iEDU ݉s$I8!*V_8D数3s!| ]vùԪ+6D`HI  _ A3IQUI;:V+1ۋ =90Yd, #˳p!b<.@+}U(l||O }ܱAY =+"U<6buT\hۏ:r=4ωÁzMD8b߇!w'lLh^/1 ;]}68΁41 o>.,,|`c E"R]!scΣzN$4as[gv^Ċ@ oKQ>>!Cyqv0L'ϡ! =!~mpir@ ߩ'y H飙)xlY~F5/(@؊ gc{.A H~`x҆NTQ/$b|?w^GHqNLL烃 4C*E(,E3kMDH6(D,mE;.vIP!i4$'3`ѵQ}]&=GV# A0Nar:@9:: l@@o"1q>PL6 U+[p"f:HhHʤc5U%#CO e)rP >/' $z  H8=YXX7d$"*-c 'dI),fYyQ =\h7JU%H0mޢ GcD $rH+gggcwnnJ8!&IT=WήQ s ^~\兩m6̚ya H Ha'gbm16Z񯡯=ö2> fGXY 4C9]՘̪ I&NaE;8 CC#rR/2RP|>' RvwwU *HG"R؅qAп!,2E)B:r ½y#&Mϐd1ic?߯s}LR HMH+*_d pN?@Ds'"1$ZX< Jɇ?Z.u&ICbc`5Q%$fL qyaIG8ǩC @z~d<CNŝL]׬(yB"ϣne$2P3k,JS?F H꓀?huYdo1)|xx*#@ \zQXDc H(RI'(B}'E1+h=cUc`4$~l (ݱhȅtȓaj GdggU `y|'$I?QT/ tut(G" "A;z|? [<{.k0p~qss04ФxT cNU (c~&ɡiG#({}HW/iR)>1$ԡz_yrrB: 0jHEgRXD*Zg 6pٺJ(.jdm‰yb7-G?  et Pi%e"9IGfذmJm |E2`8Ffe u"\Ү y4qxߘ$1cD9؀ PH:S).i83 ARvׁ>!ʼnJq"TXD5VaEe$1q8y YT4shXHҒeT.}h؎h:H?x/i\HHHL:ruQkѤqn82h?5zi$}Y`@Dl3M"@:=E_u. &z +iר]|]vHaMD$&G% Z='!kE%VsKòQ @!Ө/RjIHfBRu,ר1b4$fʎHd Gs"Arqp!ed5ĕVYSG784 `tW.Z=RDs!xhC2qm!Qt A]Rw^H0hðTZ.>h $lҪ ^9z%QYToMv#Ę9Y4K YC.]]yB>eCXU R6 LҨR8P2vq%횕 Tm2vZUȘEDGɣcR5BZUeURJF }0W E 2K#R)*&@jEDÈU2h3!q@@,"B7:r> A72ZO yc.>}HO.8Q3(N0' <d T!E1ώ2v ߑ<驝0̿t.q'@w d(.ĤF5xv4KFG9QҔ9f + )+|_JNMM]xmSum\p.ś|݃ J1, Ahyl$E{"EgP 5b}ʮ5hq4$$=@ x_.U`􏳯D@?>~5ϑ4DtN?G HPuW..#)*${4e&G% ]'2VzK@!}G# HS"a-iݸqOAx#\.]|xG.E?0$@vhDž-_WOH#>HTN$>mI^P[=z!.?K̜XTp!A?|=}~|ȼ i]^w]D2@ "Ni$$A:bRwBWw~"1 >}4AGM4@1 In<?=F)v)i۸i;bj!or.StO\| CTɅnߋ HG׵:݃B}tmn^UHf5isM+E{pe_⿸ :j'=VW|ş=!.>/&I4#?xy&#@@@0QQ @(i',EEzej煭4aɣȘS<RQ .s> \\JFMLLؘUH< iaaO zy~Ef.>]KE5:wOx< Пc<HH$kz.4Vs =KxDe>*dn<{J@<** qu0heÅUNKw_f\,455h{{*eH8Lc; I|Ɂqe좯/s"Z.߶nOA7L$ H̄\d@xEe.R*~=|6,..^xMӧ C!1~*tݞc 8H*gT(< (Jo]駹Q= l~~>{| )2LjVwa lk"$*X|8S~p`Q.,7=C)ihȎ`vXJ҇]nJa}p2˱t?'sؽHó{Kci "N BDoywܝgMΐI,=cD.$J]V 4T*q_꾼Be~ļ]bšp\?!Rvqj̍4 tZmg9 I 2[YeʿѤ! %5WɔJMcbqq.>v߳P(=}zqޮIfMy 0SQ. H6VzV;W+hr[yf32@h,ׯ?Yvq<~T2RI %>dIb^r6g1Ji7Kwvvn Ǐ۝;wb]J!~Ш|kD$͏>9:OZq!߳ u:VgDɢޠ q$֯Ir4Ҡ Ie# RI.f$͙tVWs,DWR):QnGRTGFω,#h4/" k’1gdww;^Ύ$C# m!˼v,*`r-N9qzk4I'Qo2P! Iem=!LNN'NJɏ=rL ʿvI:KDkH@@Ns5+gW.=GF#VO!.cg`h00?277q߫T*Caa=yH`PD ts\F#W5xS/Hwݬ H㤡gH@Ǎ&OH;u oXI=k$"6ύtt@A@Vi& Efr1z"R/x0e\3T }qAKF;0uommz"A)" Hb 3@Jŕ|/*ʼnJykO)wp`蔏9h9)zo31 sdnnjjn$,HCO9  Z|=Z.W @q=j$Vy%)@giT%A0bӧO?q߫V+ћ3\p~hidq0 "<+eg1cֺ &T,7gk#h˿nQrpȩ*iT^p޽{Vp?/2,k<*czBR*X A1R3$sTR3R1P2vVWW377W螞֜HJHtqEt@VnQԊԬ5^<1}LZI8o4G%* ;T4 BZq1C*`ДJY=|D>okƢ~{\-*xy%.@&vzzZ~2t+K1 Q9Y34! @ׯ *UD$Q`<|paa333q۳Ǐe_2 Y‘Jڽl^S2@?o&E{LjT֮4|Bi;ݡr }ȱz<7y˗?ezzz7;;;FF. ]n(fU :FNfn^=mgD`/p{Di.8  ._ooo#"*=.>J*RuOq]5J 9rFT4j,YI$mB1wH@BH_T&EUI{_]]-m}idb⿓Tr"ż̹ IP]uR{fލnUGF+{K Qv,`tɘOkz%"iyo)Rj/0/ `$`ЬoQW+~!D)S @Hf^Ġ @ޢGLt${L隆0;X4lX!JK.}իWP(\JYR!YÁiGzx%%0;4@; uu޿z7JhA)r D\*c7F* mJǏڵkxjjRtxxho񆝞2DN9;.%C{kDI;ZہqFe|n&,CUcbЄ+{$8$ˉm;&\5ODbBRލ7>}qqxXDN.>F*I7+iGJЁj/ĕk~LhzݼG,8ry7@o-A҄pt %D$&!?;?-i2v߷m.>[ ;O"m>0T;0@4+/@fF}мfqozz! $D#5Ҍ/"H,HTS*v?~[nwnnBoµZ@*x=txƼ< v"dVbieS>hH-r_c@ DO~yODHr!ݻwh]8 o;FQG%nxÉC4#׃uP!wJA,sbLnCa|-0/߾}ϹsnCLE?.=Ե㲋\LH 4@/i}vhZ7Ozģ2i6Ri 腄RtkW͛?;99{r /ғ'OHT럺.̑*gWҾ\D?%c']+"6C^f)rɑ2*wH59HRך"ZW6Ѝz&I@*dM4>S*& 3J%V,BEZ*UICL}V,Ǔ-йcOH|ɿy= ڹ ?q?W~ݔj2f@*_W =?NhŮQ3-,Xv( T*s߯(B𩇇_\.|DIg~q.ϑ$^i"-[.*ew<Fu!H qOT4j2j$DEZ jp 004>H.p\MJ]:2OTҸt‡<رI;or>?zpܶ,+]@BHQ"}ka,R4 8_ݻweoopv >6=Ve)çd$Ga}m6ɩ.үKH0-Æs5VzS兑}ӣ@ed_tF C@ )xBYzѣGHZ%ĪIj>.?|cm<{n_S[, \VV22eyw.x`n N_GCDS0l入[ ̂LV ⑀($6lYTFew0^}gtYa1)^&2GE4̊ pȹ deNn $jYT3[?QD{VHw -f`.%(~\Ld/6}D E2m e  ON,$BRfb;յhNZ8ld*ko93jd)Ô? :rrϥxÿuN9U`]3nK@D v/s5gQo47S  @{pؤ ` ӐrtuYJhh8 Z q9 );f^8{>φPH@#e!yn%pX\,xÆǛѕĢxQ^òrȵ} 3@Q[7B7ZHCBp56&LqQn%KHCCLX7rcJ Fa6ukeުV?EVsn4cKRMvwE^?r`tYiZBjo$$j r>g?1]G{(0q\ElqŪzHh^ڿGKoVeihԮ%r1 V-+Jj]nv2;) vDZ=$  Gc'Ρ (>3?%YYIDcԚ]+a懒c8k gxmζ.gc?RMZQ 1n 5 2, ;XwWGt ,>y6u#Iڰ'}e=08 &I R$%ބN.hPxH fU ɶ6L6oHh'(}hg! Qǣ*t 8|]$oUCY f]%}=,ax>?]qZ)0"뺷y1b":wAF-$V۬ ^s=F򓔒L,..&!(,>eGKg&s}ru7@Su( Lx;n F ? zHjxK[Ưu^- k"Yphbqgܺnx0B`M]TSG[$2p+A/9.tҝܹ{vݵ7F3f ցd@@V Hc"`)ytv aw 귣vذc4P-mמ9[݆߰T3N Jfe) 8[?*eυ6vӢBoCC@XF4KA7Pk[t޹yp 2DYܼ?Ve_$ >fNH)(3KIfeA)Eqh8kؚ:>kc|.VrvLm# #`)]%V uo,5j@c7~#9w7z3|Ec\fe^=DVْSd ,$c)}4GPX7$eEYH f])]\c# tsl$Y~;TQ=sn HB(tZANLb pzbg8^5-,$is놅CvX~w5,:wwy|T I.53E<cُnQdMDl ɦ;m]6Rά,(gzkyȏ`flR5cM[D#8-FE\C9oV\ιxt}O\gH<dHpqUu-w ţXPJFHUPʉI%!  t }]F` ]ZmP C@樽1Bh-~7j_Y Ƴ n5rf 慢&HqVұ̚ J]깐X0=uuMRH LsX00=儢8g&sscKg Q a::цtEP7]Fk;mHx߸k@l XwH>Φ5 ^JB"4+eBxtOI<hl2muˏBR7v:n~!"I#uc "-g mfZ]&o}+[%,r%˻D$zfE!\=8|##Y.CcG<;%ϸnUMee@gn|Q&2\q x|my{'&MbiBQ-rv ch`v`<FDsǧ #Q-۷ YZԡoCw $NFFviԓQvد%'>ʂ;ĂM"ѭ瞺8kQ H91)I%^ -4I1oJHq# GQ(JD$K{nhq`Hoႀ=C'2-5-@nM/1i?"[2Fd=@a53MeڳT'"6ƎEB?>k*t nX%Gw56(h(Kst D(,XeM+kn-s҆Djji~`yQ* E#w9Q L,ŷt/kem,K[I0|G7Gn us(!IZH\h!X޵ʲ dÍuʄf'Ʀ,mI4(+=%A)qݦI=^$$m\Ql[v.+thG 4 Ѕw:yqn%B˸Ubڰ@Bzn*MU# Dс(6lbA)az7fp9 NNSu9(eaw&vl}f!a_gh#cʉCMd(+3[/AXHu Gd!~>JG$)o죜}],!$4hNw]C@X=48λՈP K<|o0@iʊ>~3_ϖ;iKQ]Q+\R⑿B!(%09&控D:(ʞRIAsoXI*_ܘ~$|R0,1ZrkVe*)8[]Ȣ[;7܉;@4TQxţa0!m]ʾ#1?ƷGaōRvA9"йkX=ݸ KtGиZHvX9[vk"⾻DaҴD3],mX8ڶ0ƒԋ~4xD)hDll]פu0/ i1`e-閑Ew`5r٭)%yr,%k:g ֳ,M]#myt~R/nImhd O*(ea<[V}4fBu6 gs  ru;\t+,?Z33lT! 3B'%)x{6)e^rF)Xb1;mюsF( WE翌tou BV£6T ~4!,$Ɓ;` >G}V}F3xx>TIu 0'|apŒY^TJ H9Q)xfAj2ޣ|8s*B}3KQl'u2ocLj~* ɿ_I8"; Vq]z.(U7'HR9lܽ^:h2l3]8I{kn7QL?١UN [Uȣ:_^ZNNejN|<%$bf!#oyţϿ. m"7fn$I(VD̺0`Y ܩy՝Dq[n֨XE*1 RH'-fn9Dnz[l$]J4 G8Uj}|j#xP /6afR/*L9(}j}7iu}]}ՉG[G|@7,/yYy$GUBVv_r*x..pŭUI"6Zb[R'.-t|6P%T' mFN  WhiK߸:RRGa-$"ģ\R,h.w((}%:٢ݼHD 4$XmZ75 7>wH/ ŋrt\ 8XJ^, H씲8(}ԏK0R.(qhGKg!!$,hwc} $uC6(6k"BzakvZeWB"]pU!~] 2xrIm( FJPw:5^)@#; V\ݡ8(M5$y HuQi;t80#:-;b"&]cW[o*(!KZg.T #gu>8#m䅣PD BdXX t8% 2-Y#dG]JvfdhJa,`s:΢$ce,cԯ%Ī%jk 8d6iO˼sz(HqpmF5B,#ÚRM,G^ R֑Q.e_l>i&>^@|XO4'P-\;  9f5v&#oaf!Bz7vRXb,}=q&ಮӮTQGd4E@ uÚ18[%ɶQ.XZu8tXO4+ehؽ:U%Ӫ UPB>?cq^">zS0tndgOle[,~l#w#`hb]glF)CMo$GGV>¾v_k=OwtBsd!:kw] -P*1Vebi5b[XD K|0ec|`k] -r}I4v2[7[a'>ţTcKי碱zk\cαn,nn8ZQe6ܸ,ާҰNrqa`ɮخ.=r_&\{hKuuQߍ4udYsѨHPe7,-b=t)`̂\OʼnIż(IcHrcwh ZHj]7zЍ{6y G@"=oݱ3a~םtD7Z_Mͮ{Xg}l55`~t|x:RYH8MwJOZYH"@u]}H鳏b\Qi%2 C>cp4=7n^+`UHHYڷټgTG醥$%x͎2k&k$mZR/@ufXnku]Q:`ޓaa\<^_kC7Ql>ch=[ܠ[60~mYY[B|pgcA(F껉 n}`k&[8+V^9s. )Oc:/)hQ}Nn !ŎaóHm4kXt_ 閛XctŪW% P]zUqg!`,ױ;ѵkwXmˋHAρppssu]<XE#7z;TQ}]*Ɍ#ކgXG:ќͨ]p 6ޱF!ufƮ[  Z%"[M(BC349OQ6vqR/hg3CLc8s 79Ժ.nxwc E &Qξ.WgkG0a3HAe1T6v\y[UoD, JUġ-iR(⑂Z޳WYD; 3 H^DHA٤]rH 8t1Dt53;?e}TRGa}u ǜG#ј/ABBuӜwK#D7V\tH+/"m-Me!U6Ţ񭠅䅪8 `qbrV908>Ba Fa֑7qMX<:t8(e_dhbCFD٢}4ko ?&V(!mAV.R,ApN\Ml[:ワ0 FaR|Q4r$X&2=YU)˸RQʂnMvB(} QGY:q9 u}uF;e75淺&>wk܇VHgP.ϯ6o [ >A}P .dtU|Cw?ece!j! ò uv̼gr.=Je Cq,gEl*(}Է \ G0#^@ڦ+fh3\Cd]WccAecխqUI;P֨_*v/B>v̍IENDB`images-actives-html5.git/src/share/themes/gameDragAndDrop/img/show.png000066400000000000000000000024571250410645000261740ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs B(xtIME  #4En@IDATX͘oe?3;Kq!t y ƫ^ؤe!a=A" 1xhh,BHI"xs1..4mwvw7O<J%9zfةAqO|ET*eoOIO\N–=F ) rbq]D$\+uN2&O߈HXa'ʕܢ_wj.jDv#i JDݴTP՝Q3TS3"r;SUea`u\ݿGg%u ?IENDB`images-actives-html5.git/src/share/themes/gameDragAndDrop/img/unlock-icon.png000066400000000000000000000027371250410645000274360ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs  tIME PYlIDATX͙MlTUδ}W@hmB"q1@pB|$b\;\3*4q&4AP"ĝPBCD0kZδvyseSս7ss=3 Sjl6y /+D!:C} @:L<M$e>b 8Wk)97e5;ùSZs<|`y5ɝ~uN/djä ̓U`94ɡ]/tmc$%%^3$iL;7qBy ە^Hp.?*hk!7j^*DS4tv2OK)>,/;*+෿Fi#>z$]+/\f4%i(&LrwjCg1gゥұJ9= @B[_A&`&[FNI UKt YS9>7Xz\"$RD 6fS&~4rq^XYi* 28O"u>WPZ{80n~%.U_ |ɦc( ڊ/?#M%ٶMEi)xfs_'eְD^D(Qt32mYsF6̩2Z[S\ *bvQԄx1Sr)x_8۾ ,IDiZ78 \E uYSmP|ܴ ejj5Dz:: ̦M=7J$$i6׀Kt# VM`..Pd ?``A>}x; c8pL7٤Sx?Xd>(Pȋpf Jhqat\F)R1CбÝFrR.c@x4+jo ( Ms$B;% )_VLqJD MVCrF#҇JFWP@XFSYĻZ1HvT9}h ~BI t;{B/2+]?:CVg:4o^g]1eH d}!52~=NVz}!P3oXE/*U^g <3ѼEh%h%6**_zH$"F,ОO`o4.cW sd(3"r*)GP8}Eӏphb;~0c@~ ƎoNy܃O:mk{qT⩪S*C{.uW/;icgUV:)As7nxsF/@hbPiWSG7<,(M/rOCHÄٙطiιY (?L2[RC9JQ2f|.g~&ZaǜEv4#׫ bR?Ld }tUt;72{{mA 0RhCi%u׬[]v!5bʹ{[ݔ[D5+ 3Anlu/s$(yU~4E,fɍ뉴48j=%Sx~8 ۰N X9( ͣC泤Gj8kLN;Bw#uն}`eakffՖ̎7ۋt fmW`5a}$Ny4Z_H;8HA)LC؁uPF˯wzg5PJQ2Df|VsTի:]o&ڀ(q '_-Np007&TbX |'^\yA{,B!=~uӻuަ{Ë4^$zSr<520^vc/ ]Oe[J_)e,.-{FQ o,C5>ƶd`Xi@S((R4#]iPH/t00lF[wҶ)y*}xU ]_A%p!ʔTg~N#-`˃Ξ'2nj|㔆l#Tʪ$/UVwz!ס(=rsSTBjh":^{]ް53uS:oM`'z@ JmģL:3ԯiF [ﺄHQ7r2vXXcv#Ic>r<ӨW:+KkŖ.ŌGRJ|po)oU-)}yKKۭ)`>K&f)O4^|+S @m7ߏ.JD"R/O 8颱uW}_Es&M}x8=9jIdzoұV_|N% d)YrtSK ˾ j Ȉ=وg~ʎZh=U LYrcM4? uU6^'ιj/pi8DP ~0k#HЧ KC婟ϯ5 <}Heq#Ys)RIE?D+(aP0u.Yo2[{dG/07+wCv(E˙[ ǎ`Ɛpk@Jkn^Vᩘj26B\ ̡LS0ReHF9M*]b]t,If">nd`{ )>xʎ9 ǝpyB, J|augUT=#1Jezhޡ$*S YɇQ?ҹ'[c JP8{c9`॔9ֿ- .$Lhv7D{1k#ft+^ZA^@ټ襕6iN 0< [# F*.@/{"ī}RZ.v0PD8PP}9HNl:[Wsn'> k">Y,b8>nf<N>`}۽{:$=;-fJ, \\C %@:+51ÈӪF }8c _k\F_*)0cD#p+t8I+2 #Ư%' D22(ׇJ>" KYd$cO:cfQ kD9[쯏: )y:aQV* E@ֱWI <m Q@ ,G`Bwc Zk6ny" lŹ4AGcflL=8/LŋcU`M9j {&m:3/Q>urIENDB`images-actives-html5.git/src/share/themes/gameDragAndDrop/img/xia128.png000066400000000000000000000130631250410645000262230ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs  tIME  $1XIDATxytՕo7yǖm"`08 LBd0p8ä-8!4K& $ Ɓ !Ѕ mUꪚ?ȲdIUBI)}nC@‘(ty<0 L2Hh0՚~1f4UgB.9b`)P!5+g4U1DqTـ \9]ܧʺa$O*˧j*5Ӏ`%p*[/.l 5U1@)6:p$z$ex@GX;Oٹ-H4ǜ mt'Wp$S{N.}qHa‘hVr۪_Jђl GiD |  < 9њ(AJ媷.J?p9KM? !cHTByKS9H B@50ٛJB`~!.MU&yVةB;QٓB94D_q+!$9 *`[@F\SOa;6_mc#An?B䎝@AHJ4Uil_h툲!̻L? AA;/fGo;a)?_-֍'Jɀox+VĮo԰$S*8܋dBD)Ñ:`'`MSd0x!$G_ 4Llǻ#atXDqJ`!pg~!^Hb'4H G!%P<qWA.{]DtsRHA,tˮ TKݿDW F.Lz`33q0>k‘9vf4 |Gd_x@@UJ%?Q!>w)nw5~!lL ūÑM@>2zg(3R?`20ɟh<٬Ҋ!aÑYs~Կ ^,=f*CHtj~{wlޔS`B8ߗ8^'7VS3Pɟ:!IIFH2$x/- Pӱ ;)ĆOu*f"!W?PHBdHtiaV$B_a_v?~dCG޹a`]!):O'obaU{SʔjNj=74u(;k1g-!wbVa Ț}z]e 䔑d<˖A Ӹᯘmej N` (9`;Q!z:3#d4o7NA{KLoh|U֐5r"e\NI"f2k~מn:7/d S4Ui>!h޺m-u2/T-opdkxz4ɟv>`M˘ʧ2})~jLFw8N7s[hs*O+%gl%in#m2v?yTߧL?)ׯDo4U'q?R;W8iE yEdh=B-dCׄILtW!u (=Oޞ"Ulh,b1^hoI狃@BNE[|D 0:Y ٿyNUwp!a3!s7D>g0NJYK0 cH`:O) 4b rQ 5iKφ#QKX fދhx71 qBr$TVA**fLӠCi޶ï=E~O Vr'bvS/!a_Q2%\Ϧ;> S 17PT5`A)F">pS&$`-ЫOP\#ǬKП6_o> 1|-#f_ocL#J)|+| !;o0zJ霋i!@OBYD8Rt<&^}?|!lM`ZRQ^gNewz|KCyklǖ KKν 9a"+h^W,9i$ӸjYN3P.ABe㆔ ';&3LY>\EZk>gU6_tb_C!CotEIr %xmM[n%ZB}q/z[8v?I: c~ 5]\“灞+ӸᕮDH2$Տ#Ax%Իƒ쑓͎vYfn wIN:s.=K@ f%`7CC7Td!ɟvQ FG;"p4ر=Kߺ(Kx*bgvh]#w-'t@l{~'$ aqIֽzk:94IS^sv4;۶(_ f;~)7Cج򉘺Em-eRx|0ts1 dSQWuMU:: R `rvg[V;ydZO+h&dę6y p2n 9zܱvoI Y󜞔%}opۙw ;T!2)Ŵo=5\Le K6#Qnr$#*(RSR5c*uV'>ޑ3DV#PXwMHEQ@*g`IՏM^- >FlNK%C;IW`k2Oei8RK >L1r5 aQ_7=ӣ2:ȝX=t6X$4U&g -w&g^ C C||`/^ p9Yf}_ACEBƒt qiۨ珎H%1bŞ)Lu}n:X-L ZAѶirqvQt>W9o {V-O/eGvBi5иlllz#Y}z~G3=iN"ف-?y[rsv۷YhIOh*x+#\TG.4|)cl{!v3J!|TMe=o |)Z*[^vB8BHlJ8#ֿvu\Te3Иi-0vɭI3:|"!ŅDl":uo?&Q4UWJs^@qxAeZ vVd)zkSJ 9~N=HhC\'8Oh?ਃ?M?XZ>SAҬY 5v?q+z1iS#1kZ7>?/ޞz s]&np¿\I=vƀ`($x-5'.dcc&\6X;C{`A\H>$jݏlzrPe* #h5Ҽ-j׮J41g1Knu/T帝`Dn4o%MGDsO`)Pwi‘J 5eeCr4t.s.sO>~MU2^S1 _Y>&eg_BzaO=1nR|*. nYϚUԬ/߃_z%T|nV~ظzExxLJϾIK t6^^|Tځ~' cC|r ];!gLʠ *4Ht!g&-?ʿ{r7|Sk{_U𿨩>hk{1Lf3ɅU?+Py3HlWSՃQj4U!N, D͚Խ:9*. 9^TNLB$LjrC{}k/gSX9BS"v7֍/"@70|v j׮ -L\۴u9iR~ν1'SZ |&AB;b]qj\+HVvlgdZTz숉܄ 亅ΤAd^>ɹ8zU+=|SH߉38e;љ4*AG A J0ִ WL⬮B iԃ,Y#T4Ak0V )}8IekqﰭtV$YxثGi$0K[m0#HZ)f_t%o#7+Ŏ:ĆRr@l;BxJ{)E)E|l_c bI~ {rpŕ@ΎT)_XkG*[2OYFJ?E/T#2*;ܻ*%_=^;b%#fs. B;iNC b%IENDB`images-actives-html5.git/src/share/themes/gameDragAndDrop/img/xia32.png000066400000000000000000000026111250410645000261320ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME  %,t٧IDATXí[lTUVJ[Jkm("3E^|A}P%j"!@A@$A0DoC,Ԋ/d Z CCzkgkmAx.8v xpn66r4`?h0K`_q&dܩNb"o6lx+S6D6,3t&*P &iWZӶ{5CO=@Ur9d/MKۧ矦{[n8@|nuD'yN ]n)Hm͚8]+{0"\quϛ֢B;5=*[ v{dmV}`opZR2pWc'2jlP-6uK5fgQ,. z!Lf:֊X1s ts/MJ1j,fn:tA]f`48z=dsBR# U0kp(f!ZѶw} !2")度17,\<<{wLWR193K49ڛCJtJӨrk$Xca2xM# bγ(-/v[K'l%p*7EdRƬ-تj3! x۹{$ z9b hm)TralE-UՎ|ұUNV5#H(Ak ī\q*7Z# 3q&,~5z*D텈mci)σԭCelAZlINr!s-*Bz8@ٜExx?l"T8PfhDCar$H3c<3B@]g}df̼C2PhvBHSc&,BJsK}ܟ4,t*4»O&MS4k):pQ>_4B2ǒ؏bPkY=@T-YE`**}tcQIVC~9hV $ֱmƌT8aA`QF\W")q MɃoO>ӱ"e+>$#Vmz\=]u_%q:#kHz7׬)s hM'=,!a.ܓ4qO_w]B-8x)ٚy{L2C@zzAcN|p7 z`|q: & F'269q7WH|IENDB`images-actives-html5.git/src/share/themes/gameDragAndDrop/img/xia48.png000066400000000000000000000046531250410645000261510ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs  tIME  %c2Y 8IDATh޽{pT?{ $( >u/[NmZ+/-UUhgtth`ŬvU¡juPƺEPcdMqMf z{!LCONFn}]U`/1 =Z跋1q`l@04X\,]Exl7 }/%(!ss]>v5 +{J =`=~b5`(< ,拱6`iDB`h+@x|(rK`* Cbԟ20u e"FϒwS_@E|,5wй`:qٱ(O lCBUiA Ν ֚ЄJsRС0x EU,LL&`th<΁}e $+(h>mM&d jv@ځu"mA G@ړe&/c)>gg%D<9 ݟw%q'B!S @04f-lٸ[BTnӁ`nifRNa$ؿnv|qLU"j*鳩MkAUǀLC՜ 9؍V᧼i>V,R慎|;bќ+q#H !ڵw^@ ~b}!v|8ZpY8zoo}ȵ Ji̺^E1(EE ogI_xtPELC?U@GW||vz۞GQS)- OM= K䯢ʱ"aȎ-XN`E3i^u?)H(=QO ? x΁m9v G(J.ȳ-9^K|M4`iEϡ/XFI UϠEAJbG:߽sWT>=̽ys1,=WEhďv1[@?k̸.ʦFZBN xBH<3,souZYmYH˚NUs;snڄnvb$i#m ;>Bܳ8i͓~7-ihU9W߰Ky(kB=7;ŎdW{oбG?v#=bې>x) u<B #?v#cEBn&_£<=s͵BR03y"áG'A2sࡌ6EA G_J;3e,Wlr޶7hUS@ ߕY 9&H!0Id2Ar ^䳗?{:_^H~1 'pw 1ʇgfFB\U";> -9o&(h*m境мz519y %;_r%vb$߷:MCo;MpЙn2NuAt}J51ijur~ԅbp0>V臻GRE@㞯oh]AyN= Пξrl, w޶H{@[(P<^j~V㩝6^eNLC7?π0 ]:AlpFۮfDgD;? `htI! q`io&eRNupy9k"zLCk!&g5/>.4 x@@x?4'rm҃+OO3Q^H B!Mn _9c"RUIWnN@g3Ҩ0 t3|B IENDB`images-actives-html5.git/src/share/themes/gameDragAndDrop/img/xia64.png000066400000000000000000000054251250410645000261450ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs  tIME  %HC IDATx͛{t?wf7@L$1Y W COe@ Le]Sh BQgc@Gf݇뗱g+avf+;T{{ϼhXoca/f$i+I_Ͷ&>;E0K ˒3'W|s=U>7({/)':Og v [MYI;) s39m;Ɯ$s|ӓU'EEEƢ4}ʧ~ j^Qfڔ.g$co߬xCKm,$8#@(iXɡ(Urc&#XQrPr>|v߄A #ޱ]՚.a&d';>&ϢlTP +B ({|8Ҳ}%].F!ޮ|{b~>K)i? +tr#߆Rgm$܌URJZF G:+*KˢF{ ˴'AO8L wryE>AdFx9%q jKPȯz@0SI/7԰뉵5j~1#au,/gKCVZ46}tQr ц j&R"Dh% 8)9yǘ?jip I)L)>?o_ֹn \жk)՝3#H+&K '?>ط - . ?m+Wm{mwF3EnŻ7p}mEF;6㳹㉵E*BUib}uRI :?6dEq_clfvk>x* s܀P2bE5S>ce4o^a?OYohӢՍ@"݀`9:hH?~coWE | {9{k'ǒyBвy;鬟)Rwrd Nееn$%#qw;LhCi2rNSyJa`d7u+/e-!3G5lF  x ;6HeRT3!,rznkOZQCVb5p=}Fե;A&gfNN,j`U-_ ZŹ+yT^>3.>׮2tmr½N!=/W~V4o7m;7mkN.+k(:>u+NDgڥ9ta 0&|~/&ڴ3ҎPT|}V$2C$C.srg}. w:Cfxza!~st ]{){CP| =MI봫 d[ ](*t|; ];㐛w /x*Xn4:tk7eQf`^]Ӽ {{TITLE}}

{{TITLE}}

{{CONTENT}}
{{datasJS}} images-actives-html5.git/src/share/themes/gameDragAndDrop/js/000077500000000000000000000000001250410645000243365ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/gameDragAndDrop/js/hooks.js000066400000000000000000000050341250410645000260210ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @constructor init specific hooks */ function hooks() { "use strict"; } /* * @param array layers * @param iaScene mainScene */ hooks.prototype.beforeMainConstructor = function(mainScene, layers) { // a the very beginning, just before building objects }; /* * @param iaScene mainScene * @param array layers */ hooks.prototype.afterMainConstructor = function(mainScene, layers) { // after building objects, just before rendering scene }; /* * * */ hooks.prototype.afterIaObjectConstructor = function(mainScene, idText, detail, iaObject) { }; /* * * */ hooks.prototype.afterXiaObjectCreation = function(mainScene, xiaDetail) { /* define your own events on xiaDetails have a look at XiaDetail object for further informations example : xiaDetail.kineticElement.on('mousedown', function(){ console.log("mousedown"); // remove cache this.scale({x:1,y:1}); this.clearCache(); // add blue border this.stroke("blue"); // enable cache this.cache({width:this.width(), height:this.height()}); this.scale({x:mainScene.coeff,y:mainScene.coeff}); this.drawHitFromCache(); // redraw scene this.getIaObject().layer.draw(); }); */ }; /* * * */ hooks.prototype.afterDragStart = function(mainScene, idText, kineticElement) { // kineticElement.getXiaParent() -> get reference to xiaDetail object // kineticElement.getIaObject() -> get reference to iaobject // $('#' + idText) is the DOM element linked to kineticElement }; /* * * */ hooks.prototype.afterDragEnd = function(mainScene, idText, kineticElement) { // kineticElement.getXiaParent() -> get reference to xiaDetail object // kineticElement.getIaObject() -> get reference to iaobject // $('#' + idText) is the DOM element linked to kineticElement }; images-actives-html5.git/src/share/themes/gameDragAndDrop/js/iaobject.js000066400000000000000000000771211250410645000264640ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @param {object} params * @constructor create image active object */ function IaObject(params) { "use strict"; var that = this; this.xiaDetail = []; this.minX = 10000; this.minY = 10000; this.maxX = -10000; this.maxY = -10000; this.match = false; this.collisions = "on"; this.layer = params.layer; this.imageObj = params.imageObj; this.idText = params.idText; this.myhooks = params.myhooks; // Create kineticElements and include them in a group //that.group = new Kinetic.Group(); //that.layer.add(that.group); if (typeof(params.detail.path) !== 'undefined') { that.includePath(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.image) !== 'undefined') { that.includeImage(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } // actually, groups are not allowed because of boxsize restriction /*else if (typeof(detail.group) !== 'undefined') { for (var i in detail.group) { if (typeof(detail.group[i].path) !== 'undefined') { that.includePath(detail.group[i], i, that, iaScene, baseImage, idText); } else if (typeof(detail.group[i].image) !== 'undefined') { that.includeImage(detail.group[i], i, that, iaScene, baseImage, idText); } } that.definePathBoxSize(detail, that); }*/ else { console.log(params.detail); } this.scaleBox(this, params.iaScene); this.myhooks.afterIaObjectConstructor(params.iaScene, params.idText, params.detail, this); } /* * * @param {type} detail * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includeImage = function(detail, i, that, iaScene, baseImage, idText) { var that = this; that.xiaDetail[i] = new XiaDetail(detail, idText); that.defineImageBoxSize(detail, that); var rasterObj = new Image(); rasterObj.src = detail.image; that.xiaDetail[i].kineticElement = new Kinetic.Image({ id: detail.id, name: detail.title, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, width: detail.width, height: detail.height, draggable: that.xiaDetail[i].draggable_object }); that.xiaDetail[i].kineticElement.setXiaParent(that.xiaDetail[i]); that.xiaDetail[i].kineticElement.setIaObject(that); that.xiaDetail[i].backgroundImage = rasterObj; that.xiaDetail[i].kineticElement.tooltip = ""; var collision_state = $("#" + idText).data("collisions"); if ($('article[data-target="' + $("#" + idText).data("kinetic_id") + '"]').length != 0) { collision_state = "off"; } that.collisions = collision_state; var global_collision_state = $("#message_success").data("collisions"); if (global_collision_state == "on" && collision_state != "off") { that.xiaDetail[i].kineticElement.dragBoundFunc(function(pos) { var x_value = pos.x; var y_value = pos.y; var len = iaScene.shapes.length; var getAbsolutePosition = { x : this.getAbsolutePosition().x, y : this.getAbsolutePosition().y, } var objectWidth = that.maxX - that.minX; var objectHeight = that.maxY - that.minY; for(var i=0; i< len; i++) { if (that != iaScene.shapes[i] && iaScene.shapes[i].collisions == "on") { var shape = { maxX : iaScene.shapes[i].maxX, maxY : iaScene.shapes[i].maxY, minX : iaScene.shapes[i].minX - objectWidth, minY : iaScene.shapes[i].minY - objectHeight }; var objectLocatedAt = { horizontal: (getAbsolutePosition.y < shape.maxY - 10) && (getAbsolutePosition.y > shape.minY + 10), vertical: (getAbsolutePosition.x < shape.maxX - 10) && (getAbsolutePosition.x > shape.minX + 10), bottomLeft: getAbsolutePosition.x <= shape.minX + 10 && getAbsolutePosition.y >= shape.maxY - 10, topLeft: getAbsolutePosition.x <= shape.minX + 10 && getAbsolutePosition.y <= shape.minY + 10, topRight: getAbsolutePosition.x >= shape.maxX - 10 && getAbsolutePosition.y <= shape.minY + 10, bottomRight: getAbsolutePosition.x >= shape.maxX - 10 && getAbsolutePosition.y >= shape.maxY - 10 }; if (objectLocatedAt.horizontal) { if (pos.x <= shape.maxX && getAbsolutePosition.x >= shape.maxX - 10) { if (x_value == pos.x) { x_value = shape.maxX; } else { x_value = Math.max(shape.maxX, x_value); } } if (pos.x >= shape.minX && getAbsolutePosition.x <= shape.minX + 10) { if (x_value == pos.x) { x_value = shape.minX; } else { x_value = Math.min(shape.minX, x_value); } } } if (objectLocatedAt.vertical) { if (pos.y <= shape.maxY && getAbsolutePosition.y >= shape.maxY -10) { if (y_value == pos.y) { y_value = shape.maxY; } else { y_value = Math.max(shape.maxY, y_value); } } if (pos.y >= shape.minY && getAbsolutePosition.y <= 10 + shape.minY) { if (y_value == pos.y) { y_value = shape.minY; } else { y_value = Math.min(shape.minY, y_value); } } } var delta = 15; if (pos.x >= shape.minX + delta && pos.y <= shape.maxY - delta && objectLocatedAt.bottomLeft ) { if (x_value == pos.x) { x_value = shape.minX; } else { x_value = Math.min(shape.minX, x_value); } } if (pos.x >= shape.minX + delta && pos.y >= shape.minY + delta && objectLocatedAt.topLeft ) { if (x_value == pos.x) { x_value = shape.minX; } else { x_value = Math.min(shape.minX, x_value); } } if (pos.x <= shape.maxX - delta && pos.y >= shape.minY + delta && objectLocatedAt.topRight ) { if (x_value == pos.x) { x_value = shape.maxX; } else { x_value = Math.max(shape.maxX, x_value); } } if (pos.x <= shape.maxX - delta && pos.y <= shape.maxY - delta && objectLocatedAt.bottomRight ) { if (x_value == pos.x) { x_value = shape.maxX; } else { x_value = Math.max(shape.maxX, x_value); } } } } return { x: x_value, y: y_value }; }); } rasterObj.onload = function() { that.xiaDetail[i].kineticElement.backgroundImageOwnScaleX = iaScene.scale * detail.width / this.width; that.xiaDetail[i].kineticElement.backgroundImageOwnScaleY = iaScene.scale * detail.height / this.height; if ($('article[data-tooltip="' + $("#" + idText).data("kinetic_id") + '"]').length == 0) { detail.fill = '#ffffff'; // force image to be displayed - must refactor if it is a good idea ! } that.xiaDetail[i].persistent = "off"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#ffffff")) { that.xiaDetail[i].persistent = "onImage"; that.xiaDetail[i].kineticElement.fillPriority('pattern'); that.xiaDetail[i].kineticElement.fillPatternScaleX(that.xiaDetail[i].kineticElement.backgroundImageOwnScaleX * 1/iaScene.scale); that.xiaDetail[i].kineticElement.fillPatternScaleY(that.xiaDetail[i].kineticElement.backgroundImageOwnScaleY * 1/iaScene.scale); that.xiaDetail[i].kineticElement.fillPatternImage(that.xiaDetail[i].backgroundImage); } that.layer.add(that.xiaDetail[i].kineticElement); that.addEventsManagement(i, that, iaScene, baseImage, idText); // define hit area excluding transparent pixels // ============================================================= that.rasterObj = rasterObj; that.xiaDetail[i].kineticElement.cache(); that.xiaDetail[i].kineticElement.scale({x:iaScene.coeff,y:iaScene.coeff}); that.xiaDetail[i].kineticElement.drawHitFromCache(); that.xiaDetail[i].kineticElement.draw(); }; }; /* * * @param {type} path * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includePath = function(detail, i, that, iaScene, baseImage, idText) { var that = this; that.xiaDetail[i] = new XiaDetail(detail, idText); that.xiaDetail[i].path = detail.path; // if detail is out of background, hack maxX and maxY if (parseFloat(detail.maxX) < 0) detail.maxX = 1; if (parseFloat(detail.maxY) < 0) detail.maxY = 1; that.xiaDetail[i].kineticElement = new Kinetic.Path({ id: detail.id, name: detail.title, data: detail.path, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, scale: {x:iaScene.coeff,y:iaScene.coeff}, fill: 'rgba(0, 0, 0, 0)', draggable : that.xiaDetail[i].draggable_object }); that.xiaDetail[i].kineticElement.setIaObject(that); that.xiaDetail[i].kineticElement.setXiaParent(that.xiaDetail[i]); that.xiaDetail[i].kineticElement.tooltip = ""; var collision_state = $("#" + idText).data("collisions"); if ($('article[data-target="' + $("#" + idText).data("kinetic_id") + '"]').length != 0) { collision_state = "off"; } that.collisions = collision_state; var global_collision_state = $("#message_success").data("collisions"); if (global_collision_state == "on" && collision_state != "off") { that.xiaDetail[i].kineticElement.dragBoundFunc(function(pos) { var x_value = pos.x; var y_value = pos.y; var len = iaScene.shapes.length; var getAbsolutePosition = { x : this.getAbsolutePosition().x, y : this.getAbsolutePosition().y, } var objectWidth = that.maxX - that.minX; var objectHeight = that.maxY - that.minY; for(var i=0; i< len; i++) { if (that != iaScene.shapes[i] && iaScene.shapes[i].collisions == "on") { var shape = { maxX : iaScene.shapes[i].maxX, maxY : iaScene.shapes[i].maxY, minX : iaScene.shapes[i].minX - objectWidth, minY : iaScene.shapes[i].minY - objectHeight }; var objectLocatedAt = { horizontal: (getAbsolutePosition.y < shape.maxY - 10) && (getAbsolutePosition.y > shape.minY + 10), vertical: (getAbsolutePosition.x < shape.maxX - 10) && (getAbsolutePosition.x > shape.minX + 10), bottomLeft: getAbsolutePosition.x <= shape.minX + 10 && getAbsolutePosition.y >= shape.maxY - 10, topLeft: getAbsolutePosition.x <= shape.minX + 10 && getAbsolutePosition.y <= shape.minY + 10, topRight: getAbsolutePosition.x >= shape.maxX - 10 && getAbsolutePosition.y <= shape.minY + 10, bottomRight: getAbsolutePosition.x >= shape.maxX - 10 && getAbsolutePosition.y >= shape.maxY - 10 }; if (objectLocatedAt.horizontal) { if (pos.x <= shape.maxX && getAbsolutePosition.x >= shape.maxX - 10) { if (x_value == pos.x) { x_value = shape.maxX; } else { x_value = Math.max(shape.maxX, x_value); } } if (pos.x >= shape.minX && getAbsolutePosition.x <= shape.minX + 10) { if (x_value == pos.x) { x_value = shape.minX; } else { x_value = Math.min(shape.minX, x_value); } } } if (objectLocatedAt.vertical) { if (pos.y <= shape.maxY && getAbsolutePosition.y >= shape.maxY -10) { if (y_value == pos.y) { y_value = shape.maxY; } else { y_value = Math.max(shape.maxY, y_value); } } if (pos.y >= shape.minY && getAbsolutePosition.y <= 10 + shape.minY) { if (y_value == pos.y) { y_value = shape.minY; } else { y_value = Math.min(shape.minY, y_value); } } } var delta = 15; if (pos.x >= shape.minX + delta && pos.y <= shape.maxY - delta && objectLocatedAt.bottomLeft ) { if (x_value == pos.x) { x_value = shape.minX; } else { x_value = Math.min(shape.minX, x_value); } } if (pos.x >= shape.minX + delta && pos.y >= shape.minY + delta && objectLocatedAt.topLeft ) { if (x_value == pos.x) { x_value = shape.minX; } else { x_value = Math.min(shape.minX, x_value); } } if (pos.x <= shape.maxX - delta && pos.y >= shape.minY + delta && objectLocatedAt.topRight ) { if (x_value == pos.x) { x_value = shape.maxX; } else { x_value = Math.max(shape.maxX, x_value); } } if (pos.x <= shape.maxX - delta && pos.y <= shape.maxY - delta && objectLocatedAt.bottomRight ) { if (x_value == pos.x) { x_value = shape.maxX; } else { x_value = Math.max(shape.maxX, x_value); } } } } return { x: x_value, y: y_value }; }); } that.definePathBoxSize(detail, that); // crop background image to suit shape box if (that.xiaDetail[i].options.indexOf("disable-click") == -1) { var cropCanvas = document.createElement('canvas'); cropCanvas.setAttribute('width', parseFloat(detail.maxX) - parseFloat(detail.minX)); cropCanvas.setAttribute('height', parseFloat(detail.maxY) - parseFloat(detail.minY)); var cropCtx = cropCanvas.getContext('2d'); var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min((parseFloat(detail.maxX) - parseFloat(detail.minX)) * iaScene.scale, Math.floor(parseFloat(iaScene.originalWidth) * iaScene.scale))); var cropHeight = (Math.min((parseFloat(detail.maxY) - parseFloat(detail.minY)) * iaScene.scale, Math.floor(parseFloat(iaScene.originalHeight) * iaScene.scale))); if (cropX * iaScene.scale + cropWidth > iaScene.originalWidth * iaScene.scale) { cropWidth = iaScene.originalWidth * iaScene.scale - cropX * iaScene.scale; } if (cropY * iaScene.scale + cropHeight > iaScene.originalHeight * iaScene.scale) { cropHeight = iaScene.originalHeight * iaScene.scale - cropY * iaScene.scale; } // bad workaround to avoid null dimensions if (cropWidth <= 0) cropWidth = 1; if (cropHeight <= 0) cropHeight = 1; cropCtx.drawImage( that.imageObj, cropX * iaScene.scale, cropY * iaScene.scale, cropWidth, cropHeight, 0, 0, cropWidth, cropHeight ); var dataUrl = cropCanvas.toDataURL(); var cropedImage = new Image(); cropedImage.src = dataUrl; cropedImage.onload = function() { that.xiaDetail[i].backgroundImage = cropedImage; that.xiaDetail[i].kineticElement.backgroundImageOwnScaleX = 1; that.xiaDetail[i].kineticElement.backgroundImageOwnScaleY = 1; that.xiaDetail[i].kineticElement.fillPatternRepeat('no-repeat'); that.xiaDetail[i].kineticElement.fillPatternX(detail.minX); that.xiaDetail[i].kineticElement.fillPatternY(detail.minY); }; } that.xiaDetail[i].persistent = "off"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#ffffff")) { that.xiaDetail[i].persistent = "onPath"; that.xiaDetail[i].kineticElement.fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); } that.addEventsManagement(i, that, iaScene, baseImage, idText); that.layer.add(that.xiaDetail[i].kineticElement); that.layer.draw(); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.defineImageBoxSize = function(detail, that) { "use strict"; if (that.minX === -1) that.minX = (parseFloat(detail.x)); if (that.maxY === 10000) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); if (that.maxX === -1) that.maxX = (parseFloat(detail.x) + parseFloat(detail.width)); if (that.minY === 10000) that.minY = (parseFloat(detail.y)); if (parseFloat(detail.x) < that.minX) that.minX = parseFloat(detail.x); if (parseFloat(detail.x) + parseFloat(detail.width) > that.maxX) that.maxX = parseFloat(detail.x) + parseFloat(detail.width); if (parseFloat(detail.y) < that.minY) that.miny = parseFloat(detail.y); if (parseFloat(detail.y) + parseFloat(detail.height) > that.maxY) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.definePathBoxSize = function(detail, that) { "use strict"; if ( (typeof(detail.minX) !== 'undefined') && (typeof(detail.minY) !== 'undefined') && (typeof(detail.maxX) !== 'undefined') && (typeof(detail.maxY) !== 'undefined')) { that.minX = detail.minX; that.minY = detail.minY; that.maxX = detail.maxX; that.maxY = detail.maxY; } else { console.log('definePathBoxSize failure'); } }; /* * Rescale box * @returns {undefined} */ IaObject.prototype.scaleBox = function(that, iaScene) { that.minX = that.minX * iaScene.coeff; that.minY = that.minY * iaScene.coeff; that.maxX = that.maxX * iaScene.coeff; that.maxY = that.maxY * iaScene.coeff; }; /* * Define mouse events on the current KineticElement * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.addEventsManagement = function(i, that, iaScene, baseImage, idText) { var that=this; that.xiaDetail[i].kineticElement.tooltip_area = false; // tooltip must be at the bottom if ($('article[data-tooltip="' + $("#" + idText).data("kinetic_id") + '"]').length != 0) { that.xiaDetail[i].kineticElement.moveToBottom(); that.xiaDetail[i].kineticElement.tooltip_area = true; that.xiaDetail[i].options += " disable-click "; } that.myhooks.afterXiaObjectCreation(iaScene, that.xiaDetail[i]); that.xiaDetail[i].kineticElement.on('mouseenter', function() { if (iaScene.cursorState.indexOf("ZoomOut.cur") !== -1) { } else if (iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) { } else if (iaScene.cursorState.indexOf("HandPointer.cur") === -1) { if ((!this.getXiaParent().droparea) && (!this.tooltip_area)) { document.body.style.cursor = "pointer"; } iaScene.cursorState = "url(img/HandPointer.cur),auto"; // manage tooltips if present var tooltip = false; if (this.tooltip != "") { tooltip = true; } else if ($("#" + idText).data("tooltip") != "") { var tooltip_id = $("#" + idText).data("tooltip"); this.tooltip = this.getStage().find("#" + tooltip_id)[0]; tooltip = true; } if (tooltip) { this.tooltip.clearCache(); this.tooltip.fillPriority('pattern'); if ((this.tooltip.backgroundImageOwnScaleX != "undefined") && (this.tooltip.backgroundImageOwnScaleY != "undefined")) { this.tooltip.fillPatternScaleX(this.tooltip.backgroundImageOwnScaleX * 1/iaScene.scale); this.tooltip.fillPatternScaleY(this.tooltip.backgroundImageOwnScaleY * 1/iaScene.scale); } this.tooltip.fillPatternImage(this.tooltip.getXiaParent().backgroundImage); this.tooltip.moveToTop(); this.tooltip.draw(); that.layer.draw(); } } }); /* * if we leave this element, just clear the scene */ that.xiaDetail[i].kineticElement.on('mouseout', function() { if ((iaScene.cursorState.indexOf("ZoomOut.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomIn.cur") !== -1)){ } else { var mouseXY = that.layer.getStage().getPointerPosition(); if ((that.layer.getStage().getIntersection(mouseXY) != this)) { // manage tooltips if present var tooltip = false; if (this.tooltip != "") { tooltip = true; } else if ($("#" + idText).data("tooltip") != "") { var tooltip_id = $("#" + idText).data("tooltip"); this.tooltip = this.getStage().find("#" + tooltip_id)[0]; tooltip = true; } if (tooltip) { this.tooltip.fillPriority('color'); this.tooltip.fill('rgba(0, 0, 0, 0)'); this.tooltip.draw(); } document.body.style.cursor = "default"; iaScene.cursorState = "default"; that.layer.draw(); } } }); if (that.xiaDetail[i].options.indexOf("direct-link") != -1) { that.xiaDetail[i].kineticElement.on('click touchstart', function(e) { //location.href = that.title[i]; location.href = that.xiaDetail[i].title; }); } else if (that.xiaDetail[i].options.indexOf("disable-click") != -1) { return; } else { if (!that.xiaDetail[i].droparea) { that.xiaDetail[i].kineticElement.on('dragstart', function(e) { iaScene.element = that; that.afterDragStart(iaScene, idText, this); that.myhooks.afterDragStart(iaScene, idText, this); this.moveToTop(); Kinetic.draggedshape = this; }); that.xiaDetail[i].kineticElement.on('dragend', function(e) { iaScene.element = that; Kinetic.draggedshape = null; // Kinetic hacking - speed up _getIntersection (for linux) that.afterDragEnd(iaScene, idText, e, this); that.myhooks.afterDragEnd(iaScene, idText, this); this.getStage().completeImage = "redefine"; that.layer.draw(); }); } } }; IaObject.prototype.afterDragStart = function(iaScene, idText, kineticElement) { $('#' + idText + " audio").each(function(){ if ($(this).data("state") === "autostart") { $(this)[0].play(); } }); }; /* * * */ IaObject.prototype.afterDragEnd = function(iaScene, idText, event, kineticElement) { //var target_id = $('#' + idText).data("target"); var target_id = kineticElement.getXiaParent().target_id; var target_object = kineticElement.getStage().find("#" + target_id); var iaObject_width = this.maxX - this.minX; var iaObject_height = this.maxY - this.minY; this.minX = event.target.x(); this.minY = event.target.y(); this.maxX = event.target.x() + iaObject_width; this.maxY = event.target.y() + iaObject_height; var middle_coords = {x: event.target.x() + (this.maxX - this.minX)/2,y:event.target.y() + (this.maxY - this.minY)/2}; //var mouseXY = kineticElement.getStage().getPointerPosition(); //var droparea = kineticElement.getStage().getIntersection(mouseXY); var droparea = kineticElement.getStage().getIntersection(middle_coords); var over_droparea = false; if (droparea) { if (droparea == kineticElement) { // element dropped on its own area // move current element out of stage, redraw the scene, // find the drop zone element // and move current element to its original position var old_x = kineticElement.x(); kineticElement.x(2000); kineticElement.getLayer().drawHit(); kineticElement.getStage().completeImage = "redefine"; //droparea = kineticElement.getStage().getIntersection(mouseXY); droparea = kineticElement.getStage().getIntersection(middle_coords); if (droparea) { if (droparea != kineticElement) { over_droparea = true; } } kineticElement.x(old_x); kineticElement.getLayer().drawHit(); } else if (droparea.getXiaParent().droparea) { over_droparea = true; } } if (over_droparea) { // retrieve kineticElement drop zone // if center of dropped element is located in the drop zone // then drop ! //var target_object = this.xiaDetail[0].kineticElement.getStage().find("#" + target_id); var target_iaObject = droparea.getIaObject(); if ((middle_coords.x > target_iaObject.minX) & (middle_coords.x < target_iaObject.maxX) & (middle_coords.y > target_iaObject.minY) & (middle_coords.y < target_iaObject.maxY)) { if (!this.match && droparea == target_object[0]) { this.match = true; iaScene.currentScore += 1; } if (iaScene.global_magnet_enabled || droparea.getXiaParent().magnet_state=="on") { kineticElement.x(target_iaObject.minX - (iaObject_width / 2) + (target_iaObject.maxX - target_iaObject.minX) / 2); kineticElement.y(target_iaObject.minY - (iaObject_height / 2) + (target_iaObject.maxY - target_iaObject.minY) / 2); } } else { if (this.match) { this.match = false; iaScene.currentScore -= 1; } } if (droparea.getXiaParent().options.indexOf("direct-link") != -1) { location.href = droparea.getXiaParent().title; } var viewportHeight = $(window).height(); if ((iaScene.score == iaScene.currentScore) && (iaScene.score != 0)) { $("#content").show(); $("#message_success").show(); var general_border = $("#message_success").css("border-top-width").substr(0,$("#message_success").css("border-top-width").length - 2); var general_offset = $("#message_success").offset(); var content_offset = $("#content").offset(); $("#message_success").css({'max-height':(viewportHeight - general_offset.top - content_offset.top - 2 * general_border)}); } $('#' + idText + " audio").each(function(){ if ($(this).data("state") === "autostart") { $(this)[0].play(); } }); } else { if (this.match) { this.match = false; iaScene.currentScore -= 1; } } };images-actives-html5.git/src/share/themes/gameDragAndDrop/js/iascene.js000066400000000000000000000123141250410645000263040ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@crdp.ac-versailles.fr /** * * @param {type} originalWidth * @param {type} originalHeight * @constructor create image active scene */ function IaScene(originalWidth, originalHeight) { "use strict"; var that = this; // canvas width this.width = 1000; // canvas height this.height = 800; // default color used to fill shapes during mouseover var _colorOver = {red:66, green:133, blue:244, opacity:0.6}; // default color used to fill stroke around shapes during mouseover var _colorOverStroke = {red:255, green:0, blue:0, opacity:1}; // default color used to fill shapes if defined as cache this.colorPersistent = {red:124, green:154, blue:174, opacity:1}; // Image ratio on the scene this.ratio = 1.00; // padding-top in the canvas this.y = 0; // color used over background image during focus var _colorCache = {red:0, green:0, blue:0, opacity:0.6}; // internal this.global_magnet_enabled = false; if ($("#message_success").data("magnet") == "on") { this.global_magnet_enabled = true; } this.score = 0; this.currentScore = 0; this.fullScreen = "off"; this.backgroundCacheColor = 'rgba(' + _colorCache.red + ',' + _colorCache.green + ',' + _colorCache.blue + ',' + _colorCache.opacity + ')'; this.overColor = 'rgba(' + _colorOver.red + ',' + _colorOver.green + ',' + _colorOver.blue + ',' + _colorOver.opacity + ')'; this.overColorStroke = 'rgba(' + _colorOverStroke.red + ',' + _colorOverStroke.green + ',' + _colorOverStroke.blue + ',' + _colorOverStroke.opacity + ')'; this.scale = 1; this.zoomActive = 0; this.element = 0; this.originalWidth = originalWidth; this.originalHeight = originalHeight; this.coeff = (this.width * this.ratio) / parseFloat(originalWidth); this.cursorState=""; this.noPropagation = false; this.shapes = []; } /* * Scale entire scene * */ IaScene.prototype.scaleScene = function(mainScene){ "use strict"; var viewportWidth = $(window).width(); var viewportHeight = $(window).height(); //if (viewportWidth > 1280) viewportWidth = 1280; var coeff_width = (viewportWidth * mainScene.ratio) / parseFloat(mainScene.originalWidth); var coeff_height = (viewportHeight) / (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top + $('#container').offset().top); var canvas_border_left = parseFloat($("#canvas").css("border-left-width").substr(0,$("#canvas").css("border-left-width").length - 2)); var canvas_border_right = parseFloat($("#canvas").css("border-right-width").substr(0,$("#canvas").css("border-right-width").length - 2)); var canvas_border_top = parseFloat($("#canvas").css("border-top-width").substr(0,$("#canvas").css("border-top-width").length - 2)); var canvas_border_bottom = parseFloat($("#canvas").css("border-bottom-width").substr(0,$("#canvas").css("border-bottom-width").length - 2)); if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_width) && (viewportHeight >= ((parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_width))) { mainScene.width = viewportWidth - canvas_border_left - canvas_border_right; mainScene.coeff = (mainScene.width * mainScene.ratio) / parseFloat(mainScene.originalWidth); mainScene.height = parseFloat(mainScene.originalHeight) * mainScene.coeff; } else if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_height) && (viewportHeight >= (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_height)) { mainScene.height = viewportHeight - $('#container').offset().top - $('#canvas').offset().top - canvas_border_top - canvas_border_bottom - 2; mainScene.coeff = (mainScene.height) / parseFloat(mainScene.originalHeight); mainScene.width = parseFloat(mainScene.originalWidth) * mainScene.coeff; } $('#container').css({"width": (mainScene.width + canvas_border_left + canvas_border_right) + 'px'}); $('#container').css({"height": (mainScene.height + $('#canvas').offset().top - $('#container').offset().top + canvas_border_top + canvas_border_bottom) + 'px'}); $('#canvas').css({"height": (mainScene.height) + 'px'}); $('#canvas').css({"width": mainScene.width + 'px'}); $('#detect').css({"height": (mainScene.height) + 'px'}); $('#detect').css({"top": ($('#canvas').offset().top) + 'px'}); }; IaScene.prototype.mouseover = function(kineticElement) { }; IaScene.prototype.mouseout = function(kineticElement) { };images-actives-html5.git/src/share/themes/gameDragAndDrop/js/iframe.js000066400000000000000000000022671250410645000261460ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // Script used to load youtube resource after main page // otherwise, Chrome fails to start the page $(".videoWrapper16_9").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); }); $(".videoWrapper4_3").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); }); images-actives-html5.git/src/share/themes/gameDragAndDrop/js/kinetic-xia.js000066400000000000000000017575441250410645000271300ustar00rootroot00000000000000 /* * KineticJS JavaScript Framework v5.1.0 * http://www.kineticjs.com/ * Copyright 2013, Eric Rowell * Licensed under the MIT or GPL Version 2 licenses. * Date: 2014-03-27 * * Copyright (C) 2011 - 2013 by Eric Rowell * * 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. */ /** * @namespace Kinetic */ /*jshint -W079, -W020*/ var Kinetic = {}; (function(root) { var PI_OVER_180 = Math.PI / 180; Kinetic = { // public version: '5.1.0', // private stages: [], idCounter: 0, ids: {}, names: {}, shapes: {}, listenClickTap: false, inDblClickWindow: false, // configurations enableTrace: false, traceArrMax: 100, dblClickWindow: 400, pixelRatio: undefined, dragDistance : 0, angleDeg: true, // user agent UA: (function() { var userAgent = (root.navigator && root.navigator.userAgent) || ''; var ua = userAgent.toLowerCase(), // jQuery UA regex match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || /(webkit)[ \/]([\w.]+)/.exec( ua ) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || /(msie) ([\w.]+)/.exec( ua ) || ua.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || [], // adding mobile flag as well mobile = !!(userAgent.match(/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile/i)); return { browser: match[ 1 ] || '', version: match[ 2 ] || '0', // adding mobile flab mobile: mobile }; })(), /** * @namespace Filters * @memberof Kinetic */ Filters: {}, /** * Node constructor. Nodes are entities that can be transformed, layered, * and have bound events. The stage, layers, groups, and shapes all extend Node. * @constructor * @memberof Kinetic * @abstract * @param {Object} config * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] */ Node: function(config) { this._init(config); }, /** * Shape constructor. Shapes are primitive objects such as rectangles, * circles, text, lines, etc. * @constructor * @memberof Kinetic * @augments Kinetic.Node * @param {Object} config * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var customShape = new Kinetic.Shape({
* x: 5,
* y: 10,
* fill: 'red',
* // a Kinetic.Canvas renderer is passed into the drawFunc function
* drawFunc: function(context) {
* context.beginPath();
* context.moveTo(200, 50);
* context.lineTo(420, 80);
* context.quadraticCurveTo(300, 100, 260, 170);
* context.closePath();
* context.fillStrokeShape(this);
* }
*}); */ Shape: function(config) { this.__init(config); }, /** * Container constructor.  Containers are used to contain nodes or other containers * @constructor * @memberof Kinetic * @augments Kinetic.Node * @abstract * @param {Object} config * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @param {Function} [config.clipFunc] clipping function */ Container: function(config) { this.__init(config); }, /** * Stage constructor. A stage is used to contain multiple layers * @constructor * @memberof Kinetic * @augments Kinetic.Container * @param {Object} config * @param {String|DomElement} config.container Container id or DOM element * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @param {Function} [config.clipFunc] clipping function * @example * var stage = new Kinetic.Stage({
* width: 500,
* height: 800,
* container: 'containerId'
* }); */ Stage: function(config) { this.___init(config); }, /** * BaseLayer constructor. * @constructor * @memberof Kinetic * @augments Kinetic.Container * @param {Object} config * @param {Boolean} [config.clearBeforeDraw] set this property to false if you don't want * to clear the canvas before each layer draw. The default value is true. * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @param {Function} [config.clipFunc] clipping function * @example * var layer = new Kinetic.Layer(); */ BaseLayer: function(config) { this.___init(config); }, /** * Layer constructor. Layers are tied to their own canvas element and are used * to contain groups or shapes * @constructor * @memberof Kinetic * @augments Kinetic.Container * @param {Object} config * @param {Boolean} [config.clearBeforeDraw] set this property to false if you don't want * to clear the canvas before each layer draw. The default value is true. * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @param {Function} [config.clipFunc] clipping function * @example * var layer = new Kinetic.Layer(); */ Layer: function(config) { this.____init(config); }, /** * FastLayer constructor. Layers are tied to their own canvas element and are used * to contain groups or shapes * @constructor * @memberof Kinetic * @augments Kinetic.Container * @param {Object} config * @param {Boolean} [config.clearBeforeDraw] set this property to false if you don't want * to clear the canvas before each layer draw. The default value is true. * @example * var layer = new Kinetic.FastLayer(); */ FastLayer: function(config) { this.____init(config); }, /** * Group constructor. Groups are used to contain shapes or other groups. * @constructor * @memberof Kinetic * @augments Kinetic.Container * @param {Object} config * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @param {Function} [config.clipFunc] clipping function * @example * var group = new Kinetic.Group(); */ Group: function(config) { this.___init(config); }, /** * returns whether or not drag and drop is currently active * @method * @memberof Kinetic */ isDragging: function() { var dd = Kinetic.DD; // if DD is not included with the build, then // drag and drop is not even possible if (!dd) { return false; } // if DD is included with the build else { return dd.isDragging; } }, /** * returns whether or not a drag and drop operation is ready, but may * not necessarily have started * @method * @memberof Kinetic */ isDragReady: function() { var dd = Kinetic.DD; // if DD is not included with the build, then // drag and drop is not even possible if (!dd) { return false; } // if DD is included with the build else { return !!dd.node; } }, _addId: function(node, id) { if(id !== undefined) { this.ids[id] = node; } }, _removeId: function(id) { if(id !== undefined) { delete this.ids[id]; } }, _addName: function(node, name) { if(name !== undefined) { if(this.names[name] === undefined) { this.names[name] = []; } this.names[name].push(node); } }, _removeName: function(name, _id) { if(name !== undefined) { var nodes = this.names[name]; if(nodes !== undefined) { for(var n = 0; n < nodes.length; n++) { var no = nodes[n]; if(no._id === _id) { nodes.splice(n, 1); } } if(nodes.length === 0) { delete this.names[name]; } } } }, getAngle: function(angle) { return this.angleDeg ? angle * PI_OVER_180 : angle; } }; })(this); // Uses Node, AMD or browser globals to create a module. // If you want something that will work in other stricter CommonJS environments, // or if you need to create a circular dependency, see commonJsStrict.js // Defines a module "returnExports" that depends another module called "b". // Note that the name of the module is implied by the file name. It is best // if the file name and the exported global have matching names. // If the 'b' module also uses this type of boilerplate, then // in the browser, it will create a global .b that is used below. // If you do not want to support the browser global path, then you // can remove the `root` use and the passing `this` as the first arg to // the top function. // if the module has no dependencies, the above pattern can be simplified to ( function(root, factory) { if( typeof exports === 'object') { // Node. Does not work with strict CommonJS, but // only CommonJS-like enviroments that support module.exports, // like Node. var Canvas = require('canvas'); var jsdom = require('jsdom').jsdom; var doc = jsdom(''); var KineticJS = factory(); Kinetic.document = doc; Kinetic.window = Kinetic.document.createWindow(); Kinetic.window.Image = Canvas.Image; Kinetic.root = root; Kinetic._nodeCanvas = Canvas; module.exports = KineticJS; return; } else if( typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(factory); } Kinetic.document = document; Kinetic.window = window; Kinetic.root = root; }((1, eval)('this'), function() { // Just return a value to define the module export. // This example returns an object, but the module // can return a function as the exported value. return Kinetic; })); ;(function() { /** * Collection constructor. Collection extends * Array. This class is used in conjunction with {@link Kinetic.Container#get} * @constructor * @memberof Kinetic */ Kinetic.Collection = function() { var args = [].slice.call(arguments), length = args.length, i = 0; this.length = length; for(; i < length; i++) { this[i] = args[i]; } return this; }; Kinetic.Collection.prototype = []; /** * iterate through node array and run a function for each node. * The node and index is passed into the function * @method * @memberof Kinetic.Collection.prototype * @param {Function} func * @example * // get all nodes with name foo inside layer, and set x to 10 for each * layer.get('.foo').each(function(shape, n) {
* shape.setX(10);
* }); */ Kinetic.Collection.prototype.each = function(func) { for(var n = 0; n < this.length; n++) { func(this[n], n); } }; /** * convert collection into an array * @method * @memberof Kinetic.Collection.prototype */ Kinetic.Collection.prototype.toArray = function() { var arr = [], len = this.length, n; for(n = 0; n < len; n++) { arr.push(this[n]); } return arr; }; /** * convert array into a collection * @method * @memberof Kinetic.Collection * @param {Array} arr */ Kinetic.Collection.toCollection = function(arr) { var collection = new Kinetic.Collection(), len = arr.length, n; for(n = 0; n < len; n++) { collection.push(arr[n]); } return collection; }; // map one method by it's name Kinetic.Collection._mapMethod = function(methodName) { Kinetic.Collection.prototype[methodName] = function() { var len = this.length, i; var args = [].slice.call(arguments); for(i = 0; i < len; i++) { this[i][methodName].apply(this[i], args); } return this; }; }; Kinetic.Collection.mapMethods = function(constructor) { var prot = constructor.prototype; for(var methodName in prot) { Kinetic.Collection._mapMethod(methodName); } }; /* * Last updated November 2011 * By Simon Sarris * www.simonsarris.com * sarris@acm.org * * Free to use and distribute at will * So long as you are nice to people, etc */ /* * The usage of this class was inspired by some of the work done by a forked * project, KineticJS-Ext by Wappworks, which is based on Simon's Transform * class. Modified by Eric Rowell */ /** * Transform constructor * @constructor * @param {Array} Optional six-element matrix * @memberof Kinetic */ Kinetic.Transform = function(m) { this.m = (m && m.slice()) || [1, 0, 0, 1, 0, 0]; }; Kinetic.Transform.prototype = { /** * Copy Kinetic.Transform object * @method * @memberof Kinetic.Transform.prototype * @returns {Kinetic.Transform} */ copy: function() { return new Kinetic.Transform(this.m); }, /** * Transform point * @method * @memberof Kinetic.Transform.prototype * @param {Object} 2D point(x, y) * @returns {Object} 2D point(x, y) */ point: function(p) { var m = this.m; return { x: m[0] * p.x + m[2] * p.y + m[4], y: m[1] * p.x + m[3] * p.y + m[5] }; }, /** * Apply translation * @method * @memberof Kinetic.Transform.prototype * @param {Number} x * @param {Number} y * @returns {Kinetic.Transform} */ translate: function(x, y) { this.m[4] += this.m[0] * x + this.m[2] * y; this.m[5] += this.m[1] * x + this.m[3] * y; return this; }, /** * Apply scale * @method * @memberof Kinetic.Transform.prototype * @param {Number} sx * @param {Number} sy * @returns {Kinetic.Transform} */ scale: function(sx, sy) { this.m[0] *= sx; this.m[1] *= sx; this.m[2] *= sy; this.m[3] *= sy; return this; }, /** * Apply rotation * @method * @memberof Kinetic.Transform.prototype * @param {Number} rad Angle in radians * @returns {Kinetic.Transform} */ rotate: function(rad) { var c = Math.cos(rad); var s = Math.sin(rad); var m11 = this.m[0] * c + this.m[2] * s; var m12 = this.m[1] * c + this.m[3] * s; var m21 = this.m[0] * -s + this.m[2] * c; var m22 = this.m[1] * -s + this.m[3] * c; this.m[0] = m11; this.m[1] = m12; this.m[2] = m21; this.m[3] = m22; return this; }, /** * Returns the translation * @method * @memberof Kinetic.Transform.prototype * @returns {Object} 2D point(x, y) */ getTranslation: function() { return { x: this.m[4], y: this.m[5] }; }, /** * Apply skew * @method * @memberof Kinetic.Transform.prototype * @param {Number} sx * @param {Number} sy * @returns {Kinetic.Transform} */ skew: function(sx, sy) { var m11 = this.m[0] + this.m[2] * sy; var m12 = this.m[1] + this.m[3] * sy; var m21 = this.m[2] + this.m[0] * sx; var m22 = this.m[3] + this.m[1] * sx; this.m[0] = m11; this.m[1] = m12; this.m[2] = m21; this.m[3] = m22; return this; }, /** * Transform multiplication * @method * @memberof Kinetic.Transform.prototype * @param {Kinetic.Transform} matrix * @returns {Kinetic.Transform} */ multiply: function(matrix) { var m11 = this.m[0] * matrix.m[0] + this.m[2] * matrix.m[1]; var m12 = this.m[1] * matrix.m[0] + this.m[3] * matrix.m[1]; var m21 = this.m[0] * matrix.m[2] + this.m[2] * matrix.m[3]; var m22 = this.m[1] * matrix.m[2] + this.m[3] * matrix.m[3]; var dx = this.m[0] * matrix.m[4] + this.m[2] * matrix.m[5] + this.m[4]; var dy = this.m[1] * matrix.m[4] + this.m[3] * matrix.m[5] + this.m[5]; this.m[0] = m11; this.m[1] = m12; this.m[2] = m21; this.m[3] = m22; this.m[4] = dx; this.m[5] = dy; return this; }, /** * Invert the matrix * @method * @memberof Kinetic.Transform.prototype * @returns {Kinetic.Transform} */ invert: function() { var d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]); var m0 = this.m[3] * d; var m1 = -this.m[1] * d; var m2 = -this.m[2] * d; var m3 = this.m[0] * d; var m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]); var m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]); this.m[0] = m0; this.m[1] = m1; this.m[2] = m2; this.m[3] = m3; this.m[4] = m4; this.m[5] = m5; return this; }, /** * return matrix * @method * @memberof Kinetic.Transform.prototype */ getMatrix: function() { return this.m; }, /** * set to absolute position via translation * @method * @memberof Kinetic.Transform.prototype * @returns {Kinetic.Transform} * @author ericdrowell */ setAbsolutePosition: function(x, y) { var m0 = this.m[0], m1 = this.m[1], m2 = this.m[2], m3 = this.m[3], m4 = this.m[4], m5 = this.m[5], yt = ((m0 * (y - m5)) - (m1 * (x - m4))) / ((m0 * m3) - (m1 * m2)), xt = (x - m4 - (m2 * yt)) / m0; return this.translate(xt, yt); } }; // CONSTANTS var CANVAS = 'canvas', CONTEXT_2D = '2d', OBJECT_ARRAY = '[object Array]', OBJECT_NUMBER = '[object Number]', OBJECT_STRING = '[object String]', PI_OVER_DEG180 = Math.PI / 180, DEG180_OVER_PI = 180 / Math.PI, HASH = '#', EMPTY_STRING = '', ZERO = '0', KINETIC_WARNING = 'Kinetic warning: ', KINETIC_ERROR = 'Kinetic error: ', RGB_PAREN = 'rgb(', COLORS = { aqua: [0,255,255], lime: [0,255,0], silver: [192,192,192], black: [0,0,0], maroon: [128,0,0], teal: [0,128,128], blue: [0,0,255], navy: [0,0,128], white: [255,255,255], fuchsia: [255,0,255], olive:[128,128,0], yellow: [255,255,0], orange: [255,165,0], gray: [128,128,128], purple: [128,0,128], green: [0,128,0], red: [255,0,0], pink: [255,192,203], cyan: [0,255,255], transparent: [255,255,255,0] }, RGB_REGEX = /rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/; /** * @namespace Util * @memberof Kinetic */ Kinetic.Util = { /* * cherry-picked utilities from underscore.js */ _isElement: function(obj) { return !!(obj && obj.nodeType == 1); }, _isFunction: function(obj) { return !!(obj && obj.constructor && obj.call && obj.apply); }, _isObject: function(obj) { return (!!obj && obj.constructor == Object); }, _isArray: function(obj) { return Object.prototype.toString.call(obj) == OBJECT_ARRAY; }, _isNumber: function(obj) { return Object.prototype.toString.call(obj) == OBJECT_NUMBER; }, _isString: function(obj) { return Object.prototype.toString.call(obj) == OBJECT_STRING; }, // Returns a function, that, when invoked, will only be triggered at most once // during a given window of time. Normally, the throttled function will run // as much as it can, without ever going more than once per `wait` duration; // but if you'd like to disable the execution on the leading edge, pass // `{leading: false}`. To disable execution on the trailing edge, ditto. _throttle: function(func, wait, options) { var context, args, result; var timeout = null; var previous = 0; options || (options = {}); var later = function() { previous = options.leading === false ? 0 : new Date().getTime(); timeout = null; result = func.apply(context, args); context = args = null; }; return function() { var now = new Date().getTime(); if (!previous && options.leading === false) previous = now; var remaining = wait - (now - previous); context = this; args = arguments; if (remaining <= 0) { clearTimeout(timeout); timeout = null; previous = now; result = func.apply(context, args); context = args = null; } else if (!timeout && options.trailing !== false) { timeout = setTimeout(later, remaining); } return result; }; }, /* * other utils */ _hasMethods: function(obj) { var names = [], key; for(key in obj) { if(this._isFunction(obj[key])) { names.push(key); } } return names.length > 0; }, createCanvasElement: function() { var canvas = Kinetic.document.createElement('canvas'); canvas.style = canvas.style || {}; return canvas; }, isBrowser: function() { return (typeof exports !== 'object'); }, _isInDocument: function(el) { while(el = el.parentNode) { if(el == Kinetic.document) { return true; } } return false; }, _simplifyArray: function(arr) { var retArr = [], len = arr.length, util = Kinetic.Util, n, val; for (n=0; n> 16) & 255, g: (bigint >> 8) & 255, b: bigint & 255 }; }, /** * return random hex color * @method * @memberof Kinetic.Util.prototype */ getRandomColor: function() { var randColor = (Math.random() * 0xFFFFFF << 0).toString(16); while (randColor.length < 6) { randColor = ZERO + randColor; } return HASH + randColor; }, /** * return value with default fallback * @method * @memberof Kinetic.Util.prototype */ get: function(val, def) { if (val === undefined) { return def; } else { return val; } }, /** * get RGB components of a color * @method * @memberof Kinetic.Util.prototype * @param {String} color * @example * // each of the following examples return {r:0, g:0, b:255}
* var rgb = Kinetic.Util.getRGB('blue');
* var rgb = Kinetic.Util.getRGB('#0000ff');
* var rgb = Kinetic.Util.getRGB('rgb(0,0,255)'); */ getRGB: function(color) { var rgb; // color string if (color in COLORS) { rgb = COLORS[color]; return { r: rgb[0], g: rgb[1], b: rgb[2] }; } // hex else if (color[0] === HASH) { return this._hexToRgb(color.substring(1)); } // rgb string else if (color.substr(0, 4) === RGB_PAREN) { rgb = RGB_REGEX.exec(color.replace(/ /g,'')); return { r: parseInt(rgb[1], 10), g: parseInt(rgb[2], 10), b: parseInt(rgb[3], 10) }; } // default else { return { r: 0, g: 0, b: 0 }; } }, // o1 takes precedence over o2 _merge: function(o1, o2) { var retObj = this._clone(o2); for(var key in o1) { if(this._isObject(o1[key])) { retObj[key] = this._merge(o1[key], retObj[key]); } else { retObj[key] = o1[key]; } } return retObj; }, cloneObject: function(obj) { var retObj = {}; for(var key in obj) { if(this._isObject(obj[key])) { retObj[key] = this.cloneObject(obj[key]); } else if (this._isArray(obj[key])) { retObj[key] = this.cloneArray(obj[key]); } else { retObj[key] = obj[key]; } } return retObj; }, cloneArray: function(arr) { return arr.slice(0); }, _degToRad: function(deg) { return deg * PI_OVER_DEG180; }, _radToDeg: function(rad) { return rad * DEG180_OVER_PI; }, _capitalize: function(str) { return str.charAt(0).toUpperCase() + str.slice(1); }, error: function(str) { throw new Error(KINETIC_ERROR + str); }, warn: function(str) { /* * IE9 on Windows7 64bit will throw a JS error * if we don't use window.console in the conditional */ if(Kinetic.root.console && console.warn) { console.warn(KINETIC_WARNING + str); } }, extend: function(c1, c2) { for(var key in c2.prototype) { if(!( key in c1.prototype)) { c1.prototype[key] = c2.prototype[key]; } } }, /** * adds methods to a constructor prototype * @method * @memberof Kinetic.Util.prototype * @param {Function} constructor * @param {Object} methods */ addMethods: function(constructor, methods) { var key; for (key in methods) { constructor.prototype[key] = methods[key]; } }, _getControlPoints: function(x0, y0, x1, y1, x2, y2, t) { var d01 = Math.sqrt(Math.pow(x1 - x0, 2) + Math.pow(y1 - y0, 2)), d12 = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)), fa = t * d01 / (d01 + d12), fb = t * d12 / (d01 + d12), p1x = x1 - fa * (x2 - x0), p1y = y1 - fa * (y2 - y0), p2x = x1 + fb * (x2 - x0), p2y = y1 + fb * (y2 - y0); return [p1x ,p1y, p2x, p2y]; }, _expandPoints: function(p, tension) { var len = p.length, allPoints = [], n, cp; for (n=2; n= Kinetic.traceArrMax) { traceArr.shift(); } }, /** * reset canvas context transform * @method * @memberof Kinetic.Context.prototype */ reset: function() { var pixelRatio = this.getCanvas().getPixelRatio(); this.setTransform(1 * pixelRatio, 0, 0, 1 * pixelRatio, 0, 0); }, /** * get canvas * @method * @memberof Kinetic.Context.prototype * @returns {Kinetic.Canvas} */ getCanvas: function() { return this.canvas; }, /** * clear canvas * @method * @memberof Kinetic.Context.prototype * @param {Object} [bounds] * @param {Number} [bounds.x] * @param {Number} [bounds.y] * @param {Number} [bounds.width] * @param {Number} [bounds.height] */ clear: function(bounds) { var canvas = this.getCanvas(); if (bounds) { this.clearRect(bounds.x || 0, bounds.y || 0, bounds.width || 0, bounds.height || 0); } else { this.clearRect(0, 0, canvas.getWidth(), canvas.getHeight()); } }, _applyLineCap: function(shape) { var lineCap = shape.getLineCap(); if(lineCap) { this.setAttr('lineCap', lineCap); } }, _applyOpacity: function(shape) { var absOpacity = shape.getAbsoluteOpacity(); if(absOpacity !== 1) { this.setAttr('globalAlpha', absOpacity); } }, _applyLineJoin: function(shape) { var lineJoin = shape.getLineJoin(); if(lineJoin) { this.setAttr('lineJoin', lineJoin); } }, setAttr: function(attr, val) { this._context[attr] = val; }, // context pass through methods arc: function() { var a = arguments; this._context.arc(a[0], a[1], a[2], a[3], a[4], a[5]); }, beginPath: function() { this._context.beginPath(); }, bezierCurveTo: function() { var a = arguments; this._context.bezierCurveTo(a[0], a[1], a[2], a[3], a[4], a[5]); }, clearRect: function() { var a = arguments; this._context.clearRect(a[0], a[1], a[2], a[3]); }, clip: function() { this._context.clip(); }, closePath: function() { this._context.closePath(); }, createImageData: function() { var a = arguments; if(a.length === 2) { return this._context.createImageData(a[0], a[1]); } else if(a.length === 1) { return this._context.createImageData(a[0]); } }, createLinearGradient: function() { var a = arguments; return this._context.createLinearGradient(a[0], a[1], a[2], a[3]); }, createPattern: function() { var a = arguments; return this._context.createPattern(a[0], a[1]); }, createRadialGradient: function() { var a = arguments; return this._context.createRadialGradient(a[0], a[1], a[2], a[3], a[4], a[5]); }, drawImage: function() { var a = arguments, _context = this._context; if(a.length === 3) { _context.drawImage(a[0], a[1], a[2]); } else if(a.length === 5) { _context.drawImage(a[0], a[1], a[2], a[3], a[4]); } else if(a.length === 9) { _context.drawImage(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]); } }, fill: function() { this._context.fill(); }, fillText: function() { var a = arguments; this._context.fillText(a[0], a[1], a[2]); }, getImageData: function() { var a = arguments; return this._context.getImageData(a[0], a[1], a[2], a[3]); }, lineTo: function() { var a = arguments; this._context.lineTo(a[0], a[1]); }, moveTo: function() { var a = arguments; this._context.moveTo(a[0], a[1]); }, rect: function() { var a = arguments; this._context.rect(a[0], a[1], a[2], a[3]); }, putImageData: function() { var a = arguments; this._context.putImageData(a[0], a[1], a[2]); }, quadraticCurveTo: function() { var a = arguments; this._context.quadraticCurveTo(a[0], a[1], a[2], a[3]); }, restore: function() { this._context.restore(); }, rotate: function() { var a = arguments; this._context.rotate(a[0]); }, save: function() { this._context.save(); }, scale: function() { var a = arguments; this._context.scale(a[0], a[1]); }, setLineDash: function() { var a = arguments, _context = this._context; // works for Chrome and IE11 if(this._context.setLineDash) { _context.setLineDash(a[0]); } // verified that this works in firefox else if('mozDash' in _context) { _context.mozDash = a[0]; } // does not currently work for Safari else if('webkitLineDash' in _context) { _context.webkitLineDash = a[0]; } // no support for IE9 and IE10 }, setTransform: function() { var a = arguments; this._context.setTransform(a[0], a[1], a[2], a[3], a[4], a[5]); }, stroke: function() { this._context.stroke(); }, strokeText: function() { var a = arguments; this._context.strokeText(a[0], a[1], a[2]); }, transform: function() { var a = arguments; this._context.transform(a[0], a[1], a[2], a[3], a[4], a[5]); }, translate: function() { var a = arguments; this._context.translate(a[0], a[1]); }, _enableTrace: function() { var that = this, len = CONTEXT_METHODS.length, _simplifyArray = Kinetic.Util._simplifyArray, origSetter = this.setAttr, n, args; // to prevent creating scope function at each loop var func = function(methodName) { var origMethod = that[methodName], ret; that[methodName] = function() { args = _simplifyArray(Array.prototype.slice.call(arguments, 0)); ret = origMethod.apply(that, arguments); that._trace({ method: methodName, args: args }); return ret; }; }; // methods for (n=0; n 255) { return 255; } else if (val < 0) { return 0; } else { return Math.round(val); } }, alphaComponent: function(val) { if (val > 1) { return 1; } // chrome does not honor alpha values of 0 else if (val < 0.0001) { return 0.0001; } else { return val; } } }; })();;(function() { // CONSTANTS var ABSOLUTE_OPACITY = 'absoluteOpacity', ABSOLUTE_TRANSFORM = 'absoluteTransform', BEFORE = 'before', CHANGE = 'Change', CHILDREN = 'children', DOT = '.', EMPTY_STRING = '', GET = 'get', ID = 'id', KINETIC = 'kinetic', LISTENING = 'listening', MOUSEENTER = 'mouseenter', MOUSELEAVE = 'mouseleave', NAME = 'name', SET = 'set', SHAPE = 'Shape', SPACE = ' ', STAGE = 'stage', TRANSFORM = 'transform', UPPER_STAGE = 'Stage', VISIBLE = 'visible', CLONE_BLACK_LIST = ['id'], TRANSFORM_CHANGE_STR = [ 'xChange.kinetic', 'yChange.kinetic', 'scaleXChange.kinetic', 'scaleYChange.kinetic', 'skewXChange.kinetic', 'skewYChange.kinetic', 'rotationChange.kinetic', 'offsetXChange.kinetic', 'offsetYChange.kinetic', 'transformsEnabledChange.kinetic' ].join(SPACE); Kinetic.Util.addMethods(Kinetic.Node, { _init: function(config) { var that = this; this._id = Kinetic.idCounter++; this.eventListeners = {}; this.attrs = {}; this._cache = {}; this._filterUpToDate = false; this.setAttrs(config); // event bindings for cache handling this.on(TRANSFORM_CHANGE_STR, function() { this._clearCache(TRANSFORM); that._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM); }); this.on('visibleChange.kinetic', function() { that._clearSelfAndDescendantCache(VISIBLE); }); this.on('listeningChange.kinetic', function() { that._clearSelfAndDescendantCache(LISTENING); }); this.on('opacityChange.kinetic', function() { that._clearSelfAndDescendantCache(ABSOLUTE_OPACITY); }); }, _clearCache: function(attr){ if (attr) { delete this._cache[attr]; } else { this._cache = {}; } }, _getCache: function(attr, privateGetter){ var cache = this._cache[attr]; // if not cached, we need to set it using the private getter method. if (cache === undefined) { this._cache[attr] = privateGetter.call(this); } return this._cache[attr]; }, /* * when the logic for a cached result depends on ancestor propagation, use this * method to clear self and children cache */ _clearSelfAndDescendantCache: function(attr) { this._clearCache(attr); if (this.children) { this.getChildren().each(function(node) { node._clearSelfAndDescendantCache(attr); }); } }, /** * clear cached canvas * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Node} * @example * node.clearCache(); */ clearCache: function() { delete this._cache.canvas; this._filterUpToDate = false; return this; }, /** * cache node to improve drawing performance, apply filters, or create more accurate * hit regions * @method * @memberof Kinetic.Node.prototype * @param {Object} config * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.drawBorder] when set to true, a red border will be drawn around the cached * region for debugging purposes * @returns {Kinetic.Node} * @example * // cache a shape with the x,y position of the bounding box at the center and
* // the width and height of the bounding box equal to the width and height of
* // the shape obtained from shape.width() and shape.height()
* image.cache();

* * // cache a node and define the bounding box position and size
* node.cache({
* x: -30,
* y: -30,
* width: 100,
* height: 200
* });

* * // cache a node and draw a red border around the bounding box
* // for debugging purposes
* node.cache({
* x: -30,
* y: -30,
* width: 100,
* height: 200,
* drawBorder: true
* }); */ cache: function(config) { var conf = config || {}, x = conf.x || 0, y = conf.y || 0, width = conf.width || this.width(), height = conf.height || this.height(), drawBorder = conf.drawBorder || false, layer = this.getLayer(); if (width === 0 || height === 0) { Kinetic.Util.warn('Width or height of caching configuration equals 0. Cache is ignored.'); return; } var cachedSceneCanvas = new Kinetic.SceneCanvas({ pixelRatio: 1, width: width, height: height }), cachedFilterCanvas = new Kinetic.SceneCanvas({ pixelRatio: 1, width: width, height: height }), cachedHitCanvas = new Kinetic.HitCanvas({ width: width, height: height }), origTransEnabled = this.transformsEnabled(), origX = this.x(), origY = this.y(), sceneContext = cachedSceneCanvas.getContext(), hitContext = cachedHitCanvas.getContext(); this.clearCache(); sceneContext.save(); hitContext.save(); // this will draw a red border around the cached box for // debugging purposes if (drawBorder) { sceneContext.save(); sceneContext.beginPath(); sceneContext.rect(0, 0, width, height); sceneContext.closePath(); sceneContext.setAttr('strokeStyle', 'red'); sceneContext.setAttr('lineWidth', 5); sceneContext.stroke(); sceneContext.restore(); } sceneContext.translate(x * -1, y * -1); hitContext.translate(x * -1, y * -1); if (this.nodeType === 'Shape') { sceneContext.translate(this.x() * -1, this.y() * -1); hitContext.translate(this.x() * -1, this.y() * -1); } this.drawScene(cachedSceneCanvas, this); this.drawHit(cachedHitCanvas, this); sceneContext.restore(); hitContext.restore(); this._cache.canvas = { scene: cachedSceneCanvas, filter: cachedFilterCanvas, hit: cachedHitCanvas }; return this; }, _drawCachedSceneCanvas: function(context) { context.save(); this.getLayer()._applyTransform(this, context); context.drawImage(this._getCachedSceneCanvas()._canvas, 0, 0); context.restore(); }, _getCachedSceneCanvas: function() { var filters = this.filters(), cachedCanvas = this._cache.canvas, sceneCanvas = cachedCanvas.scene, filterCanvas = cachedCanvas.filter, filterContext = filterCanvas.getContext(), len, imageData, n, filter; if (filters) { if (!this._filterUpToDate) { try { len = filters.length; filterContext.clear(); // copy cached canvas onto filter context filterContext.drawImage(sceneCanvas._canvas, 0, 0); imageData = filterContext.getImageData(0, 0, filterCanvas.getWidth(), filterCanvas.getHeight()); // apply filters to filter context for (n=0; n * node.on('click', function() {
* console.log('you clicked me!');
* });

* * // get the target node
* node.on('click', function(evt) {
* console.log(evt.target);
* });

* * // stop event propagation
* node.on('click', function(evt) {
* evt.cancelBubble = true;
* });

* * // bind multiple listeners
* node.on('click touchstart', function() {
* console.log('you clicked/touched me!');
* });

* * // namespace listener
* node.on('click.foo', function() {
* console.log('you clicked/touched me!');
* });

* * // get the event type
* node.on('click tap', function(evt) {
* var eventType = evt.type;
* });

* * // get native event object
* node.on('click tap', function(evt) {
* var nativeEvent = evt.evt;
* });

* * // for change events, get the old and new val
* node.on('xChange', function(evt) {
* var oldVal = evt.oldVal;
* var newVal = evt.newVal;
* }); */ on: function(evtStr, handler) { var events = evtStr.split(SPACE), len = events.length, n, event, parts, baseEvent, name; /* * loop through types and attach event listeners to * each one. eg. 'click mouseover.namespace mouseout' * will create three event bindings */ for(n = 0; n < len; n++) { event = events[n]; parts = event.split(DOT); baseEvent = parts[0]; name = parts[1] || EMPTY_STRING; // create events array if it doesn't exist if(!this.eventListeners[baseEvent]) { this.eventListeners[baseEvent] = []; } this.eventListeners[baseEvent].push({ name: name, handler: handler }); // NOTE: this flag is set to true when any event handler is added, even non // mouse or touch gesture events. This improves performance for most // cases where users aren't using events, but is still very light weight. // To ensure perfect accuracy, devs can explicitly set listening to false. /* if (name !== KINETIC) { this._listeningEnabled = true; this._clearSelfAndAncestorCache(LISTENING_ENABLED); } */ } return this; }, /** * remove event bindings from the node. Pass in a string of * event types delimmited by a space to remove multiple event * bindings at once such as 'mousedown mouseup mousemove'. * include a namespace to remove an event binding by name * such as 'click.foobar'. If you only give a name like '.foobar', * all events in that namespace will be removed. * @method * @memberof Kinetic.Node.prototype * @param {String} evtStr e.g. 'click', 'mousedown touchstart', '.foobar' * @returns {Kinetic.Node} * @example * // remove listener
* node.off('click');

* * // remove multiple listeners
* node.off('click touchstart');

* * // remove listener by name
* node.off('click.foo'); */ off: function(evtStr) { var events = evtStr.split(SPACE), len = events.length, n, t, event, parts, baseEvent, name; for(n = 0; n < len; n++) { event = events[n]; parts = event.split(DOT); baseEvent = parts[0]; name = parts[1]; if(baseEvent) { if(this.eventListeners[baseEvent]) { this._off(baseEvent, name); } } else { for(t in this.eventListeners) { this._off(t, name); } } } return this; }, // some event aliases for third party integration like HammerJS dispatchEvent: function(evt) { var e = { target: this, type: evt.type, evt: evt }; this.fire(evt.type, e); }, addEventListener: function(type, handler) { // we to pass native event to handler this.on(type, function(evt){ handler.call(this, evt.evt); }); }, /** * remove self from parent, but don't destroy * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Node} * @example * node.remove(); */ remove: function() { var parent = this.getParent(); if(parent && parent.children) { parent.children.splice(this.index, 1); parent._setChildrenIndices(); delete this.parent; } // every cached attr that is calculated via node tree // traversal must be cleared when removing a node this._clearSelfAndDescendantCache(STAGE); this._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM); this._clearSelfAndDescendantCache(VISIBLE); this._clearSelfAndDescendantCache(LISTENING); this._clearSelfAndDescendantCache(ABSOLUTE_OPACITY); return this; }, /** * remove and destroy self * @method * @memberof Kinetic.Node.prototype * @example * node.destroy(); */ destroy: function() { // remove from ids and names hashes Kinetic._removeId(this.getId()); Kinetic._removeName(this.getName(), this._id); this.remove(); }, /** * get attr * @method * @memberof Kinetic.Node.prototype * @param {String} attr * @returns {Integer|String|Object|Array} * @example * var x = node.getAttr('x'); */ getAttr: function(attr) { var method = GET + Kinetic.Util._capitalize(attr); if(Kinetic.Util._isFunction(this[method])) { return this[method](); } // otherwise get directly else { return this.attrs[attr]; } }, /** * get ancestors * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Collection} * @example * shape.getAncestors().each(function(node) { * console.log(node.getId()); * }) */ getAncestors: function() { var parent = this.getParent(), ancestors = new Kinetic.Collection(); while (parent) { ancestors.push(parent); parent = parent.getParent(); } return ancestors; }, /** * get attrs object literal * @method * @memberof Kinetic.Node.prototype * @returns {Object} */ getAttrs: function() { return this.attrs || {}; }, /** * set multiple attrs at once using an object literal * @method * @memberof Kinetic.Node.prototype * @param {Object} config object containing key value pairs * @returns {Kinetic.Node} * @example * node.setAttrs({
* x: 5,
* fill: 'red'
* });
*/ setAttrs: function(config) { var key, method; if(config) { for(key in config) { if (key === CHILDREN) { } else { method = SET + Kinetic.Util._capitalize(key); // use setter if available if(Kinetic.Util._isFunction(this[method])) { this[method](config[key]); } // otherwise set directly else { this._setAttr(key, config[key]); } } } } return this; }, /** * determine if node is listening for events by taking into account ancestors. * * Parent | Self | isListening * listening | listening | * ----------+-----------+------------ * T | T | T * T | F | F * F | T | T * F | F | F * ----------+-----------+------------ * T | I | T * F | I | F * I | I | T * * @method * @memberof Kinetic.Node.prototype * @returns {Boolean} */ isListening: function() { return this._getCache(LISTENING, this._isListening); }, _isListening: function() { var listening = this.getListening(), parent = this.getParent(); // the following conditions are a simplification of the truth table above. // please modify carefully if (listening === 'inherit') { if (parent) { return parent.isListening(); } else { return true; } } else { return listening; } }, /** * determine if node is visible by taking into account ancestors. * * Parent | Self | isVisible * visible | visible | * ----------+-----------+------------ * T | T | T * T | F | F * F | T | T * F | F | F * ----------+-----------+------------ * T | I | T * F | I | F * I | I | T * @method * @memberof Kinetic.Node.prototype * @returns {Boolean} */ isVisible: function() { return this._getCache(VISIBLE, this._isVisible); }, _isVisible: function() { var visible = this.getVisible(), parent = this.getParent(); // the following conditions are a simplification of the truth table above. // please modify carefully if (visible === 'inherit') { if (parent) { return parent.isVisible(); } else { return true; } } else { return visible; } }, /** * determine if listening is enabled by taking into account descendants. If self or any children * have _isListeningEnabled set to true, then self also has listening enabled. * @method * @memberof Kinetic.Node.prototype * @returns {Boolean} */ shouldDrawHit: function() { var layer = this.getLayer(); return layer && layer.hitGraphEnabled() && this.isListening() && this.isVisible() && !Kinetic.isDragging(); }, /** * show node * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Node} */ show: function() { this.setVisible(true); return this; }, /** * hide node. Hidden nodes are no longer detectable * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Node} */ hide: function() { this.setVisible(false); return this; }, /** * get zIndex relative to the node's siblings who share the same parent * @method * @memberof Kinetic.Node.prototype * @returns {Integer} */ getZIndex: function() { return this.index || 0; }, /** * get absolute z-index which takes into account sibling * and ancestor indices * @method * @memberof Kinetic.Node.prototype * @returns {Integer} */ getAbsoluteZIndex: function() { var depth = this.getDepth(), that = this, index = 0, nodes, len, n, child; function addChildren(children) { nodes = []; len = children.length; for(n = 0; n < len; n++) { child = children[n]; index++; if(child.nodeType !== SHAPE) { nodes = nodes.concat(child.getChildren().toArray()); } if(child._id === that._id) { n = len; } } if(nodes.length > 0 && nodes[0].getDepth() <= depth) { addChildren(nodes); } } if(that.nodeType !== UPPER_STAGE) { addChildren(that.getStage().getChildren()); } return index; }, /** * get node depth in node tree. Returns an integer.

* e.g. Stage depth will always be 0. Layers will always be 1. Groups and Shapes will always * be >= 2 * @method * @memberof Kinetic.Node.prototype * @returns {Integer} */ getDepth: function() { var depth = 0, parent = this.parent; while(parent) { depth++; parent = parent.parent; } return depth; }, setPosition: function(pos) { this.setX(pos.x); this.setY(pos.y); return this; }, getPosition: function() { return { x: this.getX(), y: this.getY() }; }, /** * get absolute position relative to the top left corner of the stage container div * @method * @memberof Kinetic.Node.prototype * @returns {Object} */ getAbsolutePosition: function() { var absoluteMatrix = this.getAbsoluteTransform().getMatrix(), absoluteTransform = new Kinetic.Transform(), offset = this.offset(); // clone the matrix array absoluteTransform.m = absoluteMatrix.slice(); absoluteTransform.translate(offset.x, offset.y); return absoluteTransform.getTranslation(); }, /** * set absolute position * @method * @memberof Kinetic.Node.prototype * @param {Object} pos * @param {Number} pos.x * @param {Number} pos.y * @returns {Kinetic.Node} */ setAbsolutePosition: function(pos) { var origTrans = this._clearTransform(), it; // don't clear translation this.attrs.x = origTrans.x; this.attrs.y = origTrans.y; delete origTrans.x; delete origTrans.y; // unravel transform it = this.getAbsoluteTransform(); it.invert(); it.translate(pos.x, pos.y); pos = { x: this.attrs.x + it.getTranslation().x, y: this.attrs.y + it.getTranslation().y }; this.setPosition({x:pos.x, y:pos.y}); this._setTransform(origTrans); return this; }, _setTransform: function(trans) { var key; for(key in trans) { this.attrs[key] = trans[key]; } this._clearCache(TRANSFORM); this._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM); }, _clearTransform: function() { var trans = { x: this.getX(), y: this.getY(), rotation: this.getRotation(), scaleX: this.getScaleX(), scaleY: this.getScaleY(), offsetX: this.getOffsetX(), offsetY: this.getOffsetY(), skewX: this.getSkewX(), skewY: this.getSkewY() }; this.attrs.x = 0; this.attrs.y = 0; this.attrs.rotation = 0; this.attrs.scaleX = 1; this.attrs.scaleY = 1; this.attrs.offsetX = 0; this.attrs.offsetY = 0; this.attrs.skewX = 0; this.attrs.skewY = 0; this._clearCache(TRANSFORM); this._clearSelfAndDescendantCache(ABSOLUTE_TRANSFORM); // return original transform return trans; }, /** * move node by an amount relative to its current position * @method * @memberof Kinetic.Node.prototype * @param {Object} change * @param {Number} change.x * @param {Number} change.y * @returns {Kinetic.Node} * @example * // move node in x direction by 1px and y direction by 2px
* node.move({
* x: 1,
* y: 2)
* }); */ move: function(change) { var changeX = change.x, changeY = change.y, x = this.getX(), y = this.getY(); if(changeX !== undefined) { x += changeX; } if(changeY !== undefined) { y += changeY; } this.setPosition({x:x, y:y}); return this; }, _eachAncestorReverse: function(func, top) { var family = [], parent = this.getParent(), len, n; // if top node is defined, and this node is top node, // there's no need to build a family tree. just execute // func with this because it will be the only node if (top && top._id === this._id) { func(this); return true; } family.unshift(this); while(parent && (!top || parent._id !== top._id)) { family.unshift(parent); parent = parent.parent; } len = family.length; for(n = 0; n < len; n++) { func(family[n]); } }, /** * rotate node by an amount in degrees relative to its current rotation * @method * @memberof Kinetic.Node.prototype * @param {Number} theta * @returns {Kinetic.Node} */ rotate: function(theta) { this.setRotation(this.getRotation() + theta); return this; }, /** * move node to the top of its siblings * @method * @memberof Kinetic.Node.prototype * @returns {Boolean} */ moveToTop: function() { if (!this.parent) { Kinetic.Util.warn('Node has no parent. moveToTop function is ignored.'); return; } var index = this.index; this.parent.children.splice(index, 1); this.parent.children.push(this); this.parent._setChildrenIndices(); return true; }, /** * move node up * @method * @memberof Kinetic.Node.prototype * @returns {Boolean} */ moveUp: function() { if (!this.parent) { Kinetic.Util.warn('Node has no parent. moveUp function is ignored.'); return; } var index = this.index, len = this.parent.getChildren().length; if(index < len - 1) { this.parent.children.splice(index, 1); this.parent.children.splice(index + 1, 0, this); this.parent._setChildrenIndices(); return true; } return false; }, /** * move node down * @method * @memberof Kinetic.Node.prototype * @returns {Boolean} */ moveDown: function() { if (!this.parent) { Kinetic.Util.warn('Node has no parent. moveDown function is ignored.'); return; } var index = this.index; if(index > 0) { this.parent.children.splice(index, 1); this.parent.children.splice(index - 1, 0, this); this.parent._setChildrenIndices(); return true; } return false; }, /** * move node to the bottom of its siblings * @method * @memberof Kinetic.Node.prototype * @returns {Boolean} */ moveToBottom: function() { if (!this.parent) { Kinetic.Util.warn('Node has no parent. moveToBottom function is ignored.'); return; } var index = this.index; if(index > 0) { this.parent.children.splice(index, 1); this.parent.children.unshift(this); this.parent._setChildrenIndices(); return true; } return false; }, /** * set zIndex relative to siblings * @method * @memberof Kinetic.Node.prototype * @param {Integer} zIndex * @returns {Kinetic.Node} */ setZIndex: function(zIndex) { if (!this.parent) { Kinetic.Util.warn('Node has no parent. zIndex parameter is ignored.'); return; } var index = this.index; this.parent.children.splice(index, 1); this.parent.children.splice(zIndex, 0, this); this.parent._setChildrenIndices(); return this; }, /** * get absolute opacity * @method * @memberof Kinetic.Node.prototype * @returns {Number} */ getAbsoluteOpacity: function() { return this._getCache(ABSOLUTE_OPACITY, this._getAbsoluteOpacity); }, _getAbsoluteOpacity: function() { var absOpacity = this.getOpacity(); if(this.getParent()) { absOpacity *= this.getParent().getAbsoluteOpacity(); } return absOpacity; }, /** * move node to another container * @method * @memberof Kinetic.Node.prototype * @param {Container} newContainer * @returns {Kinetic.Node} * @example * // move node from current layer into layer2
* node.moveTo(layer2); */ moveTo: function(newContainer) { Kinetic.Node.prototype.remove.call(this); newContainer.add(this); return this; }, /** * convert Node into an object for serialization. Returns an object. * @method * @memberof Kinetic.Node.prototype * @returns {Object} */ toObject: function() { var type = Kinetic.Util, obj = {}, attrs = this.getAttrs(), key, val, getter, defaultValue; obj.attrs = {}; // serialize only attributes that are not function, image, DOM, or objects with methods for(key in attrs) { val = attrs[key]; if (!type._isFunction(val) && !type._isElement(val) && !(type._isObject(val) && type._hasMethods(val))) { getter = this[key]; // remove attr value so that we can extract the default value from the getter delete attrs[key]; defaultValue = getter ? getter.call(this) : null; // restore attr value attrs[key] = val; if (defaultValue !== val) { obj.attrs[key] = val; } } } obj.className = this.getClassName(); return obj; }, /** * convert Node into a JSON string. Returns a JSON string. * @method * @memberof Kinetic.Node.prototype * @returns {String}} */ toJSON: function() { return JSON.stringify(this.toObject()); }, /** * get parent container * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Node} */ getParent: function() { return this.parent; }, /** * get layer ancestor * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Layer} */ getLayer: function() { var parent = this.getParent(); return parent ? parent.getLayer() : null; }, /** * get stage ancestor * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Stage} */ getStage: function() { return this._getCache(STAGE, this._getStage); }, _getStage: function() { var parent = this.getParent(); if(parent) { return parent.getStage(); } else { return undefined; } }, /** * fire event * @method * @memberof Kinetic.Node.prototype * @param {String} eventType event type. can be a regular event, like click, mouseover, or mouseout, or it can be a custom event, like myCustomEvent * @param {EventObject} [evt] event object * @param {Boolean} [bubble] setting the value to false, or leaving it undefined, will result in the event * not bubbling. Setting the value to true will result in the event bubbling. * @returns {Kinetic.Node} * @example * // manually fire click event
* node.fire('click');

* * // fire custom event
* node.fire('foo');

* * // fire custom event with custom event object
* node.fire('foo', {
* bar: 10
* });

* * // fire click event that bubbles
* node.fire('click', null, true); */ fire: function(eventType, evt, bubble) { // bubble if (bubble) { this._fireAndBubble(eventType, evt || {}); } // no bubble else { this._fire(eventType, evt || {}); } return this; }, /** * get absolute transform of the node which takes into * account its ancestor transforms * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Transform} */ getAbsoluteTransform: function(top) { // if using an argument, we can't cache the result. if (top) { return this._getAbsoluteTransform(top); } // if no argument, we can cache the result else { return this._getCache(ABSOLUTE_TRANSFORM, this._getAbsoluteTransform); } }, _getAbsoluteTransform: function(top) { var at = new Kinetic.Transform(), transformsEnabled, trans; // start with stage and traverse downwards to self this._eachAncestorReverse(function(node) { transformsEnabled = node.transformsEnabled(); trans = node.getTransform(); if (transformsEnabled === 'all') { at.multiply(trans); } else if (transformsEnabled === 'position') { at.translate(node.x(), node.y()); } }, top); return at; }, /** * get transform of the node * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Transform} */ getTransform: function() { return this._getCache(TRANSFORM, this._getTransform); }, _getTransform: function() { var m = new Kinetic.Transform(), x = this.getX(), y = this.getY(), rotation = Kinetic.getAngle(this.getRotation()), scaleX = this.getScaleX(), scaleY = this.getScaleY(), skewX = this.getSkewX(), skewY = this.getSkewY(), offsetX = this.getOffsetX(), offsetY = this.getOffsetY(); if(x !== 0 || y !== 0) { m.translate(x, y); } if(rotation !== 0) { m.rotate(rotation); } if(skewX !== 0 || skewY !== 0) { m.skew(skewX, skewY); } if(scaleX !== 1 || scaleY !== 1) { m.scale(scaleX, scaleY); } if(offsetX !== 0 || offsetY !== 0) { m.translate(-1 * offsetX, -1 * offsetY); } return m; }, /** * clone node. Returns a new Node instance with identical attributes. You can also override * the node properties with an object literal, enabling you to use an existing node as a template * for another node * @method * @memberof Kinetic.Node.prototype * @param {Object} attrs override attrs * @returns {Kinetic.Node} * @example * // simple clone
* var clone = node.clone();

* * // clone a node and override the x position
* var clone = rect.clone({
* x: 5
* }); */ clone: function(obj) { // instantiate new node var className = this.getClassName(), attrs = Kinetic.Util.cloneObject(this.attrs), key, allListeners, len, n, listener; // filter black attrs for (var i in CLONE_BLACK_LIST) { var blockAttr = CLONE_BLACK_LIST[i]; delete attrs[blockAttr]; } // apply attr overrides for (key in obj) { attrs[key] = obj[key]; } var node = new Kinetic[className](attrs); // copy over listeners for(key in this.eventListeners) { allListeners = this.eventListeners[key]; len = allListeners.length; for(n = 0; n < len; n++) { listener = allListeners[n]; /* * don't include kinetic namespaced listeners because * these are generated by the constructors */ if(listener.name.indexOf(KINETIC) < 0) { // if listeners array doesn't exist, then create it if(!node.eventListeners[key]) { node.eventListeners[key] = []; } node.eventListeners[key].push(listener); } } } return node; }, /** * Creates a composite data URL. If MIME type is not * specified, then "image/png" will result. For "image/jpeg", specify a quality * level as quality (range 0.0 - 1.0) * @method * @memberof Kinetic.Node.prototype * @param {Object} config * @param {String} [config.mimeType] can be "image/png" or "image/jpeg". * "image/png" is the default * @param {Number} [config.x] x position of canvas section * @param {Number} [config.y] y position of canvas section * @param {Number} [config.width] width of canvas section * @param {Number} [config.height] height of canvas section * @param {Number} [config.quality] jpeg quality. If using an "image/jpeg" mimeType, * you can specify the quality from 0 to 1, where 0 is very poor quality and 1 * is very high quality * @returns {String} */ toDataURL: function(config) { config = config || {}; var mimeType = config.mimeType || null, quality = config.quality || null, stage = this.getStage(), x = config.x || 0, y = config.y || 0, canvas = new Kinetic.SceneCanvas({ width: config.width || this.getWidth() || (stage ? stage.getWidth() : 0), height: config.height || this.getHeight() || (stage ? stage.getHeight() : 0), pixelRatio: 1 }), context = canvas.getContext(); context.save(); if(x || y) { context.translate(-1 * x, -1 * y); } this.drawScene(canvas); context.restore(); return canvas.toDataURL(mimeType, quality); }, /** * converts node into an image. Since the toImage * method is asynchronous, a callback is required. toImage is most commonly used * to cache complex drawings as an image so that they don't have to constantly be redrawn * @method * @memberof Kinetic.Node.prototype * @param {Object} config * @param {Function} config.callback function executed when the composite has completed * @param {String} [config.mimeType] can be "image/png" or "image/jpeg". * "image/png" is the default * @param {Number} [config.x] x position of canvas section * @param {Number} [config.y] y position of canvas section * @param {Number} [config.width] width of canvas section * @param {Number} [config.height] height of canvas section * @param {Number} [config.quality] jpeg quality. If using an "image/jpeg" mimeType, * you can specify the quality from 0 to 1, where 0 is very poor quality and 1 * is very high quality * @example * var image = node.toImage({
* callback: function(img) {
* // do stuff with img
* }
* }); */ toImage: function(config) { Kinetic.Util._getImage(this.toDataURL(config), function(img) { config.callback(img); }); }, setSize: function(size) { this.setWidth(size.width); this.setHeight(size.height); return this; }, getSize: function() { return { width: this.getWidth(), height: this.getHeight() }; }, /** * get width * @method * @memberof Kinetic.Node.prototype * @returns {Integer} */ getWidth: function() { return this.attrs.width || 0; }, /** * get height * @method * @memberof Kinetic.Node.prototype * @returns {Integer} */ getHeight: function() { return this.attrs.height || 0; }, /** * get class name, which may return Stage, Layer, Group, or shape class names like Rect, Circle, Text, etc. * @method * @memberof Kinetic.Node.prototype * @returns {String} */ getClassName: function() { return this.className || this.nodeType; }, /** * get the node type, which may return Stage, Layer, Group, or Node * @method * @memberof Kinetic.Node.prototype * @returns {String} */ getType: function() { return this.nodeType; }, getDragDistance: function() { // compare with undefined because we need to track 0 value if (this.attrs.dragDistance !== undefined) { return this.attrs.dragDistance; } else if (this.parent) { return this.parent.getDragDistance(); } else { return Kinetic.dragDistance; } }, _get: function(selector) { return this.nodeType === selector ? [this] : []; }, _off: function(type, name) { var evtListeners = this.eventListeners[type], i, evtName; for(i = 0; i < evtListeners.length; i++) { evtName = evtListeners[i].name; // the following two conditions must be true in order to remove a handler: // 1) the current event name cannot be kinetic unless the event name is kinetic // this enables developers to force remove a kinetic specific listener for whatever reason // 2) an event name is not specified, or if one is specified, it matches the current event name if((evtName !== 'kinetic' || name === 'kinetic') && (!name || evtName === name)) { evtListeners.splice(i, 1); if(evtListeners.length === 0) { delete this.eventListeners[type]; break; } i--; } } }, _fireChangeEvent: function(attr, oldVal, newVal) { this._fire(attr + CHANGE, { oldVal: oldVal, newVal: newVal }); }, /** * set id * @method * @memberof Kinetic.Node.prototype * @param {String} id * @returns {Kinetic.Node} */ setId: function(id) { var oldId = this.getId(); Kinetic._removeId(oldId); Kinetic._addId(this, id); this._setAttr(ID, id); return this; }, setName: function(name) { var oldName = this.getName(); Kinetic._removeName(oldName, this._id); Kinetic._addName(this, name); this._setAttr(NAME, name); return this; }, /** * set attr * @method * @memberof Kinetic.Node.prototype * @param {String} attr * @param {*} val * @returns {Kinetic.Node} * @example * node.setAttr('x', 5); */ setAttr: function() { var args = Array.prototype.slice.call(arguments), attr = args[0], val = args[1], method = SET + Kinetic.Util._capitalize(attr), func = this[method]; if(Kinetic.Util._isFunction(func)) { func.call(this, val); } // otherwise set directly else { this._setAttr(attr, val); } return this; }, _setAttr: function(key, val) { var oldVal; if(val !== undefined) { oldVal = this.attrs[key]; this.attrs[key] = val; this._fireChangeEvent(key, oldVal, val); } }, _setComponentAttr: function(key, component, val) { var oldVal; if(val !== undefined) { oldVal = this.attrs[key]; if (!oldVal) { // set value to default value using getAttr this.attrs[key] = this.getAttr(key); } this.attrs[key][component] = val; this._fireChangeEvent(key, oldVal, val); } }, _fireAndBubble: function(eventType, evt, compareShape) { var okayToRun = true; if(evt && this.nodeType === SHAPE) { evt.target = this; } if(eventType === MOUSEENTER && compareShape && this._id === compareShape._id) { okayToRun = false; } else if(eventType === MOUSELEAVE && compareShape && this._id === compareShape._id) { okayToRun = false; } if(okayToRun) { this._fire(eventType, evt); // simulate event bubbling if(evt && !evt.cancelBubble && this.parent) { if(compareShape && compareShape.parent) { this._fireAndBubble.call(this.parent, eventType, evt, compareShape.parent); } else { this._fireAndBubble.call(this.parent, eventType, evt); } } } }, _fire: function(eventType, evt) { var events = this.eventListeners[eventType], i; evt.type = eventType; if (events) { for(i = 0; i < events.length; i++) { events[i].handler.call(this, evt); } } }, /** * draw both scene and hit graphs. If the node being drawn is the stage, all of the layers will be cleared and redrawn * @method * @memberof Kinetic.Node.prototype * @returns {Kinetic.Node} */ draw: function() { this.drawScene(); this.drawHit(); return this; } }); /** * create node with JSON string. De-serializtion does not generate custom * shape drawing functions, images, or event handlers (this would make the * serialized object huge). If your app uses custom shapes, images, and * event handlers (it probably does), then you need to select the appropriate * shapes after loading the stage and set these properties via on(), setDrawFunc(), * and setImage() methods * @method * @memberof Kinetic.Node * @param {String} JSON string * @param {DomElement} [container] optional container dom element used only if you're * creating a stage node */ Kinetic.Node.create = function(json, container) { return this._createNode(JSON.parse(json), container); }; Kinetic.Node._createNode = function(obj, container) { var className = Kinetic.Node.prototype.getClassName.call(obj), children = obj.children, no, len, n; // if container was passed in, add it to attrs if(container) { obj.attrs.container = container; } no = new Kinetic[className](obj.attrs); if(children) { len = children.length; for(n = 0; n < len; n++) { no.add(this._createNode(children[n])); } } return no; }; // =========================== add getters setters =========================== Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'position'); /** * get/set node position relative to parent * @name position * @method * @memberof Kinetic.Node.prototype * @param {Object} pos * @param {Number} pos.x * @param {Nubmer} pos.y * @returns {Object} * @example * // get position
* var position = node.position();

* * // set position
* node.position({
* x: 5
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'x', 0); /** * get/set x position * @name x * @method * @memberof Kinetic.Node.prototype * @param {Number} x * @returns {Object} * @example * // get x
* var x = node.x();

* * // set x
* node.x(5); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'y', 0); /** * get/set y position * @name y * @method * @memberof Kinetic.Node.prototype * @param {Number} y * @returns {Integer} * @example * // get y
* var y = node.y();

* * // set y
* node.y(5); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'opacity', 1); /** * get/set opacity. Opacity values range from 0 to 1. * A node with an opacity of 0 is fully transparent, and a node * with an opacity of 1 is fully opaque * @name opacity * @method * @memberof Kinetic.Node.prototype * @param {Object} opacity * @returns {Number} * @example * // get opacity
* var opacity = node.opacity();

* * // set opacity
* node.opacity(0.5); */ Kinetic.Factory.addGetter(Kinetic.Node, 'name'); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'name'); /** * get/set name * @name name * @method * @memberof Kinetic.Node.prototype * @param {String} name * @returns {String} * @example * // get name
* var name = node.name();

* * // set name
* node.name('foo'); */ Kinetic.Factory.addGetter(Kinetic.Node, 'id'); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'id'); /** * get/set id * @name id * @method * @memberof Kinetic.Node.prototype * @param {String} id * @returns {String} * @example * // get id
* var name = node.id();

* * // set id
* node.id('foo'); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'rotation', 0); /** * get/set rotation in degrees * @name rotation * @method * @memberof Kinetic.Node.prototype * @param {Number} rotation * @returns {Number} * @example * // get rotation in degrees
* var rotation = node.rotation();

* * // set rotation in degrees
* node.rotation(45); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Node, 'scale', ['x', 'y']); /** * get/set scale * @name scale * @param {Object} scale * @param {Number} scale.x * @param {Number} scale.y * @method * @memberof Kinetic.Node.prototype * @returns {Object} * @example * // get scale
* var scale = node.scale();

* * // set scale
* shape.scale({
* x: 2
* y: 3
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'scaleX', 1); /** * get/set scale x * @name scaleX * @param {Number} x * @method * @memberof Kinetic.Node.prototype * @returns {Number} * @example * // get scale x
* var scaleX = node.scaleX();

* * // set scale x
* node.scaleX(2); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'scaleY', 1); /** * get/set scale y * @name scaleY * @param {Number} y * @method * @memberof Kinetic.Node.prototype * @returns {Number} * @example * // get scale y
* var scaleY = node.scaleY();

* * // set scale y
* node.scaleY(2); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Node, 'skew', ['x', 'y']); /** * get/set skew * @name skew * @param {Object} skew * @param {Number} skew.x * @param {Number} skew.y * @method * @memberof Kinetic.Node.prototype * @returns {Object} * @example * // get skew
* var skew = node.skew();

* * // set skew
* node.skew({
* x: 20
* y: 10 * }); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'skewX', 0); /** * get/set skew x * @name skewX * @param {Number} x * @method * @memberof Kinetic.Node.prototype * @returns {Number} * @example * // get skew x
* var skewX = node.skewX();

* * // set skew x
* node.skewX(3); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'skewY', 0); /** * get/set skew y * @name skewY * @param {Number} y * @method * @memberof Kinetic.Node.prototype * @returns {Number} * @example * // get skew y
* var skewY = node.skewY();

* * // set skew y
* node.skewY(3); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Node, 'offset', ['x', 'y']); /** * get/set offset. Offsets the default position and rotation point * @method * @memberof Kinetic.Node.prototype * @param {Object} offset * @param {Number} offset.x * @param {Number} offset.y * @returns {Object} * @example * // get offset
* var offset = node.offset();

* * // set offset
* node.offset({
* x: 20
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'offsetX', 0); /** * get/set offset x * @name offsetX * @memberof Kinetic.Node.prototype * @param {Number} x * @returns {Number} * @example * // get offset x
* var offsetX = node.offsetX();

* * // set offset x
* node.offsetX(3); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'offsetY', 0); /** * get/set drag distance * @name dragDistance * @memberof Kinetic.Node.prototype * @param {Number} distance * @returns {Number} * @example * // get drag distance
* var dragDistance = node.dragDistance();

* * // set distance
* // node starts dragging only if pointer moved more then 3 pixels
* node.dragDistance(3);
* // or set globally
* Kinetic.dragDistance = 3; */ Kinetic.Factory.addSetter(Kinetic.Node, 'dragDistance'); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'dragDistance'); /** * get/set offset y * @name offsetY * @method * @memberof Kinetic.Node.prototype * @param {Number} y * @returns {Number} * @example * // get offset y
* var offsetY = node.offsetY();

* * // set offset y
* node.offsetY(3); */ Kinetic.Factory.addSetter(Kinetic.Node, 'width', 0); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'width'); /** * get/set width * @name width * @method * @memberof Kinetic.Node.prototype * @param {Number} width * @returns {Number} * @example * // get width
* var width = node.width();

* * // set width
* node.width(100); */ Kinetic.Factory.addSetter(Kinetic.Node, 'height', 0); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'height'); /** * get/set height * @name height * @method * @memberof Kinetic.Node.prototype * @param {Number} height * @returns {Number} * @example * // get height
* var height = node.height();

* * // set height
* node.height(100); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'listening', 'inherit'); /** * get/set listenig attr. If you need to determine if a node is listening or not * by taking into account its parents, use the isListening() method * @name listening * @method * @memberof Kinetic.Node.prototype * @param {Boolean|String} listening Can be "inherit", true, or false. The default is "inherit". * @returns {Boolean|String} * @example * // get listening attr
* var listening = node.listening();

* * // stop listening for events
* node.listening(false);

* * // listen for events
* node.listening(true);

* * // listen to events according to the parent
* node.listening('inherit'); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'filters', undefined, function(val) {this._filterUpToDate = false;return val;}); /** * get/set filters. Filters are applied to cached canvases * @name filters * @method * @memberof Kinetic.Node.prototype * @param {Array} filters array of filters * @returns {Array} * @example * // get filters
* var filters = node.filters();

* * // set a single filter
* node.cache();
* node.filters([Kinetic.Filters.Blur]);

* * // set multiple filters
* node.cache();
* node.filters([
* Kinetic.Filters.Blur,
* Kinetic.Filters.Sepia,
* Kinetic.Filters.Invert
* ]); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'visible', 'inherit'); /** * get/set visible attr. Can be "inherit", true, or false. The default is "inherit". * If you need to determine if a node is visible or not * by taking into account its parents, use the isVisible() method * @name visible * @method * @memberof Kinetic.Node.prototype * @param {Boolean|String} visible * @returns {Boolean|String} * @example * // get visible attr
* var visible = node.visible();

* * // make invisible
* node.visible(false);

* * // make visible
* node.visible(true);

* * // make visible according to the parent
* node.visible('inherit'); */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'transformsEnabled', 'all'); /** * get/set transforms that are enabled. Can be "all", "none", or "position". The default * is "all" * @name transformsEnabled * @method * @memberof Kinetic.Node.prototype * @param {String} enabled * @returns {String} * @example * // enable position transform only to improve draw performance
* node.transformsEnabled('position');

* * // enable all transforms
* node.transformsEnabled('all'); */ /** * get/set node size * @name size * @method * @memberof Kinetic.Node.prototype * @param {Object} size * @param {Number} size.width * @param {Number} size.height * @returns {Object} * @example * // get node size
* var size = node.size();
* var x = size.x;
* var y = size.y;

* * // set size
* node.size({
* width: 100,
* height: 200
* }); */ Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'size'); Kinetic.Factory.backCompat(Kinetic.Node, { rotateDeg: 'rotate', setRotationDeg: 'setRotation', getRotationDeg: 'getRotation' }); Kinetic.Collection.mapMethods(Kinetic.Node); })(); ;(function() { /** * Grayscale Filter * @function * @memberof Kinetic.Filters * @param {Object} imageData */ Kinetic.Filters.Grayscale = function(imageData) { var data = imageData.data, len = data.length, i, brightness; for(i = 0; i < len; i += 4) { brightness = 0.34 * data[i] + 0.5 * data[i + 1] + 0.16 * data[i + 2]; // red data[i] = brightness; // green data[i + 1] = brightness; // blue data[i + 2] = brightness; } }; })(); ;(function() { /** * Brighten Filter. * @function * @memberof Kinetic.Filters * @param {Object} imageData */ Kinetic.Filters.Brighten = function(imageData) { var brightness = this.brightness() * 255, data = imageData.data, len = data.length, i; for(i = 0; i < len; i += 4) { // red data[i] += brightness; // green data[i + 1] += brightness; // blue data[i + 2] += brightness; } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'brightness', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set filter brightness. The brightness is a number between -1 and 1.  Positive values * brighten the pixels and negative values darken them. * @name brightness * @method * @memberof Kinetic.Image.prototype * @param {Number} brightness value between -1 and 1 * @returns {Number} */ })(); ;(function() { /** * Invert Filter * @function * @memberof Kinetic.Filters * @param {Object} imageData */ Kinetic.Filters.Invert = function(imageData) { var data = imageData.data, len = data.length, i; for(i = 0; i < len; i += 4) { // red data[i] = 255 - data[i]; // green data[i + 1] = 255 - data[i + 1]; // blue data[i + 2] = 255 - data[i + 2]; } }; })();;/* the Gauss filter master repo: https://github.com/pavelpower/kineticjsGaussFilter/ */ (function() { /* StackBlur - a fast almost Gaussian Blur For Canvas Version: 0.5 Author: Mario Klingemann Contact: mario@quasimondo.com Website: http://www.quasimondo.com/StackBlurForCanvas Twitter: @quasimondo In case you find this class useful - especially in commercial projects - I am not totally unhappy for a small donation to my PayPal account mario@quasimondo.de Or support me on flattr: https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript Copyright (c) 2010 Mario Klingemann 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. */ function BlurStack() { this.r = 0; this.g = 0; this.b = 0; this.a = 0; this.next = null; } var mul_table = [ 512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512, 454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512, 482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456, 437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512, 497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328, 320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456, 446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335, 329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512, 505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405, 399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328, 324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271, 268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456, 451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388, 385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335, 332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292, 289,287,285,282,280,278,275,273,271,269,267,265,263,261,259 ]; var shg_table = [ 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 ]; function filterGaussBlurRGBA( imageData, radius) { var pixels = imageData.data, width = imageData.width, height = imageData.height; var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, a_sum, r_out_sum, g_out_sum, b_out_sum, a_out_sum, r_in_sum, g_in_sum, b_in_sum, a_in_sum, pr, pg, pb, pa, rbs; var div = radius + radius + 1, widthMinus1 = width - 1, heightMinus1 = height - 1, radiusPlus1 = radius + 1, sumFactor = radiusPlus1 * ( radiusPlus1 + 1 ) / 2, stackStart = new BlurStack(), stackEnd = null, stack = stackStart, stackIn = null, stackOut = null, mul_sum = mul_table[radius], shg_sum = shg_table[radius]; for ( i = 1; i < div; i++ ) { stack = stack.next = new BlurStack(); if ( i == radiusPlus1 ){ stackEnd = stack; } } stack.next = stackStart; yw = yi = 0; for ( y = 0; y < height; y++ ) { r_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0; r_out_sum = radiusPlus1 * ( pr = pixels[yi] ); g_out_sum = radiusPlus1 * ( pg = pixels[yi+1] ); b_out_sum = radiusPlus1 * ( pb = pixels[yi+2] ); a_out_sum = radiusPlus1 * ( pa = pixels[yi+3] ); r_sum += sumFactor * pr; g_sum += sumFactor * pg; b_sum += sumFactor * pb; a_sum += sumFactor * pa; stack = stackStart; for( i = 0; i < radiusPlus1; i++ ) { stack.r = pr; stack.g = pg; stack.b = pb; stack.a = pa; stack = stack.next; } for( i = 1; i < radiusPlus1; i++ ) { p = yi + (( widthMinus1 < i ? widthMinus1 : i ) << 2 ); r_sum += ( stack.r = ( pr = pixels[p])) * ( rbs = radiusPlus1 - i ); g_sum += ( stack.g = ( pg = pixels[p+1])) * rbs; b_sum += ( stack.b = ( pb = pixels[p+2])) * rbs; a_sum += ( stack.a = ( pa = pixels[p+3])) * rbs; r_in_sum += pr; g_in_sum += pg; b_in_sum += pb; a_in_sum += pa; stack = stack.next; } stackIn = stackStart; stackOut = stackEnd; for ( x = 0; x < width; x++ ) { pixels[yi+3] = pa = (a_sum * mul_sum) >> shg_sum; if ( pa !== 0 ) { pa = 255 / pa; pixels[yi] = ((r_sum * mul_sum) >> shg_sum) * pa; pixels[yi+1] = ((g_sum * mul_sum) >> shg_sum) * pa; pixels[yi+2] = ((b_sum * mul_sum) >> shg_sum) * pa; } else { pixels[yi] = pixels[yi+1] = pixels[yi+2] = 0; } r_sum -= r_out_sum; g_sum -= g_out_sum; b_sum -= b_out_sum; a_sum -= a_out_sum; r_out_sum -= stackIn.r; g_out_sum -= stackIn.g; b_out_sum -= stackIn.b; a_out_sum -= stackIn.a; p = ( yw + ( ( p = x + radius + 1 ) < widthMinus1 ? p : widthMinus1 ) ) << 2; r_in_sum += ( stackIn.r = pixels[p]); g_in_sum += ( stackIn.g = pixels[p+1]); b_in_sum += ( stackIn.b = pixels[p+2]); a_in_sum += ( stackIn.a = pixels[p+3]); r_sum += r_in_sum; g_sum += g_in_sum; b_sum += b_in_sum; a_sum += a_in_sum; stackIn = stackIn.next; r_out_sum += ( pr = stackOut.r ); g_out_sum += ( pg = stackOut.g ); b_out_sum += ( pb = stackOut.b ); a_out_sum += ( pa = stackOut.a ); r_in_sum -= pr; g_in_sum -= pg; b_in_sum -= pb; a_in_sum -= pa; stackOut = stackOut.next; yi += 4; } yw += width; } for ( x = 0; x < width; x++ ) { g_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0; yi = x << 2; r_out_sum = radiusPlus1 * ( pr = pixels[yi]); g_out_sum = radiusPlus1 * ( pg = pixels[yi+1]); b_out_sum = radiusPlus1 * ( pb = pixels[yi+2]); a_out_sum = radiusPlus1 * ( pa = pixels[yi+3]); r_sum += sumFactor * pr; g_sum += sumFactor * pg; b_sum += sumFactor * pb; a_sum += sumFactor * pa; stack = stackStart; for( i = 0; i < radiusPlus1; i++ ) { stack.r = pr; stack.g = pg; stack.b = pb; stack.a = pa; stack = stack.next; } yp = width; for( i = 1; i <= radius; i++ ) { yi = ( yp + x ) << 2; r_sum += ( stack.r = ( pr = pixels[yi])) * ( rbs = radiusPlus1 - i ); g_sum += ( stack.g = ( pg = pixels[yi+1])) * rbs; b_sum += ( stack.b = ( pb = pixels[yi+2])) * rbs; a_sum += ( stack.a = ( pa = pixels[yi+3])) * rbs; r_in_sum += pr; g_in_sum += pg; b_in_sum += pb; a_in_sum += pa; stack = stack.next; if( i < heightMinus1 ) { yp += width; } } yi = x; stackIn = stackStart; stackOut = stackEnd; for ( y = 0; y < height; y++ ) { p = yi << 2; pixels[p+3] = pa = (a_sum * mul_sum) >> shg_sum; if ( pa > 0 ) { pa = 255 / pa; pixels[p] = ((r_sum * mul_sum) >> shg_sum ) * pa; pixels[p+1] = ((g_sum * mul_sum) >> shg_sum ) * pa; pixels[p+2] = ((b_sum * mul_sum) >> shg_sum ) * pa; } else { pixels[p] = pixels[p+1] = pixels[p+2] = 0; } r_sum -= r_out_sum; g_sum -= g_out_sum; b_sum -= b_out_sum; a_sum -= a_out_sum; r_out_sum -= stackIn.r; g_out_sum -= stackIn.g; b_out_sum -= stackIn.b; a_out_sum -= stackIn.a; p = ( x + (( ( p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1 ) * width )) << 2; r_sum += ( r_in_sum += ( stackIn.r = pixels[p])); g_sum += ( g_in_sum += ( stackIn.g = pixels[p+1])); b_sum += ( b_in_sum += ( stackIn.b = pixels[p+2])); a_sum += ( a_in_sum += ( stackIn.a = pixels[p+3])); stackIn = stackIn.next; r_out_sum += ( pr = stackOut.r ); g_out_sum += ( pg = stackOut.g ); b_out_sum += ( pb = stackOut.b ); a_out_sum += ( pa = stackOut.a ); r_in_sum -= pr; g_in_sum -= pg; b_in_sum -= pb; a_in_sum -= pa; stackOut = stackOut.next; yi += width; } } } /** * Blur Filter * @function * @memberof Kinetic.Filters * @param {Object} imageData */ Kinetic.Filters.Blur = function(imageData) { var radius = Math.round(this.blurRadius()); if (radius > 0) { filterGaussBlurRGBA(imageData, radius); } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'blurRadius', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set blur radius * @name blurRadius * @method * @memberof Kinetic.Node.prototype * @param {Integer} radius * @returns {Integer} */ })();;(function() { function pixelAt(idata, x, y) { var idx = (y * idata.width + x) * 4; var d = []; d.push(idata.data[idx++], idata.data[idx++], idata.data[idx++], idata.data[idx++]); return d; } function rgbDistance(p1, p2) { return Math.sqrt(Math.pow(p1[0] - p2[0], 2) + Math.pow(p1[1] - p2[1], 2) + Math.pow(p1[2] - p2[2], 2)); } function rgbMean(pTab) { var m = [0, 0, 0]; for (var i = 0; i < pTab.length; i++) { m[0] += pTab[i][0]; m[1] += pTab[i][1]; m[2] += pTab[i][2]; } m[0] /= pTab.length; m[1] /= pTab.length; m[2] /= pTab.length; return m; } function backgroundMask(idata, threshold) { var rgbv_no = pixelAt(idata, 0, 0); var rgbv_ne = pixelAt(idata, idata.width - 1, 0); var rgbv_so = pixelAt(idata, 0, idata.height - 1); var rgbv_se = pixelAt(idata, idata.width - 1, idata.height - 1); var thres = threshold || 10; if (rgbDistance(rgbv_no, rgbv_ne) < thres && rgbDistance(rgbv_ne, rgbv_se) < thres && rgbDistance(rgbv_se, rgbv_so) < thres && rgbDistance(rgbv_so, rgbv_no) < thres) { // Mean color var mean = rgbMean([rgbv_ne, rgbv_no, rgbv_se, rgbv_so]); // Mask based on color distance var mask = []; for (var i = 0; i < idata.width * idata.height; i++) { var d = rgbDistance(mean, [idata.data[i * 4], idata.data[i * 4 + 1], idata.data[i * 4 + 2]]); mask[i] = (d < thres) ? 0 : 255; } return mask; } } function applyMask(idata, mask) { for (var i = 0; i < idata.width * idata.height; i++) { idata.data[4 * i + 3] = mask[i]; } } function erodeMask(mask, sw, sh) { var weights = [1, 1, 1, 1, 0, 1, 1, 1, 1]; var side = Math.round(Math.sqrt(weights.length)); var halfSide = Math.floor(side / 2); var maskResult = []; for (var y = 0; y < sh; y++) { for (var x = 0; x < sw; x++) { var so = y * sw + x; var a = 0; for (var cy = 0; cy < side; cy++) { for (var cx = 0; cx < side; cx++) { var scy = y + cy - halfSide; var scx = x + cx - halfSide; if (scy >= 0 && scy < sh && scx >= 0 && scx < sw) { var srcOff = scy * sw + scx; var wt = weights[cy * side + cx]; a += mask[srcOff] * wt; } } } maskResult[so] = (a === 255 * 8) ? 255 : 0; } } return maskResult; } function dilateMask(mask, sw, sh) { var weights = [1, 1, 1, 1, 1, 1, 1, 1, 1]; var side = Math.round(Math.sqrt(weights.length)); var halfSide = Math.floor(side / 2); var maskResult = []; for (var y = 0; y < sh; y++) { for (var x = 0; x < sw; x++) { var so = y * sw + x; var a = 0; for (var cy = 0; cy < side; cy++) { for (var cx = 0; cx < side; cx++) { var scy = y + cy - halfSide; var scx = x + cx - halfSide; if (scy >= 0 && scy < sh && scx >= 0 && scx < sw) { var srcOff = scy * sw + scx; var wt = weights[cy * side + cx]; a += mask[srcOff] * wt; } } } maskResult[so] = (a >= 255 * 4) ? 255 : 0; } } return maskResult; } function smoothEdgeMask(mask, sw, sh) { var weights = [1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9, 1 / 9]; var side = Math.round(Math.sqrt(weights.length)); var halfSide = Math.floor(side / 2); var maskResult = []; for (var y = 0; y < sh; y++) { for (var x = 0; x < sw; x++) { var so = y * sw + x; var a = 0; for (var cy = 0; cy < side; cy++) { for (var cx = 0; cx < side; cx++) { var scy = y + cy - halfSide; var scx = x + cx - halfSide; if (scy >= 0 && scy < sh && scx >= 0 && scx < sw) { var srcOff = scy * sw + scx; var wt = weights[cy * side + cx]; a += mask[srcOff] * wt; } } } maskResult[so] = a; } } return maskResult; } /** * Mask Filter * @function * @memberof Kinetic.Filters * @param {Object} imageData */ Kinetic.Filters.Mask = function(imageData) { // Detect pixels close to the background color var threshold = this.threshold(), mask = backgroundMask(imageData, threshold); if (mask) { // Erode mask = erodeMask(mask, imageData.width, imageData.height); // Dilate mask = dilateMask(mask, imageData.width, imageData.height); // Gradient mask = smoothEdgeMask(mask, imageData.width, imageData.height); // Apply mask applyMask(imageData, mask); // todo : Update hit region function according to mask } return imageData; }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'threshold', 0, null, Kinetic.Factory.afterSetFilter); })(); ;(function () { /** * RGB Filter * @function * @memberof Kinetic.Filters * @param {Object} imageData * @author ippo615 */ Kinetic.Filters.RGB = function (imageData) { var data = imageData.data, nPixels = data.length, red = this.red(), green = this.green(), blue = this.blue(), i, brightness; for (i = 0; i < nPixels; i += 4) { brightness = (0.34 * data[i] + 0.5 * data[i + 1] + 0.16 * data[i + 2])/255; data[i ] = brightness*red; // r data[i + 1] = brightness*green; // g data[i + 2] = brightness*blue; // b data[i + 3] = data[i + 3]; // alpha } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'red', 0, function(val) { this._filterUpToDate = false; if (val > 255) { return 255; } else if (val < 0) { return 0; } else { return Math.round(val); } }); /** * get/set filter red value * @name red * @method * @memberof Kinetic.Node.prototype * @param {Integer} red value between 0 and 255 * @returns {Integer} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'green', 0, function(val) { this._filterUpToDate = false; if (val > 255) { return 255; } else if (val < 0) { return 0; } else { return Math.round(val); } }); /** * get/set filter green value * @name green * @method * @memberof Kinetic.Node.prototype * @param {Integer} green value between 0 and 255 * @returns {Integer} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'blue', 0, Kinetic.Validators.RGBComponent, Kinetic.Factory.afterSetFilter); /** * get/set filter blue value * @name blue * @method * @memberof Kinetic.Node.prototype * @param {Integer} blue value between 0 and 255 * @returns {Integer} */ })(); ;(function () { /** * HSV Filter. Adjusts the hue, saturation and value * @function * @memberof Kinetic.Filters * @param {Object} imageData * @author ippo615 */ Kinetic.Filters.HSV = function (imageData) { var data = imageData.data, nPixels = data.length, v = Math.pow(2,this.value()), s = Math.pow(2,this.saturation()), h = Math.abs((this.hue()) + 360) % 360, i; // Basis for the technique used: // http://beesbuzz.biz/code/hsv_color_transforms.php // V is the value multiplier (1 for none, 2 for double, 0.5 for half) // S is the saturation multiplier (1 for none, 2 for double, 0.5 for half) // H is the hue shift in degrees (0 to 360) // vsu = V*S*cos(H*PI/180); // vsw = V*S*sin(H*PI/180); //[ .299V+.701vsu+.168vsw .587V-.587vsu+.330vsw .114V-.114vsu-.497vsw ] [R] //[ .299V-.299vsu-.328vsw .587V+.413vsu+.035vsw .114V-.114vsu+.292vsw ]*[G] //[ .299V-.300vsu+1.25vsw .587V-.588vsu-1.05vsw .114V+.886vsu-.203vsw ] [B] // Precompute the values in the matrix: var vsu = v*s*Math.cos(h*Math.PI/180), vsw = v*s*Math.sin(h*Math.PI/180); // (result spot)(source spot) var rr = 0.299*v+0.701*vsu+0.167*vsw, rg = 0.587*v-0.587*vsu+0.330*vsw, rb = 0.114*v-0.114*vsu-0.497*vsw; var gr = 0.299*v-0.299*vsu-0.328*vsw, gg = 0.587*v+0.413*vsu+0.035*vsw, gb = 0.114*v-0.114*vsu+0.293*vsw; var br = 0.299*v-0.300*vsu+1.250*vsw, bg = 0.587*v-0.586*vsu-1.050*vsw, bb = 0.114*v+0.886*vsu-0.200*vsw; var r,g,b,a; for (i = 0; i < nPixels; i += 4) { r = data[i+0]; g = data[i+1]; b = data[i+2]; a = data[i+3]; data[i+0] = rr*r + rg*g + rb*b; data[i+1] = gr*r + gg*g + gb*b; data[i+2] = br*r + bg*g + bb*b; data[i+3] = a; // alpha } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'hue', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set hsv hue in degrees * @name hue * @method * @memberof Kinetic.Node.prototype * @param {Number} hue value between 0 and 359 * @returns {Number} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'saturation', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set hsv saturation * @name saturation * @method * @memberof Kinetic.Node.prototype * @param {Number} saturation 0 is no change, -1.0 halves the saturation, 1.0 doubles, etc.. * @returns {Number} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'value', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set hsv value * @name value * @method * @memberof Kinetic.Node.prototype * @param {Number} value 0 is no change, -1.0 halves the value, 1.0 doubles, etc.. * @returns {Number} */ })(); ;(function () { Kinetic.Factory.addGetterSetter(Kinetic.Node, 'hue', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set hsv hue in degrees * @name hue * @method * @memberof Kinetic.Node.prototype * @param {Number} hue value between 0 and 359 * @returns {Number} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'saturation', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set hsv saturation * @name saturation * @method * @memberof Kinetic.Node.prototype * @param {Number} saturation 0 is no change, -1.0 halves the saturation, 1.0 doubles, etc.. * @returns {Number} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'luminance', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set hsl luminance * @name value * @method * @memberof Kinetic.Node.prototype * @param {Number} value 0 is no change, -1.0 halves the value, 1.0 doubles, etc.. * @returns {Number} */ /** * HSL Filter. Adjusts the hue, saturation and luminance (or lightness) * @function * @memberof Kinetic.Filters * @param {Object} imageData * @author ippo615 */ Kinetic.Filters.HSL = function (imageData) { var data = imageData.data, nPixels = data.length, v = 1, s = Math.pow(2,this.saturation()), h = Math.abs((this.hue()) + 360) % 360, l = this.luminance()*127, i; // Basis for the technique used: // http://beesbuzz.biz/code/hsv_color_transforms.php // V is the value multiplier (1 for none, 2 for double, 0.5 for half) // S is the saturation multiplier (1 for none, 2 for double, 0.5 for half) // H is the hue shift in degrees (0 to 360) // vsu = V*S*cos(H*PI/180); // vsw = V*S*sin(H*PI/180); //[ .299V+.701vsu+.168vsw .587V-.587vsu+.330vsw .114V-.114vsu-.497vsw ] [R] //[ .299V-.299vsu-.328vsw .587V+.413vsu+.035vsw .114V-.114vsu+.292vsw ]*[G] //[ .299V-.300vsu+1.25vsw .587V-.588vsu-1.05vsw .114V+.886vsu-.203vsw ] [B] // Precompute the values in the matrix: var vsu = v*s*Math.cos(h*Math.PI/180), vsw = v*s*Math.sin(h*Math.PI/180); // (result spot)(source spot) var rr = 0.299*v+0.701*vsu+0.167*vsw, rg = 0.587*v-0.587*vsu+0.330*vsw, rb = 0.114*v-0.114*vsu-0.497*vsw; var gr = 0.299*v-0.299*vsu-0.328*vsw, gg = 0.587*v+0.413*vsu+0.035*vsw, gb = 0.114*v-0.114*vsu+0.293*vsw; var br = 0.299*v-0.300*vsu+1.250*vsw, bg = 0.587*v-0.586*vsu-1.050*vsw, bb = 0.114*v+0.886*vsu-0.200*vsw; var r,g,b,a; for (i = 0; i < nPixels; i += 4) { r = data[i+0]; g = data[i+1]; b = data[i+2]; a = data[i+3]; data[i+0] = rr*r + rg*g + rb*b + l; data[i+1] = gr*r + gg*g + gb*b + l; data[i+2] = br*r + bg*g + bb*b + l; data[i+3] = a; // alpha } }; })(); ;(function () { /** * Emboss Filter * @function * @memberof Kinetic.Filters * @param {Object} imageData * Pixastic Lib - Emboss filter - v0.1.0 * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ * License: [http://www.pixastic.com/lib/license.txt] */ Kinetic.Filters.Emboss = function (imageData) { // pixastic strength is between 0 and 10. I want it between 0 and 1 // pixastic greyLevel is between 0 and 255. I want it between 0 and 1. Also, // a max value of greyLevel yields a white emboss, and the min value yields a black // emboss. Therefore, I changed greyLevel to whiteLevel var strength = this.embossStrength() * 10, greyLevel = this.embossWhiteLevel() * 255, direction = this.embossDirection(), blend = this.embossBlend(), dirY = 0, dirX = 0, data = imageData.data, w = imageData.width, h = imageData.height, w4 = w*4, y = h; switch (direction) { case 'top-left': dirY = -1; dirX = -1; break; case 'top': dirY = -1; dirX = 0; break; case 'top-right': dirY = -1; dirX = 1; break; case 'right': dirY = 0; dirX = 1; break; case 'bottom-right': dirY = 1; dirX = 1; break; case 'bottom': dirY = 1; dirX = 0; break; case 'bottom-left': dirY = 1; dirX = -1; break; case 'left': dirY = 0; dirX = -1; break; } do { var offsetY = (y-1)*w4; var otherY = dirY; if (y + otherY < 1){ otherY = 0; } if (y + otherY > h) { otherY = 0; } var offsetYOther = (y-1+otherY)*w*4; var x = w; do { var offset = offsetY + (x-1)*4; var otherX = dirX; if (x + otherX < 1){ otherX = 0; } if (x + otherX > w) { otherX = 0; } var offsetOther = offsetYOther + (x-1+otherX)*4; var dR = data[offset] - data[offsetOther]; var dG = data[offset+1] - data[offsetOther+1]; var dB = data[offset+2] - data[offsetOther+2]; var dif = dR; var absDif = dif > 0 ? dif : -dif; var absG = dG > 0 ? dG : -dG; var absB = dB > 0 ? dB : -dB; if (absG > absDif) { dif = dG; } if (absB > absDif) { dif = dB; } dif *= strength; if (blend) { var r = data[offset] + dif; var g = data[offset+1] + dif; var b = data[offset+2] + dif; data[offset] = (r > 255) ? 255 : (r < 0 ? 0 : r); data[offset+1] = (g > 255) ? 255 : (g < 0 ? 0 : g); data[offset+2] = (b > 255) ? 255 : (b < 0 ? 0 : b); } else { var grey = greyLevel - dif; if (grey < 0) { grey = 0; } else if (grey > 255) { grey = 255; } data[offset] = data[offset+1] = data[offset+2] = grey; } } while (--x); } while (--y); }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'embossStrength', 0.5, null, Kinetic.Factory.afterSetFilter); /** * get/set emboss strength * @name embossStrength * @method * @memberof Kinetic.Node.prototype * @param {Number} level between 0 and 1. Default is 0.5 * @returns {Number} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'embossWhiteLevel', 0.5, null, Kinetic.Factory.afterSetFilter); /** * get/set emboss white level * @name embossWhiteLevel * @method * @memberof Kinetic.Node.prototype * @param {Number} embossWhiteLevel between 0 and 1. Default is 0.5 * @returns {Number} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'embossDirection', 'top-left', null, Kinetic.Factory.afterSetFilter); /** * get/set emboss direction * @name embossDirection * @method * @memberof Kinetic.Node.prototype * @param {String} embossDirection can be top-left, top, top-right, right, bottom-right, bottom, bottom-left or left * The default is top-left * @returns {String} */ Kinetic.Factory.addGetterSetter(Kinetic.Node, 'embossBlend', false, null, Kinetic.Factory.afterSetFilter); /** * get/set emboss blend * @name embossBlend * @method * @memberof Kinetic.Node.prototype * @param {Boolean} embossBlend * @returns {Boolean} */ })(); ;(function () { function remap(fromValue, fromMin, fromMax, toMin, toMax) { // Compute the range of the data var fromRange = fromMax - fromMin, toRange = toMax - toMin, toValue; // If either range is 0, then the value can only be mapped to 1 value if (fromRange === 0) { return toMin + toRange / 2; } if (toRange === 0) { return toMin; } // (1) untranslate, (2) unscale, (3) rescale, (4) retranslate toValue = (fromValue - fromMin) / fromRange; toValue = (toRange * toValue) + toMin; return toValue; } /** * Enhance Filter. Adjusts the colors so that they span the widest * possible range (ie 0-255). Performs w*h pixel reads and w*h pixel * writes. * @function * @memberof Kinetic.Filters * @param {Object} imageData * @author ippo615 */ Kinetic.Filters.Enhance = function (imageData) { var data = imageData.data, nSubPixels = data.length, rMin = data[0], rMax = rMin, r, gMin = data[1], gMax = gMin, g, bMin = data[2], bMax = bMin, b, aMin = data[3], aMax = aMin, i; // If we are not enhancing anything - don't do any computation var enhanceAmount = this.enhance(); if( enhanceAmount === 0 ){ return; } // 1st Pass - find the min and max for each channel: for (i = 0; i < nSubPixels; i += 4) { r = data[i + 0]; if (r < rMin) { rMin = r; } else if (r > rMax) { rMax = r; } g = data[i + 1]; if (g < gMin) { gMin = g; } else if (g > gMax) { gMax = g; } b = data[i + 2]; if (b < bMin) { bMin = b; } else if (b > bMax) { bMax = b; } //a = data[i + 3]; //if (a < aMin) { aMin = a; } else //if (a > aMax) { aMax = a; } } // If there is only 1 level - don't remap if( rMax === rMin ){ rMax = 255; rMin = 0; } if( gMax === gMin ){ gMax = 255; gMin = 0; } if( bMax === bMin ){ bMax = 255; bMin = 0; } if( aMax === aMin ){ aMax = 255; aMin = 0; } var rMid, rGoalMax,rGoalMin, gMid, gGoalMax,gGoalMin, bMid, bGoalMax,aGoalMin, aMid, aGoalMax,bGoalMin; // If the enhancement is positive - stretch the histogram if ( enhanceAmount > 0 ){ rGoalMax = rMax + enhanceAmount*(255-rMax); rGoalMin = rMin - enhanceAmount*(rMin-0); gGoalMax = gMax + enhanceAmount*(255-gMax); gGoalMin = gMin - enhanceAmount*(gMin-0); bGoalMax = bMax + enhanceAmount*(255-bMax); bGoalMin = bMin - enhanceAmount*(bMin-0); aGoalMax = aMax + enhanceAmount*(255-aMax); aGoalMin = aMin - enhanceAmount*(aMin-0); // If the enhancement is negative - compress the histogram } else { rMid = (rMax + rMin)*0.5; rGoalMax = rMax + enhanceAmount*(rMax-rMid); rGoalMin = rMin + enhanceAmount*(rMin-rMid); gMid = (gMax + gMin)*0.5; gGoalMax = gMax + enhanceAmount*(gMax-gMid); gGoalMin = gMin + enhanceAmount*(gMin-gMid); bMid = (bMax + bMin)*0.5; bGoalMax = bMax + enhanceAmount*(bMax-bMid); bGoalMin = bMin + enhanceAmount*(bMin-bMid); aMid = (aMax + aMin)*0.5; aGoalMax = aMax + enhanceAmount*(aMax-aMid); aGoalMin = aMin + enhanceAmount*(aMin-aMid); } // Pass 2 - remap everything, except the alpha for (i = 0; i < nSubPixels; i += 4) { data[i + 0] = remap(data[i + 0], rMin, rMax, rGoalMin, rGoalMax); data[i + 1] = remap(data[i + 1], gMin, gMax, gGoalMin, gGoalMax); data[i + 2] = remap(data[i + 2], bMin, bMax, bGoalMin, bGoalMax); //data[i + 3] = remap(data[i + 3], aMin, aMax, aGoalMin, aGoalMax); } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'enhance', 0, null, Kinetic.Factory.afterSetFilter); /** * get/set enhance * @name enhance * @method * @memberof Kinetic.Node.prototype * @param {Float} amount * @returns {Float} */ })(); ;(function () { /** * Posterize Filter. Adjusts the channels so that there are no more * than n different values for that channel. This is also applied * to the alpha channel. * @function * @author ippo615 * @memberof Kinetic.Filters * @param {Object} imageData */ Kinetic.Filters.Posterize = function (imageData) { // level must be between 1 and 255 var levels = Math.round(this.levels() * 254) + 1, data = imageData.data, len = data.length, scale = (255 / levels), i; for (i = 0; i < len; i += 1) { data[i] = Math.floor(data[i] / scale) * scale; } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'levels', 0.5, null, Kinetic.Factory.afterSetFilter); /** * get/set levels. Must be a number between 0 and 1 * @name levels * @method * @memberof Kinetic.Node.prototype * @param {Number} level between 0 and 1 * @returns {Number} */ })();;(function () { /** * Noise Filter. Randomly adds or substracts to the color channels * @function * @memberof Kinetic.Filters * @param {Object} imagedata * @author ippo615 */ Kinetic.Filters.Noise = function (imageData) { var amount = this.noise() * 255, data = imageData.data, nPixels = data.length, half = amount / 2, i; for (i = 0; i < nPixels; i += 4) { data[i + 0] += half - 2 * half * Math.random(); data[i + 1] += half - 2 * half * Math.random(); data[i + 2] += half - 2 * half * Math.random(); } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'noise', 0.2, null, Kinetic.Factory.afterSetFilter); /** * get/set noise amount. Must be a value between 0 and 1 * @name noise * @method * @memberof Kinetic.Node.prototype * @param {Number} noise * @returns {Number} */ })(); ;(function () { /** * Pixelate Filter. Averages groups of pixels and redraws * them as larger pixels * @function * @memberof Kinetic.Filters * @param {Object} imageData * @author ippo615 */ Kinetic.Filters.Pixelate = function (imageData) { var pixelSize = Math.ceil(this.pixelSize()), width = imageData.width, height = imageData.height, x, y, i, //pixelsPerBin = pixelSize * pixelSize, red, green, blue, alpha, nBinsX = Math.ceil(width / pixelSize), nBinsY = Math.ceil(height / pixelSize), xBinStart, xBinEnd, yBinStart, yBinEnd, xBin, yBin, pixelsInBin; imageData = imageData.data; for (xBin = 0; xBin < nBinsX; xBin += 1) { for (yBin = 0; yBin < nBinsY; yBin += 1) { // Initialize the color accumlators to 0 red = 0; green = 0; blue = 0; alpha = 0; // Determine which pixels are included in this bin xBinStart = xBin * pixelSize; xBinEnd = xBinStart + pixelSize; yBinStart = yBin * pixelSize; yBinEnd = yBinStart + pixelSize; // Add all of the pixels to this bin! pixelsInBin = 0; for (x = xBinStart; x < xBinEnd; x += 1) { if( x >= width ){ continue; } for (y = yBinStart; y < yBinEnd; y += 1) { if( y >= height ){ continue; } i = (width * y + x) * 4; red += imageData[i + 0]; green += imageData[i + 1]; blue += imageData[i + 2]; alpha += imageData[i + 3]; pixelsInBin += 1; } } // Make sure the channels are between 0-255 red = red / pixelsInBin; green = green / pixelsInBin; blue = blue / pixelsInBin; // Draw this bin for (x = xBinStart; x < xBinEnd; x += 1) { if( x >= width ){ continue; } for (y = yBinStart; y < yBinEnd; y += 1) { if( y >= height ){ continue; } i = (width * y + x) * 4; imageData[i + 0] = red; imageData[i + 1] = green; imageData[i + 2] = blue; imageData[i + 3] = alpha; } } } } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'pixelSize', 8, null, Kinetic.Factory.afterSetFilter); /** * get/set pixel size * @name pixelSize * @method * @memberof Kinetic.Node.prototype * @param {Integer} pixelSize * @returns {Integer} */ })();;(function () { /** * Threshold Filter. Pushes any value above the mid point to * the max and any value below the mid point to the min. * This affects the alpha channel. * @function * @memberof Kinetic.Filters * @param {Object} imageData * @author ippo615 */ Kinetic.Filters.Threshold = function (imageData) { var level = this.threshold() * 255, data = imageData.data, len = data.length, i; for (i = 0; i < len; i += 1) { data[i] = data[i] < level ? 0 : 255; } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'threshold', 0.5, null, Kinetic.Factory.afterSetFilter); /** * get/set threshold. Must be a value between 0 and 1 * @name threshold * @method * @memberof Kinetic.Node.prototype * @param {Number} threshold * @returns {Number} */ })();;(function() { /** * Sepia Filter * Based on: Pixastic Lib - Sepia filter - v0.1.0 * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ * @function * @memberof Kinetic.Filters * @param {Object} imageData * @author Jacob Seidelin * @license MPL v1.1 [http://www.pixastic.com/lib/license.txt] */ Kinetic.Filters.Sepia = function (imageData) { var data = imageData.data, w = imageData.width, y = imageData.height, w4 = w*4, offsetY, x, offset, or, og, ob, r, g, b; do { offsetY = (y-1)*w4; x = w; do { offset = offsetY + (x-1)*4; or = data[offset]; og = data[offset+1]; ob = data[offset+2]; r = or * 0.393 + og * 0.769 + ob * 0.189; g = or * 0.349 + og * 0.686 + ob * 0.168; b = or * 0.272 + og * 0.534 + ob * 0.131; data[offset] = r > 255 ? 255 : r; data[offset+1] = g > 255 ? 255 : g; data[offset+2] = b > 255 ? 255 : b; data[offset+3] = data[offset+3]; } while (--x); } while (--y); }; })(); ;(function () { /** * Solarize Filter * @function * @memberof Kinetic.Filters * @param {Object} imageData * Pixastic Lib - Solarize filter - v0.1.0 * Copyright (c) 2008 Jacob Seidelin, jseidelin@nihilogic.dk, http://blog.nihilogic.dk/ * License: [http://www.pixastic.com/lib/license.txt] */ Kinetic.Filters.Solarize = function (imageData) { var data = imageData.data, w = imageData.width, h = imageData.height, w4 = w*4, y = h; do { var offsetY = (y-1)*w4; var x = w; do { var offset = offsetY + (x-1)*4; var r = data[offset]; var g = data[offset+1]; var b = data[offset+2]; if (r > 127) { r = 255 - r; } if (g > 127) { g = 255 - g; } if (b > 127) { b = 255 - b; } data[offset] = r; data[offset+1] = g; data[offset+2] = b; } while (--x); } while (--y); }; })(); ;/*jshint newcap:false */ (function () { /* * ToPolar Filter. Converts image data to polar coordinates. Performs * w*h*4 pixel reads and w*h pixel writes. The r axis is placed along * what would be the y axis and the theta axis along the x axis. * @function * @author ippo615 * @memberof Kinetic.Filters * @param {ImageData} src, the source image data (what will be transformed) * @param {ImageData} dst, the destination image data (where it will be saved) * @param {Object} opt * @param {Number} [opt.polarCenterX] horizontal location for the center of the circle, * default is in the middle * @param {Number} [opt.polarCenterY] vertical location for the center of the circle, * default is in the middle */ var ToPolar = function(src,dst,opt){ var srcPixels = src.data, dstPixels = dst.data, xSize = src.width, ySize = src.height, xMid = opt.polarCenterX || xSize/2, yMid = opt.polarCenterY || ySize/2, i, x, y, r=0,g=0,b=0,a=0; // Find the largest radius var rad, rMax = Math.sqrt( xMid*xMid + yMid*yMid ); x = xSize - xMid; y = ySize - yMid; rad = Math.sqrt( x*x + y*y ); rMax = (rad > rMax)?rad:rMax; // We'll be uisng y as the radius, and x as the angle (theta=t) var rSize = ySize, tSize = xSize, radius, theta; // We want to cover all angles (0-360) and we need to convert to // radians (*PI/180) var conversion = 360/tSize*Math.PI/180, sin, cos; // var x1, x2, x1i, x2i, y1, y2, y1i, y2i, scale; for( theta=0; theta rMax)?rad:rMax; // We'll be uisng x as the radius, and y as the angle (theta=t) var rSize = ySize, tSize = xSize, radius, theta, phaseShift = opt.polarRotation || 0; // We need to convert to degrees and we need to make sure // it's between (0-360) // var conversion = tSize/360*180/Math.PI; //var conversion = tSize/360*180/Math.PI; var x1, y1; for( x=0; x xSize ){ xStart = sectionSize; xEnd = 0; xDelta = -1; } for( y=0; y * var velocity = 50;

* * var anim = new Kinetic.Animation(function(frame) {
* var dist = velocity * (frame.timeDiff / 1000);
* node.move(dist, 0);
* }, layer);

* * anim.start(); */ Kinetic.Animation = function(func, layers) { var Anim = Kinetic.Animation; this.func = func; this.setLayers(layers); this.id = Anim.animIdCounter++; this.frame = { time: 0, timeDiff: 0, lastTime: now() }; }; /* * Animation methods */ Kinetic.Animation.prototype = { /** * set layers to be redrawn on each animation frame * @method * @memberof Kinetic.Animation.prototype * @param {Kinetic.Layer|Array} [layers] layer(s) to be redrawn.  Can be a layer, an array of layers, or null. Not specifying a node will result in no redraw. */ setLayers: function(layers) { var lays = []; // if passing in no layers if (!layers) { lays = []; } // if passing in an array of Layers // NOTE: layers could be an array or Kinetic.Collection. for simplicity, I'm just inspecting // the length property to check for both cases else if (layers.length > 0) { lays = layers; } // if passing in a Layer else { lays = [layers]; } this.layers = lays; }, /** * get layers * @method * @memberof Kinetic.Animation.prototype */ getLayers: function() { return this.layers; }, /** * add layer. Returns true if the layer was added, and false if it was not * @method * @memberof Kinetic.Animation.prototype * @param {Kinetic.Layer} layer */ addLayer: function(layer) { var layers = this.layers, len, n; if (layers) { len = layers.length; // don't add the layer if it already exists for (n = 0; n < len; n++) { if (layers[n]._id === layer._id) { return false; } } } else { this.layers = []; } this.layers.push(layer); return true; }, /** * determine if animation is running or not. returns true or false * @method * @memberof Kinetic.Animation.prototype */ isRunning: function() { var a = Kinetic.Animation, animations = a.animations, len = animations.length, n; for(n = 0; n < len; n++) { if(animations[n].id === this.id) { return true; } } return false; }, /** * start animation * @method * @memberof Kinetic.Animation.prototype */ start: function() { var Anim = Kinetic.Animation; this.stop(); this.frame.timeDiff = 0; this.frame.lastTime = now(); Anim._addAnimation(this); }, /** * stop animation * @method * @memberof Kinetic.Animation.prototype */ stop: function() { Kinetic.Animation._removeAnimation(this); }, _updateFrameObject: function(time) { this.frame.timeDiff = time - this.frame.lastTime; this.frame.lastTime = time; this.frame.time += this.frame.timeDiff; this.frame.frameRate = 1000 / this.frame.timeDiff; } }; Kinetic.Animation.animations = []; Kinetic.Animation.animIdCounter = 0; Kinetic.Animation.animRunning = false; Kinetic.Animation._addAnimation = function(anim) { this.animations.push(anim); this._handleAnimation(); }; Kinetic.Animation._removeAnimation = function(anim) { var id = anim.id, animations = this.animations, len = animations.length, n; for(n = 0; n < len; n++) { if(animations[n].id === id) { this.animations.splice(n, 1); break; } } }; Kinetic.Animation._runFrames = function() { var layerHash = {}, animations = this.animations, anim, layers, func, n, i, layersLen, layer, key; /* * loop through all animations and execute animation * function. if the animation object has specified node, * we can add the node to the nodes hash to eliminate * drawing the same node multiple times. The node property * can be the stage itself or a layer */ /* * WARNING: don't cache animations.length because it could change while * the for loop is running, causing a JS error */ for(n = 0; n < animations.length; n++) { anim = animations[n]; layers = anim.layers; func = anim.func; anim._updateFrameObject(now()); layersLen = layers.length; for (i=0; i BATCH_DRAW_STOP_TIME_DIFF) { that.batchAnim.stop(); } }, this); } this.lastBatchDrawTime = now(); if (!this.batchAnim.isRunning()) { this.draw(); this.batchAnim.start(); } }; /** * batch draw * @method * @memberof Kinetic.Stage.prototype */ Kinetic.Stage.prototype.batchDraw = function() { this.getChildren().each(function(layer) { layer.batchDraw(); }); }; })((1,eval)('this'));;(function() { var blacklist = { node: 1, duration: 1, easing: 1, onFinish: 1, yoyo: 1 }, PAUSED = 1, PLAYING = 2, REVERSING = 3, idCounter = 0; /** * Tween constructor. Tweens enable you to animate a node between the current state and a new state. * You can play, pause, reverse, seek, reset, and finish tweens. By default, tweens are animated using * a linear easing. For more tweening options, check out {@link Kinetic.Easings} * @constructor * @memberof Kinetic * @example * // instantiate new tween which fully rotates a node in 1 second * var tween = new Kinetic.Tween({
* node: node,
* rotationDeg: 360,
* duration: 1,
* easing: Kinetic.Easings.EaseInOut
* });

* * // play tween
* tween.play();

* * // pause tween
* tween.pause(); */ Kinetic.Tween = function(config) { var that = this, node = config.node, nodeId = node._id, duration = config.duration || 1, easing = config.easing || Kinetic.Easings.Linear, yoyo = !!config.yoyo, key; this.node = node; this._id = idCounter++; this.anim = new Kinetic.Animation(function() { that.tween.onEnterFrame(); }, node.getLayer()); this.tween = new Tween(key, function(i) { that._tweenFunc(i); }, easing, 0, 1, duration * 1000, yoyo); this._addListeners(); // init attrs map if (!Kinetic.Tween.attrs[nodeId]) { Kinetic.Tween.attrs[nodeId] = {}; } if (!Kinetic.Tween.attrs[nodeId][this._id]) { Kinetic.Tween.attrs[nodeId][this._id] = {}; } // init tweens map if (!Kinetic.Tween.tweens[nodeId]) { Kinetic.Tween.tweens[nodeId] = {}; } for (key in config) { if (blacklist[key] === undefined) { this._addAttr(key, config[key]); } } this.reset(); // callbacks this.onFinish = config.onFinish; this.onReset = config.onReset; }; // start/diff object = attrs.nodeId.tweenId.attr Kinetic.Tween.attrs = {}; // tweenId = tweens.nodeId.attr Kinetic.Tween.tweens = {}; Kinetic.Tween.prototype = { _addAttr: function(key, end) { var node = this.node, nodeId = node._id, start, diff, tweenId, n, len; // remove conflict from tween map if it exists tweenId = Kinetic.Tween.tweens[nodeId][key]; if (tweenId) { delete Kinetic.Tween.attrs[nodeId][tweenId][key]; } // add to tween map start = node.getAttr(key); if (Kinetic.Util._isArray(end)) { diff = []; len = end.length; for (n=0; n this.duration) { if(this.yoyo) { this._time = this.duration; this.reverse(); } else { this.finish(); } } else if(t < 0) { if(this.yoyo) { this._time = 0; this.play(); } else { this.reset(); } } else { this._time = t; this.update(); } }, getTime: function() { return this._time; }, setPosition: function(p) { this.prevPos = this._pos; this.propFunc(p); this._pos = p; }, getPosition: function(t) { if(t === undefined) { t = this._time; } return this.func(t, this.begin, this._change, this.duration); }, play: function() { this.state = PLAYING; this._startTime = this.getTimer() - this._time; this.onEnterFrame(); this.fire('onPlay'); }, reverse: function() { this.state = REVERSING; this._time = this.duration - this._time; this._startTime = this.getTimer() - this._time; this.onEnterFrame(); this.fire('onReverse'); }, seek: function(t) { this.pause(); this._time = t; this.update(); this.fire('onSeek'); }, reset: function() { this.pause(); this._time = 0; this.update(); this.fire('onReset'); }, finish: function() { this.pause(); this._time = this.duration; this.update(); this.fire('onFinish'); }, update: function() { this.setPosition(this.getPosition(this._time)); }, onEnterFrame: function() { var t = this.getTimer() - this._startTime; if(this.state === PLAYING) { this.setTime(t); } else if (this.state === REVERSING) { this.setTime(this.duration - t); } }, pause: function() { this.state = PAUSED; this.fire('onPause'); }, getTimer: function() { return new Date().getTime(); } }; /* * These eases were ported from an Adobe Flash tweening library to JavaScript * by Xaric */ /** * @namespace Easings * @memberof Kinetic */ Kinetic.Easings = { /** * back ease in * @function * @memberof Kinetic.Easings */ 'BackEaseIn': function(t, b, c, d) { var s = 1.70158; return c * (t /= d) * t * ((s + 1) * t - s) + b; }, /** * back ease out * @function * @memberof Kinetic.Easings */ 'BackEaseOut': function(t, b, c, d) { var s = 1.70158; return c * (( t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; }, /** * back ease in out * @function * @memberof Kinetic.Easings */ 'BackEaseInOut': function(t, b, c, d) { var s = 1.70158; if((t /= d / 2) < 1) { return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b; } return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; }, /** * elastic ease in * @function * @memberof Kinetic.Easings */ 'ElasticEaseIn': function(t, b, c, d, a, p) { // added s = 0 var s = 0; if(t === 0) { return b; } if((t /= d) == 1) { return b + c; } if(!p) { p = d * 0.3; } if(!a || a < Math.abs(c)) { a = c; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(c / a); } return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; }, /** * elastic ease out * @function * @memberof Kinetic.Easings */ 'ElasticEaseOut': function(t, b, c, d, a, p) { // added s = 0 var s = 0; if(t === 0) { return b; } if((t /= d) == 1) { return b + c; } if(!p) { p = d * 0.3; } if(!a || a < Math.abs(c)) { a = c; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(c / a); } return (a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b); }, /** * elastic ease in out * @function * @memberof Kinetic.Easings */ 'ElasticEaseInOut': function(t, b, c, d, a, p) { // added s = 0 var s = 0; if(t === 0) { return b; } if((t /= d / 2) == 2) { return b + c; } if(!p) { p = d * (0.3 * 1.5); } if(!a || a < Math.abs(c)) { a = c; s = p / 4; } else { s = p / (2 * Math.PI) * Math.asin(c / a); } if(t < 1) { return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; } return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * 0.5 + c + b; }, /** * bounce ease out * @function * @memberof Kinetic.Easings */ 'BounceEaseOut': function(t, b, c, d) { if((t /= d) < (1 / 2.75)) { return c * (7.5625 * t * t) + b; } else if(t < (2 / 2.75)) { return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b; } else if(t < (2.5 / 2.75)) { return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b; } else { return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b; } }, /** * bounce ease in * @function * @memberof Kinetic.Easings */ 'BounceEaseIn': function(t, b, c, d) { return c - Kinetic.Easings.BounceEaseOut(d - t, 0, c, d) + b; }, /** * bounce ease in out * @function * @memberof Kinetic.Easings */ 'BounceEaseInOut': function(t, b, c, d) { if(t < d / 2) { return Kinetic.Easings.BounceEaseIn(t * 2, 0, c, d) * 0.5 + b; } else { return Kinetic.Easings.BounceEaseOut(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b; } }, /** * ease in * @function * @memberof Kinetic.Easings */ 'EaseIn': function(t, b, c, d) { return c * (t /= d) * t + b; }, /** * ease out * @function * @memberof Kinetic.Easings */ 'EaseOut': function(t, b, c, d) { return -c * (t /= d) * (t - 2) + b; }, /** * ease in out * @function * @memberof Kinetic.Easings */ 'EaseInOut': function(t, b, c, d) { if((t /= d / 2) < 1) { return c / 2 * t * t + b; } return -c / 2 * ((--t) * (t - 2) - 1) + b; }, /** * strong ease in * @function * @memberof Kinetic.Easings */ 'StrongEaseIn': function(t, b, c, d) { return c * (t /= d) * t * t * t * t + b; }, /** * strong ease out * @function * @memberof Kinetic.Easings */ 'StrongEaseOut': function(t, b, c, d) { return c * (( t = t / d - 1) * t * t * t * t + 1) + b; }, /** * strong ease in out * @function * @memberof Kinetic.Easings */ 'StrongEaseInOut': function(t, b, c, d) { if((t /= d / 2) < 1) { return c / 2 * t * t * t * t * t + b; } return c / 2 * ((t -= 2) * t * t * t * t + 2) + b; }, /** * linear * @function * @memberof Kinetic.Easings */ 'Linear': function(t, b, c, d) { return c * t / d + b; } }; })(); ;(function() { Kinetic.DD = { // properties anim: new Kinetic.Animation(), isDragging: false, offset: { x: 0, y: 0 }, node: null, // methods _drag: function(evt) { var dd = Kinetic.DD, node = dd.node; if(node) { if(!dd.isDragging) { var pos = node.getStage().getPointerPosition(); var dragDistance = node.dragDistance(); var distance = Math.max( Math.abs(pos.x - dd.startPointerPos.x), Math.abs(pos.y - dd.startPointerPos.y) ); if (distance < dragDistance) { return; } } node._setDragPosition(evt); if(!dd.isDragging) { dd.isDragging = true; node.fire('dragstart', { type : 'dragstart', target : node, evt : evt }, true); } // execute ondragmove if defined node.fire('dragmove', { type : 'dragmove', target : node, evt : evt }, true); } }, _endDragBefore: function(evt) { var dd = Kinetic.DD, node = dd.node, nodeType, layer; if(node) { nodeType = node.nodeType; layer = node.getLayer(); dd.anim.stop(); // only fire dragend event if the drag and drop // operation actually started. if(dd.isDragging) { dd.isDragging = false; Kinetic.listenClickTap = false; if (evt) { evt.dragEndNode = node; } } delete dd.node; (layer || node).draw(); } }, _endDragAfter: function(evt) { evt = evt || {}; var dragEndNode = evt.dragEndNode; if (evt && dragEndNode) { dragEndNode.fire('dragend', { type : 'dragend', target : dragEndNode, evt : evt }, true); } } }; // Node extenders /** * initiate drag and drop * @method * @memberof Kinetic.Node.prototype */ Kinetic.Node.prototype.startDrag = function() { var dd = Kinetic.DD, stage = this.getStage(), layer = this.getLayer(), pos = stage.getPointerPosition(), ap = this.getAbsolutePosition(); if(pos) { if (dd.node) { dd.node.stopDrag(); } dd.node = this; dd.startPointerPos = pos; dd.offset.x = pos.x - ap.x; dd.offset.y = pos.y - ap.y; dd.anim.setLayers(layer || this.getLayers()); dd.anim.start(); this._setDragPosition(); } }; Kinetic.Node.prototype._setDragPosition = function(evt) { var dd = Kinetic.DD, pos = this.getStage().getPointerPosition(), dbf = this.getDragBoundFunc(); if (!pos) { return; } var newNodePos = { x: pos.x - dd.offset.x, y: pos.y - dd.offset.y }; if(dbf !== undefined) { newNodePos = dbf.call(this, newNodePos, evt); } this.setAbsolutePosition(newNodePos); }; /** * stop drag and drop * @method * @memberof Kinetic.Node.prototype */ Kinetic.Node.prototype.stopDrag = function() { var dd = Kinetic.DD, evt = {}; dd._endDragBefore(evt); dd._endDragAfter(evt); }; Kinetic.Node.prototype.setDraggable = function(draggable) { this._setAttr('draggable', draggable); this._dragChange(); }; var origDestroy = Kinetic.Node.prototype.destroy; Kinetic.Node.prototype.destroy = function() { var dd = Kinetic.DD; // stop DD if(dd.node && dd.node._id === this._id) { this.stopDrag(); } origDestroy.call(this); }; /** * determine if node is currently in drag and drop mode * @method * @memberof Kinetic.Node.prototype */ Kinetic.Node.prototype.isDragging = function() { var dd = Kinetic.DD; return dd.node && dd.node._id === this._id && dd.isDragging; }; Kinetic.Node.prototype._listenDrag = function() { var that = this; this._dragCleanup(); if (this.getClassName() === 'Stage') { this.on('contentMousedown.kinetic contentTouchstart.kinetic', function(evt) { if(!Kinetic.DD.node) { that.startDrag(evt); } }); } else { this.on('mousedown.kinetic touchstart.kinetic', function(evt) { if(!Kinetic.DD.node) { that.startDrag(evt); } }); } // listening is required for drag and drop /* this._listeningEnabled = true; this._clearSelfAndAncestorCache('listeningEnabled'); */ }; Kinetic.Node.prototype._dragChange = function() { if(this.attrs.draggable) { this._listenDrag(); } else { // remove event listeners this._dragCleanup(); /* * force drag and drop to end * if this node is currently in * drag and drop mode */ var stage = this.getStage(); var dd = Kinetic.DD; if(stage && dd.node && dd.node._id === this._id) { dd.node.stopDrag(); } } }; Kinetic.Node.prototype._dragCleanup = function() { if (this.getClassName() === 'Stage') { this.off('contentMousedown.kinetic'); this.off('contentTouchstart.kinetic'); } else { this.off('mousedown.kinetic'); this.off('touchstart.kinetic'); } }; Kinetic.Factory.addGetterSetter(Kinetic.Node, 'dragBoundFunc'); /** * get/set drag bound function. This is used to override the default * drag and drop position * @name dragBoundFunc * @method * @memberof Kinetic.Node.prototype * @param {Function} dragBoundFunc * @returns {Function} * @example * // get drag bound function
* var dragBoundFunc = node.dragBoundFunc();

* * // create vertical drag and drop
* node.dragBoundFunc(function(){
* return {
* x: this.getAbsolutePosition().x,
* y: pos.y
* };
* }); */ Kinetic.Factory.addGetter(Kinetic.Node, 'draggable', false); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Node, 'draggable'); /** * get/set draggable flag * @name draggable * @method * @memberof Kinetic.Node.prototype * @param {Boolean} draggable * @returns {Boolean} * @example * // get draggable flag
* var draggable = node.draggable();

* * // enable drag and drop
* node.draggable(true);

* * // disable drag and drop
* node.draggable(false); */ var html = Kinetic.document.documentElement; html.addEventListener('mouseup', Kinetic.DD._endDragBefore, true); html.addEventListener('touchend', Kinetic.DD._endDragBefore, true); html.addEventListener('mouseup', Kinetic.DD._endDragAfter, false); html.addEventListener('touchend', Kinetic.DD._endDragAfter, false); })(); ;(function() { Kinetic.Util.addMethods(Kinetic.Container, { __init: function(config) { this.children = new Kinetic.Collection(); Kinetic.Node.call(this, config); }, /** * returns a {@link Kinetic.Collection} of direct descendant nodes * @method * @memberof Kinetic.Container.prototype * @param {Function} [filterFunc] filter function * @returns {Kinetic.Collection} * @example * // get all children
* var children = layer.getChildren();

* * // get only circles
* var circles = layer.getChildren(function(node){
* return node.getClassName() === 'Circle';
* }); */ getChildren: function(predicate) { if (!predicate) { return this.children; } else { var results = new Kinetic.Collection(); this.children.each(function(child){ if (predicate(child)) { results.push(child); } }); return results; } }, /** * determine if node has children * @method * @memberof Kinetic.Container.prototype * @returns {Boolean} */ hasChildren: function() { return this.getChildren().length > 0; }, /** * remove all children * @method * @memberof Kinetic.Container.prototype */ removeChildren: function() { var children = Kinetic.Collection.toCollection(this.children); var child; for (var i = 0; i < children.length; i++) { child = children[i]; // reset parent to prevent many _setChildrenIndices calls delete child.parent; child.index = 0; if (child.hasChildren()) { child.removeChildren(); } child.remove(); } children = null; this.children = new Kinetic.Collection(); return this; }, /** * destroy all children * @method * @memberof Kinetic.Container.prototype */ destroyChildren: function() { var children = Kinetic.Collection.toCollection(this.children); var child; for (var i = 0; i < children.length; i++) { child = children[i]; // reset parent to prevent many _setChildrenIndices calls delete child.parent; child.index = 0; child.destroy(); } children = null; this.children = new Kinetic.Collection(); return this; }, /** * Add node or nodes to container. * @method * @memberof Kinetic.Container.prototype * @param {...Kinetic.Node} child * @returns {Container} * @example * layer.add(shape1, shape2, shape3); */ add: function(child) { if (arguments.length > 1) { for (var i = 0; i < arguments.length; i++) { this.add(arguments[i]); } return; } if (child.getParent()) { child.moveTo(this); return; } var children = this.children; this._validateAdd(child); child.index = children.length; child.parent = this; children.push(child); this._fire('add', { child: child }); // chainable return this; }, destroy: function() { // destroy children if (this.hasChildren()) { this.destroyChildren(); } // then destroy self Kinetic.Node.prototype.destroy.call(this); }, /** * return a {@link Kinetic.Collection} of nodes that match the selector. Use '#' for id selections * and '.' for name selections. You can also select by type or class name. Pass multiple selectors * separated by a space. * @method * @memberof Kinetic.Container.prototype * @param {String} selector * @returns {Collection} * @example * // select node with id foo
* var node = stage.find('#foo');

* * // select nodes with name bar inside layer
* var nodes = layer.find('.bar');

* * // select all groups inside layer
* var nodes = layer.find('Group');

* * // select all rectangles inside layer
* var nodes = layer.find('Rect');

* * // select node with an id of foo or a name of bar inside layer
* var nodes = layer.find('#foo, .bar'); */ find: function(selector) { var retArr = [], selectorArr = selector.replace(/ /g, '').split(','), len = selectorArr.length, n, i, sel, arr, node, children, clen; for (n = 0; n < len; n++) { sel = selectorArr[n]; // id selector if(sel.charAt(0) === '#') { node = this._getNodeById(sel.slice(1)); if(node) { retArr.push(node); } } // name selector else if(sel.charAt(0) === '.') { arr = this._getNodesByName(sel.slice(1)); retArr = retArr.concat(arr); } // unrecognized selector, pass to children else { children = this.getChildren(); clen = children.length; for(i = 0; i < clen; i++) { retArr = retArr.concat(children[i]._get(sel)); } } } return Kinetic.Collection.toCollection(retArr); }, _getNodeById: function(key) { var node = Kinetic.ids[key]; if(node !== undefined && this.isAncestorOf(node)) { return node; } return null; }, _getNodesByName: function(key) { var arr = Kinetic.names[key] || []; return this._getDescendants(arr); }, _get: function(selector) { var retArr = Kinetic.Node.prototype._get.call(this, selector); var children = this.getChildren(); var len = children.length; for(var n = 0; n < len; n++) { retArr = retArr.concat(children[n]._get(selector)); } return retArr; }, // extenders toObject: function() { var obj = Kinetic.Node.prototype.toObject.call(this); obj.children = []; var children = this.getChildren(); var len = children.length; for(var n = 0; n < len; n++) { var child = children[n]; obj.children.push(child.toObject()); } return obj; }, _getDescendants: function(arr) { var retArr = []; var len = arr.length; for(var n = 0; n < len; n++) { var node = arr[n]; if(this.isAncestorOf(node)) { retArr.push(node); } } return retArr; }, /** * determine if node is an ancestor * of descendant * @method * @memberof Kinetic.Container.prototype * @param {Kinetic.Node} node */ isAncestorOf: function(node) { var parent = node.getParent(); while(parent) { if(parent._id === this._id) { return true; } parent = parent.getParent(); } return false; }, clone: function(obj) { // call super method var node = Kinetic.Node.prototype.clone.call(this, obj); this.getChildren().each(function(no) { node.add(no.clone()); }); return node; }, /** * get all shapes that intersect a point. Note: because this method must clear a temporary * canvas and redraw every shape inside the container, it should only be used for special sitations * because it performs very poorly. Please use the {@link Kinetic.Stage#getIntersection} method if at all possible * because it performs much better * @method * @memberof Kinetic.Container.prototype * @param {Object} pos * @param {Number} pos.x * @param {Number} pos.y * @returns {Array} array of shapes */ getAllIntersections: function(pos) { var arr = []; this.find('Shape').each(function(shape) { if(shape.isVisible() && shape.intersects(pos)) { arr.push(shape); } }); return arr; }, _setChildrenIndices: function() { this.children.each(function(child, n) { child.index = n; }); }, drawScene: function(can, top) { var layer = this.getLayer(), canvas = can || (layer && layer.getCanvas()), context = canvas && canvas.getContext(), cachedCanvas = this._cache.canvas, cachedSceneCanvas = cachedCanvas && cachedCanvas.scene; if (this.isVisible()) { if (cachedSceneCanvas) { this._drawCachedSceneCanvas(context); } else { this._drawChildren(canvas, 'drawScene', top); } } return this; }, drawHit: function(can, top) { var layer = this.getLayer(), canvas = can || (layer && layer.hitCanvas), context = canvas && canvas.getContext(), cachedCanvas = this._cache.canvas, cachedHitCanvas = cachedCanvas && cachedCanvas.hit; if (this.shouldDrawHit()) { if (cachedHitCanvas) { this._drawCachedHitCanvas(context); } else { this._drawChildren(canvas, 'drawHit', top); } } return this; }, _drawChildren: function(canvas, drawMethod, top) { var layer = this.getLayer(), context = canvas && canvas.getContext(), clipWidth = this.getClipWidth(), clipHeight = this.getClipHeight(), hasClip = clipWidth && clipHeight, clipX, clipY; if (hasClip && layer) { clipX = this.getClipX(); clipY = this.getClipY(); context.save(); layer._applyTransform(this, context); context.beginPath(); context.rect(clipX, clipY, clipWidth, clipHeight); context.clip(); context.reset(); } this.children.each(function(child) { child[drawMethod](canvas, top); }); if (hasClip) { context.restore(); } } }); Kinetic.Util.extend(Kinetic.Container, Kinetic.Node); // deprecated methods Kinetic.Container.prototype.get = Kinetic.Container.prototype.find; // add getters setters Kinetic.Factory.addComponentsGetterSetter(Kinetic.Container, 'clip', ['x', 'y', 'width', 'height']); /** * get/set clip * @method * @name clip * @memberof Kinetic.Container.prototype * @param {Object} clip * @param {Number} clip.x * @param {Number} clip.y * @param {Number} clip.width * @param {Number} clip.height * @returns {Object} * @example * // get clip
* var clip = container.clip();

* * // set clip
* container.setClip({
* x: 20,
* y: 20,
* width: 20,
* height: 20
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Container, 'clipX'); /** * get/set clip x * @name clipX * @method * @memberof Kinetic.Container.prototype * @param {Number} x * @returns {Number} * @example * // get clip x
* var clipX = container.clipX();

* * // set clip x
* container.clipX(10); */ Kinetic.Factory.addGetterSetter(Kinetic.Container, 'clipY'); /** * get/set clip y * @name clipY * @method * @memberof Kinetic.Container.prototype * @param {Number} y * @returns {Number} * @example * // get clip y
* var clipY = container.clipY();

* * // set clip y
* container.clipY(10); */ Kinetic.Factory.addGetterSetter(Kinetic.Container, 'clipWidth'); /** * get/set clip width * @name clipWidth * @method * @memberof Kinetic.Container.prototype * @param {Number} width * @returns {Number} * @example * // get clip width
* var clipWidth = container.clipWidth();

* * // set clip width
* container.clipWidth(100); */ Kinetic.Factory.addGetterSetter(Kinetic.Container, 'clipHeight'); /** * get/set clip height * @name clipHeight * @method * @memberof Kinetic.Container.prototype * @param {Number} height * @returns {Number} * @example * // get clip height
* var clipHeight = container.clipHeight();

* * // set clip height
* container.clipHeight(100); */ Kinetic.Collection.mapMethods(Kinetic.Container); })(); ;(function() { var HAS_SHADOW = 'hasShadow'; function _fillFunc(context) { context.fill(); } function _strokeFunc(context) { context.stroke(); } function _fillFuncHit(context) { context.fill(); } function _strokeFuncHit(context) { context.stroke(); } function _clearHasShadowCache() { this._clearCache(HAS_SHADOW); } Kinetic.Util.addMethods(Kinetic.Shape, { __init: function(config) { this.nodeType = 'Shape'; this._fillFunc = _fillFunc; this._strokeFunc = _strokeFunc; this._fillFuncHit = _fillFuncHit; this._strokeFuncHit = _strokeFuncHit; // set colorKey var shapes = Kinetic.shapes; var key; while(true) { key = Kinetic.Util.getRandomColor(); if(key && !( key in shapes)) { break; } } this.colorKey = key; shapes[key] = this; // call super constructor Kinetic.Node.call(this, config); this.on('shadowColorChange.kinetic shadowBlurChange.kinetic shadowOffsetChange.kinetic shadowOpacityChange.kinetic shadowEnabledChange.kinetic', _clearHasShadowCache); }, hasChildren: function() { return false; }, getChildren: function() { return []; }, /** * get canvas context tied to the layer * @method * @memberof Kinetic.Shape.prototype * @returns {Kinetic.Context} */ getContext: function() { return this.getLayer().getContext(); }, /** * get canvas renderer tied to the layer. Note that this returns a canvas renderer, not a canvas element * @method * @memberof Kinetic.Shape.prototype * @returns {Kinetic.Canvas} */ getCanvas: function() { return this.getLayer().getCanvas(); }, /** * returns whether or not a shadow will be rendered * @method * @memberof Kinetic.Shape.prototype * @returns {Boolean} */ hasShadow: function() { return this._getCache(HAS_SHADOW, this._hasShadow); }, _hasShadow: function() { return this.getShadowEnabled() && (this.getShadowOpacity() !== 0 && !!(this.getShadowColor() || this.getShadowBlur() || this.getShadowOffsetX() || this.getShadowOffsetY())); }, /** * returns whether or not the shape will be filled * @method * @memberof Kinetic.Shape.prototype * @returns {Boolean} */ hasFill: function() { return !!(this.getFill() || this.getFillPatternImage() || this.getFillLinearGradientColorStops() || this.getFillRadialGradientColorStops()); }, /** * returns whether or not the shape will be stroked * @method * @memberof Kinetic.Shape.prototype * @returns {Boolean} */ hasStroke: function() { return !!(this.stroke() || this.strokeRed() || this.strokeGreen() || this.strokeBlue()); }, _get: function(selector) { return this.className === selector || this.nodeType === selector ? [this] : []; }, /** * determines if point is in the shape, regardless if other shapes are on top of it. Note: because * this method clears a temporary canvas and then redraws the shape, it performs very poorly if executed many times * consecutively. Please use the {@link Kinetic.Stage#getIntersection} method if at all possible * because it performs much better * @method * @memberof Kinetic.Shape.prototype * @param {Object} point * @param {Number} point.x * @param {Number} point.y * @returns {Boolean} */ intersects: function(pos) { var stage = this.getStage(), bufferHitCanvas = stage.bufferHitCanvas, p; bufferHitCanvas.getContext().clear(); this.drawScene(bufferHitCanvas); p = bufferHitCanvas.context.getImageData(Math.round(pos.x), Math.round(pos.y), 1, 1).data; return p[3] > 0; }, // extends Node.prototype.destroy destroy: function() { Kinetic.Node.prototype.destroy.call(this); delete Kinetic.shapes[this.colorKey]; }, _useBufferCanvas: function() { return (this.hasShadow() || this.getAbsoluteOpacity() !== 1) && this.hasFill() && this.hasStroke() && this.getStage(); }, drawScene: function(can, top) { var layer = this.getLayer(), canvas = can || layer.getCanvas(), context = canvas.getContext(), cachedCanvas = this._cache.canvas, drawFunc = this.sceneFunc(), hasShadow = this.hasShadow(), stage, bufferCanvas, bufferContext; if(this.isVisible()) { if (cachedCanvas) { this._drawCachedSceneCanvas(context); } else if (drawFunc) { context.save(); // if buffer canvas is needed if (this._useBufferCanvas()) { stage = this.getStage(); bufferCanvas = stage.bufferCanvas; bufferContext = bufferCanvas.getContext(); bufferContext.clear(); bufferContext.save(); bufferContext._applyLineJoin(this); layer._applyTransform(this, bufferContext, top); drawFunc.call(this, bufferContext); bufferContext.restore(); if (hasShadow) { context.save(); context._applyShadow(this); context.drawImage(bufferCanvas._canvas, 0, 0); context.restore(); } context._applyOpacity(this); context.drawImage(bufferCanvas._canvas, 0, 0); } // if buffer canvas is not needed else { context._applyLineJoin(this); layer._applyTransform(this, context, top); if (hasShadow) { context.save(); context._applyShadow(this); drawFunc.call(this, context); context.restore(); } context._applyOpacity(this); drawFunc.call(this, context); } context.restore(); } } return this; }, drawHit: function(can, top) { var layer = this.getLayer(), canvas = can || layer.hitCanvas, context = canvas.getContext(), drawFunc = this.hitFunc() || this.sceneFunc(), cachedCanvas = this._cache.canvas, cachedHitCanvas = cachedCanvas && cachedCanvas.hit; if(this.shouldDrawHit()) { if (cachedHitCanvas) { this._drawCachedHitCanvas(context); } else if (drawFunc) { context.save(); context._applyLineJoin(this); layer._applyTransform(this, context, top); drawFunc.call(this, context); context.restore(); } } return this; }, /** * draw hit graph using the cached scene canvas * @method * @memberof Kinetic.Shape.prototype * @param {Integer} alphaThreshold alpha channel threshold that determines whether or not * a pixel should be drawn onto the hit graph. Must be a value between 0 and 255. * The default is 0 * @returns {Kinetic.Shape} * @example * shape.cache(); * shape.drawHitFromCache(); */ drawHitFromCache: function(alphaThreshold) { var threshold = alphaThreshold || 0, cachedCanvas = this._cache.canvas, sceneCanvas = this._getCachedSceneCanvas(), sceneContext = sceneCanvas.getContext(), hitCanvas = cachedCanvas.hit, hitContext = hitCanvas.getContext(), width = sceneCanvas.getWidth(), height = sceneCanvas.getHeight(), sceneImageData, sceneData, hitImageData, hitData, len, rgbColorKey, i, alpha; hitContext.clear(); try { sceneImageData = sceneContext.getImageData(0, 0, width, height); sceneData = sceneImageData.data; hitImageData = hitContext.getImageData(0, 0, width, height); hitData = hitImageData.data; len = sceneData.length; rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); // replace non transparent pixels with color key for(i = 0; i < len; i += 4) { alpha = sceneData[i + 3]; if (alpha > threshold) { hitData[i] = rgbColorKey.r; hitData[i + 1] = rgbColorKey.g; hitData[i + 2] = rgbColorKey.b; hitData[i + 3] = 255; } } hitContext.putImageData(hitImageData, 0, 0); } catch(e) { Kinetic.Util.warn('Unable to draw hit graph from cached scene canvas. ' + e.message); } return this; }, }); Kinetic.Util.extend(Kinetic.Shape, Kinetic.Node); // add getters and setters Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'stroke'); /** * get/set stroke color * @name stroke * @method * @memberof Kinetic.Shape.prototype * @param {String} color * @returns {String} * @example * // get stroke color
* var stroke = shape.stroke();

* * // set stroke color with color string
* shape.stroke('green');

* * // set stroke color with hex
* shape.stroke('#00ff00');

* * // set stroke color with rgb
* shape.stroke('rgb(0,255,0)');

* * // set stroke color with rgba and make it 50% opaque
* shape.stroke('rgba(0,255,0,0.5'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'strokeRed', 0, Kinetic.Validators.RGBComponent); /** * get/set stroke red component * @name strokeRed * @method * @memberof Kinetic.Shape.prototype * @param {Integer} red * @returns {Integer} * @example * // get stroke red component
* var strokeRed = shape.strokeRed();

* * // set stroke red component
* shape.strokeRed(0); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'strokeGreen', 0, Kinetic.Validators.RGBComponent); /** * get/set stroke green component * @name strokeGreen * @method * @memberof Kinetic.Shape.prototype * @param {Integer} green * @returns {Integer} * @example * // get stroke green component
* var strokeGreen = shape.strokeGreen();

* * // set stroke green component
* shape.strokeGreen(255); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'strokeBlue', 0, Kinetic.Validators.RGBComponent); /** * get/set stroke blue component * @name strokeBlue * @method * @memberof Kinetic.Shape.prototype * @param {Integer} blue * @returns {Integer} * @example * // get stroke blue component
* var strokeBlue = shape.strokeBlue();

* * // set stroke blue component
* shape.strokeBlue(0); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'strokeAlpha', 1, Kinetic.Validators.alphaComponent); /** * get/set stroke alpha component. Alpha is a real number between 0 and 1. The default * is 1. * @name strokeAlpha * @method * @memberof Kinetic.Shape.prototype * @param {Number} alpha * @returns {Number} * @example * // get stroke alpha component
* var strokeAlpha = shape.strokeAlpha();

* * // set stroke alpha component
* shape.strokeAlpha(0.5); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'strokeWidth', 2); /** * get/set stroke width * @name strokeWidth * @method * @memberof Kinetic.Shape.prototype * @param {Number} strokeWidth * @returns {Number} * @example * // get stroke width
* var strokeWidth = shape.strokeWidth();

* * // set stroke width
* shape.strokeWidth(); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'lineJoin'); /** * get/set line join. Can be miter, round, or bevel. The * default is miter * @name lineJoin * @method * @memberof Kinetic.Shape.prototype * @param {String} lineJoin * @returns {String} * @example * // get line join
* var lineJoin = shape.lineJoin();

* * // set line join
* shape.lineJoin('round'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'lineCap'); /** * get/set line cap. Can be butt, round, or square * @name lineCap * @method * @memberof Kinetic.Shape.prototype * @param {String} lineCap * @returns {String} * @example * // get line cap
* var lineCap = shape.lineCap();

* * // set line cap
* shape.lineCap('round'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'sceneFunc'); /** * get/set scene draw function * @name sceneFunc * @method * @memberof Kinetic.Shape.prototype * @param {Function} drawFunc drawing function * @returns {Function} * @example * // get scene draw function
* var sceneFunc = shape.sceneFunc();

* * // set scene draw function
* shape.sceneFunc(function(context) {
* context.beginPath();
* context.rect(0, 0, this.width(), this.height());
* context.closePath();
* context.fillStrokeShape(this);
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'hitFunc'); /** * get/set hit draw function * @name hitFunc * @method * @memberof Kinetic.Shape.prototype * @param {Function} drawFunc drawing function * @returns {Function} * @example * // get hit draw function
* var hitFunc = shape.hitFunc();

* * // set hit draw function
* shape.hitFunc(function(context) {
* context.beginPath();
* context.rect(0, 0, this.width(), this.height());
* context.closePath();
* context.fillStrokeShape(this);
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'dash'); /** * get/set dash array for stroke. * @name dash * @method * @memberof Kinetic.Shape.prototype * @param {Array} dash * @returns {Array} * @example * // apply dashed stroke that is 10px long and 5 pixels apart
* line.dash([10, 5]);

* * // apply dashed stroke that is made up of alternating dashed
* // lines that are 10px long and 20px apart, and dots that have
* // a radius of 5px and are 20px apart
* line.dash([10, 20, 0.001, 20]); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowColor'); /** * get/set shadow color * @name shadowColor * @method * @memberof Kinetic.Shape.prototype * @param {String} color * @returns {String} * @example * // get shadow color
* var shadow = shape.shadowColor();

* * // set shadow color with color string
* shape.shadowColor('green');

* * // set shadow color with hex
* shape.shadowColor('#00ff00');

* * // set shadow color with rgb
* shape.shadowColor('rgb(0,255,0)');

* * // set shadow color with rgba and make it 50% opaque
* shape.shadowColor('rgba(0,255,0,0.5'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowRed', 0, Kinetic.Validators.RGBComponent); /** * get/set shadow red component * @name shadowRed * @method * @memberof Kinetic.Shape.prototype * @param {Integer} red * @returns {Integer} * @example * // get shadow red component
* var shadowRed = shape.shadowRed();

* * // set shadow red component
* shape.shadowRed(0); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowGreen', 0, Kinetic.Validators.RGBComponent); /** * get/set shadow green component * @name shadowGreen * @method * @memberof Kinetic.Shape.prototype * @param {Integer} green * @returns {Integer} * @example * // get shadow green component
* var shadowGreen = shape.shadowGreen();

* * // set shadow green component
* shape.shadowGreen(255); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowBlue', 0, Kinetic.Validators.RGBComponent); /** * get/set shadow blue component * @name shadowBlue * @method * @memberof Kinetic.Shape.prototype * @param {Integer} blue * @returns {Integer} * @example * // get shadow blue component
* var shadowBlue = shape.shadowBlue();

* * // set shadow blue component
* shape.shadowBlue(0); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowAlpha', 1, Kinetic.Validators.alphaComponent); /** * get/set shadow alpha component. Alpha is a real number between 0 and 1. The default * is 1. * @name shadowAlpha * @method * @memberof Kinetic.Shape.prototype * @param {Number} alpha * @returns {Number} * @example * // get shadow alpha component
* var shadowAlpha = shape.shadowAlpha();

* * // set shadow alpha component
* shape.shadowAlpha(0.5); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowBlur'); /** * get/set shadow blur * @name shadowBlur * @method * @memberof Kinetic.Shape.prototype * @param {Number} blur * @returns {Number} * @example * // get shadow blur
* var shadowBlur = shape.shadowBlur();

* * // set shadow blur
* shape.shadowBlur(10); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowOpacity'); /** * get/set shadow opacity. must be a value between 0 and 1 * @name shadowOpacity * @method * @memberof Kinetic.Shape.prototype * @param {Number} opacity * @returns {Number} * @example * // get shadow opacity
* var shadowOpacity = shape.shadowOpacity();

* * // set shadow opacity
* shape.shadowOpacity(0.5); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape, 'shadowOffset', ['x', 'y']); /** * get/set shadow offset * @name shadowOffset * @method * @memberof Kinetic.Shape.prototype * @param {Object} offset * @param {Number} offset.x * @param {Number} offset.y * @returns {Object} * @example * // get shadow offset
* var shadowOffset = shape.shadowOffset();

* * // set shadow offset
* shape.shadowOffset({
* x: 20
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowOffsetX', 0); /** * get/set shadow offset x * @name shadowOffsetX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get shadow offset x
* var shadowOffsetX = shape.shadowOffsetX();

* * // set shadow offset x
* shape.shadowOffsetX(5); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowOffsetY', 0); /** * get/set shadow offset y * @name shadowOffsetY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get shadow offset y
* var shadowOffsetY = shape.shadowOffsetY();

* * // set shadow offset y
* shape.shadowOffsetY(5); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternImage'); /** * get/set fill pattern image * @name fillPatternImage * @method * @memberof Kinetic.Shape.prototype * @param {Image} image object * @returns {Image} * @example * // get fill pattern image
* var fillPatternImage = shape.fillPatternImage();

* * // set fill pattern image
* var imageObj = new Image();
* imageObj.onload = function() {
* shape.fillPatternImage(imageObj);
* };
* imageObj.src = 'path/to/image/jpg'; */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fill'); /** * get/set fill color * @name fill * @method * @memberof Kinetic.Shape.prototype * @param {String} color * @returns {String} * @example * // get fill color
* var fill = shape.fill();

* * // set fill color with color string
* shape.fill('green');

* * // set fill color with hex
* shape.fill('#00ff00');

* * // set fill color with rgb
* shape.fill('rgb(0,255,0)');

* * // set fill color with rgba and make it 50% opaque
* shape.fill('rgba(0,255,0,0.5'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRed', 0, Kinetic.Validators.RGBComponent); /** * get/set fill red component * @name fillRed * @method * @memberof Kinetic.Shape.prototype * @param {Integer} red * @returns {Integer} * @example * // get fill red component
* var fillRed = shape.fillRed();

* * // set fill red component
* shape.fillRed(0); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillGreen', 0, Kinetic.Validators.RGBComponent); /** * get/set fill green component * @name fillGreen * @method * @memberof Kinetic.Shape.prototype * @param {Integer} green * @returns {Integer} * @example * // get fill green component
* var fillGreen = shape.fillGreen();

* * // set fill green component
* shape.fillGreen(255); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillBlue', 0, Kinetic.Validators.RGBComponent); /** * get/set fill blue component * @name fillBlue * @method * @memberof Kinetic.Shape.prototype * @param {Integer} blue * @returns {Integer} * @example * // get fill blue component
* var fillBlue = shape.fillBlue();

* * // set fill blue component
* shape.fillBlue(0); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillAlpha', 1, Kinetic.Validators.alphaComponent); /** * get/set fill alpha component. Alpha is a real number between 0 and 1. The default * is 1. * @name fillAlpha * @method * @memberof Kinetic.Shape.prototype * @param {Number} alpha * @returns {Number} * @example * // get fill alpha component
* var fillAlpha = shape.fillAlpha();

* * // set fill alpha component
* shape.fillAlpha(0.5); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternX', 0); /** * get/set fill pattern x * @name fillPatternX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get fill pattern x
* var fillPatternX = shape.fillPatternX();

* * // set fill pattern x
* shape.fillPatternX(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternY', 0); /** * get/set fill pattern y * @name fillPatternY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get fill pattern y
* var fillPatternY = shape.fillPatternY();

* * // set fill pattern y
* shape.fillPatternY(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillLinearGradientColorStops'); /** * get/set fill linear gradient color stops * @name fillLinearGradientColorStops * @method * @memberof Kinetic.Shape.prototype * @param {Array} colorStops * @returns {Array} colorStops * @example * // get fill linear gradient color stops
* var colorStops = shape.fillLinearGradientColorStops();

* * // create a linear gradient that starts with red, changes to blue
* // halfway through, and then changes to green
* shape.fillLinearGradientColorStops(0, 'red', 0.5, 'blue', 1, 'green'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRadialGradientStartRadius', 0); /** * get/set fill radial gradient start radius * @name fillRadialGradientStartRadius * @method * @memberof Kinetic.Shape.prototype * @param {Number} radius * @returns {Number} * @example * // get radial gradient start radius
* var startRadius = shape.fillRadialGradientStartRadius();

* * // set radial gradient start radius
* shape.fillRadialGradientStartRadius(0); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRadialGradientEndRadius', 0); /** * get/set fill radial gradient end radius * @name fillRadialGradientEndRadius * @method * @memberof Kinetic.Shape.prototype * @param {Number} radius * @returns {Number} * @example * // get radial gradient end radius
* var endRadius = shape.fillRadialGradientEndRadius();

* * // set radial gradient end radius
* shape.fillRadialGradientEndRadius(100); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRadialGradientColorStops'); /** * get/set fill radial gradient color stops * @name fillRadialGradientColorStops * @method * @memberof Kinetic.Shape.prototype * @param {Number} colorStops * @returns {Array} * @example * // get fill radial gradient color stops
* var colorStops = shape.fillRadialGradientColorStops();

* * // create a radial gradient that starts with red, changes to blue
* // halfway through, and then changes to green
* shape.fillRadialGradientColorStops(0, 'red', 0.5, 'blue', 1, 'green'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternRepeat', 'repeat'); /** * get/set fill pattern repeat. Can be 'repeat', 'repeat-x', 'repeat-y', or 'no-repeat'. The default is 'repeat' * @name fillPatternRepeat * @method * @memberof Kinetic.Shape.prototype * @param {String} repeat * @returns {String} * @example * // get fill pattern repeat
* var repeat = shape.fillPatternRepeat();

* * // repeat pattern in x direction only
* shape.fillPatternRepeat('repeat-x');

* * // do not repeat the pattern
* shape.fillPatternRepeat('no repeat'); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillEnabled', true); /** * get/set fill enabled flag * @name fillEnabled * @method * @memberof Kinetic.Shape.prototype * @param {Boolean} enabled * @returns {Boolean} * @example * // get fill enabled flag
* var fillEnabled = shape.fillEnabled();

* * // disable fill
* shape.fillEnabled(false);

* * // enable fill
* shape.fillEnabled(true); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'strokeEnabled', true); /** * get/set stroke enabled flag * @name strokeEnabled * @method * @memberof Kinetic.Shape.prototype * @param {Boolean} enabled * @returns {Boolean} * @example * // get stroke enabled flag
* var strokeEnabled = shape.strokeEnabled();

* * // disable stroke
* shape.strokeEnabled(false);

* * // enable stroke
* shape.strokeEnabled(true); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'shadowEnabled', true); /** * get/set shadow enabled flag * @name shadowEnabled * @method * @memberof Kinetic.Shape.prototype * @param {Boolean} enabled * @returns {Boolean} * @example * // get shadow enabled flag
* var shadowEnabled = shape.shadowEnabled();

* * // disable shadow
* shape.shadowEnabled(false);

* * // enable shadow
* shape.shadowEnabled(true); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'dashEnabled', true); /** * get/set dash enabled flag * @name dashEnabled * @method * @memberof Kinetic.Shape.prototype * @param {Boolean} enabled * @returns {Boolean} * @example * // get dash enabled flag
* var dashEnabled = shape.dashEnabled();

* * // disable dash
* shape.dashEnabled(false);

* * // enable dash
* shape.dashEnabled(true); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'strokeScaleEnabled', true); /** * get/set strokeScale enabled flag * @name strokeScaleEnabled * @method * @memberof Kinetic.Shape.prototype * @param {Boolean} enabled * @returns {Boolean} * @example * // get stroke scale enabled flag
* var strokeScaleEnabled = shape.strokeScaleEnabled();

* * // disable stroke scale
* shape.strokeScaleEnabled(false);

* * // enable stroke scale
* shape.strokeScaleEnabled(true); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPriority', 'color'); /** * get/set fill priority. can be color, pattern, linear-gradient, or radial-gradient. The default is color. * This is handy if you want to toggle between different fill types. * @name fillPriority * @method * @memberof Kinetic.Shape.prototype * @param {String} priority * @returns {String} * @example * // get fill priority
* var fillPriority = shape.fillPriority();

* * // set fill priority
* shape.fillPriority('linear-gradient'); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape, 'fillPatternOffset', ['x', 'y']); /** * get/set fill pattern offset * @name fillPatternOffset * @method * @memberof Kinetic.Shape.prototype * @param {Object} offset * @param {Number} offset.x * @param {Number} offset.y * @returns {Object} * @example * // get fill pattern offset
* var patternOffset = shape.fillPatternOffset();

* * // set fill pattern offset
* shape.fillPatternOffset({
* x: 20
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternOffsetX', 0); /** * get/set fill pattern offset x * @name fillPatternOffsetX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get fill pattern offset x
* var patternOffsetX = shape.fillPatternOffsetX();

* * // set fill pattern offset x
* shape.fillPatternOffsetX(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternOffsetY', 0); /** * get/set fill pattern offset y * @name fillPatternOffsetY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get fill pattern offset y
* var patternOffsetY = shape.fillPatternOffsetY();

* * // set fill pattern offset y
* shape.fillPatternOffsetY(10); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape, 'fillPatternScale', ['x', 'y']); /** * get/set fill pattern scale * @name fillPatternScale * @method * @memberof Kinetic.Shape.prototype * @param {Object} scale * @param {Number} scale.x * @param {Number} scale.y * @returns {Object} * @example * // get fill pattern scale
* var patternScale = shape.fillPatternScale();

* * // set fill pattern scale
* shape.fillPatternScale({
* x: 2
* y: 2
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternScaleX', 1); /** * get/set fill pattern scale x * @name fillPatternScaleX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get fill pattern scale x
* var patternScaleX = shape.fillPatternScaleX();

* * // set fill pattern scale x
* shape.fillPatternScaleX(2); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternScaleY', 1); /** * get/set fill pattern scale y * @name fillPatternScaleY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get fill pattern scale y
* var patternScaleY = shape.fillPatternScaleY();

* * // set fill pattern scale y
* shape.fillPatternScaleY(2); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape, 'fillLinearGradientStartPoint', ['x', 'y']); /** * get/set fill linear gradient start point * @name fillLinearGradientStartPoint * @method * @memberof Kinetic.Shape.prototype * @param {Object} startPoint * @param {Number} startPoint.x * @param {Number} startPoint.y * @returns {Object} * @example * // get fill linear gradient start point
* var startPoint = shape.fillLinearGradientStartPoint();

* * // set fill linear gradient start point
* shape.fillLinearGradientStartPoint({
* x: 20
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillLinearGradientStartPointX', 0); /** * get/set fill linear gradient start point x * @name fillLinearGradientStartPointX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get fill linear gradient start point x
* var startPointX = shape.fillLinearGradientStartPointX();

* * // set fill linear gradient start point x
* shape.fillLinearGradientStartPointX(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillLinearGradientStartPointY', 0); /** * get/set fill linear gradient start point y * @name fillLinearGradientStartPointY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get fill linear gradient start point y
* var startPointY = shape.fillLinearGradientStartPointY();

* * // set fill linear gradient start point y
* shape.fillLinearGradientStartPointY(20); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape, 'fillLinearGradientEndPoint', ['x', 'y']); /** * get/set fill linear gradient end point * @name fillLinearGradientEndPoint * @method * @memberof Kinetic.Shape.prototype * @param {Object} endPoint * @param {Number} endPoint.x * @param {Number} endPoint.y * @returns {Object} * @example * // get fill linear gradient end point
* var endPoint = shape.fillLinearGradientEndPoint();

* * // set fill linear gradient end point
* shape.fillLinearGradientEndPoint({
* x: 20
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillLinearGradientEndPointX', 0); /** * get/set fill linear gradient end point x * @name fillLinearGradientEndPointX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get fill linear gradient end point x
* var endPointX = shape.fillLinearGradientEndPointX();

* * // set fill linear gradient end point x
* shape.fillLinearGradientEndPointX(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillLinearGradientEndPointY', 0); /** * get/set fill linear gradient end point y * @name fillLinearGradientEndPointY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get fill linear gradient end point y
* var endPointY = shape.fillLinearGradientEndPointY();

* * // set fill linear gradient end point y
* shape.fillLinearGradientEndPointY(20); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape, 'fillRadialGradientStartPoint', ['x', 'y']); /** * get/set fill radial gradient start point * @name fillRadialGradientStartPoint * @method * @memberof Kinetic.Shape.prototype * @param {Object} startPoint * @param {Number} startPoint.x * @param {Number} startPoint.y * @returns {Object} * @example * // get fill radial gradient start point
* var startPoint = shape.fillRadialGradientStartPoint();

* * // set fill radial gradient start point
* shape.fillRadialGradientStartPoint({
* x: 20
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRadialGradientStartPointX', 0); /** * get/set fill radial gradient start point x * @name fillRadialGradientStartPointX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get fill radial gradient start point x
* var startPointX = shape.fillRadialGradientStartPointX();

* * // set fill radial gradient start point x
* shape.fillRadialGradientStartPointX(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRadialGradientStartPointY', 0); /** * get/set fill radial gradient start point y * @name fillRadialGradientStartPointY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get fill radial gradient start point y
* var startPointY = shape.fillRadialGradientStartPointY();

* * // set fill radial gradient start point y
* shape.fillRadialGradientStartPointY(20); */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Shape, 'fillRadialGradientEndPoint', ['x', 'y']); /** * get/set fill radial gradient end point * @name fillRadialGradientEndPoint * @method * @memberof Kinetic.Shape.prototype * @param {Object} endPoint * @param {Number} endPoint.x * @param {Number} endPoint.y * @returns {Object} * @example * // get fill radial gradient end point
* var endPoint = shape.fillRadialGradientEndPoint();

* * // set fill radial gradient end point
* shape.fillRadialGradientEndPoint({
* x: 20
* y: 10
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRadialGradientEndPointX', 0); /** * get/set fill radial gradient end point x * @name fillRadialGradientEndPointX * @method * @memberof Kinetic.Shape.prototype * @param {Number} x * @returns {Number} * @example * // get fill radial gradient end point x
* var endPointX = shape.fillRadialGradientEndPointX();

* * // set fill radial gradient end point x
* shape.fillRadialGradientEndPointX(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillRadialGradientEndPointY', 0); /** * get/set fill radial gradient end point y * @name fillRadialGradientEndPointY * @method * @memberof Kinetic.Shape.prototype * @param {Number} y * @returns {Number} * @example * // get fill radial gradient end point y
* var endPointY = shape.fillRadialGradientEndPointY();

* * // set fill radial gradient end point y
* shape.fillRadialGradientEndPointY(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Shape, 'fillPatternRotation', 0); /** * get/set fill pattern rotation in degrees * @name fillPatternRotation * @method * @memberof Kinetic.Shape.prototype * @param {Number} rotation * @returns {Kinetic.Shape} * @example * // get fill pattern rotation
* var patternRotation = shape.fillPatternRotation();

* * // set fill pattern rotation
* shape.fillPatternRotation(20); */ Kinetic.Factory.backCompat(Kinetic.Shape, { dashArray: 'dash', getDashArray: 'getDash', setDashArray: 'getDash', drawFunc: 'sceneFunc', getDrawFunc: 'getSceneFunc', setDrawFunc: 'setSceneFunc', drawHitFunc: 'hitFunc', getDrawHitFunc: 'getHitFunc', setDrawHitFunc: 'setHitFunc' }); Kinetic.Collection.mapMethods(Kinetic.Shape); })(); ;/*jshint unused:false */ (function() { // CONSTANTS var STAGE = 'Stage', STRING = 'string', PX = 'px', MOUSEOUT = 'mouseout', MOUSELEAVE = 'mouseleave', MOUSEOVER = 'mouseover', MOUSEENTER = 'mouseenter', MOUSEMOVE = 'mousemove', MOUSEDOWN = 'mousedown', MOUSEUP = 'mouseup', CLICK = 'click', DBL_CLICK = 'dblclick', TOUCHSTART = 'touchstart', TOUCHEND = 'touchend', TAP = 'tap', DBL_TAP = 'dbltap', TOUCHMOVE = 'touchmove', CONTENT_MOUSEOUT = 'contentMouseout', CONTENT_MOUSELEAVE = 'contentMouseleave', CONTENT_MOUSEOVER = 'contentMouseover', CONTENT_MOUSEENTER = 'contentMouseenter', CONTENT_MOUSEMOVE = 'contentMousemove', CONTENT_MOUSEDOWN = 'contentMousedown', CONTENT_MOUSEUP = 'contentMouseup', CONTENT_CLICK = 'contentClick', CONTENT_DBL_CLICK = 'contentDblclick', CONTENT_TOUCHSTART = 'contentTouchstart', CONTENT_TOUCHEND = 'contentTouchend', CONTENT_TAP = 'contentTap', CONTENT_DBL_TAP = 'contentDbltap', CONTENT_TOUCHMOVE = 'contentTouchmove', DIV = 'div', RELATIVE = 'relative', INLINE_BLOCK = 'inline-block', KINETICJS_CONTENT = 'kineticjs-content', SPACE = ' ', UNDERSCORE = '_', CONTAINER = 'container', EMPTY_STRING = '', EVENTS = [MOUSEDOWN, MOUSEMOVE, MOUSEUP, MOUSEOUT, TOUCHSTART, TOUCHMOVE, TOUCHEND, MOUSEOVER], // cached variables eventsLength = EVENTS.length; function addEvent(ctx, eventName) { ctx.content.addEventListener(eventName, function(evt) { ctx[UNDERSCORE + eventName](evt); }, false); } Kinetic.Util.addMethods(Kinetic.Stage, { ___init: function(config) { this.nodeType = STAGE; // call super constructor Kinetic.Container.call(this, config); this._id = Kinetic.idCounter++; this._buildDOM(); this._bindContentEvents(); this._enableNestedTransforms = false; Kinetic.stages.push(this); }, _validateAdd: function(child) { if (child.getType() !== 'Layer') { Kinetic.Util.error('You may only add layers to the stage.'); } }, /** * set container dom element which contains the stage wrapper div element * @method * @memberof Kinetic.Stage.prototype * @param {DomElement} container can pass in a dom element or id string */ setContainer: function(container) { if( typeof container === STRING) { var id = container; container = Kinetic.document.getElementById(container); if (!container) { throw 'Can not find container in document with id ' + id; } } this._setAttr(CONTAINER, container); return this; }, shouldDrawHit: function() { return true; }, draw: function() { Kinetic.Node.prototype.draw.call(this); return this; }, /** * draw layer scene graphs * @name draw * @method * @memberof Kinetic.Stage.prototype */ /** * draw layer hit graphs * @name drawHit * @method * @memberof Kinetic.Stage.prototype */ /** * set height * @method * @memberof Kinetic.Stage.prototype * @param {Number} height */ setHeight: function(height) { Kinetic.Node.prototype.setHeight.call(this, height); this._resizeDOM(); return this; }, /** * set width * @method * @memberof Kinetic.Stage.prototype * @param {Number} width */ setWidth: function(width) { Kinetic.Node.prototype.setWidth.call(this, width); this._resizeDOM(); return this; }, /** * clear all layers * @method * @memberof Kinetic.Stage.prototype */ clear: function() { var layers = this.children, len = layers.length, n; for(n = 0; n < len; n++) { layers[n].clear(); } return this; }, clone: function(obj) { if (!obj) { obj = {}; } obj.container = Kinetic.document.createElement(DIV); return Kinetic.Container.prototype.clone.call(this, obj); }, /** * destroy stage * @method * @memberof Kinetic.Stage.prototype */ destroy: function() { var content = this.content; Kinetic.Container.prototype.destroy.call(this); if(content && Kinetic.Util._isInDocument(content)) { this.getContainer().removeChild(content); } var index = Kinetic.stages.indexOf(this); if (index > -1) { Kinetic.stages.splice(index, 1); } }, /** * get pointer position which can be a touch position or mouse position * @method * @memberof Kinetic.Stage.prototype * @returns {Object} */ getPointerPosition: function() { return this.pointerPos; }, getStage: function() { return this; }, /** * get stage content div element which has the * the class name "kineticjs-content" * @method * @memberof Kinetic.Stage.prototype */ getContent: function() { return this.content; }, /** * Creates a composite data URL and requires a callback because the composite is generated asynchronously. * @method * @memberof Kinetic.Stage.prototype * @param {Object} config * @param {Function} config.callback function executed when the composite has completed * @param {String} [config.mimeType] can be "image/png" or "image/jpeg". * "image/png" is the default * @param {Number} [config.x] x position of canvas section * @param {Number} [config.y] y position of canvas section * @param {Number} [config.width] width of canvas section * @param {Number} [config.height] height of canvas section * @param {Number} [config.quality] jpeg quality. If using an "image/jpeg" mimeType, * you can specify the quality from 0 to 1, where 0 is very poor quality and 1 * is very high quality */ toDataURL: function(config) { config = config || {}; var mimeType = config.mimeType || null, quality = config.quality || null, x = config.x || 0, y = config.y || 0, canvas = new Kinetic.SceneCanvas({ width: config.width || this.getWidth(), height: config.height || this.getHeight(), pixelRatio: 1 }), _context = canvas.getContext()._context, layers = this.children; if(x || y) { _context.translate(-1 * x, -1 * y); } function drawLayer(n) { var layer = layers[n], layerUrl = layer.toDataURL(), imageObj = new Kinetic.window.Image(); imageObj.onload = function() { _context.drawImage(imageObj, 0, 0); if(n < layers.length - 1) { drawLayer(n + 1); } else { config.callback(canvas.toDataURL(mimeType, quality)); } }; imageObj.src = layerUrl; } drawLayer(0); }, /** * converts stage into an image. * @method * @memberof Kinetic.Stage.prototype * @param {Object} config * @param {Function} config.callback function executed when the composite has completed * @param {String} [config.mimeType] can be "image/png" or "image/jpeg". * "image/png" is the default * @param {Number} [config.x] x position of canvas section * @param {Number} [config.y] y position of canvas section * @param {Number} [config.width] width of canvas section * @param {Number} [config.height] height of canvas section * @param {Number} [config.quality] jpeg quality. If using an "image/jpeg" mimeType, * you can specify the quality from 0 to 1, where 0 is very poor quality and 1 * is very high quality */ toImage: function(config) { var cb = config.callback; config.callback = function(dataUrl) { Kinetic.Util._getImage(dataUrl, function(img) { cb(img); }); }; this.toDataURL(config); }, /** * get visible intersection shape. This is the preferred * method for determining if a point intersects a shape or not * @method * @memberof Kinetic.Stage.prototype * @param {Object} pos * @param {Number} pos.x * @param {Number} pos.y * @returns {Kinetic.Shape} */ getIntersection: function(pos) { var layers = this.getChildren(), len = layers.length, end = len - 1, n, shape; for(n = end; n >= 0; n--) { shape = layers[n].getIntersection(pos); if (shape) { return shape; } } return null; }, _resizeDOM: function() { if(this.content) { var width = this.getWidth(), height = this.getHeight(), layers = this.getChildren(), len = layers.length, n, layer; // set content dimensions this.content.style.width = width + PX; this.content.style.height = height + PX; this.bufferCanvas.setSize(width, height); this.bufferHitCanvas.setSize(width, height); // set layer dimensions for(n = 0; n < len; n++) { layer = layers[n]; layer.getCanvas().setSize(width, height); layer.hitCanvas.setSize(width, height); layer.draw(); } } }, /** * add layer or layers to stage * @method * @memberof Kinetic.Stage.prototype * @param {...Kinetic.Layer} layer * @example * stage.add(layer1, layer2, layer3); */ add: function(layer) { if (arguments.length > 1) { for (var i = 0; i < arguments.length; i++) { this.add(arguments[i]); } return; } Kinetic.Container.prototype.add.call(this, layer); layer._setCanvasSize(this.width(), this.height()); // draw layer and append canvas to container layer.draw(); this.content.appendChild(layer.canvas._canvas); // chainable return this; }, getParent: function() { return null; }, getLayer: function() { return null; }, /** * returns a {@link Kinetic.Collection} of layers * @method * @memberof Kinetic.Stage.prototype */ getLayers: function() { return this.getChildren(); }, _bindContentEvents: function() { for (var n = 0; n < eventsLength; n++) { addEvent(this, EVENTS[n]); } }, _mouseover: function(evt) { if (!Kinetic.UA.mobile) { this._setPointerPosition(evt); this._fire(CONTENT_MOUSEOVER, {evt: evt}); } }, _mouseout: function(evt) { if (!Kinetic.UA.mobile) { this._setPointerPosition(evt); var targetShape = this.targetShape; if(targetShape && !Kinetic.isDragging()) { targetShape._fireAndBubble(MOUSEOUT, {evt: evt}); targetShape._fireAndBubble(MOUSELEAVE, {evt: evt}); this.targetShape = null; } this.pointerPos = undefined; this._fire(CONTENT_MOUSEOUT, {evt: evt}); } }, _mousemove: function(evt) { if (!Kinetic.UA.mobile) { this._setPointerPosition(evt); var dd = Kinetic.DD; if (Kinetic.draggedshape) { var shape = Kinetic.draggedshape; } else { var shape = this.getIntersection(this.getPointerPosition()); //var shape = null; } if(shape && shape.isListening()) { if(!Kinetic.isDragging() && (!this.targetShape || this.targetShape._id !== shape._id)) { if(this.targetShape) { this.targetShape._fireAndBubble(MOUSEOUT, {evt: evt}, shape); this.targetShape._fireAndBubble(MOUSELEAVE, {evt: evt}, shape); } shape._fireAndBubble(MOUSEOVER, {evt: evt}, this.targetShape); shape._fireAndBubble(MOUSEENTER, {evt: evt}, this.targetShape); this.targetShape = shape; } else { shape._fireAndBubble(MOUSEMOVE, {evt: evt}); } } /* * if no shape was detected, clear target shape and try * to run mouseout from previous target shape */ else { if(this.targetShape && !Kinetic.isDragging()) { this.targetShape._fireAndBubble(MOUSEOUT, {evt: evt}); this.targetShape._fireAndBubble(MOUSELEAVE, {evt: evt}); this.targetShape = null; } } // content event this._fire(CONTENT_MOUSEMOVE, {evt: evt}); if(dd) { dd._drag(evt); } } // always call preventDefault for desktop events because some browsers // try to drag and drop the canvas element if (evt.preventDefault) { evt.preventDefault(); } }, _mousedown: function(evt) { if (!Kinetic.UA.mobile) { this._setPointerPosition(evt); var shape = this.getIntersection(this.getPointerPosition()); Kinetic.listenClickTap = true; if (shape && shape.isListening()) { this.clickStartShape = shape; shape._fireAndBubble(MOUSEDOWN, {evt: evt}); } // content event this._fire(CONTENT_MOUSEDOWN, {evt: evt}); } // always call preventDefault for desktop events because some browsers // try to drag and drop the canvas element if (evt.preventDefault) { evt.preventDefault(); } }, _mouseup: function(evt) { if (!Kinetic.UA.mobile) { this._setPointerPosition(evt); var that = this, shape = this.getIntersection(this.getPointerPosition()), clickStartShape = this.clickStartShape, fireDblClick = false; if(Kinetic.inDblClickWindow) { fireDblClick = true; Kinetic.inDblClickWindow = false; } else { Kinetic.inDblClickWindow = true; } setTimeout(function() { Kinetic.inDblClickWindow = false; }, Kinetic.dblClickWindow); if (shape && shape.isListening()) { shape._fireAndBubble(MOUSEUP, {evt: evt}); // detect if click or double click occurred if(Kinetic.listenClickTap && clickStartShape && clickStartShape._id === shape._id) { shape._fireAndBubble(CLICK, {evt: evt}); if(fireDblClick) { shape._fireAndBubble(DBL_CLICK, {evt: evt}); } } } // content events this._fire(CONTENT_MOUSEUP, {evt: evt}); if (Kinetic.listenClickTap) { this._fire(CONTENT_CLICK, {evt: evt}); if(fireDblClick) { this._fire(CONTENT_DBL_CLICK, {evt: evt}); } } Kinetic.listenClickTap = false; } // always call preventDefault for desktop events because some browsers // try to drag and drop the canvas element if (evt.preventDefault) { evt.preventDefault(); } }, _touchstart: function(evt) { this._setPointerPosition(evt); var shape = this.getIntersection(this.getPointerPosition()); Kinetic.listenClickTap = true; if (shape && shape.isListening()) { this.tapStartShape = shape; shape._fireAndBubble(TOUCHSTART, {evt: evt}); // only call preventDefault if the shape is listening for events if (shape.isListening() && evt.preventDefault) { evt.preventDefault(); } } // content event this._fire(CONTENT_TOUCHSTART, {evt: evt}); }, _touchend: function(evt) { this._setPointerPosition(evt); var shape = this.getIntersection(this.getPointerPosition()), fireDblClick = false; if(Kinetic.inDblClickWindow) { fireDblClick = true; Kinetic.inDblClickWindow = false; } else { Kinetic.inDblClickWindow = true; } setTimeout(function() { Kinetic.inDblClickWindow = false; }, Kinetic.dblClickWindow); if (shape && shape.isListening()) { shape._fireAndBubble(TOUCHEND, {evt: evt}); // detect if tap or double tap occurred if(Kinetic.listenClickTap && shape._id === this.tapStartShape._id) { shape._fireAndBubble(TAP, {evt: evt}); if(fireDblClick) { shape._fireAndBubble(DBL_TAP, {evt: evt}); } } // only call preventDefault if the shape is listening for events if (shape.isListening() && evt.preventDefault) { evt.preventDefault(); } } // content events if (Kinetic.listenClickTap) { this._fire(CONTENT_TOUCHEND, {evt: evt}); if(fireDblClick) { this._fire(CONTENT_DBL_TAP, {evt: evt}); } } Kinetic.listenClickTap = false; }, _touchmove: function(evt) { this._setPointerPosition(evt); var dd = Kinetic.DD; if (Kinetic.draggedshape) { var shape = Kinetic.draggedshape; } else { var shape = this.getIntersection(this.getPointerPosition()); } if (shape && shape.isListening()) { shape._fireAndBubble(TOUCHMOVE, {evt: evt}); // only call preventDefault if the shape is listening for events if (shape.isListening() && evt.preventDefault) { evt.preventDefault(); } } this._fire(CONTENT_TOUCHMOVE, {evt: evt}); // start drag and drop if(dd) { dd._drag(evt); } }, _setPointerPosition: function(evt) { var contentPosition = this._getContentPosition(), offsetX = evt.offsetX, clientX = evt.clientX, x = null, y = null, touch; evt = evt ? evt : window.event; // touch events if(evt.touches !== undefined) { // currently, only handle one finger if (evt.touches.length > 0) { touch = evt.touches[0]; // get the information for finger #1 x = touch.clientX - contentPosition.left; y = touch.clientY - contentPosition.top; } } // mouse events else { // if offsetX is defined, assume that offsetY is defined as well if (offsetX !== undefined) { x = offsetX; y = evt.offsetY; } // we unforunately have to use UA detection here because accessing // the layerX or layerY properties in newer veresions of Chrome // throws a JS warning. layerX and layerY are required for FF // when the container is transformed via CSS. else if (Kinetic.UA.browser === 'mozilla') { x = evt.layerX; y = evt.layerY; } // if clientX is defined, assume that clientY is defined as well else if (clientX !== undefined && contentPosition) { x = clientX - contentPosition.left; y = evt.clientY - contentPosition.top; } } if (x !== null && y !== null) { this.pointerPos = { x: x, y: y }; } }, _getContentPosition: function() { var rect = this.content.getBoundingClientRect ? this.content.getBoundingClientRect() : { top: 0, left: 0 }; return { top: rect.top, left: rect.left }; }, _buildDOM: function() { var container = this.getContainer(); if (!container) { if (Kinetic.Util.isBrowser()) { throw 'Stage has not container. But container is required'; } else { // automatically create element for jsdom in nodejs env container = Kinetic.document.createElement(DIV); } } // clear content inside container container.innerHTML = EMPTY_STRING; // content this.content = Kinetic.document.createElement(DIV); this.content.style.position = RELATIVE; this.content.style.display = INLINE_BLOCK; this.content.className = KINETICJS_CONTENT; this.content.setAttribute('role', 'presentation'); container.appendChild(this.content); // the buffer canvas pixel ratio must be 1 because it is used as an // intermediate canvas before copying the result onto a scene canvas. // not setting it to 1 will result in an over compensation this.bufferCanvas = new Kinetic.SceneCanvas({ pixelRatio: 1 }); this.bufferHitCanvas = new Kinetic.HitCanvas(); this._resizeDOM(); }, _onContent: function(typesStr, handler) { var types = typesStr.split(SPACE), len = types.length, n, baseEvent; for(n = 0; n < len; n++) { baseEvent = types[n]; this.content.addEventListener(baseEvent, handler, false); } }, // currently cache function is now working for stage, because stage has no its own canvas element // TODO: may be it is better to cache all children layers? cache: function() { Kinetic.Util.warn('Cache function is not allowed for stage. You may use cache only for layers, groups and shapes.'); return; }, clearCache : function() { } }); Kinetic.Util.extend(Kinetic.Stage, Kinetic.Container); // add getters and setters Kinetic.Factory.addGetter(Kinetic.Stage, 'container'); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Stage, 'container'); /** * get container DOM element * @name container * @method * @memberof Kinetic.Stage.prototype * @returns {DomElement} container * @example * // get container
* var container = stage.container();

* * // set container
* var container = document.createElement('div');
* body.appendChild(container);
* stage.container(container); */ })(); ;(function() { Kinetic.Util.addMethods(Kinetic.BaseLayer, { ___init: function(config) { this.nodeType = 'Layer'; Kinetic.Container.call(this, config); }, createPNGStream : function() { return this.canvas._canvas.createPNGStream(); }, /** * get layer canvas * @method * @memberof Kinetic.BaseLayer.prototype */ getCanvas: function() { return this.canvas; }, /** * get layer hit canvas * @method * @memberof Kinetic.BaseLayer.prototype */ getHitCanvas: function() { return this.hitCanvas; }, /** * get layer canvas context * @method * @memberof Kinetic.BaseLayer.prototype */ getContext: function() { return this.getCanvas().getContext(); }, /** * clear scene and hit canvas contexts tied to the layer * @method * @memberof Kinetic.BaseLayer.prototype * @param {Object} [bounds] * @param {Number} [bounds.x] * @param {Number} [bounds.y] * @param {Number} [bounds.width] * @param {Number} [bounds.height] * @example * layer.clear();
* layer.clear(0, 0, 100, 100); */ clear: function(bounds) { this.getContext().clear(bounds); this.getHitCanvas().getContext().clear(bounds); return this; }, // extend Node.prototype.setZIndex setZIndex: function(index) { Kinetic.Node.prototype.setZIndex.call(this, index); var stage = this.getStage(); if(stage) { stage.content.removeChild(this.getCanvas()._canvas); if(index < stage.getChildren().length - 1) { stage.content.insertBefore(this.getCanvas()._canvas, stage.getChildren()[index + 1].getCanvas()._canvas); } else { stage.content.appendChild(this.getCanvas()._canvas); } } return this; }, // extend Node.prototype.moveToTop moveToTop: function() { Kinetic.Node.prototype.moveToTop.call(this); var stage = this.getStage(); if(stage) { stage.content.removeChild(this.getCanvas()._canvas); stage.content.appendChild(this.getCanvas()._canvas); } }, // extend Node.prototype.moveUp moveUp: function() { if(Kinetic.Node.prototype.moveUp.call(this)) { var stage = this.getStage(); if(stage) { stage.content.removeChild(this.getCanvas()._canvas); if(this.index < stage.getChildren().length - 1) { stage.content.insertBefore(this.getCanvas()._canvas, stage.getChildren()[this.index + 1].getCanvas()._canvas); } else { stage.content.appendChild(this.getCanvas()._canvas); } } } }, // extend Node.prototype.moveDown moveDown: function() { if(Kinetic.Node.prototype.moveDown.call(this)) { var stage = this.getStage(); if(stage) { var children = stage.getChildren(); stage.content.removeChild(this.getCanvas()._canvas); stage.content.insertBefore(this.getCanvas()._canvas, children[this.index + 1].getCanvas()._canvas); } } }, // extend Node.prototype.moveToBottom moveToBottom: function() { if(Kinetic.Node.prototype.moveToBottom.call(this)) { var stage = this.getStage(); if(stage) { var children = stage.getChildren(); stage.content.removeChild(this.getCanvas()._canvas); stage.content.insertBefore(this.getCanvas()._canvas, children[1].getCanvas()._canvas); } } }, getLayer: function() { return this; }, remove: function() { var _canvas = this.getCanvas()._canvas; Kinetic.Node.prototype.remove.call(this); if(_canvas && _canvas.parentNode && Kinetic.Util._isInDocument(_canvas)) { _canvas.parentNode.removeChild(_canvas); } return this; }, getStage: function() { return this.parent; } }); Kinetic.Util.extend(Kinetic.BaseLayer, Kinetic.Container); // add getters and setters Kinetic.Factory.addGetterSetter(Kinetic.BaseLayer, 'clearBeforeDraw', true); /** * get/set clearBeforeDraw flag which determines if the layer is cleared or not * before drawing * @name clearBeforeDraw * @method * @memberof Kinetic.BaseLayer.prototype * @param {Boolean} clearBeforeDraw * @returns {Boolean} * @example * // get clearBeforeDraw flag
* var clearBeforeDraw = layer.clearBeforeDraw();

* * // disable clear before draw
* layer.clearBeforeDraw(false);

* * // enable clear before draw
* layer.clearBeforeDraw(true); */ Kinetic.Collection.mapMethods(Kinetic.BaseLayer); })(); ;(function() { // constants var HASH = '#', BEFORE_DRAW ='beforeDraw', DRAW = 'draw', /* * 2 - 3 - 4 * | | * 1 - 0 5 * | * 8 - 7 - 6 */ INTERSECTION_OFFSETS = [ {x: 0, y: 0}, // 0 {x: -1, y: 0}, // 1 {x: -1, y: -1}, // 2 {x: 0, y: -1}, // 3 {x: 1, y: -1}, // 4 {x: 1, y: 0}, // 5 {x: 1, y: 1}, // 6 {x: 0, y: 1}, // 7 {x: -1, y: 1} // 8 ], INTERSECTION_OFFSETS_LEN = INTERSECTION_OFFSETS.length; Kinetic.Util.addMethods(Kinetic.Layer, { ____init: function(config) { this.nodeType = 'Layer'; this.canvas = new Kinetic.SceneCanvas(); this.hitCanvas = new Kinetic.HitCanvas(); // call super constructor Kinetic.BaseLayer.call(this, config); }, _setCanvasSize: function(width, height) { this.canvas.setSize(width, height); this.hitCanvas.setSize(width, height); }, _validateAdd: function(child) { var type = child.getType(); if (type !== 'Group' && type !== 'Shape') { Kinetic.Util.error('You may only add groups and shapes to a layer.'); } }, /** * get visible intersection shape. This is the preferred * method for determining if a point intersects a shape or not * @method * @memberof Kinetic.Layer.prototype * @param {Object} pos * @param {Number} pos.x * @param {Number} pos.y * @returns {Kinetic.Shape} */ getIntersection: function(pos) { var obj, i, intersectionOffset, shape; if(this.hitGraphEnabled() && this.isVisible()) { for (i=0; i 0) { return { antialiased: true }; } // empty pixel else { return {}; } }, drawScene: function(can, top) { var layer = this.getLayer(), canvas = can || (layer && layer.getCanvas()); this._fire(BEFORE_DRAW, { node: this }); if(this.getClearBeforeDraw()) { canvas.getContext().clear(); } Kinetic.Container.prototype.drawScene.call(this, canvas, top); this._fire(DRAW, { node: this }); return this; }, // the apply transform method is handled by the Layer and FastLayer class // because it is up to the layer to decide if an absolute or relative transform // should be used _applyTransform: function(shape, context, top) { var m = shape.getAbsoluteTransform(top).getMatrix(); context.transform(m[0], m[1], m[2], m[3], m[4], m[5]); }, drawHit: function(can, top) { var layer = this.getLayer(), canvas = can || (layer && layer.hitCanvas); if(layer && layer.getClearBeforeDraw()) { layer.getHitCanvas().getContext().clear(); } Kinetic.Container.prototype.drawHit.call(this, canvas, top); return this; }, /** * clear scene and hit canvas contexts tied to the layer * @method * @memberof Kinetic.Layer.prototype * @param {Object} [bounds] * @param {Number} [bounds.x] * @param {Number} [bounds.y] * @param {Number} [bounds.width] * @param {Number} [bounds.height] * @example * layer.clear();
* layer.clear(0, 0, 100, 100); */ clear: function(bounds) { this.getContext().clear(bounds); this.getHitCanvas().getContext().clear(bounds); return this; }, // extend Node.prototype.setVisible setVisible: function(visible) { Kinetic.Node.prototype.setVisible.call(this, visible); if(visible) { this.getCanvas()._canvas.style.display = 'block'; this.hitCanvas._canvas.style.display = 'block'; } else { this.getCanvas()._canvas.style.display = 'none'; this.hitCanvas._canvas.style.display = 'none'; } return this; }, /** * enable hit graph * @name enableHitGraph * @method * @memberof Kinetic.Layer.prototype * @returns {Node} */ enableHitGraph: function() { this.setHitGraphEnabled(true); return this; }, /** * disable hit graph * @name enableHitGraph * @method * @memberof Kinetic.Layer.prototype * @returns {Node} */ disableHitGraph: function() { this.setHitGraphEnabled(false); return this; } }); Kinetic.Util.extend(Kinetic.Layer, Kinetic.BaseLayer); Kinetic.Factory.addGetterSetter(Kinetic.Layer, 'hitGraphEnabled', true); /** * get/set hitGraphEnabled flag. Disabling the hit graph will greatly increase * draw performance because the hit graph will not be redrawn each time the layer is * drawn. This, however, also disables mouse/touch event detection * @name hitGraphEnabled * @method * @memberof Kinetic.Layer.prototype * @param {Boolean} enabled * @returns {Boolean} * @example * // get hitGraphEnabled flag
* var hitGraphEnabled = layer.hitGraphEnabled();

* * // disable hit graph
* layer.hitGraphEnabled(false);

* * // enable hit graph
* layer.hitGraphEnabled(true); */ Kinetic.Collection.mapMethods(Kinetic.Layer); })(); ;(function() { // constants var HASH = '#', BEFORE_DRAW ='beforeDraw', DRAW = 'draw'; Kinetic.Util.addMethods(Kinetic.FastLayer, { ____init: function(config) { this.nodeType = 'Layer'; this.canvas = new Kinetic.SceneCanvas(); // call super constructor Kinetic.BaseLayer.call(this, config); }, _validateAdd: function(child) { var type = child.getType(); if (type !== 'Shape') { Kinetic.Util.error('You may only add shapes to a fast layer.'); } }, _setCanvasSize: function(width, height) { this.canvas.setSize(width, height); }, hitGraphEnabled: function() { return false; }, getIntersection: function() { return null; }, drawScene: function(can) { var layer = this.getLayer(), canvas = can || (layer && layer.getCanvas()); if(this.getClearBeforeDraw()) { canvas.getContext().clear(); } Kinetic.Container.prototype.drawScene.call(this, canvas); return this; }, // the apply transform method is handled by the Layer and FastLayer class // because it is up to the layer to decide if an absolute or relative transform // should be used _applyTransform: function(shape, context, top) { if (!top || top._id !== this._id) { var m = shape.getTransform().getMatrix(); context.transform(m[0], m[1], m[2], m[3], m[4], m[5]); } }, draw: function() { this.drawScene(); return this; }, /** * clear scene and hit canvas contexts tied to the layer * @method * @memberof Kinetic.FastLayer.prototype * @param {Object} [bounds] * @param {Number} [bounds.x] * @param {Number} [bounds.y] * @param {Number} [bounds.width] * @param {Number} [bounds.height] * @example * layer.clear();
* layer.clear(0, 0, 100, 100); */ clear: function(bounds) { this.getContext().clear(bounds); return this; }, // extend Node.prototype.setVisible setVisible: function(visible) { Kinetic.Node.prototype.setVisible.call(this, visible); if(visible) { this.getCanvas()._canvas.style.display = 'block'; } else { this.getCanvas()._canvas.style.display = 'none'; } return this; } }); Kinetic.Util.extend(Kinetic.FastLayer, Kinetic.BaseLayer); Kinetic.Collection.mapMethods(Kinetic.FastLayer); })(); ;(function() { Kinetic.Util.addMethods(Kinetic.Group, { ___init: function(config) { this.nodeType = 'Group'; // call super constructor Kinetic.Container.call(this, config); }, _validateAdd: function(child) { var type = child.getType(); if (type !== 'Group' && type !== 'Shape') { Kinetic.Util.error('You may only add groups and shapes to groups.'); } } }); Kinetic.Util.extend(Kinetic.Group, Kinetic.Container); Kinetic.Collection.mapMethods(Kinetic.Group); })(); ;(function() { /** * Rect constructor * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {Number} [config.cornerRadius] * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var rect = new Kinetic.Rect({
* width: 100,
* height: 50,
* fill: 'red',
* stroke: 'black',
* strokeWidth: 5
* }); */ Kinetic.Rect = function(config) { this.___init(config); }; Kinetic.Rect.prototype = { ___init: function(config) { Kinetic.Shape.call(this, config); this.className = 'Rect'; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var cornerRadius = this.getCornerRadius(), width = this.getWidth(), height = this.getHeight(); context.beginPath(); if(!cornerRadius) { // simple rect - don't bother doing all that complicated maths stuff. context.rect(0, 0, width, height); } else { // arcTo would be nicer, but browser support is patchy (Opera) context.moveTo(cornerRadius, 0); context.lineTo(width - cornerRadius, 0); context.arc(width - cornerRadius, cornerRadius, cornerRadius, Math.PI * 3 / 2, 0, false); context.lineTo(width, height - cornerRadius); context.arc(width - cornerRadius, height - cornerRadius, cornerRadius, 0, Math.PI / 2, false); context.lineTo(cornerRadius, height); context.arc(cornerRadius, height - cornerRadius, cornerRadius, Math.PI / 2, Math.PI, false); context.lineTo(0, cornerRadius); context.arc(cornerRadius, cornerRadius, cornerRadius, Math.PI, Math.PI * 3 / 2, false); } context.closePath(); context.fillStrokeShape(this); } }; Kinetic.Util.extend(Kinetic.Rect, Kinetic.Shape); Kinetic.Factory.addGetterSetter(Kinetic.Rect, 'cornerRadius', 0); /** * get/set corner radius * @name cornerRadius * @method * @memberof Kinetic.Rect.prototype * @param {Number} cornerRadius * @returns {Number} * @example * // get corner radius
* var cornerRadius = rect.cornerRadius();

* * // set corner radius
* rect.cornerRadius(10); */ Kinetic.Collection.mapMethods(Kinetic.Rect); })(); ;(function() { // the 0.0001 offset fixes a bug in Chrome 27 var PIx2 = (Math.PI * 2) - 0.0001, CIRCLE = 'Circle'; /** * Circle constructor * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {Number} config.radius * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * // create circle * var circle = new Kinetic.Circle({
* radius: 40,
* fill: 'red',
* stroke: 'black'
* strokeWidth: 5
* }); */ Kinetic.Circle = function(config) { this.___init(config); }; Kinetic.Circle.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = CIRCLE; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { context.beginPath(); context.arc(0, 0, this.getRadius(), 0, PIx2, false); context.closePath(); context.fillStrokeShape(this); }, // implements Shape.prototype.getWidth() getWidth: function() { return this.getRadius() * 2; }, // implements Shape.prototype.getHeight() getHeight: function() { return this.getRadius() * 2; }, // implements Shape.prototype.setWidth() setWidth: function(width) { Kinetic.Node.prototype.setWidth.call(this, width); this.setRadius(width / 2); }, // implements Shape.prototype.setHeight() setHeight: function(height) { Kinetic.Node.prototype.setHeight.call(this, height); this.setRadius(height / 2); } }; Kinetic.Util.extend(Kinetic.Circle, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Circle, 'radius', 0); /** * get/set radius * @name radius * @method * @memberof Kinetic.Circle.prototype * @param {Number} radius * @returns {Number} * @example * // get radius
* var radius = circle.radius();

* * // set radius
* circle.radius(10);
*/ Kinetic.Collection.mapMethods(Kinetic.Circle); })(); ;(function() { // the 0.0001 offset fixes a bug in Chrome 27 var PIx2 = (Math.PI * 2) - 0.0001, ELLIPSE = 'Ellipse'; /** * Ellipse constructor * @constructor * @augments Kinetic.Shape * @param {Object} config * @param {Object} config.radius defines x and y radius * @@ShapeParams * @@NodeParams * @example * var ellipse = new Kinetic.Ellipse({
* radius : {
* x : 50,
* y : 50
* },
* fill: 'red'
* }); */ Kinetic.Ellipse = function(config) { this.___init(config); }; Kinetic.Ellipse.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = ELLIPSE; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var r = this.getRadius(), rx = r.x, ry = r.y; context.beginPath(); context.save(); if(rx !== ry) { context.scale(1, ry / rx); } context.arc(0, 0, rx, 0, PIx2, false); context.restore(); context.closePath(); context.fillStrokeShape(this); }, // implements Shape.prototype.getWidth() getWidth: function() { return this.getRadius().x * 2; }, // implements Shape.prototype.getHeight() getHeight: function() { return this.getRadius().y * 2; }, // implements Shape.prototype.setWidth() setWidth: function(width) { Kinetic.Node.prototype.setWidth.call(this, width); this.setRadius({ x: width / 2 }); }, // implements Shape.prototype.setHeight() setHeight: function(height) { Kinetic.Node.prototype.setHeight.call(this, height); this.setRadius({ y: height / 2 }); } }; Kinetic.Util.extend(Kinetic.Ellipse, Kinetic.Shape); // add getters setters Kinetic.Factory.addComponentsGetterSetter(Kinetic.Ellipse, 'radius', ['x', 'y']); /** * get/set radius * @name radius * @method * @memberof Kinetic.Ellipse.prototype * @param {Object} radius * @param {Number} radius.x * @param {Number} radius.y * @returns {Object} * @example * // get radius
* var radius = ellipse.radius();

* * // set radius
* ellipse.radius({
* x: 200,
* y: 100
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Ellipse, 'radiusX', 0); /** * get/set radius x * @name radiusX * @method * @memberof Kinetic.Ellipse.prototype * @param {Number} x * @returns {Number} * @example * // get radius x
* var radiusX = ellipse.radiusX();

* * // set radius x
* ellipse.radiusX(200); */ Kinetic.Factory.addGetterSetter(Kinetic.Ellipse, 'radiusY', 0); /** * get/set radius y * @name radiusY * @method * @memberof Kinetic.Ellipse.prototype * @param {Number} y * @returns {Number} * @example * // get radius y
* var radiusY = ellipse.radiusY();

* * // set radius y
* ellipse.radiusY(200); */ Kinetic.Collection.mapMethods(Kinetic.Ellipse); })();;(function() { // the 0.0001 offset fixes a bug in Chrome 27 var PIx2 = (Math.PI * 2) - 0.0001; /** * Ring constructor * @constructor * @augments Kinetic.Shape * @param {Object} config * @param {Number} config.innerRadius * @param {Number} config.outerRadius * @param {Boolean} [config.clockwise] * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var ring = new Kinetic.Ring({
* innerRadius: 40,
* outerRadius: 80,
* fill: 'red',
* stroke: 'black',
* strokeWidth: 5
* }); */ Kinetic.Ring = function(config) { this.___init(config); }; Kinetic.Ring.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = 'Ring'; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { context.beginPath(); context.arc(0, 0, this.getInnerRadius(), 0, PIx2, false); context.moveTo(this.getOuterRadius(), 0); context.arc(0, 0, this.getOuterRadius(), PIx2, 0, true); context.closePath(); context.fillStrokeShape(this); }, // implements Shape.prototype.getWidth() getWidth: function() { return this.getOuterRadius() * 2; }, // implements Shape.prototype.getHeight() getHeight: function() { return this.getOuterRadius() * 2; }, // implements Shape.prototype.setWidth() setWidth: function(width) { Kinetic.Node.prototype.setWidth.call(this, width); this.setOuterRadius(width / 2); }, // implements Shape.prototype.setHeight() setHeight: function(height) { Kinetic.Node.prototype.setHeight.call(this, height); this.setOuterRadius(height / 2); } }; Kinetic.Util.extend(Kinetic.Ring, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Ring, 'innerRadius', 0); /** * get/set innerRadius * @name innerRadius * @method * @memberof Kinetic.Ring.prototype * @param {Number} innerRadius * @returns {Number} * @example * // get inner radius
* var innerRadius = ring.innerRadius();

* * // set inner radius
* ring.innerRadius(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Ring, 'outerRadius', 0); /** * get/set outerRadius * @name outerRadius * @method * @memberof Kinetic.Ring.prototype * @param {Number} outerRadius * @returns {Number} * @example * // get outer radius
* var outerRadius = ring.outerRadius();

* * // set outer radius
* ring.outerRadius(20); */ Kinetic.Collection.mapMethods(Kinetic.Ring); })(); ;(function() { /** * Wedge constructor * @constructor * @augments Kinetic.Shape * @param {Object} config * @param {Number} config.angle in degrees * @param {Number} config.radius * @param {Boolean} [config.clockwise] * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * // draw a wedge that's pointing downwards
* var wedge = new Kinetic.Wedge({
* radius: 40,
* fill: 'red',
* stroke: 'black'
* strokeWidth: 5,
* angleDeg: 60,
* rotationDeg: -120
* }); */ Kinetic.Wedge = function(config) { this.___init(config); }; Kinetic.Wedge.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = 'Wedge'; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { context.beginPath(); context.arc(0, 0, this.getRadius(), 0, Kinetic.getAngle(this.getAngle()), this.getClockwise()); context.lineTo(0, 0); context.closePath(); context.fillStrokeShape(this); } }; Kinetic.Util.extend(Kinetic.Wedge, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Wedge, 'radius', 0); /** * get/set radius * @name radius * @method * @memberof Kinetic.Wedge.prototype * @param {Number} radius * @returns {Number} * @example * // get radius
* var radius = wedge.radius();

* * // set radius
* wedge.radius(10);
*/ Kinetic.Factory.addGetterSetter(Kinetic.Wedge, 'angle', 0); /** * get/set angle in degrees * @name angle * @method * @memberof Kinetic.Wedge.prototype * @param {Number} angle * @returns {Number} * @example * // get angle
* var angle = wedge.angle();

* * // set angle
* wedge.angle(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Wedge, 'clockwise', false); /** * get/set clockwise flag * @name clockwise * @method * @memberof Kinetic.Wedge.prototype * @param {Number} clockwise * @returns {Number} * @example * // get clockwise flag
* var clockwise = wedge.clockwise();

* * // draw wedge counter-clockwise
* wedge.clockwise(false);

* * // draw wedge clockwise
* wedge.clockwise(true); */ Kinetic.Factory.backCompat(Kinetic.Wedge, { angleDeg: 'angle', getAngleDeg: 'getAngle', setAngleDeg: 'setAngle' }); Kinetic.Collection.mapMethods(Kinetic.Wedge); })(); ;(function() { var PI_OVER_180 = Math.PI / 180; /** * Arc constructor * @constructor * @augments Kinetic.Shape * @param {Object} config * @param {Number} config.angle in degrees * @param {Number} config.innerRadius * @param {Number} config.outerRadius * @param {Boolean} [config.clockwise] * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * // draw a Arc that's pointing downwards
* var arc = new Kinetic.Arc({
* innerRadius: 40,
* outerRadius: 80,
* fill: 'red',
* stroke: 'black'
* strokeWidth: 5,
* angle: 60,
* rotationDeg: -120
* }); */ Kinetic.Arc = function(config) { this.___init(config); }; Kinetic.Arc.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = 'Arc'; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var angle = Kinetic.getAngle(this.angle()), clockwise = this.clockwise(); context.beginPath(); context.arc(0, 0, this.getOuterRadius(), 0, angle, clockwise); context.arc(0, 0, this.getInnerRadius(), angle, 0, !clockwise); context.closePath(); context.fillStrokeShape(this); } }; Kinetic.Util.extend(Kinetic.Arc, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Arc, 'innerRadius', 0); /** * get/set innerRadius * @name innerRadius * @method * @memberof Kinetic.Arc.prototype * @param {Number} innerRadius * @returns {Number} * @example * // get inner radius * var innerRadius = arc.innerRadius(); * * // set inner radius * arc.innerRadius(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Arc, 'outerRadius', 0); /** * get/set outerRadius * @name outerRadius * @method * @memberof Kinetic.Arc.prototype * @param {Number} outerRadius * @returns {Number} * @example * // get outer radius
* var outerRadius = arc.outerRadius();

* * // set outer radius
* arc.outerRadius(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Arc, 'angle', 0); /** * get/set angle in degrees * @name angle * @method * @memberof Kinetic.Arc.prototype * @param {Number} angle * @returns {Number} * @example * // get angle
* var angle = arc.angle();

* * // set angle
* arc.angle(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Arc, 'clockwise', false); /** * get/set clockwise flag * @name clockwise * @method * @memberof Kinetic.Arc.prototype * @param {Boolean} clockwise * @returns {Boolean} * @example * // get clockwise flag
* var clockwise = arc.clockwise();

* * // draw arc counter-clockwise
* arc.clockwise(false);

* * // draw arc clockwise
* arc.clockwise(true); */ Kinetic.Collection.mapMethods(Kinetic.Arc); })(); ;(function() { // CONSTANTS var IMAGE = 'Image'; /** * Image constructor * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {ImageObject} config.image * @param {Object} [config.crop] * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var imageObj = new Image();
* imageObj.onload = function() {
* var image = new Kinetic.Image({
* x: 200,
* y: 50,
* image: imageObj,
* width: 100,
* height: 100
* });
* };
* imageObj.src = '/path/to/image.jpg' */ Kinetic.Image = function(config) { this.___init(config); }; Kinetic.Image.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = IMAGE; this.sceneFunc(this._sceneFunc); this.hitFunc(this._hitFunc); }, _useBufferCanvas: function() { return (this.hasShadow() || this.getAbsoluteOpacity() !== 1) && this.hasStroke(); }, _sceneFunc: function(context) { var width = this.getWidth(), height = this.getHeight(), image = this.getImage(), crop, cropWidth, cropHeight, params; if (image) { crop = this.getCrop(); cropWidth = crop.width; cropHeight = crop.height; if (cropWidth && cropHeight) { params = [image, crop.x, crop.y, cropWidth, cropHeight, 0, 0, width, height]; } else { params = [image, 0, 0, width, height]; } } context.beginPath(); context.rect(0, 0, width, height); context.closePath(); context.fillStrokeShape(this); if (image) { context.drawImage.apply(context, params); } }, _hitFunc: function(context) { var width = this.getWidth(), height = this.getHeight(); context.beginPath(); context.rect(0, 0, width, height); context.closePath(); context.fillStrokeShape(this); }, getWidth: function() { var image = this.getImage(); return this.attrs.width || (image ? image.width : 0); }, getHeight: function() { var image = this.getImage(); return this.attrs.height || (image ? image.height : 0); } }; Kinetic.Util.extend(Kinetic.Image, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Image, 'image'); /** * set image * @name setImage * @method * @memberof Kinetic.Image.prototype * @param {ImageObject} image */ /** * get image * @name getImage * @method * @memberof Kinetic.Image.prototype * @returns {ImageObject} */ Kinetic.Factory.addComponentsGetterSetter(Kinetic.Image, 'crop', ['x', 'y', 'width', 'height']); /** * get/set crop * @method * @name crop * @memberof Kinetic.Image.prototype * @param {Object} crop * @param {Number} crop.x * @param {Number} crop.y * @param {Number} crop.width * @param {Number} crop.height * @returns {Object} * @example * // get crop
* var crop = image.crop();

* * // set crop
* image.crop({
* x: 20,
* y: 20,
* width: 20,
* height: 20
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Image, 'cropX', 0); /** * get/set crop x * @method * @name cropX * @memberof Kinetic.Image.prototype * @param {Number} x * @returns {Number} * @example * // get crop x
* var cropX = image.cropX();

* * // set crop x
* image.cropX(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Image, 'cropY', 0); /** * get/set crop y * @name cropY * @method * @memberof Kinetic.Image.prototype * @param {Number} y * @returns {Number} * @example * // get crop y
* var cropY = image.cropY();

* * // set crop y
* image.cropY(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Image, 'cropWidth', 0); /** * get/set crop width * @name cropWidth * @method * @memberof Kinetic.Image.prototype * @param {Number} width * @returns {Number} * @example * // get crop width
* var cropWidth = image.cropWidth();

* * // set crop width
* image.cropWidth(20); */ Kinetic.Factory.addGetterSetter(Kinetic.Image, 'cropHeight', 0); /** * get/set crop height * @name cropHeight * @method * @memberof Kinetic.Image.prototype * @param {Number} height * @returns {Number} * @example * // get crop height
* var cropHeight = image.cropHeight();

* * // set crop height
* image.cropHeight(20); */ Kinetic.Collection.mapMethods(Kinetic.Image); })(); ;(function() { // constants var AUTO = 'auto', //CANVAS = 'canvas', CENTER = 'center', CHANGE_KINETIC = 'Change.kinetic', CONTEXT_2D = '2d', DASH = '-', EMPTY_STRING = '', LEFT = 'left', TEXT = 'text', TEXT_UPPER = 'Text', MIDDLE = 'middle', NORMAL = 'normal', PX_SPACE = 'px ', SPACE = ' ', RIGHT = 'right', WORD = 'word', CHAR = 'char', NONE = 'none', ATTR_CHANGE_LIST = ['fontFamily', 'fontSize', 'fontStyle', 'fontVariant', 'padding', 'align', 'lineHeight', 'text', 'width', 'height', 'wrap'], // cached variables attrChangeListLen = ATTR_CHANGE_LIST.length, dummyContext = Kinetic.Util.createCanvasElement().getContext(CONTEXT_2D); /** * Text constructor * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {String} [config.fontFamily] default is Arial * @param {Number} [config.fontSize] in pixels. Default is 12 * @param {String} [config.fontStyle] can be normal, bold, or italic. Default is normal * @param {String} [config.fontVariant] can be normal or small-caps. Default is normal * @param {String} config.text * @param {String} [config.align] can be left, center, or right * @param {Number} [config.padding] * @param {Number} [config.width] default is auto * @param {Number} [config.height] default is auto * @param {Number} [config.lineHeight] default is 1 * @param {String} [config.wrap] can be word, char, or none. Default is word * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var text = new Kinetic.Text({
* x: 10,
* y: 15,
* text: 'Simple Text',
* fontSize: 30,
* fontFamily: 'Calibri',
* fill: 'green'
* }); */ Kinetic.Text = function(config) { this.___init(config); }; function _fillFunc(context) { context.fillText(this.partialText, 0, 0); } function _strokeFunc(context) { context.strokeText(this.partialText, 0, 0); } Kinetic.Text.prototype = { ___init: function(config) { var that = this; if (config.width === undefined) { config.width = AUTO; } if (config.height === undefined) { config.height = AUTO; } // call super constructor Kinetic.Shape.call(this, config); this._fillFunc = _fillFunc; this._strokeFunc = _strokeFunc; this.className = TEXT_UPPER; // update text data for certain attr changes for(var n = 0; n < attrChangeListLen; n++) { this.on(ATTR_CHANGE_LIST[n] + CHANGE_KINETIC, that._setTextData); } this._setTextData(); this.sceneFunc(this._sceneFunc); this.hitFunc(this._hitFunc); }, _sceneFunc: function(context) { var p = this.getPadding(), textHeight = this.getTextHeight(), lineHeightPx = this.getLineHeight() * textHeight, textArr = this.textArr, textArrLen = textArr.length, totalWidth = this.getWidth(), n; context.setAttr('font', this._getContextFont()); context.setAttr('textBaseline', MIDDLE); context.setAttr('textAlign', LEFT); context.save(); context.translate(p, 0); context.translate(0, p + textHeight / 2); // draw text lines for(n = 0; n < textArrLen; n++) { var obj = textArr[n], text = obj.text, width = obj.width; // horizontal alignment context.save(); if(this.getAlign() === RIGHT) { context.translate(totalWidth - width - p * 2, 0); } else if(this.getAlign() === CENTER) { context.translate((totalWidth - width - p * 2) / 2, 0); } this.partialText = text; context.fillStrokeShape(this); context.restore(); context.translate(0, lineHeightPx); } context.restore(); }, _hitFunc: function(context) { var width = this.getWidth(), height = this.getHeight(); context.beginPath(); context.rect(0, 0, width, height); context.closePath(); context.fillStrokeShape(this); }, setText: function(text) { var str = Kinetic.Util._isString(text) ? text : text.toString(); this._setAttr(TEXT, str); return this; }, /** * get width of text area, which includes padding * @method * @memberof Kinetic.Text.prototype * @returns {Number} */ getWidth: function() { return this.attrs.width === AUTO ? this.getTextWidth() + this.getPadding() * 2 : this.attrs.width; }, /** * get the height of the text area, which takes into account multi-line text, line heights, and padding * @method * @memberof Kinetic.Text.prototype * @returns {Number} */ getHeight: function() { return this.attrs.height === AUTO ? (this.getTextHeight() * this.textArr.length * this.getLineHeight()) + this.getPadding() * 2 : this.attrs.height; }, /** * get text width * @method * @memberof Kinetic.Text.prototype * @returns {Number} */ getTextWidth: function() { return this.textWidth; }, /** * get text height * @method * @memberof Kinetic.Text.prototype * @returns {Number} */ getTextHeight: function() { return this.textHeight; }, _getTextSize: function(text) { var _context = dummyContext, fontSize = this.getFontSize(), metrics; _context.save(); _context.font = this._getContextFont(); metrics = _context.measureText(text); _context.restore(); return { width: metrics.width, height: parseInt(fontSize, 10) }; }, _getContextFont: function() { return this.getFontStyle() + SPACE + this.getFontVariant() + SPACE + this.getFontSize() + PX_SPACE + this.getFontFamily(); }, _addTextLine: function (line, width) { return this.textArr.push({text: line, width: width}); }, _getTextWidth: function (text) { return dummyContext.measureText(text).width; }, _setTextData: function () { var lines = this.getText().split('\n'), fontSize = +this.getFontSize(), textWidth = 0, lineHeightPx = this.getLineHeight() * fontSize, width = this.attrs.width, height = this.attrs.height, fixedWidth = width !== AUTO, fixedHeight = height !== AUTO, padding = this.getPadding(), maxWidth = width - padding * 2, maxHeightPx = height - padding * 2, currentHeightPx = 0, wrap = this.getWrap(), shouldWrap = wrap !== NONE, wrapAtWord = wrap !== CHAR && shouldWrap; this.textArr = []; dummyContext.save(); dummyContext.font = this._getContextFont(); for (var i = 0, max = lines.length; i < max; ++i) { var line = lines[i], lineWidth = this._getTextWidth(line); if (fixedWidth && lineWidth > maxWidth) { /* * if width is fixed and line does not fit entirely * break the line into multiple fitting lines */ while (line.length > 0) { /* * use binary search to find the longest substring that * that would fit in the specified width */ var low = 0, high = line.length, match = '', matchWidth = 0; while (low < high) { var mid = (low + high) >>> 1, substr = line.slice(0, mid + 1), substrWidth = this._getTextWidth(substr); if (substrWidth <= maxWidth) { low = mid + 1; match = substr; matchWidth = substrWidth; } else { high = mid; } } /* * 'low' is now the index of the substring end * 'match' is the substring * 'matchWidth' is the substring width in px */ if (match) { // a fitting substring was found if (wrapAtWord) { // try to find a space or dash where wrapping could be done var wrapIndex = Math.max(match.lastIndexOf(SPACE), match.lastIndexOf(DASH)) + 1; if (wrapIndex > 0) { // re-cut the substring found at the space/dash position low = wrapIndex; match = match.slice(0, low); matchWidth = this._getTextWidth(match); } } this._addTextLine(match, matchWidth); textWidth = Math.max(textWidth, matchWidth); currentHeightPx += lineHeightPx; if (!shouldWrap || (fixedHeight && currentHeightPx + lineHeightPx > maxHeightPx)) { /* * stop wrapping if wrapping is disabled or if adding * one more line would overflow the fixed height */ break; } line = line.slice(low); if (line.length > 0) { // Check if the remaining text would fit on one line lineWidth = this._getTextWidth(line); if (lineWidth <= maxWidth) { // if it does, add the line and break out of the loop this._addTextLine(line, lineWidth); currentHeightPx += lineHeightPx; textWidth = Math.max(textWidth, lineWidth); break; } } } else { // not even one character could fit in the element, abort break; } } } else { // element width is automatically adjusted to max line width this._addTextLine(line, lineWidth); currentHeightPx += lineHeightPx; textWidth = Math.max(textWidth, lineWidth); } // if element height is fixed, abort if adding one more line would overflow if (fixedHeight && currentHeightPx + lineHeightPx > maxHeightPx) { break; } } dummyContext.restore(); this.textHeight = fontSize; this.textWidth = textWidth; } }; Kinetic.Util.extend(Kinetic.Text, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Text, 'fontFamily', 'Arial'); /** * get/set font family * @name fontFamily * @method * @memberof Kinetic.Text.prototype * @param {String} fontFamily * @returns {String} * @example * // get font family
* var fontFamily = text.fontFamily();


* * // set font family
* text.fontFamily('Arial'); */ Kinetic.Factory.addGetterSetter(Kinetic.Text, 'fontSize', 12); /** * get/set font size in pixels * @name fontSize * @method * @memberof Kinetic.Text.prototype * @param {Number} fontSize * @returns {Number} * @example * // get font size
* var fontSize = text.fontSize();

* * // set font size to 22px
* text.fontSize(22); */ Kinetic.Factory.addGetterSetter(Kinetic.Text, 'fontStyle', NORMAL); /** * set font style. Can be 'normal', 'italic', or 'bold'. 'normal' is the default. * @name fontStyle * @method * @memberof Kinetic.Text.prototype * @param {String} fontStyle * @returns {String} * @example * // get font style
* var fontStyle = text.fontStyle();

* * // set font style
* text.fontStyle('bold'); */ Kinetic.Factory.addGetterSetter(Kinetic.Text, 'fontVariant', NORMAL); /** * set font variant. Can be 'normal' or 'small-caps'. 'normal' is the default. * @name fontVariant * @method * @memberof Kinetic.Text.prototype * @param {String} fontVariant * @returns {String} * @example * // get font variant
* var fontVariant = text.fontVariant();

* * // set font variant
* text.fontVariant('small-caps'); */ Kinetic.Factory.addGetterSetter(Kinetic.Text, 'padding', 0); /** * set padding * @name padding * @method * @memberof Kinetic.Text.prototype * @param {Number} padding * @returns {Number} * @example * // get padding
* var padding = text.padding();

* * // set padding to 10 pixels
* text.padding(10); */ Kinetic.Factory.addGetterSetter(Kinetic.Text, 'align', LEFT); /** * get/set horizontal align of text. Can be 'left', 'center', or 'right' * @name align * @method * @memberof Kinetic.Text.prototype * @param {String} align * @returns {String} * @example * // get text align
* var align = text.align();

* * // center text
* text.align('center');

* * // align text to right
* text.align('right'); */ Kinetic.Factory.addGetterSetter(Kinetic.Text, 'lineHeight', 1); /** * get/set line height. The default is 1. * @name lineHeight * @method * @memberof Kinetic.Text.prototype * @param {Number} lineHeight * @returns {Number} * @example * // get line height
* var lineHeight = text.lineHeight();


* * // set the line height
* text.lineHeight(2); */ Kinetic.Factory.addGetterSetter(Kinetic.Text, 'wrap', WORD); /** * get/set wrap. Can be word, char, or none. Default is word. * @name wrap * @method * @memberof Kinetic.Text.prototype * @param {String} wrap * @returns {String} * @example * // get wrap
* var wrap = text.wrap();

* * // set wrap
* text.wrap('word'); */ Kinetic.Factory.addGetter(Kinetic.Text, 'text', EMPTY_STRING); Kinetic.Factory.addOverloadedGetterSetter(Kinetic.Text, 'text'); /** * get/set text * @name getText * @method * @memberof Kinetic.Text.prototype * @param {String} text * @returns {String} * @example * // get text
* var text = text.text();

* * // set text
* text.text('Hello world!'); */ Kinetic.Collection.mapMethods(Kinetic.Text); })(); ;(function() { /** * Line constructor.  Lines are defined by an array of points and * a tension * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {Array} config.points * @param {Number} [config.tension] Higher values will result in a more curvy line. A value of 0 will result in no interpolation. * The default is 0 * @param {Boolean} [config.closed] defines whether or not the line shape is closed, creating a polygon or blob * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var line = new Kinetic.Line({
* x: 100,
* y: 50,
* points: [73, 70, 340, 23, 450, 60, 500, 20],
* stroke: 'red',
* tension: 1
* }); */ Kinetic.Line = function(config) { this.___init(config); }; Kinetic.Line.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = 'Line'; this.on('pointsChange.kinetic tensionChange.kinetic closedChange.kinetic', function() { this._clearCache('tensionPoints'); }); this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var points = this.getPoints(), length = points.length, tension = this.getTension(), closed = this.getClosed(), tp, len, n; context.beginPath(); context.moveTo(points[0], points[1]); // tension if(tension !== 0 && length > 4) { tp = this.getTensionPoints(); len = tp.length; n = closed ? 0 : 4; if (!closed) { context.quadraticCurveTo(tp[0], tp[1], tp[2], tp[3]); } while(n < len - 2) { context.bezierCurveTo(tp[n++], tp[n++], tp[n++], tp[n++], tp[n++], tp[n++]); } if (!closed) { context.quadraticCurveTo(tp[len-2], tp[len-1], points[length-2], points[length-1]); } } // no tension else { for(n = 2; n < length; n+=2) { context.lineTo(points[n], points[n+1]); } } // closed e.g. polygons and blobs if (closed) { context.closePath(); context.fillStrokeShape(this); } // open e.g. lines and splines else { context.strokeShape(this); } }, getTensionPoints: function() { return this._getCache('tensionPoints', this._getTensionPoints); }, _getTensionPoints: function() { if (this.getClosed()) { return this._getTensionPointsClosed(); } else { return Kinetic.Util._expandPoints(this.getPoints(), this.getTension()); } }, _getTensionPointsClosed: function() { var p = this.getPoints(), len = p.length, tension = this.getTension(), util = Kinetic.Util, firstControlPoints = util._getControlPoints( p[len-2], p[len-1], p[0], p[1], p[2], p[3], tension ), lastControlPoints = util._getControlPoints( p[len-4], p[len-3], p[len-2], p[len-1], p[0], p[1], tension ), middle = Kinetic.Util._expandPoints(p, tension), tp = [ firstControlPoints[2], firstControlPoints[3] ] .concat(middle) .concat([ lastControlPoints[0], lastControlPoints[1], p[len-2], p[len-1], lastControlPoints[2], lastControlPoints[3], firstControlPoints[0], firstControlPoints[1], p[0], p[1] ]); return tp; } }; Kinetic.Util.extend(Kinetic.Line, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Line, 'closed', false); /** * get/set closed flag. The default is false * @name closed * @method * @memberof Kinetic.Line.prototype * @param {Boolean} closed * @returns {Boolean} * @example * // get closed flag
* var closed = line.closed();

* * // close the shape
* line.closed(true);

* * // open the shape
* line.closed(false); */ Kinetic.Factory.addGetterSetter(Kinetic.Line, 'tension', 0); /** * get/set tension * @name tension * @method * @memberof Kinetic.Line.prototype * @param {Number} Higher values will result in a more curvy line. A value of 0 will result in no interpolation. * The default is 0 * @returns {Number} * @example * // get tension
* var tension = line.tension();

* * // set tension
* line.tension(3); */ Kinetic.Factory.addGetterSetter(Kinetic.Line, 'points'); /** * get/set points array * @name points * @method * @memberof Kinetic.Line.prototype * @param {Array} points * @returns {Array} * @example * // get points
* var points = line.points();

* * // set points
* line.points([10, 20, 30, 40, 50, 60]);

* * // push a new point
* line.points(line.points().concat([70, 80])); */ Kinetic.Collection.mapMethods(Kinetic.Line); })();;(function() { /** * Sprite constructor * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {String} config.animation animation key * @param {Object} config.animations animation map * @param {Integer} [config.frameIndex] animation frame index * @param {Image} config.image image object * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var imageObj = new Image();
* imageObj.onload = function() {
* var sprite = new Kinetic.Sprite({
* x: 200,
* y: 100,
* image: imageObj,
* animation: 'standing',
* animations: {
* standing: [
* // x, y, width, height (6 frames)
* 0, 0, 49, 109,
* 52, 0, 49, 109,
* 105, 0, 49, 109,
* 158, 0, 49, 109,
* 210, 0, 49, 109,
* 262, 0, 49, 109
* ],
* kicking: [
* // x, y, width, height (6 frames)
* 0, 109, 45, 98,
* 45, 109, 45, 98,
* 95, 109, 63, 98,
* 156, 109, 70, 98,
* 229, 109, 60, 98,
* 287, 109, 41, 98
* ]
* },
* frameRate: 7,
* frameIndex: 0
* });
* };
* imageObj.src = '/path/to/image.jpg' */ Kinetic.Sprite = function(config) { this.___init(config); }; Kinetic.Sprite.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = 'Sprite'; this.anim = new Kinetic.Animation(); this.on('animationChange.kinetic', function() { // reset index when animation changes this.frameIndex(0); }); // smooth change for frameRate this.on('frameRateChange.kinetic', function() { if (!this.anim.isRunning()) { return; } clearInterval(this.interval); this._setInterval(); }); this.sceneFunc(this._sceneFunc); this.hitFunc(this._hitFunc); }, _sceneFunc: function(context) { var anim = this.getAnimation(), index = this.frameIndex(), ix4 = index * 4, set = this.getAnimations()[anim], x = set[ix4 + 0], y = set[ix4 + 1], width = set[ix4 + 2], height = set[ix4 + 3], image = this.getImage(); if(image) { context.drawImage(image, x, y, width, height, 0, 0, width, height); } }, _hitFunc: function(context) { var anim = this.getAnimation(), index = this.frameIndex(), ix4 = index * 4, set = this.getAnimations()[anim], width = set[ix4 + 2], height = set[ix4 + 3]; context.beginPath(); context.rect(0, 0, width, height); context.closePath(); context.fillShape(this); }, _useBufferCanvas: function() { return (this.hasShadow() || this.getAbsoluteOpacity() !== 1) && this.hasStroke(); }, _setInterval: function() { var that = this; this.interval = setInterval(function() { that._updateIndex(); }, 1000 / this.getFrameRate()); }, /** * start sprite animation * @method * @memberof Kinetic.Sprite.prototype */ start: function() { var layer = this.getLayer(); /* * animation object has no executable function because * the updates are done with a fixed FPS with the setInterval * below. The anim object only needs the layer reference for * redraw */ this.anim.setLayers(layer); this._setInterval(); this.anim.start(); }, /** * stop sprite animation * @method * @memberof Kinetic.Sprite.prototype */ stop: function() { this.anim.stop(); clearInterval(this.interval); }, /** * determine if animation of sprite is running or not. returns true or false * @method * @memberof Kinetic.Animation.prototype * @returns {Boolean} */ isRunning: function() { return this.anim.isRunning(); }, _updateIndex: function() { var index = this.frameIndex(), animation = this.getAnimation(), animations = this.getAnimations(), anim = animations[animation], len = anim.length / 4; if(index < len - 1) { this.frameIndex(index + 1); } else { this.frameIndex(0); } } }; Kinetic.Util.extend(Kinetic.Sprite, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Sprite, 'animation'); /** * get/set animation key * @name animation * @method * @memberof Kinetic.Sprite.prototype * @param {String} anim animation key * @returns {String} * @example * // get animation key
* var animation = sprite.animation();

* * // set animation key
* sprite.animation('kicking'); */ Kinetic.Factory.addGetterSetter(Kinetic.Sprite, 'animations'); /** * get/set animations map * @name animations * @method * @memberof Kinetic.Sprite.prototype * @param {Object} animations * @returns {Object} * @example * // get animations map
* var animations = sprite.animations();

* * // set animations map
* sprite.animations({
* standing: [
* // x, y, width, height (6 frames)
* 0, 0, 49, 109,
* 52, 0, 49, 109,
* 105, 0, 49, 109,
* 158, 0, 49, 109,
* 210, 0, 49, 109,
* 262, 0, 49, 109
* ],
* kicking: [
* // x, y, width, height (6 frames)
* 0, 109, 45, 98,
* 45, 109, 45, 98,
* 95, 109, 63, 98,
* 156, 109, 70, 98,
* 229, 109, 60, 98,
* 287, 109, 41, 98
* ]
* }); */ Kinetic.Factory.addGetterSetter(Kinetic.Sprite, 'image'); /** * get/set image * @name image * @method * @memberof Kinetic.Sprite.prototype * @param {Image} image * @returns {Image} * @example * // get image * var image = sprite.image();

* * // set image
* sprite.image(imageObj); */ Kinetic.Factory.addGetterSetter(Kinetic.Sprite, 'frameIndex', 0); /** * set/set animation frame index * @name frameIndex * @method * @memberof Kinetic.Sprite.prototype * @param {Integer} frameIndex * @returns {Integer} * @example * // get animation frame index
* var frameIndex = sprite.frameIndex();

* * // set animation frame index
* sprite.frameIndex(3); */ Kinetic.Factory.addGetterSetter(Kinetic.Sprite, 'frameRate', 17); /** * get/set frame rate in frames per second. Increase this number to make the sprite * animation run faster, and decrease the number to make the sprite animation run slower * The default is 17 frames per second * @name frameRate * @method * @memberof Kinetic.Sprite.prototype * @param {Integer} frameRate * @returns {Integer} * @example * // get frame rate
* var frameRate = sprite.frameRate();

* * // set frame rate to 2 frames per second
* sprite.frameRate(2); */ Kinetic.Factory.backCompat(Kinetic.Sprite, { index: 'frameIndex', getIndex: 'getFrameIndex', setIndex: 'setFrameIndex' }); Kinetic.Collection.mapMethods(Kinetic.Sprite); })(); ;(function () { /** * Path constructor. * @author Jason Follas * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {String} config.data SVG data string * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var path = new Kinetic.Path({
* x: 240,
* y: 40,
* data: 'M12.582,9.551C3.251,16.237,0.921,29.021,7.08,38.564l-2.36,1.689l4.893,2.262l4.893,2.262l-0.568-5.36l-0.567-5.359l-2.365,1.694c-4.657-7.375-2.83-17.185,4.352-22.33c7.451-5.338,17.817-3.625,23.156,3.824c5.337,7.449,3.625,17.813-3.821,23.152l2.857,3.988c9.617-6.893,11.827-20.277,4.935-29.896C35.591,4.87,22.204,2.658,12.582,9.551z',
* fill: 'green',
* scale: 2
* }); */ Kinetic.Path = function (config) { this.___init(config); }; Kinetic.Path.prototype = { ___init: function (config) { this.dataArray = []; var that = this; // call super constructor Kinetic.Shape.call(this, config); this.className = 'Path'; this.dataArray = Kinetic.Path.parsePathData(this.getData()); this.on('dataChange.kinetic', function () { that.dataArray = Kinetic.Path.parsePathData(this.getData()); }); this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var ca = this.dataArray, closedPath = false; // context position context.beginPath(); for (var n = 0; n < ca.length; n++) { var c = ca[n].command; var p = ca[n].points; switch (c) { case 'L': context.lineTo(p[0], p[1]); break; case 'M': context.moveTo(p[0], p[1]); break; case 'C': context.bezierCurveTo(p[0], p[1], p[2], p[3], p[4], p[5]); break; case 'Q': context.quadraticCurveTo(p[0], p[1], p[2], p[3]); break; case 'A': var cx = p[0], cy = p[1], rx = p[2], ry = p[3], theta = p[4], dTheta = p[5], psi = p[6], fs = p[7]; var r = (rx > ry) ? rx : ry; var scaleX = (rx > ry) ? 1 : rx / ry; var scaleY = (rx > ry) ? ry / rx : 1; context.translate(cx, cy); context.rotate(psi); context.scale(scaleX, scaleY); context.arc(0, 0, r, theta, theta + dTheta, 1 - fs); context.scale(1 / scaleX, 1 / scaleY); context.rotate(-psi); context.translate(-cx, -cy); break; case 'z': context.closePath(); closedPath = true; break; } } if (closedPath) { context.fillStrokeShape(this); } else { context.strokeShape(this); } } }; Kinetic.Util.extend(Kinetic.Path, Kinetic.Shape); Kinetic.Path.getLineLength = function(x1, y1, x2, y2) { return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); }; Kinetic.Path.getPointOnLine = function(dist, P1x, P1y, P2x, P2y, fromX, fromY) { if(fromX === undefined) { fromX = P1x; } if(fromY === undefined) { fromY = P1y; } var m = (P2y - P1y) / ((P2x - P1x) + 0.00000001); var run = Math.sqrt(dist * dist / (1 + m * m)); if(P2x < P1x) { run *= -1; } var rise = m * run; var pt; if (P2x === P1x) { // vertical line pt = { x: fromX, y: fromY + rise }; } else if((fromY - P1y) / ((fromX - P1x) + 0.00000001) === m) { pt = { x: fromX + run, y: fromY + rise }; } else { var ix, iy; var len = this.getLineLength(P1x, P1y, P2x, P2y); if(len < 0.00000001) { return undefined; } var u = (((fromX - P1x) * (P2x - P1x)) + ((fromY - P1y) * (P2y - P1y))); u = u / (len * len); ix = P1x + u * (P2x - P1x); iy = P1y + u * (P2y - P1y); var pRise = this.getLineLength(fromX, fromY, ix, iy); var pRun = Math.sqrt(dist * dist - pRise * pRise); run = Math.sqrt(pRun * pRun / (1 + m * m)); if(P2x < P1x) { run *= -1; } rise = m * run; pt = { x: ix + run, y: iy + rise }; } return pt; }; Kinetic.Path.getPointOnCubicBezier = function(pct, P1x, P1y, P2x, P2y, P3x, P3y, P4x, P4y) { function CB1(t) { return t * t * t; } function CB2(t) { return 3 * t * t * (1 - t); } function CB3(t) { return 3 * t * (1 - t) * (1 - t); } function CB4(t) { return (1 - t) * (1 - t) * (1 - t); } var x = P4x * CB1(pct) + P3x * CB2(pct) + P2x * CB3(pct) + P1x * CB4(pct); var y = P4y * CB1(pct) + P3y * CB2(pct) + P2y * CB3(pct) + P1y * CB4(pct); return { x: x, y: y }; }; Kinetic.Path.getPointOnQuadraticBezier = function(pct, P1x, P1y, P2x, P2y, P3x, P3y) { function QB1(t) { return t * t; } function QB2(t) { return 2 * t * (1 - t); } function QB3(t) { return (1 - t) * (1 - t); } var x = P3x * QB1(pct) + P2x * QB2(pct) + P1x * QB3(pct); var y = P3y * QB1(pct) + P2y * QB2(pct) + P1y * QB3(pct); return { x: x, y: y }; }; Kinetic.Path.getPointOnEllipticalArc = function(cx, cy, rx, ry, theta, psi) { var cosPsi = Math.cos(psi), sinPsi = Math.sin(psi); var pt = { x: rx * Math.cos(theta), y: ry * Math.sin(theta) }; return { x: cx + (pt.x * cosPsi - pt.y * sinPsi), y: cy + (pt.x * sinPsi + pt.y * cosPsi) }; }; /* * get parsed data array from the data * string. V, v, H, h, and l data are converted to * L data for the purpose of high performance Path * rendering */ Kinetic.Path.parsePathData = function(data) { // Path Data Segment must begin with a moveTo //m (x y)+ Relative moveTo (subsequent points are treated as lineTo) //M (x y)+ Absolute moveTo (subsequent points are treated as lineTo) //l (x y)+ Relative lineTo //L (x y)+ Absolute LineTo //h (x)+ Relative horizontal lineTo //H (x)+ Absolute horizontal lineTo //v (y)+ Relative vertical lineTo //V (y)+ Absolute vertical lineTo //z (closepath) //Z (closepath) //c (x1 y1 x2 y2 x y)+ Relative Bezier curve //C (x1 y1 x2 y2 x y)+ Absolute Bezier curve //q (x1 y1 x y)+ Relative Quadratic Bezier //Q (x1 y1 x y)+ Absolute Quadratic Bezier //t (x y)+ Shorthand/Smooth Relative Quadratic Bezier //T (x y)+ Shorthand/Smooth Absolute Quadratic Bezier //s (x2 y2 x y)+ Shorthand/Smooth Relative Bezier curve //S (x2 y2 x y)+ Shorthand/Smooth Absolute Bezier curve //a (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+ Relative Elliptical Arc //A (rx ry x-axis-rotation large-arc-flag sweep-flag x y)+ Absolute Elliptical Arc // return early if data is not defined if(!data) { return []; } // command string var cs = data; // command chars var cc = ['m', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z', 'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A']; // convert white spaces to commas cs = cs.replace(new RegExp(' ', 'g'), ','); // create pipes so that we can split the data for(var n = 0; n < cc.length; n++) { cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]); } // create array var arr = cs.split('|'); var ca = []; // init context point var cpx = 0; var cpy = 0; for( n = 1; n < arr.length; n++) { var str = arr[n]; var c = str.charAt(0); str = str.slice(1); // remove ,- for consistency str = str.replace(new RegExp(',-', 'g'), '-'); // add commas so that it's easy to split str = str.replace(new RegExp('-', 'g'), ',-'); str = str.replace(new RegExp('e,-', 'g'), 'e-'); var p = str.split(','); if(p.length > 0 && p[0] === '') { p.shift(); } // convert strings to floats for(var i = 0; i < p.length; i++) { p[i] = parseFloat(p[i]); } while(p.length > 0) { if(isNaN(p[0])) {// case for a trailing comma before next command break; } var cmd = null; var points = []; var startX = cpx, startY = cpy; // Move var from within the switch to up here (jshint) var prevCmd, ctlPtx, ctlPty; // Ss, Tt var rx, ry, psi, fa, fs, x1, y1; // Aa // convert l, H, h, V, and v to L switch (c) { // Note: Keep the lineTo's above the moveTo's in this switch case 'l': cpx += p.shift(); cpy += p.shift(); cmd = 'L'; points.push(cpx, cpy); break; case 'L': cpx = p.shift(); cpy = p.shift(); points.push(cpx, cpy); break; // Note: lineTo handlers need to be above this point case 'm': var dx = p.shift(); var dy = p.shift(); cpx += dx; cpy += dy; cmd = 'M'; // After closing the path move the current position // to the the first point of the path (if any). if(ca.length>2 && ca[ca.length-1].command==='z'){ for(var idx=ca.length-2;idx>=0;idx--){ if(ca[idx].command==='M'){ cpx=ca[idx].points[0]+dx; cpy=ca[idx].points[1]+dy; break; } } } points.push(cpx, cpy); c = 'l'; // subsequent points are treated as relative lineTo break; case 'M': cpx = p.shift(); cpy = p.shift(); cmd = 'M'; points.push(cpx, cpy); c = 'L'; // subsequent points are treated as absolute lineTo break; case 'h': cpx += p.shift(); cmd = 'L'; points.push(cpx, cpy); break; case 'H': cpx = p.shift(); cmd = 'L'; points.push(cpx, cpy); break; case 'v': cpy += p.shift(); cmd = 'L'; points.push(cpx, cpy); break; case 'V': cpy = p.shift(); cmd = 'L'; points.push(cpx, cpy); break; case 'C': points.push(p.shift(), p.shift(), p.shift(), p.shift()); cpx = p.shift(); cpy = p.shift(); points.push(cpx, cpy); break; case 'c': points.push(cpx + p.shift(), cpy + p.shift(), cpx + p.shift(), cpy + p.shift()); cpx += p.shift(); cpy += p.shift(); cmd = 'C'; points.push(cpx, cpy); break; case 'S': ctlPtx = cpx; ctlPty = cpy; prevCmd = ca[ca.length - 1]; if(prevCmd.command === 'C') { ctlPtx = cpx + (cpx - prevCmd.points[2]); ctlPty = cpy + (cpy - prevCmd.points[3]); } points.push(ctlPtx, ctlPty, p.shift(), p.shift()); cpx = p.shift(); cpy = p.shift(); cmd = 'C'; points.push(cpx, cpy); break; case 's': ctlPtx = cpx; ctlPty = cpy; prevCmd = ca[ca.length - 1]; if(prevCmd.command === 'C') { ctlPtx = cpx + (cpx - prevCmd.points[2]); ctlPty = cpy + (cpy - prevCmd.points[3]); } points.push(ctlPtx, ctlPty, cpx + p.shift(), cpy + p.shift()); cpx += p.shift(); cpy += p.shift(); cmd = 'C'; points.push(cpx, cpy); break; case 'Q': points.push(p.shift(), p.shift()); cpx = p.shift(); cpy = p.shift(); points.push(cpx, cpy); break; case 'q': points.push(cpx + p.shift(), cpy + p.shift()); cpx += p.shift(); cpy += p.shift(); cmd = 'Q'; points.push(cpx, cpy); break; case 'T': ctlPtx = cpx; ctlPty = cpy; prevCmd = ca[ca.length - 1]; if(prevCmd.command === 'Q') { ctlPtx = cpx + (cpx - prevCmd.points[0]); ctlPty = cpy + (cpy - prevCmd.points[1]); } cpx = p.shift(); cpy = p.shift(); cmd = 'Q'; points.push(ctlPtx, ctlPty, cpx, cpy); break; case 't': ctlPtx = cpx; ctlPty = cpy; prevCmd = ca[ca.length - 1]; if(prevCmd.command === 'Q') { ctlPtx = cpx + (cpx - prevCmd.points[0]); ctlPty = cpy + (cpy - prevCmd.points[1]); } cpx += p.shift(); cpy += p.shift(); cmd = 'Q'; points.push(ctlPtx, ctlPty, cpx, cpy); break; case 'A': rx = p.shift(); ry = p.shift(); psi = p.shift(); fa = p.shift(); fs = p.shift(); x1 = cpx; y1 = cpy; cpx = p.shift(); cpy = p.shift(); cmd = 'A'; points = this.convertEndpointToCenterParameterization(x1, y1, cpx, cpy, fa, fs, rx, ry, psi); break; case 'a': rx = p.shift(); ry = p.shift(); psi = p.shift(); fa = p.shift(); fs = p.shift(); x1 = cpx; y1 = cpy; cpx += p.shift(); cpy += p.shift(); cmd = 'A'; points = this.convertEndpointToCenterParameterization(x1, y1, cpx, cpy, fa, fs, rx, ry, psi); break; } ca.push({ command: cmd || c, points: points, start: { x: startX, y: startY }, pathLength: this.calcLength(startX, startY, cmd || c, points) }); } if(c === 'z' || c === 'Z') { ca.push({ command: 'z', points: [], start: undefined, pathLength: 0 }); } } return ca; }; Kinetic.Path.calcLength = function(x, y, cmd, points) { var len, p1, p2, t; var path = Kinetic.Path; switch (cmd) { case 'L': return path.getLineLength(x, y, points[0], points[1]); case 'C': // Approximates by breaking curve into 100 line segments len = 0.0; p1 = path.getPointOnCubicBezier(0, x, y, points[0], points[1], points[2], points[3], points[4], points[5]); for( t = 0.01; t <= 1; t += 0.01) { p2 = path.getPointOnCubicBezier(t, x, y, points[0], points[1], points[2], points[3], points[4], points[5]); len += path.getLineLength(p1.x, p1.y, p2.x, p2.y); p1 = p2; } return len; case 'Q': // Approximates by breaking curve into 100 line segments len = 0.0; p1 = path.getPointOnQuadraticBezier(0, x, y, points[0], points[1], points[2], points[3]); for( t = 0.01; t <= 1; t += 0.01) { p2 = path.getPointOnQuadraticBezier(t, x, y, points[0], points[1], points[2], points[3]); len += path.getLineLength(p1.x, p1.y, p2.x, p2.y); p1 = p2; } return len; case 'A': // Approximates by breaking curve into line segments len = 0.0; var start = points[4]; // 4 = theta var dTheta = points[5]; // 5 = dTheta var end = points[4] + dTheta; var inc = Math.PI / 180.0; // 1 degree resolution if(Math.abs(start - end) < inc) { inc = Math.abs(start - end); } // Note: for purpose of calculating arc length, not going to worry about rotating X-axis by angle psi p1 = path.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], start, 0); if(dTheta < 0) {// clockwise for( t = start - inc; t > end; t -= inc) { p2 = path.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0); len += path.getLineLength(p1.x, p1.y, p2.x, p2.y); p1 = p2; } } else {// counter-clockwise for( t = start + inc; t < end; t += inc) { p2 = path.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0); len += path.getLineLength(p1.x, p1.y, p2.x, p2.y); p1 = p2; } } p2 = path.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], end, 0); len += path.getLineLength(p1.x, p1.y, p2.x, p2.y); return len; } return 0; }; Kinetic.Path.convertEndpointToCenterParameterization = function(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg) { // Derived from: http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes var psi = psiDeg * (Math.PI / 180.0); var xp = Math.cos(psi) * (x1 - x2) / 2.0 + Math.sin(psi) * (y1 - y2) / 2.0; var yp = -1 * Math.sin(psi) * (x1 - x2) / 2.0 + Math.cos(psi) * (y1 - y2) / 2.0; var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry); if(lambda > 1) { rx *= Math.sqrt(lambda); ry *= Math.sqrt(lambda); } var f = Math.sqrt((((rx * rx) * (ry * ry)) - ((rx * rx) * (yp * yp)) - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp) + (ry * ry) * (xp * xp))); if(fa === fs) { f *= -1; } if(isNaN(f)) { f = 0; } var cxp = f * rx * yp / ry; var cyp = f * -ry * xp / rx; var cx = (x1 + x2) / 2.0 + Math.cos(psi) * cxp - Math.sin(psi) * cyp; var cy = (y1 + y2) / 2.0 + Math.sin(psi) * cxp + Math.cos(psi) * cyp; var vMag = function(v) { return Math.sqrt(v[0] * v[0] + v[1] * v[1]); }; var vRatio = function(u, v) { return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)); }; var vAngle = function(u, v) { return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vRatio(u, v)); }; var theta = vAngle([1, 0], [(xp - cxp) / rx, (yp - cyp) / ry]); var u = [(xp - cxp) / rx, (yp - cyp) / ry]; var v = [(-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry]; var dTheta = vAngle(u, v); if(vRatio(u, v) <= -1) { dTheta = Math.PI; } if(vRatio(u, v) >= 1) { dTheta = 0; } if(fs === 0 && dTheta > 0) { dTheta = dTheta - 2 * Math.PI; } if(fs === 1 && dTheta < 0) { dTheta = dTheta + 2 * Math.PI; } return [cx, cy, rx, ry, theta, dTheta, psi, fs]; }; // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Path, 'data'); /** * set SVG path data string. This method * also automatically parses the data string * into a data array. Currently supported SVG data: * M, m, L, l, H, h, V, v, Q, q, T, t, C, c, S, s, A, a, Z, z * @name setData * @method * @memberof Kinetic.Path.prototype * @param {String} SVG path command string */ /** * get SVG path data string * @name getData * @method * @memberof Kinetic.Path.prototype */ Kinetic.Collection.mapMethods(Kinetic.Path); })(); ;(function() { var EMPTY_STRING = '', //CALIBRI = 'Calibri', NORMAL = 'normal'; /** * Path constructor. * @author Jason Follas * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {String} [config.fontFamily] default is Calibri * @param {Number} [config.fontSize] default is 12 * @param {String} [config.fontStyle] can be normal, bold, or italic. Default is normal * @param {String} [config.fontVariant] can be normal or small-caps. Default is normal * @param {String} config.text * @param {String} config.data SVG data string * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var textpath = new Kinetic.TextPath({
* x: 100,
* y: 50,
* fill: '#333',
* fontSize: '24',
* fontFamily: 'Arial',
* text: 'All the world\'s a stage, and all the men and women merely players.',
* data: 'M10,10 C0,0 10,150 100,100 S300,150 400,50'
* }); */ Kinetic.TextPath = function(config) { this.___init(config); }; function _fillFunc(context) { context.fillText(this.partialText, 0, 0); } function _strokeFunc(context) { context.strokeText(this.partialText, 0, 0); } Kinetic.TextPath.prototype = { ___init: function(config) { var that = this; this.dummyCanvas = Kinetic.Util.createCanvasElement(); this.dataArray = []; // call super constructor Kinetic.Shape.call(this, config); // overrides // TODO: shouldn't this be on the prototype? this._fillFunc = _fillFunc; this._strokeFunc = _strokeFunc; this._fillFuncHit = _fillFunc; this._strokeFuncHit = _strokeFunc; this.className = 'TextPath'; this.dataArray = Kinetic.Path.parsePathData(this.attrs.data); this.on('dataChange.kinetic', function() { that.dataArray = Kinetic.Path.parsePathData(this.attrs.data); }); // update text data for certain attr changes this.on('textChange.kinetic textStroke.kinetic textStrokeWidth.kinetic', that._setTextData); that._setTextData(); this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { context.setAttr('font', this._getContextFont()); context.setAttr('textBaseline', 'middle'); context.setAttr('textAlign', 'left'); context.save(); var glyphInfo = this.glyphInfo; for(var i = 0; i < glyphInfo.length; i++) { context.save(); var p0 = glyphInfo[i].p0; context.translate(p0.x, p0.y); context.rotate(glyphInfo[i].rotation); this.partialText = glyphInfo[i].text; context.fillStrokeShape(this); context.restore(); //// To assist with debugging visually, uncomment following // context.beginPath(); // if (i % 2) // context.strokeStyle = 'cyan'; // else // context.strokeStyle = 'green'; // var p1 = glyphInfo[i].p1; // context.moveTo(p0.x, p0.y); // context.lineTo(p1.x, p1.y); // context.stroke(); } context.restore(); }, /** * get text width in pixels * @method * @memberof Kinetic.TextPath.prototype */ getTextWidth: function() { return this.textWidth; }, /** * get text height in pixels * @method * @memberof Kinetic.TextPath.prototype */ getTextHeight: function() { return this.textHeight; }, /** * set text * @method * @memberof Kinetic.TextPath.prototype * @param {String} text */ setText: function(text) { Kinetic.Text.prototype.setText.call(this, text); }, _getTextSize: function(text) { var dummyCanvas = this.dummyCanvas; var _context = dummyCanvas.getContext('2d'); _context.save(); _context.font = this._getContextFont(); var metrics = _context.measureText(text); _context.restore(); return { width: metrics.width, height: parseInt(this.attrs.fontSize, 10) }; }, _setTextData: function() { var that = this; var size = this._getTextSize(this.attrs.text); this.textWidth = size.width; this.textHeight = size.height; this.glyphInfo = []; var charArr = this.attrs.text.split(''); var p0, p1, pathCmd; var pIndex = -1; var currentT = 0; var getNextPathSegment = function() { currentT = 0; var pathData = that.dataArray; for(var i = pIndex + 1; i < pathData.length; i++) { if(pathData[i].pathLength > 0) { pIndex = i; return pathData[i]; } else if(pathData[i].command == 'M') { p0 = { x: pathData[i].points[0], y: pathData[i].points[1] }; } } return {}; }; var findSegmentToFitCharacter = function(c) { var glyphWidth = that._getTextSize(c).width; var currLen = 0; var attempts = 0; p1 = undefined; while(Math.abs(glyphWidth - currLen) / glyphWidth > 0.01 && attempts < 25) { attempts++; var cumulativePathLength = currLen; while(pathCmd === undefined) { pathCmd = getNextPathSegment(); if(pathCmd && cumulativePathLength + pathCmd.pathLength < glyphWidth) { cumulativePathLength += pathCmd.pathLength; pathCmd = undefined; } } if(pathCmd === {} || p0 === undefined) { return undefined; } var needNewSegment = false; switch (pathCmd.command) { case 'L': if(Kinetic.Path.getLineLength(p0.x, p0.y, pathCmd.points[0], pathCmd.points[1]) > glyphWidth) { p1 = Kinetic.Path.getPointOnLine(glyphWidth, p0.x, p0.y, pathCmd.points[0], pathCmd.points[1], p0.x, p0.y); } else { pathCmd = undefined; } break; case 'A': var start = pathCmd.points[4]; // 4 = theta var dTheta = pathCmd.points[5]; // 5 = dTheta var end = pathCmd.points[4] + dTheta; if(currentT === 0){ currentT = start + 0.00000001; } // Just in case start is 0 else if(glyphWidth > currLen) { currentT += (Math.PI / 180.0) * dTheta / Math.abs(dTheta); } else { currentT -= Math.PI / 360.0 * dTheta / Math.abs(dTheta); } // Credit for bug fix: @therth https://github.com/ericdrowell/KineticJS/issues/249 // Old code failed to render text along arc of this path: "M 50 50 a 150 50 0 0 1 250 50 l 50 0" if(dTheta < 0 && currentT < end || dTheta >= 0 && currentT > end) { currentT = end; needNewSegment = true; } p1 = Kinetic.Path.getPointOnEllipticalArc(pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3], currentT, pathCmd.points[6]); break; case 'C': if(currentT === 0) { if(glyphWidth > pathCmd.pathLength) { currentT = 0.00000001; } else { currentT = glyphWidth / pathCmd.pathLength; } } else if(glyphWidth > currLen) { currentT += (glyphWidth - currLen) / pathCmd.pathLength; } else { currentT -= (currLen - glyphWidth) / pathCmd.pathLength; } if(currentT > 1.0) { currentT = 1.0; needNewSegment = true; } p1 = Kinetic.Path.getPointOnCubicBezier(currentT, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3], pathCmd.points[4], pathCmd.points[5]); break; case 'Q': if(currentT === 0) { currentT = glyphWidth / pathCmd.pathLength; } else if(glyphWidth > currLen) { currentT += (glyphWidth - currLen) / pathCmd.pathLength; } else { currentT -= (currLen - glyphWidth) / pathCmd.pathLength; } if(currentT > 1.0) { currentT = 1.0; needNewSegment = true; } p1 = Kinetic.Path.getPointOnQuadraticBezier(currentT, pathCmd.start.x, pathCmd.start.y, pathCmd.points[0], pathCmd.points[1], pathCmd.points[2], pathCmd.points[3]); break; } if(p1 !== undefined) { currLen = Kinetic.Path.getLineLength(p0.x, p0.y, p1.x, p1.y); } if(needNewSegment) { needNewSegment = false; pathCmd = undefined; } } }; for(var i = 0; i < charArr.length; i++) { // Find p1 such that line segment between p0 and p1 is approx. width of glyph findSegmentToFitCharacter(charArr[i]); if(p0 === undefined || p1 === undefined) { break; } var width = Kinetic.Path.getLineLength(p0.x, p0.y, p1.x, p1.y); // Note: Since glyphs are rendered one at a time, any kerning pair data built into the font will not be used. // Can foresee having a rough pair table built in that the developer can override as needed. var kern = 0; // placeholder for future implementation var midpoint = Kinetic.Path.getPointOnLine(kern + width / 2.0, p0.x, p0.y, p1.x, p1.y); var rotation = Math.atan2((p1.y - p0.y), (p1.x - p0.x)); this.glyphInfo.push({ transposeX: midpoint.x, transposeY: midpoint.y, text: charArr[i], rotation: rotation, p0: p0, p1: p1 }); p0 = p1; } } }; // map TextPath methods to Text Kinetic.TextPath.prototype._getContextFont = Kinetic.Text.prototype._getContextFont; Kinetic.Util.extend(Kinetic.TextPath, Kinetic.Shape); // add setters and getters Kinetic.Factory.addGetterSetter(Kinetic.TextPath, 'fontFamily', 'Arial'); /** * set font family * @name setFontFamily * @method * @memberof Kinetic.TextPath.prototype * @param {String} fontFamily */ /** * get font family * @name getFontFamily * @method * @memberof Kinetic.TextPath.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.TextPath, 'fontSize', 12); /** * set font size * @name setFontSize * @method * @memberof Kinetic.TextPath.prototype * @param {int} fontSize */ /** * get font size * @name getFontSize * @method * @memberof Kinetic.TextPath.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.TextPath, 'fontStyle', NORMAL); /** * set font style. Can be 'normal', 'italic', or 'bold'. 'normal' is the default. * @name setFontStyle * @method * @memberof Kinetic.TextPath.prototype * @param {String} fontStyle */ /** * get font style * @name getFontStyle * @method * @memberof Kinetic.TextPath.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.TextPath, 'fontVariant', NORMAL); /** * set font variant. Can be 'normal' or 'small-caps'. 'normal' is the default. * @name setFontVariant * @method * @memberof Kinetic.TextPath.prototype * @param {String} fontVariant */ /** * @get font variant * @name getFontVariant * @method * @memberof Kinetic.TextPath.prototype */ Kinetic.Factory.addGetter(Kinetic.TextPath, 'text', EMPTY_STRING); /** * get text * @name getText * @method * @memberof Kinetic.TextPath.prototype */ Kinetic.Collection.mapMethods(Kinetic.TextPath); })(); ;(function() { /** * RegularPolygon constructor.  Examples include triangles, squares, pentagons, hexagons, etc. * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {Number} config.sides * @param {Number} config.radius * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var hexagon = new Kinetic.RegularPolygon({
* x: 100,
* y: 200,
* sides: 6,
* radius: 70,
* fill: 'red',
* stroke: 'black',
* strokeWidth: 4
* }); */ Kinetic.RegularPolygon = function(config) { this.___init(config); }; Kinetic.RegularPolygon.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = 'RegularPolygon'; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var sides = this.attrs.sides, radius = this.attrs.radius, n, x, y; context.beginPath(); context.moveTo(0, 0 - radius); for(n = 1; n < sides; n++) { x = radius * Math.sin(n * 2 * Math.PI / sides); y = -1 * radius * Math.cos(n * 2 * Math.PI / sides); context.lineTo(x, y); } context.closePath(); context.fillStrokeShape(this); } }; Kinetic.Util.extend(Kinetic.RegularPolygon, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.RegularPolygon, 'radius', 0); /** * set radius * @name setRadius * @method * @memberof Kinetic.RegularPolygon.prototype * @param {Number} radius */ /** * get radius * @name getRadius * @method * @memberof Kinetic.RegularPolygon.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.RegularPolygon, 'sides', 0); /** * set number of sides * @name setSides * @method * @memberof Kinetic.RegularPolygon.prototype * @param {int} sides */ /** * get number of sides * @name getSides * @method * @memberof Kinetic.RegularPolygon.prototype */ Kinetic.Collection.mapMethods(Kinetic.RegularPolygon); })(); ;(function() { /** * Star constructor * @constructor * @memberof Kinetic * @augments Kinetic.Shape * @param {Object} config * @param {Integer} config.numPoints * @param {Number} config.innerRadius * @param {Number} config.outerRadius * @param {String} [config.fill] fill color * @param {Integer} [config.fillRed] set fill red component * @param {Integer} [config.fillGreen] set fill green component * @param {Integer} [config.fillBlue] set fill blue component * @param {Integer} [config.fillAlpha] set fill alpha component * @param {Image} [config.fillPatternImage] fill pattern image * @param {Number} [config.fillPatternX] * @param {Number} [config.fillPatternY] * @param {Object} [config.fillPatternOffset] object with x and y component * @param {Number} [config.fillPatternOffsetX] * @param {Number} [config.fillPatternOffsetY] * @param {Object} [config.fillPatternScale] object with x and y component * @param {Number} [config.fillPatternScaleX] * @param {Number} [config.fillPatternScaleY] * @param {Number} [config.fillPatternRotation] * @param {String} [config.fillPatternRepeat] can be "repeat", "repeat-x", "repeat-y", or "no-repeat". The default is "no-repeat" * @param {Object} [config.fillLinearGradientStartPoint] object with x and y component * @param {Number} [config.fillLinearGradientStartPointX] * @param {Number} [config.fillLinearGradientStartPointY] * @param {Object} [config.fillLinearGradientEndPoint] object with x and y component * @param {Number} [config.fillLinearGradientEndPointX] * @param {Number} [config.fillLinearGradientEndPointY] * @param {Array} [config.fillLinearGradientColorStops] array of color stops * @param {Object} [config.fillRadialGradientStartPoint] object with x and y component * @param {Number} [config.fillRadialGradientStartPointX] * @param {Number} [config.fillRadialGradientStartPointY] * @param {Object} [config.fillRadialGradientEndPoint] object with x and y component * @param {Number} [config.fillRadialGradientEndPointX] * @param {Number} [config.fillRadialGradientEndPointY] * @param {Number} [config.fillRadialGradientStartRadius] * @param {Number} [config.fillRadialGradientEndRadius] * @param {Array} [config.fillRadialGradientColorStops] array of color stops * @param {Boolean} [config.fillEnabled] flag which enables or disables the fill. The default value is true * @param {String} [config.fillPriority] can be color, linear-gradient, radial-graident, or pattern. The default value is color. The fillPriority property makes it really easy to toggle between different fill types. For example, if you want to toggle between a fill color style and a fill pattern style, simply set the fill property and the fillPattern properties, and then use setFillPriority('color') to render the shape with a color fill, or use setFillPriority('pattern') to render the shape with the pattern fill configuration * @param {String} [config.stroke] stroke color * @param {Integer} [config.strokeRed] set stroke red component * @param {Integer} [config.strokeGreen] set stroke green component * @param {Integer} [config.strokeBlue] set stroke blue component * @param {Integer} [config.strokeAlpha] set stroke alpha component * @param {Number} [config.strokeWidth] stroke width * @param {Boolean} [config.strokeScaleEnabled] flag which enables or disables stroke scale. The default is true * @param {Boolean} [config.strokeEnabled] flag which enables or disables the stroke. The default value is true * @param {String} [config.lineJoin] can be miter, round, or bevel. The default * is miter * @param {String} [config.lineCap] can be butt, round, or sqare. The default * is butt * @param {String} [config.shadowColor] * @param {Integer} [config.shadowRed] set shadow color red component * @param {Integer} [config.shadowGreen] set shadow color green component * @param {Integer} [config.shadowBlue] set shadow color blue component * @param {Integer} [config.shadowAlpha] set shadow color alpha component * @param {Number} [config.shadowBlur] * @param {Object} [config.shadowOffset] object with x and y component * @param {Number} [config.shadowOffsetX] * @param {Number} [config.shadowOffsetY] * @param {Number} [config.shadowOpacity] shadow opacity. Can be any real number * between 0 and 1 * @param {Boolean} [config.shadowEnabled] flag which enables or disables the shadow. The default value is true * @param {Array} [config.dash] * @param {Boolean} [config.dashEnabled] flag which enables or disables the dashArray. The default value is true * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * var star = new Kinetic.Star({
* x: 100,
* y: 200,
* numPoints: 5,
* innerRadius: 70,
* outerRadius: 70,
* fill: 'red',
* stroke: 'black',
* strokeWidth: 4
* }); */ Kinetic.Star = function(config) { this.___init(config); }; Kinetic.Star.prototype = { ___init: function(config) { // call super constructor Kinetic.Shape.call(this, config); this.className = 'Star'; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var innerRadius = this.innerRadius(), outerRadius = this.outerRadius(), numPoints = this.numPoints(); context.beginPath(); context.moveTo(0, 0 - outerRadius); for(var n = 1; n < numPoints * 2; n++) { var radius = n % 2 === 0 ? outerRadius : innerRadius; var x = radius * Math.sin(n * Math.PI / numPoints); var y = -1 * radius * Math.cos(n * Math.PI / numPoints); context.lineTo(x, y); } context.closePath(); context.fillStrokeShape(this); } }; Kinetic.Util.extend(Kinetic.Star, Kinetic.Shape); // add getters setters Kinetic.Factory.addGetterSetter(Kinetic.Star, 'numPoints', 5); /** * set number of points * @name setNumPoints * @method * @memberof Kinetic.Star.prototype * @param {Integer} points */ /** * get number of points * @name getNumPoints * @method * @memberof Kinetic.Star.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.Star, 'innerRadius', 0); /** * set inner radius * @name setInnerRadius * @method * @memberof Kinetic.Star.prototype * @param {Number} radius */ /** * get inner radius * @name getInnerRadius * @method * @memberof Kinetic.Star.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.Star, 'outerRadius', 0); /** * set outer radius * @name setOuterRadius * @method * @memberof Kinetic.Star.prototype * @param {Number} radius */ /** * get outer radius * @name getOuterRadius * @method * @memberof Kinetic.Star.prototype */ Kinetic.Collection.mapMethods(Kinetic.Star); })(); ;(function() { // constants var ATTR_CHANGE_LIST = ['fontFamily', 'fontSize', 'fontStyle', 'padding', 'lineHeight', 'text'], CHANGE_KINETIC = 'Change.kinetic', NONE = 'none', UP = 'up', RIGHT = 'right', DOWN = 'down', LEFT = 'left', LABEL = 'Label', // cached variables attrChangeListLen = ATTR_CHANGE_LIST.length; /** * Label constructor.  Labels are groups that contain a Text and Tag shape * @constructor * @memberof Kinetic * @param {Object} config * @param {Number} [config.x] * @param {Number} [config.y] * @param {Number} [config.width] * @param {Number} [config.height] * @param {Boolean} [config.visible] * @param {Boolean} [config.listening] whether or not the node is listening for events * @param {String} [config.id] unique id * @param {String} [config.name] non-unique name * @param {Number} [config.opacity] determines node opacity. Can be any number between 0 and 1 * @param {Object} [config.scale] set scale * @param {Number} [config.scaleX] set scale x * @param {Number} [config.scaleY] set scale y * @param {Number} [config.rotation] rotation in degrees * @param {Object} [config.offset] offset from center point and rotation point * @param {Number} [config.offsetX] set offset x * @param {Number} [config.offsetY] set offset y * @param {Boolean} [config.draggable] makes the node draggable. When stages are draggable, you can drag and drop * the entire stage by dragging any portion of the stage * @param {Number} [config.dragDistance] * @param {Function} [config.dragBoundFunc] * @example * // create label * var label = new Kinetic.Label({
* x: 100,
* y: 100,
* draggable: true
* });

* * // add a tag to the label
* label.add(new Kinetic.Tag({
* fill: '#bbb',
* stroke: '#333',
* shadowColor: 'black',
* shadowBlur: 10,
* shadowOffset: [10, 10],
* shadowOpacity: 0.2,
* lineJoin: 'round',
* pointerDirection: 'up',
* pointerWidth: 20,
* pointerHeight: 20,
* cornerRadius: 5
* }));

* * // add text to the label
* label.add(new Kinetic.Text({
* text: 'Hello World!',
* fontSize: 50,
* lineHeight: 1.2,
* padding: 10,
* fill: 'green'
* })); */ Kinetic.Label = function(config) { this.____init(config); }; Kinetic.Label.prototype = { ____init: function(config) { var that = this; this.className = LABEL; Kinetic.Group.call(this, config); this.on('add.kinetic', function(evt) { that._addListeners(evt.child); that._sync(); }); }, /** * get Text shape for the label. You need to access the Text shape in order to update * the text properties * @name getText * @method * @memberof Kinetic.Label.prototype */ getText: function() { return this.find('Text')[0]; }, /** * get Tag shape for the label. You need to access the Tag shape in order to update * the pointer properties and the corner radius * @name getTag * @method * @memberof Kinetic.Label.prototype */ getTag: function() { return this.find('Tag')[0]; }, _addListeners: function(text) { var that = this, n; var func = function(){ that._sync(); }; // update text data for certain attr changes for(n = 0; n < attrChangeListLen; n++) { text.on(ATTR_CHANGE_LIST[n] + CHANGE_KINETIC, func); } }, getWidth: function() { return this.getText().getWidth(); }, getHeight: function() { return this.getText().getHeight(); }, _sync: function() { var text = this.getText(), tag = this.getTag(), width, height, pointerDirection, pointerWidth, x, y, pointerHeight; if (text && tag) { width = text.getWidth(); height = text.getHeight(); pointerDirection = tag.getPointerDirection(); pointerWidth = tag.getPointerWidth(); pointerHeight = tag.getPointerHeight(); x = 0; y = 0; switch(pointerDirection) { case UP: x = width / 2; y = -1 * pointerHeight; break; case RIGHT: x = width + pointerWidth; y = height / 2; break; case DOWN: x = width / 2; y = height + pointerHeight; break; case LEFT: x = -1 * pointerWidth; y = height / 2; break; } tag.setAttrs({ x: -1 * x, y: -1 * y, width: width, height: height }); text.setAttrs({ x: -1 * x, y: -1 * y }); } } }; Kinetic.Util.extend(Kinetic.Label, Kinetic.Group); Kinetic.Collection.mapMethods(Kinetic.Label); /** * Tag constructor.  A Tag can be configured * to have a pointer element that points up, right, down, or left * @constructor * @memberof Kinetic * @param {Object} config * @param {String} [config.pointerDirection] can be up, right, down, left, or none; the default * is none. When a pointer is present, the positioning of the label is relative to the tip of the pointer. * @param {Number} [config.pointerWidth] * @param {Number} [config.pointerHeight] * @param {Number} [config.cornerRadius] */ Kinetic.Tag = function(config) { this.___init(config); }; Kinetic.Tag.prototype = { ___init: function(config) { Kinetic.Shape.call(this, config); this.className = 'Tag'; this.sceneFunc(this._sceneFunc); }, _sceneFunc: function(context) { var width = this.getWidth(), height = this.getHeight(), pointerDirection = this.getPointerDirection(), pointerWidth = this.getPointerWidth(), pointerHeight = this.getPointerHeight(); //cornerRadius = this.getCornerRadius(); context.beginPath(); context.moveTo(0,0); if (pointerDirection === UP) { context.lineTo((width - pointerWidth)/2, 0); context.lineTo(width/2, -1 * pointerHeight); context.lineTo((width + pointerWidth)/2, 0); } context.lineTo(width, 0); if (pointerDirection === RIGHT) { context.lineTo(width, (height - pointerHeight)/2); context.lineTo(width + pointerWidth, height/2); context.lineTo(width, (height + pointerHeight)/2); } context.lineTo(width, height); if (pointerDirection === DOWN) { context.lineTo((width + pointerWidth)/2, height); context.lineTo(width/2, height + pointerHeight); context.lineTo((width - pointerWidth)/2, height); } context.lineTo(0, height); if (pointerDirection === LEFT) { context.lineTo(0, (height + pointerHeight)/2); context.lineTo(-1 * pointerWidth, height/2); context.lineTo(0, (height - pointerHeight)/2); } context.closePath(); context.fillStrokeShape(this); } }; Kinetic.Util.extend(Kinetic.Tag, Kinetic.Shape); Kinetic.Factory.addGetterSetter(Kinetic.Tag, 'pointerDirection', NONE); /** * set pointer Direction * @name setPointerDirection * @method * @memberof Kinetic.Tag.prototype * @param {String} pointerDirection can be up, right, down, left, or none. The * default is none */ /** * get pointer Direction * @name getPointerDirection * @method * @memberof Kinetic.Tag.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.Tag, 'pointerWidth', 0); /** * set pointer width * @name setPointerWidth * @method * @memberof Kinetic.Tag.prototype * @param {Number} pointerWidth */ /** * get pointer width * @name getPointerWidth * @method * @memberof Kinetic.Tag.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.Tag, 'pointerHeight', 0); /** * set pointer height * @name setPointerHeight * @method * @memberof Kinetic.Tag.prototype * @param {Number} pointerHeight */ /** * get pointer height * @name getPointerHeight * @method * @memberof Kinetic.Tag.prototype */ Kinetic.Factory.addGetterSetter(Kinetic.Tag, 'cornerRadius', 0); /** * set corner radius * @name setCornerRadius * @method * @memberof Kinetic.Tag.prototype * @param {Number} corner radius */ /** * get corner radius * @name getCornerRadius * @method * @memberof Kinetic.Tag.prototype */ Kinetic.Collection.mapMethods(Kinetic.Tag); })(); images-actives-html5.git/src/share/themes/gameDragAndDrop/js/main.js000066400000000000000000000207151250410645000256250ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // @version=xxx /* * Main * Initialization * */ function main(myhooks) { "use strict"; // fix bug in retina and amoled screens Kinetic.pixelRatio = 1; Kinetic.Util.addMethods(Kinetic.Path,{ setIaObject: function(iaobject) { this.iaobject = iaobject; }, getIaObject: function() { return this.iaobject; } }); Kinetic.Util.addMethods(Kinetic.Image,{ setIaObject: function(iaobject) { this.iaobject = iaobject; }, getIaObject: function() { return this.iaobject; } }); Kinetic.Util.addMethods(Kinetic.Path,{ setXiaParent: function(xiaparent) { this.xiaparent = xiaparent; }, getXiaParent: function() { return this.xiaparent; } }); Kinetic.Util.addMethods(Kinetic.Image,{ setXiaParent: function(xiaparent) { this.xiaparent = xiaparent; }, getXiaParent: function() { return this.xiaparent; } }); Kinetic.draggedshape = null; //var that=window; var that=this; that.canvas = document.getElementById("canvas"); // Load background image that.imageObj = new Image(); that.imageObj.src = scene.image; that.imageObj.onload = function() { var mainScene = new IaScene(scene.width,scene.height); mainScene.scale = 1; mainScene.scaleScene(mainScene); var stage = new Kinetic.Stage({ container: 'canvas', width: mainScene.width, height: mainScene.height }); // area containing image background var baseImage = new Kinetic.Image({ x: 0, y: mainScene.y, width: scene.width, height: scene.height, scale: {x:mainScene.coeff,y:mainScene.coeff}, image: that.imageObj }); var layers = []; that.layers = layers; layers[0] = new Kinetic.FastLayer(); layers[0].add(baseImage); stage.add(layers[0]); myhooks.beforeMainConstructor(mainScene, that.layers); var indice = 1; layers[indice] = new Kinetic.Layer(); stage.add(layers[indice]); for (var i in details) { var iaObj = new IaObject({ imageObj: that.imageObj, detail: details[i], layer: layers[indice], idText: "article-" + i, baseImage: baseImage, iaScene: mainScene, myhooks: myhooks }); mainScene.shapes.push(iaObj); } that.afterMainConstructor(mainScene, that.layers); myhooks.afterMainConstructor(mainScene, that.layers); $("#loader").hide(); var viewportHeight = $(window).height(); if (scene.description != "") { $("#rights").show(); var content_offset = $("#rights").offset(); var message_height = $("#popup_intro").css('height').substr(0,$("#popup_intro").css("height").length - 2); $("#popup_intro").css({'top':(viewportHeight - content_offset.top - message_height)/ 2 - 40}); $("#popup_intro").show(); $("#popup").hide(); $("#popup_close_intro").on("click", function(){ $("#rights").hide(); }); } // FullScreen ability // source code from http://blogs.sitepointstatic.com/examples/tech/full-screen/index.html var e = document.getElementById("title"); var div_container = document.getElementById("image-active"); e.onclick = function() { if (runPrefixMethod(document, "FullScreen") || runPrefixMethod(document, "IsFullScreen")) { runPrefixMethod(document, "CancelFullScreen"); } else { runPrefixMethod(div_container, "RequestFullScreen"); } mainScene.fullScreen = mainScene.fullScreen == "on" ? "off": "on"; }; var pfx = ["webkit", "moz", "ms", "o", ""]; function runPrefixMethod(obj, method) { var p = 0, m, t; while (p < pfx.length && !obj[m]) { m = method; if (pfx[p] === "") { m = m.substr(0,1).toLowerCase() + m.substr(1); } m = pfx[p] + m; t = typeof obj[m]; if (t != "undefined") { pfx = [pfx[p]]; return (t == "function" ? obj[m]() : obj[m]); } p++; } } }; } main.prototype.afterMainConstructor = function(mainScene, layers) { // some stuff to manage popin windows var viewportHeight = $(window).height(); var button_click = function() { var target = $(this).data("target"); if ($("#response_" + target).is(":hidden")) { if ($(this).data("password")) { $("#form_" + target).toggle(); $("#form_" + target + " input[type=text]").val(""); $("#form_" + target + " input[type=text]").focus(); } else { $("#response_" + target).toggle(); } } else { if ($(this).data("password")) { $("#response_" + target).html($("#response_" + target).data("encrypted_content")); } $("#response_" + target).toggle(); } }; var unlock_input = function(e) { e.preventDefault(); var entered_password = $(this).parent().children("input[type=text]").val(); var sha1Digest= new createJs(true); sha1Digest.update(entered_password.encode()); var hash = sha1Digest.digest(); if (hash == $(this).data("password")) { var target = $(this).data("target"); var encrypted_content = $("#response_" + target).html(); $("#response_" + target).data("encrypted_content", encrypted_content); $("#response_" + target).html(XORCipher.decode(entered_password, encrypted_content).decode()); $("#response_" + target).show(); $("#form_" + target).hide(); $(".button").off("click"); $(".button").on("click", button_click); $(".unlock input[type=submit]").off("click"); $(".unlock input[type=submit]").on("click", unlock_input); } }; $(".button").on("click", button_click); $(".unlock input[type=submit]").on("click", unlock_input); mainScene.score = $("#message_success").data("score"); if ((mainScene.score == mainScene.currentScore) && (mainScene.score != "0")) { $("#content").show(); $("#message_success").show(); var general_border = $("#message_success").css("border-top-width").substr(0,$("#message_success").css("border-top-width").length - 2); var general_offset = $("#message_success").offset(); var content_offset = $("#content").offset(); $("#message_success").css({ 'max-height':(viewportHeight - general_offset.top - content_offset.top - 2 * general_border) }); } $(".overlay").hide(); $(".infos").on("click", function(){ $("#rights").show(); $("#popup").show(); $("#popup_intro").hide(); }); $("#popup_close").on("click", function(){ $("#rights").hide(); }); $("#popup_toggle").on("click", function(){ $("#message_success_content").toggle(); if ($(this).attr('src') == 'img/hide.png') { $(this).attr('src', 'img/show.png'); } else { $(this).attr('src', 'img/hide.png'); } }); }; myhooks = new hooks(); launch = new main(myhooks); images-actives-html5.git/src/share/themes/gameDragAndDrop/js/xiadetail.js000066400000000000000000000035661250410645000266520ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * */ function XiaDetail(detail, idText) { "use strict"; var that = this; this.title = detail.title; this.path = ""; this.kineticElement = null; this.persistent = ""; this.options = ""; this.backgroundImage = null; this.tooltip = null; this.draggable_object = true; this.target_id = null; this.magnet_state = null; this.droparea = false; this.idText = idText; if ((typeof(detail.options) !== 'undefined')) { this.options = detail.options; } if (this.options.indexOf("disable-click") != -1) { this.draggable_object = false; }; if ($('article[data-target="' + $("#" + idText).data("kinetic_id") + '"]').length != 0) { this.draggable_object = false; } if ($('article[data-tooltip="' + $("#" + idText).data("kinetic_id") + '"]').length != 0) { this.draggable_object = false; } this.target_id = $('#' + idText).data("target"); this.magnet_state = $("#" + idText).data("magnet"); if ($('article[data-target="' + $("#" + idText).data("kinetic_id") + '"]').length != 0) { this.droparea = true; } } images-actives-html5.git/src/share/themes/gameDragAndDrop/js/xorcipher.js000066400000000000000000000115071250410645000267030ustar00rootroot00000000000000// XORCipher - Super simple encryption using XOR and Base64 // MODIFIED VERSION TO AVOID underscore dependancy // License : MIT // // As a warning, this is **not** a secure encryption algorythm. It uses a very // simplistic keystore and will be easy to crack. // // The Base64 algorythm is a modification of the one used in phpjs.org // * http://phpjs.org/functions/base64_encode/ // * http://phpjs.org/functions/base64_decode/ // // Examples // -------- // // XORCipher.encode("test", "foobar"); // => "EgocFhUX" // XORCipher.decode("test", "EgocFhUX"); // => "foobar" // /* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, strict:true, undef:true, unused:true, curly:true, browser:true, indent:2, maxerr:50 */ /* global _ */ (function(exports) { "use strict"; var XORCipher = { encode: function(key, data) { data = xor_encrypt(key, data); return b64_encode(data); }, decode: function(key, data) { data = b64_decode(data); return xor_decrypt(key, data); } }; var b64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; function b64_encode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, r, i = 0, enc = ""; if (!data) { return data; } do { o1 = data[i++]; o2 = data[i++]; o3 = data[i++]; bits = o1 << 16 | o2 << 8 | o3; h1 = bits >> 18 & 0x3f; h2 = bits >> 12 & 0x3f; h3 = bits >> 6 & 0x3f; h4 = bits & 0x3f; enc += b64_table.charAt(h1) + b64_table.charAt(h2) + b64_table.charAt(h3) + b64_table.charAt(h4); } while (i < data.length); r = data.length % 3; return (r ? enc.slice(0, r - 3) : enc) + "===".slice(r || 3); } function b64_decode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, result = []; if (!data) { return data; } data += ""; do { h1 = b64_table.indexOf(data.charAt(i++)); h2 = b64_table.indexOf(data.charAt(i++)); h3 = b64_table.indexOf(data.charAt(i++)); h4 = b64_table.indexOf(data.charAt(i++)); bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; o1 = bits >> 16 & 0xff; o2 = bits >> 8 & 0xff; o3 = bits & 0xff; result.push(o1); if (h3 !== 64) { result.push(o2); if (h4 !== 64) { result.push(o3); } } } while (i < data.length); return result; } function keyCharAt(key, i) { //return key.charCodeAt( Math.floor(i % key.length) ); return key.charCodeAt( i % key.length ); } function xor_encrypt(key, data) { /*return _.map(data, function(c, i) { return c.charCodeAt(0) ^ keyCharAt(key, i); });*/ var result = []; for (var indice in data) { result[indice] = data[indice].charCodeAt(0) ^ keyCharAt(key, indice); } return result; } function xor_decrypt(key, data) { /*return _.map(data, function(c, i) { return String.fromCharCode( c ^ keyCharAt(key, i) ); }).join("");*/ var result = []; for (var indice in data) { result[indice] = String.fromCharCode( data[indice] ^ keyCharAt(key, indice) ); } return result.join(""); } exports.XORCipher = XORCipher; })(this); String.prototype.decode = function(encoding) { var result = ""; var index = 0; var c = c1 = c2 = 0; while(index < this.length) { c = this.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); index++; } else if((c > 191) && (c < 224)) { c2 = this.charCodeAt(index + 1); result += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); index += 2; } else { c2 = this.charCodeAt(index + 1); c3 = this.charCodeAt(index + 2); result += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); index += 3; } } return result; }; String.prototype.encode = function(encoding) { var result = ""; var s = this.replace(/\r\n/g, "\n"); for(var index = 0; index < s.length; index++) { var c = s.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { result += String.fromCharCode((c >> 6) | 192); result += String.fromCharCode((c & 63) | 128); } else { result += String.fromCharCode((c >> 12) | 224); result += String.fromCharCode(((c >> 6) & 63) | 128); result += String.fromCharCode((c & 63) | 128); } } return result; };images-actives-html5.git/src/share/themes/gameDragAndDrop/manifest.webapp000066400000000000000000000007001250410645000267250ustar00rootroot00000000000000{ "name": "XIA", "size" : define_package.zip_size_here, "version" : "1.0", "release_notes" : "generated with XIA", "launch_path": "/index.html", "package_path" : "http://my-webserver.com/package.zip", "developer": { "name": "Académie de Versailles" }, "icons": { "16": "/img/xia16.png", "48": "/img/xia48.png", "64": "/img/xia64.png", "128": "/img/xia128.png" } }images-actives-html5.git/src/share/themes/gameDragAndDrop/sounds/000077500000000000000000000000001250410645000252355ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/gameDragAndDrop/sounds/beep.mp3000066400000000000000000000612641250410645000266020ustar00rootroot00000000000000ID3MTIT2 beeps-18 1TPE1ThanTDRL2008TSSE Lavf53.21.1Xing(d"x %PEH5?(% "` O# "[........ ~..bn 4 19w7#b n{G>7\tDqqqqqw}?wwtqqwqs=@1c1cDwwwwtD~B8'(`> (|Ð|?PyOcP_`!S!LsR0 #0O\0 '   |P[  Ԡ = p0)+XbAZRdYȁ$fCj}sSGƊWڞ_I5S=~|I4 sŵY. ?JtsKCQg UuXA˵( %Zn*jh9{JFYi +` Lc\LrL̏ McMv /$IUyĂ;O]a)p@8%P(Y9C$ p\ `f`RffSF(-;Ȗ7&r>> Sb0,U>/+YE6NX氆W.~*󚙔T;WL{3w3Ղ#|n_>}I<>zB'gz  qSWvlqY fs6u3ځ0G&l^)Ŀ8QQJGTahgz6e[t=0y d(ȽFƪXA[!pPD#7 7{΍V=oLd.{\bY9,#\Yo[U +W]G_woUk7{[uUm:E11cU-?C #~z9$[ٽ {h{niVߨ  ![```eh&tfkXfod`{'2j\<>j.ndZc`D ` 1mÆ!-6_l]˥'/Y7&+s:z%/>Uh3..8*oz`/}M(;$k% Eeʻmg Xkl]Di'ěQTP$FX:HZNhM2valJy/ٌtoqHw3v[2F_2tV{%ʛ0 $Cm6-2 3#80u ,3p1 0dGIBWFp \ /x4y /7/3;46cQ+0p X4jZ6,5.kQ7۷p)">8hwWMm=C~WwQ1Du{sq?Vz.'Fd=?qv$O=uA;ս2;rs8EFҗyZ!V 808Lg w39 0 >LFX570 nxdaV[rc )`^@}){ Aecp 2|x"LP4XZ`ADi}Fxa&Gc 'bzaFa^&( K}-z'=wE._3fK4vźV6!nS铢rObj}8S=r TQnnwKkD/ $%<8ic*I/_Iptlde9?IOuT3]t/ n=}o=:6 Ko}XG(dQA02 #&u7 4 51#0P0a#12s1R2 'AxqCqA~֐Uڌ^S{K7} 11K=D~s]@⥐(THXRG)k^HP=>nԠ8w-$]$=`~m>x$gK]У67UvvSN8"X355>`,%44;-%"~:чzwj0raтs h0н4 ;G1@\7>410dE(K]P` &\XH"rkfaq0\{S óF"C:s &NNëNB HaF6`9uўvD2J+|u }'_k=^aU '=Lii<l$2DJ,$;bQ%?XL,<,fQ ZSM̺ؗW/^8HۻUtw*mI$E.uw81ȶ>gf,ۀ0|DtiD1 6Lm N=;LsZ +33GN2B?1Y…`<4"4=؈FMq3sdȓYB fDLV78ijbPdR`,tPk3AI2LI֓?KVN$1plR1'To64CPb'[(Хнg mDЕy xf7b|]Ƌ5)(AA4@4d .DhaVc0} ֻglZ]m~ս4 X" l  ,. Z"@Xc%f p`YAd 'PR$#\H)k Ahc 0AG *CJL&l'%ojK4D@X6h$<DmbGt䢋seNX:8]F; 1O`R헗>QQxtVaq XCo]1]Ռµ6[kj%:%ѕQb/E>WVZA$URVzon H& E!.E "ZqxWD5baD3޳0Z SbSfi|uJ9):X+,Y 7Ǿޅ0u4-5¼+L T P\AxЩL818\`IW/J橾s7Ffi5V4I@aڱ=;NFH1Pf|uZ ?%dDEP@J[$0Q;gx_c!A%I77.S]>}./vRajz҅dvqF3rV0%(LiMWdd()IG+u d2vr@7~-@ b,L/-N10JX5r00Ɓwf̮xw*g-x>3}W3-T:1ّݴJ=T3wyOFGMZg얥גwZ^miZBX[1:VTuP `4+Mh4Ҥ5{LE1JR[25m7}խ\U@\ m\ a.c,OB&zQ9yC#NnDlf5!30s1000 NfW f6Á1\Ġ"t"x =OyXo" X/RrWnkŚ6,]lIj GEhXD#hcCэR~ԕ骓B|.'&(Ëz|E)UMhQȸ }ڦݳ >̥GfkCydA&"a bIF$DF EdaA,XaHRa@c0iery-g.<}H3;JG4] A- r7z+7bh度FI :yG&d&RāXLW pmɐ'&yt3Mē`Ɣ!@)Q"ok-ڰ/EZJsr/8kP- E=ݓmn?z;3ow{ij|o6iT.G':kE`uKɚ N2 i !il|hYQI+ &Tɣ"KU~횺n$uEAjKgRM[Lx߷wܓr7];ӌzچ'a'I@ 02GLp I5p<Ф0X1W(d3wBrj Y!^Q "'x[j"8\%CP}'cO4RbN ?#UEaci+@2 yv,wdauDEBnG<7"5zvu : a$$c34„`h >Wf4YҹbȦ`%e$R-k\(51 ”k&ku]ҤG ÐJ2RayIc[*zyImQyzyv*f|oy| ߷k%I昇d'yiKr{i%^e L 0qx|10B *2PRQJɄ˕qBRBX1ƴ_3qqB|\3ϗO]3}|o*/۪8<")4w+#脹f\J"DEN@ɟ=ZujW+R4zvZ՛6LU;G6\GSUYZI^}"H2m6L! va,@ZxnFOtAiK{Z29rd+B9ϋ7؋j1%Iʦ71& @x$0vJiH|M$ nνE(;5u=GYUzB͆ԧnM("h2;Ifn6^*Y72Pк%IsP_ o R0z`Py%{lȽ`A*oE,~?ZS;UsᬵZJZy '*6ǣN {q@ek5 -m(dR>]@G1!G QL\1W̼#dH4374mYQSvd9yZKr~)H=^E`!&ǙxC02;g8VN._:9PnaV Zfzy$85ufӹA$E3Ar.K{7j"Df2R+ݣL TYvEÂAx\:6MPsIFѡIE\RT.Fc=Q+yƳT_֨/ǩzzb9u;H+Dsyɱ~f[5Ρ)>߂)rXEnh֠  mM<ѠK sq [m!m(LFpghb6F-)rPhXi.%mHqDtCiT#L,ccԠ*agv[(aa4Ԅhsљ9_QH$Dz @ Ąxs#H4II`$Y:'5c,&ƏJ ߵѐܿV<N4Khg=! jO'iiD6I CY?)nNaTž߉Ejv> zvkwɗʰ qRdN\£3rȘ%n Hc*⤗y6f"r`k r'ULCmiUkUh\e_cExȡmB+bllETZT6t<<ЍS{jvnAE\hɦ˜ʜ#VrbKҲyd_ŨQ/im╀07 bd0G0cdvRJRZ53CgZW Fݡ8~!P_k@–z>خ`K'=xط'v[\) p=A3ӽz3F`@J7..esZ+l~zǰ"Hu H/-"+0q.T-fdvY(%%"5vX,/Z;-;蠅^^u[e] {ugb:g˦ʎԄKMH",⩽E9rtmgVB(+x(UA>3qēWGwr,G~|:1kc9.@(eQŐX36 liI F(8$p6U"Zp>//0793djA MlX`1nO5mab %S ?3.t8a W!밫hQDjE& $] SB NХSm$G"|+AK,X}珚ࠔ %$MZҭ$0 сw+ 7k q:k8(?8%2OU̻3,]^-80Vmʬ&UneZtԭ:CBukmwQ:krIs5OgVcT%i46_jV.L|/ GùJ'c`"PKdKQXVšN2K$bjrtooFX:aCq=TZ?`i4ά; S۵'OqG* dܱaCh16K}RzȒ;V[zaZ؎&%6iwaRJt1l1Ln3(}`Aj4Ϙ{;o>/+Zn7ƺZ`I\\(LuKo4^AVX:Y^3KscZymdyv+>PH?-ddv@HKr @=n}ʗ-%0j"LR$,+0/3yx~>-&jD,Yc71i Ģ릯!cp@(ibABSɒS (lF.B UffcU41 ?ն$%檯JW4Yi;sɵAf JS=FO\\ȡZje Lv/2=rUv5RN+el"Y~q)}aEqOHKrfE';Yn\gz(OB|^0mBJ2^0JK0^gAQ#~3~ r8*g#?nI<5c#5&*ˢ̃;.f`lbgy ҔwJIr*M}ƈfļ<]{'>u.%\=:do#3rX`1)nOʄ0%Bۮ.5GFJT9Ôy *TS[q1#Bq.|fjLj PX=bLtuaKO6W@tM 2i*!.a7 o%UBǔm.縌ie j-19:{kI簬o\G֕vFe-~Ҿv6+vwU= Ỡd9ȩ㆜)LF^4L ڈOE8AOi&e#iStKl\WSo8.UnGsnxk|ƿ4c7|}E F0OjD[[,cf+#NL7  5$ǘd؇nA#3rˈu%niO+`ę *+*MI3%@ܱ5YJO v. !0,aZYHĀ^+- &N(8?󶜬yEe,Wt?S9Uוp^ TX $lWoE>@TԢRh/7ӳ׺ɮTE\Ynn^a)%-Y9Ca44FwS\\ F׾гFOm̃Ql>ۭiּn~U8E@IPc큑i=lC)$P2rmx~G=Ӭ[QJRe]Bu%dcĒHNM/_\'Ps FS?Ja@>.ei)˨~Ӌ.>Y"^݌!uܷ|뮳I6ٔ˛DJoa9DIDةrC@4B"/<8J}Y#9nZE%02H*]"^%i{Rdmb$<ܼ&SLݬyVi]o6^S6KOigmzf %b\BN"HZtDI4d쇴Ao &3rxU1n? %NG{6S-}:hF.WvpFk%}j2CQ`Bs^HF I2.ND,QVghk*ha#̯{l36<);,結X˷@Rt' qK^;N>[zO4<IĬ;(e "]xQ*3Hf/`ml'xnHE')c 6(ѐ9"d֍t) re'2ecR//;.Ws?/*0X\Cr X\% BCx\PoeYbpYh~5<,5gJ$^t#ڦܐW!=$!^/t#wELkYa[7OSk))K2:j+{r3g5Qۘ < |cO~kfo)(%,:VCs36QVS$Ysm>WLWskv(/EBH,02LmcrrbFkFB0UU)-DP3"XfS}3 3UpYUj%$Y&~9vTX%AozvHv#Ù8ْo14皂,Z̋i}Imf-$EluF һ&[+rB߲St Ikr]74wQc=1CF{˖ϵM nLF`nz(P 'd3u#3r,Hx%)nf*b %x=iykB Ca,ś;12γCHKVBΝU &(`G!QD9%HӛDE#̫qE EMOF&p$s 3D/Yhqĵ'^]g#Z<ǣ R1ap 88HڣkMJ7D)eBfNIu*:^iɝ˶JMn1KN񏍥L{\!?/.3J1"fwt`VO?.%L*7D~r8ZgR>+YJ=38vMd>qʛik Fa @q2$uG4AOm,ޕ*c_2q˥je%g&ag]2_rt N-T@ ["ܣQ -ot(+ kc{%E3 #gf7'S7:ͦ!'gtWjzۦ櫚s=v޻5漷|X.>ds L~lij#aDd⋳iB #rle%nOuʋ-%;g'u;vV"[萑z*<6$,H\]hdl4e5N܃U@jed*يG<ܭOn GTA@˃=:OU52ˢl+\?#e_U{!nr|q>qQ`){B43ˍ 9,0H1/@@HfP%i6I~vCf<qn)!,9!p@SBMBDESP 1Qn R ey?q8 3gVh?:|aJ:Yj0Offdu'D)Wjr1,߫`R#UE 7)1-ߓS9*oYTdP9ߏmgqu vܽ_C zж˻S1N6g%5+{]oh!8r%DdmA#3rKe1nN2!@1G@Ȁ(\ .=j"h $̼̜C+~kx%HeC!譭69$PeXZJS+сTW%ZseI)i] [g =3ޱ9lC;[so޶fjL]i1_K9%m0=rX'6DnGjEV""BJΏ.೘TJP۹{+b%v^e${Zک&&3t/˛2_eh7!K q 8CPp X*,$g˭ Jq9HsSq.:B&K;Ł[B"rBN>#81A&0$! 5oUcKahKt3k}m Y^:zk<_Vbwu٧OvyųL9˓>Is@Ю&Gb||gbXx^uU;i^Ugc)J &B9ΥYlV>&WU!F6$]n)djA%3r,P%nO%@1M3:sp"L& I(!yTы #e#lKDI!(N;NJŽ_ fZI2!uQJHTמ0G'%(*.CX0IAl4&DB׉I xusZi\N-C3kNBsZu⽶|Ղ{&󕟮0ߠC R , +z(#DCvQLNljà1{ϳzREvs?7PNMQ#c{iM5ڣn*ke>׾f8r{\fl&F=O'V!BK)h#CXt~W!*ES1Xy:HH*̒eDnB#T Ƿʤ[ Y-3sRYBB:8i$\I]yVQ0Sݧ,i![o k|<:~D@{CsLKHYFl!~x X0>?'ē%NH\A! Z'AOږsu[2_H־{ˌs$JvAx|J@CЬg2 Exd%Ό!-B!]N]O&E$k D<*]9B,u6FGbDHYx#J>!V v[/@ڛTcCK<cy~9\U~{~Zzr=uLo+#WGIn>͖!Y锂&Fd12WHs˨y@sH''Ʉ7Kׅ^#Mg]bz190λׂt(q|"ht~T[8?S :l˧UΑ 2GvIL k=lk}Cf@0i VrE )6F X85I'bF&,lƓb2eWTLFO 8ުF},ӓ#h4~*U8km;*w)L@Ԣ-f}Cq&vV&aOE%BdpA#3rh1nO0@G{89Xl8#..Kc~(^%׵QOF ͕Krϝ#Y3wT4*ĵRnj1ZɍmIid8\°hwpDG9. @p6L .6SE֝=BIJ`Gd S D5*i$ds tC?4Q`ל/XCP%K6mTFyYsk6"a_ Ͼ~.^rיCd+S?NPnPb́;5dpAc3rP1nO 1!@DZ͟&ތ`bTN>Q$\ObsG'5~e%G^|/@Z#XWQMSβf7[_XL= >aLUSwgAd56 Nst@'{5b U^gT.XZC}i2ǒdkGu*BOaUeƒZ(Z;>\Q$Й-u+ߋEw5gf77bۭS"~Uv"y۹x< 8쿬(YKBQNs6E"Fly maeU@|@@AeFs(( xɩ 5UqIwElHQWdt(gbQT*xb$1&y= rP7Lࠉa+T80 -FhC%ӔDq,v6eOjH/7I|X @H sdlU,vQDBmeULM\l@2H07"dRSN*&Bu`?.Fqكd$*c&97Ng4;U#d3ecrU1nNq  m߱!DZPM4+CMeL Gն+ᝍ"X'n m`l H9V$j Ltւ04 RE ԦͪNj"匜tvk +ER8m[ p #4a0Q)p:dg:|T*KvЌAڑM*KgQ 5S,[uaĈǖ`J"TۺOiiLF<}ZbM֘DԺؾ%g}Rޒ{Nيu/~V6ޣج8ؙ4&E::ۣ^z4L=ݒ{8rIg#|u%2ƮSwx#:ӭPƣY+^h0i]rw o4byVliD{,Z2R!QλV5ATM 2(TsC|,En|z))ӕIY@Ž[EJYZ)z$F"lqФh6q:XY(lQ$f͕ե⎐'dsXBkr Xu=nI k¹0+=:I<-I^BPJ93qr[jw)B6prbb,7V !aT,B螅w\ y4erAKUJtYGs.ߩ!C24SR7f:फ>bC)u;v!3 T|ѸR/05cbwU>tN.1QRPG ^G[ TO M㢛T,aOΜls:6AQ _s?V͙0)P 1 -~| L 0H#Œ5 hrMa% '+%f3&.щaP'OKR Vҫ2$ƒڌ "l3?"H\aS$'/y7~q`%Vd*mvwW2HÐ%{]AϤA,c1٩[ƭ]#sf:qsRQI ȸt\*cX@lj$xH6!sbfe$QA:lRցۙlb GgTr;;"訋*!b2 ⢄oHT2ďgP{LAME3.99.5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUimages-actives-html5.git/src/share/themes/gameDragAndDrop/sounds/beep.ogg000066400000000000000000000453371250410645000266620ustar00rootroot00000000000000OggSs<vorbisDOggSsRaY<vorbis-Xiph.Org libVorbis I 20101101 (Schaufenugget)ENCODER=VLC media playervorbis)BCV"LĀАU7{Ƚ{G{{Gz{{˽s 4d)rBQ*ǽ0=Z!B= Y@!RH!RH!RH)b)b)s1 :褓PB )PJ*RJ-ZssA B!B!BBCV B!dB!RH!b)АU I˱%Q%2-R5S3=UTETUWU]]wmvmՖmVmvmVmYm۶m۶m۶m۶m۶m 4d #9#)")8d(8H%ifyg詞 xxgyxgyiiiiiiiiiiiiiii@h*@@qqqGr$ Y@R$r,Gs4s =9IA#U`AKEmW 1߇tB?oŇ]w6f, Kêm ;F "ah<5$I0@2)Q!A uv.l5ИZȬ1VJ+"t^cZt/ḱ Mz$VXP,$(T 1e a !pQΎ{d܍o Nh.ex9̣lHKv4Ŏ0V=e(`Kt\)4rzXbŲ}4ZӶUK% X"}oZA7vT2]rTg"}6jT*0+|92.Y8hvW}:=6\U hSN~ z`N'" d$QUUk5%SZkEDiEF&f-Yh`ѢeK6VUD2Z `kE{|foSgS>.ܛ)7llv5vk|gi~ Yԫ'~lغ '1KQLN\JՊl`t1V(A6E #}f"iCd=ҧm*n =/-Ј# %I ZTE U@,l[1LŠΈ@ JyUaY~*'#'t?_ϐM~N1#sM70_>|7|5sTwvfSm6d8PC'8MO g}7:=OB$` dB%FIUI:ʙ_U+}Ѝ;𕰞IY#:C|>`@s^m.Tk rsC tsJ3pNww3L1(XzHDLkۆm[vVvV[bj"B; @P<[&)Q5b&w8o3m0 ؆>V}fs?p:+>AgCn:T/sj-??|::ap~I!JA?9I] U[VL@Pl[PT # -l ahQ~Oy+5ks%41 S>=_=)*I604pA)ÿ(fz/.~goNra>ӛ:p8|fx/DkAAQ}(w!}Io?ūeMDzݟ^{HF2Ҹ~ @q4v[~017n#2J cxO~|>fddoQUѠA˫'۝O ~^0sYaU[vZ1Q)qHy9qAE#Fv`YYX CIA4 ; +` 2PT䤮UdNsv>sC!ϞsrgsM9=3̙w;4oL]m!uz |dɱ;T0-/ Jh 1`Gw2NVmLέ|3#uS_-|}3~$>!Os{y g2\= Ch^ ڌ-7-j KI2x98ߪB-P_x] ~ $x1N>Stڮ`4Kc!am.\1#~l.L"K/Hxg'22fWz^ ^u6bng;8Yjkb4ͷ?NZ}6 o_}Hlnc=sԇ#+gs&|BFؗߍ ^m.3ë@f>Rb7~O2*?@يزssBGm~t7 `t -fj!ijWòVU%zv F`q٭a8myv>,.sfj`'Zbaۖ m"Yf*Noup8<&Ά$as uw OI:Ib[9ɷٜ6|tu)vUd7/h'cׇL3 +P\;( `dgW;Х 6`[)DZoWXdJɘGM㞄[]B9_;;j~ b ^%Ixau12U C eS`9@n9rսUVB t}_x`DWŰcnfP`J0(CA`QKFwana-W 7/.x?_4_48ӿ잡sA &[p7ߛn/>0o=@LGj*6{:Cxw}y=O$d4p.g_ܛb^1÷9@_Mw0}qϡ7 ίgP kNSyޛ|5;sc `|ce_%@`^?-͗>Ȁ/cZom6`!×K%}Z.>s+ .@6VE\,[0a Ј OggSZsyTW>Eܘ%~hj}1d 7R/7A\h(\ۜE)eh*"i{p{ݝ/au-aiaXb4 rn -}" G%rc+&n$P~#+-۳E|?_U}#5OGׇA|77ԩC}4_} {9 _@Gӑl> 5bt|s~^^8Nrٓw՟]UȽur ~ؿdWڎ|} 3!XH¿``(r(_6 #Y G?>~?[2\("* |Ȁ%| }O >Yhd{U̮4-s"˧M[]-,Q̵Tk媪pM+ N>5ӟmBR Y2DLGa$U p Ue90nHȎE(gLZcϹ$ȹx-2I8$Og}=ow{f LWQ"`:}7aQ|o7.}G03: Pp>̹rIk g+LM~ ՜ݟdO5sN;͆ߦ8kjC$Zm c%X`@oI a!c`,Yz>``Y!?^c-Xg[,l ,>2-}PD&ϢD*xU$' WE ƾBPo9xRU%f4ryƶ݋ŨlOYgrmu/wQA_'Baw# ;‘Y:> қT2=yy/>lj*I\+.mcwjHr2$=^M-:}ozv }>{wcC/99}g->&Ϸ_>sol氧 pNs||o|]=̙ߦ~zNfm>{wP}7f+qWw`'Kퟄ 6`$}X KW}ۖ`㥂$cw~ے!}v , 1C=y6!,vX4^Elld F2&;P0 $uir,4XՋ/<ۧ(;Oq1~/9?8iOg1<]=pNvo6_a ÷]gNI>l6 [?E~|6 æi99|#?5=O齇]`|K _??ae, e}@%]dcK`!@0o̗$$Ba }3V x E^ELGSE0E3e @_kUUwq*^Ue eJF\^Ĝ8zPl=7u=UWNS4^L13tgC pT⏍w# 0| 0w! @Bl` _/€dw[' Xdh~Ec^xUWıFLcMP7 rCG cݫ{]5UUUQ @t?~6~9.Ϻ+?(yc()GqM%W\3r΂!&<sLSj=gsN9l;<ݛ{σy8\L0O:g?pz\QQ8_@v|:po >>qqtūPo.gg; 뗝fgt`tu9 zW'Շ $c˘06nE-_;eT->lXBd`Xl@1G-7 %,+03>ES|_09")/2+)8>xUV-D `W30ݛO?mO._dVV۽??Z/us]%s_.Gs1M `sqsen7}l|͇ &|=o{|w6͆v1_~93'9sz:a|8 oۧl${rNmjib9s>4a39 y+O\%q1{? 0. eY/@!QEv;2X IB6K,,K`M׶#n&o2n $IDswd^El= S*bSePn TlUTUQEM<===rGb,4]R`?k{_I71b2sS'4扯iSlηoη/hzMoshN6|q9f;o7_?l`MS]?'3'qvV proNΞ_=96gٰI6Onw}ϢsvqN_c$ w_Hp//076!@X|c϶B%mŲ󌞮Rkek}-`Y(܇:TlZ%x"|?yx_3?u47_}]_1毧_ݻ7;|+`w1131kyf`WL0x}f7P?9vrޛ/m>mw|r`SsN\i }z=`ϜgW}rH6[36ug>. ƾL[Eu Ӗ)H ْAdbrv+ <ui|8^ElSm,X`]ǣEG֪RUU+Z#~NǟY7BovH9MWt s<1qwk_M齿| /6_́vsߘy~]u߆ϦOg{{~u9';gO;av1a?{$_/uήCҹprN>p'99uhN}O2.O=s741s:/uw(u͹ڟٽr Ȁ/a~2/敢ȥ^*K|,XO܇z }lbXOm,aa$ _Ȫ@FJve͘ `,㴧o.'rέ^= Y7~S~=yhږ|?fχ_g7ް9g&&N3w.̯&η/߾6癯)9{ް7_/v}?4Ir8|_=w9lPg7so3_s"ԁ=TNA{_UĚ-Z8v)إg~OggSsVPSb[Z~EG" +b&|-Q8YUW*vOl*ƮcG;r7mw[?t./yizf.zv7 9olη++iߛ> [~8v9߿{~]99]pt33=f.f=og gϟCl8Mg|9>~%__;󽚘b&|~`j9'0o!,cac ]`@mf>3WF~ myF]U^S[`~l '_x@1iRܐ<#eqX>ev(Gk+*n0 ~.ZڤH-ӳ%t˟@KL3W_y>&al90C13p8to˙jss6pw8p8go43 {眳77w8zC¿49w7{Wy9 /sd|eRP!_;aćlZ`Yۈsrtwh$%}|Q{v .n?-%q1qMO^EAUqJX ǢCKܼApBJBH%|4]:nEk7Lˁ3vW]8;lNaf׿7}[OϞ&yy~[Þ.pkp`_tw7g`Þ!aL: ~{WGv}_bs]Ч.%_b*=>l497ާ3|0>sfW2}7Μg=t?Oio䆩*Z#Ų>-[Ac2$/I`f(` ]Z ` @jS[ykde lǣX:ӟx+JVO5g!?g?km#gM,֟a]ZƖO>}gvwb&+io؛7dsp~އ];_ s;Ο'>0g͜ Cfby>=ٜ=_ͷ{P u60 '|}]$Ɨ>1߅ph8tB6oĊ13E^R}VQK_2#jW{kL)v-Z_ϩ C^Els*b,]+>y. eWJ_VQEQο<]?MmYxpݯcz~ >ޛsoyݛzifj4ͼ䜳>G0ݽtK`oްޛ9{)/9o߾sΡC z Lu|ߜ};|a=io'>8y֯{>41sMz쓟1{>d:.j]Eqgv}ϩ:{i/j8~92]2mIF$l$-fl}l,cKF%AۀF?ixqz2P]4|b Xe4@*N{CQZk<ƻ8/((R1g|x%]w/ON?u_W3_{L\\__ӽk;ol8asϟ9DL /7r87ٙ0Ӑayٿ{?W޳|ol;3|o6쉂..i)f)`8Yq~xϟ{@e|-((oQ634qϦ˖3jY@V%@c-uX k2 E  \ѱPJxUV窊J}6rg-==88m3|KrFrqw>i&毹sr=7|zV:9 9L roki}8 7]|cW}6pfvlN||v95Vn@/iN}o쩳pr95( 6~ mAla@,[6WB`s IB` }$I˼Fwd|˝0|+֖ieL,d|$C9KPJGT*QUN0sl;kӃvt3<ׯ<}}i6:97u8|}f4sd}p7p9gg{8~:]NL\w7L{Wp彉iN|W]'7{_î>=a뚦y"u|0gSló:`ﯖlˁ tԺ7xXd! w6+|5[oФҟ#ճ!mJUt >00: EANYy_7pT8C({<^JkU ]wCrӳD؞PwSS洴?goo5M~O|81U1Գwtx s}5OSްC78eiWه}>~f겙Sso8?{f:7쯓P3~"f6:p'Wn:^1symg0?|7߾8ל>9un6Ϳ8gIQ_5t40J9 7fW7a7!/m̉Sױ7 'n6\6ϷDULyЮUl{2YvbA17 8U:TyTP}nET:~h_ws?goږ3O7ٲ=fy~oas7)ఙg& pGM\>MWw1O&zf;Mg6g3?i }}͡t_17lv}O` |21?E|o>pÆ= 9pr3࿟&&&}k["C[?#gY@B*<<2ϡ~H%c?.{#mIcmUT6M5RJsnV^EcɘRzI C UPWj*E/h:-g)gI??wX{}vJgu- _սi4S_ݝg{3=brϿsޜ{rll$ ͦ89z?]35ׇ{033~?__v>0!?|gurg9f{_ ,K?a/X'X.06$lO*DU }R}-,@/`#i0>OggSs4My \`be t5`P*8ut<^񪊳PUS7?s?ݝmA8[ru|齃:=#ph>&ӽiyޛ} lNg9w>7rO0L>)|v>p6og]{a E >?N|+r7ϙg^SMRsrkW=@gk3|={OgHIL5?B!`O|qQB|Ə_= :bFR (Vvڽ;'Qf^ESmJ?%]ֺ+Uw R'qmzC׶o`jpMw}}8'fr|=s7SߛMf20{<4}u4M>6٧a3~y7}? |y&  49T9kūns! 6$rl8vrq×:C~߆98c OL;6'zu9q1_|r_N>g˖@`% ? /}0~OƖl,ldxK`! e[cqu3=aLm5Ulgy'`d>t(c>*q<{^q)&CUJwx]5t#t˟7slgb:閴,=boi{_ttob=ݻ܃iv>pos{l}ͷszϞ |Ӱ̽i{P'ay`W=Ct9gS՜Or]sLf$|э WޝnUx]]O.|3L iFN4`2^hL/ZDeX 8^{`¡ / rt,Zl*HEUp ޝ\Nßv5{*{_믹w!:7}}=^ݝ{wL|}Ӝfη N~s`| |69out2{s~;{~pr4MW+ ?4zzu~zΞ;ԁ<C&D G?mn}H/c0!Bk?tFW #͚cHo".קG^rwl .OGi ESU:,pPT8xy~ǫ5UUZU жtsgK֖,vgtMU7ҷ)=ﯧi{!M5?]sf7>@}>4 ||{Lw/~]?33s^a66ٳ6g's?89ff_!{9?_c|owvџ: pW밁|c}Ao.ʁM}//I %`>2f ?X2 o'? @6/6XH[5_9l#mp?]OggSs6W=MIȭ8TgqڢB -#I'ɰD3 ZN;c+>! H,(J)9dBl зJ4k6o޸{mJHC{C5;`OXQQoY޾w÷15Y*85tPJ`p e3DӄQ>$&&bXe,.v&"ݤ[ XĄ8Zƣ^}bۅ#`A~igTYKFx,ztۭg4|eO< 59+J@98QIB(g j=eJDPxXV+R[d2BSwwqkrzr!gM\5e</ wf  E,ў?i:b-m|yd~7\YYc>v(KKuC5I}.^K +aMU1L=(){OcE)DQJDfhJMZu]*$X/MWW/_LaP ,=B]m'i Un8xE Sյo2h%< p1K4^.+DcI;"؊V,Ҍ:[KQEb\B (e*]\nX(\b"|@e֏)j1wȊ0 3MPd^Ⲥ!qamkމ#6O[ R@RuI4ibP,MeAFP _5IE*bNc/`~S ^b2𷌵GZME yI&->:~jUXs\Í̥ouvXX<{=_|m%8Gu{ޢ䵅aJKCITW'r/*ts  caḈ m>Hҁy)Sq+Av٬):9iu|;XweSU:łW`wޑ5q^Ux R3Ea<ͧKnJ."1ucPNrVYn9[M3JÚK7w$nOsXi@p݉tvI˲;5չZ$ѩDՌ'+؇Tvj9KwTΚHEE/Tה,u\8IQBN¤:4Zg|Bc,"dh)JE(?8̅_O]FI 9sb` J=TU}^lʡT.?muE^mN蓒5M230Ӵ/)<61REؓr|rn._=p=v_~3;[tߝOvv.ݨ-Y_/+U(ƓkǦN` (2 mXI$S4AGA%_cm ="=aUJ>?GA%VIo?UU8iQa2 0jn;DN3+(ёN%iȒ9A&Y\](2d#JUԲ5 XNh ^'N'2čK!@] ~7QuD)xrvh2Υ-&N! lW6('C3:<ϛ^ݪ;OY-sw'HL~壮jweUFGpć gpx|hQ)Fxl`cB $_" $4c𜐑 hl4Rr+'2rU6/ lNYɡ1⥻JP"K~zʤ9,!'!Ϥ)L:ۘGaI":Vc1y8>^6d!Y8C:IL5'\`+JoVr~8z6گH; cfVw l*3=jx[ Yث̍n(\7RD7ӡ L2iX$~.E75 9BaZ=aǽ-.K+5,h-"un,,g7B-5*3YWa2C|7M0z2%[,JI6TZN1+a',8,q/q=L@I B/2C(Lc* 1K<'xrU@FVV.LVZk*N!ʴuOXI*TGP,$c+z"`n DԈ TT=\KCdbL(i6p8:%C-Xg9 5E>i o܋{Zi FIҙA-8ѭ)ӭPd(6T) CLmMRz@հ, &[R2CitB D!eDaGqË 7ʯEAHWf4FDR>p_9Q Y VtzJQA7Rj3D ǜ6LEhBQ#D Jҕ+p#I aŸߤ2.&kB(@;>cr,<}$^V 5)Yf&C9SNu}2!)b@inja2"}tc'HR9C#9z?kTؗլ>4 ?&ѦN['[R3ℹzh4%Zz1 mS [L#0`+Q!姮4/TLf7Md 1 a R_>l\Q90 (?@nq,E(059Qw Eu BXQ/b_)X/M.*W."3:QTP]~ANL7N\ֆ4QF&5%JE) .HGq5<正eeVU3lO_gb+S-lfu bR~DK=]?TK5,Ϩkt\(aĞ,,io~bٮ7\nXcyiif+"%LAME3.99.5UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUimages-actives-html5.git/src/share/themes/gameDragAndDrop/sounds/toc.ogv000066400000000000000000000215761250410645000265520ustar00rootroot00000000000000OggS%ɑB3FLACfLaC"$ OggS%ɑ~C.* Lavf53.21.1encoder=Lavf53.21.1OggSc#%ɑ\$ZN溩ȴ9D[  . @1v `$@D $qij-[ ,pti8Lj~stk~3UQj `)DR-:,P{% F C,hY E2$x,@HGT,ue%Ti¾`[-%n@]C9@u{f=t(n]6"'cW=~%>șSnd 9Pu8tsVIuѲdd I bҩXH•HMlpW^vQMWʨw-?UPEvQL"t('Ʉ.ȡ-~QB&D }!`id(M@e7)mfx$Vц@2dr pdFtg˞t <M }x{{8E,X.L";8.`c+!9 mQK'(P;W:z 3sgހZʊw(WP;cX,JݺG>`DM Hp֦&;1cIjAKy} 0ܜŁ>D6{SGqoQ8-7p|*< =46Nԓ'\!?І؆kV_Wٕ̦,On&peՂyJ]}IC9εz .aoXQϠ1:o2v) nbYEpYV_Sv0\K]K:rU?Ņ1`oݚoF܄F߂"(kyl[ae0T+3[ʶ80sNmif)b64ςIMۄ>&%n5z;\'k*V'HȾYq7tAvEPʳHot1rF 2"]eR/J_'W.wf*]W*[ۧTL.N-]7-[:C1G"$y6ؠC'̫g Bž^hJ-lϳAŠEvWXVƌ4޼v#ߔI|w1=xX04X]ZE8n`;0Vq#S+񰻿nZRyژ+Hfi@5!c0Z:p/_ˡU%i*,N(ڭ @nSMFG`x˧1@!HuwoB{x'~֭>w z,JD<:¥2f5Ƿʰ:!߫jv4Cpj  5Q"QkMR~>b5Rwmo|C$x5S\(ahdӊS."dLަY9)/e ɳs`tܖjO-f =W/-_:q~H'HvEhҽ۸ZHw؞nVtmJ`g6j0n,PdviAc>@X:0Bf$R!o; 芄"B 8'q[&A}"3"9|23jg7L(5"r_erIWz~&aҞMFR%iQh,,TBB2\-D?cMf:㘓#'@,3[bkF I=g"}3\k<O'BfOv% GKYOA(szPȡnifHBJVsʅ8ݽ{!oߙdO2޲*8D LK/򂩯X uJDʒ#-A2Ž _KIZ"5Az!1(6蹢T§ I|3-P6( ك& ]'8Xɦe%^$OE)Ӎfeom"ئ mC[$kv&@-^g.Mlay"`FXdH\LDawQ^' tyKymq2H#GkNb鐗Bf9 ]pL0m~e N3 ѵRPK[%N$ŵ Dj펆RL D:+LT ̠RCJ5'bnmhu&ܹ_sc2??8ڦ2";|\RFW؜>"زu]B{^qVlP  ġ8cKTN?grqηdH#M_[V`gPJԞ/~~%/enz)ˉЯX9//b9>v0lzOwHNP۝$Dj\IlU[0S4c6%հU65`*[( b<ij&g: YZgLm< byڏŧ%ǑFZ`*I;wj 0#Lľ (t%NJ4E&ӎb1Q<8KS_( )Vwj0l+͞XVuF*x%Y4a&t}}2Tmj*$2Qu?ATLF\&b8s9P挚C%A*KG-B%sSˑQÊ.gAT7JyWwSz?d vzR"yw~c4ZdHq^ĻFTB.h~hf>#>l$Y{#`זKEu-v~98GQ^/,VbDجpUJ& P9/ Ѳ[Kq}?hbљDy|~MII^wOgD4~0}aK;4i̕{L]Jƾ$rE V"c2U!kȪ}G#eګ!ƫ ggC3y:G>ll]QK]%Qmѷ*P2GDmdsLŽ& FɕI࿔#i I23FFAT#=33o\T7r >={{B 4y$u.7)'ޫRmM E2Jɴ2Y*ǀ/.ب*_čf Bk˘꫘I&i`Db2&%޽ }mA+DAdJ-^!~ U!IPEJzY> c'P/M0ix}SQŒhav!ql/S#[ jXBrK(D8f/2К"= IA PB ?r=$gB,+z~RTd efU ~5bű6%1=%qZ#1tj`CrQ}*qD80gobZv8~21+B}:d^j8{k M؝߉- lTf\vD1.wQVJ59[mq B*.אPZGUGk m)b L!BrQt&1&7"/W(\)bXNjX!=R6BFԄH8}=$L$DNe_Q{1$܋Ȱ+sۓi^ PHd"AeIebaŖ =4--UPLKbwaO— 7ȓRrOKL$XAUwqE)dMY?g;ifK?2]H1je9FTj "Wϊlˆ{ v'V@;IIU=B_# ab@4Q q0qC](28/V^QG6tb/#Y([k7X3XA-=J߈K#"KQ g#تċPwo3Iɼz,>_\T{tF_,إfq-ۏS-A24~#Z3_ϵc&ךj%9tZCVnԴ1Yfd/<& 1f!S,AT)&@Hy)8aԬ9`oj1QbGkE#(2<8j:HiՈ5K[eh\)!b8\4h"K$vSq@CBeY* |N〾եN[ _3@ `uaϭٖ4 l$'d\؅LEk^j*"w'q|C!\u!_OY !dKmgVYJ.b$iDbF g>X7U5eg"^D2-c 2dInDUHE) F\Rhp.2zbL,<:.|7τ-24  (B@@۰xc L P8h9@<$HPxh4РB %````O(H OGeˠc <$ 8PFOx nDH nAp8;Pxz`$\L X `)c@y I( $,IIaqI , $Lj`$$ WF s4,h(`%"PJOa5`Bfō 2}U( $r@$BwH`п@,@$ZHXp@@1<h*F@) ha@C( 8@@n G@ama1AavH43,ke4 1zHm| G!@ 8x|`4H!Xvh=@Ŝ qDhSEu>*ӈ \D[@,$ = ,&C<`  P3 '81bN~R'1n!pE8! 8qyrB9# 4P XF~n ]$ F 'mZW" `So8`Am x֣( o hX{|haC3„0BF J,g g `G$HdÊ[!ʒ8IH/f,-CaYP z銘6-mĵK(÷إF r$#Ev(Ê yj>)IDp('$Ps!pzab(4GkЄE49'X5)QhC 6p%[2*. HtK!ܚ0Ye@c585Dz@NI'LiFBZ ,,k*C?nҁKd?jJAжlyäDHQ18(t4I2S"x!fCiP 2SK֡519'Ԯ+tc)רG鐯H0Nξ$q4!c‹,XTN* 91M ,4$G\e { MoOCɧ9Aei"NbPZ`Wq/߫+i">tE[&d4DhԔ>PbJT,oiK\MwW0&c*bWxWj"LAҩ"I mjJ+_;Z&;';7[63s3Pjɘ"Q 3|J:kݻK׿Mzhڹ[u+[ PZXHr;*]cy;2D\&gd(%<$ %NT MI:,rH2θQ*Ie-ѕym+dm^"E(c)-K"\Bw_~+ nj랋cpfeV;kj+}

XIA installation package

images-actives-html5.git/src/share/themes/popBlue/font/000077500000000000000000000000001250410645000233175ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/popBlue/font/README.md000066400000000000000000000000301250410645000245670ustar00rootroot00000000000000fonts used by this themeimages-actives-html5.git/src/share/themes/popBlue/hook.py000066400000000000000000000152421250410645000236670ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # # @author : pascal.fautrero@crdp.ac-versailles.fr import gettext import locale class hook: """do some stuff during image active generations""" def __init__(self, root, iaobject, PageFormatter, langPath): """Init""" try: t = gettext.translation("xia-converter", langPath, languages=[locale.getdefaultlocale()[0]]) except: t = gettext.translation("xia-converter", langPath, languages=['en_US']) translate = t.ugettext self.root = root self.iaobject = iaobject self.PageFormatter = PageFormatter self.tooltip = translate("export popBlue") self.loading = translate("loading") def generateIndex(self,filePath, templatePath): """ generate index file""" final_str = u'
\n' final_str += 'close' final_str += u'

' + self.iaobject.scene["intro_title"] + '

\n' final_str += u'

' + self.PageFormatter(self.iaobject.scene["intro_detail"]).print_html() + u'

\n' final_str += u'
\n' for i, detail in enumerate(self.iaobject.details): if detail['options'].find(u"direct-link") == -1: dataState = "full" if (self.PageFormatter(detail["detail"]).print_html() == "") and (detail["title"] == ""): dataState = "void" final_str += u'
\n' final_str += 'close' final_str += u'

' + detail['title'] + u'

\n' final_str += u'
' + self.PageFormatter(detail["detail"]).print_html() + u'
\n' final_str += u'
\n' with open(templatePath,"r") as template: final_index = template.read().decode("utf-8") metadatas = "" if self.iaobject.scene["creator"]: metadatas += self.iaobject.scene["creator"] + "
" if self.iaobject.scene["rights"]: metadatas += self.iaobject.scene["rights"] + "
" if self.iaobject.scene["publisher"]: metadatas += self.iaobject.scene["publisher"] + "
" if self.iaobject.scene["identifier"]: metadatas += self.iaobject.scene["identifier"] + "
" if self.iaobject.scene["coverage"]: metadatas += self.iaobject.scene["coverage"] + "
" if self.iaobject.scene["source"]: metadatas += self.iaobject.scene["source"] + "
" if self.iaobject.scene["relation"]: metadatas += self.iaobject.scene["relation"] + "
" if self.iaobject.scene["language"]: metadatas += self.iaobject.scene["language"] + "
" if self.iaobject.scene["contributor"]: metadatas += self.iaobject.scene["contributor"] + "
" if self.iaobject.scene["date"]: metadatas += self.iaobject.scene["date"] + "
" final_index = final_index.replace("{{METADATAS}}", metadatas) final_index = final_index.replace("{{AUTHOR}}", self.iaobject.scene["creator"]) final_index = final_index.replace("{{DESCRIPTION}}", self.iaobject.scene["description"]) final_index = final_index.replace("{{KEYWORDS}}", self.iaobject.scene["keywords"]) final_index = final_index.replace("{{TITLE}}", self.iaobject.scene["title"]) final_index = final_index.replace("{{CONTENT}}", final_str) final_index = final_index.replace("{{LOADING}}", self.loading) if self.root.index_standalone: xiaWebsite = "http://xia.dane.ac-versailles.fr/network/delivery/popBlue" final_index = final_index.replace("{{MainCSS}}", xiaWebsite + "/css/main.css") final_index = final_index.replace("{{LogoLoading}}", xiaWebsite + "/img/xia.png") final_index = final_index.replace("{{LogoClose}}", xiaWebsite + "/img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '') final_index = final_index.replace("{{JqueryJS}}", "https://code.jquery.com/jquery-1.11.1.min.js") final_index = final_index.replace("{{sha1JS}}", xiaWebsite + "/js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", "https://cdn.jsdelivr.net/kineticjs/5.1.0/kinetic.min.js") final_index = final_index.replace("{{xiaJS}}", xiaWebsite + "/js/xia.js") final_index = final_index.replace("{{hooksJS}}", xiaWebsite + "/js/hooks.js") final_index = final_index.replace("{{labJS}}", "https://cdnjs.cloudflare.com/ajax/libs/labjs/2.0.3/LAB.min.js") else: final_index = final_index.replace("{{MainCSS}}", "css/main.css") final_index = final_index.replace("{{LogoLoading}}", "img/xia.png") final_index = final_index.replace("{{LogoClose}}", "img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '.script("datas/data.js")') final_index = final_index.replace("{{JqueryJS}}", "js/jquery.min.js") final_index = final_index.replace("{{sha1JS}}", "js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", "js/kinetic.min.js") final_index = final_index.replace("{{xiaJS}}", "js/xia.js") final_index = final_index.replace("{{hooksJS}}", "js/hooks.js") final_index = final_index.replace("{{labJS}}", "js/LAB.min.js") with open(filePath,"w") as indexfile: indexfile.write(final_index.encode("utf-8")) images-actives-html5.git/src/share/themes/popBlue/icon.gif000066400000000000000000000244651250410645000240030ustar00rootroot00000000000000GIF89a@A";>>$;>D@D@'>BF'?@AEFBFK!B"CHIMH#E$G%GOJ PLJ Q(JLMN+KQRX!Q$P%N$Q&OV(PTW'SV(U \W^-T"X]_a#\e"]%Z%\_([bb,]b ge(b*aeg-`j+c#di%gn$j#k)im)jrp'o)o:jwu/n"r z!v%v yKn}+yFq)}(5|/~Hw#"/$H}9'4),CM1;/9$^D5K4&*C4C8B+*e:=8GJ?GCKU@DwtPMKXZeFhKSV_^RVm]aiZjweb~ofhenkiqoszu}mwvт{ؘ݇{}܃ֆ܎٥ވی՞ߘܗ؋ߔߟٖީߦݯ߻!Created with GIMP! ,@:t@G ;v BJ-d٘#& D dȨQ3g;}DT&'NrkY8I ZpU2dʢ*kF4iӲi&nܹ̙l̐1ǜ#F\ň-[&`A 2@!D+fK!A<9eOI˘4m޼ꔨS;$mqԩQq3jUZ4lڸ3NҁӦ/XPUs.@_ n0Ċ#G~N0kNIfg;3CWjtӪ P*D[S&mOM4(L4uN:)M4 *r-0 1oK-B~` a QCD$$DD7|){L5ʕ>J*l m T14# UY 75XbqL-| ,"1f25 .A 9 i&dDVCD(5z!!4"7&=R9f-":+. 34 4 L4ݐbus ѵ/r/.x/= ) (2Qù見.@z v)Rdrk[@G )h txtHL1>-4 N7`co[u扵x x8+EzZ0Y_Kj!TlN+-B+#f2$u'E-1X816M(_R,0Kf7C/2$߀as*RaNsBW$H-)/yLFg8`s 6@#/$rhM4c-wrз߁ .@Ę+Ǩ/NBfSPMh12r 嚟d"\<16F3(.c_c]G⡀\[ <-p2)nq/"4uOKҚBfTP/Od&gU1"!g8b0`A 0v]4! ywF+۠L/Toqk9{Kj>*F1OP 'X:"Q2#.:"[7'pL E@,'GIx`d6Vz>fD#HF(M Uph$1CMuX!eLHǐLlv cd'"F4 pL % 6IQS @9K,NXe|JJXrF[#ڈKܤ( SaJ[TT@ oF㦨il4tv (d:SNwr\iϕ>jCU-fAW ihe+٨Fዃik(vmH.Ƶ&.8d88֍f hMlFurJK+"ZeH2W +pF;*C.q񑯅nUAYi<P/ڂ ( %.>H`5"# rEJY&v [[G=~+^5לiMHX6{.*)v =E 7іna%2iۊ_L#|b *fමwz[Ruِx~UJZ&6{a%V4٦AeqŨ'pX"FG?%cG1wv۹1;WjP6F8'2 b7Q)+K:YF-HqQ+ ENcX~c79γyۓQ*D$#9rrр38ZkÓG8NE0g\w,ebLgD 'H1?~b!GvNK86ǿwRo;A_ZCGft H?*`Q0ʆQ4!lCܦI1\#8 ґ!qF%؀^ $E!:$F6 3@:OMHShWnmd+Y+9MOuZ d08A]YWi$ !=YHKƔHvse+jL”!P<6bG;cF܂,܀-Ye#X\3G{[CtDT'рu?Wr'|LXh˨{c7_/8&-X ѐ{5㰂ְ4a }od+RzG$h(XZي|r߰=vZFQB!`oƒ0rs,}385Ʈ{/f|X0Wdi8muV2}g})OAP7 e!:x &PLq 05Gwscx x4R.)xM15qg=p0K٣X2K*2&yb sG , P>M0C3QvH,-+Htw-0x@pgŃ)u>8KO48&c+ps]'r <73zcb?O1Qk0{-9oXp$Iw2:x?7yDh</&ׇ}!V^' ?\fC4 k [v{vgV$eEt()H>{8mjP8*J  p4Ð4YUaS^C MtG4 7 7Lz `pgw_܈R޸7XxFX*Q ( Hw4 pڰP+}Tbb t"@! sR ?/e[Ѝި "9$y&8KÒp?Q+= tYv1 ðiK P0/w&,RҘz h6'l(_Vi[Xɑ7( W tPXpգb*H q1y``Y`h O R^f2t! p +r0DxI瘐`[VI0`tNTh BbK`%9 Y󠗇xՂprut, @ S)ΉEy岙N׃d*َPq虞 `v(vNM"g?Q!vpzg DzR(Aՙt"5K{H "ʄpbzp-+@!Ц˰+f (#D&0_͹Dius.*)?OШʙ_`gyV: GK ` *`X  3Llzx ӀY:§~0D 'p.IN稐zJypj/Z`aڞu%G{@pYw Z )j9bLZcJ&izr/0 U=.0sߐ0J֪j PY# lE| YωV V!Я֩WC=XES/U*4{ v K u $r@EZ SP6;ωVKR됸[**Zt"` XFzpTda6w= +z!P ;[0veJyq jHDbE @z˳hŻ6z[۾›zk; 0;YY˦m [p6 {+V2t{)0kPŮm:![7ዻ[I8 bZCտ[~8!Gz| A3§9 K `Y}pr?P[vv|ǽ *|UL'@7ń̛;${jr oRHsq #}[w|P|,!P ʷ\Ȭl@м`KtIa("R |?w\ɟz@;R\  `;u JA01OaψȰ@Y(g|0̧,0՜0 Pi}$<Ϙ6^ Ÿ|ͷ<< *ԬϬ9N(PM!vP-һ`+ } @3 ѿͰg OQ wU p6<=йB-0 XGoC NMMZ!5 |v]]p:@=c=qLM&Iǐn"YwVx}:~ւPgm+`)r+ִmB4mY-њ.oCb]ڄ 1e'& K(H @BBp̺ۙM,9+jȝʍڅi-ݷC mUy]׻ٽ=ޛ,ѼZǽ9  =&ڋ}߯p0HMM྽6ĝ ͚c 8}0piQ #%n;{.^0^ 2^6y㱐q0`+۝` CE>I[Ӄ L\ 81Țg z=~l6-D 0PvV~ߤp夠 gu`n=c|z)м/,)`閮>apv )BP8 n٨>誾ꈞ= >鷎m 60 bNʾ 0~}-0->[Ζ W^Cd C1:o9 .^2nI9 @ P8ݾ@}Q~!/Y־ >(X o  _byc‹Y=M;.. D$j/8~ r-0b3&J&N^ppQk/q/QX0q n+ہoo𡔀.?[}_O 7!CQ0ܷi\6}Ӆ_Onn n+n 1`!p@! @<)-^ĘQF9ԨPNBI&N(QJtHG9өXrYb]@t>-h 0tфD~H̞2RKf=Di'Op % ֫}>UԅW>kXƍCVڵ)tP@34k]Ecłu *a C\XEj괶S.LHr@3q2)k]OZk ^x6yp'] HA̝C?%nQLbO B|kd %|F)/LJʏT1s 6;H/"\(A꣏ 'DG$C ѤUdaXV)DQ[\eF/?ѐ'B6 d=d3D:QIYVӤP8*j*,h۸dKC+1'd™a3R$:礳NZd7H0=2=dD QNMI$J<%LKs-OtOQRMPPTTUB=Diģ8$I:NW(e-J~Tu1bKM Y]^lavZj6 G%3׵,O=6x ^{7R~7֏I: %@L$IؤJW! ^^+@l=[WZi#7&:d:Y^]WnX7byۙg%lDj+YlemA暱փͲ p9mA&vu.^k_76 kk5dezv7=X#K7t嫥V5qm:@jgv]֝yd'|G~g}.]y7 泥yኻ 64wܻ p@`@%8T`DЁ$ Z0C@!R @! 0⍮Zkt6>ĥIgZ +;5fWU&0VъW" f !@AQ@Ќ;@c c 4MpB5px8! (2D!l@'Vw Mm$(Nv@N0/~Q2* Sߘ7xkG  9L#HHfo0pX*Iuo)J%3  )"?HBvBgE;ꑗ:/'1ӈb##9U͠5LVV Nq!90g:)vK{msBr<΄@AӪ%pYʷ YYDʼnQsRI(0xڰZ{_>ǰU3gcM\*FV3Mԭd:T>TIRzQ>+Ua՗~ϯ8Ę$Ah@Sk$sVR2s 6Pׇ5EsWT% 놔*v~ll5!!aCM/.:B{&viZmKҤjl;^ێ,5Y aV}I#.qԗ]hh[ڈum*: UvNp%mJ^wU"^<7 ;IB1]!WRW?([Pyd,g7f{ljS^[{Ḓ$fj" Xn2 3b|6GVImD2y%sEl5K>S2B̅2| f'<Ғsdpl^Χ6]۬d8g4\wa|e,y B hѕtu(VGʷr5EH).ŵr P545\L|HtLiKagVPۺIAs"bv悟y;˰moj'V$m:kud]_m w;fw.7wG=i??ۑ6# bmo/)ORB$&mSlN{z WP*X蠾8}HC# R:lMa_CfA|$Xxϭ@t蟾xNb6=#vի4I1Gڮ Þ?e(Cvʳ pJ]f3.rErŹ,^`#>>?| ?i(e -.}OG& ?5b_Bk/O5?')qr!OC?ϟ?`=r= @ ?> /3(~v K 䝹꺇*@=`۳w~`?7x?@O@@6 $B43DӁ-`A[Sk~(o-r/lx0B~x4"tC;BJ(Ӂs< =K<|zB\*:'TлB TC{7Z 8 :>acBTE)؂%P CEL)+x;*5 " PBD<$U;EEY,DD;\#]G`EʳKA Ld6\Ɨ5C KS+*PEYnoEB#ɻ2G Co`#G;HǐdG+ɔ{/QGa,k[p4HEG)/W2ȋHaHGtJ HɓLLI|.<<$k4ȝF"Xp:Jx`<[Jȧˑ AJ\ʟG$%KYT"IP聟 q$|3~hKS*˹TTɕtƃCl$`%`Ȱ<\(3۳H2?ˬL|,H@ ʒD|4%ȶ3#I dxndLJH`M\EU N $N>KdN94ӜNǷNYN"LH$pMKT|OUNϏOLN"DCϷN=P%Ģ\>O[B Q@s[O$l<͜,Lm:v?ЋQA#ѹ2Q"-ϦSAP&%S,R$UG6U7P{:5?TЅTPNOxϼK,I9ԀPC$QUGV`HmQSc@d,u2N'FclڷTԨ%IF.LddB%&c?VQEDmMZGUeYfVn\=G}_B㹵\F YFc\ab6|?NMf#vfanfXff_fn[o# gqxmsFguq^dkW]E;images-actives-html5.git/src/share/themes/popBlue/img/000077500000000000000000000000001250410645000231255ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/popBlue/img/HandPointer.cur000066400000000000000000000042761250410645000260640ustar00rootroot00000000000000 ( @MMM***eeeqqq www```jjjmmm ,,,bbb =><'=>=9\!UW[ .Q4WX8ZZX!((YT4 5 7!8Z 6 NQ$34 5 7XX;@1NOPQR3TUV Q? LM112RSTQJ0%K0LM12X>U/JK0LLM1>A5H I/JK00LJ?[$),FFG-H I/J/S)?DE /FK -HO :+#D\M;"7;C+/&3KH@21B3*FA(@???? images-actives-html5.git/src/share/themes/popBlue/img/ZoomIn.cur000066400000000000000000000042761250410645000250640ustar00rootroot00000000000000 ( @༙L@3uaL""!tSSSǨiii555^^^trr+++} ===׶-' xxxXXXcccRD6''&̬ ///mmmqܺ[[[0)#xcO%$# ```ooovvvqqqt&%%(((˪N@3 TTTݻYYY___wbNaaabbbhhhwww-(!߻Ȩ&&%RD5̫˫cbb\Z~9zq qX\_@_`%%rpM^A&%$o(J?) ppG_R8e$66jjhf8k nn_!dfws Ijkl77lR#E.3-3.Kii$s\kcL tNfg^y"9. *4t.'dm54V44tu#g_TkQ34V3> DZXa/4-+aC@T6YPtVV*3Q5l|YJxttVVv];^Y7St 8B}EYA\8Tvvvv*O\>,1WU4O_,-V,\$0<)o\,bd\\\\\\\-b`FHc,#|YV??images-actives-html5.git/src/share/themes/popBlue/img/ajax-loader-horizontal.gif000066400000000000000000000100311250410645000301650ustar00rootroot00000000000000GIF89ax?p]϶熇Oȵi|qba読snjh'絵͵<lw*rJ̀}}}mbj!~耐Zksw;{! NETSCAPE2.0!"Created with Chimply.com"! ,x@J#(Ȥrl:hSPج{atx mpݞu,~f0x}{)% |z |3$zž+ & گ1 +UP+*\P nJ\  '*XQG!,dJ$pK!&Vp;0D3y\@! ,-mi[S>'iMsrX66)(PŐ*,rҵ6ܺyp D eⱍ@R2k̹ &!  ,x (Ȥrl:hSP :5vrqNbL.Y zކgBE4,"% E5$ſE"*׷E1  ^ EHHkAȱ"Ƈ;vpBTd6*Wrly2L&hMl!tbНz(2JT0)0RP PYKV"Dl*uGvr.Uެ; D">5Xi BB˘3kvD! ,x@J#(Ȥrl:hSP :dz/Ά՚fnx Mw;M,7}E4"%E ƿͼEɁ *E+فG=XEJHqbÇ+j!=)* @aE'6Iz)Wʙ G m8+IgPC} &=84TSI,x@XlY֫ ^Z!-\ɠz+ݩ4 BRNfⰍ"@˘3kD ! ,x (Ȥrl:h@Q :$v8|u;ng\BG_07E4 )%E+-$E  & ۷E ҃ˆG=| am/@ᰢņ%RȑaFi;.(LtXdʕ[JCH!.Ǣt9wJbP>E `Ii"P,(SfQReh_֕7[-{6Xڂ]Åâ>pk/.|zE" S:v94P !ϠC;`"! ,x (Ȥrl:hSP :v8c`hwM:~,7}~E4 )%E-ſ˾ȁʺE#ρ &٬#E +; ^ ŋ'Vȑam.HaEv'Pȱm)WJXr3/gPC}Irg)GuHMSV},őB'4kcfEˎEw\ L fȥ[.^{}HA(7ⱌ>n HH̹N4! ,x (Ȥrl:hP1Zv x,^1ݴ&M7΅~,7}|E4 )%EX-E Ă)-*ӫՁ,+1'b(‡2tbA l@A +*;ABG E,yaʑFpв .A(Pqy4Sƙ5)LPYMĆC *eJ)ԨSp`Ǔ7jsXQE Yrgѵֺ R1Er J `X_ōP\$h̹g'L! ,x@a&(Ȥrl:hSCQNbzxL.gn6kug~=v=y~|v2% )35$ƾvɮ 3&ʂ 1ܭޗ1ނ߿Çr{1ÈNx1cƍ|𘑂 OI2ITl@>hF0El:!Р{޴! 0iQM@E60QƖ=+@aFUT V֭u7/ݯT} J5\6 BB˘3kvD! ,x (Ȥrl:hSCQXzn+K.wlngj5M}xwz{)% -$wĆw2-&xثv1 wK *\P!6aD3ZLw 3N#ȐG2%ɂwXhِg\h=h;y,6 ARPy(ҤK_s4@Tm LjUtXDlPԲMn1mj @AeL DX WE\,*$HLe'L! ,x (Ȥrl:hSPAJx-\L>z.w#{}y{)% {-$Ž{ȵ2-* yڮ㈶1bC*D=JTaĉ+Ctb =Tx#H"IzT!Qd˘3kb";images-actives-html5.git/src/share/themes/popBlue/img/background.jpg000066400000000000000000002222361250410645000257550ustar00rootroot00000000000000JFIFHHExifII*JR(:ZiHHUtilisable et modifiable - utilisation commercial permise02100100qhttp://ns.adobe.com/xap/1.0/ False AB471B4FF95292ECDB3C25FC5C6BBB84 xmp.iid:FCA1DF003A6011E4AB59E99EC9881297 AB471B4FF95292ECDB3C25FC5C6BBB84 xmp.iid:FCA1DF003A6011E4AB59E99EC9881297 Adobe Photoshop CS6 (Windows) x-default Wahid Mendil x-default infographiste web XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmC    ' .)10.)-,3:J>36F7,-@WAFLNRSR2>ZaZP`JQROC&&O5-5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO8 B@%(*i)RQSIѥiJ͐*ԴܵiK-"K5l묺T ! R FJ^mbR *2Dҁ@f$\j ﬥΥԲ<;g\xkTLYi2va%H-,","*((!H@%)R)RRhѥ-)JR&lҚKE,UT,WQ 2urihXR]D!L Z -R.PRC&l9ٔ Y{Mt`H@ZϟY>YiF,Ҏif[XD@$H** T*i5&E]U(, TZSr](*҂ʨ`@]˨ZSRҬL(( ! S *%b3`M-%! ̀!VĤ,s!*&MYE([vs ,)͖ŘLRrʌJ,@ @ @ ,AETnMZj)V! )2fѹ"()zt3Qܽ%ZU@hX BXLfRM+)U3CR첅"L&,:@RԴf,ldL,C) 5EQ`@ @@ @*SRTARJRrmi**/iYR75b,%3YAܽ%ܴlPJ@ (! U )D$R&) ))6d͙HCRA@i$6<^GYF%CGW1"lWk#. 7Tb61&ٱ% Я4;g}7㠋45. L;&>Z b#idڍL9祄|sD,?5"bt"#B缏>bcÿM& 4 g>b"bMc4v;fœ3bEKvVUÙ>:)83cSęȬ^*,E QB\سWE hkYר3lc#GsW-UBUDG%_*\ꝱB#ĻJ2q#{ѸUXгw~24#:;{IP3 ñ+Ց}cXˀgñ6NZo1Vf>\ϊcLY];1> 4'H=#I'Dž >T±x& c1n7!Zc Gk7r! ;sFthc9c7H8L؃TIaSQQFnK3g&MFNxro#V-4V:cV:7iP}S &,fy'Ĉ-&6}:ih'TF&5@74Vn>՛k7^up6hU!B2'*j&mB7T,tuSgB#̔O"pMc/Bs>Zx,c0Lp15cǘ4FhBX"Tc>c:1^] GYc;χ1OЄ,J3:cUDv?41ьv$Ip:DtcO˾v'Q1:L1Bntl갡TDG=H'Eef쑤G6:N62^7W6DV;]LR8*t}_4؅D(:1qD! #i8> 6*m"Ȝb&|QO'P:1^!YXY61P! :1WhNGnplIx M'1_*b'MXϘbXM5X1y ,Q4V-Wtڿ3X! z\!uh_> ӥqxؿX1F?͟f? ;1cK/ؘsL?MBI !B6Be|p^_% 0@P`p!1?բ-VLV|:9-t,SH' Z.=cUOp{+/SZ}v(ub?fW!_sMtUDG+⊑EY&12#֜ѪteF==wڟ1>FtOq;]G{ ^y1cKV>}Bc>#ϑ\C=^.c>z3+ ElEEF1sV1cўFzʶnh3v#OxXHlRhe.DmԘ&F<.}˯Lj+lT# 갡xR{G-&<3-61dz$@B:ǝut-'r|Zccyvȵк3;cąݏ$T! XV:+3hB&-uym̟i crzf-.HcUV.,O 1N{|scןϨ>1V>1r<+AC$"ʎ&!sjD+ *F15Xv;r-+X;U誱BA WF7D,/tUB{^*BЄ-t/cc 1yc1cϣv5׉kʿP+կ#W/IBUcci~1ѣyw?hB1ѓ#:P+B!lf_!"p 0@P`?wz]oޯ׊~go,<R:wI7u߼uqgy㭗<2cԐǬ=Lp!nV;W! PK9b'<1t trC6>6>Rfc9P B8ES$!Hzޘ_]pSC &g0B[LƇ&ɉtЄ k(>%c!1ea eݡ ZZ'7dk"BV.+hƉ&4< x4<̡!<vLAr'W\,"[1"%)rÂ}k&|beFˆKqYBb BŲwb9~DRӒiKA0Г&!2r{q< ,o1ւև.)p+{=LR ! '٢f H&o,%S[$$Ab U,0ߤxj M ⍔o 吰L܈!\ف#b9RH,~a E)JRqGT\ 8OĈ!\5Ř![:@JgH[R_LlaҔ3) |_tk'xdU) DO1ɱuC\ѰLLg jE)bV,Qw)}eB )q1JR<-VX /@6&>뿚B&B(=OFЦ8({)K~*AJ6,". ]N&dA jh.NE-.~RaFHBt!HHD\}8(iBilּ =M~c]|VXB1B JjӤlYp'ǘx.oxB xXBBB!@˃)K/LN'Q2K1 h~#x)r.uTDt 41aBBB YO/)KVL- hBS$/}‰Юnb L1fGRQ!c?ˡ!!!!!"jtY,pƲI,>ԥ)q= 2Dqz޻Cѽ:<,13hBBBHPROj& 1ز]SZ},! BQgorb-7BaE!!!!M G ϸ /Dp>`& Ba14Q#o#7eBJ"Zyxc 9c~ 7R]XƆ! ޛ\.&d'XB&[O"9!?ܞ#y'bxX)Kbu$-ʆ9!rR@',_r m(F*Wy ^B73!FśҔ)JRJ>LQgyo}U)JR&f HDA9؄ 5BDDpN.ir102Sh4ሇPG+GFĘ2^ h>CʉQ %!;d"D!=K0πdNMCZ-SG#,|G.)plFM<7j%_$""u$ VE9ʎ0nDL}"3q4l671>HN9WM)JRn-Q\^_#Mh%9. B?bKH/(^M(+G[QgG 'ņ4q+qb=& VŊW jBei cﹻW=R OnJke8({AÌZ!V ijy^4rEH-"~AUO8Tz3ĸbE)u='kCD>)=HHRLL2 \,̥6~1$¢lB︋D << EhP& 7ĥA av"FR7 읗7lhr Q1fX^1aw])za oE JNceb)X#?HUa))<Qܘt|! }ρD6%!4C7L61 aq[,)Fdžk1\ )qO8b +?\(.]X(U!WHT$АuLLH'BearW$p8Ibد0b"7{ƅ 4>XU8DX}u*bbsFX!}jB 3؞ֈAE ג b, D)QG&O?$y!D2!'^I^,lR?a?m,&}E ?ƽ=)KDjd+B4|Qu 2Øe&~Yd!bELL9!^Ll䌄z5?GAl}ybko!AFƤ qJYc{6Qb/"A)c^&0-L&D?(i{ ,HlLLA` XB/jt5A >rXA33)G5T_p6 Q ic& sLHi|$&~Dc&MLoGLRҔ(rCY ,ehȅ)NE(8_,&Z-?X\/v!V!q.Eu0ԬjJ-$ˢPm !!0V'm^Q~Y%EѢqzRзp`~<: C yR1&!De{1Xs(J4"Bae.ɗeb> A!/ƕ >3_.||l9JR&&&.4yC2'|G!3r؊(N{Xy S+ᗩ0TYXW$&& ' f b1 JR?NO]\KjO&#ؓ<1µcڔ. -K_FlX\ X. xBV.HL:oؿPXcbe)KDA*%1Pg>?!+gw 1O$C_f6C.bG a ,-./by8t6 uL+8y+~!34c$^l;{VcԥdJAfճ4j&# 7 ю|DB 5}xB.o`1gI("2lAċcޔQeo1: W$V99Shk,1G1ˆ^4ݴ" ϸ _SciK}ee.⢢ b"c< pr< 1c)J^Ri E^)_FˈAK>{Tpq+p)r&H.bYNP² cc#Bf1L*w{V! G!z3][R4!kE˛m"p1COO0\]0^d,NN9\'cCs ˁ0ыj0q8ã\TA/Ud&iu1a Bc1 -^&R~01V1dV1BcE LO%&! ŋ)JQ11i w ct&c]e.D"# ?7& .Ҕ# c^˪.Ke(.ǚRB+SwpJ1oc֗1J_<H?Xǭ/cK躮]]~0c,{R1B)K||D.1R֔{5~萶)wLBѐx䯒DA R.hR41r_AJRV>B(]=ˏqI'NHB z_Iz2BlaBH7,e. &\ҔЄ/D-F=Dߝ(1O!z$.4LLLOha ʄ!z$.a]cRr萺rF҅?кB!45ԅ?"ǪXԅ\/D.1Xֿːcb,BBKt]c8BBc]} ! {1_/H.>?P=s]L} 5 t.?u鐺XצBcBcMB}(_닩."p_ o vI 2mY6)imPPeœI#X,\rYfE||)+,+rjbۘM$R o 6K -6!i#R-~I{\Ȕ$U&+-&mi1#tx >!? q+̤yOd mK(6$wS{K^/*Rlr]Imy=g*7()Y LJK.)S jAë>wHlI?&`n@$=$DmK^nVG_?^FŵucРлo$M~IocAig퍘l#rAf)i-%2Fؚ[lvݑH}F%ZʾӀ].Z$Nm mook#D7 DcsA~YY8jLkI- ܉J͆!}<拵m&Ϸ3s Z̃lmK{;D"3NuOK7nl+{6RR1e-RC"dJДmM4&lڨXݒdlo;6#q̘'[-1kw"6_eJ?A? ,e4FbhCP7KL3$6nYԲmUd_̑tZr)5#f#'[m|X͂.R$b ~d%ᛉ8L:'?YK>xZI)&_"K)rl cr j}'=-m -smϥU+*R\IN xpJKɉwMmۆR_i"K'DNfN}$C,!N'mO6LʨaoBҐtK>kRI( KVe\:TwbZ5VMm&_M6F!< m:YQ$͒v'(ѵm^Jw^LOېI A+w^ |:D7 mB2V f/VJWWA6l/f{nc$ȭam[mI$6?ۓ0yjՆ:bYmrɍS[edlj{H2rlANBa%I$"c)Mo șԃ6Ɋmg킶孶JX[Vf,Y-I&Imifc@u,%omIm$eҼ m+oؐ!cޕ%ZRdKly,^ؙD,ҲIhM; 1R^ w\PM@I$wrϰl:- tbI_v$Lw| diB,7$iVۖ C4nrcdm&$HLv&E>TMOP7iΣmKn=YKB@Jl[ ݑڒD  a_}UA)@N[cVpxJ+K :UtW ^U袳mpJڹa~Aah'4yl~$e_JwFiAoZ(9/r(LY>am$FIiVT6 ŭIa*m&Ogߖ5|X ֆH?*&B]VOzP$b+[? -D>Pa4W lK \%wR/ ɱWQe:VݱnrXԩ5.EoEO:"H9# w(KWRkB$쉟uI$&җ\:`\KakI;VS*T+0,y1 ';KBշdپ~$l'fRteo(.J՟%.ĢU`KPhi}hmF)$\ E48 C$JZЖ$XЋtJ}Y[Hh`ƨ=E[I, pu/tYܳ N@$btoR$nd+s7ɏ#+?K&9'wunC "N _ohh!.T< ę$9[RCr$`mkeJ\\J/톚ӐxHth7RIBd2jj^>ۑ"K5MTDX{G?z`2&oa ^ soLb|l'ZLm67skݪDI ?$#,HߐHč\֪[Akv8CRlrArm/j8C k"z%[/N؎22I fa)4Yf [>0Gхߪq5[-fUtKm$՗c'XQ$]Rv7䕼Mo*' ƉBUE]U 5=ȅ}b}6Km;0THNL^mrupt[.D@KI$b&̝ h_7/"]ee4R4o7^Yt'}\z%5?g [? mhlSǗX-=rݳ\0K,n~-2QCI/e8L- C`j <4ɶmI$ CyS%]ϷCúH;ԑ 4߭$dRy ڂ[9wRm`vQ|DH!1 5$r\pZtɓ}H542I$$b%u Ђ(oۋ (bjMI$ fAzΛmg2}G!# `ϓ,mt̿jw€N_Z2F,ӿO*Su-sڞX!ҳ.RX3!'$ɣ>b5 ضmm@k~3Ȃg"2ѥ&LcUb fwSn$+g_2-&$C!oֿ`ov=&ioHI;@Zרcb30Nř):r ώB[$ &XoHܔ:T?_'[CM-@+[?`7ʓqicIF8 (1郮@A}u`5 (NmaP6ܤFCEOiEbVm%ېk73jr [H)wA ۧ,O0Ғb"Inۀ v}+M/^ȟvZU#QXc2@`2S `.Mk%|,9:0AZG#l0f ImڀC._2tpl9UN?0ى[0Xy;Il񼳃-#WmN9KU&ӷ[vd$o_ Y2d)WbrA)YyI)j!mKǗe/Lr-w;#?D>$dJ];,kmUͬa}TRiǀIhMgp $%ԝZm0[m+>&&IOԏ.4[7F['\^5}-f$mE"mnYV%+RMjI{|ݴi n2I6vO$>XMIcFVob:-'|R  `ϋd2OR@)?K R;I72LGOd`)L%I.c*[BRP 'ZI$p- r3=*kꍔ [O`M>7ԦDo9He,;Fؘwd;4D+}~>9?<2s[.~/0I4J4Ҹ q8I$y$R}% ٓi%抜kFߌ!O=HeYws|5?k.ݼm9_О7(@j$}d̖$b_g`Im$5H`Eqo5? _ђ1E$zۺ/Ѕ>!k%nA"lI$$h 5 P'0zQDA5 )@_h  hF`vkmo4GmLQFL܆A [mi$I%$` <)P|r¾! $Qٷq3I$#}64CTF3I $I2VI%$l7mX.p'E˅k?EqvLS'Ҥ9w2>hϨIm $ [mhM&mmVTxR9 ͸$up @>@3mbp W ^Is>Mkb$mhILm̀R "K$F+D(N(z98Ϋ{Zm X7hdhςJrFlMK12m6]flh݀ mmcƓbΏ f/HyfZ'.m!2ŞW&S|B3}  l[9Fi$llI츄ހZg!Yzn7[J )$+(ɻX8@Bz#ȅ1|O=[Di[>I$ommHȆml JXlˏ!3 d7T9i"C^cVDA_ -}$0Iٷ*.I$I&mm-mo+*a@ngD}~|hH r׈¦HH@7nII$Ymme& 6m#>!$>5@ &]KBINRI$M#ˑ&;H $I$I$o;.&$mz\r˳ݶeewPBOI/O2u3<IlIK)? -_/.ٸO I$I$I$_{.v# I$-Sʗ.~ |PJ'/J3 ʛ o]oy$I$I$%9fgm$=IysBޑ(Ē\MmZJc+Ѹ 6bG-)$i4I$)9vͶݶ}%;BRÍJ\PD܎m"Zqu@ZF A-mK ]LkXmI$}IvmMoũʵCi=@`MmXM?FL]ʺs!J<% ۶Mh.El$6okR$I$I$)Mv/m7 *M1[Q+m\;os>%&5q.=!MIR@Hu M2'K;I$mI$,lZ$V$NQ/m 18L9)LuZIamIդH IcyI$"DKc*bI&mm6.l[{6K{lm NQfpv04CLKx`K)N$IULlIhLZУ74jޡ[b_KC#Xmm}ImlI%i'` Q/pYi(5DBj$I&5 W$m3johM>CGi$mm[gi$mujxS-6/B$txY#nkoVZs6JTJ1{$Vm)6edhmMzۿ H%$mfxҳ$Mo I3Jyowm=mK\bN`w|Wn%ܿ"}I$I[?mI $MGxҲvkU`ݿ2nd[֒MƬrו7n$Z0xI$I[m$͏GxZBZ;{$[$B$ȉ`IT$%6E/[mkI# $IF7m@vكGxRlzAZȑc@\5i)fȕk k+-[o$Wm)m&I$I$&d{dlm̓DoJI$7zVF 4pͿ߲橹:7Imo_dϊ'mĿ!$I$6mll]@mI Hmimm IkmnBEmEI%h$zm[vB$I$&i6lm ӳmmy*F}sRIYm#*M$@$IoL|GVg8m%{IlllI$LDI{$Il킽$ OJmߕ ٷö(uS$D|-D9[hI3mi%h͒I$@IM}Im݂w'୴ tFFvlRȷm^VI?L"|U R& @-YI$I[$MMm׳NMkm t"7nN[pP$i?V-Kdm#xW$*d6/+6$IllKmm{[s _$ aIդ4{d5T7' "V۲%*V,$m4of$I$loimV ؒs DEazu7r&lw#o|m$+Zm@Mon$I$[mk)m$&s&~ asI$s6mb$·II#o~W jKmYm-$I$mM)lۀI wI֒ocdln6KebI9iH xWݽi[ol@m$I$[o#6۰ c` !IH?hˤ)v[oI1Q^HM W 6-[omA+I}$I$$Ji'66RXIw d$oVeͿm&:;DL^#I mo KoCI$$I$$I'm'f۲ZZNuI#$ v6mdv.#{Dl_v< m+o4I$$[mI%i+lv{Xt 5bI$dԒI*vɭ$I!Nɶ<-6m$I$mm&$i;mr{Y%HowI$ՒSmة$@[CKm<-mommI%m$$mmr{[m"nɵuL%ĝmџ޴msIP~@3%#{mͶ"9?@OI$fm݀f$7mmmmmH7l 7@K.mmr;'Ig@mf,ImmmmmmN@3o@ @ .m[f Ч&3dmF-%mmmmmfH7o@mfh] .M@n$RE$7`[mfཥ$mmmmmmO3mvHk3cm m+v$n@m7@ m5dmmmmmmOm&H:'zL_I6 (v!m׶mɳ mommmmmmMmݿhٸ3zI& m NUum3 [[6l@_5mI%mmlImmmM6mmN;zI& M_c8m$oKm6'mmI-mmeI-mlM6z fA'mj}#8ϡ+mm&mmmmm$I$mdmͶx ov $M϶igd)ɶIe%m'mmmmm$I$[md}~ݶI[F0϶[cy-lm?m?mmmmI$I$Kmdm6߀^$mw6I%:mdٙșl3mm mmmmI$I$I-mmgd$l{m$i&mݑm7?nmmmm$I$I$ImmM@md@lrI$mmi'6I  ;nI%@?mmm$I$I$I%mI$@Il-HI&I,?lmI$N$ ;~mmlI$I$I$I$[m$o@l/iIIɿmlI$Im~mmeI$I$I$I$Km$Hl7o/mlm m߂mRH I$Imm$I$I$I$I$I-dio-l~?m? fm ԒIɷݶߐmmI$I$I$I$I$I%lm$Iml m$?Oi$I& ԒH;m_m$I$I$I$& 0!@1P`AQpaq?ƹE4!:&92}ÆX!>W޿wM p?'O(B}%K/3Q|1xcО^Q( ֯2J_*'>\$$Oy&u~6&1B /4_~Dl/H& A!ccANɔL_~lO׊┽!-|QxBXQFL %1J^XD]Ԅex!1j/OL1ԈLd]| uz^iV%Di[K,44-e)J&^d1c[!.^QQh=._A_,H!2d!8(yJc!}DcOS d5_|'w4ת^Uon){ؽhk},!"M/W'!2x!~EʈMY\2ֻE/)K^T%o_оW= ! ˆ˴A=*"$%/K!2s8/B̥/x|( XCD&&'h+(1_+&F lz7E.6^)~C,HBpbQb Ax"S%eՔ m^8{Dou O5Ứ!zWt9e>~G?$4KR$BX7XA,$M)J_x.Rd'SZNt)(/'ѥe(!rJ_*\)}&1/ToⲔB5qcҏhwv+hR|-.ϤK/&ҏM-!x"R/ޥ(vquJ39L3_ B^KB!!>iJRr]l8cpqKrq:cCRfiJ,yxceԩ6&A~HO)uH "Z!LLR2n_[JRD'T5 |^)K720qK/eFu (6%A/x~0¢(ļ~1:/')J^PHA J+Z!H2O}#>E FQJQk>\11\LLe."<8|0B}:&_JQ~|XoC)K!1YYJ^A#>|RQ$h(ir >XLB)J_J_(BJ-?(P)JRakXŴ2DʇЂhe|Kt "b42ǍV( qqG”ldٷJ_61 &BuJRYgռ1:_J&!JM.'+)uA2 X<"蘙|W OJϒ>AR !B~D6|YYp).VX\oZ!;.}XB}|1tb Ҳ 42-Q2P*L S/cGR!0D&W&l\Lb4ga$,A(ňe |kWɐw2L!FQ &"hIoQ2_"Ai ge(sਥ)JRLZ-BJ"c% Ea 1q rR)rr41ji2ZBR~HИ1Zw N> F(FB,c)1 -||4l_D| "D M  JoCM*.A.X'=0eBLNƄH&&#hhk]R\Iۢ|MCcA$T0J|1+ hc)~~xHCQ!1&vNLl:5qr2L)JFdЄ&'Bѡk> [Se\ςH440!|ABBE!2x=5e)D)J&^ȠKС0kiQQF37(/BncLGFA" $OV!}ɏ͔L~q 1451"m.%?"Br!12K┣y~FŎ!p@#Amħo! oYu|cDCOdlAArNj./ׄ)JTQ?K+KOA= ?Buv=9b LO!&b nҔ! R)~Zh21KCdŖ!-,IBkU)O*_濄BY1?(6ƘC"d|& &\a\PUP!!uvkM山|!YJ Wl|qE:ŐR-&&,LCDA\i<Ɋ*(!/ELm6yME )Q>&s&^ՌBDy󍨹FƊО(u1Q .BvCBpQo64)v˰sO嗽+)zl&RQ?e><&2'ȱ6 x62cl!OB}!w?FY^'NB#)KW)v !2mzyB( y1/V1/R^L~ ӐB5 ɏ ՏcBS{2_:e1& 0@!P`p1AQaq? >]o:[DB K/^~ ^RHBweWK'XK:+VBcxZM(uR9w~)yf J?N 8qjN &Rׄ!=T! . \%kKR|eBzɯb7{^֯}Y4w-sYCo>1}\&RF%ͧ)sKJR2yW&Y*gX7 ;+&|C54R!8f.ni}%/f N$J]R .]ixXzBvBi3p&0s0đ=.)p㼰\>!4mBfzt qA Gp>{\G\'."zO!?hO,x~F!4l/ԹHBKڔ/BuRBfBs xD'jf QwaL6Q1FDx''qᐛ] ,&KpVQ>R ]fB,a=X{\f&!5!$LkZ\7/BZ^kB LD'؝\LpMa%)rIL|0ZB5)qQQoRbXHikJ\1J^ ]Nuˢb +hy(58Pl.Bg.fHM2e Q1=!0h#!Bp 7HBiqFYAf$lB,E)&.oмNHD4 K&a4E䙙"*)tx.o>D ҞPcc)}ʔpe/ dX.[xWMRR((ىD A"p2.E;6eZCD!4zV7)uW鐊F6]aLVRLV)JRXBrҔy !"e㸄)KBzjRԥx! 5&!5֔.oNjn8be?{cy0"-3tsyobd!=uH v9Ԋ/ԺpvLLPAGp-yQGwq~N{ #9&<‘l\g=_1ptXov›ő%+:؏>/o Ye 51\嗸?kugAȇ6ϛO\!.ZG;<3,&U:w>lg][9#+jIJԐIAACq~7q<Փ{Fe"#vl`688a{$Kԋ,|6gű㜂sD<[o,6v[oL]r/32 _=Z㧹LvzXlhO@dk08;.7Sܢ`A/ `&^Q.,gp5&]ÂI$!VYpDK/[H lӮklI}Q,v3O}NHO:,>>9|Y,8g$܉UGvu>'ݽp]rψՏE'~n-&?PB{b%%{'@d&87H!I_$.!g39"x /k`?woY2bd$$Dx/0A :"-/RgVDVvd ppY=CXwX;Ad geeYeߩ8;zS 2IǻmaD~7l6.E9ЗHEp2؎ 9f`.~IwYAtM XEkjH,,EHI$GۆDDY[,{ӄ]w v%hx=Ĭ~=%L!x#d/'8ؘa%ԏ!0ϩz$3i3~pO7̢_h\g #Lb# !Y=+=&;:7`f#%:%e2a$I$Nge1""X"WyisXvCf94`1l'|d >+o mlYs:ѓ-iu7a!m u7lw"sބ Axnt@|<OP3ijm OmQ 5Aa.rvNv$ $I$I$bFBYdpdD7uǨۢͷV]83I#2gPB1yV{`qeLʼn>6 > l ]evfԻal?DCu.688!yf|I3ċ }D%׫۽ub?>7 7[bdHBI$IdC D?,aKh o6;@e>$,2{km.9lIx мmu(ށ )#e=2<ۓōx1՗[-{ݝCxft/mf\iJWYJZ#B|u;;uc>%|K\0I$$K$DDJZZG샢'Dəh6:btή =֝Ld/d9V1YlDs~Ye|xvwbu]ܽۇa}A|oey`_F$iY%#.qR^[M60Q-{}oBMXEɊcν @<˿']BNI$I$9},8!_uwSH=Ma(g www_+eZK$H>9۹8!=2,m{8X#qxcdv/^KUme r,8A5VOytIx͈< ۜ E,Zwy#R=K)5]7_l빙3$$I,?pq"#Jp>/l-#,z$%qVw8 v3sVR&wu#́=/S8GdL,2#6s~m-eLዽ:yvHH~oHm|LKȌyK) Zp`~'ծpdrymyfo; 'ewIMVe1R3$I$Y$x%<>یzYrs1L>fI$K,?#%xSP?LvR}9&1lI ;#OPkd}o͍=ue6И=PŁi I'g-36۸ٓx6$Y!=C}CCɁβ<>l ȷ/f=w k(1ߥ6O8[[yOOBgdݧz!#-^/#Bm^6grl>M$N{7s?]e|2̓e%%O"H-Gݣ^Q:OPg<17d~nՂt΋;F(99q$l3~ѷӶ ۿlƋb-px<ex-!mv.-z,wj7\Lڷn%6GWia6[ǂq.t́ڰ,[1;QR/~ O IV270m+KVpIc6fakfx^v߂-/HoM<]!'#g$7, =p6dog s~=,;,绳WѺ;^+e_0^m%Xn XKݖY mc2>x@<} a4k'S3<2ےmo~ge9""Cd&RAՐa_Կ$>d$Đ|Fy# OL<6xˀ7YD;EI˻:g)gߦ1z}ٝN8gl۫3a.t2jڂrxsu/^%x3mzIwwdxI$w21m߆8"!FFmD E s?PAa>ZOO;Gd[o&y_3ˆxg/ <6mߎ,' w!VROOwPC0]r#_\bڃ<:%{Ԝ&CQ޶?($0O6X.}D:_RdRݮ컌l佶unӓzr66<)!3OLjdfewAA!|_e\Ʊ]Bٻ I,E}%OlIhgml-ǀ mb;lcl3D[am~͏gy}ܾݕf?Dro>#g`Rlݝ۳WN;~^%vlBIҶVx;I3? $DBZ]/1q#י`8؈O{: u#.7 [m c omom^-: yrmjN z@͌=OX}~O^8a# 6m -=/!zx^Pٶؗ`=۶,;@~dgP1;!2I<n%Ӊgp䷅g7BD˨e|+'IyI;d[ym}Vty%_mo H3-%cP|E%76/ߖp xdԒ^$ԙfݞӫ3e ,_MI$!@]?(Vd%6ݍu;~ϋ}d;ZYК2\~l0aԇ܃=۾lgVYK1߸rmA=pޭo-o~z=c`{lV?|:Eu - ma2"&ItxذKwHX>_% #8yzHI$?-A较[݁uh3m;[{fd2gNo9!Ix7|<<"7B >$X-dO~G>!Lyx#$a4 nr(Z,f>of+3'x- !:;gMX%Yxel|I:IrEx>8m4xa6`'M~FhI|Gp[ tcu [0lGɧr8gdZ_ ec}Zˌ2aK8~;fY{)<=Ӣ׻ĕQ4nu!.GO,~ͶlYa屿R}[о#oD햽NglhO!`cD^޺s픾c3W' L2ݛ r&|C -6pmg|X~9Y~{1K&K?AApXg#;-s q?nD!OdHyeo}Z͓Mr % [CCąׁ b[nſccSx`?PG`W2O߻a>=|XXs2:6YߖQw'O66=HZe}pglm^l]l! 85z`fvV+ԑ̷dv&kI,VACACr@|r3dw^y߲-?(:<+^TY#DeyrzRgyYm*|b?Iٙ! ٻ~:?vo܂Gp쒦8t^f1I$)A Ri1&D1yujWظ=2CCuG@-L#g}[ݰ <|E<)u}~x[o' $M=<>=@pwSf?B"vx38i=p00<1grW*[({=fS cg;I I$?AlmM {mY%p8ćăӫN}&=?qd,S! _2 ˻> `y=Uf} OOmEuuoNȗّlnd=gWkVXlzBj_676 &狯orwg̤VY~>B3̛=cW{!9~3ͼ I$bI$Ig>DAAAD? m ,"OWIpLO>Ov=`^IDl&/1í4ўgFV07E6w!,/ca}ϲ)UO7p-mr/b#A14D#пa ~s͏QIal<;hxLjA~/|{)~%Lo?ͻ9,{GAn ~!:=@|f&o >O+~!dm~ٱ&rI$LI$IdA AuGIe0.xxN.F2}/_DzM't{Ѷ[g.o8/"ibN$[:6>` u#( w.lW,'b<WϸS|mÁ~1𮽣8ëxz;)uI/lDol ՜~ӛb.dJMl-<{gIo9<ݣ߬HZLOKx3e߫z:螮ߑK5׀rnI{<.-#ſ jYgl}BlCm3m lYdĒdI,l| mmmAG 냀bPެ:^Mg'Gy7O_V g09ɠvOZagq.2R\'0'LPn ^Kg7at; 0?u(mޭ6}x~G6{rEsqM ZBa ޒ3?hG s/N>l=ĖrG:bnGS)]r~X[ '+c|䏳+H$u*]Vd/\<$-w;l%8~㷆-ٜ|iPdv~z-v_M8Yx`IJY~;mmm,̓eYȟ, G%o mAemApf7<ˀ9hĭbNKI.ϼSb#<#/?|:ξ1 $jyGHfxQ|w?3o-e~!@w Fy _􉺁3d6GXݱp3os/us<%DBorJ}ذ^ۄ8PWRaPHdbu~G.zvqvٳ]%),L3xmmlgdDDs6mmko;'aG Ck~-y/Ǒatx3^ӶYrԭ=9t|_LL6G,=Zh莭?NQ ` 7-َoplq \Ol.=-: _v-ԉYGMl)tk!}gĥ[_P~Cu56)YoRjJy 7̈́Zܯi6Wtw`X}l>mv>:?[뵔`2,u{)-$fymmm&L6|2"mmmm8"#ñtٞ/!Hwlzox z;!ae/܃ytqz@ì?LA>|/i8G# Le4[.Jd!gn;aa;!~P{-WmâVd9)kc!mG'K=p>r^/I'K?8"ex0lv4?r+"r Ko 3 Y7߶W݃]oǸuA,6šu'.@xOonfgxxmm6AYmmpDDpD0 0ml9 1X?~%GH!O h`%N1;ܟ~i퀗ycaNYI2Y3DHOeO ux{ޭo-?W_OBBN-,YvNΠG6x/`׫po,x=1]A_|{gM?Wkl.A|@Mz^3{Y~G`V> _DkG UgYgQݙ2! $IgvmmooHa6 DD1B~eۯk{,ЎeIat.ϨYԟ_!=̠0@:d#}uHy?F|p]}]:G%: [m ϙfy[ymmmm?m"9"9 ap""#5^R^M,xHz2d~Ifo$8'wCζ~Cx RXmH]1:}M YYz?I|] Xر/ouN< }F˚{1S{f J,+(jف9$|-Csr06VL_`37I}L 3Nu hᅴ#A+_<>xs>IC#3l1l6˿VxT{MbcϾr!tBߵEvl6O-ɳNjVMd n]:Aw|"ob&,,̖Y$͒Igmm6m"?wocP|v+ʽC9udujTWX3FKȸ91đv}Geو78hHߴp"a}0YammffgxhJl?9-s`|?,5пՑ5.wԻg?VxtBly:)objőC%l1:|݁7i =}og;}}@;!_k peB-K[6Y&I&I$;mcŶ#rG̷K84|lv7os p[ypݺn > >|gN@vh;gHSEs<6=M CmˆRgmz=ao#!lK=H%"xJ|%f`g//P8ww}a~3cD}ʺeP}fYwdwLr@ g?ZpB9ù? k}]>}A_x$8Ύِf?>|72l"#%0o>|?{X~ja#`Ad{6E1cw)HSO2O鄰8[iէao`Oyېfo )i|gq le D;utN̂M7fHG'D CϫXQ sHc6Sı$<7L Ǘo[hy3 A$LZ rJ(q>Չ)<m,&ۑ 5FrIy՟}.G"@=dK{Gi pMuy333ǹ&xa! , ?>'䈼( #d0 ɰ} g7goLIկ8~d@Z7Pg ,kg1%׋Y#@yk#~dZC G[ml kglNKmV_P Жq2;mxہb/,Bd}vO^2B~ )?PvlYyHGIl,VokW NWGmYxg! 0m?H"8xm̄wXxwQx؊z?d~1ׂPfIn?V{pAOՅ7k OS=eWgTn!<$:ԇ~/uvmb%|lvy*mп}?,~V"~? հm3,*w3O;l0 6xff~ OG$| '!8mYw.3_j>-`wky#N#,5e [et{é62w/bldi$㫫8dwlw,sӶgw<<<Ƙt< ${6e|cy%aJ}B}p,{mmffdvtaxd; 0 Y3K?#DPpmv@;4|lgS*uk]KFwutn.>w׆>oϫ_v>8'A)bz XxԢIy>̿Ց?RoB|՟> ;ܿY.1pX2~/ՙ336l6vܷRY93!<ȈclMmx!;w2>e>̆7`hr@|q']B'2 KKmf*QkW ~YiH_O[ wm7e^6 mζL !Bgam߃32,"""""8# Vl0C X7>ttg:caju*xo p 8]~R6]YM8fzz8-k3;omm3,0 3330! 7mߋ?'# a~mO6S\vORącapm߹ 6ݧQBom1Ym~P9mm,ml,&eammᙙ~[ 6gAN8##mXxmAl[loOV1y\& ˀmɲ$oO؏I2eimYd!xm mm &amyffYefI!$mm~""""""#"ضmm[xb#_'Po :L?DD8,Ñd mw|iiZ}m;lxxxemm,3l10ml33$Oxmm?N8-e x"b#mm cd d}0C쿷!g @8 2,$ 1m 1~ ,, 28xffxyfaB ,amm[ymc"-k C 6,[;KdpˀmmYfx8rxXHX@Y,mm̏ B l<3$~ 7?mm;[mb8ol}vfd$!Yf3aPS- 0CmmYmyN,}7,$> !aٞY:Im7I9"989mamm!fff'Qim3<;p-xeN m^Fmamߛ3,dxo#̖>LaAm!I'mopGxmmy"8gA۸mZ[|6!F[m#y߂.HM}M+=p6'#mٲfgvߛ'mmm؈"B8mY[c[eeK_rdN=ݞoԿRǤPˁom[maݘ,Z[l WW 7mYel0 ?&I!$m?7"&,o!v/7rթ>>e &*\o~Ep>-o˼;<6myYpgamxyxfI!$DG'|YmlӻJ,llBhGI8( pAƞ'濭q%=rm\3-e 0 ?6N?9#7A8-p:~,.FCQ[avB?V>@}I|uնż5?"PqBxm+_mlymepR$2I3[ 0m/ə! $1o88l3l2A 1܄xxMͫ?Wkw,FLfɫ,$EN[ c%}[eK;C0ɶm#mo6$) 1 %3G$~mmo;-,l/WtJO0ypB,aY26WVtd,Y?-p#m\2f_7$ $ml6ofI$(mYx1fYgTn0ˀg[ Jr$Zz ,ü,}dR>t빶ߊ1 ǻYgeYm?v gm7L $i? "#Yex8(aem] "|Ye,sq'gy:~spP[,mmmm6aBI$|Ho7m,m"9Ym[g,pEˁJm呵'8udbo :x_rg?0WW!<'6пc'tlS9Yeۊ$>~Drm}o;dI;me"8 0mm,wb~{m߆E̲<qo<6m<&xy 1me? g <2I?-o;g>$|6yv߁,3x>m<;lab-2ϛ3~O߃33w<$88"9>'xDp#Yev~ 2m2m 0vmY7Y{ofI'Ȉg~[q,|6mR~Jm)LȈö]<33?yߛO"?.~[m,Bm/Ĕmxfy D|wYwmL?~ߓ?OɿYg#m,?!m~ <3?"!mmefe7=m?叁ߎo"8,6e(~;o 6ammye 0 mmo;,şm336#~{c lm oame-5(xmffYmmmm7-~,mL88?m"-xmm~#mmYe6a6mmಙDqkmm៞mw_g6m xm% |Ypm,32?"mmmf(|Oo߆">;mmame(m2#gm߉üo$GȈe!mmfgmmo͟ſ ?Ɵ;oH7o;".effgE Ɵ2#D|x 7g˿~-?#oȈ,">{ořO~[""?O2Ͷmmff <>#? $D~xB2OϿxwD~-DGxm~, 'yߖDG168?o #ٞ^^Yߙ"#񿈏=xx[_rDG~vgg#?!xx mC"#ٟſxߋ{{v!)x DGmxߞxffVſ6-;oHB##?o~# Ϳ?{~/8?">/D3O"#dGg~/> ˟#~d~G0D~;?wHo???"#dD~^~+?D,o8?˿G5?lw? X. E?$ qwlqLMM},|>RM*뺋j[؀뿩16'? J<[:88#ɴ:PYTU}<Wpg:|>LR yBvf;a&>}n|*Z X.jv/&jիWXZZ:r/\hv\.ߕpRjVP(sBt]G6HOZ\gϞ%ٙ $Gu]H%YEVCTBKmò,4HmX.RZ&tBC)T*"Ldi- B8e)6^x۶\GPBE^T.,PJhٳgE5x=C5jKFFsϟh $!44kYa ^m#HHiqdPsuD_~^1 Y[[KO}b{{{۶Qcccf]#D۷o]ႽD\Wiccc ٫fgg#,*LMׯ_wMwD[3TaݝN{[r~ 0hЦ]AM2bAkkE-EQq!0 8VC}@\q`stymb-v׻%QEyk7֩yoq^ֺ0\ 5xz@[```|wG PMeQ|}Ϛ i0M3-5r 5Mkz9*Ki=x8KqΟ]j;[d27oRڗ\.8bdDs^4MSP\}}?Q\v DBW\W:TUsss8wܑ !GB[cnnҾ5ʻgffp۶m?:r윞~8΃`v"qF~[?p$<d=NRl۷4 /u3̟ʡAj FTUic2D2/^U?<L&ظbh&(~%XxI\]ظ-;3>Co]B4IENDB`images-actives-html5.git/src/share/themes/popBlue/img/eyes.jpg000066400000000000000000000027011250410645000245740ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "i !1Aa"q2BR3 ?jzݙ]:0%:q g/*; %?xʸXC+ȯB,FjlWVqϊYZVLmQieb|zq%u>%=:]9n|{+ \_F{ {ް~Vz xCW![S1tic~S`qm]S]\<4M>hK \`ao1UӬh+IAHerY \b婖9;;images-actives-html5.git/src/share/themes/popBlue/img/eyes.png000066400000000000000000000031451250410645000246030ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ˧IDATxb?.Ā Kr] 0H]:,wm'@$=`@CZ1 $7: @didf?"",dud4MiB1q0U⊬ SBJ'ǐ؟XZ b9 Zj$ πxo$ŀ%!}#dk@ 5U=Ԝ7"2dī)bRߤ@z2X*~B@l@M˺|bW )H#3!XOb PK"<&2Whn$E,B-d$'S@]وTr_$5V1o8ʖRԣUG.O$ .b(j!I2І7(nPР;A'>K@| y>ޖ]l؆F=FiAh@H 2Lh B}@bGGJT1#T f@Π{abn/ kd(TNJ@߀;C hfL@-V"?9"PoP3 SAXB>C2>:MNA tpZ gZ$5>]x pB 6& [mEhVD vqo@6h#xI5!X[*mIENDB`images-actives-html5.git/src/share/themes/popBlue/img/eyes2.png000066400000000000000000000034021250410645000246610ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp L!vIDATxb?.Ā%3p] i:~({X>;l 9fS J$w$ /@<8NF( @M5Yȱ␄"̽F@| K6Bp ^yPZM<'PZT9@*>?K} g~ hB-ħRb@ S8ȱDׁWP ۡC3/&g pw @V@|CFpQh[6R@|٠Eo MB">@]XbRC+XsiRk."Ak-sHbX!;G[ErjT%@_sqMME\)3aIВ# JG+. bPKCŦBqZz"~  > RZ`ta 1 !lT0kB# <[&Z ~f91u>B7POՁ8jvb@Aj)T' LIq1aT|AqBbU>5( ;NJ: {6LH#S؀'c ukZ MjФWq8Fa;8 bL@ 4 IYX$DYI#&#D_| Q(zB'7v]MK<#&. R&{Ww`qYhqIV;*Й1V~4Hx ڶi$_"|ӦQ<>v, _I+?ࣝGi@Fс_ b4 [J%TނM V0}Hxol4gtU46ly,, L[7>$/?"* "/t ImFTV=i&y9E2;E!'ܷv%iFOoBGGcn/@3M4QR8NFPc  AKH,s2]Q>IENDB`images-actives-html5.git/src/share/themes/popBlue/img/imagedoc-darknoise.png000066400000000000000000000057521250410645000273710ustar00rootroot00000000000000PNG  IHDRtEXtSoftwareAdobe ImageReadyqe<PLTE"""!!!### HAȫ qIDATx[ 8 yEY8f#=,gzO3WqS}Uy"psz~[fX21S 5>}OEV Z} {jygHj}Dǯ{r̎fp֙}ǚӢvk~gM}1ưhIJ>fZF/8+ɲՆ[c:E:dTGIk~t܅ĸ6°)DuF]t8R!vhЦ 5Pp;QW깚ʅ}Mi DžJ:-:kW ӌu.]*FŚjX JA 7ѢkfCTLT:l,ĦսI5!LU^kͭܢ pYwSRAd<}Bhup_iQջ 3 +F[ց~Rd+5£lnBB .2ҀFO>u*pV 6p>)9Z}R xڍq 2hl ಆB ;cex$\gJ1X 1VJRqj Y: q͚" `\#M3B[[KS6O'W&-v IGMuٔ;jb`crs}θM'cgʞj9"ty::TtL)CѩF] EʒORJcA M"u%Jj!MiDjS -iғ$q\(9rscp 8Fn3)tAܲ<ABh+tThk\KLj#G%Cj8f,a_+qœ4# v!8Q9ɐo;~Io{g2V:MjC#Q>) r9|/H0@h!w@!ЕܥtO|')q< t4tO4yP (fw4N(0D z1Ҭ1@3+\I1 Ajq$ 4ZoMA:c<ʽ+ e+`,UkIg^|ls1$Ҥ:0 "?LO& UdS\?23aG85-IVhF'<`k>uR=NsG>]ȯ9)\.CI0ŜRĒA\d ɚ5&´9ڑId>H釼$1j6’v07~w?YF2㧗*cEl*u@|[|=iL(0ĵ=n.]@(pCArDt 㪜9+npGL,w^T KdRWOprb-9z:{OLԋwW+-;? 6 Gv6u)KSWxvf0FX-P 9 =\*J~rVp~O79SF̈<%rjVcۃLMt+tw%?.itl!3IÍO10EY߉72Umd$TYa4&FӨ~'9ߛ6vwEZ( $V9/ 1q?$ڠTVȴ)A0DFDŽpI VT%\R9d<+h9egw`z­[J "!it.VÔ$퐯0~~#LF<# }([eb#]/<~^o0MKcΊN S2&S4 swΝ?aKOB +(Sޙ^~pZ/ 4ۣBݴj\E8G8:zomK8l|;kW`֋W+od~Nv\>&E{J~r MZJVR>0\DtCHTm4rV6]e'sJ%`dcIo4^VJήL^|!9DT`ߌ0=]Jgo}hc]n}fQ9㷂I,L'Wo ;?v0~Jρ Adobed         #"""#''''''''''     !! !!'''''''''' "`!A1"aQ ?[I7 o3yxnhBc'`%̉z͈5p4kֶRD%d|,^6ز* L+փVrgJ[iPqp7=qV:YPW1>Qm:7M<ԓ(0m>Vzimages-actives-html5.git/src/share/themes/popBlue/img/infos.png000066400000000000000000000024221250410645000247510ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp *#VIDATxb?.ƟaD 0yN@8;k,#2 :S#wوd; D@K^hLL3?@#6A|A  S-b-~u0? i@ j̓8#'5bb5!h4S˘uw->7RRe_ ^Z'}X!-=hg?0eq5ia@ߴA"ɪnFKg@5Άm(zlc1> ށqP!뱿8Gdv9IK i8q;1Gc( <2?G=7%?Qx:'CT֫B?rG=F$0;^IENDB`images-actives-html5.git/src/share/themes/popBlue/img/infos2.png000066400000000000000000000024621250410645000250370ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ;:IDATxb?.a<0EgB3I FR$p$N+pG $Y#q՝ @didv|b&RmD?Xޒ~Ɓ r";U", XH [7Lif? i2Y!=r$Ѥ4|}6|-#օ_ܙe#7RI @I?UL ?0ujNk*eH ZFP`w,GKm@5Άm(zlc훑RhU@&Àcqӏ41m7{K i8v 1= jX7cc q!_sc7=Jc+f6 y|Hz#r mݏG؍7qIENDB`images-actives-html5.git/src/share/themes/popBlue/img/meta-doc.jpg000066400000000000000000000026451250410645000253270ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "b!1QAaq"2 ??֮\"`eZcN@,6I /;mȳA @sB1`!W9iKoDoy~wa`\l„OSXڋtm,:J~0h. "N|uAw|z bn 8H*h?Y ]4MoK۞egm0ZIj4RxS n\tIrjd' g:IDATxb?.[aF40#6p lb$ABrP'K .p\GïIrx. L DN`s"//E?g$k9 CٌDv[ڲD D\!@O~b)jƿ@, UC&hz/@ C.8@,bR# %&eS#DO˞2k ~K.v S/XCe@mȱ g6G=61{Laćѻ jT gЪrPGبh|cRc nTP6Trއ?hqH1}6 3mhdE8ঁ*IENDB`images-actives-html5.git/src/share/themes/popBlue/img/meta-doc2.png000066400000000000000000000025351250410645000254130ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ;IDATxb?.a<ΰ ,h}qg J 9fb/X]$;$>մ 覽z@PaT"K#U @j)z`<,H 7@\e3\٩nH.`!X 0~2峠AZsRԲl3C-f &$Gnk XT@â g(l9K8;lS#=-{JOˬ-q*Za"@ S49 j 7C2k Pب(u4q FmD`+b5* UHl-#c,5)Ae)CIujX I  I-#A 02*h,@x@Q CxւֽIENDB`images-actives-html5.git/src/share/themes/popBlue/img/nuage.png000066400000000000000000005102351250410645000247400ustar00rootroot00000000000000PNG  IHDRD;VtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp G<IDATx eYZUWeUW> G(0n$Zͪ[@It넑<**[v 4GM9Fg]@ݺd>(wq(C;* ~:|"\sUi)w7| >ry Aɣ)fTQP1n9͍XBz|I2.zέ gR';\G1EnPc )V,RGPNQkY ~Ev:O<"yT vU#yY@*Q˨1;||7l8hG ! JfTv$:G8>=[ hƇHߑ*H <8e@{ U̎2@!T{77wQӋ~DREeLyz:8pT~C1̐y@2^` CM]kY1u5=s̿obK@Na3 z٭7 ɖ,.ZQuU-)?C"7Z tA~?an%:Z0T4ŀ[gV+FRg@ǡ@F ($@hcHZI|Dй9KFp+ˬϏ$zwa׺{:UOG5@\:sXφk _U^3/p<IGʩ;d>`ȡE|Ry$\xŏ{,J mCz 3":揶u2Z ;4 T璭[źԊH̢M@%n`pb?1M@r*P}O4B"̈1{h *Y ThJwBJЫ\EĎ xiP\pΘY&:>ÛjU,Rxp"=d $I2p` 33 ~-"P%UhxØuPK@#Hu^2_IM,n=k^2@q^~Ǽ4$BB> X"I G(눑m,E $Z:5肑<*r>"yPPCa)I$7j? ^u0 @!QFe*:VڹbuՉZ<($8;[b%60@8Dr$:D(@E}%fIGp|Ƽ{@1Y mL .rs Sdu"NT|ԅ 8s|51@KlHCF(ϨXM2_0N=N.@,:Aɣuߑtܭ)̡J$tK4J@y/T KCLTPlsdp1ydcdٝ4BEk @w{pN;e@)!hBU+Hj7{{TIU,%.ue=P_޵}4jS]$7)k2#aZv8Q>%%G#(Yt׼$ F 7AkfPp:%kY$.Zcj2{~T C#") YCub ={5VY#ywUW4A^HҲV0Rɤim ̦*[n2Lyd'꺠:~Tz,T1Đ>B F?w%T_:kp+O-?n$@Z4nf~.&") n=.?EDgfP0nx^y-Aa<'Qu.#h: m`3T7 0K*$1>S*gI)a,J REB*qK=*~Ƨw{ b꼟,EL4Jz+qt(+yO*h.o-x<)H0 hNU4$0Etᲂ9RN&1E(Hvx ,$K$ô)SGF;{et/f̢!iG2I0:-g }^SI1  ﶺEˆ8\I ¾iΐﲇdJ9WV"OO|CGw$ +D:J"Hk>+Uhk09z (İ*OaM]C"7Q'-х !#BH*Wy |suO6>y(8酬ŰTeAknP[sSeI$PRI$FC:: h/lO 1G{ ߹Q [#hE Hs+- 1D:% (s3ĎG3Ӊ%4 CQR{t(8h>@ !%N?a>DnP(Fs[ %0Eh D󫘡i:3NwU29"ɳw[.?=Fda`7z-ܻ@Kfo (i-ի٠#|^a風YLI_! k` /aT^񭛦?ذ) wggZLu5χF n)| >#CrWL(\;YG ͆dpz0MfPpTMQMC _\0*Dgq5>o4R #0C@GJM5n [rmSIӷZ*&ymsniRl:ϺQ EåNb*t5G6 Y$Ӵp J)qΣ~̑;T,h;HAw2p;s)j͟5_y@tu! x$KƂ zF:qd;a6Ln'N1h9]u ),}f?@ pU7mj;.OH0,`%\bؐDbnz g?\KޑMCzQKED½x^A7HAg?HZf6g'%1ώ||ZJdrHEH_wP@S׹`u H AzPHZ$f}hbw6_ Kg+΄d(eV"Ih#FEaVP@IU DNp (aPT8`TP۳-I DE#:s6yc/J)dHPKfD:mJ=հy2l lKѡyt^TK$l?3 AJPHC"Qg[1{,3B͚wۘU U.!  HcU+ x8əAHAC $HAs8!tR60ngRQѼWdH>y5ޒYBs?[HVn=ɞjvZ(>e^Ok.gH ",` w!ōgwQ(;^aGs滐$kw ciUZW2@H]|IIFw H͡b^)-uVL/X BWbvB7w12g7WeXXgg?P US,cXCr_9ڊUMUl?v#GdfHNw}ibI֍'ݰ)Fq $J[懒+$deVFU#@P`]f[AJ"1P(${@8|JΨ䐏~3 bs'ͫj`\=NsW9hx4JkrI2EϚ׍>jTqUwSim9Hͣ$ ݠ](;(JKrhB'y/TVX$ p1x< %$Tݭ ,+UG{=|t #;0}l P(=8h58 UkޑHC9s*9 ЁP *$3(jB0@:PncX9l>^>$Kis(܇ hT' H %Gd=U$G*{H@N%T] _C6 n]7iWu hh%%eTwuحD^c 0hzgGxEw)Ww03OWWnΣ y@G@ u#]5$p}߻IqKȆG69B)L3l4h5}a$lhz4dB ?(J W@hU?m^l8 9@Kv#dK7a sdS4oFrZFG@RDAVUH[OyBu&ٺ%y*_ Wz|2lKh/;Uq"]mmAI5P094J4+Pus z wNG@1  ͚#y@|-^v1 +(*٬gK A>0QLJqzh N PR]w )1DXHI);rv#Y{K:i @j~%e'zцo.$$ɔC({ C|:US$:2%Dġ@ݔ8 @2[2 ly7D`h=Jkm SĂ-G 0$Hɡ@y'"*N<2W~fj$`ЁXPGY#+y$' Tpt#wŪI֡*u=.nh™C7$`tBq86 yG7QPЋ$lX%ṱ3{pL8YTI;Iih I߷Z(i(sU;WYH9S탚})hnp3$19(ZC%8JBl2H:GU}|#֠H3U(z85bu+G篒o$ ):!~JFn2?" "C HAL:.ȳ%&E@@%|E yn 9e:sT֠@j#Iq&|E9tO憨\Y=V6Hq ,ҏxʼ ɣ$#0El~TG1EPЁ9H@U҇)Aݗ*# yE#I-?i~1ɣ죂_In[F $d~#-@W!w<ꖹ.6T%$֝ kl@rȏKl HR䑺u}k滏(@h?٭OUYA 滑e m )ivqS(ub, T)~̑yDeH Ht0M/\#Te~ͼl!); 2_9͡sEIs@ xCD $ 3 .11`>J -j }';p]fQ^Er~z;8@ $H3[UDf$!i+2HWGh_ɞF³ $kS|SN4hS@Ƒr9rcF,<hBCSIDf~9jӍ@x:\HTځYFsaXPL,$Tu{ ĀG*A3~݄=':}-{[(8h*:R% ]%2.&>?f4w9TIH5G™rs$:KFtvvXFpȗ,Pe0R`!딃/{-ܷ:hFYHZpԚM%h4Սt|P@@((N%L4<)-R*P?:+)fPv(tP -d$U[F,Pyɺy%x ? sJPUiF9i.@hB4GsHNݬ71E" |-L #u ~,@>ό3dЪHg6ܭ)h9NB$-F1$({2@H>G GfԅtS$rFҥ7 ӆ1C().mLCɣcn=ex{X+uj@pHu(@u18Q8QFR*S2m vh%UqHyT$]3YI EΨ!_FdNT!. I@B'T/YY61IbI=.2\dBՇ<M.S*/ }DI ;>R) c>$.JΕmbXJfS4 @7*5#DDSN}JF8RI3,Pq™.VU3k>.`h94jo/Ȓo3|D^Ou_i$ $bP ֪['Ѱy*G3s45!HT=3vdpFRa .Qq 䄬!·0FEɢ; #HBH|&R+.]  U$kQW1"NdK@S(5Ԋ:/ʁ ~* d $>_Y( )h+Wh]ts!P7ܚ MlcE][n<"(e-cvDF(}0-`@/C'ӎ.:K.<(& gĵ:V1ElGtPJ A㸑wH9uZɣq;z5(r"u]7/A s L}> sLsI*h>C_й8Jb g|:fhB jEaDEch=6ev]WY|P_LAUCR_ZFJ--%TQ{͘Kpv3i0GèW $UM%v 5z~52|&x.fc H1{:,ΌH" c@t9.ߴ }$#B7Oɗ aѾJu#q$U;]F%9!Cz3A EC=l⚥k P:lBz;8mE'EWffPZnj‚8Pv3ԍ$)0(L9^V̫;Ql hJd@jك5qΣ[ et;3὇DQɭKc;H!TA(u;8s:YRyRŭf#) wϪyiqL^s@;aX1"D8$4񡤑HnB΃g0.w$|fHPQBU+I^ .U:.SHۂ/}@N06H8t.PlhQ?"= CCR ҃;:a~dJgÙNw#@!K:Zԍך*t9aEoPIIu\Y)˪ч1GCDêbѾa$'m+KtǻOi  `xV6Q̕ 8p^n$](%Y b!.Q]07Vs47Ǝb#fTrhO5 D]CZ ҁplF%n?2@'&Qa`%[S {խB7N4+u%h( $HBў4gHe瑒ɛn]6G;EWk++F@6(yn3\:_[ Nv  3P mT(CG||,vo7*1@6cfQEGO&!gNTf59$8RȍgP7x bvB*~{.̲3Ƽ#B hQvT,"6֋B9EF{M:W#)qJQtQ@a"V/->0zҼ7ɣl֫ncHdE Ns*T/Ɂ!L*$_' u#bzp*IP@_]HF7M iz/}q| A H) 8r|ab2~U+y@cJ":T7m>t5 p𡈬wTC(#k!XP$ulƳWJi7ăԝ) B+PJSqC 7@$SP`k$ ] 4#r,5IɤSa)iA(]h1oC$1'UK~D\}#SD3ٯAE_ /` h!IyƘoE17 ЁFAKn}0bT*o"1ALQ3 ڪdHlB$<bC`%>V}\u$:Ux%G9$hE4^VpFԡ((pvͼ#QGQ\ocQw] ~5 !wB(}'@&ͫbyyټ6& ZF W`Nzg!r4oP@*b0G(}˖lRGIR|BRT½PI$ 5U,] *8YR>hT)xռ>>@/7s$QWbK(hatSs!Vl!z3Ć 'Qf%1R!ʵp\ź|Axb>d^ _5HUi7HIrg");8`QPD}MQ@mf(Oa3;;JaL) w@b^p%m%cxPuUo&=QY@`Spn3TX}&: A̺Y=m$NT>1@1!id386l.g Uek.LuoMb Am5b4xPpX $fAR]6/ {-,RQ P=@QVZFzՐH# 1Q,RS=k${@)dⳏpQI1d~@PQˬ[oCҌ (hHBI^0_ G4FTh7j4 S:%QJ] @^ `8>F'$MG|-Rf(/ł[Fg-Kw$Y792|kEsG*Gwww_,n=յyͭ7~ߨTd ^%00DD@uU {%?T)Q7گR#A"t0]@}w3Ăhu qГ~692i^3?)@LNNoڭsKKKtttXoo XwwwuuvvVFORQr;ܺÿdXArȹ}ͭn=g~{Z:&q|%Y~6䅹(ILPLj.Uʬl3)j/9Hp*QaĈΚְ[=JQN)on@ 舒Z1lرcf?Y\VKp5qD¨>OO&mCD惓SB#9yʐkUнlދ$gDԂ:\?oY./94 =c,{yw3ST7=A&iE\̌:R|l}}666Kˍuttlwuu[{?9F *Dr'ܦ w2e%?722yGRyޭqEn$ǡ0K*Pw{T[2.ڒ{ T}(t40ZH ZGcA6/ʻTw)cZ+w.//jF]JzWoG"7XↀGNrGGg;|uuݷ\w]-b;?'&3ǥcCPbo|7*a6a|Lt\7 jAvL3irx_ ; hRhѐHJ}WWWq `5xZVa;;;R? 1>>o///KmjjU2u ӭ_tF q5GBܒUP $OO<t CzW61G] I 印O}M0EMg 2FE@Gj,W X@Ø#S~}IW2ځ|񁁁vvv>qfoo^C{=w+}t?vuuͻ5o[x|ٙ~ڵkX>%vvvk{{۶lsswl299NB0ĩ:22]?Rh#GT%2ڧɭ≀Sz1GjpQ%r*EtÑHSSgw3ֳFAx=P $݇[vwwl u~˟jɓ_򋫫Th||%sLr{P.o```ѣkvvNJP@H?hI)y$̌ngFCRSF:(UIA@͔Qud Uֽ߼4Ԏ Y ܗZK{{{VںW244T-*Gj~~ڑ$:uS]]]_?$bt H eq6ǿ<ܭfT@ZUu]TPzХG 2>:.V'۞s\Pe {<yi AgMe >r˘$>[yoĐ$jIե@﹬ut_wƍk7a\f399YujyknݺU:uﹿgw#- 7778ژϞ= w|[?ēINڥP xIVt$BVnI^.uLQEtAE]/|Gf|)y$ٺȂ TDq|hs$4b2_xPc5ԅ.4nժKzzv~ĭ}~5ݗܿzvE PI1G>z~A)>lʚGF?>#<$}vQ;fN96/a3¹Ot)Fe{J0覻DU}!W /Md$n:$ҏnuM#yɠϹ+:Yu3gTOK(󍍍U|O~Wgggݻ[o^pa_gg'N8QgfyyYcCjz1AP0_U?7mj -@PϪHU1mY_hl?SfL%^?%vSTD7Vm~kb3Ca3mHjS@܅oSđ~^pKm/oB[!I);w\U-MIGjT҅7o^<ySɣjH'Of6&-̗̑C-.߻sFKW$a<BSSN8(l$A9%r" -]TH~u15kruo=>BBݨ83ҏGzíJRARfttDJ~IrNI7ns#,˧|,m}cᢕz݋}Pɣ,nMmn}Z+DDJ *=NﮅK>ԇ+'1C # Y @"TG0C g7 SqkJjѴJ;SXo>C|[ӧHEfll*wov)^moo1^ x~RƷzҰo䁏O0/O&=e~&j{Q@$n=HK-׎$|5 IՂ@` x4*\D caԱ.eL yGYyr$F='*[d J(}TDgg|i\"kΝ{~cckNuR0}uۭ7C\˗>:S}_Gb+R+[GSA^ĨDh(|J$!5i S@i(uĊ@RE)bfp?HVFd⬿a8q՘}ɢFB__ɣX]DvEAM ;;;<<<|~wwfgg%u˩9oܿ秖ӘAH ۷o? 8 |t*0|=8':i苷T%3TA {suǃվ"=hzdcF@+EsŲE_e 9y$ɣX[[~rwRQz64KjX^KxՙQwhmooWOn}ѡ?q'-[rH//vueF>H A ]rrmN$i*a,8$e'3fƂ$U_5YDQupnpm B]Β~=k̆˂O(û 4׭%N8_jDU՝;wp5a400tLɤRT]՟+J ޻ݟ2HD.^xb>Ŭ$fHNM zڃ<(@UJڇW'G1G)+7"hzOf?7I`Yt&~ (6@J7JM* Zn}wÑ#Gun|ZygVVV!T0Y픐Ҋjw~kRxKwXyt8`p/xfEARm@rKfTByOjP.kTA[n=cQXNBUyM_w#ERO/h-DJΚh? ɳ{ GFFr{JA~O%>\M$I2OInQ󝙐2<:>Uo;Ԡݑ}P=ə/v__t)tF龯yӆ {7۝K?}7_ȫlZ^ihJ&OF!i HDlO`x]HwSS2@IEM#<% \ B6h%ɭ?Wwvy].W:߳d[-IWIzoo_.JƓ.8. :.F*=}Z[[;ֿ~=9}Zuwt\sܷZ/aeHu!j~*UE0!w1 w ѩb~hzZTLD"+N!g{'@+Z sZ5ɢ(%SssW~fkk0RCwp:KVEH%cxp/νa ڜZJō;H-wH~Q'򘙯2X%/LBt}ӌ*%T^tͨ6o` $fVBHO'x$:S4@J?ʨ)JqQA%Ldݥ?y)H !+ ' B]%+`PTM\y,}xj7ڏ9R kmP*q+vwwpm_q_?c;>WXRsܹΰG<8p.ÇI{wuwwk 9O'$u+祛7oXJhPRQ`* t%"<بp[[[&=u wxs<B qoQY] Չ=kJ^Rv˰:9/[1`;= QGms>oUMt@wp}:)ytBQnOK@ovttQŨ,rVZ{[5>hm%K{ljC^FGGoV驾i{/Y:f,2Qm׊zm6zyf Rt~xeVG>nF2<<\H捻)655UM"-,,+gܗϸ%CirD$]%t ]2ʡ5h$ׄm )Z|m#(:M&P*l wRAX{»NSWbJ!% OYEӊ%*(e"%TXߦ%6Hj44|(J˴h6'eUP&(Aou_qIwvD. yH;b~7nTˉx:4M$>߿>rWŒ3>aՑtuު+䪑4Q0p|p(nlUe:#TBt`Lp(s A'wAzY w p_U*92XxJ;ݠ"k-DkXA(5@1$zK7ww~˴ҪK|LRm-\藃7fxrzzzv:i1( $!~zuSx%f|vjݻwy}ϲ@Dt=TH蛷_)YJBhMAU FʮT> : fw3gf&OSƬFj:HBc#EttwwoT*{Y"%9TbJ>)΍_YD1aCiHTɡv_2-޳G̝Ijpxʰ{}ۄޞU| ƪ9xXr%HɣʉF$j̇3G/qv1BM?i<\"LSD8ה? IT].)iLQJ {fW9$.TߣiBAjI-`Bw4l֥5m$w@T*^,TLѣ,*HW"I $Ų8"ñclvvV]nv8$-Uj)U Tr9+}UK{ݚQRԥ7A~0yUKH..8џG ꆺuV>= _~Wl)s@{u߉ Dw^a2l0rx'сGt#WlX cNK"un.L o[T=شKzQLZXjatt/#%EȴYm2yN˴։o%n2Oyi UFѴI[5 xzz:QzyK EuG}Ϝ9SmOL[h?П3|H6/cKPPo6ݻ,B;=c^^}+_5'Iv%,0)Idq&=yH}Mu$&&''bmmE#"oTG1ߝeǠ %׿Ͻ?l!afK1z[%U@sr4zV6x[@ԭ hG:IUI]WLةS3oH UᬪxC"=[ gs )p0OXB Xh@J'F;mL[\jb"ӖZ 4 Df5qsVTDuI}')6661D⥹@ U݈II EE>ds)aޭowCsyhe~ T j9f: V̽<$$;{9HÅUcrQ滑Ct38hrH =9 \FG"o 3gK.Z]ZZXjFb}ݻqUh7*bcǎ*!m|G3ERwϹg'Մ_֧'regϞmyV2sssV*yIj&3NyYVuNbHu^ _`{Zҙpc1w[4vyE)@dnq@J^YY&51䍉 !T:ܻI,:Sg @]8λIIrUoXXІ{%HWYFX4OYcusEpYĉf"s_`{QJȨ*!y1F1$G ~~_12<9H<c M GYR#*d\M+JJNz fPusՑkɃ[]1hk\\YYA,b3ϟ~:#041/_:DwӇNKj`hR`w$ H AcO I>zԉEUJ&r߭Y(KOVA$iXeo677jŗ*i^CK4h(!ͣnC%nbPWl-<I:.(fhs!W7sl,ݝu4kHGB|`yyY{VK CNWq򍍍";1y%{­!'F>$~ͫ8| HNR[]]&$ XԞl5Ў|eckќ>4/E隇)j;̣|hejt:Pl 3ԍoAC%<;B\.kkkՙND^$ Ix_)KP%saS!;mbb"jQ!GgԑSBWMMMUzv``n (,w:hJxʭ I;hI\5$*kAq qH ENFX ~|>c!19Rd"Up'e233ӱ*o_(u!A |vvkTommmLv)( 3uQ*$G/U]WL[mDAp9zխF-gy)' &@ǬjULQ{.u!iWG)-rϔ|$]# $]p DrӅq$YFJbcggKJҽ-mـIݗ:,c_H^(~VkgZDN@R'RZ9@D ɱ1/l9|(#8:o~6q rB qZ!wJ#sn3Mټt4zU,4mi1\6/Yn &8Y__j}j rK mooE o e u0K?coo/oCcJmmm}hrBZP`Brvo6&i9զ64HjI ( ȼI٩G)R;7CW0C}ɦΘtޱz˭LI7Jⴋ!:HJIB&W.E?+ѡqjƍӜ[sDrY{־ @>cIxl&G`ZP|dSnSG|Esfh OzQ jgIoHAG'RyQ\@$FT:ie2s7uoYĉU]՛7o4ѪLоk@ П5D3_QLu")K-(Έhz3GbJG`uQ=<2U>9RG$-!ir %vvvJEKֻfs]H~O wD%*ݳwرc3 ()ϙCҮM^tK;QGdskt}Jrl*@~?yYJTtΖ<%1pЂK.nG[^^JWu:>>KI iT9)րeS4TVv1I[PoS\2jA-?]HJ 8}T;l>FAn%$*y¼lI!e7+EHaHdp;֗Ek6:wBWWW[[\.#oGpIڎtt(ϺuaP%C 8:f/Hdny¨il\i#*:IQddUÜry=*9A춷 WHBb]]]O` yh>RUqϸ9%t-2Kdfh>[2CGfrt IMAus+JR)qZ$Ŋvu)k!b${NNNm3٭+niȚ`֟՚٢Cp^5BN(xҼ||ErjOBW^k8*p/bdA=gSjtK:ӯOȲC۞rL@]G͢z jx=r`XQذUu`0%>̼@lKJ<$R#h&@ûhW,ͰH Q}ed1՚2)2|kUs)hLJ2_89 twwK* uٴkRiԾV_tsst\=$&$711Ì'< (Q 4<Λ E)d|˼ 痄 GAAͰ\{7J5(KuZ}l_AF{ȴy9aCU<}dJ^P8RDݑ#GKӘrpa\$,g ]PGn#F7?( >Gw(J"d |B $SJΌQǭOCzQYGq9 Mܼy422@2(YRggX%Yg姣%ݖ7R8󶲲r/q9OSSS'0m6 X*ku#ubU&-"vsc9ޟޏ&k}ӛZ}fF3ofzr$ה;CC%6Kc\8;cxc!]5T ~73M.Zjs}WhI->_[ݒfQ]aiٞ 89 gNSZ\L{dGd >bzzzossaf07!mZJpX#9 'fG6ZXXj꿬d||Xp2) 1uf[wQBu9{\Y>)S<[Y+0q*}+0iܗL38f333+}}}skkkDisāaJ`rQBR=";;p)܁U:r GfS@x;md]^reRF Eq4ߓL-dq$\рeHAÛS{xˁ15q{R'n*b7p.LP:DY!9j6, ~cwr>`fv820_`'#TڼUa _7;;FRIFIHXX_QD_;ga*CHE͔jG^\\<Of8@1aNGh@  qP(/Jr79#4 *[C2UA!W»KƁL&hZ5'G`ddDif8r@dq#Z*UQG p2 dF$:}784o| @q@ E>NG(43Ba1qRh*z3B}000볳h :duLޥM2 yUWc#s.;lzYI5NKKKB#`' ⣸YHz k '#B'yAf29m(y&YrȻfFyDbOPIR_(g󳰰p𾫫kghhc9 nލyg0xUlnПL&;2QΣ/J֍eA xS@#U9-[^Wa 4j" xE)kj:NBAr* tַD"p,4hٷ ߯t'leoύ]|tt8h3}N#T@c:֔Kh>vB {ӺCy8p/|S@! L;cU܈+#mq uQHpsS\lB(dIJQ40wg,3/ߠ\,3+ tx(@@,P( Zov^aBQŦ\D"!cccyOTWɪ(iic"M%_뤾G{c lD")̊h%'kf#b׾{"?.=}ac; ˒X F٫mBPu}DB{9o[֝>>;;[cccs]]]Ԩ 3%nvѫ*!mX@Jӟ0@Bju:eBN:_ᔴL&@ZV[g[#DQA:LV5r9ewLXA* igʽ~ ϣ))!ĥP(V>gG>'V&Э}:`A˔y`@t/P $$ d*E[>/4Jɓ'׮]}sGB0x:#bB@:1}N_`=ntlkk+|=LmG?HlsL@qL!nOԾEeR G00!L9U .m HG_iUs3jx%,:3>`!!P(??᳢SqqFpMTJeUZpG92z߯_tuvv }dQawwWPZ(p :g !ōGh zi3*:x 4HX$,a?a6, &G@[k~BqjSs*Za%Qr`A~Gv9!Q $ 7?{Lzzz-& B-UΈ}UFaK SïS^V".V%ohtt4I񮮮FQN!͕3E U0)(A;ž''d!Ix*q`¾h!H ^18m dN\OH) |>ۏEKd=dFvvvdqqQ&&&Ϝo}>[e_H5O^O[rhGDX.$b Hz]6pJdHbx?^$_[|/+H>mNAYHq5-AoK_:Vtӑ|65=@{ :!P(?=q3cIgggz@2_y_ "%^QqPw:N#sCeP'7d]= yۡH$ZMVV_yduH#Fi $Pp@xSjšBJ,1'$ܔUcrJ]oS,9dC:BG8pآt)#]a2څ<"$ J{rm%P\ Z=sohh;1bّT*Bsߪ,oi3lem`,Dʔ3^ukVxA1[eX:Jy%>Ҫ j%?ӻϞ=7n`c8HpGDBB̘ Q gR8Df%T9~q ()T) (nP<:Gi 8%q6pMIl KbHg3X>󛛛!LR8V : )ߠʇoЦ(ҦIg|J.0ô_8\:UgOysð4uxP2ps쏍}?G_$8_2b ~.!T1Τ+*8{NҎ&P@q轧!|nBҁz>⹤gKP(S\mgOeguDȎ_?tk4BB;d![WWW0lPx guv4U==rA d%AF;x*?ʆx@ NkߝN433:l︮a'<`-!dG,,PGc24Qf] #u3|jHܠ> <B.s"84FvRMyDg?7A?Lo'R;Zط6%HHH^U#nY:ğ7HrA c'&Hex< ,zzzםHۂL$l9в[Dp*Kz6ńT(e]E6T'lt Mr:DdS|G)A{c B~g(]]]-Kcd`` ]wV#3zEߣ-F!{haaԃ#RD!8+W|g&)ÉSVzF:` ~SAH!\oUA#P iT8D_fkaB* KBidTly6 zIOf)E(ҌFEg|PHb`E?2}n) a2 IN#daԥ$DDT# &1($M(q9}r;;;@S!GDҾTIpwJ!PaM$*$"- 9i*qt]I.́ˈcSq?gͰGiѨ/e4R`IXr27Tt@;-?( nӯ6uêhRuҔ=/E# $ FB/]?XV`y =DB 8)Hy= _hÏHQ{剸 x5xH(WsK—AΖftz\4ߩ$4tH'FYlxRdTouumkBYr[Qe"蟛V,27XrGׇctCs1P+8 pLg?rzeeSHqt'dn'YjOcQq3atFQdž^,CHJOJaS xGzdJtz r:hkJ!}L壩]!)̠;JFu(>@R{m DF񴸁W !(k FuUc6bX@,LB0(tdҸ I|6U aEE~('g}}} ΝуǾ2 D?ߐ .u #=HlSѱ2xNF_Fw=lꮄ9&tT+Q|~aY PSL勂5gKc_uTQ˜BH@_r_V= ! _j*t:õZr]\. Y_xҟ$2t a6dN7qv 8g b:I8`gө|Ճl6۔߱ O8㟉uV"d%XB $84`eAQQt"C>!Sz | adhe=w1Ӽ.od#Ca%=L!NwƟwƗݭ;67722̬'Ac,pu4䄣>o ^?Q=ȼ Rlp ,~)6J挫R}:Q*z}}k{zzdhh‡5m)8㓗wj$D1n  30!Ѳ#Dz&tGd.RvAt[!Vz}|\/c$!:/zORݛNa"e !AJ_opI@$d!\.K"v.J -|z?k׮]:Q󙫝T*}y {3 p!ӨO;LFH'l*L& oH36Dboo?]__ 8Ny|Ak`C9g3Ho )IgI BBxg ʢPp !,W riKm=\'n@DIA0 mq %wGUnp$m0~IR(ewM "46D_i /yU8 8BRjEg-D܈׹wϥ#`0s/Rs*KP"^QN2;WjSsT*;^eH$&OgBa"|_266V$"ԝhqTyjèϱ.@Q't vtT*}??N#3I8NӧCߛ瘫g"@4!uGJ[ ҁ _5=a 3s*p =n pMKΨQ=S=]3 :*#MqmL(TuIB ->;.dVDjH [Tr~r~o;I>Q6 3m0ѭ< k:L!2gs`0*\|` xp͛9Q 5V2I%]݋5^| C7UA Ӌ3yHz]PS8N^Q!ۍK9Lp6GF*8mL;cFZh%&3V}o"Xq^HDܬJOOEjZwdJ)?'0Y:eip&+Oq@jcD#(aX^^C`||<ԩ-f %`[W8vTB p THz35Ω8n-7vLi!uĩ{G HgT/6+>Y .[I |e"Zv()###m덴.KKKu'!#9d27tK ):/ |\oTeL=ȥx' fTuU PBF"5$BZ "MiIc)&D%d"!e*pQūqd«f1,w0diHwr2ycI]]ͭG[[[zG2uww+W peՅM_t 5({A.c*P_?DRS1^pXN:DvҬEFL"$ػd#aA؄SD C0#ږ5ó5baF~ڦ&Qɓ'=TD'͖3LGWWd0#6YH?"#^0(Ih, 󛜂ς>Qz3 h|%9þ ^6%0 Fzh+_uF!oQx:\eanSEaI༺6L@COB 8J~z꣨o $ھ߁@H8,)04MHՅCe0~B/"yUw5z#N`A\AFzfI=٠ eU 1zˎU>:|Nh 8PecVoB!! ϧTT2ֈ[IC+!UH) C]]]ߚNe D5ؓA~[\,8Ij!JUUa^:,UK;j@IQNKI0?="wrZ $ .ؘ7CUپ8Ɓd]zװY>:Oг .}~yUc[|TKsA՟I A~ 3~"׮] bTz1 t˪`t8O0ofuysZՊW 윴h G2kbw4)1bp3/+y` av 9cIXRBځ,]0SaDb46S(eV=p{{YHa`4E/mUaDO8\ڣCȹ1 @)AA?cq#)qPD恄8aҁ `B>g>=Jų_J%YYY#@"ᾸSF  z -T6'$*9'%!К?p6M!g8p'nnNGDA^{1/6Ͻc\aG9n>[`#+xd?T9 Ka&F8 FDMus=Q\)|*+W|ӧO٬twSWP8 ԛ@#"@vUivY+|oE"^qn.P6`9-Rvp޽L ,n|H8F 93NE8n SZ "EQ6񱾲!4NR<o٭2!'!T~&ZP(|>(?\__pB"7nHGGe;qd0%=v\raQyH\'&#P_, ~oJYP_ѳf0bP ;# #8XZLf4 Biʯit`~aVB 7!TXV]vֲDGHm,;/2#?TJ_.Lfe{.WSRU)Zz {׉DP0,}s'PPUCԀÀYپsGtkR=78Lk8c;'²݄r}{ z({d@ÈTs=lk:$=uGߟo3ҁ@| ...Y:IHXϕd0"+ *b5af\p"MERGY;|k1)NE}Abwd!,WR.cu ,Ipp +}Wb!0 ]'Zu1i/jUĺײx/k6q^_jmp"]vͶrv3_"kF c6ľ B.HU_I0gK@`) j HxA1|UmOIQxq[hl9U=-XwKV~Y8B),R5ul9]x@0=m7iT{GdoR:C#$_s^~}uu~dR\"]]]6?_ "L)I7]" 3NG `,n s*u|@>v8Z<0~\W Yd1d| |P?D Ea!ʠz/kYI+!u" M}_ү%*Mt FH ϣIꭅD"!۠s|Xd&Wy'cЎ[H?bpD +@l0 9MM9_2W$kRkB#_& ![?qƹ) r|-gʴ eN!r .}̟ͪ:9׳hCm;>Gn`:EH C'2;;+;;;~+uRGrNzⶦʳDqA+煎fPl8'^{x}BjI}7}N䞎+ÐnT* >Yڤ)(g k@/-B.{Qϙ娘E@( EO; 跅JRvBϭ7 ^y5@$$p|]1cbz6c"kg{ZP]a2!$wKFe/ad*Z!5^ h]_Υ8e@jv cw8www'dkkKj= N08`Xg4^'і@ g1z,IRM 9(wsS0(!2nGvuNE8RY >KwǝρDŽNޑq p3u@v3a!$$_ѯ8=qew믾z髾/1HM@2yV>I‘T,I;~?_oҦJ.58FKWI붦 L;CNHԕ8:*(k6 DBSUNDžt^N(4/-{9ݫcQ#h%f !2nuXX]y/2'&ЯOׯ>8`36g{t V9y^yYX# %뎤t:РO;тCl$8}`!$~gp(^YG/[pn"yB?!`pBq@ƁHYNE=SGh(} #0F3 h N@%=J}N?v(U8. ke7% `2T=fہ xb[ߛ}G:C;H~<,3\.Nuvv583>Tŭ$Bր^Ia?ryLHơ˥?cd"0FJ#^@@rQlnG'9gǻMTb{r{x;ge̎ea^CZ`:BHXI^rtt m`K|Y>F&˨LnQ<.D#/n (Wɉ Sq րFO#2> #y@`"eƊ^8$>)t"zׅ̍=^oHʮ7ʰQ!rfF9̜8:o l)[&T1x:TfFyԩ^TEzdqN@@"6{0i@RV/X6'4eHZDpXh%OFxYixI8F,K8v?Qű[3RY egcY->%0'4yahbSBH4-k\@pmg[?rר?f\1k!bER'ا-Kp%9`ԹQn(hΖ|uBH+pSKeN،-lEѦ|ea9$BA%zp->R(I  <^Q5c ;jeD$i7ptX}G\ug^Ie{ nyT`` d8ur%QM K_2rh\:̺D7w)2#%{cA H0{SO;جGPE9S͖kZH\xlOUQ`\Ҁ$"PsZ"$ Τ5Ӊp4"='9߂3^}8s֛N=ǢQ?CޒLVz7eK:yS !Aqk3:1G% J<5=zC 45Iũ"6AJN ]o3yaf)QRgYgrֺܹAپfr}6u٨+eQŒ4!`I:J9 |B ~_4mc{H;c b푞 A* .ouNmLpH=O%z?,o AjZ@ N!I2?8L h'V{7UƮeUVedC HoPd*X ٨ U.r3_5p:4B BdƱOsH}=Ihlէ !  l9WӶrXQ2+,Y@"J ;U /īƊQ 쀡yE/A普)qcBcg3Թ cCw+os); Wu="i+ YⲮN2? ȼܽBΒ0FY{UצÈJE4½3iR!WFVa\SXp@ԱkQ_$X$[Bl5MHt qY)ew~0z7X319zI}9}^n0n! @9wk8MPRC 7U2YE>@ m2C`טCi"X(Bd E=3 -"  eY϶\LxNZ1;"rV%Ŀ!*/x{pJm(F,^"mi$!J08}_Ȩ(i" zXWUR8,Y?\+K0wu)vG![|^j?b_S.ON +^7h3gODlzBTPy[uZ_.È'/~g ~Ƭ]r jk:D#D9L2ד#ǨBFQ_K0%j t3 ?%n'b#5Y&nH,PGJG@ ,bUTz!wqeUV&GXq*Rt'wus(9rD'}AUbax/]伂xQ0 RQ onЧNI9E.gMI;(0n[ ['ړց m 1G#,R=\y2ע,YG2{+Ɏ;{ۨgٗc6\X%D,0FWh=L"G H#( Iqe8=kт߫w덴&vf xMo|p [6WX#aa`m΄P^C:d0D:LߥIHd3GжI&AhC]9U-!>E  Eu!ΤI4NFwS џRS.CzנO0|類94F B~mK냄6~Qi:Lxw//!n-LB)K3Z{5y/L^R4x/B!vb&R p*=RA 2KXru}HFs†10\_uMaf(\a_es4i:@YcaSese%EL>:[UYgOF"9F#!Qz~Ezu~F< *`Ge8Zןl}N   \J1'я7 d `Yor& ZS{J.K(0.ZuM{#Vasx́U]) zXc>Xgҵ/= T6xX&N}*tW.# "#vPS|W386UVy?@!$pY#UC ϡ$WJ* alNz c5U.y\(c<{~W,^x0x?;ǟ5Yʽ08L:ⲣk7 Y O( eN!$&T>vJb U}Q]yUT/}IL9:72 p)}ev9P BRAcg`ID_a<N.q0L1D70bພ[g}-N={͐k$5}qWea.~9DφУ,ү]DlXWfG^%aRňBނ$&īKfI`"vM?SF;]_B Lϋtf#](Ts>{gd0{M! >MCJƜ#[;]vsMp`$\% !I ta0"5E*OYcﰥ 8t B. "$0.xt3AA(/{U0f/peҷCDCA\c,ѯ[f?/Βz\^FČm-}$+İ.w$`my~GQ螰d!a'2:(׈NvDW Ρ-}_t*FK*H"]Du H0%][黩LY$N )w8cb! gSe#]rAi!X<`>MqvdyȄ}WBBGJFSξ_ޟV v-S{SקO ,t BMU<#TY/MI0I`/{Ey*Bg "Q0lF( zxx\9g2gm4'|]7y!'Ҧ9? s /=CQp ]}N!2*'TV%T.Su+>m$6ЁD ^%*2IL-dD*]SEq_; mpFԮ lN2'il)U=_^[FZ~N[Ke:*ʶѡӮ{540yČ`36A!ࠞ<Iܩ챣 i(2=-t BZN}Kd P%gҥCt gxL iCܒvcBe5z3ڸE? Q3[b_=Cڱ3zwˊ.pG oO,tLY:},]^a9U`OmA3Svbt B .ǾyE&#Y4F&= B"K%gAI|8YrC}2%[6)e; wY}Ο1m5Sƚzz_ EOZT~ 4BZ'ߙt&[彬|&bdÔCY:!abQ03^P"+: K*քM,Cq8Kq1`0ޠ rQ'!)JC:5^Sߟ @?0Fdj^m=cZ hW >l aO!':rZ1П3ӈȱ*G 㵨\SF ńPϘeҊUFfЯ);@H:B#"q'Ҟ1 S7kraAg~>-mԻUnUUZ+˝u(l@NHH]ѧXVN ╢UoէWTOU`Q]> DN=+d'mLG2D6҈9E:=h(fboi7Z?3S6RFZ@m -``6>+B.}f,##@ɉu gTO76y0˕*tUPLTxΩ@'^;:Ii 7L$?Ǥ3r)Jǒ>S8&\t1B c]{xPvSEHk}BCċ45͑s*uB@Y!O*x.:yF,RzSu*i^=vI;q>P _gx[dVapH}}!ѳNw`w+Ί%LjBVr)#5`Lk# !؄1>֯aCS9]aIF`\RP -. +z>UT-]8FWN~PFq̉,NAxW!\p ޛ !6IX A]}$nT-q J|ow!U !<_*gR ij/9FØ ЯcG񚁚%N.nV". '(,zFɑ:>ցmeSL ;ڒ{?Hqؙv& pGI~GB.qT6s[ RG$1kEYS12x@!As>_(=SrD/ш: l謪 7"zA%svM-UU@׶)ʬ=-y|;a\l⿇9E>aq qH`\@vؙvO\`pPrZQf-ai"_èC #+c*?"71U90b#!A!4O R*di}){8iMUނfS%cc #:è4 lXFҧ#N0& YH*na'%RFۍYlGƋB\= iF{Tջ/g6F$nkM]y:4"KBHQM?ac@(*YNQ9Uq@&^ausY`ICBp'^i'WC;Rv}SS{ؒϝ ߤ-]Ԅs亮Ml>p!S,$.vF_{.UCLGbqYr]:*#ЁD!>%ќ*&p(!I)}B@§b]:u4[[E mL`D8>&uߒƀhB_}F•I9>XbܛmK)!0f= GFHtC6LUyC<m[$.)I^ג[+FKB'TF*OPő2q*#JUDċhW|vuBE1z=d#lFy>؂g&]8`o0S:c_DjČxe:Ug1(UUաL9k>j[0":!s(İ~m0C*=&B2N^/bnSP ==zY,I86q(,eGPZf^W[Yrq`u^ʥJd=]NZt'gFp|{zddP8LŁ]OM] WOB9#{12KK88x/a|aU~Xߓ+ d n=HuqKg[;Q`FX.\QN[bVBƔ7u#0"uՑU: !qPD!֒/*/wKOMh9(EW})q.I̕NDž(vFߖ\H|gh6x`X9 2zFf]+6$>]da=R$(*쉱ʳ B<DPW `Sf5$jR UVuw@9d=HοF683-A3G5v^1;ᱜؐ56t.pf5#-ɲE)ݧȴad#Y*nyQW}©"ؤ`B!' e*YVJlM{(p(g 1$Q, Xg>dS9tu}o|Ԍ( րɆDz6-llL|B(V< P(pзSupg:Tu~îS{nLU&+|W49e[Mw-ΟO߅AѠII )8azptaU2A\6 ΄%•D.2uSse'z}+50 ɔԠ1w3KJ k+ d5BͽN !i `%zE·>΍#A3?nn wcƷ&|n>pڝXp+ilzkJօ&A Y0„QXvnÝ'uMתp%{@o`tCA1%4^rSxӦ6%D %{np{ziaЀ&uڽ% 147fwOkƝ8Fq$nzԹjtWOj#F~Ow=*.( w Vn%Ӏ5wb™Ll9w37 _H7`p&X{g$MPbq/_;&(kŽ+É>S J:8vN[rmQ6vǭ)WLg{zTbb%4qEmHA v7\Gs7܍f7jֱV$iAp0CǎWMPfw|ҌoyX4f7Vz *뎣 Bܹl\4+V+`ʺVzZo_S&Hx8B}*%TFs})L %M});ow}ކ;~ L׸? kTҞI8}W7 2AA)T" &qB7sl>ޖyܣ=j4v ~5JM1~L $t:0ƯG^S&H8|ҏn%~GzJ5<2wĈ} 9.L{jŽEZitQ7$`o:p܅nzH }3Zpﭬ閅VQXj.dayu}ꈐ@DF9,s7`s4 ᦸ f'7Q&d"= V# 2 {k:|\$NƑ>KvOuIs|?8| 2RHCR=5K_Cg{kVp $P2I,y%+GE?DZ/J94Mnjjbz}Os%F>k UGJΏitEO%FϫDiDɣi  >*9JUMFϹ7 $0]\7)2PpF)UhֶJa\0WBI$mm@ƪl\lrt*JR|]jĽܫm' ܻG+naxe@ %]I^왇a<)EpVƹb Ha$҄-pn`5qQkc}qڰro4+ pzm^bX1lX|W8>百PHI3&}4#\UѼ҈+M'њs&CMN7(._7ݒw&043u(ѨĀK4憶XvU:'*.`9E4;\ڨ,!=<2w8^Ƹ]qNٝΛ~J MDO KqMưS=_s.=ׄ{$aCHQpERݜ [ Knz5kRɤH A5Ah&xj$kM<4q`s O*Ud%Cɺa@vgLPB6L)y0 ҄$+]wk>4,A$D7l鹱OХUI Q02@(gX:.T.\ЯJnܐJ<X Sٗz'MwU5/ܣs̼ M ȸAf]_'ܛZQXlX]c򠍇l&`}MR~m6@a7aHk]=_k{Rj;iZ%)Y~{y?,I5E$ Q7 E:'[?x6lwubA7+W")Nnn_h4^f?oԢ$K#;wӨ;lW 39tÁ\, A hv!:FxTzC>x״(HT]-c~mc3kNHZ~93+d/Ka:mYj3o=k mk6V߸2}6fp%;B/c'''BJ<%O8Klxl]m|QB`iVj5 Ъdw}e6P#}ڿHI&R1D&\_e!a Hl nhhjÝH7+4Pft:)VT^_._kJN*H*EW㍝|vVӵZmF%}~J>2Gxٟw^[ {1G@U?L&R()6DRVu{| H!SC+&8[lʿhez_ 4Ҕe[5NdBMLL||&zJ~Ad2YQI$ڳ״J&TJ=25OeُNMM1]K7M&q)>GH[w]f ˤΞ2E|s +pK ;RBFs 4!\]&f +1MFRi܊OMw/Nޜ}+a 0s=*GL0Sz鳱X$V/~:_lV:3mH$*Lf~Nl߳mo4EϞQK}K^4;guͿI*ef6}7 vfmo04 Oid~{ >-z/ku! R7GgqҠ9z}RbH%’“1cI@Ey͝K4 `;Z$?}I~ A%nV,5E=jA ;Jي %cLDzԝV"eP՞N&Y^ОKdɞT*sssq75=.pL1X{L0p|+ж;c"fUn~kM0QN}`N=UӦQ%P5T(,]6$R3&8z? ۲W E%_A͎B篭T*uɺVVVN5M|m<;b߿wuu odekU/L*sZm.?I#هgggBia 4l-(:sp3ʖhHΚ`?v5z V~6%.aз/$HavȌٻXtZu}=jrsm 1HvmLj.%vWWXTIXX$ZDDlJiYEN5?L&7zjVݕIZmZsNMMYvJ$GK&2}IMPQ5@%.F}z?u2ͱc]_H5a;s#F:%UR ;/h5HmkD $;2Oϋ%%vE!tb) & \v^^^W$sssﶟNu:VVV^n, JԏfR{G[ƅ4s&H(R'QA&H~ {Ll5@%neH:cx Z]7vg %붫wFzL|̵Q閛S?M{yAIae"`@/N/y^lGHbF-РPYQզ׵Skzz񗯬<>d2Y~QT:TVS|>么a4@LV V$ gN5AIF :?fc=!WcHtN) =~ʌ }T5AS!Eꢦ럅 #ТCGzȐ@ˆLzM"hRu[ִ#L" r&YjSFc\.JX,6l3BpYIRt666Fh%h Q)ܨ]د6~~=LD"qgJi&Xevv7Wl]ӝVt]Pr(ܿ(g= {ϯ~X=^uF N ٷ>R% V܍i858آ&f!fff<=d֔[]]=H$oll|sR~[}TRTm&XT1͘TF``,J3w :ܿQ"9EFpq[:On9peuGH!^v;T\<\4"q$s#;=QQ,veN!50riQS~}_Ѿgjm*Ad?dcFI ^h4_YY9ạ.ᴝ_kEJoBi ~:%ߒԪQx}LiO$_|vvv!3\ fӱ  ƽ.l½UV,>ڒY`~xgsq8Bɣ{䜄 TRh]gdQ= @cjjuZJeazz,,,x<~YOqXP.h(L&j9Z(OUՙJ`د7vp\u=@OVre%FN m_ӕfl^s*7Ǭ;:|WQ(xic&ATe4_0 hK+!3E:lHV.LyQp祌;~li%*<-H)J%~T*%xGM "J.;byJIm Rv{Ap]8@NE"QZɋZf]]]}աCl,N ,@f*Y1͠/2m 8d5N960J3&)υ+cZ;o:Z]]p׌;'e8o#|sp2Vʣ{d"3??KKK?Q(̡Cϸ+=XsY}w#ݻ:I{hHB1A-ʜNWpuuJٕJۏ/ߧh\cGI$%+4P7`Man0Rz.` ;,G nC>wq8τpEss}`TL\n0*ez`H cԩS?rܹd2Ü}MFL}ڟsu!BQ&5/Ǿǐ0`H cX,XZZ/NgؓG1^Q Go*OtgnWo 3o߇u:TULwKdS|}qҝ#2siQmОUӝ>FŀsV,O]x;zzK&(lp7?b?L&=& 8m43oZ=.*6XlV"KR%3ֵ IFƤYLMM}Ґ6G8[_;L`C ]:iaI!iZt=&W=SZX%uDqw<`{̥]Q&Z{ަ{6כ*@o67x91SSS/t:ch.DVZ)1H&DFjcX:]󷝭UY?Ia?T\w^z=orrKCz]aWQ5ه@D*˦dLpenݟWlw=?NwsFJ5A"|οC5##$\tuӟ@n8UM,05^Ndz|q/J  X18rJTcD"QV+MMMk6K{mZӵZ͝N#!o fZTwK&lJiPӁ[6umUڻ2_G1*nzsEMFH{ΰr;M6}kA$f@ro5[jQlfcE,gF+PL&^*z>R(LVgggؘT*ׯ%>8"ǂf1 " jVF wlR VL"w?`7C%{H%4"+uΛ칦*dѴ&=΍uwM T\Lf?0a_}YK~}q|]</MLL\E7ݒe/;4P"-Lkt>D"Q___?V_W.+{Ո , &-/J齥A%RǓΘ`zfߩpk:ߨ\9-EVjuJ+YTvQ Jq];=}DF &1ZY__4\nV0@h> “O3$ 9\N}RF\^d,k{e25=&(kt]u}^q狀zXHz$Hl&Z.w\bYXX0BaпnV~{x 1~},M,\3Ӧ;:r %ad:ڷ=V1֞Hjc!B4YxihkJ()sp3G.xʝ3CtEϻs"u9J-,/q5Ud,0HH*J4'K9r5C6ˇA!{iIK t?n=ך{sJ/Z](WRs ",䮳jp#0FH sܿ)J^ZՀ厾0RI&Z:^jd26Wv)j2]̎V*i5IJ$1Ƒĕh> s&ܠE1/a(aԻ`]G{Kn=߭X,@HBI%v lAz_mԩS{ufWhH<* iN'0nRix 1YlEszUj6.`Eh0l}D0?o; b<-ݯotW>Lߔ 'Z&_5M7QD $`-..=qOrڵ͕D{vԝxݤ+4 RRyX,VѠE"gzkEJ؋ cϙ{dVI ZtJ ɔ\5-wFHSH}>\fN)19{IU ˻:C6L }0Ξ=k|k~ŋȑ#;J"f@TzL&%Zc(I$ Is@R $%13Z^?;/ם yEqAFndGK}8WeڡkȔ;>Q~BТD閧 F;BzO?;w.vAlڏVixs534RXp?5@})TN+RƂ3-nˤ 5i`$i\%+g+Z]A$R}X$چH6]v?w^r%J IzŌjmL&c?_RvK#J:!=NkIR_Kʘ'm%Dm 9U\04xO vݽ+Q5@/U4g+R41"p~6z6uC9}8[X@u9ARQV,3A6^f {aK?v;MSpꐞkRa&>f,[0TNɣ7u^2E:Gk4 ?#a~Ě関.Z0Hfy `hIngh h^1\v' JR:scN'J.RC:華S&Whҝo\F$ߚmnH%5aX]KL0TNgLWYTMX/&@@ 3v;OS644 5@ZORt:h4Uo5sߓJiuQƝs0_t!=*GWwkF_.4J{ky?U6tX-jmK6Qް$J>v>l+L7Po}i6zIq^)FH72ۇZ6f*ئ QidҶ#6ɉӴƌΛ*U7mQh#%λ뻒Ea:];$qtik~|ъM: %m9Eݎ7j^l6_V*r+W|x?_eE~2H{oer棒GwbSVMRlll>oLR2/3-Hh!$H a`f&lHX1uk sgHaLuwkKm{IbHj5O&1ɣQb&꛾k&''}G;{+UEBLMMm.ۡ+666b+++ž3tU^r;$Ј@5{3h4"إM591iTɤgMŬT*!1 0ʆ &RHɢpcD _J ۇT[l|97gI+%tE\"JQ.׮]d2f[0`$c؛oT*s\nfApnЕHʹ~>NZ=/tMV k z}dŷ{I%>YOR&H [$ll&&| }B ;nr+|ӶU(JGi ~w+#N7-H;c̓5XTƇ40ҵN%λk0RIuNdc%|yux_U: ^a  gt:寷q:,' ->RH>Xi,k&$4ivYq= D yF`¸E6n2OH p ڃX,Q[T*>ϕ,Κ`6d$!}>moqpMPZv=%òV}dEMwRzx=nW.UxsQ:QmO4bX,oV?33Zfi{q_`6NHii.WmIkT6 pO% =^b@]!UHp )˛ r{p@xO 0mXt1𙶑wVFewliU[~ m2wU2I3D^n^4B #MP(Lcq?E9K&ot:Gl}ߏ#7&hefsxƛmf`w1<[,ިK Zkbb"-sf3gSHTI}cDeB\1A+,kwPb芻p5lPb]6RR0fv{3Y]]5W^L"ieR*5~C [xX,D"FmoԮ2;SV&aZɥ=_(%ߣ}L\h#k*pnZݣ)JU\cX;߱l6k69Ϊ"۷6FgzzzI٘!G -Z\\\*877wޠ}FH;h4T̐5/n!%J&IeSTvh=ϚT_#ƊCZ}4@ "MX67ly?`[rt;ēB*뛫ji !^ii{$؆E X,~ޘqcc%[h4&kH~]MC_×cu_5AImL 4n)wES(ܷH`Q#^<[7GX9}1 zB3bW6?Gl|FhύHjfff>_ɣr߶}ϙ`tF)$kh˗jw>]]*#?d2f}&뫍#6q=Jm ]l~:^诨dtv R*VIR%TIS4MtUHF(Raf;λH $urvN+'''I)Lf%bg&h`XeUyJ(ivV*)Rm1t]U(\Y&h`%?j6㘙hA@@`8oF?VI$ Z__?t2VeE~[U{N3᯸h;F29@JiEV!e}G|뻛({g& Z\\p~QV*z.GҠۧm|T^I{}[D+TΣ ܬn9%/`,m ~-wz&>]hS&ygRyک"kz1A2lSTi'%)>hۈp_/cz;*w7g JḬ: s.ueEN'KCjqq|_Z[[wddoL;*j|_*JϩT*G'&&f{j&_xgh\h}XIׂ64$QUWM7J)a$F<0T?m {aCܹs}b/d2ըnrPZ=aϖ;Ϋ^a\NIA )Eq#fhI V(iV(iSc&X@t[rת{=Nlw_܃)!aA !l6}(*)y'*|Tz>:Ο/--}}?ڇ_7ү{3eƶڇE$T}"F^ &H )1T J EZu=X]o0nX,ujfffF+ƩUuQCH RNRW2Q.QzZMfGG hMD"I+6=~um3Ay3Ѹ`V4b2o#O3#.]wp&w<]F~cXn>Z]]5Z,,,KBX\\bةt:3DℽY}zrrRɔ=fUČq>WVbMN>=iNsM ۰hϵTL ՞n{\!N`$Muf{t}m˭V9z>??owzzN$ԛܗN:L>c2߫hL=`oV7Wy؛Gk[m? nX&Xt\Ҋ܍&0hEEV M] _fsRzds1f|fǏK6#vm?_U|P8gof>eoPsRd8h)VWZm&LD7K&HiS%42>sFLUug7t:T*g?ڵkoԜ+bt~fsָfyߪj@TU) +iGm,O8O I0j[)}cҞRё#GgFoxCcF_zF t~j"{SYNRKsqc +<=*SgclNL>/޿nhz psX B i)0ڔR9K6VLPp7ϬbޫDN(oƘdG ѥOZ2^L&K$ vDZݬo6j6gFuIȘg{>~hI^/LŅh0Y+ LBwhߵ ]Q{2SϬ}=Jiqmsݿ;f_76Nj6gclhN7f}TiXYY@biw0BziRʽ_IM%+E w}w'Vrl I&?kO9`0H 0>4;iEs=l*b3664[+J6.3.]ڠ 18n#Bfi&`ߵn*ٸh%+` lgk̸6Wu08$_Հ5NWؖ+.~iGLLRݚ{`p jA]:cat=4=Jy7h4LR\yN?9`@Bx4^XhRBvхjh*)QIիy ,Ӿ?Q=WgPɝɱ6~] 6'NASS)蠀׋N|EDXԠisl_jGzoڇ|5{\.%Z6FP]Zm6~=50~kEu^>DfjsMaac9|ח鸾 0Ҟc^8tէz~RI %T~:Hlm{_6(sOX9H !Jtp(5$KGDJ<ħ+ժt:&o[Wٱ28џ}s?6&#(ROI_1,C$Pվ0dF,S?fw8PH+4JT 6l4iub\ $%^o>RQmwacB8aB QW76.mJvm͵GP\0˜Q&D $ @?c"kaa/zbT`k6 F8tG̺ eA$0LUD_ tR_Jم Xls`&gmh D $ Uƚ;>Msnc"aXVG&QswL,[Y__7/^ўHʣv=͕ӞG0 Q6A־Ms9pgO<Uٳg7Fڎ_yp`DLhC6^jdW na&MaC HYղ6R4 (e|څ0k6N8ncF:ZQM plQ0"QVr'is=@5l| aBGm$h Ğ~o4ߨ:)ʿmkC: tli D $D] LP.Isڅ R}KСC+)j'l[CA6Q9$c1mwwWVV3X$vx_n鬍/hH#61ؖF|oƔ7/^f[s,"bǢgn̞6AI^P٣u&To9lh,--_*^6HJ& c/eXGާL/oHaZflq 0[*rU+xiǙ3gfbkZJ&MLL|>ߏIEoѠm4i!}}@vM3O`GMj{`ptCM>^1ÌwCnqqq~!}V\NM"Hr&nuumi;m|WF $`g8n$bFffjeV#%]3A)%0T@<{cyeݾƼ}~&QD"l65jP!lMa,R)&ػ@UM@}JK&K "k/HQ,yq` $hєxQ0\>>)Ljǒ JcH@@ iѴS&Xy`)%읤$R=6 X` @Mw"% &Xa`X;(iҚ Ha.ѽi&qjyMw/#}u77&6.IU#}L 5A9&H)QF)5knUeIhHaJqI J%i}rve5\UE fA$Vi{DwRbII%R<$0r&H0Zqf!+6`$Rj UJܔ H `hߢ %,RM`Hhk6LL J-#YM(J y=n:vG ܭhJaf"J"%h)Y!y`tƼc{$Q+Λ`Jm {DI!uPlgc}>iHM`L(aT3đJ]tѤy0h$9cđ:UFU5A;qkҊؘ6A:7J#(Ѫ Ju짴aK@&XI*Jc@ܝV()R%G ['~1ݣVi#%H+L@ %`UJޅ+'>RH "88e 4` Jʤaz@n(Qt蔍C&XwwJ*]6Ap1F ۥCJi#%&H1APJLBIl,`?%V&!Hk #EI)$Q<%2II%%ues*%` $BtW٘uϕ,6#I+&7I $%MJAHV͘5:h@nHݣJ)TqA;a( 0bQ62&HrAY:v(teO> 0,RHɣI ~"M؁A[vj) +"xj F6Mw#<"i跶pݝ7ABI 0@Đ@~ B %QqqXA u\ n(s$FCIrtZausFLXRndUJ$}A `)aw?{o$K̝3l9 BH !##/!a+$!1Aa!! "D< !^'fz;sյ9:oVUfUVUfMfU[;,:eY_k#6 "A82B+*ŐxB!dHP@"BI&gHt)%YV! Ѯ<Xh B HB! _i yUGWB!YS !$,0?c+D$xo\qO=O!!2!P@"B3a4a.+A(ؤ)okxPs:斴p%L\$#< (IMD!BB!$& ,q(%rBt;Nױc.!ܛrf,8LI]mCw KFhj %B! HB!1E(Bx:F&ь^ ! xt'GRz!YRDr&'(gD%B0/1>OY- HB!ƓȄ&hdiV!P\|F^5qC*ģqh%R" x)t}"?Wo HBZH\W鲸G^Fy}qQ?zEB1eq RX2lھq @P:1 {YP &M Cnms뒶xyLXo#L.wF1@B!F3cҩ zUӉ)ҝ6뇐7ue0jZ0  1BR<)8gx{!2۷L^qvvl6|׿s||\ dmBE^0:Ft5CeLGM і`Pm*HSۄ"x`@ǢnM(W̝ &k68${ڷXImB5铓kju1rP ́DpD!XN|/^FYpEX qO%À{,H<[z ~}\K$BǦNyWܜ.Ic̃+;%;I9 2>baWujvvv^s/^ H {!JB!q+=- F.( `(Bh]GHaWbHG?9Bz)[ 9wgޙ$Y;(1^JF\jI$? !$AB -'B(CPU_QQk[ mS\5̽uF ! ay۾{xqDPv8/N|Lȸ8rEI&GҞcr#`v:)Rkyy_[վy|< .& !.Մ#1 a>-D? 0.A8q GY-ּiiw6t .g𲸆~0o?_;4kIgo[4Tz(2.p@kabqZ~GDȐB!=  P0H!²({+ -qA#Ð{MSl[=A'/ CX<G!"T<a9ߛ62nY\O8|g&nꙤ|r}||yNm>"B B/"W654Q00; *]'3<yqg9i8e]\1I½ C[^)NgJ7un/븋!&\^J$ MX ɗiB^-V!MNZ֌S> "B!u``!n܍1laNӾkp25}?ymw8zA(~^"UV!9ck/0aS hJs+OA$sdzH&.1yOEBH0דuu.w.7[|4  HBH6=`4MˆP4] |gppɬvU;x#%cNyI\1MIO^@ް~] %o Ib8־1ngODHtNsq˵Zm\.MOOF޴Zv=GCD!dC0!T؂i0liNbD-hk α\GlC / fx辭㤏3f߱z04m@eM0pFP2?h?Ѩn_=99_YYr>jٹ\CB0C&QE4ea|}%!$~ǮXpv$y1'<WLZĤ9r)-q!S8,e#aNE}m Y}=J].p{{#-,,mZNPxGBD!L&0z- z%E0-N!ũ|'qapDDF;m}>b*ȸu M2/ {:~fx!Lwɏ%-&bIx8$^JAơ=gOu]-V!o|򅭭YXXx=- dP@"B&V IwI7ɜ 6aEHM~TEG>ӏΖ߅WQ2|hP"B=Wt 5qCY5xa „JDU[Lx<䢑_/hBF;"/đ;0K` ~淋YN^& ˾ѱ^z p Q")wNyE;qј # _oۅJkkk'| f$BB,VWWR0u!n覷֙Y`0V`@5OqE;KzPI.f2޾H Аls,^Mf="hr,ڷgjڎuUu։ޑ,@  \qc't﹟q_h4{rNMV=!!ll U0߰ElC%cl^7xfo8k$|* ]-fz+r΍y$ ՛3JX_76Ladm_b֮4rwbY^^kkk_ HBHr-$Ehy}mT8 /#+`Ĩ+B`1* l qs ϣV! u;sM;x)Ad$%ϣM#ᑶ33dJV-5V.9fYt^SW*m,!# 2B!$Y$"cLal)8bD#q.9ypb'O{sDk[_Bg끇#鞿xsU a uOQ9ޙHۂ4m4IzŸ/Ph& NS^ \ 7|>w>|iObNjڅBakkkNB$B!Y,!]d^׍6_{p\Fekzox튗'ۓ(P/g$\,!%ȬbՒy傣 bA+[?*$A@r+0&u&b(RM Kw_\(u#5>P9:2;0Z<7aHxAD ᜂ^/IZUBWu-zKDŽ#$KBȘD!$_ᭃ_z Ғ{9a|>1\/ Zd @\C" "rfK×@p#B9cuAo;OHc !BPAN57;;;L= /}JS\(>/#D$|>/J弔e)Z-i6B'owvvkvvO/// >n]P7 n0fB@w "a  Ca< l_`Ր`PO$j;0}}.e}N(q/%xz((bڮU5-&2l!BZ_]]_2B#op>gskFMssѢvAH߄(uҥ/.//vںna@ko¾'`0zLu$| A u`tH R75 p LxW h=+:+#B@:.I/%{C!!dxD! Ϙ#{9<<۳kd"F+++25h;iccο^ln]ӚyFG/K4 $~Qq>kT`cKqGxBUX0kxn3y<I:8 "kH ALǤS3B2=!D"TV;xa޽{O Q)긌=q=`cBݚqD`oYWD5^JӬ6`L5v{YCU-m[N:54,B@( B&/!PaRCnc7/rT:0BR4Cb&NSƒP7~SOIicqC'nSE-`0!?0._W`o<I拖8y`_kD dp Vږ'69v !d" BȰ|CBadyy\@[nI>?};8lcX.tjy6JlЈmX!ty(M! XW'$+!BB09jZ㖈uc)?f14F^xF[WgM#2h3%q0t]Zǚn0Hv%KW)>#OO"UDiIⅶ7#%98K1~imF״|JG J>!2,^H?_lNda|94>(pIsSﰺSI/ ư Hm#_ؿwʇޏqeqsuVD/Z`R*iBa$&r.%Hu^׶$!$1P@"2LX*57;eU68к^a FFϚP tlkωaAwYs!;k|_ :`LN iG&u=͉xG $x(q kLwH{蘶뮖c5!>B\`Bkkk+++GGGWEV ~!'YWzר5^4pᡞj6]w՞Z0r5'g2ZGX\O׵0Fcb0J:~@4x!Cecc9X Ky69f}s-@RB77" K}"WR1B!\PB*J_;"+Dg\p`IdwaXnjeuD^l0Į]!9]aB4V/=.g XZדyq ܤ`h"GиYHw.nQp!)}K:~XG@=B$B!CeffgQ@r Y`gN0jjȘ&:207U # taq ^H "wW.IH ک!^Cw99 > Cݒvk>|Y0wUmFPj49.BP@"+vlkݜkkk^ٔBtqXՂM ˆUH^BD!;U4`HU{0BB 2tdWa͉gY`&nݛZ/ Ըw״LDB@hd敊nNqǷOɥK=`W/9 X-60FL\!N"(A)) UC.O%7cC?q,I|oj2/[5-:u/%K+n/!imH"%B$B!:Pl>!\0r'腔]C %MB!gӽA?{U\/I+cxvwa3cA}0LE#^V4,OQ^!$Y-z1"D Pu=_ I$cG{O:FBHAݦN!$yHq[7x$'g~?z5ZS~9#Մ-Ѧ7S6gw=@сa v`$xP/$u4$Z,Wu~">#o؆ :H0"t[ZDpE!i@#HI.6jUE!4@B 6%7pxbќEsZZ>OC 2=Yؔ`Sauck)ƸjhH!0f>'&i1 Ʃ,Bº0_Bܭk?tp66x\ kk7c`zmOH%BᾬcZFRDf+N39t+éB,\B鴸2yl[seA|>/.?Y 1R]ǾmO8ܲa&$i+KrQTBc&{~ѹsU]~!( B1h4s"NZrs;H7nj]?b°z8i/<r+$06w95+Ѓ5qOٿ1 k3k,qʗe'CalЛbg KE6q 4c2Br{O5s2],p č#sԹpJWt,D/'M6&ks92 ˇzGד0%*")kmԶ=TM!X-q k͂9uXg# `~^ \kwHuRl؝5 TcPd/ Uɶ~SO?3麉:ƽ% J&%x)$3L$K20 1:n7ҫj?8Џ;BH$h zO0&0{kga^|?˅woߧFF,{B-T*HZr<S6c k Xq᝾Scj)<)aFV/H67Ľwk1!vV/QKya89q aMC0ii1Fscp/h^;ƜcxD!hߗta aMC)(BzBLEP#uCu{{峄"&9߹plZ -뢮(IM"SSggg37t_vʵ4S~I `o/NTx"8@!$ @1̟#D{kqym(˂3ϛ5b>|d$s۬7!ێiۭ:P2vT5I]tOоΟ kC P@"]v:]NBx^z/0g/*-(Mav@,(~C255Zj*J:Zo-..bq??#'bpGXmmt~BMr(F Ƶ“}rK:02=ѵ>' !]u;G]s 3Q;I;-xJjzV@j@Jg% $P@"OѨ(Ϻ}06a^1F&BLn?ol6n+a(#cnn?qxxikk[~))_픯r?+NS~[[}7!kq0 M8LJX%}S6)8ɉu+|^M$iFprSm4ep`M﯊kTFB&}am1iZWxwg;ns}-^E"j?i[;ySqxЃLh۰ϋgz}GV# q]DIآF:{~&!>c?1jعnދA^v+)!tm2WqSj}H=?gff]%PUZ՝;w~*G(y_F ^>_` D7sύqCq1~J#zxi5 c?AW;zƕk28^?]-&YcM ҂SNxy M}*$$h$$9;`(wtK:}02Q?BQ?EB/!c9t`H2)®, 8 E/jU:˺3#Ñ ܎*'Eh{5w#d<3Lo(JX%?R7xa:}I$R{bviIN:*':88z D+gSY{~9)_Z^^dzяՁRKR@m>ƟaA~. uģ>C hB!P~Pbgd81c;C+6t+W ޷ sgP"HKMYK JH 劌>z ?y}؟=_R~ُpd%t #,.uh1ibЄ+qQr?999|>?M(I_q/Jxqʇ5\d%,HNRtAϰb#uM.J)%:)Ll?h@1GG)ewnd9bm>nj^Eo]!o4hG<I+9*uiD/۲NB8c7R[(* {+;$ ux&}ntQ:y]zt۩WGS0Bh*" Mwl19\Z0B" N'VV4ӭV+_*NF1YWgũ.tAnןfn =c;Y2g=@"׊k 70yzqvnLCD˸Z7 kG^$'B:2Ϣ`-Z2isűO:U@#`M㦘A8ȼ+Q7{aK')R:Vm5xK8 zV-] .2I,a \E;ـCH{r _$i) H5qlQ“郀!a7}+ e+!?/ #%;-~9^ <?&<^N!_q BK[B:oL%p]J&xն x"Uu}{ Q #MgexS%X<8'36 H%QͰVS^9#:1!{5x^Ju\Sv~I_u}`"$41 GBE;]{I HaCu}4H;sU:7hrI Y c0 {իPHJ񰥋b"6m&&د;{Gقad;'ģ. 10rlyDQbnחÚ!á㧱A=Ա 3nVKE&x=qZ[a1Pw':h+ ٍ !](a#Q/(龗IE<⻏CD)x^dU/Ⅶ˳yrUdIS]SEG2Q0nH)phjMXu3!w )99k摳1_j qS劸'GE-, ˗ i ɬc#>Û:ϗu\|d0v;; . ZKHD2z9$EzF. HQ:y I"ݽ H^a:Fxd^tZп;Cjv%;;zn]\.\@-C@ np0'U!ΞNiDɪeoΌdO@2Nn+lfjexK:xF5b; !I[ߵu3a$ ˜z_~:j#8AeJ&ISׅzOHfDWęnF(%L(A=zPdp^D #"uyM"8ɳBQP>dC4 A$Hń2id -Fk![l`E]<#6g0%epp&ROJPsE^x>: k'<00xڎ2Z{__¨~YSy-q<$DN<Gۿ$hTux6)GL43ģ^yGQEŐu yU< ®5pvQB/qg& Ť /%x9ur$4z vZL!\:'OZ&ˡǜ;9zqbO5[ݜ9[%%[j4zUâO^c:fֵ°1iIm oI#)"^v+(D- 9'd h+Q/Ѩp_QI<ԯQ,iАvD#LIo&{yCJAnv$tnPAш8`!F6>&t]V35ۄM2}ј}`"=ÆN{"nB^0!]RQ&m7!d JWNaDג-vDR $bݽ:yu U/آN'!Ⱦ,jNa†h@UDμv:%Xt%墈ԐNk0BI\ _am<E#DG:{}0Wn#> QWYԖdbAsg w%78E3/=v/!$7k]f{DBL>r1. UGzogߋ 0&o $ PYsXSЫB0x_@MIz„|꼅5u<2+¼Id2۵Iۀ}At=jDHX( eyuG~1.H$0"R^Gx qE4 #Jtz I}'!)HDjEwt[\򮓀)(Ҕt3XIK k?M;=݀E#0oFkrMq=v%;`%0 xvgp`%I$*Q榶Ƙ 0, 8 :^){ЁХ6s葾.긽% BAL&ykݷz` ^]]=/mummQWH⠀Y}0##=wu4t g&Qh(בH]0VLU P„{@ lx%M~ ݽl&ۉ ȳ`#8v X56ģ[B@_|$Ccªܕd2/,dNYv.r:ǜbH@yח31q pҎtв(O~IKIw3B;%\]Ҁ,Ah,]]]܈gkkkuV73FD#W(QI‹HʫQzu?B-/a')HTnw$-*R'%#wsשn˰v8F0s8rLL[`45xp꺁IMVrϋe`x YdIRS\dr! 5 :O1/z*!$u1c溮Gگ1A,׶^JdR%}dj?puuXϴ5֚>2J( e>9qM8*ܗN/ϣn^G<^HFaBi (bRg ,r(5Y!)(]gRWRk]e}S.z%56`Eog7ֳxz.;6 ;opPE⚛U\'/2Xؔݑl{az_‡guY0̫v>8ϳ+g w52ϟkKBҽoD9ɺ]x?؃Dr֧} DS-jO>V(^kZ/:{OF=g)IA(2pab:D8*IrudNazY:B=?$$}hdIP ʟ7{~A/*"C5oE d7"d?8#M7Xop. 28ou@(SF  9JZQՄjKz( gg]g5T`P*|^43 5 tOCOu`s32>Z:==mZZ֍|>_=*˥BUUƶ{}O}{{;U*[˜43px6pr݄N0!†[8 {/!퐿n!z}ضN풗`虜 ,HHcGxtoD#[0jʳBiE#}We :Ԑz:rt&[pNuӁu{ژ Cl=be8czWn$Kј~wjowř8WA^nvr??KSSS?kImGa8 AAQ/[Σ0yGW4S ;-ň3a#"uvauJ7"S8q{ZMш 8o0e-ξ\8}"= C5ɶ D5l#If؏]}~+AۼLX_{GjFШ0y#B&rN暵/ǜ.iYHzԳwkk믵ZR}UT*,r9_9ϜcF!$4&qvCz : ߨ`E@ 9_/a_miؙkN. #%# Pp{#8ٞJ"md[_OD@ȋYc':&Sآ/k oJ((1cVk,g=X59Luunmm}s QuKOggg(7Sw8V>s)R [Ⱥnl[^"R'ϣNGģnˆFq FI]`t\>NVLE;Ԗg0W[(d{QAǼg!#b|3oaH`XDNG\* n O pښ[2t;w=<3%ҩ$[a;NY`W?kj8LXEH$&VB^؄k?llSNㇽG羅 oj/,--(ic?^oMT':⺳5wʟ;==ɉ8Wq>4]`HPhOOO?qt~r/csM:EY)\_jHGRP=Z2ސvȟ3/B9goeIL{ -G}vp>9Y$!烧!$՛z$yM>WuDWք] !ςpdlZP4'cGGŢ\|y>SN x!~}VaqAƣ֖~N?_ y|o"BmzzkyOPx(?;;+ߺu}e |S)z}{k^l>{ afffRHT>=Pw|vwj?bHbmf '-qܟtBQ?Ѡ^G/?R*sz5a!}_ ė1}NugEH2xphq >oK򆶹|CàL=aWBH-QtL)?ĤEjB+ GONNf\IY>߭3O>o٢ρğQx.677ǯ^e#!p0Kl]< mNpK< Gd=Q0ax^Q(f3f/$bJ IF4 ,C#w(did@+/φ !68ڠ<^ /k#mXO#A{g;0'k ]qmɮ9p_## f!<>l0 !y:9={a.T`?jO"$oll& ^G/Ͻ;Ivn$;/R3໊tiT-B  wH(w*4~ =< a\O sJ_Cht @X1G)X>8Cs{&BJ!CXcE.S\ Y-J^R)yeY__7n$!?_Kwu"ԙx&dI먛p[Ⱥ3t0uM?^Ia$~+mg<èRKigD#B~QD"cA¼q~cC<YV@<묆saPf%\ INJVƸأԺIcg\_б^å DZn& 7WjPE9u6#Ml6Nhtʕ$GmlleU#,M!S$ G'y9ŢNG~(G~(Lt $JGHC^Iv8$ ŘHT0P ${nʳT{3($!Mq0wXvO #݂d׫.D"܁N↥!k1{Z2q-QIƦW5ڊ}a=mc$!tb>5#/zm^?ggjn:Ե)  HI-G@c{azyMKoQ'(ȰAm\B9AR71gݶa@dNEl릴VSA߳{"ҼcG8Z),j-qONp`݁ˬ ӻ: J^7bYtH Ok/-]sR=зpGbr~J![ఙ &]OD2:aPA"r1l^<[?Amc_3I( %>ţNG#:p-Q7(JȺ0‘HGd2THھd& c ԩx.8B[lu iG1/K/F^ Yk9&C׹`ny,Üe/F MQ"𜅁Iʿǩhiǜ{U]i0!d? CArxh09fl/GjʚlbOc}v6䝡Y tl'(\]pM<*Őu߲K\GHl^GmѣMkwJ`/q T"}D⚗0'⿬V.T0k655c{ɶw NgG(%/d\wd`H޽9yێu2;䄨4ǵAby\*jpzz*ӌ?.$?C.gk>cWM܂#[pSW<(p$䈯 "$H.3(WW'#xC¸ߪHwoN#֎"c^lP<,Nqx.$9Ԍ{ߜl HI_B-W@T{;^z >w%! !bl0g[2+ WaRy /B2g)uOi?{o$ٶ5]U=ݞowyO@` Y2aL`Gl0d!=d#P5Ia²f{{{uyLڝv3dV'|9U9{ڋkv H_tFx l H8^邖i2sݖ1@DDA/º٤$~uNܲ挶ag9;mBr T B@Blmm>eʵإϩX>I?uھw]6PL8bx Dc1#;]R$Y7#Җy2$KKkgymZ@& EY{ݧ IUwTvHscXHYtG 28^;.Ʈ8 Hi'fjQ9]BtD"rՀ}kസU븛!oK!}JMKM#oC8 4iccc?511q:) yZ̜6IHzᩈrJj@O[~d'/к̦Rx;jEHĝ0#maN#Τe0m/La|΀^O%Fq^،߳ cjKAD"SBa-mK _p^nb|t_~7"do "^x!\^, к I8U_cڄA[lP):JFP"5^ꕀt((䭷ޒӔvtռuW7`C=N;un{w2[pŲSeRnDi|[R\{j%=N'$Aup(%u)PPpr;|f G ޷28Nu\}®A1}p*}H3dBȠJ"}ilggVsε?r||jDrҥ~/Fe[:v*L-+z-U}% \W#bHۈ>"fGvںI|GY#[Ԋst.yLH,iܺHZKn}RLsknM<8A4B:K4`G9m0u vv轍Xd H R_gY`(9*Ø[>E" d|Q_K^_9i7?omի4vCCk׮ɃN"˹1'q]v1\QiGmS (<×ԝvYR ;|QZ,/S֑~ADŞFq{RD* XB ZF$w X@`G{Rz9&W GvS@|N;[o wbXm/H$&zsPc4Ft^*\ؘg ڠѭ[z]naa4DCZSׄmΪM@ܡޞ®|ݣGxK[K]$ݴuF@2i>Ǘ,㾔uH?G2?Y4wI$ ם E=ϑ# /r82"Y߿BOdM5)8QwBt@񛎣tWu7#v !HKRiDxԱcڞ҈T2>Ɂuɓ?<@B*˗/1 7I# @u҅:;8ĉGiQ $-I6Iv۷\wjdFi?Y nYotV l H]H6'L,ݷUߊc='5[wZ{IT¨ZBLfM:c6)2ǹVU?~ONN߾}[#R7LLL H{{{yP릢):F!lP#Ue2.Qp4*GY#_\;(7psBvJzYSeIS&褚3yPD4eB'a}v;:Jͱs&qS:ӃD 2/\ RfdZw:DQhsBHc~2u^?!( 5lw={=KGy5Q.bsԇlN)ICk mCۓ ӥԉ}|iuvQpd HYֹGYHcBqa6=PE u\<6vH}9hRq~ 9/ u]o; _X8n 8[ΊG{k  l! vvIg -JEwJba$k_J>Ҿ6y@gRGD;|}FG#\:7H)ی$֢;)JQFHCē쑎 D)ĶeTg H~хyPԠ{z.]u9%fؽEu(ܢ_k o BIL-б6 6D@@2Ιٵ[[[ߏپ?NNNpN^߾I8.FE+qA=[PlY|QZRٺMy4*E,i\M[wԅvu:pw_ff{."\-r,9tuOd0km9=ϮxR <ڂmXtѮA϶yIzpBPw}}KoIԄ+a4rl ӱMhzyww!}efK#)Du]V(.]Eģ}%fÒ:FrJ/dIm۴Vu}DrnRQ|r:s `wt4J6/Ԁ4fr|}5CxgHJ6D%9twfQBMMJV!(ALZй iWlo?5GG"\q˯Svȴӿ^vu}H{wD}RR#W񥭋Gi/(xdHYRgQ<"E'""U=MHNC+)ڊ"RpSCt ŢQGZG NKx&ٍnl"c sM^k^J`uWz Zv8o>cS=iBHkXS9_ן.v&jZN= <;lI9b_צ@L#_:_#[<#W<##n#BΟk,GoLHƲݙ!ȳLJc>_F4-QDRұDww(T}{cuQkMRmv,za?(EHɏ}PTC)[ պ 럐i !sGd" *dz9o`F PVellW<)v=O@pFȣ8mn#RdRL*ħKYή#<cy7"R>pfW΀>כ!gA3`Kv$0ҡ[W.Kr\~Nm<\YЫºHNz۶:n^HjjzZofdd;Z=Maף߂-Ve e8M]E0#;mi}X ǒUBZJ;&R3F$]oqE!]"R Nݻ98w .]5˝ p> ) E8itܛay^dDϓ/I$n`ZO(?W(q ]Pp6=k^H!Y^^--- _( ]fɎE$7=O8ׁ7F?vz-GO$uw]4i|W੗( 2r[<򥮳#_#;dG(fJwxDHHd?6)`0$_+[q:7.1@:c"#c Sם'ݝq" ). ӤƁZH3 ubj}bwj+">BzjEP-o>"҅H(Q9G&[3!Z\6Ǵ" HQHH9S˨Uh{>}0MúHIVJχ߹׷֖@t xO#ׅ; ~ |O/@Eriw: .cSG&b+%BN I"uHsgM]'*5HD7!`Ꮬ75(: vٿ/uhIXCwsMs H]yD"r0`pKm/uLHf Ck?qttɰݩVS{AV*>xɣFzt ՓNtR[[[CQ5O~K?^:_( 5A\ȍ>GM 2 qa=?}7J8ZÎD$gwu3 9c7j- w@Sv<-5ˮ8׋<N9bB3yFuBzy@cITŎjT-dKKKx|||V kГ}F>?vtt;;;߻;?}ȯܔ _YY9F\JSD 6B,j==y Z&SʼnHvv ] g~\-QGnں4[!m4r嬈f(Eaɹ5ٌ l6O{s-QQSC:S;>۔u1cPlyC5 \5ܵޏtET5SbvsDyGGDpDQ흹:<<699p_7nLj'+ʳ/_ܾ}o&uMo%vAKƚ8.u-@[=5# Yuvđ+ B#B2VK8$S_i/ͭIwug[||vͰ=ţ΁M LpS<Cf^MSq~;TӴųEjqCQXOH2Hgz+Yǘ˗/vx?,--q'=d}rr;:lҁ{+gW^x `R2Dtсimv#7;!íd#$#MagOj5miWv>'#f?.q΁s!! $7~K3JvW&}!k!Ń^֚vQM1?q#IOXZZ2)yn^"XY׋pr{rǕJe{{_-V\}mhh(͋%sa%?ta !hrr_c!Dӌh6Ibr>ƥ""n(qC|Jsff|]1}Mxc(eA~A=o #az"MBaIҕoZ6AVT޿쫫9ߖ6DNLLο~j?߾}{+oWZ}u>a`^m"lH"1j H)XGMx4Fu#ڿrV"5K[Wx;!7"=תE>%ƉEi-!pY($/6αj<;r]pګH9Sat, ;浚v9ύ ɼұ c5 !m2 *5t7o.| ARtngf7<<166vuddk~)|WȠ?!m055hvww? g^ѣ{Dji]װ* ?2|ؾ!lN2>zH7l>Dvb6' Ar l &᜿'f1&Okzxx}ttt^ݻw?Ϲ$084mJ/>SZHx Iv!{QfSQ<"$EE$ӬlM$3kr^<*d*;gF$:f; vC=(h i1%dA),뺨em ز<S=Dy֮W$FE]uξ) :뼃 I.R=j~\N:DSSSO.=99cb{{!$#m'w:o H@, orxxxks)abH3lG~N};s E&H\M:~$`( 򍢏L]lFrVq4(-ȭy6W8ċD͊H>}E8J>d>3RQ 7t.vD!$ }W*v bN<oڌ@r@"> |#ˋ88/,,t,u;KKKc<ר(􏴵= JNx~H/&)P@Wh4ј^P$r_s#dn](MD?QRk@Bk%)kaU@Iތ*"!.!]:c; vbģ:5"a]qz͔P6G UaNd `#DQwv⚴k-.$-򋋾 I!B4iD^tLD{pmc,}?P'e^)" 8Z5M|6H%ڜITo6*3`}s\n Agaa?ਧP*ժ ?ώ6oD(Mi3BRs7)@ap\ӈ+ƤFGH8!).m]+u!%IDJT&6xd PesHLeg:-4SD;e2/ϳW9C($Qd!܍4vlԕ T͏,L!o:z6IUN-ҙNua= e0 )!6Um\1%IS\@ ȷD0Z`A"|bM :Ex}|;ބ|ӬTBNR Vn|;3P߀ q|Ktzt8h٭"LKs RyNb#a#j57y. ,:ǣ9S$5N.FFF^wGj! r!1Ș99cҺ%RV@҉.p!%i4ĕ8\Wȍ>#J_ȗ*B.NH EqQHN4xW;R<BrVNτ0BpΞx3#1 Z?QcX$Q$| r hTPt6iu0_L;rs`3PW}p=qќ%(NDG8.)mqF }w:9 /\.Qf #DT'Ej(j" T*;2d; AxE]x0/p,H>"]JXAɏɇO)lNhL ,j:027TgGjNr\$>A!r2S7s 4Fu1Ҁ }Gu)L-#Smƨ}d?@;\(K:WDb#B,"R)eRR)N0rLe~ϊ>(4|UH@xhtS 7: )^ #vI_-mV΂ /s0м9>}3J +t;(V`HڧOzRS MDZZ6vttt7T*/ y[(˯'&& )![IcK]{w::I{JK7:n6'E5x䦮s[w'7i"ƅDKDH$>Le~/p-5].юcrCޟH؅hR1N#* 8.Ai+57$Hkn|99\|`%+Onhttv}2#?mTEʴ=Kz> a5h ]oHj'" y䦬c:BODg pţu!'&դ9(S*3:0+].QdHyĨv&,OΟp-#7@Y}\5 :R@8|C}lsp䚴pxxTVg'\}T*>/^;XHcϏ cjoN]5d'w I;UF#nX'X:=A&EQBLR\##״+c;\E eMe%]S~r%n D2<%D]gWxA4JξI3 Xj xWtn9uqTDun ShR1jsfɕx͂;;;oWUYYY~jjחY vԵ "Aiݕz. iM.Pe4!=q:}䦕KvL]GHqk)D$1TvqRTvf煮~>lN|F*A^;炭5pw,JFl( sc0r- ]9&Dn>tQ8>IHin)$<˝;C'''wskkk[W^+++CLH|wt>O5:AtJGdALdivB%)4[E[E I|,i뒄$Gg1WJD\4vI"щ4_.${܃>8{ wVw.2ǍRHuS¨n4l:{0u~v\ϣ٤ L e+]qL6+jC<142SFQҮXsƶk~j:WT:~|?FݟwΎnnnO<Ԅ䎚4~QEҜ7"Kt HZ܈!z`+$K}lii5dPY7!dHxeG!۲4ċGDţh$#dcTW#4◩xcab> nt2 0kR GZ[I@ڋU8 3lpůWj]O%؀$H['jDR^,:;;W3P{?hÆڪ&" ÂڭXTeq CiedʘQu4\VC#Od>E"e\*4#׼+% I&)/N$> [KC<*Y1dI&bbQ[IVu40%9/O%i}`3YCvCfPfO( e$irMToI'Q$ܱׅ"R/0av_{W*z:' 퍌<::񛐾}ilCrVPm _4I[$uʬDQRM>JJ3%ȗ'@e!v$Rٹm&]Hv=; 0GD$IحzI[`c([BUv!H;q!3id 9qC~Kڷx>D&bSG9x6Lں )ccc+_=33[[[MH_ڱfa2ނS%v.LX0QFF+D"|:GGͦc!ľdB2HY#_J|BEL]8 &8K4)]-NFm.D’HݜG2MSg@PEr;pB"#a]A19pQ|cxK~ [&_J>,t la!?f5S4ģ4D!lsB9 !ߒ(e;u[iI߁0u]a{ 3%Lds Na8ɖ7Q3  쒞GrQ6-=|&lZڴAuRu_W*ZLaal$۔H{7%܈%Q@(1]xCM]#߈ N4WKaLQRu裤L)-k=$WDJt#7 mH\I]ߒF~[y3,!v] R"+qt}A>P~JOK h-vG8R%"cHpH`A>okz\.oW顡=7zf$!OݚumJKϠ} >Lp=@FPް{F`@Mfl' ‘/ĤV%d1ͮI1cTvqQHRٙu&($^Um]Ip̱! H(tsɷ1,ܝr Zc I2Ժ.Q"蝵EH9ځ=}?6FOu%o5WTJ:ڼEtlB P7(7|lP^5UYQ)`J^~8 +hBn#so仟5m]#BǰzHILREG!"d|DSٹ⑉BѱċHf3QHUk|9D!iK86!㰽dmCcWĂ]i%N",fswķy8 o k!ea\P H (ǽuĢD"i~ظLnD}<0=f/q䦭GnQ9%EeLk&ΎBKcw, XގX2QH0e>ˎBrE(y /dk0b{֩"}Ǹ^g0_0@<ꇨ.dHCm-;Ĵ^㈔P )<{R|R OQ րi3.1uRmyyCCC?|)\.w==Rx( !ׄN6}/vHY}ܷiWb8!,RR׹#BHƸfSٙɈH&hH-"QH$5B3q{FvK+ oITzBY;q ) "RGz#U4E M z(Ե>/wҥKryukailOe{{VV0\s/L+Jް-{M=~?l, | :WNNƎƇgBH7lhMZAy5sᢈu]}'$HiR{FB=5ήTHF@:&0dC2oģ`\-$B{v]c4; R"쩣bO/)3`L;Ҷ^ Hـ@(ȭ^6lkBa=DKHLNYZZ¹yr|ի211Qky7|~?=_HGZm;t^aj' H 6v.Xk{&(U |:f#7u]\HDiψ8(4$7 iX⣐!E!᳐]?QG,n\<!mx} ņ =8|WtS("# 56B釵ʎ46,?RIؒcn& #"u5Y vZ'[Ksw<<%BH;@_*HYD$S ߴ($L.&;>S\s"SE?F`|c=yCsB #=oqY\(=eii@)!Jr[AiJQw]Jt)n}ku Wɗ.-ukB:9%sTv&IB#[X{QHsڢD&Qt+ yM+$uɆӰmfIƢ$V]H|.;RB8N"RxDH\"s9BY5QdoVQJjt6d)Hy͗.K#;`%u_KJ]#BHTvn ;_*;dEqH& ($FH2#y5Qg8(/ pStQB -Qض-B̆lúΗAD*jK Hq"JKn℣4|GqB!tcI`N>eR{F)҅>qض/t\X ;IoXrKmY[!/uiD׭jsI4+kM-)%y'U$=}Dd G&0-iH͵!4$j"ŝL }3ЬOΆs?)Ƚul8Sh$_$BH'z8iwn=$_%tuFy ]s>.Bj75]tDX)]`CZc߳`sw A$6 |3"tG%`TDuF(B!u &}A<9c۟N;/p~:L]iź%GF"tWqĸ($[<ʒ:t*S88HYDE8%ᢰ`xkgEIU1Y0gQg鞕1Is.?ұ4vk&:?3)!rqjjWs.[lܘ[ G)!t [E$](a9n^;o~U ؈ViFRټpM#F ăDrœ'M]І{/_:F~K[;}B%BH' RJ; &D$`i=o+]LcXLc vMa4Po1r4ǘdԅn#vGdEǍ{ =k)Ry QOB!6D1o#Y#7 歷sE#s"磏|R\ $3yDB(.xdj k3I'YgEgΤ1hG&# 6C#Iƭ':v+>:= - @>vEX[./`MCB]tBY }io$gd' yF!GG^B(B8mLqF,ڗh7VϪ|GF!sN fw\_~[. 8}RXr=#s?#-Rf2 ) }˗ֺ!dۘk$Jyn!B:.-=]}MR^sOZ9EݝH"I>E*5BM($_]88[M L'VltMgG_|a{A]B< 0* 8 Q7kOP&t,vHc lko/eGm-،4qޕ(R8s!!|5[Ix>߶3Bɐf$x#_gH!y($4dHt$gSܹcg<4vI{QAʎ/Aή 1:ŎqvE" m:}Ԅ"x6"ZÆi Ɛm㹻11dB! CAߴ"*^Kz8Ls6&9F$2HpjCBH;dL#?1*g#%^ElƍLcwjcwHNcF;}`~ԽiMH8֋>Vc^q~cbf% D󍨍kBH1)l#66鹤ɞOR^ke)N0r($#4$^8-|QHuO9 2K*aD⣏|ujr6gMm]m-K I\ =[Ph'B} u=I6~ QH/iH%Gyc?!>LR' .V<GvR 4R2UCqH>GYR K` 5vOɹQDR&Fq»y]Er?IT)HЁ8V䘳8 ]b^sis|d:@H.Ǥ7"aR=B!mXpthD4*/m>Ka@rE$G+ՅB!$ zo\MkvRzlC*hdN'AE҅(6~G\M;H>1)|/<"d"j}x^nWHvԓOH* 藍}K$#Ŏ:#TD" 0&tq tv5<'~ }/KLƸDQcLL!- 5;r'h Jm}w3.ɍDrk!>1[)J B!$N 7MO I"Rs{,)؉O7`A] `%8I M+Ry%QACX(Cԋ>G$͂0W3n52jHv'Ħ:cB!cđ$(q+bRR$8έ!I7 b "?FB!Mc H%ֽZ+_]Q#8#IJ>̮HeM[2sǻlbހ(],ptI$p}Uwޖ(lP#HX#B2b{o7xq"S3iz,R=$;ZȎ@E!L 4}PH" f̌q٥E(b搢Cړ¶>OG$H]g%vE*R r;>@]Kks8QQkjb&X\g#!F개|O@rEH"ݲ H$gbR &^ed&R+ng}I##+uy#-/]IDG/ NH (VvF*'z B]^/H3M?!b昑( RHhZ ""1e$!=>g`A))dMAY 4sx~C5tXv;R\_1}!TYȣVģ4v&$!ϋ= `i!6 1)tNA_#r oesbv]+P6X!Bb TFѸNA7O4r%H$)A=y~4aUiD KC<2HiG.)BH^""sOXHN2>W0Ϡ>eBi # N<.IH< i$_[!RG_Yu.ξuץiTۺ4rk$t+ShD!JB $9]RTqU҅]Hy0 *zG R=M?c ~?G<.QMvE b^(  m]HxtW.S)!uq>'r>ww.g##h;߭yoK$&B#ͦKLZCe ApӈDPkq놌 $ s5Mׅi[! Si >㊺H܁[:~!B!@JJ]W(N@r>X$^lDm#cLY۷qϹ~G)_~Hrd! ii$f,,e_|n]^E&a~:MGK. umH:H!>qJP {h"PK6îhHWe* 'ҭ";af"{WGB1BHԧHJ['|:3F',Mޗ!Mb~#BȠak&RW)I%]7wSg-yZ6wm3AcXp u|nnKRٽfD`ˮJCDg C ]v !` HiQZQIIIWsii }}:I$!IKcW.MHE!_N]Hr] ء;%tVi[ d0DξEa2v66? 3B)Ӣl\Ǟ?NW'ud5߳YD8ҢR2esBWqŚ44mӂČy"Q <=HSGml Gl? -Na+N@ |MNBbq4.}]HפԨy`[A i ģ"AsR>ZuNXcw ucD1vI.Gl4kkev񲴴N $' HiQZQ0!gZK1(δjΥG/*SJ J+:"y2"-\]E)@#FhDX 5o8Jň>H >} }E=TB(Yܨ"wqo RbH yIPTu4!;ǥHzDoK'u2t Kݐ8lZ}< Q I6 x ",} :^Gm8;aBE萤GeʩǥKڝ.kg]BHRk#%[QҼIpLcF.]ƈ>fWdNyUk?}n5 "9p_hc #1!b;y^#-X%20T"q'L~`ԬXNIr0d,/BȠ- /}]3GwEppa'ftҐnea® Dޕ. yc:ݓ}??B2pTC@zŮ( a{/loK$O D):XG!=[$ىwsI\6Rp:[!Rɝ㴔uZH>1EpJ{p/:O% E"3݋pJ1:-98- 3dm8_u*\0O#E'"!"lr!2ThR(nl5[#RoC)ɎF23sN\DRFlHP")^A !AޢDbLa|{(LX0 )NNHD(%)H@+\WB[$-M(lG:N,mz^ `GA{>-q;p|5HhQ" _ID HA50\~9_,`"2 $`-Uc:feBG*p҉GRרBKЧM!Rx\$ָ(XWHjD. i !KN)ueLg{2p2WD9k!GSB*&X#Ef'rB%繠$:(BN3B+E!-(޷]‘{-l xLz>wıhBOLW "솾8D`sl1^C6}n51lD!o /&՚W<~&!(4ɼGREA ga{e^:nw70(oFtB;:[v6ðRq|nخ;r Rڡ>6<$GFgR=.A!2KCDR¼.X彰}H:)ZߍM_"?y슖$SyHD| ~!>Z:4"B)n 8$/"ol*;E:B KBִα^E~xR- rfw *D(\ֹ$1=FHPXnjBHI$MF!XzAh#7e]{YP\eɉu[M$u w\`O }yt<û5hE)? %eH]aJ;B!@hD!DRziQHi)Z=ُL|)MF6dѹ̑6_`^|-1s qQxQ#/*m]kpA"DQfB!$ov.!\fRڹi'l )8Qb1ӺGݰ +2s"Qz'cHHH$_:e Ҿ0 D)=-H;k+נ}%JGZVBrCźOBH;ERۥgݳh^MwŨ##F%J)3ˮh " l3}]:?JM¢( `"ޕHF|tG-u/LvLY]BGT^+N!6IQ8"rQq'Hog ga{6 H1nh D>be#NtࠡCAMజ H,g Q$[BOޯcDaPD~>l_DN6>8Ȓze ?iH !9. rs|QF$7 JBi$$O`w ^M]/;Ly *o0oXiDgp?`wk|ER}F"=8hy= ְ+ GoǬ b/m0BBZ!. #'BB"8 ;O `p'5 <FfO` ivE Do1.ޓ("k15#Y؝~ Gv ૵}?pMzĄ%r#nOKE|#&C#3fMfBˆ4 \B"`?Y`c"Z14ztSlD"wZ*!ErZcs[uM2tdBJpR%MUQ˺xĨ#G.t]/%_#c/ Hs7ҋ2s!>v^o |vWmHe9lῒ|GjOA522r|ɈBip?H$"u}vDʘ.MTd^+NϡvC*pR@ pݯ.7u GMmiEZF6V;a}/Z.OЛǥR]z}OjGGG?755-phpZ^^j*'''oёjkxσ gGGG&&&W^UfBH'D! CTtE#aq2bg!b ț:'9wu03zu0, P .nk1OH9HsG(BᑎeH]tdˈBZ널9(h-v-l?djjuNQ;wDc>mib"+W~off滖)A!t $3332==J.iCS1))⭮/,..x?̺x`NuB! I<82aðEc%"v:\Z3c"RE:pxR@<` #1/a>75@/J$<2z-OHCL*"7$JYfuׯ_w 0&\zUݻwMI?,--}/BH+0BH1>qs+҈:b:/$@"́Dco$! lHLcwqk^"!iA2[/ul!74ģ1]OHq6DoNASe қMY__jկ/^\pyy !$. &nGr| |?B R]94H\^s֟Ɓ;] 'Lk=E-$ YPSj3?0)>i?ψG###r yG.o" ~:xۼ\!YD![οgNޟ^Z5{Ĉ`BSN]b AҚ0@8W%!E siD)ݐrP~XH{9 )ɕ+W2>^=8BTǏ !$ !tø=E(v69ZG'[\\A\Cj8^~-O>w?\ZZcB BH@*8%<&$O+슖X(}%9L "bpa4^BϾ'QI0CO-c&l755}qFe=HZVKKKGN"BH'ihvf#Q\"ݵkDqǁL E9ίyģyHX$JEk( l-g6]6CHiw֭غHZYHB:A Nq:!(u(i~"&H;q~Q:.enk!v !_ Ci&+6A}DR?˗/!lS >X{bD!S@,scFA}HwLhXѕYT$x %vޛIuoDgUVemnw݀"h*"ิ4(:"㾌0>nݶ,}}眪'O'"N}"223g xռt0hǵiwOl.--]d}p`=-?*GM\GQ@7ZMĒģ}RQ ?I@!;h5HPMR5zTR2H@Z5@rH}G+9 sq[\S8;W\y*YݼyikkvvvRXrHrQ;a@u_pqTt&~5{1s.&ICKvL2%0@ko atl7ωf8D FlpگNLLƍ 4>hmm-wxxE64nQQE77 4/@c4Y>~ ة\[7Hu8}ټi; Z`2qrC$ZTuvlloܺue>> {7ްrj~Hobn`@/ݢ*iElڝe^#Z6F:pd-|jIkF̐ .~gee݅B^m}@"H5L>=62]ֽpiFw[A D۷Zg9ڶL*GynÅ.^*}477c tb®_=n_ d @'# eH7R6rRA@jMF@&r6DP H8lWX}Ev) /k.2 ˟C쬭į{I\.@@@Ge3n7>U#&#'V"T. \H*c )4[x4@{.>j^Y[C[?^s1^t'fffsbyy&$ET*O%A3C`H.H}pyuH29DY =S~.?.>i"zzZ<::rm.X<;;r1QTꓣ2g.]:va>ye ?gX*:{y||禧q k׮oan8J|kX?$S zB My%;^0!⑋3R*E#D1i4;. 5)&X4JBf/X5AT_xrr.b4|_BԔ''U ʁtůAX\|[*^\vytŁ@"қoy{w'Sف5`XDVΒĐV%Q{H_JUnssnu鷻u2 `PKE_H븁V$ZVRu@B@6*c(' u&2vHGyNą߿ǟ}zzzα)`nnF1WX,~{R陽ŽvR|}$ʊhfccgGsTf❣4j}@*ZFZK͖92zپyVIE"h_}TƮL:ꃴa^QM_ʹ5N€'dB7VjÇkg|>_). 7eRΕ+Wj*ʳTsT!K u7\P|3 [+HE}Dٖ$h_xꟿ)=ʡJJHM Dt9Tm MX[[{vvvArM8sn}jcc;;;+333_~,6H0䌉D{8`GX>sB+OHP]=\#Q[k0$\~UCD.~ڷw3Yj /`$ zJ\YĽ=\00Y&DE\dq1I*:F%>t]ghߣQ{h"4@C!ѱϓ  r#qi{{-r3 &'Ν;I}\r9[X8_-Pe~ m/͘"Qhd ~?4Fo:CF0C$JAM..i90j/bT*Wkq*A *c[ h`E2u8~5 ! b?`7Hg񶨚' UHD2vJh[1\0xtW_v(KG>okk[̳ܽpeeŮ]Vs^;::[,) 0p n#XGB1) Z(=k@@ A%5?E%z( H.>f)/p̞%O#3 z%Z1|vYdy3xcf{vHgyiT$ze[ G+{<Ǐ?{oo0r]~V`h? ;NNNKfF$H8gYFh%$ ĤL׍uݢɛ{FnQ#\pq~ aCMHr?k9GO96ODZJ߿+Iz*0B`Ͼ.XaSZs'Ec܏ch]ԍԒ+|hQ;W7&fG8Q0i]& B*E} 㱿ONN0:d!LOO?{^.肀ݐZ\ɺy=P=GzHu]IICƩtnu=R #4@-Hzz) yІ?~6>>' &" 龚z# 1$A. EaHg=O9gc%H}=gU^ "r9F&:^ >~ℤw&E]JsAH=6TSᮋER CfHC AȱsMY#4IXXE!"r[[[ޮ8W%RZH4Md.W+}&QD$ > d`4A@v1k|]yFQᨙx?S"R=Q^F$tsü .'4g09$n2[>:ϟh Hk. 6Ik얋C)Fk[+iӧrrrk.]ދtl_Hd8́Gn4OFFX'ȁ< HQab'xS;/"E]1),"k@]! i`utXq-|=R(s?)94^c hLԿgtR҃poo_ۆ${vf;;;5($"Ԑh~~]ǣׇ(J#bC gqHV#M[Eq?ѩ=.V Dp 81)]II}EuuݣOHCcyClC 'q(rQ Ḇeɿxcww-wï-//MB2ڪ;7ZDՁ- @fnb:%9 ^D8b~/Z: E. Ia)*ŕ'&!$ Sj~Rt7dr4ν8}gmDԆך)'J&moo=ilnnhT=B$d$h)5*\ ju/KikT<3kMLj]XL Iq@H?Za~(-Au["q%@'H@Ё,|0n,6ȉE o }u'~MrzzjRu^k]">M]BI{aj@ļOℤ3k\ޮRTD z+or:*]7A*F e}#Ό2Y9wYdYk,8aB7q[],YET*N r- H1<K/'o{℣FnVEVŤV(^VsH}?ݡHE6gL`wBI vN$\H*{1 Cߏ닺/[~nk9y&''Sب ;&&&j<{<6O#V_].nrAc͏\|G $膸2vQ)BF$qx IDŋIc7gGo4l=K:pAwȁł#/I46ӄ#8qvGHzJ=}&"= 4errrgii7~U=Eŏ# 0Y$<-[)깎 ILAE?6*oױpհgUyhG}=_q qw:EC_10lTJVXszg뵲urq^-ݖͽ6;`̽KQ;TiOx$zΣykr' {"5Z}Iv6H&y;W7Rw)ժ>CX!]yС7H& qs>h5I8I% BT*Œ?ԓrGGG2 $ Fkkk~27gW^BИ=S:&Br#敿.[}=,sţv[F̈́8Q)\.J Hg^i(:GHC"hQ&ys! Axlc17YV/0tJb=f-Yѹ:pr٩$RqZn8בHz JjJ;Z_w\=pnbSrMhQ'R!xQF_#yycv~HLs#N|? ovCpz+q#Ʉ{x9vGOHCO>;G:BV$H Hi?cRbkz$""~ƅD_{QMD ;D‘=Hf[$IF";vjJ/>/Wގ@ @7D{5*17_qO3f>Ĥ8GR# K4f{& bq#uV9߲6hMi)3[SNUoPWxj4%rwiQ.$zJZXMbvrr;ӧq5M߸q^GE#z\۫=O]5ttK<.@< ĥQ1)**Ĥf%ZXOD ^nS{^v`ŤG;#)FRj.+]n5oICG$ur\3sr;?ZBM\+0ԔJ%'DNfʯ\/굀<r5H=E}T~n`?V%MݭWwb?SlΚ ^G DH^AqbR7BR+#'vQD:"RZw$hI;Hq V;yOgr퓊s: z͞:F\|pˆP*+5yi[tU*7FM y~G{ׯ_>TH7p5BVWW˵R;;;qB{\>*0@ @RĕB IqR {~fRĸZrvQ!iΗ FBRn HK _?E7^>I @q?E3)NPj]F FQ)RTHJN"R_ݣLΣ'_2+II*K:`P_buqŚHnޗqr\H< xBe%M@ vݾ}۶ɓ'ѲvZ(]{/h 7 %¿W-ΙWBRؕGRXHH#KՋptbHBR]ԍ &ڑu#I_=0An%n'~$pɹO?6s!11#/"=Q_"R?yFN #*YZZY{a鏻댞 v"q<"DAE",Lb2Sc&8L13 b:w&C2`[XpbF(g¡#5M*ƄW(@/,Қ! u.%aDd^?PYrcDE=Q>G }tnTf[{sb^@$iJiXg±pO~&ݻw=e~S% HüI`UG!DR=Sx rR!U1)gLQbyT GAiꕰ>'$EzNJLV=F/A9:*c'̪#I,QFRT7Y,%"{r燄zXr VVMݼy|ͨ]Ix0@4J}/*];2qqN LO_q*ӑ =1zy}& Dd{U#)㳒vCn+"pQn1!4@Γ:Gr^]02J%9>l{llu%ZeccϽV(ڵk$za-_waHS?j^9J0H>Zq&5*qJW.p|ip7s,^ivRv>~xrrrΙܮGI˵u@"樕JT?'|Iq\>u:aYzepipehT.Z.rvڅŕr FٹmZ0Lɡ)*_wF*9]IfHO9$ =Cc\!kJ%]>966ZNNZI<:;;?SaEޞZ\IaGB\>onif~VyJAO$ꒀdRrhc x4A:F-sot-T8 H8{7V?dO~X}NOO-09:j^BQt&)]d{{.]}-,,V!T"s 0jH3qNԑ®FeEDCD.hPN$w)=n z&{E H?Acd]5kH</ԯkz:׹m)#)x=:(yQ#*{:m>mJhRDrOۣu쪉hhRBw蜆 ΝOs..HdΑ^yii677\./J_5 Ks%H }-,"&5{=~9k )W6Ku%CJ17xr9ʤp*Y[9E4.kaX,{\|/Q xvBI: H2r&mll\} Msss|73xqqC@ Y$*$5F"R\IFBR+ѨOSxRf|J\1Vv'{k# 3# # =IU=C7kbtWY.Hrwȕegg/ߜքL^kBnX.nϞY[2ўGfE3`Im>o65HI7ܷɠ7G[b^0&8t~.@"$ ʫ!=2$H1b7W̌bՐc~k(Jg]8h&'k/eVv% +kW.\.x1)**rmY2vOw/Fɚ1ព5C10h4"HCt,Q,?=|KWCg}>B!D@2wZ$M./$4s#<6r(5Re7ɽϸyj%&9%T@9cpBuHE(Y-X,>l7==]+5׾=+%ԩʼnEqSf D~ߒdR#'>9 hfg4tGGR' a7hL.I X,j{]q=CBZܘBy;̇}C8H>7 d$xBR7n3k,s%ꗱ{_*1?~Wmt]uVCґTtJ (~zΙ4cb{.~c$j҅&p!ǏùJ 1D"R#Qⶹ"R'TU*]w])Q4.QzP)&Ddm$H 5{ɿfCos1@'R?y5 =@1}HBSSSvtt~y B&@@ha ?vF{%#5*aɘdڮ I?oު[MCr#IHr(P({Nد!E蚨+VgҼ&*cG/$~Yz5ceeV. )L~P!I%!3Z]7R]Fg Nn\zĕ /?)"]yhA=džBܞ +t9kz#.l166fKKKYgTjnHڣ7RB ?OG~G!njnEDr?#ǑGWm@:G}&歈WE=P mhOޡ粱@z357]zGN7NIChbq$obzI[(ߏ[@RM\E҇ m2I@_)*"u2Aikk^k.n+&赱F*R9c9 N  ypzܤ_^#G) d@hEDK[|zfbR1I6 6?}([{+ D ;Yޢƒ""Ņ(YCRY E nWDjQTvHxmi^_Hl]?{45-п`8{ʹy.$Y5mhN$1TN%  3%H!/RN$ ~;bRTT{=6^vq:/ѤzQ!h0G#C0AbV3O:z*+cM _j'''''R~n3 `pt#">ڍ+I"z1o<f\H]ޓ[uL@=+8a]5~q%Ù ylhx$p| HcccONO1C6@@,:睔;ipŊAЌ"*t-Ǥ 2v%$~t@4>-Cs ݔ^|>:ـ,`iEDU ݉s$I8!*V_8D数3s!| ]vùԪ+6D`HI  _ A3IQUI;:V+1ۋ =90Yd, #˳p!b<.@+}U(l||O }ܱAY =+"U<6buT\hۏ:r=4ωÁzMD8b߇!w'lLh^/1 ;]}68΁41 o>.,,|`c E"R]!scΣzN$4as[gv^Ċ@ oKQ>>!Cyqv0L'ϡ! =!~mpir@ ߩ'y H飙)xlY~F5/(@؊ gc{.A H~`x҆NTQ/$b|?w^GHqNLL烃 4C*E(,E3kMDH6(D,mE;.vIP!i4$'3`ѵQ}]&=GV# A0Nar:@9:: l@@o"1q>PL6 U+[p"f:HhHʤc5U%#CO e)rP >/' $z  H8=YXX7d$"*-c 'dI),fYyQ =\h7JU%H0mޢ GcD $rH+gggcwnnJ8!&IT=WήQ s ^~\兩m6̚ya H Ha'gbm16Z񯡯=ö2> fGXY 4C9]՘̪ I&NaE;8 CC#rR/2RP|>' RvwwU *HG"R؅qAп!,2E)B:r ½y#&Mϐd1ic?߯s}LR HMH+*_d pN?@Ds'"1$ZX< Jɇ?Z.u&ICbc`5Q%$fL qyaIG8ǩC @z~d<CNŝL]׬(yB"ϣne$2P3k,JS?F H꓀?huYdo1)|xx*#@ \zQXDc H(RI'(B}'E1+h=cUc`4$~l (ݱhȅtȓaj GdggU `y|'$I?QT/ tut(G" "A;z|? [<{.k0p~qss04ФxT cNU (c~&ɡiG#({}HW/iR)>1$ԡz_yrrB: 0jHEgRXD*Zg 6pٺJ(.jdm‰yb7-G?  et Pi%e"9IGfذmJm |E2`8Ffe u"\Ү y4qxߘ$1cD9؀ PH:S).i83 ARvׁ>!ʼnJq"TXD5VaEe$1q8y YT4shXHҒeT.}h؎h:H?x/i\HHHL:ruQkѤqn82h?5zi$}Y`@Dl3M"@:=E_u. &z +iר]|]vHaMD$&G% Z='!kE%VsKòQ @!Ө/RjIHfBRu,ר1b4$fʎHd Gs"Arqp!ed5ĕVYSG784 `tW.Z=RDs!xhC2qm!Qt A]Rw^H0hðTZ.>h $lҪ ^9z%QYToMv#Ę9Y4K YC.]]yB>eCXU R6 LҨR8P2vq%횕 Tm2vZUȘEDGɣcR5BZUeURJF }0W E 2K#R)*&@jEDÈU2h3!q@@,"B7:r> A72ZO yc.>}HO.8Q3(N0' <d T!E1ώ2v ߑ<驝0̿t.q'@w d(.ĤF5xv4KFG9QҔ9f + )+|_JNMM]xmSum\p.ś|݃ J1, Ahyl$E{"EgP 5b}ʮ5hq4$$=@ x_.U`􏳯D@?>~5ϑ4DtN?G HPuW..#)*${4e&G% ]'2VzK@!}G# HS"a-iݸqOAx#\.]|xG.E?0$@vhDž-_WOH#>HTN$>mI^P[=z!.?K̜XTp!A?|=}~|ȼ i]^w]D2@ "Ni$$A:bRwBWw~"1 >}4AGM4@1 In<?=F)v)i۸i;bj!or.StO\| CTɅnߋ HG׵:݃B}tmn^UHf5isM+E{pe_⿸ :j'=VW|ş=!.>/&I4#?xy&#@@@0QQ @(i',EEzej煭4aɣȘS<RQ .s> \\JFMLLؘUH< iaaO zy~Ef.>]KE5:wOx< Пc<HH$kz.4Vs =KxDe>*dn<{J@<** qu0heÅUNKw_f\,455h{{*eH8Lc; I|Ɂqe좯/s"Z.߶nOA7L$ H̄\d@xEe.R*~=|6,..^xMӧ C!1~*tݞc 8H*gT(< (Jo]駹Q= l~~>{| )2LjVwa lk"$*X|8S~p`Q.,7=C)ihȎ`vXJ҇]nJa}p2˱t?'sؽHó{Kci "N BDoywܝgMΐI,=cD.$J]V 4T*q_꾼Be~ļ]bšp\?!Rvqj̍4 tZmg9 I 2[YeʿѤ! %5WɔJMcbqq.>v߳P(=}zqޮIfMy 0SQ. H6VzV;W+hr[yf32@h,ׯ?Yvq<~T2RI %>dIb^r6g1Ji7Kwvvn Ǐ۝;wb]J!~Ш|kD$͏>9:OZq!߳ u:VgDɢޠ q$֯Ir4Ҡ Ie# RI.f$͙tVWs,DWR):QnGRTGFω,#h4/" k’1gdww;^Ύ$C# m!˼v,*`r-N9qzk4I'Qo2P! Iem=!LNN'NJɏ=rL ʿvI:KDkH@@Ns5+gW.=GF#VO!.cg`h00?277q߫T*Caa=yH`PD ts\F#W5xS/Hwݬ H㤡gH@Ǎ&OH;u oXI=k$"6ύtt@A@Vi& Efr1z"R/x0e\3T }qAKF;0uommz"A)" Hb 3@Jŕ|/*ʼnJykO)wp`蔏9h9)zo31 sdnnjjn$,HCO9  Z|=Z.W @q=j$Vy%)@giT%A0bӧO?q߫V+ћ3\p~hidq0 "<+eg1cֺ &T,7gk#h˿nQrpȩ*iT^p޽{Vp?/2,k<*czBR*X A1R3$sTR3R1P2vVWW377W螞֜HJHtqEt@VnQԊԬ5^<1}LZI8o4G%* ;T4 BZq1C*`ДJY=|D>okƢ~{\-*xy%.@&vzzZ~2t+K1 Q9Y34! @ׯ *UD$Q`<|paa333q۳Ǐe_2 Y‘Jڽl^S2@?o&E{LjT֮4|Bi;ݡr }ȱz<7y˗?ezzz7;;;FF. ]n(fU :FNfn^=mgD`/p{Di.8  ._ooo#"*=.>J*RuOq]5J 9rFT4j,YI$mB1wH@BH_T&EUI{_]]-m}idb⿓Tr"ż̹ IP]uR{fލnUGF+{K Qv,`tɘOkz%"iyo)Rj/0/ `$`ЬoQW+~!D)S @Hf^Ġ @ޢGLt${L隆0;X4lX!JK.}իWP(\JYR!YÁiGzx%%0;4@; uu޿z7JhA)r D\*c7F* mJǏڵkxjjRtxxho񆝞2DN9;.%C{kDI;ZہqFe|n&,CUcbЄ+{$8$ˉm;&\5ODbBRލ7>}qqxXDN.>F*I7+iGJЁj/ĕk~LhzݼG,8ry7@o-A҄pt %D$&!?;?-i2v߷m.>[ ;O"m>0T;0@4+/@fF}мfqozz! $D#5Ҍ/"H,HTS*v?~[nwnnBoµZ@*x=txƼ< v"dVbieS>hH-r_c@ DO~yODHr!ݻwh]8 o;FQG%nxÉC4#׃uP!wJA,sbLnCa|-0/߾}ϹsnCLE?.=Ե㲋\LH 4@/i}vhZ7Ozģ2i6Ri 腄RtkW͛?;99{r /ғ'OHT럺.̑*gWҾ\D?%c']+"6C^f)rɑ2*wH59HRך"ZW6Ѝz&I@*dM4>S*& 3J%V,BEZ*UICL}V,Ǔ-йcOH|ɿy= ڹ ?q?W~ݔj2f@*_W =?NhŮQ3-,Xv( T*s߯(B𩇇_\.|DIg~q.ϑ$^i"-[.*ew<Fu!H qOT4j2j$DEZ jp 004>H.p\MJ]:2OTҸt‡<رI;or>?zpܶ,+]@BHQ"}ka,R4 8_ݻweoopv >6=Ve)çd$Ga}m6ɩ.үKH0-Æs5VzS兑}ӣ@ed_tF C@ )xBYzѣGHZ%ĪIj>.?|cm<{n_S[, \VV22eyw.x`n N_GCDS0l入[ ̂LV ⑀($6lYTFew0^}gtYa1)^&2GE4̊ pȹ deNn $jYT3[?QD{VHw -f`.%(~\Ld/6}D E2m e  ON,$BRfb;յhNZ8ld*ko93jd)Ô? :rrϥxÿuN9U`]3nK@D v/s5gQo47S  @{pؤ ` ӐrtuYJhh8 Z q9 );f^8{>φPH@#e!yn%pX\,xÆǛѕĢxQ^òrȵ} 3@Q[7B7ZHCBp56&LqQn%KHCCLX7rcJ Fa6ukeުV?EVsn4cKRMvwE^?r`tYiZBjo$$j r>g?1]G{(0q\ElqŪzHh^ڿGKoVeihԮ%r1 V-+Jj]nv2;) vDZ=$  Gc'Ρ (>3?%YYIDcԚ]+a懒c8k gxmζ.gc?RMZQ 1n 5 2, ;XwWGt ,>y6u#Iڰ'}e=08 &I R$%ބN.hPxH fU ɶ6L6oHh'(}hg! Qǣ*t 8|]$oUCY f]%}=,ax>?]qZ)0"뺷y1b":wAF-$V۬ ^s=F򓔒L,..&!(,>eGKg&s}ru7@Su( Lx;n F ? zHjxK[Ưu^- k"Yphbqgܺnx0B`M]TSG[$2p+A/9.tҝܹ{vݵ7F3f ցd@@V Hc"`)ytv aw 귣vذc4P-mמ9[݆߰T3N Jfe) 8[?*eυ6vӢBoCC@XF4KA7Pk[t޹yp 2DYܼ?Ve_$ >fNH)(3KIfeA)Eqh8kؚ:>kc|.VrvLm# #`)]%V uo,5j@c7~#9w7z3|Ec\fe^=DVْSd ,$c)}4GPX7$eEYH f])]\c# tsl$Y~;TQ=sn HB(tZANLb pzbg8^5-,$is놅CvX~w5,:wwy|T I.53E<cُnQdMDl ɦ;m]6Rά,(gzkyȏ`flR5cM[D#8-FE\C9oV\ιxt}O\gH<dHpqUu-w ţXPJFHUPʉI%!  t }]F` ]ZmP C@樽1Bh-~7j_Y Ƴ n5rf 慢&HqVұ̚ J]깐X0=uuMRH LsX00=儢8g&sscKg Q a::цtEP7]Fk;mHx߸k@l XwH>Φ5 ^JB"4+eBxtOI<hl2muˏBR7v:n~!"I#uc "-g mfZ]&o}+[%,r%˻D$zfE!\=8|##Y.CcG<;%ϸnUMee@gn|Q&2\q x|my{'&MbiBQ-rv ch`v`<FDsǧ #Q-۷ YZԡoCw $NFFviԓQvد%'>ʂ;ĂM"ѭ瞺8kQ H91)I%^ -4I1oJHq# GQ(JD$K{nhq`Hoႀ=C'2-5-@nM/1i?"[2Fd=@a53MeڳT'"6ƎEB?>k*t nX%Gw56(h(Kst D(,XeM+kn-s҆Djji~`yQ* E#w9Q L,ŷt/kem,K[I0|G7Gn us(!IZH\h!X޵ʲ dÍuʄf'Ʀ,mI4(+=%A)qݦI=^$$m\Ql[v.+thG 4 Ѕw:yqn%B˸Ubڰ@Bzn*MU# Dс(6lbA)az7fp9 NNSu9(eaw&vl}f!a_gh#cʉCMd(+3[/AXHu Gd!~>JG$)o죜}],!$4hNw]C@X=48λՈP K<|o0@iʊ>~3_ϖ;iKQ]Q+\R⑿B!(%09&控D:(ʞRIAsoXI*_ܘ~$|R0,1ZrkVe*)8[]Ȣ[;7܉;@4TQxţa0!m]ʾ#1?ƷGaōRvA9"йkX=ݸ KtGиZHvX9[vk"⾻DaҴD3],mX8ڶ0ƒԋ~4xD)hDll]פu0/ i1`e-閑Ew`5r٭)%yr,%k:g ֳ,M]#myt~R/nImhd O*(ea<[V}4fBu6 gs  ru;\t+,?Z33lT! 3B'%)x{6)e^rF)Xb1;mюsF( WE翌tou BV£6T ~4!,$Ɓ;` >G}V}F3xx>TIu 0'|apŒY^TJ H9Q)xfAj2ޣ|8s*B}3KQl'u2ocLj~* ɿ_I8"; Vq]z.(U7'HR9lܽ^:h2l3]8I{kn7QL?١UN [Uȣ:_^ZNNejN|<%$bf!#oyţϿ. m"7fn$I(VD̺0`Y ܩy՝Dq[n֨XE*1 RH'-fn9Dnz[l$]J4 G8Uj}|j#xP /6afR/*L9(}j}7iu}]}ՉG[G|@7,/yYy$GUBVv_r*x..pŭUI"6Zb[R'.-t|6P%T' mFN  WhiK߸:RRGa-$"ģ\R,h.w((}%:٢ݼHD 4$XmZ75 7>wH/ ŋrt\ 8XJ^, H씲8(}ԏK0R.(qhGKg!!$,hwc} $uC6(6k"BzakvZeWB"]pU!~] 2xrIm( FJPw:5^)@#; V\ݡ8(M5$y HuQi;t80#:-;b"&]cW[o*(!KZg.T #gu>8#m䅣PD BdXX t8% 2-Y#dG]JvfdhJa,`s:΢$ce,cԯ%Ī%jk 8d6iO˼sz(HqpmF5B,#ÚRM,G^ R֑Q.e_l>i&>^@|XO4'P-\;  9f5v&#oaf!Bz7vRXb,}=q&ಮӮTQGd4E@ uÚ18[%ɶQ.XZu8tXO4+ehؽ:U%Ӫ UPB>?cq^">zS0tndgOle[,~l#w#`hb]glF)CMo$GGV>¾v_k=OwtBsd!:kw] -P*1Vebi5b[XD K|0ec|`k] -r}I4v2[7[a'>ţTcKי碱zk\cαn,nn8ZQe6ܸ,ާҰNrqa`ɮخ.=r_&\{hKuuQߍ4udYsѨHPe7,-b=t)`̂\OʼnIż(IcHrcwh ZHj]7zЍ{6y G@"=oݱ3a~םtD7Z_Mͮ{Xg}l55`~t|x:RYH8MwJOZYH"@u]}H鳏b\Qi%2 C>cp4=7n^+`UHHYڷټgTG醥$%x͎2k&k$mZR/@ufXnku]Q:`ޓaa\<^_kC7Ql>ch=[ܠ[60~mYY[B|pgcA(F껉 n}`k&[8+V^9s. )Oc:/)hQ}Nn !ŎaóHm4kXt_ 閛XctŪW% P]zUqg!`,ױ;ѵkwXmˋHAρppssu]<XE#7z;TQ}]*Ɍ#ކgXG:ќͨ]p 6ޱF!ufƮ[  Z%"[M(BC349OQ6vqR/hg3CLc8s 79Ժ.nxwc E &Qξ.WgkG0a3HAe1T6v\y[UoD, JUġ-iR(⑂Z޳WYD; 3 H^DHA٤]rH 8t1Dt53;?e}TRGa}u ǜG#ј/ABBuӜwK#D7V\tH+/"m-Me!U6Ţ񭠅䅪8 `qbrV908>Ba Fa֑7qMX<:t8(e_dhbCFD٢}4ko ?&V(!mAV.R,ApN\Ml[:ワ0 FaR|Q4r$X&2=YU)˸RQʂnMvB(} QGY:q9 u}uF;e75淺&>wk܇VHgP.ϯ6o [ >A}P .dtU|Cw?ece!j! ò uv̼gr.=Je Cq,gEl*(}Է \ G0#^@ڦ+fh3\Cd]WccAecխqUI;P֨_*v/B>v̍IENDB`images-actives-html5.git/src/share/themes/popBlue/img/unlock-icon.png000066400000000000000000000027371250410645000260650ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs  tIME PYlIDATX͙MlTUδ}W@hmB"q1@pB|$b\;\3*4q&4AP"ĝPBCD0kZδvyseSս7ss=3 Sjl6y /+D!:C} @:L<M$e>b 8Wk)97e5;ùSZs<|`y5ɝ~uN/djä ̓U`94ɡ]/tmc$%%^3$iL;7qBy ە^Hp.?*hk!7j^*DS4tv2OK)>,/;*+෿Fi#>z$]+/\f4%i(&LrwjCg1gゥұJ9= @B[_A&`&[FNI UKt YS9>7Xz\"$RD 6fS&~4rq^XYi* 28O"u>WPZ{80n~%.U_ |ɦc( ڊ/?#M%ٶMEi)xfs_'eְD^D(Qt32mYsF6̩2Z[S\ *bvQԄx1Sr)x_8۾ ,IDiZ78 \E uYSmP|ܴ ejj5Dz:: ̦M=7J$$i6׀Kt# VM`..Pd ?``A>}x; c8pL7٤Sx?Xd>(Pȋpf Jhqat\F)R1CбÝFrR.c@x4+jo ( Ms$B;% )_VLqJD MVCrF#҇JFWP@XFSYĻZ1HvT9}h ~BI t;{B/2+]?:CVg:4o^g]1eH d}!52~=NVz}!P3oXE/*U^g <3ѼEh%h%6**_zH$"F,ОO`o4.cW sd(3"r*)GP8}Eӏphb;~0c@~ ƎoNy܃O:mk{qT⩪S*C{.uW/;icgUV:)As7nxsF/@hbPiWSG7<,(M/rOCHÄٙطiιY (?L2[RC9JQ2f|.g~&ZaǜEv4#׫ bR?Ld }tUt;72{{mA 0RhCi%u׬[]v!5bʹ{[ݔ[D5+ 3Anlu/s$(yU~4E,fɍ뉴48j=%Sx~8 ۰N X9( ͣC泤Gj8kLN;Bw#uն}`eakffՖ̎7ۋt fmW`5a}$Ny4Z_H;8HA)LC؁uPF˯wzg5PJQ2Df|VsTի:]o&ڀ(q '_-Np007&TbX |'^\yA{,B!=~uӻuަ{Ë4^$zSr<520^vc/ ]Oe[J_)e,.-{FQ o,C5>ƶd`Xi@S((R4#]iPH/t00lF[wҶ)y*}xU ]_A%p!ʔTg~N#-`˃Ξ'2nj|㔆l#Tʪ$/UVwz!ס(=rsSTBjh":^{]ް53uS:oM`'z@ JmģL:3ԯiF [ﺄHQ7r2vXXcv#Ic>r<ӨW:+KkŖ.ŌGRJ|po)oU-)}yKKۭ)`>K&f)O4^|+S @m7ߏ.JD"R/O 8颱uW}_Es&M}x8=9jIdzoұV_|N% d)YrtSK ˾ j Ȉ=وg~ʎZh=U LYrcM4? uU6^'ιj/pi8DP ~0k#HЧ KC婟ϯ5 <}Heq#Ys)RIE?D+(aP0u.Yo2[{dG/07+wCv(E˙[ ǎ`Ɛpk@Jkn^Vᩘj26B\ ̡LS0ReHF9M*]b]t,If">nd`{ )>xʎ9 ǝpyB, J|augUT=#1Jezhޡ$*S YɇQ?ҹ'[c JP8{c9`॔9ֿ- .$Lhv7D{1k#ft+^ZA^@ټ襕6iN 0< [# F*.@/{"ī}RZ.v0PD8PP}9HNl:[Wsn'> k">Y,b8>nf<N>`}۽{:$=;-fJ, \\C %@:+51ÈӪF }8c _k\F_*)0cD#p+t8I+2 #Ư%' D22(ׇJ>" KYd$cO:cfQ kD9[쯏: )y:aQV* E@ֱWI <m Q@ ,G`Bwc Zk6ny" lŹ4AGcflL=8/LŋcU`M9j {&m:3/Q>urIENDB`images-actives-html5.git/src/share/themes/popBlue/img/xia128.png000066400000000000000000000130631250410645000246520ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs  tIME  $1XIDATxytՕo7yǖm"`08 LBd0p8ä-8!4K& $ Ɓ !Ѕ mUꪚ?ȲdIUBI)}nC@‘(ty<0 L2Hh0՚~1f4UgB.9b`)P!5+g4U1DqTـ \9]ܧʺa$O*˧j*5Ӏ`%p*[/.l 5U1@)6:p$z$ex@GX;Oٹ-H4ǜ mt'Wp$S{N.}qHa‘hVr۪_Jђl GiD |  < 9њ(AJ媷.J?p9KM? !cHTByKS9H B@50ٛJB`~!.MU&yVةB;QٓB94D_q+!$9 *`[@F\SOa;6_mc#An?B䎝@AHJ4Uil_h툲!̻L? AA;/fGo;a)?_-֍'Jɀox+VĮo԰$S*8܋dBD)Ñ:`'`MSd0x!$G_ 4Llǻ#atXDqJ`!pg~!^Hb'4H G!%P<qWA.{]DtsRHA,tˮ TKݿDW F.Lz`33q0>k‘9vf4 |Gd_x@@UJ%?Q!>w)nw5~!lL ūÑM@>2zg(3R?`20ɟh<٬Ҋ!aÑYs~Կ ^,=f*CHtj~{wlޔS`B8ߗ8^'7VS3Pɟ:!IIFH2$x/- Pӱ ;)ĆOu*f"!W?PHBdHtiaV$B_a_v?~dCG޹a`]!):O'obaU{SʔjNj=74u(;k1g-!wbVa Ț}z]e 䔑d<˖A Ӹᯘmej N` (9`;Q!z:3#d4o7NA{KLoh|U֐5r"e\NI"f2k~מn:7/d S4Ui>!h޺m-u2/T-opdkxz4ɟv>`M˘ʧ2})~jLFw8N7s[hs*O+%gl%in#m2v?yTߧL?)ׯDo4U'q?R;W8iE yEdh=B-dCׄILtW!u (=Oޞ"Ulh,b1^hoI狃@BNE[|D 0:Y ٿyNUwp!a3!s7D>g0NJYK0 cH`:O) 4b rQ 5iKφ#QKX fދhx71 qBr$TVA**fLӠCi޶ï=E~O Vr'bvS/!a_Q2%\Ϧ;> S 17PT5`A)F">pS&$`-ЫOP\#ǬKП6_o> 1|-#f_ocL#J)|+| !;o0zJ霋i!@OBYD8Rt<&^}?|!lM`ZRQ^gNewz|KCyklǖ KKν 9a"+h^W,9i$ӸjYN3P.ABe㆔ ';&3LY>\EZk>gU6_tb_C!CotEIr %xmM[n%ZB}q/z[8v?I: c~ 5]\“灞+ӸᕮDH2$Տ#Ax%Իƒ쑓͎vYfn wIN:s.=K@ f%`7CC7Td!ɟvQ FG;"p4ر=Kߺ(Kx*bgvh]#w-'t@l{~'$ aqIֽzk:94IS^sv4;۶(_ f;~)7Cج򉘺Em-eRx|0ts1 dSQWuMU:: R `rvg[V;ydZO+h&dę6y p2n 9zܱvoI Y󜞔%}opۙw ;T!2)Ŵo=5\Le K6#Qnr$#*(RSR5c*uV'>ޑ3DV#PXwMHEQ@*g`IՏM^- >FlNK%C;IW`k2Oei8RK >L1r5 aQ_7=ӣ2:ȝX=t6X$4U&g -w&g^ C C||`/^ p9Yf}_ACEBƒt qiۨ珎H%1bŞ)Lu}n:X-L ZAѶirqvQt>W9o {V-O/eGvBi5иlllz#Y}z~G3=iN"ف-?y[rsv۷YhIOh*x+#\TG.4|)cl{!v3J!|TMe=o |)Z*[^vB8BHlJ8#ֿvu\Te3Иi-0vɭI3:|"!ŅDl":uo?&Q4UWJs^@qxAeZ vVd)zkSJ 9~N=HhC\'8Oh?ਃ?M?XZ>SAҬY 5v?q+z1iS#1kZ7>?/ޞz s]&np¿\I=vƀ`($x-5'.dcc&\6X;C{`A\H>$jݏlzrPe* #h5Ҽ-j׮J41g1Knu/T帝`Dn4o%MGDsO`)Pwi‘J 5eeCr4t.s.sO>~MU2^S1 _Y>&eg_BzaO=1nR|*. nYϚUԬ/߃_z%T|nV~ظzExxLJϾIK t6^^|Tځ~' cC|r ];!gLʠ *4Ht!g&-?ʿ{r7|Sk{_U𿨩>hk{1Lf3ɅU?+Py3HlWSՃQj4U!N, D͚Խ:9*. 9^TNLB$LjrC{}k/gSX9BS"v7֍/"@70|v j׮ -L\۴u9iR~ν1'SZ |&AB;b]qj\+HVvlgdZTz숉܄ 亅ΤAd^>ɹ8zU+=|SH߉38e;љ4*AG A J0ִ WL⬮B iԃ,Y#T4Ak0V )}8IekqﰭtV$YxثGi$0K[m0#HZ)f_t%o#7+Ŏ:ĆRr@l;BxJ{)E)E|l_c bI~ {rpŕ@ΎT)_XkG*[2OYFJ?E/T#2*;ܻ*%_=^;b%#fs. B;iNC b%IENDB`images-actives-html5.git/src/share/themes/popBlue/img/xia32.png000066400000000000000000000026111250410645000245610ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME  %,t٧IDATXí[lTUVJ[Jkm("3E^|A}P%j"!@A@$A0DoC,Ԋ/d Z CCzkgkmAx.8v xpn66r4`?h0K`_q&dܩNb"o6lx+S6D6,3t&*P &iWZӶ{5CO=@Ur9d/MKۧ矦{[n8@|nuD'yN ]n)Hm͚8]+{0"\quϛ֢B;5=*[ v{dmV}`opZR2pWc'2jlP-6uK5fgQ,. z!Lf:֊X1s ts/MJ1j,fn:tA]f`48z=dsBR# U0kp(f!ZѶw} !2")度17,\<<{wLWR193K49ڛCJtJӨrk$Xca2xM# bγ(-/v[K'l%p*7EdRƬ-تj3! x۹{$ z9b hm)TralE-UՎ|ұUNV5#H(Ak ī\q*7Z# 3q&,~5z*D텈mci)σԭCelAZlINr!s-*Bz8@ٜExx?l"T8PfhDCar$H3c<3B@]g}df̼C2PhvBHSc&,BJsK}ܟ4,t*4»O&MS4k):pQ>_4B2ǒ؏bPkY=@T-YE`**}tcQIVC~9hV $ֱmƌT8aA`QF\W")q MɃoO>ӱ"e+>$#Vmz\=]u_%q:#kHz7׬)s hM'=,!a.ܓ4qO_w]B-8x)ٚy{L2C@zzAcN|p7 z`|q: & F'269q7WH|IENDB`images-actives-html5.git/src/share/themes/popBlue/img/xia48.png000066400000000000000000000046531250410645000246000ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs  tIME  %c2Y 8IDATh޽{pT?{ $( >u/[NmZ+/-UUhgtth`ŬvU¡juPƺEPcdMqMf z{!LCONFn}]U`/1 =Z跋1q`l@04X\,]Exl7 }/%(!ss]>v5 +{J =`=~b5`(< ,拱6`iDB`h+@x|(rK`* Cbԟ20u e"FϒwS_@E|,5wй`:qٱ(O lCBUiA Ν ֚ЄJsRС0x EU,LL&`th<΁}e $+(h>mM&d jv@ځu"mA G@ړe&/c)>gg%D<9 ݟw%q'B!S @04f-lٸ[BTnӁ`nifRNa$ؿnv|qLU"j*鳩MkAUǀLC՜ 9؍V᧼i>V,R慎|;bќ+q#H !ڵw^@ ~b}!v|8ZpY8zoo}ȵ Ji̺^E1(EE ogI_xtPELC?U@GW||vz۞GQS)- OM= K䯢ʱ"aȎ-XN`E3i^u?)H(=QO ? x΁m9v G(J.ȳ-9^K|M4`iEϡ/XFI UϠEAJbG:߽sWT>=̽ys1,=WEhďv1[@?k̸.ʦFZBN xBH<3,souZYmYH˚NUs;snڄnvb$i#m ;>Bܳ8i͓~7-ihU9W߰Ky(kB=7;ŎdW{oбG?v#=bې>x) u<B #?v#cEBn&_£<=s͵BR03y"áG'A2sࡌ6EA G_J;3e,Wlr޶7hUS@ ߕY 9&H!0Id2Ar ^䳗?{:_^H~1 'pw 1ʇgfFB\U";> -9o&(h*m境мz519y %;_r%vb$߷:MCo;MpЙn2NuAt}J51ijur~ԅbp0>V臻GRE@㞯oh]AyN= Пξrl, w޶H{@[(P<^j~V㩝6^eNLC7?π0 ]:AlpFۮfDgD;? `htI! q`io&eRNupy9k"zLCk!&g5/>.4 x@@x?4'rm҃+OO3Q^H B!Mn _9c"RUIWnN@g3Ҩ0 t3|B IENDB`images-actives-html5.git/src/share/themes/popBlue/img/xia64.png000066400000000000000000000054251250410645000245740ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs  tIME  %HC IDATx͛{t?wf7@L$1Y W COe@ Le]Sh BQgc@Gf݇뗱g+avf+;T{{ϼhXoca/f$i+I_Ͷ&>;E0K ˒3'W|s=U>7({/)':Og v [MYI;) s39m;Ɯ$s|ӓU'EEEƢ4}ʧ~ j^Qfڔ.g$co߬xCKm,$8#@(iXɡ(Urc&#XQrPr>|v߄A #ޱ]՚.a&d';>&ϢlTP +B ({|8Ҳ}%].F!ޮ|{b~>K)i? +tr#߆Rgm$܌URJZF G:+*KˢF{ ˴'AO8L wryE>AdFx9%q jKPȯz@0SI/7԰뉵5j~1#au,/gKCVZ46}tQr ц j&R"Dh% 8)9yǘ?jip I)L)>?o_ֹn \жk)՝3#H+&K '?>ط - . ?m+Wm{mwF3EnŻ7p}mEF;6㳹㉵E*BUib}uRI :?6dEq_clfvk>x* s܀P2bE5S>ce4o^a?OYohӢՍ@"݀`9:hH?~coWE | {9{k'ǒyBвy;鬟)Rwrd Nееn$%#qw;LhCi2rNSyJa`d7u+/e-!3G5lF  x ;6HeRT3!,rznkOZQCVb5p=}Fե;A&gfNN,j`U-_ ZŹ+yT^>3.>׮2tmr½N!=/W~V4o7m;7mkN.+k(:>u+NDgڥ9ta 0&|~/&ڴ3ҎPT|}V$2C$C.srg}. w:Cfxza!~st ]{){CP| =MI봫 d[ ](*t|; ];㐛w /x*Xn4:tk7eQf`^]Ӽ {{TITLE}}

xia

{{LOADING}}

{{datasJS}} images-actives-html5.git/src/share/themes/popBlue/js/000077500000000000000000000000001250410645000227655ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/popBlue/js/hooks.js000066400000000000000000000130611250410645000244470ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @constructor init specific hooks */ function hooks() { "use strict"; } /* * @param array layers * @param iaScene mainScene */ hooks.prototype.beforeMainConstructor = function(mainScene, layers) { }; /* * @param iaScene mainScene * @param array layers */ hooks.prototype.afterMainConstructor = function(mainScene, layers) { // some stuff to manage popin windows var viewportHeight = $(window).height(); var button_click = function() { var target = $(this).data("target"); if ($("#response_" + target).is(":hidden")) { if ($(this).data("password")) { $("#form_" + target).toggle(); $("#form_" + target + " input[type=text]").val(""); $("#form_" + target + " input[type=text]").focus(); } else { $("#response_" + target).toggle(); } } else { if ($(this).data("password")) { $("#response_" + target).html($("#response_" + target).data("encrypted_content")); } $("#response_" + target).toggle(); } }; var unlock_input = function(e) { e.preventDefault(); var entered_password = $(this).parent().children("input[type=text]").val(); var sha1Digest= new createJs(true); sha1Digest.update(entered_password.encode()); var hash = sha1Digest.digest(); if (hash == $(this).data("password")) { var target = $(this).data("target"); var encrypted_content = $("#response_" + target).html(); $("#response_" + target).data("encrypted_content", encrypted_content); $("#response_" + target).html(XORCipher.decode(entered_password, encrypted_content).decode()); $("#response_" + target).show(); $("#form_" + target).hide(); $(".button").off("click"); $(".button").on("click", button_click); $(".unlock input[type=submit]").off("click"); $(".unlock input[type=submit]").on("click", unlock_input); } }; $(".button").on("click", button_click); $(".unlock input[type=submit]").on("click", unlock_input); $(".meta-doc").on("click", function(){ $("#content").show(); $("#general").show(); var general_border = $("#general").css("border-top-width").substr(0,$("#general").css("border-top-width").length - 2); var general_offset = $("#general").offset(); var content_offset = $("#content").offset(); $("#general").css({'max-height':(viewportHeight - general_offset.top - content_offset.top - 2 * general_border)}); }); $(".overlay").hide(); $(".infos").on("click", function(){ $("#rights").show(); }); $("#popup_close").on("click", function(){ $("#rights").hide(); }); $(".article_close").on("click", function(){ $(this).parent().hide(); $("#content").hide(); $(this).parent().children("audio").each(function(){ $(this)[0].pause(); }); $(this).parent().children("video").each(function(){ $(this)[0].pause(); }); }); document.addEventListener("click", function(ev){ if (mainScene.noPropagation) { mainScene.noPropagation = false; } else { if (mainScene.zoomActive === 1) { if ((mainScene.element !== 0) && (typeof(mainScene.element) !== 'undefined')) { mainScene.element.kineticElement[0].fire("click"); } } else if (mainScene.cursorState.indexOf("ZoomIn.cur") !== -1) { document.body.style.cursor = "default"; mainScene.cursorState = "default"; mainScene.element.kineticElement[0].fire("mouseleave"); } } }); }; /* * * */ hooks.prototype.afterIaObjectConstructor = function(iaScene, idText, detail, iaObject) { }; /* * * */ hooks.prototype.afterIaObjectFocus = function(iaScene, idText, iaObject) { }; /* * * */ hooks.prototype.afterIaObjectZoom = function(iaScene, idText, iaObject) { if ($('#' + idText).data("state") != "void") { var viewportHeight = $(window).height(); $("#content").show(); $('#' + idText).show(); $('#' + idText + " audio").each(function(){ if ($(this).data("state") === "autostart") { $(this)[0].play(); } }); var article_border = $('#' + idText).css("border-top-width").substr(0,$('#' + idText).css("border-top-width").length - 2); var article_offset = $('#' + idText).offset(); var content_offset = $("#content").offset(); $('#' + idText).css({'max-height':(viewportHeight - article_offset.top - content_offset.top - 2 * article_border)}); } }; images-actives-html5.git/src/share/themes/popBlue/js/iaobject.js000066400000000000000000000667361250410645000251250ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @param {type} imageObj * @param {type} detail * @param {type} layer * @param {type} idText * @param {type} baseImage * @param {type} iaScene * @param {type} backgroundCache_layer * @constructor create image active object */ function IaObject(params) { "use strict"; var that = this; this.path = []; this.title = []; this.kineticElement = []; this.backgroundImage = []; this.backgroundImageOwnScaleX = []; this.backgroundImageOwnScaleY = []; this.persistent = []; this.originalX = []; this.originalY = []; this.options = []; this.stroke = []; this.strokeWidth = []; this.tween = []; this.agrandissement = 0; this.zoomActive = 0; this.minX = 10000; this.minY = 10000; this.maxX = -10000; this.maxY = -10000; this.tween_group = 0; this.group = 0; this.layer = params.layer; this.background_layer = params.background_layer; this.backgroundCache_layer = params.backgroundCache_layer; this.imageObj = params.imageObj; this.idText = params.idText; this.myhooks = params.myhooks; this.zoomLayer = params.zoomLayer; // Create kineticElements and include them in a group that.group = new Kinetic.Group(); that.layer.add(that.group); if (typeof(params.detail.path) !== 'undefined') { that.includePath(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.image) !== 'undefined') { that.includeImage(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.group) !== 'undefined') { for (var i in params.detail.group) { if (typeof(params.detail.group[i].path) !== 'undefined') { that.includePath(params.detail.group[i], i, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.group[i].image) !== 'undefined') { that.includeImage(params.detail.group[i], i, that, params.iaScene, params.baseImage, params.idText); } } that.definePathBoxSize(params.detail, that); } else { console.log(params.detail); } this.defineTweens(this, params.iaScene); this.myhooks.afterIaObjectConstructor(params.iaScene, params.idText, params.detail, this); } /* * * @param {type} detail * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includeImage = function(detail, i, that, iaScene, baseImage, idText) { that.defineImageBoxSize(detail, that); var rasterObj = new Image(); rasterObj.src = detail.image; that.title[i] = detail.title; that.backgroundImage[i] = rasterObj; that.kineticElement[i] = new Kinetic.Image({ name: detail.title, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, width: detail.width, height: detail.height, scale: {x:iaScene.coeff,y:iaScene.coeff} }); rasterObj.onload = function() { that.backgroundImageOwnScaleX[i] = iaScene.scale * detail.width / this.width; that.backgroundImageOwnScaleY[i] = iaScene.scale * detail.height / this.height; var zoomable = true; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#000000")) { zoomable = false; } if ((typeof(detail.options) !== 'undefined')) { that.options[i] = detail.options; } if ((typeof(detail.stroke) !== 'undefined') && (detail.stroke != 'none')) { that.stroke[i] = detail.stroke; } else { that.stroke[i] = 'rgba(0, 0, 0, 0)'; } if ((typeof(detail.strokewidth) !== 'undefined')) { that.strokeWidth[i] = detail.strokewidth; } else { that.strokeWidth[i] = '0'; } that.persistent[i] = "off-image"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#ffffff")) { that.persistent[i] = "onImage"; that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); zoomable = false; } that.group.add(that.kineticElement[i]); that.addEventsManagement(i,zoomable, that, iaScene, baseImage, idText); // define hit area excluding transparent pixels // ============================================================= var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min(parseFloat(detail.maxX) - parseFloat(detail.minX), Math.floor(parseFloat(iaScene.originalWidth) * 1))); var cropHeight = (Math.min(parseFloat(detail.maxY) - parseFloat(detail.minY), Math.floor(parseFloat(iaScene.originalHeight) * 1))); if (cropX + cropWidth > iaScene.originalWidth * 1) { cropWidth = iaScene.originalWidth * 1 - cropX * 1; } if (cropY * 1 + cropHeight > iaScene.originalHeight * 1) { cropHeight = iaScene.originalHeight * 1 - cropY * 1; } var hitCanvas = that.layer.getHitCanvas(); iaScene.completeImage = hitCanvas.getContext().getImageData(0,0,Math.floor(hitCanvas.width),Math.floor(hitCanvas.height)); var canvas_source = document.createElement('canvas'); canvas_source.setAttribute('width', cropWidth * iaScene.coeff); canvas_source.setAttribute('height', cropHeight * iaScene.coeff); var context_source = canvas_source.getContext('2d'); context_source.drawImage(rasterObj,0,0, cropWidth * iaScene.coeff, cropHeight * iaScene.coeff); imageDataSource = context_source.getImageData(0, 0, cropWidth * iaScene.coeff, cropHeight * iaScene.coeff); len = imageDataSource.data.length; that.group.zoomActive = 0; (function(len, imageDataSource){ that.kineticElement[i].hitFunc(function(context) { if (iaScene.zoomActive == 0) { /*rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); //detach from the DOM var imageData = imageDataSource.data; // just replace scene colors by hit colors - alpha remains unchanged for(j = 0; j < len; j += 4) { imageData[j + 0] = rgbColorKey.r; imageData[j + 1] = rgbColorKey.g; imageData[j + 2] = rgbColorKey.b; // imageData[j + 3] = imageDataSource.data[j + 3]; } // reatach to the DOM imageDataSource.data = imageData; context.putImageData(imageDataSource, cropX * iaScene.coeff, cropY * iaScene.coeff); */ var imageData = imageDataSource.data; var imageDest = iaScene.completeImage.data; var position1 = 0; var position2 = 0; var maxWidth = Math.floor(cropWidth * iaScene.coeff); var maxHeight = Math.floor(cropHeight * iaScene.coeff); var startY = Math.floor(cropY * iaScene.coeff); var startX = Math.floor(cropX * iaScene.coeff); var hitCanvasWidth = Math.floor(that.layer.getHitCanvas().width); var rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); for(var varx = 0; varx < maxWidth; varx +=1) { for(var vary = 0; vary < maxHeight; vary +=1) { position1 = 4 * (vary * maxWidth + varx); position2 = 4 * ((vary + startY) * hitCanvasWidth + varx + startX); if (imageData[position1 + 3] > 100) { imageDest[position2 + 0] = rgbColorKey.r; imageDest[position2 + 1] = rgbColorKey.g; imageDest[position2 + 2] = rgbColorKey.b; imageDest[position2 + 3] = 255; } } } context.putImageData(iaScene.completeImage, 0, 0); } else { context.beginPath(); context.rect(0,0,this.width(),this.height()); context.closePath(); context.fillStrokeShape(this); } }); })(len, imageDataSource); /*that.kineticElement[i].sceneFunc(function(context) { var yo = that.layer.getHitCanvas().getContext().getImageData(0,0,iaScene.width, iaScene.height); context.putImageData(yo, 0,0); });*/ // ============================================================= that.group.draw(); }; }; /* * * @param {type} path * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includePath = function(detail, i, that, iaScene, baseImage, idText) { that.path[i] = detail.path; that.title[i] = detail.title; // if detail is out of background, hack maxX and maxY if (parseFloat(detail.maxX) < 0) detail.maxX = 1; if (parseFloat(detail.maxY) < 0) detail.maxY = 1; that.kineticElement[i] = new Kinetic.Path({ name: detail.title, data: detail.path, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, scale: {x:iaScene.coeff,y:iaScene.coeff}, fill: 'rgba(0, 0, 0, 0)' }); that.definePathBoxSize(detail, that); // crop background image to suit shape box that.cropCanvas = document.createElement('canvas'); that.cropCanvas.setAttribute('width', parseFloat(detail.maxX) - parseFloat(detail.minX)); that.cropCanvas.setAttribute('height', parseFloat(detail.maxY) - parseFloat(detail.minY)); var cropCtx = that.cropCanvas.getContext('2d'); var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min((parseFloat(detail.maxX) - cropX) * iaScene.scale, Math.floor(parseFloat(iaScene.originalWidth) * iaScene.scale))); var cropHeight = (Math.min((parseFloat(detail.maxY) - cropY) * iaScene.scale, Math.floor(parseFloat(iaScene.originalHeight) * iaScene.scale))); if (cropX * iaScene.scale + cropWidth > iaScene.originalWidth * iaScene.scale) { cropWidth = iaScene.originalWidth * iaScene.scale - cropX * iaScene.scale; } if (cropY * iaScene.scale + cropHeight > iaScene.originalHeight * iaScene.scale) { cropHeight = iaScene.originalHeight * iaScene.scale - cropY * iaScene.scale; } var posX = 0; var posY = 0; if (parseFloat(detail.minX) < 0) posX = parseFloat(detail.minX) * (-1); if (parseFloat(detail.minY) < 0) posY = parseFloat(detail.minY) * (-1); // bad workaround to avoid null dimensions if (cropWidth <= 0) cropWidth = 1; if (cropHeight <= 0) cropHeight = 1; cropCtx.drawImage( that.imageObj, cropX * iaScene.scale, cropY * iaScene.scale, cropWidth, cropHeight, posX, posY, cropWidth, cropHeight ); var dataUrl = that.cropCanvas.toDataURL(); delete that.cropCanvas; var cropedImage = new Image(); cropedImage.src = dataUrl; cropedImage.onload = function() { that.backgroundImage[i] = cropedImage; that.backgroundImageOwnScaleX[i] = 1; that.backgroundImageOwnScaleY[i] = 1; that.kineticElement[i].fillPatternRepeat('no-repeat'); that.kineticElement[i].fillPatternX(detail.minX); that.kineticElement[i].fillPatternY(detail.minY); }; var zoomable = true; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#000000")) { zoomable = false; } if ((typeof(detail.options) !== 'undefined')) { that.options[i] = detail.options; } if ((typeof(detail.stroke) !== 'undefined') && (detail.stroke != 'none')) { that.stroke[i] = detail.stroke; } else { that.stroke[i] = 'rgba(0, 0, 0, 0)'; } if ((typeof(detail.strokewidth) !== 'undefined')) { that.strokeWidth[i] = detail.strokewidth; } else { that.strokeWidth[i] = '0'; } that.persistent[i] = "off"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#ffffff")) { that.persistent[i] = "onPath"; that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); } that.addEventsManagement(i, zoomable, that, iaScene, baseImage, idText); that.group.add(that.kineticElement[i]); that.group.draw(); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.defineImageBoxSize = function(detail, that) { "use strict"; if (that.minX === -1) that.minX = (parseFloat(detail.x)); if (that.maxY === 10000) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); if (that.maxX === -1) that.maxX = (parseFloat(detail.x) + parseFloat(detail.width)); if (that.minY === 10000) that.minY = (parseFloat(detail.y)); if (parseFloat(detail.x) < that.minX) that.minX = parseFloat(detail.x); if (parseFloat(detail.x) + parseFloat(detail.width) > that.maxX) that.maxX = parseFloat(detail.x) + parseFloat(detail.width); if (parseFloat(detail.y) < that.minY) that.miny = parseFloat(detail.y); if (parseFloat(detail.y) + parseFloat(detail.height) > that.maxY) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.definePathBoxSize = function(detail, that) { "use strict"; if ( (typeof(detail.minX) !== 'undefined') && (typeof(detail.minY) !== 'undefined') && (typeof(detail.maxX) !== 'undefined') && (typeof(detail.maxY) !== 'undefined')) { that.minX = detail.minX; that.minY = detail.minY; that.maxX = detail.maxX; that.maxY = detail.maxY; } else { console.log('definePathBoxSize failure'); } }; /* * Define zoom rate and define tween effect for each group * @returns {undefined} */ IaObject.prototype.defineTweens = function(that, iaScene) { that.minX = that.minX * iaScene.coeff; that.minY = that.minY * iaScene.coeff; that.maxX = that.maxX * iaScene.coeff; that.maxY = that.maxY * iaScene.coeff; var largeur = that.maxX - that.minX; var hauteur = that.maxY - that.minY; that.agrandissement1 = (iaScene.height - iaScene.y) / hauteur; // beta that.agrandissement2 = iaScene.width / largeur; // alpha if (hauteur * that.agrandissement2 > iaScene.height) { that.agrandissement = that.agrandissement1; that.tweenX = (0 - (that.minX)) * that.agrandissement + (iaScene.width - largeur * that.agrandissement) / 2; that.tweenY = (0 - iaScene.y - (that.minY)) * that.agrandissement + iaScene.y; } else { that.agrandissement = that.agrandissement2; that.tweenX = (0 - (that.minX)) * that.agrandissement; that.tweenY = 1 * ((0 - iaScene.y - (that.minY)) * that.agrandissement + iaScene.y + (iaScene.height - hauteur * that.agrandissement) / 2); } }; /* * Define mouse events on the current KineticElement * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.addEventsManagement = function(i, zoomable, that, iaScene, baseImage, idText) { if (that.options[i].indexOf("disable-click") !== -1) return; /* * if mouse is over element, fill the element with semi-transparency */ that.kineticElement[i].on('mouseover', function() { if (iaScene.cursorState.indexOf("ZoomOut.cur") !== -1) { } else if (iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) { } else if (iaScene.cursorState.indexOf("HandPointer.cur") === -1) { document.body.style.cursor = "url(img/HandPointer.cur),auto"; iaScene.cursorState = "url(img/HandPointer.cur),auto"; for (var i in that.kineticElement) { if (that.persistent[i] == "off") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill(iaScene.overColor); that.kineticElement[i].scale(iaScene.coeff); //that.kineticElement[i].stroke(iaScene.overColorStroke); //that.kineticElement[i].strokeWidth(2); that.kineticElement[i].stroke(that.stroke[i]); that.kineticElement[i].strokeWidth(that.strokeWidth[i]); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); } else if ((that.persistent[i] == "onImage") || (that.persistent[i] == "off-image")) { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); } } that.layer.batchDraw(); //this.draw(); } }); /* * if we click in this element, manage zoom-in, zoom-out */ if (that.options[i].indexOf("direct-link") !== -1) { that.kineticElement[i].on('click touchstart', function(e) { location.href = that.title[i]; }); } else { that.kineticElement[i].on('click touchstart', function() { var i = 0; iaScene.noPropagation = true; // let's zoom if ((iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) && (iaScene.element === that)) { iaScene.zoomActive = 0; document.body.style.cursor = 'default'; iaScene.cursorState = 'default'; that.myhooks.afterIaObjectZoom(iaScene, idText, that); } // let's unzoom else if (iaScene.cursorState.indexOf("ZoomOut.cur") != -1) { if ((that.group.zoomActive == 1)) { iaScene.zoomActive = 0; that.group.zoomActive = 0; that.group.scaleX(1); that.group.scaleY(1); that.group.x(that.originalX[0]); that.group.y(that.originalY[0]); $('#' + that.idText + " audio").each(function(){ $(this)[0].pause(); }); $('#' + that.idText + " video").each(function(){ $(this)[0].pause(); }); that.backgroundCache_layer.moveToBottom(); document.body.style.cursor = "default"; iaScene.cursorState = "default"; for (i in that.kineticElement) { if (that.persistent[i] == "off") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } else if (that.persistent[i] == "onImage") { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } } that.layer.draw(); that.backgroundCache_layer.draw(); } } // let's focus else { if (iaScene.zoomActive === 0) { if ((iaScene.element !== 0) && (typeof(iaScene.element) !== 'undefined')) { for (i in iaScene.element.kineticElement) { iaScene.element.kineticElement[i].fillPriority('color'); iaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); iaScene.element.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); iaScene.element.kineticElement[i].setStrokeWidth(0); } iaScene.element.layer.draw(); $('#' + iaScene.element.idText + " audio").each(function(){ $(this)[0].pause(); }); $('#' + iaScene.element.idText + " video").each(function(){ $(this)[0].pause(); }); } //if (zoomable === true) { //document.body.style.cursor = 'url("img/ZoomIn.cur"),auto'; iaScene.cursorState = 'url("img/ZoomIn.cur"),auto'; //} $('.collapse.in').each(function (index) { //if ($(this).attr("id") !== idText) //$(this).collapse("toggle"); }); //$('#' + idText).collapse("show"); var cacheBackground = true; for (i in that.kineticElement) { if (that.persistent[i] === "onImage") cacheBackground = false; that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); //that.kineticElement[i].stroke(iaScene.overColorStroke); //that.kineticElement[i].strokeWidth(2); that.kineticElement[i].stroke(that.stroke[i]); that.kineticElement[i].strokeWidth(that.strokeWidth[i]); that.kineticElement[i].moveToTop(); } if (cacheBackground === true) that.backgroundCache_layer.moveToTop(); //that.group.moveToTop(); that.layer.moveToTop(); that.layer.draw(); iaScene.element = that; that.myhooks.afterIaObjectFocus(iaScene, idText, that); } } }); } /* * if we leave this element, just clear the scene */ that.kineticElement[i].on('mouseleave', function() { if ((iaScene.cursorState.indexOf("ZoomOut.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomIn.cur") !== -1)) { } else { var mouseXY = that.layer.getStage().getPointerPosition(); if (typeof(mouseXY) == "undefined") { mouseXY = {x:0,y:0}; } if ((that.layer.getStage().getIntersection(mouseXY) != this)) { that.backgroundCache_layer.moveToBottom(); for (var i in that.kineticElement) { if ((that.persistent[i] == "off") || (that.persistent[i] == "off-image")) { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(0, 0, 0, 0)'); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } else if (that.persistent[i] == "onImage") { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } } document.body.style.cursor = "default"; iaScene.cursorState = "default"; that.layer.draw(); } } }); }; images-actives-html5.git/src/share/themes/popBlue/js/iascene.js000066400000000000000000000114731250410645000247400ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@crdp.ac-versailles.fr /** * * @param {type} originalWidth * @param {type} originalHeight * @constructor create image active scene */ function IaScene(originalWidth, originalHeight) { "use strict"; var that = this; // canvas width this.width = 1000; // canvas height this.height = 800; // default color used to fill shapes during mouseover var _colorOver = {red:66, green:133, blue:244, opacity:0.6}; // default color used to fill stroke around shapes during mouseover var _colorOverStroke = {red:255, green:0, blue:0, opacity:1}; // default color used to fill shapes if defined as cache this.colorPersistent = {red:124, green:154, blue:174, opacity:1}; // Image ratio on the scene this.ratio = 1.00; // padding-top in the canvas this.y = 0; // color used over background image during focus var _colorCache = {red:0, green:0, blue:0, opacity:0.6}; // internal this.fullScreen = "off"; this.backgroundCacheColor = 'rgba(' + _colorCache.red + ',' + _colorCache.green + ',' + _colorCache.blue + ',' + _colorCache.opacity + ')'; this.overColor = 'rgba(' + _colorOver.red + ',' + _colorOver.green + ',' + _colorOver.blue + ',' + _colorOver.opacity + ')'; this.overColorStroke = 'rgba(' + _colorOverStroke.red + ',' + _colorOverStroke.green + ',' + _colorOverStroke.blue + ',' + _colorOverStroke.opacity + ')'; this.scale = 1; this.zoomActive = 0; this.element = 0; this.originalWidth = originalWidth; this.originalHeight = originalHeight; this.coeff = (this.width * this.ratio) / parseFloat(originalWidth); this.cursorState=""; this.noPropagation = false; } /* * Scale entire scene * */ IaScene.prototype.scaleScene = function(mainScene){ "use strict"; var viewportWidth = $(window).width(); var viewportHeight = $(window).height(); var coeff_width = (viewportWidth * mainScene.ratio) / parseFloat(mainScene.originalWidth); var coeff_height = (viewportHeight) / (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top + $('#container').offset().top); var canvas_border_left = parseFloat($("#canvas").css("border-left-width").substr(0,$("#canvas").css("border-left-width").length - 2)); var canvas_border_right = parseFloat($("#canvas").css("border-right-width").substr(0,$("#canvas").css("border-right-width").length - 2)); var canvas_border_top = parseFloat($("#canvas").css("border-top-width").substr(0,$("#canvas").css("border-top-width").length - 2)); var canvas_border_bottom = parseFloat($("#canvas").css("border-bottom-width").substr(0,$("#canvas").css("border-bottom-width").length - 2)); if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_width) && (viewportHeight >= ((parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_width))) { mainScene.width = viewportWidth - canvas_border_left - canvas_border_right; mainScene.coeff = (mainScene.width * mainScene.ratio) / parseFloat(mainScene.originalWidth); mainScene.height = parseFloat(mainScene.originalHeight) * mainScene.coeff; } else if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_height) && (viewportHeight >= (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_height)) { mainScene.height = viewportHeight - $('#container').offset().top - $('#canvas').offset().top - canvas_border_top - canvas_border_bottom - 2; mainScene.coeff = (mainScene.height) / parseFloat(mainScene.originalHeight); mainScene.width = parseFloat(mainScene.originalWidth) * mainScene.coeff; } $('#container').css({"width": (mainScene.width + canvas_border_left + canvas_border_right) + 'px'}); $('#container').css({"height": (mainScene.height + $('#canvas').offset().top - $('#container').offset().top + canvas_border_top + canvas_border_bottom) + 'px'}); $('#canvas').css({"height": (mainScene.height) + 'px'}); $('#canvas').css({"width": mainScene.width + 'px'}); $('#detect').css({"height": (mainScene.height) + 'px'}); $('#detect').css({"top": ($('#canvas').offset().top) + 'px'}); }; images-actives-html5.git/src/share/themes/popBlue/js/iframe.js000066400000000000000000000022671250410645000245750ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // Script used to load youtube resource after main page // otherwise, Chrome fails to start the page $(".videoWrapper16_9").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); }); $(".videoWrapper4_3").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); }); images-actives-html5.git/src/share/themes/popBlue/js/main.js000066400000000000000000000145771250410645000242650ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // @version=xxx /* * Main * Initialization * * 1rst layer : div "detect" - if clicked, enable canvas events * 2nd layer : bootstrap accordion * 3rd layer : div "canvas" containing images and paths * 4th layer : div "disablearea" - if clicked, disable events canvas */ function main(myhooks) { "use strict"; var that=window; that.canvas = document.getElementById("canvas"); // area located under the canvas. If mouse over is detected, // we must re-activate mouse events on canvas var detect = document.getElementById("detect"); detect.addEventListener("mouseover", function() { that.canvas.style.pointerEvents="auto"; if ((IaScene.element !== 0) && (typeof(IaScene.element) !== 'undefined')) { for (var i in IaScene.element.kineticElement) { IaScene.element.kineticElement[i].fillPriority('color'); IaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); } } }, false); detect.addEventListener("touchstart", function() { that.canvas.style.pointerEvents="auto"; if ((IaScene.element !== 0) && (typeof(IaScene.element) !== 'undefined')) { for (var i in IaScene.element.kineticElement) { IaScene.element.kineticElement[i].fillPriority('color'); IaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); } } }, false); // Load background image that.imageObj = new Image(); that.imageObj.src = scene.image; that.imageObj.onload = function() { var mainScene = new IaScene(scene.width,scene.height); mainScene.scale = 1; mainScene.scaleScene(mainScene); var stage = new Kinetic.Stage({ container: 'canvas', width: mainScene.width, height: mainScene.height }); // area containing image background var baseImage = new Kinetic.Image({ x: 0, y: mainScene.y, width: scene.width, height: scene.height, scale: {x:mainScene.coeff,y:mainScene.coeff}, image: that.imageObj }); // cache used over background image var baseCache = new Kinetic.Rect({ x: 0, y: mainScene.y, width: scene.width, height: scene.height, scale: {x:mainScene.coeff,y:mainScene.coeff}, fill: mainScene.backgroundCacheColor }); // define area to disable canvas events management when // mouse is over. Thus, we can reach div located under canvas var disableArea = new Kinetic.Rect({ x: mainScene.width * mainScene.ratio, y: mainScene.y, width: mainScene.width * (1 - mainScene.ratio), height: mainScene.height }); disableArea.on('mouseover touchstart', function() { canvas.style.pointerEvents="none"; }); var layers = []; that.layers = layers; layers[0] = new Kinetic.FastLayer(); layers[1] = new Kinetic.FastLayer(); layers[2] = new Kinetic.Layer(); layers[3] = new Kinetic.Layer(); layers[0].add(baseCache); layers[1].add(baseImage); layers[2].add(disableArea); stage.add(layers[0]); stage.add(layers[1]); stage.add(layers[2]); stage.add(layers[3]); myhooks.beforeMainConstructor(mainScene, that.layers); var indice = 4; layers[indice] = new Kinetic.Layer(); stage.add(layers[indice]); for (var i in details) { //var indice = parseInt(i+3); //layers[indice] = new Kinetic.Layer(); //stage.add(layers[indice]); var iaObj = new IaObject({ imageObj: that.imageObj, detail: details[i], layer: layers[indice], idText: "article-" + i, baseImage: baseImage, iaScene: mainScene, background_layer: layers[1], backgroundCache_layer: layers[0], zoomLayer: layers[3], myhooks: myhooks }); } myhooks.afterMainConstructor(mainScene, that.layers); $("#splash").fadeOut("slow", function(){ $("#loader").hide(); }); // FullScreen ability // source code from http://blogs.sitepointstatic.com/examples/tech/full-screen/index.html var e = document.getElementById("title"); var div_container = document.getElementById("image-active"); e.onclick = function() { if (runPrefixMethod(document, "FullScreen") || runPrefixMethod(document, "IsFullScreen")) { runPrefixMethod(document, "CancelFullScreen"); } else { runPrefixMethod(div_container, "RequestFullScreen"); } mainScene.fullScreen = mainScene.fullScreen == "on" ? "off": "on"; }; var pfx = ["webkit", "moz", "ms", "o", ""]; function runPrefixMethod(obj, method) { var p = 0, m, t; while (p < pfx.length && !obj[m]) { m = method; if (pfx[p] === "") { m = m.substr(0,1).toLowerCase() + m.substr(1); } m = pfx[p] + m; t = typeof obj[m]; if (t != "undefined") { pfx = [pfx[p]]; return (t == "function" ? obj[m]() : obj[m]); } p++; } } }; } myhooks = new hooks(); launch = new main(myhooks); images-actives-html5.git/src/share/themes/popBlue/js/xorcipher.js000066400000000000000000000115071250410645000253320ustar00rootroot00000000000000// XORCipher - Super simple encryption using XOR and Base64 // MODIFIED VERSION TO AVOID underscore dependancy // License : MIT // // As a warning, this is **not** a secure encryption algorythm. It uses a very // simplistic keystore and will be easy to crack. // // The Base64 algorythm is a modification of the one used in phpjs.org // * http://phpjs.org/functions/base64_encode/ // * http://phpjs.org/functions/base64_decode/ // // Examples // -------- // // XORCipher.encode("test", "foobar"); // => "EgocFhUX" // XORCipher.decode("test", "EgocFhUX"); // => "foobar" // /* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, strict:true, undef:true, unused:true, curly:true, browser:true, indent:2, maxerr:50 */ /* global _ */ (function(exports) { "use strict"; var XORCipher = { encode: function(key, data) { data = xor_encrypt(key, data); return b64_encode(data); }, decode: function(key, data) { data = b64_decode(data); return xor_decrypt(key, data); } }; var b64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; function b64_encode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, r, i = 0, enc = ""; if (!data) { return data; } do { o1 = data[i++]; o2 = data[i++]; o3 = data[i++]; bits = o1 << 16 | o2 << 8 | o3; h1 = bits >> 18 & 0x3f; h2 = bits >> 12 & 0x3f; h3 = bits >> 6 & 0x3f; h4 = bits & 0x3f; enc += b64_table.charAt(h1) + b64_table.charAt(h2) + b64_table.charAt(h3) + b64_table.charAt(h4); } while (i < data.length); r = data.length % 3; return (r ? enc.slice(0, r - 3) : enc) + "===".slice(r || 3); } function b64_decode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, result = []; if (!data) { return data; } data += ""; do { h1 = b64_table.indexOf(data.charAt(i++)); h2 = b64_table.indexOf(data.charAt(i++)); h3 = b64_table.indexOf(data.charAt(i++)); h4 = b64_table.indexOf(data.charAt(i++)); bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; o1 = bits >> 16 & 0xff; o2 = bits >> 8 & 0xff; o3 = bits & 0xff; result.push(o1); if (h3 !== 64) { result.push(o2); if (h4 !== 64) { result.push(o3); } } } while (i < data.length); return result; } function keyCharAt(key, i) { //return key.charCodeAt( Math.floor(i % key.length) ); return key.charCodeAt( i % key.length ); } function xor_encrypt(key, data) { /*return _.map(data, function(c, i) { return c.charCodeAt(0) ^ keyCharAt(key, i); });*/ var result = []; for (var indice in data) { result[indice] = data[indice].charCodeAt(0) ^ keyCharAt(key, indice); } return result; } function xor_decrypt(key, data) { /*return _.map(data, function(c, i) { return String.fromCharCode( c ^ keyCharAt(key, i) ); }).join("");*/ var result = []; for (var indice in data) { result[indice] = String.fromCharCode( data[indice] ^ keyCharAt(key, indice) ); } return result.join(""); } exports.XORCipher = XORCipher; })(this); String.prototype.decode = function(encoding) { var result = ""; var index = 0; var c = c1 = c2 = 0; while(index < this.length) { c = this.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); index++; } else if((c > 191) && (c < 224)) { c2 = this.charCodeAt(index + 1); result += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); index += 2; } else { c2 = this.charCodeAt(index + 1); c3 = this.charCodeAt(index + 2); result += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); index += 3; } } return result; }; String.prototype.encode = function(encoding) { var result = ""; var s = this.replace(/\r\n/g, "\n"); for(var index = 0; index < s.length; index++) { var c = s.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { result += String.fromCharCode((c >> 6) | 192); result += String.fromCharCode((c & 63) | 128); } else { result += String.fromCharCode((c >> 12) | 224); result += String.fromCharCode(((c >> 6) & 63) | 128); result += String.fromCharCode((c & 63) | 128); } } return result; };images-actives-html5.git/src/share/themes/popBlue/manifest.webapp000066400000000000000000000007001250410645000253540ustar00rootroot00000000000000{ "name": "XIA", "size" : define_package.zip_size_here, "version" : "1.0", "release_notes" : "generated with XIA", "launch_path": "/index.html", "package_path" : "http://my-webserver.com/package.zip", "developer": { "name": "Académie de Versailles" }, "icons": { "16": "/img/xia16.png", "48": "/img/xia48.png", "64": "/img/xia64.png", "128": "/img/xia128.png" } }images-actives-html5.git/src/share/themes/popYellow/000077500000000000000000000000001250410645000227355ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/popYellow/css/000077500000000000000000000000001250410645000235255ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/popYellow/css/main.css000066400000000000000000000154731250410645000251750ustar00rootroot00000000000000/*fonts*/ @font-face { font-family: 'yanone_regular'; src: url('../font/yanonekaffeesatz-regular-webfont.eot'); src: url('../font/yanonekaffeesatz-regular-webfont.eot?#iefix') format('embedded-opentype'), url('../font/yanonekaffeesatz-regular-webfont.woff') format('woff'), url('../font/yanonekaffeesatz-regular-webfont.svg#yanone_kaffeesatzregular') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'yanone_thin'; src: url('../font/yanonekaffeesatz-thin-webfont.eot'); src: url('../font/yanonekaffeesatz-thin-webfont.eot?#iefix') format('embedded-opentype'), url('../font/yanonekaffeesatz-thin-webfont.woff') format('woff'), url('../font/yanonekaffeesatz-thin-webfont.svg#yanone_kaffeesatzthin') format('svg'); font-weight: normal; font-style: normal; } /*fin de font*/ /* override Wahid */ html { margin:0; padding:0; background: url('../img/background.jpg') no-repeat center center fixed; background-size: cover; } body{ background: none; margin:0; border:none; padding:0px; border-image-width: 0; } video { width:100%; } audio { width:100%; } a { color:#00c6ff; font-family: yanone_thin; font-size:1.4em; } a:active, a:focus, a:hover {color:#DDD;} header { width:100%; padding:0; margin:0 auto; /*background:#000;*/ } header h1 { margin:0; top:0; left:0px; /*background:url(../img/imagedoc-darknoise.png);*/ display:inline; /*max-width:20%;*/ padding: 0px 1em 0 5px; margin-bottom:0; color:black; font-family: yanone_thin; font-size: 1.5em; } .eyes { background:url(../img/eyes.png) center bottom no-repeat; /*margin-left: 10px;*/ padding:.3em 1em; } .eyes:hover { background:url(../img/eyes2.png) center bottom no-repeat; } .meta-doc { background:url(../img/meta-doc.png) center bottom no-repeat; /*margin-left: 10px;*/ padding:.3em 1em } .meta-doc:hover{ background:url(../img/meta-doc2.png) center bottom no-repeat; } .infos { background:url(../img/infos.png) center bottom no-repeat; /*margin-left: 10px;*/ padding:.3em 1em; } .infos:hover{ background:url(../img/infos2.png) center bottom no-repeat; } .title-document {display: block;} @media screen and (max-width: 640px) { body { font-size:0.7em; } h1 { font-size:20px; } } #detect, #canvas { margin:0; padding:0; } #container { position: relative; padding:0px; width:100%; margin:10px auto; border:0px solid #FFF3B2; border-image-width: 0; } #canvas { width:55%; margin-top: 40px; border:20px solid rgba(255,255,255,0.5); } #detect { position:absolute; /*top:50px;*/ left:0; width:100%; height:655px; } .response { display:none; } .unlock { width: 80%; margin:0px auto; } .unlock input[type="submit"]{ background-image: url(../img/unlock-icon.png) ; background-repeat: no-repeat; width: 40px; height: 40px; border:0px; background-color:transparent; } .unlock input[type="text"]{ padding: 10px; margin:10px; background-color: #ffec64; border:0px; box-shadow: inset 0px 0px 5px #ffab23; } .button { -moz-box-shadow: 0px 1px 0px 0px #fff6af; -webkit-box-shadow: 0px 1px 0px 0px #fff6af; box-shadow: 0px 1px 0px 0px #fff6af; background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffec64), color-stop(1, #ffab23)); background:-moz-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-webkit-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-o-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:-ms-linear-gradient(top, #ffec64 5%, #ffab23 100%); background:linear-gradient(to bottom, #ffec64 5%, #ffab23 100%); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffec64', endColorstr='#ffab23',GradientType=0); background-color:#ffec64; -moz-border-radius:6px; -webkit-border-radius:6px; border-radius:6px; border:1px solid #ffaa22; display:inline-block; cursor:pointer; color:#333333; font-family:arial; font-size:15px; font-weight:bold; padding:6px 24px; text-decoration:none; text-shadow:0px 1px 0px #ffee66; } .button:hover { background:-webkit-gradient(linear, left top, left bottom, color-stop(0.05, #ffab23), color-stop(1, #ffec64)); background:-moz-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-webkit-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-o-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:-ms-linear-gradient(top, #ffab23 5%, #ffec64 100%); background:linear-gradient(to bottom, #ffab23 5%, #ffec64 100%); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffab23', endColorstr='#ffec64',GradientType=0); background-color:#ffab23; } .button:active { position:relative; top:1px; } /* popup */ .overlay { position:fixed; top:0; right:0; left:0; bottom:0; background: rgba(0,0,0,0.6); } #popup { position:relative; border-radius: 20px; border: 20px solid #ddd; width: 60%; margin: 50px auto; background:white; min-height: 100px; box-shadow: black 5px 5px 10px; } #content article { display:none; z-index:100; position:absolute; border: 20px solid #ddd; border-radius:20px; width: calc(100% - 40px); margin: 0px auto; background:rgba(255,255,255,1); box-shadow: black 5px 5px 10px; overflow-y: auto; overflow-x: hidden; } #content article p, h1 { margin: 10px; } #content article h1 { font-family: yanone_thin; } .article_close { z-index:200; display: none; cursor: pointer; position:absolute; top:0px; height:40px; text-align:center; } #popup_text { text-align:center; } #popup_text img{ float:left; width:20%; max-width: 60px; margin: 10px; } #content #message_success { overflow-x:visible; overflow-y:visible; } #popup_close, #popup_close_intro, #popup_toggle { cursor: pointer; position:absolute; top:-40px; right:-40px; width:50px; } #loader { position:fixed; display: table; text-align:center; width:100%; height:100%; top:0; right:0; left:0; bottom:0; background: black; z-index:100; } #loader div{ font-family: yanone_thin, Arial; font-size: 2em; display:table-cell; vertical-align: middle; color:white; } .videoWrapper16_9 { position: relative; padding-bottom: 56.25%; padding-top: 5px; height: 0; } .videoWrapper4_3 { position: relative; padding-bottom: 75%; padding-top: 5px; height: 0; } .videoWrapper16_9 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .videoWrapper4_3 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }images-actives-html5.git/src/share/themes/popYellow/datas/000077500000000000000000000000001250410645000240315ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/popYellow/datas/README.md000066400000000000000000000001221250410645000253030ustar00rootroot00000000000000# JSON datas This folder contains data.js file where paths and images are stored images-actives-html5.git/src/share/themes/popYellow/deploy.html000066400000000000000000000006441250410645000251230ustar00rootroot00000000000000

XIA installation package

images-actives-html5.git/src/share/themes/popYellow/font/000077500000000000000000000000001250410645000237035ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/popYellow/font/README.md000066400000000000000000000000301250410645000251530ustar00rootroot00000000000000fonts used by this themeimages-actives-html5.git/src/share/themes/popYellow/hook.py000066400000000000000000000151661250410645000242600ustar00rootroot00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see # # @author : pascal.fautrero@crdp.ac-versailles.fr import gettext import locale class hook: """do some stuff during image active generations""" def __init__(self, root, iaobject, PageFormatter, langPath): """Init""" try: t = gettext.translation("xia-converter", langPath, languages=[locale.getdefaultlocale()[0]]) except: t = gettext.translation("xia-converter", langPath, languages=['en_US']) translate = t.ugettext self.root = root self.iaobject = iaobject self.PageFormatter = PageFormatter self.tooltip = translate("export popYellow") self.loading = translate("loading") def generateIndex(self,filePath, templatePath): """ generate index file""" final_str = 'close' final_str += u'
\n' final_str += u'

' + self.iaobject.scene["intro_title"] + '

\n' final_str += u'

' + self.PageFormatter(self.iaobject.scene["intro_detail"]).print_html() + u'

\n' final_str += u'
\n' for i, detail in enumerate(self.iaobject.details): if detail['options'].find(u"direct-link") == -1: dataState = "full" if (self.PageFormatter(detail["detail"]).print_html() == "") and (detail["title"] == ""): dataState = "void" final_str += u'
\n' final_str += u'

' + detail['title'] + u'

\n' final_str += u'
' + self.PageFormatter(detail["detail"]).print_html() + u'
\n' final_str += u'
\n' with open(templatePath,"r") as template: final_index = template.read().decode("utf-8") metadatas = "" if self.iaobject.scene["creator"]: metadatas += self.iaobject.scene["creator"] + "
" if self.iaobject.scene["rights"]: metadatas += self.iaobject.scene["rights"] + "
" if self.iaobject.scene["publisher"]: metadatas += self.iaobject.scene["publisher"] + "
" if self.iaobject.scene["identifier"]: metadatas += self.iaobject.scene["identifier"] + "
" if self.iaobject.scene["coverage"]: metadatas += self.iaobject.scene["coverage"] + "
" if self.iaobject.scene["source"]: metadatas += self.iaobject.scene["source"] + "
" if self.iaobject.scene["relation"]: metadatas += self.iaobject.scene["relation"] + "
" if self.iaobject.scene["language"]: metadatas += self.iaobject.scene["language"] + "
" if self.iaobject.scene["contributor"]: metadatas += self.iaobject.scene["contributor"] + "
" if self.iaobject.scene["date"]: metadatas += self.iaobject.scene["date"] + "
" final_index = final_index.replace("{{METADATAS}}", metadatas) final_index = final_index.replace("{{AUTHOR}}", self.iaobject.scene["creator"]) final_index = final_index.replace("{{DESCRIPTION}}", self.iaobject.scene["description"]) final_index = final_index.replace("{{KEYWORDS}}", self.iaobject.scene["keywords"]) final_index = final_index.replace("{{TITLE}}", self.iaobject.scene["title"]) final_index = final_index.replace("{{CONTENT}}", final_str) final_index = final_index.replace("{{LOADING}}", self.loading) if self.root.index_standalone: xiaWebsite = "http://xia.dane.ac-versailles.fr/network/delivery/popYellow" final_index = final_index.replace("{{MainCSS}}", xiaWebsite + "/css/main.css") final_index = final_index.replace("{{LogoLoading}}", xiaWebsite + "/img/xia.png") final_index = final_index.replace("{{LogoClose}}", xiaWebsite + "/img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '') final_index = final_index.replace("{{JqueryJS}}", "https://code.jquery.com/jquery-1.11.1.min.js") final_index = final_index.replace("{{sha1JS}}", xiaWebsite + "/js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", "https://cdn.jsdelivr.net/kineticjs/5.1.0/kinetic.min.js") final_index = final_index.replace("{{xiaJS}}", xiaWebsite + "/js/xia.js") final_index = final_index.replace("{{hooksJS}}", xiaWebsite + "/js/hooks.js") final_index = final_index.replace("{{labJS}}", "https://cdnjs.cloudflare.com/ajax/libs/labjs/2.0.3/LAB.min.js") else: final_index = final_index.replace("{{MainCSS}}", "css/main.css") final_index = final_index.replace("{{LogoLoading}}", "img/xia.png") final_index = final_index.replace("{{LogoClose}}", "img/close.png") final_index = final_index.replace("{{datasJS}}", "") final_index = final_index.replace("{{lazyDatasJS}}", '.script("datas/data.js")') final_index = final_index.replace("{{JqueryJS}}", "js/jquery.min.js") final_index = final_index.replace("{{sha1JS}}", "js/git-sha1.min.js") final_index = final_index.replace("{{kineticJS}}", "js/kinetic.min.js") final_index = final_index.replace("{{xiaJS}}", "js/xia.js") final_index = final_index.replace("{{hooksJS}}", "js/hooks.js") final_index = final_index.replace("{{labJS}}", "js/LAB.min.js") with open(filePath,"w") as indexfile: indexfile.write(final_index.encode("utf-8")) images-actives-html5.git/src/share/themes/popYellow/icon.gif000066400000000000000000000341241250410645000243600ustar00rootroot00000000000000GIF89ag !#.057==AEEG IFHJMOQN SRMR RPWV VYXTW Z\^[^a`ccbc e ^ aegigig higjlmlopnlnq trqtqvuy tts|wt xv wz|{zz ~}|y{~ǁƒ̀ȂĄԀς Ѓ˄džͅĉ؄ʉ Շ̊Ċщψ͋ ԋɍЎۋ ی֍ʏ͑؎Ӑɔԑǒ ې*ې֒ דӕҕ ݓ֓ڕ՗Җ"ؙЙ ݘɛ'қڛ˛1֙+ۜןݞ ߟڝ/ߟݟ١ܢң0إդ(!Ԥ:ޥݤ!֣Dܤ+%߫߫'(ޫ1ݫ9ܮ( +ߪWG4+6߯L>.7/8@H9:B;LJCC;EL>aZUMGVjbĄlǀt{ʐДҎؚ֪ղڢ۰ܷ!Created with GIMP! ,WTSR,LA[4qUM7(3(6ڤqQq9J˥.x&@㇉'1N6cQ(#6,sRZ^E]apn OdMn? #4c /vLg(QBq"m&xx)]Kc,1b%gGe1pq|Gq|Z=#%8-UVz2#gZFAE mQ* qsm8^5mX7&Ks,ҞPĕj"VT Sd.TND Mfv35m eߣ vʰ{d*"(RaX /AR6zGRYvh"XWs2뮣.OM5yaPgPxd?GWYl[*XBTOtҋ\`vzZ|38" `5Y13d"QKB⡪a9IVғRMQ%&1nDn>Q~TH$H#a aGaqg;KD8T| 1աvp B?pM׺#. !h[$!N!'bHJ.BE(PPEZ.a,&(FXq|%3T-5BA88bjE7aXN0) ɐEdX\ ;yX!b'NT84X9 FHn'uYX25jʐO , H%BIƣ"YEåH,DA9y0Z)']12%j)yPf(&qdXX4\4WQAX]F1G Xxhb)`V%1/h TU 2QG$̠s[j0^j*Oэ|{҃8Zfz*xzU\E3 bTE-MH-Q5u[hZHkHEPٿP"ʈZqwUb AV *8+TK=d3ǘPE!tYK2Q྅ʍ U Mߚ["r%&1 F0bH Y/a.ad&QZ&lPZQ.)JW>v#"d"T*BkYk/`b v0^:,SI/[,\DcfY&Kp> X0TZ=6K] Fg;(sV"؄GV5Lb)Z^@^-bBFSk^*zpE@ 6Be6$HJ]fZ[:iZ^BbxU;vI{hYp~B; hHv\K"$XSs DpQ&QdLKFz$ËVs$M-2B]%3 IZC7pf♏$*b"![N(NH{ȃ &򻙆 ʔ`x(ꑉ1UҊЊPPŞuz5 Šq1}>s]34Dx%1Jz 04b9B7FqgqIք&w 5N,u^b7 `,41Ls 51(֣7F;^ $X[O3$R}!Zd?oI`yGs @=|sb2Qp9h8Bu{Tq %6ՕZ!yY3FI^ _5 QD:t x LypDj^H C n1j40wY7 0pY7+V @}t]S 𢌷EPL ``0尟9ù P:o WYz >.0I}/d ZG' @"-WZ 1ꢾ 1|P ' Pӣ )6!PӃW,:%Ov&ChuB&ڡxY5<+0ʪڪ:PZzj```ڰP' `!! f!E?,:j9 w@ڮZNJXOQ(8 JmPydJ`Dfխ uzˮ됍'QRŐ ׀ U R3))P4.}K7!-)h Hv{q rF{ɣLI?jdƐ ހb19K1$T)J s Y HX{PjPG{+JM6FLDRb3$5i&0,y{jPxʨ෤(J0(d6XSRtO#p`Lxo֝ C`PشzI;x3ΰfX1Bl hz@ bC/ydop˼p7K[u' H]pW!p`jݺ?(Fh›۹v&7Q,sI*p7.J")6U Qns@hj*CJq[tpP'X=\? ޶M´m͐$A]!C\ ;̻Ḏ{_йp PQ̼p h@%Ր7p)PoAvh`YINHy@rj`y| (6T0[=e禵FJihRVJ! vL|8bݰ)#J1WmJ v@~h\[_̹vp AmEQ :$Q͚2Kqp]7"ѡy[\̹+ bM)-[ΰ,F1$縓Ͳp-ikJh\_`йD .%ヴEtpW vHA1P sq 0 (_kG uZ (%MY>0BRA@Xzk\Q|opΒ> q̹[&uzT<Lb p;ٻ ͡<’=m?-rΚIח6 3 1WB=K`P`0ג_JPJ[XDۿx͞Ơ$r2H- DPypy@X yll[XA-ԝެ(98$TD'_fڝYe l$}h0>F r=`Nwz) Cu-*-x/Ԏqd j! 0n0FԬ:X{(,LW9!118Q qF{M _ITl`@ uׂP' f v&s-MNDUPUG`<,t*wI Xa)1|,c1QCQP}^IJJP  Gܿ71*WL5ɹf1|Tڃ s0\ <ݹwʯN: X @"WWЎ1dY < Η-;OiE:9 ֞+,Sy TE q!H@U@pjCGpj{1/ ~Dj\1[ܲ5 Kr .!Hp`` KjP^\p~ a/Hb034D - ε1wk9>ț G\>~ѐbXu"htݔqA7r%w0;ۂlrt0„IB( f!tr0t% ma1~=0j e F?rØQF=~'VAYlΒ[֬Xdl\ 0^xuKYb8jf H ą!%JTe A4h *IJU͞:BK/Zm6TױbZt,Z35ocK\ou拗IeaZ @_*TRf_<{E#ppȁG΢EԺퟸ<20me3[dw&HUldK"/+jG!ecvM 8z ^~̅\Vم`fh1eCJ$,-b j!0L5H .zMV^ L*j9`s%$O (nj". /Bc(-5<$#^NVQPWt8azHqre βL0˰J!ش/ QK?4E^t:gTY4`5m;Ȑp0"KT^иHi%X5yUI_I\#YdY8q}1fvq1EnE0`r,Zj,|~ KëL 6}/xOePVie艡*s5^$@5A#eXqb=X&:! QPPCaFΉbnx(ogYP(+2*(MPR{ um2JBP50I Zm\P2m6 c0n ꊢHE(6qK沨W T""r:f d"k |#-RզU6*XQ_`CnӰ!n-,X!=Ha SAEl?iTD,>T-y%,ra9BRC{q |ش(Pv QlW-| "@u=aCT*$ AA i9y_.!0]O`*. X߈5]ns ę%A3FSUAQN"h!DE}I!QMa4\@՜+!35ЁZc"(b}]|rSE43[q@A t:NKiB|e!hY!Hvl\ =xz|*tK@'D,]ATWbR,9T3|adѢ.ą#Jn9!7 %\x "oF>H6HCI@@'BVC'::HQH!ҁdۊ#$(ȊqK<8¹25*,+? aAI<&dIHBHR03X:;xMq`aC+AY&۱"eR*CNٲ#q75ɭ-H !2< I+̽AcND@-8`L;*HÅ~:`LYRθJAҪiCd3"#2E$,òӠ+q3XvG\?DOTN لLDFDC0O8I7US:>OE3Lp,Q0, [|*3hKZڹ ?0.زq)9[CK tӠ4>.@K@{MO+DJD3$*x'[. 2RȂ-} D{[!:I"݁"k?9H" 9eH8xSS6؃-R{DC4K3{3"`ÉňC Ƭ/ 8#D?r2 7`#UQ´4/'DK;/jMD|bGOxX(JZ!p ̣ ;Ū-p;X3 p<;íR2x477*@Ǧн7+@ɠ;x""BdR!4"@!`  4TC5;9s2Gx@ J`==;Fs˦7X*x_3CKxAat: Xx6*=` 6`Ɍ-+1| K@30x l,Q@~˃IB3 s BQ hZ\PXJ,XͰNiA008 HJ$ر  ELQ.t2;ӀS 0mPx@x/`;,Toi*iGy`" Ҥ҂/Y(уՃPPh ;S@8D-B.d;`C؈|HuPu|t#U`CL*W5\>Ku-ɔ?Ĵ/銢+3I|ŽGpeGJSЈuȃ($@D> J^@KJ(u0IM#1#a8IX 301[11 8gJ% ]dB;PBH Z@\D*7@^4܌P+t8LB(N^1(y:PȀiB(>ɳSHsGdG HB@㵃6O|Es~HE܄C &b7ֈइ^mC~"X:H T !}1SzHT./V< `HZv0F@@VW'HCPJ8BagI܍8TEAXJx(l;(8&h{..X0P8 h / `pI8+MGKX;U -Y!XH(x .v; t7hA8Ah}p8q Bp%Kk/&nq%L edgP.Xh5lH)L4CAs!+bHQ&.1Š',x8!F 1jQdH%R{| B#F`,Y[ $(yŎ,S)ʁeCL<8h$ƒ rDNF$KR҄J\H$Q+X  4h $XTI G a<1얰dTE͡2p0XD cMǃ9b`Ə%pz*Ur$uf&aFGahHPB 1D Ap D -E (aE%5@\\l1E$!FuwTaEbTpvF#ScXPD9%EcH iXaa# aJ=6L(<%'1aP@(;>*CcuYpTU$1GG yāzWbƫ7EZҝTؕy]ZfC|'| $YhqS?{ZDe $XA^T0 % 8 8 EЂ2>I2`Q^L7y^ Dwa^d vGŔUDCŒª,gY$83Q;A! pBTM `CBUÿ`LJ 74 M\1jDT̅BxFMiWc%gxh4PZ07T'#XRGES:Å$XN#4`34n%`- 3pVX1EŴFTD!%ENtqQJH*'K c\촪>!-% }H+꨷`!-XB d@#x .P,(ZsX jĠ5S<'=>=9\!UW[ .Q4WX8ZZX!((YT4 5 7!8Z 6 NQ$34 5 7XX;@1NOPQR3TUV Q? LM112RSTQJ0%K0LM12X>U/JK0LLM1>A5H I/JK00LJ?[$),FFG-H I/J/S)?DE /FK -HO :+#D\M;"7;C+/&3KH@21B3*FA(@???? images-actives-html5.git/src/share/themes/popYellow/img/ZoomIn.cur000066400000000000000000000042761250410645000254500ustar00rootroot00000000000000 ( @༙L@3uaL""!tSSSǨiii555^^^trr+++} ===׶-' xxxXXXcccRD6''&̬ ///mmmqܺ[[[0)#xcO%$# ```ooovvvqqqt&%%(((˪N@3 TTTݻYYY___wbNaaabbbhhhwww-(!߻Ȩ&&%RD5̫˫cbb\Z~9zq qX\_@_`%%rpM^A&%$o(J?) ppG_R8e$66jjhf8k nn_!dfws Ijkl77lR#E.3-3.Kii$s\kcL tNfg^y"9. *4t.'dm54V44tu#g_TkQ34V3> DZXa/4-+aC@T6YPtVV*3Q5l|YJxttVVv];^Y7St 8B}EYA\8Tvvvv*O\>,1WU4O_,-V,\$0<)o\,bd\\\\\\\-b`FHc,#|YV??images-actives-html5.git/src/share/themes/popYellow/img/background.jpg000066400000000000000000002367771250410645000263600ustar00rootroot00000000000000JFIF``ExifMM*bj(1 r2~i``GIMP 2.8.22014:06:22 13:15:1002100100T"*(2HHJFIFC!!%#!(2S62..2fIMqTb=*\hCs@lk@=VpG݁v^X,IZ4J$fwz,L' ~X3zP=iN nP(qBsH[ޫ IG_z_0ŽQXFapA=*)$qT;^9L$T,Mj2S'<>UrNh9I?Thttp://ns.adobe.com/xap/1.0/ uuid:A05823AE01FBDA11B11DF743351C5B64 uuid:A05823AE01FBDA11B11DF743351C5B64 uuid:89B33AF3DDFADA11B11DF743351C5B64 uuid:89B33AF3DDFADA11B11DF743351C5B64 2006-06-13T12:25:59-05:00 2006-06-13T12:25:59-05:00 2006-06-13T12:25:59-05:00 Adobe Photoshop CS2 Windows image/jpeg 3 3 256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;BABD1B564FD25FAE622D504889ACE4BD 1 960000/10000 960000/10000 2 256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;BABD1B564FD25FAE622D504889ACE4BD 36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;27934B179A7973BF6CE258A7DA14FE9E Top-left 96,0000 96,0000 pouces Adobe Photoshop CS2 Windows 2006:06:13 12:25:59 Compression JPEG 72 72 pouces Version d'exif 2.1 FlashPix Version 1.0 2092 1517 -1 36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;27934B179A7973BF6CE258A7DA14FE9E C!!%#!(2S62..2fIMSxP ,2-Ri:1y` $N;(>7*ެ9e:yx5i; Ml!`9 TE8}#<ǒ e%9~ߩ䨃~. =%O2Ɣ˲QSЊk\d/%f.[H 4264[, t>DB𯀵phK"c"gP6Wu8qKeB-lz"6;bpJX 1*P5(=KpܽC^!.A$-O|,a%sJ/ej,;Q#c @OwN7+TF88Z=C*.)EZ4P5*\]?pP (H>5C./.9._6,~SΏpog[gBjYcx+¸]5ȥgХǩeecpVG.;-3Cf;8/YCνs8Q^8o(\v:\^y 8bk2(a=Q\6]hJy_Kz:¸]8^Zճ/nj*,F,- lB88R1BI (XIbW t/Ljx(*(|(oꗄ!QGQQE>*-e΍XNqr\TjC4cf,r7,ca}C(yPx):4ǞR/#)W TuƒBXgRǨpZ.53FDhqqXTs{_OPQCyϑXU ̼VXv/FuŽ""?PFu6K rX%~*VS+/A|:.S-zU¥}O ju xh(EUn|n:Yr}Qj:ع?=C_Ջ0CpOpῤnUrs^P}uJ/;KJȋ;Lkw}6yz.V=*_d}aȫ7\x~=DVkп*/ӯWkt/o7|^}/-k֬7-KPp?¿ߩ__I/ +_oѾ7lqr^ZڿI__l|j+"sC~k}oF/ Qׇ|6vS kׅA Tny|*u}Dܿ_HׁYsQ3_Sj\8.W`Qo|? (\Zu+#u6l|[},^%;q#EOߍ\Nze~nsy.{:tߑ%ؿU|/C'B"QrՕC/#:5ʫj_;Z=ߍ~~W}pb 7 |B¡/K^_Ƚ=x6P.П% 1 C-?ѯ7 57;-rX%} ;*W5<ۯ9eŨ~z{Yw]E\bERゕ^9v3K_&pZ( ( xR3x> 6\ Yǃ~Se{`_Clʖ< |~ e]xhZ7.XK^wyP bTnj4KCxv_͛\w>]C(bv\h>v3iSMc%T_7G|./ lko6Qcc=P |x7BsCk^^FW;P++ᛆho*x{VQpÆO ,lG2qtdƓ0 f|Lq<+;;!F|:oŕˢE7r>.lBleX,yY(XgPKF]F#*;3Gv]Y]fhQp笋Sq|꿾 ֡ rبjVo"ۿ\*gp6P ah} f4'z( P]͗7y$Vy\*+g7èH>,^(h|R%|hoF2{`?cXё0KhThES6c.p.i?ofF 6t{&<*췾 Ӭbbv$edcԳg*fM z 7+/G|/'~+Yh!,Pu "P¸Xap΅ycu eɲT,27kܺ YtZo#ɲMXK6he,!ՙilєAB΋gef#[)V{0/O0T< Y˖YfƜS|u R=bh_Ȱ|ú;1PEeE|lEK1Cв%+"G,jhyV(74vX6;uJlRS:e2fo*HM}ح;lv gQxx6W˸S|N/>'䥕-f +|5|Mpu:>/GVQV?g6QXY*1`ۋ yd y3X6+oʋ*GBeX(Vl[;5լ XcktƑBǑ Kqlm͉C2 ÏMbu,̳j4T(ruρ^Y%چ'lmB;E;PCխiep複64R:[.òBBYM"K|BQ*U8,ec".Vm AB-V z,hȼh7E{/~hLōHB{4՗ ЕmwaH쳳Qѕ<|e'H^F MO47+qY6S;ܻpn2_&c]P^x|K#Pv]7Zyl3{ yFf51[ct )e ]O'te2lz͖Z/e cv6ɑ]{*BȔ7dx)P^,xT&ѡX:#x2wYq?fQЯGP,!Mwy;t\Tܬ jQk\3 =C G5lc{teP~eYobݍUGEwqt%:-GB.*CCO}!aeK؛lmX6_^2{ "Kc%ccK΍eCNZ<5y4;R8^`\VL]?e6F2\_} F(];COb4S "΍lb?{֥Gp3,PtUɀ`'b|B츲cEk$Ye;m2S f cCXo[-YI},쵋9BٸC/n*О_gfFmȝm-aՌhCPNŸoU}-K}F,N/mބ%OMC(4*\FXR[xSn:T:3r#v /qo8  o6m)UVmmd~K2۳KB2-m)KUzlOi'A  6lkv[L}oM'I%dZv @~~@$M-]nmu%>46ܶv[S%U6I WM* m6@ A'^#o}doZE I.=I0Zw),$AZzD ,@ `nY?~wekkmJ $emY<@ V`ml'M/o6M#[m>dr女{i $dmM6  66K $}lۥsMi9%mYZڲDP {@H[h?'~l6m `MjIV[Zyeٚ^,LQ%i_ m;aabvml`l x!$Iln[djŭQT )&JE"@Ad 6m1;ilK8m@'m?}ovNԎj$ul[!IE V!6aɶm8cm@0`?P6m^  Ͷm?mRNDm4ۚ{d=UݤH mm!lm`m mvlѷmZ5ڍ/6[eiMZHIT l1m |6m@Ēm Ilmڪ&[g ,J,Q(%+VKX mm0llp@`ml&'ummnM$nr[Mh$)*J{mlqmm &@l& MA6lp m^~|mm6KeI{-2yl!$II$KTWmmm@`m ``mI'fm'Զdgܶ[%dR*jI$m`vm6l 6 l AwvmN[<4^m$RamU alme9}ǙmUZk7e-) ZD-mm `mlm,>l0 ݥn۶Uvk_ciC fXm$J&zmX;m6[al( ֯em,]6mfyhmk9[nU6mc@`0`0A-a >ڶVQojReM6+j֒ml0lm1mlO7һ '̶a mm [m,6 me9+mVۛv9dl tU$o8 6CmAlmanYlߓi&NĚʭtIo[>MvEhL[mbda w6XlntmkBIfyjKlpHMzAmim ; AnkNݭmJHq<-]~_l2[m 6aa@mim; ݶi,e4H%p~+_l4*5K @mmm  mНl|7u[/6y$lX%/vFU[u@MMlm$0m$If}륶o6Ӊim[rAl6e ,fki ma-em6͓ki[mH,Y-VlK$uMZYm[M0 $ll@\fR:Y#2H$!:'$Kwڷ "#[}HI,R@xi   a,OvJzfۏG&nI,K% MI I-kTkۮi` La0lm &[vm~6gGIfݒ%ai7dKl}uU϶6 0l8m)Agm[ٶM㬒H`S-پ_fEVM-ml@ @L`$A]nvUǥ,I[R"]&۵;ȣN]e761m$lYmfHqffufKgRt$p̂UF^z=7ߖs$`܀vmbi0ymkmSylvLnnk~ vR-[ $m{@ 0`m\xA$liK565nϤ3Z Kh^F[[m[6d0m`0v۶ٴNۮsVd6nɻ/_Kkdvy+Un;kY4zvfiR`j 6mm̬qnu*J`< ,RkhmkmfmuhmYk$Jmm[,b{&Q7l%V!5O[I}ZuiKfcy@ 6 鶖5mI'i٪/m-uۭv];- KA=d_Skd&v\t -Τ=2fn[u>mv]m䂀%յ۬T%`Bd1:MܒY.ݟ_k.,8?Al[i#[-6]vqzfkuͮiukgKa "HfvOim%\o X!6M-dJۮntu[_=%%V2XNS'؛M4%Zk,[,2 ? L[&%iۅ]5ɹ[m7I% Λj p]mv,Bd,i ZeVMI$Mmhֳ/lmmlYu Ia( $ojk7|GmeJLKImٴv%~BVtv|K6iݮ]8LAY$IdH$0^WA.9 CI{in[|6ͤm]lI]mfIYyYWM՗k[s8e,~&lu}n1& AR;?Dc%if[[yM'6tIf6jy0Y)$RM.FZQvDT TL5Ԧ6c|ivM&[敋V֭6ΛU?"}6D.-HDn٢ RkFtɝA}ɥo-M.^ɊSaKfdi%6#Cr&j͎=O@X^ |&[?eE9}]49]MvNivh'+xYZ ,B<^ FkF@v.ȲMOeSAMlmK^1GE|OrTSw72!T`1ڪ[)MF3ÚuuK]kK?Y$2#}ݷoS'hX,cvuV svm rMbgq$ Y>Kme h9A!3. k*f 䎱"A)$=K̥kOťD ?xh8B3d4G諊;"e6\rn6OH7vd:YWk1?ӱ05HǎYWV];AK#'dX;84ᯒ< j>(4l:,mk~9pF r}(F–f .d"~eƛ0_然{>eTc6v;"[prYodi)#o7J \KL"rEi36ݠç:IOr E*h0Z'P"_$T]ªԒN(bh$ϡ(֘?E-#W- P&98cFAR}p{ [m*G)=—[-'CIр `w1h3U"žy{: VRI썟& !01@`pAPQaq? dhX҄83Q g7Y>򵘷\ PF0vC ѥf!k@ǐ|8^0Xv`#ȗBQ (B-A4#;q [aӈ"M=m֙pvЅMTaN):pFG/!X7ObѵJ+"(vGvҧGqpz%GJ+ڎNێ<oE4AÈvr6@z(zlt7 L8+~]eP?0}}j ?{o*v3>yvދՇ!A-iuhB}H/qiB:tBQAGԦ X; }G?W#v}`88a션s;zO]D?'F'cڧ٧ezGҿSmI0%8P5#p!uW l5x_du+P!Az=C] ^.Oc#{4]:}LwGk|}ptv@xEk땨'l1}1 9kj7xe;>~kM~Jot;BuY/=h9q[#pCJb,\ٳ@0fZ@ao'?^)`v4F(m(&AN"1 +{  dEETU8,):a'G1Rb8c(bXf" LȉNm, 1~f-_ 8hEfXiCg7?p;/5~d"*0Z  a,\bzC?'M!@@\3 -i'0v t!n8ZmaVzK!0EB8810Q,G4q 7͘A_.3`(!D_IhB \ӊ4(ڊv")ŭN (EqZZqCf&(45q\XXhiJbb/lbD 8" cBDN`" CsF;ada(6JڊDY`mQNsk", " ,L0`+hS15SGA D:4s1ֳDa9:A0 &" !01@APaQ`q?("ڄA:8!=MýaPA[I(1%5 3JݼG7'C  hG P{aP;qMC s^2T"j H&&Q"l&.5>w毊߀ %Bpp"" @a4u;!/H=D 'iz@ pBI2'ZmAB!tP/\Ҩ0t5]Њ0Om;(v 1@dз]B$L L*%DajsQa фPA:&wʬ}xz#T56C1ACX) *+zNMl*wj7Z hъX>Pux1 b8M^PT2SptFp{:LpP1G^빺%3"* Nb"Tc47}78GN @^:-YҰ V`3E0$F5ba.LD@B /KAi!4j:& ӷ8,,QPa"u m ``lqxl'x9G;b(A@'S3?cVCP1W(8-q(K b*_=.q 86gl&,/3B ". PSv#|#/yF u)lE_pa/@ ,kιo!lF/@LkcZo4 017ӏs1˪4+qׯC3\$sX ч9sQ\# CG@ѧd`!%_1Ǚ ~Ң\P`f:G=Ct(Pd0!qX^b 4r6ȩA8q0a4x-B?,ScO>B 'X&j J bV"X+@}hÀp.G)|V#Q!C.:COq7B C8Lpwü0Wp9(9YꇂYPk1xQwk.E񿦢F#<8#ul Wo #b3~H\ Z@9"4A UHjy]D(NNG1ıpRQΡ.􆸗md8d2՘i x9߉;BSwU#S<\8HGCoqos-dby#<#!x毈2`#K#WPMx#>EO%*úp^yY<=fcP|u;Tx?b|j>SڄAb |A8uOyx(x}WTl\KV)yj<1n!w?~y'p2PrΏ|5Gw]Gj 8"F񟒭RfxT~@Cn G RF |RG] xW U `pa_߂owG'x<~4l<\XQxBX^k?tT{μ!~(b~z& ڂT#Pѡ.# '|ĸtT1 Wt!/y:'?qC<+J:`KQN^?>TꝞ5P#m:GnX5Etx8E8 EFn >'y1?YRX,@j/|B.%r9myIE#!O]>;T(DCov GW31ЉQ8u:YG9+A^(R0RXݸ1ӎxT,|<#FuZ\4O tяE*(9(g|O'yf#gcuX w#h0 g3q,FՁ TEV|0/NÊECCP g Nu;ɘ'SLqN Db؂(uCx;}ΩKwF 1ǃ p󬷈YCGCy!X+ ]5T껊 p\kZC0uGC<5Ȭp<4(:ӷ;}AF&ݧ!B]OD. xF 0CB&6|E`!l8/&En1Akns#pw)N':!^₍xÎaPV&PEcro* B>"LdNcݺ8 Ti T ؝RB/W(1?x)9/X1y  B(À:[,$Ҋ,UyO8B8 #v)PX ;:6a,<5U;#b.-CS稨EGFwZp^\8r\FwDyEjp|(N[^PoP&pO-yq@b^X<}5:tD1R&[0a0 )r~"E(B(jT! FF"P5dETfgKK#E׀TY?SJ֣DUQDq-EFΩ< gCF(MGtt:hŸAgu *1AA8uABw-J=QgPgp<#Y\Ο7bPDf7Z&PjLEEBx?j`0jw%l䐨=y#[ G7 :HBn{!"HN~᎜P{aB5N:KE]p}rb;8(֜T'XK5P@]E"gt-O9'7^,!QCAC:-A::/tj."PFB8B!Y^+)E:ٸu*32Xqn=poF'QnΧ]VO{NDMK صQ Vq.M|7&/qۀbOqr,]@F$wb&TMAN7ph@hj0*wi@ #'TKr,=G]SgT#Qs8h![pA 'uBj8D(V#"&(Dp DT~ ­@ 3Y.c@pİ6E: v"б4E4Dq ";A:85Pt@`#ħfjXBp.縔b in@ޢ:8##^QNM{ AP_:B ;AOSxMjb(bN J-ESMЂ@QC{gtw@!҄8n"ۀ{ ŵ{PbL S}B Q@?Fp?%06TB2)q 1؎m:nwن@[n![QƠO GO &4.z @fP sC B b8PB==NV0"`Lq  @FF K8w P: uGPRhgjpoB؟;qNT WQR:sq!ABDZu¢d3៱Q=Yp&Q!P GPA!  ;T-[Tfw(`q6:P Cx7bcZUGq#;BQY(#ޡDiцtb1{[@ŹFP?Ƞ:PNn0vpЉ PC]pP%,MPA(B NF=N :SYpxYB'jEX.$' "5DV w? 8BsPc@D hĠSpPޠ5E ;( 7BN j P qЎ :Qۂu;Pn;;ߨ1"( ը(:; v%} ",E iX*03M{^؂!]Oppj`0;(#pBP t`( 0d#@!zBOP` *2g#;Op')³:8S~ioQpE {:;j(Eq`P^`8^PcDbՑwPCF  F :jfut( 0Q\p@Q",jLq=b7 /BQa*I︄:vS0dZspPEEzPħgP@.7N0WPF ۍhGCTu;E M; X:ㆺoqؾӀAvlDOPE kiYJ: b)B,S" $F-MjlbяpP ;HA 0"S~# "-A@uD@5£1p Fn( n5METhlb`B+PD)Pu!(?`P"OwFj`8=!u)Ns# QD0”5Ӄ:5-SR`0jф@>E^#w7J:1Q @u?zƀΩQV(!1A Qaq0@P?di1ЈZc׾̃/d,17HdSډ6ƹ%splMa{9 c{P ChuЉMbQt5V)%tnq/ls[ΎߍeF{U7gѡ`[]{. W(mAfdtڙ>bG2U6#Lf*qAJB.ؓ_dBܛeWk% "OULnCDƅ*##fd7,WhdIɦevM.gtfoH &C) Dp@! `/#&;}rvnƮt,0ƫ$x5*iaCȮ Z="JI, )DS1#"4.ǖL x/D[yCX\LbyqQIHѐHpLN/R!l,+z;-2EVcC[ؤƖ"kEJzlND6 x'—%kb%o F1lki:c }ք!F/ DӱKN>bbL,|Jn(vC}ҥѩƫ؎㡜(.B;C bFǠ_2ЅKmiv:P]g_ahDK&CSD'A91"Hi-U!$D2.ƄdRAF"/bm9U<=EF"qVho^C|.>pJsB잆8htRu nfhJ]6%-1 -퐫NS/, +lE 0iZ " 5H$ᵵ^$:R(a]dK>Vi[hUooєصcbX\q)19׎= y ލxvtm #At>Ml ؚ ;hTh'3w(";op%5L1x" 7)\x=lUUB%ULYmĚ)4{VWf:MdnCW"/o [_jI$%({XnBzWuZRʜMlD?M<,!z: Ly0x1yUK"ΰEP)hIQD:S{-\ oО2/eT6V;|_ of aɮvkBSbȔF;Ьde5٠iϡ #ɤ4"= -,>țcvT'E «OlJô4͓5N * 2N?bU.cz2^{7'BG70bF%X3F=7B)۴H8Wr%ˡea#L UT^-M8<4c0QmEAjƌA,"{&x4@&4!8mB]d<'e)\Xlqi2Q+򰷙;;bSD9!/,dj`Ytoz=HLi/%نHlq54ƝqMJ,ffi)(>oSoMBߢ? 4~0btЛ" !1J6!Ayb tƒYD-LWj<(Jd3h\CtBx^2tkgn47M( u< v4؟&Fh&8JH$I$4"В^pqK!|%xk>'C'o^ox1q?o8͈{+/^iI2!C1FB$iph[ُ{ic?BSCVIF'$BXbOU7MPoȞ4F=ߡEh*FW} FMx2iQW*o?L~Č&XF ِKׄ$(:i+;m5f+c ,a {pHjБIN?! 1ç> - 7|''sq4yNp3p<`IO:|(,> 4}b(ĥXHVYŨm\%=~٣(y׮Z.DF8Y1D fRћ&t65ZfJOcK. zl ዌ^ }Dx/9KиExo?NY8[ !`s-yĽcy6t[ÚB5_N<cKࢇ/һ7J6kfp:چ!v7Pq0\?5ЫYP,IOC72$$Ghv4,ɄA*8,_' p!>;G\|?򆿄xMrC: YT&™Mhm6 ȕF]LdƅG_?NX(+Cj7\L>}"`}!l2_L&QF;qcGBBBȰ6p/m J= {]s!<-Bѿ{_)^~wî$y5xh|R!,!n=Uhh5pқɤ5h:.I説(L<CJ] pHHhH oDghSX $ѧM`j&l0)&MbQ6Zf BIs9J ^ ]Ox^. ?G5;!W93E k.육bɖѦ,t`n,-TL7VkC ed*QYlH0Z>#{deЭidh~Bѝ/KKdI ͡c:I= |HL8cDOl =qXKE x7Rr'?|$5l|ưLpњ舍iٚL B*2 $I'aDy̐3z;Y$R%cQ1.!BpH Z+hSn" ͂ؐlDL7v,2Sx$RGd' 8s'_ۡyw䉟~KG^+ٯš 8?Dt8%؈>o&C"w?fx*jycxhHw} 'hJe:MeIج, tRMtm O[7 b3)qѻ!C9%:BZ6ߒh^ZD3].tzAAr B' ča`TESmv~] DbjA5B}fٱC))y?5'$b؝tC F,;%$Й3_k^s8;>wMxâqu<DɎ6OLl:R Y3XF` 1)Mvf,UG7X'~u,1NDŽ-&(T&?c !WKRj3N>O䜯 6A׍E~ svdGL61XC ]M b'A?+eѡH[[$HXboE~)5 ' i:Ȗ5 L?'h*n&Y!;cxAx/< l>';b׊,'~?\F/$C|N2M=r0&.x-šHdC»B~&S#}_MҧeG6F;=E%.JQpXu.JlAW5LM qLD4hl6u^ B.8|߄㡓x/-d{)灸&kÜA3Fh̃%B}66qŬ-ф,,G؟Ǒ8Q;;(f,G~xN _ >qD>{?E/0tO~/΍{B3ųD?Уئ2x;u,ĨКK&YBQQ[x 8?e[.R6 <;k8\u6$NZ;c,>S6/ь\%c~)'.g/\zdot^[D`z$볦0+y3&ɂBw- T&XYM%O# ' -rkH5'8:554Ȑ6q+2$?'_p:9b0|> ~Pq|g x3 b^ƅH45<2-#)8OeٙGYeVd[ C} 3k"c;lj3>j/dwk(hgy|%<?xP|^vO|v^Dv^:q?Ce&"9;@wQQʮ6:ӂ, (f6=!>npFD$B1X+LѦ'ѥƴ#l`0!:w\.'8O?9 c닎zf '|vOCB\#᩟ S^ ߄o$^84+Mj%Hf!+ڢi:UpTE춛/bjъhHd4d2熆].lqgJ7/>k<“:x|w_|3hٲpF(~7o56l|,C/Б2Jbv+7ײpл6=qn v!/4$PHKHU?0FaقV͉\^58!,q6v3gc!r~ B6N x-ѱFF +ʚb<h,܏hje Bce Dc8^6~B'<;59=s8 x\_-r>0"~.;6|(쳋XǡA.lMlC0B 01ֱR dy1J"T\u༯=x/(N_ȸb5oxd #|$c\kC(.>y]pቑ?FXm y^%4ȵ#PD%4'xCD22F௡m1zGHol\K3pϾ7g05xȗ=_⑮.9z)ׂr \+x &ih'f ;bGF[ƯI C\Z*=UFt&YQ,^ŔiN=c "\ˡ9Y3|!- s|\cѯ%y|>Y8C:匃pʐO:#;)|3'T=!< *L90ȭOP\$2><$.MiwElK3cNu>W0HdwD K(v13>g|l =Bp3<54mZ>Bx'/ G|>24uD tv3+#lcU"!灥SCMTJFǖF-ѣ;ݣt辆9^:Eג:83By';٢de=Іu;Ks9kI cbbxxK`yCD;\)'L\0уqxz2_ '2Z\\д/?q&'B\!5x/?߅rЛ) i*OCP5yuxqg21ѷr'# ĺ/%#p[мٯ'W䍿/va7I넹gͱ#F2 =svL^sg~C5鈻?82Sc&j%CCltt\Tl6!b1x#oɲ|ŮO%<'0qDzNjq|zc Tupeއǖk|w\rbo,9u#x4*&5ؽ#ȱd 2A񾸔bY&6%|-q#%8\Y(bY&cϋFt-&GY/qйg(^FAY#KO9һX/Ѫ4`I^!8 qi͚.D,xß/^Kŋs|RpbhxBdb1'0) !.0!e2 'c4&GV GqkŋpLs>pMtv\ 6ApƸ<,k0/GLQHɖn'F?0-2x(˒o"DwoQ {-qdŐƋ&'y4^6N)F dMp~viѿ Ń"FO4=A`Z̄~J0f:!(} 65GN[uCxă؅<-I~E£_/ r$B^Ǟ6A'd\s%HtlQ8:Gc()>^B {.M;6>$IY0>qE[p'я L y\/x)θx|s`.ivL (`_F(k𯱓ŋuho"سetp3/)Fg\Ǒ.18َ;'9:Q႖^P>І\SRz;e2ʖůBT`ز c>jH%E pD//γW33p8FD ilTx:D<^>3dTkJg" K-;-pKg\>;>9KHOG;FTK/r^/(K3xCc^fb1k;5 $, B$8 N dcU#ƈ,-oПc2Krظ8d( ?9 lג~ rd'\>6tex+'=U1i؈Q `=.et`q2R\4ђgcdc/Yhe,pa g\\xtB| o+fD>'3N:/=\!Ͼ>33/5(4/\udoJhW>{;7Nxn3N 4EɃpEqJwb' \ñ?^"w|!y-u( ^z'^1ot7^x+EA1$^Q;#|u;z{,\(ɂSgHTн#>'BȖILLPIx~s{'͐].rd\ >/^,u{_07d6v>6\_x0w:΍?NRKukdp`9N h= ;6_\Qsd]CE?E4P[;1L'o5o#D糱{:6"⎽ 1^d^ralɧNjga'?It%f`H! !EABxmb?w~Sx!pׂ' \1xGqDMq.3\ \?Jhz$\{͂}qk2z'|SnUhc".Dఉ\5B)6A(^wp>g N_/u"|1q3D{8He.o׆ _G4xbYY8xᗡ¢VH>R Tޏ lzF٤l2C4}P}$Y;S4DJhQhy E_+(.os|/g|%9^xNtv_?J<)<2AN'Ǣ ċX!z9  dL}4pimQOC(Al!+> CPID{/ x,3>5༺ 1f?/_'ȹm*l;!|/ _:oş"٣7 Ec\-uF_n3gؐѡ݉  ]jdP} UP?%Iq*1 \t,8 cCD;\wc6~q_31%;N5upc<םǂЧ~2fA9VYkwlK>OȬ_iRC"74Otoq|SɲQlnc:y^3͌?и\&>.ixXD((:gbqt# dx\SEW;GB)ic3oMlY.zl؆.аL NqkFĸRj{b7yߜEN_Ӯ&|Sg^2]σfu0do`cq 2$>_rB?FBf4pߣbZP3CpXgfbIc $3=C8n$)ضkF.S4^5;;{/ \<旄:2Na~ `5 s|{1x'-(v6vl녁lJ?6w|ApSQ&a$&p<LO芶CpdBK?N X26z4? ƄbQChYfEWs8<(O.\t.R燬 Yb◛/q_hX4h^62Bel4ć סa EK$t>+o&~ O KN`dCie ѷmx)дw[ź*9K2 "ђ$TȌhY\h cu!磲G3,?G'{8CWxdΠ|u!H׆|ƇŮvO'Ѝ~]FqGg,U3= \N $3D%Ў.ǓƫLz/-{"kD`著? Q* ,\ Y4# ףD! LIp',t9PGf9,FƼ6OߍJ gb qQ~1xt\~|6xh4!> fD% _\6Ҥb 4i[l~dhM_yx u|/x:/bf\H3BȚo͚yd[_CJH5I  \SSdr,gc|C8#/zW g"-#k"nytgCefOb)K VPȷ6J;\ 8"4 Ng\.0~_|:|>'舃a‡ / %6+d;!7̉}7:Țy6o[Fł+o 0gĆFȝ-rfQņ\lE\?碝pG+e\tB|`Bٮ;p~x'Q.1 gfļ-)xz.Gd4>:/D11,1EɃFD{(ĬqJ6 q\;.G(w?h-qyu]x"|R_<|0h|78By'<;f ;'k3TT,!2F y&leHh'QpjbYcgG{?y*hOc ]Y2OLhCx+,%75J7俊f8O V)+򼣱ѳ\r.x_13d~G"*"ccd\F,y0<- $Q,A;LKra, NHPd5;fP_ `_M.ȗ:?8 =&x~sĩ<2/\/&//\;O4/Hɔv#`K#٧:,c#J% eb%O3pwl_MեcBI4B:ؕY؟hdYtc ؖ.(5c) \'Д Yd糮_ 6;' .L؉xCWϢX\ɚF>~x z'Бxt >\_Jo>3 &<+:F~o,kѠc ʞK*sbʗNǝK;%bCbeӨhNhlB|-в_D0k#dR#6!/_<_N;CϢ^|d\oyHًg;ɤ'HN;5З':;vFNzifZ47zZpGx $Jcg`X+U ~Ǘ_֗Gͼ.)|M`F Սrt>;pR;hjhH HRFflZC- M<[vDZ-!B\'9A!V Oc45DZ:MB-\(JNaLjAqK2\xu.:'"Ӣ`(Qc!.0l[d}#M!4TGgc}菢9!$M*k} lR)7X Fzidyb_I!bQf=h8ˡh)Rg;|p/B碍#xoJݣ$KᲉ/BlލGW'GBD1+3UU`fi6EȆa$Lȟ--bM[8db,u0fD㼍Eg(be<'3|^J^)o?x4o!"p.Yxco'Dn8-\3$6f `MGcQ|KQ.:4t`5Cy;}CLS, wH%GQUɃ/YD#oH-HGAг2RtO@H KqОv$6bngKvCв.;9-6h|4[qMo/|.14~ki+'~f".s|H[Gј3k,tX;帨3x_:.0D1θi/(Z'ҏ"іFZơT:~ {elz 4qm\8Fh^BF?x|2O"*湕 18x N|#|FlXE^P\.gT즅>I*hOt3o $?f9xBe>S%$2t(CE_k4'^d$>_'FŪb~D[vy+OX1Y'ٶAdNLOFXmQ"E?>Bloн (v5|~`M1 9I ߄\tQ;&|5\.:͐~=KXhc S |E1x^2N 4^Fp^- p""Malt|GcW$3z R.S$9DȮR,4f*ҡthd/1F٭g2i)7{&Hr7W؏>/E)M?:ocv.Bpq­M⟳4vv:-Iq[Гi4ai1'FLXc𾏇 Y&rAb - 'lyqbIT`(p'ѥhМ*)6=+PO(Qbb쳡S?ء6Ep)K _fp{ D/h["X;p/ y:p\N:Ɏa|)JQqقCKh y;ƿ׆]<x B:ZfkN|6~,3 wŜ= c61e p4iw!{;Q&ˁ1#(m iM )KɁ$+$/LH) -J4!^oB`&.  mjv:,81 G#;:gҋ|cm*&b)xMy|"#O˿ xx/ p6u\ !XLGKxh,b^j\w6' u/Ge2:;踜12ҍѴ7_9Мv+)Q0%G#b_r'-_tNi n?w]`j8e1x(Ό1 n.0'M''bJ?\zd Cf\iS|' ӯ˞R|v.o\u-#?Kc%edĝ#4!G7$Ttl=r X01 B$k焛. ,9CQC L0H̅,/GМyjE CL*!!Ȭ+VWrlVܨYh.wKdLc ,б21Ųם {6Vt&H%d-%;\7\̗r{)O▌O< g\N'^{f\lf?5, Nf5Vʛi Ahq,lz"4R"x7ƄicwM|:1"dx+2D/I-F \h 佉ױaC+mX&M Lȑ#LqɄ|ؽpKؗBPfnh\n ;i|4>.x')؋淒c!&3΋ ,G/+HbIQCx |edF!%fRM$1}0X-8uѲd;DM8:荋6-Y1WVގ=Sib.bpq ّ.28eSEV%ag'|ip̔xdFZcPN{:Bvel`kkE7e3L~t=p ^63uiо'BИ!QX:dtF؄+kpd6F ,3dxoMNNqk6M܎Fе# pIilvHZFVC!,RFpCHkExh%? G4ɜpa/.:Se*z}xoZJ,͍2k+b$ey5ev."2dP}$ceWi1 J>7$!3erl=3C/t"<py'FQ!FE,T^ŖX(vw݉Ѧ1de^% ԺoWl2eW8u p, 6*K}c嶸l+C 0'BG^bVRk#c63*/!}z~cJg\ tlgE>8C\!2E3ŧX|!}o%c4.,F1ыcqel XؾГ {MQYG|e쾅$c螇q-SXΈia\Cq!RdڢuS=yXR ̗Ȟ(x~`k\,OV`N# #x"f.Ň NS*&~k?㊞Il+8EC+ "bƨlo.<,Ll)FИxKC\EЯfHCK)8XC· V%'b^Ɔ mv$x?fY(ɜhƋ-0T&z\Ql8mdsXyțtǡ6&ay.wDtN-'[AhhB{ |/9)PxDt؞Xee&NgǼ= $1k:? `A-ד b^ńiXߡ{b}-X1/ea)SFx7B|R:"OxdM{fCc\ .2,hm S'v)FE0ˌhPN/t7 b%FB뇫c1 f 2 E H4 ,,2J4tѬ /_bf!%54(F4ԅO{"O,qzM"i(#htQ ufОVfٟpCf}6l% X6!2^ldYz03$e1П 0_=`_G?Ҥ2LQe‚y?)E{ yѣH/'.vXʯ"{f9XBX(l|U1##II"/dƸ.4ބq,Y`Lx/i;%{*cJҔ_|VZd^ L읉lήp&L؜:*r,2 ( Duhe1*BKo DQq4MM_d:66#'@$>:g6t>x4(K}߄h1fT#CD4$ f d`jI:;ɍ#*6蟴Nǁ2?P(1Q E6O\NKgck2LkK tt6D ?CxFOfŕ-<%pMA-dlm'/dȊw ./hN5;kђijB}%<^Dž6G3Zd 7lgƄƖYX4SFCάU lDm0F'j:&GDdkeiǦ%a=5I2K: (IF<OemC]/eiK‡?(xbBjP.2Ŕ e蝓YZ5+!xo`dE*SfceE ͡11q76*؍!{ 6NqIrGiqb5Q"Yg}S3< ven WS5):gkyɲYLf6*6<5 c~y/b~̱ա![,/" Af ѡ8Aav96M&"2/kҝz,5 )J,T[\dc%[*Q?^0/>?NcDe$&WGJ"AŞXCL ;i4(%rhdXNjcc|GPB)P `jLlz)YbR ,cOcYd x8KxBˁl\b)iҦIkxZ4cFV$a&INi'4ŵ-ёg%7x^0[3$њa %$iQb8<[R؟ӸhgӢc,_X(XVbЫr2%0"ՃH㱴`Dma)h|&YP- hRزbtWdBCؙ FоA:\lDCM:xȘzE-hihH;,gc+O0N= %Q+=wDȑ}*%\ZTn$pEDE1b@ZcjΉwpqٵKPu~'\x΋&WF:8oyBU R*k -CT ̍ JM4ǪcQS-4~Nt'QTslq"Bb٦S4!t7tkzdSL\葲I$xV!7Hu!Fl(Д%!#6t'FʇBnK&(YZ޸ѮŬ#^FLf fP<eXjp<`7Տ"{3 cGFx?gBDCXؚ)kBD·!:ċS7}RłvA]FECtcdFrz^4[{"e>KИ~D<MO6r);$jeG?"zD&ßOCfRה4f_KP$_Ҳ}+Y5,1 jhéЍ-y 2<z "'L|*bVR^ j6)؛vdFEm2&N}; "Z769*dЩf@1( $ ^0r2"lQ䞸k&St-dYQX'6h%NŅO%M Ke;82X,14Fx"4&ؐ_B"7cji5!T"cwUa46ؚossAB,_I-mA%ދt,c|0cNt(ڸ:Йڢ>{4s,4ӎ.r"6a ҊU_cO iv$ҙIiO)CdK"v5)t2J݊2A, ]ɇ Ub$dF:i*`kdž4cK#d:x%iX}5E612\e$f8x{z"c#|: (,rm(5Yt:lތw[ óoВKBxcAR%Vv6SE*LRv䦲la8%l۫đEOxHNFyusZ1"8,$Ȗ;?M T-e' ̽,[E61bQH-`:6F^!T,yZ,T- Fq!TKPDLu-tneUbfdؗKC&=3Jy 2&a?=S.c0mU4ct`JP8S0V@tYv_%:02xF[~A0[|ZSLH̑7pXA$ld%4oBEpvCNgYθ'IѸ6LrP=C)ДGC^i* 6Y2+:QJTHzBȹcގКXQV(?bUZۏ~}F޺)(8lдtBèc۫զX;E,D-+4mhR:b]!tJH5X7cO |?y|l#zbGL%.?E|`~67ѡ$Z3+%Ywʆ]:keFRYصV$ Ƣ% ΈNZX L͢iō6'B\iAIiItalxftHv7^N ]^&eVք(+Dz ?>*5ĘM3J]WޘR3=yB4ӫtildo"+OQ%X6ޖ ,M=`6xb!S-X.Gf`jv^GS1ŵ8&h+i56&BЦIcEI?k hDpȂpFOEmf^Fްu m;H3pQf[DӱI*K)`흅F "z'FDBJ%a6a{e˶? ѧA֎d^-3b(t*jvLg 4I+ؘNm[_"I2i= VO؉8anfc#F$%m:ŇM3̆j>bF SY0BoCo em=`6,1ؙr6'6 {G`yȄ8#a4S3sgy(6L ,lH4bX&i'sE}` H7L 6X!ILסR|,XЭ0@"x6X#%S?i'ѱWӆ.#na%a;61nt8M6i1e6X5n`AixEC+Ʊ&?i(КǴ"J2,4Kq ;e]$;[zadr,COKpSiOcR&&RZZYȜzdJ{`oHFC$әЍ88Ntт2_ZJOfphb9d-!) a{&[(xW`Ǝ:S+V ۭH'Uژ_΂Ah_SRņ!%̽ /GpMVzeU=FgacռC*vob5%S q2;׆$[kfBj=^!k1.?FLs(rZ(9f'iGa M_,١p6KOB*fg,%jd_wzEOLuOCNuSlAl`ѽOC`YgQ=GE9sPK-{"%Q X4icdCj4PdHXUa',hm63FxcZ1/fml莃1ЌQT 6lKYХOHBBFVe XA-d4z ~FTJT+R i&YwI?`5""m?&C,}"~!p.n} !ߢVFD%mAؚ25XCt64o ehۢo?On%Jf]*.dt&F)OovjV|F, yE/ u!-3oF'Lcac:%E'UbO-k{_v[^ބ*b{06=ItOHu IՋ% (硒pYbk!0GCL <*-#+06fѨ(E2ĚJhGno;4cQV1^63_xL7ؓО>[3m4Y= d /ccKg:#4&cwCvdΐC@2fiM2B[ OL{HeXD:$<VᔯL!#M :CQ<'+ls뭮hlb?0Өrᛄd&GŧIU4c.%ZC_cCjNϱ[ȹfXxzqi)oz"ORf=X+p5 ݾʊf<}jt4EZElC68I=?ĄۂX%?l5ulyxUޥѐ(ۆ PE tl_biR/ЉN:kBqS 2e5EH6O EnA lD*"WxcK)7Ci PC5n LBH=BXde5%Kk>p+{K&a_lr-G6IŒQn \]ƑMUL*Ԣ~J&96&Q+` ׎Oamƚgᶉ +4<4*4:WX#xUѴ4JICicӝ4D\ZaGCVaW+ˣn f=H:P{R了d{7mnؙ+u6>S{BLCKXz"YEՙ v!-S-0CS9zL97ݡwvDw^ZȖ}td,_.K \Z] Pi%C[/MgEz%I8j8bqQ] aP'r{5Z·*=+hI)Q/ΉW{v&Z:3ӱ,+DlOOfΙV}pf6!+fB~kdBCw I<- IذhFӚ- %B;͈0c*C詞p. vV᫔L8%} T2k6rc45n=DZcilMSyci7W6YW Hiof I4:25%6%.RCЎLyaTؚgXK{lV(=&CLfO#kf0a e 2eʒhJկ 2!4y.DWlp2z)FlunHR_ tT GzdKhBqư"M iUoC#ز? Nt5-DBuMM!bc5d(Ъ<7ކ24Д`OHn:;+bo"ȡ(a=2j$9fDbʤQ8Gb^"DEt ӼQ~M H0aHI+؈ĄOC!TeNDK{/I ǗwUOb+-mT&5dFƜdOz3O} 3D脢_gWؗ$/"Yt}᢭ 28LUī,S"h$6^&ņX,s(%뢞FD8etK3&Ж^sʛ+ ozhcgіv2 Nmf̍kTIȏKO E(~SC06G&Q,?b]!jџz, KA̰ى-Z1J}Ү 5Fm20>)P拡;M[ n#} YnhPkm_FF|*EDpClH`images-actives-html5.git/src/share/themes/popYellow/img/close.png000066400000000000000000000030671250410645000253320ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs  tIMETtEXtCommentCreated with GIMPWIDATXՙk[ƿ{gnӱ0 T鴚<EqѕVDžhnʿQ|m@cR 誋EGbb)Nv:wIΝo9},"ar]w1v1v@Fa(2 B={yފizkH?+%JiRzGQ)B.eSyqrrrNPQ널B=B!>lw? X. E?$ qwlqLMM},|>RM*뺋j[؀뿩16'? J<[:88#ɴ:PYTU}<Wpg:|>LR yBvf;a&>}n|*Z X.jv/&jիWXZZ:r/\hv\.ߕpRjVP(sBt]G6HOZ\gϞ%ٙ $Gu]H%YEVCTBKmò,4HmX.RZ&tBC)T*"Ldi- B8e)6^x۶\GPBE^T.,PJhٳgE5x=C5jKFFsϟh $!44kYa ^m#HHiqdPsuD_~^1 Y[[KO}b{{{۶Qcccf]#D۷o]ႽD\Wiccc ٫fgg#,*LMׯ_wMwD[3TaݝN{[r~ 0hЦ]AM2bAkkE-EQq!0 8VC}@\q`stymb-v׻%QEyk7֩yoq^ֺ0\ 5xz@[```|wG PMeQ|}Ϛ i0M3-5r 5Mkz9*Ki=x8KqΟ]j;[d27oRڗ\.8bdDs^4MSP\}}?Q\v DBW\W:TUsss8wܑ !GB[cnnҾ5ʻgffp۶m?:r윞~8΃`v"qF~[?p$<d=NRl۷4 /u3̟ʡAj FTUic2D2/^U?<L&ظbh&(~%XxI\]ظ-;3>Co]B4IENDB`images-actives-html5.git/src/share/themes/popYellow/img/eyes.jpg000066400000000000000000000027011250410645000251600ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "i !1Aa"q2BR3 ?jzݙ]:0%:q g/*; %?xʸXC+ȯB,FjlWVqϊYZVLmQieb|zq%u>%=:]9n|{+ \_F{ {ް~Vz xCW![S1tic~S`qm]S]\<4M>hK \`ao1UӬh+IAHerY \b婖9;;images-actives-html5.git/src/share/themes/popYellow/img/eyes.png000066400000000000000000000031451250410645000251670ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ˧IDATxb?.Ā Kr] 0H]:,wm'@$=`@CZ1 $7: @didf?"",dud4MiB1q0U⊬ SBJ'ǐ؟XZ b9 Zj$ πxo$ŀ%!}#dk@ 5U=Ԝ7"2dī)bRߤ@z2X*~B@l@M˺|bW )H#3!XOb PK"<&2Whn$E,B-d$'S@]وTr_$5V1o8ʖRԣUG.O$ .b(j!I2І7(nPР;A'>K@| y>ޖ]l؆F=FiAh@H 2Lh B}@bGGJT1#T f@Π{abn/ kd(TNJ@߀;C hfL@-V"?9"PoP3 SAXB>C2>:MNA tpZ gZ$5>]x pB 6& [mEhVD vqo@6h#xI5!X[*mIENDB`images-actives-html5.git/src/share/themes/popYellow/img/eyes2.png000066400000000000000000000034021250410645000252450ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp L!vIDATxb?.Ā%3p] i:~({X>;l 9fS J$w$ /@<8NF( @M5Yȱ␄"̽F@| K6Bp ^yPZM<'PZT9@*>?K} g~ hB-ħRb@ S8ȱDׁWP ۡC3/&g pw @V@|CFpQh[6R@|٠Eo MB">@]XbRC+XsiRk."Ak-sHbX!;G[ErjT%@_sqMME\)3aIВ# JG+. bPKCŦBqZz"~  > RZ`ta 1 !lT0kB# <[&Z ~f91u>B7POՁ8jvb@Aj)T' LIq1aT|AqBbU>5( ;NJ: {6LH#S؀'c ukZ MjФWq8Fa;8 bL@ 4 IYX$DYI#&#D_| Q(zB'7v]MK<#&. R&{Ww`qYhqIV;*Й1V~4Hx ڶi$_"|ӦQ<>v, _I+?ࣝGi@Fс_ b4 [J%TނM V0}Hxol4gtU46ly,, L[7>$/?"* "/t ImFTV=i&y9E2;E!'ܷv%iFOoBGGcn/@3M4QR8NFPc  AKH,s2]Q>IENDB`images-actives-html5.git/src/share/themes/popYellow/img/imagedoc-darknoise.png000066400000000000000000000057521250410645000277550ustar00rootroot00000000000000PNG  IHDRtEXtSoftwareAdobe ImageReadyqe<PLTE"""!!!### HAȫ qIDATx[ 8 yEY8f#=,gzO3WqS}Uy"psz~[fX21S 5>}OEV Z} {jygHj}Dǯ{r̎fp֙}ǚӢvk~gM}1ưhIJ>fZF/8+ɲՆ[c:E:dTGIk~t܅ĸ6°)DuF]t8R!vhЦ 5Pp;QW깚ʅ}Mi DžJ:-:kW ӌu.]*FŚjX JA 7ѢkfCTLT:l,ĦսI5!LU^kͭܢ pYwSRAd<}Bhup_iQջ 3 +F[ց~Rd+5£lnBB .2ҀFO>u*pV 6p>)9Z}R xڍq 2hl ಆB ;cex$\gJ1X 1VJRqj Y: q͚" `\#M3B[[KS6O'W&-v IGMuٔ;jb`crs}θM'cgʞj9"ty::TtL)CѩF] EʒORJcA M"u%Jj!MiDjS -iғ$q\(9rscp 8Fn3)tAܲ<ABh+tThk\KLj#G%Cj8f,a_+qœ4# v!8Q9ɐo;~Io{g2V:MjC#Q>) r9|/H0@h!w@!ЕܥtO|')q< t4tO4yP (fw4N(0D z1Ҭ1@3+\I1 Ajq$ 4ZoMA:c<ʽ+ e+`,UkIg^|ls1$Ҥ:0 "?LO& UdS\?23aG85-IVhF'<`k>uR=NsG>]ȯ9)\.CI0ŜRĒA\d ɚ5&´9ڑId>H釼$1j6’v07~w?YF2㧗*cEl*u@|[|=iL(0ĵ=n.]@(pCArDt 㪜9+npGL,w^T KdRWOprb-9z:{OLԋwW+-;? 6 Gv6u)KSWxvf0FX-P 9 =\*J~rVp~O79SF̈<%rjVcۃLMt+tw%?.itl!3IÍO10EY߉72Umd$TYa4&FӨ~'9ߛ6vwEZ( $V9/ 1q?$ڠTVȴ)A0DFDŽpI VT%\R9d<+h9egw`z­[J "!it.VÔ$퐯0~~#LF<# }([eb#]/<~^o0MKcΊN S2&S4 swΝ?aKOB +(Sޙ^~pZ/ 4ۣBݴj\E8G8:zomK8l|;kW`֋W+od~Nv\>&E{J~r MZJVR>0\DtCHTm4rV6]e'sJ%`dcIo4^VJήL^|!9DT`ߌ0=]Jgo}hc]n}fQ9㷂I,L'Wo ;?v0~Jρ Adobed         #"""#''''''''''     !! !!'''''''''' "`!A1"aQ ?[I7 o3yxnhBc'`%̉z͈5p4kֶRD%d|,^6ز* L+փVrgJ[iPqp7=qV:YPW1>Qm:7M<ԓ(0m>Vzimages-actives-html5.git/src/share/themes/popYellow/img/infos.png000066400000000000000000000024221250410645000253350ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp *#VIDATxb?.ƟaD 0yN@8;k,#2 :S#wوd; D@K^hLL3?@#6A|A  S-b-~u0? i@ j̓8#'5bb5!h4S˘uw->7RRe_ ^Z'}X!-=hg?0eq5ia@ߴA"ɪnFKg@5Άm(zlc1> ށqP!뱿8Gdv9IK i8q;1Gc( <2?G=7%?Qx:'CT֫B?rG=F$0;^IENDB`images-actives-html5.git/src/share/themes/popYellow/img/infos2.png000066400000000000000000000024621250410645000254230ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ;:IDATxb?.a<0EgB3I FR$p$N+pG $Y#q՝ @didv|b&RmD?Xޒ~Ɓ r";U", XH [7Lif? i2Y!=r$Ѥ4|}6|-#օ_ܙe#7RI @I?UL ?0ujNk*eH ZFP`w,GKm@5Άm(zlc훑RhU@&Àcqӏ41m7{K i8v 1= jX7cc q!_sc7=Jc+f6 y|Hz#r mݏG؍7qIENDB`images-actives-html5.git/src/share/themes/popYellow/img/meta-doc.jpg000066400000000000000000000026451250410645000257130ustar00rootroot00000000000000ExifII*Ducky2+http://ns.adobe.com/xap/1.0/ Adobed         #"""#''''''''''     !! !!'''''''''' "b!1QAaq"2 ??֮\"`eZcN@,6I /;mȳA @sB1`!W9iKoDoy~wa`\l„OSXڋtm,:J~0h. "N|uAw|z bn 8H*h?Y ]4MoK۞egm0ZIj4RxS n\tIrjd' g:IDATxb?.[aF40#6p lb$ABrP'K .p\GïIrx. L DN`s"//E?g$k9 CٌDv[ڲD D\!@O~b)jƿ@, UC&hz/@ C.8@,bR# %&eS#DO˞2k ~K.v S/XCe@mȱ g6G=61{Laćѻ jT gЪrPGبh|cRc nTP6Trއ?hqH1}6 3mhdE8ঁ*IENDB`images-actives-html5.git/src/share/themes/popYellow/img/meta-doc2.png000066400000000000000000000025351250410645000257770ustar00rootroot00000000000000PNG  IHDR6#YctEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp ;IDATxb?.a<ΰ ,h}qg J 9fb/X]$;$>մ 覽z@PaT"K#U @j)z`<,H 7@\e3\٩nH.`!X 0~2峠AZsRԲl3C-f &$Gnk XT@â g(l9K8;lS#=-{JOˬ-q*Za"@ S49 j 7C2k Pب(u4q FmD`+b5* UHl-#c,5)Ae)CIujX I  I-#A 02*h,@x@Q CxւֽIENDB`images-actives-html5.git/src/share/themes/popYellow/img/nuage.png000066400000000000000000005102351250410645000253240ustar00rootroot00000000000000PNG  IHDRD;VtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp G<IDATx eYZUWeUW> G(0n$Zͪ[@It넑<**[v 4GM9Fg]@ݺd>(wq(C;* ~:|"\sUi)w7| >ry Aɣ)fTQP1n9͍XBz|I2.zέ gR';\G1EnPc )V,RGPNQkY ~Ev:O<"yT vU#yY@*Q˨1;||7l8hG ! JfTv$:G8>=[ hƇHߑ*H <8e@{ U̎2@!T{77wQӋ~DREeLyz:8pT~C1̐y@2^` CM]kY1u5=s̿obK@Na3 z٭7 ɖ,.ZQuU-)?C"7Z tA~?an%:Z0T4ŀ[gV+FRg@ǡ@F ($@hcHZI|Dй9KFp+ˬϏ$zwa׺{:UOG5@\:sXφk _U^3/p<IGʩ;d>`ȡE|Ry$\xŏ{,J mCz 3":揶u2Z ;4 T璭[źԊH̢M@%n`pb?1M@r*P}O4B"̈1{h *Y ThJwBJЫ\EĎ xiP\pΘY&:>ÛjU,Rxp"=d $I2p` 33 ~-"P%UhxØuPK@#Hu^2_IM,n=k^2@q^~Ǽ4$BB> X"I G(눑m,E $Z:5肑<*r>"yPPCa)I$7j? ^u0 @!QFe*:VڹbuՉZ<($8;[b%60@8Dr$:D(@E}%fIGp|Ƽ{@1Y mL .rs Sdu"NT|ԅ 8s|51@KlHCF(ϨXM2_0N=N.@,:Aɣuߑtܭ)̡J$tK4J@y/T KCLTPlsdp1ydcdٝ4BEk @w{pN;e@)!hBU+Hj7{{TIU,%.ue=P_޵}4jS]$7)k2#aZv8Q>%%G#(Yt׼$ F 7AkfPp:%kY$.Zcj2{~T C#") YCub ={5VY#ywUW4A^HҲV0Rɤim ̦*[n2Lyd'꺠:~Tz,T1Đ>B F?w%T_:kp+O-?n$@Z4nf~.&") n=.?EDgfP0nx^y-Aa<'Qu.#h: m`3T7 0K*$1>S*gI)a,J REB*qK=*~Ƨw{ b꼟,EL4Jz+qt(+yO*h.o-x<)H0 hNU4$0Etᲂ9RN&1E(Hvx ,$K$ô)SGF;{et/f̢!iG2I0:-g }^SI1  ﶺEˆ8\I ¾iΐﲇdJ9WV"OO|CGw$ +D:J"Hk>+Uhk09z (İ*OaM]C"7Q'-х !#BH*Wy |suO6>y(8酬ŰTeAknP[sSeI$PRI$FC:: h/lO 1G{ ߹Q [#hE Hs+- 1D:% (s3ĎG3Ӊ%4 CQR{t(8h>@ !%N?a>DnP(Fs[ %0Eh D󫘡i:3NwU29"ɳw[.?=Fda`7z-ܻ@Kfo (i-ի٠#|^a風YLI_! k` /aT^񭛦?ذ) wggZLu5χF n)| >#CrWL(\;YG ͆dpz0MfPpTMQMC _\0*Dgq5>o4R #0C@GJM5n [rmSIӷZ*&ymsniRl:ϺQ EåNb*t5G6 Y$Ӵp J)qΣ~̑;T,h;HAw2p;s)j͟5_y@tu! x$KƂ zF:qd;a6Ln'N1h9]u ),}f?@ pU7mj;.OH0,`%\bؐDbnz g?\KޑMCzQKED½x^A7HAg?HZf6g'%1ώ||ZJdrHEH_wP@S׹`u H AzPHZ$f}hbw6_ Kg+΄d(eV"Ih#FEaVP@IU DNp (aPT8`TP۳-I DE#:s6yc/J)dHPKfD:mJ=հy2l lKѡyt^TK$l?3 AJPHC"Qg[1{,3B͚wۘU U.!  HcU+ x8əAHAC $HAs8!tR60ngRQѼWdH>y5ޒYBs?[HVn=ɞjvZ(>e^Ok.gH ",` w!ōgwQ(;^aGs滐$kw ciUZW2@H]|IIFw H͡b^)-uVL/X BWbvB7w12g7WeXXgg?P US,cXCr_9ڊUMUl?v#GdfHNw}ibI֍'ݰ)Fq $J[懒+$deVFU#@P`]f[AJ"1P(${@8|JΨ䐏~3 bs'ͫj`\=NsW9hx4JkrI2EϚ׍>jTqUwSim9Hͣ$ ݠ](;(JKrhB'y/TVX$ p1x< %$Tݭ ,+UG{=|t #;0}l P(=8h58 UkޑHC9s*9 ЁP *$3(jB0@:PncX9l>^>$Kis(܇ hT' H %Gd=U$G*{H@N%T] _C6 n]7iWu hh%%eTwuحD^c 0hzgGxEw)Ww03OWWnΣ y@G@ u#]5$p}߻IqKȆG69B)L3l4h5}a$lhz4dB ?(J W@hU?m^l8 9@Kv#dK7a sdS4oFrZFG@RDAVUH[OyBu&ٺ%y*_ Wz|2lKh/;Uq"]mmAI5P094J4+Pus z wNG@1  ͚#y@|-^v1 +(*٬gK A>0QLJqzh N PR]w )1DXHI);rv#Y{K:i @j~%e'zцo.$$ɔC({ C|:US$:2%Dġ@ݔ8 @2[2 ly7D`h=Jkm SĂ-G 0$Hɡ@y'"*N<2W~fj$`ЁXPGY#+y$' Tpt#wŪI֡*u=.nh™C7$`tBq86 yG7QPЋ$lX%ṱ3{pL8YTI;Iih I߷Z(i(sU;WYH9S탚})hnp3$19(ZC%8JBl2H:GU}|#֠H3U(z85bu+G篒o$ ):!~JFn2?" "C HAL:.ȳ%&E@@%|E yn 9e:sT֠@j#Iq&|E9tO憨\Y=V6Hq ,ҏxʼ ɣ$#0El~TG1EPЁ9H@U҇)Aݗ*# yE#I-?i~1ɣ죂_In[F $d~#-@W!w<ꖹ.6T%$֝ kl@rȏKl HR䑺u}k滏(@h?٭OUYA 滑e m )ivqS(ub, T)~̑yDeH Ht0M/\#Te~ͼl!); 2_9͡sEIs@ xCD $ 3 .11`>J -j }';p]fQ^Er~z;8@ $H3[UDf$!i+2HWGh_ɞF³ $kS|SN4hS@Ƒr9rcF,<hBCSIDf~9jӍ@x:\HTځYFsaXPL,$Tu{ ĀG*A3~݄=':}-{[(8h*:R% ]%2.&>?f4w9TIH5G™rs$:KFtvvXFpȗ,Pe0R`!딃/{-ܷ:hFYHZpԚM%h4Սt|P@@((N%L4<)-R*P?:+)fPv(tP -d$U[F,Pyɺy%x ? sJPUiF9i.@hB4GsHNݬ71E" |-L #u ~,@>ό3dЪHg6ܭ)h9NB$-F1$({2@H>G GfԅtS$rFҥ7 ӆ1C().mLCɣcn=ex{X+uj@pHu(@u18Q8QFR*S2m vh%UqHyT$]3YI EΨ!_FdNT!. I@B'T/YY61IbI=.2\dBՇ<M.S*/ }DI ;>R) c>$.JΕmbXJfS4 @7*5#DDSN}JF8RI3,Pq™.VU3k>.`h94jo/Ȓo3|D^Ou_i$ $bP ֪['Ѱy*G3s45!HT=3vdpFRa .Qq 䄬!·0FEɢ; #HBH|&R+.]  U$kQW1"NdK@S(5Ԋ:/ʁ ~* d $>_Y( )h+Wh]ts!P7ܚ MlcE][n<"(e-cvDF(}0-`@/C'ӎ.:K.<(& gĵ:V1ElGtPJ A㸑wH9uZɣq;z5(r"u]7/A s L}> sLsI*h>C_й8Jb g|:fhB jEaDEch=6ev]WY|P_LAUCR_ZFJ--%TQ{͘Kpv3i0GèW $UM%v 5z~52|&x.fc H1{:,ΌH" c@t9.ߴ }$#B7Oɗ aѾJu#q$U;]F%9!Cz3A EC=l⚥k P:lBz;8mE'EWffPZnj‚8Pv3ԍ$)0(L9^V̫;Ql hJd@jك5qΣ[ et;3὇DQɭKc;H!TA(u;8s:YRyRŭf#) wϪyiqL^s@;aX1"D8$4񡤑HnB΃g0.w$|fHPQBU+I^ .U:.SHۂ/}@N06H8t.PlhQ?"= CCR ҃;:a~dJgÙNw#@!K:Zԍך*t9aEoPIIu\Y)˪ч1GCDêbѾa$'m+KtǻOi  `xV6Q̕ 8p^n$](%Y b!.Q]07Vs47Ǝb#fTrhO5 D]CZ ҁplF%n?2@'&Qa`%[S {խB7N4+u%h( $HBў4gHe瑒ɛn]6G;EWk++F@6(yn3\:_[ Nv  3P mT(CG||,vo7*1@6cfQEGO&!gNTf59$8RȍgP7x bvB*~{.̲3Ƽ#B hQvT,"6֋B9EF{M:W#)qJQtQ@a"V/->0zҼ7ɣl֫ncHdE Ns*T/Ɂ!L*$_' u#bzp*IP@_]HF7M iz/}q| A H) 8r|ab2~U+y@cJ":T7m>t5 p𡈬wTC(#k!XP$ulƳWJi7ăԝ) B+PJSqC 7@$SP`k$ ] 4#r,5IɤSa)iA(]h1oC$1'UK~D\}#SD3ٯAE_ /` h!IyƘoE17 ЁFAKn}0bT*o"1ALQ3 ڪdHlB$<bC`%>V}\u$:Ux%G9$hE4^VpFԡ((pvͼ#QGQ\ocQw] ~5 !wB(}'@&ͫbyyټ6& ZF W`Nzg!r4oP@*b0G(}˖lRGIR|BRT½PI$ 5U,] *8YR>hT)xռ>>@/7s$QWbK(hatSs!Vl!z3Ć 'Qf%1R!ʵp\ź|Axb>d^ _5HUi7HIrg");8`QPD}MQ@mf(Oa3;;JaL) w@b^p%m%cxPuUo&=QY@`Spn3TX}&: A̺Y=m$NT>1@1!id386l.g Uek.LuoMb Am5b4xPpX $fAR]6/ {-,RQ P=@QVZFzՐH# 1Q,RS=k${@)dⳏpQI1d~@PQˬ[oCҌ (hHBI^0_ G4FTh7j4 S:%QJ] @^ `8>F'$MG|-Rf(/ł[Fg-Kw$Y792|kEsG*Gwww_,n=յyͭ7~ߨTd ^%00DD@uU {%?T)Q7گR#A"t0]@}w3Ăhu qГ~692i^3?)@LNNoڭsKKKtttXoo XwwwuuvvVFORQr;ܺÿdXArȹ}ͭn=g~{Z:&q|%Y~6䅹(ILPLj.Uʬl3)j/9Hp*QaĈΚְ[=JQN)on@ 舒Z1lرcf?Y\VKp5qD¨>OO&mCD惓SB#9yʐkUнlދ$gDԂ:\?oY./94 =c,{yw3ST7=A&iE\̌:R|l}}666Kˍuttlwuu[{?9F *Dr'ܦ w2e%?722yGRyޭqEn$ǡ0K*Pw{T[2.ڒ{ T}(t40ZH ZGcA6/ʻTw)cZ+w.//jF]JzWoG"7XↀGNrGGg;|uuݷ\w]-b;?'&3ǥcCPbo|7*a6a|Lt\7 jAvL3irx_ ; hRhѐHJ}WWWq `5xZVa;;;R? 1>>o///KmjjU2u ӭ_tF q5GBܒUP $OO<t CzW61G] I 印O}M0EMg 2FE@Gj,W X@Ø#S~}IW2ځ|񁁁vvv>qfoo^C{=w+}t?vuuͻ5o[x|ٙ~ڵkX>%vvvk{{۶lsswl299NB0ĩ:22]?Rh#GT%2ڧɭ≀Sz1GjpQ%r*EtÑHSSgw3ֳFAx=P $݇[vwwl u~˟jɓ_򋫫Th||%sLr{P.o```ѣkvvNJP@H?hI)y$̌ngFCRSF:(UIA@͔Qud Uֽ߼4Ԏ Y ܗZK{{{VںW244T-*Gj~~ڑ$:uS]]]_?$bt H eq6ǿ<ܭfT@ZUu]TPzХG 2>:.V'۞s\Pe {<yi AgMe >r˘$>[yoĐ$jIե@﹬ut_wƍk7a\f399YujyknݺU:uﹿgw#- 7778ژϞ= w|[?ēINڥP xIVt$BVnI^.uLQEtAE]/|Gf|)y$ٺȂ TDq|hs$4b2_xPc5ԅ.4nժKzzv~ĭ}~5ݗܿzvE PI1G>z~A)>lʚGF?>#<$}vQ;fN96/a3¹Ot)Fe{J0覻DU}!W /Md$n:$ҏnuM#yɠϹ+:Yu3gTOK(󍍍U|O~Wgggݻ[o^pa_gg'N8QgfyyYcCjz1AP0_U?7mj -@PϪHU1mY_hl?SfL%^?%vSTD7Vm~kb3Ca3mHjS@܅oSđ~^pKm/oB[!I);w\U-MIGjT҅7o^<ySɣjH'Of6&-̗̑C-.߻sFKW$a<BSSN8(l$A9%r" -]TH~u15kruo=>BBݨ83ҏGzíJRARfttDJ~IrNI7ns#,˧|,m}cᢕz݋}Pɣ,nMmn}Z+DDJ *=NﮅK>ԇ+'1C # Y @"TG0C g7 SqkJjѴJ;SXo>C|[ӧHEfll*wov)^moo1^ x~RƷzҰo䁏O0/O&=e~&j{Q@$n=HK-׎$|5 IՂ@` x4*\D caԱ.eL yGYyr$F='*[d J(}TDgg|i\"kΝ{~cckNuR0}uۭ7C\˗>:S}_Gb+R+[GSA^ĨDh(|J$!5i S@i(uĊ@RE)bfp?HVFd⬿a8q՘}ɢFB__ɣX]DvEAM ;;;<<<|~wwfgg%u˩9oܿ秖ӘAH ۷o? 8 |t*0|=8':i苷T%3TA {suǃվ"=hzdcF@+EsŲE_e 9y$ɣX[[~rwRQz64KjX^KxՙQwhmooWOn}ѡ?q'-[rH//vueF>H A ]rrmN$i*a,8$e'3fƂ$U_5YDQupnpm B]Β~=k̆˂O(û 4׭%N8_jDU՝;wp5a400tLɤRT]՟+J ޻ݟ2HD.^xb>Ŭ$fHNM zڃ<(@UJڇW'G1G)+7"hzOf?7I`Yt&~ (6@J7JM* Zn}wÑ#Gun|ZygVVV!T0Y픐Ҋjw~kRxKwXyt8`p/xfEARm@rKfTByOjP.kTA[n=cQXNBUyM_w#ERO/h-DJΚh? ɳ{ GFFr{JA~O%>\M$I2OInQ󝙐2<:>Uo;Ԡݑ}P=ə/v__t)tF龯yӆ {7۝K?}7_ȫlZ^ihJ&OF!i HDlO`x]HwSS2@IEM#<% \ B6h%ɭ?Wwvy].W:߳d[-IWIzoo_.JƓ.8. :.F*=}Z[[;ֿ~=9}Zuwt\sܷZ/aeHu!j~*UE0!w1 w ѩb~hzZTLD"+N!g{'@+Z sZ5ɢ(%SssW~fkk0RCwp:KVEH%cxp/νa ڜZJō;H-wH~Q'򘙯2X%/LBt}ӌ*%T^tͨ6o` $fVBHO'x$:S4@J?ʨ)JqQA%Ldݥ?y)H !+ ' B]%+`PTM\y,}xj7ڏ9R kmP*q+vwwpm_q_?c;>WXRsܹΰG<8p.ÇI{wuwwk 9O'$u+祛7oXJhPRQ`* t%"<بp[[[&=u wxs<B qoQY] Չ=kJ^Rv˰:9/[1`;= QGms>oUMt@wp}:)ytBQnOK@ovttQŨ,rVZ{[5>hm%K{ljC^FGGoV驾i{/Y:f,2Qm׊zm6zyf Rt~xeVG>nF2<<\H捻)655UM"-,,+gܗϸ%CirD$]%t ]2ʡ5h$ׄm )Z|m#(:M&P*l wRAX{»NSWbJ!% OYEӊ%*(e"%TXߦ%6Hj44|(J˴h6'eUP&(Aou_qIwvD. yH;b~7nTˉx:4M$>߿>rWŒ3>aՑtuު+䪑4Q0p|p(nlUe:#TBt`Lp(s A'wAzY w p_U*92XxJ;ݠ"k-DkXA(5@1$zK7ww~˴ҪK|LRm-\藃7fxrzzzv:i1( $!~zuSx%f|vjݻwy}ϲ@Dt=TH蛷_)YJBhMAU FʮT> : fw3gf&OSƬFj:HBc#EttwwoT*{Y"%9TbJ>)΍_YD1aCiHTɡv_2-޳G̝Ijpxʰ{}ۄޞU| ƪ9xXr%HɣʉF$j̇3G/qv1BM?i<\"LSD8ה? IT].)iLQJ {fW9$.TߣiBAjI-`Bw4l֥5m$w@T*^,TLѣ,*HW"I $Ų8"ñclvvV]nv8$-Uj)U Tr9+}UK{ݚQRԥ7A~0yUKH..8џG ꆺuV>= _~Wl)s@{u߉ Dw^a2l0rx'сGt#WlX cNK"un.L o[T=شKzQLZXjatt/#%EȴYm2yN˴։o%n2Oyi UFѴI[5 xzz:QzyK EuG}Ϝ9SmOL[h?П3|H6/cKPPo6ݻ,B;=c^^}+_5'Iv%,0)Idq&=yH}Mu$&&''bmmE#"oTG1ߝeǠ %׿Ͻ?l!afK1z[%U@sr4zV6x[@ԭ hG:IUI]WLةS3oH UᬪxC"=[ gs )p0OXB Xh@J'F;mL[\jb"ӖZ 4 Df5qsVTDuI}')6661D⥹@ U݈II EE>ds)aޭowCsyhe~ T j9f: V̽<$$;{9HÅUcrQ滑Ct38hrH =9 \FG"o 3gK.Z]ZZXjFb}ݻqUh7*bcǎ*!m|G3ERwϹg'Մ_֧'regϞmyV2sssV*yIj&3NyYVuNbHu^ _`{Zҙpc1w[4vyE)@dnq@J^YY&51䍉 !T:ܻI,:Sg @]8λIIrUoXXІ{%HWYFX4OYcusEpYĉf"s_`{QJȨ*!y1F1$G ~~_12<9H<c M GYR#*d\M+JJNz fPusՑkɃ[]1hk\\YYA,b3ϟ~:#041/_:DwӇNKj`hR`w$ H AcO I>zԉEUJ&r߭Y(KOVA$iXeo677jŗ*i^CK4h(!ͣnC%nbPWl-<I:.(fhs!W7sl,ݝu4kHGB|`yyY{VK CNWq򍍍";1y%{­!'F>$~ͫ8| HNR[]]&$ XԞl5Ў|eckќ>4/E隇)j;̣|hejt:Pl 3ԍoAC%<;B\.kkkՙND^$ Ix_)KP%saS!;mbb"jQ!GgԑSBWMMMUzv``n (,w:hJxʭ I;hI\5$*kAq qH ENFX ~|>c!19Rd"Up'e233ӱ*o_(u!A |vvkTommmLv)( 3uQ*$G/U]WL[mDAp9zխF-gy)' &@ǬjULQ{.u!iWG)-rϔ|$]# $]p DrӅq$YFJbcggKJҽ-mـIݗ:,c_H^(~VkgZDN@R'RZ9@D ɱ1/l9|(#8:o~6q rB qZ!wJ#sn3Mټt4zU,4mi1\6/Yn &8Y__j}j rK mooE o e u0K?coo/oCcJmmm}hrBZP`Brvo6&i9զ64HjI ( ȼI٩G)R;7CW0C}ɦΘtޱz˭LI7Jⴋ!:HJIB&W.E?+ѡqjƍӜ[sDrY{־ @>cIxl&G`ZP|dSnSG|Esfh OzQ jgIoHAG'RyQ\@$FT:ie2s7uoYĉU]՛7o4ѪLоk@ П5D3_QLu")K-(Έhz3GbJG`uQ=<2U>9RG$-!ir %vvvJEKֻfs]H~O wD%*ݳwرc3 ()ϙCҮM^tK;QGdskt}Jrl*@~?yYJTtΖ<%1pЂK.nG[^^JWu:>>KI iT9)րeS4TVv1I[PoS\2jA-?]HJ 8}T;l>FAn%$*y¼lI!e7+EHaHdp;֗Ek6:wBWWW[[\.#oGpIڎtt(ϺuaP%C 8:f/Hdny¨il\i#*:IQddUÜry=*9A춷 WHBb]]]O` yh>RUqϸ9%t-2Kdfh>[2CGfrt IMAus+JR)qZ$Ŋvu)k!b${NNNm3٭+niȚ`֟՚٢Cp^5BN(xҼ||ErjOBW^k8*p/bdA=gSjtK:ӯOȲC۞rL@]G͢z jx=r`XQذUu`0%>̼@lKJ<$R#h&@ûhW,ͰH Q}ed1՚2)2|kUs)hLJ2_89 twwK* uٴkRiԾV_tsst\=$&$711Ì'< (Q 4<Λ E)d|˼ 痄 GAAͰ\{7J5(KuZ}l_AF{ȴy9aCU<}dJ^P8RDݑ#GKӘrpa\$,g ]PGn#F7?( >Gw(J"d |B $SJΌQǭOCzQYGq9 Mܼy422@2(YRggX%Yg姣%ݖ7R8󶲲r/q9OSSS'0m6 X*ku#ubU&-"vsc9ޟޏ&k}ӛZ}fF3ofzr$ה;CC%6Kc\8;cxc!]5T ~73M.Zjs}WhI->_[ݒfQ]aiٞ 89 gNSZ\L{dGd >bzzzossaf07!mZJpX#9 'fG6ZXXj꿬d||Xp2) 1uf[wQBu9{\Y>)S<[Y+0q*}+0iܗL38f333+}}}skkkDisāaJ`rQBR=";;p)܁U:r GfS@x;md]^reRF Eq4ߓL-dq$\рeHAÛS{xˁ15q{R'n*b7p.LP:DY!9j6, ~cwr>`fv820_`'#TڼUa _7;;FRIFIHXX_QD_;ga*CHE͔jG^\\<Of8@1aNGh@  qP(/Jr79#4 *[C2UA!W»KƁL&hZ5'G`ddDif8r@dq#Z*UQG p2 dF$:}784o| @q@ E>NG(43Ba1qRh*z3B}000볳h :duLޥM2 yUWc#s.;lzYI5NKKKB#`' ⣸YHz k '#B'yAf29m(y&YrȻfFyDbOPIR_(g󳰰p𾫫kghhc9 nލyg0xUlnПL&;2QΣ/J֍eA xS@#U9-[^Wa 4j" xE)kj:NBAr* tַD"p,4hٷ ߯t'leoύ]|tt8h3}N#T@c:֔Kh>vB {ӺCy8p/|S@! L;cU܈+#mq uQHpsS\lB(dIJQ40wg,3/ߠ\,3+ tx(@@,P( Zov^aBQŦ\D"!cccyOTWɪ(iic"M%_뤾G{c lD")̊h%'kf#b׾{"?.=}ac; ˒X F٫mBPu}DB{9o[֝>>;;[cccs]]]Ԩ 3%nvѫ*!mX@Jӟ0@Bju:eBN:_ᔴL&@ZV[g[#DQA:LV5r9ewLXA* igʽ~ ϣ))!ĥP(V>gG>'V&Э}:`A˔y`@t/P $$ d*E[>/4Jɓ'׮]}sGB0x:#bB@:1}N_`=ntlkk+|=LmG?HlsL@qL!nOԾEeR G00!L9U .m HG_iUs3jx%,:3>`!!P(??᳢SqqFpMTJeUZpG92z߯_tuvv }dQawwWPZ(p :g !ōGh zi3*:x 4HX$,a?a6, &G@[k~BqjSs*Za%Qr`A~Gv9!Q $ 7?{Lzzz-& B-UΈ}UFaK SïS^V".V%ohtt4I񮮮FQN!͕3E U0)(A;ž''d!Ix*q`¾h!H ^18m dN\OH) |>ۏEKd=dFvvvdqqQ&&&Ϝo}>[e_H5O^O[rhGDX.$b Hz]6pJdHbx?^$_[|/+H>mNAYHq5-AoK_:Vtӑ|65=@{ :!P(?=q3cIgggz@2_y_ "%^QqPw:N#sCeP'7d]= yۡH$ZMVV_yduH#Fi $Pp@xSjšBJ,1'$ܔUcrJ]oS,9dC:BG8pآt)#]a2څ<"$ J{rm%P\ Z=sohh;1bّT*Bsߪ,oi3lem`,Dʔ3^ukVxA1[eX:Jy%>Ҫ j%?ӻϞ=7n`c8HpGDBB̘ Q gR8Df%T9~q ()T) (nP<:Gi 8%q6pMIl KbHg3X>󛛛!LR8V : )ߠʇoЦ(ҦIg|J.0ô_8\:UgOysð4uxP2ps쏍}?G_$8_2b ~.!T1Τ+*8{NҎ&P@q轧!|nBҁz>⹤gKP(S\mgOeguDȎ_?tk4BB;d![WWW0lPx guv4U==rA d%AF;x*?ʆx@ NkߝN433:l︮a'<`-!dG,,PGc24Qf] #u3|jHܠ> <B.s"84FvRMyDg?7A?Lo'R;Zط6%HHH^U#nY:ğ7HrA c'&Hex< ,zzzםHۂL$l9в[Dp*Kz6ńT(e]E6T'lt Mr:DdS|G)A{c B~g(]]]-Kcd`` ]wV#3zEߣ-F!{haaԃ#RD!8+W|g&)ÉSVzF:` ~SAH!\oUA#P iT8D_fkaB* KBidTly6 zIOf)E(ҌFEg|PHb`E?2}n) a2 IN#daԥ$DDT# &1($M(q9}r;;;@S!GDҾTIpwJ!PaM$*$"- 9i*qt]I.́ˈcSq?gͰGiѨ/e4R`IXr27Tt@;-?( nӯ6uêhRuҔ=/E# $ FB/]?XV`y =DB 8)Hy= _hÏHQ{剸 x5xH(WsK—AΖftz\4ߩ$4tH'FYlxRdTouumkBYr[Qe"蟛V,27XrGׇctCs1P+8 pLg?rzeeSHqt'dn'YjOcQq3atFQdž^,CHJOJaS xGzdJtz r:hkJ!}L壩]!)̠;JFu(>@R{m DF񴸁W !(k FuUc6bX@,LB0(tdҸ I|6U aEE~('g}}} ΝуǾ2 D?ߐ .u #=HlSѱ2xNF_Fw=lꮄ9&tT+Q|~aY PSL勂5gKc_uTQ˜BH@_r_V= ! _j*t:õZr]\. Y_xҟ$2t a6dN7qv 8g b:I8`gө|Ճl6۔߱ O8㟉uV"d%XB $84`eAQQt"C>!Sz | adhe=w1Ӽ.od#Ca%=L!NwƟwƗݭ;67722̬'Ac,pu4䄣>o ^?Q=ȼ Rlp ,~)6J挫R}:Q*z}}k{zzdhh‡5m)8㓗wj$D1n  30!Ѳ#Dz&tGd.RvAt[!Vz}|\/c$!:/zORݛNa"e !AJ_opI@$d!\.K"v.J -|z?k׮]:Q󙫝T*}y {3 p!ӨO;LFH'l*L& oH36Dboo?]__ 8Ny|Ak`C9g3Ho )IgI BBxg ʢPp !,W riKm=\'n@DIA0 mq %wGUnp$m0~IR(ewM "46D_i /yU8 8BRjEg-D܈׹wϥ#`0s/Rs*KP"^QN2;WjSsT*;^eH$&OgBa"|_266V$"ԝhqTyjèϱ.@Q't vtT*}??N#3I8NӧCߛ瘫g"@4!uGJ[ ҁ _5=a 3s*p =n pMKΨQ=S=]3 :*#MqmL(TuIB ->;.dVDjH [Tr~r~o;I>Q6 3m0ѭ< k:L!2gs`0*\|` xp͛9Q 5V2I%]݋5^| C7UA Ӌ3yHz]PS8N^Q!ۍK9Lp6GF*8mL;cFZh%&3V}o"Xq^HDܬJOOEjZwdJ)?'0Y:eip&+Oq@jcD#(aX^^C`||<ԩ-f %`[W8vTB p THz35Ω8n-7vLi!uĩ{G HgT/6+>Y .[I |e"Zv()###m덴.KKKu'!#9d27tK ):/ |\oTeL=ȥx' fTuU PBF"5$BZ "MiIc)&D%d"!e*pQūqd«f1,w0diHwr2ycI]]ͭG[[[zG2uww+W peՅM_t 5({A.c*P_?DRS1^pXN:DvҬEFL"$ػd#aA؄SD C0#ږ5ó5baF~ڦ&Qɓ'=TD'͖3LGWWd0#6YH?"#^0(Ih, 󛜂ς>Qz3 h|%9þ ^6%0 Fzh+_uF!oQx:\eanSEaI༺6L@COB 8J~z꣨o $ھ߁@H8,)04MHՅCe0~B/"yUw5z#N`A\AFzfI=٠ eU 1zˎU>:|Nh 8PecVoB!! ϧTT2ֈ[IC+!UH) C]]]ߚNe D5ؓA~[\,8Ij!JUUa^:,UK;j@IQNKI0?="wrZ $ .ؘ7CUپ8Ɓd]zװY>:Oг .}~yUc[|TKsA՟I A~ 3~"׮] bTz1 t˪`t8O0ofuysZՊW 윴h G2kbw4)1bp3/+y` av 9cIXRBځ,]0SaDb46S(eV=p{{YHa`4E/mUaDO8\ڣCȹ1 @)AA?cq#)qPD恄8aҁ `B>g>=Jų_J%YYY#@"ᾸSF  z -T6'$*9'%!К?p6M!g8p'nnNGDA^{1/6Ͻc\aG9n>[`#+xd?T9 Ka&F8 FDMus=Q\)|*+W|ӧO٬twSWP8 ԛ@#"@vUivY+|oE"^qn.P6`9-Rvp޽L ,n|H8F 93NE8n SZ "EQ6񱾲!4NR<o٭2!'!T~&ZP(|>(?\__pB"7nHGGe;qd0%=v\raQyH\'&#P_, ~oJYP_ѳf0bP ;# #8XZLf4 Biʯit`~aVB 7!TXV]vֲDGHm,;/2#?TJ_.Lfe{.WSRU)Zz {׉DP0,}s'PPUCԀÀYپsGtkR=78Lk8c;'²݄r}{ z({d@ÈTs=lk:$=uGߟo3ҁ@| ...Y:IHXϕd0"+ *b5af\p"MERGY;|k1)NE}Abwd!,WR.cu ,Ipp +}Wb!0 ]'Zu1i/jUĺײx/k6q^_jmp"]vͶrv3_"kF c6ľ B.HU_I0gK@`) j HxA1|UmOIQxq[hl9U=-XwKV~Y8B),R5ul9]x@0=m7iT{GdoR:C#$_s^~}uu~dR\"]]]6?_ "L)I7]" 3NG `,n s*u|@>v8Z<0~\W Yd1d| |P?D Ea!ʠz/kYI+!u" M}_ү%*Mt FH ϣIꭅD"!۠s|Xd&Wy'cЎ[H?bpD +@l0 9MM9_2W$kRkB#_& ![?qƹ) r|-gʴ eN!r .}̟ͪ:9׳hCm;>Gn`:EH C'2;;+;;;~+uRGrNzⶦʳDqA+煎fPl8'^{x}BjI}7}N䞎+ÐnT* >Yڤ)(g k@/-B.{Qϙ娘E@( EO; 跅JRvBϭ7 ^y5@$$p|]1cbz6c"kg{ZP]a2!$wKFe/ad*Z!5^ h]_Υ8e@jv cw8www'dkkKj= N08`Xg4^'і@ g1z,IRM 9(wsS0(!2nGvuNE8RY >KwǝρDŽNޑq p3u@v3a!$$_ѯ8=qew믾z髾/1HM@2yV>I‘T,I;~?_oҦJ.58FKWI붦 L;CNHԕ8:*(k6 DBSUNDžt^N(4/-{9ݫcQ#h%f !2nuXX]y/2'&ЯOׯ>8`36g{t V9y^yYX# %뎤t:РO;тCl$8}`!$~gp(^YG/[pn"yB?!`pBq@ƁHYNE=SGh(} #0F3 h N@%=J}N?v(U8. ke7% `2T=fہ xb[ߛ}G:C;H~<,3\.Nuvv583>Tŭ$Bր^Ia?ryLHơ˥?cd"0FJ#^@@rQlnG'9gǻMTb{r{x;ge̎ea^CZ`:BHXI^rtt m`K|Y>F&˨LnQ<.D#/n (Wɉ Sq րFO#2> #y@`"eƊ^8$>)t"zׅ̍=^oHʮ7ʰQ!rfF9̜8:o l)[&T1x:TfFyԩ^TEzdqN@@"6{0i@RV/X6'4eHZDpXh%OFxYixI8F,K8v?Qű[3RY egcY->%0'4yahbSBH4-k\@pmg[?rר?f\1k!bER'ا-Kp%9`ԹQn(hΖ|uBH+pSKeN،-lEѦ|ea9$BA%zp->R(I  <^Q5c ;jeD$i7ptX}G\ug^Ie{ nyT`` d8ur%QM K_2rh\:̺D7w)2#%{cA H0{SO;جGPE9S͖kZH\xlOUQ`\Ҁ$"PsZ"$ Τ5Ӊp4"='9߂3^}8s֛N=ǢQ?CޒLVz7eK:yS !Aqk3:1G% J<5=zC 45Iũ"6AJN ]o3yaf)QRgYgrֺܹAپfr}6u٨+eQŒ4!`I:J9 |B ~_4mc{H;c b푞 A* .ouNmLpH=O%z?,o AjZ@ N!I2?8L h'V{7UƮeUVedC HoPd*X ٨ U.r3_5p:4B BdƱOsH}=Ihlէ !  l9WӶrXQ2+,Y@"J ;U /īƊQ 쀡yE/A普)qcBcg3Թ cCw+os); Wu="i+ YⲮN2? ȼܽBΒ0FY{UצÈJE4½3iR!WFVa\SXp@ԱkQ_$X$[Bl5MHt qY)ew~0z7X319zI}9}^n0n! @9wk8MPRC 7U2YE>@ m2C`טCi"X(Bd E=3 -"  eY϶\LxNZ1;"rV%Ŀ!*/x{pJm(F,^"mi$!J08}_Ȩ(i" zXWUR8,Y?\+K0wu)vG![|^j?b_S.ON +^7h3gODlzBTPy[uZ_.È'/~g ~Ƭ]r jk:D#D9L2ד#ǨBFQ_K0%j t3 ?%n'b#5Y&nH,PGJG@ ,bUTz!wqeUV&GXq*Rt'wus(9rD'}AUbax/]伂xQ0 RQ onЧNI9E.gMI;(0n[ ['ړց m 1G#,R=\y2ע,YG2{+Ɏ;{ۨgٗc6\X%D,0FWh=L"G H#( Iqe8=kт߫w덴&vf xMo|p [6WX#aa`m΄P^C:d0D:LߥIHd3GжI&AhC]9U-!>E  Eu!ΤI4NFwS џRS.CzנO0|類94F B~mK냄6~Qi:Lxw//!n-LB)K3Z{5y/L^R4x/B!vb&R p*=RA 2KXru}HFs†10\_uMaf(\a_es4i:@YcaSese%EL>:[UYgOF"9F#!Qz~Ezu~F< *`Ge8Zןl}N   \J1'я7 d `Yor& ZS{J.K(0.ZuM{#Vasx́U]) zXc>Xgҵ/= T6xX&N}*tW.# "#vPS|W386UVy?@!$pY#UC ϡ$WJ* alNz c5U.y\(c<{~W,^x0x?;ǟ5Yʽ08L:ⲣk7 Y O( eN!$&T>vJb U}Q]yUT/}IL9:72 p)}ev9P BRAcg`ID_a<N.q0L1D70bພ[g}-N={͐k$5}qWea.~9DφУ,ү]DlXWfG^%aRňBނ$&īKfI`"vM?SF;]_B Lϋtf#](Ts>{gd0{M! >MCJƜ#[;]vsMp`$\% !I ta0"5E*OYcﰥ 8t B. "$0.xt3AA(/{U0f/peҷCDCA\c,ѯ[f?/Βz\^FČm-}$+İ.w$`my~GQ螰d!a'2:(׈NvDW Ρ-}_t*FK*H"]Du H0%][黩LY$N )w8cb! gSe#]rAi!X<`>MqvdyȄ}WBBGJFSξ_ޟV v-S{SקO ,t BMU<#TY/MI0I`/{Ey*Bg "Q0lF( zxx\9g2gm4'|]7y!'Ҧ9? s /=CQp ]}N!2*'TV%T.Su+>m$6ЁD ^%*2IL-dD*]SEq_; mpFԮ lN2'il)U=_^[FZ~N[Ke:*ʶѡӮ{540yČ`36A!ࠞ<Iܩ챣 i(2=-t BZN}Kd P%gҥCt gxL iCܒvcBe5z3ڸE? Q3[b_=Cڱ3zwˊ.pG oO,tLY:},]^a9U`OmA3Svbt B .ǾyE&#Y4F&= B"K%gAI|8YrC}2%[6)e; wY}Ο1m5Sƚzz_ EOZT~ 4BZ'ߙt&[彬|&bdÔCY:!abQ03^P"+: K*քM,Cq8Kq1`0ޠ rQ'!)JC:5^Sߟ @?0Fdj^m=cZ hW >l aO!':rZ1П3ӈȱ*G 㵨\SF ńPϘeҊUFfЯ);@H:B#"q'Ҟ1 S7kraAg~>-mԻUnUUZ+˝u(l@NHH]ѧXVN ╢UoէWTOU`Q]> DN=+d'mLG2D6҈9E:=h(fboi7Z?3S6RFZ@m -``6>+B.}f,##@ɉu gTO76y0˕*tUPLTxΩ@'^;:Ii 7L$?Ǥ3r)Jǒ>S8&\t1B c]{xPvSEHk}BCċ45͑s*uB@Y!O*x.:yF,RzSu*i^=vI;q>P _gx[dVapH}}!ѳNw`w+Ί%LjBVr)#5`Lk# !؄1>֯aCS9]aIF`\RP -. +z>UT-]8FWN~PFq̉,NAxW!\p ޛ !6IX A]}$nT-q J|ow!U !<_*gR ij/9FØ ЯcG񚁚%N.nV". '(,zFɑ:>ցmeSL ;ڒ{?Hqؙv& pGI~GB.qT6s[ RG$1kEYS12x@!As>_(=SrD/ш: l謪 7"zA%svM-UU@׶)ʬ=-y|;a\l⿇9E>aq qH`\@vؙvO\`pPrZQf-ai"_èC #+c*?"71U90b#!A!4O R*di}){8iMUނfS%cc #:è4 lXFҧ#N0& YH*na'%RFۍYlGƋB\= iF{Tջ/g6F$nkM]y:4"KBHQM?ac@(*YNQ9Uq@&^ausY`ICBp'^i'WC;Rv}SS{ؒϝ ߤ-]Ԅs亮Ml>p!S,$.vF_{.UCLGbqYr]:*#ЁD!>%ќ*&p(!I)}B@§b]:u4[[E mL`D8>&uߒƀhB_}F•I9>XbܛmK)!0f= GFHtC6LUyC<m[$.)I^ג[+FKB'TF*OPő2q*#JUDċhW|vuBE1z=d#lFy>؂g&]8`o0S:c_DjČxe:Ug1(UUաL9k>j[0":!s(İ~m0C*=&B2N^/bnSP ==zY,I86q(,eGPZf^W[Yrq`u^ʥJd=]NZt'gFp|{zddP8LŁ]OM] WOB9#{12KK88x/a|aU~Xߓ+ d n=HuqKg[;Q`FX.\QN[bVBƔ7u#0"uՑU: !qPD!֒/*/wKOMh9(EW})q.I̕NDž(vFߖ\H|gh6x`X9 2zFf]+6$>]da=R$(*쉱ʳ B<DPW `Sf5$jR UVuw@9d=HοF683-A3G5v^1;ᱜؐ56t.pf5#-ɲE)ݧȴad#Y*nyQW}©"ؤ`B!' e*YVJlM{(p(g 1$Q, Xg>dS9tu}o|Ԍ( րɆDz6-llL|B(V< P(pзSupg:Tu~îS{nLU&+|W49e[Mw-ΟO߅AѠII )8azptaU2A\6 ΄%•D.2uSse'z}+50 ɔԠ1w3KJ k+ d5BͽN !i `%zE·>΍#A3?nn wcƷ&|n>pڝXp+ilzkJօ&A Y0„QXvnÝ'uMתp%{@o`tCA1%4^rSxӦ6%D %{np{ziaЀ&uڽ% 147fwOkƝ8Fq$nzԹjtWOj#F~Ow=*.( w Vn%Ӏ5wb™Ll9w37 _H7`p&X{g$MPbq/_;&(kŽ+É>S J:8vN[rmQ6vǭ)WLg{zTbb%4qEmHA v7\Gs7܍f7jֱV$iAp0CǎWMPfw|ҌoyX4f7Vz *뎣 Bܹl\4+V+`ʺVzZo_S&Hx8B}*%TFs})L %M});ow}ކ;~ L׸? kTҞI8}W7 2AA)T" &qB7sl>ޖyܣ=j4v ~5JM1~L $t:0ƯG^S&H8|ҏn%~GzJ5<2wĈ} 9.L{jŽEZitQ7$`o:p܅nzH }3Zpﭬ閅VQXj.dayu}ꈐ@DF9,s7`s4 ᦸ f'7Q&d"= V# 2 {k:|\$NƑ>KvOuIs|?8| 2RHCR=5K_Cg{kVp $P2I,y%+GE?DZ/J94Mnjjbz}Os%F>k UGJΏitEO%FϫDiDɣi  >*9JUMFϹ7 $0]\7)2PpF)UhֶJa\0WBI$mm@ƪl\lrt*JR|]jĽܫm' ܻG+naxe@ %]I^왇a<)EpVƹb Ha$҄-pn`5qQkc}qڰro4+ pzm^bX1lX|W8>百PHI3&}4#\UѼ҈+M'њs&CMN7(._7ݒw&043u(ѨĀK4憶XvU:'*.`9E4;\ڨ,!=<2w8^Ƹ]qNٝΛ~J MDO KqMưS=_s.=ׄ{$aCHQpERݜ [ Knz5kRɤH A5Ah&xj$kM<4q`s O*Ud%Cɺa@vgLPB6L)y0 ҄$+]wk>4,A$D7l鹱OХUI Q02@(gX:.T.\ЯJnܐJ<X Sٗz'MwU5/ܣs̼ M ȸAf]_'ܛZQXlX]c򠍇l&`}MR~m6@a7aHk]=_k{Rj;iZ%)Y~{y?,I5E$ Q7 E:'[?x6lwubA7+W")Nnn_h4^f?oԢ$K#;wӨ;lW 39tÁ\, A hv!:FxTzC>x״(HT]-c~mc3kNHZ~93+d/Ka:mYj3o=k mk6V߸2}6fp%;B/c'''BJ<%O8Klxl]m|QB`iVj5 Ъdw}e6P#}ڿHI&R1D&\_e!a Hl nhhjÝH7+4Pft:)VT^_._kJN*H*EW㍝|vVӵZmF%}~J>2Gxٟw^[ {1G@U?L&R()6DRVu{| H!SC+&8[lʿhez_ 4Ҕe[5NdBMLL||&zJ~Ad2YQI$ڳ״J&TJ=25OeُNMM1]K7M&q)>GH[w]f ˤΞ2E|s +pK ;RBFs 4!\]&f +1MFRi܊OMw/Nޜ}+a 0s=*GL0Sz鳱X$V/~:_lV:3mH$*Lf~Nl߳mo4EϞQK}K^4;guͿI*ef6}7 vfmo04 Oid~{ >-z/ku! R7GgqҠ9z}RbH%’“1cI@Ey͝K4 `;Z$?}I~ A%nV,5E=jA ;Jي %cLDzԝV"eP՞N&Y^ОKdɞT*sssq75=.pL1X{L0p|+ж;c"fUn~kM0QN}`N=UӦQ%P5T(,]6$R3&8z? ۲W E%_A͎B篭T*uɺVVVN5M|m<;b߿wuu odekU/L*sZm.?I#هgggBia 4l-(:sp3ʖhHΚ`?v5z V~6%.aз/$HavȌٻXtZu}=jrsm 1HvmLj.%vWWXTIXX$ZDDlJiYEN5?L&7zjVݕIZmZsNMMYvJ$GK&2}IMPQ5@%.F}z?u2ͱc]_H5a;s#F:%UR ;/h5HmkD $;2Oϋ%%vE!tb) & \v^^^W$sssﶟNu:VVV^n, JԏfR{G[ƅ4s&H(R'QA&H~ {Ll5@%neH:cx Z]7vg %붫wFzL|̵Q閛S?M{yAIae"`@/N/y^lGHbF-РPYQզ׵Skzz񗯬<>d2Y~QT:TVS|>么a4@LV V$ gN5AIF :?fc=!WcHtN) =~ʌ }T5AS!Eꢦ럅 #ТCGzȐ@ˆLzM"hRu[ִ#L" r&YjSFc\.JX,6l3BpYIRt666Fh%h Q)ܨ]د6~~=LD"qgJi&Xevv7Wl]ӝVt]Pr(ܿ(g= {ϯ~X=^uF N ٷ>R% V܍i858آ&f!fff<=d֔[]]=H$oll|sR~[}TRTm&XT1͘TF``,J3w :ܿQ"9EFpq[:On9peuGH!^v;T\<\4"q$s#;=QQ,veN!50riQS~}_Ѿgjm*Ad?dcFI ^h4_YY9ạ.ᴝ_kEJoBi ~:%ߒԪQx}LiO$_|vvv!3\ fӱ  ƽ.l½UV,>ڒY`~xgsq8Bɣ{䜄 TRh]gdQ= @cjjuZJeazz,,,x<~YOqXP.h(L&j9Z(OUՙJ`د7vp\u=@OVre%FN m_ӕfl^s*7Ǭ;:|WQ(xic&ATe4_0 hK+!3E:lHV.LyQp祌;~li%*<-H)J%~T*%xGM "J.;byJIm Rv{Ap]8@NE"QZɋZf]]]}աCl,N ,@f*Y1͠/2m 8d5N960J3&)υ+cZ;o:Z]]p׌;'e8o#|sp2Vʣ{d"3??KKK?Q(̡Cϸ+=XsY}w#ݻ:I{hHB1A-ʜNWpuuJٕJۏ/ߧh\cGI$%+4P7`Man0Rz.` ;,G nC>wq8τpEss}`TL\n0*ez`H cԩS?rܹd2Ü}MFL}ڟsu!BQ&5/Ǿǐ0`H cX,XZZ/NgؓG1^Q Go*OtgnWo 3o߇u:TULwKdS|}qҝ#2siQmОUӝ>FŀsV,O]x;zzK&(lp7?b?L&=& 8m43oZ=.*6XlV"KR%3ֵ IFƤYLMM}Ґ6G8[_;L`C ]:iaI!iZt=&W=SZX%uDqw<`{̥]Q&Z{ަ{6כ*@o67x91SSS/t:ch.DVZ)1H&DFjcX:]󷝭UY?Ia?T\w^z=orrKCz]aWQ5ه@D*˦dLpenݟWlw=?NwsFJ5A"|οC5##$\tuӟ@n8UM,05^Ndz|q/J  X18rJTcD"QV+MMMk6K{mZӵZ͝N#!o fZTwK&lJiPӁ[6umUڻ2_G1*nzsEMFH{ΰr;M6}kA$f@ro5[jQlfcE,gF+PL&^*z>R(LVgggؘT*ׯ%>8"ǂf1 " jVF wlR VL"w?`7C%{H%4"+uΛ칦*dѴ&=΍uwM T\Lf?0a_}YK~}q|]</MLL\E7ݒe/;4P"-Lkt>D"Q___?V_W.+{Ո , &-/J齥A%RǓΘ`zfߩpk:ߨ\9-EVjuJ+YTvQ Jq];=}DF &1ZY__4\nV0@h> “O3$ 9\N}RF\^d,k{e25=&(kt]u}^q狀zXHz$Hl&Z.w\bYXX0BaпnV~{x 1~},M,\3Ӧ;:r %ad:ڷ=V1֞Hjc!B4YxihkJ()sp3G.xʝ3CtEϻs"u9J-,/q5Ud,0HH*J4'K9r5C6ˇA!{iIK t?n=ך{sJ/Z](WRs ",䮳jp#0FH sܿ)J^ZՀ厾0RI&Z:^jd26Wv)j2]̎V*i5IJ$1Ƒĕh> s&ܠE1/a(aԻ`]G{Kn=߭X,@HBI%v lAz_mԩS{ufWhH<* iN'0nRix 1YlEszUj6.`Eh0l}D0?o; b<-ݯotW>Lߔ 'Z&_5M7QD $`-..=qOrڵ͕D{vԝxݤ+4 RRyX,VѠE"gzkEJ؋ cϙ{dVI ZtJ ɔ\5-wFHSH}>\fN)19{IU ˻:C6L }0Ξ=k|k~ŋȑ#;J"f@TzL&%Zc(I$ Is@R $%13Z^?;/ם yEqAFndGK}8WeڡkȔ;>Q~BТD閧 F;BzO?;w.vAlڏVixs534RXp?5@})TN+RƂ3-nˤ 5i`$i\%+g+Z]A$R}X$چH6]v?w^r%J IzŌjmL&c?_RvK#J:!=NkIR_Kʘ'm%Dm 9U\04xO vݽ+Q5@/U4g+R41"p~6z6uC9}8[X@u9ARQV,3A6^f {aK?v;MSpꐞkRa&>f,[0TNɣ7u^2E:Gk4 ?#a~Ě関.Z0Hfy `hIngh h^1\v' JR:scN'J.RC:華S&Whҝo\F$ߚmnH%5aX]KL0TNgLWYTMX/&@@ 3v;OS644 5@ZORt:h4Uo5sߓJiuQƝs0_t!=*GWwkF_.4J{ky?U6tX-jmK6Qް$J>v>l+L7Po}i6zIq^)FH72ۇZ6f*ئ QidҶ#6ɉӴƌΛ*U7mQh#%λ뻒Ea:];$qtik~|ъM: %m9Eݎ7j^l6_V*r+W|x?_eE~2H{oer棒GwbSVMRlll>oLR2/3-Hh!$H a`f&lHX1uk sgHaLuwkKm{IbHj5O&1ɣQb&꛾k&''}G;{+UEBLMMm.ۡ+666b+++ž3tU^r;$Ј@5{3h4"إM591iTɤgMŬT*!1 0ʆ &RHɢpcD _J ۇT[l|97gI+%tE\"JQ.׮]d2f[0`$c؛oT*s\nfApnЕHʹ~>NZ=/tMV k z}dŷ{I%>YOR&H [$ll&&| }B ;nr+|ӶU(JGi ~w+#N7-H;c̓5XTƇ40ҵN%λk0RIuNdc%|yux_U: ^a  gt:寷q:,' ->RH>Xi,k&$4ivYq= D yF`¸E6n2OH p ڃX,Q[T*>ϕ,Κ`6d$!}>moqpMPZv=%òV}dEMwRzx=nW.UxsQ:QmO4bX,oV?33Zfi{q_`6NHii.WmIkT6 pO% =^b@]!UHp )˛ r{p@xO 0mXt1𙶑wVFewliU[~ m2wU2I3D^n^4B #MP(Lcq?E9K&ot:Gl}ߏ#7&hefsxƛmf`w1<[,ިK Zkbb"-sf3gSHTI}cDeB\1A+,kwPb芻p5lPb]6RR0fv{3Y]]5W^L"ieR*5~C [xX,D"FmoԮ2;SV&aZɥ=_(%ߣ}L\h#k*pnZݣ)JU\cX;߱l6k69Ϊ"۷6FgzzzI٘!G -Z\\\*877wޠ}FH;h4T̐5/n!%J&IeSTvh=ϚT_#ƊCZ}4@ "MX67ly?`[rt;ēB*뛫ji !^ii{$؆E X,~ޘqcc%[h4&kH~]MC_×cu_5AImL 4n)wES(ܷH`Q#^<[7GX9}1 zB3bW6?Gl|FhύHjfff>_ɣr߶}ϙ`tF)$kh˗jw>]]*#?d2f}&뫍#6q=Jm ]l~:^诨dtv R*VIR%TIS4MtUHF(Raf;λH $urvN+'''I)Lf%bg&h`XeUyJ(ivV*)Rm1t]U(\Y&h`%?j6㘙hA@@`8oF?VI$ Z__?t2VeE~[U{N3᯸h;F29@JiEV!e}G|뻛({g& Z\\p~QV*z.GҠۧm|T^I{}[D+TΣ ܬn9%/`,m ~-wz&>]hS&ygRyک"kz1A2lSTi'%)>hۈp_/cz;*w7g JḬ: s.ueEN'KCjqq|_Z[[wddoL;*j|_*JϩT*G'&&f{j&_xgh\h}XIׂ64$QUWM7J)a$F<0T?m {aCܹs}b/d2ըnrPZ=aϖ;Ϋ^a\NIA )Eq#fhI V(iV(iSc&X@t[rת{=Nlw_܃)!aA !l6}(*)y'*|Tz>:Ο/--}}?ڇ_7ү{3eƶڇE$T}"F^ &H )1T J EZu=X]o0nX,ujfffF+ƩUuQCH RNRW2Q.QzZMfGG hMD"I+6=~um3Ay3Ѹ`V4b2o#O3#.]wp&w<]F~cXn>Z]]5Z,,,KBX\\bةt:3DℽY}zrrRɔ=fUČq>WVbMN>=iNsM ۰hϵTL ՞n{\!N`$Muf{t}m˭V9z>??owzzN$ԛܗN:L>c2߫hL=`oV7Wy؛Gk[m? nX&Xt\Ҋ܍&0hEEV M] _fsRzds1f|fǏK6#vm?_U|P8gof>eoPsRd8h)VWZm&LD7K&HiS%42>sFLUug7t:T*g?ڵkoԜ+bt~fsָfyߪj@TU) +iGm,O8O I0j[)}cҞRё#GgFoxCcF_zF t~j"{SYNRKsqc +<=*SgclNL>/޿nhz psX B i)0ڔR9K6VLPp7ϬbޫDN(oƘdG ѥOZ2^L&K$ vDZݬo6j6gFuIȘg{>~hI^/LŅh0Y+ LBwhߵ ]Q{2SϬ}=Jiqmsݿ;f_76Nj6gclhN7f}TiXYY@biw0BziRʽ_IM%+E w}w'Vrl I&?kO9`0H 0>4;iEs=l*b3664[+J6.3.]ڠ 18n#Bfi&`ߵn*ٸh%+` lgk̸6Wu08$_Հ5NWؖ+.~iGLLRݚ{`p jA]:cat=4=Jy7h4LR\yN?9`@Bx4^XhRBvхjh*)QIիy ,Ӿ?Q=WgPɝɱ6~] 6'NASS)蠀׋N|EDXԠisl_jGzoڇ|5{\.%Z6FP]Zm6~=50~kEu^>DfjsMaac9|ח鸾 0Ҟc^8tէz~RI %T~:Hlm{_6(sOX9H !Jtp(5$KGDJ<ħ+ժt:&o[Wٱ28џ}s?6&#(ROI_1,C$Pվ0dF,S?fw8PH+4JT 6l4iub\ $%^o>RQmwacB8aB QW76.mJvm͵GP\0˜Q&D $ @?c"kaa/zbT`k6 F8tG̺ eA$0LUD_ tR_Jم Xls`&gmh D $ Uƚ;>Msnc"aXVG&QswL,[Y__7/^ўHʣv=͕ӞG0 Q6A־Ms9pgO<Uٳg7Fڎ_yp`DLhC6^jdW na&MaC HYղ6R4 (e|څ0k6N8ncF:ZQM plQ0"QVr'is=@5l| aBGm$h Ğ~o4ߨ:)ʿmkC: tli D $D] LP.Isڅ R}KСC+)j'l[CA6Q9$c1mwwWVV3X$vx_n鬍/hH#61ؖF|oƔ7/^f[s,"bǢgn̞6AI^P٣u&To9lh,--_*^6HJ& c/eXGާL/oHaZflq 0[*rU+xiǙ3gfbkZJ&MLL|>ߏIEoѠm4i!}}@vM3O`GMj{`ptCM>^1ÌwCnqqq~!}V\NM"Hr&nuumi;m|WF $`g8n$bFffjeV#%]3A)%0T@<{cyeݾƼ}~&QD"l65jP!lMa,R)&ػ@UM@}JK&K "k/HQ,yq` $hєxQ0\>>)Ljǒ JcH@@ iѴS&Xy`)%읤$R=6 X` @Mw"% &Xa`X;(iҚ Ha.ѽi&qjyMw/#}u77&6.IU#}L 5A9&H)QF)5knUeIhHaJqI J%i}rve5\UE fA$Vi{DwRbII%R<$0r&H0Zqf!+6`$Rj UJܔ H `hߢ %,RM`Hhk6LL J-#YM(J y=n:vG ܭhJaf"J"%h)Y!y`tƼc{$Q+Λ`Jm {DI!uPlgc}>iHM`L(aT3đJ]tѤy0h$9cđ:UFU5A;qkҊؘ6A:7J#(Ѫ Ju짴aK@&XI*Jc@ܝV()R%G ['~1ݣVi#%H+L@ %`UJޅ+'>RH "88e 4` Jʤaz@n(Qt蔍C&XwwJ*]6Ap1F ۥCJi#%&H1APJLBIl,`?%V&!Hk #EI)$Q<%2II%%ues*%` $BtW٘uϕ,6#I+&7I $%MJAHV͘5:h@nHݣJ)TqA;a( 0bQ62&HrAY:v(teO> 0,RHɣI ~"M؁A[vj) +"xj F6Mw#<"i跶pݝ7ABI 0@Đ@~ B %QqqXA u\ n(s$FCIrtZausFLXRndUJ$}A `)aw?{o$K̝3l9 BH !##/!a+$!1Aa!! "D< !^'fz;sյ9:oVUfUVUfMfU[;,:eY_k#6 "A82B+*ŐxB!dHP@"BI&gHt)%YV! Ѯ<Xh B HB! _i yUGWB!YS !$,0?c+D$xo\qO=O!!2!P@"B3a4a.+A(ؤ)okxPs:斴p%L\$#< (IMD!BB!$& ,q(%rBt;Nױc.!ܛrf,8LI]mCw KFhj %B! HB!1E(Bx:F&ь^ ! xt'GRz!YRDr&'(gD%B0/1>OY- HB!ƓȄ&hdiV!P\|F^5qC*ģqh%R" x)t}"?Wo HBZH\W鲸G^Fy}qQ?zEB1eq RX2lھq @P:1 {YP &M Cnms뒶xyLXo#L.wF1@B!F3cҩ zUӉ)ҝ6뇐7ue0jZ0  1BR<)8gx{!2۷L^qvvl6|׿s||\ dmBE^0:Ft5CeLGM і`Pm*HSۄ"x`@ǢnM(W̝ &k68${ڷXImB5铓kju1rP ́DpD!XN|/^FYpEX qO%À{,H<[z ~}\K$BǦNyWܜ.Ic̃+;%;I9 2>baWujvvv^s/^ H {!JB!q+=- F.( `(Bh]GHaWbHG?9Bz)[ 9wgޙ$Y;(1^JF\jI$? !$AB -'B(CPU_QQk[ mS\5̽uF ! ay۾{xqDPv8/N|Lȸ8rEI&GҞcr#`v:)Rkyy_[վy|< .& !.Մ#1 a>-D? 0.A8q GY-ּiiw6t .g𲸆~0o?_;4kIgo[4Tz(2.p@kabqZ~GDȐB!=  P0H!²({+ -qA#Ð{MSl[=A'/ CX<G!"T<a9ߛ62nY\O8|g&nꙤ|r}||yNm>"B B/"W654Q00; *]'3<yqg9i8e]\1I½ C[^)NgJ7un/븋!&\^J$ MX ɗiB^-V!MNZ֌S> "B!u``!n܍1laNӾkp25}?ymw8zA(~^"UV!9ck/0aS hJs+OA$sdzH&.1yOEBH0דuu.w.7[|4  HBH6=`4MˆP4] |gppɬvU;x#%cNyI\1MIO^@ް~] %o Ib8־1ngODHtNsq˵Zm\.MOOF޴Zv=GCD!dC0!T؂i0liNbD-hk α\GlC / fx辭㤏3f߱z04m@eM0pFP2?h?Ѩn_=99_YYr>jٹ\CB0C&QE4ea|}%!$~ǮXpv$y1'<WLZĤ9r)-q!S8,e#aNE}m Y}=J].p{{#-,,mZNPxGBD!L&0z- z%E0-N!ũ|'qapDDF;m}>b*ȸu M2/ {:~fx!Lwɏ%-&bIx8$^JAơ=gOu]-V!o|򅭭YXXx=- dP@"B&V IwI7ɜ 6aEHM~TEG>ӏΖ߅WQ2|hP"B=Wt 5qCY5xa „JDU[Lx<䢑_/hBF;"/đ;0K` ~淋YN^& ˾ѱ^z p Q")wNyE;qј # _oۅJkkk'| f$BB,VWWR0u!n覷֙Y`0V`@5OqE;KzPI.f2޾H Аls,^Mf="hr,ڷgjڎuUu։ޑ,@  \qc't﹟q_h4{rNMV=!!ll U0߰ElC%cl^7xfo8k$|* ]-fz+r΍y$ ՛3JX_76Ladm_b֮4rwbY^^kkk_ HBHr-$Ehy}mT8 /#+`Ĩ+B`1* l qs ϣV! u;sM;x)Ad$%ϣM#ᑶ33dJV-5V.9fYt^SW*m,!# 2B!$Y$"cLal)8bD#q.9ypb'O{sDk[_Bg끇#鞿xsU a uOQ9ޙHۂ4m4IzŸ/Ph& NS^ \ 7|>w>|iObNjڅBakkkNB$B!Y,!]d^׍6_{p\Fekzox튗'ۓ(P/g$\,!%ȬbՒy傣 bA+[?*$A@r+0&u&b(RM Kw_\(u#5>P9:2;0Z<7aHxAD ᜂ^/IZUBWu-zKDŽ#$KBȘD!$_ᭃ_z Ғ{9a|>1\/ Zd @\C" "rfK×@p#B9cuAo;OHc !BPAN57;;;L= /}JS\(>/#D$|>/J弔e)Z-i6B'owvvkvvO/// >n]P7 n0fB@w "a  Ca< l_`Ր`PO$j;0}}.e}N(q/%xz((bڮU5-&2l!BZ_]]_2B#op>gskFMssѢvAH߄(uҥ/.//vںna@ko¾'`0zLu$| A u`tH R75 p LxW h=+:+#B@:.I/%{C!!dxD! Ϙ#{9<<۳kd"F+++25h;iccο^ln]ӚyFG/K4 $~Qq>kT`cKqGxBUX0kxn3y<I:8 "kH ALǤS3B2=!D"TV;xa޽{O Q)긌=q=`cBݚqD`oYWD5^JӬ6`L5v{YCU-m[N:54,B@( B&/!PaRCnc7/rT:0BR4Cb&NSƒP7~SOIicqC'nSE-`0!?0._W`o<I拖8y`_kD dp Vږ'69v !d" BȰ|CBadyy\@[nI>?};8lcX.tjy6JlЈmX!ty(M! XW'$+!BB09jZ㖈uc)?f14F^xF[WgM#2h3%q0t]Zǚn0Hv%KW)>#OO"UDiIⅶ7#%98K1~imF״|JG J>!2,^H?_lNda|94>(pIsSﰺSI/ ư Hm#_ؿwʇޏqeqsuVD/Z`R*iBa$&r.%Hu^׶$!$1P@"2LX*57;eU68к^a FFϚP tlkωaAwYs!;k|_ :`LN iG&u=͉xG $x(q kLwH{蘶뮖c5!>B\`Bkkk+++GGGWEV ~!'YWzר5^4pᡞj6]w՞Z0r5'g2ZGX\O׵0Fcb0J:~@4x!Cecc9X Ky69f}s-@RB77" K}"WR1B!\PB*J_;"+Dg\p`IdwaXnjeuD^l0Į]!9]aB4V/=.g XZדyq ܤ`h"GиYHw.nQp!)}K:~XG@=B$B!CeffgQ@r Y`gN0jjȘ&:207U # taq ^H "wW.IH ک!^Cw99 > Cݒvk>|Y0wUmFPj49.BP@"+vlkݜkkk^ٔBtqXՂM ˆUH^BD!;U4`HU{0BB 2tdWa͉gY`&nݛZ/ Ըw״LDB@hd敊nNqǷOɥK=`W/9 X-60FL\!N"(A)) UC.O%7cC?q,I|oj2/[5-:u/%K+n/!imH"%B$B!:Pl>!\0r'腔]C %MB!gӽA?{U\/I+cxvwa3cA}0LE#^V4,OQ^!$Y-z1"D Pu=_ I$cG{O:FBHAݦN!$yHq[7x$'g~?z5ZS~9#Մ-Ѧ7S6gw=@сa v`$xP/$u4$Z,Wu~">#o؆ :H0"t[ZDpE!i@#HI.6jUE!4@B 6%7pxbќEsZZ>OC 2=Yؔ`Sauck)ƸjhH!0f>'&i1 Ʃ,Bº0_Bܭk?tp66x\ kk7c`zmOH%BᾬcZFRDf+N39t+éB,\B鴸2yl[seA|>/.?Y 1R]ǾmO8ܲa&$i+KrQTBc&{~ѹsU]~!( B1h4s"NZrs;H7nj]?b°z8i/<r+$06w95+Ѓ5qOٿ1 k3k,qʗe'CalЛbg KE6q 4c2Br{O5s2],p č#sԹpJWt,D/'M6&ks92 ˇzGד0%*")kmԶ=TM!X-q k͂9uXg# `~^ \kwHuRl؝5 TcPd/ Uɶ~SO?3麉:ƽ% J&%x)$3L$K20 1:n7ҫj?8Џ;BH$h zO0&0{kga^|?˅woߧFF,{B-T*HZr<S6c k Xq᝾Scj)<)aFV/H67Ľwk1!vV/QKya89q aMC0ii1Fscp/h^;ƜcxD!hߗta aMC)(BzBLEP#uCu{{峄"&9߹plZ -뢮(IM"SSggg37t_vʵ4S~I `o/NTx"8@!$ @1̟#D{kqym(˂3ϛ5b>|d$s۬7!ێiۭ:P2vT5I]tOоΟ kC P@"]v:]NBx^z/0g/*-(Mav@,(~C255Zj*J:Zo-..bq??#'bpGXmmt~BMr(F Ƶ“}rK:02=ѵ>' !]u;G]s 3Q;I;-xJjzV@j@Jg% $P@"OѨ(Ϻ}06a^1F&BLn?ol6n+a(#cnn?qxxikk[~))_픯r?+NS~[[}7!kq0 M8LJX%}S6)8ɉu+|^M$iFprSm4ep`M﯊kTFB&}am1iZWxwg;ns}-^E"j?i[;ySqxЃLh۰ϋgz}GV# q]DIآF:{~&!>c?1jعnދA^v+)!tm2WqSj}H=?gff]%PUZ՝;w~*G(y_F ^>_` D7sύqCq1~J#zxi5 c?AW;zƕk28^?]-&YcM ҂SNxy M}*$$h$$9;`(wtK:}02Q?BQ?EB/!c9t`H2)®, 8 E/jU:˺3#Ñ ܎*'Eh{5w#d<3Lo(JX%?R7xa:}I$R{bviIN:*':88z D+gSY{~9)_Z^^dzяՁRKR@m>ƟaA~. uģ>C hB!P~Pbgd81c;C+6t+W ޷ sgP"HKMYK JH 劌>z ?y}؟=_R~ُpd%t #,.uh1ibЄ+qQr?999|>?M(I_q/Jxqʇ5\d%,HNRtAϰb#uM.J)%:)Ll?h@1GG)ewnd9bm>nj^Eo]!o4hG<I+9*uiD/۲NB8c7R[(* {+;$ ux&}ntQ:y]zt۩WGS0Bh*" Mwl19\Z0B" N'VV4ӭV+_*NF1YWgũ.tAnןfn =c;Y2g=@"׊k 70yzqvnLCD˸Z7 kG^$'B:2Ϣ`-Z2isűO:U@#`M㦘A8ȼ+Q7{aK')R:Vm5xK8 zV-] .2I,a \E;ـCH{r _$i) H5qlQ“郀!a7}+ e+!?/ #%;-~9^ <?&<^N!_q BK[B:oL%p]J&xն x"Uu}{ Q #MgexS%X<8'36 H%QͰVS^9#:1!{5x^Ju\Sv~I_u}`"$41 GBE;]{I HaCu}4H;sU:7hrI Y c0 {իPHJ񰥋b"6m&&د;{Gقad;'ģ. 10rlyDQbnחÚ!á㧱A=Ա 3nVKE&x=qZ[a1Pw':h+ ٍ !](a#Q/(龗IE<⻏CD)x^dU/Ⅶ˳yrUdIS]SEG2Q0nH)phjMXu3!w )99k摳1_j qS劸'GE-, ˗ i ɬc#>Û:ϗu\|d0v;; . ZKHD2z9$EzF. HQ:y I"ݽ H^a:Fxd^tZп;Cjv%;;zn]\.\@-C@ np0'U!ΞNiDɪeoΌdO@2Nn+lfjexK:xF5b; !I[ߵu3a$ ˜z_~:j#8AeJ&ISׅzOHfDWęnF(%L(A=zPdp^D #"uyM"8ɳBQP>dC4 A$Hń2id -Fk![l`E]<#6g0%epp&ROJPsE^x>: k'<00xڎ2Z{__¨~YSy-q<$DN<Gۿ$hTux6)GL43ģ^yGQEŐu yU< ®5pvQB/qg& Ť /%x9ur$4z vZL!\:'OZ&ˡǜ;9zqbO5[ݜ9[%%[j4zUâO^c:fֵ°1iIm oI#)"^v+(D- 9'd h+Q/Ѩp_QI<ԯQ,iАvD#LIo&{yCJAnv$tnPAш8`!F6>&t]V35ۄM2}ј}`"=ÆN{"nB^0!]RQ&m7!d JWNaDג-vDR $bݽ:yu U/آN'!Ⱦ,jNa†h@UDμv:%Xt%墈ԐNk0BI\ _am<E#DG:{}0Wn#> QWYԖdbAsg w%78E3/=v/!$7k]f{DBL>r1. UGzogߋ 0&o $ PYsXSЫB0x_@MIz„|꼅5u<2+¼Id2۵Iۀ}At=jDHX( eyuG~1.H$0"R^Gx qE4 #Jtz I}'!)HDjEwt[\򮓀)(Ҕt3XIK k?M;=݀E#0oFkrMq=v%;`%0 xvgp`%I$*Q榶Ƙ 0, 8 :^){ЁХ6s葾.긽% BAL&ykݷz` ^]]=/mummQWH⠀Y}0##=wu4t g&Qh(בH]0VLU P„{@ lx%M~ ݽl&ۉ ȳ`#8v X56ģ[B@_|$Ccªܕd2/,dNYv.r:ǜbH@yח31q pҎtв(O~IKIw3B;%\]Ҁ,Ah,]]]܈gkkkuV73FD#W(QI‹HʫQzu?B-/a')HTnw$-*R'%#wsשn˰v8F0s8rLL[`45xp꺁IMVrϋe`x YdIRS\dr! 5 :O1/z*!$u1c溮Gگ1A,׶^JdR%}dj?puuXϴ5֚>2J( e>9qM8*ܗN/ϣn^G<^HFaBi (bRg ,r(5Y!)(]gRWRk]e}S.z%56`Eog7ֳxz.;6 ;opPE⚛U\'/2Xؔݑl{az_‡guY0̫v>8ϳ+g w52ϟkKBҽoD9ɺ]x?؃Dr֧} DS-jO>V(^kZ/:{OF=g)IA(2pab:D8*IrudNazY:B=?$$}hdIP ʟ7{~A/*"C5oE d7"d?8#M7Xop. 28ou@(SF  9JZQՄjKz( gg]g5T`P*|^43 5 tOCOu`s32>Z:==mZZ֍|>_=*˥BUUƶ{}O}{{;U*[˜43px6pr݄N0!†[8 {/!퐿n!z}ضN풗`虜 ,HHcGxtoD#[0jʳBiE#}We :Ԑz:rt&[pNuӁu{ژ Cl=be8czWn$Kј~wjowř8WA^nvr??KSSS?kImGa8 AAQ/[Σ0yGW4S ;-ň3a#"uvauJ7"S8q{ZMш 8o0e-ξ\8}"= C5ɶ D5l#If؏]}~+AۼLX_{GjFШ0y#B&rN暵/ǜ.iYHzԳwkk믵ZR}UT*,r9_9ϜcF!$4&qvCz : ߨ`E@ 9_/a_miؙkN. #%# Pp{#8ٞJ"md[_OD@ȋYc':&Sآ/k oJ((1cVk,g=X59Luunmm}s QuKOggg(7Sw8V>s)R [Ⱥnl[^"R'ϣNGģnˆFq FI]`t\>NVLE;Ԗg0W[(d{QAǼg!#b|3oaH`XDNG\* n O pښ[2t;w=<3%ҩ$[a;NY`W?kj8LXEH$&VB^؄k?llSNㇽG羅 oj/,--(ic?^oMT':⺳5wʟ;==ɉ8Wq>4]`HPhOOO?qt~r/csM:EY)\_jHGRP=Z2ސvȟ3/B9goeIL{ -G}vp>9Y$!烧!$՛z$yM>WuDWք] !ςpdlZP4'cGGŢ\|y>SN x!~}VaqAƣ֖~N?_ y|o"BmzzkyOPx(?;;+ߺu}e |S)z}{k^l>{ afffRHT>=Pw|vwj?bHbmf '-qܟtBQ?Ѡ^G/?R*sz5a!}_ ė1}NugEH2xphq >oK򆶹|CàL=aWBH-QtL)?ĤEjB+ GONNf\IY>߭3O>o٢ρğQx.677ǯ^e#!p0Kl]< mNpK< Gd=Q0ax^Q(f3f/$bJ IF4 ,C#w(did@+/φ !68ڠ<^ /k#mXO#A{g;0'k ]qmɮ9p_## f!<>l0 !y:9={a.T`?jO"$oll& ^G/Ͻ;Ivn$;/R3໊tiT-B  wH(w*4~ =< a\O sJ_Cht @X1G)X>8Cs{&BJ!CXcE.S\ Y-J^R)yeY__7n$!?_Kwu"ԙx&dI먛p[Ⱥ3t0uM?^Ia$~+mg<èRKigD#B~QD"cA¼q~cC<YV@<묆saPf%\ INJVƸأԺIcg\_б^å DZn& 7WjPE9u6#Ml6Nhtʕ$GmlleU#,M!S$ G'y9ŢNG~(G~(Lt $JGHC^Iv8$ ŘHT0P ${nʳT{3($!Mq0wXvO #݂d׫.D"܁N↥!k1{Z2q-QIƦW5ڊ}a=mc$!tb>5#/zm^?ggjn:Ե)  HI-G@c{azyMKoQ'(ȰAm\B9AR71gݶa@dNEl릴VSA߳{"ҼcG8Z),j-qONp`݁ˬ ӻ: J^7bYtH Ok/-]sR=зpGbr~J![ఙ &]OD2:aPA"r1l^<[?Amc_3I( %>ţNG#:p-Q7(JȺ0‘HGd2THھd& c ԩx.8B[lu iG1/K/F^ Yk9&C׹`ny,Üe/F MQ"𜅁Iʿǩhiǜ{U]i0!d? CArxh09fl/GjʚlbOc}v6䝡Y tl'(\]pM<*Őu߲K\GHl^GmѣMkwJ`/q T"}D⚗0'⿬V.T0k655c{ɶw NgG(%/d\wd`H޽9yێu2;䄨4ǵAby\*jpzz*ӌ?.$?C.gk>cWM܂#[pSW<(p$䈯 "$H.3(WW'#xC¸ߪHwoN#֎"c^lP<,Nqx.$9Ԍ{ߜl HI_B-W@T{;^z >w%! !bl0g[2+ WaRy /B2g)uOi?{o$ٶ5]U=ݞowyO@` Y2aL`Gl0d!=d#P5Ia²f{{{uyLڝv3dV'|9U9{ڋkv H_tFx l H8^邖i2sݖ1@DDA/º٤$~uNܲ挶ag9;mBr T B@Blmm>eʵإϩX>I?uھw]6PL8bx Dc1#;]R$Y7#Җy2$KKkgymZ@& EY{ݧ IUwTvHscXHYtG 28^;.Ʈ8 Hi'fjQ9]BtD"rՀ}kസU븛!oK!}JMKM#oC8 4iccc?511q:) yZ̜6IHzᩈrJj@O[~d'/к̦Rx;jEHĝ0#maN#Τe0m/La|΀^O%Fq^،߳ cjKAD"SBa-mK _p^nb|t_~7"do "^x!\^, к I8U_cڄA[lP):JFP"5^ꕀt((䭷ޒӔvtռuW7`C=N;un{w2[pŲSeRnDi|[R\{j%=N'$Aup(%u)PPpr;|f G ޷28Nu\}®A1}p*}H3dBȠJ"}ilggVsε?r||jDrҥ~/Fe[:v*L-+z-U}% \W#bHۈ>"fGvںI|GY#[Ԋst.yLH,iܺHZKn}RLsknM<8A4B:K4`G9m0u vv轍Xd H R_gY`(9*Ø[>E" d|Q_K^_9i7?omի4vCCk׮ɃN"˹1'q]v1\QiGmS (<×ԝvYR ;|QZ,/S֑~ADŞFq{RD* XB ZF$w X@`G{Rz9&W GvS@|N;[o wbXm/H$&zsPc4Ft^*\ؘg ڠѭ[z]naa4DCZSׄmΪM@ܡޞ®|ݣGxK[K]$ݴuF@2i>Ǘ,㾔uH?G2?Y4wI$ ם E=ϑ# /r82"Y߿BOdM5)8QwBt@񛎣tWu7#v !HKRiDxԱcڞ҈T2>Ɂuɓ?<@B*˗/1 7I# @u҅:;8ĉGiQ $-I6Iv۷\wjdFi?Y nYotV l H]H6'L,ݷUߊc='5[wZ{IT¨ZBLfM:c6)2ǹVU?~ONN߾}[#R7LLL H{{{yP릢):F!lP#Ue2.Qp4*GY#_\;(7psBvJzYSeIS&褚3yPD4eB'a}v;:Jͱs&qS:ӃD 2/\ RfdZw:DQhsBHc~2u^?!( 5lw={=KGy5Q.bsԇlN)ICk mCۓ ӥԉ}|iuvQpd HYֹGYHcBqa6=PE u\<6vH}9hRq~ 9/ u]o; _X8n 8[ΊG{k  l! vvIg -JEwJba$k_J>Ҿ6y@gRGD;|}FG#\:7H)ی$֢;)JQFHCē쑎 D)ĶeTg H~хyPԠ{z.]u9%fؽEu(ܢ_k o BIL-б6 6D@@2Ιٵ[[[ߏپ?NNNpN^߾I8.FE+qA=[PlY|QZRٺMy4*E,i\M[wԅvu:pw_ff{."\-r,9tuOd0km9=ϮxR <ڂmXtѮA϶yIzpBPw}}KoIԄ+a4rl ӱMhzyww!}efK#)Du]V(.]Eģ}%fÒ:FrJ/dIm۴Vu}DrnRQ|r:s `wt4J6/Ԁ4fr|}5CxgHJ6D%9twfQBMMJV!(ALZй iWlo?5GG"\q˯Svȴӿ^vu}H{wD}RR#W񥭋Gi/(xdHYRgQ<"E'""U=MHNC+)ڊ"RpSCt ŢQGZG NKx&ٍnl"c sM^k^J`uWz Zv8o>cS=iBHkXS9_ן.v&jZN= <;lI9b_צ@L#_:_#[<#W<##n#BΟk,GoLHƲݙ!ȳLJc>_F4-QDRұDww(T}{cuQkMRmv,za?(EHɏ}PTC)[ պ 럐i !sGd" *dz9o`F PVellW<)v=O@pFȣ8mn#RdRL*ħKYή#<cy7"R>pfW΀>כ!gA3`Kv$0ҡ[W.Kr\~Nm<\YЫºHNz۶:n^HjjzZofdd;Z=Maף߂-Ve e8M]E0#;mi}X ǒUBZJ;&R3F$]oqE!]"R Nݻ98w .]5˝ p> ) E8itܛay^dDϓ/I$n`ZO(?W(q ]Pp6=k^H!Y^^--- _( ]fɎE$7=O8ׁ7F?vz-GO$uw]4i|W੗( 2r[<򥮳#_#;dG(fJwxDHHd?6)`0$_+[q:7.1@:c"#c Sם'ݝq" ). ӤƁZH3 ubj}bwj+">BzjEP-o>"҅H(Q9G&[3!Z\6Ǵ" HQHH9S˨Uh{>}0MúHIVJχ߹׷֖@t xO#ׅ; ~ |O/@Eriw: .cSG&b+%BN I"uHsgM]'*5HD7!`Ꮬ75(: vٿ/uhIXCwsMs H]yD"r0`pKm/uLHf Ck?qttɰݩVS{AV*>xɣFzt ՓNtR[[[CQ5O~K?^:_( 5A\ȍ>GM 2 qa=?}7J8ZÎD$gwu3 9c7j- w@Sv<-5ˮ8׋<N9bB3yFuBzy@cITŎjT-dKKKx|||V kГ}F>?vtt;;;߻;?}ȯܔ _YY9F\JSD 6B,j==y Z&SʼnHvv ] g~\-QGnں4[!m4r嬈f(Eaɹ5ٌ l6O{s-QQSC:S;>۔u1cPlyC5 \5ܵޏtET5SbvsDyGGDpDQ흹:<<699p_7nLj'+ʳ/_ܾ}o&uMo%vAKƚ8.u-@[=5# Yuvđ+ B#B2VK8$S_i/ͭIwug[||vͰ=ţ΁M LpS<Cf^MSq~;TӴųEjqCQXOH2Hgz+Yǘ˗/vx?,--q'=d}rr;:lҁ{+gW^x `R2Dtсimv#7;!íd#$#MagOj5miWv>'#f?.q΁s!! $7~K3JvW&}!k!Ń^֚vQM1?q#IOXZZ2)yn^"XY׋pr{rǕJe{{_-V\}mhh(͋%sa%?ta !hrr_c!Dӌh6Ibr>ƥ""n(qC|Jsff|]1}Mxc(eA~A=o #az"MBaIҕoZ6AVT޿쫫9ߖ6DNLLο~j?߾}{+oWZ}u>a`^m"lH"1j H)XGMx4Fu#ڿrV"5K[Wx;!7"=תE>%ƉEi-!pY($/6αj<;r]pګH9Sat, ;浚v9ύ ɼұ c5 !m2 *5t7o.| ARtngf7<<166vuddk~)|WȠ?!m055hvww? g^ѣ{Dji]װ* ?2|ؾ!lN2>zH7l>Dvb6' Ar l &᜿'f1&Okzxx}ttt^ݻw?Ϲ$084mJ/>SZHx Iv!{QfSQ<"$EE$ӬlM$3kr^<*d*;gF$:f; vC=(h i1%dA),뺨em ز<S=Dy֮W$FE]uξ) :뼃 I.R=j~\N:DSSSO.=99cb{{!$#m'w:o H@, orxxxks)abH3lG~N};s E&H\M:~$`( 򍢏L]lFrVq4(-ȭy6W8ċD͊H>}E8J>d>3RQ 7t.vD!$ }W*v bN<oڌ@r@"> |#ˋ88/,,t,u;KKKc<ר(􏴵= JNx~H/&)P@Wh4ј^P$r_s#dn](MD?QRk@Bk%)kaU@Iތ*"!.!]:c; vbģ:5"a]qz͔P6G UaNd `#DQwv⚴k-.$-򋋾 I!B4iD^tLD{pmc,}?P'e^)" 8Z5M|6H%ڜITo6*3`}s\n Agaa?ਧP*ժ ?ώ6oD(Mi3BRs7)@ap\ӈ+ƤFGH8!).m]+u!%IDJT&6xd PesHLeg:-4SD;e2/ϳW9C($Qd!܍4vlԕ T͏,L!o:z6IUN-ҙNua= e0 )!6Um\1%IS\@ ȷD0Z`A"|bM :Ex}|;ބ|ӬTBNR Vn|;3P߀ q|Ktzt8h٭"LKs RyNb#a#j57y. ,:ǣ9S$5N.FFF^wGj! r!1Ș99cҺ%RV@҉.p!%i4ĕ8\Wȍ>#J_ȗ*B.NH EqQHN4xW;R<BrVNτ0BpΞx3#1 Z?QcX$Q$| r hTPt6iu0_L;rs`3PW}p=qќ%(NDG8.)mqF }w:9 /\.Qf #DT'Ej(j" T*;2d; AxE]x0/p,H>"]JXAɏɇO)lNhL ,j:027TgGjNr\$>A!r2S7s 4Fu1Ҁ }Gu)L-#Smƨ}d?@;\(K:WDb#B,"R)eRR)N0rLe~ϊ>(4|UH@xhtS 7: )^ #vI_-mV΂ /s0м9>}3J +t;(V`HڧOzRS MDZZ6vttt7T*/ y[(˯'&& )![IcK]{w::I{JK7:n6'E5x䦮s[w'7i"ƅDKDH$>Le~/p-5].юcrCޟH؅hR1N#* 8.Ai+57$Hkn|99\|`%+Onhttv}2#?mTEʴ=Kz> a5h ]oHj'" y䦬c:BODg pţu!'&դ9(S*3:0+].QdHyĨv&,OΟp-#7@Y}\5 :R@8|C}lsp䚴pxxTVg'\}T*>/^;XHcϏ cjoN]5d'w I;UF#nX'X:=A&EQBLR\##״+c;\E eMe%]S~r%n D2<%D]gWxA4JξI3 Xj xWtn9uqTDun ShR1jsfɕx͂;;;oWUYYY~jjחY vԵ "Aiݕz. iM.Pe4!=q:}䦕KvL]GHqk)D$1TvqRTvf煮~>lN|F*A^;炭5pw,JFl( sc0r- ]9&Dn>tQ8>IHin)$<˝;C'''wskkk[W^+++CLH|wt>O5:AtJGdALdivB%)4[E[E I|,i뒄$Gg1WJD\4vI"щ4_.${܃>8{ wVw.2ǍRHuS¨n4l:{0u~v\ϣ٤ L e+]qL6+jC<142SFQҮXsƶk~j:WT:~|?FݟwΎnnnO<Ԅ䎚4~QEҜ7"Kt HZ܈!z`+$K}lii5dPY7!dHxeG!۲4ċGDţh$#dcTW#4◩xcab> nt2 0kR GZ[I@ڋU8 3lpůWj]O%؀$H['jDR^,:;;W3P{?hÆڪ&" ÂڭXTeq CiedʘQu4\VC#Od>E"e\*4#׼+% I&)/N$> [KC<*Y1dI&bbQ[IVu40%9/O%i}`3YCvCfPfO( e$irMToI'Q$ܱׅ"R/0av_{W*z:' 퍌<::񛐾}ilCrVPm _4I[$uʬDQRM>JJ3%ȗ'@e!v$Rٹm&]Hv=; 0GD$IحzI[`c([BUv!H;q!3id 9qC~Kڷx>D&bSG9x6Lں )ccc+_=33[[[MH_ڱfa2ނS%v.LX0QFF+D"|:GGͦc!ľdB2HY#_J|BEL]8 &8K4)]-NFm.D’HݜG2MSg@PEr;pB"#a]A19pQ|cxK~ [&_J>,t la!?f5S4ģ4D!lsB9 !ߒ(e;u[iI߁0u]a{ 3%Lds Na8ɖ7Q3  쒞GrQ6-=|&lZڴAuRu_W*ZLaal$۔H{7%܈%Q@(1]xCM]#߈ N4WKaLQRu裤L)-k=$WDJt#7 mH\I]ߒF~[y3,!v] R"+qt}A>P~JOK h-vG8R%"cHpH`A>okz\.oW顡=7zf$!OݚumJKϠ} >Lp=@FPް{F`@Mfl' ‘/ĤV%d1ͮI1cTvqQHRٙu&($^Um]Ip̱! H(tsɷ1,ܝr Zc I2Ժ.Q"蝵EH9ځ=}?6FOu%o5WTJ:ڼEtlB P7(7|lP^5UYQ)`J^~8 +hBn#so仟5m]#BǰzHILREG!"d|DSٹ⑉BѱċHf3QHUk|9D!iK86!㰽dmCcWĂ]i%N",fswķy8 o k!ea\P H (ǽuĢD"i~ظLnD}<0=f/q䦭GnQ9%EeLk&ΎBKcw, XގX2QH0e>ˎBrE(y /dk0b{֩"}Ǹ^g0_0@<ꇨ.dHCm-;Ĵ^㈔P )<{R|R OQ րi3.1uRmyyCCC?|)\.w==Rx( !ׄN6}/vHY}ܷiWb8!,RR׹#BHƸfSٙɈH&hH-"QH$5B3q{FvK+ oITzBY;q ) "RGz#U4E M z(Ե>/wҥKryukailOe{{VV0\s/L+Jް-{M=~?l, | :WNNƎƇgBH7lhMZAy5sᢈu]}'$HiR{FB=5ήTHF@:&0dC2oģ`\-$B{v]c4; R"쩣bO/)3`L;Ҷ^ Hـ@(ȭ^6lkBa=DKHLNYZZ¹yr|ի211Qky7|~?=_HGZm;t^aj' H 6v.Xk{&(U |:f#7u]\HDiψ8(4$7 iX⣐!E!᳐]?QG,n\<!mx} ņ =8|WtS("# 56B釵ʎ46,?RIؒcn& #"u5Y vZ'[Ksw<<%BH;@_*HYD$S ߴ($L.&;>S\s"SE?F`|c=yCsB #=oqY\(=eii@)!Jr[AiJQw]Jt)n}ku Wɗ.-ukB:9%sTv&IB#[X{QHsڢD&Qt+ yM+$uɆӰmfIƢ$V]H|.;RB8N"RxDH\"s9BY5QdoVQJjt6d)Hy͗.K#;`%u_KJ]#BHTvn ;_*;dEqH& ($FH2#y5Qg8(/ pStQB -Qض-B̆lúΗAD*jK Hq"JKn℣4|GqB!tcI`N>eR{F)҅>qض/t\X ;IoXrKmY[!/uiD׭jsI4+kM-)%y'U$=}Dd G&0-iH͵!4$j"ŝL }3ЬOΆs?)Ƚul8Sh$_$BH'z8iwn=$_%tuFy ]s>.Bj75]tDX)]`CZc߳`sw A$6 |3"tG%`TDuF(B!u &}A<9c۟N;/p~:L]iź%GF"tWqĸ($[<ʒ:t*S88HYDE8%ᢰ`xkgEIU1Y0gQg鞕1Is.?ұ4vk&:?3)!rqjjWs.[lܘ[ G)!t [E$](a9n^;o~U ؈ViFRټpM#F ăDrœ'M]І{/_:F~K[;}B%BH' RJ; &D$`i=o+]LcXLc vMa4Po1r4ǘdԅn#vGdEǍ{ =k)Ry QOB!6D1o#Y#7 歷sE#s"磏|R\ $3yDB(.xdj k3I'YgEgΤ1hG&# 6C#Iƭ':v+>:= - @>vEX[./`MCB]tBY }io$gd' yF!GG^B(B8mLqF,ڗh7VϪ|GF!sN fw\_~[. 8}RXr=#s?#-Rf2 ) }˗ֺ!dۘk$Jyn!B:.-=]}MR^sOZ9EݝH"I>E*5BM($_]88[M L'VltMgG_|a{A]B< 0* 8 Q7kOP&t,vHc lko/eGm-،4qޕ(R8s!!|5[Ix>߶3Bɐf$x#_gH!y($4dHt$gSܹcg<4vI{QAʎ/Aή 1:ŎqvE" m:}Ԅ"x6"ZÆi Ɛm㹻11dB! CAߴ"*^Kz8Ls6&9F$2HpjCBH;dL#?1*g#%^ElƍLcwjcwHNcF;}`~ԽiMH8֋>Vc^q~cbf% D󍨍kBH1)l#66鹤ɞOR^ke)N0r($#4$^8-|QHuO9 2K*aD⣏|ujr6gMm]m-K I\ =[Ph'B} u=I6~ QH/iH%Gyc?!>LR' .V<GvR 4R2UCqH>GYR K` 5vOɹQDR&Fq»y]Er?IT)HЁ8V䘳8 ]b^sis|d:@H.Ǥ7"aR=B!mXpthD4*/m>Ka@rE$G+ՅB!$ zo\MkvRzlC*hdN'AE҅(6~G\M;H>1)|/<"d"j}x^nWHvԓOH* 藍}K$#Ŏ:#TD" 0&tq tv5<'~ }/KLƸDQcLL!- 5;r'h Jm}w3.ɍDrk!>1[)J B!$N 7MO I"Rs{,)؉O7`A] `%8I M+Ry%QACX(Cԋ>G$͂0W3n52jHv'Ħ:cB!cđ$(q+bRR$8έ!I7 b "?FB!Mc H%ֽZ+_]Q#8#IJ>̮HeM[2sǻlbހ(],ptI$p}Uwޖ(lP#HX#B2b{o7xq"S3iz,R=$;ZȎ@E!L 4}PH" f̌q٥E(b搢Cړ¶>OG$H]g%vE*R r;>@]Kks8QQkjb&X\g#!F개|O@rEH"ݲ H$gbR &^ed&R+ng}I##+uy#-/]IDG/ NH (VvF*'z B]^/H3M?!b昑( RHhZ ""1e$!=>g`A))dMAY 4sx~C5tXv;R\_1}!TYȣVģ4v&$!ϋ= `i!6 1)tNA_#r oesbv]+P6X!Bb TFѸNA7O4r%H$)A=y~4aUiD KC<2HiG.)BH^""sOXHN2>W0Ϡ>eBi # N<.IH< i$_[!RG_Yu.ξuץiTۺ4rk$t+ShD!JB $9]RTqU҅]Hy0 *zG R=M?c ~?G<.QMvE b^(  m]HxtW.S)!uq>'r>ww.g##h;߭yoK$&B#ͦKLZCe ApӈDPkq놌 $ s5Mׅi[! Si >㊺H܁[:~!B!@JJ]W(N@r>X$^lDm#cLY۷qϹ~G)_~Hrd! ii$f,,e_|n]^E&a~:MGK. umH:H!>qJP {h"PK6îhHWe* 'ҭ";af"{WGB1BHԧHJ['|:3F',Mޗ!Mb~#BȠak&RW)I%]7wSg-yZ6wm3AcXp u|nnKRٽfD`ˮJCDg C ]v !` HiQZQIIIWsii }}:I$!IKcW.MHE!_N]Hr] ء;%tVi[ d0DξEa2v66? 3B)Ӣl\Ǟ?NW'ud5߳YD8ҢR2esBWqŚ44mӂČy"Q <=HSGml Gl? -Na+N@ |MNBbq4.}]HפԨy`[A i ģ"AsR>ZuNXcw ucD1vI.Gl4kkev񲴴N $' HiQZQ0!gZK1(δjΥG/*SJ J+:"y2"-\]E)@#FhDX 5o8Jň>H >} }E=TB(Yܨ"wqo RbH yIPTu4!;ǥHzDoK'u2t Kݐ8lZ}< Q I6 x ",} :^Gm8;aBE萤GeʩǥKڝ.kg]BHRk#%[QҼIpLcF.]ƈ>fWdNyUk?}n5 "9p_hc #1!b;y^#-X%20T"q'L~`ԬXNIr0d,/BȠ- /}]3GwEppa'ftҐnea® Dޕ. yc:ݓ}??B2pTC@zŮ( a{/loK$O D):XG!=[$ىwsI\6Rp:[!Rɝ㴔uZH>1EpJ{p/:O% E"3݋pJ1:-98- 3dm8_u*\0O#E'"!"lr!2ThR(nl5[#RoC)ɎF23sN\DRFlHP")^A !AޢDbLa|{(LX0 )NNHD(%)H@+\WB[$-M(lG:N,mz^ `GA{>-q;p|5HhQ" _ID HA50\~9_,`"2 $`-Uc:feBG*p҉GRרBKЧM!Rx\$ָ(XWHjD. i !KN)ueLg{2p2WD9k!GSB*&X#Ef'rB%繠$:(BN3B+E!-(޷]‘{-l xLz>wıhBOLW "솾8D`sl1^C6}n51lD!o /&՚W<~&!(4ɼGREA ga{e^:nw70(oFtB;:[v6ðRq|nخ;r Rڡ>6<$GFgR=.A!2KCDR¼.X彰}H:)ZߍM_"?y슖$SyHD| ~!>Z:4"B)n 8$/"ol*;E:B KBִα^E~xR- rfw *D(\ֹ$1=FHPXnjBHI$MF!XzAh#7e]{YP\eɉu[M$u w\`O }yt<û5hE)? %eH]aJ;B!@hD!DRziQHi)Z=ُL|)MF6dѹ̑6_`^|-1s qQxQ#/*m]kpA"DQfB!$ov.!\fRڹi'l )8Qb1ӺGݰ +2s"Qz'cHHH$_:e Ҿ0 D)=-H;k+נ}%JGZVBrCźOBH;ERۥgݳh^MwŨ##F%J)3ˮh " l3}]:?JM¢( `"ޕHF|tG-u/LvLY]BGT^+N!6IQ8"rQq'Hog ga{6 H1nh D>be#NtࠡCAMజ H,g Q$[BOޯcDaPD~>l_DN6>8Ȓze ?iH !9. rs|QF$7 JBi$$O`w ^M]/;Ly *o0oXiDgp?`wk|ER}F"=8hy= ְ+ GoǬ b/m0BBZ!. #'BB"8 ;O `p'5 <FfO` ivE Do1.ޓ("k15#Y؝~ Gv ૵}?pMzĄ%r#nOKE|#&C#3fMfBˆ4 \B"`?Y`c"Z14ztSlD"wZ*!ErZcs[uM2tdBJpR%MUQ˺xĨ#G.t]/%_#c/ Hs7ҋ2s!>v^o |vWmHe9lῒ|GjOA522r|ɈBip?H$"u}vDʘ.MTd^+NϡvC*pR@ pݯ.7u GMmiEZF6V;a}/Z.OЛǥR]z}OjGGG?755-phpZ^^j*'''oёjkxσ gGGG&&&W^UfBH'D! CTtE#aq2bg!b ț:'9wu03zu0, P .nk1OH9HsG(BᑎeH]tdˈBZ널9(h-v-l?djjuNQ;wDc>mib"+W~off滖)A!t $3332==J.iCS1))⭮/,..x?̺x`NuB! I<82aðEc%"v:\Z3c"RE:pxR@<` #1/a>75@/J$<2z-OHCL*"7$JYfuׯ_w 0&\zUݻwMI?,--}/BH+0BH1>qs+҈:b:/$@"́Dco$! lHLcwqk^"!iA2[/ul!74ģ1]OHq6DoNASe қMY__jկ/^\pyy !$. &nGr| |?B R]94H\^s֟Ɓ;] 'Lk=E-$ YPSj3?0)>i?ψG###r yG.o" ~:xۼ\!YD![οgNޟ^Z5{Ĉ`BSN]b AҚ0@8W%!E siD)ݐrP~XH{9 )ɕ+W2>^=8BTǏ !$ !tø=E(v69ZG'[\\A\Cj8^~-O>w?\ZZcB BH@*8%<&$O+슖X(}%9L "bpa4^BϾ'QI0CO-c&l755}qFe=HZVKKKGN"BH'ihvf#Q\"ݵkDqǁL E9ίyģyHX$JEk( l-g6]6CHiw֭غHZYHB:A Nq:!(u(i~"&H;q~Q:.enk!v !_ Ci&+6A}DR?˗/!lS >X{bD!S@,scFA}HwLhXѕYT$x %vޛIuoDgUVemnw݀"h*"ิ4(:"㾌0>nݶ,}}眪'O'"N}"223g xռt0hǵiwOl.--]d}p`=-?*GM\GQ@7ZMĒģ}RQ ?I@!;h5HPMR5zTR2H@Z5@rH}G+9 sq[\S8;W\y*YݼyikkvvvRXrHrQ;a@u_pqTt&~5{1s.&ICKvL2%0@ko atl7ωf8D FlpگNLLƍ 4>hmm-wxxE64nQQE77 4/@c4Y>~ ة\[7Hu8}ټi; Z`2qrC$ZTuvlloܺue>> {7ްrj~Hobn`@/ݢ*iElڝe^#Z6F:pd-|jIkF̐ .~gee݅B^m}@"H5L>=62]ֽpiFw[A D۷Zg9ڶL*GynÅ.^*}477c tb®_=n_ d @'# eH7R6rRA@jMF@&r6DP H8lWX}Ev) /k.2 ˟C쬭į{I\.@@@Ge3n7>U#&#'V"T. \H*c )4[x4@{.>j^Y[C[?^s1^t'fffsbyy&$ET*O%A3C`H.H}pyuH29DY =S~.?.>i"zzZ<::rm.X<;;r1QTꓣ2g.]:va>ye ?gX*:{y||禧q k׮oan8J|kX?$S zB My%;^0!⑋3R*E#D1i4;. 5)&X4JBf/X5AT_xrr.b4|_BԔ''U ʁtůAX\|[*^\vytŁ@"қoy{w'Sف5`XDVΒĐV%Q{H_JUnssnu鷻u2 `PKE_H븁V$ZVRu@B@6*c(' u&2vHGyNą߿ǟ}zzzα)`nnF1WX,~{R陽ŽvR|}$ʊhfccgGsTf❣4j}@*ZFZK͖92zپyVIE"h_}TƮL:ꃴa^QM_ʹ5N€'dB7VjÇkg|>_). 7eRΕ+Wj*ʳTsT!K u7\P|3 [+HE}Dٖ$h_xꟿ)=ʡJJHM Dt9Tm MX[[{vvvArM8sn}jcc;;;+333_~,6H0䌉D{8`GX>sB+OHP]=\#Q[k0$\~UCD.~ڷw3Yj /`$ zJ\YĽ=\00Y&DE\dq1I*:F%>t]ghߣQ{h"4@C!ѱϓ  r#qi{{-r3 &'Ν;I}\r9[X8_-Pe~ m/͘"Qhd ~?4Fo:CF0C$JAM..i90j/bT*Wkq*A *c[ h`E2u8~5 ! b?`7Hg񶨚' UHD2vJh[1\0xtW_v(KG>okk[̳ܽpeeŮ]Vs^;::[,) 0p n#XGB1) Z(=k@@ A%5?E%z( H.>f)/p̞%O#3 z%Z1|vYdy3xcf{vHgyiT$ze[ G+{<Ǐ?{oo0r]~V`h? ;NNNKfF$H8gYFh%$ ĤL׍uݢɛ{FnQ#\pq~ aCMHr?k9GO96ODZJ߿+Iz*0B`Ͼ.XaSZs'Ec܏ch]ԍԒ+|hQ;W7&fG8Q0i]& B*E} 㱿ONN0:d!LOO?{^.肀ݐZ\ɺy=P=GzHu]IICƩtnu=R #4@-Hzz) yІ?~6>>' &" 龚z# 1$A. EaHg=O9gc%H}=gU^ "r9F&:^ >~ℤw&E]JsAH=6TSᮋER CfHC AȱsMY#4IXXE!"r[[[ޮ8W%RZH4Md.W+}&QD$ > d`4A@v1k|]yFQᨙx?S"R=Q^F$tsü .'4g09$n2[>:ϟh Hk. 6Ik얋C)Fk[+iӧrrrk.]ދtl_Hd8́Gn4OFFX'ȁ< HQab'xS;/"E]1),"k@]! i`utXq-|=R(s?)94^c hLԿgtR҃poo_ۆ${vf;;;5($"Ԑh~~]ǣׇ(J#bC gqHV#M[Eq?ѩ=.V Dp 81)]II}EuuݣOHCcyClC 'q(rQ Ḇeɿxcww-wï-//MB2ڪ;7ZDՁ- @fnb:%9 ^D8b~/Z: E. Ia)*ŕ'&!$ Sj~Rt7dr4ν8}gmDԆך)'J&moo=ilnnhT=B$d$h)5*\ ju/KikT<3kMLj]XL Iq@H?Za~(-Au["q%@'H@Ё,|0n,6ȉE o }u'~MrzzjRu^k]">M]BI{aj@ļOℤ3k\ޮRTD z+or:*]7A*F e}#Ό2Y9wYdYk,8aB7q[],YET*N r- H1<K/'o{℣FnVEVŤV(^VsH}?ݡHE6gL`wBI vN$\H*{1 Cߏ닺/[~nk9y&''Sب ;&&&j<{<6O#V_].nrAc͏\|G $膸2vQ)BF$qx IDŋIc7gGo4l=K:pAwȁł#/I46ӄ#8qvGHzJ=}&"= 4errrgii7~U=Eŏ# 0Y$<-[)깎 ILAE?6*oױpհgUyhG}=_q qw:EC_10lTJVXszg뵲urq^-ݖͽ6;`̽KQ;TiOx$zΣykr' {"5Z}Iv6H&y;W7Rw)ժ>CX!]yС7H& qs>h5I8I% BT*Œ?ԓrGGG2 $ Fkkk~27gW^BИ=S:&Br#敿.[}=,sţv[F̈́8Q)\.J Hg^i(:GHC"hQ&ys! Axlc17YV/0tJb=f-Yѹ:pr٩$RqZn8בHz JjJ;Z_w\=pnbSrMhQ'R!xQF_#yycv~HLs#N|? ovCpz+q#Ʉ{x9vGOHCO>;G:BV$H Hi?cRbkz$""~ƅD_{QMD ;D‘=Hf[$IF";vjJ/>/Wގ@ @7D{5*17_qO3f>Ĥ8GR# K4f{& bq#uV9߲6hMi)3[SNUoPWxj4%rwiQ.$zJZXMbvrr;ӧq5M߸q^GE#z\۫=O]5ttK<.@< ĥQ1)**Ĥf%ZXOD ^nS{^v`ŤG;#)FRj.+]n5oICG$ur\3sr;?ZBM\+0ԔJ%'DNfʯ\/굀<r5H=E}T~n`?V%MݭWwb?SlΚ ^G DH^AqbR7BR+#'vQD:"RZw$hI;Hq V;yOgr퓊s: z͞:F\|pˆP*+5yi[tU*7FM y~G{ׯ_>TH7p5BVWW˵R;;;qB{\>*0@ @RĕB IqR {~fRĸZrvQ!iΗ FBRn HK _?E7^>I @q?E3)NPj]F FQ)RTHJN"R_ݣLΣ'_2+II*K:`P_buqŚHnޗqr\H< xBe%M@ vݾ}۶ɓ'ѲvZ(]{/h 7 %¿W-ΙWBRؕGRXHH#KՋptbHBR]ԍ &ڑu#I_=0An%n'~$pɹO?6s!11#/"=Q_"R?yFN #*YZZY{a鏻댞 v"q<"DAE",Lb2Sc&8L13 b:w&C2`[XpbF(g¡#5M*ƄW(@/,Қ! u.%aDd^?PYrcDE=Q>G }tnTf[{sb^@$iJiXg±pO~&ݻw=e~S% HüI`UG!DR=Sx rR!U1)gLQbyT GAiꕰ>'$EzNJLV=F/A9:*c'̪#I,QFRT7Y,%"{r燄zXr VVMݼy|ͨ]Ix0@4J}/*];2qqN LO_q*ӑ =1zy}& Dd{U#)㳒vCn+"pQn1!4@Γ:Gr^]02J%9>l{llu%ZeccϽV(ڵk$za-_waHS?j^9J0H>Zq&5*qJW.p|ip7s,^ivRv>~xrrrΙܮGI˵u@"樕JT?'|Iq\>u:aYzepipehT.Z.rvڅŕr FٹmZ0Lɡ)*_wF*9]IfHO9$ =Cc\!kJ%]>966ZNNZI<:;;?SaEޞZ\IaGB\>onif~VyJAO$ꒀdRrhc x4A:F-sot-T8 H8{7V?dO~X}NOO-09:j^BQt&)]d{{.]}-,,V!T"s 0jH3qNԑ®FeEDCD.hPN$w)=n z&{E H?Acd]5kH</ԯkz:׹m)#)x=:(yQ#*{:m>mJhRDrOۣu쪉hhRBw蜆 ΝOs..HdΑ^yii677\./J_5 Ks%H }-,"&5{=~9k )W6Ku%CJ17xr9ʤp*Y[9E4.kaX,{\|/Q xvBI: H2r&mll\} Msss|73xqqC@ Y$*$5F"R\IFBR+ѨOSxRf|J\1Vv'{k# 3# # =IU=C7kbtWY.Hrwȕegg/ߜքL^kBnX.nϞY[2ўGfE3`Im>o65HI7ܷɠ7G[b^0&8t~.@"$ ʫ!=2$H1b7W̌bՐc~k(Jg]8h&'k/eVv% +kW.\.x1)**rmY2vOw/Fɚ1ព5C10h4"HCt,Q,?=|KWCg}>B!D@2wZ$M./$4s#<6r(5Re7ɽϸyj%&9%T@9cpBuHE(Y-X,>l7==]+5׾=+%ԩʼnEqSf D~ߒdR#'>9 hfg4tGGR' a7hL.I X,j{]q=CBZܘBy;̇}C8H>7 d$xBR7n3k,s%ꗱ{_*1?~Wmt]uVCґTtJ (~zΙ4cb{.~c$j҅&p!ǏùJ 1D"R#Qⶹ"R'TU*]w])Q4.QzP)&Ddm$H 5{ɿfCos1@'R?y5 =@1}HBSSSvtt~y B&@@ha ?vF{%#5*aɘdڮ I?oު[MCr#IHr(P({Nد!E蚨+VgҼ&*cG/$~Yz5ceeV. )L~P!I%!3Z]7R]Fg Nn\zĕ /?)"]yhA=džBܞ +t9kz#.l166fKKKYgTjnHڣ7RB ?OG~G!njnEDr?#ǑGWm@:G}&歈WE=P mhOޡ粱@z357]zGN7NIChbq$obzI[(ߏ[@RM\E҇ m2I@_)*"u2Aikk^k.n+&赱F*R9c9 N  ypzܤ_^#G) d@hEDK[|zfbR1I6 6?}([{+ D ;Yޢƒ""Ņ(YCRY E nWDjQTvHxmi^_Hl]?{45-п`8{ʹy.$Y5mhN$1TN%  3%H!/RN$ ~;bRTT{=6^vq:/ѤzQ!h0G#C0AbV3O:z*+cM _j'''''R~n3 `pt#">ڍ+I"z1o<f\H]ޓ[uL@=+8a]5~q%Ù ylhx$p| HcccONO1C6@@,:睔;ipŊAЌ"*t-Ǥ 2v%$~t@4>-Cs ݔ^|>:ـ,`iEDU ݉s$I8!*V_8D数3s!| ]vùԪ+6D`HI  _ A3IQUI;:V+1ۋ =90Yd, #˳p!b<.@+}U(l||O }ܱAY =+"U<6buT\hۏ:r=4ωÁzMD8b߇!w'lLh^/1 ;]}68΁41 o>.,,|`c E"R]!scΣzN$4as[gv^Ċ@ oKQ>>!Cyqv0L'ϡ! =!~mpir@ ߩ'y H飙)xlY~F5/(@؊ gc{.A H~`x҆NTQ/$b|?w^GHqNLL烃 4C*E(,E3kMDH6(D,mE;.vIP!i4$'3`ѵQ}]&=GV# A0Nar:@9:: l@@o"1q>PL6 U+[p"f:HhHʤc5U%#CO e)rP >/' $z  H8=YXX7d$"*-c 'dI),fYyQ =\h7JU%H0mޢ GcD $rH+gggcwnnJ8!&IT=WήQ s ^~\兩m6̚ya H Ha'gbm16Z񯡯=ö2> fGXY 4C9]՘̪ I&NaE;8 CC#rR/2RP|>' RvwwU *HG"R؅qAп!,2E)B:r ½y#&Mϐd1ic?߯s}LR HMH+*_d pN?@Ds'"1$ZX< Jɇ?Z.u&ICbc`5Q%$fL qyaIG8ǩC @z~d<CNŝL]׬(yB"ϣne$2P3k,JS?F H꓀?huYdo1)|xx*#@ \zQXDc H(RI'(B}'E1+h=cUc`4$~l (ݱhȅtȓaj GdggU `y|'$I?QT/ tut(G" "A;z|? [<{.k0p~qss04ФxT cNU (c~&ɡiG#({}HW/iR)>1$ԡz_yrrB: 0jHEgRXD*Zg 6pٺJ(.jdm‰yb7-G?  et Pi%e"9IGfذmJm |E2`8Ffe u"\Ү y4qxߘ$1cD9؀ PH:S).i83 ARvׁ>!ʼnJq"TXD5VaEe$1q8y YT4shXHҒeT.}h؎h:H?x/i\HHHL:ruQkѤqn82h?5zi$}Y`@Dl3M"@:=E_u. &z +iר]|]vHaMD$&G% Z='!kE%VsKòQ @!Ө/RjIHfBRu,ר1b4$fʎHd Gs"Arqp!ed5ĕVYSG784 `tW.Z=RDs!xhC2qm!Qt A]Rw^H0hðTZ.>h $lҪ ^9z%QYToMv#Ę9Y4K YC.]]yB>eCXU R6 LҨR8P2vq%횕 Tm2vZUȘEDGɣcR5BZUeURJF }0W E 2K#R)*&@jEDÈU2h3!q@@,"B7:r> A72ZO yc.>}HO.8Q3(N0' <d T!E1ώ2v ߑ<驝0̿t.q'@w d(.ĤF5xv4KFG9QҔ9f + )+|_JNMM]xmSum\p.ś|݃ J1, Ahyl$E{"EgP 5b}ʮ5hq4$$=@ x_.U`􏳯D@?>~5ϑ4DtN?G HPuW..#)*${4e&G% ]'2VzK@!}G# HS"a-iݸqOAx#\.]|xG.E?0$@vhDž-_WOH#>HTN$>mI^P[=z!.?K̜XTp!A?|=}~|ȼ i]^w]D2@ "Ni$$A:bRwBWw~"1 >}4AGM4@1 In<?=F)v)i۸i;bj!or.StO\| CTɅnߋ HG׵:݃B}tmn^UHf5isM+E{pe_⿸ :j'=VW|ş=!.>/&I4#?xy&#@@@0QQ @(i',EEzej煭4aɣȘS<RQ .s> \\JFMLLؘUH< iaaO zy~Ef.>]KE5:wOx< Пc<HH$kz.4Vs =KxDe>*dn<{J@<** qu0heÅUNKw_f\,455h{{*eH8Lc; I|Ɂqe좯/s"Z.߶nOA7L$ H̄\d@xEe.R*~=|6,..^xMӧ C!1~*tݞc 8H*gT(< (Jo]駹Q= l~~>{| )2LjVwa lk"$*X|8S~p`Q.,7=C)ihȎ`vXJ҇]nJa}p2˱t?'sؽHó{Kci "N BDoywܝgMΐI,=cD.$J]V 4T*q_꾼Be~ļ]bšp\?!Rvqj̍4 tZmg9 I 2[YeʿѤ! %5WɔJMcbqq.>v߳P(=}zqޮIfMy 0SQ. H6VzV;W+hr[yf32@h,ׯ?Yvq<~T2RI %>dIb^r6g1Ji7Kwvvn Ǐ۝;wb]J!~Ш|kD$͏>9:OZq!߳ u:VgDɢޠ q$֯Ir4Ҡ Ie# RI.f$͙tVWs,DWR):QnGRTGFω,#h4/" k’1gdww;^Ύ$C# m!˼v,*`r-N9qzk4I'Qo2P! Iem=!LNN'NJɏ=rL ʿvI:KDkH@@Ns5+gW.=GF#VO!.cg`h00?277q߫T*Caa=yH`PD ts\F#W5xS/Hwݬ H㤡gH@Ǎ&OH;u oXI=k$"6ύtt@A@Vi& Efr1z"R/x0e\3T }qAKF;0uommz"A)" Hb 3@Jŕ|/*ʼnJykO)wp`蔏9h9)zo31 sdnnjjn$,HCO9  Z|=Z.W @q=j$Vy%)@giT%A0bӧO?q߫V+ћ3\p~hidq0 "<+eg1cֺ &T,7gk#h˿nQrpȩ*iT^p޽{Vp?/2,k<*czBR*X A1R3$sTR3R1P2vVWW377W螞֜HJHtqEt@VnQԊԬ5^<1}LZI8o4G%* ;T4 BZq1C*`ДJY=|D>okƢ~{\-*xy%.@&vzzZ~2t+K1 Q9Y34! @ׯ *UD$Q`<|paa333q۳Ǐe_2 Y‘Jڽl^S2@?o&E{LjT֮4|Bi;ݡr }ȱz<7y˗?ezzz7;;;FF. ]n(fU :FNfn^=mgD`/p{Di.8  ._ooo#"*=.>J*RuOq]5J 9rFT4j,YI$mB1wH@BH_T&EUI{_]]-m}idb⿓Tr"ż̹ IP]uR{fލnUGF+{K Qv,`tɘOkz%"iyo)Rj/0/ `$`ЬoQW+~!D)S @Hf^Ġ @ޢGLt${L隆0;X4lX!JK.}իWP(\JYR!YÁiGzx%%0;4@; uu޿z7JhA)r D\*c7F* mJǏڵkxjjRtxxho񆝞2DN9;.%C{kDI;ZہqFe|n&,CUcbЄ+{$8$ˉm;&\5ODbBRލ7>}qqxXDN.>F*I7+iGJЁj/ĕk~LhzݼG,8ry7@o-A҄pt %D$&!?;?-i2v߷m.>[ ;O"m>0T;0@4+/@fF}мfqozz! $D#5Ҍ/"H,HTS*v?~[nwnnBoµZ@*x=txƼ< v"dVbieS>hH-r_c@ DO~yODHr!ݻwh]8 o;FQG%nxÉC4#׃uP!wJA,sbLnCa|-0/߾}ϹsnCLE?.=Ե㲋\LH 4@/i}vhZ7Ozģ2i6Ri 腄RtkW͛?;99{r /ғ'OHT럺.̑*gWҾ\D?%c']+"6C^f)rɑ2*wH59HRך"ZW6Ѝz&I@*dM4>S*& 3J%V,BEZ*UICL}V,Ǔ-йcOH|ɿy= ڹ ?q?W~ݔj2f@*_W =?NhŮQ3-,Xv( T*s߯(B𩇇_\.|DIg~q.ϑ$^i"-[.*ew<Fu!H qOT4j2j$DEZ jp 004>H.p\MJ]:2OTҸt‡<رI;or>?zpܶ,+]@BHQ"}ka,R4 8_ݻweoopv >6=Ve)çd$Ga}m6ɩ.үKH0-Æs5VzS兑}ӣ@ed_tF C@ )xBYzѣGHZ%ĪIj>.?|cm<{n_S[, \VV22eyw.x`n N_GCDS0l入[ ̂LV ⑀($6lYTFew0^}gtYa1)^&2GE4̊ pȹ deNn $jYT3[?QD{VHw -f`.%(~\Ld/6}D E2m e  ON,$BRfb;յhNZ8ld*ko93jd)Ô? :rrϥxÿuN9U`]3nK@D v/s5gQo47S  @{pؤ ` ӐrtuYJhh8 Z q9 );f^8{>φPH@#e!yn%pX\,xÆǛѕĢxQ^òrȵ} 3@Q[7B7ZHCBp56&LqQn%KHCCLX7rcJ Fa6ukeުV?EVsn4cKRMvwE^?r`tYiZBjo$$j r>g?1]G{(0q\ElqŪzHh^ڿGKoVeihԮ%r1 V-+Jj]nv2;) vDZ=$  Gc'Ρ (>3?%YYIDcԚ]+a懒c8k gxmζ.gc?RMZQ 1n 5 2, ;XwWGt ,>y6u#Iڰ'}e=08 &I R$%ބN.hPxH fU ɶ6L6oHh'(}hg! Qǣ*t 8|]$oUCY f]%}=,ax>?]qZ)0"뺷y1b":wAF-$V۬ ^s=F򓔒L,..&!(,>eGKg&s}ru7@Su( Lx;n F ? zHjxK[Ưu^- k"Yphbqgܺnx0B`M]TSG[$2p+A/9.tҝܹ{vݵ7F3f ցd@@V Hc"`)ytv aw 귣vذc4P-mמ9[݆߰T3N Jfe) 8[?*eυ6vӢBoCC@XF4KA7Pk[t޹yp 2DYܼ?Ve_$ >fNH)(3KIfeA)Eqh8kؚ:>kc|.VrvLm# #`)]%V uo,5j@c7~#9w7z3|Ec\fe^=DVْSd ,$c)}4GPX7$eEYH f])]\c# tsl$Y~;TQ=sn HB(tZANLb pzbg8^5-,$is놅CvX~w5,:wwy|T I.53E<cُnQdMDl ɦ;m]6Rά,(gzkyȏ`flR5cM[D#8-FE\C9oV\ιxt}O\gH<dHpqUu-w ţXPJFHUPʉI%!  t }]F` ]ZmP C@樽1Bh-~7j_Y Ƴ n5rf 慢&HqVұ̚ J]깐X0=uuMRH LsX00=儢8g&sscKg Q a::цtEP7]Fk;mHx߸k@l XwH>Φ5 ^JB"4+eBxtOI<hl2muˏBR7v:n~!"I#uc "-g mfZ]&o}+[%,r%˻D$zfE!\=8|##Y.CcG<;%ϸnUMee@gn|Q&2\q x|my{'&MbiBQ-rv ch`v`<FDsǧ #Q-۷ YZԡoCw $NFFviԓQvد%'>ʂ;ĂM"ѭ瞺8kQ H91)I%^ -4I1oJHq# GQ(JD$K{nhq`Hoႀ=C'2-5-@nM/1i?"[2Fd=@a53MeڳT'"6ƎEB?>k*t nX%Gw56(h(Kst D(,XeM+kn-s҆Djji~`yQ* E#w9Q L,ŷt/kem,K[I0|G7Gn us(!IZH\h!X޵ʲ dÍuʄf'Ʀ,mI4(+=%A)qݦI=^$$m\Ql[v.+thG 4 Ѕw:yqn%B˸Ubڰ@Bzn*MU# Dс(6lbA)az7fp9 NNSu9(eaw&vl}f!a_gh#cʉCMd(+3[/AXHu Gd!~>JG$)o죜}],!$4hNw]C@X=48λՈP K<|o0@iʊ>~3_ϖ;iKQ]Q+\R⑿B!(%09&控D:(ʞRIAsoXI*_ܘ~$|R0,1ZrkVe*)8[]Ȣ[;7܉;@4TQxţa0!m]ʾ#1?ƷGaōRvA9"йkX=ݸ KtGиZHvX9[vk"⾻DaҴD3],mX8ڶ0ƒԋ~4xD)hDll]פu0/ i1`e-閑Ew`5r٭)%yr,%k:g ֳ,M]#myt~R/nImhd O*(ea<[V}4fBu6 gs  ru;\t+,?Z33lT! 3B'%)x{6)e^rF)Xb1;mюsF( WE翌tou BV£6T ~4!,$Ɓ;` >G}V}F3xx>TIu 0'|apŒY^TJ H9Q)xfAj2ޣ|8s*B}3KQl'u2ocLj~* ɿ_I8"; Vq]z.(U7'HR9lܽ^:h2l3]8I{kn7QL?١UN [Uȣ:_^ZNNejN|<%$bf!#oyţϿ. m"7fn$I(VD̺0`Y ܩy՝Dq[n֨XE*1 RH'-fn9Dnz[l$]J4 G8Uj}|j#xP /6afR/*L9(}j}7iu}]}ՉG[G|@7,/yYy$GUBVv_r*x..pŭUI"6Zb[R'.-t|6P%T' mFN  WhiK߸:RRGa-$"ģ\R,h.w((}%:٢ݼHD 4$XmZ75 7>wH/ ŋrt\ 8XJ^, H씲8(}ԏK0R.(qhGKg!!$,hwc} $uC6(6k"BzakvZeWB"]pU!~] 2xrIm( FJPw:5^)@#; V\ݡ8(M5$y HuQi;t80#:-;b"&]cW[o*(!KZg.T #gu>8#m䅣PD BdXX t8% 2-Y#dG]JvfdhJa,`s:΢$ce,cԯ%Ī%jk 8d6iO˼sz(HqpmF5B,#ÚRM,G^ R֑Q.e_l>i&>^@|XO4'P-\;  9f5v&#oaf!Bz7vRXb,}=q&ಮӮTQGd4E@ uÚ18[%ɶQ.XZu8tXO4+ehؽ:U%Ӫ UPB>?cq^">zS0tndgOle[,~l#w#`hb]glF)CMo$GGV>¾v_k=OwtBsd!:kw] -P*1Vebi5b[XD K|0ec|`k] -r}I4v2[7[a'>ţTcKי碱zk\cαn,nn8ZQe6ܸ,ާҰNrqa`ɮخ.=r_&\{hKuuQߍ4udYsѨHPe7,-b=t)`̂\OʼnIż(IcHrcwh ZHj]7zЍ{6y G@"=oݱ3a~םtD7Z_Mͮ{Xg}l55`~t|x:RYH8MwJOZYH"@u]}H鳏b\Qi%2 C>cp4=7n^+`UHHYڷټgTG醥$%x͎2k&k$mZR/@ufXnku]Q:`ޓaa\<^_kC7Ql>ch=[ܠ[60~mYY[B|pgcA(F껉 n}`k&[8+V^9s. )Oc:/)hQ}Nn !ŎaóHm4kXt_ 閛XctŪW% P]zUqg!`,ױ;ѵkwXmˋHAρppssu]<XE#7z;TQ}]*Ɍ#ކgXG:ќͨ]p 6ޱF!ufƮ[  Z%"[M(BC349OQ6vqR/hg3CLc8s 79Ժ.nxwc E &Qξ.WgkG0a3HAe1T6v\y[UoD, JUġ-iR(⑂Z޳WYD; 3 H^DHA٤]rH 8t1Dt53;?e}TRGa}u ǜG#ј/ABBuӜwK#D7V\tH+/"m-Me!U6Ţ񭠅䅪8 `qbrV908>Ba Fa֑7qMX<:t8(e_dhbCFD٢}4ko ?&V(!mAV.R,ApN\Ml[:ワ0 FaR|Q4r$X&2=YU)˸RQʂnMvB(} QGY:q9 u}uF;e75淺&>wk܇VHgP.ϯ6o [ >A}P .dtU|Cw?ece!j! ò uv̼gr.=Je Cq,gEl*(}Է \ G0#^@ڦ+fh3\Cd]WccAecխqUI;P֨_*v/B>v̍IENDB`images-actives-html5.git/src/share/themes/popYellow/img/unlock-icon.png000066400000000000000000000027371250410645000264510ustar00rootroot00000000000000PNG  IHDR((mbKGD pHYs  tIME PYlIDATX͙MlTUδ}W@hmB"q1@pB|$b\;\3*4q&4AP"ĝPBCD0kZδvyseSս7ss=3 Sjl6y /+D!:C} @:L<M$e>b 8Wk)97e5;ùSZs<|`y5ɝ~uN/djä ̓U`94ɡ]/tmc$%%^3$iL;7qBy ە^Hp.?*hk!7j^*DS4tv2OK)>,/;*+෿Fi#>z$]+/\f4%i(&LrwjCg1gゥұJ9= @B[_A&`&[FNI UKt YS9>7Xz\"$RD 6fS&~4rq^XYi* 28O"u>WPZ{80n~%.U_ |ɦc( ڊ/?#M%ٶMEi)xfs_'eְD^D(Qt32mYsF6̩2Z[S\ *bvQԄx1Sr)x_8۾ ,IDiZ78 \E uYSmP|ܴ ejj5Dz:: ̦M=7J$$i6׀Kt# VM`..Pd ?``A>}x; c8pL7٤Sx?Xd>(Pȋpf Jhqat\F)R1CбÝFrR.c@x4+jo ( Ms$B;% )_VLqJD MVCrF#҇JFWP@XFSYĻZ1HvT9}h ~BI t;{B/2+]?:CVg:4o^g]1eH d}!52~=NVz}!P3oXE/*U^g <3ѼEh%h%6**_zH$"F,ОO`o4.cW sd(3"r*)GP8}Eӏphb;~0c@~ ƎoNy܃O:mk{qT⩪S*C{.uW/;icgUV:)As7nxsF/@hbPiWSG7<,(M/rOCHÄٙطiιY (?L2[RC9JQ2f|.g~&ZaǜEv4#׫ bR?Ld }tUt;72{{mA 0RhCi%u׬[]v!5bʹ{[ݔ[D5+ 3Anlu/s$(yU~4E,fɍ뉴48j=%Sx~8 ۰N X9( ͣC泤Gj8kLN;Bw#uն}`eakffՖ̎7ۋt fmW`5a}$Ny4Z_H;8HA)LC؁uPF˯wzg5PJQ2Df|VsTի:]o&ڀ(q '_-Np007&TbX |'^\yA{,B!=~uӻuަ{Ë4^$zSr<520^vc/ ]Oe[J_)e,.-{FQ o,C5>ƶd`Xi@S((R4#]iPH/t00lF[wҶ)y*}xU ]_A%p!ʔTg~N#-`˃Ξ'2nj|㔆l#Tʪ$/UVwz!ס(=rsSTBjh":^{]ް53uS:oM`'z@ JmģL:3ԯiF [ﺄHQ7r2vXXcv#Ic>r<ӨW:+KkŖ.ŌGRJ|po)oU-)}yKKۭ)`>K&f)O4^|+S @m7ߏ.JD"R/O 8颱uW}_Es&M}x8=9jIdzoұV_|N% d)YrtSK ˾ j Ȉ=وg~ʎZh=U LYrcM4? uU6^'ιj/pi8DP ~0k#HЧ KC婟ϯ5 <}Heq#Ys)RIE?D+(aP0u.Yo2[{dG/07+wCv(E˙[ ǎ`Ɛpk@Jkn^Vᩘj26B\ ̡LS0ReHF9M*]b]t,If">nd`{ )>xʎ9 ǝpyB, J|augUT=#1Jezhޡ$*S YɇQ?ҹ'[c JP8{c9`॔9ֿ- .$Lhv7D{1k#ft+^ZA^@ټ襕6iN 0< [# F*.@/{"ī}RZ.v0PD8PP}9HNl:[Wsn'> k">Y,b8>nf<N>`}۽{:$=;-fJ, \\C %@:+51ÈӪF }8c _k\F_*)0cD#p+t8I+2 #Ư%' D22(ׇJ>" KYd$cO:cfQ kD9[쯏: )y:aQV* E@ֱWI <m Q@ ,G`Bwc Zk6ny" lŹ4AGcflL=8/LŋcU`M9j {&m:3/Q>urIENDB`images-actives-html5.git/src/share/themes/popYellow/img/xia128.png000066400000000000000000000130631250410645000252360ustar00rootroot00000000000000PNG  IHDR>abKGD pHYs  tIME  $1XIDATxytՕo7yǖm"`08 LBd0p8ä-8!4K& $ Ɓ !Ѕ mUꪚ?ȲdIUBI)}nC@‘(ty<0 L2Hh0՚~1f4UgB.9b`)P!5+g4U1DqTـ \9]ܧʺa$O*˧j*5Ӏ`%p*[/.l 5U1@)6:p$z$ex@GX;Oٹ-H4ǜ mt'Wp$S{N.}qHa‘hVr۪_Jђl GiD |  < 9њ(AJ媷.J?p9KM? !cHTByKS9H B@50ٛJB`~!.MU&yVةB;QٓB94D_q+!$9 *`[@F\SOa;6_mc#An?B䎝@AHJ4Uil_h툲!̻L? AA;/fGo;a)?_-֍'Jɀox+VĮo԰$S*8܋dBD)Ñ:`'`MSd0x!$G_ 4Llǻ#atXDqJ`!pg~!^Hb'4H G!%P<qWA.{]DtsRHA,tˮ TKݿDW F.Lz`33q0>k‘9vf4 |Gd_x@@UJ%?Q!>w)nw5~!lL ūÑM@>2zg(3R?`20ɟh<٬Ҋ!aÑYs~Կ ^,=f*CHtj~{wlޔS`B8ߗ8^'7VS3Pɟ:!IIFH2$x/- Pӱ ;)ĆOu*f"!W?PHBdHtiaV$B_a_v?~dCG޹a`]!):O'obaU{SʔjNj=74u(;k1g-!wbVa Ț}z]e 䔑d<˖A Ӹᯘmej N` (9`;Q!z:3#d4o7NA{KLoh|U֐5r"e\NI"f2k~מn:7/d S4Ui>!h޺m-u2/T-opdkxz4ɟv>`M˘ʧ2})~jLFw8N7s[hs*O+%gl%in#m2v?yTߧL?)ׯDo4U'q?R;W8iE yEdh=B-dCׄILtW!u (=Oޞ"Ulh,b1^hoI狃@BNE[|D 0:Y ٿyNUwp!a3!s7D>g0NJYK0 cH`:O) 4b rQ 5iKφ#QKX fދhx71 qBr$TVA**fLӠCi޶ï=E~O Vr'bvS/!a_Q2%\Ϧ;> S 17PT5`A)F">pS&$`-ЫOP\#ǬKП6_o> 1|-#f_ocL#J)|+| !;o0zJ霋i!@OBYD8Rt<&^}?|!lM`ZRQ^gNewz|KCyklǖ KKν 9a"+h^W,9i$ӸjYN3P.ABe㆔ ';&3LY>\EZk>gU6_tb_C!CotEIr %xmM[n%ZB}q/z[8v?I: c~ 5]\“灞+ӸᕮDH2$Տ#Ax%Իƒ쑓͎vYfn wIN:s.=K@ f%`7CC7Td!ɟvQ FG;"p4ر=Kߺ(Kx*bgvh]#w-'t@l{~'$ aqIֽzk:94IS^sv4;۶(_ f;~)7Cج򉘺Em-eRx|0ts1 dSQWuMU:: R `rvg[V;ydZO+h&dę6y p2n 9zܱvoI Y󜞔%}opۙw ;T!2)Ŵo=5\Le K6#Qnr$#*(RSR5c*uV'>ޑ3DV#PXwMHEQ@*g`IՏM^- >FlNK%C;IW`k2Oei8RK >L1r5 aQ_7=ӣ2:ȝX=t6X$4U&g -w&g^ C C||`/^ p9Yf}_ACEBƒt qiۨ珎H%1bŞ)Lu}n:X-L ZAѶirqvQt>W9o {V-O/eGvBi5иlllz#Y}z~G3=iN"ف-?y[rsv۷YhIOh*x+#\TG.4|)cl{!v3J!|TMe=o |)Z*[^vB8BHlJ8#ֿvu\Te3Иi-0vɭI3:|"!ŅDl":uo?&Q4UWJs^@qxAeZ vVd)zkSJ 9~N=HhC\'8Oh?ਃ?M?XZ>SAҬY 5v?q+z1iS#1kZ7>?/ޞz s]&np¿\I=vƀ`($x-5'.dcc&\6X;C{`A\H>$jݏlzrPe* #h5Ҽ-j׮J41g1Knu/T帝`Dn4o%MGDsO`)Pwi‘J 5eeCr4t.s.sO>~MU2^S1 _Y>&eg_BzaO=1nR|*. nYϚUԬ/߃_z%T|nV~ظzExxLJϾIK t6^^|Tځ~' cC|r ];!gLʠ *4Ht!g&-?ʿ{r7|Sk{_U𿨩>hk{1Lf3ɅU?+Py3HlWSՃQj4U!N, D͚Խ:9*. 9^TNLB$LjrC{}k/gSX9BS"v7֍/"@70|v j׮ -L\۴u9iR~ν1'SZ |&AB;b]qj\+HVvlgdZTz숉܄ 亅ΤAd^>ɹ8zU+=|SH߉38e;љ4*AG A J0ִ WL⬮B iԃ,Y#T4Ak0V )}8IekqﰭtV$YxثGi$0K[m0#HZ)f_t%o#7+Ŏ:ĆRr@l;BxJ{)E)E|l_c bI~ {rpŕ@ΎT)_XkG*[2OYFJ?E/T#2*;ܻ*%_=^;b%#fs. B;iNC b%IENDB`images-actives-html5.git/src/share/themes/popYellow/img/xia32.png000066400000000000000000000026111250410645000251450ustar00rootroot00000000000000PNG  IHDR szzbKGD pHYs  tIME  %,t٧IDATXí[lTUVJ[Jkm("3E^|A}P%j"!@A@$A0DoC,Ԋ/d Z CCzkgkmAx.8v xpn66r4`?h0K`_q&dܩNb"o6lx+S6D6,3t&*P &iWZӶ{5CO=@Ur9d/MKۧ矦{[n8@|nuD'yN ]n)Hm͚8]+{0"\quϛ֢B;5=*[ v{dmV}`opZR2pWc'2jlP-6uK5fgQ,. z!Lf:֊X1s ts/MJ1j,fn:tA]f`48z=dsBR# U0kp(f!ZѶw} !2")度17,\<<{wLWR193K49ڛCJtJӨrk$Xca2xM# bγ(-/v[K'l%p*7EdRƬ-تj3! x۹{$ z9b hm)TralE-UՎ|ұUNV5#H(Ak ī\q*7Z# 3q&,~5z*D텈mci)σԭCelAZlINr!s-*Bz8@ٜExx?l"T8PfhDCar$H3c<3B@]g}df̼C2PhvBHSc&,BJsK}ܟ4,t*4»O&MS4k):pQ>_4B2ǒ؏bPkY=@T-YE`**}tcQIVC~9hV $ֱmƌT8aA`QF\W")q MɃoO>ӱ"e+>$#Vmz\=]u_%q:#kHz7׬)s hM'=,!a.ܓ4qO_w]B-8x)ٚy{L2C@zzAcN|p7 z`|q: & F'269q7WH|IENDB`images-actives-html5.git/src/share/themes/popYellow/img/xia48.png000066400000000000000000000046531250410645000251640ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs  tIME  %c2Y 8IDATh޽{pT?{ $( >u/[NmZ+/-UUhgtth`ŬvU¡juPƺEPcdMqMf z{!LCONFn}]U`/1 =Z跋1q`l@04X\,]Exl7 }/%(!ss]>v5 +{J =`=~b5`(< ,拱6`iDB`h+@x|(rK`* Cbԟ20u e"FϒwS_@E|,5wй`:qٱ(O lCBUiA Ν ֚ЄJsRС0x EU,LL&`th<΁}e $+(h>mM&d jv@ځu"mA G@ړe&/c)>gg%D<9 ݟw%q'B!S @04f-lٸ[BTnӁ`nifRNa$ؿnv|qLU"j*鳩MkAUǀLC՜ 9؍V᧼i>V,R慎|;bќ+q#H !ڵw^@ ~b}!v|8ZpY8zoo}ȵ Ji̺^E1(EE ogI_xtPELC?U@GW||vz۞GQS)- OM= K䯢ʱ"aȎ-XN`E3i^u?)H(=QO ? x΁m9v G(J.ȳ-9^K|M4`iEϡ/XFI UϠEAJbG:߽sWT>=̽ys1,=WEhďv1[@?k̸.ʦFZBN xBH<3,souZYmYH˚NUs;snڄnvb$i#m ;>Bܳ8i͓~7-ihU9W߰Ky(kB=7;ŎdW{oбG?v#=bې>x) u<B #?v#cEBn&_£<=s͵BR03y"áG'A2sࡌ6EA G_J;3e,Wlr޶7hUS@ ߕY 9&H!0Id2Ar ^䳗?{:_^H~1 'pw 1ʇgfFB\U";> -9o&(h*m境мz519y %;_r%vb$߷:MCo;MpЙn2NuAt}J51ijur~ԅbp0>V臻GRE@㞯oh]AyN= Пξrl, w޶H{@[(P<^j~V㩝6^eNLC7?π0 ]:AlpFۮfDgD;? `htI! q`io&eRNupy9k"zLCk!&g5/>.4 x@@x?4'rm҃+OO3Q^H B!Mn _9c"RUIWnN@g3Ҩ0 t3|B IENDB`images-actives-html5.git/src/share/themes/popYellow/img/xia64.png000066400000000000000000000054251250410645000251600ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs  tIME  %HC IDATx͛{t?wf7@L$1Y W COe@ Le]Sh BQgc@Gf݇뗱g+avf+;T{{ϼhXoca/f$i+I_Ͷ&>;E0K ˒3'W|s=U>7({/)':Og v [MYI;) s39m;Ɯ$s|ӓU'EEEƢ4}ʧ~ j^Qfڔ.g$co߬xCKm,$8#@(iXɡ(Urc&#XQrPr>|v߄A #ޱ]՚.a&d';>&ϢlTP +B ({|8Ҳ}%].F!ޮ|{b~>K)i? +tr#߆Rgm$܌URJZF G:+*KˢF{ ˴'AO8L wryE>AdFx9%q jKPȯz@0SI/7԰뉵5j~1#au,/gKCVZ46}tQr ц j&R"Dh% 8)9yǘ?jip I)L)>?o_ֹn \жk)՝3#H+&K '?>ط - . ?m+Wm{mwF3EnŻ7p}mEF;6㳹㉵E*BUib}uRI :?6dEq_clfvk>x* s܀P2bE5S>ce4o^a?OYohӢՍ@"݀`9:hH?~coWE | {9{k'ǒyBвy;鬟)Rwrd Nееn$%#qw;LhCi2rNSyJa`d7u+/e-!3G5lF  x ;6HeRT3!,rznkOZQCVb5p=}Fե;A&gfNN,j`U-_ ZŹ+yT^>3.>׮2tmr½N!=/W~V4o7m;7mkN.+k(:>u+NDgڥ9ta 0&|~/&ڴ3ҎPT|}V$2C$C.srg}. w:Cfxza!~st ]{){CP| =MI봫 d[ ](*t|; ];㐛w /x*Xn4:tk7eQf`^]Ӽ {{TITLE}}

xia

{{LOADING}}

{{datasJS}} images-actives-html5.git/src/share/themes/popYellow/js/000077500000000000000000000000001250410645000233515ustar00rootroot00000000000000images-actives-html5.git/src/share/themes/popYellow/js/hooks.js000066400000000000000000000141421250410645000250340ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @constructor init specific hooks */ function hooks() { "use strict"; } /* * @param array layers * @param iaScene mainScene */ hooks.prototype.beforeMainConstructor = function(mainScene, layers) { }; /* * @param iaScene mainScene * @param array layers */ hooks.prototype.afterMainConstructor = function(mainScene, layers) { // some stuff to manage popin windows var viewportHeight = $(window).height(); var button_click = function() { var target = $(this).data("target"); if ($("#response_" + target).is(":hidden")) { if ($(this).data("password")) { $("#form_" + target).toggle(); $("#form_" + target + " input[type=text]").val(""); $("#form_" + target + " input[type=text]").focus(); } else { $("#response_" + target).toggle(); } } else { if ($(this).data("password")) { $("#response_" + target).html($("#response_" + target).data("encrypted_content")); } $("#response_" + target).toggle(); } }; var unlock_input = function(e) { e.preventDefault(); var entered_password = $(this).parent().children("input[type=text]").val(); var sha1Digest= new createJs(true); sha1Digest.update(entered_password.encode()); var hash = sha1Digest.digest(); if (hash == $(this).data("password")) { var target = $(this).data("target"); var encrypted_content = $("#response_" + target).html(); $("#response_" + target).data("encrypted_content", encrypted_content); $("#response_" + target).html(XORCipher.decode(entered_password, encrypted_content).decode()); $("#response_" + target).show(); $("#form_" + target).hide(); $(".button").off("click"); $(".button").on("click", button_click); $(".unlock input[type=submit]").off("click"); $(".unlock input[type=submit]").on("click", unlock_input); } }; $(".button").on("click", button_click); $(".unlock input[type=submit]").on("click", unlock_input); $(".meta-doc").on("click", function(){ $(".detail_content").hide(); $("#content").show(); $("#general").show(); var general_border = $("#general").css("border-top-width").substr(0,$("#general").css("border-top-width").length - 2); var general_offset = $("#general").offset(); var content_offset = $("#content").offset(); $("#general").css({'max-height':(viewportHeight - general_offset.top - content_offset.top - 2 * general_border)}); $('.article_close').show(); $('.article_close').css({"top":$('#general').offset().top - 20}); $('.article_close').css({"left":($('#content').width() - 40) / 2}); }); $(".overlay").hide(); $(".infos").on("click", function(){ $("#rights").show(); }); $("#popup_close").on("click", function(){ $("#rights").hide(); }); $(".article_close").on("click", function(){ $(this).hide(); $(".detail_content").hide(); $("#content").hide(); $(this).parent().children("audio").each(function(){ $(this)[0].pause(); }); $(this).parent().children("video").each(function(){ $(this)[0].pause(); }); }); document.addEventListener("click", function(ev){ if (mainScene.noPropagation) { mainScene.noPropagation = false; } else { if (mainScene.zoomActive === 1) { if ((mainScene.element !== 0) && (typeof(mainScene.element) !== 'undefined')) { mainScene.element.kineticElement[0].fire("click"); } } else if ((mainScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (mainScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { document.body.style.cursor = "default"; mainScene.cursorState = "default"; mainScene.element.kineticElement[0].fire("mouseleave"); } } }); }; /* * * */ hooks.prototype.afterIaObjectConstructor = function(iaScene, idText, detail, iaObject) { }; /* * * */ hooks.prototype.afterIaObjectZoom = function(iaScene, idText, iaObject) { }; /* * * */ hooks.prototype.afterIaObjectFocus = function(iaScene, idText, iaObject) { if ($('#' + idText).data("state") != "void") { var viewportHeight = $(window).height(); $("#content").show(); $(".detail_content").hide(); $('#' + idText).show(); $('.article_close').show(); $('.article_close').css({"top":$('#' + idText).offset().top - 20}); $('.article_close').css({"left":($('#content').width() - 40) / 2}); $('#' + idText + " audio").each(function(){ if ($(this).data("state") === "autostart") { $(this)[0].play(); } }); var article_border = $('#' + idText).css("border-top-width").substr(0,$('#' + idText).css("border-top-width").length - 2); var article_offset = $('#' + idText).offset(); var content_offset = $("#content").offset(); $('#' + idText).css({'max-height':(viewportHeight - article_offset.top - content_offset.top - 2 * article_border)}); } }; images-actives-html5.git/src/share/themes/popYellow/js/iaobject.js000066400000000000000000000723411250410645000254760ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr /* * * @param {type} imageObj * @param {type} detail * @param {type} layer * @param {type} idText * @param {type} baseImage * @param {type} iaScene * @param {type} backgroundCache_layer * @constructor create image active object */ function IaObject(params) { "use strict"; var that = this; this.path = []; this.title = []; this.kineticElement = []; this.backgroundImage = []; this.backgroundImageOwnScaleX = []; this.backgroundImageOwnScaleY = []; this.persistent = []; this.originalX = []; this.originalY = []; this.options = []; this.stroke = []; this.strokeWidth = []; this.tween = []; this.agrandissement = 0; this.zoomActive = 0; this.minX = 10000; this.minY = 10000; this.maxX = -10000; this.maxY = -10000; this.tween_group = 0; this.group = 0; this.layer = params.layer; this.background_layer = params.background_layer; this.backgroundCache_layer = params.backgroundCache_layer; this.imageObj = params.imageObj; this.idText = params.idText; this.myhooks = params.myhooks; this.zoomLayer = params.zoomLayer; // Create kineticElements and include them in a group that.group = new Kinetic.Group(); that.layer.add(that.group); if (typeof(params.detail.path) !== 'undefined') { that.includePath(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.image) !== 'undefined') { that.includeImage(params.detail, 0, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.group) !== 'undefined') { for (var i in params.detail.group) { if (typeof(params.detail.group[i].path) !== 'undefined') { that.includePath(params.detail.group[i], i, that, params.iaScene, params.baseImage, params.idText); } else if (typeof(params.detail.group[i].image) !== 'undefined') { that.includeImage(params.detail.group[i], i, that, params.iaScene, params.baseImage, params.idText); } } that.definePathBoxSize(params.detail, that); } else { console.log(params.detail); } this.defineTweens(this, params.iaScene); this.myhooks.afterIaObjectConstructor(params.iaScene, params.idText, params.detail, this); } /* * * @param {type} detail * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includeImage = function(detail, i, that, iaScene, baseImage, idText) { that.defineImageBoxSize(detail, that); var rasterObj = new Image(); rasterObj.src = detail.image; that.title[i] = detail.title; that.backgroundImage[i] = rasterObj; that.kineticElement[i] = new Kinetic.Image({ name: detail.title, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, width: detail.width, height: detail.height, scale: {x:iaScene.coeff,y:iaScene.coeff} }); rasterObj.onload = function() { that.backgroundImageOwnScaleX[i] = iaScene.scale * detail.width / this.width; that.backgroundImageOwnScaleY[i] = iaScene.scale * detail.height / this.height; var zoomable = true; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#000000")) { zoomable = false; } if ((typeof(detail.options) !== 'undefined')) { that.options[i] = detail.options; } if ((typeof(detail.stroke) !== 'undefined') && (detail.stroke != 'none')) { that.stroke[i] = detail.stroke; } else { that.stroke[i] = 'rgba(0, 0, 0, 0)'; } if ((typeof(detail.strokewidth) !== 'undefined')) { that.strokeWidth[i] = detail.strokewidth; } else { that.strokeWidth[i] = '0'; } that.persistent[i] = "off-image"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#ffffff")) { that.persistent[i] = "onImage"; that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); zoomable = false; } that.group.add(that.kineticElement[i]); that.addEventsManagement(i,zoomable, that, iaScene, baseImage, idText); // define hit area excluding transparent pixels // ============================================================= var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min(parseFloat(detail.maxX) - parseFloat(detail.minX), Math.floor(parseFloat(iaScene.originalWidth) * 1))); var cropHeight = (Math.min(parseFloat(detail.maxY) - parseFloat(detail.minY), Math.floor(parseFloat(iaScene.originalHeight) * 1))); if (cropX + cropWidth > iaScene.originalWidth * 1) { cropWidth = iaScene.originalWidth * 1 - cropX * 1; } if (cropY * 1 + cropHeight > iaScene.originalHeight * 1) { cropHeight = iaScene.originalHeight * 1 - cropY * 1; } var hitCanvas = that.layer.getHitCanvas(); iaScene.completeImage = hitCanvas.getContext().getImageData(0,0,Math.floor(hitCanvas.width),Math.floor(hitCanvas.height)); var canvas_source = document.createElement('canvas'); canvas_source.setAttribute('width', cropWidth * iaScene.coeff); canvas_source.setAttribute('height', cropHeight * iaScene.coeff); var context_source = canvas_source.getContext('2d'); context_source.drawImage(rasterObj,0,0, cropWidth * iaScene.coeff, cropHeight * iaScene.coeff); imageDataSource = context_source.getImageData(0, 0, cropWidth * iaScene.coeff, cropHeight * iaScene.coeff); len = imageDataSource.data.length; that.group.zoomActive = 0; (function(len, imageDataSource){ that.kineticElement[i].hitFunc(function(context) { if (iaScene.zoomActive == 0) { /* rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); //detach from the DOM var imageData = imageDataSource.data; // just replace scene colors by hit colors - alpha remains unchanged for(j = 0; j < len; j += 4) { imageData[j + 0] = rgbColorKey.r; imageData[j + 1] = rgbColorKey.g; imageData[j + 2] = rgbColorKey.b; // imageData[j + 3] = imageDataSource.data[j + 3]; } // reatach to the DOM imageDataSource.data = imageData; context.putImageData(imageDataSource, cropX * iaScene.coeff, cropY * iaScene.coeff); */ var imageData = imageDataSource.data; var imageDest = iaScene.completeImage.data; var position1 = 0; var position2 = 0; var maxWidth = Math.floor(cropWidth * iaScene.coeff); var maxHeight = Math.floor(cropHeight * iaScene.coeff); var startY = Math.floor(cropY * iaScene.coeff); var startX = Math.floor(cropX * iaScene.coeff); var hitCanvasWidth = Math.floor(that.layer.getHitCanvas().width); var rgbColorKey = Kinetic.Util._hexToRgb(this.colorKey); for(var varx = 0; varx < maxWidth; varx +=1) { for(var vary = 0; vary < maxHeight; vary +=1) { position1 = 4 * (vary * maxWidth + varx); position2 = 4 * ((vary + startY) * hitCanvasWidth + varx + startX); if (imageData[position1 + 3] > 100) { imageDest[position2 + 0] = rgbColorKey.r; imageDest[position2 + 1] = rgbColorKey.g; imageDest[position2 + 2] = rgbColorKey.b; imageDest[position2 + 3] = 255; } } } context.putImageData(iaScene.completeImage, 0, 0); } else { context.beginPath(); context.rect(0,0,this.width(),this.height()); context.closePath(); context.fillStrokeShape(this); } }); })(len, imageDataSource); /*that.kineticElement[i].sceneFunc(function(context) { var yo = that.layer.getHitCanvas().getContext().getImageData(0,0,iaScene.width, iaScene.height); context.putImageData(yo, 0,0); });*/ // ============================================================= that.group.draw(); }; }; /* * * @param {type} path * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.includePath = function(detail, i, that, iaScene, baseImage, idText) { that.path[i] = detail.path; that.title[i] = detail.title; // if detail is out of background, hack maxX and maxY if (parseFloat(detail.maxX) < 0) detail.maxX = 1; if (parseFloat(detail.maxY) < 0) detail.maxY = 1; that.kineticElement[i] = new Kinetic.Path({ name: detail.title, data: detail.path, x: parseFloat(detail.x) * iaScene.coeff, y: parseFloat(detail.y) * iaScene.coeff + iaScene.y, scale: {x:iaScene.coeff,y:iaScene.coeff}, fill: 'rgba(0, 0, 0, 0)' }); that.definePathBoxSize(detail, that); // crop background image to suit shape box that.cropCanvas = document.createElement('canvas'); that.cropCanvas.setAttribute('width', parseFloat(detail.maxX) - parseFloat(detail.minX)); that.cropCanvas.setAttribute('height', parseFloat(detail.maxY) - parseFloat(detail.minY)); var cropCtx = that.cropCanvas.getContext('2d'); var cropX = Math.max(parseFloat(detail.minX), 0); var cropY = Math.max(parseFloat(detail.minY), 0); var cropWidth = (Math.min((parseFloat(detail.maxX) - cropX) * iaScene.scale, Math.floor(parseFloat(iaScene.originalWidth) * iaScene.scale))); var cropHeight = (Math.min((parseFloat(detail.maxY) - cropY) * iaScene.scale, Math.floor(parseFloat(iaScene.originalHeight) * iaScene.scale))); if (cropX * iaScene.scale + cropWidth > iaScene.originalWidth * iaScene.scale) { cropWidth = iaScene.originalWidth * iaScene.scale - cropX * iaScene.scale; } if (cropY * iaScene.scale + cropHeight > iaScene.originalHeight * iaScene.scale) { cropHeight = iaScene.originalHeight * iaScene.scale - cropY * iaScene.scale; } var posX = 0; var posY = 0; if (parseFloat(detail.minX) < 0) posX = parseFloat(detail.minX) * (-1); if (parseFloat(detail.minY) < 0) posY = parseFloat(detail.minY) * (-1); // bad workaround to avoid null dimensions if (cropWidth <= 0) cropWidth = 1; if (cropHeight <= 0) cropHeight = 1; cropCtx.drawImage( that.imageObj, cropX * iaScene.scale, cropY * iaScene.scale, cropWidth, cropHeight, posX, posY, cropWidth, cropHeight ); var dataUrl = that.cropCanvas.toDataURL(); delete that.cropCanvas; var cropedImage = new Image(); cropedImage.src = dataUrl; cropedImage.onload = function() { that.backgroundImage[i] = cropedImage; that.backgroundImageOwnScaleX[i] = 1; that.backgroundImageOwnScaleY[i] = 1; that.kineticElement[i].fillPatternRepeat('no-repeat'); that.kineticElement[i].fillPatternX(detail.minX); that.kineticElement[i].fillPatternY(detail.minY); }; var zoomable = true; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#000000")) { zoomable = false; } if ((typeof(detail.options) !== 'undefined')) { that.options[i] = detail.options; } if ((typeof(detail.stroke) !== 'undefined') && (detail.stroke != 'none')) { that.stroke[i] = detail.stroke; } else { that.stroke[i] = 'rgba(0, 0, 0, 0)'; } if ((typeof(detail.strokewidth) !== 'undefined')) { that.strokeWidth[i] = detail.strokewidth; } else { that.strokeWidth[i] = '0'; } that.persistent[i] = "off"; if ((typeof(detail.fill) !== 'undefined') && (detail.fill === "#ffffff")) { that.persistent[i] = "onPath"; that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); } that.addEventsManagement(i, zoomable, that, iaScene, baseImage, idText); that.group.add(that.kineticElement[i]); that.group.draw(); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.defineImageBoxSize = function(detail, that) { "use strict"; if (that.minX === -1) that.minX = (parseFloat(detail.x)); if (that.maxY === 10000) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); if (that.maxX === -1) that.maxX = (parseFloat(detail.x) + parseFloat(detail.width)); if (that.minY === 10000) that.minY = (parseFloat(detail.y)); if (parseFloat(detail.x) < that.minX) that.minX = parseFloat(detail.x); if (parseFloat(detail.x) + parseFloat(detail.width) > that.maxX) that.maxX = parseFloat(detail.x) + parseFloat(detail.width); if (parseFloat(detail.y) < that.minY) that.miny = parseFloat(detail.y); if (parseFloat(detail.y) + parseFloat(detail.height) > that.maxY) that.maxY = parseFloat(detail.y) + parseFloat(detail.height); }; /* * * @param {type} index * @returns {undefined} */ IaObject.prototype.definePathBoxSize = function(detail, that) { "use strict"; if ( (typeof(detail.minX) !== 'undefined') && (typeof(detail.minY) !== 'undefined') && (typeof(detail.maxX) !== 'undefined') && (typeof(detail.maxY) !== 'undefined')) { that.minX = detail.minX; that.minY = detail.minY; that.maxX = detail.maxX; that.maxY = detail.maxY; } else { console.log('definePathBoxSize failure'); } }; /* * Define zoom rate and define tween effect for each group * @returns {undefined} */ IaObject.prototype.defineTweens = function(that, iaScene) { that.minX = that.minX * iaScene.coeff; that.minY = that.minY * iaScene.coeff; that.maxX = that.maxX * iaScene.coeff; that.maxY = that.maxY * iaScene.coeff; var largeur = that.maxX - that.minX; var hauteur = that.maxY - that.minY; that.agrandissement1 = (iaScene.height - iaScene.y) / hauteur; // beta that.agrandissement2 = iaScene.width / largeur; // alpha if (hauteur * that.agrandissement2 > iaScene.height) { that.agrandissement = that.agrandissement1; that.tweenX = (0 - (that.minX)) * that.agrandissement + (iaScene.width - largeur * that.agrandissement) / 2; that.tweenY = (0 - iaScene.y - (that.minY)) * that.agrandissement + iaScene.y; } else { that.agrandissement = that.agrandissement2; that.tweenX = (0 - (that.minX)) * that.agrandissement; that.tweenY = 1 * ((0 - iaScene.y - (that.minY)) * that.agrandissement + iaScene.y + (iaScene.height - hauteur * that.agrandissement) / 2); } }; /* * Define mouse events on the current KineticElement * @param {type} i KineticElement index * @returns {undefined} */ IaObject.prototype.addEventsManagement = function(i, zoomable, that, iaScene, baseImage, idText) { if (that.options[i].indexOf("disable-click") !== -1) return; /* * if mouse is over element, fill the element with semi-transparency */ that.kineticElement[i].on('mouseover', function() { if (iaScene.cursorState.indexOf("ZoomOut.cur") !== -1) { } else if ((iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { } else if (iaScene.cursorState.indexOf("HandPointer.cur") === -1) { document.body.style.cursor = "url(img/HandPointer.cur),auto"; iaScene.cursorState = "url(img/HandPointer.cur),auto"; for (var i in that.kineticElement) { if (that.persistent[i] == "off") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill(iaScene.overColor); that.kineticElement[i].scale(iaScene.coeff); //that.kineticElement[i].stroke(iaScene.overColorStroke); //that.kineticElement[i].strokeWidth(2); that.kineticElement[i].stroke(that.stroke[i]); that.kineticElement[i].strokeWidth(that.strokeWidth[i]); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); } else if ((that.persistent[i] == "onImage") || (that.persistent[i] == "off-image")) { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); } } that.layer.batchDraw(); //this.draw(); } }); /* * if we click in this element, manage zoom-in, zoom-out */ if (that.options[i].indexOf("direct-link") !== -1) { that.kineticElement[i].on('click touchstart', function(e) { location.href = that.title[i]; }); } else { that.kineticElement[i].on('click touchstart', function(evt) { var i = 0; iaScene.noPropagation = true; // let's zoom if ((iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) && (iaScene.element === that)) { iaScene.zoomActive = 1; document.body.style.cursor = "url(img/ZoomOut.cur),auto"; iaScene.cursorState = "url(img/ZoomOut.cur),auto"; this.moveToTop(); that.group.moveToTop(); that.layer.moveToTop(); that.group.zoomActive = 1; that.originalX[0] = that.group.x(); that.originalY[0] = that.group.y(); that.alpha = 0; that.step = 0.1; var personalTween = function(anim, thislayer) { // linear var tempX = that.originalX[0] + that.alpha.toFixed(2) * (that.tweenX - that.originalX[0]); var tempY = that.originalY[0] + that.alpha.toFixed(2) * (that.tweenY - that.originalY[0]); var tempScale = 1 + that.alpha.toFixed(2) * (that.agrandissement - 1); var t = null; if (that.alpha.toFixed(2) <= 1) { that.alpha = that.alpha + that.step; that.group.setPosition({x:tempX, y:tempY}); that.group.scale({x:tempScale,y:tempScale}); } else { that.zoomLayer.hitGraphEnabled(true); anim.stop(); } }; that.zoomLayer.moveToTop(); that.group.moveTo(that.zoomLayer); that.layer.draw(); var anim = new Kinetic.Animation(function(frame) { personalTween(this, that.layer); }, that.zoomLayer); that.zoomLayer.hitGraphEnabled(false); anim.start(); that.myhooks.afterIaObjectZoom(iaScene, idText, that); } // let's unzoom else if (iaScene.cursorState.indexOf("ZoomOut.cur") != -1) { if ((that.group.zoomActive == 1)) { iaScene.zoomActive = 0; that.group.zoomActive = 0; that.group.scaleX(1); that.group.scaleY(1); that.group.x(that.originalX[0]); that.group.y(that.originalY[0]); $('#' + that.idText + " audio").each(function(){ $(this)[0].pause(); }); $('#' + that.idText + " video").each(function(){ $(this)[0].pause(); }); that.backgroundCache_layer.moveToBottom(); document.body.style.cursor = "default"; iaScene.cursorState = "default"; for (i in that.kineticElement) { if (that.persistent[i] == "off") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } else if (that.persistent[i] == "onImage") { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); that.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].setStrokeWidth(0); } } that.group.moveTo(that.layer); that.zoomLayer.moveToBottom(); that.zoomLayer.draw(); that.layer.draw(); that.backgroundCache_layer.draw(); } } // let's focus else { if (iaScene.zoomActive === 0) { if ((iaScene.element !== 0) && (typeof(iaScene.element) !== 'undefined')) { for (i in iaScene.element.kineticElement) { iaScene.element.kineticElement[i].fillPriority('color'); iaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); iaScene.element.kineticElement[i].setStroke('rgba(0, 0, 0, 0)'); iaScene.element.kineticElement[i].setStrokeWidth(0); } iaScene.element.layer.draw(); $('#' + iaScene.element.idText + " audio").each(function(){ $(this)[0].pause(); }); $('#' + iaScene.element.idText + " video").each(function(){ $(this)[0].pause(); }); } if (zoomable === true) { document.body.style.cursor = 'url("img/ZoomIn.cur"),auto'; iaScene.cursorState = 'url("img/ZoomIn.cur"),auto'; } else { iaScene.cursorState = 'url("img/ZoomFocus.cur"),auto'; } var cacheBackground = true; for (i in that.kineticElement) { if (that.persistent[i] === "onImage") cacheBackground = false; that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); //that.kineticElement[i].stroke(iaScene.overColorStroke); //that.kineticElement[i].strokeWidth(2); that.kineticElement[i].stroke(that.stroke[i]); that.kineticElement[i].strokeWidth(that.strokeWidth[i]); that.kineticElement[i].moveToTop(); } if (cacheBackground === true) that.backgroundCache_layer.moveToTop(); //that.group.moveToTop(); that.layer.moveToTop(); that.layer.draw(); iaScene.element = that; that.myhooks.afterIaObjectFocus(iaScene, idText, that); } } }); } /* * if we leave this element, just clear the scene */ that.kineticElement[i].on('mouseleave', function() { //iaScene.noPropagation = true; if ((iaScene.cursorState.indexOf("ZoomOut.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomIn.cur") !== -1) || (iaScene.cursorState.indexOf("ZoomFocus.cur") !== -1)) { } else { var mouseXY = that.layer.getStage().getPointerPosition(); if (typeof(mouseXY) == "undefined") { mouseXY = {x:0,y:0}; } if ((that.layer.getStage().getIntersection(mouseXY) != this)) { that.backgroundCache_layer.moveToBottom(); for (var i in that.kineticElement) { if ((that.persistent[i] == "off") || (that.persistent[i] == "off-image")) { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(0, 0, 0, 0)'); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } else if (that.persistent[i] == "onPath") { that.kineticElement[i].fillPriority('color'); that.kineticElement[i].fill('rgba(' + iaScene.colorPersistent.red + ',' + iaScene.colorPersistent.green + ',' + iaScene.colorPersistent.blue + ',' + iaScene.colorPersistent.opacity + ')'); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } else if (that.persistent[i] == "onImage") { that.kineticElement[i].fillPriority('pattern'); that.kineticElement[i].fillPatternScaleX(that.backgroundImageOwnScaleX[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternScaleY(that.backgroundImageOwnScaleY[i] * 1/iaScene.scale); that.kineticElement[i].fillPatternImage(that.backgroundImage[i]); that.kineticElement[i].stroke('rgba(0, 0, 0, 0)'); that.kineticElement[i].strokeWidth(0); } } document.body.style.cursor = "default"; iaScene.cursorState = "default"; that.layer.draw(); } } }); }; images-actives-html5.git/src/share/themes/popYellow/js/iascene.js000066400000000000000000000114711250410645000253220ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@crdp.ac-versailles.fr /** * * @param {type} originalWidth * @param {type} originalHeight * @constructor create image active scene */ function IaScene(originalWidth, originalHeight) { "use strict"; var that = this; // canvas width this.width = 1000; // canvas height this.height = 800; // default color used to fill shapes during mouseover var _colorOver = {red:66, green:133, blue:244, opacity:0.6}; // default color used to fill stroke around shapes during mouseover var _colorOverStroke = {red:255, green:0, blue:0, opacity:1}; // default color used to fill shapes if defined as cache this.colorPersistent = {red:124, green:154, blue:174, opacity:1}; // Image ratio on the scene this.ratio = 1.00; // padding-top in the canvas this.y = 0; // color used over background image during focus var _colorCache = {red:0, green:0, blue:0, opacity:0.6}; // internal this.fullScreen = "off"; this.backgroundCacheColor = 'rgba(' + _colorCache.red + ',' + _colorCache.green + ',' + _colorCache.blue + ',' + _colorCache.opacity + ')'; this.overColor = 'rgba(' + _colorOver.red + ',' + _colorOver.green + ',' + _colorOver.blue + ',' + _colorOver.opacity + ')'; this.overColorStroke = 'rgba(' + _colorOverStroke.red + ',' + _colorOverStroke.green + ',' + _colorOverStroke.blue + ',' + _colorOverStroke.opacity + ')'; this.scale = 1; this.zoomActive = 0; this.element = 0; this.originalWidth = originalWidth; this.originalHeight = originalHeight; this.coeff = (this.width * this.ratio) / parseFloat(originalWidth); this.cursorState=""; this.noPropagation = false; } /* * Scale entire scene * */ IaScene.prototype.scaleScene = function(mainScene){ "use strict"; var viewportWidth = $(window).width(); var viewportHeight = $(window).height(); var coeff_width = (viewportWidth * mainScene.ratio) / parseFloat(mainScene.originalWidth); var coeff_height = (viewportHeight) / (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top + $('#container').offset().top); var canvas_border_left = parseFloat($("#canvas").css("border-left-width").substr(0,$("#canvas").css("border-left-width").length - 2)); var canvas_border_right = parseFloat($("#canvas").css("border-right-width").substr(0,$("#canvas").css("border-right-width").length - 2)); var canvas_border_top = parseFloat($("#canvas").css("border-top-width").substr(0,$("#canvas").css("border-top-width").length - 2)); var canvas_border_bottom = parseFloat($("#canvas").css("border-bottom-width").substr(0,$("#canvas").css("border-bottom-width").length - 2)); if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_width) && (viewportHeight >= ((parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_width))) { mainScene.width = viewportWidth - canvas_border_left - canvas_border_right; mainScene.coeff = (mainScene.width * mainScene.ratio) / parseFloat(mainScene.originalWidth); mainScene.height = parseFloat(mainScene.originalHeight) * mainScene.coeff; } else if ((viewportWidth >= parseFloat(mainScene.originalWidth) * coeff_height) && (viewportHeight >= (parseFloat(mainScene.originalHeight) + $('#canvas').offset().top) * coeff_height)) { mainScene.height = viewportHeight - $('#container').offset().top - $('#canvas').offset().top - canvas_border_top - canvas_border_bottom - 2; mainScene.coeff = (mainScene.height) / parseFloat(mainScene.originalHeight); mainScene.width = parseFloat(mainScene.originalWidth) * mainScene.coeff; } $('#container').css({"width": (mainScene.width + canvas_border_left + canvas_border_right) + 'px'}); $('#container').css({"height": (mainScene.height + $('#canvas').offset().top - $('#container').offset().top + canvas_border_top + canvas_border_bottom) + 'px'}); $('#canvas').css({"height": (mainScene.height) + 'px'}); $('#canvas').css({"width": mainScene.width + 'px'}); $('#detect').css({"height": (mainScene.height) + 'px'}); $('#detect').css({"top": ($('#canvas').offset().top) + 'px'}); }; images-actives-html5.git/src/share/themes/popYellow/js/iframe.js000066400000000000000000000022671250410645000251610ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // Script used to load youtube resource after main page // otherwise, Chrome fails to start the page $(".videoWrapper16_9").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); }); $(".videoWrapper4_3").each(function(){ var source = $(this).data("iframe"); var iframe = document.createElement("iframe"); iframe.src = source; $(this).append(iframe); }); images-actives-html5.git/src/share/themes/popYellow/js/main.js000066400000000000000000000146151250410645000246420ustar00rootroot00000000000000// 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 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see // // // @author : pascal.fautrero@ac-versailles.fr // @version=xxx /* * Main * Initialization * * 1rst layer : div "detect" - if clicked, enable canvas events * 2nd layer : bootstrap accordion * 3rd layer : div "canvas" containing images and paths * 4th layer : div "disablearea" - if clicked, disable events canvas */ function main(myhooks) { "use strict"; var that=window; that.canvas = document.getElementById("canvas"); // area located under the canvas. If mouse over is detected, // we must re-activate mouse events on canvas var detect = document.getElementById("detect"); detect.addEventListener("mouseover", function() { that.canvas.style.pointerEvents="auto"; if ((IaScene.element !== 0) && (typeof(IaScene.element) !== 'undefined')) { for (var i in IaScene.element.kineticElement) { IaScene.element.kineticElement[i].fillPriority('color'); IaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); } } }, false); detect.addEventListener("touchstart", function() { that.canvas.style.pointerEvents="auto"; if ((IaScene.element !== 0) && (typeof(IaScene.element) !== 'undefined')) { for (var i in IaScene.element.kineticElement) { IaScene.element.kineticElement[i].fillPriority('color'); IaScene.element.kineticElement[i].fill('rgba(0,0,0,0)'); } } }, false); // Load background image that.imageObj = new Image(); that.imageObj.src = scene.image; that.imageObj.onload = function() { var mainScene = new IaScene(scene.width,scene.height); mainScene.scale = 1; mainScene.scaleScene(mainScene); var stage = new Kinetic.Stage({ container: 'canvas', width: mainScene.width, height: mainScene.height }); // area containing image background var baseImage = new Kinetic.Image({ x: 0, y: mainScene.y, width: scene.width, height: scene.height, scale: {x:mainScene.coeff,y:mainScene.coeff}, image: that.imageObj }); // cache used over background image var baseCache = new Kinetic.Rect({ x: 0, y: mainScene.y, width: scene.width, height: scene.height, scale: {x:mainScene.coeff,y:mainScene.coeff}, fill: mainScene.backgroundCacheColor }); // define area to disable canvas events management when // mouse is over. Thus, we can reach div located under canvas var disableArea = new Kinetic.Rect({ x: mainScene.width * mainScene.ratio, y: mainScene.y, width: mainScene.width * (1 - mainScene.ratio), height: mainScene.height }); disableArea.on('mouseover touchstart', function() { canvas.style.pointerEvents="none"; }); var layers = []; that.layers = layers; layers[0] = new Kinetic.FastLayer(); layers[1] = new Kinetic.FastLayer(); layers[2] = new Kinetic.Layer(); layers[3] = new Kinetic.Layer(); layers[0].add(baseCache); layers[1].add(baseImage); layers[2].add(disableArea); stage.add(layers[0]); stage.add(layers[1]); stage.add(layers[2]); stage.add(layers[3]); myhooks.beforeMainConstructor(mainScene, that.layers); var indice = 4; layers[indice] = new Kinetic.Layer(); stage.add(layers[indice]); for (var i in details) { //var indice = parseInt(i+3); //layers[indice] = new Kinetic.Layer(); //stage.add(layers[indice]); var iaObj = new IaObject({ imageObj: that.imageObj, detail: details[i], layer: layers[indice], idText: "article-" + i, baseImage: baseImage, iaScene: mainScene, background_layer: layers[1], backgroundCache_layer: layers[0], zoomLayer: layers[3], myhooks: myhooks }); } myhooks.afterMainConstructor(mainScene, that.layers); $("#splash").fadeOut("slow", function(){ $("#loader").hide(); }); // FullScreen ability // source code from http://blogs.sitepointstatic.com/examples/tech/full-screen/index.html var e = document.getElementById("title"); var div_container = document.getElementById("image-active"); e.onclick = function() { if (runPrefixMethod(document, "FullScreen") || runPrefixMethod(document, "IsFullScreen")) { runPrefixMethod(document, "CancelFullScreen"); } else { runPrefixMethod(div_container, "RequestFullScreen"); } mainScene.fullScreen = mainScene.fullScreen == "on" ? "off": "on"; }; var pfx = ["webkit", "moz", "ms", "o", ""]; function runPrefixMethod(obj, method) { var p = 0, m, t; while (p < pfx.length && !obj[m]) { m = method; if (pfx[p] === "") { m = m.substr(0,1).toLowerCase() + m.substr(1); } m = pfx[p] + m; t = typeof obj[m]; if (t != "undefined") { pfx = [pfx[p]]; return (t == "function" ? obj[m]() : obj[m]); } p++; } } }; } myhooks = new hooks(); launch = new main(myhooks); images-actives-html5.git/src/share/themes/popYellow/js/xorcipher.js000066400000000000000000000115071250410645000257160ustar00rootroot00000000000000// XORCipher - Super simple encryption using XOR and Base64 // MODIFIED VERSION TO AVOID underscore dependancy // License : MIT // // As a warning, this is **not** a secure encryption algorythm. It uses a very // simplistic keystore and will be easy to crack. // // The Base64 algorythm is a modification of the one used in phpjs.org // * http://phpjs.org/functions/base64_encode/ // * http://phpjs.org/functions/base64_decode/ // // Examples // -------- // // XORCipher.encode("test", "foobar"); // => "EgocFhUX" // XORCipher.decode("test", "EgocFhUX"); // => "foobar" // /* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, strict:true, undef:true, unused:true, curly:true, browser:true, indent:2, maxerr:50 */ /* global _ */ (function(exports) { "use strict"; var XORCipher = { encode: function(key, data) { data = xor_encrypt(key, data); return b64_encode(data); }, decode: function(key, data) { data = b64_decode(data); return xor_decrypt(key, data); } }; var b64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; function b64_encode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, r, i = 0, enc = ""; if (!data) { return data; } do { o1 = data[i++]; o2 = data[i++]; o3 = data[i++]; bits = o1 << 16 | o2 << 8 | o3; h1 = bits >> 18 & 0x3f; h2 = bits >> 12 & 0x3f; h3 = bits >> 6 & 0x3f; h4 = bits & 0x3f; enc += b64_table.charAt(h1) + b64_table.charAt(h2) + b64_table.charAt(h3) + b64_table.charAt(h4); } while (i < data.length); r = data.length % 3; return (r ? enc.slice(0, r - 3) : enc) + "===".slice(r || 3); } function b64_decode(data) { var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, result = []; if (!data) { return data; } data += ""; do { h1 = b64_table.indexOf(data.charAt(i++)); h2 = b64_table.indexOf(data.charAt(i++)); h3 = b64_table.indexOf(data.charAt(i++)); h4 = b64_table.indexOf(data.charAt(i++)); bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; o1 = bits >> 16 & 0xff; o2 = bits >> 8 & 0xff; o3 = bits & 0xff; result.push(o1); if (h3 !== 64) { result.push(o2); if (h4 !== 64) { result.push(o3); } } } while (i < data.length); return result; } function keyCharAt(key, i) { //return key.charCodeAt( Math.floor(i % key.length) ); return key.charCodeAt( i % key.length ); } function xor_encrypt(key, data) { /*return _.map(data, function(c, i) { return c.charCodeAt(0) ^ keyCharAt(key, i); });*/ var result = []; for (var indice in data) { result[indice] = data[indice].charCodeAt(0) ^ keyCharAt(key, indice); } return result; } function xor_decrypt(key, data) { /*return _.map(data, function(c, i) { return String.fromCharCode( c ^ keyCharAt(key, i) ); }).join("");*/ var result = []; for (var indice in data) { result[indice] = String.fromCharCode( data[indice] ^ keyCharAt(key, indice) ); } return result.join(""); } exports.XORCipher = XORCipher; })(this); String.prototype.decode = function(encoding) { var result = ""; var index = 0; var c = c1 = c2 = 0; while(index < this.length) { c = this.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); index++; } else if((c > 191) && (c < 224)) { c2 = this.charCodeAt(index + 1); result += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); index += 2; } else { c2 = this.charCodeAt(index + 1); c3 = this.charCodeAt(index + 2); result += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); index += 3; } } return result; }; String.prototype.encode = function(encoding) { var result = ""; var s = this.replace(/\r\n/g, "\n"); for(var index = 0; index < s.length; index++) { var c = s.charCodeAt(index); if(c < 128) { result += String.fromCharCode(c); } else if((c > 127) && (c < 2048)) { result += String.fromCharCode((c >> 6) | 192); result += String.fromCharCode((c & 63) | 128); } else { result += String.fromCharCode((c >> 12) | 224); result += String.fromCharCode(((c >> 6) & 63) | 128); result += String.fromCharCode((c & 63) | 128); } } return result; };images-actives-html5.git/src/share/themes/popYellow/manifest.webapp000066400000000000000000000007001250410645000257400ustar00rootroot00000000000000{ "name": "XIA", "size" : define_package.zip_size_here, "version" : "1.0", "release_notes" : "generated with XIA", "launch_path": "/index.html", "package_path" : "http://my-webserver.com/package.zip", "developer": { "name": "Académie de Versailles" }, "icons": { "16": "/img/xia16.png", "48": "/img/xia48.png", "64": "/img/xia64.png", "128": "/img/xia128.png" } }images-actives-html5.git/src/share/vendors/000077500000000000000000000000001250410645000211365ustar00rootroot00000000000000images-actives-html5.git/src/share/vendors/LAB.js000066400000000000000000000457061250410645000221060ustar00rootroot00000000000000/*! LAB.js (LABjs :: Loading And Blocking JavaScript) v2.0.3 (c) Kyle Simpson MIT License */ (function(global){ var _$LAB = global.$LAB, // constants for the valid keys of the options object _UseLocalXHR = "UseLocalXHR", _AlwaysPreserveOrder = "AlwaysPreserveOrder", _AllowDuplicates = "AllowDuplicates", _CacheBust = "CacheBust", /*!START_DEBUG*/_Debug = "Debug",/*!END_DEBUG*/ _BasePath = "BasePath", // stateless variables used across all $LAB instances root_page = /^[^?#]*\//.exec(location.href)[0], root_domain = /^\w+\:\/\/\/?[^\/]+/.exec(root_page)[0], append_to = document.head || document.getElementsByTagName("head"), // inferences... ick, but still necessary opera_or_gecko = (global.opera && Object.prototype.toString.call(global.opera) == "[object Opera]") || ("MozAppearance" in document.documentElement.style), /*!START_DEBUG*/ // console.log() and console.error() wrappers log_msg = function(){}, log_error = log_msg, /*!END_DEBUG*/ // feature sniffs (yay!) test_script_elem = document.createElement("script"), explicit_preloading = typeof test_script_elem.preload == "boolean", // http://wiki.whatwg.org/wiki/Script_Execution_Control#Proposal_1_.28Nicholas_Zakas.29 real_preloading = explicit_preloading || (test_script_elem.readyState && test_script_elem.readyState == "uninitialized"), // will a script preload with `src` set before DOM append? script_ordered_async = !real_preloading && test_script_elem.async === true, // http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order // XHR preloading (same-domain) and cache-preloading (remote-domain) are the fallbacks (for some browsers) xhr_or_cache_preloading = !real_preloading && !script_ordered_async && !opera_or_gecko ; /*!START_DEBUG*/ // define console wrapper functions if applicable if (global.console && global.console.log) { if (!global.console.error) global.console.error = global.console.log; log_msg = function(msg) { global.console.log(msg); }; log_error = function(msg,err) { global.console.error(msg,err); }; } /*!END_DEBUG*/ // test for function function is_func(func) { return Object.prototype.toString.call(func) == "[object Function]"; } // test for array function is_array(arr) { return Object.prototype.toString.call(arr) == "[object Array]"; } // make script URL absolute/canonical function canonical_uri(src,base_path) { var absolute_regex = /^\w+\:\/\//; // is `src` is protocol-relative (begins with // or ///), prepend protocol if (/^\/\/\/?/.test(src)) { src = location.protocol + src; } // is `src` page-relative? (not an absolute URL, and not a domain-relative path, beginning with /) else if (!absolute_regex.test(src) && src.charAt(0) != "/") { // prepend `base_path`, if any src = (base_path || "") + src; } // make sure to return `src` as absolute return absolute_regex.test(src) ? src : ((src.charAt(0) == "/" ? root_domain : root_page) + src); } // merge `source` into `target` function merge_objs(source,target) { for (var k in source) { if (source.hasOwnProperty(k)) { target[k] = source[k]; // TODO: does this need to be recursive for our purposes? }} return target; } // does the chain group have any ready-to-execute scripts? function check_chain_group_scripts_ready(chain_group) { var any_scripts_ready = false; for (var i=0; i 0) { for (var i=0; i=0;) { val = queue.shift(); $L = $L[val.type].apply(null,val.args); } return $L; }, // rollback `[global].$LAB` to what it was before this file was loaded, the return this current instance of $LAB noConflict:function(){ global.$LAB = _$LAB; return instanceAPI; }, // create another clean instance of $LAB sandbox:function(){ return create_sandbox(); } }; return instanceAPI; } // create the main instance of $LAB global.$LAB = create_sandbox(); /* The following "hack" was suggested by Andrea Giammarchi and adapted from: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html NOTE: this hack only operates in FF and then only in versions where document.readyState is not present (FF < 3.6?). The hack essentially "patches" the **page** that LABjs is loaded onto so that it has a proper conforming document.readyState, so that if a script which does proper and safe dom-ready detection is loaded onto a page, after dom-ready has passed, it will still be able to detect this state, by inspecting the now hacked document.readyState property. The loaded script in question can then immediately trigger any queued code executions that were waiting for the DOM to be ready. For instance, jQuery 1.4+ has been patched to take advantage of document.readyState, which is enabled by this hack. But 1.3.2 and before are **not** safe or fixed by this hack, and should therefore **not** be lazy-loaded by script loader tools such as LABjs. */ (function(addEvent,domLoaded,handler){ if (document.readyState == null && document[addEvent]){ document.readyState = "loading"; document[addEvent](domLoaded,handler = function(){ document.removeEventListener(domLoaded,handler,false); document.readyState = "complete"; },false); } })("addEventListener","DOMContentLoaded"); })(this);images-actives-html5.git/src/share/vendors/README.md000066400000000000000000000000221250410645000224070ustar00rootroot00000000000000external js files images-actives-html5.git/src/share/vendors/git-sha1.js000066400000000000000000000105771250410645000231230ustar00rootroot00000000000000/* The MIT License (MIT) Copyright (c) 2013 Tim Caswell 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. */ "use strict"; var shared = new Uint32Array(80); // A pure JS implementation of sha1 for non-node environments. function createJs(sync) { var h0 = 0x67452301; var h1 = 0xEFCDAB89; var h2 = 0x98BADCFE; var h3 = 0x10325476; var h4 = 0xC3D2E1F0; // The first 64 bytes (16 words) is the data chunk var block, offset = 0, shift = 24; var totalLength = 0; if (sync) block = shared; else block = new Uint32Array(80); return { update: update, digest: digest }; // The user gave us more data. Store it! function update(chunk) { if (typeof chunk === "string") return updateString(chunk); var length = chunk.length; totalLength += length * 8; for (var i = 0; i < length; i++) { write(chunk[i]); } } function updateString(string) { var length = string.length; totalLength += length * 8; for (var i = 0; i < length; i++) { write(string.charCodeAt(i)); } } function write(byte) { block[offset] |= (byte & 0xff) << shift; if (shift) { shift -= 8; } else { offset++; shift = 24; } if (offset === 16) processBlock(); } // No more data will come, pad the block, process and return the result. function digest() { // Pad write(0x80); if (offset > 14 || (offset === 14 && shift < 24)) { processBlock(); } offset = 14; shift = 24; // 64-bit length big-endian write(0x00); // numbers this big aren't accurate in javascript anyway write(0x00); // ..So just hard-code to zero. write(totalLength > 0xffffffffff ? totalLength / 0x10000000000 : 0x00); write(totalLength > 0xffffffff ? totalLength / 0x100000000 : 0x00); for (var s = 24; s >= 0; s -= 8) { write(totalLength >> s); } // At this point one last processBlock() should trigger and we can pull out the result. return toHex(h0) + toHex(h1) + toHex(h2) + toHex(h3) + toHex(h4); } // We have a full block to process. Let's do it! function processBlock() { // Extend the sixteen 32-bit words into eighty 32-bit words: for (var i = 16; i < 80; i++) { var w = block[i - 3] ^ block[i - 8] ^ block[i - 14] ^ block[i - 16]; block[i] = (w << 1) | (w >>> 31); } // log(block); // Initialize hash value for this chunk: var a = h0; var b = h1; var c = h2; var d = h3; var e = h4; var f, k; // Main loop: for (i = 0; i < 80; i++) { if (i < 20) { f = d ^ (b & (c ^ d)); k = 0x5A827999; } else if (i < 40) { f = b ^ c ^ d; k = 0x6ED9EBA1; } else if (i < 60) { f = (b & c) | (d & (b | c)); k = 0x8F1BBCDC; } else { f = b ^ c ^ d; k = 0xCA62C1D6; } var temp = (a << 5 | a >>> 27) + f + e + k + (block[i]|0); e = d; d = c; c = (b << 30 | b >>> 2); b = a; a = temp; } // Add this chunk's hash to result so far: h0 = (h0 + a) | 0; h1 = (h1 + b) | 0; h2 = (h2 + c) | 0; h3 = (h3 + d) | 0; h4 = (h4 + e) | 0; // The block is now reusable. offset = 0; for (i = 0; i < 16; i++) { block[i] = 0; } } function toHex(word) { var hex = ""; for (var i = 28; i >= 0; i -= 4) { hex += ((word >> i) & 0xf).toString(16); } return hex; } } images-actives-html5.git/src/share/vendors/jquery.js000066400000000000000000010502161250410645000230200ustar00rootroot00000000000000/*! * jQuery JavaScript Library v1.11.1 * http://jquery.com/ * * Includes Sizzle.js * http://sizzlejs.com/ * * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2014-05-01T17:42Z */ (function( global, factory ) { if ( typeof module === "object" && typeof module.exports === "object" ) { // For CommonJS and CommonJS-like environments where a proper window is present, // execute the factory and get jQuery // For environments that do not inherently posses a window with a document // (such as Node.js), expose a jQuery-making factory as module.exports // This accentuates the need for the creation of a real window // e.g. var jQuery = require("jquery")(window); // See ticket #14549 for more info module.exports = global.document ? factory( global, true ) : function( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }; } else { factory( global ); } // Pass this if window is not defined yet }(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { // Can't do this because several apps including ASP.NET trace // the stack via arguments.caller.callee and Firefox dies if // you try to trace through "use strict" call chains. (#13335) // Support: Firefox 18+ // var deletedIds = []; var slice = deletedIds.slice; var concat = deletedIds.concat; var push = deletedIds.push; var indexOf = deletedIds.indexOf; var class2type = {}; var toString = class2type.toString; var hasOwn = class2type.hasOwnProperty; var support = {}; var version = "1.11.1", // Define a local copy of jQuery jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); }, // Support: Android<4.1, IE<9 // Make sure we trim BOM and NBSP rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, // Matches dashed string for camelizing rmsPrefix = /^-ms-/, rdashAlpha = /-([\da-z])/gi, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return letter.toUpperCase(); }; jQuery.fn = jQuery.prototype = { // The current version of jQuery being used jquery: version, constructor: jQuery, // Start with an empty selector selector: "", // The default length of a jQuery object is 0 length: 0, toArray: function() { return slice.call( this ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num != null ? // Return just the one element from the set ( num < 0 ? this[ num + this.length ] : this[ num ] ) : // Return all the elements in a clean array slice.call( this ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems ) { // Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, slice: function() { return this.pushStack( slice.apply( this, arguments ) ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); }, end: function() { return this.prevObject || this.constructor(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: deletedIds.sort, splice: deletedIds.splice }; jQuery.extend = jQuery.fn.extend = function() { var src, copyIsArray, copy, name, options, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // skip the boolean and the target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend({ // Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), // Assume jQuery is ready without the ready module isReady: true, error: function( msg ) { throw new Error( msg ); }, noop: function() {}, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, isArray: Array.isArray || function( obj ) { return jQuery.type(obj) === "array"; }, isWindow: function( obj ) { /* jshint eqeqeq: false */ return obj != null && obj == obj.window; }, isNumeric: function( obj ) { // parseFloat NaNs numeric-cast false positives (null|true|false|"") // ...but misinterprets leading-number strings, particularly hex literals ("0x...") // subtraction forces infinities to NaN return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0; }, isEmptyObject: function( obj ) { var name; for ( name in obj ) { return false; } return true; }, isPlainObject: function( obj ) { var key; // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Support: IE<9 // Handle iteration over inherited properties before own properties. if ( support.ownLast ) { for ( key in obj ) { return hasOwn.call( obj, key ); } } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key ); }, type: function( obj ) { if ( obj == null ) { return obj + ""; } return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call(obj) ] || "object" : typeof obj; }, // Evaluates a script in a global context // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && jQuery.trim( data ) ) { // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } }, // Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }, // args is for internal usage only each: function( obj, callback, args ) { var value, i = 0, length = obj.length, isArray = isArraylike( obj ); if ( args ) { if ( isArray ) { for ( ; i < length; i++ ) { value = callback.apply( obj[ i ], args ); if ( value === false ) { break; } } } else { for ( i in obj ) { value = callback.apply( obj[ i ], args ); if ( value === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isArray ) { for ( ; i < length; i++ ) { value = callback.call( obj[ i ], i, obj[ i ] ); if ( value === false ) { break; } } } else { for ( i in obj ) { value = callback.call( obj[ i ], i, obj[ i ] ); if ( value === false ) { break; } } } } return obj; }, // Support: Android<4.1, IE<9 trim: function( text ) { return text == null ? "" : ( text + "" ).replace( rtrim, "" ); }, // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; if ( arr != null ) { if ( isArraylike( Object(arr) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { push.call( ret, arr ); } } return ret; }, inArray: function( elem, arr, i ) { var len; if ( arr ) { if ( indexOf ) { return indexOf.call( arr, elem, i ); } len = arr.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in arr && arr[ i ] === elem ) { return i; } } } return -1; }, merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; while ( j < len ) { first[ i++ ] = second[ j++ ]; } // Support: IE<9 // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) if ( len !== len ) { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, invert ) { var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert; // Go through the array, only saving the items // that pass the validator function for ( ; i < length; i++ ) { callbackInverse = !callback( elems[ i ], i ); if ( callbackInverse !== callbackExpect ) { matches.push( elems[ i ] ); } } return matches; }, // arg is for internal usage only map: function( elems, callback, arg ) { var value, i = 0, length = elems.length, isArray = isArraylike( elems ), ret = []; // Go through the array, translating each of the items to their new values if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } // Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } } // Flatten any nested arrays return concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { var args, proxy, tmp; if ( typeof context === "string" ) { tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind args = slice.call( arguments, 2 ); proxy = function() { return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || jQuery.guid++; return proxy; }, now: function() { return +( new Date() ); }, // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support }); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); function isArraylike( obj ) { var length = obj.length, type = jQuery.type( obj ); if ( type === "function" || jQuery.isWindow( obj ) ) { return false; } if ( obj.nodeType === 1 && length ) { return true; } return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var Sizzle = /*! * Sizzle CSS Selector Engine v1.10.19 * http://sizzlejs.com/ * * Copyright 2013 jQuery Foundation, Inc. and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2014-04-18 */ (function( window ) { var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, // Local document vars setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains, // Instance-specific data expando = "sizzle" + -(new Date()), preferredDoc = window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; } return 0; }, // General-purpose constants strundefined = typeof undefined, MAX_NEGATIVE = 1 << 31, // Instance methods hasOwn = ({}).hasOwnProperty, arr = [], pop = arr.pop, push_native = arr.push, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf if we can't use a native one indexOf = arr.indexOf || function( elem ) { var i = 0, len = this.length; for ( ; i < len; i++ ) { if ( this[i] === elem ) { return i; } } return -1; }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", // Regular expressions // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", // http://www.w3.org/TR/css3-syntax/#characters characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", // Loosely modeled on CSS identifier characters // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier identifier = characterEncoding.replace( "w", "w#" ), // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + characterEncoding + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) ".*" + ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { "ID": new RegExp( "^#(" + characterEncoding + ")" ), "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, rescape = /'|\\/g, // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), funescape = function( _, escaped, escapedWhitespace ) { var high = "0x" + escaped - 0x10000; // NaN means non-codepoint // Support: Firefox<24 // Workaround erroneous numeric interpretation of +"0x" return high !== high || escapedWhitespace ? escaped : high < 0 ? // BMP codepoint String.fromCharCode( high + 0x10000 ) : // Supplemental Plane codepoint (surrogate pair) String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }; // Optimize for push.apply( _, NodeList ) try { push.apply( (arr = slice.call( preferredDoc.childNodes )), preferredDoc.childNodes ); // Support: Android<4.0 // Detect silently failing push.apply arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { push = { apply: arr.length ? // Leverage slice if possible function( target, els ) { push_native.apply( target, slice.call(els) ); } : // Support: IE<9 // Otherwise append directly function( target, els ) { var j = target.length, i = 0; // Can't trust NodeList.length while ( (target[j++] = els[i++]) ) {} target.length = j - 1; } }; } function Sizzle( selector, context, results, seed ) { var match, elem, m, nodeType, // QSA vars i, groups, old, nid, newContext, newSelector; if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { setDocument( context ); } context = context || document; results = results || []; if ( !selector || typeof selector !== "string" ) { return results; } if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { return []; } if ( documentIsHTML && !seed ) { // Shortcuts if ( (match = rquickExpr.exec( selector )) ) { // Speed-up: Sizzle("#ID") if ( (m = match[1]) ) { if ( nodeType === 9 ) { elem = context.getElementById( m ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document (jQuery #6963) if ( elem && elem.parentNode ) { // Handle the case where IE, Opera, and Webkit return items // by name instead of ID if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; } } else { // Context is not a document if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && contains( context, elem ) && elem.id === m ) { results.push( elem ); return results; } } // Speed-up: Sizzle("TAG") } else if ( match[2] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results; // Speed-up: Sizzle(".CLASS") } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // QSA path if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { nid = old = expando; newContext = context; newSelector = nodeType === 9 && selector; // qSA works strangely on Element-rooted queries // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { groups = tokenize( selector ); if ( (old = context.getAttribute("id")) ) { nid = old.replace( rescape, "\\$&" ); } else { context.setAttribute( "id", nid ); } nid = "[id='" + nid + "'] "; i = groups.length; while ( i-- ) { groups[i] = nid + toSelector( groups[i] ); } newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; newSelector = groups.join(","); } if ( newSelector ) { try { push.apply( results, newContext.querySelectorAll( newSelector ) ); return results; } catch(qsaError) { } finally { if ( !old ) { context.removeAttribute("id"); } } } } } // All others return select( selector.replace( rtrim, "$1" ), context, results, seed ); } /** * Create key-value caches of limited size * @returns {Function(string, Object)} Returns the Object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) * deleting the oldest entry */ function createCache() { var keys = []; function cache( key, value ) { // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries delete cache[ keys.shift() ]; } return (cache[ key + " " ] = value); } return cache; } /** * Mark a function for special use by Sizzle * @param {Function} fn The function to mark */ function markFunction( fn ) { fn[ expando ] = true; return fn; } /** * Support testing using an element * @param {Function} fn Passed the created div and expects a boolean result */ function assert( fn ) { var div = document.createElement("div"); try { return !!fn( div ); } catch (e) { return false; } finally { // Remove from its parent by default if ( div.parentNode ) { div.parentNode.removeChild( div ); } // release memory in IE div = null; } } /** * Adds the same handler for all of the specified attrs * @param {String} attrs Pipe-separated list of attributes * @param {Function} handler The method that will be applied */ function addHandle( attrs, handler ) { var arr = attrs.split("|"), i = attrs.length; while ( i-- ) { Expr.attrHandle[ arr[i] ] = handler; } } /** * Checks document order of two siblings * @param {Element} a * @param {Element} b * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b */ function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE ); // Use IE sourceIndex if available on both nodes if ( diff ) { return diff; } // Check if b follows a if ( cur ) { while ( (cur = cur.nextSibling) ) { if ( cur === b ) { return -1; } } } return a ? 1 : -1; } /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === type; }; } /** * Returns a function to use in pseudos for buttons * @param {String} type */ function createButtonPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && elem.type === type; }; } /** * Returns a function to use in pseudos for positionals * @param {Function} fn */ function createPositionalPseudo( fn ) { return markFunction(function( argument ) { argument = +argument; return markFunction(function( seed, matches ) { var j, matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length; // Match elements found at the specified indexes while ( i-- ) { if ( seed[ (j = matchIndexes[i]) ] ) { seed[j] = !(matches[j] = seed[j]); } } }); }); } /** * Checks a node for validity as a Sizzle context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ function testContext( context ) { return context && typeof context.getElementsByTagName !== strundefined && context; } // Expose support vars for convenience support = Sizzle.support = {}; /** * Detects XML nodes * @param {Element|Object} elem An element or a document * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = elem && (elem.ownerDocument || elem).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; /** * Sets document-related variables once based on the current document * @param {Element|Object} [doc] An element or document object to use to set the document * @returns {Object} Returns the current document */ setDocument = Sizzle.setDocument = function( node ) { var hasCompare, doc = node ? node.ownerDocument || node : preferredDoc, parent = doc.defaultView; // If no document and documentElement is available, return if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } // Set our document document = doc; docElem = doc.documentElement; // Support tests documentIsHTML = !isXML( doc ); // Support: IE>8 // If iframe document is assigned to "document" variable and if iframe has been reloaded, // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 // IE6-8 do not support the defaultView property so parent will be undefined if ( parent && parent !== parent.top ) { // IE11 does not have attachEvent, so all must suffer if ( parent.addEventListener ) { parent.addEventListener( "unload", function() { setDocument(); }, false ); } else if ( parent.attachEvent ) { parent.attachEvent( "onunload", function() { setDocument(); }); } } /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) support.attributes = assert(function( div ) { div.className = "i"; return !div.getAttribute("className"); }); /* getElement(s)By* ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements support.getElementsByTagName = assert(function( div ) { div.appendChild( doc.createComment("") ); return !div.getElementsByTagName("*").length; }); // Check if getElementsByClassName can be trusted support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) { div.innerHTML = "
"; // Support: Safari<4 // Catch class over-caching div.firstChild.className = "i"; // Support: Opera<10 // Catch gEBCN failure to find non-leading classes return div.getElementsByClassName("i").length === 2; }); // Support: IE<10 // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programatically-set names, // so use a roundabout getElementsByName test support.getById = assert(function( div ) { docElem.appendChild( div ).id = expando; return !doc.getElementsByName || !doc.getElementsByName( expando ).length; }); // ID find and filter if ( support.getById ) { Expr.find["ID"] = function( id, context ) { if ( typeof context.getElementById !== strundefined && documentIsHTML ) { var m = context.getElementById( id ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 return m && m.parentNode ? [ m ] : []; } }; Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute("id") === attrId; }; }; } else { // Support: IE6/7 // getElementById is not reliable as a find shortcut delete Expr.find["ID"]; Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); return node && node.value === attrId; }; }; } // Tag Expr.find["TAG"] = support.getElementsByTagName ? function( tag, context ) { if ( typeof context.getElementsByTagName !== strundefined ) { return context.getElementsByTagName( tag ); } } : function( tag, context ) { var elem, tmp = [], i = 0, results = context.getElementsByTagName( tag ); // Filter out possible comments if ( tag === "*" ) { while ( (elem = results[i++]) ) { if ( elem.nodeType === 1 ) { tmp.push( elem ); } } return tmp; } return results; }; // Class Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { return context.getElementsByClassName( className ); } }; /* QSA/matchesSelector ---------------------------------------------------------------------- */ // QSA and matchesSelector support // matchesSelector(:active) reports false when true (IE9/Opera 11.5) rbuggyMatches = []; // qSa(:focus) reports false when true (Chrome 21) // We allow this because of a bug in IE8/9 that throws an error // whenever `document.activeElement` is accessed on an iframe // So, we allow :focus to pass through QSA all the time to avoid the IE error // See http://bugs.jquery.com/ticket/13378 rbuggyQSA = []; if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { // Build QSA regex // Regex strategy adopted from Diego Perini assert(function( div ) { // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // http://bugs.jquery.com/ticket/12359 div.innerHTML = ""; // Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section if ( div.querySelectorAll("[msallowclip^='']").length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly if ( !div.querySelectorAll("[selected]").length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests if ( !div.querySelectorAll(":checked").length ) { rbuggyQSA.push(":checked"); } }); assert(function( div ) { // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment var input = doc.createElement("input"); input.setAttribute( "type", "hidden" ); div.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute if ( div.querySelectorAll("[name=d]").length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests if ( !div.querySelectorAll(":enabled").length ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Opera 10-11 does not throw on post-comma invalid pseudos div.querySelectorAll("*,:x"); rbuggyQSA.push(",.*:"); }); } if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector) )) ) { assert(function( div ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) support.disconnectedMatch = matches.call( div, "div" ); // This should fail with an exception // Gecko does not error, returns false instead matches.call( div, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); }); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); /* Contains ---------------------------------------------------------------------- */ hasCompare = rnative.test( docElem.compareDocumentPosition ); // Element contains another // Purposefully does not implement inclusive descendent // As in, an element does not contain itself contains = hasCompare || rnative.test( docElem.contains ) ? function( a, b ) { var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode; return a === bup || !!( bup && bup.nodeType === 1 && ( adown.contains ? adown.contains( bup ) : a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 )); } : function( a, b ) { if ( b ) { while ( (b = b.parentNode) ) { if ( b === a ) { return true; } } } return false; }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting sortOrder = hasCompare ? function( a, b ) { // Flag for duplicate removal if ( a === b ) { hasDuplicate = true; return 0; } // Sort on method existence if only one input has compareDocumentPosition var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; if ( compare ) { return compare; } // Calculate position if both inputs belong to the same document compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? a.compareDocumentPosition( b ) : // Otherwise we know they are disconnected 1; // Disconnected nodes if ( compare & 1 || (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { // Choose the first element that is related to our preferred document if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { return -1; } if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { return 1; } // Maintain original order return sortInput ? ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; } : function( a, b ) { // Exit early if the nodes are identical if ( a === b ) { hasDuplicate = true; return 0; } var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [ a ], bp = [ b ]; // Parentless nodes are either documents or disconnected if ( !aup || !bup ) { return a === doc ? -1 : b === doc ? 1 : aup ? -1 : bup ? 1 : sortInput ? ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : 0; // If the nodes are siblings, we can do a quick check } else if ( aup === bup ) { return siblingCheck( a, b ); } // Otherwise we need full lists of their ancestors for comparison cur = a; while ( (cur = cur.parentNode) ) { ap.unshift( cur ); } cur = b; while ( (cur = cur.parentNode) ) { bp.unshift( cur ); } // Walk down the tree looking for a discrepancy while ( ap[i] === bp[i] ) { i++; } return i ? // Do a sibling check if the nodes have a common ancestor siblingCheck( ap[i], bp[i] ) : // Otherwise nodes in our document sort first ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0; }; return doc; }; Sizzle.matches = function( expr, elements ) { return Sizzle( expr, null, null, elements ); }; Sizzle.matchesSelector = function( elem, expr ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } // Make sure that attribute selectors are quoted expr = expr.replace( rattributeQuotes, "='$1']" ); if ( support.matchesSelector && documentIsHTML && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9 elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch(e) {} } return Sizzle( expr, document, null, [ elem ] ).length > 0; }; Sizzle.contains = function( context, elem ) { // Set document vars if needed if ( ( context.ownerDocument || context ) !== document ) { setDocument( context ); } return contains( context, elem ); }; Sizzle.attr = function( elem, name ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } var fn = Expr.attrHandle[ name.toLowerCase() ], // Don't get fooled by Object.prototype properties (jQuery #13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute( name ) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Document sorting and removing duplicates * @param {ArrayLike} results */ Sizzle.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence hasDuplicate = !support.detectDuplicates; sortInput = !support.sortStable && results.slice( 0 ); results.sort( sortOrder ); if ( hasDuplicate ) { while ( (elem = results[i++]) ) { if ( elem === results[ i ] ) { j = duplicates.push( i ); } } while ( j-- ) { results.splice( duplicates[ j ], 1 ); } } // Clear input after sorting to release objects // See https://github.com/jquery/sizzle/pull/225 sortInput = null; return results; }; /** * Utility function for retrieving the text value of an array of DOM nodes * @param {Array|Element} elem */ getText = Sizzle.getText = function( elem ) { var node, ret = "", i = 0, nodeType = elem.nodeType; if ( !nodeType ) { // If no nodeType, this is expected to be an array while ( (node = elem[i++]) ) { // Do not traverse comment nodes ret += getText( node ); } } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent for elements // innerText usage removed for consistency of new lines (jQuery #11153) if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { // Traverse its children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } // Do not include comment or processing instruction nodes return ret; }; Expr = Sizzle.selectors = { // Can be adjusted by the user cacheLength: 50, createPseudo: markFunction, match: matchExpr, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: true }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: true }, "~": { dir: "previousSibling" } }, preFilter: { "ATTR": function( match ) { match[1] = match[1].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); if ( match[2] === "~=" ) { match[3] = " " + match[3] + " "; } return match.slice( 0, 4 ); }, "CHILD": function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 4 xn-component of xn+y argument ([+-]?\d*n|) 5 sign of xn-component 6 x of xn-component 7 sign of y-component 8 y of y-component */ match[1] = match[1].toLowerCase(); if ( match[1].slice( 0, 3 ) === "nth" ) { // nth-* requires argument if ( !match[3] ) { Sizzle.error( match[0] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); // other types prohibit arguments } else if ( match[3] ) { Sizzle.error( match[0] ); } return match; }, "PSEUDO": function( match ) { var excess, unquoted = !match[6] && match[2]; if ( matchExpr["CHILD"].test( match[0] ) ) { return null; } // Accept quoted arguments as-is if ( match[3] ) { match[2] = match[4] || match[5] || ""; // Strip excess characters from unquoted arguments } else if ( unquoted && rpseudo.test( unquoted ) && // Get excess from tokenize (recursively) (excess = tokenize( unquoted, true )) && // advance to the next closing parenthesis (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { // excess is a negative index match[0] = match[0].slice( 0, excess ); match[2] = unquoted.slice( 0, excess ); } // Return only captures needed by the pseudo filter method (type and argument) return match.slice( 0, 3 ); } }, filter: { "TAG": function( nodeNameSelector ) { var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; }, "CLASS": function( className ) { var pattern = classCache[ className + " " ]; return pattern || (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && classCache( className, function( elem ) { return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); }); }, "ATTR": function( name, operator, check ) { return function( elem ) { var result = Sizzle.attr( elem, name ); if ( result == null ) { return operator === "!="; } if ( !operator ) { return true; } result += ""; return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "*=" ? check && result.indexOf( check ) > -1 : operator === "$=" ? check && result.slice( -check.length ) === check : operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; }; }, "CHILD": function( type, what, argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; return first === 1 && last === 0 ? // Shortcut for :nth-*(n) function( elem ) { return !!elem.parentNode; } : function( elem, context, xml ) { var cache, outerCache, node, diff, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType; if ( parent ) { // :(first|last|only)-(child|of-type) if ( simple ) { while ( dir ) { node = elem; while ( (node = node[ dir ]) ) { if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { return false; } } // Reverse direction for :only-* (if we haven't yet done so) start = dir = type === "only" && !start && "nextSibling"; } return true; } start = [ forward ? parent.firstChild : parent.lastChild ]; // non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) { // Seek `elem` from a previously-cached index outerCache = parent[ expando ] || (parent[ expando ] = {}); cache = outerCache[ type ] || []; nodeIndex = cache[0] === dirruns && cache[1]; diff = cache[0] === dirruns && cache[2]; node = nodeIndex && parent.childNodes[ nodeIndex ]; while ( (node = ++nodeIndex && node && node[ dir ] || // Fallback to seeking `elem` from the start (diff = nodeIndex = 0) || start.pop()) ) { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { outerCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } // Use previously-cached element index if available } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { diff = cache[1]; // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) } else { // Use the same loop as above to seek `elem` from the start while ( (node = ++nodeIndex && node && node[ dir ] || (diff = nodeIndex = 0) || start.pop()) ) { if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { // Cache the index of each encountered element if ( useCache ) { (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; } if ( node === elem ) { break; } } } } // Incorporate the offset, then check against cycle size diff -= last; return diff === first || ( diff % first === 0 && diff / first >= 0 ); } }; }, "PSEUDO": function( pseudo, argument ) { // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || Sizzle.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as Sizzle does if ( fn[ expando ] ) { return fn( argument ); } // But maintain support for old signatures if ( fn.length > 1 ) { args = [ pseudo, pseudo, "", argument ]; return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? markFunction(function( seed, matches ) { var idx, matched = fn( seed, argument ), i = matched.length; while ( i-- ) { idx = indexOf.call( seed, matched[i] ); seed[ idx ] = !( matches[ idx ] = matched[i] ); } }) : function( elem ) { return fn( elem, 0, args ); }; } return fn; } }, pseudos: { // Potentially complex pseudos "not": markFunction(function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], matcher = compile( selector.replace( rtrim, "$1" ) ); return matcher[ expando ] ? markFunction(function( seed, matches, context, xml ) { var elem, unmatched = matcher( seed, null, xml, [] ), i = seed.length; // Match elements unmatched by `matcher` while ( i-- ) { if ( (elem = unmatched[i]) ) { seed[i] = !(matches[i] = elem); } } }) : function( elem, context, xml ) { input[0] = elem; matcher( input, null, xml, results ); return !results.pop(); }; }), "has": markFunction(function( selector ) { return function( elem ) { return Sizzle( selector, elem ).length > 0; }; }), "contains": markFunction(function( text ) { return function( elem ) { return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; }; }), // "Whether an element is represented by a :lang() selector // is based solely on the element's language value // being equal to the identifier C, // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo "lang": markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test(lang || "") ) { Sizzle.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { var elemLang; do { if ( (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { elemLang = elemLang.toLowerCase(); return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); return false; }; }), // Miscellaneous "target": function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, "root": function( elem ) { return elem === docElem; }, "focus": function( elem ) { return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); }, // Boolean properties "enabled": function( elem ) { return elem.disabled === false; }, "disabled": function( elem ) { return elem.disabled === true; }, "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); }, "selected": function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, // Contents "empty": function( elem ) { // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { if ( elem.nodeType < 6 ) { return false; } } return true; }, "parent": function( elem ) { return !Expr.pseudos["empty"]( elem ); }, // Element/input types "header": function( elem ) { return rheader.test( elem.nodeName ); }, "input": function( elem ) { return rinputs.test( elem.nodeName ); }, "button": function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === "button" || name === "button"; }, "text": function( elem ) { var attr; return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && // Support: IE<8 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); }, // Position-in-collection "first": createPositionalPseudo(function() { return [ 0 ]; }), "last": createPositionalPseudo(function( matchIndexes, length ) { return [ length - 1 ]; }), "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; }), "even": createPositionalPseudo(function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "odd": createPositionalPseudo(function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; }), "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); } return matchIndexes; }) } }; Expr.pseudos["nth"] = Expr.pseudos["eq"]; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { Expr.pseudos[ i ] = createInputPseudo( i ); } for ( i in { submit: true, reset: true } ) { Expr.pseudos[ i ] = createButtonPseudo( i ); } // Easy API for creating new setFilters function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); tokenize = Sizzle.tokenize = function( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; if ( cached ) { return parseOnly ? 0 : cached.slice( 0 ); } soFar = selector; groups = []; preFilters = Expr.preFilter; while ( soFar ) { // Comma and first run if ( !matched || (match = rcomma.exec( soFar )) ) { if ( match ) { // Don't consume trailing commas as valid soFar = soFar.slice( match[0].length ) || soFar; } groups.push( (tokens = []) ); } matched = false; // Combinators if ( (match = rcombinators.exec( soFar )) ) { matched = match.shift(); tokens.push({ value: matched, // Cast descendant combinators to space type: match[0].replace( rtrim, " " ) }); soFar = soFar.slice( matched.length ); } // Filters for ( type in Expr.filter ) { if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || (match = preFilters[ type ]( match ))) ) { matched = match.shift(); tokens.push({ value: matched, type: type, matches: match }); soFar = soFar.slice( matched.length ); } } if ( !matched ) { break; } } // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens return parseOnly ? soFar.length : soFar ? Sizzle.error( selector ) : // Cache the tokens tokenCache( selector, groups ).slice( 0 ); }; function toSelector( tokens ) { var i = 0, len = tokens.length, selector = ""; for ( ; i < len; i++ ) { selector += tokens[i].value; } return selector; } function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, checkNonElements = base && dir === "parentNode", doneName = done++; return combinator.first ? // Check against closest ancestor/preceding element function( elem, context, xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { return matcher( elem, context, xml ); } } } : // Check against all ancestor/preceding elements function( elem, context, xml ) { var oldCache, outerCache, newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching if ( xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { if ( matcher( elem, context, xml ) ) { return true; } } } } else { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || (elem[ expando ] = {}); if ( (oldCache = outerCache[ dir ]) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements return (newCache[ 2 ] = oldCache[ 2 ]); } else { // Reuse newcache so results back-propagate to previous elements outerCache[ dir ] = newCache; // A match means we're done; a fail means we have to keep checking if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { return true; } } } } } }; } function elementMatcher( matchers ) { return matchers.length > 1 ? function( elem, context, xml ) { var i = matchers.length; while ( i-- ) { if ( !matchers[i]( elem, context, xml ) ) { return false; } } return true; } : matchers[0]; } function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { Sizzle( selector, contexts[i], results ); } return results; } function condense( unmatched, map, filter, context, xml ) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null; for ( ; i < len; i++ ) { if ( (elem = unmatched[i]) ) { if ( !filter || filter( elem, context, xml ) ) { newUnmatched.push( elem ); if ( mapped ) { map.push( i ); } } } } return newUnmatched; } function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { if ( postFilter && !postFilter[ expando ] ) { postFilter = setMatcher( postFilter ); } if ( postFinder && !postFinder[ expando ] ) { postFinder = setMatcher( postFinder, postSelector ); } return markFunction(function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : elems, matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, postFinder || ( seed ? preFilter : preexisting || postFilter ) ? // ...intermediate processing is necessary [] : // ...otherwise use results directly results : matcherIn; // Find primary matches if ( matcher ) { matcher( matcherIn, matcherOut, context, xml ); } // Apply postFilter if ( postFilter ) { temp = condense( matcherOut, postMap ); postFilter( temp, [], context, xml ); // Un-match failing elements by moving them back to matcherIn i = temp.length; while ( i-- ) { if ( (elem = temp[i]) ) { matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); } } } if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) ) { // Restore matcherIn since elem is not yet a final match temp.push( (matcherIn[i] = elem) ); } } postFinder( null, (matcherOut = []), temp, xml ); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) && (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { seed[temp] = !(results[temp] = elem); } } } // Add elements to results, through postFinder if defined } else { matcherOut = condense( matcherOut === results ? matcherOut.splice( preexisting, matcherOut.length ) : matcherOut ); if ( postFinder ) { postFinder( null, results, matcherOut, xml ); } else { push.apply( results, matcherOut ); } } }); } function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[ tokens[0].type ], implicitRelative = leadingRelative || Expr.relative[" "], i = leadingRelative ? 1 : 0, // The foundational matcher ensures that elements are reachable from top-level context(s) matchContext = addCombinator( function( elem ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { return indexOf.call( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( (checkContext = context).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); } ]; for ( ; i < len; i++ ) { if ( (matcher = Expr.relative[ tokens[i].type ]) ) { matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; } else { matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); // Return special upon seeing a positional matcher if ( matcher[ expando ] ) { // Find the next relative operator (if any) for proper handling j = ++i; for ( ; j < len; j++ ) { if ( Expr.relative[ tokens[j].type ] ) { break; } } return setMatcher( i > 1 && elementMatcher( matchers ), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) ).replace( rtrim, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), j < len && toSelector( tokens ) ); } matchers.push( matcher ); } } return elementMatcher( matchers ); } function matcherFromGroupMatchers( elementMatchers, setMatchers ) { var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function( seed, context, xml, results, outermost ) { var elem, j, matcher, matchedCount = 0, i = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, // We must always have either seed elements or outermost context elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), len = elems.length; if ( outermost ) { outermostContext = context !== document && context; } // Add elements passing elementMatchers directly to results // Keep `i` a string if there are no elements so `matchedCount` will be "00" below // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id for ( ; i !== len && (elem = elems[i]) != null; i++ ) { if ( byElement && elem ) { j = 0; while ( (matcher = elementMatchers[j++]) ) { if ( matcher( elem, context, xml ) ) { results.push( elem ); break; } } if ( outermost ) { dirruns = dirrunsUnique; } } // Track unmatched elements for set filters if ( bySet ) { // They will have gone through all possible matchers if ( (elem = !matcher && elem) ) { matchedCount--; } // Lengthen the array for every element, matched or not if ( seed ) { unmatched.push( elem ); } } } // Apply set filters to unmatched elements matchedCount += i; if ( bySet && i !== matchedCount ) { j = 0; while ( (matcher = setMatchers[j++]) ) { matcher( unmatched, setMatched, context, xml ); } if ( seed ) { // Reintegrate element matches to eliminate the need for sorting if ( matchedCount > 0 ) { while ( i-- ) { if ( !(unmatched[i] || setMatched[i]) ) { setMatched[i] = pop.call( results ); } } } // Discard index placeholder values to get only actual matches setMatched = condense( setMatched ); } // Add matches to results push.apply( results, setMatched ); // Seedless set matches succeeding multiple successful matchers stipulate sorting if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { Sizzle.uniqueSort( results ); } } // Override manipulation of globals by nested matchers if ( outermost ) { dirruns = dirrunsUnique; outermostContext = contextBackup; } return unmatched; }; return bySet ? markFunction( superMatcher ) : superMatcher; } compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], cached = compilerCache[ selector + " " ]; if ( !cached ) { // Generate a function of recursive functions that can be used to check each element if ( !match ) { match = tokenize( selector ); } i = match.length; while ( i-- ) { cached = matcherFromTokens( match[i] ); if ( cached[ expando ] ) { setMatchers.push( cached ); } else { elementMatchers.push( cached ); } } // Cache the compiled function cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; } return cached; }; /** * A low-level selection function that works with Sizzle's compiled * selector functions * @param {String|Function} selector A selector or a pre-compiled * selector function built with Sizzle.compile * @param {Element} context * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ select = Sizzle.select = function( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( (selector = compiled.selector || selector) ); results = results || []; // Try to minimize operations if there is no seed and only one group if ( match.length === 1 ) { // Take a shortcut and set the context if the root selector is an ID tokens = match[0] = match[0].slice( 0 ); if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && support.getById && context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; if ( !context ) { return results; // Precompiled matchers will still verify ancestry, so step up a level } else if ( compiled ) { context = context.parentNode; } selector = selector.slice( tokens.shift().value.length ); } // Fetch a seed set for right-to-left matching i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[i]; // Abort if we hit a combinator if ( Expr.relative[ (type = token.type) ] ) { break; } if ( (find = Expr.find[ type ]) ) { // Search, expanding context for leading sibling combinators if ( (seed = find( token.matches[0].replace( runescape, funescape ), rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context )) ) { // If seed is empty or no tokens remain, we can return early tokens.splice( i, 1 ); selector = seed.length && toSelector( tokens ); if ( !selector ) { push.apply( results, seed ); return results; } break; } } } } // Compile and execute a filtering function if one is not provided // Provide `match` to avoid retokenization if we modified the selector above ( compiled || compile( selector, match ) )( seed, context, !documentIsHTML, results, rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; }; // One-time assignments // Sort stability support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; // Support: Chrome<14 // Always assume duplicates if they aren't passed to the comparison function support.detectDuplicates = !!hasDuplicate; // Initialize against the default document setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* support.sortDetached = assert(function( div1 ) { // Should return 1, but returns 4 (following) return div1.compareDocumentPosition( document.createElement("div") ) & 1; }); // Support: IE<8 // Prevent attribute/property "interpolation" // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx if ( !assert(function( div ) { div.innerHTML = ""; return div.firstChild.getAttribute("href") === "#" ; }) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } }); } // Support: IE<9 // Use defaultValue in place of getAttribute("value") if ( !support.attributes || !assert(function( div ) { div.innerHTML = ""; div.firstChild.setAttribute( "value", "" ); return div.firstChild.getAttribute( "value" ) === ""; }) ) { addHandle( "value", function( elem, name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } }); } // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies if ( !assert(function( div ) { return div.getAttribute("disabled") == null; }) ) { addHandle( booleans, function( elem, name, isXML ) { var val; if ( !isXML ) { return elem[ name ] === true ? name.toLowerCase() : (val = elem.getAttributeNode( name )) && val.specified ? val.value : null; } }); } return Sizzle; })( window ); jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.pseudos; jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; var rneedsContext = jQuery.expr.match.needsContext; var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); var risSimple = /^.[^:#\[\.,]*$/; // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { /* jshint -W018 */ return !!qualifier.call( elem, i, elem ) !== not; }); } if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; }); } if ( typeof qualifier === "string" ) { if ( risSimple.test( qualifier ) ) { return jQuery.filter( qualifier, elements, not ); } qualifier = jQuery.filter( qualifier, elements ); } return jQuery.grep( elements, function( elem ) { return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; }); } jQuery.filter = function( expr, elems, not ) { var elem = elems[ 0 ]; if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 && elem.nodeType === 1 ? jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; })); }; jQuery.fn.extend({ find: function( selector ) { var i, ret = [], self = this, len = self.length; if ( typeof selector !== "string" ) { return this.pushStack( jQuery( selector ).filter(function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } }) ); } for ( i = 0; i < len; i++ ) { jQuery.find( selector, self[ i ], ret ); } // Needed because $( selector, context ) becomes $( context ).find( selector ) ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); ret.selector = this.selector ? this.selector + " " + selector : selector; return ret; }, filter: function( selector ) { return this.pushStack( winnow(this, selector || [], false) ); }, not: function( selector ) { return this.pushStack( winnow(this, selector || [], true) ); }, is: function( selector ) { return !!winnow( this, // If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". typeof selector === "string" && rneedsContext.test( selector ) ? jQuery( selector ) : selector || [], false ).length; } }); // Initialize a jQuery object // A central reference to the root jQuery(document) var rootjQuery, // Use the correct document accordingly with window argument (sandbox) document = window.document, // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, init = jQuery.fn.init = function( selector, context ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } // Handle HTML strings if ( typeof selector === "string" ) { if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = rquickExpr.exec( selector ); } // Match html or make sure no context is specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; // scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( match[1], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { // Properties of context are called as methods if possible if ( jQuery.isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes } else { this.attr( match, context[ match ] ); } } } return this; // HANDLE: $(#id) } else { elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return typeof rootjQuery.ready !== "undefined" ? rootjQuery.ready( selector ) : // Execute immediately if ready is not present selector( jQuery ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }; // Give the init function the jQuery prototype for later instantiation init.prototype = jQuery.fn; // Initialize central reference rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, // methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.extend({ dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { if ( cur.nodeType === 1 ) { matched.push( cur ); } cur = cur[dir]; } return matched; }, sibling: function( n, elem ) { var r = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { r.push( n ); } } return r; } }); jQuery.fn.extend({ has: function( target ) { var i, targets = jQuery( target, this ), len = targets.length; return this.filter(function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, closest: function( selectors, context ) { var cur, i = 0, l = this.length, matched = [], pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? jQuery( selectors, context || this.context ) : 0; for ( ; i < l; i++ ) { for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { // Always skip document fragments if ( cur.nodeType < 11 && (pos ? pos.index(cur) > -1 : // Don't pass non-elements to Sizzle cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors)) ) { matched.push( cur ); break; } } } return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; } // index in selector if ( typeof elem === "string" ) { return jQuery.inArray( this[0], jQuery( elem ) ); } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used elem.jquery ? elem[0] : elem, this ); }, add: function( selector, context ) { return this.pushStack( jQuery.unique( jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); }, addBack: function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter(selector) ); } }); function sibling( cur, dir ) { do { cur = cur[ dir ]; } while ( cur && cur.nodeType !== 1 ); return cur; } jQuery.each({ parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return jQuery.dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return jQuery.dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); }, prev: function( elem ) { return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { return jQuery.dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return jQuery.dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return jQuery.dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); if ( name.slice( -5 ) !== "Until" ) { selector = until; } if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); } if ( this.length > 1 ) { // Remove duplicates if ( !guaranteedUnique[ name ] ) { ret = jQuery.unique( ret ); } // Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { ret = ret.reverse(); } } return this.pushStack( ret ); }; }); var rnotwhite = (/\S+/g); // String to Object options format cache var optionsCache = {}; // Convert String-formatted options into Object-formatted ones and store in cache function createOptions( options ) { var object = optionsCache[ options ] = {}; jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { object[ flag ] = true; }); return object; } /* * Create a callback list using the following parameters: * * options: an optional list of space-separated options that will change how * the callback list behaves or a more traditional option object * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible options: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( options ) { // Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? ( optionsCache[ options ] || createOptions( options ) ) : jQuery.extend( {}, options ); var // Flag to know if list is currently firing firing, // Last fire value (for non-forgettable lists) memory, // Flag to know if list was already fired fired, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, // First callback to fire (used internally by add and fireWith) firingStart, // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = !options.once && [], // Fire callbacks fire = function( data ) { memory = options.memory && data; fired = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; firing = true; for ( ; list && firingIndex < firingLength; firingIndex++ ) { if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { memory = false; // To prevent further calls using add break; } } firing = false; if ( list ) { if ( stack ) { if ( stack.length ) { fire( stack.shift() ); } } else if ( memory ) { list = []; } else { self.disable(); } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { // First, we save the current length var start = list.length; (function add( args ) { jQuery.each( args, function( _, arg ) { var type = jQuery.type( arg ); if ( type === "function" ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } } else if ( arg && arg.length && type !== "string" ) { // Inspect recursively add( arg ); } }); })( arguments ); // Do we need to add the callbacks to the // current firing batch? if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away } else if ( memory ) { firingStart = start; fire( memory ); } } return this; }, // Remove a callback from the list remove: function() { if ( list ) { jQuery.each( arguments, function( _, arg ) { var index; while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { list.splice( index, 1 ); // Handle firing indexes if ( firing ) { if ( index <= firingLength ) { firingLength--; } if ( index <= firingIndex ) { firingIndex--; } } } }); } return this; }, // Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); }, // Remove all callbacks from the list empty: function() { list = []; firingLength = 0; return this; }, // Have the list do nothing anymore disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? disabled: function() { return !list; }, // Lock the list in its current state lock: function() { stack = undefined; if ( !memory ) { self.disable(); } return this; }, // Is it locked? locked: function() { return !stack; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( list && ( !fired || stack ) ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; if ( firing ) { stack.push( args ); } else { fire( args ); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; jQuery.extend({ Deferred: function( func ) { var tuples = [ // action, add listener, listener list, final state [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], [ "notify", "progress", jQuery.Callbacks("memory") ] ], state = "pending", promise = { state: function() { return state; }, always: function() { deferred.done( arguments ).fail( arguments ); return this; }, then: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; return jQuery.Deferred(function( newDefer ) { jQuery.each( tuples, function( i, tuple ) { var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; // deferred[ done | fail | progress ] for forwarding actions to newDefer deferred[ tuple[1] ](function() { var returned = fn && fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise() .done( newDefer.resolve ) .fail( newDefer.reject ) .progress( newDefer.notify ); } else { newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); } }); }); fns = null; }).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { return obj != null ? jQuery.extend( obj, promise ) : promise; } }, deferred = {}; // Keep pipe for back-compat promise.pipe = promise.then; // Add list-specific methods jQuery.each( tuples, function( i, tuple ) { var list = tuple[ 2 ], stateString = tuple[ 3 ]; // promise[ done | fail | progress ] = list.add promise[ tuple[1] ] = list.add; // Handle state if ( stateString ) { list.add(function() { // state = [ resolved | rejected ] state = stateString; // [ reject_list | resolve_list ].disable; progress_list.lock }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); } // deferred[ resolve | reject | notify ] deferred[ tuple[0] ] = function() { deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); return this; }; deferred[ tuple[0] + "With" ] = list.fireWith; }); // Make the deferred a promise promise.promise( deferred ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( subordinate /* , ..., subordinateN */ ) { var i = 0, resolveValues = slice.call( arguments ), length = resolveValues.length, // the count of uncompleted subordinates remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, // the master Deferred. If resolveValues consist of only a single Deferred, just use that. deferred = remaining === 1 ? subordinate : jQuery.Deferred(), // Update function for both resolve and progress values updateFunc = function( i, contexts, values ) { return function( value ) { contexts[ i ] = this; values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( values === progressValues ) { deferred.notifyWith( contexts, values ); } else if ( !(--remaining) ) { deferred.resolveWith( contexts, values ); } }; }, progressValues, progressContexts, resolveContexts; // add listeners to Deferred subordinates; treat others as resolved if ( length > 1 ) { progressValues = new Array( length ); progressContexts = new Array( length ); resolveContexts = new Array( length ); for ( ; i < length; i++ ) { if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { resolveValues[ i ].promise() .done( updateFunc( i, resolveContexts, resolveValues ) ) .fail( deferred.reject ) .progress( updateFunc( i, progressContexts, progressValues ) ); } else { --remaining; } } } // if we're not waiting on anything, resolve the master if ( !remaining ) { deferred.resolveWith( resolveContexts, resolveValues ); } return deferred.promise(); } }); // The deferred used on DOM ready var readyList; jQuery.fn.ready = function( fn ) { // Add the callback jQuery.ready.promise().done( fn ); return this; }; jQuery.extend({ // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Abort if there are pending holds or we're already ready if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready ); } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.resolveWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.triggerHandler ) { jQuery( document ).triggerHandler( "ready" ); jQuery( document ).off( "ready" ); } } }); /** * Clean-up method for dom ready events */ function detach() { if ( document.addEventListener ) { document.removeEventListener( "DOMContentLoaded", completed, false ); window.removeEventListener( "load", completed, false ); } else { document.detachEvent( "onreadystatechange", completed ); window.detachEvent( "onload", completed ); } } /** * The ready event handler and self cleanup method */ function completed() { // readyState === "complete" is good enough for us to call the dom ready in oldIE if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { detach(); jQuery.ready(); } } jQuery.ready.promise = function( obj ) { if ( !readyList ) { readyList = jQuery.Deferred(); // Catch cases where $(document).ready() is called after the browser event has already occurred. // we once tried to use readyState "interactive" here, but it caused issues like the one // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready setTimeout( jQuery.ready ); // Standards-based browsers support DOMContentLoaded } else if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", completed, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", completed, false ); // If IE event model is used } else { // Ensure firing before onload, maybe late but safe also for iframes document.attachEvent( "onreadystatechange", completed ); // A fallback to window.onload, that will always work window.attachEvent( "onload", completed ); // If IE and not a frame // continually check to see if the document is ready var top = false; try { top = window.frameElement == null && document.documentElement; } catch(e) {} if ( top && top.doScroll ) { (function doScrollCheck() { if ( !jQuery.isReady ) { try { // Use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ top.doScroll("left"); } catch(e) { return setTimeout( doScrollCheck, 50 ); } // detach all dom ready events detach(); // and execute any waiting functions jQuery.ready(); } })(); } } } return readyList.promise( obj ); }; var strundefined = typeof undefined; // Support: IE<9 // Iteration over object's inherited properties before its own var i; for ( i in jQuery( support ) ) { break; } support.ownLast = i !== "0"; // Note: most support tests are defined in their respective modules. // false until the test is run support.inlineBlockNeedsLayout = false; // Execute ASAP in case we need to set body.style.zoom jQuery(function() { // Minified: var a,b,c,d var val, div, body, container; body = document.getElementsByTagName( "body" )[ 0 ]; if ( !body || !body.style ) { // Return for frameset docs that don't have a body return; } // Setup div = document.createElement( "div" ); container = document.createElement( "div" ); container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; body.appendChild( container ).appendChild( div ); if ( typeof div.style.zoom !== strundefined ) { // Support: IE<8 // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; if ( val ) { // Prevent IE 6 from affecting layout for positioned elements #11048 // Prevent IE from shrinking the body in IE 7 mode #12869 // Support: IE<8 body.style.zoom = 1; } } body.removeChild( container ); }); (function() { var div = document.createElement( "div" ); // Execute the test only if not already executed in another module. if (support.deleteExpando == null) { // Support: IE<9 support.deleteExpando = true; try { delete div.test; } catch( e ) { support.deleteExpando = false; } } // Null elements to avoid leaks in IE. div = null; })(); /** * Determines whether an object can have data */ jQuery.acceptData = function( elem ) { var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ], nodeType = +elem.nodeType || 1; // Do not set data on non-element DOM nodes because it will not be cleared (#8335). return nodeType !== 1 && nodeType !== 9 ? false : // Nodes accept data unless otherwise specified; rejection can be conditional !noData || noData !== true && elem.getAttribute("classid") === noData; }; var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /([A-Z])/g; function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : // Only convert to a number if it doesn't change the string +data + "" === data ? +data : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {} // Make sure we set the data so it isn't changed later jQuery.data( elem, key, data ); } else { data = undefined; } } return data; } // checks a cache object for emptiness function isEmptyDataObject( obj ) { var name; for ( name in obj ) { // if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { continue; } if ( name !== "toJSON" ) { return false; } } return true; } function internalData( elem, name, data, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var ret, thisCache, internalKey = jQuery.expando, // We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType, // Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem, // Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; // Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { return; } if ( !id ) { // Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; } else { id = internalKey; } } if ( !cache[ id ] ) { // Avoid exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } } thisCache = cache[ id ]; // jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; } thisCache = thisCache.data; } if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; } // Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( typeof name === "string" ) { // First Try to find as-is property data ret = thisCache[ name ]; // Test for null|undefined property data if ( ret == null ) { // Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; } return ret; } function internalRemoveData( elem, name, pvt ) { if ( !jQuery.acceptData( elem ) ) { return; } var thisCache, i, isNode = elem.nodeType, // See jQuery.data for more information cache = isNode ? jQuery.cache : elem, id = isNode ? elem[ jQuery.expando ] : jQuery.expando; // If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; } if ( name ) { thisCache = pvt ? cache[ id ] : cache[ id ].data; if ( thisCache ) { // Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) { // try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else { // split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split(" "); } } } else { // If "name" is an array of keys... // When data is initially created, via ("key", "val") signature, // keys will be converted to camelCase. // Since there is no way to tell _how_ a key was added, remove // both plain key and camelCase key. #12786 // This will only penalize the array argument path. name = name.concat( jQuery.map( name, jQuery.camelCase ) ); } i = name.length; while ( i-- ) { delete thisCache[ name[i] ]; } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { return; } } } // See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data; // Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject( cache[ id ] ) ) { return; } } // Destroy the cache if ( isNode ) { jQuery.cleanData( [ elem ], true ); // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) /* jshint eqeqeq: false */ } else if ( support.deleteExpando || cache != cache.window ) { /* jshint eqeqeq: true */ delete cache[ id ]; // When all else fails, null } else { cache[ id ] = null; } } jQuery.extend({ cache: {}, // The following elements (space-suffixed to avoid Object.prototype collisions) // throw uncatchable exceptions if you attempt to set expando properties noData: { "applet ": true, "embed ": true, // ...but Flash objects (which have this classid) *can* handle expandos "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" }, hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data ) { return internalData( elem, name, data ); }, removeData: function( elem, name ) { return internalRemoveData( elem, name ); }, // For internal use only. _data: function( elem, name, data ) { return internalData( elem, name, data, true ); }, _removeData: function( elem, name ) { return internalRemoveData( elem, name, true ); } }); jQuery.fn.extend({ data: function( key, value ) { var i, name, data, elem = this[0], attrs = elem && elem.attributes; // Special expections of .data basically thwart jQuery.access, // so implement the relevant behavior ourselves // Gets all values if ( key === undefined ) { if ( this.length ) { data = jQuery.data( elem ); if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { i = attrs.length; while ( i-- ) { // Support: IE11+ // The attrs elements can be null (#14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.slice(5) ); dataAttr( elem, name, data[ name ] ); } } } jQuery._data( elem, "parsedAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each(function() { jQuery.data( this, key ); }); } return arguments.length > 1 ? // Sets one value this.each(function() { jQuery.data( this, key, value ); }) : // Gets one value // Try to fetch any internally stored data first elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; }, removeData: function( key ) { return this.each(function() { jQuery.removeData( this, key ); }); } }); jQuery.extend({ queue: function( elem, type, data ) { var queue; if ( elem ) { type = ( type || "fx" ) + "queue"; queue = jQuery._data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !queue || jQuery.isArray(data) ) { queue = jQuery._data( elem, type, jQuery.makeArray(data) ); } else { queue.push( data ); } } return queue || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), startLength = queue.length, fn = queue.shift(), hooks = jQuery._queueHooks( elem, type ), next = function() { jQuery.dequeue( elem, type ); }; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); startLength--; } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } // clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); } if ( !startLength && hooks ) { hooks.empty.fire(); } }, // not intended for public consumption - generates a queueHooks object, or returns the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; return jQuery._data( elem, key ) || jQuery._data( elem, key, { empty: jQuery.Callbacks("once memory").add(function() { jQuery._removeData( elem, type + "queue" ); jQuery._removeData( elem, key ); }) }); } }); jQuery.fn.extend({ queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[0], type ); } return data === undefined ? this : this.each(function() { var queue = jQuery.queue( this, type, data ); // ensure a hooks for this queue jQuery._queueHooks( this, type ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } }; if ( typeof type !== "string" ) { obj = type; type = undefined; } type = type || "fx"; while ( i-- ) { tmp = jQuery._data( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); } } resolve(); return defer.promise( obj ); } }); var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; var isHidden = function( elem, el ) { // isHidden might be called from jQuery#filter function; // in that case, element will be second argument elem = el || elem; return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); }; // Multifunctional method to get and set values of a collection // The value/s can optionally be executed if it's a function var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, length = elems.length, bulk = key == null; // Sets many values if ( jQuery.type( key ) === "object" ) { chainable = true; for ( i in key ) { jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); } // Sets one value } else if ( value !== undefined ) { chainable = true; if ( !jQuery.isFunction( value ) ) { raw = true; } if ( bulk ) { // Bulk operations run against the entire set if ( raw ) { fn.call( elems, value ); fn = null; // ...except when executing function values } else { bulk = fn; fn = function( elem, key, value ) { return bulk.call( jQuery( elem ), value ); }; } } if ( fn ) { for ( ; i < length; i++ ) { fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); } } } return chainable ? elems : // Gets bulk ? fn.call( elems ) : length ? fn( elems[0], key ) : emptyGet; }; var rcheckableType = (/^(?:checkbox|radio)$/i); (function() { // Minified: var a,b,c var input = document.createElement( "input" ), div = document.createElement( "div" ), fragment = document.createDocumentFragment(); // Setup div.innerHTML = "
a"; // IE strips leading whitespace when .innerHTML is used support.leadingWhitespace = div.firstChild.nodeType === 3; // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables support.tbody = !div.getElementsByTagName( "tbody" ).length; // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; // Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works support.html5Clone = document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) input.type = "checkbox"; input.checked = true; fragment.appendChild( input ); support.appendChecked = input.checked; // Make sure textarea (and checkbox) defaultValue is properly cloned // Support: IE6-IE11+ div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; // #11217 - WebKit loses check when the name is after the checked attribute fragment.appendChild( div ); div.innerHTML = ""; // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 // old WebKit doesn't clone checked state correctly in fragments support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; // Support: IE<9 // Opera does not clone events (and typeof div.attachEvent === undefined). // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() support.noCloneEvent = true; if ( div.attachEvent ) { div.attachEvent( "onclick", function() { support.noCloneEvent = false; }); div.cloneNode( true ).click(); } // Execute the test only if not already executed in another module. if (support.deleteExpando == null) { // Support: IE<9 support.deleteExpando = true; try { delete div.test; } catch( e ) { support.deleteExpando = false; } } })(); (function() { var i, eventName, div = document.createElement( "div" ); // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) for ( i in { submit: true, change: true, focusin: true }) { eventName = "on" + i; if ( !(support[ i + "Bubbles" ] = eventName in window) ) { // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) div.setAttribute( eventName, "t" ); support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false; } } // Null elements to avoid leaks in IE. div = null; })(); var rformElems = /^(?:input|select|textarea)$/i, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; function returnTrue() { return true; } function returnFalse() { return false; } function safeActiveElement() { try { return document.activeElement; } catch ( err ) { } } /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { var tmp, events, t, handleObjIn, special, eventHandle, handleObj, handlers, type, namespaces, origType, elemData = jQuery._data( elem ); // Don't attach events to noData or text/comment nodes (but allow plain objects) if ( !elemData ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first if ( !(events = elemData.events) ) { events = elemData.events = {}; } if ( !(eventHandle = elemData.handle) ) { eventHandle = elemData.handle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space types = ( types || "" ).match( rnotwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[t] ) || []; type = origType = tmp[1]; namespaces = ( tmp[2] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { continue; } // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ type: type, origType: origType, data: data, handler: handler, guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), namespace: namespaces.join(".") }, handleObjIn ); // Init the event handler queue if we're the first if ( !(handlers = events[ type ]) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var j, handleObj, tmp, origCount, t, events, special, handlers, type, namespaces, origType, elemData = jQuery.hasData( elem ) && jQuery._data( elem ); if ( !elemData || !(events = elemData.events) ) { return; } // Once for each type.namespace in types; type may be omitted types = ( types || "" ).match( rnotwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[t] ) || []; type = origType = tmp[1]; namespaces = ( tmp[2] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; while ( j-- ) { handleObj = handlers[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { handlers.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { delete elemData.handle; // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery._removeData( elem, "events" ); } }, trigger: function( event, data, elem, onlyHandlers ) { var handle, ontype, cur, bubbleType, special, tmp, i, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; cur = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf(".") >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); namespaces.sort(); } ontype = type.indexOf(":") < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string event = event[ jQuery.expando ] ? event : new jQuery.Event( type, typeof event === "object" && event ); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) event.isTrigger = onlyHandlers ? 2 : 3; event.namespace = namespaces.join("."); event.namespace_re = event.namespace ? new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : null; // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data == null ? [ event ] : jQuery.makeArray( data, [ event ] ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { cur = cur.parentNode; } for ( ; cur; cur = cur.parentNode ) { eventPath.push( cur ); tmp = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( tmp === (elem.ownerDocument || document) ) { eventPath.push( tmp.defaultView || tmp.parentWindow || window ); } } // Fire handlers on the event path i = 0; while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Native handler handle = ontype && cur[ ontype ]; if ( handle && handle.apply && jQuery.acceptData( cur ) ) { event.result = handle.apply( cur, data ); if ( event.result === false ) { event.preventDefault(); } } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; if ( tmp ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; try { elem[ type ](); } catch ( e ) { // IE<9 dies on focus/blur to hidden element (#1486,#12518) // only reproducible on winXP IE8 native, not IE9 in IE8 mode } jQuery.event.triggered = undefined; if ( tmp ) { elem[ ontype ] = tmp; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event ); var i, ret, handleObj, matched, j, handlerQueue = [], args = slice.call( arguments ), handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[0] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers handlerQueue = jQuery.event.handlers.call( this, event, handlers ); // Run delegates first; they may want to stop propagation beneath us i = 0; while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { // Triggered event must either 1) have no namespace, or // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) .apply( matched.elem, args ); if ( ret !== undefined ) { if ( (event.result = ret) === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, handlers: function( event, handlers ) { var sel, handleObj, matches, i, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Find delegate handlers // Black-hole SVG instance trees (#13180) // Avoid non-left-click bubbling in Firefox (#3861) if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { /* jshint eqeqeq: false */ for ( ; cur != this; cur = cur.parentNode || this ) { /* jshint eqeqeq: true */ // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { matches = []; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; // Don't conflict with Object.prototype properties (#13203) sel = handleObj.selector + " "; if ( matches[ sel ] === undefined ) { matches[ sel ] = handleObj.needsContext ? jQuery( sel, this ).index( cur ) >= 0 : jQuery.find( sel, this, null, [ cur ] ).length; } if ( matches[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, handlers: matches }); } } } } // Add the remaining (directly-bound) handlers if ( delegateCount < handlers.length ) { handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); } return handlerQueue; }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, copy, type = event.type, originalEvent = event, fixHook = this.fixHooks[ type ]; if ( !fixHook ) { this.fixHooks[ type ] = fixHook = rmouseEvent.test( type ) ? this.mouseHooks : rkeyEvent.test( type ) ? this.keyHooks : {}; } copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = new jQuery.Event( originalEvent ); i = copy.length; while ( i-- ) { prop = copy[ i ]; event[ prop ] = originalEvent[ prop ]; } // Support: IE<9 // Fix target property (#1925) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Support: Chrome 23+, Safari? // Target should not be a text node (#504, #13143) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // Support: IE<9 // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) event.metaKey = !!event.metaKey; return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; }, // Includes some event props shared by KeyEvent and MouseEvent props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { var body, eventDoc, doc, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, special: { load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { // Fire native event if possible so blur/focus sequence is correct trigger: function() { if ( this !== safeActiveElement() && this.focus ) { try { this.focus(); return false; } catch ( e ) { // Support: IE<9 // If we error on focus to hidden element (#1486, #12518), // let .trigger() run the handlers } } }, delegateType: "focusin" }, blur: { trigger: function() { if ( this === safeActiveElement() && this.blur ) { this.blur(); return false; } }, delegateType: "focusout" }, click: { // For checkbox, fire native event so checked state will be right trigger: function() { if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { this.click(); return false; } }, // For cross-browser consistency, don't fire native .click() on links _default: function( event ) { return jQuery.nodeName( event.target, "a" ); } }, beforeunload: { postDispatch: function( event ) { // Support: Firefox 20+ // Firefox doesn't alert if the returnValue field is not set. if ( event.result !== undefined && event.originalEvent ) { event.originalEvent.returnValue = event.result; } } } }, simulate: function( type, elem, event, bubble ) { // Piggyback on a donor event to simulate a different one. // Fake originalEvent to avoid donor's stopPropagation, but if the // simulated event prevents default then we do the same on the donor. var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true, originalEvent: {} } ); if ( bubble ) { jQuery.event.trigger( e, null, elem ); } else { jQuery.event.dispatch.call( elem, e ); } if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } } : function( elem, type, handle ) { var name = "on" + type; if ( elem.detachEvent ) { // #8545, #7054, preventing memory leaks for custom events in IE6-8 // detachEvent needed property on element, by name of that event, to properly expose it to GC if ( typeof elem[ name ] === strundefined ) { elem[ name ] = null; } elem.detachEvent( name, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !(this instanceof jQuery.Event) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: IE < 9, Android < 4.0 src.returnValue === false ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; if ( !e ) { return; } // If preventDefault exists, run it on the original event if ( e.preventDefault ) { e.preventDefault(); // Support: IE // Otherwise set the returnValue property of the original event to false } else { e.returnValue = false; } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; if ( !e ) { return; } // If stopPropagation exists, run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // Support: IE // Set the cancelBubble property of the original event to true e.cancelBubble = true; }, stopImmediatePropagation: function() { var e = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; if ( e && e.stopImmediatePropagation ) { e.stopImmediatePropagation(); } this.stopPropagation(); } }; // Create mouseenter/leave events using mouseover/out and event-time checks jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); // IE submit delegation if ( !support.submitBubbles ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; if ( form && !jQuery._data( form, "submitBubbles" ) ) { jQuery.event.add( form, "submit._submit", function( event ) { event._submit_bubble = true; }); jQuery._data( form, "submitBubbles", true ); } }); // return undefined since we don't need an event listener }, postDispatch: function( event ) { // If form was submitted by the user, bubble the event up the tree if ( event._submit_bubble ) { delete event._submit_bubble; if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event, true ); } } }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !support.changeBubbles ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._just_changed = true; } }); jQuery.event.add( this, "click._change", function( event ) { if ( this._just_changed && !event.isTrigger ) { this._just_changed = false; } // Allow triggered, simulated change events (#11500) jQuery.event.simulate( "change", this, event, true ); }); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event, true ); } }); jQuery._data( elem, "changeBubbles", true ); } }); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return !rformElems.test( this.nodeName ); } }; } // Create "bubbling" focus and blur events if ( !support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler on the document while someone wants focusin/focusout var handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; jQuery.event.special[ fix ] = { setup: function() { var doc = this.ownerDocument || this, attaches = jQuery._data( doc, fix ); if ( !attaches ) { doc.addEventListener( orig, handler, true ); } jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); }, teardown: function() { var doc = this.ownerDocument || this, attaches = jQuery._data( doc, fix ) - 1; if ( !attaches ) { doc.removeEventListener( orig, handler, true ); jQuery._removeData( doc, fix ); } else { jQuery._data( doc, fix, attaches ); } } }; }); } jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { var type, origFn; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { this.on( type, selector, data, types[ type ], one ); } return this; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return this; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return this.each( function() { jQuery.event.add( this, types, fn, data, selector ); }); }, one: function( types, selector, data, fn ) { return this.on( types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { var handleObj, type; if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each(function() { jQuery.event.remove( this, types, fn, selector ); }); }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { var elem = this[0]; if ( elem ) { return jQuery.event.trigger( type, data, elem, true ); } } }); function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment(); if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; } var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), rleadingWhitespace = /^\s+/, rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, rtagName = /<([\w:]+)/, rtbody = /\s*$/g, // We have to close these tags to support XHTML (#13200) wrapMap = { option: [ 1, "" ], legend: [ 1, "
", "
" ], area: [ 1, "", "" ], param: [ 1, "", "" ], thead: [ 1, "", "
" ], tr: [ 2, "", "
" ], col: [ 2, "", "
" ], td: [ 3, "", "
" ], // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, // unless wrapped in a div with non-breaking characters in front of it. _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] }, safeFragment = createSafeFragment( document ), fragmentDiv = safeFragment.appendChild( document.createElement("div") ); wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; function getAll( context, tag ) { var elems, elem, i = 0, found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) : typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) : undefined; if ( !found ) { for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { if ( !tag || jQuery.nodeName( elem, tag ) ) { found.push( elem ); } else { jQuery.merge( found, getAll( elem, tag ) ); } } } return tag === undefined || tag && jQuery.nodeName( context, tag ) ? jQuery.merge( [ context ], found ) : found; } // Used in buildFragment, fixes the defaultChecked property function fixDefaultChecked( elem ) { if ( rcheckableType.test( elem.type ) ) { elem.defaultChecked = elem.checked; } } // Support: IE<8 // Manipulating tables requires a tbody function manipulationTarget( elem, content ) { return jQuery.nodeName( elem, "table" ) && jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? elem.getElementsByTagName("tbody")[0] || elem.appendChild( elem.ownerDocument.createElement("tbody") ) : elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; return elem; } function restoreScript( elem ) { var match = rscriptTypeMasked.exec( elem.type ); if ( match ) { elem.type = match[1]; } else { elem.removeAttribute("type"); } return elem; } // Mark scripts as having already been evaluated function setGlobalEval( elems, refElements ) { var elem, i = 0; for ( ; (elem = elems[i]) != null; i++ ) { jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); } } function cloneCopyEvent( src, dest ) { if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { return; } var type, i, l, oldData = jQuery._data( src ), curData = jQuery._data( dest, oldData ), events = oldData.events; if ( events ) { delete curData.handle; curData.events = {}; for ( type in events ) { for ( i = 0, l = events[ type ].length; i < l; i++ ) { jQuery.event.add( dest, type, events[ type ][ i ] ); } } } // make the cloned public data object a copy from the original if ( curData.data ) { curData.data = jQuery.extend( {}, curData.data ); } } function fixCloneNodeIssues( src, dest ) { var nodeName, e, data; // We do not need to do anything for non-Elements if ( dest.nodeType !== 1 ) { return; } nodeName = dest.nodeName.toLowerCase(); // IE6-8 copies events bound via attachEvent when using cloneNode. if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { data = jQuery._data( dest ); for ( e in data.events ) { jQuery.removeEvent( dest, e, data.handle ); } // Event data gets referenced instead of copied if the expando gets copied too dest.removeAttribute( jQuery.expando ); } // IE blanks contents when cloning scripts, and tries to evaluate newly-set text if ( nodeName === "script" && dest.text !== src.text ) { disableScript( dest ).text = src.text; restoreScript( dest ); // IE6-10 improperly clones children of object elements using classid. // IE10 throws NoModificationAllowedError if parent is null, #12132. } else if ( nodeName === "object" ) { if ( dest.parentNode ) { dest.outerHTML = src.outerHTML; } // This path appears unavoidable for IE9. When cloning an object // element in IE9, the outerHTML strategy above is not sufficient. // If the src has innerHTML and the destination does not, // copy the src.innerHTML into the dest.innerHTML. #10324 if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { dest.innerHTML = src.innerHTML; } } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { // IE6-8 fails to persist the checked state of a cloned checkbox // or radio button. Worse, IE6-7 fail to give the cloned element // a checked appearance if the defaultChecked value isn't also set dest.defaultChecked = dest.checked = src.checked; // IE6-7 get confused and end up setting the value of a cloned // checkbox/radio button to an empty string instead of "on" if ( dest.value !== src.value ) { dest.value = src.value; } // IE6-8 fails to return the selected option to the default selected // state when cloning options } else if ( nodeName === "option" ) { dest.defaultSelected = dest.selected = src.defaultSelected; // IE6-8 fails to set the defaultValue to the correct value when // cloning other types of input fields } else if ( nodeName === "input" || nodeName === "textarea" ) { dest.defaultValue = src.defaultValue; } } jQuery.extend({ clone: function( elem, dataAndEvents, deepDataAndEvents ) { var destElements, node, clone, i, srcElements, inPage = jQuery.contains( elem.ownerDocument, elem ); if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { clone = elem.cloneNode( true ); // IE<=8 does not properly clone detached, unknown element nodes } else { fragmentDiv.innerHTML = elem.outerHTML; fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); } if ( (!support.noCloneEvent || !support.noCloneChecked) && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); // Fix all IE cloning issues for ( i = 0; (node = srcElements[i]) != null; ++i ) { // Ensure that the destination node is not null; Fixes #9587 if ( destElements[i] ) { fixCloneNodeIssues( node, destElements[i] ); } } } // Copy the events from the original to the clone if ( dataAndEvents ) { if ( deepDataAndEvents ) { srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); for ( i = 0; (node = srcElements[i]) != null; i++ ) { cloneCopyEvent( node, destElements[i] ); } } else { cloneCopyEvent( elem, clone ); } } // Preserve script evaluation history destElements = getAll( clone, "script" ); if ( destElements.length > 0 ) { setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } destElements = srcElements = node = null; // Return the cloned set return clone; }, buildFragment: function( elems, context, scripts, selection ) { var j, elem, contains, tmp, tag, tbody, wrap, l = elems.length, // Ensure a safe fragment safe = createSafeFragment( context ), nodes = [], i = 0; for ( ; i < l; i++ ) { elem = elems[ i ]; if ( elem || elem === 0 ) { // Add nodes directly if ( jQuery.type( elem ) === "object" ) { jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); // Convert non-html into a text node } else if ( !rhtml.test( elem ) ) { nodes.push( context.createTextNode( elem ) ); // Convert html into DOM nodes } else { tmp = tmp || safe.appendChild( context.createElement("div") ); // Deserialize a standard representation tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase(); wrap = wrapMap[ tag ] || wrapMap._default; tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; // Descend through wrappers to the right content j = wrap[0]; while ( j-- ) { tmp = tmp.lastChild; } // Manually add leading whitespace removed by IE if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); } // Remove IE's autoinserted from table fragments if ( !support.tbody ) { // String was a , *may* have spurious elem = tag === "table" && !rtbody.test( elem ) ? tmp.firstChild : // String was a bare or wrap[1] === "
" && !rtbody.test( elem ) ? tmp : 0; j = elem && elem.childNodes.length; while ( j-- ) { if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { elem.removeChild( tbody ); } } } jQuery.merge( nodes, tmp.childNodes ); // Fix #12392 for WebKit and IE > 9 tmp.textContent = ""; // Fix #12392 for oldIE while ( tmp.firstChild ) { tmp.removeChild( tmp.firstChild ); } // Remember the top-level container for proper cleanup tmp = safe.lastChild; } } } // Fix #11356: Clear elements from fragment if ( tmp ) { safe.removeChild( tmp ); } // Reset defaultChecked for any radios and checkboxes // about to be appended to the DOM in IE 6/7 (#8060) if ( !support.appendChecked ) { jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); } i = 0; while ( (elem = nodes[ i++ ]) ) { // #4087 - If origin and destination elements are the same, and this is // that element, do not do anything if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { continue; } contains = jQuery.contains( elem.ownerDocument, elem ); // Append to fragment tmp = getAll( safe.appendChild( elem ), "script" ); // Preserve script evaluation history if ( contains ) { setGlobalEval( tmp ); } // Capture executables if ( scripts ) { j = 0; while ( (elem = tmp[ j++ ]) ) { if ( rscriptType.test( elem.type || "" ) ) { scripts.push( elem ); } } } } tmp = null; return safe; }, cleanData: function( elems, /* internal */ acceptData ) { var elem, type, id, data, i = 0, internalKey = jQuery.expando, cache = jQuery.cache, deleteExpando = support.deleteExpando, special = jQuery.event.special; for ( ; (elem = elems[i]) != null; i++ ) { if ( acceptData || jQuery.acceptData( elem ) ) { id = elem[ internalKey ]; data = id && cache[ id ]; if ( data ) { if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); // This is a shortcut to avoid jQuery.event.remove's overhead } else { jQuery.removeEvent( elem, type, data.handle ); } } } // Remove cache only if it was not already removed by jQuery.event.remove if ( cache[ id ] ) { delete cache[ id ]; // IE does not allow us to delete expando properties from nodes, // nor does it have a removeAttribute function on Document nodes; // we must handle all of these cases if ( deleteExpando ) { delete elem[ internalKey ]; } else if ( typeof elem.removeAttribute !== strundefined ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } deletedIds.push( id ); } } } } } }); jQuery.fn.extend({ text: function( value ) { return access( this, function( value ) { return value === undefined ? jQuery.text( this ) : this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); }, null, value, arguments.length ); }, append: function() { return this.domManip( arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.appendChild( elem ); } }); }, prepend: function() { return this.domManip( arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.insertBefore( elem, target.firstChild ); } }); }, before: function() { return this.domManip( arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this ); } }); }, after: function() { return this.domManip( arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this.nextSibling ); } }); }, remove: function( selector, keepData /* Internal Use Only */ ) { var elem, elems = selector ? jQuery.filter( selector, this ) : this, i = 0; for ( ; (elem = elems[i]) != null; i++ ) { if ( !keepData && elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem ) ); } if ( elem.parentNode ) { if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { setGlobalEval( getAll( elem, "script" ) ); } elem.parentNode.removeChild( elem ); } } return this; }, empty: function() { var elem, i = 0; for ( ; (elem = this[i]) != null; i++ ) { // Remove element nodes and prevent memory leaks if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); } // Remove any remaining nodes while ( elem.firstChild ) { elem.removeChild( elem.firstChild ); } // If this is a select, ensure that it displays empty (#12336) // Support: IE<9 if ( elem.options && jQuery.nodeName( elem, "select" ) ) { elem.options.length = 0; } } return this; }, clone: function( dataAndEvents, deepDataAndEvents ) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map(function() { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); }); }, html: function( value ) { return access( this, function( value ) { var elem = this[ 0 ] || {}, i = 0, l = this.length; if ( value === undefined ) { return elem.nodeType === 1 ? elem.innerHTML.replace( rinlinejQuery, "" ) : undefined; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && ( support.htmlSerialize || !rnoshimcache.test( value ) ) && ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) { value = value.replace( rxhtmlTag, "<$1>" ); try { for (; i < l; i++ ) { // Remove element nodes and prevent memory leaks elem = this[i] || {}; if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } elem = 0; // If using innerHTML throws an exception, use the fallback method } catch(e) {} } if ( elem ) { this.empty().append( value ); } }, null, value, arguments.length ); }, replaceWith: function() { var arg = arguments[ 0 ]; // Make the changes, replacing each context element with the new content this.domManip( arguments, function( elem ) { arg = this.parentNode; jQuery.cleanData( getAll( this ) ); if ( arg ) { arg.replaceChild( elem, this ); } }); // Force removal if there was no new content (e.g., from empty arguments) return arg && (arg.length || arg.nodeType) ? this : this.remove(); }, detach: function( selector ) { return this.remove( selector, true ); }, domManip: function( args, callback ) { // Flatten any nested arrays args = concat.apply( [], args ); var first, node, hasScripts, scripts, doc, fragment, i = 0, l = this.length, set = this, iNoClone = l - 1, value = args[0], isFunction = jQuery.isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit if ( isFunction || ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test( value ) ) ) { return this.each(function( index ) { var self = set.eq( index ); if ( isFunction ) { args[0] = value.call( this, index, self.html() ); } self.domManip( args, callback ); }); } if ( l ) { fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { fragment = first; } if ( first ) { scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); hasScripts = scripts.length; // Use the original fragment for the last item instead of the first because it can end up // being emptied incorrectly in certain situations (#8070). for ( ; i < l; i++ ) { node = fragment; if ( i !== iNoClone ) { node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration if ( hasScripts ) { jQuery.merge( scripts, getAll( node, "script" ) ); } } callback.call( this[i], node, i ); } if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src ) { // Optional AJAX dependency, but won't run scripts if not present if ( jQuery._evalUrl ) { jQuery._evalUrl( node.src ); } } else { jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); } } } } // Fix #11809: Avoid leaking memory fragment = first = null; } } return this; } }); jQuery.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, i = 0, ret = [], insert = jQuery( selector ), last = insert.length - 1; for ( ; i <= last; i++ ) { elems = i === last ? this : this.clone(true); jQuery( insert[i] )[ original ]( elems ); // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; }); var iframe, elemdisplay = {}; /** * Retrieve the actual display of a element * @param {String} name nodeName of the element * @param {Object} doc Document object */ // Called only from within defaultDisplay function actualDisplay( name, doc ) { var style, elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), // getDefaultComputedStyle might be reliably used only on attached element display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? // Use of this method is a temporary fix (more like optmization) until something better comes along, // since it was removed from specification and supported only in FF style.display : jQuery.css( elem[ 0 ], "display" ); // We don't have any data stored on the element, // so use "detach" method as fast way to get rid of the element elem.detach(); return display; } /** * Try to determine the default display value of an element * @param {String} nodeName */ function defaultDisplay( nodeName ) { var doc = document, display = elemdisplay[ nodeName ]; if ( !display ) { display = actualDisplay( nodeName, doc ); // If the simple way fails, read from inside an iframe if ( display === "none" || !display ) { // Use the already-created iframe if possible iframe = (iframe || jQuery( ")' + r"|(?P'; expected_output = '
\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html15(self): raw = "http://example.com"; expected_output = 'http://example.com\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html16(self): raw = "https://example.com"; expected_output = 'https://example.com\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html17(self): raw = "ftp://example.com"; expected_output = 'ftp://example.com\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html18(self): raw = "nntp://example.com"; expected_output = 'nntp://example.com\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html19(self): raw = "news://example.com"; expected_output = 'news://example.com\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html20(self): raw = "mailto://example.com"; expected_output = 'mailto://example.com\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html21(self): raw = " * line 1\n * line2"; expected_output = '
    \n
  • line 1
  • line2
'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html22(self): raw = " * ***line 1***\n * [http://test line2]"; expected_output = ''; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html23(self): raw = " * line 1\n * line2"; expected_output = '
    \n
  • line 1
\n
    \n
  • line2
'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html24(self): raw = "video.mp4"; expected_output = '\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html25(self): raw = "video.mp4 autostart"; expected_output = '\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html26(self): raw = "video.ogv"; expected_output = '\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html27(self): raw = "video.webm"; expected_output = '\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html28(self): raw = "audio.mp3"; expected_output = '\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html29(self): raw = "audio.ogg"; expected_output = '\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html30(self): raw = "audio.mp3 autostart"; expected_output = '\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html31(self): raw = "audio.ogg autostart"; expected_output = '\n'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html32(self): raw = "[http://example.com A small test]"; expected_output = 'A small test'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html33(self): raw = "[http://example.com]"; expected_output = 'http://example.com'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html34(self): raw = "[../index.html test]"; expected_output = 'test'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html35(self): raw = "[./index.html test]"; expected_output = 'test'; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html36(self): raw = " "; expected_output = ''; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html37(self): raw = "}}}"; expected_output = ''; output = PageFormatter(raw).print_html() assert_equal(expected_output, output) def test_print_html38(self): raw = "[[answer : my answer]]"; expected_output = '
    \n my answer
\n
\n'; output = PageFormatter(raw).print_html() target_id = "" target_entry = re.search('data-target="(.*?)"', output, re.IGNORECASE|re.DOTALL) if target_entry: target_id = target_entry.group(1) output = output.replace(target_id, "##") assert_equal(expected_output, output) def test_print_html39(self): raw = "[[answer (code=123456):\nmy answer]]"; expected_output = '
DVBBGws8XEsTVVtFRldB
\n'; output = PageFormatter(raw).print_html() target_id = "" target_entry = re.search('data-target="(.*?)"', output, re.IGNORECASE|re.DOTALL) if target_entry: target_id = target_entry.group(1) output = output.replace(target_id, "##") assert_equal(expected_output, output) def test_print_html40(self): raw = "[[answer (code=123456):\nmy answer\n]]"; expected_output = '
DVBBGws8XEsTVVtFRldBCFdEHgw5
\n'; output = PageFormatter(raw).print_html() target_id = "" target_entry = re.search('data-target="(.*?)"', output, re.IGNORECASE|re.DOTALL) if target_entry: target_id = target_entry.group(1) output = output.replace(target_id, "##") assert_equal(expected_output, output) def test_print_html41(self): raw = "[[answer (code=123456):my answer]]"; expected_output = '
XEsTVVtFRldB
\n'; output = PageFormatter(raw).print_html() target_id = "" target_entry = re.search('data-target="(.*?)"', output, re.IGNORECASE|re.DOTALL) if target_entry: target_id = target_entry.group(1) output = output.replace(target_id, "##") assert_equal(expected_output, output) def test_print_html42(self): raw = "[[answer : my answer"; expected_output = '
    \n my answer
\n'; output = PageFormatter(raw).print_html() target_id = "" target_entry = re.search('data-target="(.*?)"', output, re.IGNORECASE|re.DOTALL) if target_entry: target_id = target_entry.group(1) output = output.replace(target_id, "##") assert_equal(expected_output, output) def test_print_html43(self): raw = "nothandled"; expected_output = "Can't handle match nothandled"; output = PageFormatter(raw).print_html() assert_equal(expected_output, output)

{{TITLE}}

{{CONTENT}}

{{TITLE}}

{{CONTENT}}