Invoke-OffboardingCheck.ps1

<#
.SYNOPSIS
    Free, read-only Microsoft 365 offboarding check.
    Finds accounts that look like leavers and shows what they still hold.
 
.DESCRIPTION
    When someone leaves, the license is usually the only thing anyone remembers to remove. The
    account often keeps its group memberships and a user mailbox that was never converted to
    shared, and nobody notices until an audit.
 
    This connects to Microsoft Graph with delegated, READ-ONLY scopes via device-code sign-in
    (nothing to register, no app, no secrets). It never writes, removes, or changes anything in
    your tenant, and it stores nothing. You act on the list yourself.
 
    For each account that looks like a leaver (disabled, or no activity for -InactiveDays) it
    reports:
      * whether it still holds a paid license, and which
      * how many groups it is still a member of
      * whether its mailbox is still a user mailbox rather than converted to shared
 
    Activity signal is chosen automatically, exactly as the license scan does it: directory
    sign-in activity when the tenant has Entra ID P1/P2, otherwise the Microsoft 365 usage
    reports. Disabled accounts are flagged on any tenant.
 
    What it deliberately does NOT do (that's the paid ServerBridge License Auditor):
      * mailbox size and archive detail, app role assignments, a formatted PDF, scheduled
        re-runs with drift tracking, and multi-tenant roll-up.
    See https://server-bridge.com/license-auditor.html
 
.PARAMETER InactiveDays
    An account with no activity in this many days is treated as a possible leaver.
    Default 90. Range 1-3650. (The usage-report fallback resolves to the nearest supported
    window: 30, 90 or 180 days.)
 
.PARAMETER OutputCsv
    Path for the CSV export. Default: .\offboarding-check_<tenant>_<date>.csv
 
.PARAMETER IncludeGuests
    Include guest (external) users. Off by default.
 
.PARAMETER PassThru
    Emit the finding objects to the pipeline in addition to the CSV.
 
.EXAMPLE
    Invoke-OffboardingCheck
 
.EXAMPLE
    Invoke-OffboardingCheck -InactiveDays 30 -OutputCsv C:\reports\leavers.csv
 
.NOTES
    Requires the Microsoft Graph PowerShell SDK:
        Install-Module Microsoft.Graph -Scope CurrentUser
    Delegated scopes requested (all read-only), the same set the license scan uses:
        User.Read.All, Organization.Read.All, AuditLog.Read.All, Reports.Read.All
 
    The mailbox type comes from Microsoft's mailbox usage report, which lags a day or two and
    is unavailable when your tenant conceals user names in reports. Both cases are reported
    rather than guessed.
 
    Project: https://github.com/lbcrowe-del/ServerBridge-LicenseScan
    License: MIT
#>


[CmdletBinding()]
param(
    [ValidateRange(1, 3650)]
    [int]$InactiveDays = 90,

    [string]$OutputCsv,

    [switch]$IncludeGuests,

    [switch]$PassThru
)

# Shared helpers (sign-in, activity signal, CSV escaping) live in Invoke-LicenseScan.ps1 so there
# is exactly one copy. Dot-sourcing it defines the functions without running a scan: that script
# only runs its entry point when it is not dot-sourced.
if (-not (Get-Command -Name Connect-ScanGraph -ErrorAction SilentlyContinue)) {
    $sharedPath = Join-Path $PSScriptRoot 'Invoke-LicenseScan.ps1'
    if (-not (Test-Path -LiteralPath $sharedPath)) {
        throw "Invoke-LicenseScan.ps1 must sit next to this script (it holds the shared sign-in and activity helpers)."
    }
    . $sharedPath
}

# ---------------------------------------------------------------------------
# Pure, testable helpers (no Graph calls - safe to dot-source)
# ---------------------------------------------------------------------------

function Get-MailboxTypeLabel {
    <#
    Plain-English label for a mailbox recipient type from Microsoft's usage report.
    $null/empty means the report didn't cover this account (it lags a day or two).
    #>

    [CmdletBinding()]
    param([Parameter()][AllowNull()][AllowEmptyString()][string]$RecipientType)

    if ([string]::IsNullOrWhiteSpace($RecipientType)) { return 'unknown' }
    switch ($RecipientType.Trim().ToLower()) {
        'usermailbox'      { return 'user' }
        'user'             { return 'user' }
        'sharedmailbox'    { return 'shared' }
        'shared'           { return 'shared' }
        'roommailbox'      { return 'room' }
        'room'             { return 'room' }
        'equipmentmailbox' { return 'equipment' }
        'equipment'        { return 'equipment' }
        default            { return $RecipientType.Trim().ToLower() }
    }
}

function Get-OffboardingRow {
    <#
    Pure projection: given normalized user objects (DisplayName, UserPrincipalName, UserType,
    AccountEnabled, LastActivity, AssignedLicenses[].SkuId, GroupCount, MailboxType), a
    SkuId->PartNumber map and a cutoff, emit one row per leaver-looking account. No Graph, no
    I/O - unit-testable.
 
    An account is a possible leaver when disabled, OR (when an activity signal is available)
    when last activity is older than the cutoff or unknown. With no activity signal only
    disabled accounts are flagged, because everything else would be a guess.
 
    Unlike the license scan this emits ONE row per account, not one per license, because the
    unit of work when offboarding is the person.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)][AllowNull()][AllowEmptyCollection()][object[]]$Users,
        [Parameter(Mandatory)][hashtable]$SkuMap,
        [Parameter(Mandatory)][datetime]$Cutoff,
        [bool]$ActivitySignalAvailable = $true,
        [switch]$IncludeGuests
    )

    foreach ($u in @($Users | Where-Object { $null -ne $_ })) {
        if (-not $IncludeGuests -and $u.UserType -eq 'Guest') { continue }

        $reason = $null
        if (-not $u.AccountEnabled) {
            $reason = 'disabled'
        } elseif ($ActivitySignalAvailable -and (Test-UserDormant -LastActivity $u.LastActivity -Cutoff $Cutoff)) {
            $reason = 'inactive'
        }
        if (-not $reason) { continue }

        $licenses = @()
        foreach ($lic in $u.AssignedLicenses) {
            $part = $SkuMap[$lic.SkuId]
            if (-not $part) { continue }
            if ((Get-SkuMonthlyPrice -PartNumber $part) -le 0) { continue }  # free SKUs aren't worth reclaiming
            $licenses += $part
        }

        $mailboxType = if ($u.MailboxType) { $u.MailboxType } else { 'unknown' }
        $groupCount = if ($null -ne $u.GroupCount) { [int]$u.GroupCount } else { $null }

        $findings = @()
        if ($licenses.Count -gt 0) { $findings += 'still licensed' }
        if ($groupCount -gt 0) { $findings += 'still in groups' }
        if ($mailboxType -eq 'user') { $findings += 'mailbox not shared' }

        [pscustomobject]@{
            DisplayName       = $u.DisplayName
            UserPrincipalName = $u.UserPrincipalName
            UserType          = $u.UserType
            AccountEnabled    = $u.AccountEnabled
            Reason            = $reason
            LastActivity      = if ($u.LastActivity) { ([datetime]$u.LastActivity).ToString('yyyy-MM-dd') } else { 'never/unknown' }
            Licenses          = ($licenses -join '; ')
            LicenseCount      = $licenses.Count
            GroupCount        = $groupCount
            MailboxType       = $mailboxType
            Findings          = ($findings -join '; ')
        }
    }
}

