helpers/discovery/DiscoveryProvider-OCI.ps1

<#
.SYNOPSIS
    OCI discovery provider for Oracle Cloud Infrastructure monitoring.
 
.DESCRIPTION
    Registers an OCI discovery provider that uses the OCI.PSModules
    to discover compute instances, DB systems, autonomous databases,
    and load balancers, then builds a monitor plan.
 
    Monitor Strategy (Option B -- built-in WUG monitors):
      - Ping Active Monitors for resources with reachable public IPs
      - TCP Active Monitors for resources with known service ports
        (SSH/22 for compute, HTTP/80 and HTTPS/443 for load balancers,
         SQL*Net/1521 for DB systems)
      - Resources without public IPs are included as inventory-only
        items in the discovery plan (for dashboard display)
 
    OCI REST APIs require HTTP Signature authentication (similar to
    AWS SigV4) which WUG cannot perform natively. Ping/TCP monitors
    require no cloud authentication and work with WUG out of the box.
 
    OCI Monitoring metrics (CPU, memory, disk, network) are queried
    via OCI.PSModules during discovery and stored as point-in-time
    snapshots in device attributes for dashboard display.
 
    Authentication:
      OCI uses API key authentication via ~/.oci/config file. The config
      file path and profile name are passed through the credential object.
 
    Prerequisites:
      1. OCI.PSModules installed (Install-Module OCI.PSModules)
      2. OCI config file (~/.oci/config) with valid API key
      3. Device attribute 'DiscoveryHelper.OCI' = 'true'
 
.NOTES
    Author: Jason Alberino (jason@wug.ninja)
    Requires: DiscoveryHelpers.ps1 loaded first, OCI.PSModules
    Encoding: UTF-8 with BOM
#>


# Ensure DiscoveryHelpers is available
if (-not (Get-Command -Name 'Register-DiscoveryProvider' -ErrorAction SilentlyContinue)) {
    $discoveryPath = Join-Path (Split-Path $MyInvocation.MyCommand.Path -Parent) 'DiscoveryHelpers.ps1'
    if (Test-Path $discoveryPath) {
        . $discoveryPath
    }
    else {
        throw "DiscoveryHelpers.ps1 not found. Load it before this provider."
    }
}

# Load OCI helpers
$ociHelperPath = Join-Path (Split-Path (Split-Path $MyInvocation.MyCommand.Path -Parent) -Parent) 'oci\OCIHelpers.ps1'
if (Test-Path $ociHelperPath) {
    . $ociHelperPath
}

# ============================================================================
# OCI Discovery Provider
# ============================================================================

