server/src/tests/Models/WebResourceTest.php
author ymh <ymh.work@gmail.com>
Tue, 18 Oct 2016 16:02:54 +0200
changeset 358 be40e00aa56f
parent 168 17f10b56c079
permissions -rw-r--r--
set path in rpm upgrade scripts

<?php

use CorpusParole\Models\WebResource;
use CorpusParole\Libraries\CocoonUtils;

use Mockery as m;

/**
 *
 */
class WebResourceTest extends TestCase {

    const TEST_DOCS = [
        'http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml' => <<<EOT
    @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
    @prefix sesame: <http://www.openrdf.org/schema/sesame#> .
    @prefix owl: <http://www.w3.org/2002/07/owl#> .
    @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
    @prefix fn: <http://www.w3.org/2005/xpath-functions#> .

    <http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml> a <http://www.europeana.eu/schemas/edm/WebResource> ;
        <http://purl.org/dc/elements/1.1/format> "application/xml"^^<http://purl.org/dc/terms/IMT> ;
        <http://purl.org/dc/terms/accessRights> "Freely available for non-commercial use" ;
        <http://purl.org/dc/terms/created> "2010-11-17"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/issued> "2013-11-04T22:20:07+01:00"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/license> <http://creativecommons.org/licenses/by-nc-sa/3.0/> ;
        <http://purl.org/dc/terms/conformsTo> <http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_transcriber> .

EOT
    ,'http://cocoon.huma-num.fr/data/archi/masters/372593.wav' => <<<EOT
    @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
    @prefix sesame: <http://www.openrdf.org/schema/sesame#> .
    @prefix owl: <http://www.w3.org/2002/07/owl#> .
    @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
    @prefix fn: <http://www.w3.org/2005/xpath-functions#> .

    <http://cocoon.huma-num.fr/data/archi/masters/372593.wav> a <http://www.europeana.eu/schemas/edm/WebResource> ;
        <http://purl.org/dc/elements/1.1/format> "audio/x-wav"^^<http://purl.org/dc/terms/IMT> ;
        <http://purl.org/dc/terms/accessRights> "Freely available for non-commercial use" ;
        <http://purl.org/dc/terms/created> "2010-11-17"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/extent> "PT48M26S" ;
        <http://purl.org/dc/terms/issued> "2013-10-12T14:35:57+02:00"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/license> <http://creativecommons.org/licenses/by-nc-sa/3.0/> .
EOT
    ,"http://cocoon.huma-num.fr/data/cfpp2000/Ozgur_Kilic_H_32_alii_3e-2.mp3" => <<<EOT
    @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
    @prefix sesame: <http://www.openrdf.org/schema/sesame#> .
    @prefix owl: <http://www.w3.org/2002/07/owl#> .
    @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
    @prefix fn: <http://www.w3.org/2005/xpath-functions#> .

    <%1\$scrdo-CFPP2000_35_SOUND> a <http://www.openarchives.org/ore/terms/Aggregation> ;
        <http://www.europeana.eu/schemas/edm/aggregatedCHO> <http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-CFPP2000_35_SOUND> ;
        <http://www.europeana.eu/schemas/edm/dataProvider> "Langage et langues : description, théorisation, transmission" ;
        <http://www.europeana.eu/schemas/edm/hasView> <http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml> , <http://cocoon.huma-num.fr/data/cfpp2000/Ozgur_Kilic_H_32_alii_3e-2.mp3> , <http://cocoon.huma-num.fr/data/cfpp2000/Ozgur_Kilic_H_32_alii_3e-2.wav> ;
        <http://www.europeana.eu/schemas/edm/isShownAt> <http://corpusdelaparole.huma-num.fr/corpus-app#/detail/crdo-CFPP2000_35_SOUND> ;
        <http://www.europeana.eu/schemas/edm/isShownBy> <http://cocoon.huma-num.fr/data/archi/masters/372593.wav> ;
        <http://www.europeana.eu/schemas/edm/provider> "Corpus de la Parole"@fr ;
        <http://www.europeana.eu/schemas/edm/rights> <http://creativecommons.org/licenses/by-nc-sa/4.0/> .

    <http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-CFPP2000_35_SOUND> a <http://www.europeana.eu/schemas/edm/ProvidedCHO> ;
        <http://purl.org/dc/terms/accessRights> "Freely available for non-commercial use" ;
        <http://purl.org/dc/terms/created> "2010-11-17"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/extent> "PT48M26S" ;
        <http://purl.org/dc/terms/issued> "2013-10-12T14:35:57+02:00"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/license> <http://creativecommons.org/licenses/by-nc-sa/3.0/> ;
        <http://purl.org/dc/elements/1.1/contributor> <http://viaf.org/viaf/93752300> , "Tanguy, Noalig" , "Chevrier, Michel" , "Kiliç, Ozgur" , "Salvegas, Etienne" , "du-Breuil-de-Pont-en-Auge, Augustin" , "du-Breuil-de-Pont-en-Auge, Benoît" ;
        <http://purl.org/dc/elements/1.1/description> "Enregistrement issu du Corpus de Français Parlé Parisien des années 2000 (CFPP2000)"@fr , "Quartier(s) concerné(s) : Paris 3e, et 20e (pour l'âge adulte); Anonymisation : Noalig TANGUY;"@fr ;
        <http://purl.org/dc/elements/1.1/identifier> "ark:/87895/1.17-375004" , "%2\$scrdo-CFPP2000_35_SOUNDid" , "oai:crdo.vjf.cnrs.fr:crdo-CFPP2000_35" , "Cote producteur: [03-01] Ozgur_Kilic_H_32_alii_3e"@fr , "ark:/87895/1.17-372593" , "oai:crdo.vjf.cnrs.fr:crdo-CFPP2000_35_SOUND" ;
        <http://purl.org/dc/elements/1.1/language> <http://lexvo.org/id/iso639-3/fra> ;
        <http://purl.org/dc/elements/1.1/publisher> <http://viaf.org/viaf/142432638>;
        <http://purl.org/dc/elements/1.1/subject> <http://ark.bnf.fr/ark:/12148/cb13318415c> , "anthropological_linguistics"^^<http://www.language-archives.org/OLAC/1.1/linguistic-field> , "lexicography"^^<http://www.language-archives.org/OLAC/1.1/linguistic-field> , "phonetics"^^<http://www.language-archives.org/OLAC/1.1/linguistic-field> , <http://lexvo.org/id/iso639-3/fra> , <http://ark.bnf.fr/ark:/12148/cb133188907> , <http://ark.bnf.fr/ark:/12148/cb11932762f> , "general_linguistics"^^<http://www.language-archives.org/OLAC/1.1/linguistic-field> , <http://ark.bnf.fr/ark:/12148/cb133183660> , "text_and_corpus_linguistics"^^<http://www.language-archives.org/OLAC/1.1/linguistic-field> , "Français"@fr , <http://ark.bnf.fr/ark:/12148/cb122368540> , "phonology"^^<http://www.language-archives.org/OLAC/1.1/linguistic-field> , "semantics"^^<http://www.language-archives.org/OLAC/1.1/linguistic-field> , "sociolinguistics"^^<http://www.language-archives.org/OLAC/1.1/linguistic-field> , "syntax"^^<http://www.language-archives.org/OLAC/1.1/linguistic-field> , "typology"^^<http://www.language-archives.org/OLAC/1.1/linguistic-field> , <http://ark.bnf.fr/ark:/12148/cb119418302> , <http://ark.bnf.fr/ark:/12148/cb135540729> , "discourse_analysis"^^<http://www.language-archives.org/OLAC/1.1/linguistic-field> , "historical_linguistics"^^<http://www.language-archives.org/OLAC/1.1/linguistic-field> , "language_documentation"^^<http://www.language-archives.org/OLAC/1.1/linguistic-field> , <http://ark.bnf.fr/ark:/12148/cb133192210> , <http://ark.bnf.fr/ark:/12148/cb119377452> , <http://ark.bnf.fr/ark:/12148/cb13320451h> , <http://ark.bnf.fr/ark:/12148/cb13318422n> , <http://ark.bnf.fr/ark:/12148/cb11975823c> , "mathematical_linguistics"^^<http://www.language-archives.org/OLAC/1.1/linguistic-field> ;
        <http://purl.org/dc/elements/1.1/title> "Entretien de Ozgur Kiliç 2"@fr ;
        <http://purl.org/dc/elements/1.1/type> <http://ark.bnf.fr/ark:/12148/cb11932135w> , <http://ark.bnf.fr/ark:/12148/cb12481481z> , <http://purl.org/dc/dcmitype/Sound> , "primary_text"^^<http://www.language-archives.org/OLAC/1.1/linguistic-type> , <http://purl.org/dc/dcmitype/Text> , "narrative"^^<http://www.language-archives.org/OLAC/1.1/discourse-type> , "report"^^<http://www.language-archives.org/OLAC/1.1/discourse-type> , "unintelligible_speech"^^<http://www.language-archives.org/OLAC/1.1/discourse-type> ;
        <http://purl.org/dc/terms/available> "2013-10-12"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/spatial> [
            a <http://www.europeana.eu/schemas/edm/Place> ;
            owl:sameAs <http://sws.geonames.org/6618626/> ;
            <http://www.w3.org/2004/02/skos/core#note> "FR"^^<http://purl.org/dc/terms/ISO3166> , "France, Île-de-France, Paris, Université Sorbonne Nouvelle Paris 3, site Censier"@fr , "Domicile de Ozgur Kiliç"@fr , "France, Île-de-France, Paris 20"@fr
        ];
        <http://www.europeana.eu/schemas/edm/isGatheredInto> <http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-COLLECTION_LANGUESDEFRANCE> , <http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-COLLECTION_CFPP2000> ;
        <http://www.language-archives.org/OLAC/1.1/depositor> <http://viaf.org/viaf/93752300> ;
        <http://www.language-archives.org/OLAC/1.1/interviewer> <http://viaf.org/viaf/93752300> ;
        <http://www.language-archives.org/OLAC/1.1/transcriber> "Tanguy, Noalig" ;
        <http://purl.org/dc/elements/1.1/coverage> "Quartier concerné : 3e"@fr ;
        <http://www.language-archives.org/OLAC/1.1/responder> "Chevrier, Michel" , "Kiliç, Ozgur" , "Salvegas, Etienne" , "du-Breuil-de-Pont-en-Auge, Augustin" , "du-Breuil-de-Pont-en-Auge, Benoît" ;
        <http://purl.org/dc/elements/1.1/relation> <http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-CFPP2000_31_SOUND> .


