functions/Get-WUGPerformanceMonitor.ps1

<#
.SYNOPSIS
Get performance monitors from the WhatsUp Gold library or device-specific assignments.
 
.DESCRIPTION
Without -DeviceId, queries the monitor library via GET /api/v1/monitors/-?type=performance.
With -DeviceId, queries device assignments via GET /api/v1/devices/{deviceId}/monitors/-.
 
Use -Search to filter by display name, description, or classId in either mode.
 
.PARAMETER DeviceId
The device ID(s) to retrieve performance monitor assignments for.
Accepts pipeline input by property name. When omitted, searches the monitor library.
 
.PARAMETER Search
Return only monitors containing this string in display name, description,
classId, argument, or comment. Case-insensitive.
 
.PARAMETER MonitorTypeId
Filter results by monitor type ID.
 
.PARAMETER EnabledOnly
[Device mode] Return only enabled monitors. Default is $false (return all).
 
.PARAMETER View
Level of detail returned.
Device mode accepts: 'id', 'minimum', 'basic', 'status' (default 'status').
Library mode accepts: 'id', 'basic', 'info', 'summary', 'details' (default 'info').
 
.PARAMETER PageId
Page to return (for paging).
 
.PARAMETER Limit
Maximum number of results per page (0-250).
 
.PARAMETER IncludeDeviceMonitors
[Library mode] Return device-specific monitors. Default = 'false'.
 
.PARAMETER IncludeSystemMonitors
[Library mode] Return system monitors that cannot be modified. Default = 'false'.
 
.PARAMETER IncludeCoreMonitors
[Library mode] Return core monitors. Default = 'false'.
 
.EXAMPLE
Get-WUGPerformanceMonitor -Search 'Azure'
 
Searches the performance monitor library for monitors matching 'Azure'.
 
.EXAMPLE
Get-WUGPerformanceMonitor -DeviceId 3409
 
Returns all performance monitors assigned to device 3409.
 
.EXAMPLE
Get-WUGPerformanceMonitor -DeviceId 3409 -Search 'Memory'
 
Returns performance monitors matching 'Memory' on device 3409.
 
.NOTES
    Author: Jason Alberino (jason@wug.ninja)
    API Endpoint: GET /api/v1/monitors/- (library) or GET /api/v1/devices/{deviceId}/monitors/- (device)
    Module: WhatsUpGoldPS | https://github.com/jayyx2/WhatsUpGoldPS
#>

