GenerateO365RefreshToken.ps1


<#PSScriptInfo
 
.VERSION 1.3
 
.GUID 055455ac-419d-4e89-b4c9-d1ccba28393f
 
.AUTHOR skrishnakumar
 
.COMPANYNAME
 
.COPYRIGHT
 
.TAGS
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
 
 
.PRIVATEDATA
 
#>


<#
 
.DESCRIPTION
 Exterro eDiscovery platform connect with O365 with the help of refresh token to support modern authentication.
 
#>
 

#-- This script is used for Exterro's eDiscovery Platform.
#-- @author: Samraj K
#-- Code snippets are referred from PS gallery projects.

$ErrorActionPreference = "Stop"
$WelknownClientId = "1b730954-1685-4b74-9bfd-dac224a7b894"
$PSEndPointUrl = "https://ps.compliance.protection.outlook.com"
$O365LoginUrl = "https://login.microsoftonline.com"
[bool]  $Global:autoClosed=$false;
Function Show-LoginWindow
{
    param(
        [System.Uri]$Url
    )
    Add-Type -AssemblyName System.Web
    Add-Type -AssemblyName System.Windows.Forms
 
    $form = New-Object -TypeName System.Windows.Forms.Form -Property @{Width=500;Height=650}
    $web  = New-Object -TypeName System.Windows.Forms.WebBrowser -Property @{Width=400;Height=600;Url=($url ) }
    $DocComp  = {
        $Global:uri = $web.Url.AbsoluteUri
        if ($Global:Uri -match "error=[^&]*|code=[^&]*") {$Global:autoClosed=$true; $form.Close() }
    }
    $web.ScriptErrorsSuppressed = $true
    $web.Add_DocumentCompleted($DocComp)
    $form.Text="Exterro Token Generation"

    $Icon = [system.drawing.icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe")
    $form.Icon=$Icon
   # $form.CompanyName="Exterro Inc"
    $form.Controls.Add($web)
    $form.Add_Shown({$form.Activate()})
    $form.ShowDialog() | Out-Null
    $queryOutput = [System.Web.HttpUtility]::ParseQueryString($web.Url.Query)
    
    if($Global:autoClosed){
    $output = @{}
    foreach($key in $queryOutput.Keys){
        $output["$key"] = $queryOutput[$key]
    }
    return $output 
    }else{
    $FileLocation="tempFile.html"
    if (Test-Path $FileLocation) 
    {
      Remove-Item $FileLocation
    }
    $web.DocumentText | Out-File -FilePath $FileLocation -NoClobber
    

  $output=  GetStringBetweenTwoStrings -firstString "code=" -secondString "\\u0026session_state=" -importPath $FileLocation
  
  Remove-Item -path $FileLocation
  return $output 
  }
    
}

function GetStringBetweenTwoStrings($firstString, $secondString, $importPath){

    #Get content from file
    $file = Get-Content $importPath

    #Regex pattern to compare two strings
    $pattern = "$firstString(.*?)$secondString"

    #Perform the opperation
    $result = [regex]::Match($file,$pattern).Groups[1].Value

    #Return result
    return $result

}

function Display {
    param(
        [String]$codes
    )
    [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')

    $title = 'Refresh Token'
    $msg   = 'Please copy the refresh token from the window.'

    $text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title, $codes)

}

function Get-ExterroPSO365RefreshToken {
    
    Unblock-File -Path $MyInvocation.ScriptName;

    #--- Get the options section
        Show-Menu �Title 'My Menu'
         $selection = Read-Host "Please make a selection ( Default : Microsoft global environment)"
         switch ($selection)
         {
             '1' {
                 $PSEndPointUrl = "https://ps.compliance.protection.outlook.com"
                 $O365LoginUrl = "https://login.microsoftonline.com"
                 'You chose option #1 - Microsoft global environment'
             } '2' {
                $PSEndPointUrl = "https://ps.compliance.protection.office365.us"
                 $O365LoginUrl = "https://login.microsoftonline.us"
                 'You chose option #2 - Microsoft Cloud for US Government (GCC High)'
             } '3' {
                $PSEndPointUrl = "https://l5.ps.compliance.protection.office365.us"
                 $O365LoginUrl = "https://login.microsoftonline.us"
                 'You chose option #3 - Microsoft Cloud for US Government (DoD)'
             } '4' {
             $PSEndPointUrl = "https://ps.compliance.protection.outlook.de"
                 $O365LoginUrl = "https://login.microsoftonline.de"
                 'You chose option #4 - Microsoft Cloud Germany'
             } '5' {
             $PSEndPointUrl = "https://ps.protection.outlook.cn"
                 $O365LoginUrl = "https://login.partner.microsoftonline.cn"
                 'You chose option #5 - Azure and Microsoft 365 operated by 21Vianet in China'
             }  'q' {
                 return
             } default {
                 $PSEndPointUrl = "https://ps.compliance.protection.outlook.com"
                 $O365LoginUrl = "https://login.microsoftonline.com"
                 'Default value - Microsoft global environment'
             } 
         }
    
    #--- End of option section

    $refreshToken = ""
    $responseCode=""
        
        $codeData = Show-LoginWindow -Url "$O365LoginUrl/common/oauth2/authorize?resource=$PSEndPointUrl&client_id=$WelknownClientId&response_type=code&redirect_uri=urn:ietf:wg:oauth:2.0:oob&prompt=login" + ";"
       if($Global:autoClosed){
        If ($codeData["error"]) {
            "An error occurred accessing $PSEndPointUrl : " + $codeData["error"]
            return
        } ElseIf ($codeData["code"]) {
            $responseCode = $codeData["code"] ;
        } Else {
            "No code obtained from the endpoint url." ;
            return
        }
        }else{
            $responseCode = $codeData;
        }

        #Fetch the access token
        if ($responseCode) {
        $postParams = @{grant_type='authorization_code';code=$responseCode;client_id=$WelknownClientId;redirect_uri='urn:ietf:wg:oauth:2.0:oob'}
        $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
        $headers.Add("Content-Type", 'application/x-www-form-urlencoded')
        $response=Invoke-RestMethod -Uri "$O365LoginUrl/common/oauth2/token" -Method POST -Body $postParams -Headers $headers

        #Set-Clipboard -Value $response.refresh_token
        #$response | Out-File -FilePath "AccessToken.txt"
        Display $response.refresh_token;
        }else{
        Write-Host "Powershell window might be closed abruptly."
        }
}

function Show-Menu
{
    param (
        [string]$Title = 'M365 Environment Details'
    )
    Clear-Host
    Write-Host "================ Title ================"
    
    Write-Host "1: Press '1' for Microsoft global environment."
    Write-Host "2: Press '2' for Microsoft Cloud for US Government(GCC High)."
    Write-Host "2: Press '3' for Microsoft Cloud for US Government(DoD)."
    Write-Host "3: Press '4' for Microsoft Cloud Germany."
    Write-Host "4: Press '5' for Azure and Microsoft 365 operated by 21Vianet in China."
    Write-Host "Q: Press 'Q' to quit."
}

Get-ExterroPSO365RefreshToken
# SIG # Begin signature block
# MIIqywYJKoZIhvcNAQcCoIIqvDCCKrgCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBxnunWXuN/T2uu
# H/8F35VrwDRhqxkDrP+QWDp21jhJ26CCE6cwggWQMIIDeKADAgECAhAFmxtXno4h
# MuI5B72nd3VcMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0xMzA4MDExMjAwMDBaFw0z
# ODAxMTUxMjAwMDBaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0
# IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
# AL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3EMB/z
# G6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKyunWZ
# anMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsFxl7s
# Wxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU15zHL
# 2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJBMtfb
# BHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObURWBf3
# JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6nj3c
# AORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxBYKqx
# YxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5SUUd0
# viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+xq4aL
# T8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjQjBAMA8GA1Ud
# EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTs1+OC0nFdZEzf
# Lmc/57qYrhwPTzANBgkqhkiG9w0BAQwFAAOCAgEAu2HZfalsvhfEkRvDoaIAjeNk
# aA9Wz3eucPn9mkqZucl4XAwMX+TmFClWCzZJXURj4K2clhhmGyMNPXnpbWvWVPjS
# PMFDQK4dUPVS/JA7u5iZaWvHwaeoaKQn3J35J64whbn2Z006Po9ZOSJTROvIXQPK
# 7VB6fWIhCoDIc2bRoAVgX+iltKevqPdtNZx8WorWojiZ83iL9E3SIAveBO6Mm0eB
# cg3AFDLvMFkuruBx8lbkapdvklBtlo1oepqyNhR6BvIkuQkRUNcIsbiJeoQjYUIp
# 5aPNoiBB19GcZNnqJqGLFNdMGbJQQXE9P01wI4YMStyB0swylIQNCAmXHE/A7msg
# dDDS4Dk0EIUhFQEI6FUy3nFJ2SgXUE3mvk3RdazQyvtBuEOlqtPDBURPLDab4vri
# RbgjU2wGb2dVf0a1TD9uKFp5JtKkqGKX0h7i7UqLvBv9R0oN32dmfrJbQdA75PQ7
# 9ARj6e/CVABRoIoqyc54zNXqhwQYs86vSYiv85KZtrPmYQ/ShQDnUBrkG5WdGaG5
# nLGbsQAe79APT0JsyQq87kP6OnGlyE0mpTX9iV28hWIdMtKgK1TtmlfB2/oQzxm3
# i0objwG2J5VT6LaJbVu8aNQj6ItRolb58KaAoNYes7wPD1N1KarqE3fk3oyBIa0H
# EEcRrYc9B9F1vM/zZn4wggawMIIEmKADAgECAhAIrUCyYNKcTJ9ezam9k67ZMA0G
# CSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0
# IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0zNjA0MjgyMzU5NTla
# MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE
# AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz
# ODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDVtC9C
# 0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0JAfhS0/TeEP0F9ce
# 2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJrQ5qZ8sU7H/Lvy0da
# E6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhFLqGfLOEYwhrMxe6T
# SXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+FLEikVoQ11vkunKoA
# FdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh3K3kGKDYwSNHR7Oh
# D26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJwZPt4bRc4G/rJvmM
# 1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQayg9Rc9hUZTO1i4F4z
# 8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbIYViY9XwCFjyDKK05
# huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchApQfDVxW0mdmgRQRNY
# mtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRroOBl8ZhzNeDhFMJlP
# /2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IBWTCCAVUwEgYDVR0T
# AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHwYD
# VR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMG
# A1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYY
# aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2Fj
# ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNV
# HR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRU
# cnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAEDMAgGBmeBDAEEATAN
# BgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql+Eg08yy25nRm95Ry
# sQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFFUP2cvbaF4HZ+N3HL
# IvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1hmYFW9snjdufE5Btf
# Q/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3RywYFzzDaju4ImhvTnh
# OE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5UbdldAhQfQDN8A+KVssIh
# dXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw8MzK7/0pNVwfiThV
# 9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnPLqR0kq3bPKSchh/j
# wVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatEQOON8BUozu3xGFYH
# Ki8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bnKD+sEq6lLyJsQfmC
# XBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQjiWQ1tygVQK+pKHJ6l
# /aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbqyK+p/pQd52MbOoZW
# eE4wggdbMIIFQ6ADAgECAhAD6v665xpLOs7OXPxdA2xKMA0GCSqGSIb3DQEBCwUA
# MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE
# AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz
# ODQgMjAyMSBDQTEwHhcNMjEwODE3MDAwMDAwWhcNMjQwNjEzMjM1OTU5WjBgMQsw
# CQYDVQQGEwJVUzEPMA0GA1UECBMGT3JlZ29uMRIwEAYDVQQHEwlCZWF2ZXJ0b24x
# FTATBgNVBAoTDEV4dGVycm8sIEluYzEVMBMGA1UEAxMMRXh0ZXJybywgSW5jMIIC
# IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6LFZi4RUAV1An+PPIxdUiSTq
# bClWDQIIanxbz7VE/J5bFaVR/pS4ds6JtWCMShRz3nMe/Y32tdXzygZpVeIx5qD4
# v0FbUiHveVQkvUaDREcNh83bOaEn/iyKuY1hsUkvE9mePXUpVS3EqbJH5diRhg5s
# zk/yeMIbqO8EwXGfH+xkPd2lym2jtVRqPuAGUNErcnzjYlQG1yu99is8YXZ7TOR2
# O6hXiYNafGmL6YaB6ywFPWSts8mz156+rxFmz7PF3k2tsTvo7NIcc1heabxVJuuo
# OdZ5ZazjgIVw+BSDo4PLa+gBb5FAEJlaB+PlVfaSyQ/wapZ7mnBtvYWgeOTFV1sp
# 2IRJqbBHWa3LLGCgg+J8IUxdnYWrw7vqcBE2HiNA8bUXnzjjANXeHfs7AqI6tQR/
# Fpv8ZQZF9YeaA82ycuIiVMxwpH0h0Nu7mLQ7supMmYhC8TsscjgJMnuHvv4ECfkv
# ugdQjFds4cgI2EHpUxNGzdhaTY9K2IGyWFIamqzVQa26MpVS6wIUTJp0n5n1AdO/
# aPbvKBEIKGHwO8qOAigNIEipbMhb4RhtWxgLIjRjHsd9YTE3nRgVvFz2QOB9MhX6
# Cemck+Gtc4Wv2hPpRD8kVgHuFgGsvqrYZTybMwaAen7hfqn4Zoz/IrjFoowfZQXJ
# J548OBGp8dYqa8W985cCAwEAAaOCAgYwggICMB8GA1UdIwQYMBaAFGg34Ou2O/hf
# EYb7/mF7CIhl9E5CMB0GA1UdDgQWBBTMmvFGbCPHA3PcBvPWH+SRyBLvfDAOBgNV
# HQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCBqjBT
# oFGgT4ZNaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0
# Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0dHA6
# Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5n
# UlNBNDA5NlNIQTM4NDIwMjFDQTEuY3JsMD4GA1UdIAQ3MDUwMwYGZ4EMAQQBMCkw
# JwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBlAYIKwYB
# BQUHAQEEgYcwgYQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNv
# bTBcBggrBgEFBQcwAoZQaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lD
# ZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcnQw
# DAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAjLcPltOkacap+5d7J8pZ
# 7gBt5XPhEb28yjyd93xjPrcfa/Hgm4oSFeHAl484gw5xl/eD8QtT+nUEbEG6ImlV
# jxWZ1Kz5g8EpCUKwR8ZpB5RPPwRecFVAkaARoOEcXLN6E3omg+AK+NkKtV2/Uj1R
# /aXE/+9dli80yTzsF+csNw6PCR1miaP31vuG0av4dMN59XIT9pm+0K13v4cUeVli
# iKmSP9BaEBEnIxnw8amjyqznwKiLBJxNDvx1PJ53Tpun3RBfzEd96x2ZrEuB91u1
# 6VLhapv1a6fDBfWXhjkfCVreX+HO4QLfVE50MiyNYsWRXqmTnIr/AjzGzFViO8vx
# 3frJlZG5u2wd9RNsPw+h/4HmJzd6tFuzY8kYsXjVOdPJGFWOip3Qu2Eh1xvmpZ/D
# S1RTF8a5lGSX9aL4v0sdRLUcuWSBWjNUWHf7cARwEJed/6OcmfaFvZBRKa9QO+Q1
# u6G4DJqhyTvrYqrUDjyHS1ZYtNJCk/CN7mI7Rb+Cv6OoMWzl5fXb/TtqWpgkEYGv
# kyAnMO1jmWDTO4I9zYZVsTTmvREytTyTYsppGttdWNlvrI6koPldDJryzxbrYcKo
# oeprN1le9n3fV67DxNEYMW9+cJM28aNiveyWIpAZgwInP/p+5weNG0+zCP9SiAvO
# 6XrbT3zlwQmqSygFG59XAOAxghZ6MIIWdgIBATB9MGkxCzAJBgNVBAYTAlVTMRcw
# FQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3Rl
# ZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEzODQgMjAyMSBDQTECEAPq/rrn
# Gks6zs5c/F0DbEowDQYJYIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZ
# BgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYB
# BAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgsJ/nCURg0zMGykHbg76VWomjdc9UfJU/
# 4lrHUGWuCCUwDQYJKoZIhvcNAQEBBQAEggIAE1ieIUvHQUYx6z3jdJ1DzOK8r549
# nIJR6FsQrHyF7LMQzY8mNcYwJYwSxezlp//PyNBYe/9zcbpwjI6Lli7IRHppU9aJ
# R7QoeK9jNHuHpgvBMkKVXiUAQTpXQOlnmhKJBgbfK8J0lN5t3YDWvHn6+ynh/8Ye
# avCoqNTNwgCH3ps7qV8FML6TPvUhUWBslOXgtn4oAj8p4EOimyE0leAUtSr6ApL6
# jz+hjuUYQpL2P3suWj37XXn1ZLPyixImTYWTnCuUk3hr02P8SqTtfA869N0DEYuk
# fDV1lxjj09jcL6hLWWnu6kdii2O52JanWWV46mVDZ4gYDwgMSelbHTvUuUl9J6No
# drRd9/qnUXc0hKcVu3kHoEjDCDSgLwA8vXLA2lei0bkiNgJIw1YQTFQUwwIkgDJM
# 0GZXUJ7GAQSIoc22qmFLRZpFP6YV06asd9xvRk+RRJS1daR1erjUOcTByOmP1jYe
# dl+ng4pboyMHOPdFN65FPCWaI20HLSiX/HmhE4CVskADIbU1FX/JR/g+T+YqK7DR
# NElxQ/8kR62xoZLbBYmzOXSlBFT4JHlTwq8qLQjwHmxcH7q7pmJMXc8Krwi6W7G3
# tNoqB7NSsKtrrd++twLTEYVwccDCcf7ElKl5Y0NcDdatt4x7/tCTcaxB5h6A+4oX
# YQ0SGJIR37bTGnShghNQMIITTAYKKwYBBAGCNwMDATGCEzwwghM4BgkqhkiG9w0B
# BwKgghMpMIITJQIBAzEPMA0GCWCGSAFlAwQCAgUAMIHvBgsqhkiG9w0BCRABBKCB
# 3wSB3DCB2QIBAQYKKwYBBAGyMQIBATAxMA0GCWCGSAFlAwQCAQUABCDu3m9qzKQf
# 4PiHLur7KfNIYLUFWbISUJvcJ/UqdDjKlwIULpnakmw2O1fm9Z0lcllLUZvFRgcY
# DzIwMjMwMjIyMTUzODAzWqBupGwwajELMAkGA1UEBhMCR0IxEzARBgNVBAgTCk1h
# bmNoZXN0ZXIxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEsMCoGA1UEAwwjU2Vj
# dGlnbyBSU0EgVGltZSBTdGFtcGluZyBTaWduZXIgIzOggg3qMIIG9jCCBN6gAwIB
# AgIRAJA5f5rSSjoT8r2RXwg4qUMwDQYJKoZIhvcNAQEMBQAwfTELMAkGA1UEBhMC
# R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9y
# ZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSUwIwYDVQQDExxTZWN0aWdvIFJT
# QSBUaW1lIFN0YW1waW5nIENBMB4XDTIyMDUxMTAwMDAwMFoXDTMzMDgxMDIzNTk1
# OVowajELMAkGA1UEBhMCR0IxEzARBgNVBAgTCk1hbmNoZXN0ZXIxGDAWBgNVBAoT
# D1NlY3RpZ28gTGltaXRlZDEsMCoGA1UEAwwjU2VjdGlnbyBSU0EgVGltZSBTdGFt
# cGluZyBTaWduZXIgIzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCQ
# snE/eeHUuYoXzMOXwpCUcu1aOm8BQ39zWiifJHygNUAG+pSvCqGDthPkSxUGXmqK
# IDRxe7slrT9bCqQfL2x9LmFR0IxZNz6mXfEeXYC22B9g480Saogfxv4Yy5NDVnrH
# zgPWAGQoViKxSxnS8JbJRB85XZywlu1aSY1+cuRDa3/JoD9sSq3VAE+9CriDxb2Y
# LAd2AXBF3sPwQmnq/ybMA0QfFijhanS2nEX6tjrOlNEfvYxlqv38wzzoDZw4ZtX8
# fR6bWYyRWkJXVVAWDUt0cu6gKjH8JgI0+WQbWf3jOtTouEEpdAE/DeATdysRPPs9
# zdDn4ZdbVfcqA23VzWLazpwe/OpwfeZ9S2jOWilh06BcJbOlJ2ijWP31LWvKX2TH
# aygM2qx4Qd6S7w/F7KvfLW8aVFFsM7ONWWDn3+gXIqN5QWLP/Hvzktqu4DxPD1rM
# bt8fvCKvtzgQmjSnC//+HV6k8+4WOCs/rHaUQZ1kHfqA/QDh/vg61MNeu2lNcpnl
# 8TItUfphrU3qJo5t/KlImD7yRg1psbdu9AXbQQXGGMBQ5Pit/qxjYUeRvEa1RlNs
# xfThhieThDlsdeAdDHpZiy7L9GQsQkf0VFiFN+XHaafSJYuWv8at4L2xN/cf30J7
# qusc6es9Wt340pDVSZo6HYMaV38cAcLOHH3M+5YVxQIDAQABo4IBgjCCAX4wHwYD
# VR0jBBgwFoAUGqH4YRkgD8NBd0UojtE1XwYSBFUwHQYDVR0OBBYEFCUuaDxrmisk
# FKkfot8mOs8UpvHgMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMBYGA1Ud
# JQEB/wQMMAoGCCsGAQUFBwMIMEoGA1UdIARDMEEwNQYMKwYBBAGyMQECAQMIMCUw
# IwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEAjBE
# BgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29S
# U0FUaW1lU3RhbXBpbmdDQS5jcmwwdAYIKwYBBQUHAQEEaDBmMD8GCCsGAQUFBzAC
# hjNodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29SU0FUaW1lU3RhbXBpbmdD
# QS5jcnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqG
# SIb3DQEBDAUAA4ICAQBz2u1ocsvCuUChMbu0A6MtFHsk57RbFX2o6f2t0ZINfD02
# oGnZ85ow2qxp1nRXJD9+DzzZ9cN5JWwm6I1ok87xd4k5f6gEBdo0wxTqnwhUq//E
# fpZsK9OU67Rs4EVNLLL3OztatcH714l1bZhycvb3Byjz07LQ6xm+FSx4781FoADk
# +AR2u1fFkL53VJB0ngtPTcSqE4+XrwE1K8ubEXjp8vmJBDxO44ISYuu0RAx1QcIP
# NLiIncgi8RNq2xgvbnitxAW06IQIkwf5fYP+aJg05Hflsc6MlGzbA20oBUd+my7w
# ZPvbpAMxEHwa+zwZgNELcLlVX0e+OWTOt9ojVDLjRrIy2NIphskVXYCVrwL7tNEu
# nTh8NeAPHO0bR0icImpVgtnyughlA+XxKfNIigkBTKZ58qK2GpmU65co4b59G6F8
# 7VaApvQiM5DkhFP8KvrAp5eo6rWNes7k4EuhM6sLdqDVaRa3jma/X/ofxKh/p6FI
# FJENgvy9TZntyeZsNv53Q5m4aS18YS/to7BJ/lu+aSSR/5P8V2mSS9kFP22GctOi
# 0MBk0jpCwRoD+9DtmiG4P6+mslFU1UzFyh8SjVfGOe1c/+yfJnatZGZn6Kow4NKt
# t32xakEnbgOKo3TgigmCbr/j9re8ngspGGiBoZw/bhZZSxQJCZrmrr9gFd2G9TCC
# BuwwggTUoAMCAQICEDAPb6zdZph0fKlGNqd4LbkwDQYJKoZIhvcNAQEMBQAwgYgx
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJz
# ZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQD
# EyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE5MDUw
# MjAwMDAwMFoXDTM4MDExODIzNTk1OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT
# EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UEChMP
# U2VjdGlnbyBMaW1pdGVkMSUwIwYDVQQDExxTZWN0aWdvIFJTQSBUaW1lIFN0YW1w
# aW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyBsBr9ksfoiZ
# fQGYPyCQvZyAIVSTuc+gPlPvs1rAdtYaBKXOR4O168TMSTTL80VlufmnZBYmCfvV
# MlJ5LsljwhObtoY/AQWSZm8hq9VxEHmH9EYqzcRaydvXXUlNclYP3MnjU5g6Kh78
# zlhJ07/zObu5pCNCrNAVw3+eolzXOPEWsnDTo8Tfs8VyrC4Kd/wNlFK3/B+VcyQ9
# ASi8Dw1Ps5EBjm6dJ3VV0Rc7NCF7lwGUr3+Az9ERCleEyX9W4L1GnIK+lJ2/tCCw
# YH64TfUNP9vQ6oWMilZx0S2UTMiMPNMUopy9Jv/TUyDHYGmbWApU9AXn/TGs+ciF
# F8e4KRmkKS9G493bkV+fPzY+DjBnK0a3Na+WvtpMYMyou58NFNQYxDCYdIIhz2JW
# tSFzEh79qsoIWId3pBXrGVX/0DlULSbuRRo6b83XhPDX8CjFT2SDAtT74t7xvAIo
# 9G3aJ4oG0paH3uhrDvBbfel2aZMgHEqXLHcZK5OVmJyXnuuOwXhWxkQl3wYSmgYt
# nwNe/YOiU2fKsfqNoWTJiJJZy6hGwMnypv99V9sSdvqKQSTUG/xypRSi1K1DHKRJ
# i0E5FAMeKfobpSKupcNNgtCN2mu32/cYQFdz8HGj+0p9RTbB942C+rnJDVOAffq2
# OVgy728YUInXT50zvRq1naHelUF6p4MCAwEAAaOCAVowggFWMB8GA1UdIwQYMBaA
# FFN5v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBQaofhhGSAPw0F3RSiO0TVf
# BhIEVTAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUE
# DDAKBggrBgEFBQcDCDARBgNVHSAECjAIMAYGBFUdIAAwUAYDVR0fBEkwRzBFoEOg
# QYY/aHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdFJTQUNlcnRpZmlj
# YXRpb25BdXRob3JpdHkuY3JsMHYGCCsGAQUFBwEBBGowaDA/BggrBgEFBQcwAoYz
# aHR0cDovL2NydC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdFJTQUFkZFRydXN0Q0Eu
# Y3J0MCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqG
# SIb3DQEBDAUAA4ICAQBtVIGlM10W4bVTgZF13wN6MgstJYQRsrDbKn0qBfW8Oyf0
# WqC5SVmQKWxhy7VQ2+J9+Z8A70DDrdPi5Fb5WEHP8ULlEH3/sHQfj8ZcCfkzXuqg
# HCZYXPO0EQ/V1cPivNVYeL9IduFEZ22PsEMQD43k+ThivxMBxYWjTMXMslMwlaTW
# 9JZWCLjNXH8Blr5yUmo7Qjd8Fng5k5OUm7Hcsm1BbWfNyW+QPX9FcsEbI9bCVYRm
# 5LPFZgb289ZLXq2jK0KKIZL+qG9aJXBigXNjXqC72NzXStM9r4MGOBIdJIct5PwC
# 1j53BLwENrXnd8ucLo0jGLmjwkcd8F3WoXNXBWiap8k3ZR2+6rzYQoNDBaWLpgn/
# 0aGUpk6qPQn1BWy30mRa2Coiwkud8TleTN5IPZs0lpoJX47997FSkc4/ifYcobWp
# dR9xv1tDXWU9UIFuq/DQ0/yysx+2mZYm9Dx5i1xkzM3uJ5rloMAMcofBbk1a0x7q
# 8ETmMm8c6xdOlMN4ZSA7D0GqH+mhQZ3+sbigZSo04N6o+TzmwTC7wKBjLPxcFgCo
# 0MR/6hGdHgbGpm0yXbQ4CStJB6r97DDa8acvz7f9+tCjhNknnvsBZne5VhDhIG7G
# rrH5trrINV0zdo7xfCAMKneutaIChrop7rRaALGMq+P5CslUXdS5anSevUiumDGC
# BC0wggQpAgEBMIGSMH0xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1h
# bmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGlt
# aXRlZDElMCMGA1UEAxMcU2VjdGlnbyBSU0EgVGltZSBTdGFtcGluZyBDQQIRAJA5
# f5rSSjoT8r2RXwg4qUMwDQYJYIZIAWUDBAICBQCgggFrMBoGCSqGSIb3DQEJAzEN
# BgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjMwMjIyMTUzODAzWjA/Bgkq
# hkiG9w0BCQQxMgQwUU1tCFAeaWNlcwPjhKUX2isWzS7Tv++6ZVxdTCLKx3UBJkeI
# U1QWg2edKWj7IzGbMIHtBgsqhkiG9w0BCRACDDGB3TCB2jCB1zAWBBSrNAE6rECX
# MZ8IGvCzGOGD+A94gTCBvAQUAtZbleKDcMFXAJX6iPkj3ZN/rY8wgaMwgY6kgYsw
# gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK
# ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYD
# VQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5AhAwD2+s
# 3WaYdHypRjaneC25MA0GCSqGSIb3DQEBAQUABIICAFthaAqb/jJ2XW90CBX3IbDS
# ydre0nBArynsow8gb7/ehk/MAtR7/sCyt3nW3wPMAUIEHPrQ4afnWWIxtBM0wHq9
# DvgoUz+8WCO5OvIkiCgam2n+y9eR6UJOI4b3fAK0RaWwbG+bVU4WcBgyKc3QCQXe
# cauUPWC0kC3L/jffo8fd1r3ibZBzgbQ6ssic4b3nwLcQ5p8qfg3AUKZwdVf2uvzS
# 6WJ+su4V3lPvqPrBehAaR8JU422+LAuhQsYoIu4mu82AKwZNqI0C2M8Vys+ZDrSO
# cNBvbkwYFpDwQCeTX29yquRiZXiCZHEKFJ0ILKuwjXEseFbSiYA6tLbPc5vBSfo1
# tWJcvgS6ssz2PuhkLQuA8pXmrGndSLZ3PVw9WMVRdDdLyeUUp7ByR05rI6L44VL4
# Npse0JHGusU0PDS91gzxB1+QFN06Ic0ytr9u0U6YVrXH5udcWSeJR9C0CCcb82lf
# LhcQ31D6XU/VAThuEjR9c+Cm/Ssg7AYdSZBIaqmT/KMFQXQ7+RXvp4ETm0N1VEzf
# Yp826RwescBNtJu09F6mc/5/NnVmj+2G8a+QgjKgr88kI1BJo1gZyMbOc3GaTPqF
# o7R5aPcSDyqpqf6jOvvElByvGevWMpquiMgF0MqYMXoezEXQf3n3TbJ7uwfywVJb
# mVbw440QwWGG3m7DAfh+
# SIG # End signature block