    <http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml> a <http://www.europeana.eu/schemas/edm/WebResource> ;
        <http://purl.org/dc/elements/1.1/format> "application/xml"^^<http://purl.org/dc/terms/IMT> ;
        <http://purl.org/dc/terms/accessRights> "Freely available for non-commercial use" ;
        <http://purl.org/dc/terms/created> "2010-11-17"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/issued> "2013-11-04T22:20:07+01:00"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/license> <http://creativecommons.org/licenses/by-nc-sa/3.0/> ;
        <http://purl.org/dc/terms/conformsTo> <http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_transcriber> .

    <http://cocoon.huma-num.fr/data/archi/masters/372593.wav> a <http://www.europeana.eu/schemas/edm/WebResource> ;
        <http://purl.org/dc/elements/1.1/format> "audio/x-wav"^^<http://purl.org/dc/terms/IMT> ;
        <http://purl.org/dc/terms/accessRights> "Freely available for non-commercial use" ;
        <http://purl.org/dc/terms/created> "2010-11-17"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/extent> "PT48M26S" ;
        <http://purl.org/dc/terms/issued> "2013-10-12T14:35:57+02:00"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/license> <http://creativecommons.org/licenses/by-nc-sa/3.0/> .

    <http://cocoon.huma-num.fr/data/cfpp2000/Ozgur_Kilic_H_32_alii_3e-2.mp3> a <http://www.europeana.eu/schemas/edm/WebResource> ;
        <http://purl.org/dc/elements/1.1/format> "audio/mpeg"^^<http://purl.org/dc/terms/IMT> ;
        <http://purl.org/dc/terms/accessRights> "Freely available for non-commercial use" ;
        <http://purl.org/dc/terms/created> "2010-11-17"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/extent> "PT48M26S" ;
        <http://purl.org/dc/terms/issued> "2013-10-12T14:35:57+02:00"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/license> <http://creativecommons.org/licenses/by-nc-sa/3.0/> ;
        <http://www.europeana.eu/schemas/edm/isDerivativeOf> <http://cocoon.huma-num.fr/data/archi/masters/372593.wav> .

