<# .SYNOPSIS Shows the current status of the Secure Boot rollout orchestrator. .DESCRIPTION Provides real-time visibility into the rollout progress: - Current wave number and devices targeted - Devices updated vs pending - Blocked buckets requiring attention - Recent activity log - Dashboard link Run this anytime to see how the rollout is progressing. .PARAMETER ReportBasePath Path to the report/state directory used by the orchestrator .PARAMETER ShowLog Display recent log entries (last 50 lines) .PARAMETER ShowBlocked Show details of blocked buckets .PARAMETER ShowWaves Show wave history with device counts .PARAMETER Watch Continuously refresh status every N seconds .PARAMETER OpenDashboard Open the latest HTML dashboard in browser .EXAMPLE .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath "C:\SecureBootReports" .EXAMPLE .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath "C:\SecureBootReports" -Watch 30 .EXAMPLE .\Get-SecureBootRolloutStatus.ps1 -ReportBasePath "C:\SecureBootReports" -OpenDashboard #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [string]$ReportBasePath, [Parameter(Mandatory = $false)] [switch]$ShowLog, [Parameter(Mandatory = $false)] [switch]$ShowBlocked, [Parameter(Mandatory = $false)] [switch]$ShowWaves, [Parameter(Mandatory = $false)] [int]$Watch = 0, [Parameter(Mandatory = $false)] [switch]$OpenDashboard ) $ErrorActionPreference = "Stop" $DownloadUrl = "https://aka.ms/getsecureboot" $DownloadSubPage = "Deployment and Monitoring Samples" # Note: This script has no dependencies on other scripts. # For the complete toolset, download from: $DownloadUrl -> $DownloadSubPage # ============================================================================ # HELPER FUNCTIONS # ============================================================================ function ConvertTo-Hashtable { param([Parameter(ValueFromPipeline = $true)]$InputObject) process { if ($null -eq $InputObject) { return @{} } if ($InputObject -is [System.Collections.IDictionary]) { return $InputObject } if ($InputObject -is [PSCustomObject]) { $hash = @{} foreach ($prop in $InputObject.PSObject.Properties) { $hash[$prop.Name] = ConvertTo-Hashtable $prop.Value } return $hash } if ($InputObject -is [System.Collections.IEnumerable] -and $InputObject -isnot [string]) { return @($InputObject | ForEach-Object { ConvertTo-Hashtable $_ }) } return $InputObject } } function Show-Status { $stateDir = Join-Path $ReportBasePath "RolloutState" $rolloutStatePath = Join-Path $stateDir "RolloutState.json" $blockedBucketsPath = Join-Path $stateDir "BlockedBuckets.json" Clear-Host Write-Host "" Write-Host ("=" * 80) -ForegroundColor Cyan Write-Host " SECURE BOOT ROLLOUT STATUS" -ForegroundColor Cyan Write-Host " $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -ForegroundColor Gray Write-Host ("=" * 80) -ForegroundColor Cyan Write-Host "" # Check if orchestrator task is running $task = Get-ScheduledTask -TaskName "SecureBoot-Rollout-Orchestrator" -ErrorAction SilentlyContinue if ($task) { $taskState = $task.State $color = if ($taskState -eq "Running") { "Green" } elseif ($taskState -eq "Ready") { "Yellow" } else { "Red" } Write-Host "Scheduled Task: " -NoNewline Write-Host $taskState -ForegroundColor $color } else { Write-Host "Scheduled Task: " -NoNewline Write-Host "Not Installed" -ForegroundColor Gray } # Load rollout state if (-not (Test-Path $rolloutStatePath)) { Write-Host "" Write-Host "No rollout state found. Orchestrator may not have started yet." -ForegroundColor Yellow Write-Host "State path: $rolloutStatePath" -ForegroundColor Gray return } $state = Get-Content $rolloutStatePath -Raw | ConvertFrom-Json | ConvertTo-Hashtable Write-Host "" Write-Host "ROLLOUT PROGRESS" -ForegroundColor Yellow Write-Host ("-" * 40) $status = $state.Status $statusColor = switch ($status) { "Completed" { "Green" } "InProgress" { "Cyan" } "NotStarted" { "Gray" } default { "White" } } Write-Host "Status: " -NoNewline Write-Host $status -ForegroundColor $statusColor Write-Host "Current Wave: $($state.CurrentWave)" Write-Host "Total Devices: $($state.TotalDevicesTargeted)" Write-Host "Total Updated: $($state.TotalDevicesUpdated)" $notUpdated = $state.TotalDevicesTargeted - $state.TotalDevicesUpdated if ($notUpdated -gt 0) { Write-Host "Not Updated: " -NoNewline Write-Host "$notUpdated" -ForegroundColor Yellow } if ($state.StartedAt) { Write-Host "Started: $($state.StartedAt)" } if ($state.LastAggregation) { Write-Host "Last Check: $($state.LastAggregation)" } if ($state.CompletedAt) { Write-Host "Completed: $($state.CompletedAt)" -ForegroundColor Green } # Show progress bar if ($state.TotalDevicesTargeted -gt 0) { $pct = if ($state.TotalDevicesUpdated -and $state.TotalDevicesTargeted) { [math]::Round(($state.TotalDevicesUpdated / $state.TotalDevicesTargeted) * 100, 1) } else { 0 } Write-Host "" Write-Host "Progress: " -NoNewline $barWidth = 40 $filled = [math]::Floor($barWidth * $pct / 100) $empty = $barWidth - $filled $pctColor = if ($pct -ge 90) { "Green" } elseif ($pct -ge 50) { "Cyan" } elseif ($pct -ge 25) { "Yellow" } else { "Red" } Write-Host "[" -NoNewline if ($filled -gt 0) { Write-Host ("=" * ($filled - 1) + ">") -ForegroundColor $pctColor -BackgroundColor DarkGreen -NoNewline } if ($empty -gt 0) { Write-Host (" " * $empty) -BackgroundColor DarkGray -NoNewline } Write-Host "] " -NoNewline Write-Host "$pct%" -ForegroundColor $pctColor Write-Host " $($state.TotalDevicesUpdated) / $($state.TotalDevicesTargeted) devices" -ForegroundColor Gray } # Blocked buckets summary if (Test-Path $blockedBucketsPath) { $blocked = Get-Content $blockedBucketsPath -Raw | ConvertFrom-Json | ConvertTo-Hashtable if ($blocked.Count -gt 0) { Write-Host "" Write-Host "BLOCKED BUCKETS: " -NoNewline -ForegroundColor Red Write-Host "$($blocked.Count) buckets need attention" -ForegroundColor Red if ($ShowBlocked) { Write-Host "" foreach ($key in $blocked.Keys) { $info = $blocked[$key] Write-Host " ► $key" -ForegroundColor Red Write-Host " Reason: $($info.Reason)" -ForegroundColor Gray $devices = if ($info.FailedDevices) { $info.FailedDevices } else { "(unknown)" } Write-Host " Devices: " -NoNewline -ForegroundColor Gray Write-Host "$devices" -ForegroundColor Yellow Write-Host " Since: $($info.BlockedAt)" -ForegroundColor Gray Write-Host " Unblock: " -NoNewline -ForegroundColor Gray Write-Host ".\Start-SecureBootRolloutOrchestrator.ps1 -ReportBasePath '$ReportBasePath' -UnblockBucket '$key'" -ForegroundColor Cyan Write-Host "" } Write-Host " To unblock ALL buckets:" -ForegroundColor Gray Write-Host " .\Start-SecureBootRolloutOrchestrator.ps1 -ReportBasePath '$ReportBasePath' -UnblockAll" -ForegroundColor Cyan } else { Write-Host " Run with -ShowBlocked for details" -ForegroundColor Gray } } } # Wave history if ($ShowWaves -and $state.WaveHistory -and $state.WaveHistory.Count -gt 0) { Write-Host "" Write-Host "WAVE HISTORY" -ForegroundColor Yellow Write-Host ("-" * 40) foreach ($wave in $state.WaveHistory) { Write-Host "Wave $($wave.WaveNumber): " -NoNewline -ForegroundColor Cyan Write-Host "$($wave.DeviceCount) devices" -NoNewline Write-Host " - $($wave.StartedAt)" -ForegroundColor Gray } } # Latest dashboard $latestAggregation = Get-ChildItem -Path $ReportBasePath -Directory -Filter "Aggregation_*" -ErrorAction SilentlyContinue | Sort-Object Name -Descending | Select-Object -First 1 if ($latestAggregation) { # Prefer the stable Latest.html link (always current, never deleted by retention) $latestDashboard = Join-Path $latestAggregation.FullName "SecureBoot_Dashboard_Latest.html" $timestampedDashboard = Get-ChildItem -Path $latestAggregation.FullName -Filter "SecureBoot_Dashboard_2*.html" -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending | Select-Object -First 1 if ((Test-Path $latestDashboard) -or $timestampedDashboard) { Write-Host "" Write-Host "DASHBOARD" -ForegroundColor Yellow if (Test-Path $latestDashboard) { Write-Host " Latest: $latestDashboard" -ForegroundColor White } if ($timestampedDashboard) { Write-Host " Timestamped: $($timestampedDashboard.FullName)" -ForegroundColor Gray } if ($OpenDashboard) { $openPath = if (Test-Path $latestDashboard) { $latestDashboard } else { $timestampedDashboard.FullName } Start-Process $openPath } } } # Recent log if ($ShowLog) { $logFile = Get-ChildItem -Path $stateDir -Filter "Orchestrator_*.log" -ErrorAction SilentlyContinue | Sort-Object Name -Descending | Select-Object -First 1 if ($logFile) { Write-Host "" Write-Host "RECENT LOG" -ForegroundColor Yellow Write-Host ("-" * 40) Get-Content $logFile.FullName -Tail 20 | ForEach-Object { if ($_ -match '\[ERROR\]') { Write-Host $_ -ForegroundColor Red } elseif ($_ -match '\[WARN\]') { Write-Host $_ -ForegroundColor Yellow } elseif ($_ -match '\[OK\]') { Write-Host $_ -ForegroundColor Green } elseif ($_ -match '\[WAVE\]') { Write-Host $_ -ForegroundColor Cyan } else { Write-Host $_ -ForegroundColor Gray } } } } Write-Host "" Write-Host ("-" * 80) -ForegroundColor DarkGray if (-not $ShowLog -or -not $ShowWaves -or -not $ShowBlocked) { Write-Host "Options: -ShowLog | -ShowWaves | -ShowBlocked | -OpenDashboard | -Watch 30" -ForegroundColor DarkGray } } # ============================================================================ # MAIN # ============================================================================ if (-not (Test-Path $ReportBasePath)) { Write-Host "Report path not found: $ReportBasePath" -ForegroundColor Red exit 1 } if ($Watch -gt 0) { Write-Host "Watching status every $Watch seconds. Press Ctrl+C to stop." -ForegroundColor Cyan while ($true) { Show-Status Start-Sleep -Seconds $Watch } } else { Show-Status } # SIG # Begin signature block # MIIp0QYJKoZIhvcNAQcCoIIpwjCCKb4CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDbsPrPR3i7syzC # oFo3mYB0caMelipWAp1XVHjLH1ZDraCCDdYwgga9MIIEpaADAgECAhMzAAAAHEif # gd+hsLd3AAAAAAAcMA0GCSqGSIb3DQEBDAUAMIGIMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0 # aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yNDA4MDgyMTM2MjNaFw0zNTA2MjMy # MjA0MDFaMF8xCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xMDAuBgNVBAMTJ01pY3Jvc29mdCBXaW5kb3dzIENvZGUgU2lnbmluZyBQ # Q0EgMjAyNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJp9a30nwXYq # Lq7j1TT/zCtt7vxU+CCj+7BkifS/B2gXKGU7OV9SXRJGP1yFs5p6jpsYi4cYzF56 # AV0AEmmEjV8wT2lvPU5BhN3wV30HqYPIYEj5P3WXf0kXD9fvjUf1GAtXEriJ8w7A # LNaVEm9Rs4ePA0ZsYHaCbU5kBUJQDXv76hafOcQgdFCA3I3zYtfzX2vOwx87uDOa # CuyKORZih9c3zTf+TLC5QYLyhVMBnDXEHDOrvaw92DSyIqpdgRWpufzqDFy1egVj # koXZhb+9pZ9heUzNXTXhOoXzexh6YzAL4flBWm+Bc1hQyESenEvBJznV+25u3h77 # jjgMUY44+WXQ4u9qddDe/U5SeAaKRvvibmi4z7QRpLvZsla0CPiOUGz00Do5sfkC # 0EwlsSzfM3+8A9rsyFVOgWDVPzt98OJP2EoaEOq8GE9GCoN2i7/4C2FCwff1BSCT # JWZO1Wcr2MteJE6UxGV+ihA8nN51YPKD2dYGoewrXvRzC/1HoUeSvlZf0mf9GHEt # vvkbJVRRo6PBf0md5t87Vb1mM/fIp1eypyaxmXkgpcBwuylsOq2kSVOJ5wBPoaEs # sJkeMcKnEuuu++UKdDHlS0DtsYjN0QnOucvTdSsdvhzKOSjJF3XVqr9f2C945LXT # 5rxKIHUIEDBcNYU6BKDDH6rfpKOOCSilAgMBAAGjggFGMIIBQjAOBgNVHQ8BAf8E # BAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFB6C3w7XjLPXAjSDDtqr # rWW5r7jsMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMB # Af8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBL # oEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMv # TWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggr # BgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNS # b29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQEMBQADggIBAENf+N8/ # u+mUjDtc9btoA52RBc0XVDSBMQBMqxu56hXHBwuctUWs1XBqDDMIFCHu9c6Y/UF+ # TN8EIgjnujApKYmHP4f4EM3ARSmlzrpF5ozOJx0BA5FUv1jmpdf/2ZbqpvCxlxv/ # G1R4KjrSmmqPHzs6igw3b7RTbj7BxIS8fOIkwYWQhB2fLjlg+3HSrDGPFIhpIJWV # amMIR7a72OGonjdf45rspwqIHuynZU4avy9ruB/Rhhbwm+fMb8BMecIaTmkohx/E # ZZ5GNWcN6oTYW3G2BM3B3YznWkl9t4shP60fMue+2ksdHGWSE8EVTdSmGUdj0jrU # c46lGVFJISF3/MxcxnlNeP1Khyr+ZzT4Ets/I7mufpaLnLalzMR2zIuhGOAWWswe # sbjtFzkVUFgDR2SW903I0XKlbPEA6q8epHGJ9roxh85nsEKcBNUw4Scp68KCqSpF # BaKiyV1skd+l8U50WNePMb9Bzz0OfASal8v5sQG+DW01kN+I+RKUIbM5I50wJjiH # ymQFNDsbobFx9I95mCEEPU7fUZ3VT/HOUVbkmX7ltIC/eQAu5GO8fu+ceETMybvb # oxUM4dYNC+PzooUxfmC0DuKRwB21bX9+acuIBkxIm4Ed3O19w1VLoA7UNOUuJ7z6 # NQ2W/+q7cnfOPl2QVL4qlgCblUT2vmQpllV3MIIHETCCBPmgAwIBAgITMwAAASPV # jwJDBgPuLgAAAAABIzANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQGEwJVUzEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTAwLgYDVQQDEydNaWNyb3NvZnQg # V2luZG93cyBDb2RlIFNpZ25pbmcgUENBIDIwMjQwHhcNMjYwMzA1MTk1ODI2WhcN # MjcwMzAzMTk1ODI2WjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMR4wHAYDVQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24wggIiMA0GCSqGSIb3 # DQEBAQUAA4ICDwAwggIKAoICAQDRofDhyqNp9ilU2DM6Ctcq1F931sSAyfMEmR3c # E/fpq4C15SQYoNRfyQ1YXmcjtfWjaAB4Dsqr+po0Q6IXSERF31/leCtiRtPrS8/1 # T9FA9AeOUTaFYyqHRz1M4MVeTwu89ZHo9xR26SVQmOHbFWLinZzlBV9WUJxfz0TN # MdWwAXzxnY9nln8Fn3Y0BnCXU8V3wjeCCAxoqM0v2gPG25eNn665gv7Zt3zh3vQY # hDkb48hXJPi4DvCrpBVwCd0Iv2Sgt4qftn5STyqhdu5WWqva+pk+Sa71Db9OAy6b # L640bGmzlUek1LAP97Ey8exl0c9azmLEQB97q4JRvhCSeejBM96a8Y6ccrrfhg/h # ZJEOka1eIDJxCuKdZaWCec0v+V7oI3RStJu1BEcF9d4FQaDSaWDAbDxqXUm1fHUJ # 9Xqky1yftpTfKFw3/gqsyXV44PE7EVHwwTCAGE5Z+skXRt4HEHuIhcOGxIFbH3nA # l5KvFxopRs2zExvh2WheW8Pu79sr3baamlQA2v4k9FqJl4k1RfwO5e0/9CKyDZ6c # ck/lV8zHM7PJtNtQUHc1FoyZ78GSlX6UFiJxDWzUzPbIHMcV4PSBV8/O7bs5h/bx # r3B4PxjIpWUztZhzXBhU9vhUjQgOX5ZLV7bmSJ+IrxtaN+5w2Nsewt9N+mfUUFyK # Av38uQIDAQABo4IBrzCCAaswDgYDVR0PAQH/BAQDAgeAMB8GA1UdJQQYMBYGCisG # AQQBgjc9BgEGCCsGAQUFBwMDMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFNlj7H2k # ZtpiMmz55wigojWkWZZSMEUGA1UdEQQ+MDykOjA4MR4wHAYDVQQLExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xFjAUBgNVBAUTDTIzMDg2NSs1MDY5NTYwHwYDVR0jBBgw # FoAUHoLfDteMs9cCNIMO2qutZbmvuOwwagYDVR0fBGMwYTBfoF2gW4ZZaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwV2luZG93 # cyUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAyNC5jcmwwdwYIKwYBBQUHAQEE # azBpMGcGCCsGAQUFBzAChltodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz # L2NlcnRzL01pY3Jvc29mdCUyMFdpbmRvd3MlMjBDb2RlJTIwU2lnbmluZyUyMFBD # QSUyMDIwMjQuY3J0MA0GCSqGSIb3DQEBDAUAA4ICAQAu6aVarz1Rb5/9eAD9oHOw # QS4jDknbBYnDwLcgMy/h995knuPL6/5K0XSUICUrjU3/bL56UD1tVwXsRehrHMkR # kgOMQk+7eH+Xvp6cyyTxwgIM7xy5YSf3VmJD3GI87lkGUqPFFOqGWjzZc3e/UQU7 # VbN4Elh4zJeKOdokXNuE3a5U1lAr1hnD6WpfIHO2nzGUHVSXDLMktWKMO89pMgLh # 6BXHdx1cAth+ugl86sdXC+VxCQJ28a2JvNq5RQcEBEuqSISe3/YRWYRTSLqhn8ea # v4lK4n+3fnAy2bmz76Z7UJ92X5KgTaHD+r8cvXmssFH3UbOj6EtE+c4SPNaFdIUW # GJyZBhLbThhlh1QlbTg0X47GhI89qZ/lxuYeEDYbPGaDry/KpMoUQxU+l49iQ6zd # kWSPGczB4ZDVRSrkDqz2K70tIvFaz8YfMhzTy5hhMNGvonCcguaFTgUsxr+OrvGC # WadOV/pZ3BcRafKvBDX+ney3HFcUByI3VPzIU7saoUbcujqTVA6GeNSybo8AI+71 # 9omBObyf2lriZb9a2/oVe5SiKhH/BDQVn+14Q26UxrUA/8zVOlzJS5eJQYhkHM9h # /Y2Nnmr2xLtFN0vW/aad7i104dVRaTLMBzbKIlCBOruBjM87frQc2Ncfb5Kme4u9 # o6GQVZf3kVy+p8uv8YgnQTGCG1EwghtNAgEBMHYwXzELMAkGA1UEBhMCVVMxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEwMC4GA1UEAxMnTWljcm9zb2Z0 # IFdpbmRvd3MgQ29kZSBTaWduaW5nIFBDQSAyMDI0AhMzAAABI9WPAkMGA+4uAAAA # AAEjMA0GCWCGSAFlAwQCAQUAoIH6MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEE # MC8GCSqGSIb3DQEJBDEiBCAQh5xeZe4ZmThy/cbKD9h/yYraaYMAkwk+etSXkOjB # 8zBQBgorBgEEAYI3CgMcMUIMQDc2MzcyNkQyRDNCMjY2QUU0NjNEMEY5MDczRURF # RTczNTQxNzUxMTVGNkNCNkIwOTJEQTU3MzRBRTNBOTk2QzIwWgYKKwYBBAGCNwIB # DDFMMEqgJIAiAE0AaQBjAHIAbwBzAG8AZgB0ACAAVwBpAG4AZABvAHcAc6EigCBo # dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vd2luZG93czANBgkqhkiG9w0BAQEFAASC # AgB8Ojwc8eQSUaMyO4EuMndGYQGoiy5p1oPnXM5ExOyxvmUcMyrMh7IPC/pFO9NF # c0iI+YDoYdyWGamjYdyjBBi6Mz9q+9wyO/3LODEtY/UFU5E4nQcARoxMr4E8qyHf # 67ZTprNA/FOC8JEJJ0rOWWCwPxBHdEzZk/ZBRFjjeSlYQIe0URg+uTb5gIjIELwI # lU/590uoF6Kz6tlE9bQ5yrLJpZGzz+Cx1iASe2VQKZWjLv08pxHoDtYh+xQkFMyz # JY8MJ9eOzIrTQXVfXUQNte+n/KF8rnfH1CzZdKuYNiYAeqdesh14s6YNWbYdh473 # AUcV5pSJmLTJGriMHVHJyZuGyrFb8KhAVBZf0iGl+wlEHua7VrDRPWXprvXJVz4Y # cO324ZVA3aHMnduKkqA568D4Cx0oGyaeWY6+D6Fh8csM544wp0O3KgNwn71SYRbs # dcM9UOPmD+tRM5OgsLHcUj94CzLqwwl9bvSLf2QcgB6urtBvJ8C1FGv54Atd+jyw # UrrN2jjRb+Y/ugOhLjsCKUdXMFDkzNFqpO8TTROQB5A4g4WApa9Hi53bft0kZzNS # fxAJf5MLVhxWTld9yz+A5tr3JDMWSiGw4r64XIvaGN/l6D3F2bE0xxpbToxTosP8 # rBh9qsy+SrEzk/AlR0mgJKNYOAbUxP9N5LFiRlvxjP5H+KGCF68wgherBgorBgEE # AYI3AwMBMYIXmzCCF5cGCSqGSIb3DQEHAqCCF4gwgheEAgEDMQ8wDQYJYIZIAWUD # BAIBBQAwggFaBgsqhkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYBBAGEWQoD # ATAxMA0GCWCGSAFlAwQCAQUABCB7nL0i8C05wfr61INw4Ec84GYwOPOGwNd4cs0I # AhLAywIGaev4vE8XGBMyMDI2MDUwNjE1NDA0OS41NDlaMASAAgH0oIHZpIHWMIHT # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRN # aWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5T # aGllbGQgVFNTIEVTTjo0MzFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0 # IFRpbWUtU3RhbXAgU2VydmljZaCCEf0wggcoMIIFEKADAgECAhMzAAACHUvAkoc4 # hX45AAEAAAIdMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQI # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD # QSAyMDEwMB4XDTI1MDgxNDE4NDgzM1oXDTI2MTExMzE4NDgzM1owgdMxCzAJBgNV # BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w # HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29m # dCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVsZCBU # U1MgRVNOOjQzMUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1T # dGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAorSg # aAA8oOl4ph574zw29egUN8DDepRHLX8FM1zHNJmXG6KrSqUKwzcKafopuYdPTETT # Cvb9aJfESuAU0iGNUFI/D6R0kvdfpe2oPX+E3sbTQvGi4JPH5qdIYUaJ45V/4bqe # 8eNvbWzpC+ZKjH193DeiI1XAI918JoQmBhlEXo/Ton1721luZJgincsf5LjMY3jX # 84WyXUSX3dsS7h/7xVI+w1yjg7pa+0y3o/me2Tsv6UJUdSTQap5ORGSfCnclnP1z # 3IiiWIWr3Vo7aIPWsgJzq3m5GxpxUHCQk8qzUhk50y/uB+LGE3WIK2C77iy9iFsS # fSLUnyMEzGRDW9mXHT4PH7Ozz6CHqQEiNvwcHqlvlCh1pHQh1NXQSAqOoVBs5mi6 # easf6yxWTfe5DrR79503r8pU6VqC2Y9XMRU4wH9QbYXYsIUZ33Jmndy22W1LBDAb # xBPQHCBlncGDU3BgdhVUVLe80mggFO98FdkWho67w4kPdCTRkvdvkY8PrQYE/nQj # HXCa0g7LcMttZb6ejMHfQ+tUWXv6+nZ4Ynkr2OkaxclFCw4RIYNMWD26AWbQj/WE # dzga18fKtw66L5gzXPza6jFBfPJeKE3H8QAuwpirmH4ms+5nUjNNQOmNgqJn0U1+ # 3Yn7ClswD79YN0r3fdbYBMDApBZJpNlK7q7HXRsCAwEAAaOCAUkwggFFMB0GA1Ud # DgQWBBSEWfBxNEamZtXm8gl92Yq80jfxXTAfBgNVHSMEGDAWgBSfpxVdAF5iXYP0 # 5dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIw # MjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUt # U3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB # /wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOC # AgEAkdweB4yxvLspLKq0D+miyD4Q0EcxVFpNZuJxiR54gWRkeTDDuymNeB03Jhls # BpbwSYJ5uZSgDBCvwHED2VL8lJpFlOprJzxsXWC2NTfA+O+PO5Fk5jw6LHh6jeBA # DDEdQAx3Hqi7Zm0JwvQ93z5f6dtxkm29WqOcHYXRXfAQwy1hSrLXyfeblqR66jpP # /9n0fCkWU4ggsUjQpQ2Ngj1DV09J4Y3y7p9Nd81+Xs6qYo++7RKm8qiB/5NDeigO # LjlAeFgiEXIRUJW+mJyqpQw+OORlaqcFjR8Hu0G+/7bMdek68YX+kPpDBk7Ue+I/ # xgiYJ1xcDRBn/vczLtN72+RIlD4UgXYLuBSCk//pDEPX5z39Cr+rkc6E4Y28FPk4 # BhloAyvp628P4xfElQY8TcxraUbZShypocE6ny95D1K1BkltZmrHVKCxmglnuOlM # 15NKIrXFlXCzdqpCtIwQ417wNAVF/QDPvzzbumPdTi6fb0tLbScYobV6zvbBsMsK # EME4Tj1b9oIXC8dybJq4nbboEXYpRwi1QAbpSNrn+PxGW9uf1q63FnMJu4gm3Oh6 # 3njW/iVf723quzyHrSijWMgY0HiRiHQi0Jyu0h8MdhRUp7mxbmLQckPiOFwAlIaU # N/k725y/aLWpkRU6fqmLlEOyH5WpyLd23AYy9r8v+Qoba6swggdxMIIFWaADAgEC # AhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQg # Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIyMjVa # Fw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIIC # IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7V # gtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeF # RiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhuje3X # D9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl3GoP # z130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPgyY9+ # tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I5Jas # AUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2ci/b # fV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/TNuv # XsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy16cg # 8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y1BzF # a/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6HXtqP # nhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEw # IwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSf # pxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30BATBB # MD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0Rv # Y3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGC # NxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w # HwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmg # R4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWlj # Um9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEF # BQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29D # ZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1VffwqreEs # H2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27DzHk # wo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pvvinL # btg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9AkvUCg # vxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWKNsId # w2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2 # zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+c23K # jgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep8beu # yOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+DvktxW/ # tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjm # jJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/2XBj # U02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDWDCCAkACAQEwggEBoYHZpIHWMIHT # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRN # aWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5T # aGllbGQgVFNTIEVTTjo0MzFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0 # IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUAuoO+BKbfXzqyfi9G # LEdWHkCLeT+ggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu # Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv # cmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAN # BgkqhkiG9w0BAQsFAAIFAO2ln7EwIhgPMjAyNjA1MDYxMTA4MzNaGA8yMDI2MDUw # NzExMDgzM1owdjA8BgorBgEEAYRZCgQBMS4wLDAKAgUA7aWfsQIBADAJAgEAAgEB # AgH/MAcCAQACAhI4MAoCBQDtpvExAgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisG # AQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcNAQELBQAD # ggEBAIH9TylIpha5EOpEjBNPIs5EN9BkQRUYcbkyNmZKqT3FbxoJLXMt9Uh2eujK # fCYQqcdTCjLTUUJdq2uJIMONkA60wztROowrsAKCQ4NeuzY2f22zTDa3qhaszZSl # pjIAmF9XEXWONnSPRi1ff5eGu5PPHsaDdunNyJd5JForOs+uWrRxAMqu3fWuzil3 # Njb8/Xw3PiyG/HQ8n11rxstfP/ve+FC8M2dvbXjEvu5PB7qmOn/dn5aTAsFcRx2u # 8JUZ82yr+lB/g39V/N6FJiSPooYbE2kN3OBoYNJrgnPMwYhb6iqUhWyjD87z8T2A # zcgkMcyYavoE+j8ra8fRyfYswzYxggQNMIIECQIBATCBkzB8MQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGlt # ZS1TdGFtcCBQQ0EgMjAxMAITMwAAAh1LwJKHOIV+OQABAAACHTANBglghkgBZQME # AgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJ # BDEiBCDUk8oXQFqv6OjxDEePelnpT6hh5J6a3jqiMEvG9S7I0TCB+gYLKoZIhvcN # AQkQAi8xgeowgecwgeQwgb0EILG2lcxcSIsnOuozvt6nitM3Csw6PqClY32Fm+mP # lAVRMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAId # S8CShziFfjkAAQAAAh0wIgQgzIqEHlySxoKXPERmgt8YZbxsarzR2jsnt37ksRav # fLYwDQYJKoZIhvcNAQELBQAEggIAjhBX4XOvPrPlpMbDJN9xX9l6H9xXY6A472sz # UigpxWHXcR3q5qmyFlBq7uG2aViHZOoA5pyOws6rwbe6r3YGhqoknRq7sdC1HAU0 # gNKTXNnVR3fwojvD7nbdulU+GRNwPfvtHnTj8iyLiP2TzrWoWwXzRj2+lLqZ5RMJ # spMWT+8yWOIh7Kxkog0VuypbRiJR4AIAIGnv7g+o0MmQosJ7niV/1sbqOIu9ZDp6 # 7Jg9ZNuoiV/oIKRdW6yejKEJuQjzLsWgMtjS5V0AdI3z3q8G7M+jfLf5SBEu4lm2 # XYbOqousWU4Nr+T7vtrllKqoj0hy9dkL4k+Ji7gvsA4u8Plh31psy4Rb5LzwWxmB # pbb0s7kwNP0ihEvp0Fl3rNF/MJGmY2U1BHispxbCFnftv5g5pSM/7y190Py86inm # 5IG0qNA+fjb7cNH1F/lsorNZOQ9E7K73+IUKsYatu3HlZ2n5D167RhoQUw3aHal/ # hIhwB7H38dlQjl5hxmO8MC8VwjA88f7y2Cp+sQ4HP2YOt43/H4q+EPsJFsVpU5gU # unKK9BU53NVoRXojcU0mtKOa2kXefNdd1MxNgWRZV2Zcs34XeoZ6E3hYTDrI8bjs # uTbF/VUtNYzLZ+gwzpRedN8iz4tB84E+BZzdtxVFIEoyP0eQEdlom3uyfoYiJAGt # O01Yufw= # SIG # End signature block x

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