Public/Get-MsrcVulnerabilityReportHtml.ps1
Function Get-MsrcVulnerabilityReportHtml { <# .SYNOPSIS Use a CVRF document to create a Vulnerability summary .DESCRIPTION Use a CVRF document to create a Vulnerability summary .PARAMETER Vulnerability The Vulnerability node of a CVRF document .PARAMETER ProductTree The ProductTree node of a CVRF document .EXAMPLE Get-MsrcCvrfDocument -ID 2016-Aug -ApiKey 'YOUR API KEY' | Get-MsrcVulnerabilityReportHtml | Out-File -FilePath Cvrf-CVE-Summary.html It creates a report with all the Vulnerabilities in a CVRF document .EXAMPLE $cvrfDoc = Get-MsrcCvrfDocument -ID 2016-Nov $cvrfDoc.Vulnerability | Foreach-Object { Write-Verbose "Dealing with CVE: $($_.CVE)" -Verbose Get-MsrcVulnerabilityReportHtml -Vulnerability $_ -ProductTree $cvrfDoc.ProductTree | Out-File -FilePath "Cvrf-$($vulnerability.CVE)-Summary.html" } It creates a report for each of the Vulnerabilities in a CVRF document .EXAMPLE $cvrfDoc = Get-MsrcCvrfDocument -ID 2016-Nov $HT = @{ Vulnerability = ($cvrfDoc.Vulnerability | Where-Object {$_.CVE -In @('CVE-2016-0026','CVE-2016-7202','CVE-2016-3343')}) ProductTree = $cvrfDoc.ProductTree } Get-MsrcVulnerabilityReportHtml @HT | Out-File -FilePath Cvrf-CVE-Summary.html It creates a report for specific Vulnerabilities in a CVRF document #> [CmdletBinding()] [OutputType([string])] Param( [Parameter(Mandatory,ValueFromPipelineByPropertyName)] $Vulnerability, [Parameter(Mandatory,ValueFromPipelineByPropertyName)] $ProductTree, [Switch]$ShowNoProgress ) Begin{ $HT = @{ ErrorAction = 'Stop'} try { $JsonMetrics = Get-Content -Path (Join-Path -Path $PSScriptRoot -ChildPath 'CVSS-Metrics.json' @HT) @HT | Out-String @HT| ConvertFrom-Json @HT $JsonDescriptions = Get-Content -Path (Join-Path -Path $PSScriptRoot -ChildPath 'CVSS-Descriptions.json'@HT) @HT | Out-String @HT| ConvertFrom-Json @HT } catch { Throw "Failed to get required json files content because $($_.Exception.Message)" } $css = @' body { background-color: white; font-family: sans-serif; } h1 { color: black; } table { font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; width: 100%; } table td, th { border: 1px solid #ddd; padding: 8px; } table tr:nth-child(even){ background-color: #ddd; } table tr:hover {background-color: #FAF0E6;} table th { padding-top: 12px; padding-bottom: 12px; text-align: left; background-color: #C0C0C0; } '@ } Process { $htmlDocumentTemplate = @' <html> <head> <!-- Created by module version {2} --> <!-- this is the css from the old bulletin site. Change this to better style your report to your liking --> <!-- <link rel="stylesheet" href="https://i-technet.sec.s-msft.com/Combined.css?resources=0:ImageSprite,0:TopicResponsive,0:TopicResponsive.MediaQueries,1:CodeSnippet,1:ProgrammingSelector,1:ExpandableCollapsibleArea,0:CommunityContent,1:TopicNotInScope,1:FeedViewerBasic,1:ImageSprite,2:Header.2,2:HeaderFooterSprite,2:Header.MediaQueries,2:Banner.MediaQueries,3:megabladeMenu.1,3:MegabladeMenu.MediaQueries,3:MegabladeMenuSpriteCluster,0:Breadcrumbs,0:Breadcrumbs.MediaQueries,0:ResponsiveToc,0:ResponsiveToc.MediaQueries,1:NavSidebar,0:LibraryMemberFilter,4:StandardRating,2:Footer.2,5:LinkList,2:Footer.MediaQueries,0:BaseResponsive,6:MsdnResponsive,0:Tables.MediaQueries,7:SkinnyRatingResponsive,7:SkinnyRatingV2;/Areas/Library/Content:0,/Areas/Epx/Content/Css:1,/Areas/Epx/Themes/TechNet/Content:2,/Areas/Epx/Themes/Shared/Content:3,/Areas/Global/Content:4,/Areas/Epx/Themes/Base/Content:5,/Areas/Library/Themes/Msdn/Content:6,/Areas/Library/Themes/TechNet/Content:7&v=9192817066EC5D087D15C766A0430C95"> --> <!-- this style section changes cell widths in the exec header table so that the affected products at the end are wide enough to read --> <style> {3} #execHeader td:first-child {{ width: 10% ;}} #execHeader td:nth-child(5) {{ width: 37% ;}} </style> <!-- this section defines explicit width for all cells in the affected software tables. This is so the column width is the same across each product --> <style> .affected_software td:first-child {{ width: 34% ; }} .affected_software td:nth-child(2) {{ width: 14% ; }} .affected_software td:nth-child(3) {{ width: 6% ; }} .affected_software td:nth-child(4) {{ width: 6% ; }} .affected_software td:nth-child(5) {{ width: 7.5% ; }} .affected_software td:nth-child(6) {{ width: 28.5% ; }} .affected_software td:nth-child(7) {{ width: 4% ; }} </style> <!-- remove spacing between table of contents cells --> <style> #tableOfContents tr td {{ padding: 2px; }} </style> <style> .cvss_table tr:nth-child(odd) {{background: #ededed}} </style> </head> <body lang=EN-US link=blue> <div id="documentWrapper" style="width: 90%; margin-left: auto; margin-right: auto;"> <h1 id="top">Microsoft CVE Summary</h1> <p style="margin:0; padding:0">This report contains detail for the following vulnerabilities:</p> <table id="tableOfContents" style="width:78%; margin-top:5"> <tr> <th>CVE Issued by</th> <th>Tag</th> <th>CVE ID</th> <th>CVE Title</th> </tr> {0} </table> {1} </div> <br> </body> </html> '@ $cveListHtmlObjects = @() $cveSectionHtml = '' $TotalCVE = $Vulnerability.Count $count = 0 $Vulnerability | ForEach-Object -Process { $count++ $v = $_ $Progress = @{ Activity = 'Getting Msrc Vulnerability Html Report' Status = "$($count)/$($TotalCVE) => $($v.CVE) " PercentComplete = ($count/$TotalCVE*100) ErrorAction = 'SilentlyContinue' } if (-not($ShowNoProgress)) { Write-Progress @Progress } Write-Verbose -Message "Dealing with $($_.CVE)" #region CVE Summary Table $cveSummaryTableHtml = @' <table id="execHeader" border=1 cellpadding=0 width="99%"> <thead style="background-color: #ededed"> <tr> <td><b>CVE ID</b></td> <td><b>Vulnerability Description</b></td> <td><b>Maximum Severity Rating</b></td> <td><b>Vulnerability Impact</b></td> </tr> </thead> <tr> <td>{0}</td> <td>{1}</td> <td>{2}</td> <td>{3}</td> </tr> </table> '@ $MaximumSeverity = Switch ( ($_.Threats | Where-Object {$_.Type -eq 3 }).Description.Value | Select-Object -Unique ) { 'Critical' { 'Critical' ; break } 'Important' { 'Important' ; break } 'Moderate' { 'Moderate' ; break } 'Low' { 'Low' ; break } 'None' { 'None' ; break } default { Write-Warning -Message "Could not determine the Maximum Severity from the Threats for $($v.CVE)" 'Unkwown' } } if (-not($MaximumSeverity)) { $MaximumSeverity = 'Unknown' } if ($ImpactValues = ($v.Threats | Where-Object { $_.Type -eq 0 }).Description.Value | Select-Object -Unique) { $impactColumn = $ImpactValues -join ',<br>' } else { Write-Warning -Message "Could not determine the Impact from the Threats for $($v.CVE)" $impactColumn = 'Unknown' } $vulnDescriptionColumnTemplate = @' <b>CVE Title:</b> {0} <br> <b>CVSS:</b> <br>{1} <br> <b>Executive Summary:</b> <br>{6} <br> <b>FAQ:</b><br>{2} <br> <b>Mitigations:</b><br>{3} <br> <b>Workarounds:</b><br>{4} <br> <b>Revision:</b><br>{5} <br> '@ $vulnDescriptionColumn = $vulnDescriptionColumnTemplate -f @( # $cveTitle $( if ($cveTitle = $v.Title.Value) { $cveTitle } else { Write-Warning -Message "Missing Title for $($v.CVE)" ($cveTitle = 'Unknown') } ), # $cvssScoreSet $( #Scores among the affected products can be different. So, just find the most severe. $highestBase = 0.0 $highestCvssScore = $null ForEach($score in $v.CvssScoreSets) { if ($score.BaseScore -gt $highestBase) { $highestBase = $score.BaseScore $highestCvssScore = $score } } if (($null -ne $highestCvssScore) -and ($null -ne $highestCvssScore.Vector) -and ($highestCvssScore.Vector.Split('/').Length -gt 1)) { $cvssArray = $highestCvssScore.Vector.Split('/') $cvssScoreTemplate = @' <br> <b>{0}</b> <table class="cvss_table" border=1 cellpadding=0 width="99%"> <thead> <tr> <td colspan="7"><b>Base score metrics</b></td> </tr> </thead> {1} </table> <table class="cvss_table" border=1 cellpadding=0 width="99%"> <thead> <tr> <td colspan="7"><b>Temporal score metrics</b></td> </tr> </thead> {2} </table> '@ $cvssScoreSet = $cvssScoreTemplate -f @( $rowTemplate = '<tr><td title="{0}"><b>{1}</b></td><td title="{2}"><b>{3}</b></td></tr>' $baseTags = 'AC', 'AV', 'A', 'C', 'I', 'PR', 'S', 'UI' $temporalTags = 'E', 'RC', 'RL' $baseRows = '' $temporalRows = '' for($i = 1; $i -lt $cvssArray.Length; $i++) { $element = $cvssArray[$i] $split0 = $element.Split(':')[0] $metric = $JsonMetrics.$split0 $value = $JsonMetrics.$element $metricDescription = $JsonDescriptions.$split0 $valueDescription = $JsonDescriptions.$element $row = '<tr><td><b>' + $metric + '</b></td>' $row += '<td><b>' + $value + '</b></td></tr>' if (($null -ne $metricDescription) -and ($null -ne $valueDescription)) { if ($baseTags.Contains($split0)) { $baseRows += $rowTemplate -f $metricDescription, $metric, $valueDescription, $value } else { if ($temporalTags.Contains($split0)) { $temporalRows += $rowTemplate -f $metricDescription, $metric, $valueDescription, $value } } } } $formattedScore = '{0} Highest BaseScore:{1}/TemporalScore:{2}' -f $cvssArray[0], $highestCvssScore.BaseScore, $highestCvssScore.TemporalScore $formattedScore, $baseRows, $temporalRows ) $cvssScoreSet } else { 'None' -join '<br>' } ), # $cveFaq $( if ($cveFaq = ($v.Notes | Where-Object {$_.Title -eq 'FAQ'}).Value) { $cveFaq -join '<br>' } else { 'None' -join '<br>' } ), # $cveMitigation $( if ($cveMitigation = $v.Remediations | Where-Object { $_.Type -eq 1 }) { $cveMitigation.Description.Value -join '<br>' } else { 'None' -join '<br>' } ), # $cveWorkaround $( if ( $cveWorkaround = ($v.Remediations | Where-Object {$_.Type -EQ 0}).Description.Value) { $cveWorkaround -join '<br>' } else { 'None' -join '<br>' } ), # $Revision $( $RevisionStrings = @() $v.RevisionHistory | ForEach-Object { $_ | Add-Member -MemberType NoteProperty -Name RevisionDate -Value ([datetime]$_.Date) -Force -PassThru } | Sort-Object RevisionDate | ForEach-Object { if ( $revision = $($_.Number, $_.RevisionDate.ToString('d'), $_.Description.Value) ) { $RevisionStrings += $($revision -join '    ') } } if ( $RevisionStrings ) { $RevisionStrings -join '<br>' } else { 'Unknown' -join '<br>' } ), # Executive Summary $( if ($cveExecSummary = ($v.Notes | Where-Object {$_.Title -eq 'Description'}).Value) { $cveExecSummary -join '<br>' } else { 'None' -join '<br>' } ) ) $cveSectionHtml += '<h1 id="{0}">{0} - {1}</h1> (<a href="#top">top</a>)' -f $v.CVE, $cveTitle #region CVE Summary List $cveListHtmlObjects += [PSCustomObject]@{ Tag = $($v.Notes | Where-Object type -eq 7).Value CNA = $($v.Notes | Where-Object type -eq 8).Value CVEID = $v.CVE CVETitle = $cveTitle } #endregion $cveSectionHtml += $cveSummaryTableHtml -f @( @" <a href=`"https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/$($_.CVE)`">$($_.CVE)</a> <br> <a href=`"http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=$($_.CVE)`">MITRE</a> <br> <a href=`"https://web.nvd.nist.gov/view/vuln/detail?vulnId=$($_.CVE)`">NVD</a> <p>Issuing CNA: $($($v.Notes | Where-Object type -eq 8).Value)</p> "@, $vulnDescriptionColumn, $MaximumSeverity, $impactColumn ) #endregion #region Exploitability Index Table $exploitabilityIndexTableHtml = @' <h2>Exploitability Index</h2> <p>The following table provides an exploitability assessment of each of the vulnerabilities addressed this month. The vulnerabilities are listed in order of bulletin ID then CVE ID. Only vulnerabilities that have a severity rating of Critical or Important in the bulletins are included.</p> <table border=1 cellpadding=0 width="99%"> <thead style="background-color: #ededed"> <tr> <td><b>Exploitability Assessment</b></td> <td><b>Publicly Disclosed</b></td> <td><b>Exploited</b></td> </tr> </thead> <tr> <td>{0}</td> <td>{1}</td> <td>{2}</td> </tr> </table> '@ if ($ExploitStatusThreat = ($v.Threats | Where-Object { $_.Type -eq 1 } | Select-Object -Last 1).Description.Value) { $ExploitStatus = Get-MsrcThreatExploitStatus -ExploitStatusString $ExploitStatusThreat } else { Write-Warning -Message "Missing ExploitStatus for $($v.CVE)" } $cveSectionHtml += $exploitabilityIndexTableHtml -f @( # $LatestSoftwareRelease $( if ($ExploitStatus.LatestSoftwareRelease) { $ExploitStatus.LatestSoftwareRelease } else { 'Not Found' } ), # $publicly disclosed $( if ($ExploitStatus.PubliclyDisclosed) { $ExploitStatus.PubliclyDisclosed } else { 'Not Found' } ), # $Exploited $( if ($ExploitStatus.Exploited) { $ExploitStatus.Exploited } else { 'Not Found' } ) ) #endregion #region Affected Software Table $affectedSoftwareTableTemplate = @' <table class="affected_software" border=1 cellpadding=0 width="99%"> <thead style="background-color: #ededed"> <tr> <td colspan="9"><b>{0}</b></td> </tr> </thead> <tr> <td><b>Product</b></td> <td><b>KB Article</b></td> <td><b>Severity</b></td> <td><b>Impact</b></td> <td><b>Supercedence</b></td> <td><b>CVSS Score Set</b></td> <td><b>Fixed Build</b></td> <td><b>Restart Required</b></td> <td><b>Known Issue</b></td> </tr> {1} </table> <br> '@ $affectedSoftwareRowTemplate = @' <tr> <td>{0}</td> <td>{1}</td> <td>{2}</td> <td>{3}</td> <td>{4}</td> <td>{5}</td> <td>{6}</td> <td>{7}</td> <td>{8}</td> </tr> '@ $cveSectionHtml += @' <h2>Affected Software</h2> <p>The following tables list the affected software details for the vulnerability.</p> '@ $affectedSoftware = Get-MsrcCvrfAffectedSoftware -Vulnerability $v -ProductTree $ProductTree $affectedSoftwareTableHtml = '' $affectedSoftware.FullProductName | Sort-Object -Unique | ForEach-Object { $PN = $_ $affectedSoftware | Where-Object {$_.FullProductName -eq $PN} | ForEach-Object { $affectedSoftwareTableHtml += $affectedSoftwareRowTemplate -f @( $PN, $( $_.KBArticle | Get-KBDownloadUrl ), $( if (-not($_.Severity)) { 'Unknown' } else { $($_.Severity | Select-Object -Unique) -join '<br />' } ), $( if (-not($_.Impact)) { 'Unknown' } else { $($_.Impact | Select-Object -Unique) -join '<br />' } ), $( if (-not($_.Supercedence)) { 'None' } else { $($_.Supercedence | Select-Object -Unique) -join '<br />' } ), $( 'Base: {0}<br />Temporal: {1}<br />Vector: {2}<br />' -f ( $( if(-not($_.CvssScoreSet.base)) { 'N/A' } else{ $_.CvssScoreSet.base } ) ), ( $( if(-not($_.CvssScoreSet.temporal)) { 'N/A' } else { $_.CvssScoreSet.temporal } ) ), ( $( if(-not($_.CvssScoreSet.vector)) { 'N/A' } else { $_.CvssScoreSet.vector } ) ) ), $( if (-not($_.FixedBuild)) { 'Unknown' } else { $($_.FixedBuild | Select-Object -Unique) -join '<br />' } ), $( if (-not($_.RestartRequired)) { 'Unknown' } else { $($_.RestartRequired | Select-Object -Unique) -join '<br />' } ), $( if (-not($_.'Known Issue')) { 'None' } else { $_.'Known Issue' | Get-KBDownloadUrl } ) ) } } $cveSectionHtml += $affectedSoftwareTableTemplate -f @( $v.CVE, $affectedSoftwareTableHtml ) #endregion #region Acknowledgments Table $acknowledgmentsTableTemplate = @' <h2>Acknowledgements</h2> <table border=1 cellpadding=0 width="99%"> <thead style="background-color: #ededed"> <tr> <td><b>CVE ID</b></td> <td><b>Acknowledgements</b></td> </tr> </thead> <tr> <td>{0}</td> <td>{1}</td> </tr> </table> '@ if ($v.Acknowledgments) { $ackVal = '' $v.Acknowledgments | ForEach-Object { if ($_.Name.Value) { $ackVal += $_.Name.Value $ackVal += '<br>' } if ($_.URL) { $ackVal += $_.URL $ackVal += '<br>' } $ackVal += '<br><br>' } } else { Write-Warning -Message "No Acknowledgments for $($v.CVE)" $ackVal = 'None' } $cveSectionHtml += $acknowledgmentsTableTemplate -f @( $v.CVE, $ackVal ) } -End { Write-Progress -Activity 'Getting Msrc Vulnerability Html Report' -Completed } #endregion ( $htmlDocumentTemplate -f @( #sort the objects and put them into the table of contents format before injecting into the document template: ($( $cveListHtmlObjects | Sort-Object -Property Tag | ForEach-Object { '<tr><td>{3}</td><td>{0}</td> <td><a href="#{1}">{1}</a></td> <td>{2}</td></tr>' -f $_.Tag,$_.CVEID,$_.CVETitle,$_.CNA }) -join "`n"), $cveSectionHtml, "$($MyInvocation.MyCommand.Version.ToString())", $css ) ) } End {} } # SIG # Begin signature block # MIIjhwYJKoZIhvcNAQcCoIIjeDCCI3QCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAT63oFy/UMXdHf # V6qmbE4VbASdo7oYCu4kWM94EouAnKCCDXYwggX0MIID3KADAgECAhMzAAAB3vl+ # gOdHKPWkAAAAAAHeMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjAxMjE1MjEzMTQ0WhcNMjExMjAyMjEzMTQ0WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQC42o7GuqPBrC9Z9N+JtpXANgk2m77zmZSuuBKQmr5pZRmQCht/u/V21N5nwBWK # NGwCZNdI98dyYGYORRZgrMOh8JWxDBjLMQYtqklGLw5ZPw3OCGCIM2ZU0snDlvZ3 # nKwys5NtPlY4shJxcVM2dhMnXhRTqvtexmeWpfmvtiop7jJn2Sdq0iDybDyU2vMz # nH2ASetgjvuW2eP4d6zQXlboTBBu1ZxTv/aCRrWCWUPge8lHr3wtiPJHMyxmRHXT # ulS2VksZ6iI9RLOdlqup9UOcnKRaj1usJKjwADu75+fegAZ4HPWSEXXmpBmuhvbT # Euwa04eiL7ZKbG3mY9EqpiJ7AgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUbrkwVx/G26M/PsNzHEotPDOdBMcw # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW # MBQGA1UEBRMNMjMwMDEyKzQ2MzAwODAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAHBTJKafCqTZswwxIpvl # yU+K/+9oxjswaMqV+yGkRLa7LDqf917yb+IHjsPphMwe0ncDkpnNtKazW2doVHh3 # wMNXUYX6DzyVg1Xr/MTYaai0/GkPR/RN4MSBfoVBDzXJSisnYEWlK1TbI1J1mNTU # iyiaktveVsH3xQyOVXQEpKFW17xYoHGjYm8s5v22mRE/ShVgsEW9ckxeQbJPCkPc # PiqD4eXwPguTxv06Pwxva8lsjsPDvo2EgwozBCNGRAxsv2pEl0bh+yOtaFpfQWG7 # yMskiLQwWWoWFyuzm6yiKmZ/jdfO98xR1bFUhQMdwQoMi0lCUMx6YQJj1WpNUTDq # X0ttJGny2aPWsoOgZ5fzKHNfCowOA+7hLc6gCVRBzyMN/xvV19aKymPt8I/J5gqA # ZCQT19YgNKyhHUYS4GnFyMr/0GCezE8kexDGeQ3JX1TpHQvcz/dghK30fWM9z44l # BjNcMV/HtTuefSFsr9tCp53wVaw65LudxSjH+/a2zUa85KKCBzj/GU4OhDaa5Wd4 # 8jr0JSm/515Ynzm1Xje5Ai/qo9xaGCrjrVcJUxBXd/SZPorm3HN6U1aJnL2Kw6nY # 8Rs205CIWT28aFTecMQ6+KnMt1NZR4pogBnnpWSLc92JMbUd1Z6IbauU6U/oOjyl # WOtkYUKbyE7EvK9GwUQXMds/MIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr # /Xmfwb1tbWrJUnMTDXpQzTGCFWcwghVjAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp # Z25pbmcgUENBIDIwMTECEzMAAAHe+X6A50co9aQAAAAAAd4wDQYJYIZIAWUDBAIB # BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIE/Ox0IfIoxV08GVMp9xUPRw # 3usGCrD6EXtgU7eSWDVHMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A # cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB # BQAEggEAfPX/DkX/QYSQ/aW9WhGEeo1pUAkVHm9W1RfD9yJHOBKpeV0bon8SDufm # NOmu5tztZeTmbFIf9OTvuip3faZMEiW9TIZsXM4Merv1SQksDdv51tWetKKtDCpL # 4p82CNoFoZ9wEtmMTACs+bhF5ecGeQz02so3VmzDacs5C78T+YQkY06BEEvowHHN # M47BZwN4YQvzb2/viXD3yjq5ZM/ulhhRWAULVnpguken8nUpHqeHw8K8LrzN67me # VvRDwMgpjBPvj2P1Oip7DB/lMtAeEgKW7aGkufGGUxp8AohBMzZ/W/T0FurV0tRZ # Ieeb5ilPRKCpIIGn3uSu02thjUAlaaGCEvEwghLtBgorBgEEAYI3AwMBMYIS3TCC # EtkGCSqGSIb3DQEHAqCCEsowghLGAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFVBgsq # hkiG9w0BCRABBKCCAUQEggFAMIIBPAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl # AwQCAQUABCDHyXC0+te6DWRc3myShZyLFMFBGPlZ2tiU01qiQ779YQIGYGMtDI0f # GBMyMDIxMDQyMDIxNDg1NC4zNzhaMASAAgH0oIHUpIHRMIHOMQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3NvZnQgT3Bl # cmF0aW9ucyBQdWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046ODk3 # QS1FMzU2LTE3MDExJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZp # Y2Wggg5EMIIE9TCCA92gAwIBAgITMwAAAWAHIPCSSNq+6wAAAAABYDANBgkqhkiG # 9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYw # JAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0yMTAxMTQx # OTAyMjBaFw0yMjA0MTExOTAyMjBaMIHOMQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3NvZnQgT3BlcmF0aW9ucyBQdWVy # dG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046ODk3QS1FMzU2LTE3MDEx # JTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEiMA0GCSqG # SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0MYAc0PLGzPFSMz4JjfU1pFrNpPEtQmVM # jefEi8y1t9efK2WfzuJevBm+EpBP4gVEpOMlXrASjlaJ2yy95wMCF5rGIZ+QUdEV # zyPVy4s81arJVIBz80z0bTLWbvo7coAqYeTH6rgYmv0qdB44+5RA6zR0fwv9f8Qm # mckKYCEe5QESSGkVYecvlqm6pm1LBSKBeVB8MMyRSaTl8WLQNLlrq2iqXQlMwM4e # sJCmYDJEa1z9xP8OXLOFO3GImI2URpZtxq/ryYJMk7CltzgYk7ZGlv3o7aVvkuqb # vzXs1xagM8Lkg43iCJjjnhGr5QPTvVaQnsaNc+lQqadBG9/dOLoTAgMBAAGjggEb # MIIBFzAdBgNVHQ4EFgQUp5se+LeoF+Ca4XUyCXV80Ou+H2MwHwYDVR0jBBgwFoAU # 1WM6XIoxkPNDe3xGG8UzaFqFbVUwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2Ny # bC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGltU3RhUENBXzIw # MTAtMDctMDEuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNUaW1TdGFQQ0FfMjAxMC0w # Ny0wMS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDCDANBgkq # hkiG9w0BAQsFAAOCAQEAFTSYCJs6BaaJUHVPJ2HXF+8kpShD9+faoOUP0hae3uI+ # XQNVfpLL5inWQdY4Y7AbNiJjTiLcjWNrtjcI2uCTcRX/tsvyk3D/BhPex/KIK/XP # lW9bhxe4LZ3txfL579Am+/SuJm4YuktECIaj3CPHN+lKnj8CjC5t9ifrzvcLiltj # SvL/WwOYELvdgI+rn+wBgLjWByIdImaJPm3LiaWDyimNZ70thGtYM5hfCf4qz2OD # FvL+P4GnpCaLH5HOoG6JmuMNYBQxioCob+7ZU9fud7hxkdk0tajGHjcBnxrY4k8U # NQZUBGYm5OzxXwnvikYU0Uwkbc1p0oNzRBNMtqi51DCCBnEwggRZoAMCAQICCmEJ # gSoAAAAAAAIwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQI # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmlj # YXRlIEF1dGhvcml0eSAyMDEwMB4XDTEwMDcwMTIxMzY1NVoXDTI1MDcwMTIxNDY1 # NVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT # B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UE # AxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggEiMA0GCSqGSIb3DQEB # AQUAA4IBDwAwggEKAoIBAQCpHQ28dxGKOiDs/BOX9fp/aZRrdFQQ1aUKAIKF++18 # aEssX8XD5WHCdrc+Zitb8BVTJwQxH0EbGpUdzgkTjnxhMFmxMEQP8WCIhFRDDNdN # uDgIs0Ldk6zWczBXJoKjRQ3Q6vVHgc2/JGAyWGBG8lhHhjKEHnRhZ5FfgVSxz5NM # ksHEpl3RYRNuKMYa+YaAu99h/EbBJx0kZxJyGiGKr0tkiVBisV39dx898Fd1rL2K # Qk1AUdEPnAY+Z3/1ZsADlkR+79BL/W7lmsqxqPJ6Kgox8NpOBpG2iAg16HgcsOmZ # zTznL0S6p/TcZL2kAcEgCZN4zfy8wMlEXV4WnAEFTyJNAgMBAAGjggHmMIIB4jAQ # BgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU1WM6XIoxkPNDe3xGG8UzaFqFbVUw # GQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB # /wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0f # BE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJv # ZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4w # TDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0 # cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgaAGA1UdIAEB/wSBlTCBkjCB # jwYJKwYBBAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vUEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAd # AEwAZQBnAGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQALiAd # MA0GCSqGSIb3DQEBCwUAA4ICAQAH5ohRDeLG4Jg/gXEDPZ2joSFvs+umzPUxvs8F # 4qn++ldtGTCzwsVmyWrf9efweL3HqJ4l4/m87WtUVwgrUYJEEvu5U4zM9GASinbM # QEBBm9xcF/9c+V4XNZgkVkt070IQyK+/f8Z/8jd9Wj8c8pl5SpFSAK84Dxf1L3mB # ZdmptWvkx872ynoAb0swRCQiPM/tA6WWj1kpvLb9BOFwnzJKJ/1Vry/+tuWOM7ti # X5rbV0Dp8c6ZZpCM/2pif93FSguRJuI57BlKcWOdeyFtw5yjojz6f32WapB4pm3S # 4Zz5Hfw42JT0xqUKloakvZ4argRCg7i1gJsiOCC1JeVk7Pf0v35jWSUPei45V3ai # caoGig+JFrphpxHLmtgOR5qAxdDNp9DvfYPw4TtxCd9ddJgiCGHasFAeb73x4QDf # 5zEHpJM692VHeOj4qEir995yfmFrb3epgcunCaw5u+zGy9iCtHLNHfS4hQEegPsb # iSpUObJb2sgNVZl6h3M7COaYLeqN4DMuEin1wC9UJyH3yKxO2ii4sanblrKnQqLJ # zxlBTeCG+SqaoxFmMNO7dDJL32N79ZmKLxvHIa9Zta7cRDyXUHHXodLFVeNp3lfB # 0d4wwP3M5k37Db9dT+mdHhk4L7zPWAUu7w2gUDXa7wknHNWzfjUeCLraNtvTX4/e # dIhJEqGCAtIwggI7AgEBMIH8oYHUpIHRMIHOMQswCQYDVQQGEwJVUzETMBEGA1UE # CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z # b2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3NvZnQgT3BlcmF0aW9ucyBQ # dWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046ODk3QS1FMzU2LTE3 # MDExJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAH # BgUrDgMCGgMVAPsyknR1i0TcyJcqh1cV2YCp2dCioIGDMIGApH4wfDELMAkGA1UE # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0 # IFRpbWUtU3RhbXAgUENBIDIwMTAwDQYJKoZIhvcNAQEFBQACBQDkKVp9MCIYDzIw # MjEwNDIwMTc0OTQ5WhgPMjAyMTA0MjExNzQ5NDlaMHcwPQYKKwYBBAGEWQoEATEv # MC0wCgIFAOQpWn0CAQAwCgIBAAICBQACAf8wBwIBAAICEYEwCgIFAOQqq/0CAQAw # NgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgC # AQACAwGGoDANBgkqhkiG9w0BAQUFAAOBgQBtFyIFrfc+UuFEtmE8gUuPYDLI/445 # +JASQWFJOB5RPnpil2YA+Fo4jayTtA33Eq0xKWw60S8EMnInsKnlsLjgTyq8sbdF # Oyru+4+fepecslqrJ3PNAyn76GGTRFfyPxsi/HoJVTXUS5ucZbhl/8kkEvF5KL+l # uhhdrC5ETQ7ESDGCAw0wggMJAgEBMIGTMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQI # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD # QSAyMDEwAhMzAAABYAcg8JJI2r7rAAAAAAFgMA0GCWCGSAFlAwQCAQUAoIIBSjAa # BgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIEIPRnU6cO # 0KCHBctF2ne1E6HlO6LUeeBTivNlcvrX8bIsMIH6BgsqhkiG9w0BCRACLzGB6jCB # 5zCB5DCBvQQgAhKjvaNzLpdbRaevHuoryn6V0v+PXBcJ4l5I96iwZbkwgZgwgYCk # fjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD # Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAWAHIPCSSNq+6wAA # AAABYDAiBCAAPC5aQLFMCRyunRDYplKXqw67nccv8Qeq5AM+68CL1jANBgkqhkiG # 9w0BAQsFAASCAQCk8go6iJSbuW2fwIfQB/4mPwo7f5mEAWpwbDk2iDQd1uRBpgMs # BUeRpiqr92ycvT238iy3Vu2Mpl9VQ6sJrVujcQXOIcXwlktD84/Kzl5AGoZAInK4 # F28QSKc1+dSNyph7UVhSaJujR+UUKHpsGMfPb0l2xI1i7FvibGYss8XOgy9YOqCD # MV/OSB/hqwO79EuQx61aNL6SuRjmXyjDs+tsvX6ii5MI0yonyfFvcqOJBiJ5OLwO # F8dFxnHbyAARmORcVk1/96lSf4C3R08kIrUvZO+E9DUGKC5uaeZpc4Ofp7NFB2L5 # 0oun7aAXdyRjMjqI9JCf5nPwgksuA9vtS5W8 # SIG # End signature block |