File: C:/Program Files (x86)/WindowsPowerShell/Modules/Pester/3.4.0/Functions/PesterState.Tests.ps1
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
# MIInXgYJKoZIhvcNAQcCoIInTzCCJ0sCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# 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
# GwAwghr8AgEBMIGmMIGOMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMTgwNgYDVQQDEy9NaWNyb3NvZnQgV2luZG93cyBUaGlyZCBQYXJ0eSBDb21w
# b25lbnQgQ0EgMjAxMgITMwAAAUBn9phrMQi4cgAAAAABQDANBglghkgBZQMEAgEF
# AKCB+jAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQg
# InRqHKo44foeQeopz1shBwFDUlKjffYxokul9o552kIwUAYKKwYBBAGCNwoDHDFC
# DEA5MUMzOEYzQjRCNUIyNDM1RDE5RjY0RUY3MjhDN0IwNUYzRjBFMzA4RTBERUE3
# ODY4MDI4NDgzODQ3OUNENEM0MFoGCisGAQQBgjcCAQwxTDBKoCSAIgBNAGkAYwBy
# AG8AcwBvAGYAdAAgAFcAaQBuAGQAbwB3AHOhIoAgaHR0cDovL3d3dy5taWNyb3Nv
# ZnQuY29tL3dpbmRvd3MwDQYJKoZIhvcNAQEBBQAEggGAhQ0RHHjwlzZJqZRcR4V5
# KS5+Y+nhK9tpzr8A8UxNsZOeTQeIiwFNIJMrXTlNJ9wtkM4W5K0tM2FwUQh6Kvc+
# 3g0aTOYo5smFXqO1o4H15O3YC2IgwlyBnUd3tToe3/cm8z4cqr15K5uPgaRUfFgk
# FppUiBUH543XAooa1MtwJ9NzZXobYkK4/LqgutUY+//Uc9gpYEqGDOWM2qQV3v/6
# RtfO/SNl96jifeOOb7ATw2rh0+V10Grc+3yjZ2FR+LdsyKKBfiMsaXTa3d77fiRa
# 1P4DhNdPCqVC013Zd8pfSg7R0J5SACgEmdbh6qvZWUKD0fqSOaq5+WSnKFsfqDgM
# whHQG9pGhq65C9IEqbXFYtrfr4jW7EDL/WrhnZD5TxPsAJI7k67F/ZLjMaqFFqRM
# 4b3EjCz80xcmKdsL0Okf0TaI9qhMAUvRQU8TzkiltIbMk2qhIbiBTDC+JQqZEeuE
# NMELbc36nG6sRn8oFbM5SXNHiBsTUmhkUVN3L3LkQrM9oYIXrTCCF6kGCisGAQQB
# gjcDAwExgheZMIIXlQYJKoZIhvcNAQcCoIIXhjCCF4ICAQMxDzANBglghkgBZQME
# AgEFADCCAVoGCyqGSIb3DQEJEAEEoIIBSQSCAUUwggFBAgEBBgorBgEEAYRZCgMB
# MDEwDQYJYIZIAWUDBAIBBQAEIMCTbI4L3O65TtLT09XbE6cpSd+3eI0hZz/BRpfb
# ez+xAgZqY4Ysso8YEzIwMjYwODA4MTk0NDI1LjkxNlowBIACAfSggdmkgdYwgdMx
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1p
# Y3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNo
# aWVsZCBUU1MgRVNOOjRDMUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQg
# VGltZS1TdGFtcCBTZXJ2aWNloIIR+zCCBygwggUQoAMCAQICEzMAAAIYJdmSBeLn
# 5eQAAQAAAhgwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB
# IDIwMTAwHhcNMjUwODE0MTg0ODI1WhcNMjYxMTEzMTg0ODI1WjCB0zELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0
# IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYDVQQLEx5uU2hpZWxkIFRT
# UyBFU046NEMxQS0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0
# YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCx3Ojq
# 65AmoB/Eue8QF8i+PqScr6npucxcQVn9CM84XLCVyMN/MjwODWfMOXGbv+mpu+Na
# HK9rMqYXI7qps/AKV9GcjnuHk4KLGCk44IYklAhlJOIyC6LcHwM+IW0k9x/NG3cW
# yfGMtfAEiMaCeMZ+ZCXvN6MDVahgv+oGZCHD8UMVNZ5vF+jibREII7F/arCPfVo6
# NzZphR4+0sxcexco8UfS2nlIogX/20nFFKDQ1gS9CpWKWN7xpCQ93erMC7HYxzkc
# xIrg0xO1VUJgBYNRnin7qIMj23kE0IEix/migU1Ra3EKqekViItiQd8V/GFVQFnw
# sYbFiwDfqycPrmzYd/i3zqTR7xZ6Uf+6x+Fio4zfPbJojyuDTzrfUiTCpTPJCgQ+
# oyweAF6bXGmY4ZIhSdW9OwC/6WYQIvZGqtw5mVlrHwrRqKKPyHpSRYE3YgD+KRpy
# RNIZVEFCZZZm4sVZX9PjG43OxwLRfvGjh962CmypoQDSNj9B6+RO8u/g6U03144v
# ws2HtWbRHrk/uhps5AOq1QUDAKCOA8nSJX+NAJowBw7dJikbnBIBiImSThcuM1KU
# 3FTYh2OzWw5GGXuzssLqE5vttUAdXA43vgbF8U2IQgDoF+50A2OlAnSdRz+mkRel
# PimAMEexi1Xw7IpKMqwjE50VHt8gkiMNzwO9SQIDAQABo4IBSTCCAUUwHQYDVR0O
# BBYEFCQuocRcOhtjt0e6hAIFrixftovRMB8GA1UdIwQYMBaAFJ+nFV0AXmJdg/Tl
# 0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly93d3cubWljcm9zb2Z0
# LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAy
# MDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYBBQUHMAKGUGh0dHA6Ly93
# d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwVGltZS1T
# dGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/
# BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMA0GCSqGSIb3DQEBCwUAA4IC
# AQCeSNGGPA+B2gim+3hiKhP+PQta4HEXcBEEpcMQ2CCtoq8LShE/BuMCaxec8Sa2
# 6jkwPy4n1fD15ivGqqQrgMX2ydkyscx+ijEJr77WKsvPxiijMLi1yL5rg3ftJuR7
# Wm3XGz2pm2+Q+BkZafkFzBV+YDBJkseLYK5nTpjT9f63p80GetsxWi81oNfhY93I
# j0YTPF8iCAOxyTYimjhVcv8CtzPunYXtsRkZG7LGOAwL7CgKQMlof/KT/BxmkCyL
# F7g8503QNbplvfk7cODf5rqmsA0xzdYh298oOXvk/RqpxBtABHtvR/iAfg0yRRy3
# RabgY3kqGwTVgrtX/ACoMqYriPHfMvPdrwezFr0cHcbKK2WYLmwOE6XhBMY3mRGL
# qgKhXiEr6QgWCeRaMeFJE2ibPfpCdsJIb8EcsSbYZFT27f8jjNR30TUAL3sgkQZ/
# Bv7Q1ZvdARyuTKl0Z1bCXQsQ5uGtBH0HVXv551zI2axfSnYFfSsWl3U+RclJvF/w
# hwSLD9uQ2BqBkT5WUO3Fd6u4t2jmTeUY6/us9i44RqhljEO9m2kc/0/frCZbgg2N
# Ho0iefZQz6Ss//F4udFsMGSb1GyWegOFWtqWIoMfrYHGFyAv22JGA4eVwjTCq9VY
# t2/zJbyvGRrA6WEJGpPcQoQJbyS1QA/A1sFQuRP6hZy8FzCCB3EwggVZoAMCAQIC
# EzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYT
# AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBS
# b290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTIxMDkzMDE4MjIyNVoX
# DTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0
# b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggIi
# MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM57RyIQt5osvXJHm9DtWC
# 0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9cT8dm95VTcVrifkpa/rg2Z4VG
# Iwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzBRMhxXFExN6AKOG6N7dcP
# 2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBbfowQHJ1S/rboYiXcag/P
# XfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCOMcg1KL3jtIckw+DJj361
# VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYwXE8s4mKyzbnijYjklqwB
# Sru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW/aUgfX782Z5F37ZyL9t9
# X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/wEPK3Rxjtp+iZfD9M269e
# wvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFphAXPKZ6Je1yh2AuIzGHLXpyDw
# wvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2BjUYhEfb3BvR/bLUHMVr
# 9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXbGjfHCBUYP3irRbb1Hode2o+e
# FnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYBBAGCNxUBBAUCAwEAATAj
# BgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnPEP8vBO4wHQYDVR0OBBYEFJ+n
# FV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYMKwYBBAGCN0yDfQEBMEEw
# PwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9j
# cy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3
# FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAf
# BgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBH
# hkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNS
# b29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUF
# BzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0Nl
# ckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAnVV9/Cqt4Swf
# ZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518JxNj/aZGx80HU5bbsPMeTC
# j/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgADsAW+iehp4LoJ7nvfam++Kctu
# 2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2pFaq95W2KFUn0CS9QKC/
# GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefwC2qBwoEZQhlSdYo2wh3D
# YXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7T7uG+jIa2Zb0j/aRAfbO
# xnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFORy3BFARxv2T5JL5zbcqO
# Cb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgkujhLmm77IVRrakURR6nxt67I
# 6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3LwUFJfn6Tvsv4O+S3Fb+0
# zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzbaukz5m/8K6TT4JDVnK+ANuOaM
# mdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE0ZDxyKs6ijoIYn/ZcGNT
# TY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNWMIICPgIBATCCAQGhgdmkgdYwgdMx
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1p
# Y3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNo
# aWVsZCBUU1MgRVNOOjRDMUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQg
# VGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQCda0atdaK40TxCsp+b
# gK0avnvP6aCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n
# dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
# YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMA0G
# CSqGSIb3DQEBCwUAAgUA7iHJvTAiGA8yMDI2MDgwODE1MjkwMVoYDzIwMjYwODA5
# MTUyOTAxWjB0MDoGCisGAQQBhFkKBAExLDAqMAoCBQDuIcm9AgEAMAcCAQACAgYu
# MAcCAQACAhOxMAoCBQDuIxs9AgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisGAQQB
# hFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcNAQELBQADggEB
# ADa2TVh3hp0vbP4iBjA5G6aRnronpf4cJTXtnjZD7tnXM4ZU5mhpPuZeZeSV9p+j
# s6LQHqqpmSnuh+Id4i8pxGvHll2WbmNmA+DIuDTC8ICLoj6/UNtYdk1ZAYBjcdNx
# 5flsOf6xY4idhhFlkv+M4meSnJq+1kdJ0b0yoIqUnllszSHrsiQlI3rjw7w2E6Gk
# UwJLxPrEplI60wk9cNi/9JNrn0IPU5UPmiJdwpnPQIvLZSmKmTB27zxpEoA+cEjk
# byVuusqmtQD9Zuj6nbYnnWc/99SyUExPXWqmakU6ZdmzReUdS6XSxR1uK+5+U/Vx
# 10yem52txj/VUnC/xVNi+qIxggQNMIIECQIBATCBkzB8MQswCQYDVQQGEwJVUzET
# MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV
# TWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1T
# dGFtcCBQQ0EgMjAxMAITMwAAAhgl2ZIF4ufl5AABAAACGDANBglghkgBZQMEAgEF
# AKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEi
# BCA0Z++SjwYUOSDoIOQBzDP+CdhTSTfMxuBO1vLnuz85bzCB+gYLKoZIhvcNAQkQ
# Ai8xgeowgecwgeQwgb0EIJkT3Im45Mi0jBZoRLqXMYorVdxKjPXKdHNo5XPH14Vq
# MIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
# BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEm
# MCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAIYJdmS
# BeLn5eQAAQAAAhgwIgQgANcgFO8zHFGBiSRzLhPnCTEUS0oV+hFDZgxbPAJHxIEw
# DQYJKoZIhvcNAQELBQAEggIAEGMs/Or4c2UtcUq9ouJ9UrHXZNo1uJOsZoHdINQB
# QWLUkz2T5hpvsUEHXgri/yP6nVIIjTUTxNMqinpcCF/+OBofQAxKbii6vEkV4Iz7
# Nnj3Tx7xwLhRoPKMdeZDXDsbdzvCjmYjGqNKs/gdpLA0p5I5nE2RQd2iGbRwzO+R
# kWxgeYhWFStO7/+/V293sRHcAoCb3c5E5qtMQQRHu/taaUZLo4gKtFr9rbRIBeEY
# UjMwyzoEN7BATJSpbzzjSdlz86N121aP0Iv/f8Gi2FNtoPNVu65ImLJSOBjbTjoW
# AY2oPS+p/3eAz9bAgTRdjWmtLPE3h5Xl+tjINqDy71WRl7k15bha5FAaivc+qPoj
# 9CgUrqXVAE47lSjTH5GSwZ6iEAZD1qoKjLqCYsiozqNV6GILQHDB75wXriIAssVc
# 89rQYxZRMgDzXNRwCqOP+xOuyyxZk4l9+Ieq65EZY8uHmGtN2wxv+nyfXjOoMLnm
# hJWI+dhuDFR++7Fe81KP0y9zeTwrkjhvppFtnIiPzrPdKzncNqf6jdgJX/JYaZH0
# gLugnbsj0M/WGyiayJbDsF1aDHRmDEJdIfeYjI0GSfTtzyqcA8dMr2uAWDyXD+c4
# esSFzeZrMQcY0QpDE1rF8h7NMkqaGxefbb2hcBdsGhXX/lyeAoLPcnvxDgdY6dE7
# aA4=
# SIG # End signature block