private/Get-AdsiADObject.ps1

<#
    .SYNOPSIS
        This function retrieves an Active Directory object by name or LDAP filter.
 
    .DESCRIPTION
        The Get-AdsiADObject function retrieves an Active Directory object by name or LDAP filter. It searches for the object in the domain of the current user and returns the object's name, sAMAccountName, distinguishedName, objectClass, and other properties.
 
    .PARAMETER Identity
        Specifies the identity (Name) of the Active Directory object to retrieve.
 
    .PARAMETER SearchLimit
        Specifies the maximum number of search results to return. Default is 200.
 
    .PARAMETER SearchBase
        Specifies the search base for the object search. If not specified, the search will be performed in the domain of the current user.
 
    .PARAMETER LDAPFilter
        Specifies an LDAP filter to narrow down the search results. This parameter is mandatory when using the 'LDAPFilter' parameter set.
 
    .PARAMETER Credential
        Specifies the credentials to use for the search. If not specified, the search will be performed with the credentials of the current user.
 
    .PARAMETER Server
        Specifies the domain controller to connect to for the search. If not specified, the search will be performed on the default domain controller.
 
    .PARAMETER Port
        Specifies the port number to use for the LDAP connection. Default is 389.
 
    .PARAMETER ObjectType
        Specifies the type of object to search for. Valid values are "*", "user", "group", and "computer". Default is "*".
 
    .PARAMETER Properties
        Specifies the properties to retrieve for the object. Default is "*".
 
    .EXAMPLE
        Get-AdsiADObject -Identity "JohnDoe"
        This command retrieves the Active Directory object with the name "JohnDoe".
 
    .EXAMPLE
        Get-AdsiADObject -LDAPFilter "(|(objectClass=user)(objectClass=group))"
        This command retrieves all Active Directory objects that are either users or groups.
 
    .NOTES
        Function : Get-AdsiADObject
        Author : John Billekens
        Copyright : Copyright (c) John Billekens Consultancy
        Version : 1.0
#>