Register-DiscoveryProvider -Name 'OCI' `
    -MatchAttribute 'DiscoveryHelper.OCI' `
    -AuthType 'BearerToken' `
    -DefaultPort 443 `
    -DefaultProtocol 'https' `
    -IgnoreCertErrors $false `
    -DiscoverScript {
        param($ctx)

        $items = @()
        $cred = $ctx.Credential

        # OCI config file and profile
        $configFile = if ($cred.ConfigFile) { $cred.ConfigFile } else { $null }
        $profile    = if ($cred.Profile)    { $cred.Profile }    else { $null }
        $tenancyId  = if ($cred.TenancyId)  { $cred.TenancyId }  else { $ctx.DeviceIP }
        $region     = if ($cred.Region)     { $cred.Region }     else { $null }

        # Validate connection
        try {
            $connectSplat = @{}
            if ($configFile) { $connectSplat['ConfigFile'] = $configFile }
            if ($profile)    { $connectSplat['Profile']    = $profile }
            Connect-OCIProfile @connectSplat
        }
        catch {
            Write-Warning "OCI: Authentication failed: $_"
            return $items
        }

        # Common splat for OCI calls
        $baseSplat = @{}
        if ($configFile) { $baseSplat['ConfigFile'] = $configFile }
        if ($profile)    { $baseSplat['Profile']    = $profile }
        if ($region)     { $baseSplat['Region']     = $region }

        # Discover compartments
        Write-Host " Discovering OCI tenancy: $tenancyId" -ForegroundColor DarkGray
        $compartments = @()
        try {
            $compSplat = @{ TenancyId = $tenancyId }
            if ($configFile) { $compSplat['ConfigFile'] = $configFile }
            if ($profile)    { $compSplat['Profile']    = $profile }
            $compartments = @(Get-OCICompartments @compSplat)
        }
        catch {
            Write-Warning "OCI: Could not list compartments: $_"
        }

        # Include root compartment
        $compIds = @($tenancyId)
        foreach ($c in $compartments) { $compIds += $c.CompartmentId }

        Write-Host " Found $($compIds.Count) compartments (including root)" -ForegroundColor DarkGray

        # Collect metrics if OCI CLI is available (optional enrichment)
        $collectMetrics = [bool](Get-Command oci -ErrorAction SilentlyContinue)
        if ($collectMetrics) {
            Write-Host " OCI CLI detected -- will collect metrics snapshots" -ForegroundColor DarkGray
        }

        # --- Helper: add Ping monitor for a resource with a public IP ---
        # Returns the item, or $null if no public IP available.
        $addPingMonitor = {
            param($Name, $UniqueKey, $Attributes, $Tags)
            $ip = $Attributes['OCI.IPAddress']
            if (-not $ip -or $ip -eq 'N/A') { return $null }
            New-DiscoveredItem `
                -Name $Name `
                -ItemType 'ActiveMonitor' `
                -MonitorType 'Ping' `
                -MonitorParams @{
                    Timeout      = '3000'
                    RetryCount   = '2'
                    PayloadSize  = '32'
                } `
                -UniqueKey $UniqueKey `
                -Attributes $Attributes `
                -Tags $Tags
        }

        # --- Helper: add TCP port monitor ---
        $addTcpMonitor = {
            param($Name, $Port, $UniqueKey, $Attributes, $Tags)
            $ip = $Attributes['OCI.IPAddress']
            if (-not $ip -or $ip -eq 'N/A') { return $null }
            New-DiscoveredItem `
                -Name $Name `
                -ItemType 'ActiveMonitor' `
                -MonitorType 'TcpIp' `
                -MonitorParams @{
                    Port         = "$Port"
                    Timeout      = '5000'
                    RetryCount   = '1'
                } `
                -UniqueKey $UniqueKey `
                -Attributes $Attributes `
                -Tags $Tags
        }

        # --- Helper: collect metrics and store as attributes ---
        $enrichWithMetrics = {
            param($Attrs, $CompartmentId, $Namespace, $ResourceId, $Region)
            if (-not $collectMetrics) { return }
            try {
                $metricSplat = @{
                    CompartmentId = $CompartmentId
                    Namespace     = $Namespace
                    ResourceId    = $ResourceId
                }
                if ($Region) { $metricSplat['Region'] = $Region }
                $metrics = @(Get-OCIMonitoringMetrics @metricSplat)
                foreach ($m in $metrics) {
                    if ($m.LastValue -and $m.LastValue -ne 'N/A') {
                        $Attrs["OCI.Metric.$($m.MetricName)"] = "$($m.LastValue) $($m.Unit)"
                    }
                }
                if ($metrics.Count -gt 0) {
                    $Attrs['OCI.MetricCount'] = "$($metrics.Count)"
                }
            }
            catch {
                Write-Verbose "OCI: Metrics collection failed for ${ResourceId}: $_"
            }
        }

        # --- Compute Instances ---
        Write-Host " Querying compute instances..." -ForegroundColor DarkGray
        $allInstances = @()
        foreach ($compId in $compIds) {
            try {
                $instSplat = @{ CompartmentId = $compId } + $baseSplat
                $instances = @(Get-OCIComputeInstances @instSplat)
                $allInstances += $instances
            }
            catch {
                Write-Verbose "OCI: Could not list instances in compartment ${compId}: $_"
            }
        }

        Write-Host " Found $($allInstances.Count) compute instances" -ForegroundColor DarkGray

        foreach ($inst in $allInstances) {
            $instName  = $inst.Name
            $instId    = $inst.InstanceId
            $instState = $inst.LifecycleState
            $instShape = $inst.Shape
            $instAD    = $inst.AvailabilityDomain

            $resolvedIp = Resolve-OCIResourceIP -ResourceType 'Compute' -Resource $inst

            $instAttrs = @{
                'DiscoveryHelper.OCI'          = 'true'
                'DiscoveryHelper.OCI.LastRun'   = (Get-Date).ToUniversalTime().ToString('o')
                'OCI.TenancyId'                = $tenancyId
                'OCI.CompartmentId'            = $inst.CompartmentId
                'OCI.InstanceId'               = $instId
                'OCI.Shape'                    = $instShape
                'OCI.AD'                       = $instAD
                'OCI.FaultDomain'              = $inst.FaultDomain
                'OCI.LifecycleState'           = $instState
                'OCI.PublicIP'                 = $inst.PublicIP
                'OCI.PrivateIP'                = $inst.PrivateIP
                'OCI.Region'                   = $inst.Region
                'OCI.TimeCreated'              = $inst.TimeCreated
                'OCI.DeviceType'               = 'Compute'
                'Cloud Type'                   = 'Compute'
                'ComputedDisplayName'          = $instName
                'HostName'                     = $instName
                'Vendor'                       = 'Oracle Cloud'
            }
            if ($resolvedIp) { $instAttrs['OCI.IPAddress'] = $resolvedIp }

            # Collect metrics snapshot
            & $enrichWithMetrics $instAttrs $inst.CompartmentId 'oci_computeagent' $instId $inst.Region

            # Ping monitor (requires public IP)
            $pingItem = & $addPingMonitor `
                "OCI Ping - $instName" `
                "OCI:${tenancyId}:compute:${instId}:active:ping" `
                $instAttrs `
                @('oci', 'compute', $instName, $instAD)
            if ($pingItem) { $items += $pingItem }

            # TCP monitor for SSH (port 22) if public IP available
            $sshItem = & $addTcpMonitor `
                "OCI SSH - $instName" 22 `
                "OCI:${tenancyId}:compute:${instId}:active:ssh" `
                $instAttrs `
                @('oci', 'compute', 'ssh', $instName)
            if ($sshItem) { $items += $sshItem }

            # If no public IP, add an inventory-only item for dashboard
            if (-not $pingItem) {
                $items += New-DiscoveredItem `
                    -Name "OCI Compute (inventory) - $instName" `
                    -ItemType 'ActiveMonitor' `
                    -MonitorType 'Ping' `
                    -MonitorParams @{
                        _InventoryOnly = 'true'
                        _Reason        = 'No public IP'
                    } `
                    -UniqueKey "OCI:${tenancyId}:compute:${instId}:inventory" `
                    -Attributes $instAttrs `
                    -Tags @('oci', 'compute', 'inventory', $instName)
            }
        }

        # --- DB Systems ---
        Write-Host " Querying DB Systems..." -ForegroundColor DarkGray
        $allDBSystems = @()
        foreach ($compId in $compIds) {
            try {
                $dbSplat = @{ CompartmentId = $compId } + $baseSplat
                $dbs = @(Get-OCIDBSystems @dbSplat)
                $allDBSystems += $dbs
            }
            catch {
                Write-Verbose "OCI: Could not list DB systems in compartment ${compId}: $_"
            }
        }

        Write-Host " Found $($allDBSystems.Count) DB Systems" -ForegroundColor DarkGray

        foreach ($db in $allDBSystems) {
            $dbName  = $db.Name
            $dbId    = $db.DBSystemId
            $dbState = $db.LifecycleState
            $dbShape = $db.Shape
            $dbAD    = $db.AvailabilityDomain

            $resolvedIp = Resolve-OCIResourceIP -ResourceType 'DBSystem' -Resource $db

            $dbAttrs = @{
                'DiscoveryHelper.OCI'          = 'true'
                'DiscoveryHelper.OCI.LastRun'   = (Get-Date).ToUniversalTime().ToString('o')
                'OCI.TenancyId'                = $tenancyId
                'OCI.CompartmentId'            = $db.CompartmentId
                'OCI.DBSystemId'               = $dbId
                'OCI.Shape'                    = $dbShape
                'OCI.AD'                       = $dbAD
                'OCI.LifecycleState'           = $dbState
                'OCI.Edition'                  = $db.DatabaseEdition
                'OCI.CpuCoreCount'             = $db.CpuCoreCount
                'OCI.DataStorageSizeInGBs'     = $db.DataStorageSizeInGBs
                'OCI.NodeCount'                = $db.NodeCount
                'OCI.DiskRedundancy'           = $db.DiskRedundancy
                'OCI.LicenseModel'             = $db.LicenseModel
                'OCI.Version'                  = $db.Version
                'OCI.Hostname'                 = $db.Hostname
                'OCI.Domain'                   = $db.Domain
                'OCI.Region'                   = $db.Region
                'OCI.TimeCreated'              = $db.TimeCreated
                'OCI.DeviceType'               = 'DBSystem'
                'Cloud Type'                   = 'DBSystem'
                'ComputedDisplayName'          = $dbName
                'HostName'                     = $dbName
                'Vendor'                       = 'Oracle Cloud'
            }
            if ($resolvedIp) { $dbAttrs['OCI.IPAddress'] = $resolvedIp }

            # Collect metrics snapshot
            & $enrichWithMetrics $dbAttrs $db.CompartmentId 'oci_database' $dbId $db.Region

            # Ping monitor
            $pingItem = & $addPingMonitor `
                "OCI Ping - $dbName" `
                "OCI:${tenancyId}:dbsystem:${dbId}:active:ping" `
                $dbAttrs `
                @('oci', 'dbsystem', $dbName, $dbAD)
            if ($pingItem) { $items += $pingItem }

            # TCP monitor for SQL*Net (port 1521)
            $sqlItem = & $addTcpMonitor `
                "OCI SQL*Net - $dbName" 1521 `
                "OCI:${tenancyId}:dbsystem:${dbId}:active:sqlnet" `
                $dbAttrs `
                @('oci', 'dbsystem', 'sqlnet', $dbName)
            if ($sqlItem) { $items += $sqlItem }

            if (-not $pingItem) {
                $items += New-DiscoveredItem `
                    -Name "OCI DB (inventory) - $dbName" `
                    -ItemType 'ActiveMonitor' `
                    -MonitorType 'Ping' `
                    -MonitorParams @{
                        _InventoryOnly = 'true'
                        _Reason        = 'No reachable IP'
                    } `
                    -UniqueKey "OCI:${tenancyId}:dbsystem:${dbId}:inventory" `
                    -Attributes $dbAttrs `
                    -Tags @('oci', 'dbsystem', 'inventory', $dbName)
            }
        }

        # --- Autonomous Databases ---
        Write-Host " Querying Autonomous Databases..." -ForegroundColor DarkGray
        $allADBs = @()
        foreach ($compId in $compIds) {
            try {
                $adbSplat = @{ CompartmentId = $compId } + $baseSplat
                $adbs = @(Get-OCIAutonomousDatabases @adbSplat)
                $allADBs += $adbs
            }
            catch {
                Write-Verbose "OCI: Could not list autonomous DBs in compartment ${compId}: $_"
            }
        }

        Write-Host " Found $($allADBs.Count) Autonomous Databases" -ForegroundColor DarkGray

        foreach ($adb in $allADBs) {
            $adbName     = $adb.Name
            $adbId       = $adb.AutonomousDbId
            $adbState    = $adb.LifecycleState
            $adbWorkload = $adb.DbWorkload

            $resolvedIp = Resolve-OCIResourceIP -ResourceType 'AutonomousDB' -Resource $adb

            $adbAttrs = @{
                'DiscoveryHelper.OCI'          = 'true'
                'DiscoveryHelper.OCI.LastRun'   = (Get-Date).ToUniversalTime().ToString('o')
                'OCI.TenancyId'                = $tenancyId
                'OCI.CompartmentId'            = $adb.CompartmentId
                'OCI.AutonomousDbId'           = $adbId
                'OCI.DbWorkload'               = $adbWorkload
                'OCI.LifecycleState'           = $adbState
                'OCI.CpuCoreCount'             = $adb.CpuCoreCount
                'OCI.DataStorageSizeInTBs'     = $adb.DataStorageSizeInTBs
                'OCI.IsFreeTier'               = $adb.IsFreeTier
                'OCI.LicenseModel'             = $adb.LicenseModel
                'OCI.DbVersion'                = $adb.DbVersion
                'OCI.IsAutoScalingEnabled'     = $adb.IsAutoScalingEnabled
                'OCI.IsDedicated'              = $adb.IsDedicated
                'OCI.PrivateEndpointIp'        = $adb.PrivateEndpointIp
                'OCI.Region'                   = $adb.Region
                'OCI.TimeCreated'              = $adb.TimeCreated
                'OCI.DeviceType'               = 'AutonomousDB'
                'Cloud Type'                   = 'AutonomousDB'
                'ComputedDisplayName'          = $adbName
                'HostName'                     = $adbName
                'Vendor'                       = 'Oracle Cloud'
            }
            if ($resolvedIp) { $adbAttrs['OCI.IPAddress'] = $resolvedIp }

            # Collect metrics snapshot
            & $enrichWithMetrics $adbAttrs $adb.CompartmentId 'oci_autonomous_database' $adbId $adb.Region

            # Autonomous DBs typically have private endpoints only -- TCP 1522 if reachable
            $tcpItem = & $addTcpMonitor `
                "OCI ADB Port - $adbName" 1522 `
                "OCI:${tenancyId}:adb:${adbId}:active:tcp" `
                $adbAttrs `
                @('oci', 'autonomousdb', 'tcp', $adbName)
            if ($tcpItem) { $items += $tcpItem }

            # Inventory item (most ADBs have private endpoints only)
            if (-not $tcpItem) {
                $items += New-DiscoveredItem `
                    -Name "OCI ADB (inventory) - $adbName" `
                    -ItemType 'ActiveMonitor' `
                    -MonitorType 'Ping' `
                    -MonitorParams @{
                        _InventoryOnly = 'true'
                        _Reason        = 'Private endpoint only'
                    } `
                    -UniqueKey "OCI:${tenancyId}:adb:${adbId}:inventory" `
                    -Attributes $adbAttrs `
                    -Tags @('oci', 'autonomousdb', 'inventory', $adbName)
            }
        }

        # --- Load Balancers ---
        Write-Host " Querying Load Balancers..." -ForegroundColor DarkGray
        $allLBs = @()
        foreach ($compId in $compIds) {
            try {
                $lbSplat = @{ CompartmentId = $compId } + $baseSplat
                $lbs = @(Get-OCILoadBalancers @lbSplat)
                $allLBs += $lbs
            }
            catch {
                Write-Verbose "OCI: Could not list load balancers in compartment ${compId}: $_"
            }
        }

        Write-Host " Found $($allLBs.Count) Load Balancers" -ForegroundColor DarkGray

        foreach ($lb in $allLBs) {
            $lbName  = $lb.Name
            $lbId    = $lb.LoadBalancerId
            $lbState = $lb.LifecycleState
            $lbShape = $lb.ShapeName

            $resolvedIp = Resolve-OCIResourceIP -ResourceType 'LoadBalancer' -Resource $lb

            $lbAttrs = @{
                'DiscoveryHelper.OCI'          = 'true'
                'DiscoveryHelper.OCI.LastRun'   = (Get-Date).ToUniversalTime().ToString('o')
                'OCI.TenancyId'                = $tenancyId
                'OCI.CompartmentId'            = $lb.CompartmentId
                'OCI.LoadBalancerId'           = $lbId
                'OCI.Shape'                    = $lbShape
                'OCI.LifecycleState'           = $lbState
                'OCI.IsPrivate'                = $lb.IsPrivate
                'OCI.PrimaryIP'                = $lb.PrimaryIP
                'OCI.AllIPs'                   = $lb.AllIPs
                'OCI.BackendSetCount'          = $lb.BackendSetCount
                'OCI.ListenerCount'            = $lb.ListenerCount
                'OCI.Region'                   = $lb.Region
                'OCI.TimeCreated'              = $lb.TimeCreated
                'OCI.DeviceType'               = 'LoadBalancer'
                'Cloud Type'                   = 'LoadBalancer'
                'ComputedDisplayName'          = $lbName
                'HostName'                     = $lbName
                'Vendor'                       = 'Oracle Cloud'
            }
            if ($resolvedIp) { $lbAttrs['OCI.IPAddress'] = $resolvedIp }

            # Collect metrics snapshot
            & $enrichWithMetrics $lbAttrs $lb.CompartmentId 'oci_lbaas' $lbId $lb.Region

            # Ping monitor for public LBs
            $pingItem = & $addPingMonitor `
                "OCI Ping - $lbName" `
                "OCI:${tenancyId}:lb:${lbId}:active:ping" `
                $lbAttrs `
                @('oci', 'loadbalancer', $lbName, $lbShape)
            if ($pingItem) { $items += $pingItem }

            # TCP monitors for HTTP/HTTPS
            $httpItem = & $addTcpMonitor `
                "OCI HTTP - $lbName" 80 `
                "OCI:${tenancyId}:lb:${lbId}:active:http" `
                $lbAttrs `
                @('oci', 'loadbalancer', 'http', $lbName)
            if ($httpItem) { $items += $httpItem }

            $httpsItem = & $addTcpMonitor `
                "OCI HTTPS - $lbName" 443 `
                "OCI:${tenancyId}:lb:${lbId}:active:https" `
                $lbAttrs `
                @('oci', 'loadbalancer', 'https', $lbName)
            if ($httpsItem) { $items += $httpsItem }

            if (-not $pingItem) {
                $items += New-DiscoveredItem `
                    -Name "OCI LB (inventory) - $lbName" `
                    -ItemType 'ActiveMonitor' `
                    -MonitorType 'Ping' `
                    -MonitorParams @{
                        _InventoryOnly = 'true'
                        _Reason        = 'Private load balancer'
                    } `
                    -UniqueKey "OCI:${tenancyId}:lb:${lbId}:inventory" `
                    -Attributes $lbAttrs `
                    -Tags @('oci', 'loadbalancer', 'inventory', $lbName)
            }
        }

        # --- Summary ---
        $monitorItems = @($items | Where-Object { -not $_.MonitorParams._InventoryOnly })
        $inventoryItems = @($items | Where-Object { $_.MonitorParams._InventoryOnly })
        Write-Host " Plan: $($monitorItems.Count) monitors, $($inventoryItems.Count) inventory-only" -ForegroundColor DarkGray

        return $items
    }

