| Server IP : 121.121.20.254 / Your IP : 216.73.217.51 Web Server : Microsoft-IIS/10.0 System : Windows NT WEB-SERVER 10.0 build 20348 (Windows Server 2022) AMD64 User : IUSR ( 0) PHP Version : 8.3.28 Disable Function : NONE MySQL : ON | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : C:/Program Files (x86)/WindowsPowerShell/Modules/Pester/3.4.0/Functions/ |
Upload File : |
Set-StrictMode -Version Latest
InModuleScope Pester {
Describe "New-PesterState" {
Context "TestNameFilter parameter is set" {
$p = new-pesterstate -TestNameFilter "filter"
it "sets the TestNameFilter property" {
$p.TestNameFilter | should be "filter"
}
}
Context "TagFilter parameter is set" {
$p = new-pesterstate -TagFilter "tag","tag2"
it "sets the TestNameFilter property" {
$p.TagFilter | should be ("tag","tag2")
}
}
Context "ExcludeTagFilter parameter is set" {
$p = new-pesterstate -ExcludeTagFilter "tag3", "tag"
it "sets the ExcludeTagFilter property" {
$p.ExcludeTagFilter | should be ("tag3", "tag")
}
}
Context "TagFilter and ExcludeTagFilter parameter are set" {
$p = new-pesterstate -TagFilter "tag","tag2" -ExcludeTagFilter "tag3"
it "sets the TestNameFilter property" {
$p.TagFilter | should be ("tag","tag2")
}
it "sets the ExcludeTagFilter property" {
$p.ExcludeTagFilter | should be ("tag3")
}
}
Context "TestNameFilter and TagFilter parameter is set" {
$p = new-pesterstate -TagFilter "tag","tag2" -testnamefilter "filter"
it "sets the TestNameFilter property" {
$p.TagFilter | should be ("tag","tag2")
}
it "sets the TestNameFilter property" {
$p.TagFilter | should be ("tag","tag2")
}
}
}
Describe "Pester state object" {
$p = New-PesterState
Context "entering describe" {
It "enters describe" {
$p.EnterDescribe("describe")
$p.CurrentDescribe | should be "Describe"
}
It "can enter describe only once" {
{ $p.EnterDescribe("describe") } | Should Throw
}
It "Reports scope correctly" {
$p.Scope | should be "describe"
}
}
Context "leaving describe" {
It "leaves describe" {
$p.LeaveDescribe()
$p.CurrentDescribe | should benullOrEmpty
}
It "Reports scope correctly" {
$p.Scope | should benullOrEmpty
}
}
context "Entering It from Describe" {
$p.EnterDescribe('Describe')
It "Enters It successfully" {
{ $p.EnterTest("It") } | Should Not Throw
}
It "Reports scope correctly" {
$p.Scope | Should Be 'It'
}
It "Cannot enter It after already entered" {
{ $p.EnterTest("It") } | Should Throw
}
It "Cannot enter Context from inside It" {
{ $p.EnterContext("Context") } | Should Throw
}
}
context "Leaving It from Describe" {
It "Leaves It to Describe" {
{ $p.LeaveTest() } | Should Not Throw
}
It "Reports scope correctly" {
$p.Scope | Should Be 'Describe'
}
$p.LeaveDescribe()
}
Context "entering Context" {
it "Cannot enter Context before Describe" {
{ $p.EnterContext("context") } | should throw
}
it "enters context from describe" {
$p.EnterDescribe("Describe")
$p.EnterContext("Context")
$p.CurrentContext | should be "Context"
}
It "can enter context only once" {
{ $p.EnterContext("Context") } | Should Throw
}
It "Reports scope correctly" {
$p.Scope | should be "Context"
}
}
Context "leaving context" {
it "cannot leave describe before leaving context" {
{ $p.LeaveDescribe() } | should throw
}
it "leaves context" {
$p.LeaveContext()
$p.CurrentContext | should BeNullOrEmpty
}
It "Returns from context to describe" {
$p.Scope | should be "Describe"
}
$p.LeaveDescribe()
}
context "Entering It from Context" {
$p.EnterDescribe('Describe')
$p.EnterContext('Context')
It "Enters It successfully" {
{ $p.EnterTest("It") } | Should Not Throw
}
It "Reports scope correctly" {
$p.Scope | Should Be 'It'
}
It "Cannot enter It after already entered" {
{ $p.EnterTest("It") } | Should Throw
}
}
context "Leaving It from Context" {
It "Leaves It to Context" {
{ $p.LeaveTest() } | Should Not Throw
}
It "Reports scope correctly" {
$p.Scope | Should Be 'Context'
}
$p.LeaveContext()
$p.LeaveDescribe()
}
context "adding test result" {
$p.EnterDescribe('Describe')
it "adds passed test" {
$p.AddTestResult("result","Passed", 100)
$result = $p.TestResult[-1]
$result.Name | should be "result"
$result.passed | should be $true
$result.Result | Should be "Passed"
$result.time.ticks | should be 100
}
it "adds failed test" {
try { throw 'message' } catch { $e = $_ }
$p.AddTestResult("result","Failed", 100, "fail", "stack","suite name",@{param='eters'},$e)
$result = $p.TestResult[-1]
$result.Name | should be "result"
$result.passed | should be $false
$result.Result | Should be "Failed"
$result.time.ticks | should be 100
$result.FailureMessage | should be "fail"
$result.StackTrace | should be "stack"
$result.ParameterizedSuiteName | should be "suite name"
$result.Parameters['param'] | should be 'eters'
$result.ErrorRecord.Exception.Message | should be 'message'
}
it "adds skipped test" {
$p.AddTestResult("result","Skipped", 100)
$result = $p.TestResult[-1]
$result.Name | should be "result"
$result.passed | should be $true
$result.Result | Should be "Skipped"
$result.time.ticks | should be 100
}
it "adds Pending test" {
$p.AddTestResult("result","Pending", 100)
$result = $p.TestResult[-1]
$result.Name | should be "result"
$result.passed | should be $true
$result.Result | Should be "Pending"
$result.time.ticks | should be 100
}
it "can add test result before entering describe" {
if ($p.CurrentContext) { $p.LeaveContext()}
if ($p.CurrentDescribe) { $p.LeaveDescribe() }
{ $p.addTestResult(1,"Passed",1) } | should not throw
}
$p.LeaveContext()
$p.LeaveDescribe()
}
Context "Path and TestNameFilter parameter is set" {
$strict = New-PesterState -Strict
It "Keeps Passed state" {
$strict.AddTestResult("test","Passed")
$result = $strict.TestResult[-1]
$result.passed | should be $true
$result.Result | Should be "Passed"
}
It "Keeps Failed state" {
$strict.AddTestResult("test","Failed")
$result = $strict.TestResult[-1]
$result.passed | should be $false
$result.Result | Should be "Failed"
}
It "Changes Pending state to Failed" {
$strict.AddTestResult("test","Pending")
$result = $strict.TestResult[-1]
$result.passed | should be $false
$result.Result | Should be "Failed"
}
It "Changes Skipped state to Failed" {
$strict.AddTestResult("test","Skipped")
$result = $strict.TestResult[-1]
$result.passed | should be $false
$result.Result | Should be "Failed"
}
}
}
Describe ConvertTo-FailureLines {
$testPath = Join-Path $TestDrive test.ps1
$escapedTestPath = [regex]::Escape($testPath)
It 'produces correct message lines.' {
try { throw 'message' } catch { $e = $_ }
$r = $e | ConvertTo-FailureLines
$r.Message[0] | Should be 'RuntimeException: message'
$r.Message.Count | Should be 1
}
It 'failed should produces correct message lines.' {
try { 'One' | Should be 'Two' } catch { $e = $_ }
$r = $e | ConvertTo-FailureLines
$r.Message[0] | Should be 'String lengths are both 3. Strings differ at index 0.'
$r.Message[1] | Should be 'Expected: {Two}'
$r.Message[2] | Should be 'But was: {One}'
$r.Message[3] | Should be '-----------^'
$r.Message[4] | Should match "'One' | Should be 'Two'"
$r.Message.Count | Should be 5
}
Context 'should fails in file' {
Set-Content -Path $testPath -Value @'
$script:IgnoreErrorPreference = 'SilentlyContinue'
'One' | Should be 'Two'
'@
try { & $testPath } catch { $e = $_ }
$r = $e | ConvertTo-FailureLines
It 'produces correct message lines.' {
$r.Message[0] | Should be 'String lengths are both 3. Strings differ at index 0.'
$r.Message[1] | Should be 'Expected: {Two}'
$r.Message[2] | Should be 'But was: {One}'
$r.Message[3] | Should be '-----------^'
$r.Message[4] | Should be "2: 'One' | Should be 'Two'"
$r.Message.Count | Should be 5
}
if ( $e | Get-Member -Name ScriptStackTrace )
{
It 'produces correct trace lines.' {
$r.Trace[0] | Should be "at <ScriptBlock>, $testPath`: line 2"
$r.Trace[1] -match 'at <ScriptBlock>, .*\\Functions\\PesterState.Tests.ps1: line [0-9]*$' |
Should be $true
$r.Trace.Count | Should be 2
}
}
else
{
It 'produces correct trace lines.' {
$r.Trace[0] | Should be "at line: 2 in $testPath"
$r.Trace.Count | Should be 1
}
}
}
Context 'exception thrown in nested functions in file' {
Set-Content -Path $testPath -Value @'
function f1 {
throw 'f1 message'
}
function f2 {
f1
}
f2
'@
try { & $testPath } catch { $e = $_ }
$r = $e | ConvertTo-FailureLines
It 'produces correct message lines.' {
$r.Message[0] | Should be 'RuntimeException: f1 message'
}
if ( $e | Get-Member -Name ScriptStackTrace )
{
It 'produces correct trace lines.' {
$r.Trace[0] | Should be "at f1, $testPath`: line 2"
$r.Trace[1] | Should be "at f2, $testPath`: line 5"
$r.Trace[2] | Should be "at <ScriptBlock>, $testPath`: line 7"
$r.Trace[3] -match 'at <ScriptBlock>, .*\\Functions\\PesterState.Tests.ps1: line [0-9]*$' |
Should be $true
$r.Trace.Count | Should be 4
}
}
else
{
It 'produces correct trace lines.' {
$r.Trace[0] | Should be "at line: 2 in $testPath"
$r.Trace.Count | Should be 1
}
}
}
Context 'nested exceptions thrown in file' {
Set-Content -Path $testPath -Value @'
try
{
throw New-Object System.ArgumentException(
'inner message',
'param_name'
)
}
catch
{
throw New-Object System.FormatException(
'outer message',
$_.Exception
)
}
'@
try { & $testPath } catch { $e = $_ }
$r = $e | ConvertTo-FailureLines
It 'produces correct message lines.' {
$r.Message[0] | Should be 'ArgumentException: inner message'
$r.Message[1] | Should be 'Parameter name: param_name'
$r.Message[2] | Should be 'FormatException: outer message'
}
if ( $e | Get-Member -Name ScriptStackTrace )
{
It 'produces correct trace line.' {
$r.Trace[0] | Should be "at <ScriptBlock>, $testPath`: line 10"
$r.Trace[1] -match 'at <ScriptBlock>, .*\\Functions\\PesterState.Tests.ps1: line [0-9]*$'
$r.Trace.Count | Should be 2
}
}
else
{
It 'produces correct trace line.' {
$r.Trace[0] | Should be "at line: 10 in $testPath"
$r.Trace.Count | Should be 1
}
}
}
}
}
# SIG # Begin signature block
# MIInZwYJKoZIhvcNAQcCoIInWDCCJ1QCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCzVis637nmKLfu
# tBlmMuPbVllEbkewuwHWaKM6oNYSS6CCC7QwggXLMIIEs6ADAgECAhMzAAABQGf2
# mGsxCLhyAAAAAAFAMA0GCSqGSIb3DQEBCwUAMIGOMQswCQYDVQQGEwJVUzETMBEG
# A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj
# cm9zb2Z0IENvcnBvcmF0aW9uMTgwNgYDVQQDEy9NaWNyb3NvZnQgV2luZG93cyBU
# aGlyZCBQYXJ0eSBDb21wb25lbnQgQ0EgMjAxMjAeFw0yNTExMTMxOTU5NDNaFw0y
# NjExMTAxOTU5NDNaMIGEMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMS4wLAYDVQQDEyVNaWNyb3NvZnQgV2luZG93cyAzcmQgcGFydHkgQ29tcG9u
# ZW50MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEArGt4Hrjs3D7+IIab
# GkPGtg4XeWQFi8nKsdeF+N6nkYF9wsmw0qPk4OovEiJnCSRiEtLfYy3Icn4iOp7L
# 24oCa0zlgYCND3OnNfYOuVpMsq3CSkXYg3H+VMiB11hOLcctTu4RWy4ZRKsL5NVI
# AduJFgd/1Qs2mQpUuOyFfLKhu/+Z+T2c9YALxsfnPvqn8Tn8Tt8wdZuFwz7kK3jl
# e2T3YBofybAR2aH678TnOxhLe2/hEpTdKaVfcqyrIX0Mw/LwqEJnj4G8amBbQ7OG
# RnKm1VNd4nMpRt1SflNlVo1Q3Qqnj9K6mSPw99YGMCTaVr6jKPylsWyW4nsvu8m0
# MbBJJiLOi0sOTHtwQEVcBH6WM7xbODqwPaklS1wDbED1wfzImIUR8WsXJVjDm7Fg
# x4JDo8oLIjKFrEvzBfrYWsvlDg8p9XgR7EB/IJwXGuJbFzo/S+r3D5DkUZXX/72k
# XA4FeRJAgLePAuGChPvyQiLtKJeJm9ftJeukrIcs7JpJVHObAgMBAAGjggGoMIIB
# pDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUB9FDBUZ0W11vsv6qqb9t
# vKspCIowRQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjEWMBQGA1UEBRMNMjMwODA5KzUwNjIyOTAfBgNVHSMEGDAWgBRhcaeHr/9p
# 1SF2T1KTKAC+eRKrhDB0BgNVHR8EbTBrMGmgZ6BlhmNodHRwOi8vd3d3Lm1pY3Jv
# c29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBXaW5kb3dzJTIwVGhpcmQl
# MjBQYXJ0eSUyMENvbXBvbmVudCUyMENBJTIwMjAxMi5jcmwwgYEGCCsGAQUFBwEB
# BHUwczBxBggrBgEFBQcwAoZlaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w
# cy9jZXJ0cy9NaWNyb3NvZnQlMjBXaW5kb3dzJTIwVGhpcmQlMjBQYXJ0eSUyMENv
# bXBvbmVudCUyMENBJTIwMjAxMi5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0B
# AQsFAAOCAQEAmFzJPKhkAXPOcfy9S4q1nP3XCvmABVGv/VRzFZ1e+oVtVzOFkbZ6
# osY1OpZqa9CEvtgcrtciv1y9mV1SpxAMwfEqq+Nhw2GdZ3IWqFzWFsEe2S9U196s
# XRIRIxglZMBWyzdy8rQ+P7L2+LciW4qcaw2wtv6YoI0q1isgk0t1OF5kEL0t9hhx
# UrBavTdoqZ3b5JtwDqzmIsxuLtGbE9Pqbz2gx/me+7yduYpIcYlmEmPQkg3gmWkZ
# lnSRePu7/5RXS2TGW1O5JP8aqVcMn0ZkHEhtT368pE/CxQVAkAYHNz6+enP9n+HC
# 2udu395c0fVlRHy/d53f32RukfbjakH8uzCCBeEwggPJoAMCAQICCmELqsEAAAAA
# AAkwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
# aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
# cG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1
# dGhvcml0eSAyMDEwMB4XDTEyMDQxODIzNDgzOFoXDTI3MDQxODIzNTgzOFowgY4x
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xODA2BgNVBAMTL01p
# Y3Jvc29mdCBXaW5kb3dzIFRoaXJkIFBhcnR5IENvbXBvbmVudCBDQSAyMDEyMIIB
# IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo5wwhAmnYy7PCkfw6iT5ozAg
# D15XMSaBmjEHslDUzmcJCGUKWqVLrtXtEC7npZm1n2gvmItYAqwgtCnEcb0oHKX9
# PJtk5MXr32ElvPDuaL/Rp8t+KgKBTmRcDFOGeVcZN2G3mPkMoE4iWZv5Gy1nPCc8
# VpBm4/1/ZX0Phr01R+iKzPTajulqTqunVeyiiR7VM0VTy/med73NLPkFuH90AR3o
# +xjhQ9EN6arcN2+9/rgP7R1NAUZOCqz8gujsVoMTjjoB7RRkdOpksmYQtmhtyHAA
# fVBILj1D7uAklcbNjsf9uOSVz91++5VeoQHNQ7EH16Qw7puGGipuwQtZonRviwID
# AQABo4IBQzCCAT8wEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGFxp4ev/2nV
# IXZPUpMoAL55EquEMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQE
# AwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQ
# W9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNv
# bS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBa
# BggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0
# LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqG
# SIb3DQEBCwUAA4ICAQBaimfazNX9DSZBd78KRni0s94SaSt3I8JlLwFf0gP0YbpQ
# nS6MOXLzbD5qsR52bey384LczLvFaXAoc2YXP1Tr7gEWSMRG2RuAroE6jQ95bWiw
# nuotPznTyjh+vV58CG4Z3MbC9DgzaGHiUkeD4QABVtK6y4eCBTEKQYtO539fX+1f
# 0zktReuiE7/9HsKYQXFhFl/ICnAlfFlpMSTkcecKuwQX959yHsnSuxq+PQL+CQyy
# Q7RZGplTk5YhX+DWtyYBQpU2rCf9vvSFd2g9GL30vpiIIhGGUhbzRewDlxBwh6Nw
# Q3E828mGAxcM9XNbxn3hXGTt18VI1+0y4tGq08+n9ldOYfl362fyiLPeANoDj9CK
# NDc+HdhiuNKx8+Evi3I7gZZ8b/zsZnZyYBsk8qCJbVttAC7vKN2GhwXCtLnlvmTC
# KvJKFVyY4sQnhf9S42J+D7ICC9dmxwqy0z0gBBRQMlmDCn2b7Vo4EgFSui9eIHKO
# SvH953ECjDvhB77Jc/TdR9i077SkszC5iT52yrkAmFZ+q+qKuKXQOKtpdxMLFC/p
# qkEf97q9Ois0iu4Kq2PmY/eIJI4gDSs7nePCSVKsnx8OOTtd1G5QauZ9UjqqfDMV
# KQ0mXgFYp06pPXqEb3Q/YJ/kMk82AK9tcdM+pkZlX4F08f7BcdpMoEFagt3xHzGC
# GwkwghsFAgEBMIGmMIGOMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMTgwNgYDVQQDEy9NaWNyb3NvZnQgV2luZG93cyBUaGlyZCBQYXJ0eSBDb21w
# b25lbnQgQ0EgMjAxMgITMwAAAUBn9phrMQi4cgAAAAABQDANBglghkgBZQMEAgEF
# AKCCARgwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEICJ0ahyqOOH6HkHqKc9bIQcB
# Q1JSo332MaJLpfaOedpCMFAGCisGAQQBgjcKAxwxQgxAOTFDMzhGM0I0QjVCMjQz
# NUQxOUY2NEVGNzI4QzdCMDVGM0YwRTMwOEUwREVBNzg2ODAyODQ4Mzg0NzlDRDRD
# NDBaBgorBgEEAYI3AgEMMUwwSqAkgCIATQBpAGMAcgBvAHMAbwBmAHQAIABXAGkA
# bgBkAG8AdwBzoSKAIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aW5kb3dzMA0G
# CSqGSIb3DQEBAQUABIIBgIs2S1FZhyBEjOVGaiIZONWCYO0xNGTa1Yzo2nhVVCRE
# PZrRUo789BoN9ReFESO5USeODVqPfuI8nnPQ2AWNiZLKoA3eEfgYDLuAX9Wnj4KB
# JswLvbFYcpf0nFh/b/KKArgFKpGlMKsotpFL93BsIg9aoZadfe/r4te0iD8MX4Rr
# cbRabdw0cC3jEX6Qswilq2RhRSEhkMufyagiZm5fBU5BgBTwTXy1lfwko39wPPwo
# 65AZ9l1RdmEE7SMPZFuasQaRfqFfWZJMrVcrQb+iTPMP7Kn9ZuT71NwrGyFR9XsD
# E3WEC6KksPYh8oBIeOGV4nA9yuAeBTooiPEJRspH0NP1G0dauCvlhXadfzQwIgEb
# /uDjXqnVakRfuHfPri7vCaExQ4lRF3OYQJuEsBSv4hcdmNOnotuBtvax5Xln2Whi
# dZD/IdhjpETqDgyWqCH4jvP7GkVcCWRiC8ywOtdpkrCt0gETonb5wfz27SLzSDk+
# iaeUUc0ZTGTfYUKZdFw6uaGCF5cwgheTBgorBgEEAYI3AwMBMYIXgzCCF38GCSqG
# SIb3DQEHAqCCF3AwghdsAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFSBgsqhkiG9w0B
# CRABBKCCAUEEggE9MIIBOQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUA
# BCCrebuJQUbTVA5UHorgXhiZgSyxoNpkAw8MOR49a+V8mQIGanNvfzqPGBMyMDI2
# MDgwODE4MDIyMS41NjJaMASAAgH0oIHRpIHOMIHLMQswCQYDVQQGEwJVUzETMBEG
# A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj
# cm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBP
# cGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046MzcwMy0wNUUwLUQ5
# NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WgghHtMIIH
# IDCCBQigAwIBAgITMwAAAh86cGnkojAulQABAAACHzANBgkqhkiG9w0BAQsFADB8
# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N
# aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0yNjAyMTkxOTM5NTFaFw0y
# NzA1MTcxOTM5NTFaMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYD
# VQQLEx5uU2hpZWxkIFRTUyBFU046MzcwMy0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1p
# Y3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEBAQUAA4IC
# DwAwggIKAoICAQDLO8XFOcfGqAqgiz0+AmQmFl3dZ0aTG4UFJkqqNdMHy28DaheC
# Bs6ONufukye5x42CWkzgRIy9kE2VWwEntZ8ZkgyrykC0bIqsID7+6FxguseTXf1V
# wvm1D8104VmetoBJlJ4uGbuyJZUvXDx55nVh50ygLTzZ24WkQsnPpvRZv2kPc39f
# 3bhLyHVtnHsa/W/86Vrftd+AfFveA+qN/EY+XGj5c/DPMXCYECb0arYb92dDJWtw
# zpyBrp4gfHlgY1UEpc4l4AGELrf2J4wrxTzTW+SM8XhV1dOOPrYjD080IbZqL8B+
# IF0RCdn269YXrGK6QIHipznKZcCS8jN30YAHnTJVN5Zzs6t/2YsqBGDquvDad793
# 4FFTwzvUcO3VoIyd93XWwvP8/SCFVJh21W8oGQTptGHyly+Fl4henVMVZF1v6osO
# tirX8GFTiEhnf8nRdOg7yZYAJ0xy9CtDfbXaTn/cf3Lq3N/GCYKFjC+5mUCE+AJh
# mxMuMdvSUGmKiAFdiPAjUTqsWWBBZJm0eCwgeGJFmmQA+V7/98BKcE+gUL7O9eWR
# DQwKeAcvo6rxNv2Y4jKrHA6Z/wi3a/fKUhLCNZES8qGdrpDAm7qh+6FjYxytAbki
# KM6uTNy/ULPlwtlYZoAJDDQP7eYCywwVbNTbHXRBSS+NccC0sSB4W7U67wIDAQAB
# o4IBSTCCAUUwHQYDVR0OBBYEFNk72sGDlH0r5DwvfGR5XwJI8B7bMB8GA1UdIwQY
# MBaAFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6
# Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRpbWUt
# U3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYB
# BQUHMAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWlj
# cm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB
# /wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMA0G
# CSqGSIb3DQEBCwUAA4ICAQBlbu3IoynnPz0K1iPbeNnsej2b15l5sdl2FAFBBGT9
# lRdc2gNV8LAIusPYHHhUvRDcsx4lbMNhVKPGu4TDLaqNt/CI+SFtGuqdRLpVP1XE
# 9cCLyKrKPpcJFJCqPpV+efoAtYBmIUQcxxwT7WIQ7gag8+rkKvrMkCoRqKS0mKv8
# J1sKfi85+G2uhZ/1RteSVdYZOZOj+Sb4wzonTCTj7EtgMN/BX35W5dTzd7wJdGep
# YkVi871dSrC2Tr1ZFzAR7S44drCWZpJ6phJabVNOsNxFJKgSykugOGWzQ318Rr3M
# TPg2s3Bns+pUPVgMijd4bUOH2BlEsLMMwOcolTTZqg1HYrdY1jxpUAI9ipjBQRIN
# L/O705Z+/f2LjNmJQooCVJVX24adpZ519SsfazGoqXGt91bmqKo0fI09Il4sUHh4
# ih6rpiQDBlyL7vmvCejwVxYevY4qVwTZ/o3gvl+R0lFxYS9feIM4NeG0+WsDZ7jL
# ci5MFeuNwosQY3z26Xg1oj0U9u+ncR9uTU+xBmJ8BtlCdhQ13RNMX5P+krRYPB3X
# Cp9Jm6XaO1995q32AIZm1mzBGI6yHlviXaEC5TzGiO1LXuPtXZU2X93oQJbMoe3v
# 8+5CPKrQalGWyYuh2a3V1pwbj+W0FEmEFPpu8TI+qYO1IIQWUSRvFjXth5Ob02hM
# MjCCB3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQEL
# BQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
# EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNV
# BAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4X
# DTIxMDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMxEzAR
# BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3Rh
# bXAgUENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM
# 57RyIQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9cT8dm
# 95VTcVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzB
# RMhxXFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBb
# fowQHJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCO
# Mcg1KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYw
# XE8s4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW
# /aUgfX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/w
# EPK3Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFphAXPK
# Z6Je1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2
# BjUYhEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXbGjfH
# CBUYP3irRbb1Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYB
# BAGCNxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnPEP8v
# BO4wHQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYM
# KwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0
# LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEF
# BQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD
# VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBW
# BgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny
# bC9wcm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUH
# AQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp
# L2NlcnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0BAQsF
# AAOCAgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518Jx
# Nj/aZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgADsAW+
# iehp4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2
# pFaq95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefw
# C2qBwoEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7
# T7uG+jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFO
# Ry3BFARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgkujhL
# mm77IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3L
# wUFJfn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzbaukz5
# m/8K6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE
# 0ZDxyKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNQMIICOAIB
# ATCB+aGB0aSBzjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UE
# CxMeblNoaWVsZCBUU1MgRVNOOjM3MDMtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNy
# b3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQBLIMg1P7sN
# uCXpmbH2IXT2tXeEEKCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy
# MDEwMA0GCSqGSIb3DQEBCwUAAgUA7iHh/DAiGA8yMDI2MDgwODE3MTIyOFoYDzIw
# MjYwODA5MTcxMjI4WjB3MD0GCisGAQQBhFkKBAExLzAtMAoCBQDuIeH8AgEAMAoC
# AQACAj1jAgH/MAcCAQACAhOAMAoCBQDuIzN8AgEAMDYGCisGAQQBhFkKBAIxKDAm
# MAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcN
# AQELBQADggEBALhje4kSSkao97Gjvqr7p9aqljXG5elIGRZxh+38bwDjhNWJaZKi
# +rmCbZQ57Syl3Ul7NwBQVrYp0boevI/Nn+9HotoqnGLQ/qycJW2dHzfJxmovpWvq
# hBcGe/cjVZ2u+fNqSR5iuggNYPv1XHATgNij/2s4XmOJYyNDCSg0DsbmYrnVlH1I
# bF8YEbGaIEGYMjD2IslnWV4Y4vvbgGjL4XZ4xqQ3/FwqlxlSFfr/PhEeX72eT1LH
# W9u/ySmNSAEWGuV+aM5JKgtLyxHzRnV96NeHQrB8rw7Tz/mhOcAyTFfC1xoZP6sY
# 4UkHiZWjKjAqJ8f0Kd9j3NIHsoU3XPs2OZQxggQNMIIECQIBATCBkzB8MQswCQYD
# VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3Nv
# ZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAh86cGnkojAulQABAAACHzANBglg
# hkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqG
# SIb3DQEJBDEiBCCNWY8r9idDa6GHRYmovLaB4L2hHSRPSvPnIK+A5xe/zjCB+gYL
# KoZIhvcNAQkQAi8xgeowgecwgeQwgb0EILAkCt9WkCsMtURkFu6TY0P3UXdRnCiY
# uPZhe3ykLfwUMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAC
# EzMAAAIfOnBp5KIwLpUAAQAAAh8wIgQgVTxDMJNxJJe8yjFWX/1QEafip5Gw55sH
# ul8q7BsoJLswDQYJKoZIhvcNAQELBQAEggIAfmsfnC+Gh2YrgIlN94bhhwTHYDD6
# sdRzKhaUckKEcoFD3hTbu80V1iIK1VRGFHFN5g5dMib2lNmw7HCAuepO4kOiVBnU
# xaSHtqNLMhYySSWLWx9VSrESpfdb5BXUQ3NIRgm0UX7v7pJb5e/QxfnRbDZu27Rp
# 6ahb6v02zr4jAwhoBj4hAXdhRHhNzOyWPxkb13pGMbk44rBbqJuo+uweAen7+qTo
# /R3ILRv6aG/tTK7plgMEFE/tQYk2TtwhsnL2kjDXwjmTBv10puwvw6mcTpBo3wNq
# U8dxxdkEL1WdUSVi8XjhWH3nTO0/sYk6U94ZGUC7gOGrMrZYxWY3zUswVOeXlRaY
# rG8ifUKcVhlU1AdS9MTvG/eBlQTsSWdSE5abpVXceu7SIW8Xk0Ztl91H7yt4mabX
# J9+TlyGWQxtK8sDZT/cm/CXhrtub/bhiOPE0jbia39cXCWlVMd1lenbqdeqAMOWl
# IGIFc0b+V/2GpT19io6U8JwKfsyJZCDQxniICpGoF4lCoZYK+SpseQWPkxdvuR1b
# k2z5ZSPbO/STrNMUw9H0QT9rpFa5Nb8jVGWtap9NeZODW4D8OvZcKEijp2IZ1yOP
# bVuphshOEPZcF6rGnxxOoG/wvZR9rMlaHzXFw1X8/i1fXlJxZ0JuMrmw/713tmfD
# OR78EPN1wo0VNXM=
# SIG # End signature block