From 92ec2daa3a5332515bfc8a8cfdf7846e8dab74b7 Mon Sep 17 00:00:00 2001 From: Tomasz Pluskiewicz Date: Thu, 25 Apr 2019 16:11:07 +0200 Subject: [PATCH] Net standard (#13) * update rdf.vocabularies * paket magic mode * conver Argolis.Models to netstandard * argolis.hydra.nancy * argolis.nancy * getting closer to .net standard * got to a state where command line builds and runs tests * apply stylecop to test projects and fix build within VS * fix borken tests * correct urls and years in nuspecs * start setting up cake * call cake on CI * remove version attributes from assembly.info files * remove prerelease form cake build * remove gitlink * add mock to fix dotnet test * replace integration tests with HttpClient client * remove paket from projecy dependencies * merge uritemplates into argolis.hydra * update nancy,rdf * tweak codecov steps --- .gitignore | 4 +- .paket/Paket.Restore.targets | 253 +++++++-- .paket/paket.bootstrapper.exe | Bin 64296 -> 0 bytes .paket/paket.exe | Bin 0 -> 69928 bytes Argolis.sln | 45 +- NuGet.config | 6 + after.Argolis.sln.targets | 7 - appveyor.yml | 26 +- build.cake | 115 +++++ build.ps1 | 164 ++++++ paket.dependencies | 57 +-- paket.lock | 121 +---- .../Argolis.Hydra.Nancy.csproj | 206 ++------ src/Argolis.Hydra.Nancy/FodyWeavers.xml | 5 +- src/Argolis.Hydra.Nancy/FodyWeavers.xsd | 63 +++ src/Argolis.Hydra.Nancy/HydraRegistrations.cs | 4 + .../Properties/AssemblyInfo.cs | 4 + src/Argolis.Hydra.Nancy/Settings.StyleCop | 10 - src/Argolis.Hydra.Nancy/app.config | 9 - src/Argolis.Hydra.Nancy/paket.references | 8 - src/Argolis.Hydra.Nancy/paket.template | 21 - .../Argolis.Hydra.ExternalAnnotations.xml | 15 + src/Argolis.Hydra/Argolis.Hydra.csproj | 323 ++---------- src/Argolis.Hydra/FodyWeavers.xml | 4 +- src/Argolis.Hydra/FodyWeavers.xsd | 65 +++ .../Models/DefaultUriTemplateExpander.cs} | 13 +- .../Models/DefaultUriTemplateMatcher.cs} | 12 +- src/Argolis.Hydra/Models/DictionaryMaker.cs | 93 ++++ src/Argolis.Hydra/Properties/AssemblyInfo.cs | 4 + .../TemplatedPartialCollectionView.cs | 5 +- .../VariableRepresentationConverter.cs | 6 +- src/Argolis.Hydra/Settings.StyleCop | 10 - src/Argolis.Hydra/app.config | 9 - src/Argolis.Hydra/paket.references | 11 - src/Argolis.Hydra/paket.template | 23 - .../Argolis.Models.TunnelVisionLabs.csproj | 127 ----- .../FodyWeavers.xml | 10 - .../Properties/AssemblyInfo.cs | 5 - .../paket.references | 5 - .../paket.template | 19 - src/Argolis.Models/Argolis.Models.csproj | 142 ++---- .../AttributeModelTemplateProvider.cs | 4 +- src/Argolis.Models/FodyWeavers.xml | 5 +- src/Argolis.Models/FodyWeavers.xsd | 63 +++ ...ericResourceIdentifierTemplateAttribute.cs | 2 +- src/Argolis.Models/Properties/AssemblyInfo.cs | 6 +- src/Argolis.Models/paket.references | 5 - src/Argolis.Models/paket.template | 15 - src/Argolis.Nancy/Argolis.Nancy.csproj | 195 ++----- src/Argolis.Nancy/FodyWeavers.xml | 4 +- src/Argolis.Nancy/FodyWeavers.xsd | 63 +++ src/Argolis.Nancy/Properties/AssemblyInfo.cs | 4 + src/Argolis.Nancy/paket.references | 6 - src/Argolis.Nancy/paket.template | 16 - .../Argolis.Tests.Integration.csproj | 365 +++---------- src/Argolis.Tests.Integration/FodyWeavers.xml | 4 + src/Argolis.Tests.Integration/FodyWeavers.xsd | 63 +++ .../IntegrationTests.cs | 37 +- .../Properties/AssemblyInfo.cs | 5 +- .../Properties/launchSettings.json | 9 + .../TestExtension.cs | 7 +- src/Argolis.Tests.Integration/app.config | 19 - .../paket.references | 10 - .../DefaultSupportedOperationFactoryTests.cs | 2 +- .../SupportedOperationBuilderTests.cs | 4 +- src/Argolis.Tests/Argolis.Tests.csproj | 482 ++---------------- src/Argolis.Tests/ArgolisModuleTests.cs | 27 +- src/Argolis.Tests/FodyWeavers.xml | 6 +- src/Argolis.Tests/FodyWeavers.xsd | 64 +++ .../AttributeModelTemplateProviderTests.cs | 6 +- ....cs => DefaultUriTemplateExpanderTests.cs} | 10 +- ...s.cs => DefaultUriTemplateMatcherTests.cs} | 10 +- .../PartialCollectionViewTests.cs | 9 +- src/Argolis.Tests/Properties/AssemblyInfo.cs | 4 + .../Resources/PartialCollectionViewTests.cs | 9 +- .../ServingApiDocumentationTests.cs | 4 + src/Argolis.Tests/TestExtension.cs | 2 +- src/Argolis.Tests/app.config | 19 - src/Argolis.Tests/paket.references | 17 - src/CommonAssemblyInfo.cs | 2 +- src/Examples/TestHydraApi/Issue.cs | 27 +- src/Examples/TestHydraApi/IssueCollection.cs | 2 +- .../TestHydraApi/Properties/AssemblyInfo.cs | 36 -- src/Examples/TestHydraApi/TestHydraApi.csproj | 125 +---- .../TestHydraApi/UndocumentedClass.cs | 7 +- src/Examples/TestHydraApi/User.cs | 36 +- src/Examples/TestHydraApi/paket.references | 3 - .../Bootstrap/AuthenticationStartup.cs | 11 +- .../Bootstrap/Bootstrapper.cs | 29 +- .../Bootstrap/CorsStartup.cs | 2 +- .../Bootstrap/HydraRegistrations.cs | 22 + .../Bootstrap/NancyContextWrapper.cs | 10 +- src/Examples/TestHydraApp/FodyWeavers.xml | 4 + src/Examples/TestHydraApp/FodyWeavers.xsd | 63 +++ .../AssembliesToScanForSupportedTypes.cs | 6 +- .../Hydra/BaseProvider.cs | 2 +- .../Hydra/HydraDocumentationSettings.cs | 2 +- .../Hydra/IssueSupportedOperations.cs | 12 +- .../Hydra/UserSupportedOperations.cs | 6 +- .../Modules/IssuesModule.cs | 20 +- src/Examples/TestHydraApp/Program.cs | 24 + .../Properties/launchSettings.json | 26 + src/Examples/TestHydraApp/Startup.cs | 22 + src/Examples/TestHydraApp/TestHydraApp.csproj | 57 +++ .../Bootstrap/HydraRegistrations.cs | 27 - .../TestNancyApp/Properties/AssemblyInfo.cs | 35 -- src/Examples/TestNancyApp/Startup.cs | 16 - src/Examples/TestNancyApp/TestNancyApp.csproj | 347 ------------- src/Examples/TestNancyApp/Web.config | 36 -- src/Examples/TestNancyApp/paket.references | 8 - 110 files changed, 1781 insertions(+), 2855 deletions(-) delete mode 100644 .paket/paket.bootstrapper.exe create mode 100644 .paket/paket.exe create mode 100644 NuGet.config delete mode 100644 after.Argolis.sln.targets create mode 100644 build.cake create mode 100644 build.ps1 create mode 100644 src/Argolis.Hydra.Nancy/FodyWeavers.xsd delete mode 100644 src/Argolis.Hydra.Nancy/Settings.StyleCop delete mode 100644 src/Argolis.Hydra.Nancy/app.config delete mode 100644 src/Argolis.Hydra.Nancy/paket.references delete mode 100644 src/Argolis.Hydra.Nancy/paket.template create mode 100644 src/Argolis.Hydra/Argolis.Hydra.ExternalAnnotations.xml create mode 100644 src/Argolis.Hydra/FodyWeavers.xsd rename src/{Argolis.Models.TunnelVisionLabs/TunnelVisionLabsUriTemplateExpander.cs => Argolis.Hydra/Models/DefaultUriTemplateExpander.cs} (78%) rename src/{Argolis.Models.TunnelVisionLabs/TunnelVisionLabsUriTemplateMatcher.cs => Argolis.Hydra/Models/DefaultUriTemplateMatcher.cs} (71%) create mode 100644 src/Argolis.Hydra/Models/DictionaryMaker.cs delete mode 100644 src/Argolis.Hydra/Settings.StyleCop delete mode 100644 src/Argolis.Hydra/app.config delete mode 100644 src/Argolis.Hydra/paket.references delete mode 100644 src/Argolis.Hydra/paket.template delete mode 100644 src/Argolis.Models.TunnelVisionLabs/Argolis.Models.TunnelVisionLabs.csproj delete mode 100644 src/Argolis.Models.TunnelVisionLabs/FodyWeavers.xml delete mode 100644 src/Argolis.Models.TunnelVisionLabs/Properties/AssemblyInfo.cs delete mode 100644 src/Argolis.Models.TunnelVisionLabs/paket.references delete mode 100644 src/Argolis.Models.TunnelVisionLabs/paket.template create mode 100644 src/Argolis.Models/FodyWeavers.xsd delete mode 100644 src/Argolis.Models/paket.references delete mode 100644 src/Argolis.Models/paket.template create mode 100644 src/Argolis.Nancy/FodyWeavers.xsd delete mode 100644 src/Argolis.Nancy/paket.references delete mode 100644 src/Argolis.Nancy/paket.template create mode 100644 src/Argolis.Tests.Integration/FodyWeavers.xml create mode 100644 src/Argolis.Tests.Integration/FodyWeavers.xsd create mode 100644 src/Argolis.Tests.Integration/Properties/launchSettings.json delete mode 100644 src/Argolis.Tests.Integration/app.config delete mode 100644 src/Argolis.Tests.Integration/paket.references create mode 100644 src/Argolis.Tests/FodyWeavers.xsd rename src/Argolis.Tests/Models/{TunnelVisionLabsUriTemplateExpanderTests.cs => DefaultUriTemplateExpanderTests.cs} (93%) rename src/Argolis.Tests/Models/{TunnelVisionLabsUriTemplateMatcherTests.cs => DefaultUriTemplateMatcherTests.cs} (86%) delete mode 100644 src/Argolis.Tests/app.config delete mode 100644 src/Argolis.Tests/paket.references delete mode 100644 src/Examples/TestHydraApi/Properties/AssemblyInfo.cs delete mode 100644 src/Examples/TestHydraApi/paket.references rename src/Examples/{TestNancyApp => TestHydraApp}/Bootstrap/AuthenticationStartup.cs (82%) rename src/Examples/{TestNancyApp => TestHydraApp}/Bootstrap/Bootstrapper.cs (95%) rename src/Examples/{TestNancyApp => TestHydraApp}/Bootstrap/CorsStartup.cs (97%) create mode 100644 src/Examples/TestHydraApp/Bootstrap/HydraRegistrations.cs rename src/Examples/{TestNancyApp => TestHydraApp}/Bootstrap/NancyContextWrapper.cs (67%) create mode 100644 src/Examples/TestHydraApp/FodyWeavers.xml create mode 100644 src/Examples/TestHydraApp/FodyWeavers.xsd rename src/Examples/{TestNancyApp => TestHydraApp}/Hydra/AssembliesToScanForSupportedTypes.cs (68%) rename src/Examples/{TestNancyApp => TestHydraApp}/Hydra/BaseProvider.cs (83%) rename src/Examples/{TestNancyApp => TestHydraApp}/Hydra/HydraDocumentationSettings.cs (92%) rename src/Examples/{TestNancyApp => TestHydraApp}/Hydra/IssueSupportedOperations.cs (52%) rename src/Examples/{TestNancyApp => TestHydraApp}/Hydra/UserSupportedOperations.cs (57%) rename src/Examples/{TestNancyApp => TestHydraApp}/Modules/IssuesModule.cs (75%) create mode 100644 src/Examples/TestHydraApp/Program.cs create mode 100644 src/Examples/TestHydraApp/Properties/launchSettings.json create mode 100644 src/Examples/TestHydraApp/Startup.cs create mode 100644 src/Examples/TestHydraApp/TestHydraApp.csproj delete mode 100644 src/Examples/TestNancyApp/Bootstrap/HydraRegistrations.cs delete mode 100644 src/Examples/TestNancyApp/Properties/AssemblyInfo.cs delete mode 100644 src/Examples/TestNancyApp/Startup.cs delete mode 100644 src/Examples/TestNancyApp/TestNancyApp.csproj delete mode 100644 src/Examples/TestNancyApp/Web.config delete mode 100644 src/Examples/TestNancyApp/paket.references diff --git a/.gitignore b/.gitignore index 119fbe9..03eedc8 100644 --- a/.gitignore +++ b/.gitignore @@ -229,11 +229,9 @@ FakesAssemblies/ **/*.Server/ModelManifest.xml _Pvt_Extensions -# Paket dependency manager -.paket/paket.exe - # FAKE - F# Make .fake/ paket-files/ packages/ .Argolis_coverage.xml +coverage/ \ No newline at end of file diff --git a/.paket/Paket.Restore.targets b/.paket/Paket.Restore.targets index 98c71f9..0df24f9 100644 --- a/.paket/Paket.Restore.targets +++ b/.paket/Paket.Restore.targets @@ -11,15 +11,49 @@ $(MSBuildThisFileDirectory)..\ $(PaketRootPath)paket-files\paket.restore.cached $(PaketRootPath)paket.lock + classic + proj + assembly + native /Library/Frameworks/Mono.framework/Commands/mono mono - - $(PaketRootPath)paket.exe - $(PaketToolsPath)paket.exe - "$(PaketExePath)" - $(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" + + $(PaketRootPath)paket.bootstrapper.exe $(PaketToolsPath)paket.bootstrapper.exe + $([System.IO.Path]::GetDirectoryName("$(PaketBootStrapperExePath)"))\ + + + + + $(PaketRootPath)paket.exe + $(PaketToolsPath)paket.exe + $(PaketToolsPath)paket.exe + $(_PaketBootStrapperExeDir)paket.exe + paket.exe + + + $(PaketRootPath)paket + $(PaketToolsPath)paket + $(PaketToolsPath)paket + + + $(PaketRootPath)paket.exe + $(PaketToolsPath)paket.exe + + + $(PaketBootStrapperExeDir)paket.exe + + + paket + + + <_PaketExeExtension>$([System.IO.Path]::GetExtension("$(PaketExePath)")) + dotnet "$(PaketExePath)" + $(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" + "$(PaketExePath)" + + "$(PaketBootStrapperExePath)" $(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)" @@ -28,30 +62,42 @@ true true + + + True + + $(BaseIntermediateOutputPath.TrimEnd('\').TrimEnd('\/')) - + + + + + true - $(NoWarn);NU1603 + $(NoWarn);NU1603;NU1604;NU1605;NU1608 - /usr/bin/shasum $(PaketRestoreCacheFile) | /usr/bin/awk '{ print $1 }' - /usr/bin/shasum $(PaketLockFilePath) | /usr/bin/awk '{ print $1 }' + /usr/bin/shasum "$(PaketRestoreCacheFile)" | /usr/bin/awk '{ print $1 }' + /usr/bin/shasum "$(PaketLockFilePath)" | /usr/bin/awk '{ print $1 }' - - + + - - + + + + + $([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)')) @@ -61,20 +107,37 @@ true - - - + + + true + + + + + + + + + + + + - $(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).paket.references.cached + $(PaketIntermediateOutputPath)\$(MSBuildProjectFile).paket.references.cached $(MSBuildProjectFullPath).paket.references $(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references $(MSBuildProjectDirectory)\paket.references - $(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).$(TargetFramework).paket.resolved + + false + true true references-file-or-cache-not-found @@ -93,35 +156,48 @@ - + true - target-framework '$(TargetFramework)' + target-framework '$(TargetFramework)' or '$(TargetFrameworks)' files @(PaketResolvedFilePaths) - + + - + + false + true + + - + - + + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',').Length) $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0]) $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[4]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[5]) %(PaketReferencesFileLinesInfo.PackageVersion) + All + runtime + runtime + true + true - $(MSBuildProjectDirectory)/obj/$(MSBuildProjectFile).paket.clitools + $(PaketIntermediateOutputPath)/$(MSBuildProjectFile).paket.clitools @@ -138,30 +214,41 @@ + - + false + $(MSBuildVersion) + 15.8.0 - + - <_NuspecFilesNewLocation Include="$(BaseIntermediateOutputPath)$(Configuration)\*.nuspec"/> + <_NuspecFilesNewLocation Include="$(PaketIntermediateOutputPath)\$(Configuration)\*.nuspec"/> + + $(MSBuildProjectDirectory)/$(MSBuildProjectFile) true - false - true - $(BaseIntermediateOutputPath)$(Configuration) - $(BaseIntermediateOutputPath) + false + true + false + true + false + true + false + true + $(PaketIntermediateOutputPath)\$(Configuration) + $(PaketIntermediateOutputPath) @@ -172,11 +259,101 @@ - - + - + + + + - Qgvn%)MGzE`071eI0YO~CkPI-If)8c)^OcaJSPLZ_3LHPSm1Twh%2fEc)m-pWEQ| z_A*VN9Ah%k??4GE>gEse8RoKq-?^%6D!rL%GvJ@Os0aP^JOks}cmYwN{FnaJsN$v) z$Xy|2gT|zUfbbeoWHdg*2Ib=8#Se%ogzvuuVWO-I)-2$QGVrFp_>Ml{T`vHjPR0to zGk?NF8=Ksu+X14|4P#@WFJ^LyHRd+C@h%69tSjrxHlSCB@y#1dflh2!{IG5&`RUYC zhz4#T*v=$~%e08_{U=a7*`&E(f(AuC=YB|tgfNLUjdraIT5r&5%(Gp1TyJCy==HWQ zf*H1R%z!fopJqVVo!KZyizoZ2S`DQr2`P5ai~z0A@kd|y$&(=)*?6 zQEEF7YiIeH(YCD!da~_&pR|i$G&VYfuiFi-UBk`n(8luFtmv5kCs}5Jf~& z5!^U_sNlw2MF}|zrG+yIA1*ZPbsO1sVMvWsu?7LVObsAPZ2K#dYm*c3+5{X-JH-8FXq%7& z-?F37i}kC=C+4Kca^GUcJXF;*=GIznwxQ9XYVf%H;!~J6v`bBR&>r1%6o$t0W?FV= zz2!`RMeLI?rJ$)vv}}*+Oau)+Wzj>>fqyKw2A%R;2OEl0HWFGbXi#c?s-8Pi_7a-Z z*O!}vdJeH&3 z=Wr_6WoNpjMpToKGmoY0S&v{@(-^AVvkryBcA-Ib5?&Ro8Q_`-e6=2?A8*-e0H*C; z1c{M4usE2#pq}5`GP@DP>xQS<+H>;YZi>>~aE){Wrb)*QvdoQ{f`0j}Y& zQy)17c+LSB)wZ1ilwS-)$-s7GLh|wR)y~Fi0&_3%QmGSkpM?5$BpV7uX0iy=`60>y z37AmYlGPf?2TdY^j9#rTi_n1J9Yx7vXcV-q-H7Ktv!T{>WxVgu`HcL!N2x zVixB(R7Xo>eZXIMn<+|;)-p~N8Iw&8%R!D|^$=7#SkNd4Vm=PzLFWV|ZJya^OW2Q^ z>^{LLjm28N2l6qxA~VtqT4TBU3I-gy46(qdDK&42oW>)AU-w2S30;Cg%XAQm5b$kh zKJWvaNw zmH;|S0WQS~F(S)QlBtAO@%Z5#k>&Wbqqmw4+%D+802SP~0i2aU5e8QAhZQM?%Fb$( zqfeNTHhlJB12bwA>l)xSA!jXrn2PlzE|)o2?<($rg%vI`lUVU^>QP1n((Hz!fbC$2 z&ElM}3ooDS$V1LNRTx0Hvtj1h-w1wpi>2@e;IT3vB0isqKdPdwTW4GJH zJr8gVX9D$mph+fAIrDS~57+G3IJkOjx|(ZvrPa&&A4N_atr~OOZm5ymjPlv0-}xTY z$dN#hn-y@jfEw8f;C=^8dlD!)X8`26cLDd@*w$|R5@?<~W#3X0@+-QXtzu2F??6e~ znF9?-IwVpQ`LLjspM90qe4zZyq#LQzFffHgO>VJ|dI#X$zUYHyXm zvm<3(wi2|97`A}$AVEbW09Jph3Q#M2T!@0o z9OD;&4|Xatog|3C`WbshVd%DlGXNHv(~pmau>ofrK3&B3US~T>&JG4U0T4f>o!$5( z$7qwLK^}}#WI1PZlc{K;f{JN7-^BPDOdAVm7wQn=Re?7*8zEj|FjQmZq0cu!4VrfH z9PkPYqGi6jo(1wcEXh5v1j#wCfxPVGZZH-5ihPlyfae~VQsiq0AkWAA24Bo>u(MUE z*zaD4_TE}3(oPRilm&Yjm;jTeQ}6_JTrsJU#xL<=Dbd=sG?ruOVz(-fdMmS&dmw&* z?WJ@_j3e||6vAAdiz;UTAh{P{PYIYJpFt^jpd!azhvuFV0p~oBRV+V1cB5%ULziLO zfE&3Ff$tWJljVA-r(={!<0`3w_28Jk6m+&X0vSw??8)N2*$yTzfYci2LO|2GC{?zd zi&N!N=d)7Y2UuIx=zGes}?QHT7Y;A;+wopmeLx4K!xM{d6z6rFr!$tt=%yP!y;c z49XLxjW@GHkr}XRX?k>KQ9z3-HnU5;T923&TA!Px#yIshGuxJWyCFNJfb2`lVNZBZ zQTS67lAni`m@60@>%TJKz*<=TVy%X3j8}DMXL0(5aEysS27e%!j?K2pZj_(!+OI!e z`7WPVv4hHw4`a(R&BdYhYeG?Tap`2UH0r|`r7nwOrw05)W|H1x^ZWA!(5)}X-Dz&DxpVJLPBW0Ode{A)WoBSo}U&> zZgU!)Azg^$ObeCf!jdOIGv{i6fO8FCZGEwH;S1%}XQ$eE?xgxW;lxir{WPl~1W$o~ ziLo*T$ySCONbM<7z@CClP!Xg60@5`_kOBxuJQP6+AdL42QUIaSBS-;+ut$&r2vr_I z3bJky)(CEey!K3t&kS)cYMYWFL=gXNa}*sOjg4rm&6y$JZ>W6%%_z0=38POn^+#rN zGhAQHkxzdF=`e6RGFLtWkwx;ErR4RP&KJ>fBn-fZYSa0WhoUb(As>_&=6;No&v_^g z2;(y+1IfFQYmD* zdHK|9sWBq>2K5jSCG8M4?yrE<(B@WwDd5}$B;ec(sIu-`P?EG)64+cbfK%oQSfC-0 zl`V;EmP%x^e9l+FYVNAW=n$&D1_VPBJrJ5?Y-Z$tSlX=syO~YT9cR1PN!=5mfE`)M zGvl_V%F)yJOaQOQmE#Oz^VeB;Q*sqp2e>j?zGotTj5i15b82J_s>%-gN)H>+dDwbx zM}x}T5a-f%G-{@bsk;0zsXDK?T(^sS1C4d{3^Nm(qdCTxsm8UYS6ZCeHi8Maqf=E= zg)9^WeMcEMXDiC-BG`(26P=k6#GRlN;eR$wHIRg19+Q=DqG0$P?BS99;Mh}xK|9|@ zspPO7M<>beaJ%mUBw-?44o2=^!kqvCmC~9Z%k^CZ$pDVVQvf5!0^}moO*3cleS^Kb z1M=-%44p9WhMYZ|H%B(29MyCL4_jnuyq58N_;o|XU5iQd(g^o^JfljM@VHP)Wfhu= zjKS7LL=&%w&|^oo0OYy%LqfLm8WZm3VV#arc1Gg>4%fKBwUgiD+Rdni1M)cu`Vyog zXM?lY4eQixkaIjsY6fpZ%OLxGAEXQxlP|#R$k7b$LDhj!(0wUmWH_;`L)`(2@*M?6 zPU99)2>l`dF$um+WxNK*79e)Wyxt2T&V2xKWt+a!4Tf^GK4rGdUj!3v=en(EnHBi~ z8kFV)LP>FeEqw5`-SaYNx&<3q zAKi9|UP=&?9e69I_4bTL*%DS8t?YWg`xfY`WvCclnChRCCbc(Iv7Q^lVL3&4 zYS80GWwgjU;&|OeCZ9fkD9O2=KqAU2Zy*`?}B z+`Qtn=Gn^8R2!Mh6EkX$Eb26fvUl-Ha2~+~zl7*X#rdJ)0(+QKA^_Ws+qAji4R%8! z11TLLM^Qoi#5iRCe-u;Lar|c?5B2SqI!DcBf_po3CSV6iZc^e4B~769AK+NHN8h<7>zXicI**;8Q11D}QxMfCxP8wHa-#Hgr=ogHf`I8XzN@tsR8 zfAXD+6hN5d5u^Y@#3M)nggTEP1rQK1l?*9>Q120>078RDkb>kbcfzt2u$|S9Kx_u> z#zNN~jVs3W07)z_Tyo(G;!F(57T7deVY#@|6+#5dH5d&z-NM36D)25kxqvaV0SHo!os=<#kBk7KX6qUT&q^r>{|ERvgm%)uTsGedT!d;{g z?x)cztw+AbMdxV@GgX;PS8{Q1B`cs?a&d4aE37NIs4C(A@NJv2p%l`rqV%0$Bi{+u z-{|}py$5l)NS#5N6fGxkc_J6bkkFJdIC2cF1$}ZrroDdj2-TtM^3;xpJFu+M$rx-_ z0Oyxy(3jH%oG1z}G_s^j`^iigMmRUsE%+(aR7awv+feMS6gf{$q0D+6D(Y7R5*_l(nkbI%TMy_f3vN+Nh zp~yk-<{en>{1KnwFa-vh%){k&qb)fkPNA=W9;ghi5C0j7O5{~wIk;7BxJRYndyvlf zB7Xw4@qgS$c_qDu^4a|Cun-;N>1wEwnmD(qwZ@c1zRcr1)+!50$$1^T7H)eqNQx-!wDQb1W8a=(lWsC5)RIW6~O->B-EKZtC_AuI4=2{T^tkd>dIdo-3cm z%|x`%c>rZ>oJzs(0pVwj^P%;~4+zT^Hz5Lf2aZjLt7&80 zuX@tFmaJ|)Rt+A<>jB&iih68{(4_t8Hp>34vJ25E)bSwkrL%z>LyiiTToZto?`5$i z(InU`c@$y~ziV<9)|(P7OV43nvn5~JjTB~3)jg=fZPihjV7X3~i)38yU>mZN?}5s@ zKz#(!vR>XDy9 z<2`9N_{M>6jDEIg$x7d|13k*iSKCoIY)|7+!gSczxrR67dRXHe$WepG23)@f*C?5d z@T!-c{HHYH8h*#4p0`N6w&lHLWAjsDRz-9^KBe<>pt}1oN@pKRc-kAmzGm+^dvFKS z(^_#2$2z{&hb%v>9xUtClq}nJmsUXVM^J3sdfPqKL&gKis5#mB7#yi|JFJrN&~@5w ziy=P(yOjpzK~_$Eqg|P^K4`f;kY_vpLfc%+&a#!5yg;_Rw$~Uy;cC=buAAbk367rj zC|mnjDj|`Sg8vw6Id^e?1 zwk?QzJhwO%=sab>JZez0eqh?{98=luVj96S() zt?=ySH1V@kZasyT?V%Id&)_MTUgarL0O2@~AO#R+dju(ffT*dONa6FTEdg5!ZwUy% zw&{<2#2q3)mqBC+;>riyDDp9&b1y){S;>Xq z$jf%kYU2TagU~ zghd{oaOBkQklj(KkerK3dl&15OIxQISTXwl2fBl4_u(V;n$;h4NLRo7Qfr=TYlG34kJ}dU>LQ*M)-N zFTgg_ie0=+tjAguNa9{Ccs3sS2*VZ3Q0{)089)o7E^-TICdH>-?vTfVhs(9b$lC8< z`?!BYv-BaX*stsTsclZo7;=69ZhfBn9TmPoJEvg{^W1%&yXQECMWYV$*!Q^6k@r1* zdp5((alOs6oa-KjE_vQ8BjWKa=elzydLzfA4xVLiMq$?Pqeq-Y)MV*VWUl6wN1Eug zc-1y*(DW5$>7%C%3D3{`YNG2W3}Q=h@d5>t-kjMC^70kiy2z)Dy#wQs{J7Xo@9@O| zZ8SImZ_RodU_{0;HuJHAHgo9!Zvrz@dT#Y>d3*a@BeK{#-Jm7;{OTBucnHSm46lR7(HU-HrcYvj#ljkL z6C)JwCWck=Y;iLB!1)HY;F00=vQU%;+2u|M4!YYR*E52B=?o~Ow3fTFQE0)fyVztw zRt%R|{@M_3vN(O#d0Q?mTupu+3$MkQp!1LF%X02QHwWr!-3Kx{QWjB$K9E=IPKv-C zPi02DTTr3e=jT%e%VaD+N_p4;aK_YD=hHBro)y3x1M7IuQ!V*2iX^zv8J3%X#Bv8; z@e4+06d3MjxdXgK4$Ly;>kKksf}vlZ!kUs}SRf|N7hPx7#U@iUWcB? zF=LDwuW>&I;Z_8?1l_Apbgu=F7rx!EaJTp#4X!3lc_Sp!$%;!pipKKeewCX`redl` z-w%ODqGx11N~S!xH8b8O_$H{0flvhBoI(0FteOw;X8I8@l%2@RZe?Z5Bcr&{W_=fI z?LGrkd>H`5-CfMUd7pYu-zUDq^+CJxlO~@Xniix32oZIV_M*C{H1Q^>S~q{M$K2J8kK6#B^@f@jmj(~?o1;~aS>~=DR7Gxsu6+Ct?(PL@R(_(YcQGdK zGw0#5FMIcyTp5zOQ1HM}Bk^T7KBrVOOGFlWgRYZUSG8wgJao}TO4lAw59tW6qpA)I zpa`EHxVvb15?_P~o-MHo>x!^6^tdVyPa9+IVsnY%rsbHWO6_2Maj9Ih;&>rLm&;a^ z9q{hv0rTM`(g>yaJ!OM)Ksp9;EqONr@06Vdo(8<7flq!(b(ae~=Rm%VoAp``!_rgd zCEQ_7#0y(k7fs2jJjL6=9gV83oL>kFTD&g!O9&3WsKbu{cI^U-x$7K2=db7^dbYU> z<_C$7Gv+Qn&6v9excY6bMvJ{d;!}$AjwYQar1P2dE|V6T>GOnp58Ro*egY%nD=E7# zWL{*ZWwr9wm3%SK!8e1{7d{^W^X`klqSge?_xk-q(9K<3VeVoHvK(-yl54w-by!n( zLpZ(LJoo&FYb!_4i7%3FJQ@tN-?&ADf-a4ETLX=2h z@7Bd5hWloOtscJidPdQ>Vkn1eF#?=U9?$N&?BVgR#zQTa2tj zLY!PcZacbZa?`ZQ)27TqCBC%>AEUn@h*x8F)?;D)8I7vj`rJg%mLzk`-AMFx9Qdo( zw$YzItG>5fed5~I1*rQc@QX*GZeEwOiJ9?Z!dKQ+-jb7@59A|b8oxBjy~7`Pub`{& zi;S6YiWPk@6h3>>|KJyX%I}=Zd6?z#qDOOS@5d+nP|C=#@v|Bsg@0`NZP9h(Y>JO! zc&ETqi(=!7=?4hzHnj?+w`k!Qn=Tl|utDG{b*w)~onvO$ zHXU8pP-WBIpxAVZ#kDv4{)+E(HA|0mKBhb|x)ilP5jekW48E^XRdZf-kiJ;UFgwcd zr4r`+Xbf|{H@4J&BDFxbAhk?-D{Rv@%S+K?xP;4-P`2sI0>2sJR>zexe4zZTTAOYa zO(y$TL;q-&TmkvuAH_V^RdDaEB{A3`6lTiIF$_N|nx6tWL3(Zs^JnEUeT~qM$!EG% z$n+0`-1}`+3~vx^e~wz4E|T$vrPZ%0*d`^p3?GD@ZCY%Ov7gn~UFvCZs-%%L5P3M#|qzblYXZc&Scab$3$M%L-j5l}@*m1)%Pc|dD4H;~8oITL9ilRdID8;T0kPiIb*%sO@PtzO zL+EZTfXS!|VKK!N<-Po6MHBg#tfU$`npP#tMKJ(g{^umyI`H8M`-^u_D}c zvXp;}V{8;|VHk@`yAqsraL}gL>#iDmE#5btA$3npV9s)2EM<|#aESrzxhU67pk>6m zbc|+fBCU~jzZ0wm-{t3ad&{}57H^a=c5VSpo^ z3*1-G$o_mcE+GtOgMMZ48a~0Y&Xpm3<%oorDFw~D%g26 zTQFoAsJnpX7=Bpktg(z;h(CbAGQTaHm(c>jevGYQI$cf+GkX6VwHj>$?Rn3bZ39j< z!|pPMUkx$L7B~a2ls>F|##}XUXyP-ttGOZTL7WpV%zhN`xvVDu-xK&?fXlZFJTL2M zlur>D$$mC>3SFQ7TyERIYrbd9DRk@D7jtbp>_3=$(!kW3M*+ii3`3(CE)TNgcLLnk zLs<;3wi#B7gd| z$vzCYUgY$Na0s<04ZK{yaLFWwP9ejoH4H1Iyeo&x69j%4GdQ^I`9Y?%VIDm>ir*Az zU4S#_1z#kulrA+I0Y~HSbCgnursrXYL9K$!b3Ewtjd_3{m`eb2d`n=B7kq0_-bp8e zKUoz6JPo6;WkiUel@I3H^mJ8RIL`p*B4VqS74cjgTg#R_2cBS4OPG&y75Us_2+*Jt ztt8|;QSbz6r%buJu*{Qz=o>^ZiF>f4eXZkr|5Upz(IkJ0D5|E)b_jzIvnpi z8Sv`@ZxO9tvA&eIGK__ZztZto_01UX4T4=mxmDlD^U+VLRNb!1hw`$i3lW1kcaMKE zFNeOSvCAg>JTH&l5$r0u9asVV5HXNByC(b&e*3S93VS*DC%kf8Qll`pWC^~T#P6aq z=hv#=%o|O2XsoLEU1<6fjomZppE!*d)+)|>CViS$PN!=uCua%XB<&UKD*8vMoj;CN zPGZih=>4_` zB%EJM_af_so?}iL7schk8hu@B1M%sZBDXyA5g9*(2$DvVlc zF3dlUCi2mNuAwiNeIfsNI!7?Yc>-ObFnW62m-A1cpJ?oT|84p6=;bEWF1zG(V*xEa zim@x{`ElRLZ=t&dyM|f{@5^6A5AgvScKKELexsG1)YyUYLTaUFHFkOReq%8`ud!>Z z3u!SO)Yxgk{l*eHq_OT`AuXZ5X>3Vh1-{e!k;YCfEHRgoHAVHeF|^-UMmZYe?~N>@ z5{=zZP=W8lRA}suf)aB%)o5%>P6aZNMvZOHDKS^j42``v{?YuEG)H4Ol|KfyNMYjF ztLU5*_N)9=^b^6Zr1wTGp_A#)g6*Xr)+UV&w3O2Tecja66Y7If2;6ox+oLURPWl2+#x7xdCfjrj}46(nh^#`;QY3i|2mI8n1_-RiF| z*hUj^!NXXMJ*8kf4G4A(JzhMkU?+X;SgyMU?+Yy~*iBJRs=@h?e?`Fn&DNODURUrL zI#pp3moA{Kf?b$(dc}8;h4pG|YlR=!PL17-x(jKq#vVl7g|ts&wI$y{w*7gHO)kNc zL%LpLT?L&57t>cYwyPik>{}WeKYG9MS-M+e^`i^vv-E(*KFHp0?4uuPEC)WnkA9}H zS5S8e{Z?adWf#&V^s->D8Ml`?1((uI$Me{qp!>sp1((s7ISRWW_#NbqKNRd5+FiJ_ z;BxxK30$XQ^5^IUg=Ot5-EVx34r=WD(n9(iy`i!0y#2-%^f!%d%PYiv;>Q}hxcuCL zE6JKGGPABKzX({aVAs&R!Yc|sPu~(u>3P+l-oHTSH*>pdvZ^OtQ}6}4TVqX=ZU**4 zjg6hOJa9F$;pYke+r|5gG}f1!Z(c)B38xy-m+1F`?alJl>@WBdy`r&#nmd90MX=Wl zmU1m+&10Dt(ygQKEx3-B3ig`8GOwpC8oQ)!zi}h=XzYy%m)JMbHjT~Ad$8ckG@!9d za|>~Dx>#d-bMGyYyTj`q`>&*XA!Pn_tjkT2& z((QCWW4B`u_y)b9v5N%zyI@yRXX#H0zCi=?c|@-nQ;Y8{*iZX3_H#d;(nRJ9*_LJAdS5c`7n+7&kucC@GFnge}Ad3@YgBK!Jq1R zE`{Ben_Kw2hvnUrTYk7dT5$l~5#piv9B_K7UTSt;0S*@|9bc z4_#iM$r@W09aZ={nyIl^Gz6?!Vc6Bi75<)f2=+M5D)_YEC3;q4H3h!H1N3|g_qUh6 znp0DFkbEaH_Bg$hpIi7R;&00{R$5Sqdxn{U?WJGld|L22?HBAqx<6;1@n?ESFy(cJ z=%C`v`bxB^@DLr+*j>?S!2YH&*7^zJ6~f5!_9^7(2IgSPHc&H>FZ0F zQ;qiT)VEY&Yze+q;h!hOL*7>iFxKpSx>Gn`%VvLhpMIb*_LukRafKP|FCWmqG{*k& zPg<~y1-)jlzkE#RXpH^kU%H3K{XAozq%hX=a0=sD;d?LsdEC!>n#SEC1-BpNiwiB| zpDAp0q2EwDkjiud#*53j-Cmiafbpuvc#Zjz$};|;F`lC=@2J?g6nt;=ixEaxrMbxfyPRF=N3*fN(56wvjIieX4DB-p*VP#db=_**Nz@H$ zS7)rzbw`^Q6xJD!Wb_an#2GbysySCtw?At9S}?YtACJV}5$vEb3D1)24Sp<4bkKOU zwgT9%1=~yaTU_^!s>}Xq&3^o`(|>Bt`iYr!1+@*}#Gyf?{GsBK!g^zc#;V87MO|j@ zR&T7Ay7TB)#uvc(HNljX8U}GT7~j>Luh1oSgK@vc-Y~B#Y&0I!SRuTiX;8bPjAwLR z(%f$xHKguu_fxVdm>yJ}sxPx_lK7~4AEJj&Rr>z)aJ zS}?`9L1T?M`;Do_-CiB?f~kY_oM!w~*JYWv7ET*fceL?GU3aGM68mVQ;1s3Vg}!~p zbYp^G%APX@wVPoyY0eYDIm4Ktu{(hsld|r&VBMKUtFC*?y0ws>-WjxE0zdD2JIGH| zOG=sYvQVz6WXiSU@w8Itek#x7+GG{;bFEiq9dFRM$_#};$#&#RfDT7~nOQjdEklfF2b%bD=p5~kk_Xo%(}J(0^}xhuqDnIWT4 zGXJ-*T{M4G#;e-?N_zi(IrsH4Mr2aSSg&l*A5m+HJqMSc0l!Iy#<5n@iMY&>4R%4#OJ4Cg_?9r8S7auo}=iQ@aOP$lb#1O z=yfS8`I$VALKDm|#%|G_Vjrg9353AuVqpc-bd&g-B8tZ(Z1re+`xvHVN>*i0PoBF> zJwFz$6wiO7XQt$|CZ3*58LWw-r1kVTmCbn-;5m@22#zO~L(n=bOx1R{Z#*dxBUApH(9opWVkQ3jxP!HAmDt7l57u_LZo@hM8=ey|n+i)DjwgmhoByPF+O}%N`DmuZpMS3>&zd*(b7j|1@My7BCgm0J z+!q;x2kwEAVQzu*T(NZ@cSX2==1Z4B0xX>G7^`o0E2i+zH(e4o@6s@7T79qmB5n) z#suCBXyEBD!-IgM>5y?Oa=>>b_sgZG+DRxcMt1kE(S)q7gyxN#K_43P#?2+eI^c%tEyhkdu{vo~ne}x$P(HVMpRt#Ys=gYOf!ga)eq;34jf6bGs52`o_8STF z@PsSq4oEZTKDw*y0pkw(?4-wxv&@_QPZ=*5n{uB;`Kj?QK*BW>UpG#sak$qnGcPK6 z&)94Js_Fy44SpU`TlFW9HnGSupQbCSvdo=yzds-4tHULLpVpO`SDL#EE6rcf?(0Y-h=StpnRj4*3yCfEpn0E}UGgKd&it_M8NjCC&v1Xv zqpkww*XFw@A2KW88-F*~h|fH2UYTDA59Sj@oq1iUWn~)|=kGTRBV1Bq{la{ps)CA) zT~%YP7tA+CS6K(mL!QOcICL^tPjn z37mCOTW8E1z0!Jw<{*Qvf+aUtd&M*Nnpx$&mSH`HdtSo|Phj}$s1kFpc^0(VYj(k_ z_nJ@OW_gxT8Qf*fGT6Ij8DFWp4CTt;=dC*P!m4Xg=JmytZ(8it*tIY_*MqXH{4wy{ zH<2~}G2p4%hM%4El6870Qb7aCE5}U*XASJuDKo;H$NQ=*w_*X{g%yhdugtg1I&1mpjlQ#t zvuX{RWyyN6{#3Qa*KD0x+2fmH#>Xdp;?+L(w3T?*M)CX;JX6f%#EX4rnK^Y=0saO4 z$uh6?b;(%j%o)Ke=qzK@q+daPJJ#}9Mw$JB?@FU@+#h^H%qJgh~r_xT3`1Kf5K`Ue+MA1`h+#H=pK}B9sdCMUmyQtKaaXlBH;`EY;&#s zmj8Aw;ZVtY{_|xNRpw`ki|r}qRV7nxj+wLUD)T^ovwf+qy+)#3qWB}s)TokfyUt7$ z?*aT}$tCs|gy#l#Qs2;`IXWol#fj2(m+1W1$O}E(hmU( zsWU4dy9dKD0>i?yl#*Fl*x|kecq-ipxRGuF?4;WOpQ3Mp|DPh~U&3E#+`)2;2U(8s zd%z0geZa86ubfUaqJRd3S4mjKB1)OVK1h~Ms0dSFV7vNIk zCx9!BgMe#{e*&&Iii277v~dgM|HNnt=F_vrMS#CH{tEcKu`LJvnk-?WnVXA#%@)80 za~t4f^Xgoa-Zg)i+l0R>e`8h?_Vlu%Cj9-d34qmjgR}|X`CJS*jkW?FM+1QK=@P&t z^eSMRz*Femq7IQzWpqGJv%rl8%Zy2RK+1cie3O)Kmh!_=eniTTN%^3Z4LmWuF{?@- zSzHbaoGY+d;6{Nlfdc~f3cN|+%>o}5_=v!l1s)VgK9*?+v;>9)Rtc;YI9K3&fg1&O z2pkZ&SKxU9ZxZ-bfe#COMBrlrUlw>!;41>jFTD%21cn7x39J^_EHEapL*QP4=Lx)7 z;8z7cBJeSR2L-+&(6Ysb0_O|t5O|)zn*}~1@Ss2=Ap8QG1#T1=6F4AnufUrG-YoE8 zfiDZBES3-!I9K3Cfdc|>68NydmjzO`@C%$Pa3IK(n*=V%Jrm`x2_(GPb7Ph-k11g( zZ_H!PPN57)`6hu63w&JYFH4#7r5Ay71#T2LAn+!E4-0%*AQdqG!vbFxNQELn;9P+l z1>OX&2d9E1Njh%S+%l$Y6gVL8CV?-PGo8kY9D#EM(m0_AylFg_9~StsK&q5lfpZ0J z6gVL8;fZ&F|7C%5Yq-2o;DErJ1U@WqA^xKAZS+n0G2&3S@i|1*Mzg~_VCGp()_iN5 z^%?8S)?L=q)*IFb)+*n5zRP@H@x9{vi|>KT`+PB+3v>(M6OFqUsd*MJ+V0~a?U~|BalL!9Z7~(+?f60Fo6(FJ(BBm7K?~fHz z7;np0;k~(uh_E#{57go8(1_Z}$X90Iyf6!wf{P}63%56~*WCelsQUYW#S^iKEp4T{~2)Vq;~+1pY$={#2N!9FID?e z#76mRx!mJdq^#(flz21;JoiKk0aZDZC$p@iWpb+Vs*z@LW|mdITWeU`TWdxanXtOW z=R-gfmgl(|3uwan{8sijKoj$njdCTRiTTPwxeCyv37Aj3VG3ws{`jr!8bA~8Nf)6! z2@rQEm}Bg{fF|~f(J0RbH0gNExj}OPO*#Sn{N4OB0ke#5z-+?- z3>s$vMvWw3gVB$fUT#(bt~9Fv*Wj!95jx4N0bFlR0^DHM0iJ5s!-po*+4w7ozr@?w z-R3THzxj#z3u~*eT?BuyQWs)#&->D*{pY=@{K$S}Ez%FHvgHcMlD@nqjhH;(@gWIUFPOJk`V)>u)| zcqX?!Db|(fL}SlhLLAy=MBx{c|rlT`j*x%E! zaSAQ(@9K(e>WZV-+R}rGb3JT@3*LC=AYyX|PqXlz)ek@F+d1Fq?v23-Gurn#jPW|b z$Lu-X?d=N_J+ZE?oxoN@gXXTTrHP(+a!w~qHkDd?`ld})V}&tL8fy6r18TmR%r@L6 zQ`MlR(t?EO8FP1TOiP~jZzWG-J!TwzWS)OhHJ#cPHBX&BBQ*$={>>m}&=y3WwQCm6 zr?Vd(P77LAwk%)JvV8u@?F(C%w$P&0Ep2O;u4!*sy?Vv!c6712b@_?yC$+9v z+PtQ9#d2!fne2;qH?^*yZLzNYczZj+`(xCd>~P$!#3l&u@Ob7sU0rdpNwVq0cu(9- zbkJrvfN0X%DIfFuT^GxCS*$0vCEmGaD?1CSX3yzrZ%_0j`Vz6O6mdmwyoaZf6or-| z1kj3}w*HQecrv-UKNT0KxwDg+ld`lsse@N|C#{Pm`W8AauWNWlBFQv1No#VA8|#R- z^soz}Suc9&Y)N*+dKpWuiFfxpZp=+|?QGrBgO#sZwRFXLlPJ%R^>oC$up$u?lT6U| z$sBuIZ@dHJNSux8xxmSYfWvB6#`-$84i~$^O>E({d8C@* z^g*F*c=hW3p5er{t)4BOAHG+dk6!-Y~V-#9X+_@V>DK zI^yC+!|O2Do8#^gD(814uvCXPn(y@VjabpLc{8v7ZE<|t99!g;ox|HMM2Oym6>ww@ zY>=CrB!d13jbUfC-d4KKju9Bv#W$^vpVcoZ%Sa5o{$-s}GF4()dQqfnhtgD_ptWvd zNusBdR>zShcEqVQ$(!2>ciq-RU%aiCN$Xq`CCE^sC)vjlLn2ScQkMQR@dfeCvHq^U zOj1vJ<8RS8c z#G|+NY;(>Om0EhXC0wV6Gs%+>^Lb04R+Vk2ayl`gRz4ayNuj5P56g3#F3FQMvcTzQ z8rE`OqC383XD_ngo=#BEiZRY#HN_hco0UfkF;ZNBJwX?j!GuC%!(sdJns@^y$v#uq zR-MbzX7nQM`W*S#km!}qv-Kw{gS}3%=+C822Q*j^=Pfbb(~*cLr5b@nCEKk%!|HlD z_Z6=BPVY`BunL=bK(Y`JEs_q9W(2?POI5yV0eR43xNwml4u>3Rx0-rR^gBp zl1asqV+TwLV-*C!0O4_+$_gGORm%!2#LAV5m}D&;&w_-DFy^>Bg)n>0wDxu$P7iCz z&DxM(u;%Jx0W7u#^DI?MW63_X{F%bbZ!iTq4JLRj&63lI98P&Sbyen*(x%keBJT43 zAVj$7CT3H)3$?{N`Vn}Lm^gh-httKLMm*fMtw^0|-B#q;>1+k%p^n5E@SrIZLVCX! z)N7=VF+!6;@i{S*I6v0g*AIbgFeLfB|9h)Esi^4yD~8HI6FnVW{he`8^s!Ti>KrN1?vWI9KZBun>UrL!UBN{ZRz<{vn?pzsj_3$!N zB^lr#LT5%I#qHGESBs!!N8B^>TDOZADTfzTH-Bp!n`eLbNDR(KQ2?Y zc^g*C4y;ze*`T~#AvxlWpJZ=n$_!pj@g3M;vAOJ6vDpho>U4)A5y@r1yq#=RY(PwD z>FIE!ppRL4#7%lam_@?vx|rL;2%Ki5>lj*#n*cuHAy~)MpF&E7KaKL5(8V>5F0}P; zO3L3&BJ6;)j88XWJUQp6pd~a63f6_EtP`}Y&*|MRr8Q1Jn!tvsyD(WKmQcc(@$ zdrZR!w_x?)uk5K$HW9*1x95SaE1Gx>@rfRj*d)ElwFhnH{Zkcr#+tjfI0$=NyAiSz z-BQbb12^sOronb#bSVUK-b}o&<808Ac`3oS8<_b-PljnT3@fvwY)p$CaADxA80REB zqfUQcDzv41SuYFb^>%{6F zUmP#_&nj=ixJPBgwzb$iLTS%n}H(%S%efY z?q<;1;xV^ltGfTjxH6E|6^Ora*?|yP5vUWL9OTkOh)W~OoxZmIUR-ctcTQ8quN>T# z_2VXNs5JPg8fdx(DX5$W(iC=Z@kmdVcuEXUJMZQF$&Af1W#mj67A+#0>}GBviJ9Q0 zi1;#*{J9y9yT*|aij-DLy*u&2`tvlYP#`5HsfC+DGv<>QNG8f1VXJh7S1auH35M9g z_cjtrg^)TO2zGYdmonQPBSkj0-x^YL88rTNIwvEsX- zl!#DQRw6(bRYY4YjzMeUI}iogN3a{qhq9gAUVylXFB`QewSkBzUDWrJ8iOg)k1o{l zg0D^GZj3gok4^o!*@2dsey^@@S!;J&q9eW%F-l+S3L~HS)MaVQHk_{2dDqoJzP|^z z!+0tHQ#bb}_|^_+rWTqcC%&f43ewZYA&^7wpt|At2DZSoPoWRbb0tlO?y^6~2I7iQ zbrFt+6prTcHA>I6I93a))t!hMfm}zx6Q~ovu%N!a!CI5u6b9s^9u+ARLv5FfMVSdz zVj5WETMz+ya5310W}LMRrRi-`F?6UsR3Rdj?4aUT#Lw@>uUl=hdXMMa$%l-X6V(QV$WfBPDu`7T^Wxz zaWCcFMI+UZAK)Wr|HShe~6No;$mqkx!1-%S&*8m}zwle*MP-Ct`L z^)CC;^zIRO+tb7qo5c=DPSZ`G4Ier%!c>B-rXBaGZSlT7%-XQgXI8~B*jU|>Z_-8M zBUHhmybE{g>_P-k{bNIsGA}r<%*qbAYVmT`j94bk;vChagt?N>7)zc#=jitKzO9KQ zw*A!QWm443#8q&}r102u6v-s(L)-{89U0;!?4W#D9ZCfwp9f_6afRQf<}hUviCkV>NK<*bhEqHB`wMA4UhW>BHU_Vc!3^-q zBi1cAWmZo6K*ET zS}uZoJS(C#-lww`53!NFZsSK7J*ZHrN}8afh}*mcK}&5`nQ@L&Usc88)nh*uvg8RM z&d+fyz&IR2*L5g*8BR1@Q)hNWoid@`CVU${=)Dm28d!1|qi8ye+Bvi{*sML(TS^7C>Tqi7qS&_haB_Rx z(>B$fr4D_>E>ks(=;itPsZrB>cV}-OUyt=}6`KybVI(-YNJ86&d)Z}c*_o?)g67@Tt9c?In@g}O>5~%_PaPz_QpDJ&CS=pT@cqJ!!;ybl=k5i)L(k>_s~;DDN1@dMG=kC^%av zCS0<}V?W)5vl7Ls2r>~vXxzh4zRg2;&|_MO%y$`NSWsgSjU^7HZ6Cseg{&m@%HZ&x zt3k!Rc)$5fyvy8&cW~o)b30Cy(}?%IUA))bLq>L=lt7)b67OU$!CTmC@OJb(ylK4x zr8fMo27M*|wV>3l@%g|gv=VLOv>CrR;zQmRl=_H9FT{K0F5ab%XHv^nrZhQ8S|ss4 zwF4b!w35TJy6_vr+vm_Hl$O{AzJ4u{LapehM|!|>32=ANR^}g@ssBl$Z5!SrUjZF5 z>zZgt-8i;JZ^lR(A>A8`F_vpLr^Yj=&ff@44Zv+=tx?H!X_?$A zJs!Lt4+-G1j)x_b9z!fKHa&;!cq@7`{vV;Kxr{A@71?TGeCy7^XA(V4!YqVQ-hsL# z%1OM39TuB~p)1dpXZtWXaN8#1>xM0{d!XEdznmV{JsHi*K?%#O@QAu;6Z+c;%1}ux zg?*|Mbu87BK&#dQi%C1yvrptHUkRgcPygZaTyS=$Xe?hdq#V?1oVO&BxJ15O7r zx-Fn7&+EYYY9eY*_a25PFz3k9c}}=3uMu8_y}B2&@Li0$mLYwoWrfk|c>F34py_F^ z@Vp_DH_aKww+(g?+YNtA<>I_G;->hYWq44lhk!g%7@0GS+YBY^{@W1=Vz4L-#E3xgA19-tgNk38m`p-RO zw&X?bg)X&ZhtFUbbC3={YN_%Ja^U5qtLAMBv}9fTF(*pHk%QoW){iB!|8U4q%XTC! zGj&q^rAIO}V9rKJUyCmasjaFF^R*UR6K_d#WM)(^?5Y2rQw1Upo0%RShOU`@o#}V@ zAHDoP{X3H091dcz63-bPs6r!N3mhzC`1Jx4Yr=D)?8D)D2mI2j^+MtC7+2zP%VvBWwHyw<5=C?yDMOSuABGx6at~soCB3vsQdRz4WepZKi4fp9;g+qEL zFclj!BV5xFBOL3)@$&!rkM;33es7g=%x1q**6|Xh<3!UgSSW_MWxa=wg|*?D|LZ^A zA~`8hF%J*SWk$JYo>$)1IR!~ah9;DGZ&2w0&mAX^={9tEc>N{4=oPt6P`uX$JrlWj@T> z4}Ez$ys*b6;swt+X#v_IfBX1gXn~LvK^53H% z{{(zHlZuvOTWm)vv>Ko5@jX~7R(azf+PJOImY3AA_;%(|Il;4Iq1PZ zk1Op3Jl8SM*`s)lyycN$+r}fE54^3I0}wADmOu_Wyf?c_W_n8;-hVnD=ggbWYjv2L zu$)$T87awLJN6(Ki&AZ5JHbhHBPFb1aK-U0?S4R&utBqFLxY4Tb#M~H{N4$S>IZwf zccK_k{t5FXgz*{2le`j=)WKn>H>;C|H{K>5NzEE?bLeCHsoLEG z8RO6{V>xpvv{IWok7ckfnKCkiU0Or6ov^j>f0u&J{Fh{^p*e3otP%IviKxTtf$iqP z(>-m{iArX2LB}mXtIXupJOTLs+Pf0CsOoQj@12za z2j;Sb$}*xPq`)1J1OyRr0To4oGy@f3RFp*lF*I`qb1QR6&81AVa!Yf|Ej3fi(tj>3 zR%Y&NnW=4Rg}(2(cP=x7Q1;%x*L$D$M!CyxIluEezjMy-oOAE}{fPeLh>buVQTI== z4Q&XI`&vz^Tky0bO zRR4=qvzlAln73uUgW#ydNPVP&WhEarVo1cvE6z-A~=h>I+% z_J}v+!a5y`uxS|6A2Eei5NOGmAfJ{3XhiGwFg@~ZCI#EbF^6%HVKKRxz=WVmwy(3P zL>3m=eKI#l9y(FqZtTdTFME^JTbdYaCxgba2!x>)QA$#U`3zf@TzgknXfx0%1=ZvU z+0Jcb@lpFk?PBzw`X%{cG`>VpGLQ;Hx)m4=`3kLSu2n!UpF{VcMfozHE3Ru1;$R;xp$Izx@v{oK0nVIcI zwX6;8Eunr{L-qft9$ByCXc5G6h!9~Y&nJ%av^~-+iBJL98R7V+U{BPmPgO`tM{0?zh*U7Dy%+ZW zG8wWE$U@d|ZwLoFf0T+!S*Dvj!w^R?z3nqEDO<_!krdA#K__dM)Hz||D5@Ce$NxIS z2jrl{zUY;sl9794=LCBn>cK4V{_^s;lGVmqW)p$s$b}TKAnksCHMtoQE2`n>T~os( z*OV?r4vK*EP(UFzmUQ2kIvt@-(LB=^wd@@P12?m?8bv_}lSnLh^e9S~BjSb!4X!;Q zAYH*+c-ZACGYB3*x!Mf{rcqZBsuV$G9=AJClB?wyUkwM&G$%!XWyw4xu^0~Mq$$gg zYKIzuJaQi7hh&(GhW=fUBg9!kHg_5Kcwj?xqSo8P!HfrHPALkwop>ZDiz($2wq}%L zEK~kIH1k0&M;lo7V(+PFOp=CRTBl8hnUr_YlxkROhhcZ&ZK#S7#V?*|9o>K5u{$oB6Dt(95qJ=Tb`z58IvTe z5@aP?67ERegJEH>Uj_-u6T3j6jUhHGfGoZHryd)Tvl@2ECBn%QF}Zbi^V|q$Ptpa{ zM~ZVv_AU)8RHJ3-Kh1d!J=Buh))6)@1r- zAfKLJlM7%EXv-#Y!C7MX2PVZKzcm=z0I_KsPW~G?V5D z$IyYZQO00TGiL=-C*NBhh%AR;V4BsfB}-@*QRbmK8b4w4F6kMlWJbw>jQewB?@e;~ zBmdOpmox;KBa-r>*E3{~j=ZlZ+4~yx?`+GFMeJccBaBps7RA|F3OF&19Mv%6@FE2T zbHjl#vGxdP4d=+WWAMzWRG=d~NpCsjCpeFtJ+vkXg>2_I>c9{zf+ye)3p6Ix=ZMIm zv%03CJ$4|4HOb#)U1c8}mO-K;t_=%LgME#Cu=@2-A?(3wN@hI#uS`g}9GsxJnI64E14$6#CC_pX=%@}uhpH=Ji;xpy=_Qjmy7nSxLwaYe3; zJQdhSQ66i%0&0dH|5saL#5dd;ej$NX^@9t=C1M6==hR3x0<9sR?36)L10qG;Fm+Q9l zn%vBzUBuzkGmOH>uu3D#YE?KGyy;S}#(}q7Ll&p@<}FKEz0!!)gmLeu^5$b%y^E0% z(>)oLk>M?Olp0R2S2C<#k9CaodcC_w$$NS8omoBSZAfLc?j9^lw*jaYi=#rv>H!J) zXjSXUxS&DG@nismLl#vcgwO!P0ir^~(w`P6Xmv)8s(Lb76yaDpvYaQQ(J1wLf4vqM zXK{Ltviy8`50;Y~rSt%XLl5;@^v7S}V&wew{tAQDUrmj85FmoeDA1z88m!WAd>XpN z@M$U>tf9#FR}ppmRsJfm9hLqe4-V*{Q(_0GEovozRq8mEUJH_l1QW^Pr_z9|&rsWX z0}zwy*=mS*>BSOLiKteSn@BVw7jLNn)_#8Iz1~%$;veV3_#8c-OBCXB2%bvAu)H$#hUK42B6UBoS7Aeo6*IE;iYjh=zd#SkMo!i_`=* zRb&W*HBGBg@T2%5eiTT6i&0ppnxiw3s7S0ZN(7uGGLSV3@Bz+6qtf#^pd_aehsIy8 z(s39m@y=hb5Askbz)i1n0c?O1NrV4*WAK`RWRmeYcJkp|upvs{Q}#Zkh#y?Wj{oNlldV$3F3l!Lk_yU~$qz^euDwbO}W)fs9n^LOSu*#l$EHbV$+x zH5++=7@tc_s8wkcdacBpu_EvIwbJmsWdRU*A7%7<8lLS2%K<)~kJs|PxDo#!;`n|T z4_h%p)3O~@K|x4NBjVa&^skY|MXaa=3usB+w0degUZ+t(51?f}o)`)$0oZ8uI*7kz z8WB||DkL3Jb$U1SuLIvfOx6($9nt9+x_(?k6;6U3F(B3rN*r@QQ1BinGRJmeA{2v+ zxo)(L$t|pQv#;g?8)M?8h3nIWtYW zK5^g#!!cc4i*%R{auBhhV2aLO$g(^MmKWI%&aY09Sx*)cJ=!D7g)Cm#f)7Usi(Y1R zbZIGiLa!^5Z7f^GRL35AmfohY+cwgpH|ZIH6ke8`bAmzd(vWK?y;nunp*|W16a3Cd zoCT(Zqsw+b_R@=AN-|cIEFCyHfTj#2N@HcoNkm z41DaD8OWADOYyaHfO81It3ET*$I-X7KR{?=|AeLPXDSX^0~zNpSo+m9lK)-L7KZ#? zfSn&LSSJ5{?c`&K9`xCOW$r(VNBsfBn7T+ks0$?2?|(Gx0R_}wL3U^!{^M-fpJ5q= zns2R88(MH`PK`MOQz4x&wJ6oR#Y%^HoLY-C@+VMOaG{w6CL~`(ncI=nLCV#MIpQ>q zM6*(j=>!-3@Ry0d6e@1fpf>py(pe?8GTr8I$esr#XDU0(R#uP7UX-wh4lm;_oi1kM zBAzbRP`lDhiKJop^QGjY5>(7m@J3j^HOFUqF)H$@&__OjPvSGhOIYA6@5LwB&Ph7) zUL=8d*;>4W%>V#6>iJCAY#g7UC(}(nC5d->J{^fHZzdCihsBFy5$stds`9>Y!SIbA z*)**&ivlBD8d}h$p@oLLLExpuorD!7&;&0g;KBv4e8nt+>WlWse4V5vBr;*uU^g2v zS2DvfuWF?$vGbP2T2AbrWibFLI1jC81~X_2pkdO&n#b^pjnRd>Q48CMj77=$gqsI1 z#RHbEIHzNvhy+L|!X$$}Fw_V14pthbe1AW*0Sm{n86BepTu~8tEjaRClm@?Qmm6j$ zSe>m2|2@DH24-uH@FYu~nkiylikO!|d9~w!!j?VyMuOyW1LXh)kphqj z#o(3E6@ZcR4bu)#$d1J&C~E{|bIC0egAKR^X~;c-%|uNSW-y?XA>ck7Fj^rDrwNg` zPCSDVkfx_=VgaR=3Spd)sHJKhY&kk?)F)F@g+i9&lxwC#KRRU6AqBPkv@G@|q+bBb zu-ID1ht}i50vWZ-lVOEPEQrCP92qFsyM|?a>shfU6D!RjLjDlT@b~93*wKekiRlcs z5o9uwjQR39$(6<;aX*7nBi55JhWG58X&i&~sf=aPQfp#r&(Zj_*NBgoX|dumBNiq$ zVsQu~KKG}^&atYXxeS3#Htr z(M?xqR@Y7*h$l)t5fkqvmfWShewRLwpMhW|{p53^cn7}*XQ>ri0#2R8 zw8!AVl>(0R#3L2n3HfpKYa!OkL@xPxW#W?;ip|s08|k-Rc?E(5og&7OrKj5WLwZjv zBfu?_{8$3=1)b|Aba(_Fa2W9XA$tR_6 zpzUs5?}IL?c6QK2ndQm(LiC3~?j1+sl?tqfYJ0bfCNcT>GsN>|@2}6!d`| zy>L_R&>NCJxjzgXeWDdPqxQ0ODOQ(W@%T851$WUaJdR)f|8YGECxAAH6MX9+K-YKd zj!%5DsL)s;t>l^zWC|C8jM#fXT=qF32pbrM#RM74umo3rZedBWIU%UhTo#nrzLBnx zESP=Q54$Y^-5UPj4KjriH&*cNmtDei%#>k5s9bW8}! zEt59GC=D`>E|AtzO9&c*wad-6PKiJw>cK`vJ;Dk1_=s8}pg??tJVJOk@c)1RhbV9Z zwk*0kEcX9UpZ~wBwG;@UJwiE-5vsiX)Gm)qPMLhG5v$>c1;ky}`9>;ccjn2d#{OaX!)W#~M;Gl!XtSs9)C zWcJC*$TZs4&^I*`0x93s({~v56^V<87&B%}_-L%PC#uMBOiLzzp(zznczR`J_6#Es z;(C8!(o%^+z(b8p(Wb~KlOX>3<2F`kE5w>&+6YmP_7|+r$fyGEt{qKHg~kL<>&e?z za<8;roq8FQlZ@i}gywwHBSMIT zSu>u|bX$#nVSc73+?{XLVc^i=B19NjUvQ zTkU~>n2mihIu-@p-0+@SIpUR?s`B*Y@%yWH1ophcje2;)_2e%nPEYy$vitn8i>|(W zYWb`Bc7C0FN6&cj^@j@Xrux2iZbx>{yE7ii9GiaQ*e@T=zPzyVi&K?zzj!g~u72V> zLA&#OTEBWSr0KeZH@={}i!>Sg3a(>UL8_&({+v7X! zte|FxgIXv*Z-oVg3;T(40dPu%&$OPTS;4c`y{yzAKa->`fmEIM`bwZyD6olBc% zM~8k=uy($C`tI8YT{v(r`>ORP!Fp3<3IFCwU%|)X_0_ffa<7-Y;@>#AaMi9SLeid# zKk%jC53>8~l|D+Z86(1?M*I}DV$LSdMX#UH-QuH%PZh_|-<@T#+qi;Lzbm*=aZkGE z;1>AMT`=9b2|BeFGNryd?BvEaa3y(VBc0(nG6qBqjKMN*N44nCVfs@i`YqWsXu-yx-!b*6w)-U3R_FWYF=$R1hqVuu6 zUYh1IVch$<6CR%y8LS)rW|Q_embF~DW#6_bw|tZ-NeS6sezzpeXi^?GFTHlCK$GE< zaPm=3H}z_Vi)z7jn@{(zukXxqxwpSPA6~KP>%$$d->K+(cB@X+VL`t|Iiq~$jGAt? zep~Y6v|GQGt$pkA?&C8`R=f5J{&CycV<$&17-qe_`rVH$d*6F6cG{j_4!lzMMfsiM z^KbXsyGVCvz|7l?zd7^zlJ{=B(CkuJW$=NZJNs_LJ=1q>oX<~rb3OcXj_wz#RBNE1 z=1R)Rqpf=k^Wv6W$4{(|DH=X1>oG@?xk5XQ|J#JTxzG%Z0rk_wCggn()}o!`M9C%z zPfik*5Oj`US3;435EBKp6dfBK3nlcU1Ad)4oAe@2Dh+Nbp^Zt1Ho2oeq?Fv$8M#lE z6j#Ca&u;!{->`)77PFMK=k<7w*#eCnRv zuHB;3lRGZdB>hm9sqT6u;$T75?+Q1~XK$K^9-U#h`g6OABW1}SOes0J(V8$lzk2FB z+M1N$ptp@@JYEh8N?X~l_rVy$2Z>7$C69W(ZDr1t^*57$+LWwId}qY`6HBg*9p-bDoU~r(>_PXQP5brgo#n%~9l3L<`>xc(yo1(D zFppDR`nJZ<_WI^#-xij&zcVN9g0t4sSn6m!PjHBTu#?JD2nMywpvfuh z5RwT_pfX;F6Jn|#t!^_p(m|U_W%F{WQiLQ{kSY=?nk^wy$w{I*EtlH^dc%YvLVNjM z;2hwU+uHs!c;!Ni+WPEd+29b>u_Ho)kx(}%A#hgjTD z_(+egOInTZbm7MO*O!bL@VWo8k7D2GKPmp1iDN6)o^!c#xI8NHRj=sSth7&0oAY#G z?>;g$Wbq+m$7`#5=sPj{pL`Wa`#uxBYPH z*^P;t&h23~t{L;yeqq;wt>%JzC)%WBy*R3iZp-`#bLiOL!cH7%x%s|DNuNGk+<$ynkNCoh=?am;Jo7{H-B}*YMWPS8AfZ zb?f34Hq;nwZu{ib7k}JndK3Ek42;PSZTdR=sVN`n=XC3HcW#Z})lns@J>cP40V+i}M#XX(6rd$+!HcMpHVFEKY)H+|XHzw8rM9}4juowBF0zxL3M z=~>fneO56mE~-m<*@En!CUqO(ZaF#N^IbKoBHj)D`OcGHJU`H5Z>OyIS@EVW{~GzG zW|i*zx;<>ktR~IR4U9RlUz^i))5N43;Y?ev?fmM>7y2BU;y&)n!J)4`E$nK#d3xzv zDLM-?e{SYzB?Wn`I&Gax5b>phr>AsMHB4r&i*Uyfq{RDmx3wLQ-{Nb;9I! zf3E)=d9;>AMMXGDR$NeoW+4x%*=Dyw5k}MkZb%VgL0;@iS5_`+)d$sr4(=ZWR#An{ zbBSE+zVB}zY&Y$cTT$AEn>}CXwQg@rYvo7p=NaB`$y@ivvM;#Ak4hTvOZdErcJ964 zFIP=n(aNLAnU^+bf|~U9i~H>CH!iy`wJ2W~FwVzR-28fG@321HxzSoxkDFV2pY6@; zpYluL_a2=p`VPN&y5ERqt5ZLFs%_6*_qL4A?BM%o-=T&>y|@c^fBfqA(GQ*YZtE?x zOY_vg`pUqOm1~PS8kZe$ zD^yJHai~l)_j3Okamu%sEqyBRUwLufD?amXx}s0l$W=e>&hPs1>cEVikwV$tlC4ix zEzZ8zWygph|EaFGo33uN{P*cUpPXQxKHb#Ubo9~hx-LEPujf`?_w()dzIx2T?l1LT z*F)QF?96ko_Bl6W#zzld*!bnen7u2n?YF)hJz`bA+-|!0Z*}juC2R3J3onl>di-|L zBW@EK4;tvUXlkLbrjN@kpQiU(Ek1G7cyQXcAx}rnXncBHN>soX=G$)`xINKpPR02A zqcaY_6FvT3sVQyAE4u;;BUa9IQ>Xtnz2&Bg13z8*Vqcqc)2B3>oO^e7R{7axV-&h! zg*z@BSas>h%eNL5H?oUoa`{MMJ#HvqvZF3<>f4ZTP{==U>P^wAZ{q z{mS8#CqCQUc21Y1r!*&z{F;3I?V-8%#;2ayA&k$qoWJA~+kJ(pN(o0+SQob z-d=b7%{Iq3JU@H;jMvudDnESKae{+$udKr3@G9ftRJyB`qzJryqXmfdU4goP~*kUXFcwk&PBifquCt#X@|!9EQNb-_{?7%nZ2U3 z+vkt32n<}c>-wV7OL4BJZ|4*bI`YnAA4NTNe!&k-Bfhk*x|s9orj$J^QYu0g&sBXK zaI@=gZ2N%sySTaym|~c)&9GsDa=_@tjW6X!q*v6O81H#%Q3iK%qFbZft_7Z*Es?G% z{392hJ74_zfb?0d2mErt)AR7d#>o#I8PxCVCw7K?@bvsHhx;A1Y;ZIB$ITnzx-&ju zWJI@1?@oW@hwzMlC2rZ3yE^}?58292BL*JZQTh4ovmxsu?|C0T*XG5fyp~I=xMZP< zOSDr@ZK~n~B()YfXx0DJn9}{RFbB@cK|n~3)`5>)Yi~3x*r+x~WpYO(Dn^Kmj1pp^ zBco0I?_;AA51TKKJn?(zRmNq~JM-TTN!c`ITs>?w;GLF(Ki4fkyXM;9nZYY&E^qJs zbjT06#*eRckG#Aww9^Of@vA>&7w)cFuIzVn<@)xkvv)tAW-R~pxwOH_f8~T#&iLa+E-I0@GIM8`>$L&W`LeH!FuDZ5y{E)fa+0>&mx2`H# z{_5UUy(b^MdRx~b_wsuyR}XV7SQ%{9K|L)FvP5Bo4d8x*Dr z_IJ7U*7rLmo^I8&?ZsCXmEXBBrQ4WmH@d%(Ja5ssxoe7=Zis93Va?3y-WAQyTBLz`TXZY&U4PW z=bn4+x%ZyCJu@s=eU&hU5FY$}_L&gh!;?N!8UAO`kL0|{@8^k!vwl|nJ!AgQs+Vo- zOjh+c_68@uxvD+h-EH?)txHrnece@^-BmLdwN`DmI}%N~xq)F?_2QXA%r{K&;LY|L zx3ptosK_=(3h^E|0mWUIX9!URyb4dUj&P~$1|}>5^jV8^@P8{M>b3SlA%grb{nVtA z7N6uAViDocTbfb=`V%1{#duCNL=GNLB9JGc!_79;U5=JA|Hd=KKcs&8LG1qd?<9Z^c z;5S&F2u!xJrO!q-OZr&co&r2dx@w^dRSB8)y4lL@i%TRpraihT~@$Ehv9jUf4T(|p+K#p6LhOm<5WOhHL zL|{NeZdPojFUuYbZe5mBLlqbT+^z&jn^owwNU;_2vUM(zu2e&=;`zN~mgU>sHn3+>1_a#gbO7jqYoO zSCJ0O3fpk3W%-g-REK)tKD!#IGR~e2Mr?s5W`c+eMPlp>&6x*Ip;cf-;D$hBt>RW4 zhMSTY*8zJz(i`$DU&IFl54ME;!kQb0oT#}mM{&Y7`XO@I!|`y?7(EU;VNV3c1|oH2 zg3lVHY7nKiHpLIn=BR#1Mo@`BG6E2w+yQ4lWrS3~ZUCrl3^@;gBO@_T$wq)3PL|<{ zG=bi|c3@LfQ&Wtfy#16CL6>US9Umw&lw?M+45d&@G*BxvWS8VLRQde3qw3|kR)HBA z3n4tl;bD&l@P}9C_XjOJ0js!a1geIHwWMiuSJn0!1Y5+OI1Kx&ID*o2PoaXt1^pW!YziH*>u`6)0uG77qS`c z1I-wgHiJ^w40Ni~eNK`}KLh>?+miru{8x0Ajw$trZ^Q_g3S`NR{e2>T!iZp{0 zup;RE0clSMBzFgPcMPm%EmdZDE zhwxY+-RMoBWF0IFSmv$-%#*P?Nl`Xn9k=S;2BJXR5X+U;P7<+OkQ^;y9jH4Q8%ko% zU>)mO$4E&dKR}VY0g4cN)U2cw6+jWmQJ@dl3zW8LveDuxJ}PZ=mq1jMW9)wy`cYfN zXLvo(Smr!}nuae&Y%^+040`e?u(v;4}%mc105 zNGrf$=rkhBfR)&15fgrBpc%d)+t*m(gv|kke9TjQgVljSV|XO$CsDu1N@$glRe<(tfXh%BBk~1c z+>YpFRDblA$QnGY=r^Q|k^;_MFu^$lz>@+36&4%;v^kcZmfZ$C`m~I!#j_Xv+Nf2c za9W@?Y-8*PYNZmz01VU)ve7|RoP=v=Ef|tXv^Y9>fe~2_m9db|ve9&~X9HkN`l6AI zK(aL(ZjW?wLQ&M8JO@~9WD}s>MQGUGj0eV$6sSLcOkFRN>vhzuJ1Ss(H;M6hAfaGT zm{qWz`U5RD(fA>=F~|8MsvSWktZ>w{qj>IyDQX=C zl1vZFP|9xDoSEE|PNo!EY&P(6tw7igay4c|WG6{T#^xBWYjBE}Jn4N8`&;yY^ z0A~+`c5eY@Zw1J8E(Gm%V@r4A`@nO%Q`T*@VXxv_St|AvdX5&QJF_o_We!J|d&%NpZ92FpL2CugQ56n)@+^J<%s*WE%{Sr4jT8OD55)tOy#zlC)lEpjD8I z4hI??B6ns{zM<0G#RwQssu+xb0lz8+BVfQwiopmN(5)DZfPqDaVlV;*s-hT-fDv>V zjDQhx8H`NS6)__XWanzxXJV;T+vuxP3-)A;*jr@jj*NLGH$*@$I9f1;+6b z)T~^`nN(1B$NvyfF_DU(v0fm?&rxkO%PGjC6(yAs`4UtCp_o4da_|CTem|IjhVi=# zP<6}R11j5RpN~hZ+-F~ar&9_I_FiE2g#<1FK>XxTjz*e#RsIVHP84X`Pm%EX3ALMT1Ikf@i=@=!&;7U8ulr;4%y^rz#0j#UFZ@|Oe4-lQ^ zyo7?;@P0C!%BHp*fhTHRdJR- zG69zOYzz{t_>TtCvDs3q8`V!}>^DqSeV5J|FwgVHgSz>poEu)bEF6_{OGe6)s0Vc% zCFhoYu`%DQTm$3__5o0uLIMR_Ipa_N>@cYUwc} zsCkvr5tYyoUdfGzl#pt8WYO(26OG%PCdYFT+;PT)OLE}J1+dJ%4ZvsL4p`Sv$VGU< zxeZyVd~SDAWu7_vv(G;B$HM3-=wIxtOhr7EmC?wdsf-cKDHyVf!3Y>wt|~TgfX1+ACPHKpZdj zVv4aM2rrf_iJ+(QK2XgUXcLi|5jlfLsqjXokUS1`rt;Gp!Sn)}w=H=3B6FGcv)*X8 zwC{k!`NV`a=hFVVOJXkZ3M>M7z3Ti45h1b!S+NvEEpW0@!XYwhg)d*rp|UcjC)?d! zs4gFmZ31%K8bxcWZy--?Kc&z?Km+YhD4O~| zmE6c3xMb8I5AevHNV3A}nfx}0CE=*2XbA=Zje+gZSqh!br?A^pb&NqsR{_z}3S&aQ z3#?eH6AFqRpM5t7pM4LYT8-ZejF-c_u+5P^>_)M6z#)r2ix;?lwZQdzXj%=(ox@N& zgs}TTplWQ#cwILcd4RM%2(XL9blXLil1HU80tQ&LKe41UA%#cJ-dzJ()+_CYkk_;y zCgn{@%yU*hB}U73*V1E%?C0lb+F4kGj(bXu8_{W)k{&^Z%A9Z{0d_PhQ)ntJuQZkB zq6>At$aj!gCy$qz)D$f-WRS{SCtYlAX5PqpDs{BVs)$)^pl5`E{kY)K01=)QUN~AD^7V})!K_dg7D9UY6SA;lkNg;tKD7WhVJsiD z(q0f}pJMn?bl{1Ez^(#0}gf{g@CiG$tXbvp4#3y0k5kfaaC24g5tJVUz90Vk@?M=lT}AEN1u*6v=h7Eg#{ zZHiH3#a5_OGW$#rs&Quy=nv0AS%!$T(QT{<8p?|N6iG+J0VfHYT)$vv_64LJ6iUsrfP6MeGW?O=gDFOu#9v4Ksa05GsxopNUdPyIKM+qf8=M7 zEy?z=2?!KauRoxP(R!ieSnB7N+|^C3?b&71!`#(F5AUvX>2cf|M}GP_lw?~wDMg)< z`<+Dvq9>rWON1GcslIG|^~gq1`V4U*!xJqS4uAGLMFwn)A>uf!JE-S_pDSiW~+5 ztIVD3hjcB;*_6$)k3hhA6Y}mB8e0h*$yoL;DW|W%7x@*C%X-mxs%WftbkWnHBUa%o zDMDfBP`VThdHB>i{TzfGZM;7#(hpXHH@OE740*rZ2P9Uc6=CMWY~Ut(Ss3HpkI}x1 zG6X__lH)SuX>0TYoAe1fP*EWojVfiMhE{B~vlUjj&Ubf1s`j}`5O$#zt-|b3uB!Ay znK^Plx4zD2nR0rcr8MWbnloB9lx?G5TA>_O$nfF}vvNMakWCqKDkz`I|J0=#ik#as zgtJsfQ+c>CU&~1Sd{uF%vUbu)uwOs}zjhCtT9_9u%(qVJl=nfjaf^00#=8~k%peMb z&bX3v_t7bc7#8)Tpv@Q$hEP!X$t{5j=Md#GxI^@Jdjrz~=_F}S=Co#pq%?_Z>r6%2o>;ao$5&+k6NwFBlPOD4Sr)C_ zDZwx8d8~q55ZMe6on^+Pj7nwQZ-}!y-{AYdSdrp-K>r%fNfx5WsKlD)B~bk|uhS`1 zJw0jZ&IlNorxb$`FowGfM!-NQRT7MV(cm%|0VC!z7y+ZvWiSH&(%SJsv;tUx9Z=C7AzBYNuuOQEpm^FA!@VI+VYChD-1cvkRTRN2 zj$>m`Sf6V=x;;iyV$tWdHDh^#16rdaDyl1&9lQc?CL zC=clwg}YTF7H*1F)tK<9sv-DN)vS=uty(&_s+!vWO0fy;See;=sFRGO+iT1s8A&(I zm}VJCx5Ah)k`8cP2jRFp?Lbxe0vSmc%&aKyIi$EA<6hY-Q znk5a{s!01)v`;E=YdVq8fr(^*&PnLNL^4<>5~>n0B+$1lfh%lLMKL6GPTEN4qzyOQ zuc7n+Hdd+qSCispLnw4*puqq zb~}!Wu~No9UY*}gEzLZ?Rflfe^{WevQ;I~6L0jZ?faF(Tajhgh7T%%2Bj79?ppMRj zty&))`_f@9ty!Okeb_A^mIePqEZd6=79A_=5QD**X1Q_WA|xX?MShQh8w)Htdrr|Y z8OCrPz&SypQBpw2lsHjGBZnSW;tiCNTYwwtOh)7n;6|U=Jqqnm+gMk(8{(DNMHCA{}$}2ApQjK;#w)#hD27GIuktS6#6~(pQwPc z$e-ykL|vCf>r9U~@)ylnqo04J=TKAf)&htpQbN@r&=P?$0M-;hPMBOl{g zM?S+kn|=4GO7KLE6T(jXjIh;}$CDG#Rchrf#8ywOxeHO$0|Biux)jYypQfo1EXe}> zWFGa8arC7A!ASZ_>M1e^@zpEPTd7}!A_npWobRJ9>gHZ;kIM$(G>UKXnI7WaGRy}b zt4`-eewI4l=jR~jReqK^mzGg_x${jtRsP#*E1c|d;tqC3&=VU@i86f=6ENZdpbIau zX)RR+A7=^V+^vSGmfsn76wX#8XWUbm8TS-n+Y5#2F5`3WET}B3qXbrLSbv1!X}Xzy z8otSv&V^8J`MeQ}tosRgc(o1(=|AQ6a0)8uV(bO5dD+b#qGKcG947C=`=`0yX9SGX zT?Qks;35!>YT}AE26agvO4?!CC;?|B&VdvQHoXX*^h91F#nivOViN2&V7DsLhYWy|ysSCNrO6R@|wYq6Ax-4(xw`8L${38$w_nQ17qlK*hJ22}PNhY1uX&;g{ zSZj7}2hZI$({2avF~n1ig&)imYc;Y?I0eWYK+*&j}i35gnIeeL*j%rh85d z3sgl>*KjTzSlKr4PQMA-v{2gX&Pyjtx?TSl$d&Dks?sMh&bh$csG-k)+(N0NY5&5U-zePimdyUUxfIAXn#UP zW+MqF(G(X)<-u zP)qv?V0gQLmO9pMEL}6Lnv=GQQYa4a{X5MuO9$%uWlEQ2ITMFMaRCe)ywY;!y2KC= z87Zr5oH?W~nyS=BCwwFKC6Aa3{Wu^9l?3?WG`peEs?1&)Fr78fXW2!_n`2sjOR35A zW${a#jXof^!H=f1HYHaZC?4}8yz0mE@ImM`px4=kbTx|y9HVBy=%OL3-tI%6qaaM~ z!ZFL0c*w{bfL@c|dAAx{oYRmuayF-YzF3a)byut*>cobni_=GfIF~yGR~6>-gy}j< z7wxk-no&Hz7j?m0A4)G65tqn3brfvc#qbiQ-K$VuWG(nn=PjVB*4fS_wP`c-Eb9CY zJQ`^@CjZPu5s|58@NC)vcpc|q@KkYG786cooi68SS)H@hC6o+a4Wtam%g_#LJ-J!b zT`S7a>2a>_6{ArX>YL6lkncaVi*5|=w-M|St!N!4+6Z zUCzfy=h_ZzV=F>oD2LbHkrMcjXF#}te4E8lEX&WlLWDPB;vJil+ejrPe@vM?ru___ zT1D7?0tAJkGcc|=6fpw3DUPDw)460Q*@6K`_Yhdn(gnnq@sNm#b7@?LVV4t%paO$v zSW-SjFENtx&C~g?5vP2Y(8IIqEA;U0x>ReKPg-D9z!^hYJ|m0L<&Ppg3$&iglpgF= zxcr5woUN&xuH9(IP;!yZhu}ixquX%4#gwmlk)vOo`9V(m8vZ>RgI~+(nk;d$ROOOKppk zWVXJ`_&VgvF3&}$#G9^Z`Px#oN20Cwui!FuqftA^cNt=0xmvhkzMYNR4RvxK8vcLM zgF8G_6SseHRQh;XYR@%FEZ8k((-=Wt!SY!36-K~7JXZ`xz?kAP7y$$QSV=Gf##EQV z$b+f*4f_?E->|{3q&I?9JHNevwIH6}NH(6)GUozRiu_IE^~;998)9g)6-cAG{sw3+ z!Z^aF2i+W#v1LDw%EZo1;#&=PHO;vaxp(b{RHlq`Gq@%84kXeKu2(2yxA^8zeydirQW8vX`pRwZke_Hl%h)Zoit;kzpf<7a_FQNJ{xx5JW$VC zN>x)hr9>)7=4%6G;;x3;eoCQtNE>qejTRrlMg4k)r}^LqXcMe)LMJ)^CktmmNw)JS zoSkFxePm-1)^5w0`#W$|#Kl4!TSIF=%%k=^DdwHn$gN5#UhFENa|OJ9r~L1vb*p&k z9Wd9@Ra+axRga)|)Jk}!I~~pt10?nQq?(T2Xr!s==ytp#VA(_9-N9qpOm)|}0-Q>4 z_!OuRFR|HGpsKEeZ^jflpQY*=vXa$E*x?FXMFM5cQc^F-ah{`!^PV3Q z-N0TzLxzfi+rN(rVgIEYQ?WBg`{K{*2x;{yuYW-EhWrCMfdZ4_Lsk5Z<;|D;U=q zsRmQ+HPwi0H2A&P0N&xHbKjY0OZueGM7#~|nTS`tz=boB6bl;??72O7ZEV+cdU|$2 zfk%3G&A`K*=MW0j8Ocsg+(~JC@gF#vRmUMAK-)P)F&vmUwXyUPPwphGmn}wqH!oGr(8jb*3`>@jY)1rf&eGqhp?Vh;iL5FVw_0oRc-7H? zhXteK-2#4&!lJ94>!4UhFmIo5{=}TaB!dZzOmcm(3S~^dm{2vtE1cn|kePn@4l)It zUuPI>T{fBPPge8UYXNeQU%Ddrf>t0h3?Tccw=Rs6QQ9)-v6v%fEfrp>3&mNCL;k3; zO#8b~c64~1Q_+<6jPi(b^wHcp=OU!>8l2v1L71mcUY@9^f=OiKqt=JCBIZf-;ts3Bbx$^%^#biMn6=&oMU z9l>{70=u@50IgfqcXGVkhbcW^Resv!vBF~l;wVDZBxrk8oxe-GQ7;SWD{z$06j&~b zGgA4o^;{L0j{<2p zQ*qI<c3unfPK3{K5O}Zt&$!N{~BA0}ltBXXRMV0VMI8g1E&v z+c|tH!RR{Yy%YE*UoS+LN?vxy@VYFyxCl-PM;}z*1&}*wAHZ)Cj|w9!q$qxQJu;d+ zSc0&SnNmqTrYZSF^8Srf4csw}VOOW4$56F=k4`apRm=-rY8}*dTI*b#N^+>>!{04q zn?^Q`898PYCJ=#dI(GqHjKE&ATZj+v`~U|lHLbl)XZMCANxY5FRf))vjh?e05OBx9dDIsk?DDD2vWTiC0uS02`JT6aMdVlGy`}CBlO! z*Ehoi4^-ST+!D2H&vSqQF{^|$4~KqBJY7gKuMMHncNX7KSs?BjbS3IuQh7;Dfq1N* z@W1DfOz%*FkFsVz>H&CMep&KXQTyuXH0*RVay z;6r%6i0XT3m^}aIL8QMrk4n#vQJW6UCEF$ryQ4B7Cc*N6Sis(XrjqbP4#B&J61<)* zsfK4P(N;k)AN~)B(<RE|A~C^PZLrLgm>_jg9^k?;Q0cPQ$}zxpoO1VpuC@!5fom^Yq3{vi&2ey=s9KL z@!WbyUe2xmt9;^*v-YEx-pzi?XP>;m8a{@6iFn^!P%*-IzJhwumRhppl5Dahr-(}V zE+lERY{R5WBgzo{2=TpW^>Iw?0rmdiJ%h(#)Ty*?O@%-Q#Z5JomWA<1)b+VUg>X|u zT28MbssP_SCaRV572%WwH=^Q$*q*^($1BvQb6Qg^NtS^kE%y#n6pj0!_(LO6HDZY% zTYgbORIOOa`DTTQs>83mP`-`|qU!Np08zVxL^X-?Io}zqWt6y7+zPE*B7hm<+eyEXFb?-VGcxj>PZTWs zIZIw7TA2EXsf)!tra&OyWnuwS^O(8<^Fz8uSBWKt7hY;Z;2(!y9%<#Y8(GT@Vg*yT zn3T3(tjZ|;MzO|d?Vpsl$!zU^v6kS}a)SAT2=b^v~Z;kkao*DxHPwF`J2!{27@%^M}I$iFnNwSSLylQ~LUH~6YN%X-Xv zectl^yXv<9mc|IKEFoBxO`31_Q&~i%O|w{pT>}QvY|L=i}i& zfaH@|KY?vm!{$-qrMl<9Sr#~)H(rb%Lb*Q3dO>px(HHnl3J(W}pUF}6QZ*u*m-O$2 z|KVG}YO$mGde}dkxZZdNaFzKlz%cV)lf=J9c=9drRpe5T^5*21i2IEY;3H-k;8#3l`NXdQevgPi z{&3Amz=^1@#dWtt^H2wP-LSDNIRTP!L2WU;CJ?Z?3#NcC6D&R^dDTdw<`8D79%x`p8n0LhYh(EmEuB4jQGKHPYnHLp(Txos%n z21W^gXON&gP`WJ&)b#w!X4KaSFu^dALutsSSm zy$&|~21m#xV!D^$R<>%LXG8wtDg*(H^Wk+psP#>nnlWU1zDFEpYMHhK z$Ex?`XN!w#6!n|xoAPr+1o4Q{4p!ZfpC{I8>iuDN=Lf~zOkFGTYwyl45Ze%8N%EJ& zzMEepep9EY2eW?!tKQSp9mVs|2iDZ9v_Rc6`K983rdo=AoxN|`?QKncdsqA};)Et(oxydZeGIH)AWuyDJaASPi~B*fF=jN(=~Q7mR^pIAGzH8@cm(A2Tq)xk5w zF-^Tv@l5_?ad8vnQ|&NC+@vV+*ZTJ06cHRjY5T;v<>v;cij7Pu$!X#|MTwlMoxy41 zdz!l1+8dlHo~JE6@|{uak+a3=qlmg%lviCAoFfh}wNK0l?F-Hmca5gBi~QfIXqEHD zLz+5N5yYqIwG`@}Uv zjs(|zZ*Ju|s^Qse@Kt zXs1}lCky+;pNmRDyTmqH+@rT1jn;(r2>O0F+p5RLd!$fh$GV|O~vbL z#mkEFzZq_o*NWFQ^i=uT9p^XcLP4w)TW9xq3eZ72aFhhTPiw0 z0~a_KCZhQg;5&fYNUeduLF-ef~FxCqp-ghc)%y@ZF#u*VJpn8~ixR;?L9G zaPdf)re@_{W85g7VM$e^o5XLK+T-6<|CP{9;tfq*Tz@5~KQr}~L0WDW{+XooB2f^& zKJ+y)pQ*PD(s_&6ps5>Tt@2jUt*OPeExudD7EKM#`)cSm(XXkqbA#gR;$ls;=3XEA zhPX;o@zRmRrqa_lkEl z^$b%VFm<&!9KJJjujrpeHG0cfU37iu0r3@0onr;@&gy8J)M9Ch+9*v?8@(t#W}ofx zuWmdN`n51;Q`SBH?#5q(%3+Fn`L9DSi3*h_?jJl-{zlxdsjKTA_P#7C=1{(iF!#S2 zdWBGYp3bFF{F)*_-P-U*C{2B*;q5f#eXsPdp`)&(x4!iK(C<=IH-1p!_bF;`?#H1w zTq<{0ZiV37ae+IcGNfAc>M zy(jk0S5z^6lOTvKHAKSUc-$`k(->orB5_^0S(irRK?!9PVmQ>sQEif=KsN0dan z&5y*`g=EUa)O$22virncZ?arz>XRG#=mc(6z!ifa3rIIJo1gfQ}! zP?{>;FiM$v+E135Mg>z!3pR%QQGE$-GiZt=E#n!Md@GB3mSr5)6!k32cvVpb^(>!J zw3ITwWl+!Z8*4O0JuBO|PE*vg@Paabp7K)L=B6lWTWn!<8r2BD600eyQGxM1YuO`m zE1C)l4J_vHA!>XW;hIbj~*- z8ACKhtKUIJy{2e|TV{;V6s>T}jMFtmtIBd?s-|dFS#Gp2MeQ)7pu*U~lwh;Pe6IO)$Qt(+)#&!hp1i#&@^$;MwYv`iVGWs32Umi&$wDF>#VX;gkudE#;$?4CIw z-E)aS03P_&El&ZtD0g}^S zuG8+7t#alGY2VRlH^93mroE`s&OSxj+d3^Kzglo&zK?aS62GiQLEEymY%+H`rKpk+YXT;uyX&GNSR<{E$0RJC`c zoM-%-Ddo@k1MIEA?_OD;4r%N zK9o(rHQ$eWAeW=?S+$h=V-PnXUJ=acocxZ`4t{k+uA!^`rDb8aLC_dHK^+N^nO7Rg(5|00O;{R99yF-FOQ~WKK z*8J`e!j(^`PZ|Q#7;Lzdy*IIe@Mhp9_ZbgP*GYyrQe23>WQx^*hPaX?sqQXL9x&NI zZteaXpVyU;1_i07oht8v%CwBqxrwc!-YZ2SBUhSla1VD=@vTm1{u;~om6M%wxc?}A zCcHbBbUp%Th^H7=`ZHy4;RTr&I2zTB|2Z$Uuj{2{JRfDkLmc-qIlo|UXL5$Ig_-cXwWPBOfs8Eew}1T*WZX@J>KOY&QrFlGj!i zi#v@8ScmTC^=FQF3BT#R-}o+8nEQ>Fu(B)?7gmlJ)$&5DB!@#Dkyw6|HxKZ>{KcY0 zt{lD@7GGWTWibqzuLI|AbvJ^OEV@T5k^Yj00B00`7o2M=9|v4jVSsZy_B6gL7A>j( zyteX)SS6p#nFs!3v6n<#PO{#^FK|*>aalI}U!qg~pzafKt~^|C8cXEC+HB)xqz1v+ zH7sO|1y1Guyf$h~()erntBe+Tc67TjLpafT{6==D=yGGbSZ-ZoREXg4hhWLboST3T z%lRf?Wer)oKKcmsAF2Dku}3zCo&tY)_&K9lzKHrRk)<_9j9YQOd(606Zt}hfxWD>O z#(sH2@!yR3T<#M2Xst(X7x&Z-k}a|(HU#*awIk&oaeeI>;EW#L419Tbq3q;)s3o## zNUOY4cGNzN6Emvs5phv@yL?uh9qp74zz^LrB**4%0iIp`C1}X6zg(^om*94$Sw2&| zUmlVphusYL4=?%o(c0Ugt-0V%`MUT^&AotsANnw0PUEBUh&(U!L-~$aR*!d1B=L_( z;=dy%4|-aDgwpAR=9;OC;ZyenUqza9D>@JEOK6L17}(|5{l z+*~f>y02l_B2SOim>uG@qO;7up|=DD`R8o&BY8$~!dxP)M%*P!k=<=}a(!FC={2*U z|5CF8J#C-a#XT^~+>1NjEjjBx?jj=a}a{?43W{;>QnfJ?}SoZ4(`FZsZH zSp;#u(*hqJHxF??KO}!!UgT*uzk##(X7i$91V1c%7~ZadRfpu87$b+|4LJQ@V*D~t z=~-fMZ#V9ajROA5z9Spm*MEcG#0+@IoD_#ez)g5=zPqx#5^nb zB=Bo1pM_*8Ja!(p1xdc(iJOlM`7PkHLtY2mn}4V5G_Nf2c`q?)@Yefwlg3fpoHi`a zyT^Q{y4br)UJ%Z%KSA7B0{mfbr=a^7 z^4_!FJ#t3qu$S6BC>}6pgx>OAh7yn9O(lvvm$9}7%=5}W^j^o7T!&KX@rDKIe_hc1 z#SvK$%CjCd3&KU#>w<1A4w*N=CwI#F*dXgpjHxQ?h}jeSRK5&*@ZOg>CcoYqZf?vU z12_}#PWjvL4C`evr2ZlCj#*GK&HFdAB)ZIc)_5$u+WLrd9T60P51ET&9o8YUr)m=* z#e_pKRP`DpcCt6BayZ$G?!d;Wg(5UccR=)Y_Dr?S~Jqqv7fD}T)*&!Dd& zKHqDNlJ8kRvJ4M#j)-WF&VU~DWRzIrALTg%tuV;=Zazie zM{Dne&0o)+=6%PY8>?0F6YnVh1k{e^l**bGA0m8sq%_QD>*o5KWp?R2k%x6!+@FX2 z(M5nc;%Y!d1iai_#ITfM70b*QbF%z+UvV?w8ob%%$1J=RutS^&_`KMITpok;_zluo zVO#`Gm2oZLFynr}i18d?%s2)(()bK;tdSGQ6Q>&?z)404;8dd=aE37vaE>t(a6W$i zJ`eByB>|TiR{^dxz6rR-cpPx8@hiX%7J~Dk z@lC)_jJzCLl#u@Hm zc)%e2w=#Z^@k5M1$@npbuQNwTk~Adgsb)CUWStDxGK@3qXSj#q0fx6SJjn16!($9z zXDB?R$6#2+u$tjihRqD8GhEBConb%23m6_?cq_x(86IT#B*SA2UuXCRL*eBT8JY~M z7*;c^VK|jxGsEc&*D{PVY-hNK;jIjBXLyL=lMG*H_y$A6q7qGpH4K{>PG@)l!&@2N z&hSZwuQN1!l((8;Gs8H;Jq!;pyp`cWhKCp)WB58l;ph4?tYSEo;aZ0M3=c3o$nY3L zkwv+x7*1ulmSI1`0}Kx`6xl4v@Tr_l$TcjNV1F+4nZ1l3VEkAvN&bO3B9C)1oXT)U z9_3ogct67f3=c9q#!%#QE{0PXu4UM-I6+EX%dnr}0fq+|9%EQlKr&MmEKZ7XMQclm z)30C|;RhHVWO$5WRR!l_xRzl*!vjNze~{tSD#F(?>}Pm@;X#JS7>a6=sbV;l;abJP zYy_(q9$~zp zO!KVpZ1(K&T;X}!Gub=ayUKgB_Z!|vy-#>w^!~|f;a6QIT9;ZkSl_T7u?}0WSfhN? zd<%WceeJ$ZpY1!}cd_p_-yyuw`j+nlUygsAf3knN--}%resK~JC4m3KsSy9iO)(;O z1$IA`psMk;l%aT^uLj>Ksl#5V9`B?#AZCrAl|6pvb`17V6R~HSECk+C{|5GOAH?ng zTvT^I;C6|79z>_O9_8CNce&rf=jEP z0X$Sf_y@7WfahB;0^T>|Wk7Ew!S%%icL!es>?t7)KMD|hp5bR;dvdA7^B7loGdW8Bsm1^#GxI7L1v7Igotg5=1FG(- zcA4^-xUwM>A^R6a@(XdQBTTekIiN&~P+JZLlxP+Dc0whf6jf+l+QDW4$N#|#yarHW zCz%Vp7Eq#X^MTg`O8gQUeUo80phU|S0&f76XyanwQvjtn6Me!EQvq>`h<;&+X@F8p zhb;#7f#tww!WKi!0+e`1zY_QyKq*>ai-F(osRlj|witNJt_Ju5*n)FlK#A2sJ@8e4 z660bxpbaYw(E}*OxuOxc11LojebErTfKv2fhi-^1fKqHl-^3Xmpu{ehzPqslP>P-6 zG~igT13w>oc|%+PD6#fE1Neo261U}(fqxkg=cTBtfmQ68z%NH#>3{T`4$d`zQap)T z;`|U$VsAMc@TaJsA)W)2;xOtbu_9am_)EM6D8;YvP9IJbMJr@p1eD^}_{M@EUILU@ z4X*(Hdq64PKcRDRPZ-0rQL`VA$vbEH$H0k_C%z#Xy%@H|-yxEt@+;+rmVIN)}@R1+h|L@zZlYE1M{ zoR?#jTaR^b1b;MEqFCuRU<|}CCL8hBgz>1NB)!c`Z|zo~FAm0U&j^>wGnG7gnkK=fgK%d=tPwL)Q7Y@JUnJ+uCMyCVRT#+oyNM zlgUvd+eV5>Qzo>vjT%MRtj?~k8TQuhE<4__sHeBn?oQ5f?9I*2hQ7^-?%w2-b*|(| znm9jeB1Ib#y=}7-y$kKFoP|p{vFudQV+e!voOp60i!+0Cxhd1O_rTiuoylHGSIH-+ z8=F!$j<5ysZLEq3QpL#PxRXqzYSY}^G2QN7-?^dBiE~{kM=Hap@!G8U@!mwTcd?Ve zf6twWCljof6Hju2;-WN0mL}pIt%=@V`pzh2I(44Y*zgl-Gx~J5I*crjcXf8a4A(;{ z^@Kd9WR99}D)r2S$5qvqC!8djx}|%1ynQ2A4-Ry@0TqdE;j&N6G~IUGq}D{&`m=h- zOsXtYwD!iG-o^1viQZ|p-J9%n;ypd^g-%@%@9fs7Tb4FNb5ATvvsXY(T4G*eyC!rm z9`#@MVn}kHac#iT{YA5x`(O1JonbtwIl0MoDjF2niB)pFr&3SsPMVAE#FVk1EyrRf zR|=^P22R46G7g$m4Mz*KGer9mi{qWn+R^tx;cijD{zC=Fiw%f>XDyp`I%PoTvOD@Pg2arOi)SvJF>~ScRc*6c@Ye2} zr88U4n!l`V=F+8$mbRgYr7a6*w=Hj3G{1RS%c6y%b$hZmvAL;bk=R0YZ)+16U2(BF z*={>so$H{y-IbYccXcJ$C&{MSiSC5c*)Gr35dl>Vrc(l*1feS(T;j_?m+Uw#Maq;ov7fnzRs?W zDVy5brp4PgAp*_nOmu+_HA_`U{~UpZeK5M!?sM7`C+Aics*rh->V@&mr^u2n@blDV z%rYnGoMC4~*ppHh$9vm1o~(9})474h?a3){w{4$-uX3C$KVYsnIeBSc_sPuGjrP_# ziLRcLQx^7ZUWXxmQZ;7TT{QGh;xCAwW1ouMiEeT#>21{anl~g`x)*eI_hAA*S?H|p z9>=EMoWL?*^X7PW2UZ5BkVDN*o#0MesRhN!Wh{$3=t3v+F*w>2+`UdtLmyb5a6Tt- zdRHfg@X495km)^T!p!ySDK2bD;KwU4HE-B{a^6`8>+3KwK3@V8^Ex|;iQ*KQ;b%1t z7d!U0QwXd`tXrBmw~v=lrxKvJz~fIOQyB5mgC(7MB2NVnahB6Lud};D@LHoOz1T=N zO)cHYUQ~~hmnN|AZBK}nB+ZwLoD~~8dlRia#9HA1<=7-TDF*@#2ds<;z~*JrGZO3L zeO`3NAqZCw#Mh zE`_!&iKX#w@Q^_vWMD?PV^3t#ogAz=6pHDH+USUg!HP}|lJ1Vhqg zZf>{ks?VmVje4~$)}uhq*K6}*b!QJhcjzbCh1pVx=;wU99mdQ^(4?B^ZtqMaIT;~H z?cQ3tPfF{d)j3N|w|llTLME)Iy78DmTuIs>nh_>9uj|^rtg{!?N}Au)03n3>EOSm+ z?CU7DSoOEG1P_@^F2*4BNR}XFWC#VInbGMW z4BF0iW=xtgrmc-C+3nV&73&tNiF(X{AD5vca24mrlf5cF5Qoeg$bpRm8Lmh(ua#I2 zEv0C=tenc&y40R1;n4iTOsWBvEsUd2ucIt#eI!~F?R|(+Sp3+%cDvn0-BM81TQ_3q zE>>*BIzPQ40)Apwqs_*EMrB5NO~Is_NpHoN#}%YKa3*tlyr;Jh3dv$@GH8wAhJ>Wz zrh_#*EraarZtv>rNPwfa)T~8i&tQ@tPhzTAlOdI|E`!%IQ1j9RqChvyqQJ}Zk*1M1 zm8RynlnXOLN0W*oh_TLg-Vw67naeS*-~dKP#$t`~sX(Dd`^;?#*Ue`+UDTT?7OAv_ zeLb5td~WLWjR{QCeVb1ufV%MFcYS9&MJpa-nd(!1`n*&;s@N2glSX9Hi^+>4*bT8FikplFPa>F`Db89UNRGZO3iHf*2(oaPOP zEopX3FSfB5vNTgB7GPt6!H`Z>E2~)!2Jlwf*_2LDB_y0VogIjRY5vS@SRm0kN1Ejp zOruCw`{cxyZq#uz9}va6K38f+BH8YA@{w6u1vZ=s2LmIyyffK}DlfCsY05{e7Mqax zHgy7(PIqm?aPR1A?@cG52gY$C=ft;974xYgDFJhmBG7x0tne+g55@XonS%!+Y9CIHwz$*a%xxIfOp`-t z5)^7VA$Xc;%8YnTiEYq>d1~9D^={NsTTSfG1fN<=+fGi!Tt=Lk-R(9bde5h8+@u?X zL^wvTh&$axpwpb{>`9!3BMaJYBErYj&$*@Iq$V+4YK#VoMwi(dY3*B= zjg_dKDW_{xui`Zo=bbCu#!HhHgijSa^=3Yas5g+IR+Plm6xKQ^kKCQZ5q2n6#na=KvR>)`r zZcx=6Vy+D-RGbW>#Sk^V-PfB6kE!vXhZf1Y6U)FUg3BT`8Is&bGI?(I%jB`kP7zj9 ztISiyT-Bs*QKVwPMuBTPkORX9GP*F4q*gJh!d#VG)G_#}+fnt#zFwPVg7z7S_H+}o z8+h%F_7;dcuq{Qp)z^h&RLm_0-8g*(A*dlSbO$okfvr$0S~@jr)wc>5J``hIRZA1= z^&uebh};7~L9NW;JA>z*rw%A6BYn1G_w{7ZST)VzQ`rpOfV?xY55<-&Be^vZciK0q zYb3ZYgJ@ZVsUpFXCFTIkDV-e@kJC()mL?Y3y{&ycI2go2BF*LQYvYu$4=0ExYJ(Tm zl}X<7V?37WjP-2CgY2i?pdt=q#8UAgMP_sx8i$!A6@*#cVOedk)5{b>6rF2vaA!tp z_ruhVghR!~dqitjBGJPpyC-#QcZ#5COK?|kyV%OjT}{}Xoa@qzPshEOBc@{?f9Uad8|W&v6bnfJV_tu~HS&=nSfRO9CSe$?8B!Rguqf(2J{fj_j6J}<-A=Jfn)}Dmpey(ya|$h9vP8z($bVKQb9~9-L0ZAyMYh zk?IozI&zb{C52Nk%WlBo6SuiOb|LcQ-ruCg1+_m3^ynx1^Q1$*B=^0Hw-VHbg%1Fe zBEh>CO}MSWhj2-3LgF3nb*1RSxMkC(_a!l#r*=u~5`9-7Xehckcc0WLYU(~gcTx9r zHO=3A3fZ-wo-}1_TU+nO z&Lq|^sdMBco0mzeu#w3jm+1JC$tLSCN1h_3JwrWjN0MYJMRo2R=q>}-y3EzVIyKm6 z3Ts-L*wEJ%cV=#Lm;8D(p;qeH^`zHK+_9PwW(Ld_x{vEv-r9rRyvssi*fFa&bFeAk zw^q14c#>94L-Vl0)QSxQi;fI%I1M(fG1R#vuS_&b?$cMh!geotY5eLdV~kK*P>6U( z2OVN(+`?k+rVE1;xe%lc5H~+=Q+ks^uMbsYrhLP;yP+e^rFJ`++o9h~O3Tq~qN{Tg;9aVCW9C1E!sRXM1Na&Yx!BRvY!Cp~2hWIh`9e&hOl;DOg5V zXrdLa|5AFsMl+TOvmeYM=~4W#O02T38%{KE_A5b{)5J$h9TtxasMH+}1)VkCgj9ly-tnF~qj0LiwbJB&FNZe}Dq~b;h zTn>PsRT3kcwx}Ma=OMJaG8i{TtQD_Y^7H?-_bqTyRonmP48zPY-~dNZR2~P^)D$?Q zl7Jv0qL88}sFfHYj7mJ^rD*1WSJN`nv{K8|o@$w;mG&^R(tEYc-Y+vPOUuefWoo7V zzH9F}oHGNI-QT_c{`d2{JkDc3)?Rz9wbx#2opbg^({xF)>AK7ZEz~4Tkg(83RB#1{ zsL^zo7noMK1H)f;fx4qXTRfc`_O5GYxoC}NW>qL&>h@+4e^IfzSwZG) zHA^k>Y>YbA)LIh?MDXURnHdFjj^@ev4i(#``UKVUWemo}W{K{UA-}5$i0YiU9v8-> zRn=G4P^hwU3L|&3z_7slpz4w3rS(E;c|GRrN@7OS8+PER?xsjf=YrHU^})rUC*azB z`gHgLg*8;&H9PVl$A_nu2pMoG3oR|Zyt=ju&Ua-26n;Hve`ck*t~1N=MhU`3$RV0R zB>C$pj9A)TS#h~`qrUZ#URH@}#41dg)6rAaAthPl#A`}{m&6MpJjEUeyQ+{C#f$O; z#yF2OYQeMIB#$y^QA0ximJI6_&~Qs5h@NTFJjy^PaEO(xbF|1p+e*A4UV=BpYw(u3 z1K&tE1i?2NZ>?A13yN}VVMf;#xURwX7Icipx0%Jr#a9twlvjvc1hSAe8FzFp1q|f+ z)G!!;XV1pB62tIaL@vHp7=&*hM&c?5|D%zfjo)-!<-6|Fa3{1cKx>FVF}$D)(ZXbW z-GSM>#dI0vsMRw3Bgl&P^vi)2ohLEe%Yn1Zpim0OP{tekGx1HrEc&{{T!0cqXg3=; zJ5UDCukiIrEm|eY2*E=DrwV;_=uh^t5FTuL=7RB!y#CNR{?Mb9olOUa~NJ6 zqR>7Q?GVOPJ`JS{g(+0Nlb&v48I^MIEy+mWpwElJ_hLlBraZ=%N?lK)0bT72=P1#I zx9*nb9SuxH9P0$J4RM$7C=9rdCV)Da^nPlHLdNJcnB@E#CQsx6hGzDI+G75FX1 zm#@j74#&-dI-N90%y)4{lSnO3C>YYj!6LxKOBcYT8{;;~Z!zvM-QwE|E(J3BLflk& z!{vbYzYN%sbP>-IQJ%|#m^uO}_&ynRsK;f(L||Tz6i-OarHexlMvVc)0#?s~denQ_ zB};k6J=XD}ook-RhC<(Y6LlMy=!~Y6x+f6sVG+FRPW5@g>eof#`;%XcqL$WnwI|&Zw$x zVk^Xw(fJB|FjfwhSD;Hp4D}ipgi@psfr!M-#i0U1@7{_PpK`%5W(?!XsLHJb5xHfi zCE^oIeRo?cC*yOlkx-$zF2#@|Oh60cQJ037`w+WHNb(Tj0Vr+7??}cHJ`k!g6s!<4 zZSWHt{@gFMP9j58BHD2QP?ZUX-kO5?TS{za&>go)RttSG`>8<<83BUrwJ}F4G#`qz(!|CE^*L_Jd+H7D!nZ;9pft zgbDG4(}&dcbjYQetE$3e^g0t1l7%dG9)r=4j_HuohVUw8BU2s4`u=f~hhssbg(QOb z<~fxRuH1+qndb7W8X5mv8qvg9gceCR5RRNKt@nv2R*JIROdw@UoSz1)csi$JHPVYQ zu1T#IL0xkis#AE&-1@y#PpP3cRjQCmFTx$yjqW1>iK zP94>d>d!DO1%(R0Tf)0}UkDq@`DcG=iX>By>pZ-o!8l4S6JKdsClf@|3^BN-xq+Jp z#5*!BwK;-hi%M&TH(^+Zw14)O8ymz8YLze}V}Ry5872oeK3g-6INp2;$J1++roO5& zrN>fp50Wq|rD7yz=*FQZ?t@wT+FYxb9Mx=6M=c`NXtNNMqVZ2MO?)I*gqtnYgZd_% z$QaSgPS19K?>-Yeq}f3oWorARHE67mOM-dN56Vj1*LAH>PI=Gb_O_P&;;uKT0re-|DlyuHb2SNBSp`v6mkci1h zBl40t;ehzJjyg4^TF;k*w1%2y`3rH^V-=!me825(nNwO%*pw+?qDqKp zL1CGn>CMG4~vne*z9)5N_yXxu~R z_X*zQ^$3xqmR0zwFGZZ34D~|X5PIlKP)WVIph=eo2rG%N>{&zwu@LV63dy4(DdqT8 zThJ?O$Bl6#UQbr9<$AbJpk)7-~X%_*8hXqXcOp@N2`DuW!RX4W)sU*!?^o+vWX z0}>>&hy)FG4q2^7a$W`1!PO)wUZF=zP6r>sQ_*YgHZjclc&aiLs=Fb|=}O)=q9Hxq z$E4~bw+KHajVW4E*DB;}V9K38&oSrT-x%si*Ibk)1oEL}#7Z9{1Yy(&(6u>+%_l#SRm}iYd&wOSx})it^`&Gu z!@f1ARf9qDM|zAKx+;ch-$(}}B3?%8lXZq{(1b_Yjan>%Zltk9bfZaF#YQtW^#-EQ z-*ehm%d0U2jtNbZ8WyhJ49h@o$Z%K%O61^6NG5X@gbUUBOEoyX*Fd;U7Lp)RH}2`blFsEaA<+kmYASd zVx&GYAy(WERvXM>q^Mv)CPeSi0kS~JHmB*+fnQR8+*d6|P9@4z;hxgSCL*=K%aBr{ z9Bvbm7|-2L{|!0bps@E6!(u+bAoUnN~k#1G00r0 zl66irCTn;Seu*ZkCsG4E$!5buZLRl7Gl4K)K}QO#gDs^B4P#TJKDnUZ0HRK*lqX9$0MgxmFt-+%X(7a6o8w-Re$i#;a5A<+XL}r+w z!<{s2wR$qEDHLjX{5g%xX7YN(hND16_i$}K!s0>8h{vc%Z_+p-_o&zIu;P*6X4t3A>r zLF+>cm_;-%ukw}rP0_i82&_hR`J78uQ}b$SGc>HIhCa4N4RbBZ-Bz+LDcnFo3-u|( zG>?u@r^tRA2WVOcA;6KEs8NKNFzJm&`>sOi8qD{22k@2Te0^4Iz|epbqyzRm0oe2I0n`COB$)>bR%2H2p#%Or#+KX?l|8 z4svf08vW;+qftP!JehRvjZ)AvJxA|gsj69*8p(aW;mG5G zlp4HSrnfnT2v6hRBR^Q>?HIJAN{kTcSxZ$WLzsGkmg_Lyg(bbd!mT_te%U;ShX=Sl zPAb>{AN4@U-SG3%X4GSGJ{>W-XfU(IPV*TyGh+(Rc!B*1Zo$ zPnz7g=k{1mKQX(NiqOO3I>9YJ*`0S+V>ySiye}K}>DQPf{c1o|dZ? zDB({t$lVluRhJcpONt)X*2j3OeNDK$`Ylkwxgr;$phg+V7@!#wul{0~kX=b4qZej; z&x2I`8)Brq^?vKW%>Q-H`G1ERCjo^EX><`8I4?!#QtGcN44NZMVnOZ{pF})eA#RtG zvq&r>JH)euY7D8a2cN9?Y){q*e+z~)j9c)esJL1ZC+F%=q^VDhWpF#;&%mPTjQ4|V z2)%WJK{&Owc02`~w@c9lk{9(YBGszWi*0i{bcZp>`w2TMRqb(i*4O58Np#aB(|u}Y z4`I?@5 zMdh`oQXT`r# zQ&5}S0IW@ewy_ErlP;1l&Ff1B)#<4SCeetNTTtN%-F`ox%27N~SiJ7bt%1^O>Cc+l zr=N*yb3*Wv1<@#rqQx7Bz+k$xnQ)LAe2`@@1xwD2qRl8{ZwTCndIw7hqRmGZSbAH* zTNWheKBL)Svl#`^X2Y%&Hk-}MEZQWqSqciq_R=;=2@cE@E&c(bNGai{oq(g4RkQ&h zilA{zTLFz-Yp@x-WrG+RA_a&BwIHR33&;=+3=Ip=v{`(BCIM~Z(kO2n8Zwa| z=1sf}^A7W7r1rKMtp;zK1&kvkZQf=tu*%ykO3sDUhAj}CXzB&Sp9s%OEGE`BjG}(< z9!d>?$PEpJnAm*H-jYL#mWpjs8F54^CV1XvqW-mE-e?i>71%Jrf=-0u(qOcTQnW8% zsU-0d1PBvaC?LLsh8hJ3CTr3`GD@-_O7)C|#Y|uW8_FzZFKL!kFU>+HaWMWRywk~FqjG02*1fSd-j6&bOmVs8*Q%-diB{>ZiY1cKCI_z z0%Hk~*Lzv~&7cLwHEyV)7lCxHH=7~+7^8fglkh=nm_?A9%d*860uF{bpOc)=SV@or z8y*e-I|ayPXeeahBJkIsE|rmB zT4>~0xV&D=q$;$hS(2P^C$)uw z7)5PJo-66MjoF7)v{*n)1F?YUCM8+T-p~PPSxO>NgE{~<7Mm4A-+332+RBuo6{%L6 zAGF~>X&_6s5)3Pm@-(P(#!MB?Lr}q{hJ!{Ni$Qb9q=Bf=@D))3#h@8*L`!t?0XXL_ zi$N;(7mQRU(0L)SK@4m-4FXs!7Lqdb1AmN?D?lA!h$AG@;3r^6LF167@0zBYvM2r4Rzk@%)Dk3e&kOoH!pYaEUk# zTrtB0P|jP7T0q759-4(V@nRj5k_>?m4d)xIRmu4cxX5_b7)Tsz3^vjDm&zbNkUw6^ zW`ha={|w+GPHi}!&ft=8D3A(hvZfi+46Ratc@dW&Pn;iu6iA-@aC&{f+zhkm$g`AJ1!oDPn z$o+j(a$d;hqc;)A79+b}^;2RHC8X~s^sYDss0ciH0IKazb+m}S=i_hwM3cWF#iRB- zs6a62jT3Td`OB(g1KZ+ouwy@;c$^iXi{43Xjy->y)=0bY7)3f5=m1&@7;I*zA3edP z$By(tUMSt@KZMbLkJphhdA})ytj`K+=^edrDo@@Ow_iQKK4A@09FAgvM#{yZjt-Lq zR<(6A+e(nhIxQC%Qv8Jw&o4l-u>CdEp z7hv~?KhAmozIKYhL49cD_nzK3@BAz9(B!72xTFrgYvlJj;ttTmV{NFz%Tg%ux~ zM`2b=^^~~_NdtMVmE|x428mORCQP2V$i;si{xhifd^2j3Q`v@{RcFqR-ML&fUIfk% z$}e*nr!cBm5m+pgyxaxG2Dm|#aF7lU;VzplR^cLvE}kZoxaokTO8kdV@<$vPrfaxo zqSVVE<-#|?g_Ij4c$1q9GQb>7m2%l7OeHDV#)CX!>|!QY zAJ|!N$1Yd`**`1+7e0U((u8&h+9SJviG`5Jm7FWE@g&RT{tL_v3%_EdaIUu)SpS^s z0m#b`U}64)fVKb{HV7Oc$N_7NF8pN+3n+l2ECXIJT)Y7I3nnskz&0WQ66!J8q7MS~ z0lkAEOWC1l1D2k1Cptz6xS}F(`EZniC@oZSe(Z-?8iqO815N`^*xbkOnfU4K%{04#mL$*8}#Vio8`t-b%>>ZTJdDwY#xPCpyY)Z~`=y0iq*3XOqk= zaAv02e9>sJ%f<#kPEiUAz?hbG#x#M+WngkS0ES^6OUVOr@NyYk7@lY)1V}kXHc6V8t_7UIyhgu>*yj2W@Q>9-9H?;Q}02Z&5-qxC=hy!vdNO!3$TQLz;j% zjVmfb?Rx_@`2n~D*=3Nu%tA6oVJ6&yZsc^5(G5fhNm!T0?hs8Jz{>7|!Q7pTBs)V& zkY=N6k`JSW3PA{vXrXEYT{%{(rHSm`DC9gtxl`$oONTrHv?8zy3vvh2iD+)QO za*?`$N4<=d_X;LEs${IMCC7|N&y}ZPolv=&uZGJ~N7P~s5gDtb(Eb_KGWN=lu`-s7 zC5vdk9;`3zs78$251WC;#n=<#WAI{drYLkIU`=c1_i`=ilU&y~CJsHd1vO>4HjAVc zge8VRQ;v+XfHb&ym)uu%)GdI`7AEP*_Q+G0V|48v$H*saUR9AtS47QFSjUHf_TdxQ z2{>nP&YT~|{rKSakJ9gWDE8F-Zzk^{<2fxc4~xP(@)!zv)m4T3%57cBJS=CP=UNy% zuab5HhjPa!75@pr3ISeoTi~zucQATTjfYPZ&Y%@r zTx%PlKYAaiwP+2|Q^6dm!E^VsDc?OhLhaK|;>0m}%uDZR&;!*GI1)7lV4+2cT7O5t z_01*9!wdkt;ix;AK_br3yU5fd{yL}t&X6=xyCYrc#C2*{r32mlbM5y+lv!jC?dWkU zy$)BS>y4g{0^X@0T2b&pE9*%yPkJTcV{H-A<+)DL@7JS96ll{$6prf#(8(8eB&AF* zE0yc`P6x?R_828f##Ui$Yn9|E>{uEdA0<~~#nz&N(u#6Na#X#eIx1yA8*3YDQh{p= zFc~1qtCOQ@tI8AEepv<8(PhPjRTb40lWL-|UT|VTby-ZEJ&Mei;z`<$3%or5ljSC0 znQXJTntC^!Vidxw97acSR8~C}M#Zw9Y=4{>tY;h*%OTWMVF71a&;By;=^e%Dq3vqd z(s-_Wq*P%!IpFEQYH!7LSfh_4p*lbkk}TmQBjX|!#ydsi3li=6svLwZ|nZ|=l>D~MC?uvUGrbQ z|6gKyQ(wCWXX;|me9Q?i7bSCMSJ#?&vW& zxw30JDtn|7LHWLIL#AMpzr@(sY15{~)MEK%rXpi7E!o4APE^FJZP1w95zz#KEdd?P z7t~h5+qbdD*?ae~E9~bw+$JdflmvTxU!~7g*C`EuQ&9!pLkHPADIEx$rLE-J+)B>E z(&*St0Sm3$0~8x&n%kPu54i6|_Kr#jrC8errj5)RIe4U;mMXI)s~tu5E0yjXvq)DS z_5zQ#%d|s{j3tS&l|%VtIR{%GI;xaLF-lKSJoff#6#c<`(Q0TEMd6!ok`H~@&$1^x ze)H&@L1j^=pL)$?EV=(eV@-D2tleu~h!}C+F!hS3PNsb{XJN)~$NcY^vGUvdK6~Ur zTmR6(A+?L9Kit0fVrIxgU%Zev;^Lw!b7y3qdjID)mKF1NVgM5 ze|twr9vZW5+q|(8jGwk`-?cpS&|v@IeOnJaJg#m~g)pUY#XCoKes=1%W#fi_XIUH- z`DRql<$i;X4qCcw`O=dYOdqGbIR4(;B>AZmH-0d5#;(Vl-zY0TJN;0~m@KPL-&<>Y zyi>gK9{=ne=l1#-Aid&)4L>OjrUZgTy?m+W#y5C zk@qg}nLTq?!R%`n^zLfC@rjNDPCd|V-LtQ5yX9;inyx68|=CV`96X3YP_hO?Yd! z(&+s-6x1@VoC5m!#|w8qyZz$>8{*4uoH}N#o@BnzPP6`PgS@j63BiE+>F65dqY><* zJ)hagrV*Z&%9Idvj-n}{-ii|62WlxUAua(*=tmuXgVXIcCX>cMKX0Y4U5T^%qd%mS z{7g9o(<{pBn-r0sdAOsvaz^oFdk3g{6!Gy3z{Y(=)mWqX)zuEUPc)R@)k+3sS^ZM6 zpTw)Hd&yXC7~#h&Wb6-vrTVMn!NrxOG0~ajlViFMO6?KLZ^so^)llN37*_&as<6EN z1+e~5=RK1YH1y)7iAP4w-SF94BNH-~JRX0$^5}?zV~y{gi5{4g>0P(`j$ucX<8$6# zu<81D{qy?wUwLTWpcUrSAF6XrL%)vQTip1Ym!J8)CmfUCS`_&0nf`VAtJD5|OU1#> z4ap0O*35s&av`H@)bsM;fcv7NvesQQYHxht-&5A^OPhLozxoMZKY2Rsr!8sLl$T2G zIk5Ws+DWVZEejvn+JC^-**1CM+WU$k$K4H$-NWyW(5`;>E=5>`uzbpBeU}w zGW-w!vip_KOogeLeSVmd@4GmD+_|s|U-jWSuTk6tNhpNsDV!JR>XVsXonQ!Bu zsk)-5A_hA{#HMBEC}{*I!kDBaD)DQsTGMx4Z=E*fWeW?aQY;@<7*#Z=Xtu8UnjS?xln>L_UH1T^)?2sz@Y$`KQ?`7uQ`r3Yv`=;`+m~;36kj^fH)G7*Q-@fey(iYuW5%!1 z2ljW{@#WLo`p%IfX5S*8*lPWLMpk~w*_r0)Wq0@J_tS8{3yIggzou7q<-6tYWc+$V z&v!eYob$D5R-Lr*%gSpa9-L^F)9!!P@kw+y-^8#UORnn`Ho`yUj-M-z?Y=AL{IdZs zK5%Aj&C`?Kd|YZs|N26o<9yK*zd-A9Ro z>Q=4C-toANR~7ePJg@wb)%eKr#f8(B^qqa{+XugyY!CeQjqnThur1F`9G9~6#qmd0 zhj-~6*sbKnQA-}(fB*emx8ygh3-J#NmlfNu1vBUQY&mk_fhns(d#&10b>z$1HDASb zUbN@d6CM4E{{GRRwKJa??KLd%$wi%q4J$kxwXEOF_v;s1gF;62I(l)ZbSgBZpuoED zflq&aRoSqwdq{1@&id;t`(9W$X5rcQ>J}&V8IoPSJnyHuSC{xZ4_^Pl_6zG{U+#M5 z{PYiR&kuNI@R+2a_~FRck>{@;KC%8bgK72b_kC3jItm&z%T0s6u<2$) z@-L5^PWs!TjVI!lfA?|k-tXx&Xp0J#Z2u;^QJkkpbkFQYi(-PoXb=UZ6+McAveBxb zoXLnw^45?PVN6%jl+-mTYm(>n|6~29m(eB>Wr}dBs<@yC9ZDfov&(LUB8+VU+?pc9 zehAq4xw?jF)yvg_I`4O6UOjPcZ~q0K`ITiob$Y~|BR9Pg-^=*MuEM~_ zd1nL8?awBd_di}&!;TSt99O4xnN&!r~<2G@ObmYXz2Hud zjvm^3{ZBiJhQ7TaB4P z>#FaDuHFCoZR<{khFr7DG;Qy&dq-^=Zn=8K9bY^+`in)2-nin+%^!Ug|H``WcQ@P@ zSF-+^f~&3fJUwjCvtw4hwBlH0*|q1&uJoJT;f8#_mGeuL$4C1tZrABj&s7KBlJ_n+ z-u>p@i#i;dnb9ZwL&v!%_MDp&w6tzk(OZk&d?{|$r7C;Y>if5cm&UHU!_Soc>%wkZ z>h}C}^ut&CezEYD$aw`9cZ{j|JaU?sbxP?AU+!6dbpN$ozrE?ZbX)zTDPKqJ+jesK z+^o9;lYDM{YxaxXySM%I#=W_>-uvHrlP7gi1_QZLs(bKs%Hj2XE z&R8lo?#~R1Td{cX6N3xhuBcoXu>F^3zB_$vsZYYR$)=NoKb(0ae_W@lR(Q|f_1)Rg z<2OIucYVsb&9P7H+OW9Wb+4b#_%wIaF>&*G4SiZ z@21C{3;E=+>L=sM!qfjTton_r%}*|#lHd2YPd|Ggx5W0F!d>a!qxX38zFrtNyE*Rh4WcYkm;sar|fR%yh> z_ug4KtM|+ohhG_YMcMqF{-al}y712WwT*@}rO}Y0QO{&=G$=^w#UyC`|F1En=CLrH zWKBRoNR8G(j(nSL%p%07DaYIH&mvL1d-p~(s!yM|>zavC*r&q`saM{T6B&Pe%dw}g zIX5=q$`|x@5@JLoMw2$lp9NK3Oj_{4_;oK;-);S1_+#mBecAN~Vdu%y=9=Co?uqPp zYWF+Gf3(NM_$~%W8t!U2VA=1nZY-G_u}=%@78a> zI5PgL)HK;K@R$56%B}M%J08CI&S7Okdo0;=?B2N<)62uA9q{j0R~Y$q&x0k4>XwJ! zzajpr#L>}yyM7&3vbXQa10|80XH3}BA#70kLE-7W^A~Jf5_9|O7nA%xzWP?-myBf( z-E;k3``Lu&dz}AvZf4O{pC&&)b=|r5C&X>KkT(5=Lm!_X5IAbd_(KO%r|g;Ie`>7N p_qUL#w+9R^ioX5C-D8uszBm4ztj&WaCEvE|aOHt + + + + + \ No newline at end of file diff --git a/after.Argolis.sln.targets b/after.Argolis.sln.targets deleted file mode 100644 index 51580dd..0000000 --- a/after.Argolis.sln.targets +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/appveyor.yml b/appveyor.yml index c5ef847..ddba930 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,30 +1,8 @@ -image: Visual Studio 2017 - -install: - - choco install gitversion.portable -pre -y - -before_build: - - .paket\paket.bootstrapper.exe prerelease - - .paket\paket.exe restore - - ps: gitversion /l console /output buildserver - -build: - project: Argolis.sln - -configuration: Release - -after_build: - - .paket\paket.exe pack output nugets include-referenced-projects version %GitVersion_NuGetVersion% - -after_test: - - .\packages\OpenCover\tools\OpenCover.Console.exe -register:user -target:"%xunit20%\xunit.console.x86.exe" -targetargs:"src\Argolis.Tests\bin\Release\Argolis.Tests.dll src\Argolis.Tests.Integration\bin\Release\Argolis.Tests.Integration.dll -noshadow -appveyor" -returntargetcode -filter:"+[Argolis*]* -[Argolis.Tests*]* -[Test*]*" -hideskipped:All -output:.\Argolis_coverage.xml - - "SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH%" - - pip install codecov - - codecov -f "Argolis_coverage.xml" +build_script: + - ps: .\build.ps1 -Target CI -verbosity Verbose -configuration Release artifacts: - path: 'nugets\*.nupkg' - - path: Argolis_coverage.xml cache: - packages -> paket.lock diff --git a/build.cake b/build.cake new file mode 100644 index 0000000..2c20d45 --- /dev/null +++ b/build.cake @@ -0,0 +1,115 @@ +#tool paket:?package=OpenCover +#tool paket:?package=codecov +#tool paket:?package=GitVersion.CommandLine +#addin paket:?package=Cake.Paket +#addin paket:?package=Cake.Codecov + +var target = Argument("target", "Build"); +var configuration = Argument("Configuration", "Debug"); + +GitVersion version; + +Task("CI") + .IsDependentOn("Pack") + .IsDependentOn("Codecov").Does(() => {}); + +Task("Pack") + .IsDependentOn("Build") + .DoesForEach(GetFiles("./src/**/*.csproj"), path => { + var settings = new DotNetCorePackSettings { + Configuration = configuration, + OutputDirectory = "./nugets/", + NoBuild = true, + MSBuildSettings = new DotNetCoreMSBuildSettings() + }; + + settings.MSBuildSettings.Properties["version"] = new [] { version.NuGetVersion }; + + DotNetCorePack(path.FullPath, settings); + }); + +Task("GitVersion") + .Does(() => { + version = GitVersion(new GitVersionSettings { + UpdateAssemblyInfo = true, + }); + + if (BuildSystem.IsLocalBuild == false) + { + GitVersion(new GitVersionSettings { + OutputType = GitVersionOutput.BuildServer + }); + } + }); + +Task("Restore") + .Does(() => { + DotNetCoreRestore(new DotNetCoreRestoreSettings { + Sources = new[] { + "https://api.nuget.org/v3/index.json", + "https://www.myget.org/F/tpluscode/api/v3/index.json" + }, + }); + }); + +Task("Build") + .IsDependentOn("GitVersion") + .IsDependentOn("Restore") + .Does(() => { + DotNetCoreBuild("Argolis.sln", new DotNetCoreBuildSettings { + Configuration = configuration + }); + }); + +Task("Codecov") + .IsDependentOn("Test") + .Does(() => { + var buildVersion = string.Format("{0}.build.{1}", + version.FullSemVer, + BuildSystem.AppVeyor.Environment.Build.Number + ); + var settings = new CodecovSettings { + Files = new[] { "./coverage/cobertura.xml" }, + EnvironmentVariables = new Dictionary { { "APPVEYOR_BUILD_VERSION", buildVersion } } + }; + Codecov(settings); + }); + +Task("Test") + .IsDependentOn("Build") + .Does(RunTests("Argolis.tests")) + .Does(RunTests("Argolis.tests.Integration")) + .Does(() => { + DotCoverMerge(GetFiles("coverage\\*.dcvr"), "coverage\\merged.dcvr"); + }) + .Does(() => { + DotCoverReport( + "./coverage/merged.dcvr", + "./coverage/dotcover.xml", + new DotCoverReportSettings { + ReportType = DotCoverReportType.DetailedXML, + }); + }) + .Does(() => { + ReportGenerator("./coverage/dotcover.xml", "./coverage", new ReportGeneratorSettings() { + ReportTypes = new [] { ReportGeneratorReportType.Cobertura } + }); + }) + .DeferOnError(); + +public Action RunTests(string project) +{ + var testSettings = new DotNetCoreTestSettings + { + Configuration = configuration, + NoBuild = true + }; + + return (ICakeContext c) => + DotCoverCover( + (ICakeContext ctx) => ctx.DotNetCoreTest(GetFiles($"**\\{project}.csproj").Single().FullPath, testSettings), + $"./coverage/{project}.dcvr", + new DotCoverCoverSettings()); +} + +RunTarget(target); diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000..130a15b --- /dev/null +++ b/build.ps1 @@ -0,0 +1,164 @@ +########################################################################## +# This is the Cake bootstrapper script for PowerShell. +# This version was download from https://github.com/larzw/Cake.Paket +# It was modified to use paket (instead of NuGet) for dependency management. +# Feel free to change this file to fit your needs. +########################################################################## + +<# +.SYNOPSIS +This is a Powershell script to bootstrap a Cake build. +.DESCRIPTION +This Powershell script will download paket.exe if missing, +install all your dependencies via paket.exe restore +and execute your Cake build script with the parameters you provide. +.PARAMETER Script +The build script to execute. +.PARAMETER Target +The build script target to run. +.PARAMETER Configuration +The build configuration to use. +.PARAMETER Verbosity +Specifies the amount of information to be displayed. +.PARAMETER Experimental +Tells Cake to use the latest Roslyn release. +.PARAMETER WhatIf +Performs a dry run of the build script. +No tasks will be executed. +.PARAMETER Mono +Tells Cake to use the Mono scripting engine. +.PARAMETER Paket +The relative path to the .paket directory. +.PARAMETER Cake +The relative path to directory containing Cake.exe. +.PARAMETER Tools +The relative path to the Cake tools directory. +.PARAMETER Addins +The relative path to the Cake addins directory. +.PARAMETER Modules +The relative path to the Cake modules directory. +.PARAMETER ScriptArgs +Remaining arguments are added here. +.LINK +http://cakebuild.net +#> + +[CmdletBinding()] +Param( + [string]$Script = "build.cake", + [string]$Target = "Default", + [ValidateSet("Release", "Debug")] + [string]$Configuration = "Release", + [ValidateSet("Quiet", "Minimal", "Normal", "Verbose", "Diagnostic")] + [string]$Verbosity = "Verbose", + [switch]$Experimental, + [Alias("DryRun","Noop")] + [switch]$WhatIf, + [switch]$Mono, + [ValidatePattern('.paket$')] + [string]$Paket = ".\.paket", + [string]$Cake = ".\packages\tools\Cake", + [string]$Tools = ".\packages\tools", + [string]$Addins = ".\packages\addins", + [string]$Modules = ".\packages\modules", + [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)] + [string[]]$ScriptArgs +) + +Write-Host "Preparing to run build script..." + +# Should we use mono? +$UseMono = ""; +if($Mono.IsPresent) { + Write-Verbose -Message "Using the Mono based scripting engine." + $UseMono = "-mono" +} + +# Should we use the new Roslyn? +$UseExperimental = ""; +if($Experimental.IsPresent -and !($Mono.IsPresent)) { + Write-Verbose -Message "Using experimental version of Roslyn." + $UseExperimental = "-experimental" +} + +# Is this a dry run? +$UseDryRun = ""; +if($WhatIf.IsPresent) { + $UseDryRun = "-dryrun" +} + +Write-Verbose -Message "Using paket for dependency management..." + +# Make sure the .paket directory exits +$PaketDir = Resolve-Path $Paket +if(!(Test-Path $PaketDir)) { + Throw "Could not find .paket directory at $PaketDir" +} +Write-Verbose -Message "Found .paket in PATH at $PaketDir" + +# Set paket directory enviornment variable +$ENV:PAKET = $PaketDir + +# If paket.exe does not exits then download it using paket.bootstrapper.exe +$PAKET_EXE = Join-Path $PaketDir "paket.exe" +if (!(Test-Path $PAKET_EXE)) { + # If paket.bootstrapper.exe exits then run it. + $PAKET_BOOTSTRAPPER_EXE = Join-Path $PaketDir "paket.bootstrapper.exe" + if (!(Test-Path $PAKET_BOOTSTRAPPER_EXE)) { + Throw "Could not find paket.bootstrapper.exe at $PAKET_BOOTSTRAPPER_EXE" + } + Write-Verbose -Message "Found paket.bootstrapper.exe in PATH at $PAKET_BOOTSTRAPPER_EXE" + + # Download paket.exe + Write-Verbose -Message "Running paket.bootstrapper.exe to download paket.exe" + Invoke-Expression $PAKET_BOOTSTRAPPER_EXE + + if (!(Test-Path $PAKET_EXE)) { + Throw "Could not find paket.exe at $PAKET_EXE" + } +} +Write-Verbose -Message "Found paket.exe in PATH at $PAKET_EXE" + +# Install the dependencies +Write-Verbose -Message "Running paket.exe restore" +Invoke-Expression "$PAKET_EXE restore" + +# tools +if (Test-Path $Tools) { + $ToolsDir = Resolve-Path $Tools + $ENV:CAKE_PATHS_TOOLS = $ToolsDir +} +else { + Write-Verbose -Message "Could not find tools directory at $Tools" +} + +# addins +if (Test-Path $Addins) { + $AddinsDir = Resolve-Path $Addins + $ENV:CAKE_PATHS_ADDINS = $AddinsDir +} +else { + Write-Verbose -Message "Could not find addins directory at $Addins" +} + +# modules +if (Test-Path $Modules) { + $ModulesDir = Resolve-Path $Modules + $ENV:CAKE_PATHS_MODULES = $ModulesDir +} +else { + Write-Verbose -Message "Could not find modules directory at $Modules" +} + +# Make sure that Cake has been installed. +$CakeDir = Resolve-Path $Cake +$CAKE_EXE = Join-Path $CakeDir "Cake.exe" +if (!(Test-Path $CAKE_EXE)) { + Throw "Could not find Cake.exe at $CAKE_EXE" +} +Write-Verbose -Message "Found Cake.exe in PATH at $CAKE_EXE" + +# Start Cake +Write-Host "Running build script..." +Invoke-Expression "& `"$CAKE_EXE`" `"$Script`" -target=`"$Target`" -configuration=`"$Configuration`" -verbosity=`"$Verbosity`" $UseMono $UseDryRun $UseExperimental $ScriptArgs" +exit $LASTEXITCODE \ No newline at end of file diff --git a/paket.dependencies b/paket.dependencies index 19c3a72..ebb7747 100644 --- a/paket.dependencies +++ b/paket.dependencies @@ -1,45 +1,28 @@ source https://www.nuget.org/api/v2 -source https://www.myget.org/F/tpluscode/api/v3/index.json -framework: >= net45 +storage: none redirects: on copy_local: true -nuget fakeiteasy -nuget GitVersionTask -nuget JetBrainsAnnotations.Fody -nuget JetBrains.Annotations -nuget JsonLd.Entities -nuget Microsoft.Owin.Host.SystemWeb -nuget Microsoft.Owin.Hosting -nuget Nancy >= 2 prerelease -nuget Nancy.Owin >= 2 prerelease -nuget Nancy.Testing >= 2 prerelease -nuget NullGuard.Fody -nuget Resourcer.Fody -nuget StyleCop.Analyzers -nuget xunit -nuget fluentassertions -nuget TunnelVisionLabs.Net.UriTemplate prerelease -nuget GitLink < 3 -nuget Rdf.Vocabularies -nuget dotnetrdf -nuget json-ld.net -nuget nancy.rdf -nuget OpenCover -nuget ImpromptuInterface -nuget Dictionary -nuget Costura.Fody -nuget Nancy.Authentication.Basic >= 2 prerelease -nuget fody content: none -nuget tpluscode.UnitTests.Ruleset -nuget tpluscode.NoDocumentation.Ruleset -nuget tpluscode.Library.Ruleset -nuget Nancy.Routing.UriTemplates -nuget newtonsoft.json < 10 -nuget UriTemplateString - http https://gist.githubusercontent.com/tpluscode/5d9c6983004c1c9ec91f/raw/2a5f0785c2686635f1b8ab21af1751d276d02727/vocabulary.tt http https://raw.githubusercontent.com/HydraCG/Specifications/master/spec/latest/core/core.jsonld -http http://rdf-translator.appspot.com/convert/json-ld/xml/https%3A%2F%2Fraw.githubusercontent.com%2FHydraCG%2FSpecifications%2Fmaster%2Fspec%2Flatest%2Fcore%2Fcore.jsonld hydra.rdf \ No newline at end of file +http http://rdf-translator.appspot.com/convert/json-ld/xml/https%3A%2F%2Fraw.githubusercontent.com%2FHydraCG%2FSpecifications%2Fmaster%2Fspec%2Flatest%2Fcore%2Fcore.jsonld hydra.rdf + +group tools + source https://nuget.org/api/v2 + nuget Cake + nuget opencover + nuget codecov + nuget gitversion.commandline + nuget JetBrains.dotCover.CommandLineTools + nuget ReportGenerator + +group addins + source https://nuget.org/api/v2 + nuget cake.paket + nuget cake.codecov + +group modules + source https://nuget.org/api/v2 + nuget Cake.Paket.Module \ No newline at end of file diff --git a/paket.lock b/paket.lock index 81a76b6..7d208a2 100644 --- a/paket.lock +++ b/paket.lock @@ -1,107 +1,30 @@ REDIRECTS: ON +STORAGE: NONE COPY-LOCAL: TRUE -RESTRICTION: >= net45 -NUGET - remote: https://www.nuget.org/api/v2 - AngleSharp (0.9.9) - restriction: || (&& (>= net45) (>= netstandard1.6)) (>= net452) - AsyncUsageAnalyzers (1.0.0-alpha003) - restriction: || (&& (>= net45) (>= netstandard1.6)) (>= net452) - Costura.Fody (1.6.2) - Fody (>= 2.0 < 3.0) - Dictionary (2.1) - dotNetRDF (1.0.12) - HtmlAgilityPack (>= 1.4.9) - Newtonsoft.Json (>= 8.0.3) - VDS.Common (1.6.4) - FakeItEasy (4.3) - FluentAssertions (4.19.4) - Fody (2.2.1) - content: none - gitlink (2.4) - GitVersionTask (3.6.5) - HtmlAgilityPack (1.6.7) - ImpromptuInterface (6.2.2) - JetBrains.Annotations (11.1) - JetBrainsAnnotations.Fody (2.0) - Fody (>= 2.1.2) - json-ld.net (1.0.5) - Newtonsoft.Json (>= 6.0.4) - JsonLd.Entities (0.3.4) - json-ld.net (>= 1.0.5) - Newtonsoft.Json (>= 9.0) - Microsoft.NETCore.Platforms (2.0.1) - restriction: || (&& (>= monoandroid) (>= net45) (< netstandard1.0)) (&& (>= monotouch) (>= net45)) (&& (>= net45) (>= netcoreapp2.0)) (&& (>= net45) (< netstandard1.0) (>= portable-net451+win81+wpa81)) (&& (>= net45) (< netstandard1.3) (>= wpa81)) (&& (>= net45) (< portable-net45+win8+wpa81)) (&& (>= net45) (< portable-net451+win81+wpa81)) (&& (>= net45) (>= uap10.0)) (&& (>= net45) (>= xamarinios)) (&& (>= net45) (>= xamarinmac)) (&& (>= net45) (>= xamarintvos)) (&& (>= net45) (>= xamarinwatchos)) (&& (>= net451) (< net452) (< netstandard1.3)) (&& (< net452) (>= net46) (< netstandard1.4)) (&& (< net452) (>= net461)) - Microsoft.Owin (3.1) - Owin (>= 1.0) - Microsoft.Owin.Host.SystemWeb (3.1) - Microsoft.Owin (>= 3.1) - Owin (>= 1.0) - Microsoft.Owin.Hosting (3.1) - Microsoft.Owin (>= 3.1) - Owin (>= 1.0) - Nancy (2.0.0-clinteastwood) - Nancy.Authentication.Basic (2.0.0-clinteastwood) - AsyncUsageAnalyzers (>= 1.0.0-alpha003) - restriction: || (&& (>= net45) (>= netstandard1.6)) (>= net452) - Nancy (>= 2.0.0-clinteastwood) - restriction: || (&& (>= net45) (>= netstandard1.6)) (>= net452) - Nancy.Authentication.Forms (2.0.0-clinteastwood) - restriction: || (&& (>= net45) (>= netstandard1.6)) (>= net452) - AsyncUsageAnalyzers (>= 1.0.0-alpha003) - restriction: || (&& (>= net45) (>= netstandard1.6)) (>= net452) - Nancy (>= 2.0.0-clinteastwood) - restriction: || (&& (>= net45) (>= netstandard1.6)) (>= net452) - Nancy.Owin (2.0.0-clinteastwood) - AsyncUsageAnalyzers (>= 1.0.0-alpha003) - restriction: >= net452 - Nancy (>= 2.0.0-clinteastwood) - restriction: >= net452 - Owin (>= 1.0) - restriction: >= net452 - Nancy.Rdf (0.3) - dotNetRDF - JsonLd.Entities (>= 0.3.3) - Nancy (>= 2.0.0-barneyrubble) - Rdf.Vocabularies - Nancy.Routing.UriTemplates (0.1.1) - Nancy (>= 2.0.0-barneyrubble) - TunnelVisionLabs.Net.UriTemplate (>= 1.0.0-beta004) - UriTemplateString - Nancy.Testing (2.0.0-clinteastwood) - AngleSharp (>= 0.9.8.1) - restriction: || (&& (>= net45) (>= netstandard1.6)) (>= net452) - AsyncUsageAnalyzers (>= 1.0.0-alpha003) - restriction: || (&& (>= net45) (>= netstandard1.6)) (>= net452) - Nancy (>= 2.0.0-clinteastwood) - restriction: || (&& (>= net45) (>= netstandard1.6)) (>= net452) - Nancy.Authentication.Forms (>= 2.0.0-clinteastwood) - restriction: || (&& (>= net45) (>= netstandard1.6)) (>= net452) - NETStandard.Library (2.0.1) - restriction: && (>= net45) (< net452) - Microsoft.NETCore.Platforms (>= 1.1) - System.Runtime.InteropServices.RuntimeInformation (>= 4.3) - restriction: || (&& (>= net45) (< netstandard1.0) (>= portable-net451+win81+wpa81)) (&& (>= net45) (< netstandard1.3) (>= wpa81)) (&& (>= net45) (< portable-net451+win81+wpa81)) (&& (>= net45) (>= uap10.0)) (&& (>= net451) (< netstandard1.3)) (&& (>= net46) (< netstandard1.4)) - Newtonsoft.Json (9.0.1) - NullGuard.Fody (1.6.3) - Fody (>= 2.1.2) - OpenCover (4.6.519) - Owin (1.0) - Rdf.Vocabularies (1.2) - Resourcer.Fody (1.6.1) - Fody (>= 2.2.1) - StyleCop.Analyzers (1.0.2) - System.Runtime.InteropServices.RuntimeInformation (4.3) - restriction: || (&& (>= net45) (< netstandard1.0) (>= portable-net451+win81+wpa81)) (&& (>= net45) (< netstandard1.3) (>= wpa81)) (&& (>= net45) (< portable-net451+win81+wpa81)) (&& (>= net45) (>= uap10.0)) (&& (>= net451) (< net452) (< netstandard1.3)) (&& (< net452) (>= net46) (< netstandard1.4)) - TunnelVisionLabs.Net.UriTemplate (1.0.0-beta004) - UriTemplateString (0.2) - VDS.Common (1.6.4) - xunit (2.3.1) - xunit.analyzers (>= 0.7) - xunit.assert (2.3.1) - xunit.core (2.3.1) - xunit.abstractions (2.0.1) - xunit.analyzers (0.8) - xunit.assert (2.3.1) - NETStandard.Library (>= 1.6.1) - restriction: && (>= net45) (< net452) - xunit.core (2.3.1) - xunit.extensibility.core (2.3.1) - xunit.extensibility.execution (2.3.1) - xunit.extensibility.core (2.3.1) - NETStandard.Library (>= 1.6.1) - restriction: && (>= net45) (< net452) - xunit.abstractions (>= 2.0.1) - xunit.extensibility.execution (2.3.1) - NETStandard.Library (>= 1.6.1) - restriction: && (>= net45) (< net452) - xunit.extensibility.core (2.3.1) - remote: https://www.myget.org/F/tpluscode/api/v3/index.json - tpluscode.Library.Ruleset (1.1.0) - tpluscode.NoDocumentation.Ruleset (1.1.0) - tpluscode.UnitTests.Ruleset (1.1.0) HTTP remote: https://gist.githubusercontent.com vocabulary.tt (/tpluscode/5d9c6983004c1c9ec91f/raw/2a5f0785c2686635f1b8ab21af1751d276d02727/vocabulary.tt) remote: https://raw.githubusercontent.com core.jsonld (/HydraCG/Specifications/master/spec/latest/core/core.jsonld) remote: http://rdf-translator.appspot.com - hydra.rdf (/convert/json-ld/xml/https%3A%2F%2Fraw.githubusercontent.com%2FHydraCG%2FSpecifications%2Fmaster%2Fspec%2Flatest%2Fcore%2Fcore.jsonld) \ No newline at end of file + hydra.rdf (/convert/json-ld/xml/https%3A%2F%2Fraw.githubusercontent.com%2FHydraCG%2FSpecifications%2Fmaster%2Fspec%2Flatest%2Fcore%2Fcore.jsonld) +GROUP addins +NUGET + remote: https://www.nuget.org/api/v2 + Cake.Codecov (0.5) + Cake.Paket (4.0) + +GROUP modules +NUGET + remote: https://www.nuget.org/api/v2 + Cake.Paket.Module (4.0) + +GROUP tools +NUGET + remote: https://www.nuget.org/api/v2 + Cake (0.33) + Codecov (1.4) + GitVersion.CommandLine (4.0) + JetBrains.dotCover.CommandLineTools (2018.3.4) + OpenCover (4.7.922) + ReportGenerator (4.1.4) diff --git a/src/Argolis.Hydra.Nancy/Argolis.Hydra.Nancy.csproj b/src/Argolis.Hydra.Nancy/Argolis.Hydra.Nancy.csproj index 9f141c1..2ce94be 100644 --- a/src/Argolis.Hydra.Nancy/Argolis.Hydra.Nancy.csproj +++ b/src/Argolis.Hydra.Nancy/Argolis.Hydra.Nancy.csproj @@ -1,185 +1,55 @@  - - - - + - Debug - AnyCPU - {CBCAC4DC-129D-4F36-96D5-19B14F18CF18} Library - Properties Argolis.Hydra.Nancy Argolis.Hydra.Nancy - v4.5.2 - 512 - - - - true + netstandard2.0;net461 + false + false + false + bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml + false + false + false + true full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - bin\Debug\Argolis.Hydra.Nancy.xml - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - bin\Release\Argolis.Hydra.Nancy.xml + true + rdf;rest;hydra;nancy;semantic web;json-ld + MIT + https://github.com/wikibus/Argolis + https://github.com/wikibus/Argolis + git + https://raw.githubusercontent.com/wikibus/Argolis/master/assets/logo.png + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb - - - - - - - - - - Designer - - Properties\CommonAssemblyInfo.cs - - - - - - - - - - - - - - Designer - - - {F8B427F1-AEEB-481B-8D51-A53AF4EF0813} - Argolis.Hydra - + - - - - - <__paket__GitVersionTask_targets>portable-net+sl+win+wpa+wp\GitVersionTask - - - - - - - <__paket__Fody_targets>net452\Fody - - - - - <__paket__Fody_targets>netstandard1.2\Fody - - - - - <__paket__Fody_targets>portable-net+sl+win+wpa+wp\Fody - - - - - - - - - ..\..\packages\json-ld.net\lib\net40-client\json-ld.net.dll - True - True - - - - - - - - - ..\..\packages\JsonLd.Entities\lib\net40\JsonLD.Entities.dll - True - True - - - - - - - - - ..\..\packages\Nancy\lib\net452\Nancy.dll - True - True - - - - - - - - - ..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll - True - True - - - - - - - - - ..\..\packages\NullGuard.Fody\lib\netstandard1.0\NullGuard.dll - True - True - - - - - - - - - ..\..\packages\Rdf.Vocabularies\lib\portable-net45+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1\Rdf.Vocabularies.dll - True - True - - - - - - - - True - - - True - + + all + runtime; build; native; contentfiles; analyzers + + + + all + + + all + + + all + + + + + all + \ No newline at end of file diff --git a/src/Argolis.Hydra.Nancy/FodyWeavers.xml b/src/Argolis.Hydra.Nancy/FodyWeavers.xml index a4cb88b..e888f0c 100644 --- a/src/Argolis.Hydra.Nancy/FodyWeavers.xml +++ b/src/Argolis.Hydra.Nancy/FodyWeavers.xml @@ -1,5 +1,4 @@ - - + + - \ No newline at end of file diff --git a/src/Argolis.Hydra.Nancy/FodyWeavers.xsd b/src/Argolis.Hydra.Nancy/FodyWeavers.xsd new file mode 100644 index 0000000..f4d1bb6 --- /dev/null +++ b/src/Argolis.Hydra.Nancy/FodyWeavers.xsd @@ -0,0 +1,63 @@ + + + + + + + + + + + Used to control whether asserts are added into debug builds or not. + + + + + The operation mode of NullGuard. + + + + + + Automatically detect the mode by the usage of JetBrains.Annotations. + + + + + In implicit mode everything is assumed to be not-null, unless attributed with [AllowNull]. + + + + + In explicit mode everything is assumed to be nullable, unless attributed with [NotNull]. + + + + + + + + A regular expression to specify the names of a classes to exclude from NullGuard. + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/Argolis.Hydra.Nancy/HydraRegistrations.cs b/src/Argolis.Hydra.Nancy/HydraRegistrations.cs index 81e2bc6..408d3c6 100644 --- a/src/Argolis.Hydra.Nancy/HydraRegistrations.cs +++ b/src/Argolis.Hydra.Nancy/HydraRegistrations.cs @@ -2,6 +2,8 @@ using Argolis.Hydra.Discovery.SupportedClasses; using Argolis.Hydra.Discovery.SupportedOperations; using Argolis.Hydra.Discovery.SupportedProperties; +using Argolis.Hydra.Models; +using Argolis.Models; using JsonLD.Entities; using Nancy; using Nancy.Bootstrapper; @@ -30,6 +32,8 @@ public HydraRegistrations(ITypeCatalog catalog) this.RegisterWithDefault(typeof(DefaultPropertyRangeRetrievalPolicy), Lifetime.PerRequest); this.RegisterWithDefault(typeof(DefaultSupportedOperationFactory), Lifetime.PerRequest); this.RegisterWithDefault(typeof(NullContextProvider)); + this.RegisterWithDefault(typeof(DefaultUriTemplateExpander)); + this.RegisterWithDefault(typeof(DefaultUriTemplateMatcher)); this.RegisterWithDefault(typeof(IriTemplateFactory), Lifetime.PerRequest); this.RegisterWithUserThenDefault(new[] { diff --git a/src/Argolis.Hydra.Nancy/Properties/AssemblyInfo.cs b/src/Argolis.Hydra.Nancy/Properties/AssemblyInfo.cs index dac6590..cb81193 100644 --- a/src/Argolis.Hydra.Nancy/Properties/AssemblyInfo.cs +++ b/src/Argolis.Hydra.Nancy/Properties/AssemblyInfo.cs @@ -5,3 +5,7 @@ [assembly: AssemblyDescription("Nancy integration for Hydra, the hypermedia API description language")] [assembly: Guid("1d4cf50b-72e7-4303-bc56-afe8215dee53")] + +[assembly: AssemblyVersion("0.3.0.0")] +[assembly: AssemblyFileVersion("0.3.0.0")] +[assembly: AssemblyInformationalVersion("0.3.0-net-standard.1+17.Branch.net-standard.Sha.135579857255b4ca1996cbd6ed4ed93bcbe122fd")] diff --git a/src/Argolis.Hydra.Nancy/Settings.StyleCop b/src/Argolis.Hydra.Nancy/Settings.StyleCop deleted file mode 100644 index bc74059..0000000 --- a/src/Argolis.Hydra.Nancy/Settings.StyleCop +++ /dev/null @@ -1,10 +0,0 @@ - - - VersionAssemblyInfo.cs - - - False - - - - \ No newline at end of file diff --git a/src/Argolis.Hydra.Nancy/app.config b/src/Argolis.Hydra.Nancy/app.config deleted file mode 100644 index aec6830..0000000 --- a/src/Argolis.Hydra.Nancy/app.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - True - - - - diff --git a/src/Argolis.Hydra.Nancy/paket.references b/src/Argolis.Hydra.Nancy/paket.references deleted file mode 100644 index 5c2e534..0000000 --- a/src/Argolis.Hydra.Nancy/paket.references +++ /dev/null @@ -1,8 +0,0 @@ -Nancy -NullGuard.Fody -JetBrainsAnnotations.Fody -GitVersionTask -StyleCop.Analyzers -JsonLD.Entities -Rdf.Vocabularies -tpluscode.Library.Ruleset \ No newline at end of file diff --git a/src/Argolis.Hydra.Nancy/paket.template b/src/Argolis.Hydra.Nancy/paket.template deleted file mode 100644 index f28dd20..0000000 --- a/src/Argolis.Hydra.Nancy/paket.template +++ /dev/null @@ -1,21 +0,0 @@ -type project -id Argolis.Hydra.Nancy -include-pdbs true -excludeddependencies - JsonLd.Entities - GitVersionTask - tpluscode.Library.Ruleset - JetBrains.Annotations - Nancy -dependencies - Nancy.Rdf >= LOCKEDVERSION -iconUrl - https://raw.githubusercontent.com/wikibus/Argolis/master/assets/logo.png -tags - rdf rest hydra nancy semantic web json-ld -copyright - Copyright 2016 Tomasz Pluskiewicz -licenseUrl - http://www.opensource.org/licenses/mit-license.php -projectUrl - https://github.com/wikibus/Argolis diff --git a/src/Argolis.Hydra/Argolis.Hydra.ExternalAnnotations.xml b/src/Argolis.Hydra/Argolis.Hydra.ExternalAnnotations.xml new file mode 100644 index 0000000..e9b6fcd --- /dev/null +++ b/src/Argolis.Hydra/Argolis.Hydra.ExternalAnnotations.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Argolis.Hydra/Argolis.Hydra.csproj b/src/Argolis.Hydra/Argolis.Hydra.csproj index d243922..4eb5b4e 100644 --- a/src/Argolis.Hydra/Argolis.Hydra.csproj +++ b/src/Argolis.Hydra/Argolis.Hydra.csproj @@ -1,286 +1,67 @@  - - - - + - Debug - AnyCPU - {F8B427F1-AEEB-481B-8D51-A53AF4EF0813} - Library - Properties Argolis.Hydra Argolis.Hydra - v4.5.2 - 512 - - - - true + netstandard2.0;net461;netcoreapp2.0 + false + false + false + bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml + false + false + false full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - bin\Debug\Lernaean.Hydra.XML - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - bin\Release\Lernaean.Hydra.XML + true + rdf;rest;hydra;nancy;semantic web;json-ld + MIT + https://github.com/wikibus/Argolis + https://github.com/wikibus/Argolis + git + https://raw.githubusercontent.com/wikibus/Argolis/master/assets/logo.png + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb - - - - - - - - - - - - Designer - - - - - Properties\CommonAssemblyInfo.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designer - - context.jsonld - - - - - + + Properties\CommonAssemblyInfo.cs + - - - - - <__paket__GitVersionTask_targets>portable-net+sl+win+wpa+wp\GitVersionTask - - - - - - - <__paket__Fody_targets>net452\Fody - - - - - <__paket__Fody_targets>netstandard1.2\Fody - - - - - <__paket__Fody_targets>portable-net+sl+win+wpa+wp\Fody - - - - - - {3FADEBA7-BEA0-4864-B3FD-C17EAC737B35} - Argolis.Models - + - - - - - ..\..\packages\JetBrains.Annotations\lib\net20\JetBrains.Annotations.dll - True - True - - - - - - - - - ..\..\packages\json-ld.net\lib\net40-client\json-ld.net.dll - True - True - - - - - - - - - ..\..\packages\JsonLd.Entities\lib\net40\JsonLD.Entities.dll - True - True - - - - - - - - - ..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll - True - True - - - - - - - - - ..\..\packages\NullGuard.Fody\lib\netstandard1.0\NullGuard.dll - True - True - - - - - - - - - ..\..\packages\Rdf.Vocabularies\lib\portable-net45+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1\Rdf.Vocabularies.dll - True - True - - - - - - - - - ..\..\packages\Resourcer.Fody\lib\net452\Resourcer.dll - True - True - - - - - - - - True - - - True - - - - - - - ..\..\packages\TunnelVisionLabs.Net.UriTemplate\lib\net20\TunnelVisionLabs.Net.UriTemplate.dll - True - True - - - - - - - - - ..\..\packages\UriTemplateString\lib\net45\UriTemplateString.dll - True - True - - - - + + all + runtime; build; native; contentfiles; analyzers + + + all + + + all + + + + all + + + all + + + all + + + all + + + + + + + all + + \ No newline at end of file diff --git a/src/Argolis.Hydra/FodyWeavers.xml b/src/Argolis.Hydra/FodyWeavers.xml index f783d39..976527c 100644 --- a/src/Argolis.Hydra/FodyWeavers.xml +++ b/src/Argolis.Hydra/FodyWeavers.xml @@ -1,5 +1,5 @@ - - + + diff --git a/src/Argolis.Hydra/FodyWeavers.xsd b/src/Argolis.Hydra/FodyWeavers.xsd new file mode 100644 index 0000000..7e060cc --- /dev/null +++ b/src/Argolis.Hydra/FodyWeavers.xsd @@ -0,0 +1,65 @@ + + + + + + + + + + + + Used to control whether asserts are added into debug builds or not. + + + + + The operation mode of NullGuard. + + + + + + Automatically detect the mode by the usage of JetBrains.Annotations. + + + + + In implicit mode everything is assumed to be not-null, unless attributed with [AllowNull]. + + + + + In explicit mode everything is assumed to be nullable, unless attributed with [NotNull]. + + + + + + + + A regular expression to specify the names of a classes to exclude from NullGuard. + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/Argolis.Models.TunnelVisionLabs/TunnelVisionLabsUriTemplateExpander.cs b/src/Argolis.Hydra/Models/DefaultUriTemplateExpander.cs similarity index 78% rename from src/Argolis.Models.TunnelVisionLabs/TunnelVisionLabsUriTemplateExpander.cs rename to src/Argolis.Hydra/Models/DefaultUriTemplateExpander.cs index a3d0345..01844c1 100644 --- a/src/Argolis.Models.TunnelVisionLabs/TunnelVisionLabsUriTemplateExpander.cs +++ b/src/Argolis.Hydra/Models/DefaultUriTemplateExpander.cs @@ -1,22 +1,21 @@ using System; using System.Collections.Generic; -using DictionaryLibrary; -using TunnelVisionLabs.Net; +using Argolis.Models; -namespace Argolis.Models.TunnelVisionLabs +namespace Argolis.Hydra.Models { /// /// URI Template expander implemented with TunnelVisionLabs.Net.UriTemplate package /// - public class TunnelVisionLabsUriTemplateExpander : IUriTemplateExpander + public class DefaultUriTemplateExpander : IUriTemplateExpander { private readonly IModelTemplateProvider templates; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The template provider. - public TunnelVisionLabsUriTemplateExpander(IModelTemplateProvider templates) + public DefaultUriTemplateExpander(IModelTemplateProvider templates) { this.templates = templates; } @@ -51,7 +50,7 @@ public Uri ExpandAbsolute(object parameters) private Uri Expand(string templateString, IDictionary parameters) { - return new UriTemplate(templateString).BindByName(parameters); + return new UriTemplate.Core.UriTemplate(templateString).BindByName(parameters); } } } \ No newline at end of file diff --git a/src/Argolis.Models.TunnelVisionLabs/TunnelVisionLabsUriTemplateMatcher.cs b/src/Argolis.Hydra/Models/DefaultUriTemplateMatcher.cs similarity index 71% rename from src/Argolis.Models.TunnelVisionLabs/TunnelVisionLabsUriTemplateMatcher.cs rename to src/Argolis.Hydra/Models/DefaultUriTemplateMatcher.cs index e03c71b..497b31b 100644 --- a/src/Argolis.Models.TunnelVisionLabs/TunnelVisionLabsUriTemplateMatcher.cs +++ b/src/Argolis.Hydra/Models/DefaultUriTemplateMatcher.cs @@ -1,22 +1,22 @@ using System; using System.Linq; -using TunnelVisionLabs.Net; +using Argolis.Models; -namespace Argolis.Models.TunnelVisionLabs +namespace Argolis.Hydra.Models { /// /// Implements with TunnelVisionLabs.Net.UriTemplate package /// /// - public class TunnelVisionLabsUriTemplateMatcher : IUriTemplateMatcher + public class DefaultUriTemplateMatcher : IUriTemplateMatcher { private readonly IModelTemplateProvider templates; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The template provider. - public TunnelVisionLabsUriTemplateMatcher(IModelTemplateProvider templates) + public DefaultUriTemplateMatcher(IModelTemplateProvider templates) { this.templates = templates; } @@ -28,7 +28,7 @@ public UriTemplateMatches Match(Uri uri) ? this.templates.GetAbsoluteTemplate(typeof(T)) : this.templates.GetTemplate(typeof(T)); - var tunnelVisionMatches = new UriTemplate(template).Match(uri); + var tunnelVisionMatches = new UriTemplate.Core.UriTemplate(template).Match(uri); if (tunnelVisionMatches != null) { var matchDict = tunnelVisionMatches.Bindings.Values.ToDictionary(m => m.Key.Name, m => m.Value); diff --git a/src/Argolis.Hydra/Models/DictionaryMaker.cs b/src/Argolis.Hydra/Models/DictionaryMaker.cs new file mode 100644 index 0000000..7a3ddf6 --- /dev/null +++ b/src/Argolis.Hydra/Models/DictionaryMaker.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Reflection; + +namespace Argolis.Hydra.Models +{ + /// + /// Makes a dictionary out of a given object. + /// + internal static class DictionaryMaker + { + /// + /// Makes a dictionary out of the properties of the given input. + /// + /// Object to make a dictionary out of + /// + /// A dictionary with the keys being the input object property names and the values their respective values + /// + public static IDictionary Make(object input) + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + if (input is IDictionary objects) + { + return objects; + } + + var properties = input.GetType().GetTypeInfo().GetProperties(); + var fields = input.GetType().GetTypeInfo().GetFields(); + var members = properties.Cast().Concat(fields); + + return members.ToDictionary(m => m.Name, m => GetValue(input, m)); + } + + /// + /// Makes a dictionary out of the properties of the given input. + /// + /// Object to make a dictionary out of + /// + /// A dictionary with the keys being the input object property names and the values their respective types and + /// values + /// + public static IDictionary> MakeWithType(object input) + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + if (input is IDictionary objects) + { + return objects.ToDictionary(o => o.Key, o => o.Value == null + ? new Tuple(typeof(object), o.Value) + : new Tuple(o.Value.GetType(), o.Value)); + } + + var dict = new Dictionary>(); + + foreach (var property in input.GetType().GetTypeInfo().GetProperties()) + { + dict.Add(property.Name, new Tuple(property.PropertyType, property.GetValue(input, null))); + } + + foreach (var field in input.GetType().GetTypeInfo().GetFields()) + { + dict.Add(field.Name, new Tuple(field.FieldType, field.GetValue(input))); + } + + return dict; + } + + [SuppressMessage("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily", Justification = "It's necessary.")] + private static object GetValue(object obj, MemberInfo member) + { + if (member is PropertyInfo propertyInfo) + { + return propertyInfo.GetValue(obj, null); + } + + if (member is FieldInfo info) + { + return info.GetValue(obj); + } + + throw new ArgumentException("Passed member is neither a PropertyInfo nor a FieldInfo."); + } + } +} diff --git a/src/Argolis.Hydra/Properties/AssemblyInfo.cs b/src/Argolis.Hydra/Properties/AssemblyInfo.cs index 7860beb..a5864fc 100644 --- a/src/Argolis.Hydra/Properties/AssemblyInfo.cs +++ b/src/Argolis.Hydra/Properties/AssemblyInfo.cs @@ -5,3 +5,7 @@ [assembly: AssemblyDescription("Core library for Hydra, the hypermedia API description language")] [assembly: Guid("b9cfe648-af87-4df3-adc2-04b550bfa1bb")] + +[assembly: AssemblyVersion("0.3.0.0")] +[assembly: AssemblyFileVersion("0.3.0.0")] +[assembly: AssemblyInformationalVersion("0.3.0-net-standard.1+17.Branch.net-standard.Sha.135579857255b4ca1996cbd6ed4ed93bcbe122fd")] diff --git a/src/Argolis.Hydra/Resources/TemplatedPartialCollectionView.cs b/src/Argolis.Hydra/Resources/TemplatedPartialCollectionView.cs index 12b3ce2..1c63f32 100644 --- a/src/Argolis.Hydra/Resources/TemplatedPartialCollectionView.cs +++ b/src/Argolis.Hydra/Resources/TemplatedPartialCollectionView.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using JsonLD.Entities; using NullGuard; -using TunnelVisionLabs.Net; namespace Argolis.Hydra.Resources { @@ -12,7 +11,7 @@ namespace Argolis.Hydra.Resources [NullGuard(ValidationFlags.AllPublic ^ ValidationFlags.Properties)] public class TemplatedPartialCollectionView : PartialCollectionView { - private readonly UriTemplate template; + private readonly UriTemplate.Core.UriTemplate template; private readonly string pageVariable; private readonly IDictionary templateParams; private readonly int totalPages; @@ -30,7 +29,7 @@ public class TemplatedPartialCollectionView : PartialCollectionView /// page size, used to calculate last page index /// additional template parameters public TemplatedPartialCollectionView( - UriTemplate template, + UriTemplate.Core.UriTemplate template, string pageVariable, long totalItems, int page, diff --git a/src/Argolis.Hydra/Serialization/VariableRepresentationConverter.cs b/src/Argolis.Hydra/Serialization/VariableRepresentationConverter.cs index 4af6fd9..5168127 100644 --- a/src/Argolis.Hydra/Serialization/VariableRepresentationConverter.cs +++ b/src/Argolis.Hydra/Serialization/VariableRepresentationConverter.cs @@ -12,13 +12,11 @@ internal class VariableRepresentationConverter : JsonConverter /// public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { - if (value is VariableRepresentation variableRepresentation) + if (value is VariableRepresentation) { - var uri = Vocab.Hydra.BaseUri + variableRepresentation; - writer.WriteStartObject(); writer.WritePropertyName(JsonLdKeywords.Id); - writer.WriteValue(uri); + writer.WriteValue(Vocab.Hydra.BaseUri + value); writer.WriteEndObject(); } else diff --git a/src/Argolis.Hydra/Settings.StyleCop b/src/Argolis.Hydra/Settings.StyleCop deleted file mode 100644 index bc74059..0000000 --- a/src/Argolis.Hydra/Settings.StyleCop +++ /dev/null @@ -1,10 +0,0 @@ - - - VersionAssemblyInfo.cs - - - False - - - - \ No newline at end of file diff --git a/src/Argolis.Hydra/app.config b/src/Argolis.Hydra/app.config deleted file mode 100644 index 5166e0b..0000000 --- a/src/Argolis.Hydra/app.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - True - - - - diff --git a/src/Argolis.Hydra/paket.references b/src/Argolis.Hydra/paket.references deleted file mode 100644 index 293f740..0000000 --- a/src/Argolis.Hydra/paket.references +++ /dev/null @@ -1,11 +0,0 @@ -NullGuard.Fody -JsonLd.Entities -JetBrainsAnnotations.Fody -JetBrains.Annotations -Resourcer.Fody -GitVersionTask -TunnelVisionLabs.Net.UriTemplate -StyleCop.Analyzers -Rdf.Vocabularies -tpluscode.Library.Ruleset -UriTemplateString \ No newline at end of file diff --git a/src/Argolis.Hydra/paket.template b/src/Argolis.Hydra/paket.template deleted file mode 100644 index 2dec1de..0000000 --- a/src/Argolis.Hydra/paket.template +++ /dev/null @@ -1,23 +0,0 @@ -type project -id Argolis.Hydra -include-pdbs true -excludeddependencies - GitVersionTask - tpluscode.Library.Ruleset - JetBrains.Annotations -dependencies - JsonLd.Entities >= LOCKEDVERSION - Rdf.Vocabularies >= LOCKEDVERSION -frameworkAssemblies - System.Runtime.Serialization - System.ComponentModel.DataAnnotations -iconUrl - https://raw.githubusercontent.com/wikibus/Argolis/master/assets/logo.png -tags - rdf rest hydra nancy semantic web json-ld -copyright - Copyright 2016 Tomasz Pluskiewicz -licenseUrl - http://www.opensource.org/licenses/mit-license.php -projectUrl - https://github.com/wikibus/Argolis diff --git a/src/Argolis.Models.TunnelVisionLabs/Argolis.Models.TunnelVisionLabs.csproj b/src/Argolis.Models.TunnelVisionLabs/Argolis.Models.TunnelVisionLabs.csproj deleted file mode 100644 index ab1d3a6..0000000 --- a/src/Argolis.Models.TunnelVisionLabs/Argolis.Models.TunnelVisionLabs.csproj +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - Debug - AnyCPU - {6AC20D75-35CF-4385-912E-BC7E381AD3A0} - Library - Properties - Argolis.Models.TunnelVisionLabs - Argolis.Models.TunnelVisionLabs - v4.5.2 - 512 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - Properties\CommonAssemblyInfo.cs - - - - - - - - - - - - {3FADEBA7-BEA0-4864-B3FD-C17EAC737B35} - Argolis.Models - - - - - Designer - - - - - - - <__paket__GitVersionTask_targets>portable-net+sl+win+wpa+wp\GitVersionTask - - - - - - - <__paket__Fody_targets>net452\Fody - - - - - <__paket__Fody_targets>netstandard1.2\Fody - - - - - <__paket__Fody_targets>portable-net+sl+win+wpa+wp\Fody - - - - - - - - ..\..\packages\Dictionary\lib\Dictionary.dll - True - True - - - - - - - - - ..\..\packages\NullGuard.Fody\lib\netstandard1.0\NullGuard.dll - True - True - - - - - - - - - ..\..\packages\TunnelVisionLabs.Net.UriTemplate\lib\net20\TunnelVisionLabs.Net.UriTemplate.dll - True - True - - - - - - - \ No newline at end of file diff --git a/src/Argolis.Models.TunnelVisionLabs/FodyWeavers.xml b/src/Argolis.Models.TunnelVisionLabs/FodyWeavers.xml deleted file mode 100644 index e315ec6..0000000 --- a/src/Argolis.Models.TunnelVisionLabs/FodyWeavers.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - Dictionary - - - \ No newline at end of file diff --git a/src/Argolis.Models.TunnelVisionLabs/Properties/AssemblyInfo.cs b/src/Argolis.Models.TunnelVisionLabs/Properties/AssemblyInfo.cs deleted file mode 100644 index 6193f4e..0000000 --- a/src/Argolis.Models.TunnelVisionLabs/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,5 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("Handling IRI Templates with TunnelVisionLabs")] -[assembly: Guid("6ac20d75-35cf-4385-912e-bc7e381ad3a0")] \ No newline at end of file diff --git a/src/Argolis.Models.TunnelVisionLabs/paket.references b/src/Argolis.Models.TunnelVisionLabs/paket.references deleted file mode 100644 index 31c944a..0000000 --- a/src/Argolis.Models.TunnelVisionLabs/paket.references +++ /dev/null @@ -1,5 +0,0 @@ -NullGuard.Fody -GitVersionTask -TunnelVisionLabs.Net.UriTemplate -tpluscode.Library.Ruleset -Dictionary \ No newline at end of file diff --git a/src/Argolis.Models.TunnelVisionLabs/paket.template b/src/Argolis.Models.TunnelVisionLabs/paket.template deleted file mode 100644 index c8e7e36..0000000 --- a/src/Argolis.Models.TunnelVisionLabs/paket.template +++ /dev/null @@ -1,19 +0,0 @@ -type project -id Argolis.Models.TunnelVisionLabs -include-pdbs true -excludeddependencies - GitVersionTask - Dictionary - Costura.Fody -dependencies - TunnelVisionLabs.Net.UriTemplate >= LOCKEDVERSION -iconUrl - https://raw.githubusercontent.com/wikibus/Argolis/master/assets/logo.png -tags - rdf rest nancy semantic web -copyright - Copyright 2016 Tomasz Pluskiewicz -licenseUrl - http://www.opensource.org/licenses/mit-license.php -projectUrl - https://github.com/wikibus/Argolis diff --git a/src/Argolis.Models/Argolis.Models.csproj b/src/Argolis.Models/Argolis.Models.csproj index bbacb5a..31a6dbc 100644 --- a/src/Argolis.Models/Argolis.Models.csproj +++ b/src/Argolis.Models/Argolis.Models.csproj @@ -1,124 +1,48 @@  - - - + - Debug - AnyCPU - {3FADEBA7-BEA0-4864-B3FD-C17EAC737B35} Library - Properties Argolis.Models Argolis.Models - v4.5 - 512 - - - true + netstandard1.5 + false + false + false + false + false + false + bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - bin\Debug\Argolis.Models.XML - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - bin\Release\Argolis.Models.XML + true + rdf;rest;nancy;semantic web + MIT + https://github.com/wikibus/Argolis + https://github.com/wikibus/Argolis + git + https://raw.githubusercontent.com/wikibus/Argolis/master/assets/logo.png + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb - - - - - - - - - - Properties\CommonAssemblyInfo.cs - - - - - - - - - - - - - - - - - - - - - - <__paket__GitVersionTask_targets>portable-net+sl+win+wpa+wp\GitVersionTask - - - - - - - <__paket__Fody_targets>net452\Fody - - - - - <__paket__Fody_targets>netstandard1.2\Fody - - - - - <__paket__Fody_targets>portable-net+sl+win+wpa+wp\Fody - - - - - - - Designer - - - - - - ..\..\packages\NullGuard.Fody\lib\netstandard1.0\NullGuard.dll - True - True - - - - - - - - True - - - True - + + all + runtime; build; native; contentfiles; analyzers + + + all + + + all + + + all + + + all + \ No newline at end of file diff --git a/src/Argolis.Models/AttributeModelTemplateProvider.cs b/src/Argolis.Models/AttributeModelTemplateProvider.cs index 6ae9ed3..c828c4e 100644 --- a/src/Argolis.Models/AttributeModelTemplateProvider.cs +++ b/src/Argolis.Models/AttributeModelTemplateProvider.cs @@ -59,12 +59,12 @@ protected virtual TemplateAttributeBase GetTemplateAttribute(Type type) { if (type.IsConstructedGenericType) { - var genericTypeAttributes = type.GetGenericArguments()[0].GetCustomAttributes(); + var genericTypeAttributes = type.GetTypeInfo().GetGenericArguments()[0].GetTypeInfo().GetCustomAttributes(); return genericTypeAttributes.First(attr => attr.ContainerType.TypeHandle.Equals(type.GetGenericTypeDefinition().TypeHandle)); } - return type.GetCustomAttribute(); + return type.GetTypeInfo().GetCustomAttribute(); } private string GetIdentifierTemplate(Type type) diff --git a/src/Argolis.Models/FodyWeavers.xml b/src/Argolis.Models/FodyWeavers.xml index a4cb88b..e888f0c 100644 --- a/src/Argolis.Models/FodyWeavers.xml +++ b/src/Argolis.Models/FodyWeavers.xml @@ -1,5 +1,4 @@ - - + + - \ No newline at end of file diff --git a/src/Argolis.Models/FodyWeavers.xsd b/src/Argolis.Models/FodyWeavers.xsd new file mode 100644 index 0000000..f4d1bb6 --- /dev/null +++ b/src/Argolis.Models/FodyWeavers.xsd @@ -0,0 +1,63 @@ + + + + + + + + + + + Used to control whether asserts are added into debug builds or not. + + + + + The operation mode of NullGuard. + + + + + + Automatically detect the mode by the usage of JetBrains.Annotations. + + + + + In implicit mode everything is assumed to be not-null, unless attributed with [AllowNull]. + + + + + In explicit mode everything is assumed to be nullable, unless attributed with [NotNull]. + + + + + + + + A regular expression to specify the names of a classes to exclude from NullGuard. + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/Argolis.Models/GenericResourceIdentifierTemplateAttribute.cs b/src/Argolis.Models/GenericResourceIdentifierTemplateAttribute.cs index 66749d8..2060788 100644 --- a/src/Argolis.Models/GenericResourceIdentifierTemplateAttribute.cs +++ b/src/Argolis.Models/GenericResourceIdentifierTemplateAttribute.cs @@ -17,7 +17,7 @@ public abstract class GenericResourceIdentifierTemplateAttribute : TemplateAttri protected GenericResourceIdentifierTemplateAttribute(string template, Type containerType) : base(template) { - if (containerType.IsGenericTypeDefinition == false) + if (containerType.GetTypeInfo().IsGenericTypeDefinition == false) { throw new ArgumentException("Container type must be a generic type", nameof(containerType)); } diff --git a/src/Argolis.Models/Properties/AssemblyInfo.cs b/src/Argolis.Models/Properties/AssemblyInfo.cs index d365484..da63131 100644 --- a/src/Argolis.Models/Properties/AssemblyInfo.cs +++ b/src/Argolis.Models/Properties/AssemblyInfo.cs @@ -1,6 +1,8 @@ using System.Reflection; -using System.Runtime.InteropServices; [assembly: AssemblyTitle("Argolis helpers for resources")] [assembly: AssemblyDescription("Library for simpler working with URI identifiers for resources")] -[assembly: Guid("3fadeba7-bea0-4864-b3fd-c17eac737b35")] + +[assembly: AssemblyVersion("0.3.0.0")] +[assembly: AssemblyFileVersion("0.3.0.0")] +[assembly: AssemblyInformationalVersion("0.3.0-net-standard.1+17.Branch.net-standard.Sha.135579857255b4ca1996cbd6ed4ed93bcbe122fd")] diff --git a/src/Argolis.Models/paket.references b/src/Argolis.Models/paket.references deleted file mode 100644 index a9b9332..0000000 --- a/src/Argolis.Models/paket.references +++ /dev/null @@ -1,5 +0,0 @@ -NullGuard.Fody -GitVersionTask -StyleCop.Analyzers -JetBrainsAnnotations.Fody -tpluscode.Library.Ruleset \ No newline at end of file diff --git a/src/Argolis.Models/paket.template b/src/Argolis.Models/paket.template deleted file mode 100644 index 2e3ea1e..0000000 --- a/src/Argolis.Models/paket.template +++ /dev/null @@ -1,15 +0,0 @@ -type project -id Argolis.Models -include-pdbs true -excludeddependencies - GitVersionTask -iconUrl - https://raw.githubusercontent.com/wikibus/Argolis/master/assets/logo.png -tags - rdf rest nancy semantic web -copyright - Copyright 2016 Tomasz Pluskiewicz -licenseUrl - http://www.opensource.org/licenses/mit-license.php -projectUrl - https://github.com/wikibus/Argolis diff --git a/src/Argolis.Nancy/Argolis.Nancy.csproj b/src/Argolis.Nancy/Argolis.Nancy.csproj index 7646547..4abce6d 100644 --- a/src/Argolis.Nancy/Argolis.Nancy.csproj +++ b/src/Argolis.Nancy/Argolis.Nancy.csproj @@ -1,175 +1,56 @@  - - - + - Debug - AnyCPU - {4EC11162-751B-4E73-A3C6-435BD7CAE9BA} - Library - Properties Argolis.Nancy Argolis.Nancy - v4.5.2 - 512 - - - true + netstandard2.0;net461 + false + false + false + false + false + false + bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - false - bin\Debug\Lernaean.Hydra.Nancy.XML - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - false - bin\Release\Lernaean.Hydra.Nancy.XML + true + rdf;rest;nancy;semantic web;json-ld + MIT + https://github.com/wikibus/Argolis + https://github.com/wikibus/Argolis + git + https://raw.githubusercontent.com/wikibus/Argolis/master/assets/logo.png + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb - - - - - + - - - Properties\CommonAssemblyInfo.cs - - - - - - - {cbcac4dc-129d-4f36-96d5-19b14f18cf18} - Argolis.Hydra.Nancy - - - {f8b427f1-aeeb-481b-8d51-a53af4ef0813} - Argolis.Hydra - - - {3FADEBA7-BEA0-4864-B3FD-C17EAC737B35} - Argolis.Models - - - - - - - - - - <__paket__GitVersionTask_targets>portable-net+sl+win+wpa+wp\GitVersionTask - - - - - - - <__paket__Fody_targets>net452\Fody - - - - - <__paket__Fody_targets>netstandard1.2\Fody - - - - - <__paket__Fody_targets>portable-net+sl+win+wpa+wp\Fody - - - - - - Designer - + - - - - - ..\..\packages\Nancy\lib\net452\Nancy.dll - True - True - - - - - - - - - ..\..\packages\Nancy.Routing.UriTemplates\lib\net452\Nancy.Routing.UriTemplates.dll - True - True - - - - - - - - - ..\..\packages\NullGuard.Fody\lib\netstandard1.0\NullGuard.dll - True - True - - - - - - - - True - - - True - + + all + runtime; build; native; contentfiles; analyzers + + + all + + + all + + + all + + + + + + all + - - - - - ..\..\packages\TunnelVisionLabs.Net.UriTemplate\lib\net20\TunnelVisionLabs.Net.UriTemplate.dll - True - True - - - - - - - - - ..\..\packages\UriTemplateString\lib\net45\UriTemplateString.dll - True - True - - - - \ No newline at end of file diff --git a/src/Argolis.Nancy/FodyWeavers.xml b/src/Argolis.Nancy/FodyWeavers.xml index b1e2849..e888f0c 100644 --- a/src/Argolis.Nancy/FodyWeavers.xml +++ b/src/Argolis.Nancy/FodyWeavers.xml @@ -1,4 +1,4 @@ - - + + \ No newline at end of file diff --git a/src/Argolis.Nancy/FodyWeavers.xsd b/src/Argolis.Nancy/FodyWeavers.xsd new file mode 100644 index 0000000..f4d1bb6 --- /dev/null +++ b/src/Argolis.Nancy/FodyWeavers.xsd @@ -0,0 +1,63 @@ + + + + + + + + + + + Used to control whether asserts are added into debug builds or not. + + + + + The operation mode of NullGuard. + + + + + + Automatically detect the mode by the usage of JetBrains.Annotations. + + + + + In implicit mode everything is assumed to be not-null, unless attributed with [AllowNull]. + + + + + In explicit mode everything is assumed to be nullable, unless attributed with [NotNull]. + + + + + + + + A regular expression to specify the names of a classes to exclude from NullGuard. + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/Argolis.Nancy/Properties/AssemblyInfo.cs b/src/Argolis.Nancy/Properties/AssemblyInfo.cs index b5ecb0c..ae94a4f 100644 --- a/src/Argolis.Nancy/Properties/AssemblyInfo.cs +++ b/src/Argolis.Nancy/Properties/AssemblyInfo.cs @@ -4,3 +4,7 @@ [assembly: AssemblyTitle("Argolis.Nancy")] [assembly: AssemblyDescription("Meta-package for installing Argolis in Nancy application")] [assembly: Guid("4ec11162-751b-4e73-a3c6-435bd7cae9ba")] + +[assembly: AssemblyVersion("0.3.0.0")] +[assembly: AssemblyFileVersion("0.3.0.0")] +[assembly: AssemblyInformationalVersion("0.3.0-net-standard.1+17.Branch.net-standard.Sha.135579857255b4ca1996cbd6ed4ed93bcbe122fd")] diff --git a/src/Argolis.Nancy/paket.references b/src/Argolis.Nancy/paket.references deleted file mode 100644 index 7652734..0000000 --- a/src/Argolis.Nancy/paket.references +++ /dev/null @@ -1,6 +0,0 @@ -NullGuard.Fody -GitVersionTask -StyleCop.Analyzers -Nancy -Nancy.Routing.UriTemplates -tpluscode.Library.Ruleset \ No newline at end of file diff --git a/src/Argolis.Nancy/paket.template b/src/Argolis.Nancy/paket.template deleted file mode 100644 index f2c1e8a..0000000 --- a/src/Argolis.Nancy/paket.template +++ /dev/null @@ -1,16 +0,0 @@ -type project -id Argolis.Nancy -excludeddependencies - GitVersionTask -dependencies - Nancy >= LOCKEDVERSION -iconUrl - https://raw.githubusercontent.com/wikibus/Argolis/master/assets/logo.png -tags - rdf rest hydra nancy semantic web json-ld -copyright - Copyright 2016 Tomasz Pluskiewicz -licenseUrl - http://www.opensource.org/licenses/mit-license.php -projectUrl - https://github.com/wikibus/Argolis diff --git a/src/Argolis.Tests.Integration/Argolis.Tests.Integration.csproj b/src/Argolis.Tests.Integration/Argolis.Tests.Integration.csproj index df8f92d..6de8fa4 100644 --- a/src/Argolis.Tests.Integration/Argolis.Tests.Integration.csproj +++ b/src/Argolis.Tests.Integration/Argolis.Tests.Integration.csproj @@ -1,321 +1,74 @@  - - - - + - Debug - AnyCPU - {41F8C2F5-8B83-430B-9AFE-21DCFD84AF54} - Library - Properties Argolis.Tests.Integration Argolis.Tests.Integration - v4.5.2 - 512 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 + netcoreapp2.0 + false + false + false + false + false + false + true + NU1605 - - - - - - - - - - - Designer - - Properties\CommonAssemblyInfo.cs - - - - - - - - - - {1d2e686f-381d-4700-b062-67ac029c0daf} - TestNancyApp - - - {cbcac4dc-129d-4f36-96d5-19b14f18cf18} - Argolis.Hydra.Nancy - - - {f8b427f1-aeeb-481b-8d51-a53af4ef0813} - Argolis.Hydra - - - - - - - <__paket__GitVersionTask_targets>portable-net+sl+win+wpa+wp\GitVersionTask - - - - - - - - - ..\..\packages\AngleSharp\lib\net45\AngleSharp.dll - True - True - - - - - - - True - - - - - - ..\..\packages\dotNetRDF\lib\net40\dotNetRDF.dll - True - True - - - - - - - - - ..\..\packages\FluentAssertions\lib\net45\FluentAssertions.dll - True - True - - - ..\..\packages\FluentAssertions\lib\net45\FluentAssertions.Core.dll - True - True - - - - - - - - - ..\..\packages\HtmlAgilityPack\lib\Net45\HtmlAgilityPack.dll - True - True - - - - - - - - - ..\..\packages\json-ld.net\lib\net40-client\json-ld.net.dll - True - True - - - - - - - - - ..\..\packages\JsonLd.Entities\lib\net40\JsonLD.Entities.dll - True - True - - - - - - - - - ..\..\packages\Nancy\lib\net452\Nancy.dll - True - True - - - - - - - - - ..\..\packages\Nancy.Authentication.Forms\lib\net452\Nancy.Authentication.Forms.dll - True - True - - - - - - - - - ..\..\packages\Nancy.Rdf\lib\net452\Nancy.Rdf.dll - True - True - - - - - - - - - ..\..\packages\Nancy.Testing\lib\net452\Nancy.Testing.dll - True - True - - - - - - - - - ..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll - True - True - - - - - - - - - ..\..\packages\Rdf.Vocabularies\lib\portable-net45+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1\Rdf.Vocabularies.dll - True - True - - - - - - - - True - - - True - + + + + + + - - - - - ..\..\packages\System.Runtime.InteropServices.RuntimeInformation\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll - True - True - - - - - - - - - ..\..\packages\VDS.Common\lib\net40-client\VDS.Common.dll - True - True - - - - - - - - - ..\..\packages\xunit.abstractions\lib\net35\xunit.abstractions.dll - True - True - - - - - - True - + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - ..\..\packages\xunit.assert\lib\netstandard1.1\xunit.assert.dll - True - True - - - - - - - - - ..\..\packages\xunit.extensibility.core\lib\netstandard1.1\xunit.core.dll - True - True - - - - - - - - - ..\..\packages\xunit.extensibility.execution\lib\net452\xunit.execution.desktop.dll - True - True - - - - - - - ..\..\packages\xunit.extensibility.execution\lib\netstandard1.1\xunit.execution.dotnet.dll - True - True - - - - - \ No newline at end of file diff --git a/src/Argolis.Tests.Integration/FodyWeavers.xml b/src/Argolis.Tests.Integration/FodyWeavers.xml new file mode 100644 index 0000000..12e0515 --- /dev/null +++ b/src/Argolis.Tests.Integration/FodyWeavers.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/Argolis.Tests.Integration/FodyWeavers.xsd b/src/Argolis.Tests.Integration/FodyWeavers.xsd new file mode 100644 index 0000000..f4d1bb6 --- /dev/null +++ b/src/Argolis.Tests.Integration/FodyWeavers.xsd @@ -0,0 +1,63 @@ + + + + + + + + + + + Used to control whether asserts are added into debug builds or not. + + + + + The operation mode of NullGuard. + + + + + + Automatically detect the mode by the usage of JetBrains.Annotations. + + + + + In implicit mode everything is assumed to be not-null, unless attributed with [AllowNull]. + + + + + In explicit mode everything is assumed to be nullable, unless attributed with [NotNull]. + + + + + + + + A regular expression to specify the names of a classes to exclude from NullGuard. + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/Argolis.Tests.Integration/IntegrationTests.cs b/src/Argolis.Tests.Integration/IntegrationTests.cs index bfc1ce4..44ae06d 100644 --- a/src/Argolis.Tests.Integration/IntegrationTests.cs +++ b/src/Argolis.Tests.Integration/IntegrationTests.cs @@ -1,12 +1,12 @@ using System; +using System.Net; +using System.Net.Http; using System.Threading.Tasks; using Argolis.Hydra.Core; using FluentAssertions; -using Nancy; -using Nancy.Responses.Negotiation; -using Nancy.Testing; +using Microsoft.AspNetCore.Mvc.Testing; using Newtonsoft.Json; -using TestNancyApp.Bootstrap; +using TestHydraApp; using VDS.RDF; using VDS.RDF.Parsing; using VDS.RDF.Query.Builder; @@ -18,11 +18,14 @@ namespace Argolis.Tests.Integration public class IntegrationTests { private const string ExpectedApiDocPath = "http://hydra.guru/api"; - private readonly Browser browser; + private readonly HttpClient browser; public IntegrationTests() { - this.browser = new Browser(new Bootstrapper(), context => context.HostName("hydra.guru")); + this.browser = new WebApplicationFactory().CreateClient(new WebApplicationFactoryClientOptions + { + BaseAddress = new Uri("http://hydra.guru") + }); } [Fact] @@ -31,6 +34,8 @@ public async Task Should_include_supported_class_in_documentation_response() // when var documentation = await this.GetDocumentationGraph(); + Console.WriteLine(documentation.Triples.Count); + // then var query = QueryBuilder.Ask() .Where(tpb => tpb.Subject("doc").PredicateUri(new Uri(Rdf.type)).Object(new Uri(Vocab.Hydra.ApiDocumentation))) @@ -156,10 +161,16 @@ public async Task Should_include_hydra_base_types_as_supported_classes(string ex public async Task Should_serve_API_doc_with_correct_Id() { // when - var response = await this.browser.Get("api", context => context.Accept(new MediaRange("application/json"))); + var response = await this.browser.SendAsync(new HttpRequestMessage(HttpMethod.Get, "api") + { + Headers = + { + { "Accept", "application/json" } + } + }); // then - var asString = response.Body.AsString(); + var asString = await response.Content.ReadAsStringAsync(); dynamic apiDoc = JsonConvert.DeserializeObject(asString); ((string)apiDoc.id).Should().Be(ExpectedApiDocPath); @@ -194,11 +205,17 @@ public async Task Should_not_contain_duplicate_operations() private async Task GetDocumentationGraph() { - var response = await this.browser.Get("api", context => { context.Accept("text/turtle"); }); + var response = await this.browser.SendAsync(new HttpRequestMessage(HttpMethod.Get, "api") + { + Headers = + { + { "Accept", "text/turtle" } + } + }); response.StatusCode.Should().Be(HttpStatusCode.OK); - return response.Body.AsRdf(); + return (await response.Content.ReadAsStreamAsync()).AsRdf(); } } } \ No newline at end of file diff --git a/src/Argolis.Tests.Integration/Properties/AssemblyInfo.cs b/src/Argolis.Tests.Integration/Properties/AssemblyInfo.cs index 20615de..c14dab4 100644 --- a/src/Argolis.Tests.Integration/Properties/AssemblyInfo.cs +++ b/src/Argolis.Tests.Integration/Properties/AssemblyInfo.cs @@ -2,4 +2,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyTitle("Hydra hypermedia integration test")] -[assembly: Guid("41f8c2f5-8b83-430b-9afe-21dcfd84af54")] \ No newline at end of file +[assembly: Guid("41f8c2f5-8b83-430b-9afe-21dcfd84af54")] +[assembly: AssemblyVersion("0.3.0.0")] +[assembly: AssemblyFileVersion("0.3.0.0")] +[assembly: AssemblyInformationalVersion("0.3.0-net-standard.1+17.Branch.net-standard.Sha.135579857255b4ca1996cbd6ed4ed93bcbe122fd")] diff --git a/src/Argolis.Tests.Integration/Properties/launchSettings.json b/src/Argolis.Tests.Integration/Properties/launchSettings.json new file mode 100644 index 0000000..1172622 --- /dev/null +++ b/src/Argolis.Tests.Integration/Properties/launchSettings.json @@ -0,0 +1,9 @@ +{ + "profiles": { + "Argolis.Tests.Integration": { + "commandName": "Executable", + "executablePath": "dotnet", + "commandLineArgs": "test" + } + } +} \ No newline at end of file diff --git a/src/Argolis.Tests.Integration/TestExtension.cs b/src/Argolis.Tests.Integration/TestExtension.cs index 5c533ec..d31dafe 100644 --- a/src/Argolis.Tests.Integration/TestExtension.cs +++ b/src/Argolis.Tests.Integration/TestExtension.cs @@ -2,7 +2,6 @@ using System.IO; using FluentAssertions; using FluentAssertions.Primitives; -using Nancy.Testing; using VDS.RDF; using VDS.RDF.Query; using VDS.RDF.Query.Datasets; @@ -13,13 +12,13 @@ namespace Argolis.Tests.Integration { public static class TestExtension { - public static IGraph AsRdf(this BrowserResponseBodyWrapper body) + public static IGraph AsRdf(this Stream body) { IGraph graph = new Graph(); graph.NamespaceMap.AddNamespace("hydra", new Uri(Vocab.Hydra.BaseUri)); graph.NamespaceMap.AddNamespace("ex", new Uri("http://example.api/o#")); - using (var reader = new StreamReader(body.AsStream())) + using (var reader = new StreamReader(body)) { new VDS.RDF.Parsing.TurtleParser().Load(graph, reader); } @@ -41,7 +40,7 @@ public GraphAssertions(IGraph graph) this.graph = graph; } - protected override string Context + protected override string Identifier { get { return "Graph"; } } diff --git a/src/Argolis.Tests.Integration/app.config b/src/Argolis.Tests.Integration/app.config deleted file mode 100644 index 843ce66..0000000 --- a/src/Argolis.Tests.Integration/app.config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - True - - - - - True - - - - - True - - - - diff --git a/src/Argolis.Tests.Integration/paket.references b/src/Argolis.Tests.Integration/paket.references deleted file mode 100644 index 9c8b420..0000000 --- a/src/Argolis.Tests.Integration/paket.references +++ /dev/null @@ -1,10 +0,0 @@ -GitVersionTask -xunit -fluentassertions -Nancy.Testing -Rdf.Vocabularies -dotnetrdf -json-ld.net -nancy.rdf -StyleCop.Analyzers -tpluscode.UnitTests.Ruleset \ No newline at end of file diff --git a/src/Argolis.Tests/ApiDocumentation/DefaultSupportedOperationFactoryTests.cs b/src/Argolis.Tests/ApiDocumentation/DefaultSupportedOperationFactoryTests.cs index 728f1e8..f75201b 100644 --- a/src/Argolis.Tests/ApiDocumentation/DefaultSupportedOperationFactoryTests.cs +++ b/src/Argolis.Tests/ApiDocumentation/DefaultSupportedOperationFactoryTests.cs @@ -148,7 +148,7 @@ public void PUT_operation_should_always_expect_model_type() A.CallTo(() => this.operations.Type).Returns(typeof(Issue)); A.CallTo(() => this.operations.GetSupportedClassOperations()).Returns(new[] { - new OperationMeta { Method = HttpMethod.Put, Expects = (IriRef)Foaf.Agent } + new OperationMeta { Method = HttpMethod.Put, Expects = (IriRef)Foaf.Person } }); // when diff --git a/src/Argolis.Tests/ApiDocumentation/SupportedOperationBuilderTests.cs b/src/Argolis.Tests/ApiDocumentation/SupportedOperationBuilderTests.cs index b74f089..d2d444c 100644 --- a/src/Argolis.Tests/ApiDocumentation/SupportedOperationBuilderTests.cs +++ b/src/Argolis.Tests/ApiDocumentation/SupportedOperationBuilderTests.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using Argolis.Hydra.Discovery.SupportedOperations; +using Dynamitey; using FluentAssertions; -using ImpromptuInterface; using JsonLD.Entities; using Vocab; using Xunit; @@ -28,7 +28,7 @@ public SupportedOperationBuilderTests() public void Should_store_operation_meta_with_correct_method(string operationMethodName, string expectedMethod) { // when - Impromptu.InvokeMember(this.builder, operationMethodName); + Dynamic.InvokeMember(this.builder, operationMethodName); // then this.operations.Should().Contain(meta => meta.Method == expectedMethod); diff --git a/src/Argolis.Tests/Argolis.Tests.csproj b/src/Argolis.Tests/Argolis.Tests.csproj index 20b25e2..b7ed9ba 100644 --- a/src/Argolis.Tests/Argolis.Tests.csproj +++ b/src/Argolis.Tests/Argolis.Tests.csproj @@ -1,455 +1,53 @@  - - - - + - Debug - AnyCPU - {1167173B-16E1-4A0E-80D6-60A3E600E955} - Library - Properties Argolis.Tests Argolis.Tests - v4.5.2 - 512 - + netcoreapp2.0 + false + false + false + false + false + false - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - Designer - - Properties\CommonAssemblyInfo.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {6AC20D75-35CF-4385-912E-BC7E381AD3A0} - Argolis.Models.TunnelVisionLabs - - - {3FADEBA7-BEA0-4864-B3FD-C17EAC737B35} - Argolis.Models - - - {4EC11162-751B-4E73-A3C6-435BD7CAE9BA} - Argolis.Nancy - - - {378ae219-5cef-41ed-839a-1e8343754056} - TestHydraApi - - - {1D2E686F-381D-4700-B062-67AC029C0DAF} - TestNancyApp - - - {CBCAC4DC-129D-4F36-96D5-19B14F18CF18} - Argolis.Hydra.Nancy - - - {F8B427F1-AEEB-481B-8D51-A53AF4EF0813} - Argolis.Hydra - - - - - Designer - - - - - - - <__paket__GitVersionTask_targets>portable-net+sl+win+wpa+wp\GitVersionTask - - - - - - - <__paket__Fody_targets>net452\Fody - - - - - <__paket__Fody_targets>netstandard1.2\Fody - - - - - <__paket__Fody_targets>portable-net+sl+win+wpa+wp\Fody - - - - - - - - - ..\..\packages\AngleSharp\lib\net45\AngleSharp.dll - True - True - - - - - - - True - - - - - - - ..\..\packages\dotNetRDF\lib\net40\dotNetRDF.dll - True - True - - - - - - - - - ..\..\packages\FakeItEasy\lib\net45\FakeItEasy.dll - True - True - - - - - - - - - ..\..\packages\FluentAssertions\lib\net45\FluentAssertions.dll - True - True - - - ..\..\packages\FluentAssertions\lib\net45\FluentAssertions.Core.dll - True - True - - - - - - - - - ..\..\packages\HtmlAgilityPack\lib\Net45\HtmlAgilityPack.dll - True - True - - - - - - - - - ..\..\packages\ImpromptuInterface\lib\net40\ImpromptuInterface.dll - True - True - - - - - - - - - ..\..\packages\json-ld.net\lib\net40-client\json-ld.net.dll - True - True - - - - - - - - - ..\..\packages\JsonLd.Entities\lib\net40\JsonLD.Entities.dll - True - True - - - - - - - - - ..\..\packages\Nancy\lib\net452\Nancy.dll - True - True - - - - - - - - - ..\..\packages\Nancy.Authentication.Forms\lib\net452\Nancy.Authentication.Forms.dll - True - True - - - - - - - - - ..\..\packages\Nancy.Routing.UriTemplates\lib\net452\Nancy.Routing.UriTemplates.dll - True - True - - - - - - - - - ..\..\packages\Nancy.Testing\lib\net452\Nancy.Testing.dll - True - True - - - - - - - - - ..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll - True - True - - - - - - - - - ..\..\packages\NullGuard.Fody\lib\netstandard1.0\NullGuard.dll - True - True - - - - - - - - - ..\..\packages\Rdf.Vocabularies\lib\portable-net45+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1\Rdf.Vocabularies.dll - True - True - - - - - - - - - ..\..\packages\Resourcer.Fody\lib\net452\Resourcer.dll - True - True - - - - - - - - - - True - - - True - - - - - - ..\..\packages\System.Runtime.InteropServices.RuntimeInformation\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll - True - True - - - - - - - - - ..\..\packages\TunnelVisionLabs.Net.UriTemplate\lib\net20\TunnelVisionLabs.Net.UriTemplate.dll - True - True - - - - - - - - - ..\..\packages\UriTemplateString\lib\net45\UriTemplateString.dll - True - True - - - - - - - - - ..\..\packages\VDS.Common\lib\net40-client\VDS.Common.dll - True - True - - - - - - - - - ..\..\packages\xunit.abstractions\lib\net35\xunit.abstractions.dll - True - True - - - - - - True - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + - - - - - ..\..\packages\xunit.assert\lib\netstandard1.1\xunit.assert.dll - True - True - - - - - - - - - ..\..\packages\xunit.extensibility.core\lib\netstandard1.1\xunit.core.dll - True - True - - - - - - - - - ..\..\packages\xunit.extensibility.execution\lib\net452\xunit.execution.desktop.dll - True - True - - - - - - - ..\..\packages\xunit.extensibility.execution\lib\netstandard1.1\xunit.execution.dotnet.dll - True - True - - - - - \ No newline at end of file diff --git a/src/Argolis.Tests/ArgolisModuleTests.cs b/src/Argolis.Tests/ArgolisModuleTests.cs index 2e36ca4..2be22c0 100644 --- a/src/Argolis.Tests/ArgolisModuleTests.cs +++ b/src/Argolis.Tests/ArgolisModuleTests.cs @@ -1,5 +1,5 @@ -using System.Linq; -using System.Threading; +using System; +using System.Linq; using System.Threading.Tasks; using Argolis.Models; using Argolis.Nancy; @@ -11,15 +11,16 @@ namespace Argolis.Tests { public class ArgolisModuleTests { - private const string TestPath = "some/path{?s,p,q,r}"; - private readonly ArgolisModule module; + private const string TestPath = "/some/path{?s,p,q,r}"; + private static readonly Func Action = _ => new object(); + private readonly ArgolisModuleTestable module; public ArgolisModuleTests() { var templates = A.Fake(); A.CallTo(() => templates.GetTemplate(typeof(object))).Returns(TestPath); - this.module = new ArgolisModule(templates); + this.module = new ArgolisModuleTestable(templates); } [Fact] @@ -176,14 +177,22 @@ public void Should_add_async_DELETE_route_with_path_from_identifier_provider() this.module.Routes.Should().HaveCount(1); } - private static object Action(object p) + private static Task AsyncAction(dynamic p) { - return new object(); + return Task.FromResult(new object()); } - private static Task AsyncAction(object p) + private class ArgolisModuleTestable : ArgolisModule { - return Task.FromResult(new object()); + public ArgolisModuleTestable(IModelTemplateProvider provider) + : base(provider) + { + } + + public ArgolisModuleTestable(IModelTemplateProvider provider, string modulePath) + : base(provider, modulePath) + { + } } } } \ No newline at end of file diff --git a/src/Argolis.Tests/FodyWeavers.xml b/src/Argolis.Tests/FodyWeavers.xml index f04f026..bbaff3f 100644 --- a/src/Argolis.Tests/FodyWeavers.xml +++ b/src/Argolis.Tests/FodyWeavers.xml @@ -1,5 +1,5 @@ - - + + - + \ No newline at end of file diff --git a/src/Argolis.Tests/FodyWeavers.xsd b/src/Argolis.Tests/FodyWeavers.xsd new file mode 100644 index 0000000..6b4af76 --- /dev/null +++ b/src/Argolis.Tests/FodyWeavers.xsd @@ -0,0 +1,64 @@ + + + + + + + + + + + + Used to control whether asserts are added into debug builds or not. + + + + + The operation mode of NullGuard. + + + + + + Automatically detect the mode by the usage of JetBrains.Annotations. + + + + + In implicit mode everything is assumed to be not-null, unless attributed with [AllowNull]. + + + + + In explicit mode everything is assumed to be nullable, unless attributed with [NotNull]. + + + + + + + + A regular expression to specify the names of a classes to exclude from NullGuard. + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/Argolis.Tests/Models/AttributeModelTemplateProviderTests.cs b/src/Argolis.Tests/Models/AttributeModelTemplateProviderTests.cs index ecf7d03..d96618f 100644 --- a/src/Argolis.Tests/Models/AttributeModelTemplateProviderTests.cs +++ b/src/Argolis.Tests/Models/AttributeModelTemplateProviderTests.cs @@ -66,7 +66,7 @@ public void Getting_template_for_Hydra_collection_should_retrieve_it_from_attrib } [Fact] - public void Getting_absoulte_template_should_throw_wen_there_is_no_base_URI() + public void Getting_absoulte_template_should_throw_when_there_is_no_base_URI() { // given var type = typeof(Collection); @@ -82,6 +82,10 @@ public class ModelWithTemplate { } + public class MyClass + { + } + private class FakeBaseUriProvider : IBaseUriProvider { public string BaseResourceUri => "http://example.com/"; diff --git a/src/Argolis.Tests/Models/TunnelVisionLabsUriTemplateExpanderTests.cs b/src/Argolis.Tests/Models/DefaultUriTemplateExpanderTests.cs similarity index 93% rename from src/Argolis.Tests/Models/TunnelVisionLabsUriTemplateExpanderTests.cs rename to src/Argolis.Tests/Models/DefaultUriTemplateExpanderTests.cs index 0611fa8..2c1338b 100644 --- a/src/Argolis.Tests/Models/TunnelVisionLabsUriTemplateExpanderTests.cs +++ b/src/Argolis.Tests/Models/DefaultUriTemplateExpanderTests.cs @@ -1,22 +1,22 @@ using System; using System.Collections.Generic; +using Argolis.Hydra.Models; using Argolis.Models; -using Argolis.Models.TunnelVisionLabs; using FakeItEasy; using FluentAssertions; using Xunit; namespace Argolis.Tests.Models { - public class TunnelVisionLabsUriTemplateExpanderTests + public class DefaultUriTemplateExpanderTests { - private readonly TunnelVisionLabsUriTemplateExpander expander; + private readonly DefaultUriTemplateExpander expander; private readonly IModelTemplateProvider templates; - public TunnelVisionLabsUriTemplateExpanderTests() + public DefaultUriTemplateExpanderTests() { this.templates = A.Fake(options => options.Strict()); - this.expander = new TunnelVisionLabsUriTemplateExpander(this.templates); + this.expander = new DefaultUriTemplateExpander(this.templates); } [Fact] diff --git a/src/Argolis.Tests/Models/TunnelVisionLabsUriTemplateMatcherTests.cs b/src/Argolis.Tests/Models/DefaultUriTemplateMatcherTests.cs similarity index 86% rename from src/Argolis.Tests/Models/TunnelVisionLabsUriTemplateMatcherTests.cs rename to src/Argolis.Tests/Models/DefaultUriTemplateMatcherTests.cs index 4f2381e..1328917 100644 --- a/src/Argolis.Tests/Models/TunnelVisionLabsUriTemplateMatcherTests.cs +++ b/src/Argolis.Tests/Models/DefaultUriTemplateMatcherTests.cs @@ -1,21 +1,21 @@ using System; +using Argolis.Hydra.Models; using Argolis.Models; -using Argolis.Models.TunnelVisionLabs; using FakeItEasy; using FluentAssertions; using Xunit; namespace Argolis.Tests.Models { - public class TunnelVisionLabsUriTemplateMatcherTests + public class DefaultUriTemplateMatcherTests { - private readonly TunnelVisionLabsUriTemplateMatcher matcher; + private readonly DefaultUriTemplateMatcher matcher; private readonly IModelTemplateProvider templates; - public TunnelVisionLabsUriTemplateMatcherTests() + public DefaultUriTemplateMatcherTests() { this.templates = A.Fake(options => options.Strict()); - this.matcher = new TunnelVisionLabsUriTemplateMatcher(this.templates); + this.matcher = new DefaultUriTemplateMatcher(this.templates); } [Fact] diff --git a/src/Argolis.Tests/PartialCollectionViewTests.cs b/src/Argolis.Tests/PartialCollectionViewTests.cs index 4a8a377..a02ea67 100644 --- a/src/Argolis.Tests/PartialCollectionViewTests.cs +++ b/src/Argolis.Tests/PartialCollectionViewTests.cs @@ -3,7 +3,6 @@ using Argolis.Hydra.Resources; using FluentAssertions; using JsonLD.Entities; -using TunnelVisionLabs.Net; using Xunit; namespace Argolis.Tests @@ -38,7 +37,7 @@ public void Should_be_of_correct_type() public void Should_calculate_page_URIs_given_item_count_and_template() { // given - var template = new UriTemplate("/some/collection{?page}"); + var template = new UriTemplate.Core.UriTemplate("/some/collection{?page}"); long totalItems = 86; int page = 5; int pageSize = 10; @@ -59,7 +58,7 @@ public void Should_calculate_page_URIs_given_item_count_and_template() public void Should_calculate_page_URIs_given_last_page() { // given - var template = new UriTemplate("/some/collection{?page}"); + var template = new UriTemplate.Core.UriTemplate("/some/collection{?page}"); long totalItems = 86; int page = 9; int pageSize = 10; @@ -80,7 +79,7 @@ public void Should_calculate_page_URIs_given_last_page() public void Should_calculate_page_URIs_given_first_page() { // given - var template = new UriTemplate("/some/collection{?page}"); + var template = new UriTemplate.Core.UriTemplate("/some/collection{?page}"); long totalItems = 86; int page = 1; int pageSize = 10; @@ -101,7 +100,7 @@ public void Should_calculate_page_URIs_given_first_page() public void Should_allow_filling_template_with_additional_parameters() { // given - var template = new UriTemplate("/some{;subfilter}/collection{/page}{?filter}"); + var template = new UriTemplate.Core.UriTemplate("/some{;subfilter}/collection{/page}{?filter}"); long totalItems = 86; int page = 1; int pageSize = 10; diff --git a/src/Argolis.Tests/Properties/AssemblyInfo.cs b/src/Argolis.Tests/Properties/AssemblyInfo.cs index 189ef1d..b645a57 100644 --- a/src/Argolis.Tests/Properties/AssemblyInfo.cs +++ b/src/Argolis.Tests/Properties/AssemblyInfo.cs @@ -3,3 +3,7 @@ [assembly: AssemblyTitle("Hydra hypermedia library test")] [assembly: Guid("1167173b-16e1-4a0e-80d6-60a3e600e955")] + +[assembly: AssemblyVersion("0.3.0.0")] +[assembly: AssemblyFileVersion("0.3.0.0")] +[assembly: AssemblyInformationalVersion("0.3.0-net-standard.1+17.Branch.net-standard.Sha.135579857255b4ca1996cbd6ed4ed93bcbe122fd")] diff --git a/src/Argolis.Tests/Resources/PartialCollectionViewTests.cs b/src/Argolis.Tests/Resources/PartialCollectionViewTests.cs index 5fe7bf4..f9af7bd 100644 --- a/src/Argolis.Tests/Resources/PartialCollectionViewTests.cs +++ b/src/Argolis.Tests/Resources/PartialCollectionViewTests.cs @@ -3,7 +3,6 @@ using Argolis.Hydra.Resources; using FluentAssertions; using JsonLD.Entities; -using TunnelVisionLabs.Net; using Xunit; namespace Argolis.Tests.Resources @@ -38,7 +37,7 @@ public void Should_be_of_correct_type() public void Should_calculate_page_URIs_given_item_count_and_template() { // given - var template = new UriTemplate("/some/collection{?page}"); + var template = new UriTemplate.Core.UriTemplate("/some/collection{?page}"); long totalItems = 86; int page = 5; int pageSize = 10; @@ -59,7 +58,7 @@ public void Should_calculate_page_URIs_given_item_count_and_template() public void Should_calculate_page_URIs_given_last_page() { // given - var template = new UriTemplate("/some/collection{?page}"); + var template = new UriTemplate.Core.UriTemplate("/some/collection{?page}"); long totalItems = 86; int page = 9; int pageSize = 10; @@ -80,7 +79,7 @@ public void Should_calculate_page_URIs_given_last_page() public void Should_calculate_page_URIs_given_first_page() { // given - var template = new UriTemplate("/some/collection{?page}"); + var template = new UriTemplate.Core.UriTemplate("/some/collection{?page}"); long totalItems = 86; int page = 1; int pageSize = 10; @@ -101,7 +100,7 @@ public void Should_calculate_page_URIs_given_first_page() public void Should_allow_filling_template_with_additional_parameters() { // given - var template = new UriTemplate("/some{;subfilter}/collection{/page}{?filter}"); + var template = new UriTemplate.Core.UriTemplate("/some{;subfilter}/collection{/page}{?filter}"); long totalItems = 86; int page = 1; int pageSize = 10; diff --git a/src/Argolis.Tests/ServingApiDocumentationTests.cs b/src/Argolis.Tests/ServingApiDocumentationTests.cs index 9515d51..d093955 100644 --- a/src/Argolis.Tests/ServingApiDocumentationTests.cs +++ b/src/Argolis.Tests/ServingApiDocumentationTests.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Threading.Tasks; using Argolis.Hydra; +using Argolis.Hydra.Discovery; using Argolis.Hydra.Discovery.SupportedClasses; using Argolis.Hydra.Discovery.SupportedOperations; using Argolis.Hydra.Nancy; @@ -27,6 +29,7 @@ public ServingApiDocumentationTests() A.CallTo(() => rdfTypeProviderPolicy.Create(A._)) .ReturnsLazily(call => new Uri("http://example.com/class")); + Debugger.Break(); this.browser = new Browser( configurator => { @@ -37,6 +40,7 @@ public ServingApiDocumentationTests() configurator.Dependency(A.Fake()); configurator.Dependency(A.Fake()); configurator.Dependency(A.Fake()); + configurator.Dependency(A.Fake()); configurator.ApplicationStartupTask(); }, context => context.HostName("hydra.guru")); diff --git a/src/Argolis.Tests/TestExtension.cs b/src/Argolis.Tests/TestExtension.cs index 81e1308..6b45346 100644 --- a/src/Argolis.Tests/TestExtension.cs +++ b/src/Argolis.Tests/TestExtension.cs @@ -38,7 +38,7 @@ public GraphAssertions(IGraph graph) this.graph = graph; } - protected override string Context + protected override string Identifier { get { return "Graph"; } } diff --git a/src/Argolis.Tests/app.config b/src/Argolis.Tests/app.config deleted file mode 100644 index 843ce66..0000000 --- a/src/Argolis.Tests/app.config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - True - - - - - True - - - - - True - - - - diff --git a/src/Argolis.Tests/paket.references b/src/Argolis.Tests/paket.references deleted file mode 100644 index abee6d6..0000000 --- a/src/Argolis.Tests/paket.references +++ /dev/null @@ -1,17 +0,0 @@ -NullGuard.Fody -GitVersionTask -xunit -fluentassertions -TunnelVisionLabs.Net.UriTemplate -Resourcer.Fody -JsonLd.Entities -Nancy.Testing -Rdf.Vocabularies -dotnetrdf -json-ld.net -fakeiteasy -ImpromptuInterface -StyleCop.Analyzers -tpluscode.UnitTests.Ruleset -UriTemplateString -Nancy.Routing.UriTemplates \ No newline at end of file diff --git a/src/CommonAssemblyInfo.cs b/src/CommonAssemblyInfo.cs index 3e6f184..d0fac91 100644 --- a/src/CommonAssemblyInfo.cs +++ b/src/CommonAssemblyInfo.cs @@ -2,4 +2,4 @@ [assembly: AssemblyCompany("Tomasz Pluskiewicz")] [assembly: AssemblyProduct("Argolis - Hydra hypermedia core libraries")] -[assembly: AssemblyCopyright("Copyright © Tomasz Pluskiewicz 2016")] +[assembly: AssemblyCopyright("Copyright © Tomasz Pluskiewicz 2016-2019")] diff --git a/src/Examples/TestHydraApi/Issue.cs b/src/Examples/TestHydraApi/Issue.cs index d7dea92..fe75679 100644 --- a/src/Examples/TestHydraApi/Issue.cs +++ b/src/Examples/TestHydraApi/Issue.cs @@ -20,13 +20,13 @@ public class Issue : IssueBase private const string IssueType = "http://example.api/o#Issue"; public string Id { get; set; } - + [JsonProperty("titel")] public string Title { get; set; } - + [Required] public string Content { get; set; } - + [Description("The number of people who liked this issue")] public int LikesCount { get; private set; } @@ -40,9 +40,15 @@ public class Issue : IssueBase public UndocumentedClass UndocumentedClassProperty { get; set; } - public string Method() + private static JToken Context { - return null; + get + { + return new JArray( + new AutoContext(new Uri(IssueType)) + .Property(i => i.ProjectId, builder => builder.Type().Id()), + User.Context); + } } [JsonProperty] @@ -51,16 +57,9 @@ private string Type get { return IssueType; } } - private static JToken Context + public string Method() { - get - { - return new JArray( - new AutoContext(new Uri(IssueType)) - .Property(i => i.ProjectId, builder => builder.Type().Id()), - User.Context - ); - } + return null; } } } diff --git a/src/Examples/TestHydraApi/IssueCollection.cs b/src/Examples/TestHydraApi/IssueCollection.cs index fa3fa80..1d6356c 100644 --- a/src/Examples/TestHydraApi/IssueCollection.cs +++ b/src/Examples/TestHydraApi/IssueCollection.cs @@ -7,7 +7,7 @@ namespace TestHydraApi { public class IssueCollection : Collection { - [JsonProperty(Vocab.Hydra.BaseUri + "search")] + [JsonProperty(Vocab.Hydra.search)] public IriTemplate Search { get; set; } } } \ No newline at end of file diff --git a/src/Examples/TestHydraApi/Properties/AssemblyInfo.cs b/src/Examples/TestHydraApi/Properties/AssemblyInfo.cs deleted file mode 100644 index 40bbf74..0000000 --- a/src/Examples/TestHydraApi/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("TestHydraApi")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("TestHydraApi")] -[assembly: AssemblyCopyright("Copyright © 2016")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("378ae219-5cef-41ed-839a-1e8343754056")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/Examples/TestHydraApi/TestHydraApi.csproj b/src/Examples/TestHydraApi/TestHydraApi.csproj index 226a44c..94cd609 100644 --- a/src/Examples/TestHydraApi/TestHydraApi.csproj +++ b/src/Examples/TestHydraApi/TestHydraApi.csproj @@ -1,119 +1,18 @@  - - + - Debug - AnyCPU - {378AE219-5CEF-41ED-839A-1E8343754056} - Library - Properties - TestHydraApi - TestHydraApi - v4.5.2 - 512 - + netstandard2.0 + false + false + false + false - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - {F8B427F1-AEEB-481B-8D51-A53AF4EF0813} - Argolis.Hydra - - - {3FADEBA7-BEA0-4864-B3FD-C17EAC737B35} - Argolis.Models - - - + + + + + + - - - - - - - ..\..\..\packages\json-ld.net\lib\net40-client\json-ld.net.dll - True - True - - - - - - - - - ..\..\..\packages\JsonLd.Entities\lib\net40\JsonLD.Entities.dll - True - True - - - - - - - - - ..\..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll - True - True - - - - - - - - - ..\..\..\packages\Rdf.Vocabularies\lib\portable-net45+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1\Rdf.Vocabularies.dll - True - True - - - - \ No newline at end of file diff --git a/src/Examples/TestHydraApi/UndocumentedClass.cs b/src/Examples/TestHydraApi/UndocumentedClass.cs index 6a85d7f..36ee9be 100644 --- a/src/Examples/TestHydraApi/UndocumentedClass.cs +++ b/src/Examples/TestHydraApi/UndocumentedClass.cs @@ -1,4 +1,4 @@ -using Argolis.Hydra.Annotations; +using Argolis.Hydra.Annotations; namespace TestHydraApi { @@ -18,7 +18,10 @@ public string NoSetter get { return "some test"; } } - public string NoGetter { set {} } + public string NoGetter + { + set { } + } [WriteOnly] public string WriteOnly { get; set; } diff --git a/src/Examples/TestHydraApi/User.cs b/src/Examples/TestHydraApi/User.cs index 5a7e0c4..c7f03db 100644 --- a/src/Examples/TestHydraApi/User.cs +++ b/src/Examples/TestHydraApi/User.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.Serialization; using Argolis.Hydra.Annotations; using JsonLD.Entities.Context; @@ -12,22 +12,7 @@ namespace TestHydraApi public class User { private const string ClassUri = "http://example.api/o#User"; - public string Id { get; set; } - [JsonProperty("firstName")] - public string Name { get; set; } - - public string LastName { get; set; } - - [JsonProperty("with_attribute")] - public string NotInContextWithAttribute { get; set; } - - [JsonIgnore] - public string JsonIgnored { get; set; } - - [IgnoreDataMember] - public string DataMemberIgnored { get; set; } - public static Uri Type { get; set; } public static JObject Context @@ -36,11 +21,26 @@ public static JObject Context { var context = new JObject( "firstName".IsProperty(Foaf.givenName), - "lastName".IsProperty(Foaf.lastName) - ); + "lastName".IsProperty(Foaf.lastName)); return new AutoContext(context, new Uri(ClassUri)); } } + + public string Id { get; set; } + + [JsonProperty("firstName")] + public string Name { get; set; } + + public string LastName { get; set; } + + [JsonProperty("with_attribute")] + public string NotInContextWithAttribute { get; set; } + + [JsonIgnore] + public string JsonIgnored { get; set; } + + [IgnoreDataMember] + public string DataMemberIgnored { get; set; } } } \ No newline at end of file diff --git a/src/Examples/TestHydraApi/paket.references b/src/Examples/TestHydraApi/paket.references deleted file mode 100644 index e7d73fe..0000000 --- a/src/Examples/TestHydraApi/paket.references +++ /dev/null @@ -1,3 +0,0 @@ -Newtonsoft.Json -Rdf.Vocabularies -JsonLd.Entities diff --git a/src/Examples/TestNancyApp/Bootstrap/AuthenticationStartup.cs b/src/Examples/TestHydraApp/Bootstrap/AuthenticationStartup.cs similarity index 82% rename from src/Examples/TestNancyApp/Bootstrap/AuthenticationStartup.cs rename to src/Examples/TestHydraApp/Bootstrap/AuthenticationStartup.cs index b70ca99..3e6bd8e 100644 --- a/src/Examples/TestNancyApp/Bootstrap/AuthenticationStartup.cs +++ b/src/Examples/TestHydraApp/Bootstrap/AuthenticationStartup.cs @@ -1,10 +1,9 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Security.Claims; using Nancy.Authentication.Basic; using Nancy.Bootstrapper; -namespace TestNancyApp.Bootstrap +namespace TestHydraApp.Bootstrap { public class AuthenticationStartup : IApplicationStartup { @@ -30,10 +29,10 @@ public class TestUser : ClaimsPrincipal { public TestUser(string userName) { - UserName = userName; - Claims = new[] + this.UserName = userName; + this.Claims = new[] { - new Claim(ClaimTypes.Name, userName) + new Claim(ClaimTypes.Name, userName), }; } diff --git a/src/Examples/TestNancyApp/Bootstrap/Bootstrapper.cs b/src/Examples/TestHydraApp/Bootstrap/Bootstrapper.cs similarity index 95% rename from src/Examples/TestNancyApp/Bootstrap/Bootstrapper.cs rename to src/Examples/TestHydraApp/Bootstrap/Bootstrapper.cs index 9a0d8fc..0f99662 100644 --- a/src/Examples/TestNancyApp/Bootstrap/Bootstrapper.cs +++ b/src/Examples/TestHydraApp/Bootstrap/Bootstrapper.cs @@ -1,18 +1,23 @@ using System; -using System.Linq; using Nancy; using Nancy.Bootstrapper; using Nancy.Configuration; using Nancy.Routing.UriTemplates; using Nancy.TinyIoc; -namespace TestNancyApp.Bootstrap +namespace TestHydraApp.Bootstrap { public class Bootstrapper : DefaultNancyBootstrapper { - protected override void ConfigureApplicationContainer(TinyIoCContainer container) + protected override Func InternalConfiguration { - // don't call base to disable automatic registration + get + { + return NancyInternalConfiguration.WithOverrides(c => + { + c.RouteResolver = typeof(UriTemplateRouteResolver); + }); + } } public override void Configure(INancyEnvironment environment) @@ -21,22 +26,16 @@ public override void Configure(INancyEnvironment environment) environment.Tracing(true, true); } + protected override void ConfigureApplicationContainer(TinyIoCContainer container) + { + // don't call base to disable automatic registration + } + protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context) { base.RequestStartup(container, pipelines, context); container.Register(new NancyContextWrapper(context)); } - - protected override Func InternalConfiguration - { - get - { - return NancyInternalConfiguration.WithOverrides(c => - { - c.RouteResolver = typeof(UriTemplateRouteResolver); - }); - } - } } } \ No newline at end of file diff --git a/src/Examples/TestNancyApp/Bootstrap/CorsStartup.cs b/src/Examples/TestHydraApp/Bootstrap/CorsStartup.cs similarity index 97% rename from src/Examples/TestNancyApp/Bootstrap/CorsStartup.cs rename to src/Examples/TestHydraApp/Bootstrap/CorsStartup.cs index 9ccf690..99d5a9a 100644 --- a/src/Examples/TestNancyApp/Bootstrap/CorsStartup.cs +++ b/src/Examples/TestHydraApp/Bootstrap/CorsStartup.cs @@ -1,7 +1,7 @@ using Nancy; using Nancy.Bootstrapper; -namespace TestNancyApp.Bootstrap +namespace TestHydraApp.Bootstrap { public class CorsStartup : IApplicationStartup { diff --git a/src/Examples/TestHydraApp/Bootstrap/HydraRegistrations.cs b/src/Examples/TestHydraApp/Bootstrap/HydraRegistrations.cs new file mode 100644 index 0000000..ad62314 --- /dev/null +++ b/src/Examples/TestHydraApp/Bootstrap/HydraRegistrations.cs @@ -0,0 +1,22 @@ +using Argolis.Hydra; +using Argolis.Hydra.Discovery.SupportedOperations; +using Argolis.Models; +using Nancy; +using Nancy.Bootstrapper; +using TestHydraApp.Hydra; + +namespace TestHydraApp.Bootstrap +{ + public class HydraRegistrations : Registrations + { + public HydraRegistrations(ITypeCatalog catalog) + : base(catalog) + { + this.Register(new HydraDocumentationSettings()); + + // todo: move to Lernaean.Hydra.Nancy when bug NancyFx/Nancy#2384 is fixed + this.RegisterAll(Lifetime.PerRequest); + this.Register(new BaseProvider()); + } + } +} \ No newline at end of file diff --git a/src/Examples/TestNancyApp/Bootstrap/NancyContextWrapper.cs b/src/Examples/TestHydraApp/Bootstrap/NancyContextWrapper.cs similarity index 67% rename from src/Examples/TestNancyApp/Bootstrap/NancyContextWrapper.cs rename to src/Examples/TestHydraApp/Bootstrap/NancyContextWrapper.cs index 9323a26..ec96de9 100644 --- a/src/Examples/TestNancyApp/Bootstrap/NancyContextWrapper.cs +++ b/src/Examples/TestHydraApp/Bootstrap/NancyContextWrapper.cs @@ -1,14 +1,14 @@ -using Nancy; +using Nancy; -namespace TestNancyApp.Bootstrap +namespace TestHydraApp.Bootstrap { public class NancyContextWrapper { - public NancyContext Context { get; } - public NancyContextWrapper(NancyContext context) { - Context = context; + this.Context = context; } + + public NancyContext Context { get; } } } diff --git a/src/Examples/TestHydraApp/FodyWeavers.xml b/src/Examples/TestHydraApp/FodyWeavers.xml new file mode 100644 index 0000000..12e0515 --- /dev/null +++ b/src/Examples/TestHydraApp/FodyWeavers.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/Examples/TestHydraApp/FodyWeavers.xsd b/src/Examples/TestHydraApp/FodyWeavers.xsd new file mode 100644 index 0000000..f4d1bb6 --- /dev/null +++ b/src/Examples/TestHydraApp/FodyWeavers.xsd @@ -0,0 +1,63 @@ + + + + + + + + + + + Used to control whether asserts are added into debug builds or not. + + + + + The operation mode of NullGuard. + + + + + + Automatically detect the mode by the usage of JetBrains.Annotations. + + + + + In implicit mode everything is assumed to be not-null, unless attributed with [AllowNull]. + + + + + In explicit mode everything is assumed to be nullable, unless attributed with [NotNull]. + + + + + + + + A regular expression to specify the names of a classes to exclude from NullGuard. + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/src/Examples/TestNancyApp/Hydra/AssembliesToScanForSupportedTypes.cs b/src/Examples/TestHydraApp/Hydra/AssembliesToScanForSupportedTypes.cs similarity index 68% rename from src/Examples/TestNancyApp/Hydra/AssembliesToScanForSupportedTypes.cs rename to src/Examples/TestHydraApp/Hydra/AssembliesToScanForSupportedTypes.cs index 3a6fc61..4eebfe8 100644 --- a/src/Examples/TestNancyApp/Hydra/AssembliesToScanForSupportedTypes.cs +++ b/src/Examples/TestHydraApp/Hydra/AssembliesToScanForSupportedTypes.cs @@ -1,15 +1,15 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Reflection; using Argolis.Hydra.Discovery.SupportedClasses; using TestHydraApi; -namespace TestNancyApp.Hydra +namespace TestHydraApp.Hydra { public class AssembliesToScanForSupportedTypes : AssemblyAnnotatedTypeSelector { protected override IEnumerable Assemblies { - get { yield return typeof (Issue).Assembly; } + get { yield return typeof(Issue).Assembly; } } } } \ No newline at end of file diff --git a/src/Examples/TestNancyApp/Hydra/BaseProvider.cs b/src/Examples/TestHydraApp/Hydra/BaseProvider.cs similarity index 83% rename from src/Examples/TestNancyApp/Hydra/BaseProvider.cs rename to src/Examples/TestHydraApp/Hydra/BaseProvider.cs index b119c84..bdb1876 100644 --- a/src/Examples/TestNancyApp/Hydra/BaseProvider.cs +++ b/src/Examples/TestHydraApp/Hydra/BaseProvider.cs @@ -1,6 +1,6 @@ using Argolis.Models; -namespace TestNancyApp.Hydra +namespace TestHydraApp.Hydra { public class BaseProvider : IBaseUriProvider { diff --git a/src/Examples/TestNancyApp/Hydra/HydraDocumentationSettings.cs b/src/Examples/TestHydraApp/Hydra/HydraDocumentationSettings.cs similarity index 92% rename from src/Examples/TestNancyApp/Hydra/HydraDocumentationSettings.cs rename to src/Examples/TestHydraApp/Hydra/HydraDocumentationSettings.cs index 5984cf8..142f7e1 100644 --- a/src/Examples/TestNancyApp/Hydra/HydraDocumentationSettings.cs +++ b/src/Examples/TestHydraApp/Hydra/HydraDocumentationSettings.cs @@ -1,7 +1,7 @@ using Argolis.Hydra; using JsonLD.Entities; -namespace TestNancyApp.Hydra +namespace TestHydraApp.Hydra { public class HydraDocumentationSettings : IHydraDocumentationSettings { diff --git a/src/Examples/TestNancyApp/Hydra/IssueSupportedOperations.cs b/src/Examples/TestHydraApp/Hydra/IssueSupportedOperations.cs similarity index 52% rename from src/Examples/TestNancyApp/Hydra/IssueSupportedOperations.cs rename to src/Examples/TestHydraApp/Hydra/IssueSupportedOperations.cs index 2411f88..de6980b 100644 --- a/src/Examples/TestNancyApp/Hydra/IssueSupportedOperations.cs +++ b/src/Examples/TestHydraApp/Hydra/IssueSupportedOperations.cs @@ -1,21 +1,21 @@ -using Argolis.Hydra.Discovery.SupportedOperations; +using Argolis.Hydra.Discovery.SupportedOperations; using TestHydraApi; -using TestNancyApp.Bootstrap; +using TestHydraApp.Bootstrap; -namespace TestNancyApp.Hydra +namespace TestHydraApp.Hydra { public class IssueSupportedOperations : SupportedOperations { public IssueSupportedOperations(NancyContextWrapper current) { - Class.SupportsGet(); + this.Class.SupportsGet(); if (current.Context.CurrentUser?.IsInRole("Admin") == true) { - Class.SupportsDelete(); + this.Class.SupportsDelete(); } - Property(issue => issue.ProjectId).SupportsGet(); + this.Property(issue => issue.ProjectId).SupportsGet(); } } } \ No newline at end of file diff --git a/src/Examples/TestNancyApp/Hydra/UserSupportedOperations.cs b/src/Examples/TestHydraApp/Hydra/UserSupportedOperations.cs similarity index 57% rename from src/Examples/TestNancyApp/Hydra/UserSupportedOperations.cs rename to src/Examples/TestHydraApp/Hydra/UserSupportedOperations.cs index 6cfd6c3..fac1d95 100644 --- a/src/Examples/TestNancyApp/Hydra/UserSupportedOperations.cs +++ b/src/Examples/TestHydraApp/Hydra/UserSupportedOperations.cs @@ -1,13 +1,13 @@ -using Argolis.Hydra.Discovery.SupportedOperations; +using Argolis.Hydra.Discovery.SupportedOperations; using TestHydraApi; -namespace TestNancyApp.Hydra +namespace TestHydraApp.Hydra { public class UserSupportedOperations : SupportedOperations { public UserSupportedOperations() { - Class.SupportsGet(); + this.Class.SupportsGet(); } } } \ No newline at end of file diff --git a/src/Examples/TestNancyApp/Modules/IssuesModule.cs b/src/Examples/TestHydraApp/Modules/IssuesModule.cs similarity index 75% rename from src/Examples/TestNancyApp/Modules/IssuesModule.cs rename to src/Examples/TestHydraApp/Modules/IssuesModule.cs index 6865329..8fd0b15 100644 --- a/src/Examples/TestNancyApp/Modules/IssuesModule.cs +++ b/src/Examples/TestHydraApp/Modules/IssuesModule.cs @@ -5,10 +5,10 @@ using Argolis.Models; using Argolis.Nancy; using JsonLD.Entities; -using TestHydraApi; using Nancy.ModelBinding; +using TestHydraApi; -namespace TestNancyApp.Modules +namespace TestHydraApp.Modules { public sealed class IssuesModule : ArgolisModule { @@ -18,20 +18,20 @@ public IssuesModule(IIriTemplateFactory templateFactory, IModelTemplateProvider : base(provider) { this.templateFactory = templateFactory; - using (Templates) + using (this.Templates) { - Get(_ => new Issue + this.Get(_ => new Issue { - Id = Request.Url, + Id = this.Request.Url, Content = "This Hydra library is not yet complete", DateCreated = new DateTime(2016, 3, 21), IsResolved = _.id % 2 == 0, - ProjectId = (IriRef) "/project/argolis", - Submitter = new User {Name = "Tomasz", LastName = "Pluskiewicz"}, + ProjectId = (IriRef)"/project/argolis", + Submitter = new User { Name = "Tomasz", LastName = "Pluskiewicz" }, Title = "Complete implementation" }); - Get>(_ => StubCollection(this.Bind())); + this.Get>(_ => this.StubCollection(this.Bind())); } } @@ -43,12 +43,12 @@ private Collection StubCollection(IssueFilter filter) { Title = $"{filter.Title} issue #{i}", DateCreated = new DateTime(filter.Year ?? random.Next(2000, DateTime.Now.Year), random.Next(1, 12), random.Next(1, 29)), - ProjectId = (IriRef) "/ęś" + ProjectId = (IriRef)"/ęś" }); return new IssueCollection { - Id = Request.Url, + Id = this.Request.Url, Members = members.ToArray(), TotalItems = 10, Search = this.templateFactory.CreateIriTemplate() diff --git a/src/Examples/TestHydraApp/Program.cs b/src/Examples/TestHydraApp/Program.cs new file mode 100644 index 0000000..87b0729 --- /dev/null +++ b/src/Examples/TestHydraApp/Program.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; + +namespace TestHydraApp +{ + public class Program + { + public static void Main(string[] args) + { + CreateWebHostBuilder(args).Build().Run(); + } + + public static IWebHostBuilder CreateWebHostBuilder(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseStartup(); + } +} diff --git a/src/Examples/TestHydraApp/Properties/launchSettings.json b/src/Examples/TestHydraApp/Properties/launchSettings.json new file mode 100644 index 0000000..1c1b5f4 --- /dev/null +++ b/src/Examples/TestHydraApp/Properties/launchSettings.json @@ -0,0 +1,26 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:26813", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "TestHydraApp": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/src/Examples/TestHydraApp/Startup.cs b/src/Examples/TestHydraApp/Startup.cs new file mode 100644 index 0000000..3377efd --- /dev/null +++ b/src/Examples/TestHydraApp/Startup.cs @@ -0,0 +1,22 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +using Nancy.Owin; + +namespace TestHydraApp +{ + public class Startup + { + // This method gets called by the runtime. Use this method to add services to the container. + // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 + public void ConfigureServices(IServiceCollection services) + { + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env) + { + app.UseOwin(owin => owin.UseNancy()); + } + } +} diff --git a/src/Examples/TestHydraApp/TestHydraApp.csproj b/src/Examples/TestHydraApp/TestHydraApp.csproj new file mode 100644 index 0000000..24d7012 --- /dev/null +++ b/src/Examples/TestHydraApp/TestHydraApp.csproj @@ -0,0 +1,57 @@ + + + + netcoreapp2.0 + false + false + false + true + NU1605 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Examples/TestNancyApp/Bootstrap/HydraRegistrations.cs b/src/Examples/TestNancyApp/Bootstrap/HydraRegistrations.cs deleted file mode 100644 index cb664b9..0000000 --- a/src/Examples/TestNancyApp/Bootstrap/HydraRegistrations.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Argolis.Hydra; -using Argolis.Hydra.Discovery.SupportedOperations; -using Argolis.Models; -using Argolis.Models.TunnelVisionLabs; -using Nancy; -using Nancy.Bootstrapper; -using TestNancyApp.Hydra; -using TestNancyApp.Modules; - -namespace TestNancyApp.Bootstrap -{ - public class HydraRegistrations : Registrations - { - public HydraRegistrations(ITypeCatalog catalog) - : base(catalog) - { - Register(new HydraDocumentationSettings()); - - // todo: move to Lernaean.Hydra.Nancy when bug NancyFx/Nancy#2384 is fixed - RegisterAll(Lifetime.PerRequest); - Register(new BaseProvider()); - - Register(typeof(TunnelVisionLabsUriTemplateExpander)); - Register(typeof(TunnelVisionLabsUriTemplateMatcher)); - } - } -} \ No newline at end of file diff --git a/src/Examples/TestNancyApp/Properties/AssemblyInfo.cs b/src/Examples/TestNancyApp/Properties/AssemblyInfo.cs deleted file mode 100644 index a5bf3ad..0000000 --- a/src/Examples/TestNancyApp/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("TestNancyApp")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("TestNancyApp")] -[assembly: AssemblyCopyright("Copyright © 2016")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("1d2e686f-381d-4700-b062-67ac029c0daf")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/Examples/TestNancyApp/Startup.cs b/src/Examples/TestNancyApp/Startup.cs deleted file mode 100644 index 7eb4114..0000000 --- a/src/Examples/TestNancyApp/Startup.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Microsoft.Owin; -using Owin; -using TestNancyApp; - -[assembly: OwinStartup(typeof(Startup))] - -namespace TestNancyApp -{ - public class Startup - { - public void Configuration(IAppBuilder app) - { - app.UseNancy(); - } - } -} \ No newline at end of file diff --git a/src/Examples/TestNancyApp/TestNancyApp.csproj b/src/Examples/TestNancyApp/TestNancyApp.csproj deleted file mode 100644 index 3b7ed06..0000000 --- a/src/Examples/TestNancyApp/TestNancyApp.csproj +++ /dev/null @@ -1,347 +0,0 @@ - - - - - Debug - AnyCPU - - - 2.0 - {1D2E686F-381D-4700-B062-67AC029C0DAF} - {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} - Library - Properties - TestNancyApp - TestNancyApp - v4.5.2 - true - - - - - - - - - - - - true - full - false - bin\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - Designer - - - - - - - - - - - - - - - - - - - - {cbcac4dc-129d-4f36-96d5-19b14f18cf18} - Argolis.Hydra.Nancy - - - {F8B427F1-AEEB-481B-8D51-A53AF4EF0813} - Argolis.Hydra - - - {6ac20d75-35cf-4385-912e-bc7e381ad3a0} - Argolis.Models.TunnelVisionLabs - - - {3FADEBA7-BEA0-4864-B3FD-C17EAC737B35} - Argolis.Models - - - {4EC11162-751B-4E73-A3C6-435BD7CAE9BA} - Argolis.Nancy - - - {378ae219-5cef-41ed-839a-1e8343754056} - TestHydraApi - - - - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - - - - - - True - True - 61186 - / - http://localhost:61186/ - False - False - - - False - - - - - - - - True - - - - - - - ..\..\..\packages\dotNetRDF\lib\net40\dotNetRDF.dll - True - True - - - - - - - - - ..\..\..\packages\HtmlAgilityPack\lib\Net45\HtmlAgilityPack.dll - True - True - - - - - - - - - ..\..\..\packages\json-ld.net\lib\net40-client\json-ld.net.dll - True - True - - - - - - - - - ..\..\..\packages\JsonLd.Entities\lib\net40\JsonLD.Entities.dll - True - True - - - - - - - - - ..\..\..\packages\Microsoft.Owin\lib\net45\Microsoft.Owin.dll - True - True - - - - - - - - - ..\..\..\packages\Microsoft.Owin.Host.SystemWeb\lib\net45\Microsoft.Owin.Host.SystemWeb.dll - True - True - - - - - - - - - ..\..\..\packages\Microsoft.Owin.Hosting\lib\net45\Microsoft.Owin.Hosting.dll - True - True - - - - - - - - - ..\..\..\packages\Nancy\lib\net452\Nancy.dll - True - True - - - - - - - - - ..\..\..\packages\Nancy.Authentication.Basic\lib\net452\Nancy.Authentication.Basic.dll - True - True - - - - - - - - - ..\..\..\packages\Nancy.Owin\lib\net452\Nancy.Owin.dll - True - True - - - - - - - - - ..\..\..\packages\Nancy.Rdf\lib\net452\Nancy.Rdf.dll - True - True - - - - - - - - - ..\..\..\packages\Nancy.Routing.UriTemplates\lib\net452\Nancy.Routing.UriTemplates.dll - True - True - - - - - - - - - ..\..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll - True - True - - - - - - - - - ..\..\..\packages\Owin\lib\net40\Owin.dll - True - True - - - - - - - - - ..\..\..\packages\Rdf.Vocabularies\lib\portable-net45+netcore45+wpa81+wp8+MonoAndroid1+MonoTouch1\Rdf.Vocabularies.dll - True - True - - - - - - - - - ..\..\..\packages\TunnelVisionLabs.Net.UriTemplate\lib\net20\TunnelVisionLabs.Net.UriTemplate.dll - True - True - - - - - - - - - ..\..\..\packages\UriTemplateString\lib\net45\UriTemplateString.dll - True - True - - - - - - - - - ..\..\..\packages\VDS.Common\lib\net40-client\VDS.Common.dll - True - True - - - - - \ No newline at end of file diff --git a/src/Examples/TestNancyApp/Web.config b/src/Examples/TestNancyApp/Web.config deleted file mode 100644 index dc89191..0000000 --- a/src/Examples/TestNancyApp/Web.config +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - True - - - - - True - - - - \ No newline at end of file diff --git a/src/Examples/TestNancyApp/paket.references b/src/Examples/TestNancyApp/paket.references deleted file mode 100644 index 6e6743d..0000000 --- a/src/Examples/TestNancyApp/paket.references +++ /dev/null @@ -1,8 +0,0 @@ -Nancy.Owin -Microsoft.Owin.Host.SystemWeb -Microsoft.Owin.Hosting -JsonLD.Entities -nancy.rdf -Nancy.Authentication.Basic -Nancy.Routing.UriTemplates -uritemplatestring \ No newline at end of file