# SIG # Begin signature block
# MIIr+wYJKoZIhvcNAQcCoIIr7DCCK+gCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAugvRMZB4DojVh
# dsyz2JWryWDzYQAmVaLQu804YYfyrKCCJQ0wggVvMIIEV6ADAgECAhBI/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/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggWNMIIEdaADAgECAhAOmxiO
# +dAt5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYD
# VQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAi
# BgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAw
# MDBaFw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdp
# Q2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERp
# Z2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
# AgoCggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsb
# hA3EMB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iT
# cMKyunWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGb
# NOsFxl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclP
# XuU15zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCr
# VYJBMtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFP
# ObURWBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTv
# kpI6nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWM
# cCxBYKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls
# 5Q5SUUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBR
# a2+xq4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6
# MIIBNjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qY
# rhwPTzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8E
# BAMCAYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5k
# aWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0
# LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDig
# NoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9v
# dENBLmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCg
# v0NcVec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQT
# SnovLbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh
# 65ZyoUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSw
# uKFWjuyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAO
# QGPFmCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjD
# TZ9ztwGpn1eqXijiuZQwggYaMIIEAqADAgECAhBiHW0MUgGeO5B5FSCJIRwKMA0G
# CSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExp
# bWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBSb290
# IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5NTlaMFQxCzAJBgNVBAYT
# AkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNlY3RpZ28g
# UHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0GCSqGSIb3DQEBAQUAA4IB
# jwAwggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjIztNsfvxYB5UXeWUzCxEe
# AEZGbEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NVDgFigOMYzB2OKhdqfWGV
# oYW3haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/36F09fy1tsB8je/RV0mIk
# 8XL/tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05ZwmRmTnAO5/arnY83jeNzh
# P06ShdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm+qxp4VqpB3MV/h53yl41
# aHU5pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUedyz8rNyfQJy/aOs5b4s+
# ac7IH60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz44MPZ1f9+YEQIQty/NQd/
# 2yGgW+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBMdlyh2n5HirY4jKnFH/9g
# Rvd+QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQYMBaAFDLrkpr/NZZILyhA
# QnAgNpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritUpimqF6TNDDAOBgNVHQ8B
# Af8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUEDDAKBggrBgEFBQcD
# AzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsGA1UdHwREMEIwQKA+oDyG
# Omh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5n
# Um9vdFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsGAQUFBzAChjpodHRwOi8v
# Y3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ1Jvb3RSNDYu
# cDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG
# 9w0BAQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURhw1aVcdGRP4Wh60BAscjW
# 4HL9hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0ZdOaWTsyNyBBsMLHqafvIh
# rCymlaS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajjcw5+w/KeFvPYfLF/ldYp
# mlG+vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNcWbWDRF/3sBp6fWXhz7Dc
# ML4iTAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalOhOfCipnx8CaLZeVme5yE
# Lg09Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJszkyeiaerlphwoKx1uHRz
# NyE6bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z76mKnzAfZxCl/3dq3dUNw
# 4rg3sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5JKdGvspbOrTfOXyXvmPL6
# E52z1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHHj95Ejza63zdrEcxWLDX6
# xWls/GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2Bev6SivBBOHY+uqiirZt
# g0y9ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/L9Uo2bC5a4CH2RwwggY+
# MIIEpqADAgECAhAHnODk0RR/hc05c892LTfrMA0GCSqGSIb3DQEBDAUAMFQxCzAJ
# BgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNl
# Y3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwHhcNMjYwMjA5MDAwMDAw
# WhcNMjkwNDIxMjM1OTU5WjBVMQswCQYDVQQGEwJVUzEUMBIGA1UECAwLQ29ubmVj
# dGljdXQxFzAVBgNVBAoMDkphc29uIEFsYmVyaW5vMRcwFQYDVQQDDA5KYXNvbiBB
# bGJlcmlubzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPN6aN4B1yYW
# kI5b5TBj3I0VV/peETrHb6EY4BHGxt8Ap+eT+WpEpJyEtRYPxEmNJL3A38Bkg7mw
# zPE3/1NK570ZBCuBjSAn4mSDIgIuXZnvyBO9W1OQs5d67MlJLUAEufl18tOr3ST1
# DeO9gSjQSAE5Nql0QDxPnm93OZBon+Fz3CmE+z3MwAe2h4KdtRAnCqwM+/V7iBdb
# w+JOxolpx+7RVjGyProTENIG3pe/hKvPb501lf8uBAADLdjZr5ip8vIWbf857Yw1
# Bu10nVI7HW3eE8Cl5//d1ribHlzTzQLfttW+k+DaFsKZBBL56l4YAlIVRsrOiE1k
# dHYYx6IGrEA809R7+TZA9DzGqyFiv9qmJAbL4fDwetDeyIq+Oztz1LvEdy8Rcd0J
# BY+J4S0eDEFIA3X0N8VcLeAwabKb9AjulKXwUeqCJLvN79CJ90UTZb2+I+tamj0d
# n+IKMEsJ4v4Ggx72sxFr9+6XziodtTg5Luf2xd6+PhhamOxF2px9LObhBLLEMyRs
# CHZIzVZOFKu9BpHQH7ufGB+Sa80Tli0/6LEyn9+bMYWi2ttn6lLOPThXMiQaooRU
# q6q2u3+F4SaPlxVFLI7OJVMhar6nW6joBvELTJPmANSMjDSRFDfHRCdGbZsL/keE
# LJNy+jZctF6VvxQEjFM8/bazu6qYhrA7AgMBAAGjggGJMIIBhTAfBgNVHSMEGDAW
# gBQPKssghyi47G9IritUpimqF6TNDDAdBgNVHQ4EFgQU6YF0o0D5AVhKHbVocr8G
# aSIBibAwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYI
# KwYBBQUHAwMwSgYDVR0gBEMwQTA1BgwrBgEEAbIxAQIBAwIwJTAjBggrBgEFBQcC
# ARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9DUFMwCAYGZ4EMAQQBMEkGA1UdHwRCMEAw
# PqA8oDqGOGh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVT
# aWduaW5nQ0FSMzYuY3JsMHkGCCsGAQUFBwEBBG0wazBEBggrBgEFBQcwAoY4aHR0
# cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdDQVIz
# Ni5jcnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqG
# SIb3DQEBDAUAA4IBgQAEIsm4xnOd/tZMVrKwi3doAXvCwOA/RYQnFJD7R/bSQRu3
# wXEK4o9SIefye18B/q4fhBkhNAJuEvTQAGfqbbpxow03J5PrDTp1WPCWbXKX8Oz9
# vGWJFyJxRGftkdzZ57JE00synEMS8XCwLO9P32MyR9Z9URrpiLPJ9rQjfHMb1BUd
# vaNayomm7aWLAnD+X7jm6o8sNT5An1cwEAob7obWDM6sX93wphwJNBJAstH9Ozs6
# LwISOX6sKS7CKm9N3Kp8hOUue0ZHAtZdFl6o5u12wy+zzieGEI50fKnN77FfNKFO
# WKlS6OJwlArcbFegB5K89LcE5iNSmaM3VMB2ADV1FEcjGSHw4lTg1Wx+WMAMdl/7
# nbvfFxJ9uu5tNiT54B0s+lZO/HztwXYQUczdsFon3pjsNrsk9ZlalBi5SHkIu+F6
# g7tWiEv3rtVApmJRnLkUr2Xq2a4nbslUCt4jKs5UX4V1nSX8OM++AXoyVGO+iTj7
# z+pl6XE9Gw/Td6WKKKswgga0MIIEnKADAgECAhANx6xXBf8hmS5AQyIMOkmGMA0G
# CSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0
# IFRydXN0ZWQgUm9vdCBHNDAeFw0yNTA1MDcwMDAwMDBaFw0zODAxMTQyMzU5NTla
# MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE
# AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEy
# NTYgMjAyNSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC0eDHT
# CphBcr48RsAcrHXbo0ZodLRRF51NrY0NlLWZloMsVO1DahGPNRcybEKq+RuwOnPh
# of6pvF4uGjwjqNjfEvUi6wuim5bap+0lgloM2zX4kftn5B1IpYzTqpyFQ/4Bt0mA
# xAHeHYNnQxqXmRinvuNgxVBdJkf77S2uPoCj7GH8BLuxBG5AvftBdsOECS1UkxBv
# MgEdgkFiDNYiOTx4OtiFcMSkqTtF2hfQz3zQSku2Ws3IfDReb6e3mmdglTcaarps
# 0wjUjsZvkgFkriK9tUKJm/s80FiocSk1VYLZlDwFt+cVFBURJg6zMUjZa/zbCclF
# 83bRVFLeGkuAhHiGPMvSGmhgaTzVyhYn4p0+8y9oHRaQT/aofEnS5xLrfxnGpTXi
# UOeSLsJygoLPp66bkDX1ZlAeSpQl92QOMeRxykvq6gbylsXQskBBBnGy3tW/AMOM
# CZIVNSaz7BX8VtYGqLt9MmeOreGPRdtBx3yGOP+rx3rKWDEJlIqLXvJWnY0v5ydP
# pOjL6s36czwzsucuoKs7Yk/ehb//Wx+5kMqIMRvUBDx6z1ev+7psNOdgJMoiwOrU
# G2ZdSoQbU2rMkpLiQ6bGRinZbI4OLu9BMIFm1UUl9VnePs6BaaeEWvjJSjNm2qA+
# sdFUeEY0qVjPKOWug/G6X5uAiynM7Bu2ayBjUwIDAQABo4IBXTCCAVkwEgYDVR0T
# AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU729TSunkBnx6yuKQVvYv1Ensy04wHwYD
# VR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMG
# A1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYY
# aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2Fj
# ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNV
# HR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRU
# cnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1s
# BwEwDQYJKoZIhvcNAQELBQADggIBABfO+xaAHP4HPRF2cTC9vgvItTSmf83Qh8WI
# GjB/T8ObXAZz8OjuhUxjaaFdleMM0lBryPTQM2qEJPe36zwbSI/mS83afsl3YTj+
# IQhQE7jU/kXjjytJgnn0hvrV6hqWGd3rLAUt6vJy9lMDPjTLxLgXf9r5nWMQwr8M
# yb9rEVKChHyfpzee5kH0F8HABBgr0UdqirZ7bowe9Vj2AIMD8liyrukZ2iA/wdG2
# th9y1IsA0QF8dTXqvcnTmpfeQh35k5zOCPmSNq1UH410ANVko43+Cdmu4y81hjaj
# V/gxdEkMx1NKU4uHQcKfZxAvBAKqMVuqte69M9J6A47OvgRaPs+2ykgcGV00TYr2
# Lr3ty9qIijanrUR3anzEwlvzZiiyfTPjLbnFRsjsYg39OlV8cipDoq7+qNNjqFze
# GxcytL5TTLL4ZaoBdqbhOhZ3ZRDUphPvSRmMThi0vw9vODRzW6AxnJll38F0cuJG
# 7uEBYTptMSbhdhGQDpOXgpIUsWTjd6xpR6oaQf/DJbg3s6KCLPAlZ66RzIg9sC+N
# Jpud/v4+7RWsWCiKi9EOLLHfMR2ZyJ/+xhCx9yHbxtl5TPau1j/1MIDpMPx0LckT
# etiSuEtQvLsNz3Qbp7wGWqbIiOWCnb5WqxL3/BAPvIXKUjPSxyZsq8WhbaM2tszW
# kPZPubdcMIIG7TCCBNWgAwIBAgIQCoDvGEuN8QWC0cR2p5V0aDANBgkqhkiG9w0B
# AQsFADBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/
# BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYg
# U0hBMjU2IDIwMjUgQ0ExMB4XDTI1MDYwNDAwMDAwMFoXDTM2MDkwMzIzNTk1OVow
# YzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQD
# EzJEaWdpQ2VydCBTSEEyNTYgUlNBNDA5NiBUaW1lc3RhbXAgUmVzcG9uZGVyIDIw
# MjUgMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANBGrC0Sxp7Q6q5g
# VrMrV7pvUf+GcAoB38o3zBlCMGMyqJnfFNZx+wvA69HFTBdwbHwBSOeLpvPnZ8ZN
# +vo8dE2/pPvOx/Vj8TchTySA2R4QKpVD7dvNZh6wW2R6kSu9RJt/4QhguSssp3qo
# me7MrxVyfQO9sMx6ZAWjFDYOzDi8SOhPUWlLnh00Cll8pjrUcCV3K3E0zz09ldQ/
# /nBZZREr4h/GI6Dxb2UoyrN0ijtUDVHRXdmncOOMA3CoB/iUSROUINDT98oksouT
# MYFOnHoRh6+86Ltc5zjPKHW5KqCvpSduSwhwUmotuQhcg9tw2YD3w6ySSSu+3qU8
# DD+nigNJFmt6LAHvH3KSuNLoZLc1Hf2JNMVL4Q1OpbybpMe46YceNA0LfNsnqcnp
# JeItK/DhKbPxTTuGoX7wJNdoRORVbPR1VVnDuSeHVZlc4seAO+6d2sC26/PQPdP5
# 1ho1zBp+xUIZkpSFA8vWdoUoHLWnqWU3dCCyFG1roSrgHjSHlq8xymLnjCbSLZ49
# kPmk8iyyizNDIXj//cOgrY7rlRyTlaCCfw7aSUROwnu7zER6EaJ+AliL7ojTdS5P
# WPsWeupWs7NpChUk555K096V1hE0yZIXe+giAwW00aHzrDchIc2bQhpp0IoKRR7Y
# ufAkprxMiXAJQ1XCmnCfgPf8+3mnAgMBAAGjggGVMIIBkTAMBgNVHRMBAf8EAjAA
# MB0GA1UdDgQWBBTkO/zyMe39/dfzkXFjGVBDz2GM6DAfBgNVHSMEGDAWgBTvb1NK
# 6eQGfHrK4pBW9i/USezLTjAOBgNVHQ8BAf8EBAMCB4AwFgYDVR0lAQH/BAwwCgYI
# KwYBBQUHAwgwgZUGCCsGAQUFBwEBBIGIMIGFMCQGCCsGAQUFBzABhhhodHRwOi8v
# b2NzcC5kaWdpY2VydC5jb20wXQYIKwYBBQUHMAKGUWh0dHA6Ly9jYWNlcnRzLmRp
# Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFRpbWVTdGFtcGluZ1JTQTQwOTZT
# SEEyNTYyMDI1Q0ExLmNydDBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vY3JsMy5k
# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRUaW1lU3RhbXBpbmdSU0E0MDk2
# U0hBMjU2MjAyNUNBMS5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9
# bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQBlKq3xHCcEua5gQezRCESeY0ByIfjk9iJP
# 2zWLpQq1b4URGnwWBdEZD9gBq9fNaNmFj6Eh8/YmRDfxT7C0k8FUFqNh+tshgb4O
# 6Lgjg8K8elC4+oWCqnU/ML9lFfim8/9yJmZSe2F8AQ/UdKFOtj7YMTmqPO9mzskg
# iC3QYIUP2S3HQvHG1FDu+WUqW4daIqToXFE/JQ/EABgfZXLWU0ziTN6R3ygQBHMU
# BaB5bdrPbF6MRYs03h4obEMnxYOX8VBRKe1uNnzQVTeLni2nHkX/QqvXnNb+YkDF
# kxUGtMTaiLR9wjxUxu2hECZpqyU1d0IbX6Wq8/gVutDojBIFeRlqAcuEVT0cKsb+
# zJNEsuEB7O7/cuvTQasnM9AWcIQfVjnzrvwiCZ85EE8LUkqRhoS3Y50OHgaY7T/l
# wd6UArb+BOVAkg2oOvol/DJgddJ35XTxfUlQ+8Hggt8l2Yv7roancJIFcbojBcxl
# RcGG0LIhp6GvReQGgMgYxQbV1S3CrWqZzBt1R9xJgKf47CdxVRd/ndUlQ05oxYy2
# zRWVFjF7mcr4C34Mj3ocCVccAvlKV9jEnstrniLvUxxVZE/rptb7IRE2lskKPIJg
# baP5t2nGj/ULLi49xTcBZU8atufk+EMF/cWuiC7POGT75qaL6vdCvHlshtjdNXOC
# IUjsarfNZzGCBkQwggZAAgEBMGgwVDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1Nl
# Y3RpZ28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWdu
# aW5nIENBIFIzNgIQB5zg5NEUf4XNOXPPdi036zANBglghkgBZQMEAgEFAKCBhDAY
# BgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3
# AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEi
# BCCWn4OR34ln5gPeSkZVAsZgSVOjL7x7PeGt5cDsB+ncdDANBgkqhkiG9w0BAQEF
# AASCAgCK9PcdAWN8IJcn3tOr2/HS1r9jejluxFUOmigWhiZfdPikscwPeF5AZY2X
# MMyFrVXB4psxCPQwPc93/3MmfpxgrkttRAozM/J7vcYlj1T5C7stZIQchDy/yip9
# dyAVOzgeAwyBpnHdKfA8uMArIQg1FktXepePXWZiPUWk/MOC6w+4+DNQVBR8038X
# Djb0IKhC/DPg8dcJcyklYLFn9Go6M2vwOK8XpP5PPD0EFNwCXnECMgMMC4YIWaMh
# KZUF8D5sseWyRObtfufo+jpSUY3ZLBRPzhTgqTEXKaWPDqArccnQq3h42OaOCD7P
# hGquh2FW9IpTWtCpebfnuSS6FCf0TMPPH3ugF1TrbqeSarpp9/fkC8tn10sd1BCW
# +0luFftbZ5Xkwp6XWdxNN/tjBuQEBeGpkd/CQZA62KprVLbzAMEaaRE9DzSPUkDA
# LMcsa4DdzH6ihzRN9lS2HBLiPjYzwDwMD8VSvPb6Ya+R7K/nGGI4mFoSs9XUhkET
# wotoONz1VW201wv7fs0ZXMGQk3OnU0gwjCt3ePaY9udAQ4JJBCUsuODI31ey1oys
# omUwi9K0kbL/4bOYBYix8Eik/T2HgOOh1f3WJ+cJhY+HHl+Qwq/5HF3AgM1TcsEF
# VVboqnBsdWWJ1tDQfwfa74XeHAgfytKeCroNsqIh18h1GDnFqqGCAyYwggMiBgkq
# hkiG9w0BCQYxggMTMIIDDwIBATB9MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5E
# aWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1l
# U3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTECEAqA7xhLjfEFgtHEdqeV
# dGgwDQYJYIZIAWUDBAIBBQCgaTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwG
# CSqGSIb3DQEJBTEPFw0yNjA0MjUyMDA3MjRaMC8GCSqGSIb3DQEJBDEiBCA6bCwp
# rOS02Zbaty+1InSXelN6BiMJFW4Rs7OB+vv+SzANBgkqhkiG9w0BAQEFAASCAgAS
# Mf1wT3agnonimY+bbm5LiWBkrzctgYHGLTV5uuPtMN5k21OhHXS4FRZMu2XteQ7e
# paQihOzqQjYkw9ZTQGDwzC1iBh20ByUHvfQlETSE+hawQ+TxMMIf5dvAEYPRrYCy
# AihF8Xxpk6GJrdwqJkrjpjRDhkAZIGsQi9/q4lQYYu2vsyhiW4hdXsHCLZhgVz7x
# ds5aJYPXdIRJhE/ljB/ppLFdu+3VNQl09JwsdVGy0nPtY9PdjxLBAPGsi189F4a+
# 7/KEFzD9jf7RRGmdl0CtSZuULMsAUcsaC9NXIS/2zdjndVK6iFdMePqA3gVDCQsF
# NTt+NNkbXyeznpR+yNuGrgltW8qM9+qNKpkonKyVdX9KivKPQ8CWHG0pKv5VrokI
# 9KxZAtg34H/+J5guSEi5CVqArhnS3XjWS91t/DRcr2v59eLtsjNILY2DxH45XH34
# IK82dh+4awz/OZdddYoFulJeY2hgWS9hLjXP6i+boCl/vnWuJakZIcwdDNRjpEWL
# h9s/hynyTwS9PxdYpi6BnF3L6m1DjWpcYevJ6Rd2Yj0GNUgV8acxMNNAzs7ABrlF
# clkkXsEcYroN4UY/+JWdnU4Va6LXz1bV9f/TUauXUhXod2j0xJss671fEKDlJY5i
# UCiHtL+p9sqTEZRgXumWzDWeEHdhfs1EvSS/Ekp/dg==
# SIG # End signature block