# ---------------------------------------------------------------------------
# Graph I/O (kept in functions so tests can dot-source without a tenant)
# ---------------------------------------------------------------------------

function Get-MailboxTypeMap {
    <#
    Returns @{ ok=$bool; map=@{ upn(lower) -> recipient type label } }.
 
    Uses Microsoft's mailbox usage report, which is the only way to tell a user mailbox from a
    shared one without Exchange Online PowerShell. The v1.0 report has no Recipient Type column,
    so this uses the beta report - still under Reports.Read.All, no extra permission.
 
    ok=$false when the tenant conceals user names in reports (rows can't be matched to people)
    or the column is missing. The caller reports that rather than guessing.
    #>

    [CmdletBinding()] param()

    $uri = "https://graph.microsoft.com/beta/reports/getMailboxUsageDetail(period='D7')"
    $resp = Invoke-MgGraphRequest -Method GET -Uri $uri -OutputType HttpResponseMessage -ErrorAction Stop
    $csv = $resp.Content.ReadAsStringAsync().Result
    $rows = @($csv | ConvertFrom-Csv)

    if ($rows.Count -eq 0) { return @{ ok = $true; map = @{} } }
    if (-not ($rows[0].PSObject.Properties.Name -contains 'Recipient Type')) {
        return @{ ok = $false; map = @{} }
    }

    $map = @{}
    $sawUpn = $false
    foreach ($r in $rows) {
        $upn = $r.'User Principal Name'
        if (-not $upn) { continue }
        if ($upn -like '*@*') { $sawUpn = $true }
        $map[$upn.ToLower()] = Get-MailboxTypeLabel -RecipientType $r.'Recipient Type'
    }
    if (-not $sawUpn) { return @{ ok = $false; map = @{} } }
    return @{ ok = $true; map = $map }
}

function Get-GroupMembershipCount {
    <#
    Direct group/role memberships for one account, via /users/{id}/memberOf/$count.
    Needs only User.Read.All, which this module already requests.
    Returns $null when the count can't be read, so the caller can say "unknown" honestly
    instead of printing 0 and implying the account is clean.
    #>

    [CmdletBinding()]
    param([Parameter(Mandatory)][string]$UserId)

    try {
        $uri = "https://graph.microsoft.com/v1.0/users/$UserId/memberOf/`$count"
        $resp = Invoke-MgGraphRequest -Method GET -Uri $uri -Headers @{ ConsistencyLevel = 'eventual' } `
            -OutputType HttpResponseMessage -ErrorAction Stop
        $text = $resp.Content.ReadAsStringAsync().Result
        $value = 0
        if ([int]::TryParse(("$text").Trim(), [ref]$value)) { return $value }
        return $null
    } catch {
        Write-Verbose "memberOf count failed for $UserId : $($_.Exception.Message)"
        return $null
    }
}

function Invoke-OffboardingCheckMain {
    [CmdletBinding()]
    param(
        [int]$InactiveDays,
        [string]$OutputCsv,
        [switch]$IncludeGuests,
        [switch]$PassThru
    )

    Write-Host ''
    Write-Host 'ServerBridge - Free M365 Offboarding Check (read-only)' -ForegroundColor Green
    Write-Host '-----------------------------------------------------' -ForegroundColor DarkGray

    if (-not (Test-GraphSdkPresent)) { return }
    if (-not (Connect-ScanGraph)) { return }

    try {
        $org = Get-MgOrganization -ErrorAction Stop
        $tenantName = ($org.DisplayName | Select-Object -First 1)
        Write-Host "Connected to: $tenantName (signed in as $((Get-MgContext).Account))" -ForegroundColor Green

        $skuMap = @{}
        foreach ($s in (Get-MgSubscribedSku -All -ErrorAction Stop)) { $skuMap[$s.SkuId] = $s.SkuPartNumber }

        $select = 'id,displayName,userPrincipalName,userType,accountEnabled,assignedLicenses'
        $rawUsers = Get-MgUser -All -Property $select -ErrorAction Stop
    } catch {
        Write-Host "Graph read failed: $($_.Exception.Message)" -ForegroundColor Red
        Write-Host 'Confirm you consented to User.Read.All, Organization.Read.All, AuditLog.Read.All and Reports.Read.All.' -ForegroundColor Yellow
        Disconnect-MgGraph -ErrorAction SilentlyContinue | Out-Null
        return
    }

    $signal = Resolve-ActivityMap -InactiveDays $InactiveDays
    $activity = $signal.map
    $signalAvailable = $signal.available
    if (-not $signalAvailable) {
        Write-Host ''
        Write-Host 'PARTIAL CHECK: only disabled accounts can be judged without an activity signal.' -ForegroundColor Yellow
    } else {
        Write-Host "Looking for accounts inactive $InactiveDays+ days or disabled (via $($signal.signalName))..." -ForegroundColor Cyan
    }

    # Mailbox types: the only way to spot a mailbox nobody converted to shared.
    $mailboxMap = @{}
    try {
        $mb = Get-MailboxTypeMap
        if ($mb.ok) {
            $mailboxMap = $mb.map
        } else {
            Write-Host 'Mailbox types unavailable (user names are concealed in reports, or the report changed).' -ForegroundColor Yellow
            Write-Host 'Mailbox column will read "unknown".' -ForegroundColor DarkGray
        }
    } catch {
        Write-Host "Mailbox report unavailable: $($_.Exception.Message)" -ForegroundColor Yellow
    }

    # Narrow to leaver-looking accounts BEFORE the per-user group lookup: one Graph call each.
    $cutoff = (Get-Date).AddDays(-1 * $InactiveDays)
    $candidates = foreach ($u in $rawUsers) {
        $upnKey = if ($u.UserPrincipalName) { $u.UserPrincipalName.ToLower() } else { $null }
        $last = if ($upnKey) { $activity[$upnKey] } else { $null }
        $isCandidate = (-not $u.AccountEnabled) -or
                       ($signalAvailable -and (Test-UserDormant -LastActivity $last -Cutoff $cutoff))
        if (-not $isCandidate) { continue }
        if (-not $IncludeGuests -and $u.UserType -eq 'Guest') { continue }

        [pscustomobject]@{
            Id                = $u.Id
            DisplayName       = $u.DisplayName
            UserPrincipalName = $u.UserPrincipalName
            UserType          = $u.UserType
            AccountEnabled    = $u.AccountEnabled
            AssignedLicenses  = $u.AssignedLicenses
            LastActivity      = $last
            MailboxType       = if ($upnKey -and $mailboxMap.ContainsKey($upnKey)) { $mailboxMap[$upnKey] } else { 'unknown' }
            GroupCount        = $null
        }
    }
    $candidates = @($candidates)

    if ($candidates.Count -gt 0) {
        Write-Host (" checking group membership for {0} account(s)..." -f $candidates.Count) -ForegroundColor DarkGray
        foreach ($c in $candidates) { $c.GroupCount = Get-GroupMembershipCount -UserId $c.Id }
    }

    $rows = @(Get-OffboardingRow -Users $candidates -SkuMap $skuMap -Cutoff $cutoff `
            -ActivitySignalAvailable $signalAvailable -IncludeGuests:$IncludeGuests)

    Write-Host ''
    Write-Host 'Accounts to review' -ForegroundColor Green
    Write-Host '------------------' -ForegroundColor DarkGray
    if ($rows.Count -eq 0) {
        Write-Host ' Nothing to review - no leaver-looking accounts found.' -ForegroundColor Green
    } else {
        $rows | Sort-Object LicenseCount -Descending |
            Format-Table UserPrincipalName, Reason, Licenses, GroupCount, MailboxType -AutoSize
    }

    $stillLicensed = @($rows | Where-Object { $_.LicenseCount -gt 0 }).Count
    $notShared = @($rows | Where-Object { $_.MailboxType -eq 'user' }).Count
    Write-Host (" Accounts to review : {0:N0}" -f $rows.Count) -ForegroundColor White
    Write-Host (" Still holding licenses : {0:N0}" -f $stillLicensed) -ForegroundColor Yellow
    Write-Host (" Mailbox not shared : {0:N0}" -f $notShared) -ForegroundColor Yellow
    Write-Host ''

    if (-not $OutputCsv) {
        $safeTenant = ($tenantName -replace '[^\w]', '')
        $OutputCsv = Join-Path (Get-Location) ("offboarding-check_{0}_{1}.csv" -f $safeTenant, (Get-Date -Format 'yyyyMMdd'))
    }
    if ($rows.Count -gt 0) {
        $rows | Sort-Object LicenseCount -Descending | ForEach-Object {
            $row = $_.PSObject.Copy()
            foreach ($name in 'DisplayName', 'UserPrincipalName', 'UserType', 'Licenses', 'MailboxType', 'Findings') {
                $row.$name = ConvertTo-SafeCsvValue -Value $row.$name
            }
            $row
        } | Export-Csv -Path $OutputCsv -NoTypeInformation -Encoding UTF8
        Write-Host 'Full list saved to:' -ForegroundColor Cyan
        Write-Host " $OutputCsv" -ForegroundColor White
        Write-Host ''
    }

    Write-Host 'Nothing was changed in your tenant. Review each account before acting.' -ForegroundColor DarkGray
    Write-Host 'A licensed shared mailbox under 50 GB without an archive usually needs no license.' -ForegroundColor DarkGray
    Write-Host ''

    Disconnect-MgGraph -ErrorAction SilentlyContinue | Out-Null
    if ($PassThru) { $rows }
}

# Run unless dot-sourced (e.g. by Pester tests, where InvocationName is '.').
if ($MyInvocation.InvocationName -ne '.') {
    Invoke-OffboardingCheckMain -InactiveDays $InactiveDays -OutputCsv $OutputCsv `
        -IncludeGuests:$IncludeGuests -PassThru:$PassThru
}

# SIG # Begin signature block
# MII2yAYJKoZIhvcNAQcCoII2uTCCNrUCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAuTmN6d+OhbSWX
# 4fGvAWuepA7sNzKJTXYnLIjTGV3kxKCCG2MwggXMMIIDtKADAgECAhBUmNLR1FsZ
# 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
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggbBMIIEqaADAgECAhMzAAaJW8dB
# dB4thrTTAAAABolbMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDQwHhcNMjYwOTE1MTYwNjE3WhcNMjYwOTE4
# MTYwNjE3WjCBgjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCEtlbnR1Y2t5MRIwEAYD
# VQQHEwlMZXhpbmd0b24xJTAjBgNVBAoTHExlZSBDcm93ZSBTb2Z0d2FyZSBTb2x1
# dGlvbnMxJTAjBgNVBAMTHExlZSBDcm93ZSBTb2Z0d2FyZSBTb2x1dGlvbnMwggGi
# MA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCSd2o228mobihJsbTETtFQiSIC
# 8UbmRzlNiSApgpG7cUd3Po8ivrlNphmBVqMexSQ8890yYs2Iqi27XypNC7eHrflt
# PNl0g2q08orcJWWN3SoHlr8neihm6T7vUkygzJONHsuHSG1rip5A3VmtxdaNPaHn
# TTP29w4wNv8RUUq8rUo1FEYJp1ns63YFDaqFitGIffnWvPyDIX5t/Lu9R8NFxXU+
# OYzRFPKC3Pi2eKnDBVdzAxzMWk5hNapcp57Ps9LIt/xKaM48DAwfjekjL0qIM7oy
# KgxpJ6UrbyMATX+7Qhpw3GmMQZcwzGGPRGTOGqMHrqpOqIcHvPC0j9xYn/0xEBoC
# JT+jCrdh7xt8aGafPcqxDg1ohPlqsdbZKoMSvtzCjoYOLi+/YXr2XvykYfWkWgwg
# 3BaiXbjPsJUS6DPFhFnoz4vFcYrUfeBBmvN0s4FAbk4O27/6iMehA/Xpd5BGP5sX
# PrXGFjyN/0psyna4yO+4EaFOkTDp72gIDMabIZkCAwEAAaOCAdUwggHRMAwGA1Ud
# EwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDwGA1UdJQQ1MDMGCisGAQQBgjdhAQAG
# CCsGAQUFBwMDBhsrBgEEAYI3YfX3xXqCm/n9aIL52tE6goGumFEwHQYDVR0OBBYE
# FJQn6rcAFckIFI60xdwIYMH3RYlqMB8GA1UdIwQYMBaAFGslQd77a3z9GIAKLX+P
# dl2qcz24MGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNv
# bS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFP
# QyUyMENBJTIwMDQuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZYaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJ
# RCUyMFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDA0LmNydDBUBgNVHSAETTBL
# MEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29t
# L3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4ICAQCx
# D2ogYhKLISVDZbdmf9Cam9XrIk3dptSXa+J91tIlShUdV6M2lzL4f5bL+kIGpqRX
# y6J1hWQdI+iexz38wG/xG+hkyiC2zRU+VrzKqHdrLR6qgPvb8z2M4wvgtfVEDsSX
# GJiR3ZPIxclPxqfMB7wFS3lXiLgor9qshZjteVrfJep7i8SZnnEh6UzftKhFQ5Ou
# mn9+iqypnP0IA7N4pdwBQX8Kb7caH7PzCbg+8w9z5T93PxEA2Z9UpLTANXGKR4Kr
# LCBfoF0Wrot8K1TZh87peRCNvCapEAFFdJQJjoTFzavSuLPVuBcCWKlhaueZc4pL
# kPIyxEhKnk3fXnhsezSbSMFxa0nAWidg/E0VtemcicCaaU/gAw74F4+u5RxZ/b1M
# fjkYRNbpB/Kh5G418/z/4uCkAvnRCvRpdU8XizotUGyeXBJshkOoZHc5k7AfXEK+
# 1FUyIl4bv+JQuAZ0Q9WtzRagWH8/5o8YfFL326wzN5UWORBSTWeBRFfB5E0FzG4A
# zzqMtyUksU9qNuvMx9nywO35QwauLcqeqXEsLRWS/WZAT3J0ByuFgcXgsJmlfy6i
# yFzbC9DczsUlZuyEKFlB5Cqw+BtaO+ZJcjP6LtSA9QWGHGCIdfq8U2xUSNbIG0yu
# IdRonMxAo0u+t/KswaU0zI0svOa1TmAGTXhQkH3+4jCCBygwggUQoAMCAQICEzMA
# AAAWMZKNkgJle5oAAAAAABYwDQYJKoZIhvcNAQEMBQAwYzELMAkGA1UEBhMCVVMx
# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWljcm9z
# b2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTAeFw0yNjAzMjYx
# ODExMjlaFw0zMTAzMjYxODExMjlaMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJp
# ZmllZCBDUyBBT0MgQ0EgMDQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
# AQDKVfrI2+gJMM/0bQ5OVKNdvOASzLbUUMvXuf+Vl7YGuofPaZHVo3gMHF5inT+G
# MSpIcfIZ9qtXU1UG68ry8vNbQtOL4Nm30ifXpqI1+ByiAWLO1YT0WnzG7XPOuoTe
# eWsNZv5FmjxCsReBZvyzyzCyXZbu1EQfJxWTH4ebUwtAiW9rqMf9eDj/wYhiEfNt
# eJV3ZFeibD2ztCHr9JhFdd97XbnCHgQoTIqc02X5xlRKtUGBa++OtHBBjiJ/uwBn
# zTkqu4FjpZjQeJtrmda+ur1CT2jflWIB/ypn7u7V9tvW9wJbJYt/H2EtJ0GONWxJ
# Z7TEu8jWPindOO3lzPP7UtzS/mVDV94HucWaltmsra6zSG8BoEJ87IM8QSb7vfm/
# O41FhYkUv89WIj5ES2O4kxyiMSfe95CMivCuYrRP2hKvx7egPMrWgDDBkxMLgrKZ
# O9hRNUMm8vk3w5b9SogHOyJVhxyFm8aFXfIxgqDF4S0g4bhbhnzljmSlCLlumMZc
# XFGDjpF2tNoAu3VGFGYtHtTSNVKvZpgB3b4ynaoDkbPf+Wg4523jt4VneasBgZhC
# 1srZI2NCnCBBfgjLq04pqEKAWEohyW2K29KSkkHvt5VaE1ac3Yt+oyiOzMS57tXw
# QDJLGvLg/OXFO0VNvczDndfIfXYExB/ab2PuMSwd5VIBOwIDAQABo4IB3DCCAdgw
# DgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRrJUHe
# +2t8/RiACi1/j3ZdqnM9uDBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcC
# ARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRv
# cnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMBIGA1UdEwEB/wQIMAYB
# Af8CAQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1zSmepEhqMOYwcAYDVR0fBGkw
# ZzBloGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWlj
# cm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIw
# MjAyMS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsGAQUFBzAChmFodHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVy
# aWZpZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3J0MA0GCSqGSIb3
# DQEBDAUAA4ICAQAG1VBeVHTVRBljlcZD3IiMxwPyMjQyLNaEnVu5mODm2hRBJfH8
# GsBLATmrHAc8F47jmk5CnpUPiIguCbw6Z/KVj4Dsoiq228NSLMLewFfGMri7uwNG
# LISC5ccp8vUdADDEIsS2dE+QI9OwkDpv3XuUD7d+hAgcLVcMOl1AsfEZtsZenhGv
# SYUrm/FuLq0BqEGL9GXM5c+Ho9q8o+Vn/S+GWQN2y+gkRO15s0kI05nUpq/dOD4r
# i9rgVs6tipEd0YZqGgD+CZNiaZWrDTOQbNPncd2F9qOsUa20miYruoT5PwJAaI+Q
# QiTE2ZJeMJOkOpzhTUgqVMZwZidEUZKCqudaeQA08WwnkQMfKyHzaU8j48ULcU4h
# UwvMsv7fSurOe9GAdRQCPvF8WcSK5oDHe8VVJM4tv6KKCm91HqLx9JamBgRI6R2S
# fY3nu26EGznu0rCg/769z8xWm4PVcC2ZaL6VlKVqFp1NsN8YqMyf5t+bbGVb09no
# FKcJG/UwyGlxRmQBlfeBUQx5/ytlzZzsEnhrJF9fTAfje8j3OdX5lEnePTFQLRlv
# zZFBqUXnIeQKv3fHQjC9m2fo/Z01DII/qp3d8LhGVUW0BCG04fRwHJNH8iqqCG/q
# ofMv+kym2AxBDnHzNgRjL60JOFiBgiurvLhYQNhB95KWojFA6shQnggkMTCCB54w
# ggWGoAMCAQICEzMAAAAHh6M0o3uljhwAAAAAAAcwDQYJKoZIhvcNAQEMBQAwdzEL
# MAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYG
# A1UEAxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENlcnRp
# ZmljYXRlIEF1dGhvcml0eSAyMDIwMB4XDTIxMDQwMTIwMDUyMFoXDTM2MDQwMTIw
# MTUyMFowYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmlu
# ZyBQQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALLwwK8Z
# iCji3VR6TElsaQhVCbRS/3pK+MHrJSj3Zxd3KU3rlfL3qrZilYKJNqztA9OQacr1
# AwoNcHbKBLbsQAhBnIB34zxf52bDpIO3NJlfIaTE/xrweLoQ71lzCHkD7A4As1Bs
# 076Iu+mA6cQzsYYH/Cbl1icwQ6C65rU4V9NQhNUwgrx9rGQ//h890Q8JdjLLw0nV
# +ayQ2Fbkd242o9kH82RZsH3HEyqjAB5a8+Ae2nPIPc8sZU6ZE7iRrRZywRmrKDp5
# +TcmJX9MRff241UaOBs4NmHOyke8oU1TYrkxh+YeHgfWo5tTgkoSMoayqoDpHOLJ
# s+qG8Tvh8SnifW2Jj3+ii11TS8/FGngEaNAWrbyfNrC69oKpRQXY9bGH6jn9NEJv
# 9weFxhTwyvx9OJLXmRGbAUXN1U9nf4lXezky6Uh/cgjkVd6CGUAf0K+Jw+GE/5Vp
# IVbcNr9rNE50Sbmy/4RTCEGvOq3GhjITbCa4crCzTTHgYYjHs1NbOc6brH+eKpWL
# tr+bGecy9CrwQyx7S/BfYJ+ozst7+yZtG2wR461uckFu0t+gCwLdN0A6cFtSRtR8
# bvxVFyWwTtgMMFRuBa3vmUOTnfKLsLefRaQcVTgRnzeLzdpt32cdYKp+dhr2ogc+
# qM6K4CBI5/j4VFyC4QFeUP2YAidLtvpXRRo3AgMBAAGjggI1MIICMTAOBgNVHQ8B
# Af8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNlBKbAPD2Ns72nX
# 9c0pnqRIajDmMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w
# GQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
# HSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZz
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw
# SWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBB
# dXRob3JpdHklMjAyMDIwLmNybDCBwwYIKwYBBQUHAQEEgbYwgbMwgYEGCCsGAQUF
# BzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jv
# c29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmlj
# YXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9v
# bmVvY3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEAfyUq
# nv7Uq+rdZgrbVyNMul5skONbhls5fccPlmIbzi+OwVdPQ4H55v7VOInnmezQEeW4
# LqK0wja+fBznANbXLB0KrdMCbHQpbLvG6UA/Xv2pfpVIE1CRFfNF4XKO8XYEa3oW
# 8oVH+KZHgIQRIwAbyFKQ9iyj4aOWeAzwk+f9E5StNp5T8FG7/VEURIVWArbAzPt9
# ThVN3w1fAZkF7+YU9kbq1bCR2YD+MtunSQ1Rft6XG7b4e0ejRA7mB2IoX5hNh3UE
# auY0byxNRG+fT2MCEhQl9g2i2fs6VOG19CNep7SquKaBjhWmirYyANb0RJSLWjin
# MLXNOAga10n8i9jqeprzSMU5ODmrMCJE12xS/NWShg/tuLjAsKP6SzYZ+1Ry358Z
# TFcx0FS/mx2vSoU8s8HRvy+rnXqyUJ9HBqS0DErVLjQwK8VtsBdekBmdTbQVoCgP
# Cqr+PDPB3xajYnzevs7eidBsM71PINK2BoE2UfMwxCCX3mccFgx6UsQeRSdVVVNS
# yALQe6PT12418xon2iDGE81OGCreLzDcMAZnrUAx4XQLUz6ZTl65yPUiOh3k7Yww
# 94lDf+8oG2oZmDh5O1Qe38E+M3vhKwmzIeoB1dVLlz4i3IpaDcR+iuGjH2TdaC1Z
# OmBXiCRKJLj4DT2uhJ04ji+tHD6n58vhavFIrmcxghq7MIIatwIBATBxMFoxCzAJ
# BgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNV
# BAMTIk1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBBT0MgQ0EgMDQCEzMABolbx0F0
# Hi2GtNMAAAAGiVswDQYJYIZIAWUDBAIBBQCggYQwGAYKKwYBBAGCNwIBDDEKMAig
# AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL
# MQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgs34oqFnmoU0q1NhF6PEA
# pJAnsLAj92D3Hoqq2m0Ti60wDQYJKoZIhvcNAQEBBQAEggGATZx3V5kuT7q729Gn
# z8bU51PWktATsyWcE7FJmIRYCsr03bXiQr2VwVhbnY7qd89u8fJnnTPpgxQcABVu
# /P05oe9s85twm5RcNeVwH5V1dS4Fkn//bV+LSZAbnIS4fWzlpkAWGff3scrbbSaj
# OOC9UgM3UkdRAh3hDrHpi9JD3MZ60m2lDyJbGowfRd4WUBszIMSRV7MrT5A5sFEe
# 5hAXXkMlFONRdn47Fkr/4aDNKH265WoxYQKGumR/zAdzbauMI4W+fOJlkdrwcLUZ
# L232rnkOHTl0LX4XhQlW+DyeycYgROwtt6DvOuul4QmjtsaLUYE7UymHG+1U6c8z
# IxskfsxdcagovtbkVUKoVyU7aZ7HF8lDqvVlc5U+Qwkz8X6GGmhA3T4OiJFGozJC
# t+ltHM298nSbbjFWsr10aAXIvWmVqrAlxwg7BYmecYWgQ7XyE+VnCn6f7K2U98Er
# Tkal94U9mEWS+2xTpSCgNjED1DePPjwYpC+Cwgv7PwjuZLVdoYIYFDCCGBAGCisG
# AQQBgjcDAwExghgAMIIX/AYJKoZIhvcNAQcCoIIX7TCCF+kCAQMxDzANBglghkgB
# ZQMEAgEFADCCAWIGCyqGSIb3DQEJEAEEoIIBUQSCAU0wggFJAgEBBgorBgEEAYRZ
# CgMBMDEwDQYJYIZIAWUDBAIBBQAEIAatadBOZGW5KEug+YzEpPxQmpAvP/wbELuR
# Tcueg7jMAgZqqTODBxcYEzIwMjYwOTE2MjMxMjU2Ljc4OFowBIACAfSggeGkgd4w
# gdsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsT
# HE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQg
# VFNTIEVTTjpBNTAwLTA1RTAtRDk0NzE1MDMGA1UEAxMsTWljcm9zb2Z0IFB1Ymxp
# YyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHmggg8hMIIHgjCCBWqgAwIBAgIT
# MwAAAAXlzw//Zi7JhwAAAAAABTANBgkqhkiG9w0BAQwFADB3MQswCQYDVQQGEwJV
# UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMUgwRgYDVQQDEz9NaWNy
# b3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFJvb3QgQ2VydGlmaWNhdGUgQXV0
# aG9yaXR5IDIwMjAwHhcNMjAxMTE5MjAzMjMxWhcNMzUxMTE5MjA0MjMxWjBhMQsw
# CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD
# VQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDCC
# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJ5851Jj/eDFnwV9Y7UGIqMc
# HtfnlzPREwW9ZUZHd5HBXXBvf7KrQ5cMSqFSHGqg2/qJhYqOQxwuEQXG8kB41wsD
# JP5d0zmLYKAY8Zxv3lYkuLDsfMuIEqvGYOPURAH+Ybl4SJEESnt0MbPEoKdNihwM
# 5xGv0rGofJ1qOYSTNcc55EbBT7uq3wx3mXhtVmtcCEr5ZKTkKKE1CxZvNPWdGWJU
# PC6e4uRfWHIhZcgCsJ+sozf5EeH5KrlFnxpjKKTavwfFP6XaGZGWUG8TZaiTogRo
# AlqcevbiqioUz1Yt4FRK53P6ovnUfANjIgM9JDdJ4e0qiDRm5sOTiEQtBLGd9Vhd
# 1MadxoGcHrRCsS5rO9yhv2fjJHrmlQ0EIXmp4DhDBieKUGR+eZ4CNE3ctW4uvSDQ
# VeSp9h1SaPV8UWEfyTxgGjOsRpeexIveR1MPTVf7gt8hY64XNPO6iyUGsEgt8c2P
# xF87E+CO7A28TpjNq5eLiiunhKbq0XbjkNoU5JhtYUrlmAbpxRjb9tSreDdtACpm
# 3rkpxp7AQndnI0Shu/fk1/rE3oWsDqMX3jjv40e8KN5YsJBnczyWB4JyeeFMW3JB
# fdeAKhzohFe8U5w9WuvcP1E8cIxLoKSDzCCBOu0hWdjzKNu8Y5SwB1lt5dQhABYy
# zR3dxEO/T1K/BVF3rV69AgMBAAGjggIbMIICFzAOBgNVHQ8BAf8EBAMCAYYwEAYJ
# KwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGtpKDo1L0hjQM972K9J6T7ZPdshMFQG
# A1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jv
# c29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYI
# KwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUw
# AwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0w
# ezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWlj
# cm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlm
# aWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNybDCBlAYIKwYBBQUHAQEEgYcwgYQw
# gYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2Nl
# cnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUy
# MENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwDQYJKoZIhvcNAQEM
# BQADggIBAF+Idsd+bbVaFXXnTHho+k7h2ESZJRWluLE0Oa/pO+4ge/XEizXvhs0Y
# 7+KVYyb4nHlugBesnFqBGEdC2IWmtKMyS1OWIviwpnK3aL5JedwzbeBF7POyg6IG
# G/XhhJ3UqWeWTO+Czb1c2NP5zyEh89F72u9UIw+IfvM9lzDmc2O2END7MPnrcjWd
# QnrLn1Ntday7JSyrDvBdmgbNnCKNZPmhzoa8PccOiQljjTW6GePe5sGFuRHzdFt8
# y+bN2neF7Zu8hTO1I64XNGqst8S+w+RUdie8fXC1jKu3m9KGIqF4aldrYBamyh3g
# 4nJPj/LR2CBaLyD+2BuGZCVmoNR/dSpRCxlot0i79dKOChmoONqbMI8m04uLaEHA
# v4qwKHQ1vBzbV/nG89LDKbRSSvijmwJwxRxLLpMQ/u4xXxFfR4f/gksSkbJp7oqL
# wliDm/h+w0aJ/U5ccnYhYb7vPKNMN+SZDWycU5ODIRfyoGl59BsXR/HpRGtiJquO
# YGmvA/pk5vC1lcnbeMrcWD/26ozePQ/TWfNXKBOmkFpvPE8CH+EeGGWzqTCjdAsn
# o2jzTeNSxlx3glDGJgcdz5D/AAxw9Sdgq/+rY7jjgs7X6fqPTXPmaCAJKVHAP19o
# EjJIBwD1LyHbaEgBxFCogYSOiUIr0Xqcr1nJfiWG2GwYe6ZoAF1bMIIHlzCCBX+g
# AwIBAgITMwAAAFZ+j51YCI7pYAAAAAAAVjANBgkqhkiG9w0BAQwFADBhMQswCQYD
# VQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQD
# EylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDAeFw0y
# NTEwMjMyMDQ2NTFaFw0yNjEwMjIyMDQ2NTFaMIHbMQswCQYDVQQGEwJVUzETMBEG
# A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj
# cm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBP
# cGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046QTUwMC0wNUUwLUQ5
# NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcg
# QXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtKWfm/ul
# 027/d8Rlb8Mn/g0QUvvLqY2Vsy3tI8U2tFSspTZomZOD3BHT8LkR+RrhMJgb1VjA
# KFNysaK9cLSXifPGSIBrPCgs9P4y24lrJEmrV6Q5z4BmqMhIPrZhEvZnWpCS4HO7
# jYSei/nxmC7/1Er+l5Lg3PmSxb8d2IVcARxSw1B4mxB6XI0nkel9wa1dYb2wfGpo
# fraFmxZOxT9eNht4LH0RBSVueba6ZNpjS/0gtfm7qiIiyP6p6PRzTTbMnVqsHnV/
# d/rW0zHx+Q+QNZ5wUqKmTZJB9hU853+2pX5rDfK32uNY9/WBOAmzbqgpEdQkbiMa
# vUMyUDShmycIvgHdQnS207sTj8M+kJL3tOdahPuPqMwsaCCgdfwwQx0O9TKe7FSv
# bAEYs1AnldCl/KHGZCOVvUNqjyL10JLe0/+GD9/ynqXGWFpXOjaunvZ/cKROhjN4
# M5e6xx0b2miqcPii4/ii2ZheKallJET7CKlpFShs3wyg6F/fojQxQvPnbWD4Nyx6
# lhjWjwmoLcx6w1FSCtavLCly33BLRSlTU4qKUxaa8d7YN7Eqpn9XO0SY0umOvKFX
# rWH7rxl+9iaicitdnTTksAnRjvekdKT3lg7lRMfmfZU8vXNiN0UYJzT9EjqjRm0u
# N/h0oXxPhNfPYqeFbyPXGGxzaYUz6zx3qTcCAwEAAaOCAcswggHHMB0GA1UdDgQW
# BBS+tjPyu6tZ/h5GsyLvyz1H+FNIWjAfBgNVHSMEGDAWgBRraSg6NS9IY0DPe9iv
# Sek+2T3bITBsBgNVHR8EZTBjMGGgX6BdhltodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3Rh
# bXBpbmclMjBDQSUyMDIwMjAuY3JsMHkGCCsGAQUFBwEBBG0wazBpBggrBgEFBQcw
# AoZdaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3Nv
# ZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmclMjBDQSUyMDIwMjAuY3J0
# MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/
# BAQDAgeAMGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEW
# M2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5
# Lmh0bTAIBgZngQwBBAIwDQYJKoZIhvcNAQEMBQADggIBAA4DqAXEsO26j/La7Fgn
# /Qifit8xuZekqZ57+Ye+sH/hRTbEEjGYrZgsqwR/lUUfKCFpbZF8msaZPQJOR4YY
# UEU8XyjLrn8Y1jCSmoxh9l7tWiSoc/JFBw356JAmzGGxeBA2EWSxRuTr1AuZe6nY
# aN8/wtFkiHcs8gMadxXBs6DxVhyu5YnhLPQkfumKm3lFftwE7pieV7f1lskmlgsC
# 6AeSGCzGPZUgCvcH5Tv/Qe9z7bIImSD3SuzhOIwaP+eKQTYf67TifyJKkWQSdGfT
# A6Kcu41k8LB6oPK+MLk1jbxxK5wPqLSL62xjK04SBXHEJSEnsFt0zxWkxP/lgej1
# DxqUnmrYEdkxvzKSHIAqFWSZul/5hI+vJxvFPhsNQBEk4cSulDkJQpcdVi/gmf/m
# HFOYhDBjsa15s4L+2sBil3XV/T8RiR66Q8xYvTLRWxd2dVsrOoCwnsU4WIeiC0Ji
# nCv1WLHEh7Qyzr9RSr4kKJLWdpNYLhgjkojTmEkAjFO774t3xB7enbvIF0GOsV19
# xnCUzq9EGKyt0gMuaphKlNjJ+aTpjWMZDGo+GOKsnp93Hmftml0Syp3F9+M3y+y6
# WJGUZoIZJq227jDjjEndtpUrh9BdPdVIfVJD/Au81Rzh05UHAivorQ3Os8PELHIg
# iOd9TWzbdgmGzcILt/ddVQERMYIHRjCCB0ICAQEweDBhMQswCQYDVQQGEwJVUzEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv
# ZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAAAFZ+j51YCI7p
# YAAAAAAAVjANBglghkgBZQMEAgEFAKCCBJ8wEQYLKoZIhvcNAQkQAg8xAgUAMBoG
# CSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwOTE2
# MjMxMjU2WjAvBgkqhkiG9w0BCQQxIgQgonqXovZK2NcWIiLiW9Wu0/wXgE2+uMMq
# CBc2LaQyuYswgbkGCyqGSIb3DQEJEAIvMYGpMIGmMIGjMIGgBCC2DDMlTaTj8JV3
# iTg5Xnpe4CSH60143Z+X9o5NBgMMqDB8MGWkYzBhMQswCQYDVQQGEwJVUzEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQg
# UHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAAAFZ+j51YCI7pYAAA
# AAAAVjCCA2EGCyqGSIb3DQEJEAISMYIDUDCCA0yhggNIMIIDRDCCAiwCAQEwggEJ
# oYHhpIHeMIHbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
# A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUw
# IwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5u
# U2hpZWxkIFRTUyBFU046QTUwMC0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29m
# dCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5oiMKAQEwBwYFKw4D
# AhoDFQD/c/cpFSqQWYBeXggyRJ2ZbvYEEaBnMGWkYzBhMQswCQYDVQQGEwJVUzEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv
# ZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDANBgkqhkiG9w0BAQsF
# AAIFAO5VA4QwIhgPMjAyNjA5MTYxMjAxMDhaGA8yMDI2MDkxNzEyMDEwOFowdzA9
# BgorBgEEAYRZCgQBMS8wLTAKAgUA7lUDhAIBADAKAgEAAgIGNQIB/zAHAgEAAgIS
# PDAKAgUA7lZVBAIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAow
# CAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQBWJ8RZ5Hw5
# zKCP+VbV+P72RbU2Ng/6+0iCyZVghoYWaHWWyPgvDrNEkJ45sVsQwmmRrf0dybSO
# q529lRHh0vEtcgvodcesxBTQUAkTweRAmc1OVTgHyQQ26BouxGcJwIGDpWWjjHNF
# HLVSL74jcbPVBbHMrfrpaowu3gNPBAZeZyk2NYVAM1vYm37i44oUKpnLZOAwoz6M
# k+e+fZJb65jUeWevnVwK9o31ckn/q9pL5OGGWflm2HptvJ6/aEbGJ4ztFVdkPRqg
# YADNia3gwEFgaSv/8mqmYw4FXxocAI5qbX6slHQq6cTgl3eVYPBkerYu419pUdQE
# wMZmxJsrD1N2MA0GCSqGSIb3DQEBAQUABIICAFJ2Z5s3knkg9owwDxyIzbejj9oX
# rT/ZBohQO9AB7bs2ScPCvsG/i52L6dzYlnFsF1HJcvyz39+mOLKa3hbJDGkJqd8g
# YwqXYqJGuQfLrKhUdo+Zvpv9CldCNauN7GttdrQr5iISpxnP8FbAue7qCIqVUy2T
# DKNpSTuZr8atiz8Au8OaZKjMGqYs/85jb6RuhHKNFDCk60x2oNjvB5H8Ics6IHXV
# FUK8pzhcAV9zHnOmC8dz86HxktoYDcDdCP23Y0//90EyOi6al6jsu5Q2usUE8ip1
# Oi5YVmnYjVAntIb/5/DG0CzEc04QgvQ4gxtuWbHRH3Skvykegrfqe9SafY6UhFrj
# h8dIL6NPlaFLRweAixR83PSXQYqqVQDjMTWGEfVtvZReWSc4MsQNWBVd7by6sLv7
# TZ0IWhER3MeKLOKOtiY3GBmMGQRE316A6I58YMfWYmqC0H3cnNRvx5BmBUJZzb28
# 8cDddAbJkMOKdnMYFtJX/hJSntcbxeTHh/2FXg3X4DHIVvwOD7jO5FMgJbjFELy2
# K/IOo6TlU9NlcBETKm3zRRmZfWx7PcoxMMgMrqRn6qhtgrP8OyzdMr1n3dj2gT/X
# SkT5y1nWIlx2zanF2naCB70hYLiGiLcu4aS4hmXnzu4mGoAMG1cBhgx5f3bTPrRI
# Tt4Yl5D2avKLKBS5
# SIG # End signature block