private/InvokeGCS.ps1


<#
.Synopsis
Script for making GCS API calls.
 
.Description
The primary function (Call-Url) within this script is crafted to interact with the GCS API, returning a response if any, and allowing a maximum of 3 retry attempts.
 
.Parameter CommandType
A mandatory parameter indicating the CommandType for the API call.
 
.Parameter Token
A necessary parameter specifying the OAuth2 token used in the API call.
 
.Parameter Method
A mandatory parameter specifying the API call method (e.g., Get, Post, Put, Delete).
 
.Parameter UrlPath
An required parameter specifying the URL path. For example, if the URL is https://www.example.com/v1.0/admin/connection/connectionid, then /v1.0/admin/connection/connectionid is the URL path.
 
.Parameter TenantId
A required parameter specifying the TenantId for which the API call is intended.
#>



function GetEnvironmentFromTenant {
    param(
        [parameter(Mandatory=$true)]
        [string]$TenantId
    )

    Write-Host "GetEnvironmentFromTenant for Tenantid: $($TenantId)"
    New-Variable -Name GccSubRegion -Value "gcc" -Option Constant
    New-Variable -Name UsgRegion -Value "usg" -Option Constant
    New-Variable -Name UsGovRegion -Value "usgov" -Option Constant
    New-Variable -Name DodSubRegion -Value "dod" -Option Constant
    New-Variable -Name DodConSubRegion -Value "dodcon" -Option Constant
    New-Variable -Name GCCTenantRegionScope -Value "na" -Option Constant

    $headers = @{"Accept" = "application/json"}
    $tenantCloudInfo = Invoke-RestMethodWithRetries -ApiName "GetTenantCloudInfo" -Uri "https://login.microsoftonline.com/$TenantId/.well-known/openid-configuration" -Headers $headers -Method Get | ConvertFrom-Json
    
    $regionScope = ""
    $regionSubScope = ""

    if( -not ([string]::IsNullOrEmpty($tenantCloudInfo.tenant_region_scope)) )
    {
        $regionScope = ([string]$tenantCloudInfo.tenant_region_scope).ToLower()
    }

    if( -not ([string]::IsNullOrEmpty($tenantCloudInfo.tenant_region_sub_scope)) )
    {
        $regionSubScope = ([string]$tenantCloudInfo.tenant_region_sub_scope).ToLower()
    }

    if(($regionScope -eq $GCCTenantRegionScope) -and ($regionSubScope -eq $GccSubRegion))
    {
        return "GCC"
    }
    elseif (($regionScope -eq $UsgRegion) -or ($regionScope -eq $UsGovRegion))
    {
        if($regionSubScope -eq $DodConSubRegion)
        {
            return "GCCH"
        }
        elseif($regionSubScope -eq $DodSubRegion)
        {
            return "DoD"
        }
    }

    return "PROD"
}

function Invoke-RestMethodWithRetries {
    param (
        [parameter(Mandatory=$true)]
        [string]$apiName,

        [parameter(Mandatory=$true)]
        [string]$uri,

        [parameter(Mandatory=$true)]
        [hashtable]$headers,

        [parameter(Mandatory=$true)]
        [string]$method,

        [parameter(Mandatory=$false)]
        [int]$maxRetries = 3
    )

    $retryCount = 0
    $errorMessage = ""
    do
    {
        try 
        {
            Write-Host "Request Made for $($apiName)"
            return Invoke-WebRequest -Uri $uri -Headers $headers -Method $method
        } 
        catch
        {
            $errorMessage = $_
            $retryCount++
            $exponentialBackoff = [int]([Math]::Pow(2,$retryCount))
            Write-Warning "Request failed for $apiName. Retrying (Attempt $retryCount)..."
            Start-Sleep -Seconds $exponentialBackoff  # Increase the wait time with each retry
        }
    }
    while ($retryCount -lt $maxRetries)

    throw "Request failed for $apiName. All the retries are exhausted. `n$errorMessage"
}

# Select BaseUrl on the basis of Environment
function SelectBaseUrl {
    param (
        [Parameter(Mandatory=$true)]
        [string]$selectedEnvironment   
    )
    
    if ($selectedEnvironment -eq "GCC") 
    {
        return "https://gcsgcc.office.com"
    } elseif ($selectedEnvironment -eq "GCCH") 
    {
        return "https://gcs.office365.us"
    } elseif ($selectedEnvironment -eq "PROD") 
    {
        return "https://gcs.office.com"
    }

    throw "Tenant Environment is not supported"
}

