Examples/Get-EuroExchange.Tests.ps1

BeforeAll {
    . $PSCommandPath.Replace('.Tests.ps1', '.ps1')
}

Describe "Get-EuroExchange Test" {
    Context "Parameter" {
        It "Parameter-Signatur korrekt" {
            Get-Command -Name Get-EuroExchange | Should -HaveParameter Currency     -Type String  -Mandatory
            Get-Command -Name Get-EuroExchange | Should -HaveParameter Euros        -Type Decimal -DefaultValue 1
            Get-Command -Name Get-EuroExchange | Should -HaveParameter ListCurrency -Type System.Management.Automation.SwitchParameter
        }
        It "Parameter-Metadaten => 'Currency'" {
            $target = (Get-Command Get-EuroExchange).Parameters['Currency']
            $target.ParameterSets.Keys | Should -Be 'Calculate'
            $target.Aliases | Should -Be 'Währung'

            $target1 = $target.Attributes.Where({ $_ -is [System.Management.Automation.ValidateSetAttribute] })
            $target1.ValidValues | Should -Be 'AUD', 'BGN', 'BRL', 'CAD', 'CHF', 'CNY', 'CZK', 'DKK', 'GBP', 'HKD', 'HRK', 'HUF', 'IDR', 'ILS', 'INR', 'ISK', 'JPY', 'KRW', 'MXN', 'MYR', 'NOK', 'NZD', 'PHP', 'PLN', 'RON', 'SEK', 'SGD', 'THB', 'TRY', 'USD', 'ZAR'

            $target2 = $target.Attributes.Where({ $_ -is [System.Management.Automation.ParameterAttribute] })
            $target2.Mandatory | should -BeTrue
            $target2.ValueFromPipeline | should -BeTrue
            $target2.ValueFromPipelineByPropertyName | should -BeTrue
        }
        It "Parameter-Metadaten => 'Euros'" {
            $target = (Get-Command Get-EuroExchange).Parameters['Euros']
            $target.ParameterSets.Keys | Should -Be 'Calculate'
            $target.Aliases | Should -Be 'Euronen'

            $target1 = $target.Attributes.Where({ $_ -is [System.Management.Automation.ValidateRangeAttribute] })
            $target1.MinRange | Should -Be 0.0001
            $target1.MaxRange | Should -Be 1000000

            $target2 = $target.Attributes.Where({ $_ -is [System.Management.Automation.ParameterAttribute] })
            $target2.Mandatory | should -BeFalse
            $target2.ValueFromPipeline | should -BeFalse
            $target2.ValueFromPipelineByPropertyName | should -BeTrue
        }
        It "Parameter-Metadaten => 'ListCurrency'" {
            $target = (Get-Command Get-EuroExchange).Parameters['ListCurrency']
            $target.ParameterSets.Keys | Should -Be 'Overview'
            $target.Aliases | Should -BeNullOrEmpty
            $target.SwitchParameter | Should -BeTrue

            $target1 = $target.Attributes.Where({ $_ -is [System.Management.Automation.ParameterAttribute] })
            $target1.Mandatory | should -BeTrue
            $target1.ValueFromPipeline | should -BeFalse
            $target1.ValueFromPipelineByPropertyName | should -BeFalse
        }
        It "Throw => Get-EuroExchange -Currency USD -ListCurrency" {
            { Get-EuroExchange -Currency USD -ListCurrency } | Should -Throw -ErrorId 'AmbiguousParameterSet,Get-EuroExchange'
        }
        It "Throw => Get-EuroExchange -Euros 100 -ListCurrency" {
            { Get-EuroExchange -Euros 100 -ListCurrency } | Should -Throw -ErrorId 'AmbiguousParameterSet,Get-EuroExchange'
        }
        It "Throw => Get-EuroExchange -Currency XXX" {
            { Get-EuroExchange -Currency XXX } | Should -Throw -ErrorId "ParameterArgumentValidationError,Get-EuroExchange"
        }
        It "Throw => Get-EuroExchange -Currency USD -Euros -100" {
            { Get-EuroExchange -Currency USD -Euros -100 } | Should -Throw -ErrorId "ParameterArgumentValidationError,Get-EuroExchange"
        }
        It "Throw => Get-EuroExchange -Currency USD -Euros 1000001" {
            { Get-EuroExchange -Currency USD -Euros 1000001 } | Should -Throw -ErrorId "ParameterArgumentValidationError,Get-EuroExchange"
        }
        It "Throw => Get-EuroExchange -Currency USD -Euros 0" {
            { Get-EuroExchange -Currency USD -Euros 0 } | Should -Throw -ErrorId "ParameterArgumentValidationError,Get-EuroExchange"
        }
        It "Throw => Get-EuroExchange -Currency USD -Euros hundert" {
            { Get-EuroExchange -Currency USD -Euros hundert } | Should -Throw -ErrorId "ParameterArgumentTransformationError,Get-EuroExchange"
        }
        It "Throw => Get-EuroExchange -Currency USD, ZAR" {
            { Get-EuroExchange -Currency USD, ZAR } | Should -Throw -ErrorId "ParameterArgumentTransformationError,Get-EuroExchange"
        }
        It "Throw => Get-EuroExchange -Currency USD -Euros 50, 100" {
            { Get-EuroExchange -Currency USD -Euros 50, 100 } | Should -Throw -ErrorId "ParameterArgumentTransformationError,Get-EuroExchange"
        }
    }
    Context "Rückgabe-Objekte" {
        BeforeAll {
            $content = Invoke-WebRequest -Uri "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml" | Select-Object -ExpandProperty Content
            $script:Cubes = ([xml]$content).Envelope.Cube.Cube.Cube
        }
        It "Get-EuroExchange -Currency USD: Rückgabe-Objekt -is [PSCustomObject]" {
            Get-EuroExchange -Currency USD | Should -BeOfType PSCustomObject
        }
        It "Get-EuroExchange -Currency USD: target -isNot [Array]" {
            Get-EuroExchange -Currency USD | Should -Not -BeOfType Array
        }
        It "Get-EuroExchange -Currency USD: Rückgabe-Objekt -is [PSCustomObject]" {
            Get-EuroExchange -Currency USD | Should -BeOfType PSCustomObject
        }
        It "Get-EuroExchange -Currency USD: Rückgabe-Objekt -is [PSCustomObject]" {
            Get-EuroExchange -Currency USD | Should -BeOfType PSCustomObject
        }
        It "Get-EuroExchange -Currency USD: target.Currency -ceq USD" {
            $target = Get-EuroExchange -Currency USD
            $target.Currency | Should -BeExactly "USD"
            $target.Currency | Should -BeOfType String
        }
        It "Get-EuroExchange -Currency USD: target.Rate -eq ECB.Value" {
            [decimal]$expected = $cubes | Where-Object -Property Currency -EQ -Value USD | Select-Object -ExpandProperty rate
            $target = Get-EuroExchange -Currency USD
            $target.Rate | Should -BeExactly $expected
            $target.Rate | Should -BeOfType Decimal
        }
        It "Get-EuroExchange -Currency USD: target.Euros -eq 1" {
            $target = Get-EuroExchange -Currency USD
            $target.Euros | Should -BeExactly 1
            $target.Euros | Should -BeOfType Decimal
        }
        It "Get-EuroExchange -Currency USD: target.SumCurrency -eq (1 * ECB.Value)" {
            [decimal]$expected = $Cubes | Where-Object -Property Currency -EQ -Value USD | Select-Object -ExpandProperty Rate
            $target = Get-EuroExchange -Currency USD
            $target.SumCurrency | Should -BeExactly $expected
            $target.SumCurrency | Should -BeOfType Decimal
        }
        It "Get-EuroExchange -Currency USD -Euros 100: target.SumCurrency -eq (100 * ECB.Value)" {
            [decimal]$expected = $Cubes | Where-Object -Property Currency -EQ -Value USD | Select-Object -ExpandProperty Rate
            $expected *= 100
            $target = Get-EuroExchange -Currency USD -Euros 100
            $target.SumCurrency | Should -BeExactly $expected
            $target.SumCurrency | Should -BeOfType Decimal
        }
        It "Get-EuroExchange -ListCurrency => target -is PSCustomObject" {
            Get-EuroExchange -ListCurrency | Should -BeOfType PSCustomObject
        }
        It "Get-EuroExchange -ListCurrency => target -eq Ecb" {
            $expected = $Cubes.currency | Sort-Object
            Get-EuroExchange -ListCurrency | Select-Object -ExpandProperty Currency | Should -be $expected
        }
        It "'USD', 'AUD', 'ZAR' | Get-EuroExchange => target -eq Ecb" {
            $expected = $Cubes | Where-Object -Property currency -in 'USD', 'ZAR', 'AUD' | Select-Object -ExpandProperty rate | ForEach-Object { [decimal]$_ }
            $target = 'USD', 'AUD', 'ZAR' | Get-EuroExchange | Select-Object -ExpandProperty Rate
            $target | Should -BeExactly $expected
        }
        It "'USD', 'AUD', 'ZAR' | Get-EuroExchange -Euros 100 => target -eq Ecb" {
            $expected = $Cubes | Where-Object -Property currency -in 'USD', 'ZAR', 'AUD' | Select-Object -ExpandProperty rate | ForEach-Object { [decimal]$_ * 100 }
            $target = 'USD', 'AUD', 'ZAR' | Get-EuroExchange -Euros 100 | Select-Object -ExpandProperty SumCurrency
            $target | Should -BeExactly $expected
        }
        It "Get-EuroExchange -ListCurrency | Get-EuroExchange -Euros 1000 => target -eq Ecb" {
            $expected = $Cubes | Sort-Object -Property currency | Select-Object -ExpandProperty rate | ForEach-Object { [decimal]$_ * 1000 }
            $target = Get-EuroExchange -ListCurrency | Get-EuroExchange -Euros 1000 | Select-Object -ExpandProperty SumCurrency
            $target | Should -BeExactly $expected
        }
        It "'USD,10', 'ZAR,100', 'AUD,1000' | ConvertFrom-Csv -Header Currency, Euros | Get-EuroExchange => target -eq Ecb" {
            $expected0 = $Cubes | Where-Object currency -eq 'USD' | Select-Object -ExpandProperty rate | ForEach-Object { [decimal]$_ * 10 }
            $expected1 = $Cubes | Where-Object currency -eq 'ZAR' | Select-Object -ExpandProperty rate | ForEach-Object { [decimal]$_ * 100 }
            $expected2 = $Cubes | Where-Object currency -eq 'AUD' | Select-Object -ExpandProperty rate | ForEach-Object { [decimal]$_ * 1000 }

            $target = 'USD,10', 'ZAR,100', 'AUD,1000' | ConvertFrom-Csv -Header Currency, Euros | Get-EuroExchange
            $target[0].SumCurrency | Should -BeExactly $expected0
            $target[1].SumCurrency | Should -BeExactly $expected1
            $target[2].SumCurrency | Should -BeExactly $expected2
        }
        It "'USD,10', 'ZAR,100', 'AUD,1000' | ConvertFrom-Csv -Header Währung, Euronen | Get-EuroExchange => target -eq Ecb" {
            $expected0 = $Cubes | Where-Object currency -eq 'USD' | Select-Object -ExpandProperty rate | ForEach-Object { [decimal]$_ * 10 }
            $expected1 = $Cubes | Where-Object currency -eq 'ZAR' | Select-Object -ExpandProperty rate | ForEach-Object { [decimal]$_ * 100 }
            $expected2 = $Cubes | Where-Object currency -eq 'AUD' | Select-Object -ExpandProperty rate | ForEach-Object { [decimal]$_ * 1000 }

            $target = 'USD,10', 'ZAR,100', 'AUD,1000' | ConvertFrom-Csv -Header Währung, Euronen | Get-EuroExchange
            $target[0].SumCurrency | Should -BeExactly $expected0
            $target[1].SumCurrency | Should -BeExactly $expected1
            $target[2].SumCurrency | Should -BeExactly $expected2
        }
    }
}

