Private/ApiClient.ps1

#
# Runtime for VMware Infrastructure SDK
# No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
# Version: 1.0
# Contact: powercli@vmware.com
# Generated by OpenAPI Generator: https://openapi-generator.tech
#


# Define Custom Type Exception to wrap WebException with serialized JSON server errors
$InvocationExceptionSource = @"
using System;
public class InvocationException : Exception {
    object _serverError;
    public InvocationException(Exception exception, object serverError) : base(exception.Message, exception) {
        _serverError = serverError;
    }
 
    public object ServerError {
        get {
            return _serverError;
        }
    }
 
    public InvocationException(string message, Exception exception, object serverError) : base(message, exception) {
        _serverError = serverError;
    }
}
"@


Add-Type $InvocationExceptionSource

function Invoke-ApiClient {
    [OutputType('System.Collections.Hashtable')]
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory)]
        [string]$Product,
        [Parameter(Mandatory)]
        [string]$Uri,
        [Parameter(Mandatory)]
        [AllowEmptyCollection()]
        [string[]]$Accepts,
        [Parameter(Mandatory)]
        [AllowEmptyCollection()]
        [string[]]$ContentTypes,
        [Parameter(Mandatory)]
        [hashtable]$HeaderParameters,
        [Parameter(Mandatory)]
        [hashtable]$FormParameters,
        [Parameter(Mandatory)]
        [hashtable]$QueryParameters,
        [Parameter(Mandatory)]
        [hashtable]$CookieParameters,
        [Parameter(Mandatory)]
        [AllowEmptyString()]
        [string]$Body,
        [Parameter(Mandatory)]
        [string]$Method,
        [Parameter(Mandatory)]
        [AllowEmptyString()]
        [string]$ReturnType,
        [Parameter(Mandatory)]
        [bool]$IsBodyNullable,
        [Parameter(Mandatory)]
        [hashtable]
        $InvocationInfo,
        [Parameter()]
        [PSTypeName('ServerConfiguration')]
        $Server
    )

    'Calling method: Invoke-ApiClient' | Write-Debug
    $PSBoundParameters | Out-DebugParameter | Write-Debug

    $ServerConfigurations = Get-ServerConfiguration -Product $Product
    if ($null -ne $Server) {
        $ServerConfigurations = $Server
    }

    if ($null -eq $ServerConfigurations) {
       throw "There are no Server Configurations for product '$Product'. Please add at least one server configuration first using the Add-ServerConfiguration cmdlet."
    }

    foreach ($Configuration in $ServerConfigurations) {
        # vSphere API Patch for mandatory Query Params
        # vSphere API Specs host multiple operations on same Uri
        # adding different mandatory query params to distinguish them
        # Their OpenAPI Specs provide wrong paths for those operations
        # Replacing '?' in path with mandatory query param with '__'
        # Assume '__' in path is that case and fix the Uri here
        if ($Uri.Indexof("__") -ge 0) {
            $Uri = $Uri.Replace("__", "?")
        }

        $BaseUrl = $Configuration.BaseUrl
        if ([string]::IsNullOrEmpty($BaseUrl)) {
            throw "Server configuration has no BaseUrl. Please set your server configuration first using the Set-ServerConfiguration cmdlet."
        }

        $RequestUri = $BaseUrl + $Uri

        # cookie parameters
        foreach ($Parameter in $Configuration.Authorization.Cookies.GetEnumerator()) {
            if ($Parameter.Name -eq "cookieAuth") {
                $HeaderParameters["Cookie"] = $Parameter.Value
            } else {
                $HeaderParameters[$Parameter.Name] = $Parameter.Value
            }
        }

        # accept, content-type headers
        $Accept = SelectHeaders -Headers $Accepts
        if ($Accept) {
            $HeaderParameters['Accept'] = $Accept
        }

        $ContentType = SelectHeaders -Headers $ContentTypes
        if ($ContentType) {
            $HeaderParameters['Content-Type'] = $ContentType
        }

        # add default headers if any
        foreach ($header in $Configuration.DefaultHeaders.GetEnumerator()) {
            $HeaderParameters[$header.Name] = $header.Value
        }

        if ($Configuration.Username -and $Configuration.Password) {
            $Password = Get-PlainTextPassword -Password $Configuration.Password
            $LocalVarBytes = [System.Text.Encoding]::UTF8.GetBytes($Configuration.Username + ":" + $Password)
            $LocalVarBase64Text =[Convert]::ToBase64String($LocalVarBytes)
            $HeaderParameters['Authorization'] = "Basic " + $LocalVarBase64Text
            Write-Verbose ("Using HTTP basic authentication in {0}" -f $MyInvocation.MyCommand)
        }

        # add headers from authorization if any
        foreach ($header in $Configuration.Authorization.Headers.GetEnumerator()) {
            $HeaderParameters[$header.Name] = $header.Value
        }

        $SerializeNulls = $Configuration.SerializeNulls
        $HttpValues = [System.Web.HttpUtility]::ParseQueryString([String]::Empty)

        # add query parameters from authorization if any
        foreach ($queryParam in $Configuration.Authorization.QueryParameters.GetEnumerator()) {
            AddQueryParameter -HttpValues $HttpValues -ParameterKey $queryParam.Name -ParameterValue $queryParam.Value -SerializeNulls $SerializeNulls
        }

        # constrcut URL query string
        foreach ($Parameter in $QueryParameters.GetEnumerator()) {
            if ($Parameter.Value -is [System.Management.Automation.PSCustomObject]) {
                $ParameterProperties = Get-Member -InputObject $Parameter.Value -MemberType NoteProperty

                foreach ($ParameterProperty in $ParameterProperties) {
                    $ParameterKey = $ParameterProperty.Name
                    $ParameterValue = $Parameter.Value.$ParameterKey

                    AddQueryParameter -HttpValues $HttpValues -ParameterKey $ParameterKey -ParameterValue $ParameterValue -SerializeNulls $SerializeNulls
                }
            }
            else {
                AddQueryParameter -HttpValues $HttpValues -ParameterKey $Parameter.Key -ParameterValue $Parameter.Value -SerializeNulls $SerializeNulls
            }
        }
        # Build the request and load it with the query string.
        $UriBuilder = [System.UriBuilder]($RequestUri)

        <#
            [System.Web.HttpUtility]::ParseQueryString always encodes special characters to unicode,
            so the string 'local-1 (1)' is encoded to 'local-1+(1)'. The [System.UriBuilder].Query internally
            encodes the provided query string, so before being passed as the value of the Query property,
            the string should be decoded so that 'local-1+(1)' has its original value: 'local-1 (1)' which is than internally
            encoded to 'local-1%20(1)'.
        #>

        $QueryParamsString = $HttpValues.ToString()
        if (![string]::IsNullOrEmpty($QueryParamsString)) {
            $UriBuilder.Query = [System.Web.HttpUtility]::UrlDecode($QueryParamsString)
        }

        # include form parameters in the request body
        $RequestBody = $null
        if ($FormParameters -and $FormParameters.Count -gt 0) {
            $RequestBody = $FormParameters
        }

        if ($Body -or $IsBodyNullable) {
            if ($null -eq $Body) {
                $RequestBody = $Body
            }
            else {
                $BodyWithoutNullValues = GetBodyWithoutNullValues -Body (ConvertFrom-JsonX -InputObject $Body) -SerializeNulls $SerializeNulls
                $RequestBody = ($BodyWithoutNullValues | ConvertTo-Json -Depth 100).ToString()
            }

            if ([string]::IsNullOrEmpty($RequestBody) -and $IsBodyNullable -eq $true) {
                $RequestBody = "null"
            }
        }


        $Credential = $null
        if ($Configuration.Username -and $Configuration.Password) {
            $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Configuration.Username, $Configuration.Password
        }

        $invokeParams = @{
            'Uri' = $UriBuilder.Uri
            'Method' = $Method
            'Headers' = $HeaderParameters
            'Body' = $RequestBody
            'ErrorAction' = 'Stop'
            'UseBasicParsing' = $true
            'Credential' = $Credential
        }

        if ($null -ne $Configuration.Proxy) {
            $invokeParams['Proxy'] = $Configuration.ProxyUri
            $invokeParams['ProxyUseDefaultCredentials'] = $true
        }

        if ($null -ne $Configuration.WebOperationTimeoutSeconds -and $Configuration.WebOperationTimeoutSeconds -gt 0) {
            $invokeParams['TimeoutSec'] = $Configuration.WebOperationTimeoutSeconds
        }

        if ($PSBoundParameters.ContainsKey('Debug')) {
            $invokeParams['Debug'] = $Debug
        }

        if ($PSBoundParameters.ContainsKey('Verbose')) {
            $invokeParams['Verbose'] = $Verbose
        }

        if ($PSBoundParameters.ContainsKey('WarningAction')) {
            $invokeParams['WarningAction'] = $PSBoundParameters.WarningAction
        }

        $SkipCertificateCheck = $Configuration.SkipCertificateCheck

        try {
            $InvokeWebRequestXParams = @{
                'InvokeParams' = $invokeParams
                'SkipCertificateCheck' = ([bool] $SkipCertificateCheck)
            }

            $Response = $null
            $Response = Invoke-WebRequestX @InvokeWebRequestXParams
        } catch {
            if ($null -ne $_.Exception.Response) {
                $ExceptionResponse = $_.Exception.Response
                $ServerError = $_.ToString()

                # Serialize JSON body
                if ($Global:PSVersionTable.PSEdition -eq 'Core' -and $_.Exception -is [System.Net.Http.HttpRequestException]) {
                    if (
                        $ExceptionResponse -ne $null -and
                        $ExceptionResponse.Content -ne $null -and
                        $ExceptionResponse.Content.Headers -ne $null -and
                        $ExceptionResponse.Content.Headers.Key -eq 'Content-Type' -and
                        ($ExceptionResponse.Content.Headers.Value | ForEach-Object -Process { IsJsonMIME $_ })
                    ) {
                        $ServerError = ConvertFrom-JsonX -InputObject $ServerError
                    }
                } elseif ($Global:PSVersionTable.PSEdition -eq 'Desktop' -and $_.Exception -is [System.Net.WebException]) {
                    if (
                        $ExceptionResponse -ne $null -and
                        $ExceptionResponse.Headers -ne $null -and
                        $ExceptionResponse.Headers.Keys -Contains 'Content-Type' -and
                        (IsJsonMIME -MIME $ExceptionResponse.Headers['Content-Type'])
                    ) {
                        try {
                            $StreamReader = [System.IO.StreamReader]::new($ExceptionResponse.GetResponseStream())

                            $SerializedServerError = $StreamReader.ReadToEnd() | ConvertFrom-JsonX

                            if ($null -eq $SerializedServerError){
                                try {
                                    $SerializedServerError = ConvertFrom-JsonX -InputObject $_.ToString() -ErrorAction Stop
                                }
                                catch {
                                }
                            }
                            if ($null -ne $SerializedServerError) {
                                $ServerError = $SerializedServerError
                            }
                        } finally {
                            $StreamReader.Close()
                        }
                    }
                }

                $InvocationException = New-Object InvocationException -ArgumentList $_.Exception, $ServerError
                if ($ErrorActionPreference -eq 'Stop') {
                    throw $InvocationException
                } else {
                    Write-Error $InvocationException
                }
            } else {
                Write-Error $_
            }

            $Response = $null
        } finally {
            Submit-FeatureUsage -InvocationInfo $InvocationInfo
        }

        if ($null -ne $Response) {
            $ResponseContentTypes = $Response.Headers["Content-Type"]
            if ($null -eq $ResponseContentTypes) {
                $ResponseContentTypes = @()
            }

            $responseObject = DeserializeResponse -Response $Response -ReturnType $ReturnType -ContentTypes $ResponseContentTypes
            # Add GetServer Script Method to the result objects
            $responseObject | Foreach-Object {
                if ($null -ne $_ -and $null -ne $_.PSObject) {
                    # Store Server Name in the PSObject TypeNames to preserve result object type and public properties
                    # Add GetServer method to retrieve the server from PSObject type names
                    # This each object carries the information obout the server from which it is retrieved preserving the
                    # type and data for serialization when it is passed to the Invoke functions
                    # E.g. Weh an API returns string, string type will be preserved and its ps custom object
                    # will carry the server information in the custom type names and user is able to retrieve it through
                    # GetServer method.
                    $_.PSObject.TypeNames.Add("Server:$($Configuration.Product):$($Configuration.ToString())")
                    $_ = $_ | Add-Member -MemberType ScriptMethod -Name GetServer -Value {
                        # The Server Type Name is in Format <Server>:<Product>:<ServerConfiguration.ToString()>
                        $productServerString = ($this.PSObject.TypeNames | Where-Object { $_.StartsWith('Server:')}).SubString(7)
                        $productSeparatorIndex = $productServerString.IndexOf(':')
                        $product = $productServerString.Substring(0, $productSeparatorIndex)
                        $server = $productServerString.Substring($productSeparatorIndex + 1, $productServerString.Length - $productSeparatorIndex - 1)
                        # result
                        Get-ServerConfiguration -Product $product | Where-Object { $_.ToString() -eq $server }
                    } -Force -PassThru

                    # Store information that the object comes from the server in the PSObject TypeNames.
                    $_.PSObject.TypeNames.Add("ServerObject")
                }
            }
            # result
            @{
                Response = $responseObject
                StatusCode = $Response.StatusCode
                Headers = $Response.Headers
            }
        }

    }
}

