473 lines
23 KiB
PowerShell
473 lines
23 KiB
PowerShell
<#
|
|
.Synopsis
|
|
Activate a Python virtual environment for the current PowerShell session.
|
|
|
|
.Description
|
|
Pushes the python executable for a virtual environment to the front of the
|
|
$Env:PATH environment variable and sets the prompt to signify that you are
|
|
in a Python virtual environment. Makes use of the command line switches as
|
|
well as the `pyvenv.cfg` file values present in the virtual environment.
|
|
|
|
.Parameter VenvDir
|
|
Path to the directory that contains the virtual environment to activate. The
|
|
default value for this is the parent of the directory that the Activate.ps1
|
|
script is located within.
|
|
|
|
.Parameter Prompt
|
|
The prompt prefix to display when this virtual environment is activated. By
|
|
default, this prompt is the name of the virtual environment folder (VenvDir)
|
|
surrounded by parentheses and followed by a single space (ie. '(.venv) ').
|
|
|
|
.Example
|
|
Activate.ps1
|
|
Activates the Python virtual environment that contains the Activate.ps1 script.
|
|
|
|
.Example
|
|
Activate.ps1 -Verbose
|
|
Activates the Python virtual environment that contains the Activate.ps1 script,
|
|
and shows extra information about the activation as it executes.
|
|
|
|
.Example
|
|
Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
|
|
Activates the Python virtual environment located in the specified location.
|
|
|
|
.Example
|
|
Activate.ps1 -Prompt "MyPython"
|
|
Activates the Python virtual environment that contains the Activate.ps1 script,
|
|
and prefixes the current prompt with the specified string (surrounded in
|
|
parentheses) while the virtual environment is active.
|
|
|
|
.Notes
|
|
On Windows, it may be required to enable this Activate.ps1 script by setting the
|
|
execution policy for the user. You can do this by issuing the following PowerShell
|
|
command:
|
|
|
|
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
|
|
|
For more information on Execution Policies:
|
|
https://go.microsoft.com/fwlink/?LinkID=135170
|
|
|
|
#>
|
|
Param(
|
|
[Parameter(Mandatory = $false)]
|
|
[String]
|
|
$VenvDir,
|
|
[Parameter(Mandatory = $false)]
|
|
[String]
|
|
$Prompt
|
|
)
|
|
|
|
<# Function declarations --------------------------------------------------- #>
|
|
|
|
<#
|
|
.Synopsis
|
|
Remove all shell session elements added by the Activate script, including the
|
|
addition of the virtual environment's Python executable from the beginning of
|
|
the PATH variable.
|
|
|
|
.Parameter NonDestructive
|
|
If present, do not remove this function from the global namespace for the
|
|
session.
|
|
|
|
#>
|
|
function global:deactivate ([switch]$NonDestructive) {
|
|
# Revert to original values
|
|
|
|
# The prior prompt:
|
|
if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
|
|
Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
|
|
Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
|
|
}
|
|
|
|
# The prior PYTHONHOME:
|
|
if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
|
|
Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
|
|
Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
|
|
}
|
|
|
|
# The prior PATH:
|
|
if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
|
|
Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
|
|
Remove-Item -Path Env:_OLD_VIRTUAL_PATH
|
|
}
|
|
|
|
# Just remove the VIRTUAL_ENV altogether:
|
|
if (Test-Path -Path Env:VIRTUAL_ENV) {
|
|
Remove-Item -Path env:VIRTUAL_ENV
|
|
}
|
|
|
|
# Just remove VIRTUAL_ENV_PROMPT altogether.
|
|
if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) {
|
|
Remove-Item -Path env:VIRTUAL_ENV_PROMPT
|
|
}
|
|
|
|
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
|
|
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
|
|
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
|
|
}
|
|
|
|
# Leave deactivate function in the global namespace if requested:
|
|
if (-not $NonDestructive) {
|
|
Remove-Item -Path function:deactivate
|
|
}
|
|
}
|
|
|
|
<#
|
|
.Description
|
|
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
|
|
given folder, and returns them in a map.
|
|
|
|
For each line in the pyvenv.cfg file, if that line can be parsed into exactly
|
|
two strings separated by `=` (with any amount of whitespace surrounding the =)
|
|
then it is considered a `key = value` line. The left hand string is the key,
|
|
the right hand is the value.
|
|
|
|
If the value starts with a `'` or a `"` then the first and last character is
|
|
stripped from the value before being captured.
|
|
|
|
.Parameter ConfigDir
|
|
Path to the directory that contains the `pyvenv.cfg` file.
|
|
#>
|
|
function Get-PyVenvConfig(
|
|
[String]
|
|
$ConfigDir
|
|
) {
|
|
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
|
|
|
|
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
|
|
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
|
|
|
|
# An empty map will be returned if no config file is found.
|
|
$pyvenvConfig = @{ }
|
|
|
|
if ($pyvenvConfigPath) {
|
|
|
|
Write-Verbose "File exists, parse `key = value` lines"
|
|
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
|
|
|
|
$pyvenvConfigContent | ForEach-Object {
|
|
$keyval = $PSItem -split "\s*=\s*", 2
|
|
if ($keyval[0] -and $keyval[1]) {
|
|
$val = $keyval[1]
|
|
|
|
# Remove extraneous quotations around a string value.
|
|
if ("'""".Contains($val.Substring(0, 1))) {
|
|
$val = $val.Substring(1, $val.Length - 2)
|
|
}
|
|
|
|
$pyvenvConfig[$keyval[0]] = $val
|
|
Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
|
|
}
|
|
}
|
|
}
|
|
return $pyvenvConfig
|
|
}
|
|
|
|
|
|
<# Begin Activate script --------------------------------------------------- #>
|
|
|
|
# Determine the containing directory of this script
|
|
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
|
$VenvExecDir = Get-Item -Path $VenvExecPath
|
|
|
|
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
|
|
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
|
|
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
|
|
|
|
# Set values required in priority: CmdLine, ConfigFile, Default
|
|
# First, get the location of the virtual environment, it might not be
|
|
# VenvExecDir if specified on the command line.
|
|
if ($VenvDir) {
|
|
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
|
|
}
|
|
else {
|
|
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
|
|
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
|
|
Write-Verbose "VenvDir=$VenvDir"
|
|
}
|
|
|
|
# Next, read the `pyvenv.cfg` file to determine any required value such
|
|
# as `prompt`.
|
|
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
|
|
|
|
# Next, set the prompt from the command line, or the config file, or
|
|
# just use the name of the virtual environment folder.
|
|
if ($Prompt) {
|
|
Write-Verbose "Prompt specified as argument, using '$Prompt'"
|
|
}
|
|
else {
|
|
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
|
|
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
|
|
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
|
|
$Prompt = $pyvenvCfg['prompt'];
|
|
}
|
|
else {
|
|
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)"
|
|
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
|
|
$Prompt = Split-Path -Path $venvDir -Leaf
|
|
}
|
|
}
|
|
|
|
Write-Verbose "Prompt = '$Prompt'"
|
|
Write-Verbose "VenvDir='$VenvDir'"
|
|
|
|
# Deactivate any currently active virtual environment, but leave the
|
|
# deactivate function in place.
|
|
deactivate -nondestructive
|
|
|
|
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
|
|
# that there is an activated venv.
|
|
$env:VIRTUAL_ENV = $VenvDir
|
|
|
|
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
|
|
|
|
Write-Verbose "Setting prompt to '$Prompt'"
|
|
|
|
# Set the prompt to include the env name
|
|
# Make sure _OLD_VIRTUAL_PROMPT is global
|
|
function global:_OLD_VIRTUAL_PROMPT { "" }
|
|
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
|
|
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
|
|
|
|
function global:prompt {
|
|
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
|
|
_OLD_VIRTUAL_PROMPT
|
|
}
|
|
$env:VIRTUAL_ENV_PROMPT = $Prompt
|
|
}
|
|
|
|
# Clear PYTHONHOME
|
|
if (Test-Path -Path Env:PYTHONHOME) {
|
|
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
|
|
Remove-Item -Path Env:PYTHONHOME
|
|
}
|
|
|
|
# Add the venv to the PATH
|
|
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
|
|
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
|
|
|
|
# SIG # Begin signature block
|
|
# MIIpjwYJKoZIhvcNAQcCoIIpgDCCKXwCAQExDzANBglghkgBZQMEAgEFADB5Bgor
|
|
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
|
|
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBnL745ElCYk8vk
|
|
# dBtMuQhLeWJ3ZGfzKW4DHCYzAn+QB6CCDi8wggawMIIEmKADAgECAhAIrUCyYNKc
|
|
# 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/pQd52MbOoZWeE4wggd3MIIFX6ADAgECAhAHHxQbizANJfMU6yMM0NHdMA0G
|
|
# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
|
|
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
|
|
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjIwMTE3MDAwMDAwWhcNMjUwMTE1
|
|
# MjM1OTU5WjB8MQswCQYDVQQGEwJVUzEPMA0GA1UECBMGT3JlZ29uMRIwEAYDVQQH
|
|
# EwlCZWF2ZXJ0b24xIzAhBgNVBAoTGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9u
|
|
# MSMwIQYDVQQDExpQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjCCAiIwDQYJKoZI
|
|
# hvcNAQEBBQADggIPADCCAgoCggIBAKgc0BTT+iKbtK6f2mr9pNMUTcAJxKdsuOiS
|
|
# YgDFfwhjQy89koM7uP+QV/gwx8MzEt3c9tLJvDccVWQ8H7mVsk/K+X+IufBLCgUi
|
|
# 0GGAZUegEAeRlSXxxhYScr818ma8EvGIZdiSOhqjYc4KnfgfIS4RLtZSrDFG2tN1
|
|
# 6yS8skFa3IHyvWdbD9PvZ4iYNAS4pjYDRjT/9uzPZ4Pan+53xZIcDgjiTwOh8VGu
|
|
# ppxcia6a7xCyKoOAGjvCyQsj5223v1/Ig7Dp9mGI+nh1E3IwmyTIIuVHyK6Lqu35
|
|
# 2diDY+iCMpk9ZanmSjmB+GMVs+H/gOiofjjtf6oz0ki3rb7sQ8fTnonIL9dyGTJ0
|
|
# ZFYKeb6BLA66d2GALwxZhLe5WH4Np9HcyXHACkppsE6ynYjTOd7+jN1PRJahN1oE
|
|
# RzTzEiV6nCO1M3U1HbPTGyq52IMFSBM2/07WTJSbOeXjvYR7aUxK9/ZkJiacl2iZ
|
|
# I7IWe7JKhHohqKuceQNyOzxTakLcRkzynvIrk33R9YVqtB4L6wtFxhUjvDnQg16x
|
|
# ot2KVPdfyPAWd81wtZADmrUtsZ9qG79x1hBdyOl4vUtVPECuyhCxaw+faVjumapP
|
|
# Unwo8ygflJJ74J+BYxf6UuD7m8yzsfXWkdv52DjL74TxzuFTLHPyARWCSCAbzn3Z
|
|
# Ily+qIqDAgMBAAGjggIGMIICAjAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiI
|
|
# ZfROQjAdBgNVHQ4EFgQUt/1Teh2XDuUj2WW3siYWJgkZHA8wDgYDVR0PAQH/BAQD
|
|
# AgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0
|
|
# dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWdu
|
|
# aW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5k
|
|
# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZT
|
|
# SEEzODQyMDIxQ0ExLmNybDA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUF
|
|
# BwIBFhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGH
|
|
# MIGEMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYB
|
|
# BQUHMAKGUGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0
|
|
# ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAwGA1UdEwEB
|
|
# /wQCMAAwDQYJKoZIhvcNAQELBQADggIBABxv4AeV/5ltkELHSC63fXAFYS5tadcW
|
|
# TiNc2rskrNLrfH1Ns0vgSZFoQxYBFKI159E8oQQ1SKbTEubZ/B9kmHPhprHya08+
|
|
# VVzxC88pOEvz68nA82oEM09584aILqYmj8Pj7h/kmZNzuEL7WiwFa/U1hX+XiWfL
|
|
# IJQsAHBla0i7QRF2de8/VSF0XXFa2kBQ6aiTsiLyKPNbaNtbcucaUdn6vVUS5izW
|
|
# OXM95BSkFSKdE45Oq3FForNJXjBvSCpwcP36WklaHL+aHu1upIhCTUkzTHMh8b86
|
|
# WmjRUqbrnvdyR2ydI5l1OqcMBjkpPpIV6wcc+KY/RH2xvVuuoHjlUjwq2bHiNoX+
|
|
# W1scCpnA8YTs2d50jDHUgwUo+ciwpffH0Riq132NFmrH3r67VaN3TuBxjI8SIZM5
|
|
# 8WEDkbeoriDk3hxU8ZWV7b8AW6oyVBGfM06UgkfMb58h+tJPrFx8VI/WLq1dTqMf
|
|
# ZOm5cuclMnUHs2uqrRNtnV8UfidPBL4ZHkTcClQbCoz0UbLhkiDvIS00Dn+BBcxw
|
|
# /TKqVL4Oaz3bkMSsM46LciTeucHY9ExRVt3zy7i149sd+F4QozPqn7FrSVHXmem3
|
|
# r7bjyHTxOgqxRCVa18Vtx7P/8bYSBeS+WHCKcliFCecspusCDSlnRUjZwyPdP0VH
|
|
# xaZg2unjHY3rMYIatjCCGrICAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
|
|
# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29k
|
|
# ZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAHHxQbizANJfMU6yMM
|
|
# 0NHdMA0GCWCGSAFlAwQCAQUAoIHEMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEE
|
|
# MBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBn
|
|
# AZ6P7YvTwq0fbF62o7E75R0LxsW5OtyYiFESQckLhjBYBgorBgEEAYI3AgEMMUow
|
|
# SKBGgEQAQgB1AGkAbAB0ADoAIABSAGUAbABlAGEAcwBlAF8AdgAzAC4AMQAwAC4A
|
|
# NwBfADIAMAAyADIAMAA5ADAANQAuADAAMTANBgkqhkiG9w0BAQEFAASCAgB0gPSc
|
|
# 6sIspVwJh+Cymxnsu7ijHvRyTzmrVD7qWYvH8hx5jmXGOjt0RUHGTFUAYNo3CNul
|
|
# caAO7rAsP877JU/i+CckdqtH0iT6LF2uLlGfXNW7hHHr2ZxERI1pw24R67HKE/vf
|
|
# VnG33FOv8iLwrzZ1kwMvFZDZ0hMutZ1+W73yzREXKR3Eyo8FUSIVm7VqydpSQvNp
|
|
# uK+XEuUclk4UJ04nnQWkOlRHq/IMscoqUMMd9c+Rt6kAYwCT5Q0r8TlASxrzcRT9
|
|
# mq3oin/HSfBMVrvQ+cP6Z4SqAVDFjdEOqmRGqbUycM/KXJBqyR/aipar083OpW5M
|
|
# aYgCsKcM6RzxdKLKZFXsgD+f9sCBO87K8j0mB7zJ8u1Ankr1ZsKM5cJhOrGqSuxd
|
|
# D6sBbFZmgMRw1zRrE7RvwFpbl2pqOTqnNM0aygWpLTw6BT6BmqwHKothsFoUAvU6
|
|
# JCXUm51hhISSaiQH5QU2uzLRhek9KeLJBNUDMDtz2ZTuHOVrwHu6x/DOCPYceFQ+
|
|
# WqbdAvapigTf8QEYVUcAnb5GyrpFadnWwXzravYbht4Ooy+qgkQo3pD5d13rXQH+
|
|
# sNyIiidRC1bGH9LqESRANpzLVeIieR/0h+NT6Am9eShm331nvI3nK70yZFjo1auT
|
|
# 4NtbfZ9+qFNRERTWuZu14ietZ5cvuBn8LQQ22KGCF0Mwghc/BgorBgEEAYI3AwMB
|
|
# MYIXLzCCFysGCSqGSIb3DQEHAqCCFxwwghcYAgEDMQ8wDQYJYIZIAWUDBAIBBQAw
|
|
# dwYLKoZIhvcNAQkQAQSgaARmMGQCAQEGCWCGSAGG/WwHATAxMA0GCWCGSAFlAwQC
|
|
# AQUABCCB/JRH4mUeWdX+VQKL48ZyhRT0MP0P8a59gSuiyyhRpwIQCOalIO1Qocue
|
|
# kO+4D3drKBgPMjAyMjA5MDUxNDE1MjdaoIITDTCCBsYwggSuoAMCAQICEAp6Soie
|
|
# yZlCkAZjOE2Gl50wDQYJKoZIhvcNAQELBQAwYzELMAkGA1UEBhMCVVMxFzAVBgNV
|
|
# BAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0
|
|
# IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTAeFw0yMjAzMjkwMDAwMDBa
|
|
# Fw0zMzAzMTQyMzU5NTlaMEwxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2Vy
|
|
# dCwgSW5jLjEkMCIGA1UEAxMbRGlnaUNlcnQgVGltZXN0YW1wIDIwMjIgLSAyMIIC
|
|
# IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuSqWI6ZcvF/WSfAVghj0M+7M
|
|
# XGzj4CUu0jHkPECu+6vE43hdflw26vUljUOjges4Y/k8iGnePNIwUQ0xB7pGbumj
|
|
# S0joiUF/DbLW+YTxmD4LvwqEEnFsoWImAdPOw2z9rDt+3Cocqb0wxhbY2rzrsvGD
|
|
# 0Z/NCcW5QWpFQiNBWvhg02UsPn5evZan8Pyx9PQoz0J5HzvHkwdoaOVENFJfD1De
|
|
# 1FksRHTAMkcZW+KYLo/Qyj//xmfPPJOVToTpdhiYmREUxSsMoDPbTSSF6IKU4S8D
|
|
# 7n+FAsmG4dUYFLcERfPgOL2ivXpxmOwV5/0u7NKbAIqsHY07gGj+0FmYJs7g7a5/
|
|
# KC7CnuALS8gI0TK7g/ojPNn/0oy790Mj3+fDWgVifnAs5SuyPWPqyK6BIGtDich+
|
|
# X7Aa3Rm9n3RBCq+5jgnTdKEvsFR2wZBPlOyGYf/bES+SAzDOMLeLD11Es0MdI1DN
|
|
# kdcvnfv8zbHBp8QOxO9APhk6AtQxqWmgSfl14ZvoaORqDI/r5LEhe4ZnWH5/H+gr
|
|
# 5BSyFtaBocraMJBr7m91wLA2JrIIO/+9vn9sExjfxm2keUmti39hhwVo99Rw40KV
|
|
# 6J67m0uy4rZBPeevpxooya1hsKBBGBlO7UebYZXtPgthWuo+epiSUc0/yUTngIsp
|
|
# QnL3ebLdhOon7v59emsCAwEAAaOCAYswggGHMA4GA1UdDwEB/wQEAwIHgDAMBgNV
|
|
# HRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMCAGA1UdIAQZMBcwCAYG
|
|
# Z4EMAQQCMAsGCWCGSAGG/WwHATAfBgNVHSMEGDAWgBS6FtltTYUvcyl2mi91jGog
|
|
# j57IbzAdBgNVHQ4EFgQUjWS3iSH+VlhEhGGn6m8cNo/drw0wWgYDVR0fBFMwUTBP
|
|
# oE2gS4ZJaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0
|
|
# UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNybDCBkAYIKwYBBQUHAQEEgYMw
|
|
# gYAwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBYBggrBgEF
|
|
# BQcwAoZMaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3Rl
|
|
# ZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNydDANBgkqhkiG9w0BAQsF
|
|
# AAOCAgEADS0jdKbR9fjqS5k/AeT2DOSvFp3Zs4yXgimcQ28BLas4tXARv4QZiz9d
|
|
# 5YZPvpM63io5WjlO2IRZpbwbmKrobO/RSGkZOFvPiTkdcHDZTt8jImzV3/ZZy6HC
|
|
# 6kx2yqHcoSuWuJtVqRprfdH1AglPgtalc4jEmIDf7kmVt7PMxafuDuHvHjiKn+8R
|
|
# yTFKWLbfOHzL+lz35FO/bgp8ftfemNUpZYkPopzAZfQBImXH6l50pls1klB89Bem
|
|
# h2RPPkaJFmMga8vye9A140pwSKm25x1gvQQiFSVwBnKpRDtpRxHT7unHoD5PELkw
|
|
# NuTzqmkJqIt+ZKJllBH7bjLx9bs4rc3AkxHVMnhKSzcqTPNc3LaFwLtwMFV41pj+
|
|
# VG1/calIGnjdRncuG3rAM4r4SiiMEqhzzy350yPynhngDZQooOvbGlGglYKOKGuk
|
|
# zp123qlzqkhqWUOuX+r4DwZCnd8GaJb+KqB0W2Nm3mssuHiqTXBt8CzxBxV+NbTm
|
|
# tQyimaXXFWs1DoXW4CzM4AwkuHxSCx6ZfO/IyMWMWGmvqz3hz8x9Fa4Uv4px38qX
|
|
# sdhH6hyF4EVOEhwUKVjMb9N/y77BDkpvIJyu2XMyWQjnLZKhGhH+MpimXSuX4IvT
|
|
# nMxttQ2uR2M4RxdbbxPaahBuH0m3RFu0CAqHWlkEdhGhp3cCExwwggauMIIElqAD
|
|
# AgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYT
|
|
# AlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2Vy
|
|
# dC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMjAz
|
|
# MjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQK
|
|
# Ew5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBS
|
|
# U0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3DQEBAQUA
|
|
# A4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbSg9GeTKJtoLDM
|
|
# g/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9/UO0hNoR8XOx
|
|
# s+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXnHwZljZQp09ns
|
|
# ad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0VAshaG43IbtA
|
|
# rF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4fsbVYTXn+149z
|
|
# k6wsOeKlSNbwsDETqVcplicu9Yemj052FVUmcJgmf6AaRyBD40NjgHt1biclkJg6
|
|
# OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0QCirc0PO30qh
|
|
# HGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvvmz3+DrhkKvp1
|
|
# KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T/jnA+bIwpUzX
|
|
# 6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk42PgpuE+9sJ0
|
|
# sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXcheMBK9Rp6103a50g5rmQzSM7TNsQID
|
|
# AQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUuhbZbU2F
|
|
# L3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08w
|
|
# DgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEB
|
|
# BGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsG
|
|
# AQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVz
|
|
# dGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdp
|
|
# Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgG
|
|
# BmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAH1ZjsCTtm+Y
|
|
# qUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxpwc8dB+k+YMjY
|
|
# C+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIlzpVpP0d3+3J0
|
|
# FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQcAp876i8dU+6
|
|
# WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfeKuv2nrF5mYGj
|
|
# VoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+jSbl3ZpHxcpzp
|
|
# SwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJshIUDQtxMkzdwd
|
|
# eDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6OOmc4d0j/R0o
|
|
# 08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDwN7+YAN8gFk8n
|
|
# +2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR81fZvAT6gt4y
|
|
# 3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2VVQrH4D6wPIO
|
|
# K+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv
|
|
# 21DiCEAYWjANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM
|
|
# RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQD
|
|
# ExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcN
|
|
# MzExMTA5MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg
|
|
# SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2Vy
|
|
# dCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
|
|
# AQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf
|
|
# 8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1
|
|
# mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe
|
|
# 7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecx
|
|
# y9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX
|
|
# 2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX
|
|
# 9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp49
|
|
# 3ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCq
|
|
# sWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH
|
|
# dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauG
|
|
# i0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYw
|
|
# DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08w
|
|
# HwYDVR0jBBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGG
|
|
# MHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNl
|
|
# cnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20v
|
|
# RGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0
|
|
# dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5j
|
|
# cmwwEQYDVR0gBAowCDAGBgRVHSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXn
|
|
# OF+go3QbPbYW1/e/Vwe9mqyhhyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23
|
|
# OO/0/4C5+KH38nLeJLxSA8hO0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFI
|
|
# tJnLnU+nBgMTdydE1Od/6Fmo8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7s
|
|
# pNU96LHc/RzY9HdaXFSMb++hUD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgi
|
|
# wbJZ9VVrzyerbHbObyMt9H5xaiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cB
|
|
# qZ9Xql4o4rmUMYIDdjCCA3ICAQEwdzBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
|
|
# RGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNB
|
|
# NDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBAhAKekqInsmZQpAGYzhNhpedMA0G
|
|
# CWCGSAFlAwQCAQUAoIHRMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkq
|
|
# hkiG9w0BCQUxDxcNMjIwOTA1MTQxNTI3WjArBgsqhkiG9w0BCRACDDEcMBowGDAW
|
|
# BBSFCPOGUVyz0wd9trS3wH8bSl5B3jAvBgkqhkiG9w0BCQQxIgQgjJfmk7jHIkNs
|
|
# VONfxUew9xW/Nbw04XbdfKGkwwy4vzYwNwYLKoZIhvcNAQkQAi8xKDAmMCQwIgQg
|
|
# naaQFcNJxsGJeEW6NYKtcMiPpCk722q+nCvSU5J55jswDQYJKoZIhvcNAQEBBQAE
|
|
# ggIAbAYmI9b3CGbOaJ/v+4qpnAXAnH5mrgFLKfMCV1JlWKR1eEbZjrTn9Ndl749P
|
|
# 5rt/ZnnJeMuuC4KYtAd/klVXYcsgzeOgal/OYnUcxxPXxWoCdJQZvNPLPHXCB0ni
|
|
# dVSQ4gMPyFP63kkZrCsfChQyUJIy934VTHJvpziOKSfqYEWQxZSRGpvaA6bArd7v
|
|
# LqDuGiqhaTbMeFLUhuCMh697jGyv5Bjn4DIISURUODpCb7cji9J/IsUbOhlKsNUv
|
|
# +SwU2tNRIaFRA02i1KxNz23Yp+vXwn/DtkQd0+2+eHhz/zQsp9VTrJ8ywV0+XHA2
|
|
# /WnmQ1eb1r09fxv5q+JT63Qo+1JOrf4cYI1h0c/KRAjmKbTAcUjbmndXGu9uKTq9
|
|
# owxbnrug8Ia/td1oXY4D9Cn6GP/TsP0xvramgy6Q2QLnNmI3T1AzBYTTHgOSU3+6
|
|
# io6Gaq+mjh+9diVWXJpsFyLcRghLPG1VlkRiQzYcVygN8NTyVayj+8oJlcZR835F
|
|
# Gg1n1H34inU1ODJKfMNva1xD7tz5+5JAvv2NLshIstsrMX07mKlQipj/tq55X7Gh
|
|
# ST6VsAJ1EwN3hufImE2RKXQhG2OUkTPKoEOhgevxPpPJfyQHYk8ObJP9GhGlo6fq
|
|
# kw5+X1xI4K1MBjZPqWDqC120T4zIfUFKnkI+E4yqlFbK6C0=
|
|
# SIG # End signature block
|