Moved all services from API to BLL project

This commit is contained in:
kunkliricsi 2020-12-03 18:52:25 +01:00
parent f0af8f08e3
commit 6e61fc7756
17 changed files with 360 additions and 371 deletions

View File

@ -35,8 +35,6 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.9" />
<PackageReference Include="MQTTnet" Version="3.0.13" />
<PackageReference Include="MQTTnet.AspNetCore" Version="3.0.13" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="NLog" Version="4.7.5" />
<PackageReference Include="NLog.Web" Version="4.9.3" />

View File

@ -1,15 +1,14 @@
using Birdmap.BLL.Interfaces;
using Birdmap.BLL.Services.CommunicationServices.Hubs;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using System.Linq;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR;
using Birdmap.API.Services.Hubs;
using Birdmap.API.Services;
using System.Threading.Tasks;
namespace Birdmap.API.Controllers
{

View File

@ -1,9 +1,8 @@
using AutoMapper;
using Birdmap.API.DTOs;
using Birdmap.API.Services;
using Birdmap.API.Services.Hubs;
using Birdmap.API.Services.Mqtt;
using Birdmap.BLL.Interfaces;
using Birdmap.BLL.Services.CommunicationServices.Hubs;
using Birdmap.BLL.Services.CommunicationServices.Mqtt;
using Birdmap.DAL.Entities;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;

View File

@ -1,33 +0,0 @@
using Birdmap.API.Options;
using Birdmap.API.Services.Mqtt;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
namespace Birdmap.API.Extensions
{
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddMqttClientServiceWithConfig(this IServiceCollection services, Action<AspCoreMqttClientOptions> configureOptions)
{
services.AddSingleton(serviceProvider =>
{
var optionBuilder = new AspCoreMqttClientOptions(serviceProvider);
configureOptions(optionBuilder);
return optionBuilder.Build();
});
services.AddSingleton<MqttClientService>();
services.AddSingleton<IHostedService>(serviceProvider =>
{
return serviceProvider.GetService<MqttClientService>();
});
services.AddSingleton(serviceProvider =>
{
var mqttClientService = serviceProvider.GetService<MqttClientService>();
var mqttClientServiceProvider = new MqttClientServiceProvider(mqttClientService);
return mqttClientServiceProvider;
});
return services;
}
}
}

View File

