Public/Get/Get-InstalledPrinters.ps1

function Get-InstalledPrinters {
    <#
    .SYNOPSIS
        Gets printers installed for the currently logged-on user on a remote
        computer.
 
    .DESCRIPTION
        Opens a remote PowerShell session by using Start-NewPSRemoteSession,
        detects the active interactive user on the target host, and returns the
        printers visible to that user. User-specific printer connections are
        resolved from the user's HKEY_USERS printer connection registry key and
        correlated with Win32_Printer output so the results include both machine
        and per-user printer mappings.
 
    .PARAMETER ComputerName
        One or more remote computers to query.
 
    .PARAMETER Credential
        Credential used for remoting.
 
    .PARAMETER UseSsh
        Use SSH transport instead of WSMan.
 
    .PARAMETER UseCredSSP
        Use CredSSP for WSMan remoting.
 
    .PARAMETER Port
        SSH port when -UseSsh is specified.
 
    .PARAMETER Ps7ConfigName
        WSMan PowerShell 7 endpoint name.
 
    .PARAMETER WinPsConfigName
        WSMan Windows PowerShell endpoint name.
 
    .PARAMETER UserName
        SSH username when not using PSCredential.
 
    .PARAMETER KeyFilePath
        SSH private key path when using key-based auth.
 
    .EXAMPLE
        Get-InstalledPrinters -ComputerName PC-01 -Credential $cred
 
    .EXAMPLE
        'PC-01','PC-02' | Get-InstalledPrinters -Credential $cred -UseCredSSP
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [Alias('Name', 'CN')]
        [string[]]$ComputerName,

        [pscredential]$Credential,

        [switch]$UseSsh,
        [switch]$UseCredSSP,

        [int]$Port = 22,

        [string]$Ps7ConfigName = 'PowerShell.7',
        [string]$WinPsConfigName = 'Microsoft.PowerShell',

        [string]$UserName,
        [string]$KeyFilePath
    )

    begin {
        Set-StrictMode -Version Latest
        Initialize-TechToolboxRuntime
    }

    process {
        foreach ($targetComputer in $ComputerName) {
            if ([string]::IsNullOrWhiteSpace($targetComputer)) {
                continue
            }

            $session = $null
            try {
                Write-Log -Level Info -Message "[$targetComputer] Querying installed printers for active user."

                $sessionParams = @{
                    ComputerName    = $targetComputer
                    Credential      = $Credential
                    UseSsh          = $UseSsh
                    UseCredSSP      = $UseCredSSP
                    Port            = $Port
                    Ps7ConfigName   = $Ps7ConfigName
                    WinPsConfigName = $WinPsConfigName
                }

                if ($PSBoundParameters.ContainsKey('UserName')) {
                    $sessionParams.UserName = $UserName
                }

                if ($PSBoundParameters.ContainsKey('KeyFilePath')) {
                    $sessionParams.KeyFilePath = $KeyFilePath
                }

                $session = Start-NewPSRemoteSession @sessionParams

                $printerResults = Invoke-Command -Session $session -ErrorAction Stop -ScriptBlock {
                    Set-StrictMode -Version Latest

                    function Convert-PrinterConnectionName {
                        param([Parameter(Mandatory)][string]$RegistryName)

                        $normalized = $RegistryName.Trim() -replace '^,+', ''
                        if ([string]::IsNullOrWhiteSpace($normalized)) {
                            return $null
                        }

                        $parts = @($normalized -split ',+') | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }
                        if ($parts.Count -lt 2) {
                            return $null
                        }

                        return ('\\{0}\{1}' -f $parts[0], $parts[1])
                    }

                    $computerSystem = Get-CimInstance -ClassName Win32_ComputerSystem -ErrorAction Stop
                    $loggedOnUser = [string]$computerSystem.UserName
                    if ([string]::IsNullOrWhiteSpace($loggedOnUser)) {
                        throw 'No interactive user is currently logged on.'
                    }

                    $userSid = ([System.Security.Principal.NTAccount]$loggedOnUser).Translate([System.Security.Principal.SecurityIdentifier]).Value
                    $connectionPath = 'Registry::HKEY_USERS\{0}\Printers\Connections' -f $userSid
                    $userConnections = @()

                    if (Test-Path -LiteralPath $connectionPath) {
                        $userConnections = @(
                            Get-ChildItem -LiteralPath $connectionPath -ErrorAction SilentlyContinue |
                            ForEach-Object { Convert-PrinterConnectionName -RegistryName $_.PSChildName } |
                            Where-Object { -not [string]::IsNullOrWhiteSpace($_) } |
                            Sort-Object -Unique
                        )
                    }

                    $printerMap = @{}
                    foreach ($printer in @(Get-CimInstance -ClassName Win32_Printer -ErrorAction Stop)) {
                        $printerMap[$printer.Name] = $printer
                    }

                    $output = New-Object System.Collections.Generic.List[object]

                    foreach ($printer in @($printerMap.Values | Sort-Object Name)) {
                        $isUserConnection = ($printer.Name -like '\\*\*') -or ($userConnections -contains $printer.Name)

                        [void]$output.Add([pscustomobject]@{
                                ComputerName             = $env:COMPUTERNAME
                                LoggedOnUser             = $loggedOnUser
                                UserSid                  = $userSid
                                PrinterName              = $printer.Name
                                ShareName                = $printer.ShareName
                                DriverName               = $printer.DriverName
                                PortName                 = $printer.PortName
                                ServerName               = $printer.ServerName
                                SystemName               = $printer.SystemName
                                Network                  = [bool]$printer.Network
                                Default                  = [bool]$printer.Default
                                PrinterStatus            = $printer.PrinterStatus
                                UserConnection           = [bool]$isUserConnection
                                InstalledForLoggedOnUser = [bool]((-not $printer.Network) -or $isUserConnection)
                            })
                    }

                    foreach ($connectionName in $userConnections) {
                        if ($printerMap.ContainsKey($connectionName)) {
                            continue
                        }

                        [void]$output.Add([pscustomobject]@{
                                ComputerName             = $env:COMPUTERNAME
                                LoggedOnUser             = $loggedOnUser
                                UserSid                  = $userSid
                                PrinterName              = $connectionName
                                ShareName                = $null
                                DriverName               = $null
                                PortName                 = $null
                                ServerName               = $null
                                SystemName               = $null
                                Network                  = $true
                                Default                  = $false
                                PrinterStatus            = $null
                                UserConnection           = $true
                                InstalledForLoggedOnUser = $true
                            })
                    }

                    return @($output | Sort-Object PrinterName)
                }

                foreach ($printerResult in @($printerResults)) {
                    $printerResult
                }
            }
            catch {
                Write-Log -Level Error -Message "[$targetComputer] Failed to get installed printers: $($_.Exception.Message)"
                throw
            }
            finally {
                if ($session) {
                    Remove-PSSession -Session $session -ErrorAction SilentlyContinue
                }
            }
        }
    }
}