function Call-Url{
    param(
        # cmdlet type
        [Parameter(Mandatory=$true)]
        [string]
        $CommandType,

        # token details
        [Parameter(Mandatory=$true)]
        [PSCustomObject]
        $Token,

        #Method
        [Parameter(Mandatory=$true)]
        [string]
        $Method,

        #Url Path
        [Parameter(Mandatory=$true)]
        [string]
        $UrlPath,

        # Tenant id
        [Parameter(Mandatory=$true)]
        [string]
        $TenantId
    )

    try{
        $culture = Get-Culture
        $languageCode = $culture.Name
        $baseUrl = SelectBaseUrl -SelectedEnvironment (GetEnvironmentFromTenant -TenantId $TenantId)
        $headers = @{"authorization"="Bearer $($Token.AccessToken)"; "Content-Type"="application/json"; "Accept" = "application/json"; "Accept-Language" = "$languageCode"}
        $uri = $baseUrl + $UrlPath
        return Invoke-RestMethodWithRetries -ApiName $CommandType -Uri $uri -Headers $headers -Method $Method
    }
    catch{
        throw "error happen while calling API for $($CommandType), Error Message: $($_)"
    }
}

# SIG # Begin signature block
# MIIn+QYJKoZIhvcNAQcCoIIn6jCCJ+YCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCiMk6xZ9j7M4UB
# RbGe7Q9rt2Ot1wgFLMaCSKiFQKFHqqCCDXYwggX0MIID3KADAgECAhMzAAADrzBA
# DkyjTQVBAAAAAAOvMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjMxMTE2MTkwOTAwWhcNMjQxMTE0MTkwOTAwWjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDOS8s1ra6f0YGtg0OhEaQa/t3Q+q1MEHhWJhqQVuO5amYXQpy8MDPNoJYk+FWA
# hePP5LxwcSge5aen+f5Q6WNPd6EDxGzotvVpNi5ve0H97S3F7C/axDfKxyNh21MG
# 0W8Sb0vxi/vorcLHOL9i+t2D6yvvDzLlEefUCbQV/zGCBjXGlYJcUj6RAzXyeNAN
# xSpKXAGd7Fh+ocGHPPphcD9LQTOJgG7Y7aYztHqBLJiQQ4eAgZNU4ac6+8LnEGAL
# go1ydC5BJEuJQjYKbNTy959HrKSu7LO3Ws0w8jw6pYdC1IMpdTkk2puTgY2PDNzB
# tLM4evG7FYer3WX+8t1UMYNTAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQURxxxNPIEPGSO8kqz+bgCAQWGXsEw
# RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW
# MBQGA1UEBRMNMjMwMDEyKzUwMTgyNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci
# tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG
# CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0
# MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAISxFt/zR2frTFPB45Yd
# mhZpB2nNJoOoi+qlgcTlnO4QwlYN1w/vYwbDy/oFJolD5r6FMJd0RGcgEM8q9TgQ
# 2OC7gQEmhweVJ7yuKJlQBH7P7Pg5RiqgV3cSonJ+OM4kFHbP3gPLiyzssSQdRuPY
# 1mIWoGg9i7Y4ZC8ST7WhpSyc0pns2XsUe1XsIjaUcGu7zd7gg97eCUiLRdVklPmp
# XobH9CEAWakRUGNICYN2AgjhRTC4j3KJfqMkU04R6Toyh4/Toswm1uoDcGr5laYn
# TfcX3u5WnJqJLhuPe8Uj9kGAOcyo0O1mNwDa+LhFEzB6CB32+wfJMumfr6degvLT
# e8x55urQLeTjimBQgS49BSUkhFN7ois3cZyNpnrMca5AZaC7pLI72vuqSsSlLalG
# OcZmPHZGYJqZ0BacN274OZ80Q8B11iNokns9Od348bMb5Z4fihxaBWebl8kWEi2O
# PvQImOAeq3nt7UWJBzJYLAGEpfasaA3ZQgIcEXdD+uwo6ymMzDY6UamFOfYqYWXk
# ntxDGu7ngD2ugKUuccYKJJRiiz+LAUcj90BVcSHRLQop9N8zoALr/1sJuwPrVAtx
# HNEgSW+AKBqIxYWM4Ev32l6agSUAezLMbq5f3d8x9qzT031jMDT+sUAoCw0M5wVt
# CUQcqINPuYjbS1WgJyZIiEkBMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq
# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
# IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg
# Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03
# a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr
# rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg
# OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy
# 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9
# sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh
# dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k
# A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB
# w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn
# Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90
# lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w
# ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o
# ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD
# VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa
# BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny
# bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG
# AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t
# L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV
# HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3
# dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG
# AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl
# AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb
# C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l
# hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6
# I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0
# wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560
# STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam
# ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa
# J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah
# XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA
# 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt
# Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr
# /Xmfwb1tbWrJUnMTDXpQzTGCGdkwghnVAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp
# Z25pbmcgUENBIDIwMTECEzMAAAOvMEAOTKNNBUEAAAAAA68wDQYJYIZIAWUDBAIB
# BQCggeYwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIIAbiGLZUPSg1K90JxuZ2VaR
# RYFj7g4G/GHuiCZxNRSvMHoGCisGAQQBgjcCAQwxbDBqoEyASgBNAGkAYwByAG8A
# cwBvAGYAdAAuAEcAcgBhAHAAaAAuAEMAbwBuAG4AZQBjAHQAbwByAHMALgBDAG0A
# ZABsAGUAdAAuAGQAbABsoRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTANBgkq
# hkiG9w0BAQEFAASCAQB8seCySAOw3YSKq0hXiOvtq7OjqBV8a3Nm1mKJKWGNW2zz
# 5oQeM7zmXb32uJtmP8g6x3M2uw8mjDrRkAUk+zphNJhxHIXOxtTy61B0SNZmVifA
# PY0c/V3DQCS5zybyDJYrr2eSaLB3n5/EZmoOP0g0EUzQD1fn9BJGYNEQF6zVp5WM
# xeTHUlbZumEA7XvFTIzfg9jQ7D9U06hiT5TeEbqQltR1vNmpEPkp7omp1YGhEx/a
# QSV37qnwrgdY2zR4jgigBADv71SD0B3ubWRl43FsE+U0Opye47TULDDpz10HdUvB
# TcAEsCOKeEB36XnGxT+VWs9JgyYWwcSV2wwqsDrWoYIXKzCCFycGCisGAQQBgjcD
# AwExghcXMIIXEwYJKoZIhvcNAQcCoIIXBDCCFwACAQMxDzANBglghkgBZQMEAgEF
# ADCCAVgGCyqGSIb3DQEJEAEEoIIBRwSCAUMwggE/AgEBBgorBgEEAYRZCgMBMDEw
# DQYJYIZIAWUDBAIBBQAEIGL8IfDSNwElTKmuI4Y+Js4fLVDAvW81rAs2Fl2/8f9o
# AgZl/GbMF2kYEjIwMjQwNDAyMDc0NDIxLjUxWjAEgAIB9KCB2KSB1TCB0jELMAkG
# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9z
# b2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMg
# VFNTIEVTTjoyQUQ0LTRCOTItRkEwMTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUt
# U3RhbXAgU2VydmljZaCCEXswggcnMIIFD6ADAgECAhMzAAAB3p5InpafKEQ9AAEA
# AAHeMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
# aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
# cG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEw
# MB4XDTIzMTAxMjE5MDcxMloXDTI1MDExMDE5MDcxMlowgdIxCzAJBgNVBAYTAlVT
# MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVs
# YW5kIE9wZXJhdGlvbnMgTGltaXRlZDEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046
# MkFENC00QjkyLUZBMDExJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNl
# cnZpY2UwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC0gfQchfVCA4QO
# sRazp4sP8bA5fLEovazgjl0kjuFTEI5zRgKOVR8dIoozBDB/S2NklCAZFUEtDJep
# Efk2oJFD22hKcI4UNZqa4UYCU/45Up4nONlQwKNHp+CSOsZ16AKFqCskmPP0TiCn
# aaYYCOziW+Fx5NT97F9qTWd9iw2NZLXIStf4Vsj5W5WlwB0btBN8p78K0vP23KKw
# DTug47srMkvc1Jq/sNx9wBL0oLNkXri49qZAXH1tVDwhbnS3eyD2dkQuKHUHBD52
# Ndo8qWD50usmQLNKS6atCkRVMgdcesejlO97LnYhzjdephNJeiy0/TphqNEveAcY
# Nzf92hOn1G51aHplXOxZBS7pvCpGXG0O3Dh0gFhicXQr6OTrVLUXUqn/ORZJQlyC
# JIOLJu5zPU5LVFXztJKepMe5srIA9EK8cev+aGqp8Dk1izcyvgQotRu51A9abXrl
# 70KfHxNSqU45xv9TiXnocCjTT4xrffFdAZqIGU3t0sQZDnjkMiwPvuR8oPy+vKXv
# g62aGT1yWhlP4gYhZi/rpfzot3fN8ywB5R0Jh/1RjQX0cD/osb6ocpPxHm8Ll1SW
# Pq08n20X7ofZ9AGjIYTccYOrRismUuBABIg8axfZgGRMvHvK3+nZSiF+Xd2kC6PX
# w3WtWUzsPlwHAL49vzdwy1RmZR5x5QIDAQABo4IBSTCCAUUwHQYDVR0OBBYEFGsw
# Jm8bHmmqYHccyvDrPp2j0BLIMB8GA1UdIwQYMBaAFJ+nFV0AXmJdg/Tl0mWnG1M1
# GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
# a2lvcHMvY3JsL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEp
# LmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYBBQUHMAKGUGh0dHA6Ly93d3cubWlj
# cm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUy
# MFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYI
# KwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMA0GCSqGSIb3DQEBCwUAA4ICAQDilMB7
# Fw2nBjr1CILORw4D7NC2dash0ugusHypS2g9+rWX21rdcfhjIms0rsvhrMYlR85I
# TFvhaivIK7i0Fjf7Dgl/nxlIE/S09tXESKXGY+P2RSL8LZAXLAs9VxFLF2DkiVD4
# rWOxPG25XZpoWGdvafl0KSHLBv6vmI5KgVvZsNK7tTH8TE0LPTEw4g9vIAFRqzwN
# zcpIkgob3aku1V/vy3BM/VG87aP8NvFgPBzgh6gU2w0R5oj+zCI/kkJiPVSGsmLC
# BkY73pZjWtDr21PQiUs/zXzBIH9jRzGVGFvCqlhIyIz3xyCsVpTTGIbln1kUh2Qi
# siADQNGiS+LKB0Lc82djJzX42GPOdcB2IxoMFI/4ZS0YEDuUt9Gce/BqgSn8padu
# Wjlif6j4Qvg1zNoF2oyF25fo6RnFQDcLRRbowiUXWW3h9UfkONRY4AYOJtzkxQxq
# LeQ0rlZEII5Lu6TlT7ZXROOkJQ4P9loT6U0MVx+uLD9Rn5AMFLbeq62TPzwsERuo
# Iq2Jp00Sy7InAYaGC4fhBBY1b4lwBk5OqZ7vI8f+Fj1rtI7M+8hc4PNvxTKgpPcC
# ty78iwMgxzfhcWxwMbYMGne6C0DzNFhhEXQdbpjwiImLEn/4+/RKh3aDcEGETlZv
# mV9dEV95+m0ZgJ7JHjYYtMJ1WnlaICzHRg/p6jCCB3EwggVZoAMCAQICEzMAAAAV
# xedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENl
# cnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTIxMDkzMDE4MjIyNVoXDTMwMDkz
# MDE4MzIyNVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
# BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEm
# MCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggIiMA0GCSqG
# SIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM57RyIQt5osvXJHm9DtWC0/3unAcH
# 0qlsTnXIyjVX9gF/bErg4r25PhdgM/9cT8dm95VTcVrifkpa/rg2Z4VGIwy1jRPP
# dzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzBRMhxXFExN6AKOG6N7dcP2CZTfDlh
# AnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBbfowQHJ1S/rboYiXcag/PXfT+jlPP
# 1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCOMcg1KL3jtIckw+DJj361VI/c+gVV
# mG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYwXE8s4mKyzbnijYjklqwBSru+cakX
# W2dg3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW/aUgfX782Z5F37ZyL9t9X4C626p+
# Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/wEPK3Rxjtp+iZfD9M269ewvPV2HM9
# Q07BMzlMjgK8QmguEOqEUUbi0b1qGFphAXPKZ6Je1yh2AuIzGHLXpyDwwvoSCtdj
# bwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2BjUYhEfb3BvR/bLUHMVr9lxSUV0S
# 2yW6r1AFemzFER1y7435UsSFF5PAPBXbGjfHCBUYP3irRbb1Hode2o+eFnJpxq57
# t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYBBAGCNxUBBAUCAwEAATAjBgkrBgEE
# AYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnPEP8vBO4wHQYDVR0OBBYEFJ+nFV0AXmJd
# g/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYB
# BQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBv
# c2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4K
# AFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME
# GDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVodHRw
# Oi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJB
# dXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5o
# dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dF8y
# MDEwLTA2LTIzLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAnVV9/Cqt4SwfZwExJFvh
# nnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518JxNj/aZGx80HU5bbsPMeTCj/ts0aGU
# GCLu6WZnOlNN3Zi6th542DYunKmCVgADsAW+iehp4LoJ7nvfam++Kctu2D9IdQHZ
# GN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2pFaq95W2KFUn0CS9QKC/GbYSEhFd
# PSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefwC2qBwoEZQhlSdYo2wh3DYXMuLGt7
# bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7T7uG+jIa2Zb0j/aRAfbOxnT99kxy
# bxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFORy3BFARxv2T5JL5zbcqOCb2zAVdJ
# VGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgkujhLmm77IVRrakURR6nxt67I6IleT53S
# 0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3LwUFJfn6Tvsv4O+S3Fb+0zj6lMVGE
# vL8CwYKiexcdFYmNcP7ntdAoGokLjzbaukz5m/8K6TT4JDVnK+ANuOaMmdbhIurw
# J0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE0ZDxyKs6ijoIYn/ZcGNTTY3ugm2l
# BRDBcQZqELQdVTNYs6FwZvKhggLXMIICQAIBATCCAQChgdikgdUwgdIxCzAJBgNV
# BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w
# HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29m
# dCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEmMCQGA1UECxMdVGhhbGVzIFRT
# UyBFU046MkFENC00QjkyLUZBMDExJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0
# YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVAGigUorMuMvOqZfF8ttgiWRMRNrz
# oIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
# BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEm
# MCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwDQYJKoZIhvcN
# AQEFBQACBQDptgzkMCIYDzIwMjQwNDAyMTI0OTQwWhgPMjAyNDA0MDMxMjQ5NDBa
# MHcwPQYKKwYBBAGEWQoEATEvMC0wCgIFAOm2DOQCAQAwCgIBAAICCSQCAf8wBwIB
# AAICEk8wCgIFAOm3XmQCAQAwNgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoD
# AqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkqhkiG9w0BAQUFAAOBgQApXPI8
# m0i0YVMsDkAa9RC7FK1LoAFlEo3Ops4UNfGdnrpcBRewbuGNhMJt25trugaPb15I
# WYwHzpQ5XBa9x1/GdKrZCjmunxgeqYgswjhb5ovnX8x35UJERmwoThzj+pt/Z8MB
# lZWidZ8yss2BZql7iiwlTr2CYtVreir90UjSODGCBA0wggQJAgEBMIGTMHwxCzAJ
# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jv
# c29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB3p5InpafKEQ9AAEAAAHeMA0G
# CWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJ
# KoZIhvcNAQkEMSIEIA9rhEv7WaLoQGOZxsvi1afmKSnTOdMY4UUYwprBuhy2MIH6
# BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgjj4jnw3BXhAQSQJ/5gtzIK0+cP1N
# s/NS2A+OB3N+HXswgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAx
# MAITMwAAAd6eSJ6WnyhEPQABAAAB3jAiBCD//BR0Pt0/JAC2JxpTPgTVv6f6w+2N
# QQPcUAAPA2HcPjANBgkqhkiG9w0BAQsFAASCAgCvuiYKpZ/JnYidtmRqAyrVvY0m
# 0K9t0myF2fYpgK2tbMSQktrMdHpyIMeqtzoBR3KUFAUqHMOW7iSXUkqgY2MdxxH9
# rFSlqk3/3zZGCox214taOSTeLuDbtM/uFadJ+023lDQvT6dc5oiGmEsxRrZWMMCf
# IPVuSggEFm853Uyl63L0f8gP5D3Jx0o8JPj4xPoS9NaNH1XKTHrx80zu8/MvE0qb
# 33Fd63gOJEFvjkwAmEFyqs41lPoHAdD4bGaFSfXH6EJavS3pJYEhACozo0By4JhJ
# ROAyxr9Oy7wUJF1xXg2/NY6LJPXmYTY4kVs/3ZkFe7KnVuwmEFmQhpDMKVbv4b4l
# mcViVCkIAkuI+cS1509UxJzgOktOud41UoXW5hiO5JxSwrXKmNwtsSLXy0g/xJ1B
# t+8EtCdEbTrypIqTFfPv2GhA38noO+YIBeqbrwhGRRCgxGGbnxqrVCrnDRli5aJ5
# PsAr20OMxRj5PMCv+NkhBV06KT9RNEkuZSBc/BP202DjhhJmcK+tFlx98gDzBwqN
# myD1ZlaaoNk8wEwaLX4gMHbtsrlgNKP/OrhhN3oYU6eqszSPCfX+lpsIgk0QnI1i
# e/bXMWAE95KjCSs1+MBjDpnO+u545hgwY1GOnRgiYfteBVT+VFhacNu6CFUZ75iG
# fo5dPlktrqcSpfdN1w==
# SIG # End signature block