MSCommerce.Tests.ps1
|
# Pester smoke tests for the MSCommerce PowerShell module. # # Scope: fast smoke coverage to fail early on MSAL upgrade regressions, # accidental public-API changes, and broken WAM dependency wiring. # Does NOT exercise live authentication or mock IPublicClientApplication. # # Run locally: # Invoke-Pester .\MSCommerce.Tests.ps1 # # Tested with Pester 5.x on Windows. BeforeDiscovery { $script:ExpectedFunctions = @( 'Connect-MSCommerce', 'Get-MSCommercePolicies', 'Get-MSCommercePolicy', 'Get-MSCommerceProductPolicies', 'Get-MSCommerceProductPolicy', 'Update-MSCommerceProductPolicy' ) } BeforeAll { $script:ModuleRoot = $PSScriptRoot $script:ManifestPath = Join-Path $script:ModuleRoot 'MSCommerce.psd1' } Describe 'MSCommerce module loading' { It 'manifest file exists' { Test-Path $script:ManifestPath | Should -Be $true } It 'passes Test-ModuleManifest (catches missing PowerShellVersion when CompatiblePSEditions is set, PS Gallery publish validation)' { { Test-ModuleManifest $script:ManifestPath -ErrorAction Stop } | Should -Not -Throw } It 'imports without error' { Get-Module MSCommerce | Remove-Module -Force -ErrorAction SilentlyContinue { Import-Module $script:ManifestPath -Force -ErrorAction Stop } | Should -Not -Throw } It 'is re-importable in the same session (idempotent Add-Type)' { Import-Module $script:ManifestPath -Force -ErrorAction Stop { Import-Module $script:ManifestPath -Force -ErrorAction Stop } | Should -Not -Throw } It 'reports the expected ModuleVersion' { Import-Module $script:ManifestPath -Force -ErrorAction Stop (Get-Module MSCommerce).Version.ToString() | Should -BeLike '3.*' } It 'advertises both Desktop and Core editions' { Import-Module $script:ManifestPath -Force -ErrorAction Stop $editions = (Get-Module MSCommerce).CompatiblePSEditions $editions | Should -Contain 'Desktop' $editions | Should -Contain 'Core' } } Describe 'WAM dependency types resolve' { BeforeAll { Import-Module $script:ManifestPath -Force -ErrorAction Stop } It 'Microsoft.Identity.Client.BrokerOptions is loaded' { { [Microsoft.Identity.Client.BrokerOptions] } | Should -Not -Throw } It 'Microsoft.Identity.Client.Broker.BrokerExtension is loaded' { { [Microsoft.Identity.Client.Broker.BrokerExtension] } | Should -Not -Throw } It 'Microsoft.Identity.Client.PublicClientApplicationBuilder is loaded' { { [Microsoft.Identity.Client.PublicClientApplicationBuilder] } | Should -Not -Throw } It 'MSCommerceNativeMethods P/Invoke type is loaded' { { [MSCommerceNativeMethods] } | Should -Not -Throw } It 'MSCommerceNativeMethods.GetConsoleOrTerminalWindow exists' { [MSCommerceNativeMethods].GetMethod('GetConsoleOrTerminalWindow') | Should -Not -BeNullOrEmpty } } Describe 'Public API contract' { BeforeAll { Import-Module $script:ManifestPath -Force -ErrorAction Stop } It 'exports <_>' -ForEach $ExpectedFunctions { Get-Command -Module MSCommerce -Name $_ -ErrorAction SilentlyContinue | Should -Not -BeNullOrEmpty } It 'Connect-MSCommerce no longer accepts -RedirectUri (SR13 mitigation, ICM 796868403)' { (Get-Command Connect-MSCommerce).Parameters.ContainsKey('RedirectUri') | Should -Be $false } It 'Connect-MSCommerce exposes -ClientId' { (Get-Command Connect-MSCommerce).Parameters.ContainsKey('ClientId') | Should -Be $true } It 'Connect-MSCommerce exposes -Resource' { (Get-Command Connect-MSCommerce).Parameters.ContainsKey('Resource') | Should -Be $true } } # SIG # Begin signature block # MIIo2QYJKoZIhvcNAQcCoIIoyjCCKMYCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBFgN9A3DP3dM/h # uTWGVZxJ0ZWE5P7YpD8g4cafuBjIjKCCDcMwggatMIIElaADAgECAhMzAAAA0wKI # 2Gm93wIJAAAAAADTMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMzAxBgNVBAMTKkF6dXJlIFJTQSBQ # dWJsaWMgU2VydmljZXMgQ29kZSBTaWduaW5nIFBDQTAeFw0yNjAzMDUxOTA2MTla # Fw0yNzAzMDMxOTA2MTlaMIGCMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu # Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv # cmF0aW9uMSwwKgYDVQQDEyNBenVyZSBQdWJsaWMgU2VydmljZXMgUlNBIENvZGUg # U2lnbjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMmsOxnEYc0FiPlE # +RHIYQgZmVwJCSoTtJ0ZrpzYU8Awa7Ukuoe6vyo1aNHmzB6QwyfRZLPb5ATRzzjz # Ae+pVUulZX5SfdDTUOfLOOJ9p7iH6TOFBNQiFfaspBsYd2oF7stfIKCR8OtM0tew # jXEBcDADjYCv4+lV3WS2otKwzqnCqsz8UV8SLOX2HmC2sQhk4On6Oj28RLEq8can # 8h9xrt78iW4N4l98/gwT98W1TNQIsf8jB66CJRyxpOZ7BKfLih1gu2Zkr/OkG4+M # ZMulSefgczJZctRI4WWC8WssoI9nFs3FfEGjkRSq7OsVumD02ZBWKklCwoNIo0eW # 5PA2Jwi0WlmmI8xztjYsbXV00CKXfIkQEsUxD/lGpCm1xaaBIqgbxPHvH5EJhCPh # KOXbIm37g7KRWf3+RDnCjq/pOYgcdmwp2aAiQwIoG4hFwHYVobAtj5QYw/XGaLAh # p6SCNSBXBdfwq//ZJgj1deuPJQwTg0uPQlMEg7thfbTWBhg4vwIDAQABo4IBuTCC # AbUwDgYDVR0PAQH/BAQDAgeAMB8GA1UdJQQYMBYGCCsGAQUFBwMDBgorBgEEAYI3 # WwEBMB0GA1UdDgQWBBToMh9qoEACbff9AUkZiJ9lR5AHcDBFBgNVHREEPjA8pDow # ODEeMBwGA1UECxMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMRYwFAYDVQQFEw00Njk5 # ODErNTA3MTgxMB8GA1UdIwQYMBaAFPEvupEWfN59Uicx9Xr71VhZaTo9MG8GA1Ud # HwRoMGYwZKBioGCGXmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3Js # L0F6dXJlJTIwUlNBJTIwUHVibGljJTIwU2VydmljZXMlMjBDb2RlJTIwU2lnbmlu # ZyUyMFBDQS5jcmwwfAYIKwYBBQUHAQEEcDBuMGwGCCsGAQUFBzAChmBodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL0F6dXJlJTIwUlNBJTIwUHVi # bGljJTIwU2VydmljZXMlMjBDb2RlJTIwU2lnbmluZyUyMFBDQS5jcnQwDAYDVR0T # AQH/BAIwADANBgkqhkiG9w0BAQwFAAOCAgEAokRajG6jg8NQ4+ul6plkF1wQGMih # hBmNK8QgxN3R9x/z2tY39+vpxsCzd9m1HUtDaRFajaZiLGYBCmbqKMBi7dCD780g # eh++I5UIOoeZpAYSLCKgGxvsS31XsH2uqySwmyVPIIlQli4hdoq/fuy48LtwWldp # pZo0ufSO7PWw8p2SW9M7bd/BxqGBE72ep32BOL2Pp3D+cQlRFajfZ2X6vF3KWe5F # 3pEemQkp2U9VdGuv9kvyxvJqSgJQ3jM1WK9QwuZSylhEkhXZOmRmidCeuZObpOlc # ZWAKOPnp25PNVr8ZEAotUEc2byN7p6yOCizC/p4eZiSaAlGO9n54c2Wgudd+oHKD # cLEnQZ36eNrlFNq9imUhz3N86Co2Dl7o1bwTRD8AjXXlZ+kz6dxZ6dap0+zVguKf # JR1EPGINOaFhPI3WncWiMa3Iz6atBUi8LaXzNCv8s0JO/P92PaFaqwX/tIOcrjAT # zXZgCnqk9+C2voF9UPQswm76zp/Y9d6guyQDgBzY+gnPk3sWZ5jtafmyFkF/iE6o # Imyx3lkGlRu0ZiHeIKdBIk/0SiSjFXF7sPkeaSpNE2deogNDnNbpsvdIMJgUQbkR # a2pX1i13QyOmXH+zn7DVOdhtcgps/OLgedvdevSbxicy5XKGbEbIdnYKMylByWCh # yzZA2w7Kvt68sYMwggcOMIIE9qADAgECAhMzAAAAArLEk4h4WezTAAAAAAACMA0G # CSqGSIb3DQEBDAUAMFsxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xLDAqBgNVBAMTI01pY3Jvc29mdCBSU0EgU2VydmljZXMgUm9v # dCBDQSAyMDIxMB4XDTIxMDkwMjE3NDExOVoXDTM2MDkwMjE3NTExOVowYjELMAkG # A1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEzMDEGA1UE # AxMqQXp1cmUgUlNBIFB1YmxpYyBTZXJ2aWNlcyBDb2RlIFNpZ25pbmcgUENBMIIC # IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEApd39LL3WcWCx5Uk4WB5GFXGt # xqHKnVgZI3QWk4SARERVvc0P9CAjsjTJ3tcbo4TxWiavkUzG8rxO8ngtzos/0EPP # YZJrUzQuXMcpfvnv/bgLRmd3NxwDWpCLTT4GaY6vimWbFHNMW/g+F3DzIE8X0YO8 # KWpXwBK+9uK1+NoPt1U84Utvs3t++3+paiAY3l6KzQVcKpUl2Y9llpfaHiIbSi2w # CF+rzK9KUnRjA7iLkYN4tDBOww3VF/ZQAdAoJRiQWwtJDSaptpFsNmEH7akUv+r9 # zZrqGUcudqljJ/CU0VeQOHAAVYTN/AUcRHahHjZRrJ8322w7+na1aTfcKucd2d0k # OshnqhDcP42CiX9NHwECBcIgzqx7piUsNOzFHCH1BQOrspWErLnwcYolSrCAhbQT # ty+XNSXQd+395uEAtnIUOSGh/0LkKrhz/jzpcuNCrSdu4qwU2FBTTK8AFHd6iHDr # cqmzrpSZrjygTQmao7GbOs++shNhyycHIqV6Ief7jKr5Oz8qu2qRDBBy6KQw+tnB # cK2xiTExTJSfyCvyh7DbZYN4hAQIAzULP1Nx0lp2ytOgqpdBrZsCf8AAEBjKiA88 # 418a+iNMjcOVgPjZ60xr+A95klq9f7PvHx3/h5gGcn1YVKL2rS/68s4Zzd/IzYpC # 2rl5VsdfmtXJZzpsnfkCAwEAAaOCAcIwggG+MBAGCSsGAQQBgjcVAQQDAgEAMB0G # A1UdDgQWBBTxL7qRFnzefVInMfV6+9VYWWk6PTBUBgNVHSAETTBLMEkGBFUdIAAw # QTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9E # b2NzL1JlcG9zaXRvcnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsG # A1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFA4MsWRpvS2x # 1WsmpkfqVk6Aw+2KMGYGA1UdHwRfMF0wW6BZoFeGVWh0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFJTQSUyMFNlcnZpY2VzJTIw # Um9vdCUyMENBJTIwMjAyMS5jcmwwcwYIKwYBBQUHAQEEZzBlMGMGCCsGAQUFBzAC # hldodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29m # dCUyMFJTQSUyMFNlcnZpY2VzJTIwUm9vdCUyMENBJTIwMjAyMS5jcnQwDQYJKoZI # hvcNAQEMBQADggIBAGKfs8wGdeOcgnTH74ue50sNZadnx1mYnXgO5l9Syz92hROE # sAzhyusdpNsmi6VRQQs13YCc6lf9ni16dQxPeyNgh09jIl8hhY9Gp8jo1vP4lUrt # FG+faeXkQQwi5ETpQpL1kYFt/TZruxvTgT/sE382GGua1L+1UWN9GutWH3NeS7jm # upa4LBRPODcSrEpDw4Zu2MFC2r9LJv9yWbkEeyiHdeEydv1Uu/cbV241/3QUvn+j # zxdngvXyfHWV+TLaeWVjgcgDw8rwBquoBbiIpJMDcQaqfyz/jta1ApP6oQPZhtld # U5gv4vu9AMKcVvCGADHq5y4zPsB7WuqJuDcCOwLtTkzegD++oAcMoMDeZ0zkPov9 # kR1CBobbQeFQ5JD4KJAPdPIdKJUJ9Uy5O/zciIoKeLctb/be0cLa1s3nuuWExyjK # MiL4hV3uPuzjUwUFoPAmuZ9ef9gz6VH/lCq87vNYBtuv9dTnfW/eOv+MGKWauq3p # T9vvLxNfID2djFX2JIwWZxvIiLbGB1wAeHGeldy9y/IVYRPpiImLJ5IlnDAm/yDB # eIEX5mHQgcCuXopWxsB2wBO4/VMIQGk/KddmaS+IgRY+2e/fXlmNMLuc+g6lKc5V # o7vBnO2s559m6cjl8HHDuYbWjKhGcANlrCIWxWj0n9wO7XkStEJ8NBGHBKIFMYIa # bDCCGmgCAQEweTBiMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENv # cnBvcmF0aW9uMTMwMQYDVQQDEypBenVyZSBSU0EgUHVibGljIFNlcnZpY2VzIENv # ZGUgU2lnbmluZyBQQ0ECEzMAAADTAojYab3fAgkAAAAAANMwDQYJYIZIAWUDBAIB # BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEINiCOOEdlu7bhSRsA9wwSFQx # nY0AZB0jRrb1HuhCGLAYMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A # cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB # BQAEggGAqH8le850wb/vPg9SRQ3DxnupBfbfSrsYh3PaqX9C+aM8tb3qo5EREYTq # wlav8htKRSCntg4RYic5LMm/FYMNFUjaPBRfvazLkNX1eOinNko+6nmmARssWTTh # 0JenQONevwoRsQ6FzaPkKy01w/tBdV7cvh9M5K6mqMKrzINXZ4MNfjGErQGArobv # n5UvjBbB3rw5NbmS4x8BHgrU1MOmUypIWJb9a234Zjx7hNuK1PRKMUfPL+ERbDo5 # rxucW7NgqvN7DDEu/6SFfQ+JTkWqJ7zlTHQ/q5a3VStxaFwWMJElmL7yuormykDL # 7fXpejL7rLdl28UfjruleVN4IVxrFYv+P04q8uy22Pfosvpx0w2TYMwITi4LpDeu # dotjR/Hkbrq9tW/eNM0Bauo7x6Ycw4V/U84JfzT5cMPoneSMNNfA9MKfXyImH085 # 84ofXiGimjr5kmgEq6OQYtOJqxo3pjSCHJ1hoXgzuVhtzKnwkJDElfyFpIIDpX5H # U+G/mCZwoYIXkzCCF48GCisGAQQBgjcDAwExghd/MIIXewYJKoZIhvcNAQcCoIIX # bDCCF2gCAQMxDzANBglghkgBZQMEAgEFADCCAVEGCyqGSIb3DQEJEAEEoIIBQASC # ATwwggE4AgEBBgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIMYf8gpU+i6t # zbe1zI1aXb8Z95kJk3XDmKNavWCqLgcWAgZqF1D4+ZkYEjIwMjYwNjA0MjA0MzU5 # Ljc2WjAEgAIB9KCB0aSBzjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp # bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw # b3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEn # MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOkUwMDItMDVFMC1EOTQ3MSUwIwYDVQQD # ExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIR6jCCByAwggUIoAMCAQIC # EzMAAAIpDtVkKrSX8hoAAQAAAikwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMC # VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV # BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRp # bWUtU3RhbXAgUENBIDIwMTAwHhcNMjYwMjE5MTk0MDA3WhcNMjcwNTE3MTk0MDA3 # WjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT # B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UE # CxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVs # ZCBUU1MgRVNOOkUwMDItMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGlt # ZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA # niLRauM9aAmEplGZqWA7GyVhLvvtW23PzM+z2tyNGV+RDjfloqwdBb5xpchUVMpc # zuUyV2X1PEBTzlPeT9WNTmfCfqrgORvgFkgTq/+PLHJdLPUQaaoEzKv5W8qgc+Aj # Jr1UdkHrwIFaeGtYW5jpvRu2FnsuvDeRea0g2FdMDJYOCMvGEbhYETdngaVV7fSL # xWhZgZ0C2X6Ntimdy/D1hB1IV1OXSzkmaE36qkPwfnXluegAjJ5x4z8WbvrMx4WT # C1KzFk4LPSewp/A7XpXCo/WjPtGau7ZEgxwq8KOngkn8N3JZLV0Ua3ZrHHGpfEQg # 4jRRYGbMqcBdmhgBepIONfkJfrYV6ZzjFB+JjwgCWVqdMw1qMLCv2KOYxy9aU/wI # Gy9xaAMuHG4TiOD29XkBRvo0+7JEthf2/mQAlANRA2fN9CvgbtMsPhaUhsvLaXdb # M5N3FGIyKcyBuM96BTZokiTfGHTXeEh7BEeQ5LOW8Yim6b5n6zgN/Y02+xFtk0+8 # kloCSEn703s7i5kLE1UszbL2qVZR4RNswag8ONPZ7zrYrQhW54YVzX2rc29vhn9r # V9rOmAWtedQgv/Pnpib73oF21jbnc2LfHBUaJtD2fnyUYYQX3Uqgqq/EHjhifFWJ # ZsRV6sdUnQ0pEwkoKbLJBqmcIf+rpgNYOC+83hgTZ4ECAwEAAaOCAUkwggFFMB0G # A1UdDgQWBBQnTUWki/QFvEL2kNtVo0QFyjeDOzAfBgNVHSMEGDAWgBSfpxVdAF5i # XYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jv # c29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENB # JTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRp # bWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1Ud # JQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsF # AAOCAgEAPcHO9pX/3Mw4adPU9zxgDDkIcZf8dOI6RO7d/RXqkEp9lKeg1c4YMJ8w # qmNzSIS7VGlq3ezcb64WQ3GvieMc760UDTx3kUKZyVXh7Mk7ud4EwZVAdU0SOjp2 # bfwFZkfaDCfzQTqgfnfkjm/D8es0YEcJOtrBZDpAeZYoPwzJ2BHkf2plvR3aPL13 # Cpmmvw20jgB0nX2RbfoqjGXzZZBDp+9f0QCkzb+EKav9hYXIzDJkpCIbIQXQVQdF # Y5pMBX4VVH+U07iyfbA0eBMgrzmSdweoOyMOlo0McnI8JH87FTE6X7rCeUsHThy/ # Mhj1mTnj48GvCEl1rOpIlSv+ktPyVW9S6cacmCkREI51P+TnnCrdjl5R3cBVma8A # IvfET2WuhBMXG/yxi39dLTR47tXk5aIWNI8zWUNAQ4ErjGYDFPvBBI7TEDCA55Tx # hFDjeyx1xx9Ci9BQNNTxFlWSq6/y1Drrg0zRc8OeNxTzKeIJAiBZSnUbnIkdSFzp # Pl7Huq4/bSRWIFZ/uOAR6Ltl0HuUV99Hn9wEFmtJschg6icxrFd1+fmzUHjFfPIl # rpST6ubIJxhvTvx9fxx+B7DvWShl/1qyaUJhbkK0zkePV473mgtMWhZhrDYPkYW7 # Q+ak5J/iEg78NCCfxP1VzXc/8loKJeq+dO4U/LADLqZ4ZBdrsNQwggdxMIIFWaAD # AgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYD # VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv # ZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIy # MjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo # aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y # cG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEw # MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5 # vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64 # NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhu # je3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl # 3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPg # yY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I # 5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2 # ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/ # TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy # 16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y # 1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6H # XtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMB # AAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQW # BBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30B # ATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz # L0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYB # BAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMB # Af8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBL # oEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMv # TWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggr # BgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNS # b29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1Vffwq # reEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27 # DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pv # vinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9Ak # vUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWK # NsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2 # kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+ # c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep # 8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+Dvk # txW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1Zyvg # DbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/ # 2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDTTCCAjUCAQEwgfmhgdGkgc4w # gcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsT # HE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQg # VFNTIEVTTjpFMDAyLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUt # U3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUAt7/YkjttsaG+2cTeXVwhKvvS # L/+ggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ # MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u # MSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG # 9w0BAQsFAAIFAO3MWkowIhgPMjAyNjA2MDQyMDEwNTBaGA8yMDI2MDYwNTIwMTA1 # MFowdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA7cxaSgIBADAHAgEAAgIZYTAHAgEA # AgIVVTAKAgUA7c2rygIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMC # oAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQDNteQt # xHxY9z5/t5ueRuwM+YTMC6TgTctE80pLdy7EtNBEEGsCbZbcSFPh/uVta7uG31XE # pGL6a2KGqVcbRg111UGBiuXngl6cI43FWEKdbjbudNAGhdhpbg3TOGe6+YZHidMF # i7V/f1PGrycxJgW/L3BDMo81PtH+8tRM62uVGE1LZDa1+If7va92yfgeIKcMMAMZ # ZctLbZ6vQ4WmwWa33ETyw+4rDZ6U6oICS4VdC4hbkw7vWFzdmpieVag78eixkQ2f # 9c5ejnEt+MQKaT4B7D1/dDjifSgFFD65xiEzjRVHRl/6NNHTIUnId6XrqkgK+HGd # AsnKyWKv8wCCUlYfMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg # UENBIDIwMTACEzMAAAIpDtVkKrSX8hoAAQAAAikwDQYJYIZIAWUDBAIBBQCgggFK # MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgSa0E # RNZ1SkCcxE0bjjYCbemwApLwuQ74HK/ZXkNqgwYwgfoGCyqGSIb3DQEJEAIvMYHq # MIHnMIHkMIG9BCC3yj3xIrbw/5UrxLpsaj5JHjhLYJJihRFTLnpfaDq6kjCBmDCB # gKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH # EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNV # BAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAACKQ7VZCq0l/Ia # AAEAAAIpMCIEIGNvLreC9lyxOTWSHuSRToCDLusAMwg9dgXq3iv+sAmbMA0GCSqG # SIb3DQEBCwUABIICADQKwfnXCwSdn+zkBzMoaQ4TrlXSlar2W6JR7yWB1X/yBP9Z # 5/gYVbmzcP99r1+pm11q1YFbyTvJLLmxqdY+ObR1j4zWEpRrTNG0kT7F4DNi2g6k # YnZ1HWvrv88n60fuaG6yeDUKwIXNeKM+gXkGKZ/O95EVUDDl7UeSQxHMKdhnruj5 # 7xGT3bJ0xq9XlxQxawmSb8qzR2Faj/4Ntv+narDwCgsedfk9T6hY+5T8t3ifev7s # wuOm2RMA9mITUI8iD0J8x/AiHC2iJIw7cgUMpezz/YWM9MzvJmLNFRQ9ntf+lPCq # cG4UHqxz609U7EyOG4WA/okpK8JgRN758eNvRA625LsKRjcMwHmTg9dq3XtkmASn # QdLyC2+Gug9/f7Nrs3cnIQbsnnlpbbeOWllHr1K0CctMPLa0EWRMlsc4VIP7FARB # 3LsmReU39rY43xg2zSpxv4A2VE9cIi7FL6LmkdLp+k3cN9QMPYipT8goTRMQezem # yWPs0X9SL9s84HwE2WbLWSn06AqemJqgOt4eM8RTKyn88YgFSpN5OAztOmn1np3r # 4YPSp7D2oZz2kvW3CCT9eQCJtrbAoSydROSUiGODY5PjyAR6m5EYL8lQV2QBXbeq # R39LKw4D1+w0YXRv7Pe/rftF37Cr8n7b1tR/KQCJwSEEos6ngHHGS20t+HLj # SIG # End signature block |