@ -1,8 +1,7 @@
using AutoMapper;
using Birdmap.API.Extensions;
using Birdmap.API.Middlewares;
using Birdmap.API.Services.Hubs;
using Birdmap.BLL;
using Birdmap.BLL.Services.CommunicationServices.Hubs;
using Birdmap.DAL;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
@ -42,8 +41,6 @@ namespace Birdmap.API
services.AddAutoMapper(typeof(Startup));
services.AddSignalR();
var key = Encoding.ASCII.GetBytes(Configuration["Secret"]);
services.AddAuthentication(opt =>
{
@ -64,33 +61,6 @@ namespace Birdmap.API
};
});
services.AddMqttClientServiceWithConfig(opt =>
{
var mqtt = Configuration.GetSection("Mqtt");
var mqttClient = mqtt.GetSection("ClientSettings");
var clientSettings = new
{
Id = mqttClient.GetValue<string>("Id"),
Username = mqttClient.GetValue<string>("Username"),
Password = mqttClient.GetValue<string>("Password"),
Topic = mqttClient.GetValue<string>("Topic"),
};
var mqttBrokerHost = mqtt.GetSection("BrokerHostSettings");
var brokerHostSettings = new
{
Host = mqttBrokerHost.GetValue<string>("Host"),
Port = mqttBrokerHost.GetValue<int>("Port"),
};
opt
.WithTopic(clientSettings.Topic)
.WithCredentials(clientSettings.Username, clientSettings.Password)
.WithClientId(clientSettings.Id)
.WithTcpServer(brokerHostSettings.Host, brokerHostSettings.Port);
});
// In production, the React files will be served from this directory
services.AddSpaStaticFiles(configuration =>
{

View File

@ -5,6 +5,9 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.1.0" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Core" Version="1.1.0" />
<PackageReference Include="MQTTnet" Version="3.0.13" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>

View File

@ -3,7 +3,7 @@ using MQTTnet.Client.Connecting;
using MQTTnet.Client.Disconnecting;
using MQTTnet.Client.Receiving;
namespace Birdmap.API.Services
namespace Birdmap.BLL.Interfaces
{
public interface IMqttClientService : IHostedService,
IMqttClientConnectedHandler,

View File

@ -1,7 +1,7 @@
using MQTTnet.Client.Options;
using System;
namespace Birdmap.API.Options
namespace Birdmap.BLL.Options
{
public class AspCoreMqttClientOptions : MqttClientOptionsBuilder
{

View File

@ -3,7 +3,7 @@ using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
namespace Birdmap.API.Services.Hubs
namespace Birdmap.BLL.Services.CommunicationServices.Hubs
{
public class DevicesHub : Hub<IDevicesHubClient>
{

View File

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Birdmap.API.Services
namespace Birdmap.BLL.Services.CommunicationServices.Hubs
{
public record Message(Guid DeviceId, DateTime Date, double Probability);

View File

@ -1,6 +1,6 @@
using System.Threading.Tasks;
namespace Birdmap.API.Services.Hubs
namespace Birdmap.BLL.Services.CommunicationServices.Hubs
{
public interface IServicesHubClient
{

View File

@ -3,7 +3,7 @@ using Microsoft.Extensions.Logging;
using System;
using System.Threading.Tasks;
namespace Birdmap.API.Services.Hubs
namespace Birdmap.BLL.Services.CommunicationServices.Hubs
{
public class ServicesHub : Hub<IServicesHubClient>
{

View File

@ -1,5 +1,5 @@
using Birdmap.API.Services.Hubs;
using Birdmap.BLL.Interfaces;
using Birdmap.BLL.Interfaces;
using Birdmap.BLL.Services.CommunicationServices.Hubs;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Logging;
using MQTTnet;
@ -15,7 +15,7 @@ using System.Threading;
using System.Threading.Tasks;
using Timer = System.Timers.Timer;
namespace Birdmap.API.Services.Mqtt
namespace Birdmap.BLL.Services.CommunicationServices.Mqtt
{
public class MqttClientService : IMqttClientService
{

View File

@ -1,4 +1,6 @@
namespace Birdmap.API.Services.Mqtt
using Birdmap.BLL.Interfaces;
namespace Birdmap.BLL.Services.CommunicationServices.Mqtt
{
public class MqttClientServiceProvider
{

View File

@ -1,7 +1,11 @@
using Birdmap.BLL.Interfaces;
using Birdmap.BLL.Options;
using Birdmap.BLL.Services;
using Birdmap.BLL.Services.CommunicationServices.Mqtt;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Net.Http;
namespace Birdmap.BLL
@ -37,6 +41,57 @@ namespace Birdmap.BLL
});
}
services.AddSignalR();
services.AddMqttClientServiceWithConfig(opt =>
{
var mqtt = configuration.GetSection("Mqtt");
var mqttClient = mqtt.GetSection("ClientSettings");
var clientSettings = new
{
Id = mqttClient.GetValue<string>("Id"),
Username = mqttClient.GetValue<string>("Username"),
Password = mqttClient.GetValue<string>("Password"),
Topic = mqttClient.GetValue<string>("Topic"),
};
var mqttBrokerHost = mqtt.GetSection("BrokerHostSettings");
var brokerHostSettings = new
{
Host = mqttBrokerHost.GetValue<string>("Host"),
Port = mqttBrokerHost.GetValue<int>("Port"),
};
opt
.WithTopic(clientSettings.Topic)
.WithCredentials(clientSettings.Username, clientSettings.Password)
.WithClientId(clientSettings.Id)
.WithTcpServer(brokerHostSettings.Host, brokerHostSettings.Port);
});
return services;
}
private static IServiceCollection AddMqttClientServiceWithConfig(this IServiceCollection services, Action<AspCoreMqttClientOptions> configureOptions)
{
services.AddSingleton(serviceProvider =>
{
var optionBuilder = new AspCoreMqttClientOptions(serviceProvider);
configureOptions(optionBuilder);
return optionBuilder.Build();
});
services.AddSingleton<MqttClientService>();
services.AddSingleton<IHostedService>(serviceProvider =>
{
return serviceProvider.GetService<MqttClientService>();
});
services.AddSingleton(serviceProvider =>
{
var mqttClientService = serviceProvider.GetService<MqttClientService>();
var mqttClientServiceProvider = new MqttClientServiceProvider(mqttClientService);
return mqttClientServiceProvider;
});
return services;
}
}

View File

@ -138,12 +138,12 @@ Egy másik megoldás a SignalR használata, amellyel a klienseket eseményvezér
Így a kliensek csak akkor indítanak kéréseket amikor az adat tényleg változott. Ezzel a technológiával oldottam meg például, hogy az eszközök állapotainak változására
frissüljön a felület.
Egy másik szolgáltatás a Birdnetes MQTT kommunikációért felelős szolgáltatás,
Egy másik szerveroldalon használt szolgáltatás a Birdnetes MQTT kommunikációért felelős szolgáltatás,
mely felregisztrál a \ref{subsect:birdnetes-ai-service}-as alfejezetben bemutatott AI Service által publikált üzenetekre.
Ezekben az üzenetekben található a hanganyagok egyedi azonosítója, illetve azok seregélytől való származásának valószínüsége.
Ha a szolgáltatás kap egy ilyen üzenetet akkor lekérdezi a \ref{subsect:birdnetes-input-service}-es alfejezetben bemutatott Input Service-től
a hanganyag azonosítójához tartozó metaadatokat.
Ezekből felhasználva a kihelyezett eszköz azonosítóját, a hanganyag beérkezésének dátumát és az említett valószínüséget új üzeneteket készítek, melyeket egy pufferben tárolok.
Ezekből felhasználva a kihelyezett eszköz azonosítóját, a hanganyag beérkezésének dátumát és az említett valószínüséget új üzenetek készülnek, melyeket egy pufferben tárolódnak.
Ezt a folyamatot a \ref{fig:birdmap-mqtt-service}-es ábra szemlélteti.
\begin{figure}[!ht]
@ -163,7 +163,7 @@ Míg a szerver képes is az üzeneteket feldolgozni, ha ezeket rögtön tovább
A kontrollerek határozzák meg, hogy a szerveroldalon milyen végpontokat, milyen paraméterekkel lehet meghívni, ahhoz milyen jogosultságok kellenek.
A jogosultságok kezelését a JSON Web Token-ekkel oldottam meg. A fejlasználó bejelentkezéskor kap egy ilyen token-t,
amelyben tárolom a hozzá tartozó szerepet. A \ref{lst:devices-controller}-as listában látszik, hogy hogyan használom ezeket a szerepeket.
A kontroller végpontjait alapértelmezetten \verb+User+ és \verb+Admin+ jogosultságú felhasználó hívhatja, az online végpontot azonban csak \verb+Admin+ jogosultságú.
A \verb+DevicesController+ végpontjait alapértelmezetten \verb+User+ és \verb+Admin+ jogosultságú felhasználó hívhatja, az "online" végpontot azonban csak \verb+Admin+ jogosultságú.
Hasonló képpen oldottam meg ezt a többi kontrollernél is. A \verb+User+ felhasználók csak olyan végpontokat hívhat, mely kizárolag az állapotok olvasásával jár.
Az \verb+Admin+ felhasználók hívhatnak bármilyen végpontot.

View File

@ -5866,15 +5866,11 @@ endobj
/Filter /FlateDecode
>>
stream
<EFBFBD>WÉnãF½û+x¤‰Ã­IéèAœd <0C>‰}åжÚÅÍ![̯Om\$q@€HV×Ò]õjißÉßùåοzðï;<3B>³Ûya9*Œ¼(Ú:/ÕÝßw^¸SaJ ³WZ
âا¯màÔO_ªÔù©¹û¿kõÑ¿™øüt÷éç(rßÛù»ÀyzuB?ô·EÂÁùî*/ðVh¹û(ž[í­þzú ù R^²KÀÉÜ÷ E®. ]VºGÉ®©<C2AE>»<>ÿ¬Â­«³Ì´ÌõjÊ}”Æ¥±¸l)'¼<>R!ÚÚjë©-&Š½]¼öÓNUº¿¯¢Àmª
ç:/ÐþK¾<4B>¨“©rû¦Ì<C2A6>ZZmywÅÒ±|gþŠ·â‹ûÕ&C·(sSwMyÐ%^WÀmóUàvøÖí#¥@­
ð-h<>n<EFBFBD>1r<31>˜$ÏÏ,U™ t<>u&äs•(eMŸ/ü±
S‰Ì~³ÏyßÔèÌükD:?ìC•HBk=þÕò©‚UY/ÍÑØ ž$^ Ž¦ƒÖ†C^ †[üÎgà…VŒe¶¼>Ðu<E28098>#!v5Ó»Þ´ïh™B½•Pƒ¢9Ókw<E280BA>PÚB ˆ ÞAñ~t#mÃ
pÙ‡°’óIpr+ÛY8ácžÕºü9R÷¨»¾&8h«×LÓ•)Kr¬)…ÂŽ¾!<21>²À<11>©Ä» >2í¼5¥553»ù•Ïb(¦ÎÅ&lý}¥ÈÂ*­.Æç¤9ò£k ”<>Mál—‰`Zû(Pèǹ¶á€ôõÒiyÓ«k­†qHºÊ/Äu¿t0D¬Ç”*ƒ?K“1 œ£\NÛ¦6ŽÇîCßc˜<63>I¼yAácÝ<63>å<>BJ´0ƒ¿@‰®ø« ½­6W·f;džœ…fz|†ú^²Dr­X:mºÔ¨\`uNNÃêw}&.¿`éÐ\6)M¨Nž(£¥ÂÊâXB©:;aàmƒíåpç¡
*ÈèRÈ\šŸóöPCeê×oOO,7A+½‚Öè»Ö²ìöEI”Üš\³NH¹Úÿfé ¦5YÞõ¶%aðºãì{…ó}o}7ô <C3B4>yÑÕ»Ñ<C2BB>•¯ædzcŸ) ˜¡H/NØ@cEúî¿0Ã#Ô³üÅ0QN ûx;?—ì…ÒëiÜtÖËÖxÀH$*½)fˆÃX“øÀjj7&9X:¢ÿÐã$È<>£®3=µ<05>aE%¤°hƒš,íA&ÕHi†Î%A<é5ÛÃÖVºÞY<C39E>È Š;ÓšÅ2•Q}XŒ=ÑX ÙÇ&<26>ÐÑtÐSþqn\2#R5W˜4¦Ž<C2A6><19>ù~Å4ˆÊRy ˜øb¨s€@.¾fúärË*y)Ö¬…Ó•f*xèÖà²È¿Å#<19>á )­<16>H^Ä#.|©ßÎò*<2A>Ü Næ=Ðc@B: AVaj¸ŒôÖ=¡ŽÍbM¶º…Ò$¬Ê‡,µš;µÆò‹¤ ÅÃ.âæëÔX9”Ì­y½È<C2BD>˜ïˆ(„ ¡ÃÁ2WT™^DâG[¶ëI¥òo±¿tñ*Å­˜Z5Aª6T—ʾ=S­´L"&~Õ4àÂÆ«[¸žyû¾B,×tš¢2ÂW„U2 Oƒö1ÝÇÉÈ#ÄX¬®Yj%hb÷]H ¸NývÞûQdÚ aØ?(=Ú¦lpÔDÂCo¹¥hÎN]!ü†¥+ˆ#£ú¼qMn, Sy ²KÍܲ`ÞŽ5n¿b#Ü*†ÀÀ:7´vàÖmÚ2«ï_†<5F>œ*LaÙÆUSÔ9ˆ¶Š-h^æ ÆD¢˜ÏFG uRù;VF!ãZ…<Ï¥÷ýÐ$qleäÔ¼„ÁNã%y]óÊÌ®Iž^c@Ç — 
OìÜQ?‡>C—®wÕ¢qS>N†<¬À4ñ¼„mŠs}8W¼^ëìƒZSc˜$L—¾ÒpìñûWt[ÆÚÄ(Þû<E28093>Sƒ§*ÓÝ(¥³û Ó<>Ê žp±[MY¤h¢:@izÎ<>rÔü—]p¶ˆœÌCPl3Ι„üg& ÐL<C390>˜F:£ÙÈ-¶EìrŸÅ·Úˆ\ülÓ ûjþÆ=F&ÎÒÔõ¬ÖÑ â`¸Ö_\µAe<04> îÚã¸c×øo¡€”0üÏ+tÓÈŠã$M+GArÓÓ@@Ô-NækY§ <¢É<C2A2>xK„¸
„Ó IåÒ_äû}¸Îb Yœ/ÄØËÖWB<n¡‰7ÝêEÈT|S‡ÍãM1<4D>nz)]éŽçwÆè×Gì³¼8Ÿ?àûDCXÖtçÒr¾PèaEÔCè Uj ݳºÓð÷ ¤ÍeaýÔ âB«<_¤<Owÿ¦Ýæî
<EFBFBD>WKs£F¾ûWpDUË0 ÐÑ[qMj«²±o«a^Œœ2¿>ý!oRªÐÓÓ=ÝýõcB/÷Bï—«ðÍSÁè)o» "¥½$Ò<>Ö™÷P_ý}DÛ$J‰aöJK*ŽCúÊT8R?}©Sï§öêüÞŠ_üõLÁçû«O?kí©0؆[åÝ?zQÊKBdH8xßý$PÁj­3íït¬ö<C2AC> VÝÿ£ùÆ$ 6Û ¨¢=7ìÐÚ7UiªÚ ¸³ok$ÆþÝ?«(óMžÛŽ¹mµÓi\YgQô;<17>®ÄS*Ø&I„ºÖ*É‚$ctlãíxΘNšl"ÿ÷•V~[×ø85E‰úŠ<>ÞèT¦‰7´UŽÔÊǧ+—Ì
½5ø+ÎÄ7«uE~Y¶éÛê`*&<®ÖÊò{|ëw:I@l¢ðMu@·È¨} n6û=ïªm2H;Šž¹*ÜåìP”/ü±ŠR‰Ì~µûbhtæ+þµ²»8ì¢dS" µ ø×Èg¢åxe<7F>Ö­Ñn4TmM†6C^ŽŠ;üí³ðB+Ö1[ÑÈdÓHˆ}Ãô~°Ý j¦Pgj4gz슾ÊÁ8‘Á;¸}˜ÜHÇpÅ[<Gþ*¬äÃâ¼ñìVÖ³`á]7¦ú9Rÿhú¡!8g®™fj[UäX[ …}Ke€#z[w!l2<6C>¼³•³ 3»ù•m± Û¢Žþ²J6<4A>7„UZ]ŒÏ“áÊcŠ®#PB6E³Lx\&´<4A>si£<69>ôõÐy3%‹ë­SÐG†éhw]\l7ÃaˆX<>)UFV6g8'ñ9mÛ@Ø:2#ŽýÛaÀ0!“‘ýö7›–œ™¸)$Ä ˜š¿êQÑójý&ã®Yϱ%g¡šŸ„~<7E>,\+—ì¢CWå‚ œ)ÈiXýÞÚ$Àå,†Ë&¥ ÕÉ'Êh©°²8•PªÎ^¤Le—G¸¥“ëyºà×,G <PQˆ~Î 72Ž55M^2üø\t‡ª¸P¿~»¿ç·<C3A7>aÈè^/<2F>—s#DûÀB(k=påc"¥[dõ:íìl^ôƒë˜Ÿ¨æ¢Ñx߉ÐüýfÉ_QjªGûd¬~nO<6E>äÌ}ùbûà8)^¸ùÂÏ;ðqñ`/<2F>±™!Ã!Áþói_±Ðízƒ šÆƒE·<C2B7> ˜ëv°åìÊ&Z™qï ÃÌé€e¤ÑYÍDÃ<C383>¦É 5†WnÍTƒaÁdPÆ¡µ´Ëí¢[JOTE!;Š
0ùBB˜"P8$Po!0”b¯C[1ƒ¤§=<3D>Ý8Fà'„©Zb½M.Ai<öa•c¼fÿÕðÓŒßN¼\Bž.Xi©ß¨Œâ¾€®UÙÌçŽ×g…?+{.Œèê¼ë=<04>•!½ƒ ¦IÎñäeüÁ—æqO<E28099>ázò7Š\2uD<04>Àe1Ò[ ÞûP£ãŽPºˆÃ™ʘ,jLDg¸«,ÕQÎÀ+§@>HÓsÁaˆJ~”ÅÑŠ×ÁzǸôʘ³ØM>:¯»F ÔÒ£8»47csãÉ­¸òÜÓ V öGÜKýÁ<C3BD>¨¨:ÞGL¢``.[WÜë<C39C>ð,!7%( j'Yiô4½Ž¹½dì2”½NˆI¨C®†xüóÐT†3¼<Ÿv¡Ö¶a
¨”][MŽ;@Ö¼v;ˆ Ã<>ǘ±‡4µ€o`L>Â6¬Éõ? +‘Ç 5­+>nj7X˜ÉüŠ „pï<70>ˆà:·¼íàæn»Ò «9^’¶ “ç\ÿJòçaV³ÃKã¤D`@áåóp ´Þþ Éå„
9þq'®ž\o†s]ÃKäwòºá•™/2}1ÚRDy¾<79>£\ê÷뵈ŸcÞ:7^(<28><6C>gGgàCùuQAC¶å©9œj^oLþÊ: se´Ù0]îTøJãsÀï_Ñm9K =5æŽ{<7B>(šRç.Û¿J¶‡jj8<>…ëSŒò'¡™ëý£x|ÊÑð\vÁÙ!rr7Žm@qí4‰ì÷L ÙÏ\3<>dêÙP.ºEôJO…·ÆÊ.¸º¶Ï…Cë<43>*Æè+3ief*r8_Òì4^ü/.ã RCÏÛøt <0B>.ná þ;($ôûÿyÉÆŽaDEù¼äv ‰€¨Îî2üñŒŽo†8âB\Ó”K»¨—˘”fÌ#wÝ\¦u¾2c»~³ ˜Vñl:³™šïòpør¼KF Bîüˆp~!¹Ÿ¦éÅùpé©ÍÛþT9Î ;RE4„Íb‰FÒÍó "*!î²,Ga¨8†Ø&A(qQéÏíýÕ¿¨Ñô!
endstream
endobj
490 0 obj
@ -6026,7 +6022,7 @@ endobj
/Type /Annot
/Subtype /Link
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [169.102 327.298 202.004 338.927]
/Rect [306.747 327.298 339.649 338.927]
/A << /S /GoTo /D (subsubsection.2.2.1.3) >>
>>
endobj
@ -6035,7 +6031,7 @@ endobj
/Type /Annot
/Subtype /Link
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [149.934 277.993 182.835 289.621]
/Rect [270.561 277.993 303.463 289.621]
/A << /S /GoTo /D (subsubsection.2.2.1.2) >>
>>
endobj
@ -6044,7 +6040,7 @@ endobj
/Type /Annot
/Subtype /Link
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [280.246 228.687 296.178 240.316]
/Rect [414.846 228.687 430.778 240.316]
/A << /S /GoTo /D (figure.caption.10) >>
>>
endobj
@ -6072,18 +6068,18 @@ endobj
endobj
496 0 obj
<<
/Length 1869
/Length 1878
/Filter /FlateDecode
>>
stream
xÚ½ÝsFÀßýW0yf™û:mgœ¤i™6<E284A2>£Nœ< ™ÈXT<><54>1<EFBFBD>þïÝ»åCÈreIÀxÆ{ÇîÝîþîŽ5·ë×3gëHá¿cQË÷ £Ü’Â!žò¬Ùòìï3"…ôL}S2®ëG˜sá(âÔUçï—žõ&=ûìÒ„½aãÕäìü-çuˆïøÔš|³¨R„K׌Á@tm]<5D>$adls<6C><73>¾pA§ë€Œ¿N>À¥lóR)‰ò3ל<>^Eëëe°Ò'bôÛ§ÉÅYÆs­,΃\3ý/ Uu¸¸3w&³H׌m8¹ ´ÙG>´ñ„esA|á£}P(iê„xøðùãïº$F<46>a,áÅ“±'FéÍÙáJÞ(Œ±2<C2B1>¯Ó<xÝ2œ”_àá[xY˜¡|ኣ4kc:ºÛÔâ0ÑrÔ^èÞe¦œ®ñš…ñÂùZâÓ8ÑÆ¡ÚTÁŽ/OQSbç/Áš£`Æ¥åEƵë4N—e<ܤEQzU7
ÖyZ`çõ98 W¨*'Z¬G¼é|ë
2ƒo‰Gv<47>¡ž8ÊŒý©vAPö(ÍZ˜gZZÀY´(û£%©¼Ö\ŸA‚¶$zà¦v¼çÐeH㘸ƒX¨MYO°æÛa0>à­8\£Ü¤ ŽtsŽ
ÊV·ATÙˆ¬ÑíÖyyŽA;ëÊMD€,Â<Y1ògv<E28093>Ä´&ɤÊ.m”Wú5p×Ë(Ù¥Íæ>èSmçݦó4»<1D>è2ŽË ¡ã›í„ñ tBÞß0ð—(
}„%q”„(»—~Øp™šW— `ª“A f¿ËM§¨}#ã fV5{<$3MÁø4þwA=/“Þ÷0t×W«† <20>7ü3ß×ü£8,r,x€DWj:<3A>6”µò)Ѫc¬<63>2]cgLî®xFŠPUýQÔhÁ8¸ǃîNIÍ)Ìé|Ë'O…oÀ`õ›,x‰çzÂÁÒ"*Ê©&˜£Dç‡>š.UŒ¤zÖ2â4¾K5
²zò׶@³uŒMn<4D>F'ÅîD°Zñý‰Â sÜÿñV™'î£<©‡\¯MSÓ­e„Õy¢¥O¦>)çGø#žµž[UñV0âÃ\PÿÓ•m ´ùe+~½MP„1aqåÃBçê%\Ëñ=ߢ°`ƒ<>ÐúfVÿcíµŒ9Ln»úêX×PS1á¾g}7-—ºµ1[ŸŸ´Ý<C2B4>ÞÃz<C383>Û<EFBFBD>-W & õÝî<C39D>%™ Âñ
<EFBFBD>d<EFBFBD>©0ŒÎcs˜-%@êßup•©úÏ]—3¤êêâ.¿I×Q~q¤s™Æ!l$“£ŸððBO{/±l ~íè×>Pj(”cÝ¢t°Þ£Pj»ª M<>ñ]ÇæÅûPR”ø”V(­¢×iRî3zAD(pýPˆ4ƺEä`½G!ÒvUÿˆ š:“»ŽÍ Š÷!"ØÃUˆ\¦w¹Yi^«èüjÖàÒߺÂ%‘ŽšÆX·Ð¬÷(hÚ®êšABSçv×±9Aqû¹Âã{ú`ØYÝMãh¶û¹Û•ÙŸÍâ ËZ ¶<>”p<E2809D>Ö<|ÞG³0k,Üåý€‡Fü*ÈÂ>¸„$pØP\6ƺåò`½GqÙvUÿ\šŸ®csâ}h†{1ƒÏ?}0A™þ…a &cÝ2q°Þ£˜h»ª& M<>º]ÇæÅO2¡úzZ%°á?óqBÏÏJ5?<3F>±nù9XïQü´]Õ??ƒ„¦Nó®csâ½ü8<>@ïò|õGšåå3·æ† Þé ýk‡ôBgÃX§è®÷t¶\Õ;:ĦÊðÎcsâ½·I%BÌçÿ¹7JAö<41>Ìž£4 ²Å<C2B2>ï/fy”&—¡þaóg„ó£A2ˆc ¨³.]<5D>PG Äec¬[.Ö{—mWõÏå ¡©ñé:6'(Þ·¤1<C2A4>Â.ÓëïF‰)EŠŠÆX·T¬÷(*ڮꟊABS'o×±9Añ“TŸ3•;°w,© ¤<>÷˜„è
><17>±n¹8XïQ\´]Õ?ƒ„¦Nß®cs⽫…ô`cX>Vû·*'J EEc¬[*Ö{mWõOÅ ¡©“·ëØœ ¸º3é$ñLNÔceyc¬Û,?XïQYÞvUÿY>Hhêdì:6'(Þ;÷s Û,·×=sˆë ÅEc¬[.Ö{mWõÏÅ ¡©Ó·ëØœ <0F><>·°ËRí-Qõ¨ªý<C2AA><C3BD>äÄÅ6ÅŒò3!^~&Gúë<C3BA>,âC!A˜lÞî/ð ê0+Ê—ð•*ð{¡ú=zoó» ^~Iýbvõ¬º~!Ûm^Èv7Úß«ØÔaÀ«´ˆ åû©¯[F³ï¨òMžV—Aõ™Àº­Žzà¦ß!ç>qËGƒÔk5Ùâ?ùk%
xÚ½]sF†ïý+³Þo ÓvÆIš&™iÓ8êôÂÎÅJ&2®ÀΘNÿ{Ïî"²\EÏØ]Þ³{Îyvfv~=Á[[ÿ±Cœ0D”0GpŒ8ÓÅÉß'Hp˜úzÏTø~ˆ07ÇK„«ªó÷Ày“ž|¿m ^iÂÛ°ñj|rþ1‡`â<>8ã¯1á;Ä)Ý8W®@<14><0÷šq2Y)4ú2þ§ÒÍS…@2”`Ìœs'0澊W7 ¸ûÛ§ñØgEšÌ´X«\o3ýo©æëêhþ8¢¾-§±®ypp§´Ùg>t<B)
¸ã1ŽBZûjäñ p?|þø»ÞóÝ¿FÐÿhbÇ£€»é|D0áEó¹1Øir“æ¹Zئh†ô^¨‡¤«¿Fw‰ÊŠ¥éþ5“̶e­vˆ¸K-˜[Å5$3ûéÊ6žk—h±hödKâäÉöF<C3B6>Æå‰8“v0yÕÕü šãÀU(yš·À)¦Èøq•&©î8ö<38> ø6-
ëB]˜«Uže¯¡<½Šî­NŽlÙEÃÍΕ)ˆm»žÊ¬hgÆøD•]IôQžñü̶¸MÍ8Mw¼ÆáÌŒ^ŸO%qoGq+ëéҲ¸!·ÇÊnª!@MY<4D>t µ9ëF† …”¬óôMôO£ìuºÌÁwI´Ú•ÚcOyΣ¶¢ƒ:³fÓ¥.ÈïTœ[Ã*QÖ§ºÑ*<2A>ô=Ïmp·;
Æ›ù3ÛÝ*<2A>ð«ÞÌÚ9JºÃ7x¹K<C2B9>DÃpÝì.<2E>¥ÙCOŸÂ 8‡ŒOn·2^ßuñx«`àgºD¸ªÐ[æžG =<3D>Ä©=Ëp]9Ï7΃¼Ls[­
ëM“Kº`šÁ¬°c„Œú(ðý½CôX(<>Mï>©N˜Þ©,]®ÇÆ|êû2ö¼ž#ôÌv'*r»£¬`!ådoˆ•Éb“m©¥[gev¦-¬‡û?é†U«ÍÀYì<æ ³å3`3÷ëoØÃ0Æ
J]ñBÖ§s•ÛU>œÙc=EY¥y\”““šÙ:<3A>)ºÆ¤”¥õ<gªÓäq$$LÕµA'‰-Kl“;£ˆ¬ÌE±Óg6ò­2äYΗ—¦j<C2A6>åÅŠ»ÓE=<3D>vUšCæo8Ìd:*gRøC<C3B8>³š9ëÝK¸ª¡P8õ?]Ù,<2C>6¿ŒaP-$¢”;L†pñóõe]—S¡ž8ˆœ¯fEÐÖ^æbÓØÕìÜ@ÌèˆAæ}3-ºµ1ž8Ÿ_´Ý<C2B4>îa½·K -Wq`†„~÷Δ#ŽÃ<C5BD>B#`>0ŒÎcs„°]*˜e&<26>é£ÐÇåÕIèþ3ŸÁéÔwuñ<75>ߦ«¸ˆ®±À—iÁêBPáþd7§zÊ;³ûåShG¾ô<C2BE>—C¡T륃u[¡ÔtUÿ( š*㻎ÍÂûP…„¬Qº<51>ëm/ˆp ®
ÚX·ˆ¬Û
¦«úGd<EFBFBD>ÐT™ÜulŽÞ‡ˆÀ°¼[#r™>äæJsªîãó«i<C2AB>K×÷nXMm¬[hÖmMÓUýC3HhªÜî:6G7Ÿ¥Yxüð°@o “$žî~weÖgÓDeY£ÁC§äËÏ`ŒÊvS¿RYÔ<>˜Åem¬[.ÖmÅeÓUýs9Hh*|ºŽÍÂû.f  ÷bŸú`Pý«Ã@LÔƺeâ`ÝVL4]Õ?ƒ„¦JÝ®cs„ðL0Šd %õÓÏï|œÐó3LCñS럃u[ñÓtUÿü š*Í»ŽÍÂ{ùÁ<>k€Þåùýi—ÏÜê¦t™Ä˨7th" „Ά±NÑ9\· :[®ê<1D>aB³ÎðÎcs„ðÞÛ¤!2ˆø½7J*{ZN¿ÿFi¬²ù<C2B2>ï/¦yœ./#ýæÏÎ<>I•$P f\ê_1ˆËÚX·\¬ÛŠË¦«úçr<C3A7>ÐTøt#„÷]Òh@`•ôw£D¥DEEm¬[*ÖmEEÓUýS1Hhªäí:6G¿H7S9†µcIB}¼<>@D—³<E28094>¸¨<C2B8>uËÅÁº­¸hºª. M•¾]Çæá½W À°|¬öoTp†¤ŠŠÚX·T¬ÛŠŠ¦«ú§b<C2A7>ÐTÉÛulŽ^ß™tx&Ë'Ð<>²¼6Öm¬Û*Ë›®ê?Ë M•Œ]Çæá½s?°Ìò{]QŒ|<µ±n¹8X·MWõÏÅ ¡©Ò·ëØ!¼ç‡FÈ[XeÉæhý¨ªùí<C3B9>`ƒ°GìMFùé+?Jbý!@–¿ðñGTTï­_ö%ê(+Êð¥,ìÛÖÏß¡·Mí—¦‰ZV­ŸUo½“Ýüô`ë»"¦À«p<J'åû©¯F³oVòMžVjý‰Àª)GpÕ¯—³ùå£A4Álñ:pE
endstream
endobj
495 0 obj
@ -6252,7 +6248,7 @@ endobj
/Type /Annot
/Subtype /Link
/Border[0 0 0]/H/I/C[1 0 0]
/Rect [356.561 466.919 372.492 478.548]
/Rect [369.086 466.919 385.018 478.548]
/A << /S /GoTo /D (lstlisting.5.3) >>
>>
endobj
@ -10063,8 +10059,8 @@ endobj
650 0 obj
<<
/Author(\376\377\000K\000u\000n\000k\000l\000i\000\040\000R\000i\000c\000h\000\341\000r\000d)/Title(\376\377\000V\000i\000z\000u\000a\000l\000i\000z\000\341\000c\000i\000\363\000s\000\040\000m\000e\000g\000o\000l\000d\000\341\000s\000\040\000I\000o\000T\000\040\000a\000d\000a\000t\000\040\000e\000l\000e\000m\000z\001\121\000\040\000r\000e\000n\000d\000s\000z\000e\000r\000h\000e\000z)/Subject(\376\377\000S\000z\000a\000k\000d\000o\000l\000g\000o\000z\000a\000t)/Creator(\376\377\000K\000u\000n\000k\000l\000i\000\040\000R\000i\000c\000h\000\341\000r\000d)/Producer()/Keywords()
/CreationDate (D:20201203163633+01'00')
/ModDate (D:20201203163633+01'00')
/CreationDate (D:20201203182139+01'00')
/ModDate (D:20201203182139+01'00')
/Trapped /False
/PTEX.Fullbanner (This is MiKTeX-pdfTeX 4.1.0 (1.40.21))
>>
@ -10074,235 +10070,235 @@ xref
0000000369 65535 f
0000000015 00000 n
0000044142 00000 n
0001574454 00000 n
0001574463 00000 n
0000000061 00000 n
0000000122 00000 n
0000045864 00000 n
0001574370 00000 n
0001574379 00000 n
0000000168 00000 n
0000000234 00000 n
0000047842 00000 n
0001574247 00000 n
0001574256 00000 n
0000000279 00000 n
0000000354 00000 n
0000047902 00000 n
0001574173 00000 n
0001574182 00000 n
0000000402 00000 n
0000000485 00000 n
0000047962 00000 n
0001574086 00000 n
0001574095 00000 n
0000000533 00000 n
0000000616 00000 n
0000049299 00000 n
0001574012 00000 n
0001574021 00000 n
0000000664 00000 n
0000000831 00000 n
0000051755 00000 n
0001573887 00000 n
0001573896 00000 n
0000000877 00000 n
0000001023 00000 n
0000051815 00000 n
0001573776 00000 n
0001573785 00000 n
0000001071 00000 n
0000001248 00000 n
0000051875 00000 n
0001573665 00000 n
0001573674 00000 n
0000001301 00000 n
0000001394 00000 n
0000055148 00000 n
0001573591 00000 n
0001573600 00000 n
0000001452 00000 n
0000001580 00000 n
0000055208 00000 n
0001573504 00000 n
0001573513 00000 n
0000001638 00000 n
0000001718 00000 n
0000055268 00000 n
0001573430 00000 n
0001573439 00000 n
0000001776 00000 n
0000001853 00000 n
0000055328 00000 n
0001573343 00000 n
0001573352 00000 n
0000001906 00000 n
0000001953 00000 n
0000055388 00000 n
0001573269 00000 n
0001573278 00000 n
0000002006 00000 n
0000002076 00000 n
0000088515 00000 n
0001573158 00000 n
0001573167 00000 n
0000002124 00000 n
0000002295 00000 n
0000088575 00000 n
0001573060 00000 n
0001573069 00000 n
0000002348 00000 n
0000002461 00000 n
0000088695 00000 n
0001572986 00000 n
0001572995 00000 n
0000002519 00000 n
0000002615 00000 n
0000090572 00000 n
0001572899 00000 n
0001572908 00000 n
0000002673 00000 n
0000002768 00000 n
0000090632 00000 n
0001572812 00000 n
0001572821 00000 n
0000002826 00000 n
0000002906 00000 n
0000090692 00000 n
0001572725 00000 n
0001572734 00000 n
0000002964 00000 n
0000003059 00000 n
0000090752 00000 n
0001572651 00000 n
0001572660 00000 n
0000003117 00000 n
0000003288 00000 n
0000093444 00000 n
0001572525 00000 n
0001572534 00000 n
0000003334 00000 n
0000003486 00000 n
0000093504 00000 n
0001572451 00000 n
0001572460 00000 n
0000003534 00000 n
0000003604 00000 n
0000286496 00000 n
0001572339 00000 n
0001572348 00000 n
0000003652 00000 n
0000003745 00000 n
0000286556 00000 n
0001572263 00000 n
0001572272 00000 n
0000003798 00000 n
0000003861 00000 n
0000286676 00000 n
0001572172 00000 n
0001572181 00000 n
0000003915 00000 n
0000003973 00000 n
0000286736 00000 n
0001572094 00000 n
0001572103 00000 n
0000004027 00000 n
0000004215 00000 n
0000918275 00000 n
0001571963 00000 n
0001571972 00000 n
0000004262 00000 n
0000004407 00000 n
0000918336 00000 n
0001571845 00000 n
0001571854 00000 n
0000004456 00000 n
0000004677 00000 n
0000918396 00000 n
0001571766 00000 n
0001571775 00000 n
0000004731 00000 n
0000004774 00000 n
0000918457 00000 n
0001571673 00000 n
0001571682 00000 n
0000004828 00000 n
0000004886 00000 n
0000918518 00000 n
0001571580 00000 n
0001571589 00000 n
0000004940 00000 n
0000005036 00000 n
0000918575 00000 n
0001571501 00000 n
0001571510 00000 n
0000005090 00000 n
0000005214 00000 n
0000957685 00000 n
0001571369 00000 n
0001571378 00000 n
0000005263 00000 n
0000005400 00000 n
0000957746 00000 n
0001571290 00000 n
0001571299 00000 n
0000005454 00000 n
0000005545 00000 n
0000957807 00000 n
0001571197 00000 n
0001571206 00000 n
0000005599 00000 n
0000005738 00000 n
0000960943 00000 n
0001571104 00000 n
0001571113 00000 n
0000005792 00000 n
0000005896 00000 n
0000961004 00000 n
0001571011 00000 n
0001571020 00000 n
0000005950 00000 n
0000006013 00000 n
0000961065 00000 n
0001570918 00000 n
0001570927 00000 n
0000006067 00000 n
0000006135 00000 n
0000961126 00000 n
0001570839 00000 n
0001570848 00000 n
0000006189 00000 n
0000006237 00000 n
0000961187 00000 n
0001570721 00000 n
0001570730 00000 n
0000006286 00000 n
0000006428 00000 n
0000961248 00000 n
0001570642 00000 n
0001570651 00000 n
0000006482 00000 n
0000006550 00000 n
0000961309 00000 n
0001570549 00000 n
0001570558 00000 n
0000006604 00000 n
0000006690 00000 n
0000963493 00000 n
0001570456 00000 n
0001570465 00000 n
0000006744 00000 n
0000006822 00000 n
0000963554 00000 n
0001570377 00000 n
0001570386 00000 n
0000006876 00000 n
0000006985 00000 n
0000965638 00000 n
0001570245 00000 n
0001570254 00000 n
0000007032 00000 n
0000007128 00000 n
0000965699 00000 n
0001570166 00000 n
0001570175 00000 n
0000007177 00000 n
0000007268 00000 n
0000965760 00000 n
0001570034 00000 n
0001570043 00000 n
0000007317 00000 n
0000007450 00000 n
0000969412 00000 n
0001569955 00000 n
0001569964 00000 n
0000007504 00000 n
0000007580 00000 n
0000970753 00000 n
0001569876 00000 n
0001569885 00000 n
0000007634 00000 n
0000007705 00000 n
0000970813 00000 n
0001569783 00000 n
0001569792 00000 n
0000007754 00000 n
0000007894 00000 n
0000975505 00000 n
0001569665 00000 n
0001569674 00000 n
0000007943 00000 n
0000008078 00000 n
0001032339 00000 n
0001569586 00000 n
0001569595 00000 n
0000008132 00000 n
0000008315 00000 n
0001032400 00000 n
0001569507 00000 n
0001569516 00000 n
0000008369 00000 n
0000008457 00000 n
0001066966 00000 n
0001569414 00000 n
0001066975 00000 n
0001569423 00000 n
0000008511 00000 n
0000008617 00000 n
0001247385 00000 n
0001569296 00000 n
0001247394 00000 n
0001569305 00000 n
0000008667 00000 n
0000008741 00000 n
0001247446 00000 n
0001569217 00000 n
0001247455 00000 n
0001569226 00000 n
0000008790 00000 n
0000008927 00000 n
0001248630 00000 n
0001569138 00000 n
0001248639 00000 n
0001569147 00000 n
0000008976 00000 n
0000009336 00000 n
0000010004 00000 n
@ -10310,13 +10306,13 @@ xref
0000028490 00000 n
0000009386 00000 n
0000028429 00000 n
0001564938 00000 n
0001565455 00000 n
0001565108 00000 n
0001565278 00000 n
0001566315 00000 n
0001565628 00000 n
0001568400 00000 n
0001564947 00000 n
0001565464 00000 n
0001565117 00000 n
0001565287 00000 n
0001566324 00000 n
0001565637 00000 n
0001568409 00000 n
0000028133 00000 n
0000028382 00000 n
0000030158 00000 n
@ -10397,7 +10393,7 @@ xref
0000048022 00000 n
0000047723 00000 n
0000046008 00000 n
0001568517 00000 n
0001568526 00000 n
0000049359 00000 n
0000049008 00000 n
0000048107 00000 n
@ -10406,19 +10402,19 @@ xref
0000051995 00000 n
0000051293 00000 n
0000049444 00000 n
0001565972 00000 n
0001568226 00000 n
0001565801 00000 n
0001565981 00000 n
0001568235 00000 n
0001565810 00000 n
0000051935 00000 n
0001566143 00000 n
0001073430 00000 n
0001566152 00000 n
0001073439 00000 n
0000054837 00000 n
0000054991 00000 n
0000055448 00000 n
0000054690 00000 n
0000052145 00000 n
0001072448 00000 n
0001072943 00000 n
0001072457 00000 n
0001072952 00000 n
0000088356 00000 n
0000057216 00000 n
0000088285 00000 n
@ -10436,7 +10432,7 @@ xref
0000092985 00000 n
0000090897 00000 n
0000093564 00000 n
0001568634 00000 n
0001568643 00000 n
0000285517 00000 n
0000285671 00000 n
0000095623 00000 n
@ -10450,11 +10446,11 @@ xref
0000095444 00000 n
0000093773 00000 n
0000286615 00000 n
0001566658 00000 n
0001566667 00000 n
0000286002 00000 n
0001072633 00000 n
0001072819 00000 n
0001072881 00000 n
0001072642 00000 n
0001072828 00000 n
0001072890 00000 n
0000915808 00000 n
0000287463 00000 n
0000286969 00000 n
@ -10470,10 +10466,10 @@ xref
0000918636 00000 n
0000917503 00000 n
0000915950 00000 n
0001072509 00000 n
0001074482 00000 n
0001073186 00000 n
0001073125 00000 n
0001072518 00000 n
0001074491 00000 n
0001073195 00000 n
0001073134 00000 n
0000960176 00000 n
0000957868 00000 n
0000920532 00000 n
@ -10488,19 +10484,19 @@ xref
0000961370 00000 n
0000960005 00000 n
0000958002 00000 n
0001072757 00000 n
0001073247 00000 n
0001073369 00000 n
0001073004 00000 n
0001072766 00000 n
0001073256 00000 n
0001073378 00000 n
0001073013 00000 n
0000963171 00000 n
0000963329 00000 n
0000963615 00000 n
0000962858 00000 n
0000961455 00000 n
0001568751 00000 n
0001073065 00000 n
0001072386 00000 n
0001072571 00000 n
0001568760 00000 n
0001073074 00000 n
0001072395 00000 n
0001072580 00000 n
0000965821 00000 n
0000965519 00000 n
0000963700 00000 n
@ -10510,7 +10506,7 @@ xref
0000965945 00000 n
0000969473 00000 n
0000969534 00000 n
0001566487 00000 n
0001566496 00000 n
0000969594 00000 n
0000969655 00000 n
0000969716 00000 n
@ -10530,7 +10526,7 @@ xref
0000970570 00000 n
0000970631 00000 n
0000970692 00000 n
0001073308 00000 n
0001073317 00000 n
0000974724 00000 n
0000974880 00000 n
0000975038 00000 n
@ -10553,180 +10549,180 @@ xref
0000976176 00000 n
0000976237 00000 n
0000976298 00000 n
0001072695 00000 n
0001074421 00000 n
0001072704 00000 n
0001074430 00000 n
0001031790 00000 n
0001031954 00000 n
0001032118 00000 n
0001034699 00000 n
0001065897 00000 n
0001034708 00000 n
0001065906 00000 n
0001032461 00000 n
0000978391 00000 n
0000976483 00000 n
0001032278 00000 n
0001066054 00000 n
0001067027 00000 n
0001034545 00000 n
0001066063 00000 n
0001067036 00000 n
0001034554 00000 n
0001032595 00000 n
0001066115 00000 n
0001066176 00000 n
0001066237 00000 n
0001066298 00000 n
0001066359 00000 n
0001066420 00000 n
0001066480 00000 n
0001066540 00000 n
0001066600 00000 n
0001066661 00000 n
0001066722 00000 n
0001066783 00000 n
0001066844 00000 n
0001066905 00000 n
0001061466 00000 n
0001068785 00000 n
0001068955 00000 n
0001069125 00000 n
0001069292 00000 n
0001069486 00000 n
0001069653 00000 n
0001070122 00000 n
0001070298 00000 n
0001070475 00000 n
0001070933 00000 n
0001071102 00000 n
0001071270 00000 n
0001071442 00000 n
0001071620 00000 n
0001071802 00000 n
0001071975 00000 n
0001072157 00000 n
0001074073 00000 n
0001074256 00000 n
0001073490 00000 n
0001068502 00000 n
0001067174 00000 n
0001072325 00000 n
0001069887 00000 n
0001070704 00000 n
0001568868 00000 n
0001074543 00000 n
0001073926 00000 n
0001073588 00000 n
0001075154 00000 n
0001247568 00000 n
0001075035 00000 n
0001074628 00000 n
0001247507 00000 n
0001248815 00000 n
0001248511 00000 n
0001247715 00000 n
0001567012 00000 n
0001568055 00000 n
0001567882 00000 n
0001248691 00000 n
0001567367 00000 n
0001567190 00000 n
0001566832 00000 n
0001567714 00000 n
0001567544 00000 n
0001248753 00000 n
0001564737 00000 n
0001249004 00000 n
0001249267 00000 n
0001564461 00000 n
0001249292 00000 n
0001564557 00000 n
0001249428 00000 n
0001564661 00000 n
0001249691 00000 n
0001249901 00000 n
0001250317 00000 n
0001250342 00000 n
0001563851 00000 n
0001250701 00000 n
0001250896 00000 n
0001251283 00000 n
0001252479 00000 n
0001564873 00000 n
0001252504 00000 n
0001252529 00000 n
0001252650 00000 n
0001253030 00000 n
0001253978 00000 n
0001254234 00000 n
0001255555 00000 n
0001256838 00000 n
0001257994 00000 n
0001287777 00000 n
0001288215 00000 n
0001320287 00000 n
0001320821 00000 n
0001335429 00000 n
0001335659 00000 n
0001355829 00000 n
0001356079 00000 n
0001359190 00000 n
0001359461 00000 n
0001364059 00000 n
0001364318 00000 n
0001367093 00000 n
0001367332 00000 n
0001403987 00000 n
0001404635 00000 n
0001425427 00000 n
0001425692 00000 n
0001440485 00000 n
0001440719 00000 n
0001462276 00000 n
0001462516 00000 n
0001489860 00000 n
0001490228 00000 n
0001505478 00000 n
0001505763 00000 n
0001508664 00000 n
0001508918 00000 n
0001534451 00000 n
0001534725 00000 n
0001563367 00000 n
0001568969 00000 n
0001569063 00000 n
0001574525 00000 n
0001574723 00000 n
0001574905 00000 n
0001575131 00000 n
0001575368 00000 n
0001575583 00000 n
0001575800 00000 n
0001576044 00000 n
0001576279 00000 n
0001576521 00000 n
0001576760 00000 n
0001576994 00000 n
0001577231 00000 n
0001577465 00000 n
0001577705 00000 n
0001577939 00000 n
0001578149 00000 n
0001578348 00000 n
0001578550 00000 n
0001578787 00000 n
0001579029 00000 n
0001579271 00000 n
0001579513 00000 n
0001579780 00000 n
0001579963 00000 n
0001580084 00000 n
0001580211 00000 n
0001580332 00000 n
0001580464 00000 n
0001580573 00000 n
0001580611 00000 n
0001580806 00000 n
0001066124 00000 n
0001066185 00000 n
0001066246 00000 n
0001066307 00000 n
0001066368 00000 n
0001066429 00000 n
0001066489 00000 n
0001066549 00000 n
0001066609 00000 n
0001066670 00000 n
0001066731 00000 n
0001066792 00000 n
0001066853 00000 n
0001066914 00000 n
0001061475 00000 n
0001068794 00000 n
0001068964 00000 n
0001069134 00000 n
0001069301 00000 n
0001069495 00000 n
0001069662 00000 n
0001070131 00000 n
0001070307 00000 n
0001070484 00000 n
0001070942 00000 n
0001071111 00000 n
0001071279 00000 n
0001071451 00000 n
0001071629 00000 n
0001071811 00000 n
0001071984 00000 n
0001072166 00000 n
0001074082 00000 n
0001074265 00000 n
0001073499 00000 n
0001068511 00000 n
0001067183 00000 n
0001072334 00000 n
0001069896 00000 n
0001070713 00000 n
0001568877 00000 n
0001074552 00000 n
0001073935 00000 n
0001073597 00000 n
0001075163 00000 n
0001247577 00000 n
0001075044 00000 n
0001074637 00000 n
0001247516 00000 n
0001248824 00000 n
0001248520 00000 n
0001247724 00000 n
0001567021 00000 n
0001568064 00000 n
0001567891 00000 n
0001248700 00000 n
0001567376 00000 n
0001567199 00000 n
0001566841 00000 n
0001567723 00000 n
0001567553 00000 n
0001248762 00000 n
0001564746 00000 n
0001249013 00000 n
0001249276 00000 n
0001564470 00000 n
0001249301 00000 n
0001564566 00000 n
0001249437 00000 n
0001564670 00000 n
0001249700 00000 n
0001249910 00000 n
0001250326 00000 n
0001250351 00000 n
0001563860 00000 n
0001250710 00000 n
0001250905 00000 n
0001251292 00000 n
0001252488 00000 n
0001564882 00000 n
0001252513 00000 n
0001252538 00000 n
0001252659 00000 n
0001253039 00000 n
0001253987 00000 n
0001254243 00000 n
0001255564 00000 n
0001256847 00000 n
0001258003 00000 n
0001287786 00000 n
0001288224 00000 n
0001320296 00000 n
0001320830 00000 n
0001335438 00000 n
0001335668 00000 n
0001355838 00000 n
0001356088 00000 n
0001359199 00000 n
0001359470 00000 n
0001364068 00000 n
0001364327 00000 n
0001367102 00000 n
0001367341 00000 n
0001403996 00000 n
0001404644 00000 n
0001425436 00000 n
0001425701 00000 n
0001440494 00000 n
0001440728 00000 n
0001462285 00000 n
0001462525 00000 n
0001489869 00000 n
0001490237 00000 n
0001505487 00000 n
0001505772 00000 n
0001508673 00000 n
0001508927 00000 n
0001534460 00000 n
0001534734 00000 n
0001563376 00000 n
0001568978 00000 n
0001569072 00000 n
0001574534 00000 n
0001574732 00000 n
0001574914 00000 n
0001575140 00000 n
0001575377 00000 n
0001575592 00000 n
0001575809 00000 n
0001576053 00000 n
0001576288 00000 n
0001576530 00000 n
0001576769 00000 n
0001577003 00000 n
0001577240 00000 n
0001577474 00000 n
0001577714 00000 n
0001577948 00000 n
0001578158 00000 n
0001578357 00000 n
0001578559 00000 n
0001578796 00000 n
0001579038 00000 n
0001579280 00000 n
0001579522 00000 n
0001579789 00000 n
0001579972 00000 n
0001580093 00000 n
0001580220 00000 n
0001580341 00000 n
0001580473 00000 n
0001580582 00000 n
0001580620 00000 n
0001580815 00000 n
trailer
<< /Size 651
/Root 649 0 R
/Info 650 0 R
/ID [<C70ED119061990A2BAEAA4952FC97C1A> <C70ED119061990A2BAEAA4952FC97C1A>] >>
/ID [<D262934C47BCC73775E9709180866AE1> <D262934C47BCC73775E9709180866AE1>] >>
startxref
1581558
1581567
%%EOF