Public/Write-RichTable.ps1

function Write-RichTable {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [object] $InputObject,

        [string[]] $Property,

        [string] $Title,

        [string] $HeaderStyle = 'bold',

        [string] $BorderStyle = 'cyan',

        [ValidateSet('HeavyHead', 'Square', 'Rounded', 'Ascii')]
        [string] $Box = 'HeavyHead',

        [switch] $NoColor,

        [switch] $PassThru
    )

    begin {
        $rows = [System.Collections.Generic.List[object]]::new()
        $richTable = $null
    }

    process {
        if ($InputObject.PSTypeNames[0] -eq 'PwshRichLite.Table') {
            $richTable = $InputObject
        }
        else {
            $rows.Add($InputObject)
        }
    }

    end {
        function GetTableBox {
            param(
                [ValidateSet('HeavyHead', 'Square', 'Rounded', 'Ascii')]
                [string] $Name
            )

            switch ($Name) {
                'Ascii' {
                    return @{
                        TopLeft = '+'; Top = '-'; TopDivider = '+'; TopRight = '+'
                        HeaderLeft = '|'; HeaderVertical = '|'; HeaderRight = '|'
                        HeaderRowLeft = '+'; HeaderRow = '-'; HeaderRowDivider = '+'; HeaderRowRight = '+'
                        RowLeft = '|'; RowVertical = '|'; RowRight = '|'
                        BottomLeft = '+'; Bottom = '-'; BottomDivider = '+'; BottomRight = '+'
                    }
                }
                'Square' {
                    return @{
                        TopLeft = '┌'; Top = '─'; TopDivider = '┬'; TopRight = '┐'
                        HeaderLeft = '│'; HeaderVertical = '│'; HeaderRight = '│'
                        HeaderRowLeft = '├'; HeaderRow = '─'; HeaderRowDivider = '┼'; HeaderRowRight = '┤'
                        RowLeft = '│'; RowVertical = '│'; RowRight = '│'
                        BottomLeft = '└'; Bottom = '─'; BottomDivider = '┴'; BottomRight = '┘'
                    }
                }
                'Rounded' {
                    return @{
                        TopLeft = '╭'; Top = '─'; TopDivider = '┬'; TopRight = '╮'
                        HeaderLeft = '│'; HeaderVertical = '│'; HeaderRight = '│'
                        HeaderRowLeft = '├'; HeaderRow = '─'; HeaderRowDivider = '┼'; HeaderRowRight = '┤'
                        RowLeft = '│'; RowVertical = '│'; RowRight = '│'
                        BottomLeft = '╰'; Bottom = '─'; BottomDivider = '┴'; BottomRight = '╯'
                    }
                }
                default {
                    return @{
                        TopLeft = '┏'; Top = '━'; TopDivider = '┳'; TopRight = '┓'
                        HeaderLeft = '┃'; HeaderVertical = '┃'; HeaderRight = '┃'
                        HeaderRowLeft = '┡'; HeaderRow = '━'; HeaderRowDivider = '╇'; HeaderRowRight = '┩'
                        RowLeft = '│'; RowVertical = '│'; RowRight = '│'
                        BottomLeft = '└'; Bottom = '─'; BottomDivider = '┴'; BottomRight = '┘'
                    }
                }
            }
        }

        function NewRule {
            param(
                [hashtable] $BoxCharacters,
                [string[]] $ColumnNames,
                [hashtable] $Widths,
                [string] $Left,
                [string] $Fill,
                [string] $Divider,
                [string] $Right
            )

            return $Left + (($ColumnNames | ForEach-Object { $Fill * $Widths[$_] }) -join $Divider) + $Right
        }

        function FormatCellLine {
            param(
                [AllowNull()]
                [string] $Text,

                [int] $Width
            )

            $value = if ($null -eq $Text) { '' } else { $Text }
            $padding = [Math]::Max(0, $Width - (Get-DisplayWidth $value))
            return $value + (' ' * $padding)
        }

        if ($richTable) {
            $Title = $richTable.Title
            $HeaderStyle = $richTable.HeaderStyle
            if ($richTable.PSObject.Properties['BorderStyle']) {
                $BorderStyle = $richTable.BorderStyle
            }
            if ($richTable.PSObject.Properties['Box']) {
                $Box = $richTable.Box
            }
            $Property = @($richTable.Columns)
            foreach ($row in $richTable.Rows) {
                $objectProperties = [ordered] @{}
                for ($i = 0; $i -lt $Property.Count; $i++) {
                    $objectProperties[$Property[$i]] = if ($i -lt $row.Count) { $row[$i] } else { '' }
                }
                $rows.Add([pscustomobject] $objectProperties)
            }
        }

        if ($rows.Count -eq 0) {
            return
        }

        if (-not $Property -or $Property.Count -eq 0) {
            $Property = @($rows[0].PSObject.Properties.Name)
        }

        $widths = @{}
        foreach ($name in $Property) {
            $widths[$name] = (Get-DisplayWidth (ConvertFrom-RichMarkup -Text $name -NoColor:$NoColor)) + 2
        }

        $renderedRows = [System.Collections.Generic.List[hashtable]]::new()
        foreach ($row in $rows) {
            $renderedRow = @{}
            foreach ($name in $Property) {
                $value = if ($row.PSObject.Properties[$name]) { [string] $row.PSObject.Properties[$name].Value } else { '' }
                $rendered = ConvertFrom-RichMarkup -Text $value -NoColor:$NoColor
                $lines = @($rendered -split "`r?`n")
                $renderedRow[$name] = $lines
                foreach ($line in $lines) {
                    $widths[$name] = [Math]::Max($widths[$name], (Get-DisplayWidth $line) + 2)
                }
            }
            $renderedRows.Add($renderedRow)
        }

        $boxChars = GetTableBox -Name $Box
        $top = NewRule -BoxCharacters $boxChars -ColumnNames $Property -Widths $widths -Left $boxChars.TopLeft -Fill $boxChars.Top -Divider $boxChars.TopDivider -Right $boxChars.TopRight
        $headerSeparator = NewRule -BoxCharacters $boxChars -ColumnNames $Property -Widths $widths -Left $boxChars.HeaderRowLeft -Fill $boxChars.HeaderRow -Divider $boxChars.HeaderRowDivider -Right $boxChars.HeaderRowRight
        $bottom = NewRule -BoxCharacters $boxChars -ColumnNames $Property -Widths $widths -Left $boxChars.BottomLeft -Fill $boxChars.Bottom -Divider $boxChars.BottomDivider -Right $boxChars.BottomRight

        $headerCells = foreach ($name in $Property) {
            $renderedHeader = ConvertFrom-RichMarkup -Text $name -NoColor:$NoColor
            ' ' + (FormatCellLine -Text $renderedHeader -Width ($widths[$name] - 2)) + ' '
        }
        $header = $boxChars.HeaderLeft + ($headerCells -join $boxChars.HeaderVertical) + $boxChars.HeaderRight

        $lines = [System.Collections.Generic.List[string]]::new()
        if ($Title) {
            $tableWidth = Get-DisplayWidth $top
            $renderedTitle = ConvertFrom-RichMarkup -Text $Title -NoColor:$NoColor
            $leftPadding = [Math]::Max(0, [Math]::Floor(($tableWidth - (Get-DisplayWidth $renderedTitle)) / 2))
            $lines.Add((' ' * $leftPadding) + $renderedTitle)
        }
        $lines.Add((ConvertFrom-RichMarkup -Text "[$BorderStyle]$top[/]" -NoColor:$NoColor))
        $lines.Add((ConvertFrom-RichMarkup -Text "[$HeaderStyle]$header[/]" -NoColor:$NoColor))
        $lines.Add((ConvertFrom-RichMarkup -Text "[$BorderStyle]$headerSeparator[/]" -NoColor:$NoColor))

        foreach ($row in $renderedRows) {
            $rowHeight = 1
            foreach ($name in $Property) {
                $rowHeight = [Math]::Max($rowHeight, @($row[$name]).Count)
            }

            for ($lineIndex = 0; $lineIndex -lt $rowHeight; $lineIndex++) {
                $cells = foreach ($name in $Property) {
                    $cellLines = @($row[$name])
                    $value = if ($lineIndex -lt $cellLines.Count) { $cellLines[$lineIndex] } else { '' }
                    ' ' + (FormatCellLine -Text $value -Width ($widths[$name] - 2)) + ' '
                }
                $lines.Add($boxChars.RowLeft + ($cells -join $boxChars.RowVertical) + $boxChars.RowRight)
            }
        }

        $lines.Add((ConvertFrom-RichMarkup -Text "[$BorderStyle]$bottom[/]" -NoColor:$NoColor))
        $output = $lines -join [Environment]::NewLine

        if ($PassThru) {
            return $output
        }

        Write-Host $output
    }
}

