MsrcSecurityUpdates.tests.ps1
# Import module would only work if the module is found in standard locations # Import-Module -Name MsrcSecurityUpdates -Force Import-Module (Join-Path -Path $PSScriptRoot -ChildPath 'MsrcSecurityUpdates.psd1') -Verbose -Force # Set-MSRCApiKey -ApiKey "API KEY PLACEHOLDER" -Verbose if (-not ($global:MSRCApiKey)) { Write-Warning -Message 'You need to use Set-MSRCApiKey first to set your API Key' break } <# Get-Help Get-MsrcSecurityUpdate Get-Help Get-MsrcSecurityUpdate -Examples Get-Help Get-MsrcCvrfDocument Get-Help Get-MsrcCvrfDocument -Examples Get-Help Get-MsrcSecurityBulletinHtml Get-Help Get-MsrcSecurityBulletinHtml -Examples Get-Help Get-MsrcCvrfAffectedSoftware Get-Help Get-MsrcCvrfAffectedSoftware -Examples #> Describe 'Function: Get-MsrcSecurityUpdateMSRC (calls the /Updates API)' { It 'Get-MsrcSecurityUpdate - all' { Get-MsrcSecurityUpdate | Should Not BeNullOrEmpty } It 'Get-MsrcSecurityUpdate - by year' { Get-MsrcSecurityUpdate -Year 2017 | Should Not BeNullOrEmpty } It 'Get-MsrcSecurityUpdate - by vulnerability' { Get-MsrcSecurityUpdate -Vulnerability CVE-2017-0003 | Should Not BeNullOrEmpty } It 'Get-MsrcSecurityUpdate - by cvrf' { Get-MsrcSecurityUpdate -Cvrf 2017-Jan | Should Not BeNullOrEmpty } It 'Get-MsrcSecurityUpdate - by date - before' { Get-MsrcSecurityUpdate -Before 2018-01-01 | Should Not BeNullOrEmpty } It 'Get-MsrcSecurityUpdate - by date - after' { Get-MsrcSecurityUpdate -After 2017-01-01 | Should Not BeNullOrEmpty } It 'Get-MsrcSecurityUpdate - by date - before and after' { Get-MsrcSecurityUpdate -Before 2018-01-01 -After 2017-10-01 | Should Not BeNullOrEmpty } } Describe 'Function: Get-MsrcCvrfDocument (calls the MSRC /cvrf API)' { It 'Get-MsrcCvrfDocument - 2016-Nov' { Get-MsrcCvrfDocument -ID 2016-Nov | Should Not BeNullOrEmpty } It 'Get-MsrcCvrfDocument - 2016-Nov - as XML' { Get-MsrcCvrfDocument -ID 2016-Nov -AsXml | Should Not BeNullOrEmpty } Get-MsrcSecurityUpdate | Where-Object { $_.ID -ne '2017-May-B' } | Foreach-Object { It "Get-MsrcCvrfDocument - none shall throw: $($PSItem.ID)" { { $null = Get-MsrcCvrfDocument -ID $PSItem.ID } | Should Not Throw } } It 'Get-MsrcCvrfDocument for 2017-May-B with Get-MsrcCvrfDocument should throw' { { Get-MsrcSecurityUpdate | Where-Object { $_.ID -eq '2017-May-B' } | Foreach-Object { $null = Get-MsrcCvrfDocument -ID $PSItem.ID } } | Should Throw } } Describe 'Function: Set-MSRCApiKey with proxy' { if (-not ($global:msrcProxy)) { Write-Warning -Message 'This test requires you to use Set-MSRCApiKey first to set your API Key and proxy details' break } It 'Get-MsrcSecurityUpdate - all' { Get-MsrcSecurityUpdate | Should Not BeNullOrEmpty } It 'Get-MsrcCvrfDocument - 2016-Nov' { Get-MsrcCvrfDocument -ID 2016-Nov | Should Not BeNullOrEmpty } } # May still work but not ready yet... # Describe 'Function: Get-MsrcSecurityBulletinHtml (generates the MSRC Security Bulletin HTML Report)' { # It 'Security Bulletin Report' { # Get-MsrcCvrfDocument -ID 2016-Nov | # Get-MsrcSecurityBulletinHtml | # Should Not BeNullOrEmpty # } # } InModuleScope MsrcSecurityUpdates { Describe 'Function: Get-MsrcCvrfAffectedSoftware' { It 'Get-MsrcCvrfAffectedSoftware by pipeline' { Get-MsrcCvrfDocument -ID 2016-Nov | Get-MsrcCvrfAffectedSoftware | Should Not BeNullOrEmpty } It 'Get-MsrcCvrfAffectedSoftware by parameters' { $cvrfDocument = Get-MsrcCvrfDocument -ID 2016-Nov Get-MsrcCvrfAffectedSoftware -Vulnerability $cvrfDocument.Vulnerability -ProductTree $cvrfDocument.ProductTree | Should Not BeNullOrEmpty } } Describe 'Function: Get-MsrcCvrfProductVulnerability' { It 'Get-MsrcCvrfProductVulnerability by pipeline' { Get-MsrcCvrfDocument -ID 2016-Nov | Get-MsrcCvrfProductVulnerability | Should Not BeNullOrEmpty } It 'Get-MsrcCvrfProductVulnerability by parameters' { $cvrfDocument = Get-MsrcCvrfDocument -ID 2016-Nov Get-MsrcCvrfProductVulnerability -Vulnerability $cvrfDocument.Vulnerability -ProductTree $cvrfDocument.ProductTree -DocumentTracking $cvrfDocument.DocumentTracking -DocumentTitle $cvrfDocument.DocumentTitle | Should Not BeNullOrEmpty } } } Describe 'Function: Get-MsrcVulnerabilityReportHtml (generates the MSRC Vulnerability Summary HTML Report)' { It 'Vulnerability Summary Report - does not throw' { { $null = Get-MsrcCvrfDocument -ID 2016-Nov | Get-MsrcVulnerabilityReportHtml -Verbose -ShowNoProgress } | Should Not Throw } Get-MsrcSecurityUpdate | Where-Object { $_.ID -ne '2017-May-B' } | Foreach-Object { It "Vulnerability Summary Report - none shall throw: $($PSItem.ID)" { { $null = Get-MsrcCvrfDocument -ID $PSItem.ID | Get-MsrcVulnerabilityReportHtml -ShowNoProgress } | Should Not Throw } } } InModuleScope MsrcSecurityUpdates { Describe 'Function: Get-KBDownloadUrl (generates the html for KBArticle downloads used in the vulnerability report affected software table)' { It 'Get-KBDownloadUrl by pipeline' { { $doc = Get-MsrcCvrfDocument -ID 2017-May $af = $doc | Get-MsrcCvrfAffectedSoftware $af.KBArticle | Get-KBDownloadUrl } | Should Not Throw } It 'Get-KBDownloadUrl by parameters' { { $doc = Get-MsrcCvrfDocument -ID 2017-May $af = $doc | Get-MsrcCvrfAffectedSoftware Get-KBDownloadUrl -KBArticleObject $af.KBArticle } | Should Not Throw } } } #When a pester test fails, it writes out to stdout, and sets an error in $Error. When invoking powershell from C# it is a lot easier to read the stderr stream. if($Error) { Write-Error -Message 'A pester test has failed during the validation process' } # SIG # Begin signature block # MIIjhwYJKoZIhvcNAQcCoIIjeDCCI3QCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDeNw97lF8VAsbZ # 7xv0tzQNMxqpKO3PQmZZvM6gCrHLkKCCDXYwggX0MIID3KADAgECAhMzAAABhk0h # daDZB74sAAAAAAGGMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjAwMzA0MTgzOTQ2WhcNMjEwMzAzMTgzOTQ2WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQC49eyyaaieg3Xb7ew+/hA34gqzRuReb9svBF6N3+iLD5A0iMddtunnmbFVQ+lN # Wphf/xOGef5vXMMMk744txo/kT6CKq0GzV+IhAqDytjH3UgGhLBNZ/UWuQPgrnhw # afQ3ZclsXo1lto4pyps4+X3RyQfnxCwqtjRxjCQ+AwIzk0vSVFnId6AwbB73w2lJ # +MC+E6nVmyvikp7DT2swTF05JkfMUtzDosktz/pvvMWY1IUOZ71XqWUXcwfzWDJ+ # 96WxBH6LpDQ1fCQ3POA3jCBu3mMiB1kSsMihH+eq1EzD0Es7iIT1MlKERPQmC+xl # K+9pPAw6j+rP2guYfKrMFr39AgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUhTFTFHuCaUCdTgZXja/OAQ9xOm4w # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW # MBQGA1UEBRMNMjMwMDEyKzQ1ODM4NDAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAEDkLXWKDtJ8rLh3d7XP # 1xU1s6Gt0jDqeHoIpTvnsREt9MsKriVGKdVVGSJow1Lz9+9bINmPZo7ZdMhNhWGQ # QnEF7z/3czh0MLO0z48cxCrjLch0P2sxvtcaT57LBmEy+tbhlUB6iz72KWavxuhP # 5zxKEChtLp8gHkp5/1YTPlvRYFrZr/iup2jzc/Oo5N4/q+yhOsRT3KJu62ekQUUP # sPU2bWsaF/hUPW/L2O1Fecf+6OOJLT2bHaAzr+EBAn0KAUiwdM+AUvasG9kHLX+I # XXlEZvfsXGzzxFlWzNbpM99umWWMQPTGZPpSCTDDs/1Ci0Br2/oXcgayYLaZCWsj # 1m/a0V8OHZGbppP1RrBeLQKfATjtAl0xrhMr4kgfvJ6ntChg9dxy4DiGWnsj//Qy # wUs1UxVchRR7eFaP3M8/BV0eeMotXwTNIwzSd3uAzAI+NSrN5pVlQeC0XXTueeDu # xDch3S5UUdDOvdlOdlRAa+85Si6HmEUgx3j0YYSC1RWBdEhwsAdH6nXtXEshAAxf # 8PWh2wCsczMe/F4vTg4cmDsBTZwwrHqL5krX++s61sLWA67Yn4Db6rXV9Imcf5UM # Cq09wJj5H93KH9qc1yCiJzDCtbtgyHYXAkSHQNpoj7tDX6ko9gE8vXqZIGj82mwD # TAY9ofRH0RSMLJqpgLrBPCKNMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr # /Xmfwb1tbWrJUnMTDXpQzTGCFWcwghVjAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp # Z25pbmcgUENBIDIwMTECEzMAAAGGTSF1oNkHviwAAAAAAYYwDQYJYIZIAWUDBAIB # BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEICT4MGO+ZYRcOKpmdDzPguVu # +zGA2PUpmbvTOwqudoruMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A # cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB # BQAEggEAHExFc+STwxQrEczmy4dnNLi6t6mQH8THNOouC+vXghbonja10FWVIoX6 # 6BxdOq/XJLd5XbNwCuOYYDVMNKLFraoEqwK0Mjs6mZoOHsnjiZyYAHF8GBzzPuf3 # J83cUbUrzYpLYHf0ic9CGaiBslXQXme+mWYTNlvC8GDqZxCQIXImiB4uMNuT+TRc # XfUDQZt+DKAYzYkdVbCZfB6jHJYtcBU/boOo2NFP9QHWaL0wWp5WVzDa55W4HvPO # GPAFowCuSAIM8zN0m2pGZRzU6D8KlnHA/9ONQ5mefI3fKc2TS7PuS2vbQxyfHCJs # i7bRYs7A4e9txS3F4Ex4tqKAUeP8NaGCEvEwghLtBgorBgEEAYI3AwMBMYIS3TCC # EtkGCSqGSIb3DQEHAqCCEsowghLGAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFVBgsq # hkiG9w0BCRABBKCCAUQEggFAMIIBPAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl # AwQCAQUABCDUAc18I6UTiCVmYioz4iOrAMQ0AYEppclHoLO/z35sHwIGX4hEDaJB # GBMyMDIwMTExMzE5MjU0My4wMjRaMASAAgH0oIHUpIHRMIHOMQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3NvZnQgT3Bl # cmF0aW9ucyBQdWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046QzRC # RC1FMzdGLTVGRkMxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZp # Y2Wggg5EMIIE9TCCA92gAwIBAgITMwAAASM4sOSt2FqQnQAAAAABIzANBgkqhkiG # 9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYw # JAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0xOTEyMTkw # MTE0NTZaFw0yMTAzMTcwMTE0NTZaMIHOMQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3NvZnQgT3BlcmF0aW9ucyBQdWVy # dG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046QzRCRC1FMzdGLTVGRkMx # JTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEiMA0GCSqG # SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCdvNDJsGSl3AEu8dmbwOEzjgs8Put17PVC # xlrXWQzd1ZfmhkBLDMBKyJIM0ItH0ztLDg/Td4TtR2k1h6EvNDf0G+qC0dlgmZL/ # 1TOFhZ04Tr98gOc0rfr7ijcK4xBxQtI5TAwiamlO0reliW5f5AD+bIDNKraRBEIc # bVWn/CKFeZavL4DCTa99DuK6i2BIv2GVkGWMEBwIlTLpwmKSYnHJzTjUUXYNg908 # rttnhCcD0D+g5HhIqDMvXoTJga5IwA1ToEFfk+Joq/oQCXiDcrKbOsIETuao7lef # o73MzUGtVpu48bKgb9OBgpSKeTR7610JmfZqWXY9648RbmWyo3dxAgMBAAGjggEb # MIIBFzAdBgNVHQ4EFgQUgdRsFIDTjRv5EcKwaN4ZFfgMnh4wHwYDVR0jBBgwFoAU # 1WM6XIoxkPNDe3xGG8UzaFqFbVUwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2Ny # bC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGltU3RhUENBXzIw # MTAtMDctMDEuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNUaW1TdGFQQ0FfMjAxMC0w # Ny0wMS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDCDANBgkq # hkiG9w0BAQsFAAOCAQEAW+UBt6pX6Fuq9VeJU/pDvC1Mxd9kt31H4J/0tUEAT8zk # bP+ro49PcrR1jQ3znsMJEsmtX/EvXvgW515Jx+Zd0ep0tgZEUwDbU5l8bzC0wsr3 # mHvyUCH6LPmd4idG9ahw0pxI+kJnX9TMpqzwJOY8YcYYol5cCC1I7x+esu6yx8St # MJ7B9dhDvTJ5GkjVyTQpkpn4FBJAzc7udwt/ZelzUQD2rs9v1rJSFGXF9zQwjIL+ # YWYtp4XffR8cmiSbHJ9X/IWVwPvn9RzW6vG3ZIdzmIEZza+0HZzvhrr7bt3chqmH # UDDBj5wLeC+xMPcpI8tFKM+uP69Em0CEWLcuXjPTNzCCBnEwggRZoAMCAQICCmEJ # gSoAAAAAAAIwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQI # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmlj # YXRlIEF1dGhvcml0eSAyMDEwMB4XDTEwMDcwMTIxMzY1NVoXDTI1MDcwMTIxNDY1 # NVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT # B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UE # AxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggEiMA0GCSqGSIb3DQEB # AQUAA4IBDwAwggEKAoIBAQCpHQ28dxGKOiDs/BOX9fp/aZRrdFQQ1aUKAIKF++18 # aEssX8XD5WHCdrc+Zitb8BVTJwQxH0EbGpUdzgkTjnxhMFmxMEQP8WCIhFRDDNdN # uDgIs0Ldk6zWczBXJoKjRQ3Q6vVHgc2/JGAyWGBG8lhHhjKEHnRhZ5FfgVSxz5NM # ksHEpl3RYRNuKMYa+YaAu99h/EbBJx0kZxJyGiGKr0tkiVBisV39dx898Fd1rL2K # Qk1AUdEPnAY+Z3/1ZsADlkR+79BL/W7lmsqxqPJ6Kgox8NpOBpG2iAg16HgcsOmZ # zTznL0S6p/TcZL2kAcEgCZN4zfy8wMlEXV4WnAEFTyJNAgMBAAGjggHmMIIB4jAQ # BgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU1WM6XIoxkPNDe3xGG8UzaFqFbVUw # GQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB # /wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0f # BE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJv # ZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4w # TDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0 # cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgaAGA1UdIAEB/wSBlTCBkjCB # jwYJKwYBBAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vUEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAd # AEwAZQBnAGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQALiAd # MA0GCSqGSIb3DQEBCwUAA4ICAQAH5ohRDeLG4Jg/gXEDPZ2joSFvs+umzPUxvs8F # 4qn++ldtGTCzwsVmyWrf9efweL3HqJ4l4/m87WtUVwgrUYJEEvu5U4zM9GASinbM # QEBBm9xcF/9c+V4XNZgkVkt070IQyK+/f8Z/8jd9Wj8c8pl5SpFSAK84Dxf1L3mB # ZdmptWvkx872ynoAb0swRCQiPM/tA6WWj1kpvLb9BOFwnzJKJ/1Vry/+tuWOM7ti # X5rbV0Dp8c6ZZpCM/2pif93FSguRJuI57BlKcWOdeyFtw5yjojz6f32WapB4pm3S # 4Zz5Hfw42JT0xqUKloakvZ4argRCg7i1gJsiOCC1JeVk7Pf0v35jWSUPei45V3ai # caoGig+JFrphpxHLmtgOR5qAxdDNp9DvfYPw4TtxCd9ddJgiCGHasFAeb73x4QDf # 5zEHpJM692VHeOj4qEir995yfmFrb3epgcunCaw5u+zGy9iCtHLNHfS4hQEegPsb # iSpUObJb2sgNVZl6h3M7COaYLeqN4DMuEin1wC9UJyH3yKxO2ii4sanblrKnQqLJ # zxlBTeCG+SqaoxFmMNO7dDJL32N79ZmKLxvHIa9Zta7cRDyXUHHXodLFVeNp3lfB # 0d4wwP3M5k37Db9dT+mdHhk4L7zPWAUu7w2gUDXa7wknHNWzfjUeCLraNtvTX4/e # dIhJEqGCAtIwggI7AgEBMIH8oYHUpIHRMIHOMQswCQYDVQQGEwJVUzETMBEGA1UE # CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z # b2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3NvZnQgT3BlcmF0aW9ucyBQ # dWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046QzRCRC1FMzdGLTVG # RkMxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAH # BgUrDgMCGgMVALoXZo3g4p4Xwu4MNSgQnjP7+1eBoIGDMIGApH4wfDELMAkGA1UE # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0 # IFRpbWUtU3RhbXAgUENBIDIwMTAwDQYJKoZIhvcNAQEFBQACBQDjWPzcMCIYDzIw # MjAxMTEzMTYzODUyWhgPMjAyMDExMTQxNjM4NTJaMHcwPQYKKwYBBAGEWQoEATEv # MC0wCgIFAONY/NwCAQAwCgIBAAICBdICAf8wBwIBAAICEc8wCgIFAONaTlwCAQAw # NgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgC # AQACAwGGoDANBgkqhkiG9w0BAQUFAAOBgQBzHEHQfy6apXTqzU0aLGgLZv9luGEU # hZ8ZBJZyQuubQD+nOr0DTwxU10fjmxlWD8GgXIsQzaFT4mAobrbPhuAX2v79NyE3 # XAYK15UebiEyDYtvadYa5wuT1LYcKCLc5rs19U3mOaFHtZMvJGbxRD30mOLNY3uc # mJc7DSnZ7/5PmjGCAw0wggMJAgEBMIGTMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQI # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD # QSAyMDEwAhMzAAABIziw5K3YWpCdAAAAAAEjMA0GCWCGSAFlAwQCAQUAoIIBSjAa # BgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIEIDV7r1lP # XGUFcJfn5BL8b0b4HMqiVWi9OkfMWojwUoyDMIH6BgsqhkiG9w0BCRACLzGB6jCB # 5zCB5DCBvQQgEZozgz/7RMzEDaOjrMSkAAy/KcCiZDOWJ1yq6vsVgbMwgZgwgYCk # fjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD # Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAASM4sOSt2FqQnQAA # AAABIzAiBCD45xJPDfNP1Xi1kcGKLoL8xxmAkd4aAJ9MvHRiiIed8zANBgkqhkiG # 9w0BAQsFAASCAQAR1hmeNLfuU09TzMj9dAXXE3VrL9iBtOr58NF/8zzAinkrfZB0 # +xoyNH9C6/xfNZqg8XqgilNDJLM8O0jD016qvUNMMqP7/QsyN1rBKg8oUaZGmOEB # CvMPpXXjJVmqT2KTR/MK+QG8v+YWGojCSpMVAgcI1vyCvZ31w56HbpT+Fe0BiRBT # PR5Gsx01NJ87cvXAQkM5/dafOLAYVRNBSkIpMRrhBSnwJKeHop0LgbAXrOOv6OHi # wewxiumAURwZrSNcJ5zSu1jTFxv+A1O/E+1mo7uSONEnzn+lDsf6oXa/kRN96IbS # Qtrf5z9ApCQE0dn2uSE0paVe6GvBzGsrskmI # SIG # End signature block |