AzStackHciConnectivity/AzStackHci.Connectivity.psm1

<#############################################################
 # #
 # Copyright (C) Microsoft Corporation. All rights reserved. #
 # #
 #############################################################>


Import-Module $PSScriptRoot\AzStackHci.Connectivity.Helpers.psm1 -Force -DisableNameChecking -Global
Import-Module $PSScriptRoot\..\AzStackHci.EnvironmentChecker.Utilities.psm1 -Force -DisableNameChecking -Global
Import-Module $PSScriptRoot\..\AzStackHci.EnvironmentChecker.Reporting.psm1 -Force -DisableNameChecking -Global
Import-LocalizedData -BindingVariable lcTxt -FileName AzStackHci.Connectivity.Strings.psd1
function Invoke-AzStackHciConnectivityValidation
{
    <#
    .SYNOPSIS
        Perform AzStackHci Network Validation
    .DESCRIPTION
        Perform AzStackHci Network Validation against a mandatory set of endpoints.
    .EXAMPLE
        PS C:\> Invoke-AzStackHciConnectivityValidation
        Perform network validation against all built in service targets from localhost.
    .EXAMPLE
        PS C:\> $Credential = Get-Credential -Message "Credential for local cluster"
        PS C:\> Invoke-AzStackHciConnectivityValidation -Credential $Credential
        Perform network validation against all built in service targets from all cluster nodes of local system.
    .EXAMPLE
        PS C:\> Invoke-AzStackHciConnectivityValidation -Service 'Azure Kubernetes Service'
        Perform network validation against all mandatory targets and Azure Kubernetes targets from localhost.
    .EXAMPLE
        PS C:\> Invoke-AzStackHciConnectivityValidation -Include 'Windows Admin Center','Windows Admin Center in Azure Portal'
        Perform network validation against all mandatory targets, Windows Admin Center targets and Windows Admin Center in Azure Portal targets from localhost.
    .EXAMPLE
        PS C:\> Invoke-AzStackHciConnectivityValidation -Exclude 'Qualys','Arc For Servers'
        Perform network validation against all targets excluding Qualys & Arc for Servers from localhost.
    .EXAMPLE
        PS C:\> $Credential = Get-Credential -Message "Credential for $RemoteSystem"
        PS C:\> $RemoteSystemSession = New-PSSession -Computer 10.0.0.4 -Credential $Credential
        PS C:\> Invoke-AzStackHciConnectivityValidation -PsSession $RemoteSystemSession
        Perform network validation against all built in service target from pre-existing remote PS session.
    .EXAMPLE
        PS C:\> $RemoteSystem = 'node01.contoso.com'
        PS C:\> $Credential = Get-Credential -Message "Credential for $RemoteSystem"
        PS C:\> Invoke-AzStackHciConnectivityValidation -ComputerName $RemoteSystem -Credential $Credential
        Perform network validation against all built in service target from a remote system.
    .EXAMPLE
        PS C:\> Invoke-AzStackHciConnectivityValidation -RegionName EastUS -ARCGateway
        Perform network validation for ARCGateway support in EastUS region.
    .PARAMETER PsSession
        Specify the PsSession(s) used to validation from. If null the local machine will be used.
    .PARAMETER Service
        Specify the services to target for connectivity validation. (Aliases: Include)
    .PARAMETER OperationType
        Specify the Operation Type to target for connectivity validation. e.g. Deployment, Update, etc.
    .PARAMETER Exclude
        Specify the services to exclude for connectivity validation.
    .PARAMETER Proxy
        Specify proxy server.
    .PARAMETER ProxyCredential
        Specify proxy server credential.
    .PARAMETER CustomDefinitionUri
        Specify a Uri to retrieve a custom definition of endpoints to check.
    .PARAMETER RuntimeConnectivityTarget
        Specify runtime targets. Must contain DisplayName, Description, Service, Endpoint, Protocol, Severity, Remediation. e.g. @{'DisplayName'='Bing Home';'Description'='Bing Homepage';'Service'='Bing';'Endpoint'='bing.com';'Protocol'='HTTPS'; 'Severity'='CRITICAL'; 'Remediation' = 'https://aka.ms/myserviceconnnectionrequirements}
    .PARAMETER UseLocalDefinitionsOnly
        Retrieve endpoint definitions locally.
    .PARAMETER RegionName
        Specify the region name to target for connectivity validation.
    .PARAMETER ARCGatewayName
        Specify the ARC Gateway Name support to target for connectivity validation. It will be similar to contoso.gw.arc.azure.net, where contoso is unique for each gateway.
    .PARAMETER PassThru
        Return PSObject result.
    .PARAMETER HardwareClass
        Hardware class: Small, Medium, or Large.
    .PARAMETER OutputPath
        Directory path for log and report output.
    .PARAMETER CleanReport
        Remove all previous progress and create a clean report.
    .INPUTS
        Inputs (if any)
    .OUTPUTS
        Output (if any)
    .LINK
        https://docs.microsoft.com/en-us/azure-stack/hci/manage/use-environment-checker?tabs=connectivity
    .NOTES
        Mandatory Targets are always invoked, unless explicitly excluded. Use Get-AzStackHciConnectivityTarget | Select Service, Title, Mandatory, Endpoint for more information.
        File-based exclusions can be made by creating a file exlcudetests.txt in the root modules root folder (e.g. PSModulePath\AzStackHci.EnvironmentChecker\<version>).
        This file can support multiple exclusions for all validators e.g.
        --Start sample--
        Test-Processor
        Observability
        microsoftonline
        --End sample--
        This file would have the following affect. After any include/exclude filtering from the parameter inputs:
        Invoke-AzStackHciHardwareValidation would exclude Test-Processor in its tests
        Invoke-AzStackHciConnectivityValidation would exclude the Observability service AND any service target who's endpoints contains a match for microsoftonline.
    #>

    [CmdletBinding()]
    param (

        [Parameter(Mandatory = $false, HelpMessage = "Specify the PsSession(s) used to validation from. If null the local machine will be used.")]
        [System.Management.Automation.Runspaces.PSSession[]]
        $PsSession,

        [Parameter(Mandatory = $false, HelpMessage = "Specify the services to target for connectivity validation.")]
        #[ArgumentCompleter({ Get-AzStackHciConnectivityServiceName })]
        [ValidateScript({ $_ -in (Get-AzStackHciConnectivityServiceName) })]
        [Alias("Include")]
        [string[]]
        $Service,

        [Parameter(Mandatory = $false, HelpMessage = "Specify the Operation Type to target for connectivity validation. e.g. Deployment, Update, etc...")]
        #[ArgumentCompleter({ Get-AzStackHciConnectivityOperationName })]
        [ValidateScript({ $_ -in (Get-AzStackHciConnectivityOperationName) })]
        [string[]]
        $OperationType,

        [Parameter(Mandatory = $false, HelpMessage = "Specify the services to exclude for connectivity validation.")]
        #[ArgumentCompleter({ Get-AzStackHciConnectivityServiceName })]
        [ValidateScript({ $_ -in (Get-AzStackHciConnectivityServiceName) })]
        [string[]]
        $Exclude,

        [Parameter(Mandatory = $false, HelpMessage = "Specify proxy server.")]
        [string]
        $Proxy,

        [Parameter(Mandatory = $false, HelpMessage = "Specify proxy server credential.")]
        [pscredential]
        $ProxyCredential,

        [Parameter(Mandatory = $false, HelpMessage = "Specify a Uri to retrieve a custom definition of endpoints to check.")]
        [system.uri]
        $CustomDefinitionUri,

        [Parameter(Mandatory = $false, HelpMessage = "Specify runtime targets. Must contain DisplayName, Description, Service, Endpoint, Protocol, Severity, Remediation. e.g. @{'DisplayName'='Bing Home';'Description'='Bing Homepage';'Service'='Bing';'Endpoint'='bing.com';'Protocol'='HTTPS'; 'Severity'='CRITICAL'; 'Remediation' = 'https://aka.ms/myserviceconnnectionrequirements}")]
        [psobject[]]
        $RuntimeConnectivityTarget,

        [Parameter(Mandatory = $false, HelpMessage = "Retrieve endpoint definitions locally.")]
        [switch]
        $UseLocalDefinitionsOnly,

        [Parameter(Mandatory = $false, HelpMessage = "Specify the region name to target for connectivity validation.")]
        [string]
        $RegionName,

        [Parameter(Mandatory = $false, HelpMessage = "Specify the ARC Gateway scenario")]
        [switch]
        $ARCGateway,

        [Parameter(Mandatory = $false, HelpMessage = "Return PSObject result.")]
        [switch]
        $PassThru,

        [Parameter(Mandatory = $false, HelpMessage = "Hardware class: Small, Medium, or Large")]
        [ValidateSet('Small','Medium','Large')]
        [String]
        $HardwareClass = "Medium",

        [Parameter(Mandatory = $false, HelpMessage = "Directory path for log and report output")]
        [string]$OutputPath,

        [Parameter(Mandatory = $false, HelpMessage = "Remove all previous progress and create a clean report")]
        [switch]$CleanReport = $false

    )

    try
    {
        $script:ErrorActionPreference = 'Stop'
        Set-AzStackHciOutputPath -Path $OutputPath

        Write-AzStackHciHeader -invocation $MyInvocation -params $PSBoundParameters -PassThru:$PassThru
        Test-ModuleUpdate -PassThru:$PassThru

        # Call/Initialise reporting
        $envcheckerReport = Get-AzStackHciEnvProgress -clean:$CleanReport
        $envcheckerReport = Add-AzStackHciEnvJob -report $envcheckerReport

        # Validate customdefinition
        if ($CustomDefinitionUri)
        {
            Validate-CustomDefinitionUri -Uri $CustomDefinitionUri
        }
        # Validate any runtime targets
        if ($RuntimeConnectivityTarget)
        {
            Validate-RuntimeConnectivityTarget -RuntimeConnectivityTarget $RuntimeConnectivityTarget
        }

        # Add ARCGateway to the list of targets
        if ( -not $ARCGateway)
        {
            # attempt to detect if the user is using the ARCGateway scenario
            $azcmagent =  "$env:ProgramW6432\AzureConnectedMachineAgent\azcmagent.exe"
            if (Test-Path $azcmagent)
            {
                Log-Info "Detected Azure Connected Machine Agent" -Type INFO
                $arcConnectionType =  & $azcmagent config get connection.type
                if ( $arcConnectionType -eq "gateway")
                {
                    $ARCGateway = $true
                }
            }
            else
            {
                Log-Info "Azure Connected Machine Agent not detected" -Type INFO
            }
        }

        # Set default region name
        if ([string]::IsNullOrEmpty($RegionName))
        {
            $RegionName = 'Global'
        }

        # TO DO: Omit system?
        $gtParams = @{}
        if ($PSBoundParameters.ContainsKey('Service')) { $gtParams.Service = $Service }
        if ($PSBoundParameters.ContainsKey('OperationType')) { $gtParams.OperationType = $OperationType }
        if ($PSBoundParameters.ContainsKey('CustomDefinitionUri')) { $gtParams.Uri = $CustomDefinitionUri }
        if ($PSBoundParameters.ContainsKey('RuntimeConnectivityTarget')) { $gtParams.RuntimeConnectivityTarget = $RuntimeConnectivityTarget }
        if ($PSBoundParameters.ContainsKey('UseLocalDefinitionsOnly')) { $gtParams.LocalOnly = $UseLocalDefinitionsOnly }
        $gtParams.RegionName = $RegionName
        if ($RegionName -eq 'AzureLocal') { $gtParams.LocalOnly = $true }
        $ConnectivityTargets = Get-AzStackHciConnectivityTarget @gtParams -ARCGateway:$ARCGateway
        $ConnectivityTargets = Select-AzStackHciConnectivityTarget -Targets $ConnectivityTargets -Exclude $Exclude

        Write-Progress -Id 1 -Activity "Checking AzStackHci Dependancies" -Status "Environment configuration" -PercentComplete 0 -ErrorAction SilentlyContinue

        # Run validation
        $i = 0
        $webResult = @()
        $diagnosticResults = @()
        $skipTests = $false
        if ($PsSession)
        {
            # Collect proxy info before TLS inspection probe.
            # ARCGateway flag omits consistency checks because they are not applicable.
            $diagnosticResults += Get-ProxyDiagnostics -PsSession $PsSession -ARCGateway:$ARCGateway
            foreach ($Session in $PsSession)
            {
                if ($Session.State -ne 'Opened')
                {
                    try
                    {
                        Connect-PSSession -Session $Session
                    }
                    catch
                    {
                        $PsSessionFail = $lcTxt.PsSessionFail -f $Session.ComputerName, $_.Exception.Message
                        Log-Info ($PsSessionFail) -type Error
                        throw $PsSessionFail
                    }
                }
                $diagnosticResults += Test-Dns -PsSession $Session -RegionName $RegionName
                # DNS must succeed when user doesn't specify a proxy.
                # If user specifies proxy, we will continue with other diagnostic tests and
                # lower the severity of the dns test, because external resolution could be done by proxy.
                if ($diagnosticResults[-1].Status -ne 'SUCCESS')
                {
                    if ([string]::IsNullOrEmpty($PSBoundParameters['Proxy']))
                    {
                        throw ($lcTxt.DnsFail -f $Session.ComputerName, ($diagnosticResults[-1].AdditionalData.Detail -join "`r`n"))
                    }
                    else
                    {
                        Log-Info ($lcTxt.DnsDowngrade -f $Session.ComputerName) -Type Warning
                        $diagnosticResults[-1].Severity = 'WARNING'
                    }
                }
                if (($diagnosticResults | Where-Object Severity -eq Critical).Status -contains 'FAILURE')
                {
                    $failedDiagnosticResult = $diagnosticResults | Where-Object {$_.Status -EQ 'FAILURE' -and $_.Severity -eq 'CRITICAL'} | Format-List | Out-String
                    $failedDiagnosticDetailMsg = ($diagnosticResults | Where-Object {$_.Status -EQ 'FAILURE' -and $_.Severity -eq 'CRITICAL'} | Select-Object -ExpandProperty AdditionalData).Detail -join "`r`n"
                    Log-Info ($lcTxt.DiagnosticSystemFailure -f $failedDiagnosticDetailMsg, $failedDiagnosticResult) -Type Critical -ConsoleOut
                    $skipTests = $true
                }

                # Tolerance on SSL inspection: any success is good enough.
                if ($RegionName -ne 'AzureLocal')
                {
                    $sslInspectionResults = @()
                    $sslInspectionResults += Test-RootCA -PsSession $Session -Proxy $Proxy -ProxyCredential $ProxyCredential
                    $diagnosticResults += $sslInspectionResults
                    if ($sslInspectionResults.Status -notcontains 'SUCCESS')
                    {
                        $failedDiagnosticResult = $sslInspectionResults | Where-Object {$_.Status -EQ 'FAILURE'} | Format-List | Out-String
                        $failedDiagnosticDetailMsg = ($sslInspectionResults | Where-Object {$_.Status -EQ 'FAILURE'} | Select-Object -ExpandProperty AdditionalData).Detail -join "`r`n"
                        Log-Info ($lcTxt.DiagnosticSystemFailure -f $failedDiagnosticDetailMsg, $failedDiagnosticResult) -Type Critical -ConsoleOut
                        $skipTests = $true
                    }
                }

            }
            if (-not $skipTests)
            {
                # Run connectivity tests
                $webResult += Invoke-WebRequestEx -Target $ConnectivityTargets -PsSession $PsSession -Proxy $Proxy -ProxyCredential $ProxyCredential
            }
        }
        else
        {
            $diagnosticResults += Test-Dns -RegionName $RegionName
            # DNS must succeed when user doesn't specify proxy.
            # If user specifies proxy, we will continue with other diagnostic tests and
            # lower the severity of the dns test, because external resolution could be done by proxy.
            if ($diagnosticResults[-1].Status -ne 'SUCCESS')
            {
                if ([string]::IsNullOrEmpty($PSBoundParameters['Proxy']))
                {
                    throw ($lcTxt.DnsFail -f $ENV:COMPUTERNAME, ($diagnosticResults[-1].AdditionalData.Detail -join "`r`n"))
                }
                else
                {
                    Log-Info ($lcTxt.DnsDowngrade -f $ENV:COMPUTERNAME) -Type Warning
                    $diagnosticResults[-1].Severity = 'WARNING'
                }
            }
            # ARCGateway flag omits consistency checks because they are not applicable.
            $diagnosticResults += Get-ProxyDiagnostics -ARCGateway:$ARCGateway
            if (($diagnosticResults | Where-Object Severity -eq Critical).Status -contains 'FAILURE')
            {
                $failedDiagnosticResult = $diagnosticResults | Where-Object {$_.Status -EQ 'FAILURE' -and $_.Severity -eq 'CRITICAL'} | Format-List | Out-String
                $failedDiagnosticDetailMsg = ($diagnosticResults | Where-Object {$_.Status -EQ 'FAILURE' -and $_.Severity -eq 'CRITICAL'} | Select-Object -ExpandProperty AdditionalData).Detail -join "`r`n"
                Log-Info ($lcTxt.DiagnosticSystemFailure -f $failedDiagnosticDetailMsg, $failedDiagnosticResult) -Type Critical -ConsoleOut
                $skipTests = $true
            }

            # Tolerance on SSL inspection: any success is good enough.
            if ($RegionName -ne 'AzureLocal')
            {
                $sslInspectionResults = @()
                $sslInspectionResults += Test-RootCA -Proxy $Proxy -ProxyCredential $ProxyCredential
                $diagnosticResults += $sslInspectionResults
                if ($sslInspectionResults.Status -notcontains 'SUCCESS')
                {
                    $failedDiagnosticResult = $sslInspectionResults | Where-Object {$_.Status -EQ 'FAILURE'} | Format-List | Out-String
                    $failedDiagnosticDetailMsg = ($sslInspectionResults | Where-Object {$_.Status -EQ 'FAILURE'} | Select-Object -ExpandProperty AdditionalData).Detail -join "`r`n"
                    Log-Info ($lcTxt.DiagnosticSystemFailure -f $failedDiagnosticDetailMsg, $failedDiagnosticResult) -Type Critical -ConsoleOut
                    $skipTests = $true
                }
            }
            if (-not $skipTests)
            {
                # Run connectivity tests
                $webResult += Invoke-WebRequestEx -Target $ConnectivityTargets -Proxy $Proxy -ProxyCredential $ProxyCredential
            }
        }

        # Feedback results - user scenario
        if (-not $PassThru)
        {
            Write-Host 'Connectivity Results'
            $printed = @()
            $targetServices = $webresult.Tags.Service | Sort-Object | Get-Unique | Where-Object { $PSITEM -ne 'System' }
            Foreach ($targetService in $targetServices) {
                $thisResult = $webResult | Where-Object { $PSITEM -notin $printed -and $_.Tags.Service -EQ $targetService }
                Write-AzStackHciResult -Title $targetService -Result $thisResult
                $printed += $webResult | Where-Object Service -EQ $targetService
            }
            Write-AzStackHciResult -Title 'Diagnostics' -Result $diagnosticResults -Expand
            Write-Summary -Result $webResult -Property1 Source -Property2 Resource
            Write-FailedUrls -Result $webResult
        }
    }
    catch
    {
        Log-Info -Message "" -ConsoleOut
        Log-Info -Message "$($_.Exception.Message)" -ConsoleOut -Type Error
        Log-Info -Message "$($_.ScriptStackTrace)" -ConsoleOut -Type Error
        $cmdletException = $_
        throw $_.exception
    }
    finally
    {
        $Script:ErrorActionPreference = 'SilentlyContinue'
        # Write result to telemetry channel
        foreach ($r in ($webResult + $diagnosticResults))
        {
            Write-ETWResult -Result $r
        }
        # Write validation result to report object and close out report
        $envcheckerReport | Add-Member -MemberType NoteProperty -Name 'Connectivity' -Value $webResult -Force
        $envcheckerReport | Add-Member -MemberType NoteProperty -Name 'Diagnostics' -Value $diagnosticResults -Force
        $envcheckerReport = Close-AzStackHciEnvJob -report $envcheckerReport
        Write-AzStackHciEnvReport -report $envcheckerReport
        Write-AzStackHciFooter -invocation $MyInvocation -Exception $cmdletException -PassThru:$PassThru
        Remove-Variable -Name AzStackHciConnectivityTargets -Scope GLOBAL -ErrorAction SilentlyContinue
        if ($PassThru)
        {
            Write-Output ($webResult + $diagnosticResults)
        }
    }
}
# SIG # Begin signature block
# MIIoQwYJKoZIhvcNAQcCoIIoNDCCKDACAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAKbXpiT5apw+MY
# ongzbIBZueZq4DRYTXjGZUV4Srm+PKCCDXYwggX0MIID3KADAgECAhMzAAAEBGx0
# Bv9XKydyAAAAAAQEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTE0WhcNMjUwOTExMjAxMTE0WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQC0KDfaY50MDqsEGdlIzDHBd6CqIMRQWW9Af1LHDDTuFjfDsvna0nEuDSYJmNyz
# NB10jpbg0lhvkT1AzfX2TLITSXwS8D+mBzGCWMM/wTpciWBV/pbjSazbzoKvRrNo
# DV/u9omOM2Eawyo5JJJdNkM2d8qzkQ0bRuRd4HarmGunSouyb9NY7egWN5E5lUc3
# a2AROzAdHdYpObpCOdeAY2P5XqtJkk79aROpzw16wCjdSn8qMzCBzR7rvH2WVkvF
# HLIxZQET1yhPb6lRmpgBQNnzidHV2Ocxjc8wNiIDzgbDkmlx54QPfw7RwQi8p1fy
# 4byhBrTjv568x8NGv3gwb0RbAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU8huhNbETDU+ZWllL4DNMPCijEU4w
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
# MBQGA1UEBRMNMjMwMDEyKzUwMjkyMzAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci
# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG
# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0
# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAIjmD9IpQVvfB1QehvpC
# Ge7QeTQkKQ7j3bmDMjwSqFL4ri6ae9IFTdpywn5smmtSIyKYDn3/nHtaEn0X1NBj
# L5oP0BjAy1sqxD+uy35B+V8wv5GrxhMDJP8l2QjLtH/UglSTIhLqyt8bUAqVfyfp
# h4COMRvwwjTvChtCnUXXACuCXYHWalOoc0OU2oGN+mPJIJJxaNQc1sjBsMbGIWv3
# cmgSHkCEmrMv7yaidpePt6V+yPMik+eXw3IfZ5eNOiNgL1rZzgSJfTnvUqiaEQ0X
# dG1HbkDv9fv6CTq6m4Ty3IzLiwGSXYxRIXTxT4TYs5VxHy2uFjFXWVSL0J2ARTYL
# E4Oyl1wXDF1PX4bxg1yDMfKPHcE1Ijic5lx1KdK1SkaEJdto4hd++05J9Bf9TAmi
# u6EK6C9Oe5vRadroJCK26uCUI4zIjL/qG7mswW+qT0CW0gnR9JHkXCWNbo8ccMk1
# sJatmRoSAifbgzaYbUz8+lv+IXy5GFuAmLnNbGjacB3IMGpa+lbFgih57/fIhamq
# 5VhxgaEmn/UjWyr+cPiAFWuTVIpfsOjbEAww75wURNM1Imp9NJKye1O24EspEHmb
# DmqCUcq7NqkOKIG4PVm3hDDED/WQpzJDkvu4FrIbvyTGVU01vKsg4UfcdiZ0fQ+/
# V0hf8yrtq9CkB8iIuk5bBxuPMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq
# 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
# /Xmfwb1tbWrJUnMTDXpQzTGCGiMwghofAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp
# Z25pbmcgUENBIDIwMTECEzMAAAQEbHQG/1crJ3IAAAAABAQwDQYJYIZIAWUDBAIB
# BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIA4Uhj3Xt3HnosuPjKsjqH3q
# ACFcW+s/quo0CgcLrlpgMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A
# cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB
# BQAEggEAfTWv/Ud8zI3/GxmRQjoRVfSiUwCvvFpGFZyZVUKZ+Psp/R8+fRLu+3/j
# i2imFZC0TxhRMQEYXNGQTu61/aQDvAaxcVTykD9Da+iMfWLR7pKE4f/gjqD6AGr7
# BRugMkbDyPKmq0dNOwb+9leaIXRc90rUnxW01NauxmyN5uHqJrMm7f7SheVcdw2m
# Vsx7dT0eDERSpMzY5s2sxP6Y4tQCRj09r4r4bY5n2X3fCWL0z/vlUgsgyEjuWd3V
# yqR0vz2jwyALohHVUGp77LC7k/rEuYPueFXPu6bp7AFd3BOGWO3KWYs7htu/aeXr
# LmMGTH4PWWavvhMI4xzgG4cPed3JGqGCF60wghepBgorBgEEAYI3AwMBMYIXmTCC
# F5UGCSqGSIb3DQEHAqCCF4YwgheCAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFaBgsq
# hkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl
# AwQCAQUABCDS4rrIzOyyAatVxiUhrClJPUg5WEpDPV1iW75+5jFQBAIGZ0ni8wV+
# GBMyMDI0MTIwNDE1MDM1My4yMDlaMASAAgH0oIHZpIHWMIHTMQswCQYDVQQGEwJV
# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl
# bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVT
# TjozMjFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# U2VydmljZaCCEfswggcoMIIFEKADAgECAhMzAAAB+KOhJgwMQEj+AAEAAAH4MA0G
# CSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTI0
# MDcyNTE4MzEwOFoXDTI1MTAyMjE4MzEwOFowgdMxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9w
# ZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjMyMUEt
# MDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNl
# MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxR23pXYnD2BuODdeXs2C
# u/T5kKI+bAw8cbtN50Cm/FArjXyL4RTqMe6laQ/CqeMTxgckvZr1JrW0Mi4F15rx
# /VveGhKBmob45DmOcV5xyx7h9Tk59NAl5PNMAWKAIWf270SWAAWxQbpVIhhPWCnV
# V3otVvahEad8pMmoSXrT5Z7Nk1RnB70A2bq9Hk8wIeC3vBuxEX2E8X50IgAHsyaR
# 9roFq3ErzUEHlS8YnSq33ui5uBcrFOcFOCZILuVFVTgEqSrX4UiX0etqi7jUtKyp
# gIflaZcV5cI5XI/eCxY8wDNmBprhYMNlYxdmQ9aLRDcTKWtddWpnJtyl5e3gHuYo
# j8xuDQ0XZNy7ESRwJIK03+rTZqfaYyM4XSK1s0aa+mO69vo/NmJ4R/f1+KucBPJ4
# yUdbqJWM3xMvBwLYycvigI/WK4kgPog0UBNczaQwDVXpcU+TMcOvWP8HBWmWJQIm
# TZInAFivXqUaBbo3wAfPNbsQpvNNGu/12pg0F8O/CdRfgPHfOhIWQ0D8ALCY+Lsi
# wbzcejbrVl4N9fn2wOg2sDa8RfNoD614I0pFjy/lq1NsBo9V4GZBikzX7ZjWCRgd
# 1FCBXGpfpDikHjQ05YOkAakdWDT2bGSaUZJGVYtepIpPTAs1gd/vUogcdiL51o7s
# huHIlB6QSUiQ24XYhRbbQCECAwEAAaOCAUkwggFFMB0GA1UdDgQWBBS9zsZzz57Q
# lT5nrt/oitLv1OQ7tjAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBf
# BgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmww
# bAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29m
# dC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0El
# MjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUF
# BwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEAYfk8GzzpEVnG
# l7y6oXoytCb42Hx6TOA0+dkaBI36ftDE9tLubUa/xMbHB5rcNiRhFHZ93RefdPpc
# 4+FF0DAl5lP8xKAO+293RWPKDFOFIxgtZY08t8D9cSQpgGUzyw3lETZebNLEA17A
# /CTpA2F9uh8j84KygeEbj+bidWDiEfayoH2A5/5ywJJxIuLzFVHacvWxSCKoF9hl
# SrZSG5fXWS3namf4tt690UT6AGyWLFWe895coFPxm/m0UIMjjp9VRFH7nb3Ng2Q4
# gPS9E5ZTMZ6nAlmUicDj0NXAs2wQuQrnYnbRAJ/DQW35qLo7Daw9AsItqjFhbMcG
# 68gDc4j74L2KYe/2goBHLwzSn5UDftS1HZI0ZRsqmNHI0TZvvUWX9ajm6SfLBTEt
# oTo6gLOX0UD/9rrhGjdkiCw4SwU5osClgqgiNMK5ndk2gxFlDXHCyLp5qB6BoPpc
# 82RhO0yCzoP9gv7zv2EocAWEsqE5+0Wmu5uarmfvcziLfU1SY240OZW8ld4sS8fn
# ybn/jDMmFAhazV1zH0QERWEsfLSpwkOXaImWNFJ5lmcnf1VTm6cmfasScYtElpjq
# Z9GooCmk1XFApORPs/PO43IcFmPRwagt00iQSw+rBeIH00KQq+FJT/62SB70g9g/
# R8TS6k6b/wt2UWhqrW+Q8lw6Xzgex/YwggdxMIIFWaADAgECAhMzAAAAFcXna54C
# m0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UE
# CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
# b2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZp
# Y2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMy
# MjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH
# EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNV
# BAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0B
# AQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51
# yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY
# 6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9
# cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl3GoPz130/o5Tz9bshVZN
# 7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDua
# Rr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74
# kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2
# K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5
# TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZk
# i1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9Q
# BXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6HXtqPnhZyacaue7e3Pmri
# Lq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUC
# BBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJl
# pxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIB
# FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9y
# eS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUA
# YgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU
# 1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2Ny
# bC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIw
# MTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0w
# Ni0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/yp
# b+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulm
# ZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM
# 9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECW
# OKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4
# FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3Uw
# xTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPX
# fx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVX
# VAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGC
# onsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU
# 5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEG
# ahC0HVUzWLOhcGbyoYIDVjCCAj4CAQEwggEBoYHZpIHWMIHTMQswCQYDVQQGEwJV
# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl
# bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVT
# TjozMjFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# U2VydmljZaIjCgEBMAcGBSsOAwIaAxUAtkQt/ebWSQ5DnG+aKRzPELCFE9GggYMw
# gYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD
# VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQsF
# AAIFAOr6UAEwIhgPMjAyNDEyMDQwMzUwMjVaGA8yMDI0MTIwNTAzNTAyNVowdDA6
# BgorBgEEAYRZCgQBMSwwKjAKAgUA6vpQAQIBADAHAgEAAgIEPzAHAgEAAgISHjAK
# AgUA6vuhgQIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIB
# AAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQBFEPtCwFL8mwuk
# D8NjFX+9NnUDpqErGKFQJZ5gTiLmE8GdqxC1XXK3RYqOsT8Y4FWIQKoOf3qd3fAb
# 6dvrn21fTu6Afs+87IGdVeu31VaJMweM36HWmrC2+ZFBBD1o0VUAQIv2Dz7AiGWr
# cOBRKJ283O8d2bWMnSibOEpDnVxcuH5Ue28W2JQ+p8gFt+sXdAfLFEIvfoQNomcM
# RiPnKJRoc6r158hZJCk7S2Wg/mX3FvMR9PwHY9z/erTtb4VhxvZUGIQy1yHxXT7y
# I1nczFKRsIWZH++wI+l9+4/S5UadXhrfF+ET75JBTB652FsYJj3NA8/TUHJcDRiF
# 8RaHvJLtMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh
# c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
# b3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIw
# MTACEzMAAAH4o6EmDAxASP4AAQAAAfgwDQYJYIZIAWUDBAIBBQCgggFKMBoGCSqG
# SIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgIGgbwuFXgYuM
# cTgJ6xwlUGrQDUsFHGB2Do2X5/Fe7/swgfoGCyqGSIb3DQEJEAIvMYHqMIHnMIHk
# MIG9BCDvzDPyXw1UkAUFYt8bR4UdjM90Qv5xnVaiKD3I0Zz3WjCBmDCBgKR+MHwx
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1p
# Y3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB+KOhJgwMQEj+AAEAAAH4
# MCIEIFRkOfQQpQuKrQHFYwOcME4k5tNjpcscUswoqpaCMh8+MA0GCSqGSIb3DQEB
# CwUABIICABsD2x3ewDXDDxnuL+E5YR+moBWgCDWeICx7bs7IUF378jbCqK0f7bod
# viScv3nlcwQzZqnW30MRWuT8F3JF1shIcepscrgp8xA+uVJoCzPUYyycrKpYnQe+
# FKZJrbSw+EytoJzP3wRbsh1A4aj9iIkn5xBLAzk61rpyM0KrBr1g4RpoNYQ1sWda
# vobHZdecqw+KrDoqshIr3pl9O9X6CPtl+wHQ6UzZOVGfbdLLiJ/3qIIUqxt6QBtF
# 0QbpzVejV4YgW5ZFrZXMStfXkjGenRTrTwZYpkOPa8ftkLQ5PZYY5+7iluX128y1
# ELf1Llfn/32dB3mT2ZJhP5DGieSTsETbT5a5nASJJYzgjcJirEfp4ikGtvxpF6vQ
# TkTdJapsxsU1MgLJNgKIozAWr0VForbZRVDLkMumJkp62OTmyx055xW5iWcwoPY9
# so/z1gW9C3wHOlO7qSiRl8PlXEiMrT32NxnyIhOV86oZl4Ajb156CKH0JMczhPgN
# C9TeqdJcXAhXeAHUb7SJF4V53zHM82IvKhRKCEVST+LgRJiuNRQg3Mw66qBcrzyH
# NSd6o2PlcrmqpKa1DiLYUGSevGnYBjRoJaLFhCFvI8OFAaVGc1h3QH8jyOdrveRD
# w7s0B1rUbFQRAgxrBtAWx08MA0gIGbh6HFv9BBYP85gZY+j+j7HF
# SIG # End signature block