# Select JSON MIME if present, otherwise choose the first one if available
function SelectHeaders {
    Param(
        [Parameter(Mandatory)]
        [AllowEmptyCollection()]
        [String[]]$Headers
    )

    foreach ($Header in $Headers) {
        if (IsJsonMIME -MIME $Header) {
            return $Header
        }
    }

    if (!($Headers) -or $Headers.Count -eq 0) {
        return $null
    } else {
        return $Headers[0] # return the first one
    }
}

function IsJsonMIME {
    Param(
        [Parameter(Mandatory)]
        [string]$MIME
    )

    if ($MIME -match "(?i)^(application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(;.*)?$") {
        return $true
    } else {
        return $false
    }
}

function AddQueryParameter {
    Param (
        [Parameter(Mandatory = $true)]
        [PSObject]
        $HttpValues,

        [Parameter(Mandatory = $true)]
        [string]
        $ParameterKey,

        [Parameter(Mandatory = $true)]
        [AllowNull()]
        [PSObject]
        $ParameterValue,

        [Parameter(Mandatory = $true)]
        [bool]
        $SerializeNulls
    )

    if ($ParameterValue.Count -gt 1) {
        foreach ($Value in $ParameterValue) {
            if ($null -ne $Value -or $SerializeNulls) {
                $HttpValues.Add($ParameterKey, $Value)
            }
        }
    } else {
        if ($null -ne $ParameterValue -or $SerializeNulls) {
            $HttpValues.Add($ParameterKey, $ParameterValue)
        }
    }
}

