param(
    [Parameter(Mandatory = $true)]
    [string]$Action,

    [Parameter(ValueFromRemainingArguments = $true)]
    [string[]]$Arguments
)

function Exit-WithUsage {
    Write-Error "Usage: upgradeClientHelper.ps1 <Action> [arguments]"
    exit 64
}

function Get-Argument {
    param(
        [int]$Index,
        [string]$Name
    )

    if ($null -eq $Arguments -or $Arguments.Length -le $Index -or [string]::IsNullOrEmpty($Arguments[$Index])) {
        Write-Error "Missing argument: $Name"
        exit 64
    }

    return $Arguments[$Index]
}

function Write-UpgradeLog {
    param(
        [string]$Message
    )

    $path = $null
    if (![string]::IsNullOrEmpty($env:FW_UPGRADE_HELPER_LOG)) {
        $path = $env:FW_UPGRADE_HELPER_LOG
    } elseif (![string]::IsNullOrEmpty($env:FW_UPGRADE_LOG)) {
        $path = $env:FW_UPGRADE_LOG
    }
    if ([string]::IsNullOrEmpty($path)) {
        return
    }

    $stamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff'
    $line = '"{0} == PS helper: {1}"' -f $stamp, $Message
    try {
        Add-Content -Path $path -Value $line -ErrorAction SilentlyContinue
    } catch {
    }
}

function Trim-Log {
    $path = Get-Argument 0 'Path'
    $maxBytes = [int64](Get-Argument 1 'MaxBytes')

    if (Test-Path $path) {
        $item = Get-Item $path
        if ($item.Length -gt $maxBytes) {
            $bytes = [System.IO.File]::ReadAllBytes($path)
            [System.IO.File]::WriteAllBytes($path, $bytes[($bytes.Length - $maxBytes)..($bytes.Length - 1)])
        }
    }
}

function Test-LockStale {
    $path = Get-Argument 0 'Path'
    $maxAgeMinutes = [int](Get-Argument 1 'MaxAgeMinutes')

    if (!(Test-Path $path)) {
        exit 0
    }

    $heartbeat = Join-Path $path 'heartbeat.txt'
    $created = Join-Path $path 'created.txt'

    if (Test-Path $heartbeat) {
        $stamp = (Get-Item $heartbeat).LastWriteTime
    } elseif (Test-Path $created) {
        $stamp = (Get-Item $created).LastWriteTime
    } else {
        $stamp = (Get-Item $path).LastWriteTime
    }

    $age = ((Get-Date) - $stamp).TotalMinutes
    if ($age -gt $maxAgeMinutes) {
        exit 0
    }

    exit 1
}

function Test-MsiAvailable {
    $created = $false
    $mutex = $null

    try {
        $mutex = New-Object System.Threading.Mutex($true, 'Global\_MSIExecute', [ref]$created)
        if ($created) {
            Write-UpgradeLog 'Windows Installer mutex is available.'
            $mutex.ReleaseMutex()
            exit 0
        }

        Write-UpgradeLog 'Windows Installer mutex is busy.'
        exit 1
    } catch {
        Write-UpgradeLog ('Windows Installer mutex check failed: {0}' -f $_.Exception.Message)
        exit 1
    } finally {
        if ($mutex) {
            $mutex.Dispose()
        }
    }
}

function Read-MsiVersion {
    $path = Get-Argument 0 'MsiPath'

    try {
        if (Test-Path $path) {
            $item = Get-Item $path
            Write-UpgradeLog ('Reading MSI ProductVersion from {0}; size {1} bytes.' -f $path, $item.Length)
        } else {
            Write-UpgradeLog ('MSI path does not exist while reading ProductVersion: {0}' -f $path)
        }

        $installer = New-Object -ComObject WindowsInstaller.Installer
        $database = $installer.GetType().InvokeMember('OpenDatabase', 'InvokeMethod', $null, $installer, @($path, 0))
        $view = $database.OpenView("SELECT Value FROM Property WHERE Property = 'ProductVersion'")
        $view.Execute()
        $record = $view.Fetch()
        if ($record) {
            $version = $record.StringData(1)
            Write-UpgradeLog ('MSI ProductVersion read successfully: {0}' -f $version)
            $version
            exit 0
        }

        Write-UpgradeLog ('MSI ProductVersion record was not found in {0}.' -f $path)
        exit 1
    } catch {
        Write-UpgradeLog ('MSI ProductVersion read failed: {0}' -f $_.Exception.Message)
        Write-Error $_.Exception.Message
        exit 1
    }
}

function Get-PackageField {
    param(
        [string]$PackageName,
        [string]$FieldName
    )

    $package = Get-Package -Name $PackageName -ErrorAction SilentlyContinue
    if ($package) {
        Write-UpgradeLog ('Found package: {0}; version {1}' -f $package.Name, $package.Version)
        $package.$FieldName
        exit 0
    }

    Write-UpgradeLog ('Package not found by Get-Package: {0}' -f $PackageName)

    $application = Get-InstalledApplication $PackageName
    if ($application) {
        Write-UpgradeLog ('Found application in uninstall registry: {0}; version {1}; key {2}' -f $application.DisplayName, $application.DisplayVersion, $application.PSChildName)
        if ($FieldName -eq 'Name') {
            $application.DisplayName
        } elseif ($FieldName -eq 'Version') {
            $application.DisplayVersion
        } else {
            $application.$FieldName
        }
        exit 0
    }

    if ($PackageName -eq 'FileWave Client') {
        $fwcldVersion = Get-FwcldVersion
        if ($fwcldVersion) {
            Write-UpgradeLog ('Found FileWave Client version from installed fwcld.exe: {0}' -f $fwcldVersion)
            if ($FieldName -eq 'Name') {
                'FileWave Client'
            } elseif ($FieldName -eq 'Version') {
                $fwcldVersion
            } else {
                $fwcldVersion
            }
            exit 0
        }
    }

    Write-UpgradeLog ('Application not found in uninstall registry: {0}' -f $PackageName)
    exit 1
}