function Get-WUGPerformanceMonitor {
    [CmdletBinding(DefaultParameterSetName = 'Library')]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'Device', ValueFromPipelineByPropertyName = $true)]
        [Alias('id')]
        [int[]]$DeviceId,

        [string]$Search,

        [string]$MonitorTypeId,

        [Parameter(ParameterSetName = 'Device')]
        [bool]$EnabledOnly = $false,

        [ValidateSet("id", "minimum", "basic", "info", "summary", "details", "status")]
        [string]$View,

        [string]$PageId,

        [ValidateRange(0, 250)]
        [int]$Limit,

        [Parameter(ParameterSetName = 'Library')]
        [ValidateSet('true', 'false')]
        [string]$IncludeDeviceMonitors = 'false',

        [Parameter(ParameterSetName = 'Library')]
        [ValidateSet('true', 'false')]
        [string]$IncludeSystemMonitors = 'false',

        [Parameter(ParameterSetName = 'Library')]
        [ValidateSet('true', 'false')]
        [string]$IncludeCoreMonitors = 'false'
    )

    begin {
        if (-not $global:WUGBearerHeaders) {
            Write-Error -Message "Authorization header not set. Please run Connect-WUGServer first."
            return
        }
        if (-not $global:WhatsUpServerBaseURI) {
            Write-Error -Message "Base URI not found. Please run Connect-WUGServer first."
            return
        }
    }

    process {
        if ($PSCmdlet.ParameterSetName -eq 'Library') {
            # Validate View values for Library mode
            if ($View -and $View -notin @('id', 'basic', 'info', 'summary', 'details')) {
                Write-Error "View value '$View' is not valid for Library mode. Valid values: id, basic, info, summary, details."
                return
            }
            # Library search: GET /api/v1/monitors/-?type=performance
            $qs = "type=performance"
            if ($View)                  { $qs += "&view=$View" }
            if ($IncludeDeviceMonitors) { $qs += "&includeDeviceMonitors=$IncludeDeviceMonitors" }
            if ($IncludeSystemMonitors) { $qs += "&includeSystemMonitors=$IncludeSystemMonitors" }
            if ($IncludeCoreMonitors)   { $qs += "&includeCoreMonitors=$IncludeCoreMonitors" }
            if ($Search)                { $qs += "&search=$([uri]::EscapeDataString($Search))" }
            if ($Limit)                 { $qs += "&limit=$Limit" }

            $baseUri = "${global:WhatsUpServerBaseURI}/api/v1/monitors/-?${qs}"

            # Auto-paginate unless caller specified a specific page
            $currentPageId = $PageId
            $userRequestedPage = [bool]$PageId
            do {
                if ($currentPageId) {
                    $uri = "${baseUri}&pageId=$currentPageId"
                } else {
                    $uri = $baseUri
                }
                Write-Debug "GET $uri"

                try {
                    $response = Get-WUGAPIResponse -Uri $uri -Method GET
                    if ($response.data -and $response.data.performanceMonitors) {
                        foreach ($mon in $response.data.performanceMonitors) {
                            [PSCustomObject]@{
                                Id              = $mon.id
                                MonitorId       = $mon.monitorId
                                Name            = $mon.name
                                Description     = $mon.description
                                ClassId         = if ($mon.monitorTypeInfo) { $mon.monitorTypeInfo.classId } else { $null }
                                BaseType        = if ($mon.monitorTypeInfo) { $mon.monitorTypeInfo.baseType } else { $null }
                                MonitorTypeName = if ($mon.monitorTypeInfo) { $mon.monitorTypeInfo.name } else { $null }
                                TemplateId      = $mon.templateId
                                PropertyBags    = $mon.propertyBags
                                HasSensitiveData = $mon.hasSensitiveData
                                OwnedByDevice   = $mon.ownedByDevice
                            }
                        }
                    }
                    $currentPageId = if ($response.paging) { $response.paging.nextPageId } else { $null }
                }
                catch {
                    Write-Error "Failed to retrieve performance monitor library: $_"
                    break
                }
            } while ($currentPageId -and -not $userRequestedPage)
        }
        else {
            # Device assignments: GET /api/v1/devices/{deviceId}/monitors/-?type=performance
            if (-not $View) { $View = 'status' }
            # Validate View values for Device mode
            if ($View -notin @('id', 'minimum', 'basic', 'status')) {
                Write-Error "View value '$View' is not valid for Device mode. Valid values: id, minimum, basic, status."
                return
            }
            foreach ($devId in $DeviceId) {
                $qs = "type=performance"
                if ($View)          { $qs += "&view=$View" }
                if ($Search)        { $qs += "&search=$([uri]::EscapeDataString($Search))" }
                if ($MonitorTypeId) { $qs += "&monitorTypeId=$MonitorTypeId" }
                $qs += "&enabledOnly=$($EnabledOnly.ToString().ToLower())"
                if ($Limit)         { $qs += "&limit=$Limit" }

                $baseDevUri = "${global:WhatsUpServerBaseURI}/api/v1/devices/${devId}/monitors/-?${qs}"

                # Auto-paginate unless caller specified a specific page
                $currentPageId = $PageId
                $userRequestedPage = [bool]$PageId
                do {
                    if ($currentPageId) {
                        $uri = "${baseDevUri}&pageId=$currentPageId"
                    } else {
                        $uri = $baseDevUri
                    }
                    Write-Debug "GET $uri"

                    try {
                        $response = Get-WUGAPIResponse -Uri $uri -Method GET
                        if ($response.data) {
                            foreach ($mon in $response.data) {
                                [PSCustomObject]@{
                                    DeviceId            = $devId
                                    AssignmentId        = $mon.id
                                    Name                = $mon.description
                                    Description         = $mon.description
                                    Type                = $mon.type
                                    MonitorTypeId       = $mon.monitorTypeId
                                    MonitorTypeClassId  = $mon.monitorTypeClassId
                                    MonitorTypeName     = $mon.monitorTypeName
                                    Enabled             = $mon.enabled
                                    IsGlobal            = $mon.isGlobal
                                    Status              = $mon.status
                                    PollingIntervalMin  = if ($mon.performance) { $mon.performance.pollingIntervalMinutes } else { $null }
                                    ThresholdInfo       = $mon.thresholdInfo
                                }
                            }
                        }
                        $currentPageId = if ($response.paging) { $response.paging.nextPageId } else { $null }
                    }
                    catch {
                        Write-Error "Failed to retrieve performance monitors for device ${devId}: $_"
                        break
                    }
                } while ($currentPageId -and -not $userRequestedPage)
            }
        }
    }
}