function GetBodyWithoutNullValues {
    Param (
        [Parameter(Mandatory = $true)]
        [AllowNull()]
        [PSObject]
        $Body,

        [Parameter(Mandatory = $true)]
        [bool]
        $SerializeNulls
    )

    $FilteredBody = $null

    if ($Body -is [System.Management.Automation.PSCustomObject]) {
        $FilteredBody = [PSCustomObject] @{}
        $BodyProperties = Get-Member -InputObject $Body -MemberType NoteProperty

        foreach ($BodyProperty in $BodyProperties) {
            $PropertyKey = $BodyProperty.Name
            $PropertyValue = $Body.$PropertyKey

            if ($null -ne $PropertyValue -or $SerializeNulls) {
                $FilteredBody | Add-Member -MemberType NoteProperty -Name $PropertyKey -Value $null

                if ($PropertyValue -is [System.Management.Automation.PSCustomObject]) {
                    $FilteredBody.$PropertyKey = GetBodyWithoutNullValues -Body $PropertyValue -SerializeNulls $SerializeNulls
                }
                else {
                    $FilteredBody.$PropertyKey = $PropertyValue
                }
            }
        }
    }
    else {
        $FilteredBody = $Body
    }

    $FilteredBody
}

function DeserializeResponse {
    Param(
        [Parameter(Mandatory)]
        [AllowEmptyString()]
        [string]$ReturnType,
        [Parameter(Mandatory)]
        [AllowEmptyString()]
        [string]$Response,
        [Parameter(Mandatory)]
        [AllowEmptyCollection()]
        [string[]]$ContentTypes
    )

    $result = $null
    If ([string]::IsNullOrEmpty($ReturnType) -and $ContentTypes.Count -eq 0) { # void response
        $result = $Response
    } Elseif ($ReturnType -match '\[\]$') { # array
        $result = ConvertFrom-JsonX $Response
    } Elseif (@("System.DateTime") -contains $ReturnType) { # datetime
        $result = $Response
    } Else { # others (e.g. model, file)
        if ($ContentTypes) {
            $ContentType = $null
            if ($ContentTypes.Count -gt 1) {
                $ContentType = SelectHeaders -Headers $ContentTypes
            } else {
                $ContentType = $ContentTypes[0]
            }

            if (IsJsonMIME -MIME $ContentType) { # JSON
                $result = ConvertFrom-JsonX $Response
            }
        } else { # no content type in response header, returning raw response
            $result = $Response
        }
    }

    if ($result -eq [String]::Empty) {
       $result = $null
    }

    return $result
}

