Public/Get-MsrcVulnerabilityReportHtml.ps1

function Get-MsrcVulnerabilityReportHtml
{
<#
.Synopsis
   Use a CVRF document to create a Vulnerability summary
.EXAMPLE
   #Create a report with all the Vulnerabilities in a CVRF document
   Get-MsrcCvrfDocument -ID 2016-Aug -ApiKey 'YOUR API KEY' |
   Get-MsrcVulnerabilityReportHtml |
   Out-File -FilePath Cvrf-CVE-Summary.html
.EXAMPLE
    #Create a report for each of the Vulnerabilities in a CVRF document
    $cvrfDocument = Get-MsrcCvrfDocument -ID 2016-Nov -ApiKey 'YOUR API KEY'
    foreach ($vulnerability in $cvrfDocument.Vulnerability)
    {
        $vulnerability.CVE
        Get-MsrcVulnerabilityReportHtml -Vulnerability $vulnerability -ProductTree $cvrfDocument.ProductTree |
        Out-File -FilePath "Cvrf-$($vulnerability.CVE)-Summary.html"
    }
.EXAMPLE
    #Create a report for specific Vulnerabilities in a CVRF document
    $cvrfDocument = Get-MsrcCvrfDocument -ID 2016-Nov -ApiKey 'YOUR API KEY'
    Get-MsrcVulnerabilityReportHtml -Vulnerability ($cvrfDocument.Vulnerability | Where-Object CVE -In @('CVE-2016-0026','CVE-2016-7202','CVE-2016-3343')) -ProductTree $cvrfDocument.ProductTree |
    Out-File -FilePath Cvrf-CVE-Summary.html
#>

    [OutputType([string])]
    Param
    (
        <#
        The Vulnerability node of a CVRF document
        #>
 
        [Parameter(Mandatory=$true, 
                   ValueFromPipelineByPropertyName=$true)]
        $Vulnerability,

        <#
        The ProductTree node of a CVRF document
        #>

        [Parameter(Mandatory=$true, 
                   ValueFromPipelineByPropertyName=$true)]
        $ProductTree
    )
    $htmlDocumentTemplate = @'
<html>
<head>
    <!-- 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&amp;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>
        #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: 20% ; }}
        .affected_software td:nth-child(2) {{ width: 20% ; }}
        .affected_software td:nth-child(3) {{ width: 15% ; }}
        .affected_software td:nth-child(4) {{ width: 22.5% ; }}
        .affected_software td:nth-child(5) {{ width: 22.5% ; }}
    </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>This report contains detail for the following vulnerabilities:</p>
<ul>
{0}
</ul>
{1}
</div>
<br>
 </body>
</html>
'@


    
    $cveListHtml = ''
    
    $cveSectionHtml = ''
    foreach($vuln in $Vulnerability)
    {
        if ($vuln.Title.Value)
        {
            $cveTitle = $vuln.Title.Value
        }
        else
        {
            Write-Warning "Missing Title for $($vuln.CVE)"
            $cveTitle = 'Unknown'
        }

        $cveSectionHtml += '<h1 id="{0}">{0} - {1}</h1> (<a href="#top">top</a>)' -f $vuln.CVE, $cveTitle

        #region CVE Summary List
        $cveListHtml += '<li><a href="#{0}">{0}</a> - {1}</li>' -f $vuln.CVE, $cveTitle
        #endregion

        #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>
'@


        $SeverityValues = $vuln.Threats | Where-Object Type -EQ 3 | 
          Select @{Name='Severity' ;Expression={$_.Description.Value}} -Unique |
          Select -ExpandProperty Severity

        if ($SeverityValues -contains 'Critical')
        {
            $maximumSeverity = 'Critical'
        }
        elseif ($SeverityValues -contains 'Important')
        {
            $maximumSeverity = 'Important'
        }
        elseif ($SeverityValues -contains 'Moderate')
        {
            $maximumSeverity = 'Moderate'
        }
        elseif ($SeverityValues -contains 'Low')
        {
            $maximumSeverity = 'Low'
        }
        else
        {
            Write-Warning "Could not determine the Maximum Severity from the Threats for $($vuln.CVE)"
            $maximumSeverity = 'Unknown'
        } 
        
        $ImpactValues = $vuln.Threats | Where-Object Type -EQ 0 | ForEach-Object {$_.Description.Value} | Select-Object -Unique
        if ($ImpactValues)
        {
            $impactColumn = $ImpactValues -join ',<br>'
        }
        else
        {
            Write-Warning "Could not determine the Impact from the Threats for $($vuln.CVE)"
            $impactColumn = 'Unknown'
        }

        $vulnTableColumn = $vuln.CVE + "<br>" + "<a href=`"http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=$($vuln.CVE)`">MITRE</a>" + "<br>" + "<a href=`"https://web.nvd.nist.gov/view/vuln/detail?vulnId=$($vuln.CVE)`">NVD</a>"

        $vulnDescriptionColumnTemplate = @'
        <b>CVE Title:</b> {0}
        <br>
        <b>Description:</b> <br>{1}
        <br>
        <b>FAQ:</b><br>{2}
        <br>
        <b>Mitigations:</b><br>{3}
        <br>
        <b>Workarounds:</b><br>{4}
        <br>
'@

        
        if ($vuln.Notes | Where-Object Title -eq Description)
        {
            $cveDescription = $vuln.Notes | Where Title -eq Description | Select -ExpandProperty Value
        }
        else
        {
            Write-Warning "Missing Description for $($vuln.CVE)"
            $cveDescription = 'Unknown'
        }

        $cveFaqs = $vuln.Notes | Where Title -eq FAQ | Select -ExpandProperty Value
        if ($cveFaqs)
        {
            $cveFaq = $cveFaqs -join '<br>'
        }
        else
        {            
            $cveFaq = "No FAQ for $($vuln.CVE)"
        }

        $cveMitigations = $vuln.Remediations | Where-Object Type -EQ 1
        if ($cveMitigations)
        {
            $cveMitigation = $cveMitigations.URL -join '<br>'
        }
        else
        {            
            $cveMitigation = "No mitigations for $($vuln.CVE)"
        }

        $cveWorkarounds = $vuln.Remediations | Where-Object Type -EQ 0 | Select-Object -ExpandProperty Description | Select-Object -ExpandProperty Value
        if ($cveWorkarounds)
        {
            $cveWorkaround = $cveWorkarounds -join '<br>'
        }
        else
        {            
            $cveWorkaround = "No workarounds for $($vuln.CVE)"
        }

        $vulnDescriptionColumn = $vulnDescriptionColumnTemplate -f @(
            $cveTitle
            $cveDescription
            $cveFaq
            $cveMitigation
            $cveWorkaround
        )

        $cveSectionHtml += $cveSummaryTableHtml -f @(
            $vulnTableColumn 
            $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>CVE ID</b></td>
   <td><b>Vulnerability Title</b></td>
   <td><b>Exploitability Assessment for Latest Software Release</b></td>
   <td><b>Exploitability Assessment for Older Software Release</b></td>
   <td><b>Denial of Service Exploitability Assessment</b></td>
  </tr>
 </thead>
 <tr>
     <td>{0}</td>
     <td>{1}</td>
     <td>{2}</td>
     <td>{3}</td>
     <td>{4}</td>
 </tr>
</table>
'@


        $ExploitStatusLatest = ''
        $ExploitStatusOlder  = ''        

        $ExploitStatusThreat = $vuln.Threats | Where Type -EQ 1 | Select -Last 1
        if ($ExploitStatusThreat.Description.Value)
        {
            $ExploitStatus = Get-MsrcThreatExploitStatus -ExploitStatusString $ExploitStatusThreat.Description.Value 
        }
        else
        {
            Write-Warning "Missing ExploitStatus for $($vuln.CVE)"
        }       

        if ($ExploitStatus.LatestSoftwareRelease)
        {
            $LatestSoftwareRelease = $ExploitStatus.LatestSoftwareRelease
        }
        else
        {
            $LatestSoftwareRelease = 'Not Found'
        }
        if ($ExploitStatus.OlderSoftwareRelease)
        {
            $OlderSoftwareRelease = $ExploitStatus.OlderSoftwareRelease
        }
        else
        {
            $OlderSoftwareRelease = 'Not Found'
        }
        if ($ExploitStatus.DenialOfService)
        {
            $DenialOfService = $ExploitStatus.DenialOfService
        }
        else
        {
            $DenialOfService = 'Not Found'
        }

        $cveSectionHtml += $exploitabilityIndexTableHtml -f @(
            $vuln.CVE
            $cveTitle
            $LatestSoftwareRelease
            $OlderSoftwareRelease
            $DenialOfService           
        )    
        #endregion

        #region Affected Software Table
    
        $affectedSoftwareTableTemplate = @'
<table class="affected_software" border=1 cellpadding=0 width="99%">
    <thead style="background-color: #ededed">
        <tr>
            <td colspan="6"><b>{0}</b></td>
        </tr>
    </thead>
        <tr>
            <td><b>CVE</b></td>
            <td><b>KB Article</b></td>
            <td><b>Severity</b></td>
            <td><b>Impact</b></td>
            <td><b>Supersedence</b></td>
            <td><b>Restart Required</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>
        </tr>
'@


        $cveSectionHtml += @'
<h2>Affected Software</h2>
 
<p>The following tables list the affected software details for the vulnerability.</p>
'@

        $affectedSoftware = Get-MsrcCvrfAffectedSoftware -Vulnerability $vuln -ProductTree $ProductTree

        foreach($productName in $($affectedSoftware.FullProductName | Sort-Object | Get-Unique ))
        {
            $affectedSoftwareTableHtml = ''
            foreach($affectedSoftwareItem in $affectedSoftware | Where-Object {$_.FullProductName -eq $productName})
            {        
                $affectedSoftwareTableHtml += $affectedSoftwareRowTemplate -f @(
                    $affectedSoftwareItem.CVE                
                    $( if (!$affectedSoftwareItem.KBArticle){"None"}else{$affectedSoftwareItem.KBArticle} )
                    $( if (!$affectedSoftwareItem.Severity){"Unknown"}else{$affectedSoftwareItem.Severity} )
                    $( if (!$affectedSoftwareItem.Impact){"Unknown"}else{$affectedSoftwareItem.Impact} )
                    $( if (!$affectedSoftwareItem.Supercedence){"Unknown"}else{$affectedSoftwareItem.Supercedence} )
                    $( if (!$affectedSoftwareItem.RestartRequired){"Unknown"}else{$affectedSoftwareItem.RestartRequired} )
                )
            }
            $cveSectionHtml += $affectedSoftwareTableTemplate -f @(
                $ProductName
                $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 ($vuln.Acknowledgments)
        {
            $acknowledgmentsValue = ''
            foreach ($ack in $vuln.Acknowledgments)
            {
                if ($ack.Name.Value)
                {
                    $acknowledgmentsValue += $ack.Name.Value
                    $acknowledgmentsValue += '<br>'
                }
                if ($ack.URL)
                {
                    $acknowledgmentsValue += $ack.URL
                    $acknowledgmentsValue += '<br>'
                }
                $acknowledgmentsValue += '<br><br>'
            }
        }
        else
        {
            Write-Warning "No Acknowledgments for $($vuln.CVE)"
            $acknowledgmentsValue = 'No Acknowledgments'
        }

        $cveSectionHtml += $acknowledgmentsTableTemplate -f @(
            $vuln.CVE 
            $acknowledgmentsValue
        )
    }
    #endregion

    Write-Output ($htmlDocumentTemplate -f @( 
        $cveListHtml
        $cveSectionHtml
    ))
}
# SIG # Begin signature block
# MIIkYAYJKoZIhvcNAQcCoIIkUTCCJE0CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB3pzYRQWTJA5Eo
# YP9/orsZBjREGclSeKxiIlTWi5zSXaCCDZMwggYRMIID+aADAgECAhMzAAAAjoeR
# pFcaX8o+AAAAAACOMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMTYxMTE3MjIwOTIxWhcNMTgwMjE3MjIwOTIxWjCBgzEL
# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9Q
# UjEeMBwGA1UEAxMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMIIBIjANBgkqhkiG9w0B
# AQEFAAOCAQ8AMIIBCgKCAQEA0IfUQit+ndnGetSiw+MVktJTnZUXyVI2+lS/qxCv
# 6cnnzCZTw8Jzv23WAOUA3OlqZzQw9hYXtAGllXyLuaQs5os7efYjDHmP81LfQAEc
# wsYDnetZz3Pp2HE5m/DOJVkt0slbCu9+1jIOXXQSBOyeBFOmawJn+E1Zi3fgKyHg
# 78CkRRLPA3sDxjnD1CLcVVx3Qv+csuVVZ2i6LXZqf2ZTR9VHCsw43o17lxl9gtAm
# +KWO5aHwXmQQ5PnrJ8by4AjQDfJnwNjyL/uJ2hX5rg8+AJcH0Qs+cNR3q3J4QZgH
# uBfMorFf7L3zUGej15Tw0otVj1OmlZPmsmbPyTdo5GPHzwIDAQABo4IBgDCCAXww
# HwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYBBQUHAwMwHQYDVR0OBBYEFKvI1u2y
# FdKqjvHM7Ww490VK0Iq7MFIGA1UdEQRLMEmkRzBFMQ0wCwYDVQQLEwRNT1BSMTQw
# MgYDVQQFEysyMzAwMTIrYjA1MGM2ZTctNzY0MS00NDFmLWJjNGEtNDM0ODFlNDE1
# ZDA4MB8GA1UdIwQYMBaAFEhuZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEsw
# SaBHoEWGQ2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0Nv
# ZFNpZ1BDQTIwMTFfMjAxMS0wNy0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsG
# AQUFBzAChkVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01p
# Y0NvZFNpZ1BDQTIwMTFfMjAxMS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkq
# hkiG9w0BAQsFAAOCAgEARIkCrGlT88S2u9SMYFPnymyoSWlmvqWaQZk62J3SVwJR
# avq/m5bbpiZ9CVbo3O0ldXqlR1KoHksWU/PuD5rDBJUpwYKEpFYx/KCKkZW1v1rO
# qQEfZEah5srx13R7v5IIUV58MwJeUTub5dguXwJMCZwaQ9px7eTZ56LadCwXreUM
# tRj1VAnUvhxzzSB7pPrI29jbOq76kMWjvZVlrkYtVylY1pLwbNpj8Y8zon44dl7d
# 8zXtrJo7YoHQThl8SHywC484zC281TllqZXBA+KSybmr0lcKqtxSCy5WJ6PimJdX
# jrypWW4kko6C4glzgtk1g8yff9EEjoi44pqDWLDUmuYx+pRHjn2m4k5589jTajMW
# UHDxQruYCen/zJVVWwi/klKoCMTx6PH/QNf5mjad/bqQhdJVPlCtRh/vJQy4njpI
# BGPveJiiXQMNAtjcIKvmVrXe7xZmw9dVgh5PgnjJnlQaEGC3F6tAE5GusBnBmjOd
# 7jJyzWXMT0aYLQ9RYB58+/7b6Ad5B/ehMzj+CZrbj3u2Or2FhrjMvH0BMLd7Hald
# G73MTRf3bkcz1UDfasouUbi1uc/DBNM75ePpEIzrp7repC4zaikvFErqHsEiODUF
# he/CBAANa8HYlhRIFa9+UrC4YMRStUqCt4UqAEkqJoMnWkHevdVmSbwLnHhwCbww
# ggd6MIIFYqADAgECAgphDpDSAAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYD
# VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv
# ZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5
# MDlaFw0yNjA3MDgyMTA5MDlaMH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
# aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
# cG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIw
# MTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQ
# TTS68rZYIZ9CGypr6VpQqrgGOBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULT
# iQ15ZId+lGAkbK+eSZzpaF7S35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYS
# L+erCFDPs0S3XdjELgN1q2jzy23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494H
# DdVceaVJKecNvqATd76UPe/74ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZ
# PrGMXeiJT4Qa8qEvWeSQOy2uM1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5
# bmR/U7qcD60ZI4TL9LoDho33X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGS
# rhwjp6lm7GEfauEoSZ1fiOIlXdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADh
# vKwCgl/bwBWzvRvUVUvnOaEP6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON
# 7E1JMKerjt/sW5+v/N2wZuLBl4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xc
# v3coKPHtbcMojyyPQDdPweGFRInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqw
# iBfenk70lrC8RqBsmNLg1oiMCwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMC
# AQAwHQYDVR0OBBYEFEhuZOVQBdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQM
# HgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1Ud
# IwQYMBaAFHItOgIxkEO5FAVO4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0
# dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0Nl
# ckF1dDIwMTFfMjAxMV8wM18yMi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUF
# BzAChkJodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0Nl
# ckF1dDIwMTFfMjAxMV8wM18yMi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGC
# Ny4DMIGDMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp
# b3BzL2RvY3MvcHJpbWFyeWNwcy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcA
# YQBsAF8AcABvAGwAaQBjAHkAXwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZI
# hvcNAQELBQADggIBAGfyhqWY4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4s
# PvjDctFtg/6+P+gKyju/R6mj82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKL
# UtCw/WvjPgcuKZvmPRul1LUdd5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7
# pKkFDJvtaPpoLpWgKj8qa1hJYx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft
# 0N3zDq+ZKJeYTQ49C/IIidYfwzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4
# MnEnGn+x9Cf43iw6IGmYslmJaG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxv
# FX1Fp3blQCplo8NdUmKGwx1jNpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG
# 0QaxdR8UvmFhtfDcxhsEvt9Bxw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf
# 0AApxbGbpT9Fdx41xtKiop96eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkY
# S//WsyNodeav+vyL6wuA6mk7r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrv
# QQqxP/uozKRdwaGIm1dxVk5IRcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIW
# IzCCFh8CAQEwgZUwfjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjEoMCYGA1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAA
# AI6HkaRXGl/KPgAAAAAAjjANBglghkgBZQMEAgEFAKCCAREwGQYJKoZIhvcNAQkD
# MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJ
# KoZIhvcNAQkEMSIEIO2hUGyWqMRsIAmphE2f+ro+cgjZoYWKIkI+/bDqXpcIMIGk
# BgorBgEEAYI3AgEMMYGVMIGSoEyASgBNAHMAcgBjAFMAZQBjAHUAcgBpAHQAeQBV
# AHAAZABhAHQAZQBzACAAUABvAHcAZQByAFMAaABlAGwAbAAgAE0AbwBkAHUAbABl
# oUKAQGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvTVNSQy1NaWNyb3NvZnQt
# U2VjdXJpdHktVXBkYXRlcy1BUEkwDQYJKoZIhvcNAQEBBQAEggEANY7uyB7WHK3E
# rgB4vBwBeULN7ts7NjvTDbcIbJp1rsr2O8gHSsKlIndGom+pP6pAkq3YlMFdkLsf
# biDGXHNUagsPwCyVbW6oxwyYxVr1km6LTopDVQsuzzLICwe9ktfz3945ZukNjrtp
# xnzMnVQo043Ab0jst4B+Vduc7IU5SxhPSu8HYX9dh9Xk0iBLimkCdqRoQhp4ZZFt
# WJnbIjh7RNI0RiR928jZwYpUDYmaCqYbS128uNd46wxkGKNciq+jmaMPn6m87XQD
# JF2MdWIKR0gDwWOichfw8f+lI/WKCbRWAt2PvQTQu4WOJPTdP0yhrh8khTk+sArr
# fLNXD22ziaGCE0kwghNFBgorBgEEAYI3AwMBMYITNTCCEzEGCSqGSIb3DQEHAqCC
# EyIwghMeAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggE8BgsqhkiG9w0BCRABBKCCASsE
# ggEnMIIBIwIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCBHHYFeslXE
# C4dX9kSw58g7LpIQ1jKuckt7loyho2lFLQIGWNQzxHLoGBIyMDE3MDQxMzE4MDgy
# OC4wNlowBwIBAYACAfSggbmkgbYwgbMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xDTALBgNVBAsTBE1PUFIxJzAlBgNVBAsTHm5DaXBoZXIgRFNF
# IEVTTjo5OEZELUM2MUUtRTY0MTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3Rh
# bXAgU2VydmljZaCCDs0wggZxMIIEWaADAgECAgphCYEqAAAAAAACMA0GCSqGSIb3
# DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIw
# MAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAx
# MDAeFw0xMDA3MDEyMTM2NTVaFw0yNTA3MDEyMTQ2NTVaMHwxCzAJBgNVBAYTAlVT
# MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1l
# LVN0YW1wIFBDQSAyMDEwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
# qR0NvHcRijog7PwTl/X6f2mUa3RUENWlCgCChfvtfGhLLF/Fw+Vhwna3PmYrW/AV
# UycEMR9BGxqVHc4JE458YTBZsTBED/FgiIRUQwzXTbg4CLNC3ZOs1nMwVyaCo0UN
# 0Or1R4HNvyRgMlhgRvJYR4YyhB50YWeRX4FUsc+TTJLBxKZd0WETbijGGvmGgLvf
# YfxGwScdJGcSchohiq9LZIlQYrFd/XcfPfBXday9ikJNQFHRD5wGPmd/9WbAA5ZE
# fu/QS/1u5ZrKsajyeioKMfDaTgaRtogINeh4HLDpmc085y9Euqf03GS9pAHBIAmT
# eM38vMDJRF1eFpwBBU8iTQIDAQABo4IB5jCCAeIwEAYJKwYBBAGCNxUBBAMCAQAw
# HQYDVR0OBBYEFNVjOlyKMZDzQ3t8RhvFM2hahW1VMBkGCSsGAQQBgjcUAgQMHgoA
# UwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQY
# MBaAFNX2VsuP6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6
# Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1
# dF8yMDEwLTA2LTIzLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0
# dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIw
# MTAtMDYtMjMuY3J0MIGgBgNVHSABAf8EgZUwgZIwgY8GCSsGAQQBgjcuAzCBgTA9
# BggrBgEFBQcCARYxaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL1BLSS9kb2NzL0NQ
# Uy9kZWZhdWx0Lmh0bTBABggrBgEFBQcCAjA0HjIgHQBMAGUAZwBhAGwAXwBQAG8A
# bABpAGMAeQBfAFMAdABhAHQAZQBtAGUAbgB0AC4gHTANBgkqhkiG9w0BAQsFAAOC
# AgEAB+aIUQ3ixuCYP4FxAz2do6Ehb7Prpsz1Mb7PBeKp/vpXbRkws8LFZslq3/Xn
# 8Hi9x6ieJeP5vO1rVFcIK1GCRBL7uVOMzPRgEop2zEBAQZvcXBf/XPleFzWYJFZL
# dO9CEMivv3/Gf/I3fVo/HPKZeUqRUgCvOA8X9S95gWXZqbVr5MfO9sp6AG9LMEQk
# IjzP7QOllo9ZKby2/QThcJ8ySif9Va8v/rbljjO7Yl+a21dA6fHOmWaQjP9qYn/d
# xUoLkSbiOewZSnFjnXshbcOco6I8+n99lmqQeKZt0uGc+R38ONiU9MalCpaGpL2e
# Gq4EQoO4tYCbIjggtSXlZOz39L9+Y1klD3ouOVd2onGqBooPiRa6YacRy5rYDkea
# gMXQzafQ732D8OE7cQnfXXSYIghh2rBQHm+98eEA3+cxB6STOvdlR3jo+KhIq/fe
# cn5ha293qYHLpwmsObvsxsvYgrRyzR30uIUBHoD7G4kqVDmyW9rIDVWZeodzOwjm
# mC3qjeAzLhIp9cAvVCch98isTtoouLGp25ayp0Kiyc8ZQU3ghvkqmqMRZjDTu3Qy
# S99je/WZii8bxyGvWbWu3EQ8l1Bx16HSxVXjad5XwdHeMMD9zOZN+w2/XU/pnR4Z
# OC+8z1gFLu8NoFA12u8JJxzVs341Hgi62jbb01+P3nSISRIwggTaMIIDwqADAgEC
# AhMzAAAAnSCcVndV1CiaAAAAAACdMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYT
# AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBU
# aW1lLVN0YW1wIFBDQSAyMDEwMB4XDTE2MDkwNzE3NTY0MVoXDTE4MDkwNzE3NTY0
# MVowgbMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
# EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTALBgNV
# BAsTBE1PUFIxJzAlBgNVBAsTHm5DaXBoZXIgRFNFIEVTTjo5OEZELUM2MUUtRTY0
# MTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCASIwDQYJ
# KoZIhvcNAQEBBQADggEPADCCAQoCggEBANJEmJwRWioaLqqfU11tXby2WXaRwCZb
# A+bIbF+jKutMAEZ0OBS/KnhdsCNM7G5gSOxJ5Ft1pnD989SuVW6OvQQfZz0Z/TFy
# gpShc7EuvPAc1NvvIbjGqbTGwkYHLpnMPiELwy5I3wxqdcU1jtdZnKs7SH6esuD8
# VJbeE0c5QtBu1kv9vwyk8Avl+ujIiIvunPt14cRL6MsOZM5X3mCoekrOZRy4ZZYj
# Yjt/BU9ZZt3pDdX4fL7ATN57CpYbzFU5BG8GCEE4u/UZ37V6BHcFHOLsjMfxsZpe
# R27Msh6j2pZ4ge7wB5iAUb66ChQefp46WSShV3MM/kFETpbCVFEPqcUCAwEAAaOC
# ARswggEXMB0GA1UdDgQWBBS8hgjKW2payuS9zMuCtBVI6ofloTAfBgNVHSMEGDAW
# gBTVYzpcijGQ80N7fEYbxTNoWoVtVTBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8v
# Y3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNUaW1TdGFQQ0Ff
# MjAxMC0wNy0wMS5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1RpbVN0YVBDQV8yMDEw
# LTA3LTAxLmNydDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0G
# CSqGSIb3DQEBCwUAA4IBAQB/3iQhvVnvtNaLccpZkb4uqEaCu4/fZB195ioLvChn
# S/75d7+19E6k/ehKDz5nIrNWiW2XCFrsIxT1eSoTV4ySF50GIerzqOobO9zbhJpL
# 93IV9p+PJ6j/peLWIImVTUCpFWBeuZcB1zAL/0Jqa1bZ7FpcNgOAzBYtasG5M2RP
# 215rf9hvwK6BpTjtOs5dchqMTBXLX5OMst2qAC3j/WQoqam+EB3+Fdwnjx+OpAPq
# jjfbBCVTH+Eyevc7IpDM3CoNwV6GCdU+Vu+rJaB6yzJAWPa9CVu2yf97R3l0hqWG
# ndgiDVde4agNxiZOAvb9OvYBrPeXvLmRDmHbndPvpjZpoYIDdjCCAl4CAQEwgeOh
# gbmkgbYwgbMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xDTAL
# BgNVBAsTBE1PUFIxJzAlBgNVBAsTHm5DaXBoZXIgRFNFIEVTTjo5OEZELUM2MUUt
# RTY0MTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIlCgEB
# MAkGBSsOAwIaBQADFQAYDayzjGgws/h0GbJ4zoArNS8I+qCBwjCBv6SBvDCBuTEL
# MAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1v
# bmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsGA1UECxMETU9Q
# UjEnMCUGA1UECxMebkNpcGhlciBOVFMgRVNOOjRERTktMEM1RS0zRTA5MSswKQYD
# VQQDEyJNaWNyb3NvZnQgVGltZSBTb3VyY2UgTWFzdGVyIENsb2NrMA0GCSqGSIb3
# DQEBBQUAAgUA3JosPDAiGA8yMDE3MDQxMzE2NTYyOFoYDzIwMTcwNDE0MTY1NjI4
# WjB0MDoGCisGAQQBhFkKBAExLDAqMAoCBQDcmiw8AgEAMAcCAQACAhUZMAcCAQAC
# Ahl9MAoCBQDcm328AgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisGAQQBhFkKAwGg
# CjAIAgEAAgMW42ChCjAIAgEAAgMHoSAwDQYJKoZIhvcNAQEFBQADggEBAAinge7v
# kU7AiXAQJxmmLnJEWzZw0zrRoO3UIozlHyJ1J1U0rYsofKmOYvKjChnvd+hf7MNQ
# p48ZjqPDt54iW1PphkSs1tHnbe92Qu0AxnzbOmDmLY7A1ScC21jfnKSKfQTegXde
# ldB7+oJwG4iH7Z4QP2ahu4WWGWk5O3AEjAvQW7tEKzE/jolusKrXYEp94sicI996
# wGhQteulBu3lIV0xgC3RpgUngsIHTmSCM5gSReXvcx6gocVmXblZRAz0TgR/FnTk
# BQ6K+sPEBpRlVbLUJazHOTTMOHrp2tHSu+JnGBlvdgh098gV9NQERwomEzpTFwp+
# Zy6fFdqsfIMy69ExggL1MIIC8QIBATCBkzB8MQswCQYDVQQGEwJVUzETMBEGA1UE
# CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
# b2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQ
# Q0EgMjAxMAITMwAAAJ0gnFZ3VdQomgAAAAAAnTANBglghkgBZQMEAgEFAKCCATIw
# GgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCAtxxBx
# tzgvCcUTavJQfItW/6UPxfilhXV2DTq/x/lr/TCB4gYLKoZIhvcNAQkQAgwxgdIw
# gc8wgcwwgbEEFBgNrLOMaDCz+HQZsnjOgCs1Lwj6MIGYMIGApH4wfDELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0
# IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAACdIJxWd1XUKJoAAAAAAJ0wFgQU2agc
# Gw/E1lSaOmkdKN/T18GkJdowDQYJKoZIhvcNAQELBQAEggEAhSisETKODbVHOec8
# 6MFrCoNQNDkLqlFqtm2OJxybF0lBzDjVd71u3dYX95VN2fKoh8T6mKc2edUAQ643
# P1pU5hKGjFf/fdS8dNkVcnKAT7fxa/XwtFVVF5a94psvm2dopUcOEPqtYbSzkBB5
# zQfLIajEMskR7QxWVv8G9yfM7iamgkmgHTyur1PBNtDsXPtSjgWXxCVkwjmnnYzE
# eyXQsvESstV3FA9O92Wo8KpGI+0VobNGIgMWWc7Y7LBQvOpKLhB3jdJ79+XJYri0
# hKbq4JQbcfqQeFA8DcV7iJJh96GzmlGhvJ6wYjcyqYDUwDczBxYARguMO5Aqw5Ky
# V6+0mQ==
# SIG # End signature block