ࡱ>     xo3  bjbj .bbSlEEE8FF6 GvM(MMMN.S4GT$V v۴TN"NTT۴CsMM%CsCsCsT8MMCsTCsCszN1MG 0uj=?EXFuL106p)q1CsIndhold  TOC \o "1-3" \h \z  HYPERLINK \l "_Toc185299654" Indhold  PAGEREF _Toc185299654 \h 1  HYPERLINK \l "_Toc185299655" 1 Indledning  PAGEREF _Toc185299655 \h 2  HYPERLINK \l "_Toc185299656" 2 Analyse  PAGEREF _Toc185299656 \h 3  HYPERLINK \l "_Toc185299657" 2.1 Valg  PAGEREF _Toc185299657 \h 4  HYPERLINK \l "_Toc185299658" 3 Systemdesign  PAGEREF _Toc185299658 \h 5  HYPERLINK \l "_Toc185299659" 4 Hardware dokumentation  PAGEREF _Toc185299659 \h 6  HYPERLINK \l "_Toc185299660" 5 Database dokumentation  PAGEREF _Toc185299660 \h 7  HYPERLINK \l "_Toc185299661" 5.1 Valg af databaseplatform.  PAGEREF _Toc185299661 \h 7  HYPERLINK \l "_Toc185299662" 5.2 Generelle noter omkring databasedesign  PAGEREF _Toc185299662 \h 7  HYPERLINK \l "_Toc185299663" 5.3 Tabel beskrivelse  PAGEREF _Toc185299663 \h 7  HYPERLINK \l "_Toc185299664" 6 SMS Protokol beskrivelse  PAGEREF _Toc185299664 \h 10  HYPERLINK \l "_Toc185299665" 7 Software dokumentation for embedded software  PAGEREF _Toc185299665 \h 11  HYPERLINK \l "_Toc185299666" 7.1 Generel beskrivelse, Embedded  PAGEREF _Toc185299666 \h 11  HYPERLINK \l "_Toc185299667" 7.2 IMEI  PAGEREF _Toc185299667 \h 11  HYPERLINK \l "_Toc185299668" 7.3 Mulige forbedringer  PAGEREF _Toc185299668 \h 11  HYPERLINK \l "_Toc185299669" 7.4 Funktioner  PAGEREF _Toc185299669 \h 11  HYPERLINK \l "_Toc185299670" 7.5 Definitioner  PAGEREF _Toc185299670 \h 13  HYPERLINK \l "_Toc185299671" 7.6 Variabler  PAGEREF _Toc185299671 \h 14  HYPERLINK \l "_Toc185299672" 7.7 Brugervejledning  PAGEREF _Toc185299672 \h 15  HYPERLINK \l "_Toc185299673" 8 Software dokumentation for Server software  PAGEREF _Toc185299673 \h 16  HYPERLINK \l "_Toc185299674" 8.1 Userguide  PAGEREF _Toc185299674 \h 16  HYPERLINK \l "_Toc185299675" 8.2 Beskrivelse  PAGEREF _Toc185299675 \h 16  HYPERLINK \l "_Toc185299676" 8.3 Funktioner  PAGEREF _Toc185299676 \h 17  HYPERLINK \l "_Toc185299677" 9 Software Dokumentation for web-software  PAGEREF _Toc185299677 \h 22  HYPERLINK \l "_Toc185299678" 9.1 TNTnet  PAGEREF _Toc185299678 \h 22  HYPERLINK \l "_Toc185299679" 9.2 Design  PAGEREF _Toc185299679 \h 24  HYPERLINK \l "_Toc185299680" 9.3 Layout.  PAGEREF _Toc185299680 \h 24  HYPERLINK \l "_Toc185299681" 9.4 Software dokumentation  PAGEREF _Toc185299681 \h 25  HYPERLINK \l "_Toc185299682" Ecpp moduler  PAGEREF _Toc185299682 \h 25  HYPERLINK \l "_Toc185299683" vrige filer  PAGEREF _Toc185299683 \h 28  HYPERLINK \l "_Toc185299684" 9.5 Web klient bruger grnseflade  PAGEREF _Toc185299684 \h 29  HYPERLINK \l "_Toc185299685" 10 Idriftsttelse af systemet  PAGEREF _Toc185299685 \h 30  HYPERLINK \l "_Toc185299686" 11 Accepttest Specifikation  PAGEREF _Toc185299686 \h 31  HYPERLINK \l "_Toc185299687" 1) Overordnet  PAGEREF _Toc185299687 \h 31  HYPERLINK \l "_Toc185299688" 2) Overvgnings enhed  PAGEREF _Toc185299688 \h 31  HYPERLINK \l "_Toc185299689" 3) SMS Server-software  PAGEREF _Toc185299689 \h 31  HYPERLINK \l "_Toc185299690" 4) Web-interface  PAGEREF _Toc185299690 \h 32  HYPERLINK \l "_Toc185299691" 12 Konklusion  PAGEREF _Toc185299691 \h 34  1 Indledning Vi har fet et projekt-oplg som bestr i at lave et overvgnings system, til at overvge flis fyre. Overvgningen skal ske gennem en server, hvilket betyder at vi skal have noget kommunikation op at kre, som kan sende dataene fra flis fyret, dertil har vi fet udleveret et Fargo maestro 20/100 som vi kobler til et picdem2 board gennem den serielle indgang. Vi laver et addon modul til pic boardet, som simulerer et flisfyr i henhold til opgaven. Serveren vil vre en dum server, som hndterer dataene som bliver modtaget fra overvgningsenhederne og gemmer disse i databasen, samt eksekverer kommandoerne som der bliver givet fra klienten. Klienten bliver web baseret og skrives i TNTnet. grunden til at vi vlger at lave den web-baseret, er at det efter vores mening er den mest hensigtsmssige lsning. Opgavefordelingen er som flger: Da vi har tre hovedomrder og vi har tre system-elementer har vi lavet opgavefordelingen sledes: Kevin tager sig af serveren Hedin laver hardware + embedded software Torben laver web software Dette er ikke en stringent opdeling da vi selvflgelig hjlper hinanden med de forskellige opgaver efter behov. 2 Analyse Producenterne af flisfyr og denne branche som helhed er endnu ikke net s langt mht. til interfacing og datakommunikation som andre automationsbrancher ssom pumpe-branchen, hvor kunderne konstant eftersprger flere muligheder for overvgning og styring. Hvis man kigger rundt p nettet og undersger de forskellige producenter af stokerfyr og lignende fyrtyper, s vil man opdage at de fleste af denne slags fyr har ganske vist en styringsenhed med en rkke sensorer og aktuatorer tilknyttet, som giver mulighed for at overvge og styre fyrets drift p en rkke forskellige parametre. Hvis man gr ind og kigger p billederne af de forskellige fyr kan man se at disse styringer ligner hinanden til forveksling. Mange af disse fyr bliver produceret af regulre smede-virksomheder hvor at man ikke kan forvente den at finde kompetencer inden for elektronik og programmering, kombineret giver dette anledning til disse to teorier: Et givent firma har udviklet standard general-purpose styringer til denne slags fyr og at producenten af fyret s kber sdan en styring og monterer p fyret. At en fyr styring er opbygget af en standard PLC (Programmable Logic Controller) og et standard displaymodul til en sdan plc. Derved kan man relativt let f tilkoblet de forskellige inputs og outputs og f det programmeret ved at konsultere en elektriker eller anden person med erfaring inden for automation. Kigger man p specifikationerne og databladende er der ikke meget der indikerer at man kan trkke data ud fra styringen der kan bruges i en overvgningsenhed som vores. Dog er der nogle enkelte der tilbyder data via et rs232 interface og et tilhrende windows program. Ud fra opgave oplgget lyder det ikke til at Serren AB er en decideret producent af anlg, men lyder mere som en virksomhed der tilbyder reparation og anden servicering af disse anlg og gerne vil udvide denne service med et fjernovervgningssystem. Hvis at et sdan system skal tilknyttes eksisterende fyr anlg vil dette betyde at Serren AB selv skal pmontere ekstra sensorer uden om den eksisterende styring og selv srge for videre behandling af disse data. Hvis datatudvekslingen skal optimeres skal man have fat i producenten af anlggene og bede om at f lavet mere et udvidet data-interface. Dette datainterface kunne laves p flere forskellige mder: En tt integreret lsning hvor kommunikations-enheden indgr direkte i styringen, enten p selv samme print, eller som en addon til printet hvor man p simpel vis kan f fat i de relevante data. Dette vil krve et meget tt samarbejde med producenten og vil ikke vre s fleksibelt mht. til frit at vlge mellem leverandrer. En anden mde kunne vre at dataene blev leveret via en kommunikations-snitflade i form a f.eks. et RS-232 og hvor man med simple kommandoer kunne aflse styringens parametre dog uden at komplicere selve styringens opbygning og modularitet. Den tredje mulighed var at man bad producenten om at levere dataene via en industriel fieldbus og implementerede overvgningsenheden som en form for gateway imellem GSM modemet og fieldbussen. Denne lsning vil ydermere have den fordel at vi kan indsamle data fra andre enheder ssom varme cirkulationspumper, aircondition anlg osv. Serren AB kunne ogs gre det, at i stedet for at de selv str for overvgningen, kunne de ogs gre det at de slger overvgningssystemet til de strre kunder, sledes at en stor virksomhed eller en offentlig organisation selv kunne overvge sine anlg. 2.1 Valg Opgaveoplgget har ikke givet megen mulighed for at vlge hvordan dataene kommer ind til vores system, s vi aflser dataene som 4 digitale samt en analog indgang. Med hensyn til valg omkring microcontroller har vi valgt en chip fra Microchips PIC18 serie da det var dn vi var fortrolige med og vi viste at den havde de moduler vi skulle bruge ssom seriel UART og A/D konverter. Valget af kommunikationskanal imellem PIC og Serren ABs systemer var enkel, da opgaven foreskriver at dataene skal transmitteres pr SMS via GSM modems. I projektet skulle vi ligeledes bruge en database til at opbevare de indkomne data. Blandt de mange forskellige kommercielle og frie lsninger der er p markedet, har vi valgt et open source produkt med navnet PostgreSQL. Som bindeled imellem databasen har vi valgt at lave et serverprogram implementeret i C++/MFC, igen p grund af at det var elementer vi havde forudgende kendskab til. For at forenkle Serren ABs idriftsttelse af systemet valgte vi at implementere den del af systemet der skal bruges til dataudtrk og administration, som et web-interface. Derved er selve udrulningsfasen nrmest lig nul, da der ikke skal distribueres software, komponenter til de enkelte ansattes PCer. Som platform til web-interfacet har vi eksperimenteret lidt og valgt en TNTnet applikationsserver, denne platform har to klare fordele set fra vores synspunkt: t, at vi kunne genbruge vores viden inden for C og C++ programmeringssprogene og to at da modulerne bliver kompileret til maskinsprog er det en meget mere effektiv platform og kan dermed klare flere sidevisninger p samme hardware end nogle af de andre muligheder. 3 Systemdesign Systemet bestr af en microcontroller baseret overvgnings-enhed, to sms modemer, en server, PostgreSQL database samt et web administrations modul baseret p tntnet. Overvgnings-enheden bestr af en PIC microcontroller der skal aflse analoge og digitale vrdier fra fyret. De data der skal mles er kedeltemperaturen(analog), power failure, fremfrings fejl, om tanken er ved at vre tom samt om hvorvidt at der er flammer i fyrets brndselskammer. P de digitale indgange er der placeret lysdioder s at slut-brugeren kan aflse status direkte. De aflste vrdier skal afsendes til serveren via SMS. De afsendte smser gives et unikt fortlbende nummer s at serveren kan identificere rkkeflgen. Konfiguration af enheden modtages pr sms. Serveren modtager data-rapporter fra enhederne via sms og gemmer disse i en PostgreSQL database. Serveren skal, nr den bliver trigget fra administrations-interfacet, kunne afsende konfigurations-sms'er til en eller flere enheder. Fra web interfacet kan kunden aflse de indkomne data, oprette og slette kunde-profiler samt trigge serveren til at afsende konfigurations-sms'er.  EMBED Visio.Drawing.11  4 Hardware dokumentation Vi har valgt at lave et addon modul til picdem2 boardet i stedet for at lave et design fra bunden, idet ingen af os har srlig meget styr p hardware, vi har dog lavet et diagram, se bilag XX, over hvilke komponenter p pic boardet vi bruger, sledes at det vil vre relativ nemt at lave et selvstndigt board. Addon boardet kan deles op i to sektioner, en som beskytter pic'en mod overspnding og en som simulerer I/O fra fyret. Diagrammer over disse to sektioner kan findes i bilag XX og XX. Grunden til at vi har sat en optokobler foran indgangene p pic'en er for at beskytte pic'en P den analoge indgang er vi hoppet over hvor grdet er lavest, idet vi ikke kan forsvare det hardware der skal til for at f lavet en galvanisk adskillelse mellem input fra fyret og indgangen p pic'en. Skulle det laves korrekt, skulle den variable spnding konverteres til en variabel strm, som derefter kres i gennem en liner optokobler. P den beskyttede side af optokobleren skulle den variable strm dernst konverteres tilbage til en variabel spnding, der kunne aflses med PIC'ens A/D converter. I den frdig udgave vil det dog vre mere sandsynligt at den analoge vrdi kom ind til pic styringen i form af en variabel strm i omrdet 4-20 mA. 5 Database dokumentation 5.1 Valg af databaseplatform. Vi har i dette projekt valgt at bruge PostgreSQL, som er en open source relational database mangagement system (RDBMS) som er fuld ACID compliant. ACID er en forkortelse for Atomicity, Consistency, Isolation og Durability og bruges til at beskrive hvor vidt at databasesystemet er til at hndtere database operationerne i isolerede blokke. Postgresql implementationen ligger sig tt op af SQL92/99 standarderne. 5.2 Generelle noter omkring databasedesign Da Serren AB tilbyder sine services til bl.a. institutioner og andre strre organisationer, er det vigtigt at en given kunde kan have mere end t fyr med n overvgnings enhed. Derfor er disse to entiteter splittet ud i hver sin tabel forbundet med en n til mange relation. Dette medvirker at kunden kan have lige s mange installationer som det er krvet og da hver installation har sit eget adresse-felt kan disse installationer vre fysisk placeret hvor som helst. For at sikre at alle dataene i databasen er konsistente og for at undg redundante data, er alle tabellerne normaliseret til 3. normalform. Normalisering er en flertrins proces som netop har til opgave at sikre et fornuftigt database design. For at gre designet simplere og effektivisere opslagene har vi valgt at udskifte de naturlige primre ngler med automatisk optllende tal-ngler. 5.3 Tabel beskrivelse Her beskrives tabellerne i databasen. For en grafisk reprsentation af tabellerne, se venligst bilag XX. Tabel: Customer Indeholder stamdata for Serren ABs kunder. 1 db row = 1 kunde. IDFortlbende heltal, primr ngleNameBeskriver kundens navn. Tekststreng af variabel lngde med maksimal lngde p 100 - herefter kaldet en varchar (max)AddressKundens postadresse. Varchar(255)PhonenrKundens telefonnummer. Varchar(30)ContactpersonNavnet p Serren ABs kontaktperson ved den pgldende kunde. Varchar(100) Tabel: Installation Beskriver installationen af en overvgningsenhed. En installation skal vre tilknyttet en kunde. 1 row = 1 installation IDFortlbende heltal, primr ngleDescriptionEt tekst felt hvor Serren AB, kan give den pgldende installation en kort beskrivelse eller et kaldenavn. Varchar(100)AddressAdressen p den bygning hvor installationen er monteret. Varchar(100)CustomerIDIDet p den kunde som denne installation er tilknyttet. Heltal, fremmedngle i mod customer tabellen.BoilertypeEn valgfri beskrivelse af typen p det fyr der skal overvges. Varchar(100)InstallationPhoneNrTelefonnummeret p installationen. Bruges bde til at identificere indkomne log-data, men ogs nr at der skal udsendes konfigurations smser til en installation. Varchar(30)IMEIIMEI nummeret p installationens GSM modem. Tekststreng med fast lngde p 15 tegn - herefter kaldet char(lngde)UpdaterateAngiver hvor ofte at installationen br afsende periodiske data-rapporter, angivet i minutter. Heltal.CommErrorIndikerer hvorvidt at installationen svarede tilbage p den seneste konfigurations sms. Boolean. Tabel: Logtable Indeholder de indkomne datarapporter fra installationerne. 1 row = 1 datarapport IDFortlbende heltal, primr ngleLogtimeTidspunktet hvor at datarapporten blev modtaget af serveren. Tidsstempel. TemperatureKedeltemperaturen mlt i grader Celcius. Heltal.FlamedetectorIndikerer hvorvidt at der var flammer I fyrets afbrndingskammer. Boolean.SolidFuelEmptyIndikerer om der var mere flis i flistanken. Boolean.ConveyorErrorAngiver om der var problemer med mekanismen til fremfring af brndsel. Boolean.PowerFailureAngiver om der var strmfejl p fyret. BooleanMessageNrHver bliver stemplet med et fortlbende nummer, dette nummer gemmes her. Heltal.InstallationIDIDen p den installation som denne logbesked er tilknyttet. Heltal, fremmedngle imod Installation tabellen. Tabel: Command Da web-klienten og serveren ikke kommunikerer direkte sammen, bruges denne tabel til at brugerne af web-klienten kan sende kommandoer til serveren. Desuden virker tabellen som en historik over allerede udfrte kommandoer. 1 row = 1 kommando IDFortlbende heltal, primr ngleCreatedAngiver hvornr at kommandoen blev oprettet. TidsstempelExecutedAngiver hvornr at kommandoen blev udfrt af serveren. Hvis at dette felt ikke indeholder en vrdi, betyder det at den endnu ikke er udfrt. TidsstempelCommandIDAngiver hvad der skal udfres. Er vrdien 1, skal der udsendes konfigurations smser til samtlige installationer. Hvis vrdien er 2 skal der udsendes en konfigurations sms til installationen angivet i nste felt.InstallationIDHvis CommandID er 2 bruges dette felt til at angive hvilken installation konfigurationen skal sendes til. Heltal, fremmedngle imod Installation tabellen. Tabel: Users Gemmer brugerkontiene til den administrative del af web-interfacet. 1 row = 1 bruger IDFortlbende heltal, primr ngleRealNameGemmer brugerens rigtige navn for at gre det enklere for brugeradministratoren at identificere den enkelte bruger konto. Varchar(100)UserNameIndeholder brugernavnet. Varchar(30)PasswordIndeholder brugerens kodeord, krypteret med en MD5 hash. Varchar(32)EnabledAngiver hvorvidt at kontoen er aktiv. Kan bruges til at gre en konto ubrugelig uden at fjerne den helt. Boolean.UserAdminAngiver om denne konto har rettighed til at administrere andre brugere. Boolean. Tabel: Config Indeholder de server konfigurationsparametre der skal kunne ndres via web-interfacet. 1 row = 1 konfigurations parameter. NameNavnet p parameteren. Varchar(50), primr ngle.ValueParameterens vrdi. Tekstfelt uden vre grnse. (datatype=text) 6 SMS Protokol beskrivelse Kommunikationen med vores sms modems foregr via RS232 og AT kommandoer. F.eks. AT+COPS? som bruges til aflsning af operatr. AT kommandoer er en de facto standard til kommunikation med modemmer, udviklet af Hayes Communications. Vi har valgt at lave vores egen protokol som overbygning til sms, som ser sledes ud. Data update fra fyr: ::::: eksempel: 4532:80:1:0:0:1 Konfigurations sms til fyr: :: Eksempel: 43:87654321:75 Conf ok pakke: Eksempel: conf ok 7 Software dokumentation for embedded software 7.1 Generel beskrivelse Hardwaren bestr af et picdem2 board med en pic18F452 mikroprocessor, hvor vi har lavet et addon modul til at simulere det input som et flisfyr skulle have leveret. Denne simulering bestr af fire on/off kontakter, et potmeter samt et sikkerheds kredslb, se bilag XX for diagram, til at beskytte pic'en mod overbelastning. For at kommunikere med serveren, har vi sat et Fargo Maestro 100 modem i RS-232/DB9 stikket p pic boardet, som vi kommunikerer med via rs232 med AT kommandoer. 7.2 IMEI Et IMEI nummer er et unikt nummer som alle GSM og UMTS telefoner har, ligesom en MAC adresse er unik for alle netkort. 7.3 Mulige forbedringer Pin koden er hardcoded i pic'en, det er en af de ting der eventuelt kan ndres p, sledes at man kan ndre pin koden fra serveren. En af de andre oplagte forbedringer vil vre at kunne lave et timestamp p sms'erne, f.eks. ved at pic boardet foresprger efter en opdateret tid/dato, nr pic boardet er frdig med init. 7.4 Funktioner void reset_recieve_buffer() Denne funktion bruges til at reset to message buffere med tilhrende countere, disse buffere bruges til at gemme de sidste to linjer data der er sendt fra modemet. void pic18_io_init() Her bliver portene som vi skal bruge p pic'en initialiseret, det drejer sig om RA0 til A/D input, RA5 til COM Error LED samt RB1-4 til digital input. void ad_init() Srger for at initialisere A/D registreret til at bruge RA0 indgangen, lave resultatet right justified, clear ADRES[H-L] for at vre sikker p at der ikke kommer en critical tilstand lige efter opstart fordi den tror at der er 90-100 grader i kedelen. void interrupt_init() Aktiverer alle de interrupts som vi skal bruge, hvilket er, timer1 og serial recieved interruptene. void timer_init() Bruger ekstern clock, prescale er sat til 1/8 og den udlser hvert sekund. Prescale betyder at vi slipper x/y af frekvensen igennem. Den eksterne clock er for vores vedkommende p 32,768KHz, hvilket vil sige at med en prescale p 1/8 s udlses TMR1 registrene 4096 gange i sekundet. Timer1 er en 16 bit counter, som bestr af to 8 bit registre, TMR1H og TMR1L. Vi har sat dem til EFFFh, som er 4096 mindre end overrun, hvilket vil sige at timer1 interruptet bliver udlst en gang i sekundet. void rs232_init() aktiverer den serielle forbindelse, samt stter baud raten til 1200. void modem_init() Henter IMEI nummeret fra modemet, sender en pin kode, hvis den mangler og sletter eventuelle sms beskeder, hvorefter pic'en venter p at f en OK tilbage fra modemet. void on_initial_recieve() Venter p at +WIND 11 findes i serial_recieve_buffer. Nr det findes i bufferen, s er modemet initialiseret, og global_modem_init bliver sat til 1 samt message bufferne bliver resat. interrupt interrupt_handler() Er vores hoved interrupt handler, som finder ud af hvilken interrupt der er udlst, hvorefter den tilhrende funktion bliver kaldt, derefter bliver interrupt flaget sat til 0 igen, og programmet fortstter hvor det slap. void serial_recieved() Bliver kaldt nr RCIF interruptet bliver udlst. Det der sker i funktionen er at den hlder det indkommende byte i global_serial_recieve_buffer. Der er dog nogle undtagelser, hvis det der bliver modtaget, er \n, s hopper vi bare ud igen, idet vi ikke kan bruge det til noget, det samme sker ved \r hvis det er den frste karakter der bliver modtaget. Modtager vi derudover en \r, s regner vi med at det var den sidste byte i denne omgang, og vi hlder indeholdet af global_message_buffer1 ned i global_message buffer2 og til sidst hlder vi indholdet af global_serial_recieve_buffer ned i global_message_buffer1, derved har vi gjort klar til at der kan modtages mere data, mens vi arbejder med det andet. void timer1_interrupt() Bliver kaldt hvert sekund, og tller global_time_counter samt global_emergency_counter 1 op. void update_lcd() Opdaterer lcd displayet 1 gang i sekundet. void send_update() Indsamler data fra flis fyret, lgger det ned i update variablen og sender det videre til send_sms() som hndtere selve afsendelsen til modemet. void send_sms(const unsigned char* payload) Beder modemet om at sende en sms med indeholdet i payload. Nr sms'en er sendt s bliver den slettet, fra modemet, og eeprom_writer() bliver kaldt for at gemme sms_counteren. void convert_temp() Omregner vrdien fra potmeteret til grader, og gemmer det i global_temp void eeprom_writer() Skriver telefon nummeret til serveren, sms counteren samt tidsintervallet mellem status sms'erne til eeprommen. void eeprom_reader() henter dataene ud fra eeprom'en som eeprom_writer() har lagt derned. void on_recieve() bliver kaldt i bunden af main loopet, for at tjekke om vi er frdige med at modtage noget data, er vi det, og det er en sms, s henter den sms nummeret ud fra det modtagende data, hvorefter den kalder void sms_recieved() og til sidst clearer message bufferne. void sms_recieved() starter med at bne den modtagende sms. Nr den har modtaget et OK fra modemet, s er hele sms'en hentet, og vi kan begyndt at dekode den. void Delay(int time) laver et delay p time tid i sekunder, time kan dog variere fra time til time-1, idet funktionen kigger p timer1 variablen, som udlser 1 gang i sekundet, s hvis time er 1, og Delay(int time) bliver kaldt 1ms fr timer1 udlser, s varer delayet reelt kun 1ms. void main() Er vores main loop, som krer det hele. De ting som krer i while(1) lkken er et tjek p om der er nogle kritiske tilstande, hvis der er, og global_emergency_timer er over 600 sekunder, s bliver der sendt en sms, til serveren. Den srger ogs for at der bliver sendt en status sms for hver X sekund, samt at reset global_emergency_counter. while(1) tjekker ogs om der er lavet ndringer i status intervallet ol. og fr skrevet det til eeprommen A/D konverteringen sker ogs i while(1) loopet. Sidst men ikke mindst s bliver on_recieve() kaldt fra while(1) som frnvnt. 7.5 Definitioner #defineforklaring.BUFFERbruges til at bestemme lngden p vores 3 buffere til at modtage/lagre modtaget data.PWRFAILpowerfail porten.FIREDETflammedetektor porten.FEEDINGfremfrings fejl porten.EMPTYTANKtom tank porten. 7.6 Variabler Dette er s en liste af vores variabler, samt en forklaring af hvad de bruges til. Variabel navn.Forklaring.unsigned char global_Pot_Hiindeholder ADRESH.unsigned char global_Pot_Loindeholder ADRESL.unsigned char global_serial_send[BUFFER]indeholder det data der skal sendes.unsigned char global_serial_recieve_buffer[BUFFER]indeholder in kommende data.unsigned char global_tempindeholder temperaturen i forbrndingskammeret i celsius.unsigned char global_message_buffer1[BUFFER]indeholder den nyeste frdigmodtagende linje fra modemet.unsigned char global_message_buffer2[BUFFER]indeholder den nst nyeste frdigmodtagende linje fra modemet.unsigned char global_message_buffer_length1indeholder lngden af message_buffer1 arrayet.unsigned char global_message_buffer_length2indeholder lngden af message_buffer2 arrayet.unsigned char global_lcd_buf[16]indeholder det data der skal skrives ud p displayet p pic'enunsigned char global_cell_nr[15]indeholder serveren telefon nummer.unsigned char global_sms_recieve_number[3]on_recieve() gemmer sms nummeret her, det er det nummer som skal bruges for at bne sms'erne i modemet.unsigned int global_serial_byte_countercounter til at holde styr p hvor meget data der er i global_serial_recieve_bufferunsigned int global_sms_counterholder styr p hvor mange sms'er der er sendt til serverenunsigned int global_time_counterbliver talt 1 op hver gang timer1 bliver udlstunsigned int global_emergency_counterbliver talt 1 op hver gang timer1 udlses, og sat til 0 hver gang der bliver sendt en kritisk sms.unsigned int global_time_intervalindeholder tidsintervallet mellem status sms'erneunsigned int global_imei_tversumindeholder den simple tversum af imei nummeretunsigned int global_temp_update_displaybliver sat = global_time_counter efter displayet er opdateret. displayet bliver kun opdateret hvis temp_update_display != time_counterbit recieve_donebliver sat hver gang en modtagelse er frdig.bit modem_initbliver sat nr modemet melder at det er klar.bit has_imeibliver sat nr imei tvrsummen er regnet ud. 7.7 Brugervejledning Under opstart af pic og modem lyser com error led'en... nr den slukker, s er systemet oppe at kre. Efter opstart, lyser com error lampen hvis der kommer en error fra modemet. Temperaturen i kedelen vises p displayet, og opdateres 1 gang i sekundet. 8 Software dokumentation for Server software 8.1 Beskrivelse Serveren i dette projekt skulle ikke vre et vrktj som vi plejer, men nrmere et bindeled mellem databasen og flisfyret, som s for en god ordens skyld kan skrive noget data i et logvindue s man kan se hvad der sker. Serveren er rimelig simpel opbygget, der er en seriel wrapper til at tage sig af det alt til det serielle (genbrugt fra tidligere projekt), en Server-Settings fil til at holde det data brugeren skal kunne ndre. En container fil til at holde de klasser og variabler jeg skulle bruge rundt omkring i projektet, og en trd der str og kalder alle de ndvendige funktionen, hvis der er brug for dem, trden ligger i CFlisfyrDlg som er min hovedklasse. 8.2 Brugervejledning Nr Serren AB starter deres serversoftware har de 3 valgmuligheder, fordelt p 2 knapper: Start: Denne knap starter med at tjekke om det er ndvendigt at sende en pinkode til modemet, hvis det er det bliver den sendt og vi venter p modemet er klar, hvorefter vi fortstter start fasen. Hvis ikke det er ndvendigt med en pinkode hopper vi direkte til start fasen. I startfasen starter vi med at lse i databasen hvad serverens eget telefon nummer er, skriver det p skrmen og starter main trden som ser efter data p den serielle port, lser i databasen om der skal sendes config smser osv. Close: Bruges til at lukke programmet pnt ned. Ved at lukke seriel og database connection og stopper main lkken. Server-Settings.ini er en fil der skal ligge i rod mappen til server softwaren, hvor man kan ndre host, database, user, password for databasen, og vlge hvilken COM-port programmet skal bruge. 8.3 Funktioner  OnInitDialog: I denne standard oprettede funktion vlger jeg at kalde StartSerial() og DBConnect, samt stte min sms counter til 0. AppendText: Da jeg ofte havde brug for at tage den tekst der var i log vinduet og tilfje en ny line og noget nyt tekst valgte jeg at lave en funktion jeg kunne kalde med den streng der skulle tilfjes i den nye linje under teksten. Da jeg alligevel har fat i alt tekst der skrives her bliver der ogs sat et tidsstempel p s det er til at se hvornr der sidst kom noget ind. Her hndterer jeg ogs autoscroll, da det normalt reagere p enter fra brugeren. CheckAcknowledges: Denne funktion bruges til at tjekke op p om der er get over 5 minutter siden vi sendte konfigurations smsen ud og der ikke er kommet svar. Frst ser vi om der er get 300 sekunder eller derover, hvis der er det tjekkes der for om der er sendt 1 retry sms ud. I tilfldet at der er sendt 1 retry sms ud vil commerror p installationen blive sat til true i databasen, hvilket resultere i installationen vil st under critical p web siden. Hvis der ikke er blevet sendt en retry sms, vil der blive sendt en og counteren tlles op, samt der vil i log vinduet blive skrevet Retry send config to . DBConnect: I denne funktion indlser jeg data fra Server-Settings filen og opretter forbindelse til databasen. DBReadCommands: Denne funktion gr ind i databasen og ser i command, hvis den stder p en linje hvor der ikke er sat nogen executed tid p returnere den id, commandid og installationid til en data container til senere brug. DBReadPhone: Denne funktion bliver kaldt med et installationsid for at kunne hente det rigtige telefon nummer, imei nr, update rate og id p installationen, og returnere det til en data container klasse. Hvis der bliver sendt et 0 med som installations id vlger den at hente hele listen frem, da de s er tegn p vi skal sende en config sms til alle installationer. DeleteSms: Denne funktion kaldes nr vi lukker serveren, og nr vi har modtaget et fastlagt antal smser, den sender en at+cmgd=1,3 kommando ud til modemmet for at slette alle lste, sendte og usendte smser. HandleAcknowledge: Hvis vi modtager en conf ok besked kalder vi denne funktion med afsenderens telefonnummer, derefter leder vi vores liste igennem efter frste forekomst af dette nummer, som vi s sletter fra listen. keepaliveandread: Vi havde skrevet i kravspecifikationen at serveren skulle hente sit eget telefon nummer i databasen, og at den ville lse i databasen hver 15. Minut for at holde sig i live. Det blev denne funktion oprettet til. Frst prver jeg at kre sql strengen select name, value from config;, hvis det lykkedes smider jeg det hentede data i en container til senere brug. Hvis der af en eller anden rsag ikke kan fs forbindelse med databasen, lukker jeg forbindelsen og bner den igen. OnBnClickedClose: Frst sttes continueThread til 0, for at stoppe main trden i at kre videre, s bliver DeleteSms() kaldt for at rydde op. Efter en pause ser vi om der er bent for en seriel forbindelse, som vi s lukker hvis der er, og det samme sker med database forbindelsen. Til slut lukker serveren ned. OnBnClickedStart: Frst Skrives der i logvinduet at vi tjekker og indstter pinkode hvis ndvendigt, hvorefter vi kalder SetPin(), s flusher jeg data p den serielle port inden jeg fortstter. Variablen continueThread sttes til 1, keepaliveandread() kaldes, der skrives til logvinduet (Server phonenr read from db: + ) og main trden bliver kaldt. readFrame: Er en lille worker funktion til at lse dataen p den serielle forbindelse, og putte det i en vector som derefter returneres. runthread: Her ser vi efter om continueThread er forskellig fra 0, hvis den er det krer vi MyMainThread(). MyMainThread: Dette er selve hoveddelen af programmet. Vi starter med at se om der er data i k p den serielle forbindelse. Hvis der er data i k, lser vi det ind og ser om det er et + i teksten, da det vil indikere at vi har fet en modem kommando ind. I tilfldet der er et plus splittes teksten op i command og tekst, samt stter en bool til true for at markere vi har en plus kommando til senere. Efter vi har splittet dataene, ser vi om teksten er ok eller error, da det er beskeder der kun skal sendes til logvinduet. Hvis plus boolen er true, ser vi om command indeholder cmti eller wind. Ved cmti: starter vi med at lede efter et , som kommer lige fr tallet der indikere hvilken sms der er kommet ind, nr vi har fundet det , stter vi smscount til alt til hjre for det og fjerner : fra enden. S generere vi AT kommandoen og sender den af sted, og efter en lille pause kalder vi ReadSms(). Ved wind: denne del er sdan set mest lavet som en lille fail safe, hvis vi skulle vre s uheldige at f en ekstra besked ind fra modem startup. S hvis vi fr sdan en skriver vi til logvinduet Wind modtaget og teksten som vi modtog. Ellers skriver vi den tekst vi har modtaget til logvinduet. Vi tjekker ogs op p om ResetSms er net til 20, i hvilket tilflde vi kalder DeleteSms() og skriver til logvinduet Smser slettet da vi nede grnsen. Der tjekkes igen om p om continueThread er positiv, hvis dette er tilfldet kalder vi DBReadCommands og splitter dataen op, samt omregner commandid til en int som vi kan tjekke op p, i tilfldet at inten er over 1 er det et tegn p vi skal bruge det installationsid der er i containeren, ellers skal der nemlig sendes en config sms ud til alle. Derefter kalder vi sendconfig(). Efter config er blevet sendt holder vi en pause, og kalder CheckAcknowledges(), efterfulgt af endnu en pause. Til sidst i main trden ser vi om der er get 900 sekunder eller derover, hvis dette er tilfldet kaldes keepaliveandread(). ReadSms: Nr vi nr ind i readsms funktionen er AT kommandoen, til at gre det, allerede blevet sendt, s vi starter med at holde en rimelig lang pause, for at sikre os hele smsens indhold er i den serielle k. Derefter lser vi den og skriver den p skrmen samt sender den videre til SmsSplit(). SendConfig: Frst ses der efter om commandid er 1 eller noget andet, hvis den er 1 kaldes inst = DBReadPhone(0); ellers kaldes inst = DBReadPhone(InstallationsID); som beskriver om det er en eller alle der skal have tilsendt en config sms. Derefter fyldes telefonnummer, imeinummer og updaterate i strenge. S udregner vi tvrsummen af imei nummeret, som vi bruger s modtagerne kan se det er en config sms til den. Derp kaldes SendSmsHead() med telefonnummeret. Som det nste opbygges smsdataene, med den udregnede tvrsum, servertelefonnummer og updaterate, som bruges nr vi kalder SendSmsData. Til sidst tjekkes op p om IDnr er forskellig fra 0, da vi s skal tilfje installationsid og telefonnummer til listen over hvem der har fet tilsendt en config sms. SendSmsData: Efter SendSmsHead har taget sig af delen med at taste at kommandoen og indstte nummeret bliver der herfra sendt den data af sted der er blevet vedlagt i en vector, nr alle dataene er sendt ud til modemmet med de sm pauser sendes kommandoen 0x1A svarende til CTRL+Z, hvilket indikere for modemmet at vi er frdige med at skrive smsen og den skal sendes af sted. Modemmets svar skrives derefter til logvinduet. SendSmsHead: Her starter jeg p at sende smserne, frst bliver der skrevet en del af ATkommandoen til modemmet (at+cmgs=), derefter sender jeg det telefonnummer som blev sendt med da funktionen blev kaldt, og det hele afsluttes s med at stte et og et carriage return p, og holde en lille pause. SetPin: Her starter vi med at sende at+cpin? kommandoen ud, og afventer svar. I tilfldet at modemmet nsten lige er blevet startet op vlger vi at sge efter +cpin: i dataen fra den serielle port, da der sendes noget data vi ikke skal bruge lige som modemmet starter. Hvis modemmet returnere +cpin: sim pin lses der i Server-Settings filen og at kommandoen genereres (at+cpin=2595). Dataen sendes af sted og vi starter en lykke der venter p at f wind: 11 tilbage, hvilket indikere at modemmet er oppe og kre. Hvis modemmet returnere +cpin: ready skriver vi No pincode needed og hopper hurtigt videre. Der er selvflgelig ogs muligheden at vi fr noget uventet data tilbage, hvilket vil resultere i der i logvinduet vil st Error in set pin part of the code. SmsSplit: Her modtages smsen som den sendes fra modemmet, s jeg starter med at hente afsenderens nummer ud, og fjerner derefter alt fr den egentlige besked. Frst tjekkes beskeden for om den er conf ok, hvis dette er tilfldet gr vi videre til HandleAcknowledge med afsenderens nummer. Ellers sikre vi os at dataen er inden for de rammer vi har specificeret i vores interne sms protokol. Nr smsen er sluppet igennem dette tjek bliver den delt op ved flere gange at blive sendt igennem Splitter(). S bliver installationsid p afsender telefonnummeret fundet, og det medtagede data puttes i logtabellen. Og der skrives i logvinduet Sms added to Log. Splitter: Splitteren har en reference til de data den skal arbejde med, den sger efter : i teksten og returnere teksten til venstre for det, og stter den data referencen peger p til alt til hjre for :. StartSerial: Jeg starter med at lse i Server-Settings filen hvilken COM-port der skal bruges, og bner derefter den serielle forbindelse med en fastlagt baud rate p 1200. De 1200 blev valgt for at holde det ens p server og pic. tversum : Denne funktion bruges nr vi skal sende en config sms til installationerne, da vi har valg at de ikke skal reagere p smser hvis ikke den starter med tvrsummen af deres imei nr. s vi sender imei nummeret vi har fra databasen ned og ligger dem sammen tal for tal, og returnerer resultatet. writeFrame: Writeframe er lavet til at tage en vector med noget data, og skrive det til den serielle forbindelse, men nogle sm pauser s modemmet ikke bliver forpustet, hvorefter det hele sluttes af med at sende en carriage return og endnu en lille pause. 9 Software Dokumentation for web-software 9.1 TNTnet Da vi har valgt en ret ukendt platform til at basere vores web-interface p, vil vi bruge lidt plads p at beskrive hvad det er og hvordan det virker. TNTnet er en http applikationsserver hvor at man programmerer sine sider og moduler i C++. C++ er er ikke just et sprog man normalt forbinder med udvikling af web-sider da man inden for dette felt har haft en prference for fortolkede sprog s som perl, php eller visual basic eksekveret under ASP containeren og senest har pyton og ruby meldt sig p banen. Dermed ikke sagt at (semi-) kompilerede sprog ikke har vrt brugt fleks er Java ret udbredt i form af JSP & servlets. TNTnet bestr af flere forskellige komponenter. Frst og fremmest bestr det af en selvstndig http server som har til opgave at modtage foresprgsler fra brugeres klient (browser) og udlevere det nskede dokument, hvad enten det er i form at noget statisk indhold ssom et billede / html dokument, eller om det er en dynamisk side der skal eksekveres for at genere outputtet til brugeren. En dynamisk side kaldes i tntnet termer for et modul, og disse moduler ligger som kompileret c++ i dynamiske biblioteker (dynamic shared libraries). Disse libraries indlses i hukommelsen og fjernes igen alt efter behovet, dog er levetiden af en ikke lngere brugt klasse konfigurrbar. De indkomne foresprgsler bliver dispatched sledes at de hver isr bliver varetaget i en separat trd, dette er selvflgelig den mest effektive model, men medvirker samtidig at hvis man i sit modul skal vre sikker p at det kode man nu laver er trdsikkert. TNTnet serveren kan afvikles p en bred vifte af unix-lignende operativsystemer. Dernst er TNTnet ogs en samling software biblioteker og klasser som varetager mange af de funktioner man har brug for i forbindelse med udvikling til web, ssom parsning af input, generering af output, hndtering af HTTP headere, cookies og sessions. Dette bibliotek indeholder ogs de klasser og interfaces der er ndvendige for at lave et side-modul som http-serveren kan indlse og eksekvere. Desuden er der et database bibliotek som implementerer et database abstraktionslag, sledes at man ikke selv skal hndtere de enkelte database-APIer ssom libmysqlclient(MySQL) eller libpq (PostgreSQL). Dette bibliotek implementerer ogs en ensartet tilgang til database metodikker ssom transactions og prepared statements. For at programmere til tntnet skal man implementere hver modul som en klasse der nedarver fra tntnet::Component. Men for at undg at man skal kende alle detaljerne omkring denne klasse og metoden til at registrere sine klasser med hoved applikationen , men ogs fordi at mange web-udviklere kan lide at blande deres HTML kode med deres eksekverbare kode. For at hndtere dette har tntnet udviklerne lavet et srligt format kaldet ecpp. En ecpp fil er basalt set en almindelig html fil, hvor at man opbygger sit modul med almindelige html koder, disse formaterings koder kaldes ogs for tags. Denne html-tilstand kan brydes med nogle specielle tags som ecpp formatet specificere hvormed at man kan skifte mellem html og c++ kode tilstand, p samme mde som php og asp har deres egne specielle tags til disse tilstandskift. Dette illustreres bedst med et lille eksempel: Dette format kan selvsagt ikke fortolkes direkte af en c++ compiler da det ikke lngere er et standard c++ format. Derfor skal ecpp filen frst igennem en ecpp compiler. Denne compiler tager ecpp filen og ud fra indholdet genererer den en klasse der nedarver fra tntnet::EcppComponent, der igen er nedarvede fra tntnet::Component og dermed passer ind i tntnet serverens eksekveringsmnster. Outputtet fra ecpp compileren er standard C++ og kan dermed kompileres til objekt filer der kan linkes sammen til et shared library, der kan indlses af tntnet serveren. Relationen mellem .ecpp og .cpp filerne er den samme som relationen mellem .jsp og en servlet komponent for dem der er bekendte med denne type Java-udvikling.  EMBED Visio.Drawing.11  9.2 Design Opbygningen af web-delen er splittet ud p mange separate moduler for at gre kodningen af det enkelte modul simplere. Datatilgngeligheden er lavet sledes at alle medarbejdere hos Serren AB kan g p sitet og aflse de indsamlede data og kontakt informationer omkring de enkelte kunder. Hvis at det er ndvendigt at ndre informationer vedrrende en kunde eller kundens installationer skal man logge p systemet. Dette system har sit eget modul til brugergodkendelse og kan derfor ikke godkende brugere op imod andre systemer. Godkendelse op imod f.eks. en LDAP server kunne komme p tale p lngere sigt. De brugere der kan logge p systemet kan opdeles i 2 kategorier Almindelige administrations brugere. Brugere med denne profil kan oprette, ndre og slette brugere og deres tilhrende installationer. Udsende konfigurationer til n eller alle installationer. ndre serverkonfigurations parametre. Superbrugere, der ud over at kunne det samme som den almindelige bruger ogs kan administrere bruger accounts. Af sikkerhedshensyn br passwords aldrig sendes i klartekst og det gr de selvflgelig heller ikke her, da de alle kodes til en MD5 hash i browseren og da md5 er en envejs algoritme har hverken web-server eller databasen nogen id om hvordan at passwordet ser ud i klartekst-form. Hvis at man har brug for mere sikkerhed vil det vre et oplagt valg at kre web-applikationen via Secure Sockets Layer (SSL). Webapplikationer er forskellige fra traditionelle programmer, idet at dataene i princippet kun lever i de millisekunder at eksekveringen finder sted, kan der ikke gemmes tilstanddata internt i programmet. Derfor er den slags data ndt til at blive leveret fra request til request via browseren, som s sender dataene tilbage i form af request variable eller cookies. Login data br iflge vores mening ikke sendes frem og tilbage i denne form s derfor bruges der en metode kaldet session data, hvor at web-serveren genererer en unik id som sendes til browseren som en cookie og derved returneres ved hver efterflgende request. Nu kan session afhngige data gemmes i server softwaren i et dertil indrettet omrde som laver en mapning imellem session-iden og de gemte data. Levetiden af disse sessionsdata kan konfigureres i tntnet serveren, og er fra vores side sat til 10 minutter. Dette medvirker at en bruger automatisk logges af administrationsdelen efter 10 minutters inaktivitet. 9.3 Layout. Layoutet er lavet i et simpelt, nrmest klassisk design, med en navigationsmenu i venstre side og selve indholdet i hjre side. Da vi ikke har kendskab til Serren AB og ikke har haft adgang til brevpapir eller lignende materiale fra firmaet har vi ikke kunnet afkode firmaets grafiske profil og har vret ndsaget til selv at fastlgge farvevalg mm. For at ge lsbarheden er der til selve indholdet valgt sort tekst p hvid baggrund, imens menuen er hvid p rd baggrund som ligeledes str i skarp kontrast til hinanden. Vi har valgt at bruge en almindelig serif font til indholdet, p nr teksten i temperatur grafen hvor at vi bruger billed-generatorens standard font. Al html koden er lavet sledes at det opfylder html 4.01 transitional standarden, og kan succesfuldt valideres med www konsortiets html valideringsmaskine ( HYPERLINK "http://validator.w3.org/" http://validator.w3.org/). For at vre sikker p resultatet er det desuden blevet afprvet i en rkke forskellige browsere: Mozilla Firefox 2.0, Internet Explorer 6 & Opera 9.20 9.4 Software dokumentation Ecpp moduler Se bilag XX for en grafisk reprsentation af flowet imellem komponenterne. header.ecpp & footer.ecpp Disse to filer har til opgave at generere alt indledende og afsluttende html der skal bruges i alle de vrige moduler. Header opbygger hele menuen og ud fra om den aktuelle bruger er logget p genereres de relevante menupunkter til administrationen. Header srger ogs for at stte to http headers som tvinger browseren og eventuelle proxy-servere til altid at hente en ny udgave af et givent dokument fra web-serveren, sledes at vi ikke risikerer at brugeren ser gamle data. Det er op til det enkelte modul at srge for at disse to bliver kaldt p det rigtige tidspunkt. index.ecpp Et modul som ikke har andre opgaver ud over at vise en velkomstside samt at prsentere menuen for brugerne. critical.ecpp Viser alle installationer som enten har en kommunikations-fejl eller hvor at en eller flere parametre i den seneste indkomne sms er inden for det kritiske omrde. Dette gres ved frst at finde alle installationer og itererer over denne liste hvor efter at seneste sms udtrkkes for den enkelte installation. Hvis at dataene er kritiske skrives de kritiske vrdier og der linkes til installationdetails.ecpp. customerlist.ecpp Laver en liste over alle kunder registreret i systemet. For hver kunde udskrives kontakt informationer og en liste over de tilhrende installationer. Hver installation linker til installationdetails.ecpp. installationdetails.ecpp Modtager et installations id som argument, og ud fra dette id vises frst alle de essentielle data vedrrende den pgldende installation, de fleste data vises direkte i deres tekstform men indikationen af hvorvidt at der er kommunikationsfejl vises vha. bullet grafik komponenten. Dernst vises en temperatur kurve via et billed-link til temperaturegraph komponenten. Nederst p siden udskrives alle de indsamlede logdata i omvendt kronologisk orden, med grafisk fremhvning af parametrene sfremt nogle af disse er i kritisk tilstand. temperaturegraph.ecpp Dette modul fr ligeledes et installations id med som argument og bruger dette id til at finde de seneste 20 temperaturmlinger fra den pgldende installation og plottes i en kurve. For at f dataene til at st i en hensigtsmssig rkkeflge nr at de skal behandles udtrkkes de frst i en indre subquery hvorefter at min ydre query bare har til opgave at vende rkkeflgen. Dataene plottes i et billede via et 3. parts bibliotek kaldet libgd, som er et general purpose grafik bibliotek. Med dette bibliotek kan man oprette et billede fra bunden af eller indlse et eksisterende billede i hukommelsen. Nr man har et billede i hukommelsen, kan man s bruge funktionskald til biblioteket for at f tegnet forskellige grafik elementer ssom prikker, streger, cirkler, skrive tekster osv. Nr billedet er frdigt beder man biblioteket om at generere et billede til et specifikt output format (gdlib kan generere til bl.a. jpeg, png og gif) og angive hvorvidt dataene skal skrives direkte til en fil eller til et omrde i hukommelsen. Temperaturegraph har 3 forskellige faser / stadier. I frste fase oprettes billedet som et blankt billede. Der skrives overskrift og der tegnes markerings linier for hver 10. temperaturgrad. I anden fase trkkes dataene ud fra databasen og hvert punkt plottes i form af en firkant p 3x3 pixels. Hvis det nuvrende punkt ikke er den frste, tegnes der en linie fra det forrige punkt til det nuvrende. Sidste fase er at generere et billede i png-format ud fra libgds interne bitmap-buffer. Png billedet laves med en kompressionsgrad p 1, hvilket giver det bedste forhold imellem tiden det tager at lave billedet og billedets strrelse mlt i bytes. Billedet, der genereres til en ram-buffer, udskrives direkte til TNTnets output stream. login.ecpp Dette modul virker p sin vis p samme mde som mange af de vrige komponenter i administrationsdelen i det at modulet har til opgave bde at generere en formular til indtastning af data men den skal ogs tage imod de indtastede data nr at disse indsendes og behandle dataene. Formularen bestr af felter til hhv. brugernavn og password. Nr brugeren trykker p submit knappen krypteres passwordet med en md5 hash algoritme og dataene sendes tilbage til login komponenten. Nr login-dataene modtages verificeres disse i databasen og hvis at de var valide sttes session data der beskriver brugeren og browseren omdirigeres til index.ecpp. logout.ecpp Dette script Ryder alle sessionsdata omkring brugeren s brugeren fremstr som vrende ikke-godkendt og bliver omdirigeret til index komponenten. adm_customer_list.ecpp Dette er den frste komponent i administrationsdelen. I denne komponent, ligesom alle de vrige administrationskomponenter, undersges frst de tilhrende sessionsdata for at undersge om browseren der foresprger siden har en gyldig login-session. Hvis ikke omdirigeres til index. Dernst trkkes en liste af kunder fra databasen og udskriver disse til brugeren. For hver kunde laves der link til hhv. formularen til ndring af kunde data og en liste over kundens installationer. adm_customer_edit.ecpp Denne side bruges bde til at oprette nye kunder og til at ndre i eksisterende kunders stam-data. Om der skal laves det ene eller andet afgres ud fra det kundeid der overfres sammen med det frste kald til siden. Hvis idet er 1 s er det en ny kunde, ellers er det en eksisterende. Der opbygges en formular til indtastning af felterne navn, adresse, telefonnummer og kontakt person. Inden dataene indsendes valideres de med et JavaScript der undersger om kundenavn er p 3 karakterer eller mere. Grunden til at der ikke krves flere data end dette ene felt er at vi gr ud fra at disse stamdata ndvendigvis ogs m optrde andre steder i Serren ABs systemer, f.eks. i deres bogholderi-system. Hvis at det er en eksisterende kunde vises en knap til at slette kunden via adm_customer_delete, men brugeren sprges frst for at undg fejl-sletninger. Nr dataene bliver indsendt kigges frst p om det er en ny eller eksisterende kunde og fra dette enten oprettes en ny kunde profil i databasen eller den eksisterende kunden tilrettes med de indsendte data. Sfremt det var en nyoprettelse omdirigeres der til kunde-oversigten. adm_customer_delete.ecpp Denne komponent fr et kunde id og sletter den tilhrende kunde-profil i databasen og der omdirigeres til kunde oversigten. adm_installation_list.ecpp Denne komponent fr overfrt et kunde id via request URLen. Ud fra denne kunde id findes alle kundens installationer og disse vises i en liste hvorfra der linkes over til adm_installation_edit.ecpp. adm_installation_edit.ecpp Dette er en kombineret oprettelses-/ndringsformular og databehandler p samme mde som adm_customer_edit komponenten. De relevante data trkkes ud fra databasen og vises i formularen (medmindre at det er en nyoprettelse). Nr at dataene skal sendes tilbage til serveren via formularen verificeres de i et JavaScript ud fra flgende kriterier: Den generelle beskrivelse af installationen skal vre p 3 karakterer eller mere. Telefonnummeret skal vre et tal og hvis det ikke er 8 cifre langt sprges brugeren om det er det korrekte nummer. IMEI nummeret skal vre et tal og skal vre p 15 cifre. Opdateringsintervallet skal vre et tal og skal vre mellem 5 og 250. Ogs ved dette modul er der mulighed for at slette en installation via en knap (udfres i adm_installation_delete) Hvis det var en nyoprettelse omdirigeres til adm_installation_list komponenten. adm_installation_delete.ecpp Sletter den angivne installation fra databasen og omdirigerer til adm_installation_list.ecpp. adm_user_list.ecpp Frst kigges p om sessionsdataene beskriver en bruger der er logget ind med privilegier der omfatter brugeradministration. Dette tjek udfres ligeledes i adm_user_edit.ecpp og adm_user_delete.ecpp. Derefter vises en liste med alle brugere oprettet i systemet, og for hver bruger linkes til adm_user_edit.ecpp. adm_user_edit.ecpp Dette er en multi-funktions komponent p samme mde som adm_customer_edit.ecpp og adm_installation_edit.ecpp. Hvis der skal vises data for en eksisterende bruger hentes disse fra databasen dog ikke passwordet og vises i formularen. Inden formular-dataene sendes valideres de ud fra flgende kriterier Brugernavn m ikke vre blankt Hvis det er en ny bruger, m frste password felt ikke vre tomt. Hvis frste password felt indeholder en tekst-streng skal andet felt indeholde den samme streng dette er for at undg et fejltastet password. Hvis dataene gr igennem valideringen og der er data i frste password felt, s krypteres disse med MD5 og andet password felt ryddes. adm_user_delete.ecpp Sletter den angivne bruger og omdirigerer til adm_user_list komponenten. adm_send_config.ecpp Denne side har to formularer der giver mulighed for at udsende konfigurationssmser til henholdsvis alle tilkoblede installationer eller en enkelt installation som brugeren vlger i en drop-down boks den sidstnvne drop-down boks genereres i funktionen createInstallationSelector() i starten af filen. I bunden af siden vises hele kommando-historikken fra command tabellen sledes at brugeren kan se hvornr der sidst er udsendt smser og hvilke der er i k til afsendelse. Begge formularer indsender dataene til adm_send_config.ecpp og i begge tilflde vil dataene blive indsat som en ny rkke i command tabellen. adm_server_config.ecpp I dette modul har brugeren mulighed for at ndre de server parameter der er almindeligt tilgngelige hvilket p nuvrende tidspunkt kun er serverens telefonnummer. bullet.ecpp Dette er en billed-generator der genererer den farvede kommunikations indikator lampe der bruges i installationdetails komponenten. Komponenten modtager den nskede farve og strrelse og genererer et billede vha. libgd og returneres som et PNG billede. template.ecpp og adm_template.ecpp Disse to filer er skabeloner der kan bruges sfremt det skulle blive ndvendige at oprette enten en almindelig/offentlig komponent eller en administrations komponent. vrige filer dynamic/common.h Denne fil er hjemsted for nogle generelle udvidelser til C++ std::string da denne klasse fra naturens side ikke er udstyret med funktioner til at borttrimme mellemrum og andre fyld-tegn. bool iswhitespace(unsigned char ch) angiver hvorvidt en given char er et blanktegn (whitespace) string ltrim(string input) fjerner alle blanktegn fra starten af strengen. string rtrim(string input) fjerner alle blanktegn fra slutningen af strengen. string trim(string input) fjerner blanktegn fra starten og slutningen af strengen. string nl2br(string input) erstatter alle linieskift i en tekst streng med html taget for et tvunget linieskift (
). Dette gr at tekststrenge der i databasen ligger som en streng fordelt p flere linier bliver vist som flere linier i browser vinduet. static/trim.js Indeholder en JavaScript implementation af trim() som fjerner blanktegn fra starten og slutningen af filen. static/md5.js Indeholder en JavaScript implementation af MD5 algoritmen. Denne implementation er kodet af Paul Johnston og er hjemmehrende p http://pajhome.org.uk/crypt/md5 static/stylesheet.css Layoutet p siden er defineret i dette Cascading StyleSheet (CSS) dokument. dynamic/gd-cpp/* Her ligger en C++ wrapper som indkapsler grafikbiblioteket libgd, som er lavet i rent C, i nogle relevante C++ klasser. Disse filer er lavet af Kevin Shepherd med en del input fra Torben. 9.5 Web klient bruger grnseflade Nr websiden bnes ser man ude til venstre en menu med punkterne: Index, Critical systems, Customers & installations og Login. Index: Denne knap bringer dig til forsiden med det knne billede. Critical systems: P denne side kan du se de systemer hvor den sidste opdatering indeholdte en kritisk tilstand. Hvis der er en installation med en kritisk tilstand kan du klikke p navnet og derved ryge ind p installationens log side. Logsiden indeholder alle de opsamlede data, samt en graf over temperaturen. Customers & installations: Denne side viser alle kunder, og under info om dem kan man se hvilke installationer de har, og komme til deres log sider ved at klikke p deres navn. Login: Bruges som en hver anden login side, denne giver adgang til vore administrations del af web klienten. Nr administrations delen startes har vi stadig de 4 muligheder fra fr, dog med logout i stedet for login. Vi fr 4 nye valgmuligheder: Customer admin, Send configurations, Server configuration og User admin. User admin er dog kun aktiv hvis man er logget ind med en bruger der er bruger administrator. Customer admin: P denne side er der et link til Create new customer og ud for hver kunde er der link til edit customer og manage installations. Alle 3 links sender en side hvor man kan gre hvad linket siger, create, edit og manage. Send configurations: Her kan man i en dropdown boks vlge den installation man vil sende en config sms til, ved at klikke p knappen under dropdown boksen. Hvis det ikke er hvad man nsker, er der en knap til at sende konfigurationer til alle. Server configuration: Her kan indtastes et nyt telefon nummer og trykkes p knappen send foresprgsel for at skifte serverens telefon nummer i databasen. User Admin: Som tidligere sagt, er dette kun mulig hvis man er logget ind som bruger administrator. Her har man muligheden for at trykke p Create new user og lave en ny bruger, eller trykke p et brugernavn og komme til en edit user side. Logout: Gr prcis hvad den siger, logger brugeren ud uden advarsel. 10 Idriftsttelse af systemet Her er nogle noter omkring hvilke skridt som Serren AB skal foretage i forbindelse med systemet, men er ogs for at give Serren ABs systemadministrator et overblik over de installerede systemer. Serverprogrammet er skrevet til i C++/MFC og skal derfor afvikles p en pc/server med en Windows variant installeret (2000 eller XP). Denne skal desuden have en seriel port til rdighed for at kunne kommunikere med GSM-modemet. Da systemet netop bruger et GSM modem til afsendelse og modtagelse af data skal serveren naturligvis stilles sledes at der er god dkning fra GSM netvrket. Denne Windows server skal ligeledes tilkobles det samme local area network (LAN) som den anden serverkomponent, Linux-serveren, befinder sig p. For at kunne tilg databasen skal der vre installeret en PostgreSQL ODBC driver. Server softwaren er udviklet p basis af version 08.02.05. For enkelthedens skyld leverer vi en pre-konfigureret Linux server med al den ndvendige software installeret, men denne kan selvflgelig integreres med anden Linux-installation hvis behovet opstr. Denne server skal tilkobles det samme LAN som Windows serveren. Blandt de mange forskellige Linux-distributioner der er p markedet har vi valgt en Debian v4.0, da denne stter sikkerhed og stabilitet i hjsdet og derfor er fremragende til serverbrug. P serveren er der installeret en PostgreSQL server v8.1.10 der kun tillader SSL-forbindelser fra netvrket. Database-superbrugeren kan kun logge p via lokale unix-sockets. For at drive web-interfacet er der installeret en tntserver samt de ndvendige libraries og databasemoduler (libgd + tntdb-pgsql). 11 Accepttest Specifikation Vi vil herunder have en accepttest specifikation, som henviser til kravspecifikationen og forklare hvordan de forskellige punkter skal testes. Henvisningerne er underpunkterne til kravspecifikationen 3.2 (Se bilag xx): Overordnet Testes ved at se om der er et picboard med addon-kort og gpsmodem til. Testes ved at starte server softwaren p computeren og se om det starter. Testes ved at g ind p websiden og logge ind og se om der kommer admin kontrol sider frem. Testes ved at se om der er en database installeret p Linux serveren. Overvgnings enhed Testes ved at aktivere de 4 switches og se om de tilkoblede leds skifter status. Testes ved at dreje potmetret i bund og derefter dreje det mod top, og aflse temperatur p LCD displayet. Testes ved at se p sammenkoblingen og konstatere det er et RS-232 interface. Udfr test 2.d.i, 2.d.ii, 2.d.iii og 2.d.iv Testes ved at afvente det antal minutter sidste config sms fra serveren satte, og se om der bliver sendt en sms. Testes ved at skifte tilstand p en af de kritiske kontakter (Power failure, Flammedetector, Fremfringsfejl) Testes ved at pille simkort ud af modemet. Og afvente hvad der sker. Testes ved at se i installations loggen i databasen om de nye smser kommer i rkkeflge. Testes ved at sende en config sms med og se om serveren fr conf ok tilbage, og om der efter det valgte tidsrum kommer en update sms. Testes sammen med e) og ses ved at se p logvinduet p serveren. SMS Server-software Testes ved at se p sammenkoblingen og konstatere det er et RS-232 interface. Testes ved at aktivere en kritisk tilstand p fyret, og se om serveren lser smsen der bliver sendt til modemet og skriver det i logvinduet. Testes ved at se i installationsloggen fra den afsendende installation om smsen er blevet dekodet og tilfjet. Testes sammen med test 2.b Testes ved at stte web interfacet til at sende en config sms til 1 og alle personer, og se om de bliver sendt til udstyret. Testes ved der ikke skrives conf ok p en af config smserne og venter i 5 min for at se den blive sendt igen. Testes ved at vente yderligere 5 minutter, og derefter tjekke critical listen p web interfacet, hvor udstyret skal st med comm. error. Testes ved at ndre serverens telefonnummer via web interfacet og vente p serveren igen kre keepaliveandread() og lse det nye telefonnummer i logvinduet. Testes ved at vente 15min fra 2.e og se om den skriver telefonnummeret igen. Web-interface Udfr test 4.a.i, 4.a.ii og 4.a.iii Testes ved at bne Critical systems siden og vente 2 min og se om den opdatere. Testes ved at trykke p Customers & installations og se om der er de samme kunder som i databasen. Testes ved at trykke p en installation under en kunde og aflse dataene p skrmen. Testes ved at trykke p login og logge ind med admin admin Testes ved at trykke p Customer admin og derefter Create new customer, og oprette en test kunde, og se i databasen om den nye kunde er der. Testes ved ndre f.eks. adressen p test kunden, og se i databasen om det er blevet ndret. Testes ved slet test kunden og se om den bliver fjernet i databasen. Udfr test 4.4.a og 4.4.b Testes ved at trykke p Send configurations og sende en config sms til en af installationerne Testes ved at trykke p Send configurations og sende en config sms til alle installationerne. Testes ved at trykke p Server configuration og ndre server phone nr: og derefter tjekke op p om det blev ndret i databasen. Testes under User admin p samme mde som 4.a.iii med en test bruger i stedet. 12 Konklusion Forlbet i dette projekt er stort set get smertefrit. Til at starte med, kom vi vores forrige projekt i hu, og srgede for at begrnse vores opgave til et niveau vi var sikre p at vi nogenlunde ville kunne overskue. Under udformningen af kravspecifikationen havde vi nogle problemer med at f identificeret hvordan dataene til pic microcontrolleren skulle aflses, og mtte ogs ty til hjlp hos flere forskellige personer da dette indebar en hardware viden som vi desvrre ikke selv har. Apropos hardware s m vi indrmme at omrdet omkring design og fremstilling af elektroniske kredslb p ingen mde er blandt vores strke sider. Dette har taget tid og har voldt mange frustrationer. Implementationen af softwaren er get godt, og har haft en rimelig blanding af bde kendte og nye, uudforskede komponenter. Dette har medvirket at vi alle har hstet nye erfaringer mht. til design og udvikling af software p de forskellige platforme. Tilfjelsen af en ekstra komponent i form af et GSM modem har vret ganske interessant og det har vret spndende at finde ud af hvordan det skulle bruges, og har ogs givet anledning til fremstilling af diverse kabler og debug vrktjer. Gruppearbejdet er get godt, men da dette nu er det 5. projekt hvor vi arbejder sammen i denne gruppestruktur kender vi selvflgelig hinandens styrker og svagheder. Dette medfrer at vi har vret gode til at supplere hinanden og ved hvornr at vi skal lade hinanden vre i fred. Svendeprve rapport - Flisfyrovervgning Side  PAGE 34 af  NUMPAGES 34 Ecpp eksempel: // starter i html tilstand <{ //Nu er vi i C++ tilstand //her kan laves C++ kode }> //afslut c++ tilstand og g tilbage til html    !=>?@GHIcdefghijkujwUmHnHu&j>*B*UmHnHphumHnHsH uj}UmHnHujUmHnHumHnHu0JaJmHnHu&j>*B*UmHnHphu mHnHu0JmHnHuj0JUmHnHu jU( iOV#{KW N  g y  8#  8# @  "#$%-./IJKLMNOPQmnop~ͳ߫ߣߣ{߫ߣg&j>*B*UmHnHphujkUmHnHu&j>*B*UmHnHphu mHnHu0JmHnHumHnHsH ujqUmHnHujUmHnHumHnHu0JaJmHnHuj0JUmHnHu&j>*B*UmHnHphu&456PQRSTUVWXtuѝޏ{ѝmjYUmHnHu&j>*B*UmHnHphuj_UmHnHu0JaJmHnHu&j>*B*UmHnHphu mHnHu0JmHnHumHnHsH uj0JUmHnHumHnHujUmHnHujeUmHnHu*uvw !"#$%ABCDYZ[uϵ߭קדυ߭קq&j>*B*UmHnHphujMUmHnHu&j>*B*UmHnHphu mHnHumHnHsH ujSUmHnHujUmHnHumHnHu0JmHnHuj0JUmHnHu&j>*B*UmHnHphu&uvwxyz{|}()*DEFHIJKLMijѝޏ{ѝmj; UmHnHu&j >*B*UmHnHphujA UmHnHu0JaJmHnHu&j >*B*UmHnHphu mHnHu0JmHnHumHnHsH uj0JUmHnHumHnHujUmHnHujG UmHnHu*jkl    4 5 6 P ɽɯɽߧߟɽwɽߧߟcɽ&j >*B*UmHnHphuj/ UmHnHu&j >*B*UmHnHphu mHnHu0JmHnHumHnHsH uj5 UmHnHujUmHnHumHnHu0JPJ_HmHnHtHuj0JUmHnHu&j >*B*UmHnHphu&P Q R T U V W X Y u v w x  љދwљijUmHnHu&j>*B*UmHnHphuj#UmHnHu0JPJ_HmHnHtHu&j>*B*UmHnHphu mHnHu0JmHnHumHnHsH uj0JUmHnHumHnHujUmHnHuj)UmHnHu)    + , - G H I K L M N O P l m n o ֞v֞b&j>*B*UmHnHphujUmHnHu&j>*B*UmHnHphu mHnHumHnHsH ujUmHnHujUmHnHumHnHu0JPJ_HmHnHtHuj0JUmHnHu&j>*B*UmHnHphu0JmHnHu#          4 5 6 7 D E F ` a b d e f g h i Ѷ~Ѷj&j>*B*UmHnHphujUmHnHu&j>*B*UmHnHphu mHnHu0JmHnHumHnHsH uj0JUmHnHuj UmHnHujUmHnHumHnHu0JaJmHnHu0JPJ^J_HaJmHnHu%     * + , - V W X r s t v w x y z { ޙykjUmHnHu0JaJmHnHsHu&jv>*B*UmHnHphujUmHnHu&j|>*B*UmHnHphu mHnHu0JmHnHumHnHsH uj0JUmHnHumHnHujUmHnHujUmHnHu*          3 4 5 6 A B C ] ϵ߭קדυ߭קq&jd>*B*UmHnHphujUmHnHu&jj>*B*UmHnHphu mHnHumHnHsH ujUmHnHujUmHnHumHnHu0JmHnHuj0JUmHnHu&jp>*B*UmHnHphu&  d b(1023Ajk" 8#  8#  8#  8# ] ^ _ a b c d e f   01ޙwjUmHnHu&jX>*B*UmHnHphujUmHnHu&j^>*B*UmHnHphu mHnHu0JmHnHumHnHsH uj0JUmHnHumHnHujUmHnHujUmHnHu*123?@A[\]_`abcd!ϵ߭קדυ߭קqg0JaJmHnHu&jF>*B*UmHnHphujUmHnHu&jL>*B*UmHnHphu mHnHumHnHsH ujUmHnHujUmHnHumHnHu0JmHnHuj0JUmHnHu&jR>*B*UmHnHphu&!"#%&'()*FGHIdefѝޏ{mj UmHnHu&j: >*B*UmHnHphujUmHnHu0JaJmHnHu&j@>*B*UmHnHphu mHnHu0JmHnHumHnHsH uj0JUmHnHumHnHujUmHnHujUmHnHu**+,./0123OPQRTUhijp&j(#>*B*UmHnHphuj"UmHnHu&j.">*B*UmHnHphuj!UmHnHujUmHnHumHnHumHnHsH uj0JUmHnHu&j4!>*B*UmHnHphu0JmHnHu mHnHu, )*+-./01*h.i.j.....CCI/IIILМȉ|wrrmmHsHmH sH  j%UjVy K UV^J_H jUj$UmHnHu0JaJmHnHu&j"$>*B*UmHnHphu mHnHu0JmHnHumHnHsH uj0JUmHnHuj#UmHnHumHnHujUmHnHu( 3Mkl ABPQ !. !m"n"o"n#o# & F  & F  " & F ^`o#x#y#$$%%o&p&''))**,-h.i..../00}3~333"3R5S5~5S7T7888Z9[9k999999k$$Ifl0@ # `064 la$If9K:L:T:w:x::::::::;;;;hk$$Ifl0@ # `064 la$If;;;5<6<><<<<<<=O=P=d=>><`$Ifk$$Ifl0@ # `064 la>>>>>>> ?j?k?l?|??????Pk$$Ifl0@ # `064 la$If?E@F@R@@@@@@@#A$A2AAAAAhk$$Ifl0@ # `064 la$IfAAABB,BBBBBCCCCCDDp$Ifk$$Ifl0@ # `064 laD DDDDEEE1F2F3F@FFFFFFDk$$Ifl0@ # `064 la$IfFJGKGTGyGzGGGGGCHDHNHHHHH<pk$$Ifl0@ # `064 la$IfH*I/IaIbIhIIIIIJJK KKKKk$$Ifl0@ # `064 la$IfKKKK!L+L:L;LJLXLbLjLkLLLMNNO0OOpPPP?QTQ " & F 8^8` " & F ^`"LLNNNNO0OpPP?QTQUUVVQWoWLXcX[[[[|\\]]8^M^^^__G`\`cccccc2d3dMdNdmdndddddde)e*eOJQJ^J_HPJ^J_HnHtH5CJOJQJ\^J_HaJPJ_HaJnHtHPJ^J_HmHsHCJPJ^J_HaJPJ^J_HmH sH CJPJ^J_H PJ^J_HPJ_HnHtH7TQQQR SpSSSoUUUUVVQWoWLXcXXY&[>[[[["8^8 " p8^8 " & F ^` " & F 8^8`[[|\\\W]k]]]8^M^^^__G`\`caoaTbb/c_cccc" 8"8^8 " & F 8^8` " & F ^`ccccc2d3d;dMdNdVdmdndvdxuluu@$$If0%47a7@$$If0%47a7#$G$If vddddddddee)e*eFeYepq@$$If0%47a7@$$If0%47a7#$G$If *eFeYeZeeeeee f)f*fDf~ffffSgTggggg h h-hlhmhhhhhFiGioiiiijj@jpjqjjjjkOkPkkkPlQlbllllll m m m nttǛ jUjCJUmHnHsH umHsH j@U PJ^J_HPJ_HnHtHPJ^J_HnHtHOJQJ^J_HOJQJ^J_HmH sH FYeZeveeeeee f)f*fDf~fffffgSgTggg<DTp#$G$If@$$If0%47a7ggg h h-hlhmhhhhhFiGioiiiijj@jpjpPpH#$G$If@$$If0%47a7pjqjjjjkOkPkqkkkkPlQlblllllll m(TD#$G$If@$$If0%47a7 m m m mmmnKn[n7op qgqnq-r{rashssst%"@$$If0%47a7ttttttt/u;uv wjykyvyyyzz.|9|}}}} s%iw{|Ʌ/0ˈ̈4>`l`n :BLG%GRlۗÚϚƛrsnoCD~%^Rۮ;CD !- & F & F$a$mnعxqL`  & ' ) * . / 9 : < = @ O    OJQJ^J6]0J!mHnHu0J! j0J!U^JmH sH mH sH 0JjU jU j,UjK UV39зѷJKfsع$7I/I_h)O%OZp4xqGnh3% & F%cvRi~E\ . & F & F%b 3Ibc O<9aS & F & F & F% & FS}~&3`LM`" & F hh^hh^h " & F h & F & F no zDE " h^ " & F h & F" & F 88^8` " hh^h" & F hh^h " 8^AB]^IopC<)n " & F 8 & F " & F  " & F h " h^ " & F h " 88^8 " & F 8nH-.f  > ?   " & F  " & F 8? @ O q y          ,1h. A!"#$% }DyK _Toc185299654}DyK _Toc185299654}DyK _Toc185299655}DyK _Toc185299655}DyK _Toc185299656}DyK _Toc185299656}DyK _Toc185299657}DyK _Toc185299657}DyK _Toc185299658}DyK _Toc185299658}DyK _Toc185299659}DyK _Toc185299659}DyK _Toc185299660}DyK _Toc185299660}DyK _Toc185299661}DyK _Toc185299661}DyK _Toc185299662}DyK _Toc185299662}DyK _Toc185299663}DyK _Toc185299663}DyK _Toc185299664}DyK _Toc185299664}DyK _Toc185299665}DyK _Toc185299665}DyK _Toc185299666}DyK _Toc185299666}DyK _Toc185299667}DyK _Toc185299667}DyK _Toc185299668}DyK _Toc185299668}DyK _Toc185299669}DyK _Toc185299669}DyK _Toc185299670}DyK _Toc185299670}DyK _Toc185299671}DyK _Toc185299671}DyK _Toc185299672}DyK _Toc185299672}DyK _Toc185299673}DyK _Toc185299673}DyK _Toc185299674}DyK _Toc185299674}DyK _Toc185299675}DyK _Toc185299675}DyK _Toc185299676}DyK _Toc185299676}DyK _Toc185299677}DyK _Toc185299677}DyK _Toc185299678}DyK _Toc185299678}DyK _Toc185299679}DyK _Toc185299679}DyK _Toc185299680}DyK _Toc185299680}DyK _Toc185299681}DyK _Toc185299681}DyK _Toc185299682}DyK _Toc185299682}DyK _Toc185299683}DyK _Toc185299683}DyK _Toc185299684}DyK _Toc185299684}DyK _Toc185299685}DyK _Toc185299685}DyK _Toc185299686}DyK _Toc185299686}DyK _Toc185299687}DyK _Toc185299687}DyK _Toc185299688}DyK _Toc185299688}DyK _Toc185299689}DyK _Toc185299689}DyK _Toc185299690}DyK _Toc185299690}DyK _Toc185299691}DyK _Toc185299691Dd+,^ 0  # A2ux822z(7!Q`%}`!Ix822z(7!8"R m (!x  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~y w: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuv;z{|}~Root Entry FpSFuj=Data ڸWordDocument.ObjectPoolptj=pSFuj=_1258977622 Fptj=ptj=Ole CompObjsObjInfo  !"#%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[] FMicrosoft Visio DrawingVisio 11.0 ShapesVisio.Drawing.119q՜.+,D՜.+,P `ht  VisioDocument ~vVisioInformation"SummaryInformation( MSDocumentSummaryInformation8Visio (TM) Drawing ~vtjugR7 !fffMMM333Fwͩ}|kݝHxUJ:DT5I[1hXT@. /UbW##_b0zGz? L\&B1r&b%U& !oM $d ) P?;H$,Q, & #&J , 5& ?D#//?M?\.? CA  ~,,,'q/%P6$Y6 (}k?l)?"U   U%A3# o >S@#B:_a_ReUUeUeUeUeUeUePONODN`_ReUUeUeUeUeUUeUeUU/b SR%;5OM%>Qiq;RRRRgg Rqh>Qj /A^F' %p3:|bFpT#| | | vi?=Os<34x,,,/RQmeY q]U@QvovL__q____OO_OOTYA`,X@L&/d2?ɖQ3YҨsUΡ̦xΟ@$"Jʼ& ͥ*@d2A??ϟJ[D! f:45ŧ5ŷ5@ 0 0D$#    Q#b ; Chߠ Y ,00JDNrq(NN㊮NN(NN&&uc7D)KXXFNvvK&KD#KD#-D#NHGDB$KzzDKq%iz4 }1T\,Eu9fdhT,W'0΢Uܮ5E0 fI$[OmOC%ߑE##HZߪ  E,3Y&4JY&5&6<s9FaBaj+h8 8?&!3"DE=T;ܯ?w?@??8&t,'5UR^LY  Y7akKt//BJhuizpsĝa.1DTcAcpvOpM KKuhdX(G:iX IT[EEh.D#E,ah-50zG#zpvb aHGmc/QP K{\Hp_ hd? pA?%?7?I?[;<t5j! OO*FQ///F/K]SEn%cO@OOlE$g\Ey[EO_!_3_E_W_i_{_____VB506,HM.`e^MIa,>PbQaƒ2q? a%oXIoQfdoooSEX_O-OF6EDpE66Oҟm2Hg;pbӏ_ ,X7R[,Tful3~O贁Nk?JTf/6S?]?0'^5x@E@E@@t$ 'n/jRFfuOOo{o_0&G9O_KZk=_O_((]|Tq?Q);/q/ q58?Wf9|s???:etb< djb wOo"oOOO_/aoso; o-W,'HhWWCo/?I=)1DˠI 2DVOO_&Xoo+oooo9}-P|)CeɍU=O2b@b~qbYk}_ſ׿ˏ);M_qσϕϧ%7v [mur+b{r 0BTfx 0BTfxv9r7 }5GYk}Uc &8J\n/"/y!?"I/[/m/{.bLbݠ////// ??0?B?T?f?y???????? OO-O?OQOcOuOOx??OO,O>OPObOtOO_bksOOOOO_ _2_D_V_h_z__a=8\0ٶ_a=b;bbh_U./_oor-b@b3bDbMo _oqooojmizoooobݏ١&8J\nT2-?ȀIbQY1AByq1<֏ 0BTfxjPşן 1CUgyT W3!)9ت]2\nȿڿ]ߧCUgyϋϯ -?QߵuU45 ߤ߶ߊJ@J 1CUgy'9K]oTGFw?3{bq#]#.@)h('}o@o HZl~/ /2/D/T$1a/r8/)6Hx///&n|/??$?6?H?~???2$DPT<?qd@1m[Y/E1 $/T 6D UUF~@xF4Fzk%>F >A2 OBu D(2OVhz~ Drag thuesapWonodwipe+.cs*Wfuci: oObl-=l)cka!dh-1 H D  # =ih#4>T#3 A5AUF~? ?F\.?P6 Tuv` ??uJ bkrr r.AšJYMJU5 !LK@#I;!@$5 `?CopyrigTt (c])r 20~ 3r uMj ch osb Ifp"a!rd !ap ib n r AUl h(s"e eh v d/`Vj s_SFBcTm!#5N~"06!5' #%0 5K)M6G# G'? *lW btrr&/Lh=L@l>61Uhh7PY!"  *#"JT3FFFr\F BM)(aOAO#"A5N_IQEEFR_Ov[R52O;EBrA RS#")(le @j 7heGoj@8=ook8too q(b5@MCW?0v0v H"SFAr@K\/SqMRB_<NhCFi{z,%)t@@r uGj5q5{#5"C#"mZon+EBTM,"KK2JK\3;%Vq>#  @!2`a!sp s.2`A#"2,%q1BXVqajGDu*5AଚbA"` R"o͒c"4ڑAEDɏ,%A!MJa?)E[4C/G## %(p&"p"!0~Rb  %BevmHY bg|4G5n","X)(S&@Vq2b~߿\.??a߿,h??4D_ Q);M_>m w =_H'+fs k}bk_J?3UFkew#S`M? V]{a @(D4Wk,e>VB@B|TRץp8$*5 7UFDfP h,TYYCUF\.?x<F BP(?E P)?2o @L^^{J_@L&d2?sUB"! &B/eBH0$?w/&? )~  0 ;Q`#CBm0,link\netwBr2p 0r0pP11a0,d 0v0c 0O1^ ; Yp!3u &?  ;;" ;;;gr330;G;#7Drag onut heqp ad likb tw e cmGuiCaisd vOe]sBKcnTe)*`i]^o 9il^)n5k].b\.BP(?? M7Pfo??H D  ?h ^T,]]9  AU@\.? ?@BϡP(?P6 u`u (bu]`u --+&1B=^@u` ?zu"2dTw_b .A! '8 P-#&,J`Uy"z!?&s?Ab?bAw#n#0O贁Nk?Fw@LU7 ;/ b"n#&$72?5B"7='?Z$Q=KW!Lw7W""2RW"M" 6v%n#AD5 ]`! 5@4@18`?CopyrigTt (c)@20@3@M@c@os@fBAr@Qa@i@n.@ Al)P Hs-Re*Pe@v?Pd!P ItP@qZ}PrU?|TrV"r##SOC@`сANyRu(yQ`i'`Qps-8R/d@9m @&W"$"SKbRGW"O2@AMBYq%O G&JM4{w`:AbbfM"$"\CICUMql>!Uhde A(X4h4F?@ p8̭ 3#RC[U\ArT93V]mt@hem]5rTC%MA&"$a$a2(ɤO2)֤B*\"+[RllbNN @//01@W!BAV2M]!AAAD" "` ]MPnuPa@ t>QrA]@S7a[m^$b`PBd. Nm`6[Ͽ PPr ϸO5AkGYA D?RAi@UϷEZ~APBQ߹E_;M SCRiP,Qy߀߽[U$1 L@cX߷Pe$6HBi)Pd@n@g﷼3MhR@!oVﹺYP pzmB?Pn@7faLSTa@e PlPo#` AnPeiGPi@y':)DNYqq/ue\A\Ar"(D' 4A3\Daabxα 6W6K\WaqqG` rPtrRyASTd&@xOsyA K@bVmK&\=uK$&\%5ƛ_t'SׄrsF3s͵NSYFuEeKpVp//(?/(xA\p~6?@Ig`{]otGOD@`h5rBAcb١/`Rop4a ex$JKFq*Bet ڀBڀc(CFvlAe;wbwrBtA_ oo-o(O@Yk@! ;C`<ob鉘gqHu+ 5)d5ukDWnmF|ky#DKT? IS:a@oUBo=?\k PUFDf h-TYYU?~@x#@L'} V6lX-1u. Bj2u2Z2j2#u9r#ULH/MB#AD5 60`Vis_SE.cTm!#20AD%`;Copy<0igTt ?D1f@M)@c<0o+@ofdBUArX@Aad@iV@n3@ f@Al@ \HsBe*+@e<0v@d3@J@=#x# A G{?9#n"E&0444 M70#AHB 53_lj#PSV6U8l>(UhnE qJ$&9"(Fn_g5Fe#pheo'T !! Jcxo)vR2'"U75a%O3W_74b5-6R `F2 5au\@|Q:0b)`R@As)@E T@xd@Di ei=G]U6Tg'2"qV!DHAn 6SWaHw+* O`EW )F_k=#\R!+7F cX,Ge?foDkPUFDfP h(TPYYBUF~@x/F A2 ?&_ QJ /?|wxpf6lbx{s؅pwp  wwDrag onut heQp idUct afl cm oUs dfr >r!s(<Ia2e7`aQ GlPo e9ts.UH TD  # Uh U}MUF~? ?FL&d2u?QoNuQ{` ?cu[ NbMV VAMA J~s$A sQ   @QM Bt"MnK"NR@P'tr" )Nrb#$u2&?&?r N]#K"L@R]#ҙ14e;-N`Vis_SE.c`m!#5W0106L"`?Copy ig`tW (0)020W030M0c o0of21rT0(Aa0i0n0] 0AlC@ 8UsGBe0e vY@d0M>7D00iERK_9T#3 7?i:P bJNVVV#]#0O贁7Nk?!&QMS&=]#/13FPF)"T$&_?-W)lJYAUttYYI 1Th1@-b3e3`Q(w]$m&?`0 P@#V"0'hAA #'M 7& >2PS8WYmMpo*xcP&cK"8]*`ec/&@kAw$?# ? ygPV0- %s" Ba3U}io|4s2HqEc^o?rF`Y}v20 xrrgQxT5I oJ+f5oGnSz B zΉcgM&HqV50\.Qaԏ$a%?F r"*w hdM!q(i9]&,f$@d9/KPb 'c#0b"~1}BF(}0#yA&8x & f 8f䳶과!rHPq RU);M_qHmaxP Ā#bdz%Dї ܜEU}S*JR!ᣏċ p/8&,Aƫ sBQYasυϗϩϻHmd1 Ā"+͛ CvV5qAXz @%ߒZ @)&XqA(nU9 Yq!gfU}&&2Q<c5 cK" T%O);M |f V5V]/ r /6c~b5&8Jqq!nTQTT7q!gTQ)!$K"Q(k #?p'48/h; S` % &Bp]B4AZA_b ~5mD1+ #a#a#aqr-j2MhD #LS!5  \(}B`1s0 @B`RW1@A+?A3J5S3Du/Jo8LuѠ?7!K0S3 RYBo2c%iPEZgXW;G'2qB@F!QQZ%0_BZ!x-AF'Gga/= / *5&@y{pb~߿P&d2??L(a߿i??4D_H'׿# +"x4Z~Dw+Fk,o12a2? S߮3aܥO@74Dk;kP-\B3;@BU !"t4NT*"@|+.@ DV<}C-L@7"AUN!"$U%&'(U)*+,U-./0U1234t4NT*"@|+.@ C<AC-̣@,= :56t4NT*"@|+.@ dBw= AJ-$37U !"7t4NT*"@|+.C@ V=C-DdBU7 An@m<IR@m.=IR@lm=DR@ܥm=ORH<(H<(H<(H<(nE\m> REĤm> RE4m> RE|m> R(kGSDl+B! k?)/"4k0S|k;/?Gm?>vPD$m4( U`, LSFDTyB uh$T UFNT*"@F|+.@FxA>A uk 4 A A#HA\DK D KDKDuK}AH}AKAHAKAHAK5D1KAHAKAHAK AH AKDAKAHAKED>AGPAuu=a #a1u5aF}A>aA!!A7 q1AA$qA#B1q AFCKqAyyA/vAie}uc\uE uZe}A(a qRUuEE19~?@a?@~?@"5ⅅߎ?aC\Sc%*<1q}Abdq Ve`u7Bt005-ʉ\&  p~2 i &Xʇ'2q.!(H\ jUkOXKmDi+T\ !!!!n4ǯٯdq \AUAINp b0s0r0t@Ovvg @i @g-@e @h 0d@gD*7nSM e@v 2!fx 5bQST3uW&݊1K!bPtګYi"dv_IIb#" /BUU܄ /JJ4#/LRe]Sd%x././\Q11T AXoyBJcQQo!kQ?kHo5=I}?v6ad6aO(:dQD =@@n{Su ȏ@^ߗZ*}s;l8fno.oS8of[onogğq :&'9/ASew1Ѭ^ۯ#5Gk^Џ޿e8??S//(R,R-^+/N(g%'?^!Q2MT$@RAc?u????`0 iHޝH@=EOHo0o+U7\n5GVR4/5 .|T b/y//////A?x/?5S*JRX/j(R?d?v????ȑ(5?>(5&OC0(F0@$qd A,>2/]'cOKƛ5 (N.A%=ǚQ{OT{_>/?_Q_c_u____LHXCC$ɿ\b%lbu`u{e4o y+.?%==png a4qe2o??@c!a6??r1C5ȿYk}}w!/&4L^p܏$M^=oOa%yi{џ.H[60F]$ZalhǿEo% cRoZ$|h5`0 ?@pv@AIZlcYOڷbKh ܏$BZxHv,>Ao*yK}BůK]T} q1CUgyBϡZ#GK 2!qJ~xJ1Cʆ U@ a a?oI1rZ edv5ŒaѣCaBnDA-鬣CO3בLjő!(\Xo'2`RqFH6A[6ղ7Om=ǟٟk!3EWi{]ïկ\\#/X| Ŀֿ"uϿq%I[Dm1-0ߞd/d??¼2϶9P?;/NeIO[Lu11 >%Fyrw {cs{17a{uq4'Xihyahqx!޵61r?@T@1r?OdpUP>e!up`ux `[A!VSQ!V%ج}LbS5;qHT)"pqrTUgް@z3QObUogoRpafo1on11sbch1…xQ!P".2b2:uWP'C/,R tN,P!zsV r!sQ!u$$^2r~?@I4)2~N$(#0ONk?FwSF!p ~/,'E/&6愾! /# {qs%2U?@ABCDt4%NT*"@|+.C@ TZ|C-cB_b[ A@|ml[QRH<(EDm[ R\]LBDC].BC]%B4C]5BC^9BTCK^=B܉C^CBdC^9BC_;BtC?_MBC_:BC_:B C`9BC9`9BCr`;BC`8B,C`9BCa8BB\Cb8BԂCIbGBGuideTheDocPage-1"Gestur Fom aProcesViso 90Flow NrmaVi}so 0Co}nectrViso 01Viso 02Viso 03Viso 10Vi}so 1Viso 12Viso 13Viso 20Viso 21Vi}so 2Viso 23Viso 50Viso 51Viso 52Viso 53Viso 70Viso 80Flow MarkeFlow GrayCostDurationResour cRow_1visVerionProces.3Com-linkManufctre ProductNmb ePartNumbe*ProductDes_ripinuAsetNumbrSerialNumbLocatinBuildngRoomDepart5mnShapeC5lsShapeT ySubhapeTyHasTextSolSH"visLegndSh7ap(Dynamic onetrTextPoWsiinDautbseProces.12Proces.2Proces.6,Dynamic onetr.7,Dynamic onetr.9Proces.10.Dynamic onUetr1Proces.13.Dynamic onetr14EE3DbddE3,btdG3bdG3ifd%G3bdG3@dE3 kdG3 kdG3 keG3 k0eG3 kJeG3$ kceG3D k|eG3d keG3 keG3 keG3 keG3 keG3kfG3$k+fG3DkDfG3dk]fG3kvfG3kfG3kfG3kfG3kfG3$kf!G3DkgG34@0gE3b4gE3kBgG3k\gG3bvgE3kgG3kgG3kgG34jfg G3\jfg$G3$khG3.e;h-G3DkhhG3jfh!G3dkhG3khG3bhE3khG3kiG3k!iG3jf;iG3bZiG3briE3jfi&G3.ei)G3jfi G3kiG3,@jE3$@ jE3@jE3@jE3ljG3Dl5jG3$lPjG3mkj.G3mj.G3dljG3mj/G3lkG34m0k/G  !"#$%&'()*+,-./0123456789:;<=>?@ABCDUbU U UUUt4NT*"@|+.C@ KqqNC-eBU7 A%t4 cB_r A-<@"7AJ@mqOR@m$r6RH<(H<(JE\ms REԵms RUPT/tbt C{N } w"4FX,h(;WP@@(&`ծjf@SBjT P x/Aj<:]ZW蚔`__><:]ZW蚔`__><:]ZW蚔`__><:]ZW蚔`__><:]ZW蚔`__><:]ZW蚔`__><:]ZW蚔`__><:]ZW蚔`__><:FCB蚔`__蚔><:><:><:><:><:><:><:aBkP>><:><:><:><:><:><:><:蚔`__Ԥ蚔`__Ԥ蚔`__0//Ԥ蚔`__ >=<Ԥ蚔`__ >=<Ԥ蚔`__ >=<Ԥ蚔`__ >=<Ԥ蚔`__ >=<Ԥ蚔`__ >=<蹲{wt{wt{wtwXwb{wt{wt{wt蚔`__ >=<]ZW><:MKI{wt{wt{wtwp}wr{wt{wt{wt><:.-,~{蚔`__ >=<???pppPOO]ZW~{URP蚔`__ >=<>=< `__{wt`__{wt??>]ZX><:]ZW蚔`__ >=<>=< `__{wtٯ`__{wt??>]ZX><:]ZW蚔`__ >=<>=< `__{wtܻ{L{Lўzî`__{wt??>]ZX><:]ZW蚔`__ F@<ѿF@<>/&udY}wr~zӢQ"wFwFwFLj]ٯ~fW{wt}qWI?c[V0ZI<]ZW蚔`__ oS?eϙuϙuϙuϙueoS?ǒ_;ϙuϙuϙuϙuϙuqMvgxJ{Lϙu۳ٯc ̹ݷqMwkyUϙuϙuϙuϙuϙuϙuϙuϙuhDeQ]ϙuϙuϙuϙuϙuϙuϙuϙuY5͕o͕ohD]ZW蚔`__ >=<>=< `__{wtݷˑiwFwF]Mˑi`__{wt??>]ZX><:{wt{wt{wt{wt{wt{wt]ZW蚔`__ >=<>=< `__{wt̹զRwF`__{wt??>]ZX><:WTR'%$=;9蚔`__ >=<>=< `__{wt`__{wt??>]ZX#"!}xv蚔`__ >=FDBMKI{wtĹ{wt643xsq蚔`__ >=??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>GGGjfd310蹲{wt('&蚔`__ >=<ea_.-,><:><:><:><:><:><:><:{wt蚔`__ >=<ٹ蚔`__ >=<蚔`__ >=<蚔`__ >=<蚔`__ >=<蚔`__ /.-蚔`__xww??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>GGG蚔`__蚔`__tpm`__poo??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>??>Grundfos A/S Page-1nProcess Comm-linkosDynamic connector Databaseonn PagesMasters(`ht_PID_LINKBASE_VPID_ALTERNATENAMESA FMicrosoft Visio DrawingVisi{ՕoSEonQV[(Q/EQ!0>(BĘeYA KDc4q`hE|(D~eϬݪ]{jԾTWgT嫨uttj_Ғ@Z*u>ujqߔZk ۶mk}ַ鷓u^wi!{Ljٗ~t:.I6?õejnO[j{PyWU| ڷU>mMRj&ҦC9kMSod5U-КQ~Kځ'T.pJ+K(dc^ԻTZ [S\1NኒV4_MVZٍao^:aKiޖ]]_߾27z}禪%m5Lᒪ-HW3ÍYtkGRgFR[GRrnMU>fdeKЎq6١nP$Yٖ_~>PEsmۚN^q;ڷ]ߒ@,n~jQݭ3کixCշN۽N$B}D"x z5"(k!Z?A h5č"( kFv^C|;BE5u"(%F6X!!ЎkG6L!ADZ h'5W#DP@;U!A4J hcE#DP@;S!Ab h5e"(] AbƉ5E6^!.Ar\ hE"(Mk!U"x qa h׈5ħ#DP@&Az8?B5_E}x h75"DP@E!>!m"x q^ hE~$AN@ h3Ek!ڽ"x "(k#DP@kkE6G!ΊAAxw hsE]"(="!c"x Оk3"DP@/oAi8=BgDE^C5Bk7G;xS hKE"DP@[&oA%(!ڟDw"DP@{U!NA/"x ^kS#DP@[#Am^C!["x qR ho5ĉ"('A>k#DP@X!^!V!ڧ"x Ъ:C"(%"x ЪEy"(Ո5s#DP@C!!Z^C<3B."x _#DP@*zqL^C<-֋ch5Q^@+5đ^@-OZ8"֋chDX/  zqLm^C[Z޳4/@"xk:=$P@,@NoŁ^"xkк=MP@)]A-[{àV[נc"x<P@/UEUu(*K"xP@;Bo h"x$P@;Fo' hljs@m: Іs@$u([hu#([h"x[s@T[@͋y{No"x X/ uؒ y{IT_UvȚm!li1DZe wNlJwܣ ͮoR-owvwtZry)C{_ڞTJ[q_ZWjp]\wHH|g~n쩣G%]!钂IdH&C%!钂dH;.).KK ~!钂VdH'*.)OK !钂gOdH.)xJK )!钂gdH.)xUDK ^!钂WdH0.)xNK I C%v!钂wdȐtIFdH-2$]R.)x IIK i%C%!钂wɐtIdH2$]R;AK vPȐtI..)؉"C%edH`G I:!钂Q2$]R{KK vɐtI.8.)ة'C%g!钂3ȐtIYdH2$]Rpv .)8 I%DK d"C%g[!钂3ȐtIYkdH:2$]Rp.)8C IEIK $C%g!钂3fɐtIYdHc2$]Rpv4.)8 IeNK ΄'C%g!钂+ ȐtIUdH 2$]Rp.)… I\CK "C%W3!钂+ȐtIUadH52$]Rpu.) I\HK $C%W{!钂+RɐtIUdH^2$]Rp1.)B I\MK 4'C%WÓ!钂+ɐtIT2$]R0 ILg C%$ȐtI 2$]R0 IL !C%MȐtI2$]R0 IL!C%vȐtI 2$]R0 ILS"C%ȐtIT*2$]R09 IL"C%ȐtI42$]R0ɍ IL#C%ȐtI>2$]R0Y IL?$C%ɐtII2$]R0 Im']jOk}ҥv<.fIK{>ROԾ.3Kg>RyOԞS.=K>R{OԞ.K>R{=O^s.ׅK>R{}O']jS.RI=K=)}ҥ>R{oOtO#']j.IK={}ҥO>I>RC']j\Km/Nt.=M}ҥOI>Rc']j.sIK}ҥv^>R;wFtߣOA']jI.sIfK8}ҥvޞ>R;PtO']j.s]IKa}ҥv^>R;ZtOa']j.kI K }ҥv݇>R6Et]?OԮ']j!.kI\K3}ҥv]>RvOt]_OԮ']ji.kIIK\}ҥvݰ>RYt]OԮ']jױ.kI<}ҥ6@tU']jI| }ҥ6CCt']jHIڼ}ҥ6Et͝']jqI}ҥ6cHtA']jI<)}ҥ6Jt']jI|3}ҥ6Mt͉']jIڼ=}ҥ6PtIK2$]NIMxfm۶9Vhj<6ua-JK{UIZ$'n;$Iݲc}+7Ю9MK]{u뒤'?õe T<݁3w=|K%s@UWHJ5YcFa;%V(q44LaR}iR4m5k 3PJ3;l{WY/IcdNF`&M%gٻɢlc8 y1ۜʶ&mɇO:פ=th%=#^Hy6t~;}!7]I}Ӻirtrtfl֓rrrKeߴ_w:RIOJJJtVKp6]X#}RVNW|Qe[[bsҳ )w~Ɂb]rx6TI*HM-_ -V&ÊWX˒77ݝXLgaMnhw|q; .wGvTwpq;~DW..w=obKGʹʙXr{2ͪn训 s*'+C1_hץR>)֖p˃ܓqͬIXC:&?ҽ׻Ѯ1?Mχi |;#? Or#]4%Lav[Veqnq (=MtIl{4ͦܜۮ1ݟnt{O[]m<&owMc{⎣0ss?/,<ܙuf_~~Fގ9=v=7_v ޏ'y~{)r \\U\\7nk~k븞빮pzu}>qy|6zۻ|㸁z>㼆|W_`%y\R/q?8Z<_xGxqx\~?q;ݬ<n{]>5]Zu]u]u}뺂2O\?s]_㺮溾uMZ[\ \[۸SX;3NO˻yWߘw_g~Kr/WYOb̚z[?_['w*=JwzW⯭[+JGp_XI _lnnn⺾uu}뺖&o\׹q]ue \e\ץ\%\Xϊ}&f\p]?庖}go̪?usNѬ?g{n~Q/z_e$p]r]s]ẞuuuu=z u$uuu4u4u4u4u4uuT)\ד#ùø'p]p]s]uW?b__[}Ϣ/=~E7߯X.jE'?*j[E+>k1k3s}FL-?r7F{3/~?3zf# =o/\re =߰ӹP^<ǖw'r ?q.u: 竁z}g*~w JO~nǻ{ r8=UN^v\inTg]PtYZgp5rwc\of)7JwriijWSr`AӞ8ih:,oDd: L0  # Abn5˟`GonY@}ngn5˟`GPNG  IHDR&qsRGBIDATx^ٓfqw6Hj㉰_8V4H"-oUOU]UDt5 Hd"?_ҿ/wyK%oo_u0y.SPPPPPG?w̿+_N9"̗CCCC@MƳoogK{$c4j ?O_"M _'2SSԼ9/7[[gٯ@ׇ/H7Sw9¿/ܬ_SwC/u(p(p(p(Q;N%i1oۿs\2o_u*FCCCC?RwI;?Jvs(p(p(p(p(l 7Rtzӿz@Ry6O)ɰ[:%wSW7g{MY*ĕo&qY+L?[K_R?L/w Ao-+LӲG,o@0ccvKƛm2v%oT&\~G}jDz=PY7z\:T~ɛ ]bL|.n&}9ut:n+$4A0MP{ݫ@1q3AtPa P^6I(l?#&M)Lԗ $%w Q4o9ά=x3 -H}zG^<CS~Lۤb7I֧x I<113 V唟 mcɶ}{W~rhv'I~BVdGaI+iزJT2n _-E,Sj?OeW4B_9%Ďw*qۅey3=S[\=ֿosd0gtJuz4dw1+QwTDVZn"\ h`SRǶzR7 IZJ!Ot7FA4:m{(xAZ>Z 4R8bvܝCgLcbsS3+<2v{,ZymӓأyUImʞM`{lC;Uys(oX;"ʼn|>F2,gkg*d*?;@'3]V288 H L~eh! @38Z!e!:RuH5T&1RɎD$*cJ+:t$+@_DOtp0JJt%V9>{(8"ey=N/F}HLd1ʉ~ƶW H+N*laj 2qZ߾ QqH쬔i_Z\d@1m4k!Co1?4C܎.UNRDpHQv#NU>ɓTxo ޤ:_xUMX jl|_Ř2 ĵ'mv渹'0nhhUli0N,@I.bVV"]z]CEU2ǁPލ()hsS&2]%ڀ_/z9UtҪݩiOOT$~bQfR^J`'%^N`we>Y yX'b" x$Jl翿^QJOVz:5Z|zC+J{ !XZ)8I:_9_؀~~! ۥU`^q ʼ#[{]We՗U%'xBb ~NIL̾+h8 jOheκRJ7wR9s1I ofQ8ܯaI*ը~3`9Pi6M[E~:8  ܥ3y"-D3c iW~M@_PPU)@קo߼ԣTrZe2lUNNG8̀TeVR5[DT?7>:4ϺO&αͥ3PP=)W!-'.;ϹZvl>vϊ+L:yy}<;N>}0]/ӷ lw+Wo y@88( kWZH~#w_ޝ x|m\y(p(zaX^,W˕|WZP5LH ӴK?]@.guW]vZuF6v[Sq*S5kkNA+!Ctyo뢳;A g73T ߝ_7WWS!b8rjJL9QL$vSo].Ů {KqqpOomjUook„+e.’̸ӰRZ[/] Կw{/vGoM1"2 ~CC5 nw+:Ct)M%EIޅo.pB>nz/]ZnH'vYom޹G+WfvObUt\LZY*dco$fVSa;KpU0=aI2̝rzMWŏ 3M__TW?qL?UD`řxq?_{!HՊ꧱Fxs|^OCCCO$իUޤ40X5xJ=a[egU}B0$oJpM~Y9?   |8^L˹cOogr獽Cjfa{1W fqat888x= C]F'=1: r5C&L> Jj"Ep MPPP)bZNxoOBgG=6zfS"r9+8d :L#57ěc{(p(P<E?㳝'ĠL̰QPhnI0M6G=GY@qtPP)b.?1X-Kq6XoOhq:"-Z%DS=ϡF3(;ɀfK|y jW,Ef{gSߏ,J]yK"cq`  |aX{o`-L mp'otL3uDNwv'F`_ OgV{Έj|+y<wR VpUp&E1(0@|!ÄOy$MS-TJ| w^eCCCEI)ZWJḺ2I:_qkbqiUI# 'm' 9}YzDZBAfqT9ZJC#*I)KoXriX#݈Њ9L8Pjn膈^ tCCCBo ~eaÄyW~6فP~bԔ0%RbT˼.-Exzi2*Qb͌N8{`CloNp@~’I ^=CUX@"dl*\&q'P't-i'ѧ5A!Ц!)3b%5ΰdMCCCצk18GB F (ǁ1nDBE1`,lUg ր[Ǡ]'Ñ 2s2~ğxkh3_@60U2DZ!n֝_Ud9)+`"h[},*hu0Li9!VswbrARN d9ϡGx HYbd7˱=q8ltT06B)*&M\bQԽM +aIz͹AN@N䵌jL&h*L25QŮ*'G߁IeA =%""ݝosJ  |/r/o6B0h#E l}9]Ǐ3T@좃s m!H *= tv\ʴvc+_ݩIʈ͘a{M~g3;4B`hg8QouK]| B]}ɋZbesɈ vh ^$<88x ^t ={Zy&bD3%&_ֳ3=U{7F+zu<"9>@¡WEWrj?11wVðuQahEƲ) R[N`ܝs%?2t'9TnHdT|NCC7DY8۱O,x>12iv|ҘnX\oPpQ_JWW_eGTl /֡^u z˶;'iBJ u1a Щ]Tר)QhKE{[:=/¹yjdjSBT.t6n][xtkD  |t <,Ղ7җ '%3{ G)7[0UXuw >Y N^W IB- H\XjwH:*I-%\ On\"TBeV.;_Uk'B^z}8DT Z@!>M&c =V?cx}9EUȉ7 B{q|l`Cq21E!3k!ry  bZ7楹;wހV/0[[^%bS2?`')uY+VkHO㿂.QNުApj]?nu $S$Ca YYaoC#jO^ѐ aqѺ'J4~.98)p{pŧޗC疽әlb1S68aq`dTOZ'-0G #^5[y{DVLo TcWeq;$&ҍ2㰤]@}8ZwC?G~֤M(Xrk%I^'._k]NƼ *c7"༭ѰC(Uk|?-s$]R2{y>A 9xA [l~2ՌՋJDVߕ1#3zcphDz8HNgx9" ~O9WT?#rfbg[雽 o6;dmnQ %,e"I~J_KIARoBU  ѭxBs_88(p[q-Ί`X] ׾u#  cKYkKJUIY4L kӠ8_,'jabzA^2mzz jh[o]yݞ@ Dus*iDC!~rh 䍃\eu%M:n̄Xzߜ 'PP cwϊr0e`ǷnD,BW ;e9V Ǐ+:S8>'y- q1nq*3>; 3ו '3v(\5jOٝjMZg wlKfCf,tpԮii+=Z_8ڤ`,f- rL߸Sir{sVI  |^/rqEB/zgY`HĬm] Bk(O,uVQ"\qpC30ɛkDbi9Rӓ>SPP V@yH} JpOϖGS;',K`8K VRџdO)$$oR_<w(ɉa/R^ԭE#͔w^]0 UX$sfv Md8:ϡ |rJN8BR ׈qDe^v&en[J/=YT98(۲ ΄5wif-^)NGtCe6/<~'Jj(&!Ӈ_ ^̀q>5ǶlU)vEܙ IjDŽdmI/4gt73vCCCD4K*ͫ_zUy%^ ("4u-9$]E}A6 70| oLw[⚌k/zwpJ!h<aGX [@Ȓ@]8]"ic.vYә \XBK4bb'^p1[w~S5 Ɗ rX[3S<+Z!die|G`V#Է nPoq'PPg9ft~>3#'U~cgtLܟja|F@,dN&Y'`5#9EK988xAxhiakˉ-^܅T1Nc1.ddF>+1+VlK2-c@gI+X„s2ɉث&fԈk<1BrTA]^Lu.呡ܙp۵j 50,[GF32^t?yu(p(p(p /{*δ kfHl}+7flCű:eAZ@au{?IP qtCVE"yDJuoKQ,A8ϷU4D5 .>_Uw(CZmq)@Ԝ}\~zwաEwqD1*=g6M7jSxbR&~!C$08]BF%OfV63`e +jg¼W I֧>U\E:d0V J^-*`gyb[Q4_BJdKR0k P*IILҍKM^=jC:_nޗZf"~d]i9 oAmkd q_i *&T? IxPJ8Uz vefYu3Lxy5%;$qI PGa>АsUdֵiߐ6fCy+[䃧W!ŶJS*оs(p(p($ r]-Ѹ) dKƸn|ˏmgDъJs fk,2JHޤ%o8PM>oO#rITǺ'SaF;Y^βPPPP! 3;sop3=>  BK8"|SPPP ڎ畃lK<,cz_",0-=@Ke*;׻ga>9N%jgl!Z"kC)Zq(s,<sᓼqTq?:DP'q(p(p(%QrK\21,Dlt [wJLj;ҙ|8&4rRBtqEl3MVXU<5-p^gHMܠ,sxhj$q >Rl sW"ߗ4N_ޝ#a/+qVqآ0_%0b)(GYJP9!T 6P<a %LVGB#܊z{ȳTfI2yӚrVw QT땬h; +x Z p*n\B=T#7iCCCϔ7^RYqRX'\Lٟug<]^—w$i!paD_5@ɒEܩbWVfwapma]8~aQ?ϒs5(*SjK4\,Nĝ#HϢ:H2GıIN29C\.т0N 9 "&fk3(I!/-1 m{$ XL ,dw0k6d حac0whtu$>'z29]Z:{]e8ۄ\n{+?I<=֨YZwQt vkK7  |1!rpv)8t?Gai-wOcΔ+_+pHt-nN]pö́A„Tuӱ2M~=h?4vfRy1~GP43#ʜd Kx1;CV GK$hd_ ϛ܋4q  |:9>L.%_$QfI3._]c%iPɤYPAщyLħlv.EƋ'(`E _$ߏ(t=𥲘5f0N#D#nѫ!Í!8Ѵt8A<޸:փ~2ȡgA GlDWǦgէ"9'u3:,c=Q)˓"1  | ;$M\Z/;9}xEv |I(wH~7êl =|lbXvLW1޳p s"pIDsP">@ը}j9v* x%AǟگA98,(`ف1o\wf0gէ"QwppIZ4 ;/u3joTj,)R?wvLE _DQ:Oļ7LoqxpL9bf̀ 9Gk>k̞''$ɪE{DeN<~ U_/e[XX9yĝI==l 8+cnGL0_"cҮGVgv۩vߑl/2Y~ ˯aA^]; SK7%2]Iꚁ%HpQ܌{)A {cP=P a0k. UN1*yéa$D ar-p͐ۉhƢ?\B60^J q=x'Pˠնl;9AŶpxP ˞9oJ9171xb HHjY\&XV{c<+;st~9 J817BuTխkS+.?U/jTݞKT>*]Jm`,Q0/IIz~d7[[e5+[n$ˬ EVV~&z &rB GhK ;L YH]Nt`i2PPk@<ªT`,p(KW!+ƶ 1,o(VEoK ( fR4㊹  +`좎TkXmuPIΥ]kᓤHJ`q+F8G͛tc' ZL, ̀hz0$c-B1=HRNUk+6Zy< U&;aSc%XU=Ģbى 21kaI~Tey ʕjc͓UqOIIxt?!iQ_"vVBG H U7=aτM>ZwDԔIkrt_gNM(&z{泤TY2tm%QP*z݃49=Tzu#Is&}>Lk98(pC[cG|p5v7z"Ԉrzk@~^W1蚋 _\k4Wy)?vrʙ&QԺf%O`Rg(-I%lG.T"#f%ўW^ uƚC'8(P]m&*m>ktok?8)pCzYHo %XB0U3P -QZ>Eu1F TtL0I$D\S|*A"R>"@*0V<74APΉ;jm-diBd`Ź TSP |w +kBjJ&VSHաHZ׾XF]bz]?SW(m݊\!k+cWWɱ*ϑ^~R]K)V~oՅ+ ,4ɑL*IcWo `@pT,s׾*:[჌q+A;)zEnvZI3w$=M(F ;er+X&I  |1-rgx^k]ػ`c(J9صiE?r2cOwUW+Ш!ecp豻p ]S`5A|նfsRb*3,Eϸ5Qb:lgO}*gt&Z)ޜȢ .s{u-Ԇ85.OljCCϗE;5\IVףz^# ~TC<[FE朖FU3Q,]iE$3~RcXO _C88z'UqU7'oޖ2x |E݇gս:EKIJ{KL'Ojb"Zf&ac.r+3=ʜ'4̟&/{Mz6"?\Tׅf )|(/r7ӏK:b/}|8};qLM7lz9T46<4_bAUWGJU[32}rk#3*Vg9U` |cXS%f/Eua/E q~͵w;1D$1.BJ씹"p"mk~6ߢ'~3|ğOצ(7h "y6,yG&69JPnjNܰO퉕LwZ33&bU%ӚW}Č+Nt9YUTWdªw|c cn/K.}<وLJ-wMM*7{M:bY8srNs[,{_v ֋L]p4knT~)a*h9g(sHw}mr(XQbR}0\pw#s:.JV?KXrS]xL;T:BKPL'1w Bb"=T7R27 6lH#`m;LVFmڳ `*a}چv˪惆 Ey oP4'LUpgoi?ZIo@mF] Z#i`p c#9V]GmOVUܮ]n@;DpJw̍`mM ۗ'P@y TJS9gry=7ۗc.e ]k=/||Y:\k5#Q)Zk*]Oůw=qFLe 센W)46TkL,zt?2 q,#)<9| "y*'^@b:> prUF`Ӻn.~r(׋*5<5P 5Dܬ[$6FpJu/Tz#)…W4רQz>:,aCcrh/ؒMzڪ5]lJX9+;W/}9QU#lyʏsg(][)0/[=iN|6etAaX˷hQ8E0|Ffꦠ8[Vc+5+bB&kC#;O3 e y0i0%e}[pFI#tI_Z6QP8 ظ Q 779mpm Pp]hwUm:T)|_]?dhhNfzWiPH6}@X`*7>BILYQ~5 d"EEqB6 (CƗV,gqkCB"rJ}I;߮W*̄=Nd_ez ;-s@4Mh_U+1;@*Nnu\#ƙR#SkruEk_&uTB_Ƕ=+1t/џI [(Sb˱iEvM!ux4UpgAp%Y3WUdJuAz|U՞%`Cl9r5Ջ|)Ļ0i:COFóLu1v go"E1;m$/xGU|u[/Ef82~u>X@򏍢YC ӡibe6Ω&)*7göR/g6;&몜\17Za%FZq7x j\] Dtߺd$ZϛZJpA"!!`+:G5lo&ftԑ~FFŶheSuM;Ȅ9#u~t 9}ƾۘ&7hlڤ8&i值a7v7ITલ\ MüD_颤Ln*ϱy͊5=f oɉ3ހStBu"7D[ڈ/=lw#tԦfpLrGi˜3&XOL= fe6@*@0l~4 MqQP>*i#7?a>rxC|xiXl$WJ%MkәCqrXmMI}PRyrXq}Qܩ, ܱ=2:e23j1|b6 ˏC[]ɇw3 pvOu38zԧv*lpa7,\lu^,|*fu|*JSy0m1D_KnαGi湍>ǭ $שr,Z#/Po|>r"e m53my|ظ^=?ӸѼaPE^g}*X, f^f Shh2Z>Wߝاm!?zwa؝{E/ \ D^`ơJs(,i[cƭ~~O8?J"#8c+AsP>bmo֔ӑQ;ɭrDxqä́g$_4~KT_|} ~TbK l_bd]ې詽8oh9Iҥqbx'o|*c}\p>VyNޘHA߸C6rmm̵2O4iymED6 q*bd/E)u-:M81S]nVTX&4b ?RelRt l oF-_3os[J䈱\_Ք'˪jԞ$8p&=-0UHdM :1ڂq[ u)|Se[c%sY"|&I~h?D|U$ .<#ǽ~c6 7ۂ?˧RྖlQZ>K N4g325Sr-i'i x#|U΄M&&U#5x,E6H/xfpdaAG~Ϯ[ƚMJm-2f~gw竭xðF3a}9}Lj??|g 7b--7Z>Wg)H1 "~kG?bjXي_a>~p13Y%6ȬR -.ǵƋ+E\ ??^zq_Ah'k:fNO\?։< /0FD3\C+ W=8Ʋ T8} GFEB| k7cQ dY(p0bտ1%?bs7iDi6'xKW4b3W#6KU0ԎHϹPK2+wCPpnY؂5+`E T{t&}@!^*덏d6kWJ^i5 uoGv~Іm%oILJ %\@^Or(45G0Lʬl$o!F_̈́F}l~+2Ww$f*Ao{@^77Ffo.p nBT=^=wx-.L3":*|kf?ͽu-䯳UMlQ=+ ~FHky}9~BPK8yU{V>Q& SbL;ž}l2S>~+%<C7uTķ7& *D]&@V̦\ ]`{~.Nx^;:^x|zfE]st \_1ni eP4q 4K=wqNbh{}[/>sϾFdH*?8^ t0k:`&Fg"'"6:hh^]n0=[!5 ӓ0I#hyW>k^-q,8f&Ɛ_ b-F0C@Y]}9WZMVZOZk%Nc[7߼i`e֭*&t)- K,ݫmRaԐv,Lp ,yxsh2|53^CnVUP]oGz(6ScjFLjH=b z]Һ]+mr]@ش + R }hh.Ѩ obZzۇkRa:I[@(D5Jiv0rTvˑJL-{l4Q# &!ㅀ@0T%& \7o9N\괵p!o**YA!r,fߋոodڨڙk|MDDqƆIŒv4]Dپ|9 0tĭ|GV^}]:7>z?0Ms{i>QL,/jk[ hﴽ,3KXpg`7 LIb1УkfK`%'1]_Z#pB8Y.!G:Fm5ɹi[#RbZM6-R`Hw$q]t^ñ#75ynib&L"<]~iMa6+Yyc69i9}'rLƵQI h1;Tҽ\BgMM8tU֞Wbj! Vkkj >󐰆Ch]Dإ幮]i (^lY(&W}=ip8ŰBVLp4V}jZI| 1v\&U4ruK{7b\A5jIum;\[YI1ЦAn͍sA@&,7%b,7PbkkK+Z,lcaӒB ?=n3th`ܻ!P-&BHE|~uB,@ʴD Ry辜WΣ:bI41#l]np"6Vܷ7QO>&YuxۗC'oVҷZO UNB{>YTW4)]5OnXز W?PE螝*%J7յV~+qj3 !ѵ2X' v2Ęj?*ո*窾|SBg{FpI]IMh/sltcw63+PMoK7iKF+Wi<=wlӅ2ۑM_{1m&|N8oҫfW|:VNscBH[Q=nk9`8ڦEzw؜ye"=cfV:qqd\JE&h/aa@Ȫ̠[¿Z)>L,iZc`;NvbϠq f"blTq1>{^PUlc|9ePLTZ"\Y B\5BX ]mn&EMfo]֢Bu3ͩn=B6ʧО\$SGlܫ;)|*:8+'fnjhAzԸY|]L:RtE[_~=y2ieN䏘'Pij^mS㞾;6Ps<-.w|YB!ykCtL++`V3U Cd'`u\ ԊsKܞlW43>zOQԀ|-F8h)1fQhMԫ{[qm4 e 4dre"k-9sYgH(6ڮzqo~rd*=#"l̉`51*65TwB"u^vۢ*$o#Z-( m;Qkkb7U0A}LK8𸢳gTqnL8r{A련>hrOE[ܗcak h_}%1ܰ/gy I}o}D|̪z9j#eyG3x?V5hDܺ PdRoq_ΓNM>ynZNqplwȷLޣH:K?:Vy[[?> 퐕ay~UOl;G|Usm:+n-VAV,!$hc}]Sߙ|֮^># 0V8X0f f[e 7vKn ~f!x_f[cPm(a- ?qLb$3s6Z_}sM]74X9dxxnN1cmۯn5gOOFp3C~uyքwT%;W~܍P/Gg3C{VS x|R纒J薛\>FivG&WB" ↹ {m?iGj\rTd*{PdfXd3~)$o@¾5|Uk/7 >Whcv@kܗ'wINAh'DN> ݣ> ,'m%읏{=+ޣBħSEygA@bad}$?# }9ϣN=G<XCoG~]8ۦ}ҥ(;a{V^__(2'iZζ4R^k=g_7|辜^9y?:(neD(w,{j2JbG~8axUשnywکixh*TkBaG녵$0*sl=ճ_Fb: 8/ ,(M28e7h#ɥo_C x,|r2ʽzc㳂YZ1pX{6†a¼Ȇ8^"Vzb; ]>ׯ&~ápU_dsEu!\c%ҪPPP-)a-:X 8qXdŰZ IlƝ+\|+Pk:&K Ԋ8WGBU pU9H%^dAB?w|4P̌r'j"63'rY) Q !5'~F%v0 |u'Yrr> k6R -U%bx؅"~WM0"UkW*O xpY8FQ76NkO%?h-z qT4~X2,'b; v@ pv&wYn, H^9Uqy`j \P}Cf{(p(!r`Ћx}2~j&n)+?h9dmDa8JJqU> ZNz =ju^򗿬bL< m2)(j$ !JmD]/QfΉz] s:1ϓ"vt5J W!M5(j+ax%yox(p(xg؉^cLI-즩;/.Ƀ`y Zjvm{fXޏ'K ew)Izux!h\JLv*;ۑJ 6Ye_;Op;zl%7DNMk}&Pr`(-jT.1^ȳSHYLdtڝoȶm[Ĺ7vW72!9j*oCX-˗UëC;u?7rl6澜Z$x}`ճY6yAr-˱W}}yMX4F|ǭ^:c_ 3~{7Ή:$GIN[9Agrj=ϧFv_۝MUṋ$^#jEkSX>6er"?;AsIe}TC3D"M< mF!6 ,IR rhyf5`e Ƌ,kA1N׀բ +y7L$WQǍ⥞OWd k^qEe?y \|T&cz*6JeTIhG޼xoh(lI&gkBbhϠ{VZjn֯DC JSNn 5m sWSy _5!S.54d77ڣ/ -Dz 4[0V ZZ/p릝PtuFvWTƾI>x_NBlKru˲TQ>5I7* DRw#NS-_tY&ū=~D*}MrxKYxY[lAosE`T<>Y܌K*ε-G۬?%l sWNk6*@pCz?2Ϫʤ{ڪ(/xCr"G#geg磩NJ)aOK609aQT?+Eʶˀ.rE\#LT#g[u!@|#{EPy(3OO@plkCUQFFmE^imգrvV;4\;wZ㸎!›^W *-6#DAokۍCPT@bO HËh 0*kb }DT~2-;5tݬ +|`HAtmO8W&a9ɛr|Y##Q2pf{|oLCyk 45ƆS 9L -"Ӝo\tl"JT,OLVgs=K7ۊ## UDK?i'?:WOBC}$oLVo1+qPO~lDuPBoȞ^}JGƱF׮(P:ZC{Z !P-?#2cHպ &QLFЗ0K7Zeɀ+ Q=mSOl M]۹Ɨ*I{ssWս4߇g#6z3 #uӡv?o& \~D]F \;LDU)`oD 7TwXm,?  tK Z4uin,a-n+h9I3/Γ]KK+IbN9?1$:@ 6ZT["c#}:e>oC0l7"[1xa%7q P с+Pm+F/*;8'Bm:;̆k˷:>)x=Ŝ2:E1+AjC2(meu%Z\41tЮ-B9HL3>߇ga8T#5 ^e~/m;x%TdJL9j~">rAŢyߊ؞N"av!۠b~0fyc4fCdO-^q䮥Is}3hq@e6//5#8sAJVb4N7hof(CUeFܭse6}0W($Aks5A2eG㸊 .3B!l7ZKq| ,NګY] rX A#EU`~E[b Ӭ#SHEuf6 <D")& ( 1s5iۗ5Țf MM?2v1#WJǴoDM)p&Ao[򴾋ɘ搅 = OŚt3`u5Цy,UUnx(v :ﶇU!l2V}{N nK͹ lۮe.ju #"&;v5UJ̈9~Jc3Qh]urXd܆ CbƬCfVtpLrۦ>U}%gXZW-L椯=U sy_ߟHا(dϐhDOP=4 V{y A4 AzbTl*A1r  2;9D"g vzgg,aC̐5gTi͉>0{]66SDd&"cre+OqB3> +e^(vttޑ@oK03fT/|ҶzKUm^A~ǘB V (h,$`%cx$VgEN ]C+5ƴ` [::5bvsjUO&wD`+5F}*yf6KJs TϤr?ٲrX݈[#ORa-T]z368V~jx}1ɏ-wOfWs_dnk9DX6Ɔk9ߜdE,& 4UgZwva)Qf%'P&o"jRe5446 Ik :9)>ȥ̺H{>E(DrfXêpog J8^P"ލ B)! .~ f! a31v<6u[{b"QM\5Ä㯴oa4_N+qv_ 5sC6\ B S ub{nrl;1oǩPiRpM:Vc+m7k2 N[~Gޘ-rn*a6>%mZneVdۡ)MDbʬl7#k _s/Lorܧ"n.7,QO{@] :rJ}]$:#Htz_ !mL㨢TT /"zgL9cڶD.ü7nPUd0~FrkDŨkWG81:ptӵ~gfilnȨY@Zu]߇gu} uA`<:P3_Z4еkT7hs04&z 9߄}IlR"M301UGpHfۧŰ|a S\pڄnJ "i>u|'0)? .!N/ْNԚiC?y#/KGYX:`qD M^d߄cu)H$hy<, %Pvbiz~ɦg-%jp UOz^BtƟ>$#uCyFז7FyT40}Mf$oq=Fj~??w>|/7ֆ&:ݶܗTxFIb-q¶o!q։YE7ξєc!ג4–)񼝤*y^.eDc? {sl„d[/Y>;Q]K+Il4S>ȱk{*'zr8ͭY[Q*㺼c}6|u:ĵS_u1iQt&h>G + gC.;f+#JQi9{B$bm1 "*ϣmy_ZC2jVdOxV_`J#cu7uY̢=wYqE W oOB~ ġ>?Sym|xnb^cLpom҅G;-xƽ\ߊ)p_}9=M%dCK>ΔCq[J;s Z.Ko8TtP?;g0TFZ#2tG}[6"vmktavo q0<HJxI'$8.A佬ێJWfS}fs0jw3qq j=n&KIgQG6ΞW(ߗ<&+|l q1T;J4/?+7H/RNn˿>2B9Q/r?Ǡ>khdgɈ&r} 7_<%\ukeK)!CXy8 $.bB, K?5w*:i\uj.k+YbhLDVp"c-ꔟ!kN, 2nr`"N B KCO_].ѯFAH C뫺jT9JC5ŝ{Ůr|% X]b~ /ݩMp}6;f[7zaR}$bNrrssj%bSQBx )7l S/S>&UE)g.IC'UzܔZ pc7?&Ifd IqծU?H'J;j} d >uШ)6V0s?!(rwDžDmqob#NeM[z7%“2{[6is\4^Uq3ĤW)ib3mA}D׵T(LAG&C% f6t= +Z\cu~8n_}9TukҾ {TƋ{\ E\2}fz`6}þ;ʔYo+r4qL(3VN2Ut_ڂFô8͸D#,D 2^x#B5oZWRx!HVǖ4 ʋ#SqS/S X}PJ5 s1|,~]]d7[ @  ؘW P]sTn1t'^T@RJXFhJ6I&,o{DVzkנcZ׋6늆eS/.tb|6\7`qQ&x1v IG7TVX]ʔ@'$U445;;}-r}] k2%z;ލ0nT1JU&vDHD|Y%ZRg?u!,(˔S`tVLvhw/t gq?#BԨLZ*rh1S:CKuM w[v 슓ÇGtԶb%HOrg^^qM`.E #r]8נ ޗ\$lFnG(O}1F.Ac6|˱s̚K"!2-!i!Wˇ m艀Y('q L}^k@0h$hmrK)[&p&I L$=Rޫ nwKQ`H:ch:4F! Cs +7 "6 n`ILZ3a fnTuX6 G(3{i < AJ>anYȸ~oG6m-s!V; ~_NgRaAjj+)TZni/1q+L7oM & >թwfB~Pa}ҚzWDêʱQlJ1(DF^e:uGvR#~aW2_jf@ȒAX0U d^ʬлʶvjqFE0S!򚞮v垆iˣ*3|dPbOŮjm4~F*U@<UIT2L[IԑU@~#ZU,y 9 o nӱ9vYܗ66`ǃ^4F^;t} ׍iϕy3;BW1glz&gOZ;c㴏d]%NUkIJ"u=-:XC>o_z5Ez6&0tvgLVV-a*ցbaqЮc &Z)S$_ b+1Vih[ j]FɪTrl[ogw2pXt3g ־@m \7-n osH1 { GKK&3p\t;o&&GF {庉|q 93zwa }Z+6h+Z@?}0,/0vs'N-82ƫFnizI՜wZ6 E .,K>}98qs/HHfC9V/%oB#uܕ-_ՔhL/3)Ooy]zXflam&>9KgP VرE0;󘜖V[ΗpEsdSrqk1~ߪS%Vzxn;>!Q*Y&o8 EIg/w\KWo4X`bJub%OI@;jOem77wqI:r̴Ɋ,Q7³s?6׊;"Y;LdhZX",NbjGdg-흻ly9X镾#Ҟڶx>!'r, ZhkUVtu'x 6sv:EziїЫ^dӨLv%zTo7[CCC뉆ߴXNK2c[BX +D _^Xqd@8YcD;I(&oNvEXk\/o!DRɒrɿGzZqAw@H5((Ip> etbPz,H&:{ xPPP)p?ͻ˱Ckc,ñ~ ->vX, " W%>TN\7>b"\-|\Et-Kku.w2.\1=K$eg< T+0%*z>2Ϧ}B󲚦pYj9_L)DG'ymCB8&+-|!LU⨷lqEP'Xt;RCg`Ƕ-K\e8AW ne*[ЕĝHksWf[N-ͲHc@p?+[It6@խ1  ,cDm?Sl;\bB'ypxU튓U`dAJ3`Y4𭻽<..E\֤}b*&V .) ik2UuW Q5DhQ$ TF\8{,yS1' kKDSg!og,&o 6g}`xwV㎑m;$4GI0NձS 0\t"'I6ײj'?XqzFV!fUSZIIux9ATͦ|0/OTzi8Eg$<4 |㩸VT/5 6Ddfv@Dv5_&[X ty   %-ً}k$vo24qVٲ`%f%ĸcԂqc:4ˤR\mA;%p '5XbJU6-bW YUj5!\zs+A՗պ9j:eUDVrFQz"㨳 36TgCC k}9} 6śyo˞˳Q$fܦȔ"H`PyB`']ҷvBrsePU{^olq7wc/Jzv<!ZGM){6??=`ܘm6Z`#l¶aݪ/_`>5[_\`8wSPPxаF!f~_^*=M~Ujì '9P7_~a&aajՃC:rk@>n>rt~Se^yQoUVCDL yCqxvvѫV~/ߦ!oZRXsE6юId^{gTyA <4/u(T |6'=}ER}1۝C.yy1ͩ)7Wvwm"/Sp%;p|xM 2Tf0.p<>rx.Rr0!Xm0Q s=ZAꎀ! QK71&C#7qV+2I׵kG@pzI>ѹS|D"ϦfG&yT%~BY\͹J]e_Mgs6aI 4#㸒N+8G<ϣqoVW/[1 uR5'X5OJg_Q4šÔ'1Ӿi,<}{ͲQ%td15S-4R&>)PN_Lª-j0@ڽB8 Penr;-E]pPO€(qiTwi('*aܻhLK{DԟucW#ExFsx6dI]$Y]kOW^g5a\˩S<2+,2ѹ~Ń !PM}h{UBF:Ӛ!V!&̑7gy*nޗ}qX_>>,]pp|>~}PćWZ>2q`B'Zܑd2lfШ/=v|]kcKo@gC;f0-x"&J)Rp W|:BW4-WqẼ8:|!s?mfRZ)Iz3KlMϠGAaj}rM"18|ON fÇ r-65ڀLd1#ǰV~tݚ}+Ps>DnB, o`)0!i!u$[VXe L ܓ P`֖=5J1OLIЪLIX>CЄ1/0!VݛWŌf *Szev0W^,aܙ\:Vд١27pG3OLL{e4w]fk2Vmyx*㮍[m+= j4_c"Ыr$2ygN62VxPVw73%#Zm !F TsQ>bWiyj_씀 lcsUc1JlJ.vDX˨d}slc$ݢW-WP^jz5T5i؝*Bf"4xHa`;qCj;}kNsR/z;(:o0ڥ| *%WowF2l + iЧJA@H֞ ltXG9 eyMZN<˾rM-6uU5Aо6W-!N|9[k|u4} b1ӫ@[ 9;Mc 1k$u]_Mdu~c/9P}ȶ`XIu˧\ut4^^Lo:W~,2S:r0ӨaUps[Aq7aUx\`jVC)pSH 1dy?C=6:e?828(*oV*=.Sltk$4$Frk7E;nb˹fJ1mcqTfsO"w $>0s*7;(;1|*ڂ7+CХp nYn^`>vɪ.7P+;3Ub$UL{櫫ݰ4R]pWL(Hhw)*neL2>B mnƏF[.u6dn!@ =$ZDєO7 QxtmJh4 -@4+e+i:%]e濎~Ns}d]LٿMFyGF:xEG/'T!9ڪrƳߦq; h6zQ,YP+7ţUPK3-|   |.v|-ˡ6@S8ƿm_T[%k6x7$)᫁T UFNN\}`Pifm$^988xO |r04K3tZ1nZ@L)٤$PK<zcw[?>; rڬcam6t_F2 R6| ]'vzϪ/T\؝gW!?ijX2L6- M~L!&yޓ k徜[!!Ǽg?ˢ%&|x]fj8YyDsLhrMqt4^"yS H(p(ePcޗsEǫ+jFoCM$6@4$am\ƦLjz G$iPPӤ Ú8[ޗ1Zok?;U]i2,,>(>^e/i-h#;CPd#a'iP೦G/b99PBt65m§u9_cWc=L+ww2iѺ*?u ~(p(SSt_r,OGݝWO[X<PڝƩ3^ &d=ۚYc̴Ԗ=oPcV;) h4f%:=nmnU*8av(U k"*uLIB'jc/Ğ00.WI߷X>CCנ7l"^o%u‱nz^gaHN ua*!Ê).oo_h1ju=g-V "+^ñw &r"AHWqgQUr)T#ҢڔC;$e ժ^ T }'U!QX/2YXrXk̏PPPaX)'`+ب93Wbl);Y=%Z+g2 _2|̝#Sl?$oz5V=;_MPqj*+M?i)]fy}ç5i9t+Ze3u.rUD%i8Iôр_R+\\J3΂WͶ*z&/ dRt$Jl #Uf1aų-sP]鯎/ӽ/_'ZQ`EQGzv>k rޱEƦ1r341=Xcܼ(vSV2.ή,4$3|6dL0Ͳ5Zʻ}9 hbɛAc0Oibml%y z6N+3^8-Å G2$o(lO/;#z=/Z5o@Cy_wLbCN$ZM*3 cC=ka qJM$kٷX>Iagh>G׼1tR_P -)ѓݗT:tn]&Bbj8<~g^Ĩh-1J4R?`y4nN|FS.y/"TŭCC]3M: q|"W@ncwuRBM!-n>@7en@[yc߾t=!y.Nm~uD?ٗG!iP(pc-2Eh+LFDkW6طCH 88@9Ǫ&ffyD=q^ň z^UsH7Y牮Lr;{@ | aXc)&o[V JO#_!R0qL,{ VOb$`( 6*7%}M.i#mx#Bc]; FnZ4L~~}͊"iP (yj/ G˙JRaԕCM\ŽnMd"yj_>0br)Lz.G~'&~D⟦B rBe11cYGh砨;h9 eRJ=)̹#JqڴiSqmpckE%1q%E aF( 6u9D~z&$SfKWE ee ,Y(ùvb Uu}zMWVk2 g% qP,4ԕ37S߇9_%9  lhh+Bo`>܅GLO\ 4B'kb!/1)r%&R`i"L03(Sps{h0`^:Ax %0\C{Ol,PDrDБЗۆAMlrTt`썈 pč0 abCZ@!◈a;"WuZ#/~ϝbZnODզAra}PP}(`q}#Je]07&~PW->>Dlz_@}䂸`mGgoKKx9Z"wm"0a>Nh%lcg5 VZhnh`c,L\%'H&20ǧv2*3kܵQARH]XuN -P[n6@JN]zhtFp\9F+ ` 6֣g`st0$Pխ""oV,ZպīVi7JʂbtT}y(p(< 9Lj\gmN(LJzeCI5jלBlW™)ndG$4H^װ{ GU< ϕl{NjMĶpgf}/3 a-J֔ugZLEEv TY{VJN ^1+\G%kw"v nZ@@ش$Vo2%>NDd  'nk9"|e^9#vC}ق Gc\JKb֖6YFBӫ)^a Wj4^^?KUpbmU)g|@X$ˏZ̘AU8hք*0t@vtYc6vc> a2:r3h[gܱk\z87%{X{T\ Pkf-B5PLm8P)p[iv$U,Fo/}i*3 go~0!3W:׃<Rz.TՔ?g͚_\6+Ny(3~0;z4d1E @Za ŀJʄH?@O04JGW/aDQɹ =7[Wk5PҫգFIQ:oއEλZAqMk{8;NXaZOQV3pOtO¡n.|Vs_̑Cq#Sn4/ d2dQݞ4(u>F[y؞GCK@,˩ 7V<4OpZ|ޓAu}j J19Uvv;CѸ['=VAGu3<7(/.*euշGohWGZ&o}8׆`YV?x }9PvCZ3'Ѧħ&PU֞=!t7u*l:}~eGK}{I0=w`x =U[J$mj&O\WĦֿ=OE -Vˡ9߉M$Wbʅ-W5vz5w >I_a 2ؓ&Vu'BG+?gO9MlC\7%o Ei2ϥkC(SzP~Y,S&# &7꒸$}ÐԱ&3"K:~ޠ_ĖJi-1<s$3J>OZzgpkD ;0?G rtþk1Ţ_V_G.-@lSQR|~U38d[=/s̍z\(?Nڐ,bR(yS-#L!`icK꛷Mo\V'ڊT/K@}~ |xj}9Av'ڍa??oc&d[6V°WM_lb2w?^q@U>'AG38:Û0xA261jn2ﳠ'w} zgѩR-ˉ5ކl̷t´F6""Bє/ߐJ~xGX>i-ӱ YkCx=Oρ(mX{}9^;cc|s|H@(8D{hQ26]@0;vuȄZ( r+Lz=Cv\OYA슶qn2zB`A1Ţtz;{롟Q]m_)؉ѴtXDZ@MaMkF2!{ʈ׾{qG'kNbQXPW#'4d\f )+vg im$> <O/gAq?-#8.qMZ'*hm8r0~g?S%5I >!NF/vLOhS* Y$$X-.}WqpS7 0h|`9T|9#2 HomF˨;4jtv{6jV&pd򝤁KZں?G, G]C/]wo2Pˮ}G&_bHb:o `k ?ӑI0W+&|p$Ekբ® hҫc9'd$qE~T P:h8z4 |9}_%+HZί~+xKM-ai%6R-L_&OdF[pqw5Y:"hB"ir|-5 1.2q5n+GĚKz\#ݫ,e`hc8E,Wn 4} 5(glJ.n5$}5lAS̟RlƄ$|IefQq╓VtS+{ Z=r[]k̔BUģO84')ͥūڷs]Q0h*iP=*MOH7!djB%&s(xLˉ%}9}*q+'6M':-/[{ )샱5?>Wt1ҲqvHA&EBr+CRst-Qg P+zx y|E/!ss$ Dn($'9;Xg䟦W̙ho^_Jz<7޹Vg38 UFgUCUg̺u fYvsu6`*`e!U:U mb߆Ot57ACM/WA뛌aֻs_ɀ`׏.m_otJƬOgZʃ c:4'kJH `u3X\!O;(<YdX`n5PbN Dq.lj"Cφ nRtP@>:UCq (QuƲ雉 ;PrE3p4}R{{E04"h>+ӴL>޻Pm(p[ˉX6/v֥[jb`NJgv´ p7)z4ֆ_İ&Dc"ӷn]J*+pfTN OĄR\>d[뎾o/Tc Og<HDpݕ&7B [eKo(\B))Juw:m`$}u"Jh V3_? =@2bsD0BLr(QcQ̜ZMzsSic o@df_fy׭Fxb v3˴g+ɵ( )NiR}>ë+FcO uZknn_PIf=>XF<T'ѪZ @W ҍspZƆ³хIyY 1t'^!3hG8Uu1FLE4t@eFI!f;'ZkӴM] )~(sLỎ/LʼsHևPC2gtd{q~>bJ"9崰IZϬƣ7r=r_SxB2cԩy@Lȕ{VlL F뚩Ƣt68%N>{_RArVT,y#~\HOWH+Rs+m(\Z9 {nDP|R!ꑅ| Jb2V}պYy2XW}Z|8M~ø?u:^iؚ*jکb!kRMENO@&ho_xNϝϹ/_'uhw8`[]Vo#7ҧFг[+ =)NI_xO,ogzx w|,$l˹`g@ђXk-Mt7Uy=BjJ@>xO r1%/~%pf``W|@uG 0R/6;`(sǖŒf_'.) 6‘&lkkLO_:gFLdCM?!ms[06_{h^CzY3bL"'r}=7ٮ/$ _h[t6rtÍ)Zb*N6Lyc܆A'dqTCM.2cM0!>łmxl&NݱF蛕YL9qǓ+SmN6{;iGͲi qY>;!3,87V_ nߗüބ&GkIb6x7ɛ>) ,|J/$ ozĭ\8]U@`_=+Ƌ3\gtsyk[V:^y暈+)Ϥܟ)u3ZG'ߗcv七ue|bf?>V3mģ[hۧ/FUO'_kB K{Vq>QT$I Hh3etNLv6=v87@Vy? OC]xwZ/>ϼ/g.3qhT"Hi]>'ܰf&ih}:X˅vz "΍u;% ɁN \xЪuf̞¹9tIhS/)I9?M 6PPc[+*_vLmb& 4>]l/-eN4h!YP׃٪K$Bǝ'oA:B!ob3 =2!k:_XguAGPkm]h" zC ɘ^eh [fۓ h< G&nrpluDojKW**LwFA B3:8r(coļx1S<12%e?f*f;倃&b֤֧/J0 ɤiI+orc %F2 ku d <YY8rIBtQp;`0 V'{Cuaffn6.VP>-yEѿy(p(p(@Xu6H,,{J,\/Ԃ b]P\uثBhaܹ/''fUIU1I#K /@t%=$[Dȫ -1#U\[R#k5#{QؖLwzVաS} б*ix\(V˾d8zͤS7n,3q|ބD}خal\Uٹ?|b]:esvM=%j(u?!C8A 4g9JDQ9)gQpm_K#,,{0 {`g{[ nh] Py^V1"F~Xu0q4"'_*7AR2W>Wuy 瀞2΋ώ|߲K@J'$<A(3!4'&ٹWhsus*u*XcIwAG2Mΐ*՗2B?>SqbrRk{24v}K89}CCCף}!8ȼCϰm#!]2%-Kِp(i J_8& T^ZOp ~넆{U>hr%(1t D U$ Ik ?PW+OAyhPG_׊*\vt I "0$SߞSntx}c#xǿb@1)/G'HNlALx_iV8VܺIci=8jRU bW8{WhȏX4r?яBrNa-NDD)XX?̆zMqIZ7G[G?424%:I U9Ziq$= F7Va   *n,{buz<ol6kιcX^}vaO[nMObpw{]CSP[UyxY&bˉ DW|^>Z֧x}v9GmdݚS }s_ya 73}vJg_49 *7)p_M^uxjP!oBY%ʴCJGi0f`bbyf[ QFyp$ }~etؕ5w6ݗggmDm&q8/>iGae^]+ߩzD/j*6ZߦSH[Fѷ}*IQN9[3* - g!onzڊ'owvLhsxXrE$M4u0hQ޿J7I;mj-(oy Z߸2NLrhK WlՂt}Yٝ>Xf菿o_jvadks{ƞ#zh{0B7!ۚ;{+q |PS Ց7߰]"nIXɞۿߗj7C[FZ4L3#|n'Pz휏K͟ع}  8CHeA cI'n @g;1,rO Wz Q@x~v _o?!:$`&c8 Z/>JYBdi~ ( ޳oʺ8l:#;Xkmȧ+;?_]so/`T T!!#S`pxIZI蕏)tQ@H 8k TeNs|2rpXJ&liV"ۑm$=Cp:kmQGF5Bxν246ZG\~I]i1ҫrB~!G+󲁃 +cLZ^9jEGP:>- p0jgOlQ,uiʸk8dG)T,X,ǫ5z岀]5]52Et!/;fh G7KAJCnP-Y8r8Vnh,"DuDype.wc8Oe{'l|GuSFkȨؚ|l[92 !<ȻWrzm}zh‹wnʠf@~~/'ؚ*wϚ#&+`DV%la`l'5HG|(q)χ%q'1\~6>}u--JyTqlZr~-Aӷvg_cXe*Dd > J&Զ pe+L*R`GףfO7kRԅ ؃ͽDK{ϤhY94[UzJ5*;L1+L0i֐"zh%) &^ɏ`ʏ⹽";Ni'g .%ǩKi 57"j]g~]_Wwu#V ˹[,,A(XP 4cFPs!R1S{>}Eկ#þޗ)LGuW4ѺV2- W&tR>PήJR4.w<2?A_Ʌ<ó&Q9-)QG*?J^QtxN2luvU+~NVD껝b0U%:;,6yVN?k"jZu4$dˣ\w1Wsg\8~]+I7O֨wC*N(E".!tʔIu\Q~PRඖֿ34a[ƚ߽n%bCMp<Z_v2q4C0_רo)12ܫL>ՊЫdN~$$V\ Z߭dTP f~dUHW|u?;[mHaEhF+'2LRpFCV#:J8l0w4L-Z(4OsT:W!r?6)75$$™MҶLq^Syא I?vKcR{hNF"g$'}93O W }['TUgP&(:w,Wc xLRRJ{ W=e 2-{BϞ ]`*SN6KΚ aѰ Bu˟LE$: RS]W)~F} 4ϼ&Xr&UjlPmԋM3҆YRm߷kn=mZR^nGzޖGB | \exukn=Xs^]+!,f|@Z oTTf F?}0g~Cz Ϧo&7Ug6vUmׅ eύ%B!˔GӲmX?FX&oԄ(3 ?X' êg Ӯw-FMl1rMh]I ?}7mJO&ߍ%6'cmPE3[X64w!WYx].fFjSͩ)e'§1} >}q,>>'PS}_lX4>fSty ??n1/6rbq"K%rǰؕVD jev½ZAn+hpSK#'|bx%&>?j߯p_'qCC8KY,L§0Sr=NM~؅rtdJKcE ^z&BL~ɞdLmWHIОS[bl#]z-zr=|KSy }Cɰ|CC"'N$xW_`LP@j^g &c!p?|6)RNAel5E1;IW3|4Ԡ(VNbD?9"W.:pB}<&{V96I"0IU'Ϯ?0o@賣APE(a-lӧis`* S8T㔛<)~hEqLM&GuA%d^lrQE&ÉF[/;?_ycQ5VaޏiP k1\Qsħi`y{\_0-xu}NϦ;-bU~*XH{1ve&b<(%9iFle6%]mT}Wp+&C& g?*(84zuz#q!7=̧[]o;ϡSA-qcha}}ByLoGrx9Ύ8O<:W cFȋtʝ"z^GާV#]8"ek9>'9(pC)˾7aFV;r)5V:6|e(˜[9qim;V$~/Ƚ֋uJ숫v~y`v"|G2gy0v_AQL;Rr6.Qzbi/R/DPX-~_B;;/EG V ӌ8yNё8鯋){bX>oWVͪrJV"<!S[?KoCZmS,ΊU)'&jYw)q[>T8<2a@w[,…1e/i2dp;{΁jv2*7GtEa2]:K $iKO#Hnbr2k4178V} 0elǘ\JB'!ae}/ð*O{U6\j"KvC281׽;"5D2ԩwx+T4L_ ]Go!4z&7F 1Eɇ }_:88xnZ; hlVٱ F$rdBk1eWn-Km)GI x6u9U =2bA&J0ŚUk k BG:6F<5Vy`╷Gx t 2ǖX+UYotLe؆1:BuLS *Fk2Fȇ~   걱T!yӫ':C#Fԧ6z   |81 I\b"ׇp&K"#{ vD$ܠYۦ'S;&6@<|AI*eē=JZN 4c 'ƞM77bK?m?(Pq|lp p%Tc1\bUŧeO~@žUNH!j= ÉբT%^Ϡթr(p(p(< KHd 2'Mp?v.<'պ'͓?#ƬKXQ!NsC6w'!<[8jo8>_GZɛxY{M򓟤^֦7HGk^s m͒:Y*C!*DG=%؆n!"DgUGT"=r   Y);ma@18Yq m oڡBĒWz 7GU&W3,Px$p"Uz czS B9`vz[Nks4&i0c>z>-JAQbSWJU>88xm r1e,{82& |=aحI`lJ_$fupV&ty#>ԯgT98j)Ό0sUe&0XUux=يG\b4NK?Ú4X\~Ag mlzUhkhGTci`[x>§CCO>rf\''lzٟ*-Knc7$U}ܩM8_LvQCbzwSPPSa퓺/ǎHφ7p`X8O}Zo`ߐ7)gSpH2ŗ,ggM7xOzEv Lf^PPkx_NƽڭΎ>C4x[ސv_zvNrv-m?\<@Di(^T}ŧib3tG~8AZN>rވۼIEя~? {xry&ŋK_qKi!s; Chș]>K2 Z fGFm>#8[d;P}_ HorصE}أK+?.4'iɧ>vVx9/ SZf8Ok:_`: r+JӀ y/U%Lh~^PP -YH`ܓN&2cq^>Ks}ѓqOClE0w€AL`LT5mȃXedvpԄwJՐ@`bvx3QDuoo!#Z}u.sDcұ8s5s_$ޗm7^iŸ9bڙwuoBCce7C\r`SVfj#_)+7      !"#$%&'()*+,-./0123456789<>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnqrstuvwxyz{|}~m rj)2IA}L?ˬJm؆!.Y$Pci8,}@2 Vp'Im)G m5wC(U rN8D8o;MV[g)p(p(p(p8 eZ0RXm|e\lwVB)6Ob->fDhlvSr}Hz$eup E)3T|ކ| oJ*Mu='ТHa'HE؞=#@ȠĔcqZJn~=y{(p(R n=bl}3Om JS"{VuLpgNBâE\S[8ɞ~IuVAWx_.ge˯<4FU\HPДH?=p]51X 2/Fg7X:ᦰC<88!r&|bIj$>lvJliˮOE0A~_@8Qx5)+%.P+-%+L#A4e(Ģd X t=BDݡ۠*=>1yU" D(JkV鯝 \Gbk\r|IC~=?88!rVF<pe+%ЁCd> x4~G)1gwS?\N'mi'4]F7{.p9xI#2W8(0ɩnѯO?]zhְa!au2߆̧G-UMNWN"r6=e2Ꮒu%S wU HMaB衈>BUr;sP@LYx+d2L\vpDWł<)$ 3"GsnUG*`q\eP:E#QFZ#W< OistÚGgYթ-r?zh[GuPPP! ՄV`Sp<"vS :iSbb崦j+~,V陼^Q͛`%$o@a,wһ.h YuE(0Fk]H^"šz#c! 4N5aZhO{!)^Ca-e~'6 d@"ht |_,BqomeQʼn11F;u|oQ^xeXXFr+I^_vRXb &ka2kNC?eR tьlC0*EEe[5 3>~TX0o "QSdFhWW\N+o5X 5H1h'E<[P-Xu8Ȭ(`^WU?`.+z[x*^"@GTa0(bZJޢ'ce77!(l(PK0G+Z_m/Qb*%f*,,=;FnUzC_:CbnzK&E,]DYT d @ mokeQL+p)p9Z}9&MUfϾ RY G]dSڢ@]niޛǾʯQ t@/z[I8ɫx(_s}P6`&ze^eH[TdWX8kiC/XNU"^DZ|Koխ ÇzQo2hZ6mtft.Qw61“0k ]HRV}N+akZAs\05С͢"?5'ɦ+3YZCdBE(IJ+WEPjsêY9<7D B0y0->F"q7-M2È+锾}`MℇTy-$ ED-MKpgsp(J8m>;jbv )G0+ku P /Xa^%Dzؒ&!6ݢF|fO ǶW!8[!jޫ_ E"#y<1ZuTkteze\jMe(gI}=ƅVa8$jM>*Q= f.?~օϹL[]R cZNc߇a5#$DN'ry^|TؕbvWqUv>a$ef\Uȉ@ᾙyO$TkkjpB*_䨫 mWLɧXRʀƪ J h_:iP6dFeC2+xmt,ʯi"cˬ81}A~PeN,5"fHJC0Kh2lC 6|l\JllQf˒^VZgԒܷG>}JUR2~d 2"fsÿ/KU#m߯"i<76~KçW'7.崖}7 \L&LS8h$Ywڲ&Uo)44ku6,Q2g@}8ٗ9#rշ zpckfnańvby:Ja=/X EYoCυLrJqe.-Kϑ`!U+$ՄFBUe^ n!-2޷rHƔoJr᩟Jk=hnĜDs\ojBa,m-QFVEw_tsH|O.5#w"@GˆI d#m -PF2^0#avL]&;A֯Z_&֖c}8אW-$~99]Ucfnwa.'fwD`69s\0MlMyGJYِKv`pa,4U|1Us/#`o pRMKMn[^Tx=eu3spZXy|dL^'X ºK8B>~!!uiI4[M]|*S]&N'm0@$E7hJ}b`1zfPR^I2~)7k/ofnر1Yw+wqav:`yѻOa--Xw 8wi~˗UMBDP Jp>HG\6)mGgɷ/ ppCR͛09N)T /%Ln +#u#I~>Fߋa[,Tv.61!R_QKKcr; 7kgПȖ\fr5e\gj`2xj2pS=ݕy<ѭ{r̈́mDt-_ '*^3AhZyƎȻ直|M]>*!PέMGC"1L|J0қw-QY"{F8e +~uz!l~i\~T#nȵNt>:5MO]o\.3ZF­'gHK2ˢܴ,^fJm9#k[nP«ΖKzZk9ktP#HѰ[ BZZywdmHkmG%kpWrmG3[ѓW@h{Oư Dei@wĹ;t 7WE55R΂F]{Zb؜/62cgnI-_sfFSww?^+>^ _., O91^khwRN&6幖hbYFL@6άLx{p]Uү`yi[&!Y&[;6XlndɥmVn ;߰3H`8lHs~ kk 'Q9 H$zVM+׋픁!:fE0?s.n:IDAT$t@9 &F&QXb(Ҟ@+GYrbu4)0nfljn}q9ƭW篹8zlUZuMvʢo6¬@lDBHkTH|[LxHA)e#@H+ PJ3c{Qٻj*o|g+=/䵕:]q gq䥮$6iĈ&apkv/fWkXG 2!G߆ 9$^oQIOz1m+?̳ -=G$&&X&}+1/2: W##km)jЭa9nY*#S9vߎ:zC߆5&$th$/{~O qvBiw&[Mx^g>Wa5̲ ȶw;(c<꽩Az=D}tIE[+kQW R("W"(aͻ٠`g;B=[\[5)ƨo[;Kj[~7 |5%nCB\QkinN,5_mHur~0u|U|̎dY*+ @B=`7 5oq7fUxHs~u w`\^FH8bm\-2$Y!~F63!skkc+Cҁ$E[t> ;xɞV uoYvGx|}H/wI"|" 2m?K9a_͞|}E[x eHQ^&zu]TkIZU;7S 8")UMl/-*OUs'^;%q9z̈́6b){7 um[B1,z D]+wz[̠؃[h< 01»5ek{989[zFț 9=6~Kh:xW~bvz}0;%%6'D/W>ϙJGMSGU>[W>OoO.S[Zj%Ts vD27g>Rlڴ 7%jˆA=ʕ58c]m[ $A '5yq,#]D&BG  j3[j{2b@HBH:BF9]O!ѾdS!QVlZ#dgGgb|:qd+C2ac5ц},)QZR|j~Y?ʰvi:< uLco&Q+Uz[ 5W.3%k."ph{/\qH6ְ˔^l@㿮[-֋GX*MNjUkfOli.%L$w+P'ˠDPy"<]!%u( v7N }Â%Ãn' &`G] >?)wDZep$s<[he~TSNctC6\ WY]dLXT sO7Up~4N{EHYVVa3M[  tm2n,)GyGȏq"MXs'范scOnUY-4wM̺;I@᡽Т=\s=ZV3ò'VRyNy܍Kd~ϰtU/pQqxC.g0~n;2ї˲+:mWJ]4Z]nw!c1$yl׃GsO,N'+7IK[eqݨ "+xZ|`N*h{%4mYk5b}~I eD3xdqa`KLȓ93a6fj0s$ kpԫ,?-&CT}`P0s微C1MBXGw I{UCh*"x}x8䲻#ujwxn`sapW(v4̡;dy?CL,Y-qA$۵`ՋᨼhXKP.TYR;{}2a&c2QOu׵a%\uQ3!|3, n_ܰFh8s:X(, p s]L*|]}UӱFynEH ާs8I&=r:q$8[ 3TF1iZ<#[al^'1Fp}Ltdnam!Ҽ[>\EEpՋîQ $> Lu}8HaD>jUx̻ #i4 l¨r뗞wu171U yg*w&jᨕ? G|1M7.g5eTZUg7nxdW׬<OY"1M_S g+yN>j6iw4iWL )cT=+ -+*0 _q͟w7) TMz]su$ClY$Xk}RiT+0P+*c'9FMG۔aA`uGm"u8wF N= *"{9B)#_z߹^5Ś/M7 &O0b?)dnvJ7&%LK[ Ƹo#2ainwñ,-Gsmp gXrZ(T[9ffͿW_KH0]3l'ѫY\1°q ZދM̻!G̢'5^֭;A+c kfjkra G'<&[UeY_r}X[Lݕn\[|:r-)߳aP I\k+0*gM2BbT}H)2F.3T$kF%)ndBmg1~讗Bp0ڸ4 >9WG>90;ed=[ Pt."ʑ7%7q41~V cߎ}U B$1[Y%M*YUnv]/=)v2 ɌQZ of^GmՎ9[͠S5Yjl>o/ JƦiIntk@ h_޷i֗2θǻ*S<1k65]m@'d;,Lij| 4¦!<;RSo)# UhO%1AuW,h o\ciX3:eAxoFaFxq?PB'TDsPmr5Lp=sUF|e IʺNð;QrCfS1JGH9>Bk KnѕJ4h|M#wPBM`¼zx5AmۯE9GY`hUfq9)D KXgqb+li6vV/Fb kLQCfoA!񑱭] l}My!^CB\$,Kӆ civas;xͺnn4aުQ߰Ib!)< \>o7C]j񺒬FPR\sUp]Gi6"o)zX4фS͆.1p6 ܪo?=B820vgF"M@8?B!ռ! 5pV=2<ӱv FzYm#l~a+̻}j^BhY2 (YKSwfeH{-@l8!F?Nz3{qP5)!V=>  o׊1K 2#U9mSe<<=9B8}-kTݴ/ho ΧetJ{G.w[=>0sH4q2 *9lZ6 ӭƪY{_2?kEnъ?N2wCu M !``pS엘w~uj7j?C\;io5Cm8 {u'Z;ФkWF[l̛K![Ts-Ū A5]j{A'aتvOcAso];tP_wn)vme켴rM#7V[c \턮k.V ~6<שUdCspKuW~94Pu{n`R g Tبx`u/ 3J}5Ka5ӕ>$'~M !ڲ4^,nilM#.?_օe>T]%+|2IE WtF;PY>ob8N5 qk`im;lXzC^\LiⱻXU6[3qm;N ϐWXB?⿮S (9\qit;lGAI(\Wvë%1#1aǡޑțcsi=jnr.P2xbRcDy1ѩߛ3Ez^ .6 ,qd<7hnBr4oRGfw Tyrԣ$i\9,?qje#d,_q}Q܀mmtO/f^KIi qsbݱF8%5 fa_뻺.Q+l.[ӷ;x9ZW<߉NShC索ʛ4^%x;7nwX!b57He"{ot,@Fw\W"1xFp}ፔe]ϤѰͽ%+76*$f(B[v;D­p֞V~ S^z~r͝ Ғ7_xU3R/! whv^x&rb-1FK$12RC͉ȱ|G{ԉGa9 V8jIHK M{o'HÆX[ Q6o=7v[~5|{ə5~Ri!J5w^ۺi:dTfn?ތŪe/="1#{3m+V|7w\g(#A~廪FʈmbRK$6g2k~W'ʆ`=-ڄD⡁Rf3d=/}8J(Ak ^$8*ji7FM^|h wx wA`k*?oC2|s$ڛ2wL*12d!"C5_CF䗞wHw&/&k .^{ؤ6w1&%,8{( Lcii1|nÆU}aQmS7t1T!ݵXץ^]v v h/$ټa L3~WĄ ApHl%_\l/c_/Q搌Z/m6N%-Ě87Au1W8op;qM:Wjj#;B~o0Iã`\_yWH#%٫|4\)V-9|RZ:>SLEeJ= 쮿U`qqHJu/Ͼ)tW}ݵP}M2FCVH^LI3ap/{f j[Y2Fg\gQRs9" ~G籽|y^_,DSmC5 oo+r2tWM`$[ ە58'-d+L+"8^M? |$${9tz4dSٲ{P${ŽH׵5]QJyzw^y~M({K0x[5WŌ™c]';[_8;`C{FL0:7yU-UGoOHV٣a/׷G?E_rfA`g#nz eB{6uր) b=ikf8>/B/4Tp }%Sk|Q`,V2B|UV|^G1[L6bSVDj~Ǣz$kgk=cgb=jlnGM/obDzqA7֭ y.L4Nz!_ȏ>Qxr8f{ [[Id`#T]Ct37el?;c[pmyfwrWNG&5ľs0ۓBm0@oMͅUl؏T#Hm(Hr bī7dNXee&q.[GB04RNfrVF;:˿4_ Q|$wJpJφfg;wgeZS{f92q:k o9U婝!+gN" ~@[ıىʲdNBf"1'P&(wǑ n/o$oCIώ#Z9f8H)tVBʱ3ojp9%{:A*Az'|E~>Hg4=^xf2Xdet<&dU!F* Bxr^]ރE *21gk2UQC2${9prxaTURìg">[9jX &2m=Ydn{]FWjDqrcZGimϞi(M,uWg"FLK?/prH;#J%W!-OG t q9΂qZ"IC_w,W&v ܺh:ٺFݧa~%KYD]__}>=.8fm15#t߀*1K"=63jNTxp4;RU3\wm{V~װ;?'G?J_&.SSm̔gP+Xnm=3[lL$lc͚t ,^"0q߫#dm f c "d;0g;)KUVoS%:k?cN/[%wcEHol֡EcK'F.{t敭oI]kʎfy:'1E {Qf`u`HO r\֯W&8D؞QEݚ6X\4K5r4 זrJSpy6 |$?? 4}P$dYv]zm0G 3'].qӣx'tMدKOoV~՜w+2^>W $( aMQbEtr3šZy7:@&OwD|EU.Q Ncϫ`PPGɶZ'I|ײCc=a+Ș~V|@}EoxF')X!Uޱ@FnG {9bfx*DgVV~VOkV }6^LH8}@! FN'jqfSB!b<(1hR6C0u({@InrʈٓC!Kt%~}f4<`}5uN)<9 a o3I[:? |$=x{9 O5Ccf*v l2:=y*F73l4!9Ƿ89o|?&0,$"> 쎍:"K*Lh&yeq=9 #^s:ѵ dyWiWsirq8D<ġ2Y{pN_-0TuR΀Y[!o zpb/N Wv b$eԤz3cxue˗eucHaqB 9!6t9>F(B>WG2!\/`K`$ߌ2.$kG;E>ai{ 7&4S-0*H6ϭ>E$ 4ĖW/c#븺f}{ac%]w3]YYû@[wBr)HB2@qݽז_Ym?`X`mZE x^X&1z vB@$'dW#6ZqMsщv#, oM;R[ExkkAyYLoJ]9lͿG +$"rIc?o7/0eZa 1Usgr?0xƥNI-34_f^fw*2OChέp?„ТA/V/<@-W\sZKUgΆvyr]#^e8h`mԕ,B cOH |Rwpj6}y*Q;eN^j~aŹmЫYv2qԨ=WT}?HH˱זzwbl2QWcaJtrꥹ{ۺ\wn6 Eز}V|t1`}^iLmƮa-YL%ʻG~U\iDVwVp Y|yCdn&gUۄ r_,2Qga*(,Ȑ"Y&{6F XWizCS&ҧG |޸#߻z(l_ΞaSY.V3m%YG׍+<oaxdF,t},AliL!ԣ7q19Un yl7+f}qC^=ӲiCɪ+!j =UxY|"+)}c $=$޲kN5ጌ74۱T~$sI}b}B͚gCGʌ{oϊ.]̬v@^VbOkf2َ-Tɾ&%刴w/6foBrqzO滻EtVLydւDߚFDImU GXs㌅5ͨz=wF*m7Bd |$sIĚioKZ|3Tl 3Tc@rg&3R<}I57XAX663#xx8#"ck^1AWao30%43e֟'/ M*hkw>a{Vyחѓ4GKVoǒk9 Vu 2R y+\AG $r^NS|Ff~[~2Mn~LF D=? wGC |,. >؁ (pZ q49Rl%̴t8GF h YV@3iT^=3R 0yD0:5 ;q#NҔarpkլiimo/Ng S L:pWQ!oG?QM06fF +V f܉ey ƫ\ƲمICSIO1ive5c!aD†PiY7OSa ڳdΜrI[ql^T$3¬fHQM=ֶAe&2lΡPA"#R+<יELXdFd3 s0\Lz4:$0uh)a.z 83"p,,^짶ݳGl‰YI*q5jG4w![sm'IVʗBzP gFF"Tx. J̧#Li^KEi'ią̒Dr>&XuK%Gj>m?6Q2TGv377kWY_PB?͗R);@P!uhc< Zʷ6:˧8Sp7 n t ?Qn9noe\M|&l}WDǡ&֞Ǻ/;p7kw3uW& 72qB!ytW}GbuoHU3 S?^h6n{-Cc~LSu_ZtL9)AFaSԌڼ5q6֋4^vc,e;t}_{-m_;_خAC;4v+ȘӀ7F W47 o++!f"ulؔ%[jn<""S򴥰lX<&h&1[@mCdMh }t1rKߞ{#$-VnlmdusXf> _ZA鯹]*C,83#U6|~ѳ} FsMzlqGWTPmmmhU~} 5mP_5YAaWtw)Bcg2Qv`KX9WW/$[F?,xu5 paNx ]yg/W&MR'CKI^<]lUs ψ~Jç#sSt]B)^a( 7 {95"a!s^xӵnM\:[%`d9LBt.`dG˚iݠAu1x7>_LP[,f ;0ͨE\..] Q[&\cTƂvE^=W+u6C YB(.W|%) a7j~6d+*Ru0OJ4xJZJɧ#FhSG1M77#%MבBla~dn {3_XLw?g7|!q%~@g̓Utu}WW@ ^G xSȌ*pF  \GY*-`s< >[]+%k1sEޟg⽟b-_A&l2_UGMY(ĩ%/|ӥ Mx!|$ڛI`m!$$Ne\RɝA xlR\ʹ=m;a?}AA9vL1U w-|hqzT6 Ms<{KE:l OA4 U/ 5܉ʖboBXRgk~(9nkƝP rRsLM(FI[ |[o\u*7-Mŗ^Hճb%N)LL750J q~iþʄdY`mT`v/QՒu<29( x,=v`< j"71UX:$kNѭӓ|?!WxMj8V'Y#Bb Am_mَh VHKBK\\&lq5wW#lUdfLY~Q2k U:+#'MBl(g||(H欻c$ ͖< GCFqlFd4$veb@O+6R_W|mxF6L CqR#΂ԯv4 8|>xp9MfB4{gVw4`v2 I?$V?퇤g#UzQ&mMEә+VLQf*Jc"U¼Tͯabeϑa>knѥ) g!ʵo3w}94DW| ||#~qbuQPs{tc wb*C$[Ίlt_%WE¯|M *@8O !'p+έn+ϗ߯i=׺zV_W|>0 |%r_7m{fEp麀7][37K"qw;pXֲvۦfs(ܢY̑ͫ^bJFܲ~q6/|aBp$Ee9I`aThMbǾR/"&d#2im (:SMM5錚KD|VN\pWUP_'Ro UMK'nWx_PHU?LƬ9cvwrR %3'9Yėڨ^^/f2cͳ;tTmꂔx܆ 36m{=*ύg!aC Pn5.;du- /к`^#^u:yo_xS=Fvگ []}DS{3~[4(})#2n4Ј{jtHiGW.'Lu&fw[0Ν buRZEé]HkI#Q5qg}&-0Ь4ߣV{^#H;[$^Po8%oT#xhn#ͱ>`$z|.7q1[TMwY<9Qxfnxnԕ]~p1-o{<% ɷ8~c>E> |%rMݷi DLm;岭!,j9rYM IBQu>gl'PV:e,8+n_ˢ r8m(fGAAH' & oXmB'_o7 !'O#$XxxUbY?OPY(s 3pgXk21o!ƙ%34P#tV#gL^`ueہ f 3vUbweu79f`Fgk&#caOnwPacF&šo$vOsnu\I~UFC'(`p׫%Q{|$/*W1KL^|/ HVY&y]m#(:+(%mr,3XN*8_]ڂJ YX)01Ua=$\lVԜ]H7SH=S@ْA'iY/|{d %$Q8"s-ud0׋=)dǮc|:-PˠX##횜j| $T샌Ϗ>7?lڳmo3jbʎ`-(T~vV* ofoK.&^Mf[j2Dz𬪏b\6B6҇'#öVEZܺ,ðaٸ[78O&{iBBM8;89 Mr=W'4L c4֙J dVI0๐rՇY];~nKheBȍoDp~T>Bc8 `2 <_1 wK m);w'FxE/^D/ wx&Ҟ/Vy-|*?H,WtePB`V6/ΐ q/Il@[v&=CkǢ`xj]$tQVD]s][ib U2l;xtwLqF庠 +dEΑ E2Jƌ2P$^ʹe^OG ;< (/˟lg&ldLdv 6AzJT^otVsqruQ!{Va~;QOdx:1}9YjϬbI.UeC?ĺ)sXS5LN#)jAZ n1WMԻk9і ]{wt+# [uڭ³-s'bK5Wch` [j$vwM0QbP"! T.ru#Vuf(vbзz%SGm _^>Z^xO@xYBf2.'&턮Mݪ XTP+/mrTVZ6RLq ;X0Q&>Y܎Pg|{ٳ#vXC5&jN][ \^x}v)2q՝ 7W}),5 ѼF<$[9=(H# a栫7d;v |]Rk} t7X٬]~ie0b[K^#L Ifq>{Kz2\/atW)YI[[&US,imjK~vE6ڣ έmx^̕~_ yRoh=8lk/9[TB.5l,":|ϭ>K]`90S(XҬy1*ku`2" 70؊iR Ks~K'H˗r[GJ zPՌ|AxU*Y<[Y[~euou`',,ie߻$V LY>&{4d8O)cCeQ*N <9in(64N,S!科*J5OFwo_F}Eҧ#nK13=b(gKS=#b7^&Ģ`vѷAV̙ f>ºw;홮z &l"&C$a1r ЀC+Qf[r3>We'uvޡ. [᷿c+ȐJAqGDm<ce`6j>_/;P dZ+D@\DAnm4^hXQ6rF؅_imŠDMҰ텖|WHߑJY^ܬ'rcm;y\z >{GCY,s߄~vP{~?mR߾3AC>ǹ[!jYIH Q'Mβo~5*#W\zr ?ejy!l/*犍*6%h%U!Q2OG %kM}vˇ,pSR2nfZɊLۅ{T[EH X4$`Wm˕v֗d2uctRߐ]+U0J ;Oh΃Dm0 zZh Z/n@UhgG =әjܳM~fفrE1Zrk~4!mPvB rNkj֑D$i pz|R $3l;#%[kC8AT4 XUO?XJJ{nn** r2{! f2Q *W.m(t^/ixh| Kj׬T4_xȤఆq[#rI+Ii0r\ck=P\58k;қ"{{E:~ql^=^ fajJ߄^wvYY;Ou7au,U LO:M(W Zx+v3 w&;"IN+oo@)B Ul ^JMͮt|3:_y*3RM=oڻX}k.>iOQ4@ȃ`])c2dfݵ 8|Mrf_^6Ĩ9ZcZI88oXa>TK{M#|G۟k lcȇ$xta,=7ni@ vÿ@jr::ٔ3GsJ7%1|w&Nƾ.7.ghqF}AOR;iP2gra;2l՟=A$Cdu}#qw57fvfc' `Kk\6F0Vuq ٍeC{(]Oq$\#RF5ڪ0kXoqǩDž,F8`*`%twNe3@4wp|,n)5"Ce}UA2d`.-}@F4ݣg5nLF_3 _Hn&,{2yK o4cTޚϾ΢tt&<; Hm]K~M MB3hmƫyXdca>M\:K6K^yDNW-O4vVB tuQuw{h;uo9P2wum4gv% /RsNbXN2v =U=7#v!y[,{U=k9yʊֻ0sof̴\3/"/E vG֝(?8NIQЍL?ୄXa*1x{irw5ALĪʤ 5w8S~UmV// cl8+dK;LbEĎYv?v |kĔ`/h/ u3`DJ(s~=/ᛩ)mdJmT3!΍z*cGa֝.Y`5戩=2%Y,,xnS@#B:_a_ReUUeUeUeUeUeUePONODN`_ReUUeUeUeUeUUeUeUU/b SR%;5OM%>Qiq;RRRRgg Rqh>Qj /A^F' %p3:|bFpT#| | | vi?=Os<34x,,,/RQmeY q]U@QvovL__q____OO_OOTYA`,X@L&/d2?ɖQ3YҨsUΡ̦xΟ@$"Jʼ& ͥ*@d2A??ϟJ[D! f:45ŧ5ŷ5@ 0 0D$#    Q#b ; Chߠ Y ,00JDNrq(NN㊮NN(NN&&uc7D)KXXFNvvK&KD#KD#-D#NHGDB$KzzDKq%iz4 }1T\,Eu9fdhT,W'0΢Uܮ5E0 fI$[OmOC%ߑE##HZߪ  E,3Y&4JY&5&6<s9FaBaj+h8 8?&!3"DE=T;ܯ?w?@??8&t,'5UR^LY  Y7akKt//BJhuizpsĝa.1DTcAcpvOpM KKuhdX(G:iX IT[EEh.D#E,ah-50zG#zpvb aHGmc/QP K{\Hp_ hd? pA?%?7?I?[;<t5j! OO*FQ///F/K]SEn%cO@OOlE$g\Ey[EO_!_3_E_W_i_{_____VB506,HM.`e^MIa,>PbQaƒ2q? a%oXIoQfdoooSEX_O-OF6EDpE66Oҟm2Hg;pbӏ_ ,X7R[,asuYq3~Q?WTf<6S$F_x@N;OMO_OqOOOOOOOos __/_A_S_e_w_______q=8\1 oqN=b;bh1oU/0Mo_oqo:-b@bG3bDbפooooojm yt 2DV rb ;0} 1CxUgd3<Ib娏8i2Џȡ1 L-?Qcuϟ .@RdvЯ⯀dXw7:g4="\nT9/2 ſ׿ 1CUgϴsϬ*<N`r߄ߖߨ U56 H@RdvA$6HZl~<dFw+&C{Orq_##Yh(v' Rdv_H ////A/S/e/w///d o:1/(7CHx/?!?}n|E?W?i?{???/A? ???`T/L?Od'Am[YE +A GkOyJUO@AQOOEY3qO贁Nk*_(Bv__ooE1o'2q7Mo_oqor6Uj(DbH{7_V03WX@SO>a@HkDvH74jooږ YDo~OOOODVhzxC(>aRM7?S?\.?pPA,6{٣*٢bbbl~ 86HZl~ÿƏ؏ B Vdvπqџ YD$6HZl~ P Э!#5GYj2225Gҿ,>Pq ϘϳϏX!"0BXj>aSzUFDfP h>$/T 6D UUF~@xT ]]9 AUF~? ?F\.?QR6  ijYA >HTIA zz Illu}`l?LJTTlvu Vb3%<& bX#S?P6 "rl*5"7b%HX"rbk"%TX"*31=&S"rU5 W@S"և3145 `?Copy0igTtk(c)k20@3kM0c0oKs0f21r0#Aa0i0n.k Al>@ 8sBBe@e0vT@d6@3 /`V0s_SFB6@cTm_!#5B0`S"7- iC0r5K9M3 7?:6" b4$J<&P%&?Lh7]L@ls4>Uh 3 @)W120D,@S"JSqSF?< %3"M{8Q o.o3=`oe5ekaoqcEA3o(oc@lHzs%„'&/@l/B95#<& QOuhSqouq?@brA L`@dV#%tdTAQeE9 G]pv@OS?l lA] ]hhC"Q6 @b#e7b 3lqX(b\U‰Y`!S"g?**2VQ  PB`1s03 B`QS"1~5AAWPP`iGDu*JȲ5ABaQ2` RTBocTBQ$H6!e |ȿH~5A" MJk?GZG#iC %:&BpXB/A/@bb 5BeYFuc-gZc5ߜֈ{8O&@PGR_ Q);M_>m w =_H'+Zu׾ _@tBeQBZ&Fi?w/#<][n? $\]ZaĬ@OD?q`SB}F<@lPD[ op?+$J% UFDfP h>$/T 6D UUF~@xF4Fzk%>F >A2 OBu D(2OVhz~ Drag thuesapWonodwipe+.cs*Wfuci: oObl-=l)cka!dh-1 H D  # =ih#4>T#3 A5AUF~? ?F\.?P6 Tuv` ??uJ bkrr r.AšJYMJU5 !LK@#I;!@$5 `?CopyrigTt (c])r 20~ 3r uMj ch osb Ifp"a!rd !ap ib n r AUl h(s"e eh v d/`Vj s_SFBcTm!#5N~"06!5' #%0 5K)M6G# G'? *lW btrr&/Lh=L@l>61Uhh7PY!"  *#"JT3FFFr\F BM)(aOAO#"A5N_IQEEFR_Ov[R52O;EBrA RS#")(le @j 7heGoj@8=ook8too q(b5@MCW?0v0v H"SFAr@K\/SqMRB_<NhCFi{z,%)t@@r uGj5q5{#5"C#"mZon+EBT MKK,"!"2JK\3;%Vq>#  @!2`a!sp s.2`A#"2,%q1BXVqajGDu*5AଚbA"` R"o͒c"4ڑAEDɏ,%A"MJa?)E[4C/G## %(p&"p"!0~Rb  %BevmHY bg|4G5nX)(S&@Vq2b~߿\.??a߿,h??4D_ Q);M_>m w =_Hu+fs k}bk_J?3U}FClQ#RL!M? .X]{~a<@"D,Dlfr`~&@BT[ĥpUFDf h-TYYU?~@x#@L'} V6lX-1u. Bj2u2Z2j2#u9r#ULH/MB#AD5 60`Vis_SE.cTm!#20AD%`;Copy<0igTt ?D1f@M)@c<0o+@ofdBUArX@Aad@iV@n3@ f@Al@ \HsBe*+@e<0v@d3@J@=#x# A G{?9#n"E!0144 M70#AHB 53_lj#PSV6U8l>(UhnE qJ$&9"(Fn_g5Fe#pheo'T !! Jcxo)vR2'"U75a%O3W_74b5-6R `F2 5au\@|Q:0b)`R@As)@E T@xd@Di ei=G]U6Tg'2"qV!DHAn 6SWaHw+* O`EW )FtGl'#[(7F \)e?fYDHlPU !"#t4b (6@Tn@ Z.}C-L@7"AU !"#$t4b (6@Tn@ Z+/}C-D@B7"A%&t4b (6@Tn@ \_/ A-%$37X@$X.IR@XD/IR@X/CRH<(H<(H<(XE\XL0 REXY0 RE|Xf0 R(~i"S4gf8B!Bl?4'/"Gl=./?A>A uk 4 A A#HA\D K DKDuKD}AK}AHAKAHAKAH1K5DAKAH AKAHAK AHKDAKAHAKED>AGCP>Auu -au%a}Ac.aA/aA0 q113qA1$qƑA21q A4>q5KqAc6XqA7eq>A/Aie}uc\Ap1}cKEZeAc}AU 5yIExH?@^@@~?@֘"?ߒ?QbIaC Kqf"*<"b}Acbz*b7Bt0  qQ"OXaц\M  V~2pXq|>כbXܛ ?smhퟨe+T "\!! 3!<n~Dߟqq"\AU%Sid01t`1pѠ g4Tfx## (0X\CiX䯣qDu3a q mI qTFŋ'9 WˣqσIdϙ!B &8@OS?!&!&l8DA>qU` AEmOqWA1 WQo勎pib!RU 璅×!$b!0sU_?mr7A d $6HZlDjF4@ɏۍAcb(:L^pʟݯ$6H ơ2˯3//W/i/%7N`R=/?οL^ OOϦSOeOϛO4_N`r߄ߖ&8J?no"F?oj|!t!1;?:YUUCs0?R:k}HFSFB< l1Ɇl1 5 5%7If35t?v2dj8e2dkQ/// //-"/&/z/6(E&cop g0l r$l1{/ <{SFP50?B?R5H1:Q??_??OO%O7O mOO_gɏ40SOO϶"SD)"UET?_o%o7o)Tol߇ooogoykeZqÿN`BTfxBÃ56);M͟˟Q,7I[mI[mǯٯEWiM]/ϿϞp;MW?i?ϟ?MUO?M\r߄ߨߺߜ?:_8J\n%_7_NNMSNчN!&m75Ae5%C"ObA!`!5 @@L&d2?@@ пdeQ!fAPmQ!u`u%S`sQy82 @8p /@)Q"pTArw%@z3DqlrrrpSsv~15A]&A2D1LQQR.C]-T:%WApMSsxr tNL p5Azsqr Qhpfd2rqǿ?@IQϕ?GOTpJTMQP/JMUw/&ɔ5Ay8/@Ned5Ns.D")5oPobotoooouoooo"4wPvxb~EqϰϿsrqB0BTfxFGOяMQ!*P%Anȯگ>@ !-#dՒ!{@ !QAA,QIdEE׹ZGvV5PbX5b#̖m#F|5+*$5B,!,!MR !$BnD///B"O45Bn3?5SiE@e1*cpΰg ??0?#4MRKQ0 5UWEni̸?YOhdKLDjzUMQ8Z@_ %5A E\OOAd@-.'_9XR_ZӺAOT_Al_~_S ozQzk4HAI(988@tV@OS?,$#o8yn4k1 n I HHN!$"QMYxOlu%ZwBSze_P#>{',$q^eI~t?F5-Ugv:*s.`@RdvwE yѸՖyѻ//'/9/K/]/o///֯?////ίG?n{OOoOOO_O _A__e_NUUϽ_r_T՟e*8c?HZl??TOO ݃Rk?}228oPobotooooooo(:L^p$6HZO1<1!ԏ:)69-?` (6?@8|`R`rksA'`0f0f*ϜD ţ%&е-\?Q"\T#o2q ?/L&k?KAu;BY$F0a(,5)O!XT#0e.M#'$&դ)W ;  9xk1kw4 ??=?g5w4`?OO?Bj¨|ؕر& _!3&R 76Z!IuJ<6L>!k"OO0%8cdk_#5`soo߂C+`+]cop&l*r*]&]l&nPa [foxoo߬=pջ~5*ӿo>- ctZb%/<ďVɌ Ϭ.T"# -9?Q: }:C5I[m 2 9u w?aEB!r;%%bac@xH@@L&d2?@wnk˿W q0@ qu` `MuB `O!mꜽ٭@("G@) rp9%VB @z3PVhp%ũƕϱϺνquC%%S/e 1i%գ!4)#l lrq!ՍWVD갖!8/' tN9zs %Ӣ ќoǶѴ2r"?@IV5?+3快pt 23Ev&?a/Dsѓrul////د(?:9#f@-dW?i?{?1szVu??????0 O2MMROdOJA~OOOOOOOrfq9_ TqV_z_______wpZW hPcg٧2oDoVohozlonqeDCU<%I|q\yƁtג}>syy#5GY$7k}=6ŏ׏ ]CUgy&2M>՟矆> 1CUgyYP̬ S-}p`'),)|v>5*m??@~?@u%.?Q N15\"r$1C0Gե-jycߞ >59|>%bX7:F#[mvH+$"!!!$3Bn {///"34S) #5S&ared lOibc0b1ymAgP/??#4M 0p'0pCSi?GOqoM:D 8 B 5AyeE'OOAd$-0_'XyREK?Z_%^BQ@xu>:DIힴ88V@OS?$#\o8>)3> I JN$QMx&u'wQ z?e_4#._'$՛q?e~Xt?F5̡ȯm p:D=M|rZzaA ?@L?@Vjտń½ PWfxK@ou( zHUZU !"#U$%&,U-./0U1234567t4b (6@TnC@ TaJKC-TmBU7 A@XJORH<(EX7K R\_i1_PJ@?`iK.PDDaiDK.PU1( UO"D&aUAUNj )h"T} +U- \ |ɉ&Q- -H*=(XiwPE!Q//,/fGArial UncodeMSj (  R$fSymbol$67fWingds*7 fEArial"z@D/ R$fGSwimunj (  R$fGPMingLUj (  R$fGMS PGothiqcj (  R$fGDotum"j (  R$fGSylaeqnj (  R$fGEstrangelWo dsaj (  R$fGVrindqaj (  R$fGShrutqij (  R$fGM_anglj (  R$fGTunga"j (  R$fGSendyqaj (  R$fGRavi"j (  R$fGDhenu"j (  R$fGLath#j (  R$fGawutmij (  R$fGCordia Neqwj (  R$fGMS Farsiwj ( _ R$fGulim"j (  R$fETimes NwRoanz@D$CLLBCL.BCM%B$C%M5BCZM9B4CM=BCMCBDCN9B̨CLN;BTCNMBܧCN:BCO:BCHO9BB$CYQ8BCQGBGuideTheDocPage-1"Gestur Fom aDocumentViso 90Flow NrmaVi}so 0Co}nectrViso 01Viso 02Viso 03Viso 10Vi}so 1Viso 12Viso 13Viso 20Viso 21Vi}so 2Viso 23Viso 50Viso 51Viso 52Viso 53Viso 70Viso 80Flow MarkeFlow GrayBasicCostDurationResour cRow_1visVerionProces(Dynamic onetrTextPoWsiinDocument.2Proces.4,Dynamic onetr.6Document.7Document.8.Dynamic onetr10.Dynamic onUetr1Proces.9.Dynamic onetr12.Dynamic onetr13Document.14.Dynamic onetr15883|_SE3d_SG3L_SG3DKS%G3$k TG3T@%TE3dk)TG3kBTG3kaTG3kzTG3kTG3kTG3$kTG3DkTG3dkTG3kUG3k*UG3kCUG3k\UG3kuUG3$kUG3DkUG3dkUG3kUG3kUG3k VG3k$VG3 k=V!G3$ k^VG3ļ_zVE3ܼ_VE3\@VE3d kVG3 kVG3_VE3 kVG3 _VG3DLW)G3W G3@^WE3,@bWE3<@fWE34@jWE3,@nWE3ĴlrWG3dlWG3TbfW.G3DlWG3$lWG3jlX/G3klDX/G3lsXG3klX/G3klX/G3mX!G3lll Y/G  !"#$%&'()*+,-./01234567UfU U UUUt4b (6@TnC@ O0^RC-tpB*7 A%t4 dpB_^ A-@7AJ@X^NR@dX^6RH<(H<(JE XJ` REXW` RUPT/_a C{N } w"4FX,h(j5@@(;6#\y K_,eBdYiUX P Q|/A>EFFMNN#%%[dbfqnfqnV][^^^mnn7;:݀UVVfgg=>>݆033=>>￿oooHOM=>>ݚfqn7;:*,,7;:OWUs|ϳ=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳNOO .//î۳ɌbzKתת߻߻߻߻߻߻߻߻{b{b=>>MUSfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnlqkqrifqnfqnfqnfqnfqnfqnfqnfqnfqnfqnZca=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳ=>>ݳEFF),+7;:7;:7;:7;:7;:7;:7;:7;:7;:D@>=>>=>>Ɍcݷwxx=>>=>>=>>iTxOӸEFF*,,fqnfqnOWUӢўz~~~V][mxunqkU7rL),+ݳ\ebd>r&''hroݎ{a>566033MUS^^^fqns|fqn=BA7;:=BAfqnyݚfqnV][7;:7;:V][fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^$  ~~~ńWӢҟ|wFܿwFɎeLj]ϙuLj]ϙu~xxMyU}q397fqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnqrifqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnqrifqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqn@GE^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:@>:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:;=:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:7;:"%$fgga׿{ڱwFzKҟ|ńXˑjį׿Lj]ϙuMNN#%%7;:7;:7;:Lj]7;:7;:7;:^^^ϙu=>>033ݳOWU1)#zO\eb݀qM˹Zcaݺuj[~~~~~~ݎ{//-EFFEFF^^^fqnhro566=>>566hroݓ7;:=>>=>>=BA^^^fqnݠݺȚ݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^fqn݀^^^397fqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqnfqn@GE^^^connector PagesMasters(`ht_PID_LINKBASE_VPID_ALTERNATENAMESAOh+'0 (4 P \ h tIndholdTorben Hrupv_I!M _Jh<s!ӻ$ d!u0ݬҔmBt%ܺ ZQT ~%dRl7Ѵͦ`TC;M-=ϓ7+Gv7Oa8MCW$QmpXhw 18 3{*t,Wn\pi$??Hl h>g2DEe:ck|G,yr1͗GL]@7vQVjU-/m-FmcAc#[V(&bݮcyψ\iC?ir//@|ÍxyH IG}#5o#(8Q%o YIߌ)$~3#iR5,WJ3}3 P`qуF6lY=e{`f\fG=}@^Z95еwtNP}uw;dSJ_j5qpf2FѶ^HRݍH/J>!\^s]~^ ~T->ɶAmU8b ොBqQJ8GM BB&қMVwT쌆<RlCz57.ל]yx+,Ev%a ~Az@~m37Oko>gB0j;#+=b{d] kep]lt2 7T aL&<\z !A.6I*sJo(_\b+9uo|r6|;aрZuuX 97:ˆ 8Z>SD4el%Ws1;u{nv1CVIQԤ1 d2 z^/:??cxrvd\YWtz&nJ&uN\?}f kk~64=[ C0e|'`9ff#.ojir)¾IW*4(57&VO8[wdU?>1Zd[l#'_M}.j &i.zqW=1#T!ox|S9cS>r=5޿ѿ}QS$Cm.U{IG浢WmHa'zܙIhisOCNQJU1W ֪wh!-0ei;aU zd5KxqfwoJl^`fX0u]r%ynhd*$ȷMD.+$|YH#>Mr1mu~8(WBucX>H#^%б=sw$18⽳}$G |$HvIxK{G |$4 ܇=*eFIENDB`Dd 0  # A2Q~HDZja[F-p}`!%~HDZja[F wk1xYqLTG曷 oH΅"aI޶z[[=Қz1ibN{Wrjbr g-A9KkR XKδ/ڽyo+²J{ͼߛ||YD1?Cd.8VVkk*#~E?ρh/LM 2otMf; l=.^o!C_ Y<id1}wBEN3<~\ 1Pɰob=rg~<–;d q;+2/l|e`K<Ù, ZF5cQGDs60.qF{wtw` (>SJ:;85sS4*y+8鱋Kח;E~9NNܧD]y(3+dNrwwqFۂ0=} n7qX͛ Yeh<s2"0fuVڡ " r0j$< ʳ!M4|U}l y6VX-/ ee;<";@.n/)!"l$4|2-;)Qi!"R, ?frLC'V-v OV,{REE,Q\ 20SaaH¨wOPF4,F;੶멦qzu1[]{yz< N2.u'jd~Ҳ`oȞUg.Ǭ8vZ qj-G+ƢՏanBgxnNpQnWGM*ۋC:آh3u"[Fsdf {9 ]H|=LjoR F J[yy# TOP?N)<G])]j:5S%-XO%@lqu̟(Eϋ{I!LCs@#1$A irM)ȑ!W|9e˗74>c9+Y<²;,Sv&X|MO3[1:ʙZiCUGVuB1I ~W'wd~MmZψ1#:;!&m]]V^.V+jEVX4:AIq!?OQjP㰮W]*q(OjYOO*-JJ^"!k%ݤz$1YK$#[ENJ(M)]L #(W||'-@)1_֊\y@="[VLE&"U.aLA2U_ Zc:xl2nGXǎ=o1oQ3y~1?c#o1C4L }o:vyм,/{R8p:+ּy(S؉j6\Bjٳ^ŘuW{cɺt:L˘V{\Orn0J7&X]K;x{#`uuc4}QwNifrrēO  RL^|g*_D\tڅ⺝->vb`^1'%{yf~n*]vev?3M"Ju>uŘZ,`S3U5S{%x\m1URgRc7W3OuS]WZjϫc|ǟUJMq+D䏩%Qs>Oe,§>5䡪#[F)s 6/nVVZRu#,}N폓.]:' .?1:Fscɳ <{DyK http://validator.w3.org/yK 2http://validator.w3.org/1TableSummaryInformation(DocumentSummaryInformation8$ CompObj\j Nielsen Normal.dotTorben Hrup Nielsen45Microsoft Word 9.0@zH6@#@l)6<@sj=%&՜.+,D՜.+,< hp   Grundfosn7" Indhold Title  8@ _PID_HLINKSAL Whttp://validator.w3.org/;_Toc185299691;_Toc185299690;_Toc185299689;_Toc185299688;_Toc185299687;_Toc185299686;_Toc185299685;_Toc185299684;_Toc185299683;_Toc185299682;_Toc185299681;_Toc185299680;_Toc185299679;_Toc185299678;_Toc185299677;_Toc185299676;_Toc185299675;z_Toc185299674;t_Toc185299673;n_Toc185299672;h_Toc185299671;b_Toc185299670;\_Toc185299669;V_Toc185299668;P_Toc185299667;J_Toc185299666;D_Toc185299665;>_Toc185299664;8_Toc185299663;2_Toc185299662;,_Toc185299661;&_Toc185299660; _Toc185299659;_Toc185299658;_Toc185299657;_Toc185299656;_Toc185299655;_Toc185299654  FMicrosoft Word Document MSWordDocWord.Document.89q& i8@8 NormalCJ_HaJmHsHtH L@L Heading 1$dh<@&5CJKH \aJ H@H Heading 2$dh<@& 5\]aJB@B Heading 3$<@& 5>*\aJ<A@< Default Paragraph Font2O2 Nummerliste  & FDOD Nummerliste2 & F/6^/`6*O* Page No.$a$B>@"B Title$<@&a$5CJ0KH\aJ @O2@ Hanging Indent$^`$$OB$ BottomCJ@ TOC 1&@& TOC 2 ^&@& TOC 3 ^&@& TOC 4 ^&@& TOC 5 ^&@& TOC 6 ^&@& TOC 7 ^&@& TOC 8 ^&@& TOC 9 ^.U@. Hyperlink >*B*ph,@, Header  z&, @, Footer z&&)@& Page Number@B@"@ Body Text "x*$1$KHPJ^JtHJO2J Table Contents # $*$1$OJPJQJtH4oR4 KodeSektion%6>*  iOV#{KWNg y d  b ( 1 0 2 3 A jk 3Mkl ABPQ !.mnonoxy !!o"p"##%%&&()h*i****+,,}/~///R1S1~1S3T3444Z5[5k555555K6L6T6w6x666666667777775868>8888889O9P9d9:::::::: ;j;k;l;|;;;;;;E<F<R<<<<<<<#=$=2=======>>,>>>>>?????@@ @@@@AAA1B2B3B@BBBBBBJCKCTCyCzCCCCCCDDDNDDDDD*E/EaEbEhEEEEEFFG GGGGGGG!H+H:H;HJHXHbHjHkHHHIJJK0KKpLLL?MTMMMN OpOOOoQQQQRRQSoSLTcTTU&W>WWWWW|XXXWYkYYY8ZMZZZ[[G\\\c]o]T^^/__________2`3`;`M`N`V`m`n`v````````aa)a*aFaYaZavaaaaaa b)b*bDb~bbbbbcScTccccc d d-dldmdddddFeGeoeeeeff@fpfqffffgOgPgqggggPhQhbhhhhhhh i i i iiijKj[j7kl mgmnm-n{naohoooppppppp/q;qr sjukuvuuuvv.x9xyyyy{{ }}s~~~iw{|Ɂ/0˄̄4>`l`n :BLGGRlۓÖϖƗrsnoCD~^R۪;CD !-9гѳJKfsص$7I/I_ؾh)OZp4xqGnh3%cvRi~E\ .b 3Ibc O<9aS}~&3`LM` no zDEAB]^IopC<)nH-.f>@0000000000000000000000000000000000000000000"03 "03 "03 "03 "03 "03 "03 "03 "03 "03 "03 03 00000 0 000000000 0 0 0000000o0o0o0o0o0o0o0o0o0o0o0"0%"0%"0%"0%0%0%0%0"0*"0*"0*0*0*00~/0/0/0~/0S10S10S10S10~/040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040404040400E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E0E00kH"0H"0H0kH"0J0kH"0K"0K0kH "0pL "0LpL "0pL "0?MpL "0pL "0MpL "0pL "0NpL "0pL "0pOpL"0pL "0pL "0oQpL "0 pL "0QpL "0 pL "0RpL "0 pL "0QSpL "0 pL "0LTpL"0pL"0pL "0 pL "0&WpL "0pL "0WpL "0pL "0WpL "0pL "0|XpL"0pL "0pL "0WYpL "0pL "0YpL "0pL "08ZpL "0pL "0ZpL "0pL "0[pL "0pL "0G\pL "0pL "0c]pL "0c]pL "0c]pL "0c]pL "0c]pL"0pL0kH#0_#0_0_#0_#0_0_#0_#0_0_#0_#0_0_#0_#0_0_#0_#0_0_0_0kH0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`#0`#0`0`0`0kH"0 i"0 i"0 i00j@0Kj0Kj0j0l%0l0l0l0l%0l0l0l0l0l0l0l0j0p%0p0p%0p0p%0p0p0p%0p0p%0p0p%0p0p%0p0p%0p0p%0p0p%0p0p%0p0p%0p0p%0p0p%0p0p0p0p0p0p0p0p0p0p0p0p0p0p%0p0p%0p0p%0p0p%0p0p%0p0p0p0p0p%0p0p0p0p%0p0p%0p0p%0p0p%0p0p00Ɨ0000000000000000000000000Ɨ000 0 0R 0R 0R 0000000Ɨ0!0!0!0!0!0!0!0Ɨ(0K0f%0f0f0f%0f0f%0f0f%0f0f%0f0f0f%0f0f0f0f0f0f0f%0f0f0f0f%0f0f%0f0f0f%0f0f0f0f0f%0f0f%0f0f%0f0f0f 0f 0f 0f 0f0f0f%0f0f%0f0f%0f0f0f 0f 0f 0f0f%0f0f%0f0f0f%0f0f%0f0f%0f0f0f0f(0K%00 0 0 0 0 0%00%00%00%0000Ɨ0c 0c 0c 0Oc 0c 0c0c0c 0c 0c 0c 0c 0c0c0000000000000 0 "0 "0 "0 "00 0 "0M"0M "0M"0M "0M"0M "0M "0oM "0oM "0oM "0oM"0M "0M"0M "0M 0 "0"0 "0 "0E"0 "0"0 "0 "0^ "0^ "0"0 "00 0 "0 "0 "0 "0C "0 "0 "0 "0 "0 "0n "0n "0 "000000000000000000@0 @0@ 0 00,,RRRUuujP  ] 1!L*e  o#39;>?ADFHKTQ[cvdYegpj mtOSn?    ?Hdfgi$.JLMOo5QSTVv !#CZvxy{)EHIKk5QTUWw,HKLNn6Eadeg   ,Wsvwy    5 B ^ a b d    2 @ \ _ ` b  " % & ( H e  + . / 1 Q i  * - . 0 i***m 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%̕::X29<ALOU!8@z(  B    B S  ?#pT& _Toc185299654 _Toc185299655 _Toc185299656 _Toc185299657 _Toc185299658 _Toc185299659 _Toc185299660 _Toc185299661 _Toc185299662 _Toc185299663 _Toc185299664 _Toc185299665 _Toc185299666 _Toc185299667 _Toc185299668 _Toc185299669 _Toc185299670 _Toc185299671 _Toc185299672 _Toc185299673 _Toc185299674 _Toc185299675 _Toc185299676 _Toc185299677 _Toc185299678 _Toc185299679 _Toc185299680 _Toc185299681 _Toc185299682 _Toc185299683 _Toc185299684 _Toc185299685 _Toc185299686 _Toc185299687 _Toc185299688 _Toc185299689 _Toc185299690 _Toc1852996914 o%*//S14ElHHJKpL_` ijKjKjpǗ!KfcM  !"#$%@ w&*//}14EHHJ/K~L_`iJjZjlp,er2_,&7,,;H?HLLQQ__jjkkmktkkkllmmpp/q9qrrr svv.x7xyy{{ }}}}L~S~Y~]~s~|~~iu<Aoy#-`j:@ϖٖfjɵ#57H.I^GMOYxqRlnGacui}E[  39:H<D x{|?@4 @ A ik  23LMjl  @BOQ!-.lomowy !!n"p"##%%&&&&(())g****++,,,,|//////Q1S1}1~1R3T34444Y5[5j5k555555555J6L6S6T6v6x66666666677777777774868=8>888888899N9P9c9d9::::::::::; ;i;l;{;|;;;;;;;;;D<F<Q<R<<<<<<<<<"=$=1=2=========>>+>,>>>>>??????@@ @ @@@@@AAAA0B3B?B@BBBBBBBBBICKCSCTCxCzCCCCCCCBDDDMDNDDDDDE/E`EbEgEhEEEEEFFG GGGGGGGGGGG H!H*H+H9H;HIHJHWHXHaHbHiHlHHHHHIIJJJJKK/K0KKKoLpL~LLLL>MTMMMMMNN O OoOpOOOOOnQoQQQQQQQ~RRPSoSKTcTTTUU%W&W=W>WWWWW{XXXXVYWYjYkYYY7ZMZZZ[[F\\\b]c]n]o]S^T^^^._/_^_____________1`3`:`;`L`N`U`V`l`n`u`v````````` aaaa(aFaXaZauavaaaa b(bDb}bbbbbbccRcccc d-dkddddEeoeeef@fofffgNgPgpgqgggggOhbhhhhhhhi ii iiiiijjJjKjZj[j6k7kll m mfmgmmmnm,n-nzn{n`oaogohooopppppp.q/q:q;qrr s siukuuuvuuuuuvvvv-x.x8x9xyyyyyyyy{{{{} }}}r~s~~~~~~hivwz|ȁɁ.0ʄ̄34=>_`kl_`mn 9:ABKLFGFGQRklړۓ–ÖΖϖŗqsmoBD}]^QRڪ۪:;BD!,-89ϳѳIKefrsɵص#$67HI./HI^_׾ؾgh()NOYZop34wx{pqtFGmngh23$%bcuvQRhi}~DE[\  -.ab 23HIac NO;<89`aRS|~%&23 _`KM_` mo yzCE@B\^HInpBC;<()mnGH,.ef *.?@NOpqxy33333334 @ **44EEGG+H;HK0KpLLWYkY__`` i iKj[jl mpppp/q;qr skuvuvv.x9xyy{{ }}s~~~iw`l:B!-Kf3. *.?@Torben Hrup Nielsen!G:\trunk\docs\Samlet\Samlet 1.docTorben Hrup Nielsen!G:\trunk\docs\Samlet\Samlet 1.docTorben Hrup NielsenaC:\Documents and Settings\20495\Application Data\Microsoft\Word\AutoRecovery save of Samlet 1.asdTorben Hrup Nielsen!G:\trunk\docs\Samlet\Samlet 1.docTorben Hrup Nielsen!G:\trunk\docs\Samlet\Samlet 1.docTorben Hrup Nielsen!G:\trunk\docs\Samlet\Samlet 1.docTorben Hrup NielsenaC:\Documents and Settings\20495\Application Data\Microsoft\Word\AutoRecovery save of Samlet 1.asdTorben Hrup NielsenaC:\Documents and Settings\20495\Application Data\Microsoft\Word\AutoRecovery save of Samlet 1.asdTorben Hrup NielsenaC:\Documents and Settings\20495\Application Data\Microsoft\Word\AutoRecovery save of Samlet 1.asdTorben Hrup NielsenaC:\Documents and Settings\20495\Application Data\Microsoft\Word\AutoRecovery save of Samlet 1.asdC Pޞ_H}uP dWwZ 6R;G IĐ ,h"v,,.4U)7p.#6+IN0 P!`I4#ELIĐeaPnQm*/]p`R@ a`eO7a b3pjW6rs.    8OJ QJ CJ^J aJl..p. .@ . ..)))()()()...h ^`OJQJo(h ^`OJQJo(oh pp^p`OJ QJ o(h @ @ ^@ `OJQJo(h ^`OJQJo(oh ^`OJ QJ o(h ^`OJQJo(h ^`OJQJo(oh PP^P`OJ QJ o( Vh^`VOJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o( Vh^`VOJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(h^h`o()^`o()8^8`o()^`o(()^`o(()p^p`o(() ^ `o(.@ ^@ `o(. ^ `o(.hh^h`. ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o( Th^T`OJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(h ^`OJQJo(h ^`OJQJo(oh pp^p`OJ QJ o(h @ @ ^@ `OJQJo(h ^`OJQJo(oh ^`OJ QJ o(h ^`OJQJo(h ^`OJQJo(oh PP^P`OJ QJ o(eh^e`o(.e5^e`o(.0^`0o(..^`o(... ((^(`o( .... ^`o( ..... H H ^H `o( ......  ` ^ ``o(....... h h ^h `o(........h ^`OJQJo(h ^`OJQJo(oh pp^p`OJ QJ o(h @ @ ^@ `OJQJo(h ^`OJQJo(oh ^`OJ QJ o(h ^`OJQJo(h ^`OJQJo(oh PP^P`OJ QJ o(h^`.h^`.hpLp^p`L.h@ @ ^@ `.h^`.hL^`L.h^`.h^`.hPLP^P`L. Th^T`OJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(h ^`OJQJo(h ^`OJQJo(oh pp^p`OJ QJ o(h @ @ ^@ `OJQJo(h ^`OJQJo(oh ^`OJ QJ o(h ^`OJQJo(h ^`OJQJo(oh PP^P`OJ QJ o(h ^`OJQJo(h ^`OJQJo(oh pp^p`OJ QJ o(h @ @ ^@ `OJQJo(h ^`OJQJo(oh ^`OJ QJ o(h ^`OJQJo(h ^`OJQJo(oh PP^P`OJ QJ o( Vh^`VOJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(h^`.h^`.hpLp^p`L.h@ @ ^@ `.h^`.hL^`L.h^`.h^`.hPLP^P`L.^`.^`.pL^p`L.@ ^@ `.^`.L^`L.^`.^`.PL^P`L. Vh^`VOJQJo( ^`OJQJo(o pp^p`OJ QJ o( @ @ ^@ `OJQJo( ^`OJQJo(o ^`OJ QJ o( ^`OJQJo( ^`OJQJo(o PP^P`OJ QJ o(h ^`OJQJo(h ^`OJQJo(oh pp^p`OJ QJ o(h @ @ ^@ `OJQJo(h ^`OJQJo(oh ^`OJ QJ o(h ^`OJQJo(h ^`OJQJo(oh PP^P`OJ QJ o(U)7U)73puP _p`EL;G ,h" a,.!`IC m*/]6rseO7awZ #6+IeaPWW8Num2WW8Num4         1R;        1R;                 q                                   q                          1R;                 1R;                 55555K6L6T6w6x6666666777775868>8888889O9P9d9:::::::: ;j;k;;;;;;E<F<R<<<<<<<#=$=2=======>>,>>>?????@@ @@@@AAA1B2BBBBBBJCKCTCyCzCCCCCCDDDNDDD*E/EaEbEhEEEkH_____2`3`;`M`N`V`m`n`v``````aa)a*aFaYaZavaaaaaa b)b*bDb~bbbbbcScTccccc d d-dldmdddddFeGeoeeeeff@fpfqffffgOgPgqggggPhQhbhhhhhhh i iƗ@d5{@{p@Unknown G: Times New Roman5Symbol3& : Arial?DejaVu Sans] LucidasansTimes New Roman?5 z Courier NewO& k9?Lucida Sans Unicode5& z!TahomaiLiberation SerifTimes New Roman;Wingdings_ StarSymbolArial Unicode MS"1hcfjff-%&n!x0d7 2QIndholdTorben Hrup NielsenTorben Hrup Nielsen