function Submit-FeatureUsage {
    Param (
        [Parameter(Mandatory = $true)]
        [hashtable]
        $InvocationInfo
    )

    $participateInCEIP = [VMware.VimAutomation.ViCore.Util10.SettingsManager]::ActualParticipateInCEIP
    if ($participateInCEIP) {
        $cmdletFeatureId = "$($InvocationInfo.ModuleName)\\$($InvocationInfo.CmdletName)"
        $cmdletFeatureName = $InvocationInfo.CmdletName

        $cmdletFeature = [VMware.VimAutomation.Ceip.CmdletFeature]::new($cmdletFeatureId, $cmdletFeatureName)
        $componentFeature = [VMware.VimAutomation.Ceip.ComponentFeature]::new($InvocationInfo.ModuleName, $InvocationInfo.ModuleName)

        [VMware.VimAutomation.Ceip.CeipManager]::ReportFeatureUse($cmdletFeature)
        [VMware.VimAutomation.Ceip.CeipManager]::ReportFeatureUse($componentFeature)
    }
}

# SIG # Begin signature block
# MIIohwYJKoZIhvcNAQcCoIIoeDCCKHQCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCA92tDRFLSesXom
# LcNPgcLZmayAjvZYchoh8AI6JhiMSaCCDdowggawMIIEmKADAgECAhAIrUCyYNKc
# TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z
# NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
# ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0
# JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr
# Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF
# LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F
# LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh
# 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ
# wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay
# g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI
# YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp
# QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro
# OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB
# WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+
# YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P
# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC
# hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v
# dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED
# MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql
# +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF
# UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h
# mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw
# YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld
# AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw
# 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP
# LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE
# QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn
# KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji
# WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq
# yK+p/pQd52MbOoZWeE4wggciMIIFCqADAgECAhAOxvKydqFGoH0ObZNXteEIMA0G
# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjEwODEwMDAwMDAwWhcNMjMwODEw
# MjM1OTU5WjCBhzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQ
# BgNVBAcTCVBhbG8gQWx0bzEVMBMGA1UEChMMVk13YXJlLCBJbmMuMRUwEwYDVQQD
# EwxWTXdhcmUsIEluYy4xITAfBgkqhkiG9w0BCQEWEm5vcmVwbHlAdm13YXJlLmNv
# bTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMD6lJG8OWkM12huIQpO
# /q9JnhhhW5UyW9if3/UnoFY3oqmp0JYX/ZrXogUHYXmbt2gk01zz2P5Z89mM4gqR
# bGYC2tx+Lez4GxVkyslVPI3PXYcYSaRp39JsF3yYifnp9R+ON8O3Gf5/4EaFmbeT
# ElDCFBfExPMqtSvPZDqekodzX+4SK1PIZxCyR3gml8R3/wzhb6Li0mG7l0evQUD0
# FQAbKJMlBk863apeX4ALFZtrnCpnMlOjRb85LsjV5Ku4OhxQi1jlf8wR+za9C3DU
# ki60/yiWPu+XXwEUqGInIihECBbp7hfFWrnCCaOgahsVpgz8kKg/XN4OFq7rbh4q
# 5IkTauqFhHaE7HKM5bbIBkZ+YJs2SYvu7aHjw4Z8aRjaIbXhI1G+NtaNY7kSRrE4
# fAyC2X2zV5i4a0AuAMM40C1Wm3gTaNtRTHnka/pbynUlFjP+KqAZhOniJg4AUfjX
# sG+PG1LH2+w/sfDl1A8liXSZU1qJtUs3wBQFoSGEaGBeDQIDAQABo4ICJTCCAiEw
# HwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYEFIhC+HL9
# QlvsWsztP/I5wYwdfCFNMB0GA1UdEQQWMBSBEm5vcmVwbHlAdm13YXJlLmNvbTAO
# BgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCB
# qjBToFGgT4ZNaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3Rl
# ZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0
# dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWdu
# aW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3JsMD4GA1UdIAQ3MDUwMwYGZ4EMAQQB
# MCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBlAYI
# KwYBBQUHAQEEgYcwgYQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0
# LmNvbTBcBggrBgEFBQcwAoZQaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0Rp
# Z2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5j
# cnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEACQAYaQI6Nt2KgxdN
# 6qqfcHB33EZRSXkvs8O9iPZkdDjEx+2fgbBPLUvk9A7T8mRw7brbcJv4PLTYJDFo
# c5mlcmG7/5zwTOuIs2nBGXc/uxCnyW8p7kD4Y0JxPKEVQoIQ8lJS9Uy/hBjyakeV
# ef982JyzvDbOlLBy6AS3ZpXVkRY5y3Va+3v0R/0xJ+JRxUicQhiZRidq2TCiWEas
# d+tLL6jrKaBO+rmP52IM4eS9d4Yids7ogKEBAlJi0NbvuKO0CkgOlFjp1tOvD4sQ
# taHIMmqi40p4Tjyf/sY6yGjROXbMeeF1vlwbBAASPWpQuEIxrNHoVN30YfJyuOWj
# zdiJUTpeLn9XdjM3UlhfaHP+oIAKcmkd33c40SFRlQG9+P9Wlm7TcPxGU4wzXI8n
# Cw/h235jFlAAiWq9L2r7Un7YduqsheJVpGoXmRXJH0T2G2eNFS5/+2sLn98kN2Cn
# J7j6C242onjkZuGL2/+gqx8m5Jbpu9P4IAeTC1He/mX9j6XpIu+7uBoRVwuWD1i0
# N5SiUz7Lfnbr6Q1tHMXKDLFdwVKZos2AKEZhv4SU0WvenMJKDgkkhVeHPHbTahQf
# P1MetR8tdRs7uyTWAjPK5xf5DLEkXbMrUkpJ089fPvAGVHBcHRMqFA5egexOb6sj
# tKncUjJ1xAAtAExGdCh6VD2U5iYxghoDMIIZ/wIBATB9MGkxCzAJBgNVBAYTAlVT
# MRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1
# c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEzODQgMjAyMSBDQTECEA7G
# 8rJ2oUagfQ5tk1e14QgwDQYJYIZIAWUDBAIBBQCggZYwGQYJKoZIhvcNAQkDMQwG
# CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwKgYKKwYB
# BAGCNwIBDDEcMBqhGIAWaHR0cDovL3d3dy52bXdhcmUuY29tLzAvBgkqhkiG9w0B
# CQQxIgQgkd6rJNlPan/nrmYSl9GXaFryv3lEMAqxvI9YIOzqCKMwDQYJKoZIhvcN
# AQEBBQAEggGAa1i6bYnWhCkWfNtGdSqvIkyPpuAabXFW3kYrXlSNFQ+TP65MU6po
# xciAYEOYmskUWQbHSQ1C4+5XbFis15Rn/c77t8w6ILBhWZgueVJnTGyCdlIwdgfC
# WDKdIjZc+Sgx1U5tI4Ik+ZjwZ/uLGKG7Fp1XRuFqqSHMqEdZpYe4vQzubfvwmIkm
# oYj1Ti2GaGY8vc6fuHnC/0h8FNoCEvQePztxFrItXLXMAU8F9Shtov6Qw0J+z+l5
# S/Uvgq6c1CyzbxHsUfMjqd7o4S3IGyunYKhzylwf9H9QaZXl/SDtrpPhPeNytiMD
# uEHUi1iuRTirAFiqEt94GfrF/wYJYNPkFeflELhTk/fheoeI+4s/0uQU0j7z1zM3
# mJBLN5KTvLaJlxTcENJKHEOtV2+rzMMek4P+L0TbmqmhUjqiauHQQrK12yLFBc+F
# yEfGFJp4Cj54XtSkHzWUcHjpdjTsuGGkS+LctBV0MFnbUfGpl237wnbBVBaLQsnC
# XlCC/22HNUBvoYIXPjCCFzoGCisGAQQBgjcDAwExghcqMIIXJgYJKoZIhvcNAQcC
# oIIXFzCCFxMCAQMxDzANBglghkgBZQMEAgEFADB4BgsqhkiG9w0BCRABBKBpBGcw
# ZQIBAQYJYIZIAYb9bAcBMDEwDQYJYIZIAWUDBAIBBQAEIMwNtOcwNY8J7giURYvH
# LSoyalw1CCGUV/6Shs+gCqlzAhEA6fxUPRZQitrf86yYq3qbEBgPMjAyMjEwMTMx
# MzM1MzJaoIITBzCCBsAwggSooAMCAQICEAxNaXJLlPo8Kko9KQeAPVowDQYJKoZI
# hvcNAQELBQAwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu
# MTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRp
# bWVTdGFtcGluZyBDQTAeFw0yMjA5MjEwMDAwMDBaFw0zMzExMjEyMzU5NTlaMEYx
# CzAJBgNVBAYTAlVTMREwDwYDVQQKEwhEaWdpQ2VydDEkMCIGA1UEAxMbRGlnaUNl
# cnQgVGltZXN0YW1wIDIwMjIgLSAyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEAz+ylJjrGqfJru43BDZrboegUhXQzGias0BxVHh42bbySVQxh9J0Jdz0V
# lggva2Sk/QaDFteRkjgcMQKW+3KxlzpVrzPsYYrppijbkGNcvYlT4DotjIdCriak
# 5Lt4eLl6FuFWxsC6ZFO7KhbnUEi7iGkMiMbxvuAvfTuxylONQIMe58tySSgeTIAe
# hVbnhe3yYbyqOgd99qtu5Wbd4lz1L+2N1E2VhGjjgMtqedHSEJFGKes+JvK0jM1M
# uWbIu6pQOA3ljJRdGVq/9XtAbm8WqJqclUeGhXk+DF5mjBoKJL6cqtKctvdPbnjE
# KD+jHA9QBje6CNk1prUe2nhYHTno+EyREJZ+TeHdwq2lfvgtGx/sK0YYoxn2Off1
# wU9xLokDEaJLu5i/+k/kezbvBkTkVf826uV8MefzwlLE5hZ7Wn6lJXPbwGqZIS1j
# 5Vn1TS+QHye30qsU5Thmh1EIa/tTQznQZPpWz+D0CuYUbWR4u5j9lMNzIfMvwi4g
# 14Gs0/EH1OG92V1LbjGUKYvmQaRllMBY5eUuKZCmt2Fk+tkgbBhRYLqmgQ8JJVPx
# vzvpqwcOagc5YhnJ1oV/E9mNec9ixezhe7nMZxMHmsF47caIyLBuMnnHC1mDjcbu
# 9Sx8e47LZInxscS451NeX1XSfRkpWQNO+l3qRXMchH7XzuLUOncCAwEAAaOCAYsw
# ggGHMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoG
# CCsGAQUFBwMIMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATAfBgNV
# HSMEGDAWgBS6FtltTYUvcyl2mi91jGogj57IbzAdBgNVHQ4EFgQUYore0GH8jzEU
# 7ZcLzT0qlBTfUpwwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2NybDMuZGlnaWNl
# cnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGlu
# Z0NBLmNybDCBkAYIKwYBBQUHAQEEgYMwgYAwJAYIKwYBBQUHMAGGGGh0dHA6Ly9v
# Y3NwLmRpZ2ljZXJ0LmNvbTBYBggrBgEFBQcwAoZMaHR0cDovL2NhY2VydHMuZGln
# aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFt
# cGluZ0NBLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAVaoqGvNG83hXNzD8deNP1oUj
# 8fz5lTmbJeb3coqYw3fUZPwV+zbCSVEseIhjVQlGOQD8adTKmyn7oz/AyQCbEx2w
# mIncePLNfIXNU52vYuJhZqMUKkWHSphCK1D8G7WeCDAJ+uQt1wmJefkJ5ojOfRu4
# aqKbwVNgCeijuJ3XrR8cuOyYQfD2DoD75P/fnRCn6wC6X0qPGjpStOq/CUkVNTZZ
# mg9U0rIbf35eCa12VIp0bcrSBWcrduv/mLImlTgZiEQU5QpZomvnIj5EIdI/HMCb
# 7XxIstiSDJFPPGaUr10CU+ue4p7k0x+GAWScAMLpWnR1DT3heYi/HAGXyRkjgNc2
# Wl+WFrFjDMZGQDvOXTXUWT5Dmhiuw8nLw/ubE19qtcfg8wXDWd8nYiveQclTuf80
# EGf2JjKYe/5cQpSBlIKdrAqLxksVStOYkEVgM4DgI974A6T2RUflzrgDQkfoQTZx
# d639ouiXdE4u2h4djFrIHprVwvDGIqhPm73YHJpRxC+a9l+nJ5e6li6FV8Bg53hW
# f2rvwpWaSxECyIKcyRoFfLpxtU56mWz06J7UWpjIn7+NuxhcQ/XQKujiYu54BNu9
# 0ftbCqhwfvCXhHjjCANdRyxjqCU4lwHSPzra5eX25pvcfizM/xdMTQCi2NYBDriL
# 7ubgclWJLCcZYfZ3AYwwggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0G
# CSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0
# IFRydXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTla
# MGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UE
# AxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBp
# bmcgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJ
# UVXHJQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+e
# DzMfUBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47q
# UT3w1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL
# 6IRktFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c
# 1eYbqMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052
# FVUmcJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+
# onP65x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/w
# ojzKQtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1
# eSuo80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uK
# IqjBJgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7p
# XcheMBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgw
# BgEB/wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgw
# FoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQM
# MAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDov
# L29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5k
# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6
# MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVk
# Um9vdEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJ
# KoZIhvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7
# x1Bd4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGId
# DAiCqBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7g
# iqzl/Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6
# wCeCRK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx
# 2cYTgAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5kn
# LD0/a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3it
# TK37xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7
# HhmLNriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUV
# mDG0YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKm
# KYcJRyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8
# MIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0BAQwFADBl
# MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
# d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
# b3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQswCQYDVQQG
# EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
# cnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G
# CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7J
# IT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxS
# D1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb
# 7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1ef
# VFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoY
# OAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSa
# M0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI
# 8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9L
# BADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfm
# Q6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDr
# McXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15Gkv
# mB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
# FgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SSy4IxLVGL
# p6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAkBggrBgEF
# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRw
# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0Eu
# Y3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9E
# aWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRVHSAAMA0G
# CSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyhhyzshV6p
# Grsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO0Cre+i1W
# z/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo8L8vC6bp
# 8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++hUD38dglo
# hJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5xaiNrIv8S
# uFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMYIDdjCCA3ICAQEwdzBj
# MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMT
# MkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5n
# IENBAhAMTWlyS5T6PCpKPSkHgD1aMA0GCWCGSAFlAwQCAQUAoIHRMBoGCSqGSIb3
# DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjIxMDEzMTMzNTMy
# WjArBgsqhkiG9w0BCRACDDEcMBowGDAWBBTzhyJNhjOCkjWplLy9j5bp/hx8czAv
# BgkqhkiG9w0BCQQxIgQgnc+aPyaFBWJJ8vtk0X+1Lb/QV4OWzyaIRXf9Niu8mcAw
# NwYLKoZIhvcNAQkQAi8xKDAmMCQwIgQgx/ThvjIoiSCr4iY6vhrE/E/meBwtZNBM
# gHVXoCO1tvowDQYJKoZIhvcNAQEBBQAEggIAr4sESMP3+Qz4mbRyJiiZcje9NWeg
# eRQewLwaa2gYuSERAwvsPeJTuc8FxbB6LengJXwubyXnwkdrYtGyLYmvbK4nvDFj
# 6yivZ7da+FaJf961BzLgCsMHzRoLKIzE/lsd055rBqvncuCkasDHQZF2KLuEsljR
# IfUALYRm4CcJlszB0ZOaQwoK0tQxaDriWRDOpYjqTb8m5VmevamnDsZFMAMYDJIt
# T6UdBDNHo85Gx8CeNIPCtWg2HoyxFZe/9WbR2beudzVQw7QuYGDZsdG7vT9Z1/k3
# zwSZR43AAHUtv7NLdbXYOPrID2VANRJhDJIn/luQ9/GhJNivZ7MdmhtxVSenYduK
# CAYqAyQZcbinnDBPiGLT1XmH76kaZqQABKORWFVrYZEx9ZVdYJUxhgz7W9phcDU8
# h3/GOlxFi/AelY9URE/BRCgLV+u3TtF9y5iG2ZTT6QobSRlAl4r4sxxQg6mBwEA5
# hmNaalW4qk/VQucw6TXF123IwjZ0QT78Xu733FKFeGZa7sBfZPGXd6aXnjmLJVyw
# Y4Y+a/P5uqIJ+QlItNmtL47WFeGrItq3uWzqr8aFfm9ObLESF++6ib9QeBYbikbt
# BXnjBWq/YjYJDz8hR9dxk86vSF1W5lfQfaklxlgs1bY3jSHhui7n65ENpw0u/NAX
# KHJmO0BSR1plgrQ=
# SIG # End signature block