function Test-InstalledVersion {
    $expected = Get-Argument 0 'ExpectedVersion'
    $version = (Get-Package -Name 'FileWave Client' -ErrorAction SilentlyContinue).Version

    if (!$version) {
        Write-UpgradeLog 'Installed FileWave Client version was not found by Get-Package.'
        $application = Get-InstalledApplication 'FileWave Client'
        if ($application) {
            Write-UpgradeLog ('Found installed FileWave Client in uninstall registry; version {0}; key {1}' -f $application.DisplayVersion, $application.PSChildName)
            $version = $application.DisplayVersion
        }
    }

    if (!$version) {
        $version = Get-FwcldVersion
        if ($version) {
            Write-UpgradeLog ('Found installed FileWave Client version from installed fwcld.exe: {0}' -f $version)
        }
    }

    if (!$version) {
        Write-UpgradeLog 'Installed FileWave Client version was not found by Get-Package, uninstall registry, or fwcld.exe -V.'
        exit 1
    }

    $version

    if (Test-VersionMatches $version $expected) {
        Write-UpgradeLog ('Installed FileWave Client version {0} matches expected version {1}.' -f $version, $expected)
        exit 0
    }

    Write-UpgradeLog ('Installed FileWave Client version {0} does not match expected version {1}.' -f $version, $expected)
    exit 2
}

function Test-VersionMatches {
    param(
        [string]$Version,
        [string]$Expected
    )

    if ($Version -eq $Expected) {
        return $true
    }

    try {
        $actualVersion = [version]$Version
        $expectedVersion = [version]$Expected

        if ($actualVersion -eq $expectedVersion) {
            return $true
        }

        if ($expectedVersion.Revision -lt 0) {
            return $actualVersion.Major -eq $expectedVersion.Major -and
                $actualVersion.Minor -eq $expectedVersion.Minor -and
                $actualVersion.Build -eq $expectedVersion.Build
        }
    } catch {
    }

    return $false
}

function Get-InstalledApplication {
    param(
        [string]$DisplayName
    )

    $paths = @(
        'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',
        'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
    )

    Get-ItemProperty $paths -ErrorAction SilentlyContinue |
        Where-Object { $_.DisplayName -eq $DisplayName } |
        Select-Object -First 1
}

function Get-FwcldVersion {
    $paths = Get-FwcldPaths

    foreach ($path in $paths) {
        if (!(Test-Path $path)) {
            Write-UpgradeLog ('fwcld.exe candidate not found: {0}' -f $path)
            continue
        }

        $fileVersion = Get-FwcldFileVersion $path
        if ($fileVersion) {
            return $fileVersion
        }

        try {
            $output = & $path -V 2>&1
            $exitCode = $LASTEXITCODE
            Write-UpgradeLog ('fwcld.exe -V at {0} exited with {1}; output: {2}' -f $path, $exitCode, ($output -join ' '))
            if ($exitCode -ne 0) {
                continue
            }

            foreach ($line in $output) {
                if ($line -match '\b(\d+(?:\.\d+){1,3})\b') {
                    return $Matches[1]
                }
            }
        } catch {
            Write-UpgradeLog ('fwcld.exe -V failed at {0}: {1}' -f $path, $_.Exception.Message)
        }
    }

    return $null
}

function Get-FwcldPaths {
    @(
        'C:\Program Files\FileWave\client\fwcld.exe',
        'C:\Program Files\FileWave\fwcld.exe',
        'C:\Program Files (x86)\FileWave\fwcld.exe'
    )
}

function Get-FwcldFileVersion {
    param(
        [string]$Path
    )

    try {
        $versionInfo = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($Path)
        foreach ($candidate in @($versionInfo.ProductVersion, $versionInfo.FileVersion)) {
            if ([string]::IsNullOrWhiteSpace($candidate)) {
                continue
            }

            Write-UpgradeLog ('fwcld.exe version resource at {0}: {1}' -f $Path, $candidate)
            if ($candidate -match '\b(\d+(?:\.\d+){1,3})\b') {
                return $Matches[1]
            }
        }
    } catch {
        Write-UpgradeLog ('Could not read fwcld.exe version resource at {0}: {1}' -f $Path, $_.Exception.Message)
    }

    return $null
}

function Test-MsiLogMissingSource {
    $path = Get-Argument 0 'MsiLogPath'

    if (!(Test-Path $path)) {
        exit 1
    }

    $patterns = @(
        '\b1706\b',
        'no valid source',
        'installation source',
        'source for this product',
        'network resource',
        'SourceList',
        'cannot find.*\.msi',
        'use source',
        'failed to resolve source'
    )

    $text = Get-Content -Path $path -Raw -ErrorAction SilentlyContinue
    foreach ($pattern in $patterns) {
        if ($text -match $pattern) {
            Write-UpgradeLog ('MSI log missing-source pattern matched: {0}' -f $pattern)
            exit 0
        }
    }

    Write-UpgradeLog 'MSI log did not contain missing-source patterns.'
    exit 1
}

function Scrub-FileWaveMsiRegistration {
    $paths = @(
        'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',
        'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
    )

    $apps = Get-ItemProperty $paths -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -like 'FileWave Client*' }
    foreach ($app in $apps) {
        $code = $app.PSChildName -replace '[-{}]', ''
        if ($code.Length -eq 32) {
            $packedCode = -join ($code[7..0] + $code[11..8] + $code[15..12] + $code[17, 16, 19, 18, 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30])
            Remove-Item "HKLM:\SOFTWARE\Classes\Installer\Products\$packedCode" -Recurse -Force -ErrorAction SilentlyContinue
            Remove-Item $app.PSPath -Recurse -Force -ErrorAction SilentlyContinue
            Write-Output "Scrubbed old MSI registration for $($app.DisplayName)"
        }
    }
}