function Get-AdsiADObject {
    [CmdletBinding(DefaultParameterSetName = 'Identity')]
    Param (
        [Parameter(Mandatory = $true, ParameterSetName = 'Identity')]
        [String]$Identity,

        [Parameter(ParameterSetName = 'Identity')]
        [Parameter(ParameterSetName = 'LDAPFilter')]
        [Int]$SearchLimit = 200,

        [Parameter(ParameterSetName = 'Identity')]
        [Parameter(ParameterSetName = 'LDAPFilter')]
        [String]$SearchBase,

        [Parameter(Mandatory = $true, ParameterSetName = 'LDAPFilter')]
        [String]$LDAPFilter,

        [Parameter(ParameterSetName = 'Identity')]
        [Parameter(ParameterSetName = 'LDAPFilter')]
        [Management.Automation.PSCredential]
        [Management.Automation.Credential()]$Credential = [Management.Automation.PSCredential]::Empty,

        [Parameter(ParameterSetName = 'Identity')]
        [Parameter(ParameterSetName = 'LDAPFilter')]
        [String]$Server,

        [Parameter(ParameterSetName = 'Identity')]
        [Parameter(ParameterSetName = 'LDAPFilter')]
        [ValidateSet('*', 'user', 'group', 'computer')]
        [String]$ObjectType = "*",

        [Parameter(ParameterSetName = 'Identity')]
        [Parameter(ParameterSetName = 'LDAPFilter')]
        [String[]]$Properties = "*",

        [Parameter(ParameterSetName = 'Identity')]
        [Parameter(ParameterSetName = 'LDAPFilter')]
        [ValidateSet(0, 389, 636)]
        [Int]$Port = 389,

        [Parameter(ParameterSetName = 'Identity')]
        [Switch]$WildcardSearch

    )
    Write-Verbose "Starting function : Get-AdsiADObject"
    if ($Port -eq 0) { $Port = 389 }
    $adsiADParams = @{
        Port   = $Port
        Server = $Server
    }

    if (-not ($Credential -is [Management.Automation.PSCredential])) {
        $Credential = [Management.Automation.PSCredential]::Empty
    }
    $adsiADParams.Credential = $Credential
    $adsiADDomain = Get-AdsiADDomain @adsiADParams
    Write-Verbose "Domain : $($adsiADDomain.DistinguishedName)"
    Write-Verbose "Server : $($adsiADDomain.DirectoryServer)"
    Write-Verbose "LDAPPath : $($adsiADDomain.LDAPPath)"

    if ([String]::IsNullOrEmpty($ObjectType) -or $ObjectType -eq "*") {
        $ObjectClass = "(|(objectClass=group)(objectClass=user)(objectClass=computer))"
    } else {
        $ObjectClass = "(objectClass=$ObjectType)"
    }

    if (-Not [String]::IsNullOrEmpty($Identity)) {
        # Detect a SID string (e.g. S-1-5-21-...). objectSid is a binary attribute, so it cannot
        # be matched against the textual "S-1-5-..." form: the SID must be converted to its raw
        # bytes and each byte escaped as \XX in the filter. Matching a SID against text attributes
        # such as Name/UserPrincipalName/Sn would never succeed, so for a SID we build a dedicated,
        # correct objectSid filter instead.
        # SecurityIdentifier.TryParse is unavailable on Windows PowerShell 5.1, so probe with the
        # constructor. A SID always starts with "S-1-"; the prefix check avoids the cost of a
        # thrown exception for ordinary names.
        $sidObject = $null
        if (-not $WildcardSearch -and $Identity -like 'S-1-*') {
            try {
                $sidObject = New-Object System.Security.Principal.SecurityIdentifier($Identity)
            } catch {
                $sidObject = $null
            }
        }
        if ($null -ne $sidObject) {
            $sidBytes = New-Object 'Byte[]' $sidObject.BinaryLength
            $sidObject.GetBinaryForm($sidBytes, 0)
            $escapedSid = ($sidBytes | ForEach-Object { '\{0:x2}' -f $_ }) -join ''
            $LDAPFilter = "(&$($ObjectClass)(objectSid=$escapedSid))"
            Write-Verbose "Identity is a SID; matching on binary objectSid"
        } else {
            if ($WildcardSearch) {
                $searchIdentityString = "*$(ConvertTo-LdapFilterEscapedString -Value $Identity -PreserveWildcards)*"
            } else {
                $searchIdentityString = ConvertTo-LdapFilterEscapedString -Value $Identity
            }
            $LDAPFilter = "(&$($ObjectClass)(|(Name=$searchIdentityString)(UserPrincipalName=$searchIdentityString)(SamAccountName=$searchIdentityString)(Sn=$searchIdentityString)(GivenName=$searchIdentityString)))"
        }
    }
    if ($adsiADDomain.LDAPPath -like "LDAP://*") {
        $LDAPPath = '{0}/' -f $adsiADDomain.LDAPPath.TrimEnd("/")
    } else {
        $LDAPPath = "LDAP://"
        if (-Not [String]::IsNullOrEmpty($Server)) {
            $LDAPPath += "$($Server):$($Port)/"
        }
    }
    if ([String]::IsNullOrEmpty($SearchBase)) {
        $LDAPPath += $adsiADDomain.DistinguishedName
    } elseif ($SearchBase -like "LDAP://*") {
        $LDAPPath += $SearchBase -replace "LDAP://", $null
    } elseif ($SearchBase -match '(?im)^(?:(?<cn>CN=(?<name>[^,]*)),)?(?:(?<path>(?:(?:CN|OU)=[^,]+,?)+),)?(?<domain>(?:DC=[^,]+,?)+)$') {
        $LDAPPath += $SearchBase
    } else {
        $LDAPPath += $adsiADDomain.DistinguishedName
    }
    Write-Verbose "LDAPPath : $LDAPPath"
    Write-Verbose "LDAPFilter : $LDAPFilter"

    $searchRoot = $null
    $searcher = $null
    $result = $null
    try {
        if ($null -eq $Credential -or $Credential -eq [Management.Automation.PSCredential]::Empty) {
            $searchRoot = New-Object System.DirectoryServices.DirectoryEntry $LDAPPath
            Write-Verbose "Connecting : Without credential"
        } else {
            $searchRoot = New-Object System.DirectoryServices.DirectoryEntry $LDAPPath, $($Credential.UserName), $($Credential.GetNetworkCredential().password)
            Write-Verbose "Connecting : With credential"
        }

        $searcher = New-Object -TypeName system.directoryservices.directorysearcher

        $searcher.SearchRoot = $searchRoot
        $searcher.Filter = $LDAPFilter

        # Add requested properties
        Foreach ($property in $Properties) {
            $searcher.PropertiesToLoad.Add("$($property)".ToLower()) | Out-Null
        }

        # Ensure required properties are always loaded (unless using wildcard)
        $requiredProperties = @("distinguishedname", "name", "objectclass", "samaccountname", "objectsid")
        $hasWildcard = $searcher.PropertiesToLoad -contains "*"

        foreach ($requiredProp in $requiredProperties) {
            if (-not $hasWildcard -and -not ($searcher.PropertiesToLoad -contains $requiredProp)) {
                $searcher.PropertiesToLoad.Add($requiredProp) | Out-Null
                Write-Verbose "Added required property: $requiredProp"
            }
        }

        Write-Verbose "Properties to load: $($searcher.PropertiesToLoad -join ', ')"

        $searcher.PageSize = $SearchLimit

        $result = $searcher.FindAll()
        Write-Verbose "Result count : $($result.count)"

        if ($result.count -gt 0) {

            ForEach ($entry in $result) {
                $entryProperties = @{}
                ForEach ($propertyName in $entry.Properties.PropertyNames) {
                    $propertyValue = $entry.Properties[$propertyName]

                    # Use centralized conversion function for all property values
                    $entryProperties[$propertyName] = ConvertFrom-ResultPropertyValue -PropertyName $propertyName -PropertyValue $propertyValue
                }

                Write-Output ([PSCustomObject]@{
                        Name              = "$($entryProperties["name"])"
                        sAMAccountName    = "$($entryProperties["samaccountname"])"
                        DistinguishedName = "$($entryProperties["distinguishedname"])"
                        objectClass       = "$($entryProperties["objectclass"])"
                        OtherProperties   = [PSCustomObject]$entryProperties
                    })
            }
        } else {
            if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey('Identity')) {
                Write-Warning "Object with name '$Identity' not found in Active Directory."
            }
            if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey('LDAPFilter')) {
                Write-Warning "Object with LDAP filter '$LDAPFilter' not found in Active Directory."
            }
            Write-Output (@())
        }
    } finally {
        if ($null -ne $result) {
            $result.Dispose()
        }
        if ($null -ne $searcher) {
            $searcher.Dispose()
        }
        if ($null -ne $searchRoot) {
            $searchRoot.Dispose()
        }
    }
    Write-Verbose "Ending function : Get-AdsiADObject"
}

