function New-PesterState { param ( [String[]]$TagFilter, [String[]]$ExcludeTagFilter, [String[]]$TestNameFilter, [System.Management.Automation.SessionState]$SessionState, [Switch]$Strict, [Switch]$Quiet, [object]$PesterOption ) if ($null -eq $SessionState) { $SessionState = $ExecutionContext.SessionState } if ($null -eq $PesterOption) { $PesterOption = New-PesterOption } elseif ($PesterOption -is [System.Collections.IDictionary]) { try { $PesterOption = New-PesterOption @PesterOption } catch { throw } } & $SafeCommands['New-Module'] -Name Pester -AsCustomObject -ScriptBlock { param ( [String[]]$_tagFilter, [String[]]$_excludeTagFilter, [String[]]$_testNameFilter, [System.Management.Automation.SessionState]$_sessionState, [Switch]$Strict, [Switch]$Quiet, [object]$PesterOption ) #public read-only $TagFilter = $_tagFilter $ExcludeTagFilter = $_excludeTagFilter $TestNameFilter = $_testNameFilter $script:SessionState = $_sessionState $script:CurrentContext = "" $script:CurrentDescribe = "" $script:CurrentTest = "" $script:Stopwatch = [System.Diagnostics.Stopwatch]::StartNew() $script:MostRecentTimestamp = 0 $script:CommandCoverage = @() $script:BeforeEach = @() $script:AfterEach = @() $script:BeforeAll = @() $script:AfterAll = @() $script:Strict = $Strict $script:Quiet = $Quiet $script:TestResult = @() $script:TotalCount = 0 $script:Time = [timespan]0 $script:PassedCount = 0 $script:FailedCount = 0 $script:SkippedCount = 0 $script:PendingCount = 0 $script:InconclusiveCount = 0 $script:IncludeVSCodeMarker = $PesterOption.IncludeVSCodeMarker $script:SafeCommands = @{} $script:SafeCommands['New-Object'] = & (Pester\SafeGetCommand) -Name New-Object -Module Microsoft.PowerShell.Utility -CommandType Cmdlet $script:SafeCommands['Select-Object'] = & (Pester\SafeGetCommand) -Name Select-Object -Module Microsoft.PowerShell.Utility -CommandType Cmdlet $script:SafeCommands['Export-ModuleMember'] = & (Pester\SafeGetCommand) -Name Export-ModuleMember -Module Microsoft.PowerShell.Core -CommandType Cmdlet $script:SafeCommands['Add-Member'] = & (Pester\SafeGetCommand) -Name Add-Member -Module Microsoft.PowerShell.Utility -CommandType Cmdlet function EnterDescribe([string]$Name) { if ($CurrentDescribe) { throw & $SafeCommands['New-Object'] InvalidOperationException "You already are in Describe, you cannot enter Describe twice" } $script:CurrentDescribe = $Name } function LeaveDescribe { if ( $CurrentContext ) { throw & $SafeCommands['New-Object'] InvalidOperationException "Cannot leave Describe before leaving Context" } $script:CurrentDescribe = $null } function EnterContext([string]$Name) { if ( -not $CurrentDescribe ) { throw & $SafeCommands['New-Object'] InvalidOperationException "Cannot enter Context before entering Describe" } if ( $CurrentContext ) { throw & $SafeCommands['New-Object'] InvalidOperationException "You already are in Context, you cannot enter Context twice" } if ($CurrentTest) { throw & $SafeCommands['New-Object'] InvalidOperationException "You already are in It, you cannot enter Context inside It" } $script:CurrentContext = $Name } function LeaveContext { if ($CurrentTest) { throw & $SafeCommands['New-Object'] InvalidOperationException "Cannot leave Context before leaving It" } $script:CurrentContext = $null } function EnterTest([string]$Name) { if (-not $script:CurrentDescribe) { throw & $SafeCommands['New-Object'] InvalidOperationException "Cannot enter It before entering Describe" } if ( $CurrentTest ) { throw & $SafeCommands['New-Object'] InvalidOperationException "You already are in It, you cannot enter It twice" } $script:CurrentTest = $Name } function LeaveTest { $script:CurrentTest = $null } function AddTestResult { param ( [string]$Name, [ValidateSet("Failed","Passed","Skipped","Pending","Inconclusive")] [string]$Result, [Nullable[TimeSpan]]$Time, [string]$FailureMessage, [string]$StackTrace, [string] $ParameterizedSuiteName, [System.Collections.IDictionary] $Parameters, [System.Management.Automation.ErrorRecord] $ErrorRecord ) $previousTime = $script:MostRecentTimestamp $script:MostRecentTimestamp = $script:Stopwatch.Elapsed if ($null -eq $Time) { $Time = $script:MostRecentTimestamp - $previousTime } if (-not $script:Strict) { $Passed = "Passed","Skipped","Pending" -contains $Result } else { $Passed = $Result -eq "Passed" if (($Result -eq "Skipped") -or ($Result -eq "Pending")) { $FailureMessage = "The test failed because the test was executed in Strict mode and the result '$result' was translated to Failed." $Result = "Failed" } } $script:TotalCount++ $script:Time += $Time switch ($Result) { Passed { $script:PassedCount++; break; } Failed { $script:FailedCount++; break; } Skipped { $script:SkippedCount++; break; } Pending { $script:PendingCount++; break; } Inconclusive { $script:InconclusiveCount++; break; } } $Script:TestResult += & $SafeCommands['New-Object'] -TypeName PsObject -Property @{ Describe = $CurrentDescribe Context = $CurrentContext Name = $Name Passed = $Passed Result = $Result Time = $Time FailureMessage = $FailureMessage StackTrace = $StackTrace ErrorRecord = $ErrorRecord ParameterizedSuiteName = $ParameterizedSuiteName Parameters = $Parameters } | & $SafeCommands['Select-Object'] Describe, Context, Name, Result, Passed, Time, FailureMessage, StackTrace, ErrorRecord, ParameterizedSuiteName, Parameters } $ExportedVariables = "TagFilter", "ExcludeTagFilter", "TestNameFilter", "TestResult", "CurrentContext", "CurrentDescribe", "CurrentTest", "SessionState", "CommandCoverage", "BeforeEach", "AfterEach", "BeforeAll", "AfterAll", "Strict", "Quiet", "Time", "TotalCount", "PassedCount", "FailedCount", "SkippedCount", "PendingCount", "InconclusiveCount", "IncludeVSCodeMarker" $ExportedFunctions = "EnterContext", "LeaveContext", "EnterDescribe", "LeaveDescribe", "EnterTest", "LeaveTest", "AddTestResult" & $SafeCommands['Export-ModuleMember'] -Variable $ExportedVariables -function $ExportedFunctions } -ArgumentList $TagFilter, $ExcludeTagFilter, $TestNameFilter, $SessionState, $Strict, $Quiet, $PesterOption | & $SafeCommands['Add-Member'] -MemberType ScriptProperty -Name Scope -Value { if ($this.CurrentTest) { 'It' } elseif ($this.CurrentContext) { 'Context' } elseif ($this.CurrentDescribe) { 'Describe' } else { $null } } -Passthru | & $SafeCommands['Add-Member'] -MemberType ScriptProperty -Name ParentScope -Value { $parentScope = $null $scope = $this.Scope if ($scope -eq 'It' -and $this.CurrentContext) { $parentScope = 'Context' } if ($null -eq $parentScope -and $scope -ne 'Describe' -and $this.CurrentDescribe) { $parentScope = 'Describe' } return $parentScope } -PassThru } function Write-Describe { param ( [Parameter(mandatory=$true, valueFromPipeline=$true)]$Name ) process { Write-Screen Describing $Name -OutputType Header } } function Write-Context { param ( [Parameter(mandatory=$true, valueFromPipeline=$true)]$Name ) process { $margin = " " * 3 Write-Screen ${margin}Context $Name -OutputType Header } } function Write-PesterResult { param ( [Parameter(mandatory=$true, valueFromPipeline=$true)] $TestResult ) process { $testDepth = if ( $TestResult.Context ) { 4 } elseif ( $TestResult.Describe ) { 1 } else { 0 } $margin = " " * $TestDepth $error_margin = $margin + " " $output = $TestResult.name $humanTime = Get-HumanTime $TestResult.Time.TotalSeconds switch ($TestResult.Result) { Passed { "$margin[+] $output $humanTime" | Write-Screen -OutputType Passed break } Failed { "$margin[-] $output $humanTime" | Write-Screen -OutputType Failed $failureLines = $TestResult.ErrorRecord | ConvertTo-FailureLines if ($Pester.IncludeVSCodeMarker) { $marker = $failureLines | & $script:SafeCommands['Select-Object'] -First 1 -ExpandProperty Trace | & $script:SafeCommands['Select-Object'] -First 1 Write-Screen -OutputType Failed $($marker -replace '(?m)^',$error_margin) } $failureLines | & $SafeCommands['ForEach-Object'] {$_.Message + $_.Trace} | & $SafeCommands['ForEach-Object'] { Write-Screen -OutputType Failed $($_ -replace '(?m)^',$error_margin) } } Skipped { "$margin[!] $output $humanTime" | Write-Screen -OutputType Skipped break } Pending { "$margin[?] $output $humanTime" | Write-Screen -OutputType Pending break } Inconclusive { "$margin[?] $output $humanTime" | Write-Screen -OutputType Inconclusive if ($testresult.FailureMessage) { Write-Screen -OutputType Inconclusive $($TestResult.failureMessage -replace '(?m)^',$error_margin) } Write-Screen -OutputType Inconclusive $($TestResult.stackTrace -replace '(?m)^',$error_margin) break } } } } function ConvertTo-FailureLines { param ( [Parameter(mandatory=$true, valueFromPipeline=$true)] $ErrorRecord ) process { $lines = & $script:SafeCommands['New-Object'] psobject -Property @{ Message = @() Trace = @() } ## convert the exception messages $exception = $ErrorRecord.Exception $exceptionLines = @() while ($exception) { $exceptionName = $exception.GetType().Name $thisLines = $exception.Message.Split([Environment]::NewLine, [System.StringSplitOptions]::RemoveEmptyEntries) if ($ErrorRecord.FullyQualifiedErrorId -ne 'PesterAssertionFailed') { $thisLines[0] = "$exceptionName`: $($thisLines[0])" } [array]::Reverse($thisLines) $exceptionLines += $thisLines $exception = $exception.InnerException } [array]::Reverse($exceptionLines) $lines.Message += $exceptionLines if ($ErrorRecord.FullyQualifiedErrorId -eq 'PesterAssertionFailed') { $lines.Message += "$($ErrorRecord.TargetObject.Line)`: $($ErrorRecord.TargetObject.LineText)".Split([Environment]::NewLine, [System.StringSplitOptions]::RemoveEmptyEntries) } if ( -not ($ErrorRecord | & $SafeCommands['Get-Member'] -Name ScriptStackTrace) ) { if ($ErrorRecord.FullyQualifiedErrorID -eq 'PesterAssertionFailed') { $lines.Trace += "at line: $($ErrorRecord.TargetObject.Line) in $($ErrorRecord.TargetObject.File)" } else { $lines.Trace += "at line: $($ErrorRecord.InvocationInfo.ScriptLineNumber) in $($ErrorRecord.InvocationInfo.ScriptName)" } return $lines } ## convert the stack trace $traceLines = $ErrorRecord.ScriptStackTrace.Split([Environment]::NewLine, [System.StringSplitOptions]::RemoveEmptyEntries) # omit the lines internal to Pester foreach ( $line in $traceLines ) { if ( $line -match '^at (Invoke-Test|Context|Describe|InModuleScope|Invoke-Pester), .*\\Functions\\.*.ps1: line [0-9]*$' ) { break } $count ++ } $lines.Trace += $traceLines | & $SafeCommands['Select-Object'] -First $count | & $SafeCommands['Where-Object'] { $_ -notmatch '^at Should, .*\\Functions\\Assertions\\Should.ps1: line [0-9]*$' -and $_ -notmatch '^at Assert-MockCalled, .*\\Functions\\Mock.ps1: line [0-9]*$' } return $lines } } function Write-PesterReport { param ( [Parameter(mandatory=$true, valueFromPipeline=$true)] $PesterState ) Write-Screen "Tests completed in $(Get-HumanTime $PesterState.Time.TotalSeconds)" Write-Screen ("Passed: {0} Failed: {1} Skipped: {2} Pending: {3} Inconclusive: {4}" -f $PesterState.PassedCount, $PesterState.FailedCount, $PesterState.SkippedCount, $PesterState.PendingCount, $PesterState.InconclusiveCount) } function Write-Screen { #wraps the Write-Host cmdlet to control if the output is written to screen from one place param( #Write-Host parameters [Parameter(Position=0, ValueFromPipeline=$true, ValueFromRemainingArguments=$true)] [Object] $Object, [Switch] $NoNewline, [Object] $Separator, #custom parameters [Switch] $Quiet = $pester.Quiet, [ValidateSet("Failed","Passed","Skipped","Pending","Inconclusive","Header","Standard")] [String] $OutputType = "Standard" ) begin { if ($Quiet) { return } #make the bound parameters compatible with Write-Host if ($PSBoundParameters.ContainsKey('Quiet')) { $PSBoundParameters.Remove('Quiet') | & $SafeCommands['Out-Null'] } if ($PSBoundParameters.ContainsKey('OutputType')) { $PSBoundParameters.Remove('OutputType') | & $SafeCommands['Out-Null'] } if ($OutputType -ne "Standard") { #create the key first to make it work in strict mode if (-not $PSBoundParameters.ContainsKey('ForegroundColor')) { $PSBoundParameters.Add('ForegroundColor', $null) } switch ($Host.Name) { #light background "PowerGUIScriptEditorHost" { $ColorSet = @{ Failed = [ConsoleColor]::Red Passed = [ConsoleColor]::DarkGreen Skipped = [ConsoleColor]::DarkGray Pending = [ConsoleColor]::DarkCyan Inconclusive = [ConsoleColor]::DarkCyan Header = [ConsoleColor]::Magenta } } #dark background { "Windows PowerShell ISE Host", "ConsoleHost" -contains $_ } { $ColorSet = @{ Failed = [ConsoleColor]::Red Passed = [ConsoleColor]::Green Skipped = [ConsoleColor]::Gray Pending = [ConsoleColor]::Cyan Inconclusive = [ConsoleColor]::Cyan Header = [ConsoleColor]::Magenta } } default { $ColorSet = @{ Failed = [ConsoleColor]::Red Passed = [ConsoleColor]::DarkGreen Skipped = [ConsoleColor]::Gray Pending = [ConsoleColor]::Gray Inconclusive = [ConsoleColor]::Gray Header = [ConsoleColor]::Magenta } } } $PSBoundParameters.ForegroundColor = $ColorSet.$OutputType } try { $outBuffer = $null if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer)) { $PSBoundParameters['OutBuffer'] = 1 } $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Write-Host', [System.Management.Automation.CommandTypes]::Cmdlet) $scriptCmd = {& $wrappedCmd @PSBoundParameters } $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin) $steppablePipeline.Begin($PSCmdlet) } catch { throw } } process { if ($Quiet) { return } try { $steppablePipeline.Process($_) } catch { throw } } end { if ($Quiet) { return } try { $steppablePipeline.End() } catch { throw } } } # SIG # Begin signature block # MIInSAYJKoZIhvcNAQcCoIInOTCCJzUCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDPZLreddgR0Geh # u1WfGwwONHXVHGKZRDPrAFEgyifb1qCCC7QwggXLMIIEs6ADAgECAhMzAAABQGf2 # 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 # GuowghrmAgEBMIGmMIGOMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMTgwNgYDVQQDEy9NaWNyb3NvZnQgV2luZG93cyBUaGlyZCBQYXJ0eSBDb21w # b25lbnQgQ0EgMjAxMgITMwAAAUBn9phrMQi4cgAAAAABQDANBglghkgBZQMEAgEF # AKCB+jAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQg # D/DeTnDG+LNsksn6/w3zgFW6Ofn67wEuOg6aoSgx2nkwUAYKKwYBBAGCNwoDHDFC # DEA4M0U3MzRGRTNDNjlCMEM0NEU3MEFEQkZBRTlGN0M4NjRFOTMyMkMxN0FBNjlC # ODM1RTFCRDkwQzY0QURFOUJDMFoGCisGAQQBgjcCAQwxTDBKoCSAIgBNAGkAYwBy # AG8AcwBvAGYAdAAgAFcAaQBuAGQAbwB3AHOhIoAgaHR0cDovL3d3dy5taWNyb3Nv # ZnQuY29tL3dpbmRvd3MwDQYJKoZIhvcNAQEBBQAEggGASQ+AU6YVCcRzRBshMs9e # pD+/PJrpvaH9+ex47cSQNRYTcZyHU0iU5QYDDe+RH7kj1XYKzay3t5DhFrHFIr65 # T0qVLKs7fa6flOaK2XHYDXjSR2FUcCLuys+fBq0oRQlWmw1T6xDIffx9NFp/ZWJK # Y5Oqd4oeIg84d9IF8oDWIRhJnjPmI5MXbWpcHU+jlAecZvuoaygjXRyJyzstmdsn # IU2kMobsDg8hJVGLTujoTcBwz+2yG9E8RSaLOjVgkPOSo5ZMiA59eiWNLalv50nS # qlAgc7WicC7PIGSWEzwmrj8gLeMd6EXsIhvS2mO42Dqpdr3wtNc1kd3u8NxOj/XP # A1mx8y9+Vxni+Q/deW3tIRgfWZKfvXWnug2FL3MKhyrjZwx1rPr8W3pwY8gTInmd # x7pjS8B69egSfF6RCZY9l0OZRz9Svqi7JCSSGMX0UWC+TFb61YDr8xFDHAMRVSWl # 9l03wamYs277HcNVpq33FyfD4wkT3NY5x9umyLAbQTcDoYIXlzCCF5MGCisGAQQB # gjcDAwExgheDMIIXfwYJKoZIhvcNAQcCoIIXcDCCF2wCAQMxDzANBglghkgBZQME # AgEFADCCAVIGCyqGSIb3DQEJEAEEoIIBQQSCAT0wggE5AgEBBgorBgEEAYRZCgMB # MDEwDQYJYIZIAWUDBAIBBQAEIHelnEHgKwtNlBfkuJYBhecdDuFxXTZWDxG7S6Iz # dutKAgZp57G2IVkYEzIwMjYwNTA2MTU0OTQ2LjMwNVowBIACAfSggdGkgc4wgcsx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1p # Y3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQgVFNT # IEVTTjo4OTAwLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3Rh # bXAgU2VydmljZaCCEe0wggcgMIIFCKADAgECAhMzAAACIkHS9qr/yLX/AAEAAAIi # MA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4X # DTI2MDIxOTE5Mzk1NloXDTI3MDUxNzE5Mzk1NlowgcsxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNh # IE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo4OTAwLTA1RTAt # RDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCAiIw # DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALW54om6Qi5SwAAmj8BjkNlGoftu # GC/sJYY2UR1tEaghOt0Tpayfns1o27UFN2MFsVy/tF+LG17TH4dG9dKqwP5Z5Jf/ # r/L3ATQzP7FE9MYhjbQrtpANrrw7LNXJR5QLKnJkL+Bb/fK079k6dT0fauLvuQk/ # wAGurLLVTFf86x4SC8eyPzKKRZPQBG2uNZtcwcXNI6jmFBx9SYxcqpZbPr43T5TK # eEbLWf52hbhZmCkfxjlbuGlKiRaPUz8u7jCLejoPP29Va6RyBQUaMsCXhhmk6FqH # se6IL9qVciYxB/wLcDyr/r/WEWh4hkHhQaTLDEH85JM5Kwvr7f2kOrMzsKA6l/hX # v32Q33jIz25ckjlP9KIDkx0hkiERbT5uHzlGoOHlhbf+hq/nhE/HDk4+UfrhBXoo # mSXQUgSUxWgs2jxRZFBwwPXv3HtYBKMLouxo1nvIrSpwRIiwvXCJCZ19AHFyqsUK # khB+eZAWQ6n0jJdRarNry2anPwTppeD1vV6IBPc9VOCs6U+L+FhkJ8/Ff/qMa3I+ # PLUKLA6YlqaiGZJT/8I4B6d9FPYbYcxFSkJfXOz4CYOZ1AzVdFpvhhIAssCUPMYK # yAjvuee4mOhcCWIma/s1+u9YBwDkqoJQ5ZDqRI+3mvbwx8pdYkmlJe0V5L8yQPMn # L+IlFXIdwXL8H4y3AgMBAAGjggFJMIIBRTAdBgNVHQ4EFgQUWQfAagMnllsQSK7w # qy2K6ypqjNAwHwYDVR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYDVR0f # BFgwVjBUoFKgUIZOaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwv # TWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwGCCsG # AQUFBwEBBGAwXjBcBggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAx # MCgxKS5jcnQwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAO # BgNVHQ8BAf8EBAMCB4AwDQYJKoZIhvcNAQELBQADggIBAGIAz6equnAbb23FJe/j # aj4KxN7YLhuhpF8WO70lpaQtMfCrumSc040vef5QbfH8HTzcQpeIVisCa6XsFMcI # ZdTrf/FGxnbCPdmZHQDh32d/2xoIlWbiO49UUFqL+iS045gfaP7X7MzvTCg3mieA # H+m/LtfwB9jokHhc+9vzRDPt9jl511ufCPODWxmFQ8VttzB5Z4AIg2vOoUrraYx5 # cqaG258ytqiiAl4ld9ZjfHj+lu5uAQ1Pf6ldPrnbTcI8X2R90oTsYoAhFjLfGQFM # O8V3x25+M6kKffycrqoyVW2cGMOFZAbQ8zcT+jEGzlQGsjqkFiSYge1uOJ8Oq4dP # 5OFpVXvEdzoiehJzdo3Nfj0kdSBCa68N0yMuRthd4DT/WrkjFKDZT7JxkE68CLe5 # 1k8qEDlXM4ON/+5y7+8W1ethxGSYYo3eO6Norf/IxmLYm7k0QvchJaivCntGN5mD # 4kwgrR+iy5WP5gKbmvrgsf8P1AkMCP5d9lo14V2/3QrkDRBFEY/+mgH3JMhWMReP # +4nOnwvgN3jiwCq6oM6Id2QuDF8ryc+qkJJY9n0b5EI+bzmj1wB/EQ22tK47BynI # rPGxEJgIv48rj73yiuK30RUn8sugJ4b6MuWPQpoPhDLqxl7itYyvVutAuixMFk3A # WdfE2MicJYF3SLuKzXJNL/ipMIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJmQAA # AAAAFTANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh # c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD # b3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUg # QXV0aG9yaXR5IDIwMTAwHhcNMjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1WjB8 # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N # aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEBBQAD # ggIPADCCAgoCggIBAOThpkzntHIhC3miy9ckeb0O1YLT/e6cBwfSqWxOdcjKNVf2 # AX9sSuDivbk+F2Az/1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhgfWpS # g0S3po5GawcU88V29YZQ3MFEyHFcUTE3oAo4bo3t1w/YJlN8OWECesSq/XJprx2r # rPY2vjUmZNqYO7oaezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/dvI2k # 45GPsjksUZzpcGkNyjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7mka97aSu # eik3rMvrg0XnRm7KMtXAhjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKRHh09 # /SDPc31BmkZ1zcRfNN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn427DZM9ituqBJR # 6L8FA6PRc6ZNN3SUHDSCD/AQ8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyOArxC # aC4Q6oRRRuLRvWoYWmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2ZItboKaD # IV1fMHSRlJTYuVD5C4lh8zYGNRiER9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6bMUR # HXLvjflSxIUXk8A8FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6tAgMB # AAGjggHdMIIB2TASBgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQWBBQq # p1L+ZMSavoKRPEY1Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacbUzUZ # 6XIwXAYDVR0gBFUwUzBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRt # MBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBB # MAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP # 6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWlj # cm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2 # LTIzLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cu # bWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMu # Y3J0MA0GCSqGSIb3DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/qXBS2 # Pk5HZHixBpOXPTEztTnXwnE2P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7pZmc6U03d # mLq2HnjYNi6cqYJWAAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2CDPVtI1Tk # eFN1JFe53Z/zjj3G82jfZfakVqr3lbYoVSfQJL1AoL8ZthISEV09J+BAljis9/kp # icO8F7BUhUKz/AyeixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTpkbKp # W99Jo3QMvOyRgNI95ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32THJvEKt1MMU0sHrY # UP4KWN1APMdUbZ1jdEgssU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138eW0QB # jloZkWsNn6Qo3GcZKCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQTHa1V1QJsWkB # RH58oWFsc/4Ku+xBZj1p/cvBQUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7Fx0V # iY1w/ue10CgaiQuPNtq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0llOZ0dFtq # 0Z4+7X6gMTN9vMvpe784cETRkPHIqzqKOghif9lwY1NNje6CbaUFEMFxBmoQtB1V # M1izoXBm8qGCA1AwggI4AgEBMIH5oYHRpIHOMIHLMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBP # cGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046ODkwMC0wNUUwLUQ5 # NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAH # BgUrDgMCGgMVALvJxdVnHduwOkmSvtW5yCmSyjO4oIGDMIGApH4wfDELMAkGA1UE # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0 # IFRpbWUtU3RhbXAgUENBIDIwMTAwDQYJKoZIhvcNAQELBQACBQDtpUuvMCIYDzIw # MjYwNTA2MDUxMDA3WhgPMjAyNjA1MDcwNTEwMDdaMHcwPQYKKwYBBAGEWQoEATEv # MC0wCgIFAO2lS68CAQAwCgIBAAICBj0CAf8wBwIBAAICEyowCgIFAO2mnS8CAQAw # NgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgC # AQACAwGGoDANBgkqhkiG9w0BAQsFAAOCAQEANqSk/+1ka2f1Twz6Ttmrj0+zKdfc # q/fTRDiBc5P2vgbzlidqQc/19pp9flHwSd2W1osGDrBlFDldr5KQBIbTO7hUrIlJ # u/gRK0DBjwFj/Yvy3FGSHfyanAUnFflt0oCibhm2v7Qy8mmeCOUlu4L8Ug99fS6l # 2lSe4/+41VIQprkUClsED8+/Gz7cBHFoIfB91wiOwIDu+/Hv32BGEYKiJh0MDIav # 3EPOWGOTL9HIl5szUCUATI1mUB+3SYyzH7Lfc9TtcZ3ybiQS8PfABaGGWnH27li/ # CETD2Kmv3Qzbv5xzsjOFCn/TtNDbMSO6wvzvnOhgCHrNuROtorHwpszNhjGCBA0w # ggQJAgEBMIGTMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw # DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # JjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAACIkHS # 9qr/yLX/AAEAAAIiMA0GCWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYL # KoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIEIP03P6oatYumiabEsCgE6aWf0mL+ # se7js77WUS0Q5ZaHMIH6BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgBWBdAQoE # 58aCM2ySYM6ZtwQg6ccY3AD5BxG58NHkCRMwgZgwgYCkfjB8MQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGlt # ZS1TdGFtcCBQQ0EgMjAxMAITMwAAAiJB0vaq/8i1/wABAAACIjAiBCB/9y65EABF # UYjGjbSJ2q80tMsL6gTLpM1hL3cLTJquwDANBgkqhkiG9w0BAQsFAASCAgCBCCJk # hA1aJdowPQpgpqBfPu+0Wmfow8GSzC5MwoJE3igoWI2kcHlWnH1o0ibb0yan+nwP # C3kmFWP9VX4ci0hs7qBg2qjVTj8Zy2Z9QbtVzSNLTWeZ9mZKo0qUfXhQfdKo4rx+ # /hIn28DWmNq52JDxKIj4ic669H//1c0BVmEagk2ul0Rn1t1/C7FG5FU+R/fPWxZp # MxJAdT2+YdKLDf0ysJYzF4HLHZT6NYg2R1T+nXIQWkvhhrRC5Y2TnH1nIRCRzvA3 # cjlrH1GljZSl2NdyYN8Lqnksryjc/S+lNkfDAnGQgzBuOYIKdE956TB1o1eKQfQL # kHJmae18owgSaY8Dm3nzkBdK1qNALrBB0JYu0Wqyyuf2sCh0gpBQjTvbTHO3Gsk6 # 4WnxlI+FJ6s8qGO06vvmd4ZoiAPW1sEu8zNr+nAocApA7DcTzJBS3BOFBtj5B59H # J7zHyfojvq9esNywJrwJzaAoQA1bvW13CPOKx6euhJr4v3LVcDYKVJvyOuugA0GP # AQ2qqABxNcUQa3rqWDD5+4UqOn6OpX1Fw0XZ00Fhz56dN4LZyAm7HJXbSS4ehbF2 # jqJcnu0AXE9gyrkIp8a/Bjl96hdA3XcB5d2aELnWxNSr1jw5s2V5gesKBdomaO7D # RjG2OqJrIpWD7ty2FFRdld+2tU8gOaeKgjKnCw== # SIG # End signature block x

Windows NT KPTV 6.2 build 9200 (Windows Server 2012 Datacenter Edition) i586