# SIG # Begin signature block
# MIIfAgYJKoZIhvcNAQcCoIIe8zCCHu8CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDlDdxiTIwu7TjY
# mwbFu8rSOjrzmCtx/5sWNLV2ntC9VqCCGEowggUMMIIC9KADAgECAhAR+U4xG7FH
# qkyqS9NIt7l5MA0GCSqGSIb3DQEBCwUAMB4xHDAaBgNVBAMME1ZBRFRFSyBDb2Rl
# IFNpZ25pbmcwHhcNMjUxMjE5MTk1NDIxWhcNMjYxMjE5MjAwNDIxWjAeMRwwGgYD
# VQQDDBNWQURURUsgQ29kZSBTaWduaW5nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
# MIICCgKCAgEA3pzzZIUEY92GDldMWuzvbLeivHOuMupgpwbezoG5v90KeuN03S5d
# nM/eom/PcIz08+fGZF04ueuCS6b48q1qFnylwg/C/TkcVRo0WFcKoFGT8yGxdfXi
# caHtapZfbSRh73r7qR7w0CioVveNBVgfMsTgE0WKcuwxemvIe/ptmkfzwAiw/IAC
# Ib0E0BjiX4PySbwWy/QKy/qMXYY19xpRItVTKNBtXzADUtzPzUcFqJU83vM2gZFs
# Or0MhPvM7xEVkOWZFBAWAubbMCJ3rmwyVv9keVDJChhCeLSz2XR11VGDOEA2OO90
# Y30WfY9aOI2sCfQcKMeJ9ypkHl0xORdhUwZ3Wz48d3yJDXGkduPm2vl05RvnA4T6
# 29HVZTmMdvP2475/8nLxCte9IB7TobAOGl6P1NuwplAMKM8qyZh62Br23vcx1fXZ
# TJlKCxBFx1nTa6VlIJk+UbM4ZPm954peB/fIqEacm8LkZ0cPwmLE5ckW7hfK4Trs
# o+RaudU1sKeA+FvpOWgsPccVRWcEYyGkwbyTB3xrIBXA+YckbANZ0XL7fv7x29hn
# gXbZipGu3DnTISiFB43V4MhNDKZYfbWdxze0SwLe8KzIaKnwlwRgvXDMwXgk99Mi
# EbYa3DvA/5ZWikLW9PxBFD7Vdr8ZiG/tRC9I2Y6fnb+PVoZKc/2xsW0CAwEAAaNG
# MEQwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMB0GA1UdDgQW
# BBRfYLVE8caSc990rnrIHUjoB7X/KjANBgkqhkiG9w0BAQsFAAOCAgEAiGB2Wmk3
# QBtd1LcynmxHzmu+X4Y5DIpMMNC2ahsqZtPUVcGqmb5IFbVuAdQphL6PSrDjaAR8
# 1S8uTfUnMa119LmIb7di7TlH2F5K3530h5x8JMj5EErl0xmZyJtSg7BTiBA/UrMz
# 6WCf8wWIG2/4NbV6aAyFwIojfAcKoO8ng44Dal/oLGzLO3FDE5AWhcda/FbqVjSJ
# 1zMfiW8odd4LgbmoyEI024KkwOkkPyJQ2Ugn6HMqlFLazAmBBpyS7wxdaAGrl18n
# 6bS7QuAwCd9hitdMMitG8YyWL6tKeRSbuTP5E+ASbu0Ga8/fxRO5ZSQhO6/5ro1j
# PGe1/Kr49Uyuf9VSCZdNIZAyjjeVAoxmV0IfxQLKz6VOG0kGDYkFGskvllIpQbQg
# WLuPLJxoskJsoJllk7MjZJwrpr08+3FQnLkRuisjDOc3l4VxFUsUe4fnJhMUONXT
# Sk7vdspgxirNbLmXU4yYWdsizz3nMUR0zebUW29A+HYme16hzrMPOeyoQjy4I5XX
# 3wXAFdworfPEr/ozDFrdXKgbLwZopymKbBwv6wtT7+1zVhJXr+jGVQ1TWr6R+8ea
# tIOFnY7HqGaxe5XB7HzOwJKdj+bpHAfXft1vUoiKr16VajLigcYCG8MdwC3sngO3
# JDyv2V+YMfsYBmItMGBwvizlQ6557NbK95EwggWNMIIEdaADAgECAhAOmxiO+dAt
# 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV
# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa
# Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy
# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD
# ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
# ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E
# MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy
# unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF
# xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1
# 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB
# MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR
# WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6
# nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB
# YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S
# UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x
# q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB
# NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP
# TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC
# AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
# Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv
# bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0
# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB
# LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc
# Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov
# Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy
# oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW
# juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF
# mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z
# twGpn1eqXijiuZQwgga0MIIEnKADAgECAhANx6xXBf8hmS5AQyIMOkmGMA0GCSqG
# SIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx
# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy
# dXN0ZWQgUm9vdCBHNDAeFw0yNTA1MDcwMDAwMDBaFw0zODAxMTQyMzU5NTlaMGkx
# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4
# RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYg
# MjAyNSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC0eDHTCphB
# cr48RsAcrHXbo0ZodLRRF51NrY0NlLWZloMsVO1DahGPNRcybEKq+RuwOnPhof6p
# vF4uGjwjqNjfEvUi6wuim5bap+0lgloM2zX4kftn5B1IpYzTqpyFQ/4Bt0mAxAHe
# HYNnQxqXmRinvuNgxVBdJkf77S2uPoCj7GH8BLuxBG5AvftBdsOECS1UkxBvMgEd
# gkFiDNYiOTx4OtiFcMSkqTtF2hfQz3zQSku2Ws3IfDReb6e3mmdglTcaarps0wjU
# jsZvkgFkriK9tUKJm/s80FiocSk1VYLZlDwFt+cVFBURJg6zMUjZa/zbCclF83bR
# VFLeGkuAhHiGPMvSGmhgaTzVyhYn4p0+8y9oHRaQT/aofEnS5xLrfxnGpTXiUOeS
# LsJygoLPp66bkDX1ZlAeSpQl92QOMeRxykvq6gbylsXQskBBBnGy3tW/AMOMCZIV
# NSaz7BX8VtYGqLt9MmeOreGPRdtBx3yGOP+rx3rKWDEJlIqLXvJWnY0v5ydPpOjL
# 6s36czwzsucuoKs7Yk/ehb//Wx+5kMqIMRvUBDx6z1ev+7psNOdgJMoiwOrUG2Zd
# SoQbU2rMkpLiQ6bGRinZbI4OLu9BMIFm1UUl9VnePs6BaaeEWvjJSjNm2qA+sdFU
# eEY0qVjPKOWug/G6X5uAiynM7Bu2ayBjUwIDAQABo4IBXTCCAVkwEgYDVR0TAQH/
# BAgwBgEB/wIBADAdBgNVHQ4EFgQU729TSunkBnx6yuKQVvYv1Ensy04wHwYDVR0j
# BBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1Ud
# JQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0
# cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0
# cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8E
# PDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVz
# dGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEw
# DQYJKoZIhvcNAQELBQADggIBABfO+xaAHP4HPRF2cTC9vgvItTSmf83Qh8WIGjB/
# T8ObXAZz8OjuhUxjaaFdleMM0lBryPTQM2qEJPe36zwbSI/mS83afsl3YTj+IQhQ
# E7jU/kXjjytJgnn0hvrV6hqWGd3rLAUt6vJy9lMDPjTLxLgXf9r5nWMQwr8Myb9r
# EVKChHyfpzee5kH0F8HABBgr0UdqirZ7bowe9Vj2AIMD8liyrukZ2iA/wdG2th9y
# 1IsA0QF8dTXqvcnTmpfeQh35k5zOCPmSNq1UH410ANVko43+Cdmu4y81hjajV/gx
# dEkMx1NKU4uHQcKfZxAvBAKqMVuqte69M9J6A47OvgRaPs+2ykgcGV00TYr2Lr3t
# y9qIijanrUR3anzEwlvzZiiyfTPjLbnFRsjsYg39OlV8cipDoq7+qNNjqFzeGxcy
# tL5TTLL4ZaoBdqbhOhZ3ZRDUphPvSRmMThi0vw9vODRzW6AxnJll38F0cuJG7uEB
# YTptMSbhdhGQDpOXgpIUsWTjd6xpR6oaQf/DJbg3s6KCLPAlZ66RzIg9sC+NJpud
# /v4+7RWsWCiKi9EOLLHfMR2ZyJ/+xhCx9yHbxtl5TPau1j/1MIDpMPx0LckTetiS
# uEtQvLsNz3Qbp7wGWqbIiOWCnb5WqxL3/BAPvIXKUjPSxyZsq8WhbaM2tszWkPZP
# ubdcMIIG7TCCBNWgAwIBAgIQCoDvGEuN8QWC0cR2p5V0aDANBgkqhkiG9w0BAQsF
# ADBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNV
# BAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYgU0hB
# MjU2IDIwMjUgQ0ExMB4XDTI1MDYwNDAwMDAwMFoXDTM2MDkwMzIzNTk1OVowYzEL
# MAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJE
# aWdpQ2VydCBTSEEyNTYgUlNBNDA5NiBUaW1lc3RhbXAgUmVzcG9uZGVyIDIwMjUg
# MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANBGrC0Sxp7Q6q5gVrMr
# V7pvUf+GcAoB38o3zBlCMGMyqJnfFNZx+wvA69HFTBdwbHwBSOeLpvPnZ8ZN+vo8
# dE2/pPvOx/Vj8TchTySA2R4QKpVD7dvNZh6wW2R6kSu9RJt/4QhguSssp3qome7M
# rxVyfQO9sMx6ZAWjFDYOzDi8SOhPUWlLnh00Cll8pjrUcCV3K3E0zz09ldQ//nBZ
# ZREr4h/GI6Dxb2UoyrN0ijtUDVHRXdmncOOMA3CoB/iUSROUINDT98oksouTMYFO
# nHoRh6+86Ltc5zjPKHW5KqCvpSduSwhwUmotuQhcg9tw2YD3w6ySSSu+3qU8DD+n
# igNJFmt6LAHvH3KSuNLoZLc1Hf2JNMVL4Q1OpbybpMe46YceNA0LfNsnqcnpJeIt
# K/DhKbPxTTuGoX7wJNdoRORVbPR1VVnDuSeHVZlc4seAO+6d2sC26/PQPdP51ho1
# zBp+xUIZkpSFA8vWdoUoHLWnqWU3dCCyFG1roSrgHjSHlq8xymLnjCbSLZ49kPmk
# 8iyyizNDIXj//cOgrY7rlRyTlaCCfw7aSUROwnu7zER6EaJ+AliL7ojTdS5PWPsW
# eupWs7NpChUk555K096V1hE0yZIXe+giAwW00aHzrDchIc2bQhpp0IoKRR7YufAk
# prxMiXAJQ1XCmnCfgPf8+3mnAgMBAAGjggGVMIIBkTAMBgNVHRMBAf8EAjAAMB0G
# A1UdDgQWBBTkO/zyMe39/dfzkXFjGVBDz2GM6DAfBgNVHSMEGDAWgBTvb1NK6eQG
# fHrK4pBW9i/USezLTjAOBgNVHQ8BAf8EBAMCB4AwFgYDVR0lAQH/BAwwCgYIKwYB
# BQUHAwgwgZUGCCsGAQUFBwEBBIGIMIGFMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz
# cC5kaWdpY2VydC5jb20wXQYIKwYBBQUHMAKGUWh0dHA6Ly9jYWNlcnRzLmRpZ2lj
# ZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFRpbWVTdGFtcGluZ1JTQTQwOTZTSEEy
# NTYyMDI1Q0ExLmNydDBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vY3JsMy5kaWdp
# Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRUaW1lU3RhbXBpbmdSU0E0MDk2U0hB
# MjU2MjAyNUNBMS5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcB
# MA0GCSqGSIb3DQEBCwUAA4ICAQBlKq3xHCcEua5gQezRCESeY0ByIfjk9iJP2zWL
# pQq1b4URGnwWBdEZD9gBq9fNaNmFj6Eh8/YmRDfxT7C0k8FUFqNh+tshgb4O6Lgj
# g8K8elC4+oWCqnU/ML9lFfim8/9yJmZSe2F8AQ/UdKFOtj7YMTmqPO9mzskgiC3Q
# YIUP2S3HQvHG1FDu+WUqW4daIqToXFE/JQ/EABgfZXLWU0ziTN6R3ygQBHMUBaB5
# bdrPbF6MRYs03h4obEMnxYOX8VBRKe1uNnzQVTeLni2nHkX/QqvXnNb+YkDFkxUG
# tMTaiLR9wjxUxu2hECZpqyU1d0IbX6Wq8/gVutDojBIFeRlqAcuEVT0cKsb+zJNE
# suEB7O7/cuvTQasnM9AWcIQfVjnzrvwiCZ85EE8LUkqRhoS3Y50OHgaY7T/lwd6U
# Arb+BOVAkg2oOvol/DJgddJ35XTxfUlQ+8Hggt8l2Yv7roancJIFcbojBcxlRcGG
# 0LIhp6GvReQGgMgYxQbV1S3CrWqZzBt1R9xJgKf47CdxVRd/ndUlQ05oxYy2zRWV
# FjF7mcr4C34Mj3ocCVccAvlKV9jEnstrniLvUxxVZE/rptb7IRE2lskKPIJgbaP5
# t2nGj/ULLi49xTcBZU8atufk+EMF/cWuiC7POGT75qaL6vdCvHlshtjdNXOCIUjs
# arfNZzGCBg4wggYKAgEBMDIwHjEcMBoGA1UEAwwTVkFEVEVLIENvZGUgU2lnbmlu
# ZwIQEflOMRuxR6pMqkvTSLe5eTANBglghkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3
# AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisG
# AQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBecLb46qJb
# 8UWPg4ADgEm7Z0bFIymhyy5YLz0cwNnUvzANBgkqhkiG9w0BAQEFAASCAgAIMaGq
# 370KELWW82WjyqK+bKiGbdqsjUeQdUsnb+6VI34Hg/cI0nWMImMWiU8GOpiplSzh
# xxpNoIEKAUnnNzFU0QWxPDHQvRtS8TUScSzXlcj/sjVU8FcBy54Epf7EfJ7EenyH
# iSU0FFc+JDxX/Ulqo3nnSvdXIKm9MV+ssnYWB1ssO0WBJfnKoGNI73jlXqBqCnNq
# q1Wjk5L+3kLwvnhRcMBZRLy2vbhLDZXLlzNeFcXFS1AiB+hCnWJyCMpGrMDx16DP
# v3KXC849k9COdMmo7dYWthNJIne76o+Sxa7qDySFt/SVOP790mStUOuoo0QsB5rL
# v+s1W1/pIZlMV3QPiQQ9/HLIgtiqJ6uxXghQSBcBPbTTxNw/F7W5C8aN79JGnHSa
# Dfetob1Pn6aQW9H/ds3rAHMzxWmMr6yB6NQ10BocsBTn/cLvGPmFD8Lpzm5otfWd
# yc+z7UjdNF9Ru6tl5nAsvFQjjQ34XIaqE7BuW8P2gYMzdTCXB1KmK8Ces7ibkpnV
# jpRtOYnGPisqWFT/g/MIHCphpY16325tC5gcCjVQbhu43biJC5onfKVrSTNtQS/G
# PJB0xX5U0MXTERDvZhtQzTEN7dVKg7X7MX0e9MaYFAR1zF5/PuT44XW/bqMdTRMx
# G5upRM0+izom5FPey85GPLkytrfQyhyLyRTFn6GCAyYwggMiBgkqhkiG9w0BCQYx
# ggMTMIIDDwIBATB9MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcg
# UlNBNDA5NiBTSEEyNTYgMjAyNSBDQTECEAqA7xhLjfEFgtHEdqeVdGgwDQYJYIZI
# AWUDBAIBBQCgaTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJ
# BTEPFw0yNjA0MjUwMzM2MzVaMC8GCSqGSIb3DQEJBDEiBCDUhiwQQ4pWYevjDgjE
# yhB8nUjn4amd9qtOzXnPeEG4qjANBgkqhkiG9w0BAQEFAASCAgAwgckE5gQ57yBH
# GI9iO9SqzZJEWiRL5JgDONlYS9bA/WO9NmFMENdGqBePtmohNpp+lW6f4eDbYONz
# UKJp4HVuttc91/vOIIhE3b55WDof4h1Aala3n10bkNcNlwwzG6Pspb9FbIiNJPrg
# jnBJiH2wpz7va+j3KmPeb5HJl1UE+o8RaFmDvywis6e7kQ4QacXRV9teXmcnqUfV
# lsxWpz4xdUi79GVYYJ7dcnZf+x1dlc3eS+cdjnq8zQicxlW1pmCMuv8PesA7F3dT
# olbmGNgmamjHcbJIQQDcRcDmVelN/7lskIKrRR34jnU2kpfMTYmEHLdaHIe5QAVB
# vOaG3kJ7PtgtR6GlakLH8f8NHNXFkAwA3gbLBHswTdhFPP1NEhaZNK5XCL5fUgWN
# n5nhL1r1o3uBYuGAceiRUJo+FkIr/2DKqadPR9yIKss7z+GtWOdzZL+Oqx5up3si
# 8XMFFvGy+MhqrQVDLpEEwHnAfQkgd5FS4BYlGRV1HztC/ps6GPSalNMPQCqxtyMh
# HjjfXfjfN0A2So3fyglQC3C6cD3eDbcuETtb85xO0bOysUB3qFEavLW32DGNjZPF
# 1Fz29cRyAhhZTPPepZbj3NE6EKMWA0m1UAIfiGbBAvumMMJQujN8k2hPSY44OBHr
# NZ/FWDtYPnWp8OmVPHafl24F9A2CMw==
# SIG # End signature block