    <http://cocoon.huma-num.fr/data/cfpp2000/Ozgur_Kilic_H_32_alii_3e-2.wav> a <http://www.europeana.eu/schemas/edm/WebResource> ;
        <http://purl.org/dc/elements/1.1/format> "audio/x-wav"^^<http://purl.org/dc/terms/IMT> ;
        <http://purl.org/dc/terms/accessRights> "Freely available for non-commercial use" ;
        <http://purl.org/dc/terms/created> "2010-11-17"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/extent> "PT48M26S" ;
        <http://purl.org/dc/terms/issued> "2013-10-12T14:35:57+02:00"^^<http://purl.org/dc/terms/W3CDTF> ;
        <http://purl.org/dc/terms/license> <http://creativecommons.org/licenses/by-nc-sa/3.0/> ;
        <http://www.europeana.eu/schemas/edm/isDerivativeOf> <http://cocoon.huma-num.fr/data/archi/masters/372593.wav> .
EOT
    ];

    public function getMockWebResource(...$contructorArgs) {
        return  m::mock("CorpusParole\Models\WebResource", $contructorArgs)
            ->makePartial()
            ->shouldAllowMockingProtectedMethods()
            ->shouldReceive('jsonSerializeExtra')
            ->andReturn(['extra' => 'fields'])
            ->shouldReceive('doClearMemoizationCache');

    }


    public function setUp() {

        parent::setup();
        $this->graphs = [];
        foreach(self::TEST_DOCS as $uri => $ttl) {
            $this->graphs[$uri] = new EasyRdf\Graph($uri, sprintf($ttl, config('corpusparole.corpus_doc_id_base_uri'), config('corpusparole.corpus_id_scheme')));
        }
    }

    public function testConstructor() {

        $this->assertNotNull($this->graphs, 'Graphs shoud not be null');

        $webResource = $this->getMockWebResource('http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml', $this->graphs['http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml'])->getMock();

        $this->assertNotNull($webResource);
    }

    public function testUrl() {
        $webResource = $this->getMockWebResource('http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml', $this->graphs['http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml'])->getMock();
        $this->assertEquals('http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml', $webResource->getUrl(), 'URL should be http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml');
    }

    public function testGetFormat() {
        $webResource = $this->getMockWebResource('http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml', $this->graphs['http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml'])->getMock();
        $this->assertEquals("application/xml", $webResource->getFormat(), "Format should be application/xml");
    }

    public function testJsonSerialize() {
        $webResource = $this->getMockWebResource('http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml', $this->graphs['http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml'])->getMock();

        $json = $webResource->jsonSerialize();
        $this->assertTrue(is_array($json), "must be an array");
        $this->assertEquals(
            [
                'url' => "http://cocoon.huma-num.fr/exist/crdo/cfpp2000/fra/Ozgur_Kilic_H_32_alii_3e-2.xml",
                "format" => "application/xml",
                "extra" => "fields"
            ],
            $json
        );
    }

    public function testJsonSerializeFullDoc() {
        $webResource = $this->getMockWebResource("http://cocoon.huma-num.fr/data/cfpp2000/Ozgur_Kilic_H_32_alii_3e-2.mp3", $this->graphs["http://cocoon.huma-num.fr/data/cfpp2000/Ozgur_Kilic_H_32_alii_3e-2.mp3"])->getMock();

        $json = $webResource->jsonSerialize();
        $this->assertTrue(is_array($json), "must be an array");
        $this->assertEquals(
            [
                'url' => "http://cocoon.huma-num.fr/data/cfpp2000/Ozgur_Kilic_H_32_alii_3e-2.mp3",
                "format" => "audio/mpeg",
                "extra" => "fields"
            ],
            $json
        );
    }

    public function tearDown() {
        m::close();
    }

}
EBΒi_z6/&eSU[WY-e+\R"IVic "6#Μ,+rTeM%Ox}POV=O̚dO`Sޟ[eFdB|.$EF<}uU*"ř. UëxW*iٹc*2,rV}8-p4ҶӉm9ˇ-6ۆ鍱o9|̶F5,efs/ қ β/BdPp`i1􌥓|e1'*M2}mΌ&9Vƥv[kRdEIShꕉ&bY$UCQ嬷# Ta6V柄,tj++"pjٕ+v1QaH~s-5]$(SOJz6S& 1کjJIVROJ~U²{,K&%Y1eaeY2a5efbE\+R W.6 VL2֙jeoj̵,,RXaOYO/9}GZ8ce'MLא\+(~Eep~|ۦ_ JbxJ' 1!ȷ4slmUfm[38t UdʬR{^Qq2e>"Ӕa%=69<^e1UcJѤx5o,pZJ`r-(@툈$>D Ƽ/K?'{ ";wgFm٭rj~cMSl"9`dͨQfBDI,#b8eˌ9 V,Ȧ~OE~ghucid?IxrN6jhU+j*JunfWeWVb颡C?ROو7:w+׿<=n\x$~%%fSʽ՘7N'P虹0UH"ڞɓRIQXʳL6L]V3d Sʊy%~K"XbXʶeIǏotʷjt-MX,3k4QymkfmTN a&@2M{TT{S_e&*:^vd4L\2̖HTFVb-`uen[QYLL2J"Znj2Ĵ\UVhKL52jc77+R̸ը81lpdvDW1-2T%(RR, d&ĔXd*u4 $ʙiK2S$1ZY6ҭlʲ%ljc4VLKQÊM4ƦLh I(Y)Sj{bQ_ܺU+d1.t]Vtɑldɬ.LU&l1o_+ږeek_w)2UB*UY2dʱ!SV5U1SQMM*faSPbz'4%YjfKlԥIfѕ6ɛFVTv[]zjٕr4 U^JͶjfYfļ.UZ|Wʹ_i_=0D24c%/VZI,jPGY-5iĠ䲆e~O/O*ͲJj,2KeknīR}ƭvs;܄@qu>[/N'4ŶmΚ7>r*TW跭γroEZ{|jem<6V)ï?2y3Xf/*ԔvY3|f G!^+p'vɋg'>es[MgR4nI#dpˌok⩶+\`tY*Ņ1kc|Q_B+Յ}$;J +*WGtSRxBβϵ6%&LM$"-XpȐk)TW2+.G WJ c$QXS D\IQ*q0bZiL8,IK)fCs%b*T4ԵIY61 K$Y)X,qQ\RH,JHBTTY$%M < |QPX>ȨEHZ p̭H;&'ޏ(y4/QO>fzVs:V$mY[r6@"w%,ZJCveVt0U11rX3 d9eSSs"0&2%Ʀ R91{ -Y02̡ѦRKQV\ie?VgO_ccݽ8Ν7 gy-/)=%ֻ8:iZq )I%9'=O}c Y2ՙ+,֒ڥfTVU%IjiO~㶴֔?iAX#wDEVqKWD}y?8}R U'ԯOB X,߾٫k[32K*+%aUd ,1Y1 1FjbRfꚵ*b%4I5EXefmcjJZ65kdթ6-bY&iK) `,,AbdҬ3+۪D,ך-)-4$eLdeLb1,deCXS+'$Ozju {fv[Qc2V !de41 Y Y%OP]FYYI4#YKid&6mUl5jYbK,A{UQ$DMl־3e1&UdjdiX!c*LSɦYkuW[335vIldZs]+[*)%Z6[-233hC*e*TxaYYٽiKI-M-*)'IݢXT#J]'Im/a1+¿+0+LbZ\TF1TͱmB5UjS }ATϷ?}F>9&خF"n}MKvnU]]kp{pH%T}}ɴ=%/541dUeh5SjʣWA΂ݮKKu"o~)jp++e}pcjV2K)~&2<2p&LI1ɔLM'r%VMiKUbHRLɔc%YdLmWhtrԯ+ic*VLvVJRn]iX'~5|1m6oRY"iVUMX(|Sm:+k_˼1["bU& )_FD"VI$T TFA2L3əe+s̉q,O U*\ΒAU$U{]&@:/UD讬Ϛ$vO<@suWY2VZDW;_aJjdͷMic1b/Нj}'+)̾ɕ>fcOXʱ`ϭBɈɒv>($<~6v(aD )>iPuMLK TL0汥kLjDhҵKt1^LEUb?FX2o\*8)j;b^O2~dwIܽ(*-kkδ~`ڿfY-MO+/~w~5ڤx6ҽiEFVm1ծBc+B<ÎY\:jZwwwjm+YgPt?r:̘O _ϰQRGrR/F/{_0OOC&R}찑+48߮TMme(ԪHi" e%ZĢ),ʥXXRHĀ Mf2ʚtT;OqsObUM%{Ds,$GOI^]i0$LI08(+%Vb#*W 8RRK[j$Ե5%++YYeiYmZT2I-)eS[eT$e-f22gz=Z5Xh]حS)dy+%~Ddiw~ܞ U)>1>;Kx]5+FZ=oLdbUc*.#*Oj$!U>n|q K31%YO疕~ 12_V)LaVJm%dc*XdQavd`=/Y6ZMD[i)V1,V"17Yj `j*ZG.jw;J 8'IAĤG }i?kuU)L'é/c^olXY W$N%U~z)ک+cO~Klh1'楄k X7JԴ%9ĿVG3T:B~eU?s䇾C!.%*KeҒ*mpR, B)4J5u,ԩeSLӺn֫ۤɍ2[dPcc3R*,7VdTTfhd C%$$&Jd54&Pښ+Zj+sDR`d0% DYHajIe -ܥ0T02hc&L FP–UffYIJdɌd544ejWo3m۱,])U)^][yXV-"7To[kE=6 u֩WlEH]bc[s3.U~2~f%8hb)J )*YeHK,sҚY)M2U 49#KeOͧn%N*f*Iy-0njrKl ܒ+NiRp?"'w0Dܰ>q H, %LmW*pڱ-SS&48M9N'k,\r6iÆV4' 7i9m\)MV+m9icWSUtW%!B[~=?iJ²حSV%+حO}C)Iem&$ĸM 4YeV;k*}RI5S2̫3ZjYfeM@S2RʙFմ"mlқVmœ*1a1`K`)6Od%Z[ieg/ҭn~۳Tqw\X+~=o@U{MUZjN^jS벆1ƒɔVPJd$A/ wOOFvt;:ta\9m4Qَ:4Ԟni%O4ɽN$i(zYY47=VYf2Yy!{SW}SZܔ6%%ȾV]Xˑ*l&C/\-dI̍Ͷ/Shtd UbbrϦa*+b־/`HOT;JWl}5NpWbcYei5LYږf-iXKjR)fٖLTefa0b %e2eMB1,+oV+[<&8='h:%L&eʳ,4ʸds44暕8 8VK,s;Y8ܩRhYec'ukfɵ^vժi}5E2pMJyk)a}d;gA#rT,>dC%8jy%aҫui,&O{U^sܫe5eWRp-αZ\hwsk$K-K'=UUXbS2\CмỆWb^V%L,cɓR k(6Lbmc۟= 2Y2˗9;?E:7YY?c>t{?@DBrś2'?or lC!A 096>n]AtM?a¸x::'PphhOjE"R&%yЬp+sjɓwZnh.m][tW%cwg +MUttp Aєɦ<5:N:+1iaۖuhW[lMJcRr\+yrՎ)^Ngy9ip¼SNSTxjbpW]Zz:4-3)vWcA&ӻnubusѷWJv<熛4[u9V+dn^M7+m/WjtK,dS )J*ȴVO*q :=Jq1JSw}{ح:='TۣnsUѶM+Ւڶʧv6cNUጞSNƧF\1^sbjVÅncu.8iճS&Β;ò SLVSm`⫻e6139dD(pQЬLw:57f0֍&*y;"AC^,D=lO=h&0d?kn @=(?5ֲim&tqowǭ{]1kVcLfRfXsɌ2WVLg"9ReEʷYj(l+7YLquF#ZڍQ:p1MVto I**Z|#3݈3~-7b^罩4yþ'3^6ՋV^}9㙽649O٠a "y0y4i6ҘN >6pmOyiJb&Mb޷o* PBbLdH2 0gYFtjU8(Q7F8ׯ:I;#T|^ H*35>qc`P.dH D$U SCʗ1%v̆2}0wG6~i,U-( M&ԩ,X\^rKLfѫK%d|i6 Eɤɖ5,1WVex<0f |N988ikZ8EF~LZp˿<*Hrן_<$xeMDO|!쌔WpHQ; UK#)E[Yic%E llB->D~a;B1ĈxM5[t̍5n^Nwo7:tsVJ"L)$Bt̮ΫNxvfu8i><&C9G$=+{nVR7k[[\ww},[ۼ2d $ ~Uuk $Դڲe [fI Hd 1V19U)$.U4*Y+"/TVHKT֕fVmfVVU&$V L'UV %HPTRFV52Y+56ZVS%BPĩd!1$ij,JTԙfe,dmiO^]yk-4Z[Eb͔)RԭLYf*J7,\,bQV *Cc5R,Ժ9iU[uݍ<6M imګ]LV57+Բ_vt:f͹ۣ7uݫzUƭ1UiLV*GsF*Ulf&m,޲iFHfo\2h+jrɎ w=VMoIodc*h$DWbs,7%MM75 rjZTnU_USuuo*,v[% lYRE2-4o~Rz$LK,21&Eb$x,ü=!VO4LX9q&ri ELa2tO,(+,(e}l%O+)CVY%i, eM, ,+X`'7Ӣխyǫݴ>*dbV%1*jtpqxb+AZ$b$+,fHИXiVI,1*KB'y34&$f%bl\X"?".1i谁5B 10Q4;r2 ;W"Gj9[oH )&L2eoookcWhٝXfh\I CF >5y0r> g8Bj TǐbdQ9Pd(p@`BY20\%J=7Cz@lC%􏊂` gOcsBba[T֞*kXx8Up;śOz:K4yMGĵݗY\rU*I5vaZjծ]2crj:A"͌P'.!Xe6FMKtin-VE  #FD.\T+df2kTij77̺赦1~ 4Ĉq*`$1Q.Rx!KgYS]׽YyWi<;Eqp|`$& *lh`{ؘIOR m6U {u (^P% ƎRyv8˧ocZֲttrի[mp勦V6{mmi|".yvfs*$LpQ/`?#폒i4p_>oKR;6ʵǹ4<|1˚rk~9114ily:p6bbzdƼGk[XtZnsmje)͗-%^N38gg|;\'e,ݶص=o=gɬ'tt,^ϷOld| ~ 0L B.=Ă\U&r !fl9#P&>hC 8HuCDRQRRRJBq4pXiR,QJVTW2MAJTUd{#2_LHEJC^i K*ODGUY#O%nƲe1U}ZڱtF4OC¶\TՓdL\9'.tekk^Y5bZaZM_a,Id2}s/(eJ*d'y^y%tdSEzJ:RT%[r砦+&UOV0"B "|WRIF0bʼnz(TyYPLc1Jk8VgXG“Traj,qscO=Yaz}Ҡԩ`401˘vk^[Ob!ëiDH_J Q1 wFbcw@ "}O6+?qt+*R~~|BCb?.~1T2ci2!OSTr[NSCMiY57lœ-jVʌX껺U7nʹuv7[Vfҙ-VZe*QRRQSRhc)3Zo-6ݦoll[,b1 4`yVnW$6lʬ)TR %)$1Y2Udt|=}jtUe1*\C'JڎSCRB/S Y[jcM=wa#SP0)ԞnԥR%FOdB$T!ꇍK|U N'_mM+z WEL,ƒ%`mOO19*¯n_jʿn[}ִܶ' &/s>ɩc3&^c=/UX1kuY]k+'0ĈElIXud؝ӔĒꕤpbI,~Ӽ:#R:$IM%XbjEdCОMڎDY&!hj4Z!S$i ~ GqfQ*UEQUVN#s1QIJ1]JKˇ,iU%RÖ%B˥{&yy$ۮNX+Q)}1c+9b 'ޜO2⏐&U*\ P1`K,ԲVLGC&jx_d2dƦeW\& 1Ղq1+N*+ʩ󊶯㿴WSOe~cFLW35b+jji&1nb#ؖ$,K5$z}FɹնUD;?jYS&Q3lZ2"dK"1I=;GǜLBV0C"HZ/K(d d>?!!:&'*[䇒d>YOH^z,Y)5}X1Ve}$mLR؉H 8'289 =Yg|^{7uAA;C&%]˻vcygwXs7v3{uŖbs1mfi4Ō輦lc/>oڰr 1?,'$Ojƒ֦2iLSsUTMfi&Iae.Rʕd,6u[]oֺ_R$2rUea> (fi#k22fʰ,aTbY!PJhURYB)EHXRʓk-T҉b]f44ɦCRJ`rL2LbaQeU"yGQ`<槜Zgje[eOnS^{K~NylژsORwiK)0 Hެ(OŦ[i&-U325*-Vdc&%[X)ʛ{YUtZ>& [FѴZ -UqXd/Y>`_UU~EE@EVR)W0 d%hRI cdL#7,ARV%^-S%_OEe~ +驄WJڳ%ৱN|LI11GupWFW=5A!$'=9I4'BƚM5#UfX-1kuBW7uy-iB?ȇ(XikY$b?ȒGpTYV2bfvLWYkRi5 ̵H&1 w\bcQ@ bz@ 40_Ռ~i;m>{'gY$&ѓLV&[Sma2'dfdJqUzڬm+\g4JQ9'7YcƦ֋B}+<21]Clcaϊ e3)'%WៈJ"_4)$H<L+%=%vP$"%i!+jGy "0 TI )R??sND&Đ ?-I$IfI%hHl f-M$fF,H#Q6JMM$H, A`!bL-d K$ifAD[ 4h KEIq.-DIEIK-DH Ih fk$JJ##,5@ E$YEA dk&$2MHZIfѐKZ4m6BI] ADB"$4&jʹ1@H$6AQ!,HZ)@,$`$f2 (mDJ43Q Q T62Yd2 dmo{~- `5 5`$O>s,?:Z*˩87%q)OMw:lW:^_O'ÆĻ厝r:zclLO^CCI G'wQOE%}Dfʤ/>':) I+>u1U6?w'r=I ))O?|{H)IIommD ($ SRT79bئޅ76iMS&!liCJTʸ;Ld5Lq1̲cb|LWV2:;1ՎһCLE8dڷ<.y޳qWszWܱ%|㫤y<ku,Y;F*U}lYYt9z^jSdՈ1?œ$>?{#,f^ҮomCSB}9=ʘI9W])+1WP(E'=(0T>#~ߧʄ~u4?_%cf={jPzB&k׺w{PAI#RƟ|niN ȟ |I*s##\NQɆ|]w^e Ua )Jab1bLYTҩS*Tʦmmee%IdOg/{_*FѴmEYEEEEEEEEFͤdR Q`*,Ē޳?s3/'NNsuUaQ (IP&Ȓ-imh9*?(bV%YV f 2 D@ -#3 CX9Ws2IP ()HĞBwǨXp7ä&@݇%"& e( 5фChbL&JxpG)0RԂAA"iI-dIeơ;url C=|װ#_õS"H@IbEtֲ=-VIrnʲcr1սo5[jWgvq$[m˖]UލjG%y݉5oL['Lnǘ~_ڿo}mmE%*]oDjETkDO32܅5ra>'c?s?|Sd X(ތ"cc7u炨?8͙ǐQ&dd>^yQ my]iU'u3 m ˻YVܽv'|9g]gyXm&TϑqoEW\l"n#+ y]ʔ"x<\Q`X!QӋy>y,Myl41lb!V&C$yu+`3G9s^9 ,23ry}n<̫V==.ФSˢкYa]:d'E^`:|rǝgr,Op7't<[;jҫo9SĵtgUNLЯ EH3CPϕ$:w#sYt*PSi#lesA6m4uv;W+>F,ϙ34މ9FsN@9W}aύW=[R{Cҏ]MTȁ;$yzunLidU/2$n'^DG爃?4>iɯ>y=:7YM4s&Wg{z{t*eiR*})Eb am3{02zPeL.n#u8![r6R Yj'fr0ۥ72vUOPfe Tc*HPFM{^,y^;=a$tnb`?#%2'*E*6e!2 dim2A&u+̗ PaÂ-fWg;`WWwf-]W#|IzR2'0##]^ "KJhbq2f85 cѐw&7,̝+df_ wjX\:9<֩ Ҷ}=.^8O#N#r4{k|3+P\T̘aKGyIci<=:!ܬܷ3x*c@ܼKY-_Fgz=1;v{tn&x:7C;cJ,MfO"J p;oA`~8 ͢9Y,xsx[/jw S[ĔuKup sx<_Rim+UiH+oV`=Icˮ+=w/m},mO.Ǝkx]^Box(BdLʍƱXtw/R>|` oQu,<ï .vɲ~g]D~ǾzrFϪ7·W*Mq^z߳O3 #|?.c nIim#UuDZx׫ wRyZk%`:NU?gen[Y>9*wek%;o5q BNh5y=ӎu#ZoܵqqnYcL?ݧ 1]KcM#xΛq_+' DV-Ej$08[}\_|'>p^̌?چU3ih:nirICQn[FYՖg=Yר\f/t)^O$3^;Qy7A\~2;o;sjuoY9mϷrp+xV/u2/^M힚j{8Tkjnf{u^Eݮ>KZV/iu(Rڀ^ G:ͰYu%wڪނ;+xکjxl&O1gjnixdkk^ڳӦ𮭾ۍ cmvZ<~b9Oҕg~oE\'_o5ְ6K먜 OMέae0.闿{{m6s\/,b7U~У8=:W6&i?ZB'?,ٟn$[7;ΟgqqTWM0n .x˒Msf՛mɳ$zݪG'-@|35KgsO˫g8K?~~+B )#|m"8-ҝVɆ(ߤ -_ |{y, s`sG~ʵhu?'_UGi\ CfWwGi;W ͋|79K^:_=UoB>l-N]rmk{,="gKR>ed2[=S{._+ &Wjkwwqyx)>;/3/Z>-d?bwi3V6[mfg!ȨxچY~[jVk[|68 hosݭy޼vL3JzRHx]vg%[oNhkn)?|%엏XA{ퟵis魱L ':&KpuLTz[nܜYy}au=2T|D# Wj?wa欐7> 3GvJğU{jI"9Sn!nl+$I~nrEgo'; r%L^PzQ2ӭ$庸{g^ۏ1e5PeD@| ܁͵* BCTiC& OPF3SM4 Lѐɐ240A14ɠ  #Ld BIQdCC#@2 hjICIh4d=@!4M44ɠ'TɊ 4@e4XhBE @S](ݑ+kj/vLpchjedb,##0}gtۙ)Cq`S -2pFGqpH'_q#F~!M?-f3*-|5S&M dqsA,"^{_.n0Ik䃐vɃgXf_So0PjZ(viL2X̆?rԕb!Lj@qnP5$c5OIJ+m[lw9Nh.BLaɘ=Zy)YHHd ԲmMO,VQZQJӖI&fL!j" ) i,MܡF[$~, .gQ_{JFYm[dT&,QvtXj52jʹQWpOwCf2H" "H]K)pRTʦBЬ 2hڄ5rdA#n3Z0 ȣTmvPFɱ6۶oB-^嫿3$2VGMMܢ$,$R6e]v![B6f&X4?{WnO(ܤUɚk8-ЍM]`0M##rڄ?HE6}7$_Xl-Lֹg1 "ϛuϊCš!Xs-cD+/6^W)+G৛_"< 4) DZ"j>D2(4Cd@ @܄I(4 cC11%iF})UX4\FKo$P:xyBJD U0/nMhz$XŃhlxZZl?ÝVoYEǫ?ě4 uh+_~û_"zR1giM9ֈE i.ʃ1SjZ@5vym-=*` NBgJ%΅soj+س-jGI -񨡎0EQqIi2@pP-V!:`Ik # >ϡ3wL`y&e4uA}b1 LM@b99F7uRFrv޻#Yy aMG}.X&ZH'+LW/ %Jꙍ'&@t$V`;Hi"+# 3z^@uǫj NQL.=zAr,2G DK[[ oLwwzrVFn aFЋP64=yLWip>,h4T Ĝ9s8~$|"T  PZ 0kK#Դg0PP,}Zr@4Xcm )Á6 ͅAV1^펊҂􉧎 DfxKq=uUAe4|VnaYoS