Az.Bootstrapper.ScenarioTests.ps1
Import-Module -Name Az.Bootstrapper $RollupModule = 'Az' # Enable PS Remoting for creating new sessions; This setting is required to create new powershell sessions in Core. Enable-PSRemoting $psConfig = Get-PSSessionConfiguration $psConfigName = $psConfig[0].Name InModuleScope Az.Bootstrapper { $ProfileMap = (Get-AzProfileMap) # Helper function to uninstall all profiles function Remove-InstalledProfile { $installedProfiles = Get-ProfilesInstalled -ProfileMap $ProfileMap if ($null -ne $installedProfiles.Keys) { foreach ($profile in $installedProfiles.Keys) { Write-Host "Removing profile $profile" Uninstall-AzProfile -Profile $profile -Force -ErrorAction SilentlyContinue } $profiles = (Get-ProfilesInstalled -ProfileMap $ProfileMap) if ($profiles.Count -ne 0) { Throw "Uninstallation was not successful: Profile(s) $(@($profiles.Keys) -join ',') were not uninstalled correctly." } } } Describe "A machine with no profile installed can install profile" { # Using Install-AzProfile Context "New Profile Install - 2019-03-01-hybrid" { # Arrange # Uninstall previously installed profiles Remove-InstalledProfile # Launch the test in a new powershell session # Create a new PS session $session = New-PSSession -ComputerName localhost -ConfigurationName $psConfigName # Keep this for testing private drops # Invoke-Command -Session $session -ScriptBlock { Register-PSRepository -Name "azsrepo" -SourceLocation "D:\psrepo" -InstallationPolicy Trusted } # Invoke-Command -Session $session -ScriptBlock { Set-BootStrapRepo -Repo azsrepo } # Act # Install 2019-03-01-hybrid version Invoke-Command -Session $session -ScriptBlock { Install-AzProfile -Profile '2019-03-01-hybrid' -Force } # Assert; This test will fail if run on PS 5.1; works only on core due to GMO 'Az' returns empty on 5.1 bug. It "Should return 2019-03-01-hybrid Profile" { $result = Invoke-Command -Session $session -ScriptBlock { Get-AzApiProfile } $result[0].ProfileName.Contains('2019-03-01-hybrid') | Should Be $true } # Clean up Remove-PSSession -Session $session } # Using Use-AzProfile Context "New Profile Install - 2019-03-01-hybrid using Use-AzProfile" { # Arrange # Uninstall previously installed profiles Remove-InstalledProfile # Create a new PS session $session = New-PSSession -ComputerName localhost -ConfigurationName $psConfigName # Act # Install profile '2019-03-01-hybrid' # Invoke-Command -Session $session -ScriptBlock { Set-BootStrapRepo -Repo azsrepo } Invoke-Command -Session $session -ScriptBlock { Use-AzProfile -Profile '2019-03-01-hybrid' -Force } # Assert It "Should return 2019-03-01-hybrid" { $result = Invoke-Command -Session $session -ScriptBlock { Get-AzApiProfile } $result[0].ProfileName.Contains('2019-03-01-hybrid') | Should Be $true } # Clean up Remove-PSSession -Session $session } } Describe "Attempting to use already installed profile will import the modules to the current session" { InModuleScope Az.Bootstrapper { Context "Profile 2019-03-01-hybrid is installed" { # Should import Latest profile to current session # Arrange # Create a new PS session $session = New-PSSession -ComputerName localhost -ConfigurationName $psConfigName # Ensure profile 2019-03-01-hybrid is installed $profilesInstalled = Invoke-Command -Session $session -ScriptBlock { Get-AzApiProfile } ($profilesInstalled -like "*hybrid*") -ne $null | Should Be $true # Act # Invoke-Command -Session $session -ScriptBlock { Set-BootStrapRepo -Repo azsrepo } Invoke-Command -Session $session -ScriptBlock { Use-AzProfile -Profile '2019-03-01-hybrid' -Force } # Get the version of the 2019-03-01-hybrid profile $ProfileMap = Get-AzProfileMap $latestVersion = $ProfileMap.'2019-03-01-hybrid'.$RollupModule # Assert It "Should return Az module 2019-03-01-hybrid version" { # Get-module script block $getModule = { Param($RollupModule) Get-Module -Name $RollupModule } $modules = Invoke-Command -Session $session -ScriptBlock $getModule -ArgumentList $RollupModule $modules.Name | Should Be $RollupModule $modules.version | Should Be $latestVersion } # Cleanup Remove-PSSession -Session $session } } } Describe "User can uninstall a profile" { InModuleScope Az.Bootstrapper { Context "2019-03-01-hybrid profile is installed" { # Should uninstall 2019-03-01-hybrid profile # Arrange # Create a new PS session $session = New-PSSession -ComputerName localhost -ConfigurationName $psConfigName # Check if '2019-03-01-hybrid' is installed # Invoke-Command -Session $session -ScriptBlock { Set-BootStrapRepo -Repo azsrepo } $profilesInstalled = Invoke-Command -Session $session -ScriptBlock { Get-AzApiProfile } ($profilesInstalled -like "*hybrid*") -ne $null | Should Be $true # Get the version of the Latest profile $ProfileMap = Get-AzProfileMap $latestVersion = $ProfileMap.'2019-03-01-hybrid'.$RollupModule # Act Invoke-Command -Session $session -ScriptBlock { Uninstall-AzProfile -Profile '2019-03-01-hybrid' -Force } # Assert It "Profile 2019-03-01-hybrid is uninstalled" { $result = Invoke-Command -Session $session -ScriptBlock { Get-AzApiProfile } if ($result -ne $null) { $result.Contains('2019-03-01-hybrid') | Should Be $false } else { $true } } It "Available Modules should not contain uninstalled modules" { $getModule = { Param($RollupModule) Get-Module -Name $RollupModule -ListAvailable } $results = Invoke-Command -Session $session -ScriptBlock $getModule -ArgumentList $RollupModule foreach ($result in $results) { $result.Version -eq $latestVersion | Should Be $false } } # Cleanup Remove-PSSession -Session $session } } } Describe "Invalid Cases" { Context "Install wrong profile name" { # Install profile 'abcTest' It "Throws Invalid argument error" { { Install-AzProfile -Profile 'abcTest' } | Should Throw } } Context "Install null profile name" { # Install profile 'null' It "Throws Invalid argument error" { { Install-AzProfile -Profile $null } | Should Throw } } Context "Install already installed profile" { # Arrange # Create a new PS session $session = New-PSSession -ComputerName localhost -ConfigurationName $psConfigName # Invoke-Command -Session $session -ScriptBlock { Set-BootStrapRepo -Repo azsrepo } # Ensure profile 2019-03-01-hybrid is installed Set-BootStrapRepo -Repo azsrepo Install-AzProfile -Profile '2019-03-01-hybrid' -Force $installedProfile = Invoke-Command -Session $session -ScriptBlock { Get-AzApiProfile } ($installedProfile -like "*hybrid*") -ne $null | Should Be $true # Act # Install profile '2019-03-01-hybrid' $result = Invoke-Command -Session $session -ScriptBlock { Install-AzProfile -Profile '2019-03-01-hybrid' -Force } # Get modules imported into the session $getModuleList = { Param($RollupModule) Get-Module -Name $RollupModule } $modules = Invoke-Command -Session $session -ScriptBlock $getModuleList -ArgumentList $RollupModule It "Doesn't install/import the profile" { $result | Should Be $null $modules | Should Be $null } # Cleanup Remove-PSSession -Session $session } Context "Use-AzProfile with wrong profile name" { # Install profile 'abcTest' It "Throws Invalid argument error" { { Use-AzProfile -Profile 'abcTest' } | Should Throw } } } Describe "Install profiles using Scope" { InModuleScope Az.Bootstrapper { Context "Using Install-AzProfile: Scope 'CurrentUser'" { # Arrange # Create a new PS session $session = New-PSSession -ComputerName localhost -ConfigurationName $psConfigName # Remove installed profiles Remove-InstalledProfile # Act # Install profile 2019-03-01-hybrid scope as current user # Invoke-Command -Session $session -ScriptBlock { Set-BootStrapRepo -Repo azsrepo } Invoke-Command -Session $session -ScriptBlock { Install-AzProfile -Profile '2019-03-01-hybrid' -scope 'CurrentUser' -Force } # Assert It "Installs & Imports 2019-03-01-hybrid profile to the session" { # Get the version of the Latest profile $ProfileMap = Get-AzProfileMap $latestVersion = $ProfileMap.'2019-03-01-hybrid'.$RollupModule $getModuleList = { Param($RollupModule, $latestVersion) Get-Module -Name $RollupModule -ListAvailable | Where-Object { $_.Version -like $latestVersion } } $modules = Invoke-Command -Session $session -ScriptBlock $getModuleList -ArgumentList @($RollupModule, $latestVersion) # Are latest modules imported? $modules.Name | Should Be $RollupModule $modules.version | Should Be $latestVersion } } Context "Using Use-AzProfile: Scope 'AllUsers'" { # Arrange # Create a new PS session $session = New-PSSession -ComputerName localhost -ConfigurationName $psConfigName # Remove installed profiles Remove-InstalledProfile # Act # Install profile 2019-03-01-hybrid scope as all users # Invoke-Command -Session $session -ScriptBlock { Set-BootStrapRepo -Repo azsrepo } Invoke-Command -Session $session -ScriptBlock { Use-AzProfile -Profile '2019-03-01-hybrid' -scope 'AllUsers' -Force } # Assert It "Installs & Imports 2019-03-01-hybrid profile to the session" { $getModuleList = { Param($RollupModule) Get-Module -Name $RollupModule } $modules = Invoke-Command -Session $session -ScriptBlock $getModuleList -ArgumentList $RollupModule # Get the version of the 2019-03-01-hybrid profile $ProfileMap = Get-AzProfileMap $version = $ProfileMap.'2019-03-01-hybrid'.$RollupModule # Are appropriate modules imported? $modules.Name | Should Be $RollupModule $modules.version | Should Be $version } } Context "Using Update-AzProfile: Scope 'CurrentUser' " { # Arrange # Create a new PS session $session = New-PSSession -ComputerName localhost -ConfigurationName $psConfigName # Remove installed profiles Remove-InstalledProfile # Act # Install profile 2019-03-01-hybrid scope as current user # Invoke-Command -Session $session -ScriptBlock { Set-BootStrapRepo -Repo azsrepo } Invoke-Command -Session $session -ScriptBlock { Update-AzProfile -Profile '2019-03-01-hybrid' -scope 'CurrentUser' -Force -r } # Assert It "Installs & Imports 2019-03-01-hybrid profile to the session" { $getModuleList = { Param($RollupModule) Get-Module -Name $RollupModule } $modules = Invoke-Command -Session $session -ScriptBlock $getModuleList -ArgumentList $RollupModule # Get the version of the 2019-03-01-hybrid profile $ProfileMap = Get-AzProfileMap $version = $ProfileMap.'2019-03-01-hybrid'.$RollupModule # Are correct modules imported? $modules.Name | Should Be $RollupModule $modules.version | Should Be $version } } } } Describe "Load/Import AzProfile modules" { InModuleScope Az.Bootstrapper { Context "Using Use-AzProfile: Modules are not installed" { # Arrange # Create a new PS session $session = New-PSSession -ComputerName localhost -ConfigurationName $psConfigName # Remove installed profiles Remove-InstalledProfile # Act # Use module from Latest profile scope as current user # Invoke-Command -Session $session -ScriptBlock { Set-BootStrapRepo -Repo azsrepo } Invoke-Command -Session $session -ScriptBlock { Use-AzProfile -Profile '2019-03-01-hybrid' -Module 'Az.Storage' -Force -scope 'CurrentUser' } # Assert $RollupModule = 'Az.Storage' It "Installs & Imports 2019-03-01-hybrid profile's module to the session" { $getModuleList = { Param($RollupModule) Get-Module -Name $RollupModule } $modules = Invoke-Command -Session $session -ScriptBlock $getModuleList -ArgumentList $RollupModule # Get the version of the 2019-03-01-hybrid profile $ProfileMap = Get-AzProfileMap $version = $ProfileMap.'2019-03-01-hybrid'.$RollupModule # Are 2019-03-01-hybrid modules imported? $modules.Name | Should Be $RollupModule $modules.version | Should Be $version } } } } } # SIG # Begin signature block # MIIjhgYJKoZIhvcNAQcCoIIjdzCCI3MCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAsoA1Xv4YNIuoZ # eBrscaEWTb9Y4cJmtI5AttyZ7nzxHKCCDYEwggX/MIID56ADAgECAhMzAAABUZ6N # j0Bxow5BAAAAAAFRMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMTkwNTAyMjEzNzQ2WhcNMjAwNTAyMjEzNzQ2WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQCVWsaGaUcdNB7xVcNmdfZiVBhYFGcn8KMqxgNIvOZWNH9JYQLuhHhmJ5RWISy1 # oey3zTuxqLbkHAdmbeU8NFMo49Pv71MgIS9IG/EtqwOH7upan+lIq6NOcw5fO6Os # +12R0Q28MzGn+3y7F2mKDnopVu0sEufy453gxz16M8bAw4+QXuv7+fR9WzRJ2CpU # 62wQKYiFQMfew6Vh5fuPoXloN3k6+Qlz7zgcT4YRmxzx7jMVpP/uvK6sZcBxQ3Wg # B/WkyXHgxaY19IAzLq2QiPiX2YryiR5EsYBq35BP7U15DlZtpSs2wIYTkkDBxhPJ # IDJgowZu5GyhHdqrst3OjkSRAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUV4Iarkq57esagu6FUBb270Zijc8w # UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1 # ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDU0MTM1MB8GA1UdIwQYMBaAFEhu # ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu # bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w # Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx # MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAWg+A # rS4Anq7KrogslIQnoMHSXUPr/RqOIhJX+32ObuY3MFvdlRElbSsSJxrRy/OCCZdS # se+f2AqQ+F/2aYwBDmUQbeMB8n0pYLZnOPifqe78RBH2fVZsvXxyfizbHubWWoUf # NW/FJlZlLXwJmF3BoL8E2p09K3hagwz/otcKtQ1+Q4+DaOYXWleqJrJUsnHs9UiL # crVF0leL/Q1V5bshob2OTlZq0qzSdrMDLWdhyrUOxnZ+ojZ7UdTY4VnCuogbZ9Zs # 9syJbg7ZUS9SVgYkowRsWv5jV4lbqTD+tG4FzhOwcRQwdb6A8zp2Nnd+s7VdCuYF # sGgI41ucD8oxVfcAMjF9YX5N2s4mltkqnUe3/htVrnxKKDAwSYliaux2L7gKw+bD # 1kEZ/5ozLRnJ3jjDkomTrPctokY/KaZ1qub0NUnmOKH+3xUK/plWJK8BOQYuU7gK # YH7Yy9WSKNlP7pKj6i417+3Na/frInjnBkKRCJ/eYTvBH+s5guezpfQWtU4bNo/j # 8Qw2vpTQ9w7flhH78Rmwd319+YTmhv7TcxDbWlyteaj4RK2wk3pY1oSz2JPE5PNu # Nmd9Gmf6oePZgy7Ii9JLLq8SnULV7b+IP0UXRY9q+GdRjM2AEX6msZvvPCIoG0aY # HQu9wZsKEK2jqvWi8/xdeeeSI9FN6K1w4oVQM4Mwggd6MIIFYqADAgECAgphDpDS # AAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0 # ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5MDlaFw0yNjA3MDgyMTA5MDla # MH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMT # H01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwggIiMA0GCSqGSIb3DQEB # AQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQTTS68rZYIZ9CGypr6VpQqrgG # OBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULTiQ15ZId+lGAkbK+eSZzpaF7S # 35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYSL+erCFDPs0S3XdjELgN1q2jz # y23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494HDdVceaVJKecNvqATd76UPe/7 # 4ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZPrGMXeiJT4Qa8qEvWeSQOy2u # M1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5bmR/U7qcD60ZI4TL9LoDho33 # X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGSrhwjp6lm7GEfauEoSZ1fiOIl # XdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADhvKwCgl/bwBWzvRvUVUvnOaEP # 6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON7E1JMKerjt/sW5+v/N2wZuLB # l4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xcv3coKPHtbcMojyyPQDdPweGF # RInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqwiBfenk70lrC8RqBsmNLg1oiM # CwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFEhuZOVQ # BdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud # DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFHItOgIxkEO5FAVO # 4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwubWljcm9zb2Z0 # LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y # Mi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUFBzAChkJodHRwOi8vd3d3Lm1p # Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y # Mi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGCNy4DMIGDMD8GCCsGAQUFBwIB # FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2RvY3MvcHJpbWFyeWNw # cy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AcABvAGwAaQBjAHkA # XwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAGfyhqWY # 4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4sPvjDctFtg/6+P+gKyju/R6mj # 82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKLUtCw/WvjPgcuKZvmPRul1LUd # d5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7pKkFDJvtaPpoLpWgKj8qa1hJ # Yx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft0N3zDq+ZKJeYTQ49C/IIidYf # wzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4MnEnGn+x9Cf43iw6IGmYslmJ # aG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxvFX1Fp3blQCplo8NdUmKGwx1j # NpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG0QaxdR8UvmFhtfDcxhsEvt9B # xw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf0AApxbGbpT9Fdx41xtKiop96 # eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkYS//WsyNodeav+vyL6wuA6mk7 # r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrvQQqxP/uozKRdwaGIm1dxVk5I # RcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIVWzCCFVcCAQEwgZUwfjELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z # b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAVGejY9AcaMOQQAAAAABUTAN # BglghkgBZQMEAgEFAKCBrjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor # BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgsiTiilMn # +iVgLFNod1MtWL0RAZziqPaqyCZxN9mEygYwQgYKKwYBBAGCNwIBDDE0MDKgFIAS # AE0AaQBjAHIAbwBzAG8AZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTAN # BgkqhkiG9w0BAQEFAASCAQAsqcNlK6esWK/MbQnOiroihgHfceaoePYxQuB02Hrf # u/ZZ6vSYrPzGOwmTI30AdVyCOZodkbN5LVn01SLm0XFYUI/FEdLd0wdNl7IW5eCw # eloLfDl6oE8deaNgJ19su++USGTgP8QAOoMMyMwV+QVd0EWBTuRaur8ZULntzuX4 # EEysmUOCAEo5/rfkhVzr8cu5UOKU/Szftj2mwwtgPPQZF1KH86EtTODXUlH49NFg # 279pm3+M3gAJfdj3Pw9Jje509w8qiHAN40o3ujHoCBNdTcJgCRJgXlpcBohH9u+o # lwRH3X2J6ACsWg2H+W4Gbdi/jI5bLnHyz+sKorT+im+OoYIS5TCCEuEGCisGAQQB # gjcDAwExghLRMIISzQYJKoZIhvcNAQcCoIISvjCCEroCAQMxDzANBglghkgBZQME # AgEFADCCAVEGCyqGSIb3DQEJEAEEoIIBQASCATwwggE4AgEBBgorBgEEAYRZCgMB # MDEwDQYJYIZIAWUDBAIBBQAEIBPGg07KyQtrVq/b2yr85rQFPyzNyvQGQ4BCFPt7 # TjJDAgZee8EkqFUYEzIwMjAwNDEzMTU1NjQ1Ljk3NlowBIACAfSggdCkgc0wgcox # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1p # Y3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJjAkBgNVBAsTHVRoYWxlcyBUU1Mg # RVNOOjIyNjQtRTMzRS03ODBDMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFt # cCBTZXJ2aWNloIIOPDCCBPEwggPZoAMCAQICEzMAAAEY/jr32RvUsTMAAAAAARgw # DQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0 # b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh # dGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcN # MTkxMTEzMjE0MDM1WhcNMjEwMjExMjE0MDM1WjCByjELMAkGA1UEBhMCVVMxEzAR # BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2Eg # T3BlcmF0aW9uczEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046MjI2NC1FMzNFLTc4 # MEMxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEiMA0G # CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDC+ANcEX8/NRj1t5YkXYB1ZHPxQSwr # hOOfXX1c5aes0t2gTI6OeH4ntcwpyTvSk7+9BBVoqTvHwfbDZmb15nQ94q+UPfBq # a/8m1tes/6Fbt1AeVHy4By1AVFi6Yi1vWd3bVRyY2SAeVonIzEFGGtQveRv2Yj6j # bCHE2+xP3Q+AcgxweE8l6/nAN5S/mTDKV2flHNQg+d5X9SSN7MdLC5OAJgSy374I # i/AnYEKyIgnOFJVkIxkLDxOyrnV/gORloaxyVGlDemnLBNahwsxnmkrpChcwvDie # Ax4g/Z1fJ0+C+wdA+EtA7rrgnRkjhKHfWkZj40bmx4GpQdJmF1zAZ0FxAgMBAAGj # ggEbMIIBFzAdBgNVHQ4EFgQU8VvlsC4PYAnYOU/05iPr+LTHKD4wHwYDVR0jBBgw # FoAU1WM6XIoxkPNDe3xGG8UzaFqFbVUwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDov # L2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGltU3RhUENB # XzIwMTAtMDctMDEuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNUaW1TdGFQQ0FfMjAx # MC0wNy0wMS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDCDAN # BgkqhkiG9w0BAQsFAAOCAQEAcyWdvg6cgs//AmxoQZm+WASpJzUXEPhMp30bWc5H # yCwQB+Ma6YPncSoFdct/5V1K4p/rMcMLBn5LzELVH+uztg6ERK48YtbJb9A7Jp+f # JZj7loXaP9mVP7tJs2tGuubcXpGbgo5HGCjn7gzMBHY45Q8LScfa1JFQEAiS2gCK # KRlrKMsGaIbi+UuBtsbQ8JknvmiEwCCwSmRTX0viAZusm4mJVqKBe3Bmj+yBDJVW # cv0MyrEYQ74oa0VSW3JBc+xSrqT2Jgm2Cc6IlSbm8AsiVE/Vc4yahfmLeeFHfTcr # K0flu6VGzjf1GNA1SDXR4bUinrBli3lfhwtKhx6x5eRsSjCCBnEwggRZoAMCAQIC # CmEJgSoAAAAAAAIwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRp # ZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTEwMDcwMTIxMzY1NVoXDTI1MDcwMTIx # NDY1NVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV # BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQG # A1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggEiMA0GCSqGSIb3 # DQEBAQUAA4IBDwAwggEKAoIBAQCpHQ28dxGKOiDs/BOX9fp/aZRrdFQQ1aUKAIKF # ++18aEssX8XD5WHCdrc+Zitb8BVTJwQxH0EbGpUdzgkTjnxhMFmxMEQP8WCIhFRD # DNdNuDgIs0Ldk6zWczBXJoKjRQ3Q6vVHgc2/JGAyWGBG8lhHhjKEHnRhZ5FfgVSx # z5NMksHEpl3RYRNuKMYa+YaAu99h/EbBJx0kZxJyGiGKr0tkiVBisV39dx898Fd1 # rL2KQk1AUdEPnAY+Z3/1ZsADlkR+79BL/W7lmsqxqPJ6Kgox8NpOBpG2iAg16Hgc # sOmZzTznL0S6p/TcZL2kAcEgCZN4zfy8wMlEXV4WnAEFTyJNAgMBAAGjggHmMIIB # 4jAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU1WM6XIoxkPNDe3xGG8UzaFqF # bVUwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud # EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYD # VR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwv # cHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEB # BE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9j # ZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgaAGA1UdIAEB/wSBlTCB # kjCBjwYJKwYBBAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jv # c29mdC5jb20vUEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQe # MiAdAEwAZQBnAGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQA # LiAdMA0GCSqGSIb3DQEBCwUAA4ICAQAH5ohRDeLG4Jg/gXEDPZ2joSFvs+umzPUx # vs8F4qn++ldtGTCzwsVmyWrf9efweL3HqJ4l4/m87WtUVwgrUYJEEvu5U4zM9GAS # inbMQEBBm9xcF/9c+V4XNZgkVkt070IQyK+/f8Z/8jd9Wj8c8pl5SpFSAK84Dxf1 # L3mBZdmptWvkx872ynoAb0swRCQiPM/tA6WWj1kpvLb9BOFwnzJKJ/1Vry/+tuWO # M7tiX5rbV0Dp8c6ZZpCM/2pif93FSguRJuI57BlKcWOdeyFtw5yjojz6f32WapB4 # pm3S4Zz5Hfw42JT0xqUKloakvZ4argRCg7i1gJsiOCC1JeVk7Pf0v35jWSUPei45 # V3aicaoGig+JFrphpxHLmtgOR5qAxdDNp9DvfYPw4TtxCd9ddJgiCGHasFAeb73x # 4QDf5zEHpJM692VHeOj4qEir995yfmFrb3epgcunCaw5u+zGy9iCtHLNHfS4hQEe # gPsbiSpUObJb2sgNVZl6h3M7COaYLeqN4DMuEin1wC9UJyH3yKxO2ii4sanblrKn # QqLJzxlBTeCG+SqaoxFmMNO7dDJL32N79ZmKLxvHIa9Zta7cRDyXUHHXodLFVeNp # 3lfB0d4wwP3M5k37Db9dT+mdHhk4L7zPWAUu7w2gUDXa7wknHNWzfjUeCLraNtvT # X4/edIhJEqGCAs4wggI3AgEBMIH4oYHQpIHNMIHKMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBP # cGVyYXRpb25zMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjoyMjY0LUUzM0UtNzgw # QzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcG # BSsOAwIaAxUAzdeb1yAva2kJJ2mFfDdeSfFJMdyggYMwgYCkfjB8MQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg # VGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQUFAAIFAOI+owQwIhgPMjAy # MDA0MTMxNjM2MjBaGA8yMDIwMDQxNDE2MzYyMFowdzA9BgorBgEEAYRZCgQBMS8w # LTAKAgUA4j6jBAIBADAKAgEAAgIMtgIB/zAHAgEAAgIRqzAKAgUA4j/0hAIBADA2 # BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIB # AAIDAYagMA0GCSqGSIb3DQEBBQUAA4GBACbDMteuJZ1dM8C3D68pmnAhP4UXQaBp # PDp7bkKw7OfRjAWrotjZSM1ZUEN0R4rpBHpOjRBB0O66aIbzJoS5lUDh3rZfD0Fi # RAQx3+xANORip0Yx0Kqz7OOyLMxlsYsEScihG/8Qzckye4dAyDvi6/SKUe2p5W5S # WcXeHZSsw0WXMYIDDTCCAwkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT # Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB # IDIwMTACEzMAAAEY/jr32RvUsTMAAAAAARgwDQYJYIZIAWUDBAIBBQCgggFKMBoG # CSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgbUE3amTK # dfYAZ178Edy14m2OAK+d9A7A9++7Y0MwuH0wgfoGCyqGSIb3DQEJEAIvMYHqMIHn # MIHkMIG9BCCgzwcUm6pSA48AVS+9m5Z+k6cHH7WyNjvPil0oMg0H9zCBmDCBgKR+ # MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMT # HU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAABGP4699kb1LEzAAAA # AAEYMCIEINLf+jsXBHMxT7ovH0b9lv816ubKy7iFA0sRXrKoFQ+8MA0GCSqGSIb3 # DQEBCwUABIIBAA5xQzy957xSi7gK0Vem6Wpzxy5e4mw4g6eEkjunQOg80tfWGCAD # ydVNmGgcpdqDBVG3kxKO/pSqZfyJFabIRspkgSX3g0fpbvHUGOKYNsEgMKkt4zlE # ATuCnVKDZn1zS3+zchymRk/65CZpRgGleRJZNvSqStIMVQRR1eWZ3bHktLXdeDt1 # HV5UC8WBCaMMyFayIy4ntTqYJcGyOuK49wJ90NX1Qgr3rtGrhxb339n5NAmrv7dy # POvaWuI+gF5x/mFPy1LaXOQdj6/2V+S1zCXqHXLoyUy+bnM0J2o8OULrVEXVZsGT # ou9W3AhmMG8uXCXJaKoZSYVAVXoUjSjq/tA= # SIG # End signature block |