function Count-Lines {
    $path = Get-Argument 0 'Path'

    if (Test-Path $path) {
        (Get-Content $path).Length
    } else {
        0
    }
}

if ($Action -ne 'TrimLog') {
    $argumentCount = 0
    if ($null -ne $Arguments) {
        $argumentCount = $Arguments.Length
    }
    Write-UpgradeLog ('Action {0} started with {1} argument(s).' -f $Action, $argumentCount)
}

switch ($Action) {
    'TrimLog' {
        Trim-Log
        exit 0
    }
    'IsLockStale' {
        Test-LockStale
    }
    'MsiAvailable' {
        Test-MsiAvailable
    }
    'ReadMsiVersion' {
        Read-MsiVersion
    }
    'GetPackageName' {
        $name = Get-Argument 0 'PackageName'
        Get-PackageField $name 'Name'
    }
    'GetPackageVersion' {
        $name = Get-Argument 0 'PackageName'
        Get-PackageField $name 'Version'
    }
    'VerifyInstalledVersion' {
        Test-InstalledVersion
    }
    'MsiLogMissingSource' {
        Test-MsiLogMissingSource
    }
    'ScrubFileWaveMsiRegistration' {
        Scrub-FileWaveMsiRegistration
        exit 0
    }
    'CountLines' {
        Count-Lines
        exit 0
    }
    default {
        Exit-WithUsage
    }
}