# SIG # Begin signature block
# MIIVlwYJKoZIhvcNAQcCoIIViDCCFYQCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBjfs14FTK7+iVh
# V48RuJyfAlq2koT0df6VA5U14Xh2AqCCEdMwggVvMIIEV6ADAgECAhBI/JO0YFWU
# jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI
# DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM
# EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy
# dmljZXMwHhcNMjEwNTI1MDAwMDAwWhcNMjgxMjMxMjM1OTU5WjBWMQswCQYDVQQG
# EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS0wKwYDVQQDEyRTZWN0aWdv
# IFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUA
# A4ICDwAwggIKAoICAQCN55QSIgQkdC7/FiMCkoq2rjaFrEfUI5ErPtx94jGgUW+s
# hJHjUoq14pbe0IdjJImK/+8Skzt9u7aKvb0Ffyeba2XTpQxpsbxJOZrxbW6q5KCD
# J9qaDStQ6Utbs7hkNqR+Sj2pcaths3OzPAsM79szV+W+NDfjlxtd/R8SPYIDdub7
# P2bSlDFp+m2zNKzBenjcklDyZMeqLQSrw2rq4C+np9xu1+j/2iGrQL+57g2extme
# me/G3h+pDHazJyCh1rr9gOcB0u/rgimVcI3/uxXP/tEPNqIuTzKQdEZrRzUTdwUz
# T2MuuC3hv2WnBGsY2HH6zAjybYmZELGt2z4s5KoYsMYHAXVn3m3pY2MeNn9pib6q
# RT5uWl+PoVvLnTCGMOgDs0DGDQ84zWeoU4j6uDBl+m/H5x2xg3RpPqzEaDux5mcz
# mrYI4IAFSEDu9oJkRqj1c7AGlfJsZZ+/VVscnFcax3hGfHCqlBuCF6yH6bbJDoEc
# QNYWFyn8XJwYK+pF9e+91WdPKF4F7pBMeufG9ND8+s0+MkYTIDaKBOq3qgdGnA2T
# OglmmVhcKaO5DKYwODzQRjY1fJy67sPV+Qp2+n4FG0DKkjXp1XrRtX8ArqmQqsV/
# AZwQsRb8zG4Y3G9i/qZQp7h7uJ0VP/4gDHXIIloTlRmQAOka1cKG8eOO7F/05QID
# AQABo4IBEjCCAQ4wHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYD
# VR0OBBYEFDLrkpr/NZZILyhAQnAgNpFcF4XmMA4GA1UdDwEB/wQEAwIBhjAPBgNV
# HRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYE
# VR0gADAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21v
# ZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEE
# KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZI
# hvcNAQEMBQADggEBABK/oe+LdJqYRLhpRrWrJAoMpIpnuDqBv0WKfVIHqI0fTiGF
# OaNrXi0ghr8QuK55O1PNtPvYRL4G2VxjZ9RAFodEhnIq1jIV9RKDwvnhXRFAZ/ZC
# J3LFI+ICOBpMIOLbAffNRk8monxmwFE2tokCVMf8WPtsAO7+mKYulaEMUykfb9gZ
# pk+e96wJ6l2CxouvgKe9gUhShDHaMuwV5KZMPWw5c9QLhTkg4IUaaOGnSDip0TYl
# d8GNGRbFiExmfS9jzpjoad+sPKhdnckcW67Y8y90z7h+9teDnRGWYpquRRPaf9xH
# +9/DUp/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggYaMIIEAqADAgECAhBiHW0M
# UgGeO5B5FSCJIRwKMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYD
# VQQKEw9TZWN0aWdvIExpbWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENv
# ZGUgU2lnbmluZyBSb290IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5
# NTlaMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzAp
# BgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0G
# CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjI
# ztNsfvxYB5UXeWUzCxEeAEZGbEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NV
# DgFigOMYzB2OKhdqfWGVoYW3haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/3
# 6F09fy1tsB8je/RV0mIk8XL/tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05Zw
# mRmTnAO5/arnY83jeNzhP06ShdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm
# +qxp4VqpB3MV/h53yl41aHU5pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUe
# dyz8rNyfQJy/aOs5b4s+ac7IH60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz4
# 4MPZ1f9+YEQIQty/NQd/2yGgW+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBM
# dlyh2n5HirY4jKnFH/9gRvd+QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQY
# MBaAFDLrkpr/NZZILyhAQnAgNpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritU
# pimqF6TNDDAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNV
# HSUEDDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsG
# A1UdHwREMEIwQKA+oDyGOmh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1
# YmxpY0NvZGVTaWduaW5nUm9vdFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsG
# AQUFBzAChjpodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2Rl
# U2lnbmluZ1Jvb3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0
# aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURh
# w1aVcdGRP4Wh60BAscjW4HL9hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0Zd
# OaWTsyNyBBsMLHqafvIhrCymlaS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajj
# cw5+w/KeFvPYfLF/ldYpmlG+vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNc
# WbWDRF/3sBp6fWXhz7DcML4iTAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalO
# hOfCipnx8CaLZeVme5yELg09Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJs
# zkyeiaerlphwoKx1uHRzNyE6bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z7
# 6mKnzAfZxCl/3dq3dUNw4rg3sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5J
# KdGvspbOrTfOXyXvmPL6E52z1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHH
# j95Ejza63zdrEcxWLDX6xWls/GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2
# Bev6SivBBOHY+uqiirZtg0y9ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/
# L9Uo2bC5a4CH2RwwggY+MIIEpqADAgECAhAHnODk0RR/hc05c892LTfrMA0GCSqG
# SIb3DQEBDAUAMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0
# ZWQxKzApBgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYw
# HhcNMjYwMjA5MDAwMDAwWhcNMjkwNDIxMjM1OTU5WjBVMQswCQYDVQQGEwJVUzEU
# MBIGA1UECAwLQ29ubmVjdGljdXQxFzAVBgNVBAoMDkphc29uIEFsYmVyaW5vMRcw
# FQYDVQQDDA5KYXNvbiBBbGJlcmlubzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
# AgoCggIBAPN6aN4B1yYWkI5b5TBj3I0VV/peETrHb6EY4BHGxt8Ap+eT+WpEpJyE
# tRYPxEmNJL3A38Bkg7mwzPE3/1NK570ZBCuBjSAn4mSDIgIuXZnvyBO9W1OQs5d6
# 7MlJLUAEufl18tOr3ST1DeO9gSjQSAE5Nql0QDxPnm93OZBon+Fz3CmE+z3MwAe2
# h4KdtRAnCqwM+/V7iBdbw+JOxolpx+7RVjGyProTENIG3pe/hKvPb501lf8uBAAD
# LdjZr5ip8vIWbf857Yw1Bu10nVI7HW3eE8Cl5//d1ribHlzTzQLfttW+k+DaFsKZ
# BBL56l4YAlIVRsrOiE1kdHYYx6IGrEA809R7+TZA9DzGqyFiv9qmJAbL4fDwetDe
# yIq+Oztz1LvEdy8Rcd0JBY+J4S0eDEFIA3X0N8VcLeAwabKb9AjulKXwUeqCJLvN
# 79CJ90UTZb2+I+tamj0dn+IKMEsJ4v4Ggx72sxFr9+6XziodtTg5Luf2xd6+Phha
# mOxF2px9LObhBLLEMyRsCHZIzVZOFKu9BpHQH7ufGB+Sa80Tli0/6LEyn9+bMYWi
# 2ttn6lLOPThXMiQaooRUq6q2u3+F4SaPlxVFLI7OJVMhar6nW6joBvELTJPmANSM
# jDSRFDfHRCdGbZsL/keELJNy+jZctF6VvxQEjFM8/bazu6qYhrA7AgMBAAGjggGJ
# MIIBhTAfBgNVHSMEGDAWgBQPKssghyi47G9IritUpimqF6TNDDAdBgNVHQ4EFgQU
# 6YF0o0D5AVhKHbVocr8GaSIBibAwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQC
# MAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwSgYDVR0gBEMwQTA1BgwrBgEEAbIxAQIB
# AwIwJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9DUFMwCAYGZ4EM
# AQQBMEkGA1UdHwRCMEAwPqA8oDqGOGh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2Vj
# dGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FSMzYuY3JsMHkGCCsGAQUFBwEBBG0wazBE
# BggrBgEFBQcwAoY4aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGlj
# Q29kZVNpZ25pbmdDQVIzNi5jcnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNl
# Y3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4IBgQAEIsm4xnOd/tZMVrKwi3doAXvC
# wOA/RYQnFJD7R/bSQRu3wXEK4o9SIefye18B/q4fhBkhNAJuEvTQAGfqbbpxow03
# J5PrDTp1WPCWbXKX8Oz9vGWJFyJxRGftkdzZ57JE00synEMS8XCwLO9P32MyR9Z9
# URrpiLPJ9rQjfHMb1BUdvaNayomm7aWLAnD+X7jm6o8sNT5An1cwEAob7obWDM6s
# X93wphwJNBJAstH9Ozs6LwISOX6sKS7CKm9N3Kp8hOUue0ZHAtZdFl6o5u12wy+z
# zieGEI50fKnN77FfNKFOWKlS6OJwlArcbFegB5K89LcE5iNSmaM3VMB2ADV1FEcj
# GSHw4lTg1Wx+WMAMdl/7nbvfFxJ9uu5tNiT54B0s+lZO/HztwXYQUczdsFon3pjs
# Nrsk9ZlalBi5SHkIu+F6g7tWiEv3rtVApmJRnLkUr2Xq2a4nbslUCt4jKs5UX4V1
# nSX8OM++AXoyVGO+iTj7z+pl6XE9Gw/Td6WKKKsxggMaMIIDFgIBATBoMFQxCzAJ
# BgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNl
# Y3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYCEAec4OTRFH+FzTlzz3Yt
# N+swDQYJYIZIAWUDBAIBBQCggYQwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZ
# BgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYB
# BAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgb4UH3b2VLAn3uORZrUhWnzuKtBAu+q5w
# F1YCpPEgxP4wDQYJKoZIhvcNAQEBBQAEggIAQkoP5cSXqorMcjiziF4p3ot+/xua
# 3QO6acpj/WhwOGNd1rXb+znPuWLmtmQLNoFiyFC1pfU0ncWwwH6elXPRy206Rec7
# zYD7SwP8Mjhj0gY4qJNOvWwk/ks1Bm/hxCvSvW9orIxKE7+wExfFKD1tBtU1Xoev
# k17G8T3JWPxOxanFOduBzJwnIKANleS9lFtKkTegHIAPmN/VZ0qZskUTl9BVHJxz
# FDP5ZxUHmMi+0Si773xMbfFvqjMbojDijO2Daom4IfSbrtmpQJd/gUtBGWaYGGBu
# JOPpdmweAadw9VmxGHtNx8ionkbDlnx9Z/SWGg1ulI39FZ6beX3WWM0s9J01xVqC
# tJY05GDlyIqh49rPvOCujLahw/7OEZ064Fcpoozz/t3ZillG1KW+4JZOI8Oc0kqN
# OGKfhPXRLo0OQigNuSW1TIvoZ9uV8dsAVswivF9qhdvJflk9amHBH5EQW79xE6GK
# V6eTNb1h9VFu+JYYbWTR/3cudD8Tkfo70vhP0HE9E5JIKSAVmwIsk1DTN2UYOBL+
# tWWEjBgkqi8bRW2YvNn10a45zhcJrFsTS7/kZ9OGMhfFdy8W+8QiiL/BJVrBj/a5
# lVn8MpnOZXIAxrUXlyEcvJwpECGJ5aDsAODkhPbOY9DWM+prhdzuY+TJilDsF69Q
# CYoowwHNV+BJwNY=
# SIG # End signature block