<#
 
# ! Code-Abdeckungsanalyse einzeln ausführen um einen rekursive Schleife zu vermeiden
 
$config = [PesterConfiguration]::Default
 
$config.Run.Path = ".\Tests\Get-EuroExchange.Tests.ps1"
$config.Run.PassThru = $true
 
$config.CodeCoverage.Enabled = $true
$config.CodeCoverage.OutputFormat = 'CoverageGutters'
$config.CodeCoverage.Path = ".\Public\Get-EuroExchange.ps1"
$config.CodeCoverage.OutputPath = ".\Public\Get-EuroExchange.CodeCoverage.xml"
$config.CodeCoverage.CoveragePercentTarget = 90
 
$config.TestResult.Enabled = $true
$config.TestResult.OutputPath = ".\Tests\Get-EuroExchange.TestResults.xml"
 
$config.Output.Verbosity = 'Detailed'
 
$config.Debug.WriteDebugMessages = $true
$config.Debug.WriteDebugMessagesFrom = 'CodeCoverage'
 
Invoke-Pester -Configuration $config
#>


# SIG # Begin signature block
# MIIcYgYJKoZIhvcNAQcCoIIcUzCCHE8CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBmRhH8wwPFmPzx
# JtdV3wXJIO4dBfIAr9daejvwPU2xtaCCFn0wggNyMIICWqADAgECAhA8emkJ82H0
# pEx+itPRny0WMA0GCSqGSIb3DQEBDQUAMFExIzAhBgkqhkiG9w0BCQEWFGluZm9A
# YXR0aWxha3JpY2suY29tMSowKAYDVQQDDCFBdHRpbGEgS3JpY2sgKFNvZnR3YXJl
# IERldmVsb3BlcikwHhcNMjIxMDE2MTg1MTA3WhcNMzIxMDE2MTkwMTA3WjBRMSMw
# IQYJKoZIhvcNAQkBFhRpbmZvQGF0dGlsYWtyaWNrLmNvbTEqMCgGA1UEAwwhQXR0
# aWxhIEtyaWNrIChTb2Z0d2FyZSBEZXZlbG9wZXIpMIIBIjANBgkqhkiG9w0BAQEF
# AAOCAQ8AMIIBCgKCAQEAvbn3JNw62vDI7mnX6gD+V/MyDkvFSzclaqC3Kfn+wDxj
# xkmgwho343N/JCxAUjHoBjNDpx4W3KTVv3X7PYrPHxoz/134JTIBdV+yIyL/VkCS
# Mnp9exMhMPxa1RvX3p/zphPMosv7xGgRPF3QVKxoBBUtifql80/pDHvOCPtROZ+9
# xSfXJ6P9jXGH4YSlNJxAKv53AXV0avihpa1BWL6ohyS1Bnjdbcw/hq0TIf4as1Dy
# 7IbrU6Fneaqm/XIEEs11I0BrDNwgXnmB8PSojsm/DOtQY5Ps8eGJzwiXP2Vdvk0j
# OsqDaJe3cxiOCXk6dz2zylB6rfP+Kph97bjaQoNI2QIDAQABo0YwRDAOBgNVHQ8B
# Af8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwHQYDVR0OBBYEFKrSiXRUaupI
# 5orXIniIR5sTcWwIMA0GCSqGSIb3DQEBDQUAA4IBAQAQ+6LPLF6Ua7JCC9LuwOCG
# UlWwawgV/D5wK+FU8PQ+/onwBx9ZBqXnZw4f7NQtqaiR1bwm7sRTZeaIcif57zHM
# /WBicYjB9dwZoGylfeCW6LRNQaoBvjuavOTsQw3lYF//ylJV8QyUKloJd9W6CVtm
# tBSJEYopjygAm/9E9CxRFPSXxX/G+Af0+G+VeeBjSpaYKO688dVXa7pqMOm6hq9P
# Ww6jgiCL3aRk0qbWwl2mt1POcfdRk/rdvt66BcO91cLDKhSCOIp7coJZ8Cf2xHDP
# 99NcZ8ct02Cco6qjtlUkrCBRYNsuUAcToTvqQLiSSkywj+jTI4gm0vcjSiVXwnyy
# MIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0BAQwFADBl
# MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
# d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
# b3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQswCQYDVQQG
# EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
# cnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G
# CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7J
# IT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxS
# D1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb
# 7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1ef
# VFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoY
# OAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSa
# M0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI
# 8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9L
# BADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfm
# Q6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDr
# McXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15Gkv
# mB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
# FgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SSy4IxLVGL
# p6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAkBggrBgEF
# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRw
# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0Eu
# Y3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9E
# aWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRVHSAAMA0G
# CSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyhhyzshV6p
# Grsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO0Cre+i1W
# z/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo8L8vC6bp
# 8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++hUD38dglo
# hJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5xaiNrIv8S
# uFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMIIGrjCCBJagAwIBAgIQ
# BzY3tyRUfNhHrP0oZipeWzANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEV
# MBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29t
# MSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjIwMzIzMDAw
# MDAwWhcNMzcwMzIyMjM1OTU5WjBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGln
# aUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5
# NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
# MIICCgKCAgEAxoY1BkmzwT1ySVFVxyUDxPKRN6mXUaHW0oPRnkyibaCwzIP5WvYR
# oUQVQl+kiPNo+n3znIkLf50fng8zH1ATCyZzlm34V6gCff1DtITaEfFzsbPuK4CE
# iiIY3+vaPcQXf6sZKz5C3GeO6lE98NZW1OcoLevTsbV15x8GZY2UKdPZ7Gnf2ZCH
# RgB720RBidx8ald68Dd5n12sy+iEZLRS8nZH92GDGd1ftFQLIWhuNyG7QKxfst5K
# fc71ORJn7w6lY2zkpsUdzTYNXNXmG6jBZHRAp8ByxbpOH7G1WE15/tePc5OsLDni
# pUjW8LAxE6lXKZYnLvWHpo9OdhVVJnCYJn+gGkcgQ+NDY4B7dW4nJZCYOjgRs/b2
# nuY7W+yB3iIU2YIqx5K/oN7jPqJz+ucfWmyU8lKVEStYdEAoq3NDzt9KoRxrOMUp
# 88qqlnNCaJ+2RrOdOqPVA+C/8KI8ykLcGEh/FDTP0kyr75s9/g64ZCr6dSgkQe1C
# vwWcZklSUPRR8zZJTYsg0ixXNXkrqPNFYLwjjVj33GHek/45wPmyMKVM1+mYSlg+
# 0wOI/rOP015LdhJRk8mMDDtbiiKowSYI+RQQEgN9XyO7ZONj4KbhPvbCdLI/Hgl2
# 7KtdRnXiYKNYCQEoAA6EVO7O6V3IXjASvUaetdN2udIOa5kM0jO0zbECAwEAAaOC
# AV0wggFZMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLoW2W1NhS9zKXaa
# L3WMaiCPnshvMB8GA1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1Ud
# DwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkw
# JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcw
# AoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJv
# b3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQu
# Y29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwB
# BAIwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQB9WY7Ak7ZvmKlEIgF+
# ZtbYIULhsBguEE0TzzBTzr8Y+8dQXeJLKftwig2qKWn8acHPHQfpPmDI2AvlXFvX
# bYf6hCAlNDFnzbYSlm/EUExiHQwIgqgWvalWzxVzjQEiJc6VaT9Hd/tydBTX/6tP
# iix6q4XNQ1/tYLaqT5Fmniye4Iqs5f2MvGQmh2ySvZ180HAKfO+ovHVPulr3qRCy
# Xen/KFSJ8NWKcXZl2szwcqMj+sAngkSumScbqyQeJsG33irr9p6xeZmBo1aGqwpF
# yd/EjaDnmPv7pp1yr8THwcFqcdnGE4AJxLafzYeHJLtPo0m5d2aR8XKc6UsCUqc3
# fpNTrDsdCEkPlM05et3/JWOZJyw9P2un8WbDQc1PtkCbISFA0LcTJM3cHXg65J6t
# 5TRxktcma+Q4c6umAU+9Pzt4rUyt+8SVe+0KXzM5h0F4ejjpnOHdI/0dKNPH+ejx
# mF/7K9h+8kaddSweJywm228Vex4Ziza4k9Tm8heZWcpw8De/mADfIBZPJ/tgZxah
# ZrrdVcA6KYawmKAr7ZVBtzrVFZgxtGIJDwq9gdkT/r+k0fNX2bwE+oLeMt8EifAA
# zV3C+dAjfwAL5HYCJtnwZXZCpimHCUcr5n8apIUP/JiW9lVUKx+A+sDyDivl1vup
# L0QVSucTDh3bNzgaoSv27dZ8/DCCBsAwggSooAMCAQICEAxNaXJLlPo8Kko9KQeA
# PVowDQYJKoZIhvcNAQELBQAwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lD
# ZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYg
# U0hBMjU2IFRpbWVTdGFtcGluZyBDQTAeFw0yMjA5MjEwMDAwMDBaFw0zMzExMjEy
# MzU5NTlaMEYxCzAJBgNVBAYTAlVTMREwDwYDVQQKEwhEaWdpQ2VydDEkMCIGA1UE
# AxMbRGlnaUNlcnQgVGltZXN0YW1wIDIwMjIgLSAyMIICIjANBgkqhkiG9w0BAQEF
# AAOCAg8AMIICCgKCAgEAz+ylJjrGqfJru43BDZrboegUhXQzGias0BxVHh42bbyS
# VQxh9J0Jdz0Vlggva2Sk/QaDFteRkjgcMQKW+3KxlzpVrzPsYYrppijbkGNcvYlT
# 4DotjIdCriak5Lt4eLl6FuFWxsC6ZFO7KhbnUEi7iGkMiMbxvuAvfTuxylONQIMe
# 58tySSgeTIAehVbnhe3yYbyqOgd99qtu5Wbd4lz1L+2N1E2VhGjjgMtqedHSEJFG
# Kes+JvK0jM1MuWbIu6pQOA3ljJRdGVq/9XtAbm8WqJqclUeGhXk+DF5mjBoKJL6c
# qtKctvdPbnjEKD+jHA9QBje6CNk1prUe2nhYHTno+EyREJZ+TeHdwq2lfvgtGx/s
# K0YYoxn2Off1wU9xLokDEaJLu5i/+k/kezbvBkTkVf826uV8MefzwlLE5hZ7Wn6l
# JXPbwGqZIS1j5Vn1TS+QHye30qsU5Thmh1EIa/tTQznQZPpWz+D0CuYUbWR4u5j9
# lMNzIfMvwi4g14Gs0/EH1OG92V1LbjGUKYvmQaRllMBY5eUuKZCmt2Fk+tkgbBhR
# YLqmgQ8JJVPxvzvpqwcOagc5YhnJ1oV/E9mNec9ixezhe7nMZxMHmsF47caIyLBu
# MnnHC1mDjcbu9Sx8e47LZInxscS451NeX1XSfRkpWQNO+l3qRXMchH7XzuLUOncC
# AwEAAaOCAYswggGHMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1Ud
# JQEB/wQMMAoGCCsGAQUFBwMIMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG
# /WwHATAfBgNVHSMEGDAWgBS6FtltTYUvcyl2mi91jGogj57IbzAdBgNVHQ4EFgQU
# Yore0GH8jzEU7ZcLzT0qlBTfUpwwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2Ny
# bDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRp
# bWVTdGFtcGluZ0NBLmNybDCBkAYIKwYBBQUHAQEEgYMwgYAwJAYIKwYBBQUHMAGG
# GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBYBggrBgEFBQcwAoZMaHR0cDovL2Nh
# Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1
# NlRpbWVTdGFtcGluZ0NBLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAVaoqGvNG83hX
# NzD8deNP1oUj8fz5lTmbJeb3coqYw3fUZPwV+zbCSVEseIhjVQlGOQD8adTKmyn7
# oz/AyQCbEx2wmIncePLNfIXNU52vYuJhZqMUKkWHSphCK1D8G7WeCDAJ+uQt1wmJ
# efkJ5ojOfRu4aqKbwVNgCeijuJ3XrR8cuOyYQfD2DoD75P/fnRCn6wC6X0qPGjpS
# tOq/CUkVNTZZmg9U0rIbf35eCa12VIp0bcrSBWcrduv/mLImlTgZiEQU5QpZomvn
# Ij5EIdI/HMCb7XxIstiSDJFPPGaUr10CU+ue4p7k0x+GAWScAMLpWnR1DT3heYi/
# HAGXyRkjgNc2Wl+WFrFjDMZGQDvOXTXUWT5Dmhiuw8nLw/ubE19qtcfg8wXDWd8n
# YiveQclTuf80EGf2JjKYe/5cQpSBlIKdrAqLxksVStOYkEVgM4DgI974A6T2RUfl
# zrgDQkfoQTZxd639ouiXdE4u2h4djFrIHprVwvDGIqhPm73YHJpRxC+a9l+nJ5e6
# li6FV8Bg53hWf2rvwpWaSxECyIKcyRoFfLpxtU56mWz06J7UWpjIn7+NuxhcQ/XQ
# KujiYu54BNu90ftbCqhwfvCXhHjjCANdRyxjqCU4lwHSPzra5eX25pvcfizM/xdM
# TQCi2NYBDriL7ubgclWJLCcZYfZ3AYwxggU7MIIFNwIBATBlMFExIzAhBgkqhkiG
# 9w0BCQEWFGluZm9AYXR0aWxha3JpY2suY29tMSowKAYDVQQDDCFBdHRpbGEgS3Jp
# Y2sgKFNvZnR3YXJlIERldmVsb3BlcikCEDx6aQnzYfSkTH6K09GfLRYwDQYJYIZI
# AWUDBAIBBQCggYQwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0B
# CQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAv
# BgkqhkiG9w0BCQQxIgQg7Y12IoMGMNsnBrwLc3CcfTWfGKl08c45XoFYY09lacsw
# DQYJKoZIhvcNAQEBBQAEggEAST5XnsIj/ZL5XTci9njrVL8Jk/Ame8u09GjB+Ill
# zbNLXJ0VA9jrvr6JI8UEdFU14WwaXAt1MhtU5aSkDNLvEoLDnxDrjyOvTo3LBzmv
# tRxa6Qg5yy38+5rah+G5ip1vKgJNPu21Ax4NYvuLeyG5+McRiWwnK0S+pVMMInFm
# ll9ywbxL8zDqgkylMx8WQoRoddy6IChiQybYXhECQj/jcOGkLsfmmwpeFHTkrpfn
# hoPaCvc4EX0yUwziYe6nDMnPjQVHFE/R+iu9/SYXYDATBVpHHzS+D1gu6vu+/sJP
# OTJBo9eZf22U0ujWEy9F/g/1zP6qdgx2eutrB0AiBUpZe6GCAyAwggMcBgkqhkiG
# 9w0BCQYxggMNMIIDCQIBATB3MGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdp
# Q2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2
# IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0ECEAxNaXJLlPo8Kko9KQeAPVowDQYJYIZI
# AWUDBAIBBQCgaTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJ
# BTEPFw0yMjEyMjIyMzI2MDFaMC8GCSqGSIb3DQEJBDEiBCC5c4yGBV0zG1HBKEZ+
# rGlMrJHeXD29gaQnaXuNiuEcqjANBgkqhkiG9w0BAQEFAASCAgBzhSoRQr7iHQum
# f6JtWXuHy42RJIkWD6q6ygd3yUW/qNy/EOPo1ci9cfTM8MrVACo/l5MjitSEaLis
# xJn0ep2kOpyzeY8SnTuazPBhxVLIjA7jecTMlMixZKViVXL5XOo4w9VUWgglPFi9
# se8gaSoC/2ndFmp0D9+gjGfM6EoCLYC0PJX0Z8GKk+LMC90/jdurabaOUjTKxfla
# bGlNrSlLJnPUi5ZxU8gW3AjhUMTwOhKDfvJGDcHzsmkPn8ilwD7Fp58ha8TGnx0C
# 9C2o95e3WAGweKSyKFB03/tF8espJ+gTq76LuAfW1sqrtGinP82UXHotaz3+cgsv
# Q7Mrn/q+NCgE8JsRtsNgvI+b4GrbtoAcXymJ+oKPrrOmUep8Kkv2aZ18dKBxBi8S
# 605YxRnF7RZEsRJNQDluV5o/YnQC4A412D/yL80ZI5Z+/zrVxx60DqhQrD3ufk0w
# AU1zObDXcqplc8/Va0NY0Ey/UChNHeh75hb7UWn2VHkZPZ9o1kjgysEOr3PpU/Mb
# MyHTH2FomSF7cezcBt2AD1k5VKTetH5/kUKx6LKTy+1qZFAWlmQ4njR3yBUE6Ytg
# bSQjBMkGBi2LgkhfdNFIqiH22j0qe02FEAX5u5RfUqpw6io8Ks2zWqZYqdeTu6LM
# B+1kHvmjpkDnPFT0B9txR40TYpbv+Q==
# SIG # End signature block