# SIG # Begin signature block
# MII53wYJKoZIhvcNAQcCoII50DCCOcwCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCpZO/aMx45OVRe
# /suJ4xj1Ey9VrwqGJenyf4BmGwSrUqCCIgQwggXMMIIDtKADAgECAhBUmNLR1FsZ
# 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
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggavMIIEl6ADAgECAhMzAAKS8U8r
# HyM7M/f7AAAAApLxMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDMwHhcNMjYwNzAxMDI0NDA4WhcNMjYwNzA0
# MDI0NDA4WjByMQswCQYDVQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UE
# BxMMSW5kaWFuYXBvbGlzMRwwGgYDVQQKExNGaWxlV2F2ZSAoVVNBKSBJbmMuMRww
# GgYDVQQDExNGaWxlV2F2ZSAoVVNBKSBJbmMuMIIBojANBgkqhkiG9w0BAQEFAAOC
# AY8AMIIBigKCAYEAm6FFj6O8aZA3tpaPsmUZvh6nHVUZdoRbHDQu2Jel80CfFfMb
# 84cDVVDa8sl83bkXjj2luiQdjHIFzPx+NqTJFiyEzdrTc5NfO3n+So57QPnQk3DT
# MpBxyrQVkwDdu/bVAZDCjIx8yyeK2iK5aJSPOAeGnJyuqfAHbI6obCz3WmWLUCtc
# NyWOFgxs1NE90TB9i6uvmsAThgcjOVQsi1nHCdsMPTNsORkhpf8cM+y7k6S58gbv
# 5mTxmuSxmhX9n3g6tjMGj3C9wnk4VNP6ksAtj06cpl6TpnmHnA8vDyGoez2T9tHl
# GamnmzMjNQ7egS7suihKhfkDbVhZlYWOjbAFYumzO/gGOEu7AU6TNt0Q5M59dvaY
# 7YaKnE2s/JzheqP6kOFcJEeM12i5g5fBuLe10SaFOlSM5rCbBYBOzSoVpdxAdu6M
# re8CZu3cdWbaj7zpo5Zg4ZXl/NB11UQjn92s+XGoq0OaVAi2l+RawOvG21K7opkT
# JrMYYogztdoor9ZpAgMBAAGjggHUMIIB0DAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB
# /wQEAwIHgDA7BgNVHSUENDAyBgorBgEEAYI3YQEABggrBgEFBQcDAwYaKwYBBAGC
# N2G8ycRpgvKdiAWCxsqSJMvg7XMwHQYDVR0OBBYEFFYzCoTqgKkxJtm/MzaYWsKk
# URYkMB8GA1UdIwQYMBaAFGtepTTDBcViSiFajqtzYGLUrGOFMGcGA1UdHwRgMF4w
# XKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jv
# c29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUyMENBJTIwMDMuY3JsMHQG
# CCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZYaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1Ml
# MjBFT0MlMjBDQSUyMDAzLmNydDBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEF
# BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9z
# aXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4ICAQBpBbBKA0GqiIV6u8Kqq8jrZYlD
# spIGjqn45qI5WJtgCIpX0XKmhjSrHnap92aP3BYHndpvCKCnC5RwbjoEqF104KsM
# lTRwK/TMcbmutS+GKRCBCGuzdCl5XeVvCoUJoI6kmmMce8l5NdRIBOIKybETIWDm
# LFxVbGosm7i2FTolxWLHaXdbbJxtkbORwlzk14d1L96J0Ai0IZwxUqUoYmzTmE0+
# TIaXGHYb5AVsIgfGFpKjVbChJ8fCHoPPekjhd3bfCby94khoFjRUEhKUy1zeGMgq
# HYojYlFAAaQn8rYxqfvuUtBy10z0H5YnRSI85g4EgcAsgMGFWX6eVSimkxnt+Z4G
# SKFlB4tQZ6QKE2i6m+BQM/bKnJ/vTQkEQnQKOfHOsfAnAQtIS6yhnfo0L7I1dn8u
# qlyf0U1GPgoiY4kcNjkyWMjvr9ShV4mKZrQ5M3Ii+tYhA2LtXhvCyzUls8WDcGh1
# 2QyC8eAmWoen179Hb9xbUSYgg22jlU3yTPK8kQyZDJB5X0HgRLZWTIuEJ6EiDsDE
# gbqOWCEWYgN5BZrdOrvdAv9IiDke84xCxze34n73T/SGb79VCXTaaBdKwatHTJw/
# RzBAdoWRWg5e7XDrgjFuwIWj9GQEZ7qhl0fyRtM6I55ZBROZt6wllTkeurtPi4Y4
# fL7jNdRDyS7+ymmdejCCBq8wggSXoAMCAQICEzMAApLxTysfIzsz9/sAAAACkvEw
# DQYJKoZIhvcNAQEMBQAwWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlmaWVkIENT
# IEVPQyBDQSAwMzAeFw0yNjA3MDEwMjQ0MDhaFw0yNjA3MDQwMjQ0MDhaMHIxCzAJ
# BgNVBAYTAlVTMRAwDgYDVQQIEwdJbmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9s
# aXMxHDAaBgNVBAoTE0ZpbGVXYXZlIChVU0EpIEluYy4xHDAaBgNVBAMTE0ZpbGVX
# YXZlIChVU0EpIEluYy4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCb
# oUWPo7xpkDe2lo+yZRm+HqcdVRl2hFscNC7Yl6XzQJ8V8xvzhwNVUNryyXzduReO
# PaW6JB2McgXM/H42pMkWLITN2tNzk187ef5KjntA+dCTcNMykHHKtBWTAN279tUB
# kMKMjHzLJ4raIrlolI84B4acnK6p8AdsjqhsLPdaZYtQK1w3JY4WDGzU0T3RMH2L
# q6+awBOGByM5VCyLWccJ2ww9M2w5GSGl/xwz7LuTpLnyBu/mZPGa5LGaFf2feDq2
# MwaPcL3CeThU0/qSwC2PTpymXpOmeYecDy8PIah7PZP20eUZqaebMyM1Dt6BLuy6
# KEqF+QNtWFmVhY6NsAVi6bM7+AY4S7sBTpM23RDkzn129pjthoqcTaz8nOF6o/qQ
# 4VwkR4zXaLmDl8G4t7XRJoU6VIzmsJsFgE7NKhWl3EB27oyt7wJm7dx1ZtqPvOmj
# lmDhleX80HXVRCOf3az5cairQ5pUCLaX5FrA68bbUruimRMmsxhiiDO12iiv1mkC
# AwEAAaOCAdQwggHQMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDsGA1Ud
# JQQ0MDIGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhorBgEEAYI3YbzJxGmC8p2IBYLG
# ypIky+DtczAdBgNVHQ4EFgQUVjMKhOqAqTEm2b8zNphawqRRFiQwHwYDVR0jBBgw
# FoAUa16lNMMFxWJKIVqOq3NgYtSsY4UwZwYDVR0fBGAwXjBcoFqgWIZWaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQlMjBW
# ZXJpZmllZCUyMENTJTIwRU9DJTIwQ0ElMjAwMy5jcmwwdAYIKwYBBQUHAQEEaDBm
# MGQGCCsGAQUFBzAChlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2Nl
# cnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUyMENBJTIw
# MDMuY3J0MFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wDQYJ
# KoZIhvcNAQEMBQADggIBAGkFsEoDQaqIhXq7wqqryOtliUOykgaOqfjmojlYm2AI
# ilfRcqaGNKsedqn3Zo/cFged2m8IoKcLlHBuOgSoXXTgqwyVNHAr9Mxxua61L4Yp
# EIEIa7N0KXld5W8KhQmgjqSaYxx7yXk11EgE4grJsRMhYOYsXFVsaiybuLYVOiXF
# Ysdpd1tsnG2Rs5HCXOTXh3Uv3onQCLQhnDFSpShibNOYTT5MhpcYdhvkBWwiB8YW
# kqNVsKEnx8Ieg896SOF3dt8JvL3iSGgWNFQSEpTLXN4YyCodiiNiUUABpCfytjGp
# ++5S0HLXTPQflidFIjzmDgSBwCyAwYVZfp5VKKaTGe35ngZIoWUHi1BnpAoTaLqb
# 4FAz9sqcn+9NCQRCdAo58c6x8CcBC0hLrKGd+jQvsjV2fy6qXJ/RTUY+CiJjiRw2
# OTJYyO+v1KFXiYpmtDkzciL61iEDYu1eG8LLNSWzxYNwaHXZDILx4CZah6fXv0dv
# 3FtRJiCDbaOVTfJM8ryRDJkMkHlfQeBEtlZMi4QnoSIOwMSBuo5YIRZiA3kFmt06
# u90C/0iIOR7zjELHN7fifvdP9IZvv1UJdNpoF0rBq0dMnD9HMEB2hZFaDl7tcOuC
# MW7AhaP0ZARnuqGXR/JG0zojnlkFE5m3rCWVOR66u0+Lhjh8vuM11EPJLv7KaZ16
# MIIHKDCCBRCgAwIBAgITMwAAABUFPm4ZjpMp2QAAAAAAFTANBgkqhkiG9w0BAQwF
# ADBjMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MTQwMgYDVQQDEytNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ29kZSBTaWduaW5nIFBD
# QSAyMDIxMB4XDTI2MDMyNjE4MTEyOFoXDTMxMDMyNjE4MTEyOFowWjELMAkGA1UE
# BhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMi
# TWljcm9zb2Z0IElEIFZlcmlmaWVkIENTIEVPQyBDQSAwMzCCAiIwDQYJKoZIhvcN
# AQEBBQADggIPADCCAgoCggIBAOD0yz0Cqi8Ocx4+8w574rJuEJ3z6WiTNg5GVLeQ
# FVex55xvIbAFyx6eWblsu0wY+OIgUvMFAX6CGVVX9Tb2rkZx14QQEIdNMaEvaSgi
# stzhSuWIxFxu/2Y4y1H+Xv/ECa/QXHgEkefV0e3ft++sGpeYqMp8Z/kOnI7/6GdX
# tMSt4y1LX2I75uNn/0eemDc8KTR7thJtFMWTH3sVnBFakLizc16lF9FdCH9YwCPs
# maxh5VmiGLhMXnJbYkyslmrAdzLMlli0PYeWejlkQmR2JlwRrEc6hubA7TpnUn1z
# bemz08YiEZqrWwosQDP0OhzmsuRhYa14OuxwqECnaQhz+hiUf0iPoGQ6qqBYg0SQ
# S0Lxk0bUxqT6HejrlqPSJAqZ3Fbshloc7ly7KgyL4q1h9d4giDexUhtLYQvyRS2w
# MZ0So2oCr+KypOLWNeot7qIqnWeLVI9289b0bTcJOxgXrxv/K4hBHBt2gEJd6Yw0
# kJLR2isJFjhvZYADLieDtIA1wSCsGBl/nfn5B8tTmEbOsqMilsxptq5ZvkUpZQqQ
# yw9xcWRdFY7iego+bgpaUXKmo6lsn8o41VF4iXEdBF6AA4HMiFEHuCv0gNDWxzYy
# A6BD7FUZbiirgcPSZ8CLCLIuyRmuRpDsmhqdiME1xH1FLbpjEBVtwG0uK0VPMIgS
# Dll1AgMBAAGjggHcMIIB2DAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMC
# AQAwHQYDVR0OBBYEFGtepTTDBcViSiFajqtzYGLUrGOFMFQGA1UdIARNMEswSQYE
# VR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp
# b3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBD
# AEEwEgYDVR0TAQH/BAgwBgEB/wIBADAfBgNVHSMEGDAWgBTZQSmwDw9jbO9p1/XN
# KZ6kSGow5jBwBgNVHR8EaTBnMGWgY6Bhhl9odHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ29kZSUy
# MFNpZ25pbmclMjBQQ0ElMjAyMDIxLmNybDB9BggrBgEFBQcBAQRxMG8wbQYIKwYB
# BQUHMAKGYWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWlj
# cm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIw
# MjAyMS5jcnQwDQYJKoZIhvcNAQEMBQADggIBAF1uIjzPBctfyCUkSH/xDbZQwJSF
# YE7jpn0U+HA5HeZ2WpFUuRg6if8xzNTCuMOHHdf31I8fk9J+WQahO+c71lYczlgV
# Vik7s1i4H6Z9VIYAZnCIY4BJaTSLYHu+f2cSUkmaiJfG6B8flh0GytSBO3QAU1eT
# OapOCT5LUfFvW7/QcKoQdVk+TYD/p4ldhu2lEzkVzPTSOKxSX0FFmBJ5s4NXzlsH
# M696rILd/Q+ccLFEk2ExvzE/+wH9Ujul/auF5JXvOpRK/y+f98gxuVd5pUiWmqir
# xI/0EkyMT8KhVcnGeRlBEzUVruQ33LO29F46HFKA+ClnH9eX+OTDIQVUlMF8Gnex
# OB8hz+maq/Z6G1qQvYASPvwSY49CiHElPfDJf4/vwYDbm0ukC/OPdEwwd3zPXxm6
# 5WL7rQwDMak4BIfUvw2Wvd9lFmdA76nLJ7YMK9iYdoh91SBgmqfuejHEZW/z35Fo
# ROHW2AIO/A2kUJIbu+XkDhqSj7Z/HjT2v1NaNcLs6J/UhDlknMHhF/wa8GIdiO8y
# YemV52nUUZEt1JEVWkLf84qlljpq8ipmnv7yk/9ZA/3TcN2Cu8BPpbjE84HFc9ri
# 0aSw3dK6olqIVgdI3J4G5+fyKx66NbghsFJscPgE+psXepn7ucb13938bb8vHiQf
# 1wKYF+axl1KQea6QMIIHnjCCBYagAwIBAgITMwAAAAeHozSje6WOHAAAAAAABzAN
# BgkqhkiG9w0BAQwFADB3MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0
# IENvcnBvcmF0aW9uMUgwRgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRpdHkgVmVyaWZp
# Y2F0aW9uIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAwHhcNMjEwNDAx
# MjAwNTIwWhcNMzYwNDAxMjAxNTIwWjBjMQswCQYDVQQGEwJVUzEeMBwGA1UEChMV
# TWljcm9zb2Z0IENvcnBvcmF0aW9uMTQwMgYDVQQDEytNaWNyb3NvZnQgSUQgVmVy
# aWZpZWQgQ29kZSBTaWduaW5nIFBDQSAyMDIxMIICIjANBgkqhkiG9w0BAQEFAAOC
# Ag8AMIICCgKCAgEAsvDArxmIKOLdVHpMSWxpCFUJtFL/ekr4weslKPdnF3cpTeuV
# 8veqtmKVgok2rO0D05BpyvUDCg1wdsoEtuxACEGcgHfjPF/nZsOkg7c0mV8hpMT/
# GvB4uhDvWXMIeQPsDgCzUGzTvoi76YDpxDOxhgf8JuXWJzBDoLrmtThX01CE1TCC
# vH2sZD/+Hz3RDwl2MsvDSdX5rJDYVuR3bjaj2QfzZFmwfccTKqMAHlrz4B7ac8g9
# zyxlTpkTuJGtFnLBGasoOnn5NyYlf0xF9/bjVRo4Gzg2Yc7KR7yhTVNiuTGH5h4e
# B9ajm1OCShIyhrKqgOkc4smz6obxO+HxKeJ9bYmPf6KLXVNLz8UaeARo0BatvJ82
# sLr2gqlFBdj1sYfqOf00Qm/3B4XGFPDK/H04kteZEZsBRc3VT2d/iVd7OTLpSH9y
# CORV3oIZQB/Qr4nD4YT/lWkhVtw2v2s0TnRJubL/hFMIQa86rcaGMhNsJrhysLNN
# MeBhiMezU1s5zpusf54qlYu2v5sZ5zL0KvBDLHtL8F9gn6jOy3v7Jm0bbBHjrW5y
# QW7S36ALAt03QDpwW1JG1Hxu/FUXJbBO2AwwVG4Fre+ZQ5Od8ouwt59FpBxVOBGf
# N4vN2m3fZx1gqn52GvaiBz6ozorgIEjn+PhUXILhAV5Q/ZgCJ0u2+ldFGjcCAwEA
# AaOCAjUwggIxMA4GA1UdDwEB/wQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADAdBgNV
# HQ4EFgQU2UEpsA8PY2zvadf1zSmepEhqMOYwVAYDVR0gBE0wSzBJBgRVHSAAMEEw
# PwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9j
# cy9SZXBvc2l0b3J5Lmh0bTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAPBgNV
# HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFMh+0mqFKhvKGZgEByfPUBBPaKiiMIGE
# BgNVHR8EfTB7MHmgd6B1hnNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L2NybC9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3Ql
# MjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3JsMIHDBggrBgEFBQcB
# AQSBtjCBszCBgQYIKwYBBQUHMAKGdWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
# a2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24l
# MjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNydDAtBggr
# BgEFBQcwAYYhaHR0cDovL29uZW9jc3AubWljcm9zb2Z0LmNvbS9vY3NwMA0GCSqG
# SIb3DQEBDAUAA4ICAQB/JSqe/tSr6t1mCttXI0y6XmyQ41uGWzl9xw+WYhvOL47B
# V09Dgfnm/tU4ieeZ7NAR5bguorTCNr58HOcA1tcsHQqt0wJsdClsu8bpQD9e/al+
# lUgTUJEV80Xhco7xdgRrehbyhUf4pkeAhBEjABvIUpD2LKPho5Z4DPCT5/0TlK02
# nlPwUbv9URREhVYCtsDM+31OFU3fDV8BmQXv5hT2RurVsJHZgP4y26dJDVF+3pcb
# tvh7R6NEDuYHYihfmE2HdQRq5jRvLE1Eb59PYwISFCX2DaLZ+zpU4bX0I16ntKq4
# poGOFaaKtjIA1vRElItaOKcwtc04CBrXSfyL2Op6mvNIxTk4OaswIkTXbFL81ZKG
# D+24uMCwo/pLNhn7VHLfnxlMVzHQVL+bHa9KhTyzwdG/L6uderJQn0cGpLQMStUu
# NDArxW2wF16QGZ1NtBWgKA8Kqv48M8HfFqNifN6+zt6J0GwzvU8g0rYGgTZR8zDE
# IJfeZxwWDHpSxB5FJ1VVU1LIAtB7o9PXbjXzGifaIMYTzU4YKt4vMNwwBmetQDHh
# dAtTPplOXrnI9SI6HeTtjDD3iUN/7ygbahmYOHk7VB7fwT4ze+ErCbMh6gHV1UuX
# PiLciloNxH6K4aMfZN1oLVk6YFeIJEokuPgNPa6EnTiOL60cPqfny+Fq8UiuZzGC
# FzEwghctAgEBMHEwWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
# b3Jwb3JhdGlvbjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlmaWVkIENTIEVP
# QyBDQSAwMwITMwACkvFPKx8jOzP3+wAAAAKS8TANBglghkgBZQMEAgEFAKBeMBAG
# CisGAQQBgjcCAQwxAjAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMC8GCSqG
# SIb3DQEJBDEiBCBf2PfXr4F8otV61m8l5wEWboOHsuL9Ii/02TwWuiG24TANBgkq
# hkiG9w0BAQEFAASCAYBBjRtPmF5ePeQ0HbS5IRH7wKQRjYaX3oNVusnVUwdK+W7P
# w1wX2yr4R3PRWVAS58AczFcTw0GxKY+dg22p0EgthteUxaQVfWUoHmxfns+COYpG
# 1AKPkVVaBS53sZUJKfpRHgYp+tOZs9hPus6W3YJX+L3Yw6qthqZE3zGBPk4iCE3D
# C761GExdoKQ+GU6nq3sYToyczoQ/nyLQf9ScH1lnJUxxmj/wjZ+YtrFV1O82o2Yu
# qVXh2IcREm5TDCghCBTUGJVlC5Uq0A2xzcropfqBWNTXHiXHVVHiBJzEL9RIgTNS
# 9vAIkb1yNvIiaQW00TYcZqs6U7lIgcdOv4aO9WiD1PBdt8ufm0+COH6akR3lp9zu
# uSm/n4JR1rzxn2QZWQBoV8oGUiHfNRAyzqYyxD7M1Iag+vjg7Uad+LxZ/g7YVuq9
# PnIGSMHrvnGZs57WtWflSA/3jp4TgSiF5n0+2llL+A0mBFpviQ+LecYzs/nBgc34
# /ky3df3BlASnCocPxiehghSxMIIUrQYKKwYBBAGCNwMDATGCFJ0wghSZBgkqhkiG
# 9w0BBwKgghSKMIIUhgIBAzEPMA0GCWCGSAFlAwQCAQUAMIIBaQYLKoZIhvcNAQkQ
# AQSgggFYBIIBVDCCAVACAQEGCisGAQQBhFkKAwEwMTANBglghkgBZQMEAgEFAAQg
# MdZDXrHGxJvPcwbB4aCUpfFaPGcbXHULux44qL5mm5ECBmo/DOnjoRgSMjAyNjA3
# MDIxNDI5MDQuNDhaMASAAgH0oIHppIHmMIHjMQswCQYDVQQGEwJVUzETMBEGA1UE
# CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
# b2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVy
# YXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo3QjFBLTA1
# RTAtRDk0NzE1MDMGA1UEAxMsTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFt
# cGluZyBBdXRob3JpdHmggg8pMIIHgjCCBWqgAwIBAgITMwAAAAXlzw//Zi7JhwAA
# AAAABTANBgkqhkiG9w0BAQwFADB3MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWlj
# cm9zb2Z0IENvcnBvcmF0aW9uMUgwRgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRpdHkg
# VmVyaWZpY2F0aW9uIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAwHhcN
# MjAxMTE5MjAzMjMxWhcNMzUxMTE5MjA0MjMxWjBhMQswCQYDVQQGEwJVUzEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQg
# UHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDCCAiIwDQYJKoZIhvcNAQEB
# BQADggIPADCCAgoCggIBAJ5851Jj/eDFnwV9Y7UGIqMcHtfnlzPREwW9ZUZHd5HB
# XXBvf7KrQ5cMSqFSHGqg2/qJhYqOQxwuEQXG8kB41wsDJP5d0zmLYKAY8Zxv3lYk
# uLDsfMuIEqvGYOPURAH+Ybl4SJEESnt0MbPEoKdNihwM5xGv0rGofJ1qOYSTNcc5
# 5EbBT7uq3wx3mXhtVmtcCEr5ZKTkKKE1CxZvNPWdGWJUPC6e4uRfWHIhZcgCsJ+s
# ozf5EeH5KrlFnxpjKKTavwfFP6XaGZGWUG8TZaiTogRoAlqcevbiqioUz1Yt4FRK
# 53P6ovnUfANjIgM9JDdJ4e0qiDRm5sOTiEQtBLGd9Vhd1MadxoGcHrRCsS5rO9yh
# v2fjJHrmlQ0EIXmp4DhDBieKUGR+eZ4CNE3ctW4uvSDQVeSp9h1SaPV8UWEfyTxg
# GjOsRpeexIveR1MPTVf7gt8hY64XNPO6iyUGsEgt8c2PxF87E+CO7A28TpjNq5eL
# iiunhKbq0XbjkNoU5JhtYUrlmAbpxRjb9tSreDdtACpm3rkpxp7AQndnI0Shu/fk
# 1/rE3oWsDqMX3jjv40e8KN5YsJBnczyWB4JyeeFMW3JBfdeAKhzohFe8U5w9Wuvc
# P1E8cIxLoKSDzCCBOu0hWdjzKNu8Y5SwB1lt5dQhABYyzR3dxEO/T1K/BVF3rV69
# AgMBAAGjggIbMIICFzAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAw
# HQYDVR0OBBYEFGtpKDo1L0hjQM972K9J6T7ZPdshMFQGA1UdIARNMEswSQYEVR0g
# ADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYB
# BAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAW
# gBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRlbnRp
# dHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3Jp
# dHklMjAyMDIwLmNybDCBlAYIKwYBBQUHAQEEgYcwgYQwgYEGCCsGAQUFBzAChnVo
# dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUy
# MElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIw
# QXV0aG9yaXR5JTIwMjAyMC5jcnQwDQYJKoZIhvcNAQEMBQADggIBAF+Idsd+bbVa
# FXXnTHho+k7h2ESZJRWluLE0Oa/pO+4ge/XEizXvhs0Y7+KVYyb4nHlugBesnFqB
# GEdC2IWmtKMyS1OWIviwpnK3aL5JedwzbeBF7POyg6IGG/XhhJ3UqWeWTO+Czb1c
# 2NP5zyEh89F72u9UIw+IfvM9lzDmc2O2END7MPnrcjWdQnrLn1Ntday7JSyrDvBd
# mgbNnCKNZPmhzoa8PccOiQljjTW6GePe5sGFuRHzdFt8y+bN2neF7Zu8hTO1I64X
# NGqst8S+w+RUdie8fXC1jKu3m9KGIqF4aldrYBamyh3g4nJPj/LR2CBaLyD+2BuG
# ZCVmoNR/dSpRCxlot0i79dKOChmoONqbMI8m04uLaEHAv4qwKHQ1vBzbV/nG89LD
# KbRSSvijmwJwxRxLLpMQ/u4xXxFfR4f/gksSkbJp7oqLwliDm/h+w0aJ/U5ccnYh
# Yb7vPKNMN+SZDWycU5ODIRfyoGl59BsXR/HpRGtiJquOYGmvA/pk5vC1lcnbeMrc
# WD/26ozePQ/TWfNXKBOmkFpvPE8CH+EeGGWzqTCjdAsno2jzTeNSxlx3glDGJgcd
# z5D/AAxw9Sdgq/+rY7jjgs7X6fqPTXPmaCAJKVHAP19oEjJIBwD1LyHbaEgBxFCo
# gYSOiUIr0Xqcr1nJfiWG2GwYe6ZoAF1bMIIHnzCCBYegAwIBAgITMwAAAFl82nHp
# jV71wAAAAAAAWTANBgkqhkiG9w0BAQwFADBhMQswCQYDVQQGEwJVUzEeMBwGA1UE
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVi
# bGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDAeFw0yNjAxMDgxODU5MDFaFw0y
# NzAxMDcxODU5MDFaMIHjMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0
# ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo3QjFBLTA1RTAtRDk0NzE1MDMG
# A1UEAxMsTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3Jp
# dHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCmLuf+NHhF/oU/uYxW
# teOm4nd3QOC512J7b5D9whsOCxgERYZ7yzEif1bbLm8w2nhZ5u8m9ikjO9Fph0Ka
# 3Qlaqb1B+5dLgeIzcO7qy6AEfZChyxNFZTJQ0rQ0sVASN6sLHa473Zr1dJPvf547
# gxIkpcyU3+w6MHdSt2zuG3kcmhYUfmPLcphAjqpTgH32KxtsGXVTOdfkEgUnvjxM
# pK/Aujp56koqbhfH2bwm+v4bpNGZumcLGosUhyAE9iBBr0u3OtyJvI1d2vEdCuot
# sosNDTZZ00qcMv2X7+4sLCwcIX24wU5/lzpepj8w10EN1fkkT/cV2xijrAU8cxon
# e2igB8N6OAIZfVBlix/ZDT91VKJBOiWJI5X6blBmeoEMqg3sH8Q+FaGCJaKbeB2d
# MUL6mo7icfnK/C0fyGeeoCy5sMjM3Xufr7YwaIpa8v4EmcFRsIJL5CIKSjwUBxrE
# gdMt7M6+2O8BG+r9MmWpdV1L1p5894p02klrAhayz1cFZl8t53GOf3duVaTpIbfp
# uvexljW77DToQDh0Wn7RPY/4YZKDOkbMiXwS54ajHAP8HGr3+aI+TXskUHRmXiyn
# JbPXLCkt7AVMz4nccdoojR/Qj2g6v2yyRDl2rGKIVzJ0Yp7vn1JPNbPFTuw0Ehen
# 35+aKkh6FfJX9QMervpHUoW/AQIDAQABo4IByzCCAccwHQYDVR0OBBYEFI+W5wtf
# A9L5Z0kYQjojgxhrlzZ2MB8GA1UdIwQYMBaAFGtpKDo1L0hjQM972K9J6T7ZPdsh
# MGwGA1UdHwRlMGMwYaBfoF2GW2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lv
# cHMvY3JsL01pY3Jvc29mdCUyMFB1YmxpYyUyMFJTQSUyMFRpbWVzdGFtcGluZyUy
# MENBJTIwMjAyMC5jcmwweQYIKwYBBQUHAQEEbTBrMGkGCCsGAQUFBzAChl1odHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFB1
# YmxpYyUyMFJTQSUyMFRpbWVzdGFtcGluZyUyMENBJTIwMjAyMC5jcnQwDAYDVR0T
# AQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMCB4Aw
# ZgYDVR0gBF8wXTBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMAgG
# BmeBDAEEAjANBgkqhkiG9w0BAQwFAAOCAgEARDIcwv2XI6Rv81ERO89mKeb61MVI
# 7BOV2t7f9kRrxEsL25rJN2yx4UhQGo4KNl0PMaBgz97FISgiz3iAkm5Fb+lfLEqf
# HyfCaLOsq2sH9mFYrPLXFfjju1PUuiRj0M6Zj53H80HOJ3tX6mePh4immyAxKBXX
# XUE9hIJJPX88QmPxGedmrydu3Un6yPyA5sp/VddDt4kKYNhfgvbzU65O51YKA6B2
# vfkN6WK9CBxp0preYq4Bk+N+s6OVp1z/BcTIbMB9WosokmYlc4aK9dAvQudnD9wv
# PzxKDClF7LS46DztEzJHlv9Ra9fOilw+OUEYAaNMSJoLVk3c1hZ5Q/qe/ogwSLkq
# zXEVw0WLqv2mGWg4VkiNEmHTyFlYeV717lgN9WvKENEjvqD2tzZPNJNPOuMIosid
# SrG0p2mnn4Pb7KXoIa6WPJYwsMXwlLceR0ETYACTiPCCgAiuHdNeDJNIZUTtJUFU
# R3oKiINvSul6pHN+tFtmSRlHLLZSqJJFY+igB4xsqy0T83qWH4mVCauIF8sW6bym
# 9VydhTduvNmlKDV6PUckStXIdH+upOvso/PJM77gu/ryVrTQ7P1KSDOh4ZtJFOuC
# VCezDBEHAHO5KX7expu2HkSvqCoKlIGFwn5s21/JyVyWZz2vAA1lbCKrLjQMQiNA
# mV5FC6H6qOQXus8xggPUMIID0AIBATB4MGExCzAJBgNVBAYTAlVTMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJs
# aWMgUlNBIFRpbWVzdGFtcGluZyBDQSAyMDIwAhMzAAAAWXzacemNXvXAAAAAAABZ
# MA0GCWCGSAFlAwQCAQUAoIIBLTAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQw
# LwYJKoZIhvcNAQkEMSIEIL41kI4z5U+3inQpXUT2gvu5T5bjZreFKR99+ypgUVXD
# MIHdBgsqhkiG9w0BCRACLzGBzTCByjCBxzCBoAQgy0W6sduG6bHFxCfh44/ca3FF
# cO0fDssjH0gdmBit/rwwfDBlpGMwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBS
# U0EgVGltZXN0YW1waW5nIENBIDIwMjACEzMAAABZfNpx6Y1e9cAAAAAAAFkwIgQg
# zQJVCmSxlFPD2YL0zCaO5lVJ0Fs7DGcHYPvxjaXKk+AwDQYJKoZIhvcNAQELBQAE
# ggIAMnSp7j3QnJEcGhDvEXADNoOycu58Y0gDS7Qw75uHSvHGgJvg4MLa+hunV4Su
# N+mauc1TOSJ/DpzVEtXR23SDMwVX+5r/MjpqyrrlayY47dbpeb01EOkZC3lgDBcG
# Ur2ClfOnMkipvXnTHeKFQADRSOQOKr68/oRI2RqqfbchertN6AB4/NylSblmDTlr
# pv84b3XwpkjzfLd8V5VLZ34l3B2LEgOlhO6+DqhABAl8H/fYV8Uz2siJTaYvTSP8
# 7rd1A2Z13Mtkv5+cfg9J2+KhDaIAw46RJj5wY01a66sV7Kq58CKBuk2QSPOScOP/
# EDTCjEuuJm5/dz0RhikKLsGlRjZAYHVIacm49PFUYi2PiGBcU5N4/wy2++mNJHco
# 8DTffrYpzDyN0CxCxE0Bs7L3U13G7R6Uqas56ay+Xz8p7bFrNEtLLPpmavxtQXMt
# vTzMYbjk2XFqeOc8BAtSkCgHWWiBLISdg676J/0x8DQC5tmzKPJN85M59bFOWA6h
# zEkKQoE2CWYJTLKA90Pf68gkaLtA3t8X/0qlLsMtMXWia7p4Feq77EOjOj2LI5rZ
# 8/MZdBYyh1K4OXLp7dNYzX66AQNJOG/7T8dAOcoehT/QRS63p8KIh4TdfCsvoH+r
# YNGuLMy60S3qEcmxjEto4MOXsuF/cBn85B5r9siaiH0K0dM=
# SIG # End signature block