# SIG # Begin signature block
# MII5zAYJKoZIhvcNAQcCoII5vTCCObkCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDvx9z53cz6RVph
# EHEl0lE7JyApQMUAKZZad0/NP8GSBqCCIfAwggXMMIIDtKADAgECAhBUmNLR1FsZ
# lUgTecgRwIeZMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVu
# dGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAy
# MDAeFw0yMDA0MTYxODM2MTZaFw00NTA0MTYxODQ0NDBaMHcxCzAJBgNVBAYTAlVT
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jv
# c29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRo
# b3JpdHkgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALORKgeD
# Bmf9np3gx8C3pOZCBH8Ppttf+9Va10Wg+3cL8IDzpm1aTXlT2KCGhFdFIMeiVPvH
# or+Kx24186IVxC9O40qFlkkN/76Z2BT2vCcH7kKbK/ULkgbk/WkTZaiRcvKYhOuD
# PQ7k13ESSCHLDe32R0m3m/nJxxe2hE//uKya13NnSYXjhr03QNAlhtTetcJtYmrV
# qXi8LW9J+eVsFBT9FMfTZRY33stuvF4pjf1imxUs1gXmuYkyM6Nix9fWUmcIxC70
# ViueC4fM7Ke0pqrrBc0ZV6U6CwQnHJFnni1iLS8evtrAIMsEGcoz+4m+mOJyoHI1
# vnnhnINv5G0Xb5DzPQCGdTiO0OBJmrvb0/gwytVXiGhNctO/bX9x2P29Da6SZEi3
# W295JrXNm5UhhNHvDzI9e1eM80UHTHzgXhgONXaLbZ7LNnSrBfjgc10yVpRnlyUK
# xjU9lJfnwUSLgP3B+PR0GeUw9gb7IVc+BhyLaxWGJ0l7gpPKWeh1R+g/OPTHU3mg
# trTiXFHvvV84wRPmeAyVWi7FQFkozA8kwOy6CXcjmTimthzax7ogttc32H83rwjj
# O3HbbnMbfZlysOSGM1l0tRYAe1BtxoYT2v3EOYI9JACaYNq6lMAFUSw0rFCZE4e7
# swWAsk0wAly4JoNdtGNz764jlU9gKL431VulAgMBAAGjVDBSMA4GA1UdDwEB/wQE
# AwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIftJqhSobyhmYBAcnz1AQ
# T2ioojAQBgkrBgEEAYI3FQEEAwIBADANBgkqhkiG9w0BAQwFAAOCAgEAr2rd5hnn
# LZRDGU7L6VCVZKUDkQKL4jaAOxWiUsIWGbZqWl10QzD0m/9gdAmxIR6QFm3FJI9c
# Zohj9E/MffISTEAQiwGf2qnIrvKVG8+dBetJPnSgaFvlVixlHIJ+U9pW2UYXeZJF
# xBA2CFIpF8svpvJ+1Gkkih6PsHMNzBxKq7Kq7aeRYwFkIqgyuH4yKLNncy2RtNwx
# AQv3Rwqm8ddK7VZgxCwIo3tAsLx0J1KH1r6I3TeKiW5niB31yV2g/rarOoDXGpc8
# FzYiQR6sTdWD5jw4vU8w6VSp07YEwzJ2YbuwGMUrGLPAgNW3lbBeUU0i/OxYqujY
# lLSlLu2S3ucYfCFX3VVj979tzR/SpncocMfiWzpbCNJbTsgAlrPhgzavhgplXHT2
# 6ux6anSg8Evu75SjrFDyh+3XOjCDyft9V77l4/hByuVkrrOj7FjshZrM77nq81YY
# uVxzmq/FdxeDWds3GhhyVKVB0rYjdaNDmuV3fJZ5t0GNv+zcgKCf0Xd1WF81E+Al
# GmcLfc4l+gcK5GEh2NQc5QfGNpn0ltDGFf5Ozdeui53bFv0ExpK91IjmqaOqu/dk
# ODtfzAzQNb50GQOmxapMomE2gj4d8yu8l13bS3g7LfU772Aj6PXsCyM2la+YZr9T
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggalMIIEjaADAgECAhMzAAQyaRto
# bic9sBX5AAAABDJpMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDQwHhcNMjYwODAyMTQxMjE5WhcNMjYwODA1
# MTQxMjE5WjBoMQswCQYDVQQGEwJOTDEWMBQGA1UECBMNTm9vcmQtSG9sbGFuZDEP
# MA0GA1UEBxMGSGVpbG9vMRcwFQYDVQQKEw5BcHBWZW50aVggQi5WLjEXMBUGA1UE
# AxMOQXBwVmVudGlYIEIuVi4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIB
# gQCll/19fsk+rc8B67sHzVS28pcjEP8/g44+bWhFKh6+e5kNbEihC6k7hc031BjK
# 8jlXAma6ipNydOiWgvDvIBkvHiXkRwmAhjv2Lnh07d0JgZLhUVUjoJZxn/JMzgLW
# a/RT/WqpaZJbDL+bJ7qrLBBVqMaCBSH6/cN4ZqzHX7Hkc1KWIOWU6PU8DUNSKtBI
# IQzPVK2Z3YGesUA/VMuFx7LbI85LAsrKeSDd8ZchyOLtYvFR+CKx+p/BQBpHPMPX
# ivhyjAO31ekph/nhpG9lfc/yFHFW+14ceinphUBSKxgOmngTZDh9UrsWzByjeDmJ
# VmqENi3jd6uR2gHyqDt+aPJg/YnhuejUMLBlxDBeWkmbs4FkWPMpDMtLLs63dYr4
# BjlRrXaxKBlBUklto3fhjcfcshTkt1V98wxwCz53lJAgyYWL6GYp9acZ4drI50QX
# v7X9caLHOoy+vp0nZr1tcUfSLjTZCFcYJ0eUqXproBYMrR6cIrYf5s2h/l2yt929
# 6FkCAwEAAaOCAdQwggHQMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDsG
# A1UdJQQ0MDIGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhorBgEEAYI3YaL8yC6uh9F6
# gZ2lyVCBwcKCJzAdBgNVHQ4EFgQUwu0a4YXLoXLkOy08WT1L2aMHiKowHwYDVR0j
# BBgwFoAUayVB3vtrfP0YgAotf492XapzPbgwZwYDVR0fBGAwXjBcoFqgWIZWaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQl
# MjBWZXJpZmllZCUyMENTJTIwQU9DJTIwQ0ElMjAwNC5jcmwwdAYIKwYBBQUHAQEE
# aDBmMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUyMENB
# JTIwMDQuY3J0MFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w
# DQYJKoZIhvcNAQEMBQADggIBADh7xKhbPEm669VqbbgMBeFaOJ2Z3QUT/RFWTPU8
# fHlhpYjA2qFse+p0uPpoHjpQ4j3xjddA+CKde2a9c6fkP60TKsqGKCXmGu8UZZJa
# 9tgfy0C4jnZe7rPtBu/svwcScvQUTw2oC6dbO5E/BQvWuW2+JSUHu8mzWK/0xgzv
# ws8EFXbkegfBgTU8o3ElOItzOp0rc85tdVOJjgP9qhZGZPiPX70h7KipJmiyI49O
# mmzg0xylkaTStAscDua+yO9bP52hm0STEekn5C5igv2UoBfmfSU9QyA/WZsoNO37
# ws2HcYoy8ajHuowrfvABE71Wb6bFvxHDeA/+TIaTO1cwjy+ihMdQVaJYqqyPg7n4
# VqnLWUPwevvUDBjOLha902HaCsbn07IBY6USSZIYWBJxPrk3AYahQZ4PxsWfz5LV
# TxPHGBjxWhChPHQc0k6rBqNQdNgusiLPjTotERLrb83LSHPaZkF9Qsx7U/exN9CE
# 7HPckcQYp/MS9zOVwsWXGftUYBf1edHWOnefhQIZwBWw2gT5cxtAJZPBEhQrK07V
# MkLbl75N1WtV/CryONEz/D6lwoyqIfloCEC0l0RbQ3cfKcmN2B+HkFjXlVWpTpfF
# LNUSizOkr1faHyy0aONspH/C3sSLA2w+8o2E/1wMCRBz0PlWNKWPYfH1Oy//bT43
# RGCpMIIGpTCCBI2gAwIBAgITMwAEMmkbaG4nPbAV+QAAAAQyaTANBgkqhkiG9w0B
# AQwFADBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENBIDA0
# MB4XDTI2MDgwMjE0MTIxOVoXDTI2MDgwNTE0MTIxOVowaDELMAkGA1UEBhMCTkwx
# FjAUBgNVBAgTDU5vb3JkLUhvbGxhbmQxDzANBgNVBAcTBkhlaWxvbzEXMBUGA1UE
# ChMOQXBwVmVudGlYIEIuVi4xFzAVBgNVBAMTDkFwcFZlbnRpWCBCLlYuMIIBojAN
# BgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEApZf9fX7JPq3PAeu7B81UtvKXIxD/
# P4OOPm1oRSoevnuZDWxIoQupO4XNN9QYyvI5VwJmuoqTcnToloLw7yAZLx4l5EcJ
# gIY79i54dO3dCYGS4VFVI6CWcZ/yTM4C1mv0U/1qqWmSWwy/mye6qywQVajGggUh
# +v3DeGasx1+x5HNSliDllOj1PA1DUirQSCEMz1Stmd2BnrFAP1TLhcey2yPOSwLK
# ynkg3fGXIcji7WLxUfgisfqfwUAaRzzD14r4cowDt9XpKYf54aRvZX3P8hRxVvte
# HHop6YVAUisYDpp4E2Q4fVK7Fswco3g5iVZqhDYt43erkdoB8qg7fmjyYP2J4bno
# 1DCwZcQwXlpJm7OBZFjzKQzLSy7Ot3WK+AY5Ua12sSgZQVJJbaN34Y3H3LIU5LdV
# ffMMcAs+d5SQIMmFi+hmKfWnGeHayOdEF7+1/XGixzqMvr6dJ2a9bXFH0i402QhX
# GCdHlKl6a6AWDK0enCK2H+bNof5dsrfdvehZAgMBAAGjggHUMIIB0DAMBgNVHRMB
# Af8EAjAAMA4GA1UdDwEB/wQEAwIHgDA7BgNVHSUENDAyBgorBgEEAYI3YQEABggr
# BgEFBQcDAwYaKwYBBAGCN2Gi/MgurofReoGdpclQgcHCgicwHQYDVR0OBBYEFMLt
# GuGFy6Fy5DstPFk9S9mjB4iqMB8GA1UdIwQYMBaAFGslQd77a3z9GIAKLX+Pdl2q
# cz24MGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
# a2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUy
# MENBJTIwMDQuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZYaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUy
# MFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDA0LmNydDBUBgNVHSAETTBLMEkG
# BFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
# aW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4ICAQA4e8So
# WzxJuuvVam24DAXhWjidmd0FE/0RVkz1PHx5YaWIwNqhbHvqdLj6aB46UOI98Y3X
# QPginXtmvXOn5D+tEyrKhigl5hrvFGWSWvbYH8tAuI52Xu6z7Qbv7L8HEnL0FE8N
# qAunWzuRPwUL1rltviUlB7vJs1iv9MYM78LPBBV25HoHwYE1PKNxJTiLczqdK3PO
# bXVTiY4D/aoWRmT4j1+9IeyoqSZosiOPTpps4NMcpZGk0rQLHA7mvsjvWz+doZtE
# kxHpJ+QuYoL9lKAX5n0lPUMgP1mbKDTt+8LNh3GKMvGox7qMK37wARO9Vm+mxb8R
# w3gP/kyGkztXMI8vooTHUFWiWKqsj4O5+Fapy1lD8Hr71AwYzi4WvdNh2grG59Oy
# AWOlEkmSGFgScT65NwGGoUGeD8bFn8+S1U8TxxgY8VoQoTx0HNJOqwajUHTYLrIi
# z406LRES62/Ny0hz2mZBfULMe1P3sTfQhOxz3JHEGKfzEvczlcLFlxn7VGAX9XnR
# 1jp3n4UCGcAVsNoE+XMbQCWTwRIUKytO1TJC25e+TdVrVfwq8jjRM/w+pcKMqiH5
# aAhAtJdEW0N3HynJjdgfh5BY15VVqU6XxSzVEoszpK9X2h8stGjjbKR/wt7EiwNs
# PvKNhP9cDAkQc9D5VjSlj2Hx9Tsv/20+N0RgqTCCBygwggUQoAMCAQICEzMAAAAW
# MZKNkgJle5oAAAAAABYwDQYJKoZIhvcNAQEMBQAwYzELMAkGA1UEBhMCVVMxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0
# IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTAeFw0yNjAzMjYxODEx
# MjlaFw0zMTAzMjYxODExMjlaMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmll
# ZCBDUyBBT0MgQ0EgMDQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDK
# VfrI2+gJMM/0bQ5OVKNdvOASzLbUUMvXuf+Vl7YGuofPaZHVo3gMHF5inT+GMSpI
# cfIZ9qtXU1UG68ry8vNbQtOL4Nm30ifXpqI1+ByiAWLO1YT0WnzG7XPOuoTeeWsN
# Zv5FmjxCsReBZvyzyzCyXZbu1EQfJxWTH4ebUwtAiW9rqMf9eDj/wYhiEfNteJV3
# ZFeibD2ztCHr9JhFdd97XbnCHgQoTIqc02X5xlRKtUGBa++OtHBBjiJ/uwBnzTkq
# u4FjpZjQeJtrmda+ur1CT2jflWIB/ypn7u7V9tvW9wJbJYt/H2EtJ0GONWxJZ7TE
# u8jWPindOO3lzPP7UtzS/mVDV94HucWaltmsra6zSG8BoEJ87IM8QSb7vfm/O41F
# hYkUv89WIj5ES2O4kxyiMSfe95CMivCuYrRP2hKvx7egPMrWgDDBkxMLgrKZO9hR
# NUMm8vk3w5b9SogHOyJVhxyFm8aFXfIxgqDF4S0g4bhbhnzljmSlCLlumMZcXFGD
# jpF2tNoAu3VGFGYtHtTSNVKvZpgB3b4ynaoDkbPf+Wg4523jt4VneasBgZhC1srZ
# I2NCnCBBfgjLq04pqEKAWEohyW2K29KSkkHvt5VaE1ac3Yt+oyiOzMS57tXwQDJL
# GvLg/OXFO0VNvczDndfIfXYExB/ab2PuMSwd5VIBOwIDAQABo4IB3DCCAdgwDgYD
# VR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRrJUHe+2t8
# /RiACi1/j3ZdqnM9uDBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYz
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnku
# aHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMBIGA1UdEwEB/wQIMAYBAf8C
# AQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1zSmepEhqMOYwcAYDVR0fBGkwZzBl
# oGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9z
# b2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAy
# MS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsGAQUFBzAChmFodHRwOi8vd3d3Lm1p
# Y3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZp
# ZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3J0MA0GCSqGSIb3DQEB
# DAUAA4ICAQAG1VBeVHTVRBljlcZD3IiMxwPyMjQyLNaEnVu5mODm2hRBJfH8GsBL
# ATmrHAc8F47jmk5CnpUPiIguCbw6Z/KVj4Dsoiq228NSLMLewFfGMri7uwNGLISC
# 5ccp8vUdADDEIsS2dE+QI9OwkDpv3XuUD7d+hAgcLVcMOl1AsfEZtsZenhGvSYUr
# m/FuLq0BqEGL9GXM5c+Ho9q8o+Vn/S+GWQN2y+gkRO15s0kI05nUpq/dOD4ri9rg
# Vs6tipEd0YZqGgD+CZNiaZWrDTOQbNPncd2F9qOsUa20miYruoT5PwJAaI+QQiTE
# 2ZJeMJOkOpzhTUgqVMZwZidEUZKCqudaeQA08WwnkQMfKyHzaU8j48ULcU4hUwvM
# sv7fSurOe9GAdRQCPvF8WcSK5oDHe8VVJM4tv6KKCm91HqLx9JamBgRI6R2SfY3n
# u26EGznu0rCg/769z8xWm4PVcC2ZaL6VlKVqFp1NsN8YqMyf5t+bbGVb09noFKcJ
# G/UwyGlxRmQBlfeBUQx5/ytlzZzsEnhrJF9fTAfje8j3OdX5lEnePTFQLRlvzZFB
# qUXnIeQKv3fHQjC9m2fo/Z01DII/qp3d8LhGVUW0BCG04fRwHJNH8iqqCG/qofMv
# +kym2AxBDnHzNgRjL60JOFiBgiurvLhYQNhB95KWojFA6shQnggkMTCCB54wggWG
# oAMCAQICEzMAAAAHh6M0o3uljhwAAAAAAAcwDQYJKoZIhvcNAQEMBQAwdzELMAkG
# A1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYGA1UE
# AxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENlcnRpZmlj
# YXRlIEF1dGhvcml0eSAyMDIwMB4XDTIxMDQwMTIwMDUyMFoXDTM2MDQwMTIwMTUy
# MFowYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQ
# Q0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALLwwK8ZiCji
# 3VR6TElsaQhVCbRS/3pK+MHrJSj3Zxd3KU3rlfL3qrZilYKJNqztA9OQacr1AwoN
# cHbKBLbsQAhBnIB34zxf52bDpIO3NJlfIaTE/xrweLoQ71lzCHkD7A4As1Bs076I
# u+mA6cQzsYYH/Cbl1icwQ6C65rU4V9NQhNUwgrx9rGQ//h890Q8JdjLLw0nV+ayQ
# 2Fbkd242o9kH82RZsH3HEyqjAB5a8+Ae2nPIPc8sZU6ZE7iRrRZywRmrKDp5+Tcm
# JX9MRff241UaOBs4NmHOyke8oU1TYrkxh+YeHgfWo5tTgkoSMoayqoDpHOLJs+qG
# 8Tvh8SnifW2Jj3+ii11TS8/FGngEaNAWrbyfNrC69oKpRQXY9bGH6jn9NEJv9weF
# xhTwyvx9OJLXmRGbAUXN1U9nf4lXezky6Uh/cgjkVd6CGUAf0K+Jw+GE/5VpIVbc
# Nr9rNE50Sbmy/4RTCEGvOq3GhjITbCa4crCzTTHgYYjHs1NbOc6brH+eKpWLtr+b
# Gecy9CrwQyx7S/BfYJ+ozst7+yZtG2wR461uckFu0t+gCwLdN0A6cFtSRtR8bvxV
# FyWwTtgMMFRuBa3vmUOTnfKLsLefRaQcVTgRnzeLzdpt32cdYKp+dhr2ogc+qM6K
# 4CBI5/j4VFyC4QFeUP2YAidLtvpXRRo3AgMBAAGjggI1MIICMTAOBgNVHQ8BAf8E
# BAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNlBKbAPD2Ns72nX9c0p
# nqRIajDmMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wGQYJ
# KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME
# GDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRl
# bnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRo
# b3JpdHklMjAyMDIwLmNybDCBwwYIKwYBBQUHAQEEgbYwgbMwgYEGCCsGAQUFBzAC
# hnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29m
# dCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRl
# JTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vbmVv
# Y3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEAfyUqnv7U
# q+rdZgrbVyNMul5skONbhls5fccPlmIbzi+OwVdPQ4H55v7VOInnmezQEeW4LqK0
# wja+fBznANbXLB0KrdMCbHQpbLvG6UA/Xv2pfpVIE1CRFfNF4XKO8XYEa3oW8oVH
# +KZHgIQRIwAbyFKQ9iyj4aOWeAzwk+f9E5StNp5T8FG7/VEURIVWArbAzPt9ThVN
# 3w1fAZkF7+YU9kbq1bCR2YD+MtunSQ1Rft6XG7b4e0ejRA7mB2IoX5hNh3UEauY0
# byxNRG+fT2MCEhQl9g2i2fs6VOG19CNep7SquKaBjhWmirYyANb0RJSLWjinMLXN
# OAga10n8i9jqeprzSMU5ODmrMCJE12xS/NWShg/tuLjAsKP6SzYZ+1Ry358ZTFcx
# 0FS/mx2vSoU8s8HRvy+rnXqyUJ9HBqS0DErVLjQwK8VtsBdekBmdTbQVoCgPCqr+
# PDPB3xajYnzevs7eidBsM71PINK2BoE2UfMwxCCX3mccFgx6UsQeRSdVVVNSyALQ
# e6PT12418xon2iDGE81OGCreLzDcMAZnrUAx4XQLUz6ZTl65yPUiOh3k7Yww94lD
# f+8oG2oZmDh5O1Qe38E+M3vhKwmzIeoB1dVLlz4i3IpaDcR+iuGjH2TdaC1ZOmBX
# iCRKJLj4DT2uhJ04ji+tHD6n58vhavFIrmcxghcyMIIXLgIBATBxMFoxCzAJBgNV
# BAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMT
# Ik1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBBT0MgQ0EgMDQCEzMABDJpG2huJz2w
# FfkAAAAEMmkwDQYJYIZIAWUDBAIBBQCgXjAQBgorBgEEAYI3AgEMMQIwADAZBgkq
# hkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQgEmmGVMq0w7hX
# jqikVmlqxoOWswYDasg3dJ6kEz/0X68wDQYJKoZIhvcNAQEBBQAEggGASWjJ3Wld
# 46WtMuSx6Ly3PFm1cqpduuTotCQNSQMzlmq/euXnnTLjLBbgZV3vPDoMD3O/u/0s
# 7ygcURY801L5rZTw6uSwmJmHopRgAhAeqZFP+EneTmk9keHNGL6kqOAiGS4cWtd3
# m0muZ4yQYQiL+FoTMNdaIMr4SIho4P/+i07DS6QrSs2s6K033JeGDaHiFrNfn1x1
# rtVGJqGNQLjlfj003RUdQWAONlJPeb0Q9s8JftO39E7/kWIG4m7SL0uypGNezObv
# P8D+AKwQfldhNfki5CQguAI2OMBROj2w84eCFxaO7RDeb2kwUkFWTneZ2TsHiBAT
# ejCWfQaFwNOfOxpMuTzFEBzBDAVvrtRi3H099Sp5OgiutIQN1++MLcSvTcMjLDqa
# fUzdbnVRfBma5Za7GSCSVING8Bsl29uVI0x6DTw7d9LI3St/8fYU4TWbxk98FpJC
# GVUn3CM3zQclodkFRv4vNaPQnAyAE6STNuVxWHoM13ma+A+DGbm+3Uc8oYIUsjCC
# FK4GCisGAQQBgjcDAwExghSeMIIUmgYJKoZIhvcNAQcCoIIUizCCFIcCAQMxDzAN
# BglghkgBZQMEAgEFADCCAWoGCyqGSIb3DQEJEAEEoIIBWQSCAVUwggFRAgEBBgor
# BgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIPL839VvyX5ubfu+cCEUnKDX3+Mf
# ySXIfPjXXw9qH/IvAgZqNTBjEdYYEzIwMjYwODA0MTMyNjM3LjEzMVowBIACAfSg
# gemkgeYwgeMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTAr
# BgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUG
# A1UECxMeblNoaWVsZCBUU1MgRVNOOjQ5MUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxN
# aWNyb3NvZnQgUHVibGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eaCCDykw
# ggeCMIIFaqADAgECAhMzAAAABeXPD/9mLsmHAAAAAAAFMA0GCSqGSIb3DQEBDAUA
# MHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# SDBGBgNVBAMTP01pY3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBD
# ZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAyMDAeFw0yMDExMTkyMDMyMzFaFw0zNTEx
# MTkyMDQyMzFaMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
# cG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFt
# cGluZyBDQSAyMDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnnzn
# UmP94MWfBX1jtQYioxwe1+eXM9ETBb1lRkd3kcFdcG9/sqtDlwxKoVIcaqDb+omF
# io5DHC4RBcbyQHjXCwMk/l3TOYtgoBjxnG/eViS4sOx8y4gSq8Zg49REAf5huXhI
# kQRKe3Qxs8Sgp02KHAznEa/Ssah8nWo5hJM1xznkRsFPu6rfDHeZeG1Wa1wISvlk
# pOQooTULFm809Z0ZYlQ8Lp7i5F9YciFlyAKwn6yjN/kR4fkquUWfGmMopNq/B8U/
# pdoZkZZQbxNlqJOiBGgCWpx69uKqKhTPVi3gVErnc/qi+dR8A2MiAz0kN0nh7SqI
# NGbmw5OIRC0EsZ31WF3Uxp3GgZwetEKxLms73KG/Z+MkeuaVDQQheangOEMGJ4pQ
# ZH55ngI0Tdy1bi69INBV5Kn2HVJo9XxRYR/JPGAaM6xGl57Ei95HUw9NV/uC3yFj
# rhc087qLJQawSC3xzY/EXzsT4I7sDbxOmM2rl4uKK6eEpurRduOQ2hTkmG1hSuWY
# BunFGNv21Kt4N20AKmbeuSnGnsBCd2cjRKG79+TX+sTehawOoxfeOO/jR7wo3liw
# kGdzPJYHgnJ54UxbckF914AqHOiEV7xTnD1a69w/UTxwjEugpIPMIIE67SFZ2PMo
# 27xjlLAHWW3l1CEAFjLNHd3EQ79PUr8FUXetXr0CAwEAAaOCAhswggIXMA4GA1Ud
# DwEB/wQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUa2koOjUvSGNA
# z3vYr0npPtk92yEwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0
# dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0
# bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMA
# QTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFMh+0mqFKhvKGZgEByfPUBBP
# aKiiMIGEBgNVHR8EfTB7MHmgd6B1hnNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
# cGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUy
# MFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3JsMIGUBggr
# BgEFBQcBAQSBhzCBhDCBgQYIKwYBBQUHMAKGdWh0dHA6Ly93d3cubWljcm9zb2Z0
# LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmlj
# YXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNy
# dDANBgkqhkiG9w0BAQwFAAOCAgEAX4h2x35ttVoVdedMeGj6TuHYRJklFaW4sTQ5
# r+k77iB79cSLNe+GzRjv4pVjJviceW6AF6ycWoEYR0LYhaa0ozJLU5Yi+LCmcrdo
# vkl53DNt4EXs87KDogYb9eGEndSpZ5ZM74LNvVzY0/nPISHz0Xva71QjD4h+8z2X
# MOZzY7YQ0Psw+etyNZ1CesufU211rLslLKsO8F2aBs2cIo1k+aHOhrw9xw6JCWON
# NboZ497mwYW5EfN0W3zL5s3ad4Xtm7yFM7Ujrhc0aqy3xL7D5FR2J7x9cLWMq7eb
# 0oYioXhqV2tgFqbKHeDick+P8tHYIFovIP7YG4ZkJWag1H91KlELGWi3SLv10o4K
# Gag42pswjybTi4toQcC/irAodDW8HNtX+cbz0sMptFJK+KObAnDFHEsukxD+7jFf
# EV9Hh/+CSxKRsmnuiovCWIOb+H7DRon9TlxydiFhvu88o0w35JkNbJxTk4MhF/Kg
# aXn0GxdH8elEa2Imq45gaa8D+mTm8LWVydt4ytxYP/bqjN49D9NZ81coE6aQWm88
# TwIf4R4YZbOpMKN0CyejaPNN41LGXHeCUMYmBx3PkP8ADHD1J2Cr/6tjuOOCztfp
# +o9Nc+ZoIAkpUcA/X2gSMkgHAPUvIdtoSAHEUKiBhI6JQivRepyvWcl+JYbYbBh7
# pmgAXVswggefMIIFh6ADAgECAhMzAAAAWvYNZ4yF7d0IAAAAAABaMA0GCSqGSIb3
# DQEBDAUAMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
# YXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGlu
# ZyBDQSAyMDIwMB4XDTI2MDEwODE4NTkwM1oXDTI3MDEwNzE4NTkwM1owgeMxCzAJ
# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jv
# c29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVs
# ZCBUU1MgRVNOOjQ5MUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3NvZnQgUHVi
# bGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEB
# BQADggIPADCCAgoCggIBAO/0O0eWjgUb9rnHcQLRdfWPN4H+91a3YnlaP46E1m4u
# D+JKx6csWMStX79fxLJUAqHJqQWE19UlNMhS9jEB32dAJ4yuWsHyUuM+dphjDz4E
# 5jl4gYGZEmaOrKvNt+KqlFayyg/oTg3BlLRu4aBq8668A5qlHcfsuh6DdSqFID1i
# xJFZzHrZFG1iGBG7U1Bn2ONLDo7jbwX5rMcPduTAUw/c7M3WhSxQBuZpQiz8RQGK
# IqCKfIxgQkKdzpCpU0SWQOE/DgTXbz3c15KMRCdkGlL2zb+lnuSV4sseQm3qflZi
# ZckLyn2xJI8ZXDkq+Ig+b/rsPPIfI8di228WvK1j67JXpyeVCaSUO9ErzlLnTrnj
# QkeXVQIp73xuVBVrmvoTf/v4a7MnrmuKSyIXc5vJUHEGB345+O8omFt1w8b+Xg9D
# 9PKIRqDPEv7HRk0C+Yvxu8FvHJvSocSIZK+v/FmKFOipYnpP76yAmJNnyheucShO
# gk8QiU53USn/+AyMb7xW905gZnyNqb29HeVdQ175pDHJGEz8Cx5wiHeVliGz5hAB
# ucFDylR9z3LSTmB6+3ZuIxeG9BZS46P6ANPkuVuD5m8wgc7GLLzg73CsDF09ukt8
# Uf8dTcMBX3ro+7/k9M6Xt8WPG7IL9v/4DvyMY03tkb9Y9Ri6HWavXRPYRCUePspP
# AgMBAAGjggHLMIIBxzAdBgNVHQ4EFgQUjmOyQ6twMcP1ZbRytJxI4fnXmcIwHwYD
# VR0jBBgwFoAUa2koOjUvSGNAz3vYr0npPtk92yEwbAYDVR0fBGUwYzBhoF+gXYZb
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw
# UHVibGljJTIwUlNBJTIwVGltZXN0YW1waW5nJTIwQ0ElMjAyMDIwLmNybDB5Bggr
# BgEFBQcBAQRtMGswaQYIKwYBBQUHMAKGXWh0dHA6Ly93d3cubWljcm9zb2Z0LmNv
# bS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwUHVibGljJTIwUlNBJTIwVGltZXN0
# YW1waW5nJTIwQ0ElMjAyMDIwLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQM
# MAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBmBgNVHSAEXzBdMFEGDCsGAQQB
# gjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
# cGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wCAYGZ4EMAQQCMA0GCSqGSIb3DQEB
# DAUAA4ICAQCAlM8r+t3hIb2h1lDTAx+iYkQlxFuU7QONeyIFIBZ29xvGl8pehKxE
# rDzIniOpIX/eluUAwQKoaI0zwuKAdR0mrSHXCniMoLNko5W+5r7sXNamKX7QMV3B
# fGOX3gi9qVfxyUe7AHXbqQ8KBQHNYCnNFtQQHgARrlYhtyAKol5ctM0CAc/y3oY7
# bTMsVJvnA5u7DVWPeXoST2KEMDeLBvJYq0IJZ6yMpDOWLZ4UP82bksyShIB/Xdaw
# irIGLdseudryRxVMk313mAcjGRb59+Ittt6otVvYQWqH+PGrTUzEcez8aQuO3umo
# NZjKuFoX5VsPP/gSZse+orhG3zfZk9IDyE3DfUFrhvkv6H0tijK1D0uIGhwMBWSm
# 9ktQ6oeU+aurZFx3MI+LODnHsbRFZAy11uMvwKq+ZNC1Se4tIM1u9piWAhnTPoh6
# mULKikHOVhHaO953tkzDCtjsse5GUKOx9yg9nqHKWMgnODp62/uPPzC/yDEISrXC
# cU7UB7tATr3zWNEdtM4d009iXWI6dV/SdcIIX44rpoLyCLw+nXjxp+fY/dygLO7U
# dSQaVaUFVj3K2nVyuujPspt5Lunc5FvuYPqmi/z8kASmmwbiF+W0P0UTWFaC84MW
# fU2h6MDg5s0oxmdNFK76jXr3wZfdSoV7FCKfq5GdeGoy5UwDQwMC0DGCA9QwggPQ
# AgEBMHgwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5n
# IENBIDIwMjACEzMAAABa9g1njIXt3QgAAAAAAFowDQYJYIZIAWUDBAIBBQCgggEt
# MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgEVJf
# sv9yg+GI3nDNIyax9iUvySa6uWh+h5LmWEKBuiowgd0GCyqGSIb3DQEJEAIvMYHN
# MIHKMIHHMIGgBCBiuWRAi+p96PRsBt3TwW3jNozgPQS+Qco1CVm/NaU0QzB8MGWk
# YzBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0Eg
# MjAyMAITMwAAAFr2DWeMhe3dCAAAAAAAWjAiBCBsCIKbBVzkK4UpTLbF7yBejMI2
# YtIaiZ1AQn/5jcseOjANBgkqhkiG9w0BAQsFAASCAgDGANzw26yGIxYllbrEhXsK
# ZJKNChOtCIDNegBTpoReW8i0KtswV+vN0RnNJCwXB4ujXGBQgOkP8F92ECnRVptk
# sTiygSjQM2omrfFxBVUcEp8+qoaz8zTdyc6gIwe86Eu9eSfpkNZxzCFzXk1wKbKV
# FxRpCrgTfj6smiMmn27vtuqGE0P7teN1Ddcd4nyf0tfgfcbtWQcOFFulSOenno3n
# JnY71IyfplrCpOqAwaAkup9so+G4ghen5s2NZtTYYTYi5OmF73GUHlj7lkNi3l2c
# CHwQg4Q2BU5WYilCdPMKvdtek9NSxyC6bo8sry1A5sH1IqlqpXWgo/3xDv0ru9rC
# 4VQYcjCKBX233dzYHkLH/rPdjDsC8Y56jcfmEWwf+8nWbT8XHKhfth+m6Fvhq6lA
# /aZlRdcsf0fTgTO/UVMEINlK0jEFxOtPNlAC5pdPsVXKs2xrSRvjDSh72kkRIa5k
# XCnUQcuZFesgf+rcwrnOtmE5wTbxKxAvxlL3Wa5XNXsrxmvl7x0biwoNPJSQMs1p
# PCPptRgbf0dMRFgF/GeDGxTkcR6rMUajr7kblS7Y9my08LJxhcQKcIZCD7C8Xe4V
# 9MrWwjEgS+R4w62AEWhDhPy2joTj/kwBbyGScWuIL2pfCZfFV3j9y1wKT7otB1bD
# 4G2Z+BvjxU/BhkgB4WIpsA==
# SIG # End signature block