# SIG # Begin signature block
# MII9NAYJKoZIhvcNAQcCoII9JTCCPSECAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCC4KdoEoj8lp4Cf
# /LXYTVXc0OQJ/qlrQxsSA7PMPadkS6CCIfYwggXMMIIDtKADAgECAhBUmNLR1FsZ
# 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
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggaoMIIEkKADAgECAhMzAARGgOIG
# WqWHGDVMAAAABEaAMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDMwHhcNMjYwODEzMDg1NDA5WhcNMjYwODE2
# MDg1NDA5WjBpMQswCQYDVQQGEwJQTDEXMBUGA1UECB4OAUEA8wBkAHoAawBpAGUx
# DzANBgNVBAcTBldpZWx1bjEXMBUGA1UEChMOc29mdDRwbSBzcCB6b28xFzAVBgNV
# BAMTDnNvZnQ0cG0gc3Agem9vMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKC
# AYEAr+jzV6zGzafjse7gMKi+hK5RfXozmfI97eDdspFTbKX67/35xFRTigqyWfzT
# w19MxfG3+c09Iw6PxbCbQW8UHptSIy9N8RChXFA8y5h0MRzYHicvjELvd08PuRlE
# sg6rSaSEbbbqOTgXM82CJWgz48leKycucjo2BS/BMWx6Q1iiNBVXAepeQpki3l4s
# 3WYVymsyVqhjufTCq0VBqbRxAh6E/JCG2KV7zbqTetNPdV00lbcg4Lv42Chh/tkH
# ecLvjYO2YE6OPDmeKcvNq6qheHSywyor2mvR72jOoV9ZVcCGn5ROZ3LlXy1ohpxM
# 19ng40WG7b4iEgFvIVf96hure/lNLXkqhkUX+5/hZ1dBLaoiDS1HqI7Ff6q6Sxbm
# KYXZYbApfc9kk7A5vIRUTCZ+jMCUXcJdzfWwiK0hEzZVVPz9Mz3FP0QyVUZ/X3xk
# IlNWekHhebAFJbri38xjrD5DIKHGSzvDnwIqPnw5aXBg5xt1xwad9VgIB+fRa5Ow
# GkW1AgMBAAGjggHWMIIB0jAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA9
# BgNVHSUENjA0BgorBgEEAYI3YQEABggrBgEFBQcDAwYcKwYBBAGCN2GCycz3dYGA
# 0Y0Tg469piSB0sq0aDAdBgNVHQ4EFgQUK5tz/XfT8L6flouIwBQdi+GSKjwwHwYD
# VR0jBBgwFoAUa16lNMMFxWJKIVqOq3NgYtSsY4UwZwYDVR0fBGAwXjBcoFqgWIZW
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw
# SUQlMjBWZXJpZmllZCUyMENTJTIwRU9DJTIwQ0ElMjAwMy5jcmwwdAYIKwYBBQUH
# AQEEaDBmMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp
# b3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUy
# MENBJTIwMDMuY3J0MFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNo
# dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5o
# dG0wDQYJKoZIhvcNAQEMBQADggIBAM0EFwiClKTn7B+t+p8BtVo+eehgBTDkZWTa
# c8dfFLURhldCfFRbIaDzglwj6eyEVv9woyf34K0w4JhmpqVwPOdVoMU1G01T9hNa
# /sMvt3l0TMFB6VpOJO6KhGr8O1dRiowCptV0pL4xN7tpxdtn+AVDfFLrVzoPInD4
# GpHHmqbCok20Lh/7Gi6o1MRFq4xV4XFA7dBL2nEltE7xve2YEK/WKU07i5hPVjY5
# Xc3GwIAXobCUsHAMA92+M3yjlXxhlxWZpDrT7nf/2wiJNde077DNZ+MfyjnBLNdM
# UIwjPTwAEhQXyshplRZou5rTMIE4+hyqUSZ6O+6MHkBHf2cji9zN8vheXlSC3xLE
# UJiOd8HDwEOvU7KyMKYHxqMEpZ697CNGCBrQFJPO3lKFjjkk2EGZF1g+06ppghQv
# +AzK1aIZdXfoh/9xmbH0Rc2kAvZWdvF5JKn22+s9OZO1Ln3HZdjzyll/hpW8vt/v
# Edd+Oape4ZLmF0zw16jOQFTPak5w4LQqifTf2tJXXKTYmyc2yckYGAwsDloFl3ki
# kmEmnZm2GUbob45T7XWAbFK4XlKxHMrx3WgWCACMzRRBqyzCVpJiaLvpzvDh/QCT
# yOhlZGyxcRVcmzjXG0L3JBB/XsiT+rWUNssozqq95/PL8i/E3Nyaq7Ar2gThvJJN
# ix02qqP/MIIGqDCCBJCgAwIBAgITMwAERoDiBlqlhxg1TAAAAARGgDANBgkqhkiG
# 9w0BAQwFADBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgRU9DIENB
# IDAzMB4XDTI2MDgxMzA4NTQwOVoXDTI2MDgxNjA4NTQwOVowaTELMAkGA1UEBhMC
# UEwxFzAVBgNVBAgeDgFBAPMAZAB6AGsAaQBlMQ8wDQYDVQQHEwZXaWVsdW4xFzAV
# BgNVBAoTDnNvZnQ0cG0gc3Agem9vMRcwFQYDVQQDEw5zb2Z0NHBtIHNwIHpvbzCC
# AaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAK/o81esxs2n47Hu4DCovoSu
# UX16M5nyPe3g3bKRU2yl+u/9+cRUU4oKsln808NfTMXxt/nNPSMOj8Wwm0FvFB6b
# UiMvTfEQoVxQPMuYdDEc2B4nL4xC73dPD7kZRLIOq0mkhG226jk4FzPNgiVoM+PJ
# XisnLnI6NgUvwTFsekNYojQVVwHqXkKZIt5eLN1mFcprMlaoY7n0wqtFQam0cQIe
# hPyQhtile826k3rTT3VdNJW3IOC7+NgoYf7ZB3nC742DtmBOjjw5ninLzauqoXh0
# ssMqK9pr0e9ozqFfWVXAhp+UTmdy5V8taIacTNfZ4ONFhu2+IhIBbyFX/eobq3v5
# TS15KoZFF/uf4WdXQS2qIg0tR6iOxX+quksW5imF2WGwKX3PZJOwObyEVEwmfozA
# lF3CXc31sIitIRM2VVT8/TM9xT9EMlVGf198ZCJTVnpB4XmwBSW64t/MY6w+QyCh
# xks7w58CKj58OWlwYOcbdccGnfVYCAfn0WuTsBpFtQIDAQABo4IB1jCCAdIwDAYD
# VR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwPQYDVR0lBDYwNAYKKwYBBAGCN2EB
# AAYIKwYBBQUHAwMGHCsGAQQBgjdhgsnM93WBgNGNE4OOvaYkgdLKtGgwHQYDVR0O
# BBYEFCubc/130/C+n5aLiMAUHYvhkio8MB8GA1UdIwQYMBaAFGtepTTDBcViSiFa
# jqtzYGLUrGOFMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0
# LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUy
# MEVPQyUyMENBJTIwMDMuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZY
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQl
# MjBJRCUyMFZlcmlmaWVkJTIwQ1MlMjBFT0MlMjBDQSUyMDAzLmNydDBUBgNVHSAE
# TTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4IC
# AQDNBBcIgpSk5+wfrfqfAbVaPnnoYAUw5GVk2nPHXxS1EYZXQnxUWyGg84JcI+ns
# hFb/cKMn9+CtMOCYZqalcDznVaDFNRtNU/YTWv7DL7d5dEzBQelaTiTuioRq/DtX
# UYqMAqbVdKS+MTe7acXbZ/gFQ3xS61c6DyJw+BqRx5qmwqJNtC4f+xouqNTERauM
# VeFxQO3QS9pxJbRO8b3tmBCv1ilNO4uYT1Y2OV3NxsCAF6GwlLBwDAPdvjN8o5V8
# YZcVmaQ60+53/9sIiTXXtO+wzWfjH8o5wSzXTFCMIz08ABIUF8rIaZUWaLua0zCB
# OPocqlEmejvujB5AR39nI4vczfL4Xl5Ugt8SxFCYjnfBw8BDr1OysjCmB8ajBKWe
# vewjRgga0BSTzt5ShY45JNhBmRdYPtOqaYIUL/gMytWiGXV36If/cZmx9EXNpAL2
# VnbxeSSp9tvrPTmTtS59x2XY88pZf4aVvL7f7xHXfjmqXuGS5hdM8NeozkBUz2pO
# cOC0Kon039rSV1yk2JsnNsnJGBgMLA5aBZd5IpJhJp2ZthlG6G+OU+11gGxSuF5S
# sRzK8d1oFggAjM0UQasswlaSYmi76c7w4f0Ak8joZWRssXEVXJs41xtC9yQQf17I
# k/q1lDbLKM6qvefzy/IvxNzcmquwK9oE4bySTYsdNqqj/zCCBygwggUQoAMCAQIC
# EzMAAAAVBT5uGY6TKdkAAAAAABUwDQYJKoZIhvcNAQEMBQAwYzELMAkGA1UEBhMC
# VVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWlj
# cm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTAeFw0yNjAz
# MjYxODExMjhaFw0zMTAzMjYxODExMjhaMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBW
# ZXJpZmllZCBDUyBFT0MgQ0EgMDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
# AoICAQDg9Ms9AqovDnMePvMOe+KybhCd8+lokzYORlS3kBVXseecbyGwBcsenlm5
# bLtMGPjiIFLzBQF+ghlVV/U29q5GcdeEEBCHTTGhL2koIrLc4UrliMRcbv9mOMtR
# /l7/xAmv0Fx4BJHn1dHt37fvrBqXmKjKfGf5DpyO/+hnV7TEreMtS19iO+bjZ/9H
# npg3PCk0e7YSbRTFkx97FZwRWpC4s3NepRfRXQh/WMAj7JmsYeVZohi4TF5yW2JM
# rJZqwHcyzJZYtD2Hlno5ZEJkdiZcEaxHOobmwO06Z1J9c23ps9PGIhGaq1sKLEAz
# 9Doc5rLkYWGteDrscKhAp2kIc/oYlH9Ij6BkOqqgWINEkEtC8ZNG1Mak+h3o65aj
# 0iQKmdxW7IZaHO5cuyoMi+KtYfXeIIg3sVIbS2EL8kUtsDGdEqNqAq/isqTi1jXq
# Le6iKp1ni1SPdvPW9G03CTsYF68b/yuIQRwbdoBCXemMNJCS0dorCRY4b2WAAy4n
# g7SANcEgrBgZf535+QfLU5hGzrKjIpbMabauWb5FKWUKkMsPcXFkXRWO4noKPm4K
# WlFypqOpbJ/KONVReIlxHQRegAOBzIhRB7gr9IDQ1sc2MgOgQ+xVGW4oq4HD0mfA
# iwiyLskZrkaQ7JoanYjBNcR9RS26YxAVbcBtLitFTzCIEg5ZdQIDAQABo4IB3DCC
# AdgwDgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRr
# XqU0wwXFYkohWo6rc2Bi1KxjhTBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEF
# BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9z
# aXRvcnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMBIGA1UdEwEB/wQI
# MAYBAf8CAQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1zSmepEhqMOYwcAYDVR0f
# BGkwZzBloGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwv
# TWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENB
# JTIwMjAyMS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsGAQUFBzAChmFodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIw
# VmVyaWZpZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3J0MA0GCSqG
# SIb3DQEBDAUAA4ICAQBdbiI8zwXLX8glJEh/8Q22UMCUhWBO46Z9FPhwOR3mdlqR
# VLkYOon/MczUwrjDhx3X99SPH5PSflkGoTvnO9ZWHM5YFVYpO7NYuB+mfVSGAGZw
# iGOASWk0i2B7vn9nElJJmoiXxugfH5YdBsrUgTt0AFNXkzmqTgk+S1Hxb1u/0HCq
# EHVZPk2A/6eJXYbtpRM5Fcz00jisUl9BRZgSebODV85bBzOveqyC3f0PnHCxRJNh
# Mb8xP/sB/VI7pf2rheSV7zqUSv8vn/fIMblXeaVIlpqoq8SP9BJMjE/CoVXJxnkZ
# QRM1Fa7kN9yztvReOhxSgPgpZx/Xl/jkwyEFVJTBfBp3sTgfIc/pmqv2ehtakL2A
# Ej78EmOPQohxJT3wyX+P78GA25tLpAvzj3RMMHd8z18ZuuVi+60MAzGpOASH1L8N
# lr3fZRZnQO+pyye2DCvYmHaIfdUgYJqn7noxxGVv89+RaETh1tgCDvwNpFCSG7vl
# 5A4ako+2fx409r9TWjXC7Oif1IQ5ZJzB4Rf8GvBiHYjvMmHpledp1FGRLdSRFVpC
# 3/OKpZY6avIqZp7+8pP/WQP903DdgrvAT6W4xPOBxXPa4tGksN3SuqJaiFYHSNye
# Bufn8iseujW4IbBSbHD4BPqbF3qZ+7nG9d/d/G2/Lx4kH9cCmBfmsZdSkHmukDCC
# B54wggWGoAMCAQICEzMAAAAHh6M0o3uljhwAAAAAAAcwDQYJKoZIhvcNAQEMBQAw
# dzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFI
# MEYGA1UEAxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENl
# cnRpZmljYXRlIEF1dGhvcml0eSAyMDIwMB4XDTIxMDQwMTIwMDUyMFoXDTM2MDQw
# MTIwMTUyMFowYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2ln
# bmluZyBQQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALLw
# wK8ZiCji3VR6TElsaQhVCbRS/3pK+MHrJSj3Zxd3KU3rlfL3qrZilYKJNqztA9OQ
# acr1AwoNcHbKBLbsQAhBnIB34zxf52bDpIO3NJlfIaTE/xrweLoQ71lzCHkD7A4A
# s1Bs076Iu+mA6cQzsYYH/Cbl1icwQ6C65rU4V9NQhNUwgrx9rGQ//h890Q8JdjLL
# w0nV+ayQ2Fbkd242o9kH82RZsH3HEyqjAB5a8+Ae2nPIPc8sZU6ZE7iRrRZywRmr
# KDp5+TcmJX9MRff241UaOBs4NmHOyke8oU1TYrkxh+YeHgfWo5tTgkoSMoayqoDp
# HOLJs+qG8Tvh8SnifW2Jj3+ii11TS8/FGngEaNAWrbyfNrC69oKpRQXY9bGH6jn9
# NEJv9weFxhTwyvx9OJLXmRGbAUXN1U9nf4lXezky6Uh/cgjkVd6CGUAf0K+Jw+GE
# /5VpIVbcNr9rNE50Sbmy/4RTCEGvOq3GhjITbCa4crCzTTHgYYjHs1NbOc6brH+e
# KpWLtr+bGecy9CrwQyx7S/BfYJ+ozst7+yZtG2wR461uckFu0t+gCwLdN0A6cFtS
# RtR8bvxVFyWwTtgMMFRuBa3vmUOTnfKLsLefRaQcVTgRnzeLzdpt32cdYKp+dhr2
# ogc+qM6K4CBI5/j4VFyC4QFeUP2YAidLtvpXRRo3AgMBAAGjggI1MIICMTAOBgNV
# HQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNlBKbAPD2Ns
# 72nX9c0pnqRIajDmMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNo
# dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5o
# dG0wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAf
# BgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHeg
# dYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0
# JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUl
# MjBBdXRob3JpdHklMjAyMDIwLmNybDCBwwYIKwYBBQUHAQEEgbYwgbMwgYEGCCsG
# AQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01p
# Y3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRp
# ZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6
# Ly9vbmVvY3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEA
# fyUqnv7Uq+rdZgrbVyNMul5skONbhls5fccPlmIbzi+OwVdPQ4H55v7VOInnmezQ
# EeW4LqK0wja+fBznANbXLB0KrdMCbHQpbLvG6UA/Xv2pfpVIE1CRFfNF4XKO8XYE
# a3oW8oVH+KZHgIQRIwAbyFKQ9iyj4aOWeAzwk+f9E5StNp5T8FG7/VEURIVWArbA
# zPt9ThVN3w1fAZkF7+YU9kbq1bCR2YD+MtunSQ1Rft6XG7b4e0ejRA7mB2IoX5hN
# h3UEauY0byxNRG+fT2MCEhQl9g2i2fs6VOG19CNep7SquKaBjhWmirYyANb0RJSL
# WjinMLXNOAga10n8i9jqeprzSMU5ODmrMCJE12xS/NWShg/tuLjAsKP6SzYZ+1Ry
# 358ZTFcx0FS/mx2vSoU8s8HRvy+rnXqyUJ9HBqS0DErVLjQwK8VtsBdekBmdTbQV
# oCgPCqr+PDPB3xajYnzevs7eidBsM71PINK2BoE2UfMwxCCX3mccFgx6UsQeRSdV
# VVNSyALQe6PT12418xon2iDGE81OGCreLzDcMAZnrUAx4XQLUz6ZTl65yPUiOh3k
# 7Yww94lDf+8oG2oZmDh5O1Qe38E+M3vhKwmzIeoB1dVLlz4i3IpaDcR+iuGjH2Td
# aC1ZOmBXiCRKJLj4DT2uhJ04ji+tHD6n58vhavFIrmcxghqUMIIakAIBATBxMFox
# CzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzAp
# BgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBFT0MgQ0EgMDMCEzMABEaA
# 4gZapYcYNUwAAAAERoAwDQYJYIZIAWUDBAIBBQCgXjAQBgorBgEEAYI3AgEMMQIw
# ADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQg13wK
# v4x7BWi8rJgrvKVewwlVPJfrLc2xD9qi/IUKyDgwDQYJKoZIhvcNAQEBBQAEggGA
# BEUsUkZfETsGJoKUFsx1BdXzvXBBfTRpX/MaEq0xq/H1Y55ZUvdWi9O9oL4VlxHQ
# zLXp9VDyWxPz3WEGsRpl01dg/85IbRP3T72GvKqfKNGcHdDr9jFazwlgbJxNBFU0
# BZ9rCaab4EV02jlqF+LfQF3nCBK75G5+fdrzaKe/2f6k0nsUIPhtolnI5lW5Yr6n
# NfWilukif6Cgw1HNxVb1PGrirZChmRZRtpyyWugHE1P+BHFY4iJlcdA8PCG0+VNx
# BAQvjkW1dngC/4Xf3DHbly6V2xpDyTwA0k7Au2IGmqDL9KaDlb4qXtfsM/Hz5Ipu
# k/Q9+SXAK9RPQ1eipelzXtBi+8gvBHQFdOCaa+rVhjH98BZIroUJL+GcDY3uHFJv
# eFnP/LNza8158WG+L/s2DEWPQ8GVqysPyFPF86uKCCySEnSRs58ukwHKWF5YZAXE
# mo2X2q3Z9+VCNyIwWbgme348Hm1ZgF+dnwmU2QqS8aBpVkoTxkoI6qYr00InaTmk
# oYIYFDCCGBAGCisGAQQBgjcDAwExghgAMIIX/AYJKoZIhvcNAQcCoIIX7TCCF+kC
# AQMxDzANBglghkgBZQMEAgEFADCCAWIGCyqGSIb3DQEJEAEEoIIBUQSCAU0wggFJ
# AgEBBgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIOd3RQ5qLvrtbUQSw1Hz
# Op6j/BZI3nexXFdQSGaCaU24AgZqaJ6C+I8YEzIwMjYwODE0MTAzMzA2LjgyOVow
# BIACAfSggeGkgd4wgdsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNV
# BAsTHm5TaGllbGQgVFNTIEVTTjpBNTAwLTA1RTAtRDk0NzE1MDMGA1UEAxMsTWlj
# cm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHmggg8hMIIH
# gjCCBWqgAwIBAgITMwAAAAXlzw//Zi7JhwAAAAAABTANBgkqhkiG9w0BAQwFADB3
# MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMUgw
# RgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFJvb3QgQ2Vy
# dGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAwHhcNMjAxMTE5MjAzMjMxWhcNMzUxMTE5
# MjA0MjMxWjBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBp
# bmcgQ0EgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJ5851Jj
# /eDFnwV9Y7UGIqMcHtfnlzPREwW9ZUZHd5HBXXBvf7KrQ5cMSqFSHGqg2/qJhYqO
# QxwuEQXG8kB41wsDJP5d0zmLYKAY8Zxv3lYkuLDsfMuIEqvGYOPURAH+Ybl4SJEE
# Snt0MbPEoKdNihwM5xGv0rGofJ1qOYSTNcc55EbBT7uq3wx3mXhtVmtcCEr5ZKTk
# KKE1CxZvNPWdGWJUPC6e4uRfWHIhZcgCsJ+sozf5EeH5KrlFnxpjKKTavwfFP6Xa
# GZGWUG8TZaiTogRoAlqcevbiqioUz1Yt4FRK53P6ovnUfANjIgM9JDdJ4e0qiDRm
# 5sOTiEQtBLGd9Vhd1MadxoGcHrRCsS5rO9yhv2fjJHrmlQ0EIXmp4DhDBieKUGR+
# eZ4CNE3ctW4uvSDQVeSp9h1SaPV8UWEfyTxgGjOsRpeexIveR1MPTVf7gt8hY64X
# NPO6iyUGsEgt8c2PxF87E+CO7A28TpjNq5eLiiunhKbq0XbjkNoU5JhtYUrlmAbp
# xRjb9tSreDdtACpm3rkpxp7AQndnI0Shu/fk1/rE3oWsDqMX3jjv40e8KN5YsJBn
# czyWB4JyeeFMW3JBfdeAKhzohFe8U5w9WuvcP1E8cIxLoKSDzCCBOu0hWdjzKNu8
# Y5SwB1lt5dQhABYyzR3dxEO/T1K/BVF3rV69AgMBAAGjggIbMIICFzAOBgNVHQ8B
# Af8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGtpKDo1L0hjQM97
# 2K9J6T7ZPdshMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w
# EwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEw
# DwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2io
# ojCBhAYDVR0fBH0wezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
# aW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBS
# b290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNybDCBlAYIKwYB
# BQUHAQEEgYcwgYQwgYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0
# aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQw
# DQYJKoZIhvcNAQEMBQADggIBAF+Idsd+bbVaFXXnTHho+k7h2ESZJRWluLE0Oa/p
# O+4ge/XEizXvhs0Y7+KVYyb4nHlugBesnFqBGEdC2IWmtKMyS1OWIviwpnK3aL5J
# edwzbeBF7POyg6IGG/XhhJ3UqWeWTO+Czb1c2NP5zyEh89F72u9UIw+IfvM9lzDm
# c2O2END7MPnrcjWdQnrLn1Ntday7JSyrDvBdmgbNnCKNZPmhzoa8PccOiQljjTW6
# GePe5sGFuRHzdFt8y+bN2neF7Zu8hTO1I64XNGqst8S+w+RUdie8fXC1jKu3m9KG
# IqF4aldrYBamyh3g4nJPj/LR2CBaLyD+2BuGZCVmoNR/dSpRCxlot0i79dKOChmo
# ONqbMI8m04uLaEHAv4qwKHQ1vBzbV/nG89LDKbRSSvijmwJwxRxLLpMQ/u4xXxFf
# R4f/gksSkbJp7oqLwliDm/h+w0aJ/U5ccnYhYb7vPKNMN+SZDWycU5ODIRfyoGl5
# 9BsXR/HpRGtiJquOYGmvA/pk5vC1lcnbeMrcWD/26ozePQ/TWfNXKBOmkFpvPE8C
# H+EeGGWzqTCjdAsno2jzTeNSxlx3glDGJgcdz5D/AAxw9Sdgq/+rY7jjgs7X6fqP
# TXPmaCAJKVHAP19oEjJIBwD1LyHbaEgBxFCogYSOiUIr0Xqcr1nJfiWG2GwYe6Zo
# AF1bMIIHlzCCBX+gAwIBAgITMwAAAFZ+j51YCI7pYAAAAAAAVjANBgkqhkiG9w0B
# AQwFADBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcg
# Q0EgMjAyMDAeFw0yNTEwMjMyMDQ2NTFaFw0yNjEwMjIyMDQ2NTFaMIHbMQswCQYD
# VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3Nv
# ZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046
# QTUwMC0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRp
# bWUgU3RhbXBpbmcgQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEAtKWfm/ul027/d8Rlb8Mn/g0QUvvLqY2Vsy3tI8U2tFSspTZomZOD3BHT
# 8LkR+RrhMJgb1VjAKFNysaK9cLSXifPGSIBrPCgs9P4y24lrJEmrV6Q5z4BmqMhI
# PrZhEvZnWpCS4HO7jYSei/nxmC7/1Er+l5Lg3PmSxb8d2IVcARxSw1B4mxB6XI0n
# kel9wa1dYb2wfGpofraFmxZOxT9eNht4LH0RBSVueba6ZNpjS/0gtfm7qiIiyP6p
# 6PRzTTbMnVqsHnV/d/rW0zHx+Q+QNZ5wUqKmTZJB9hU853+2pX5rDfK32uNY9/WB
# OAmzbqgpEdQkbiMavUMyUDShmycIvgHdQnS207sTj8M+kJL3tOdahPuPqMwsaCCg
# dfwwQx0O9TKe7FSvbAEYs1AnldCl/KHGZCOVvUNqjyL10JLe0/+GD9/ynqXGWFpX
# OjaunvZ/cKROhjN4M5e6xx0b2miqcPii4/ii2ZheKallJET7CKlpFShs3wyg6F/f
# ojQxQvPnbWD4Nyx6lhjWjwmoLcx6w1FSCtavLCly33BLRSlTU4qKUxaa8d7YN7Eq
# pn9XO0SY0umOvKFXrWH7rxl+9iaicitdnTTksAnRjvekdKT3lg7lRMfmfZU8vXNi
# N0UYJzT9EjqjRm0uN/h0oXxPhNfPYqeFbyPXGGxzaYUz6zx3qTcCAwEAAaOCAcsw
# ggHHMB0GA1UdDgQWBBS+tjPyu6tZ/h5GsyLvyz1H+FNIWjAfBgNVHSMEGDAWgBRr
# aSg6NS9IY0DPe9ivSek+2T3bITBsBgNVHR8EZTBjMGGgX6BdhltodHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBQdWJsaWMlMjBS
# U0ElMjBUaW1lc3RhbXBpbmclMjBDQSUyMDIwMjAuY3JsMHkGCCsGAQUFBwEBBG0w
# azBpBggrBgEFBQcwAoZdaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j
# ZXJ0cy9NaWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmclMjBD
# QSUyMDIwMjAuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUH
# AwgwDgYDVR0PAQH/BAQDAgeAMGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEw
# PwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9j
# cy9SZXBvc2l0b3J5Lmh0bTAIBgZngQwBBAIwDQYJKoZIhvcNAQEMBQADggIBAA4D
# qAXEsO26j/La7Fgn/Qifit8xuZekqZ57+Ye+sH/hRTbEEjGYrZgsqwR/lUUfKCFp
# bZF8msaZPQJOR4YYUEU8XyjLrn8Y1jCSmoxh9l7tWiSoc/JFBw356JAmzGGxeBA2
# EWSxRuTr1AuZe6nYaN8/wtFkiHcs8gMadxXBs6DxVhyu5YnhLPQkfumKm3lFftwE
# 7pieV7f1lskmlgsC6AeSGCzGPZUgCvcH5Tv/Qe9z7bIImSD3SuzhOIwaP+eKQTYf
# 67TifyJKkWQSdGfTA6Kcu41k8LB6oPK+MLk1jbxxK5wPqLSL62xjK04SBXHEJSEn
# sFt0zxWkxP/lgej1DxqUnmrYEdkxvzKSHIAqFWSZul/5hI+vJxvFPhsNQBEk4cSu
# lDkJQpcdVi/gmf/mHFOYhDBjsa15s4L+2sBil3XV/T8RiR66Q8xYvTLRWxd2dVsr
# OoCwnsU4WIeiC0JinCv1WLHEh7Qyzr9RSr4kKJLWdpNYLhgjkojTmEkAjFO774t3
# xB7enbvIF0GOsV19xnCUzq9EGKyt0gMuaphKlNjJ+aTpjWMZDGo+GOKsnp93Hmft
# ml0Syp3F9+M3y+y6WJGUZoIZJq227jDjjEndtpUrh9BdPdVIfVJD/Au81Rzh05UH
# AivorQ3Os8PELHIgiOd9TWzbdgmGzcILt/ddVQERMYIHRjCCB0ICAQEweDBhMQsw
# CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD
# VQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAIT
# MwAAAFZ+j51YCI7pYAAAAAAAVjANBglghkgBZQMEAgEFAKCCBJ8wEQYLKoZIhvcN
# AQkQAg8xAgUAMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0B
# CQUxDxcNMjYwODE0MTAzMzA2WjAvBgkqhkiG9w0BCQQxIgQg46LApMOFCUARf0mt
# oyGqZE4meiiwIY0ftJFaNcZwdrgwgbkGCyqGSIb3DQEJEAIvMYGpMIGmMIGjMIGg
# BCC2DDMlTaTj8JV3iTg5Xnpe4CSH60143Z+X9o5NBgMMqDB8MGWkYzBhMQswCQYD
# VQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQD
# EylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAA
# AFZ+j51YCI7pYAAAAAAAVjCCA2EGCyqGSIb3DQEJEAISMYIDUDCCA0yhggNIMIID
# RDCCAiwCAQEwggEJoYHhpIHeMIHbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25z
# MScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046QTUwMC0wNUUwLUQ5NDcxNTAzBgNV
# BAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5
# oiMKAQEwBwYFKw4DAhoDFQD/c/cpFSqQWYBeXggyRJ2ZbvYEEaBnMGWkYzBhMQsw
# CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD
# VQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDAN
# BgkqhkiG9w0BAQsFAAIFAO4o3aYwIhgPMjAyNjA4MTQwMDE5NTBaGA8yMDI2MDgx
# NTAwMTk1MFowdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA7ijdpgIBADAKAgEAAgIJ
# hQIB/zAHAgEAAgIRGTAKAgUA7iovJgIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgor
# BgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUA
# A4IBAQAreWV2H91hi7xcwT4Wqc5FdvwkbUi6fsTr40DPxK1ZE3NdFdrMQnEHVZGb
# V7vn9GbT0Pyr/+5bOjQhpYy89+xq3isoGJq58AsZt172oOrKHK9C8KTZDbB2JuIM
# PlAXhpoNkBcix4RjvkMaPB7PbM6vPty4VsDRqusuo825hmuEVcE+l/xvkuLVB9Ku
# 9kEXvtC12dHspo/aNDlvA/ZYvw1xfRmlcKjIW9vFowC2ACqCjGq8HhlfJeMv7/AA
# ywzpD3WxCbd/Pmbz/ATOZTn9E+xeLIaWnmaiNNBrFQWBAOGw9UWGZdn4p68HjGSC
# vOm2iO+SOH8U0v4A/mmRW5t9aKKCMA0GCSqGSIb3DQEBAQUABIICAI+HAHswljK9
# ex5sW8YEfQqsNCFHC43I+5cYsTgUoVm52+NZdOiRuHIRJWeKwpW8QgRhIYs/sq/M
# s2++4OU7EwE8znY3mMwl/YhooL5Tbfe7od+zT/U23QM1BEJ54jl1VgWFOb+HUucu
# 4MhMlwVtKqpMn2vA2vOl/DbNLk58AQzrZEr8wNjBfIsuXYfadwLLzsY+5rh44BXH
# I/hiw1mGouG3HAxrLUOH3u7cRvliZ2NVdw0KhJf35j8HAEMtJVbSaeG234W6ARel
# Ja2DQOlzvc8YWj7fRoORy/5KHWBz5mSpSSDkgOlKITVkYHG138on08zqFmBC9R/o
# 8HFSeBIyw5i26aVyEGG2W/JqvUU+Pw2t5zPYXefxshfMbDnlAvn9hvT1lcPwBVj7
# 30Hwh6ppHGKLbg+u0RyE+YFmRuUYNzt8IbvGS50AZF+rCmbtdlSkuidzfjgk6zz1
# lEIBgzEww3FrIEIhPZZGeh2OnvDR9KXcIRZVAv7mfjf+hM+ifdtnab2vAf+WU4li
# Ae4qkD4soA7onOJvEwrMxCMAGQzKKmHZGInYJnqdwFKiTVALZIuNYjAXAGOijSLd
# EpzZVd09R9F7GFr6FUrCoCdsFSv0KNecp3yXVD/0SKPPfxQ7Oa8jtf7nYCoot3va
# Wys6plIEkcjMQ9/5s7CyNzfAn1ZytrX3
# SIG # End signature block