private/Test-LnvSignature.ps1

function Test-LnvSignature {
    <#
    .SYNOPSIS
        Verifies if a file is digitally signed by Lenovo
     
    .DESCRIPTION
        Tests whether a file or files in a folder have a valid digital signature from Lenovo.
        Supports multiple signature types:
        Uses Get-AuthenticodeSignature for Authenticode validation and
        custom XML parsing for XML Digital Signature validation.
         
        When a folder path is provided, searches for all signable files within it.
 
    .PARAMETER Path
        Path to a file or folder to verify.
        If a folder is provided, searches for signable files within it.
     
    .PARAMETER IncludeCatalog
        When specified, also checks for catalog signatures if direct signature not found.
        Useful for driver files (.sys, .inf) that use catalog signing.
     
    .PARAMETER Detailed
        Returns detailed signature information instead of just boolean
     
    .OUTPUTS
        System.Boolean (default) or PSCustomObject (with -Detailed)
        When a folder is provided, returns results for all signable files found.
     
    .EXAMPLE
        Test-LnvSignature -Path "C:\Temp\update.exe"
        Returns True if file has direct Lenovo signature
     
    .EXAMPLE
        Test-LnvSignature -Path "C:\Updates" -Detailed
        Tests all signable files in the folder and returns detailed info for each
     
    #>

    
    [CmdletBinding()]
    [OutputType([System.Boolean], ParameterSetName = 'Simple')]
    [OutputType([PSCustomObject], ParameterSetName = 'Detailed')]
    param(
        [Parameter(Mandatory = $true,
                   Position = 0,
                   ValueFromPipeline = $true,
                   ValueFromPipelineByPropertyName = $true)]
        [ValidateScript({
            if (-not (Test-Path $_)) {
                throw "Path not found: $_"
            }
            return $true
        })]
        [Alias('FilePath', 'FullName', 'FolderPath')]
        [string]$Path,
        
        [Parameter(Mandatory = $false)]
        [switch]$IncludeCatalog,
        
        [Parameter(Mandatory = $false)]
        [switch]$Detailed,
        
        [Parameter(Mandatory = $false)]
        [switch]$Recurse
    )
    
    begin {
        # Signable file types
        $script:SignableExtensions = @(".exe", ".dll", ".sys", ".msi", ".cab", ".cat", ".inf", ".xml")
        $script:CatalogTypes = @(".sys", ".inf")
        $script:XmlTypes = @(".xml")
        
        Write-Verbose "Test-LnvSignature: Using Lenovo validator: $Script:LenovoValidatorAvailable"
    }
    process {
        $item = Get-Item -Path $Path -ErrorAction Stop
        
        # If it's a folder, find all signable files in it
        if ($item.PSIsContainer) {
            Write-Verbose "Folder detected, searching for signable files..."
            
            $searchParams = @{
                Path = $item.FullName
                File = $true
                ErrorAction = 'SilentlyContinue'
            }
            
            if ($Recurse) {
                $searchParams['Recurse'] = $true
            }
            
            # Get all files and filter by extension
            $filesToCheck = Get-ChildItem @searchParams | 
                Where-Object { $script:SignableExtensions -contains $_.Extension.ToLower() }
            
            if ($filesToCheck.Count -eq 0) {
                Write-Verbose "No signable files found in folder: $($item.FullName)"
                if ($Detailed) {
                    Write-Output ([PSCustomObject]@{
                        PSTypeName = 'Lenovo.SignatureInfo'
                        FileName = $item.Name
                        FilePath = $item.FullName
                        IsLnvSigned = $false
                        SignatureType = "None"
                        TrustStatus = $null
                        Publisher = $null
                        Thumbprint = $null
                        ValidFrom = $null
                        ValidUntil = $null
                        IsOldCertificate = $false
                        CatalogFiles = @()
                        CatalogCount = 0
                        FileSize = 0
                        TestDuration = 0
                        TestTime = Get-Date
                        Success = $false
                        ErrorMessage = "No signable files found in folder"
                    })
                } else {
                    Write-Output $false
                }
                return
            }
            
            Write-Verbose "Found $($filesToCheck.Count) signable file(s) to check"
            
            # Check each file and return results
            #$allSigned = $true
            foreach ($file in $filesToCheck) {
                # Recursively call Test-LnvSignature for each file
                $splatParams = @{
                    Path = $file.FullName
                    IncludeCatalog = $IncludeCatalog
                    Detailed = $Detailed
                }
                Test-LnvSignature @splatParams
            }
            
            return
        }
        
        # Single file validation
        try {
            $file = Get-Item -Path $Path -ErrorAction Stop
            
            # Check if file type is signable
            if ($script:SignableExtensions -notcontains $file.Extension.ToLower()) {
                if ($Detailed) {
                    Write-Output ([PSCustomObject]@{
                        PSTypeName = 'Lenovo.SignatureInfo'
                        FileName = $file.Name
                        FilePath = $file.FullName
                        IsLnvSigned = $false
                        SignatureType = 'Unsupported'
                        TrustStatus = $null
                        Publisher = $null
                        Thumbprint = $null
                        ValidFrom = $null
                        ValidUntil = $null
                        IsOldCertificate = $false
                        WinVerifyTrustStatus = $null
                        CatalogFiles = @()
                        CatalogCount = 0
                        FileSize = $file.Length
                        TestDuration = 0
                        TestTime = Get-Date
                        Success = $false
                        ErrorMessage = "File type '$($file.Extension)' is not signable"
                    })
                } else {
                    Write-Output $false
                }
                return
            }
            
            Write-Verbose "Testing signature for: $($file.FullName)"
            
            $startTime = Get-Date
            $isLenovo = $false
            $signatureType = 'None'
            $trustStatus = $null
            $publisher = $null
            $thumbprint = $null
            $validFrom = $null
            $validUntil = $null
            $isOldCert = $false
            $winVerifyStatus = $null
            $catalogFilesList = @()
            $errorMessage = $null
            
            # XML file validation using XMLFileValidator
            if ($script:XmlTypes -contains $file.Extension.ToLower()) {
                Write-Verbose "Validating XML file with XML-DSig validator"
                
                if ($Script:LenovoValidatorAvailable) {
                    try {
                        $xmlValidator = New-Object Lenovo.CertificateValidation.XMLFileValidator
                        $oldCertRef = $false
                        $trust = $xmlValidator.GetTrustStatus($file.FullName, [ref]$oldCertRef)
                        
                        $trustStatus = $trust.ToString()
                        $isOldCert = $oldCertRef
                        
                        if ($trust.ToString() -eq 'FileTrusted') {
                            $isLenovo = $true
                            $signatureType = 'XMLDSig-Lenovo'
                            Write-Verbose "XML file is Lenovo-signed (Lenovo validator)"
                        } else {
                            Write-Verbose "XML validation result: $trustStatus"
                            $signatureType = "XMLDSig-$trustStatus"
                        }
                    }
                    catch {
                        $errorMessage = $_.Exception.Message
                        Write-Verbose "Lenovo XML validator failed: $errorMessage"
                        $signatureType = 'XMLDSig-Error'
                    }
                }
                
                # Fallback to manual XML-DSig parsing if Lenovo validator not available or failed
                if (-not $isLenovo -and -not $Script:LenovoValidatorAvailable) {
                    try {
                        [xml]$xmlContent = Get-Content -Path $file.FullName -Raw -ErrorAction Stop
                        $ns = @{
                            ds = 'http://www.w3.org/2000/09/xmldsig#'
                        }
                        
                        $signatureNode = Select-Xml -Xml $xmlContent -XPath '//ds:Signature' -Namespace $ns
                        
                        if ($signatureNode) {
                            Write-Verbose "Found XML-DSig signature, checking certificate"
                            $x509Cert = Select-Xml -Xml $xmlContent -XPath '//ds:X509Certificate' -Namespace $ns
                            
                            if ($x509Cert -and $x509Cert.Node.'#text') {
                                $certBytes = [Convert]::FromBase64String($x509Cert.Node.'#text')
                                $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList @(,$certBytes)
                                
                                if ($cert.Subject -match 'Lenovo') {
                                    $isLenovo = $true
                                    $signatureType = 'XMLDSig-Fallback'
                                    $publisher = $cert.Subject
                                    $thumbprint = $cert.Thumbprint
                                    $validFrom = $cert.NotBefore
                                    $validUntil = $cert.NotAfter
                                    Write-Verbose "XML file is Lenovo-signed (fallback parser)"
                                }
                            }
                        }
                    }
                    catch {
                        Write-Verbose "Error parsing XML signature: $($_.Exception.Message)"
                    }
                }
            }
            
            else {
                Write-Verbose "Validating Authenticode signature"
                
                # Use Lenovo FileValidator if available
                if ($Script:LenovoValidatorAvailable) {
                    try {
                        $oldCertRef = $false
                        $winVerifyRef = [uint32]0
                        
                        $trust = [Lenovo.CertificateValidation.FileValidator]::GetTrustStatus(
                            $file.FullName,
                            [ref]$oldCertRef,
                            [ref]$winVerifyRef
                        )
                        
                        $trustStatus = $trust.ToString()
                        $isOldCert = $oldCertRef
                        $winVerifyStatus = "0x$($winVerifyRef.ToString('X8'))"
                        
                        if ($trust.ToString() -eq 'FileTrusted') {
                            $isLenovo = $true
                            $signatureType = 'Authenticode-Lenovo'
                            Write-Verbose "File is Lenovo-trusted (Lenovo validator)"
                        } else {
                            Write-Verbose "Lenovo validator result: $trustStatus (WinVerify: $winVerifyStatus)"
                            $signatureType = "Authenticode-$trustStatus"
                        }
                    }
                    catch {
                        $errorMessage = $_.Exception.Message
                        Write-Verbose "Lenovo validator failed: $errorMessage"
                        $signatureType = 'Authenticode-Error'
                    }
                }
                
                # Fallback: Use Get-AuthenticodeSignature if Lenovo validator not available or failed
                if (-not $isLenovo) {
                    try {
                        $signature = Get-AuthenticodeSignature -FilePath $file.FullName -ErrorAction Stop
                        
                        if ($signature -and $signature.Status -eq 'Valid' -and $signature.SignerCertificate) {
                            # Verify certificate chain
                            $chain = New-Object System.Security.Cryptography.X509Certificates.X509Chain
                            $chain.ChainPolicy.RevocationMode = 'Online'
                            $chain.ChainPolicy.VerificationFlags = 'NoFlag'
                            
                            if ($chain.Build($signature.SignerCertificate)) {
                                # Check if it's a Lenovo certificate
                                if ($signature.SignerCertificate.Subject -match 'O=Lenovo' -or
                                    $signature.SignerCertificate.Subject -match 'CN=Lenovo') {
                                    
                                    $isLenovo = $true
                                    $signatureType = if ($Script:LenovoValidatorAvailable) { 'Authenticode-Fallback' } else { 'Authenticode' }
                                    $publisher = $signature.SignerCertificate.Subject
                                    $thumbprint = $signature.SignerCertificate.Thumbprint
                                    $validFrom = $signature.SignerCertificate.NotBefore
                                    $validUntil = $signature.SignerCertificate.NotAfter
                                    
                                    Write-Verbose "File is Lenovo-signed (Get-AuthenticodeSignature)"
                                } else {
                                    Write-Verbose "File is signed but not by Lenovo: $($signature.SignerCertificate.Subject)"
                                }
                            } else {
                                Write-Verbose "Certificate chain validation failed"
                            }
                        } else {
                            Write-Verbose "No valid Authenticode signature found (Status: $($signature.Status))"
                        }
                    }
                    catch {
                        Write-Verbose "Get-AuthenticodeSignature failed: $($_.Exception.Message)"
                    }
                }
                
                # Check catalog signature if requested and no direct signature found
                if ($IncludeCatalog -and -not $isLenovo -and ($script:CatalogTypes -contains $file.Extension.ToLower())) {
                    Write-Verbose "Checking for catalog signature..."
                    
                    try {
                        # Use FileValidator.IsCatalogSigned if available
                        if ($Script:LenovoValidatorAvailable) {
                            $catFilesRef = New-Object 'string[]' 0
                            $isCatalogSigned = [Lenovo.CertificateValidation.FileValidator]::IsCatalogSigned(
                                $file.FullName,
                                [ref]$catFilesRef
                            )
                            
                            if ($isCatalogSigned -and $catFilesRef -and $catFilesRef.Count -gt 0) {
                                Write-Verbose "File is catalog-signed. Catalog files: $($catFilesRef -join ', ')"
                                
                                # Verify the catalog files are Lenovo-signed
                                foreach ($catFile in $catFilesRef) {
                                    if (Test-Path $catFile) {
                                        $catSig = Get-AuthenticodeSignature -FilePath $catFile -ErrorAction SilentlyContinue
                                        
                                        if ($catSig.Status -eq 'Valid' -and 
                                            $catSig.SignerCertificate.Subject -match 'Lenovo') {
                                            
                                            $isLenovo = $true
                                            $signatureType = 'Catalog-Lenovo'
                                            $publisher = $catSig.SignerCertificate.Subject
                                            $thumbprint = $catSig.SignerCertificate.Thumbprint
                                            $validFrom = $catSig.SignerCertificate.NotBefore
                                            $validUntil = $catSig.SignerCertificate.NotAfter
                                            $catalogFilesList += $catFile
                                            
                                            Write-Verbose "Found Lenovo-signed catalog: $catFile"
                                            break
                                        }
                                    }
                                }
                            }
                        }
                        
                        # Fallback: Manual catalog search
                        if (-not $isLenovo) {
                            $dir = Split-Path $file.FullName -Parent
                            $catalogFiles = Get-ChildItem -Path $dir -Filter '*.cat' -ErrorAction SilentlyContinue
                            
                            foreach ($catFile in $catalogFiles) {
                                try {
                                    $catSignature = Get-AuthenticodeSignature -FilePath $catFile.FullName -ErrorAction SilentlyContinue
                                    
                                    if ($catSignature.Status -eq 'Valid' -and 
                                        $catSignature.SignerCertificate.Subject -match 'Lenovo') {
                                        
                                        $isLenovo = $true
                                        $signatureType = 'Catalog-Fallback'
                                        $publisher = $catSignature.SignerCertificate.Subject
                                        $thumbprint = $catSignature.SignerCertificate.Thumbprint
                                        $validFrom = $catSignature.SignerCertificate.NotBefore
                                        $validUntil = $catSignature.SignerCertificate.NotAfter
                                        $catalogFilesList += $catFile.FullName
                                        
                                        Write-Verbose "Found Lenovo-signed catalog: $($catFile.Name)"
                                        break
                                    }
                                }
                                catch {
                                    Write-Verbose "Error checking catalog file $($catFile.Name): $($_.Exception.Message)"
                                }
                            }
                        }
                    }
                    catch {
                        Write-Verbose "Catalog signature check failed: $($_.Exception.Message)"
                    }
                }
            }
            
            $duration = ((Get-Date) - $startTime).TotalMilliseconds
            
            # Log result
            if ($isLenovo) {
                Write-Verbose " File is signed by Lenovo ($signatureType): $($file.Name)" }
            else {
                Write-Verbose " File is NOT signed: $($file.Name)"
            }
            
            # Return result
            if ($Detailed) {
                $result = [PSCustomObject]@{
                    PSTypeName = 'Lenovo.SignatureInfo'
                    FileName = $file.Name
                    FilePath = $file.FullName
                    IsLnvSigned = $isLenovo
                    SignatureType = $signatureType
                    TrustStatus = $trustStatus
                    Publisher = $publisher
                    Thumbprint = $thumbprint
                    ValidFrom = $validFrom
                    ValidUntil = $validUntil
                    IsOldCertificate = $isOldCert
                    WinVerifyTrustStatus = $winVerifyStatus
                    CatalogFiles = $catalogFilesList
                    CatalogCount = $catalogFilesList.Count
                    FileSize = $file.Length
                    TestDuration = $duration
                    TestTime = Get-Date
                    Success = $true
                    ErrorMessage = $errorMessage
                }
                
                Write-Output $result
            }
            else {
                Write-Output $isLenovo
            }
        }
        catch {
            Write-Error "Failed to verify signature for '$Path': $($_.Exception.Message)"
            
            if ($Detailed) {
                Write-Output ([PSCustomObject]@{
                    PSTypeName = 'Lenovo.SignatureInfo'
                    FileName = [System.IO.Path]::GetFileName($Path)
                    FilePath = $Path
                    IsLnvSigned = $false
                    SignatureType = 'Error'
                    TrustStatus = $null
                    Publisher = $null
                    Thumbprint = $null
                    ValidFrom = $null
                    ValidUntil = $null
                    IsOldCertificate = $false
                    WinVerifyTrustStatus = $null
                    CatalogFiles = @()
                    CatalogCount = 0
                    FileSize = 0
                    TestDuration = 0
                    TestTime = Get-Date
                    Success = $false
                    ErrorMessage = $_.Exception.Message
                })
            }
            else {
                Write-Output $false
            }
        }
    }
    
    end {
        Write-Verbose "Test-LnvSignature Completed. "
    }
}
# SIG # Begin signature block
# MIItugYJKoZIhvcNAQcCoIItqzCCLacCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUJQPn70do/ao7GnhuDsvjXtxW
# puyggibcMIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0B
# AQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk
# IElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQsw
# CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu
# ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw
# ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz
# 7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS
# 5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7
# bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfI
# SKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jH
# trHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14
# Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2
# h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt
# 6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPR
# iQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ER
# ElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4K
# Jpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAd
# BgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SS
# y4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAC
# hjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURS
# b290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0
# LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRV
# HSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyh
# hyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO
# 0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo
# 8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++h
# UD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5x
# aiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMIIFkDCCA3ig
# AwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG
# EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
# cnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMw
# ODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UE
# ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD
# VQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUA
# A4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Y
# q3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lX
# FllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxe
# TsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbu
# yntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I
# 9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmg
# Z92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse
# 5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKy
# Ebe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwh
# HbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/
# Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwID
# AQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4E
# FgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQADggIBALth2X2p
# bL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY
# ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdN
# Oj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4
# i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJ
# EVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9NcCOGDErcgdLM
# MpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N0XWs0Mr7QbhD
# parTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb/UdK
# Dd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP
# 0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLS
# oCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9T
# dSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+MIIGsDCCBJigAwIBAgIQCK1AsmDS
# nEyfXs2pvZOu2TANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UE
# ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD
# VQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjEwNDI5MDAwMDAwWhcN
# MzYwNDI4MjM1OTU5WjBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs
# IEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5n
# IFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
# MIICCgKCAgEA1bQvQtAorXi3XdU5WRuxiEL1M4zrPYGXcMW7xIUmMJ+kjmjYXPXr
# NCQH4UtP03hD9BfXHtr50tVnGlJPDqFX/IiZwZHMgQM+TXAkZLON4gh9NH1MgFcS
# a0OamfLFOx/y78tHWhOmTLMBICXzENOLsvsI8IrgnQnAZaf6mIBJNYc9URnokCF4
# RS6hnyzhGMIazMXuk0lwQjKP+8bqHPNlaJGiTUyCEUhSaN4QvRRXXegYE2XFf7JP
# hSxIpFaENdb5LpyqABXRN/4aBpTCfMjqGzLmysL0p6MDDnSlrzm2q2AS4+jWufcx
# 4dyt5Big2MEjR0ezoQ9uo6ttmAaDG7dqZy3SvUQakhCBj7A7CdfHmzJawv9qYFSL
# ScGT7eG0XOBv6yb5jNWy+TgQ5urOkfW+0/tvk2E0XLyTRSiDNipmKF+wc86LJiUG
# soPUXPYVGUztYuBeM/Lo6OwKp7ADK5GyNnm+960IHnWmZcy740hQ83eRGv7bUKJG
# yGFYmPV8AhY8gyitOYbs1LcNU9D4R+Z1MI3sMJN2FKZbS110YU0/EpF23r9Yy3IQ
# KUHw1cVtJnZoEUETWJrcJisB9IlNWdt4z4FKPkBHX8mBUHOFECMhWWCKZFTBzCEa
# 6DgZfGYczXg4RTCZT/9jT0y7qg0IU0F8WD1Hs/q27IwyCQLMbDwMVhECAwEAAaOC
# AVkwggFVMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFGg34Ou2O/hfEYb7
# /mF7CIhl9E5CMB8GA1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1Ud
# DwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDAzB3BggrBgEFBQcBAQRrMGkw
# JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcw
# AoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJv
# b3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQu
# Y29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwHAYDVR0gBBUwEzAHBgVngQwB
# AzAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQADggIBADojRD2NCHbuj7w6mdNW4AIa
# pfhINPMstuZ0ZveUcrEAyq9sMCcTEp6QRJ9L/Z6jfCbVN7w6XUhtldU/SfQnuxaB
# RVD9nL22heB2fjdxyyL3WqqQz/WTauPrINHVUHmImoqKwba9oUgYftzYgBoRGRjN
# YZmBVvbJ43bnxOQbX0P4PpT/djk9ntSZz0rdKOtfJqGVWEjVGv7XJz/9kNF2ht0c
# sGBc8w2o7uCJob054ThO2m67Np375SFTWsPK6Wrxoj7bQ7gzyE84FJKZ9d3OVG3Z
# XQIUH0AzfAPilbLCIXVzUstG2MQ0HKKlS43Nb3Y3LIU/Gs4m6Ri+kAewQ3+ViCCC
# cPDMyu/9KTVcH4k4Vfc3iosJocsL6TEa/y4ZXDlx4b6cpwoG1iZnt5LmTl/eeqxJ
# zy6kdJKt2zyknIYf48FWGysj/4+16oh7cGvmoLr9Oj9FpsToFpFSi0HASIRLlk2r
# REDjjfAVKM7t8RhWByovEMQMCGQ8M4+uKIw8y4+ICw2/O/TOHnuO77Xry7fwdxPm
# 5yg/rBKupS8ibEH5glwVZsxsDsrFhsP2JjMMB0ug0wcCampAMEhLNKhRILutG4UI
# 4lkNbcoFUCvqShyepf2gpx8GdOfy1lKQ/a+FSCH5Vzu0nAPthkX0tGFuv2jiJmCG
# 6sivqf6UHedjGzqGVnhOMIIGtDCCBJygAwIBAgIQDcesVwX/IZkuQEMiDDpJhjAN
# BgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg
# SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2Vy
# dCBUcnVzdGVkIFJvb3QgRzQwHhcNMjUwNTA3MDAwMDAwWhcNMzgwMTE0MjM1OTU5
# WjBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNV
# BAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYgU0hB
# MjU2IDIwMjUgQ0ExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtHgx
# 0wqYQXK+PEbAHKx126NGaHS0URedTa2NDZS1mZaDLFTtQ2oRjzUXMmxCqvkbsDpz
# 4aH+qbxeLho8I6jY3xL1IusLopuW2qftJYJaDNs1+JH7Z+QdSKWM06qchUP+AbdJ
# gMQB3h2DZ0Mal5kYp77jYMVQXSZH++0trj6Ao+xh/AS7sQRuQL37QXbDhAktVJMQ
# bzIBHYJBYgzWIjk8eDrYhXDEpKk7RdoX0M980EpLtlrNyHw0Xm+nt5pnYJU3Gmq6
# bNMI1I7Gb5IBZK4ivbVCiZv7PNBYqHEpNVWC2ZQ8BbfnFRQVESYOszFI2Wv82wnJ
# RfN20VRS3hpLgIR4hjzL0hpoYGk81coWJ+KdPvMvaB0WkE/2qHxJ0ucS638ZxqU1
# 4lDnki7CcoKCz6eum5A19WZQHkqUJfdkDjHkccpL6uoG8pbF0LJAQQZxst7VvwDD
# jAmSFTUms+wV/FbWBqi7fTJnjq3hj0XbQcd8hjj/q8d6ylgxCZSKi17yVp2NL+cn
# T6Toy+rN+nM8M7LnLqCrO2JP3oW//1sfuZDKiDEb1AQ8es9Xr/u6bDTnYCTKIsDq
# 1BtmXUqEG1NqzJKS4kOmxkYp2WyODi7vQTCBZtVFJfVZ3j7OgWmnhFr4yUozZtqg
# PrHRVHhGNKlYzyjlroPxul+bgIspzOwbtmsgY1MCAwEAAaOCAV0wggFZMBIGA1Ud
# EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFO9vU0rp5AZ8esrikFb2L9RJ7MtOMB8G
# A1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjAT
# BgNVHSUEDDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGG
# GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2Nh
# Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYD
# VR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0
# VHJ1c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9
# bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQAXzvsWgBz+Bz0RdnEwvb4LyLU0pn/N0IfF
# iBowf0/Dm1wGc/Do7oVMY2mhXZXjDNJQa8j00DNqhCT3t+s8G0iP5kvN2n7Jd2E4
# /iEIUBO41P5F448rSYJ59Ib61eoalhnd6ywFLerycvZTAz40y8S4F3/a+Z1jEMK/
# DMm/axFSgoR8n6c3nuZB9BfBwAQYK9FHaoq2e26MHvVY9gCDA/JYsq7pGdogP8HR
# trYfctSLANEBfHU16r3J05qX3kId+ZOczgj5kjatVB+NdADVZKON/gnZruMvNYY2
# o1f4MXRJDMdTSlOLh0HCn2cQLwQCqjFbqrXuvTPSegOOzr4EWj7PtspIHBldNE2K
# 9i697cvaiIo2p61Ed2p8xMJb82Yosn0z4y25xUbI7GIN/TpVfHIqQ6Ku/qjTY6hc
# 3hsXMrS+U0yy+GWqAXam4ToWd2UQ1KYT70kZjE4YtL8Pbzg0c1ugMZyZZd/BdHLi
# Ru7hAWE6bTEm4XYRkA6Tl4KSFLFk43esaUeqGkH/wyW4N7OigizwJWeukcyIPbAv
# jSabnf7+Pu0VrFgoiovRDiyx3zEdmcif/sYQsfch28bZeUz2rtY/9TCA6TD8dC3J
# E3rYkrhLULy7Dc90G6e8BlqmyIjlgp2+VqsS9/wQD7yFylIz0scmbKvFoW2jNrbM
# 1pD2T7m3XDCCBu0wggTVoAMCAQICEAqA7xhLjfEFgtHEdqeVdGgwDQYJKoZIhvcN
# AQELBQAwaTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEw
# PwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2
# IFNIQTI1NiAyMDI1IENBMTAeFw0yNTA2MDQwMDAwMDBaFw0zNjA5MDMyMzU5NTla
# MGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UE
# AxMyRGlnaUNlcnQgU0hBMjU2IFJTQTQwOTYgVGltZXN0YW1wIFJlc3BvbmRlciAy
# MDI1IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDQRqwtEsae0Oqu
# YFazK1e6b1H/hnAKAd/KN8wZQjBjMqiZ3xTWcfsLwOvRxUwXcGx8AUjni6bz52fG
# Tfr6PHRNv6T7zsf1Y/E3IU8kgNkeECqVQ+3bzWYesFtkepErvUSbf+EIYLkrLKd6
# qJnuzK8Vcn0DvbDMemQFoxQ2Dsw4vEjoT1FpS54dNApZfKY61HAldytxNM89PZXU
# P/5wWWURK+IfxiOg8W9lKMqzdIo7VA1R0V3Zp3DjjANwqAf4lEkTlCDQ0/fKJLKL
# kzGBTpx6EYevvOi7XOc4zyh1uSqgr6UnbksIcFJqLbkIXIPbcNmA98Oskkkrvt6l
# PAw/p4oDSRZreiwB7x9ykrjS6GS3NR39iTTFS+ENTqW8m6THuOmHHjQNC3zbJ6nJ
# 6SXiLSvw4Smz8U07hqF+8CTXaETkVWz0dVVZw7knh1WZXOLHgDvundrAtuvz0D3T
# +dYaNcwafsVCGZKUhQPL1naFKBy1p6llN3QgshRta6Eq4B40h5avMcpi54wm0i2e
# PZD5pPIssoszQyF4//3DoK2O65Uck5Wggn8O2klETsJ7u8xEehGifgJYi+6I03Uu
# T1j7FnrqVrOzaQoVJOeeStPeldYRNMmSF3voIgMFtNGh86w3ISHNm0IaadCKCkUe
# 2LnwJKa8TIlwCUNVwppwn4D3/Pt5pwIDAQABo4IBlTCCAZEwDAYDVR0TAQH/BAIw
# ADAdBgNVHQ4EFgQU5Dv88jHt/f3X85FxYxlQQ89hjOgwHwYDVR0jBBgwFoAU729T
# SunkBnx6yuKQVvYv1Ensy04wDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoG
# CCsGAQUFBwMIMIGVBggrBgEFBQcBAQSBiDCBhTAkBggrBgEFBQcwAYYYaHR0cDov
# L29jc3AuZGlnaWNlcnQuY29tMF0GCCsGAQUFBzAChlFodHRwOi8vY2FjZXJ0cy5k
# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRUaW1lU3RhbXBpbmdSU0E0MDk2
# U0hBMjU2MjAyNUNBMS5jcnQwXwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL2NybDMu
# ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0VGltZVN0YW1waW5nUlNBNDA5
# NlNIQTI1NjIwMjVDQTEuY3JsMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG
# /WwHATANBgkqhkiG9w0BAQsFAAOCAgEAZSqt8RwnBLmuYEHs0QhEnmNAciH45PYi
# T9s1i6UKtW+FERp8FgXRGQ/YAavXzWjZhY+hIfP2JkQ38U+wtJPBVBajYfrbIYG+
# Dui4I4PCvHpQuPqFgqp1PzC/ZRX4pvP/ciZmUnthfAEP1HShTrY+2DE5qjzvZs7J
# IIgt0GCFD9ktx0LxxtRQ7vllKluHWiKk6FxRPyUPxAAYH2Vy1lNM4kzekd8oEARz
# FAWgeW3az2xejEWLNN4eKGxDJ8WDl/FQUSntbjZ80FU3i54tpx5F/0Kr15zW/mJA
# xZMVBrTE2oi0fcI8VMbtoRAmaaslNXdCG1+lqvP4FbrQ6IwSBXkZagHLhFU9HCrG
# /syTRLLhAezu/3Lr00GrJzPQFnCEH1Y58678IgmfORBPC1JKkYaEt2OdDh4GmO0/
# 5cHelAK2/gTlQJINqDr6JfwyYHXSd+V08X1JUPvB4ILfJdmL+66Gp3CSBXG6IwXM
# ZUXBhtCyIaehr0XkBoDIGMUG1dUtwq1qmcwbdUfcSYCn+OwncVUXf53VJUNOaMWM
# ts0VlRYxe5nK+At+DI96HAlXHAL5SlfYxJ7La54i71McVWRP66bW+yERNpbJCjyC
# YG2j+bdpxo/1Cy4uPcU3AWVPGrbn5PhDBf3Froguzzhk++ami+r3Qrx5bIbY3TVz
# giFI7Gq3zWcwggdWMIIFPqADAgECAhADMlFYfN/evhzf5XYSzZUnMA0GCSqGSIb3
# DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFB
# MD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5
# NiBTSEEzODQgMjAyMSBDQTEwHhcNMjUwMzIwMDAwMDAwWhcNMjYwNjAzMjM1OTU5
# WjBeMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExFDASBgNV
# BAcTC01vcnJpc3ZpbGxlMQ8wDQYDVQQKEwZMZW5vdm8xDzANBgNVBAMTBkxlbm92
# bzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOPjJ/+Kdi4SqmdpYRYm
# 5E/ctl9H/KHwC3GK10hQmHGetCCuJkcx+STyvxLIuuzh6CIupbxzDPXQ2x2/5jA6
# 2EROThgMKl/0fV+hwvZhVl45idBUi0qo+91jYeK9kXjjLrxXEsX6A5Uu4Lgl56vr
# 8h6cGZg/te9ozF3k2JN80MIzSj/F769/ZpuGq9i4j1HQ7xq/aoXFlrTD86zSC7YG
# AVU5PSU06ZOOTMAAvGm7ifKv/xQyeO8EE4acIgFB5a8RRC0JQj19eIRBhtfkh1dy
# TX/ocPdsBQICpqo0VXvRb/9iaHj3+r9CWSPtx0kQxRkpHMv/qCtM7kBscljbejLA
# VOXuhWKmNemNGIu7UMIZyro3+XzI4s1biJlGp6bTShs02EbmzlyUJTgithsYgC5n
# X/WRcaHbshvy5S1EJo8m1fi5v/4bj9OTBUOjaYAVKvOjzYE7QR4PhuN/ww8HpGdR
# jLS/eS8Sz3Jxz7EVApPNSzwycDkxAR6Y0w4ymaGy3ZnTOUJjESfwqJvqigjYMcbZ
# +LJOqbLE6bQEmQ+tZiclcdoU4FhleAqQlfksb9kLc5GcU23uIp1aKQ1nji6pxMif
# IHtE5OcMgJzy60tyX/dPpxBGbR3l6+K02v5KI1/GtrVSWxvJHKlXnIMQ4EcgIZBz
# U+NPRgmPG7ZSzYRhpZl/+PrhAgMBAAGjggIDMIIB/zAfBgNVHSMEGDAWgBRoN+Dr
# tjv4XxGG+/5hewiIZfROQjAdBgNVHQ4EFgQUcBJh2GrEdlUHxwi/fkRtYI55VfAw
# PgYDVR0gBDcwNTAzBgZngQwBBAEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5k
# aWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEF
# BQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRwOi8vY3JsMy5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIx
# Q0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0
# VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwgZQG
# CCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
# dC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E
# aWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEu
# Y3J0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggIBACeB1ob7bkUKbCC40mTr
# HpXQHQbaeE7ymacNpXKyHefcQij+Op9DsduyOHNLbEojHm24k8GiGjx3ZnaZGKTh
# RQHiijGN+H8Qy27SDvw2MzLnyB7XNg+uCPqIf6xWLdtdQ65T7MaBon6BIX/shzxQ
# t+Jpkr1+qcAP6wWCQ0Q0W5I0w5PKb19dMaT26mw6mnGd06pnTvgpCVRnVy8UJtb7
# Ltt7dfE1G0Cz3LdWW9iBVCI73n/DGWhO8fbiK4D4NpdiNnWVfsxhJ7DSb+6RKJXP
# eG3GwGbmuyDD3D2N9mJnW/6VYAiBwnewGRqwA6D20QKPB0QFHlqVHwkyoYIynVcE
# dfM4K3dtxP8mh6IrEEbWfctNLRgnvRsEE/GnAEmpHxLyzWRx+FILzlaZmRPSyYAO
# O8bE4nWNOTKLdpa/OMum6r/qDJmjcLs80aqMlRiG1k4F2grobscDV+lzy65du9+W
# a8qUeY6rZsnHK02DGOf4iWLqEgaUf36QH10MUpGgj/dkK5cwLCpA1+/d+mySgEF3
# 1N2RHkf5bRVq0DsR8AGT76npVtpyRdnIlIHksfB0G8dDjioKEzCneATEUkketoL1
# ML+ZOcM8t2uURmjK8ZecklHZF74jmrkYVyve2HrxcHOr2qPuwOkRQ5NLnYluYKQo
# Qv4KrbHKxS/bQKd55kJZVzTbMYIGSDCCBkQCAQEwfTBpMQswCQYDVQQGEwJVUzEX
# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0
# ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhADMlFY
# fN/evhzf5XYSzZUnMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgACh
# AoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAM
# BgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBSuyxF1qVk3gInnqEwtHNdgNBgd
# WzANBgkqhkiG9w0BAQEFAASCAgAw8mTx8VkGe59AraBu/vnS4exjiG5o9uroQ8o4
# xFL2tx1Jf5xzlfD5o0F6M1WiblvgJdm2o2XSE6Sx1Ws6PhVmRDc+KYQDLditJf0G
# HgCBnsvsao3Q9b61v69k+dMqFWOk3UgxQA5wn98ooAs9y0Sv5olDdv1HWGR4CRQU
# EttKZY9/VjD2v0m8YUOgG6Ars9+TfyjVdTIzHJpuoLS7hAbRqhckOe0XQwGhr+C+
# SsE4QKjxZYsg0Dx2qQ0Pw23iIf2J/mdp+waS1Zf7IQEjexfXAvPXGSR0r1926V4B
# 4nDjUkDSJmmkAzvCJFfEu3wsAPak5nonpKXqYh3/pj6efH2lKN1cmMB4gK+u6BBs
# sfF+z+nGki8Qn4JznPNaVsm3xYFonDxp5+G9/7RIWzMd8dPbRBEUnJGgRUbGdVf1
# Ss8KZh5/TxnDfYb7j+CdyQ7+zQHPT+29RYAR/xi4KO1FHKlkq/ANSx8EtoT4apMJ
# uhZDlH/Q1YL4Z+b3+GQ4QtJWa7XV7VcotpibTzF2TQx05OdIyttkArvFn/1JVnmv
# IHN106bTJ3gZ8nwxb5c6ixmQaQOD60BJvjMFu6+HnjHOOAxfYWhrBj7YVE9sN+fL
# 73SdtomMbXQ2DGxmGUxBpP2wroTm+0Haw5ts09w/ZpAvxOtMa7ZkLDwU/eWopGSG
# O5VbDKGCAyYwggMiBgkqhkiG9w0BCQYxggMTMIIDDwIBATB9MGkxCzAJBgNVBAYT
# AlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQg
# VHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTEC
# EAqA7xhLjfEFgtHEdqeVdGgwDQYJYIZIAWUDBAIBBQCgaTAYBgkqhkiG9w0BCQMx
# CwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yNjAxMjMxNjQ2NDdaMC8GCSqG
# SIb3DQEJBDEiBCCgnN3ebdIKmC4XcWamlVCcyouOlodaRMdP4k02CPczTTANBgkq
# hkiG9w0BAQEFAASCAgCHiB3kOk60PduVg0bXvmEuZvYzSnOeHTwCvgu9r2P0NJPw
# WbKHWL+HmACOcIdSJbdaYQwbvO6m9OilDjuoh1y/HU13F0eBi8v10vahdP+Twjc0
# 7AIGauIRbaDh7RoIVz3YXLY4LuY6AnPtlitlW024P4DP6gf8IpUIbQXcC7CkzgPr
# NHJQlDlpPuc1i9CpKlM0UHQWGtcfRBDwRZez+TudvNwF3JHN4PT3SEJW+O8AJJ3Z
# JbrBa31+nwP/PYiOnJiyP9+yDLm4B8yZS1NUqsXfg0FoHyKUVTB9Dxlz3Mkve+na
# CHgf923RcH0Ii+GkMyTdHzOVkDLu/wpAnyC2WtQ2AFcJaGEDIyumYJXjKrSPIUPh
# achkCk28L1k5REEdAEVTWC9+ItyQGL25cCi17TGUihKMYnIAcWK8eDYVoU4dwbWL
# a6d1ytXCPj7HiadhMuVfZUcxqwMo552jD06oHz5TN570Isq5oEwNr+RJk9bj4XiO
# fUmMuXV5kl4k1IcZaYaooGU8FgV9/PirsN3H3czalsN0CiLCwbGbYd4Rtm436V6M
# 3+o+ouIB8+mFII7aFmJ/Emx3V/HWLaZfwaxUJNDK5Tx/VCqhlsr8eLD73Fm34taA
# 1RIhROmLD5gYa5Po1/pPDYq+MHpsP4XvztBlzA2O4Xp70tTKLj8c6wcQJ3K75Q==
# SIG # End signature block