diff --git a/.gitignore b/.gitignore
index 9e84517..f949526 100644
--- a/.gitignore
+++ b/.gitignore
@@ -180,4 +180,8 @@ aimenv/
/lab_2/aimenv
/lab_3/aimenv
-/lab_4/aimenv
\ No newline at end of file
+/lab_4/aimenv
+
+lab_2/aimenv
+lab_3/aimenv
+lab_4/aimenv
\ No newline at end of file
diff --git a/lab_3/aimenv/Scripts/Activate.ps1 b/lab_3/aimenv/Scripts/Activate.ps1
deleted file mode 100644
index 3045241..0000000
--- a/lab_3/aimenv/Scripts/Activate.ps1
+++ /dev/null
@@ -1,502 +0,0 @@
-<#
-.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
-# MIIvIwYJKoZIhvcNAQcCoIIvFDCCLxACAQExDzANBglghkgBZQMEAgEFADB5Bgor
-# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
-# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBnL745ElCYk8vk
-# dBtMuQhLeWJ3ZGfzKW4DHCYzAn+QB6CCE8MwggWQMIIDeKADAgECAhAFmxtXno4h
-# 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
-# eE4wggd3MIIFX6ADAgECAhAHHxQbizANJfMU6yMM0NHdMA0GCSqGSIb3DQEBCwUA
-# MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE
-# AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz
-# ODQgMjAyMSBDQTEwHhcNMjIwMTE3MDAwMDAwWhcNMjUwMTE1MjM1OTU5WjB8MQsw
-# CQYDVQQGEwJVUzEPMA0GA1UECBMGT3JlZ29uMRIwEAYDVQQHEwlCZWF2ZXJ0b24x
-# IzAhBgNVBAoTGlB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uMSMwIQYDVQQDExpQ
-# eXRob24gU29mdHdhcmUgRm91bmRhdGlvbjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
-# ADCCAgoCggIBAKgc0BTT+iKbtK6f2mr9pNMUTcAJxKdsuOiSYgDFfwhjQy89koM7
-# uP+QV/gwx8MzEt3c9tLJvDccVWQ8H7mVsk/K+X+IufBLCgUi0GGAZUegEAeRlSXx
-# xhYScr818ma8EvGIZdiSOhqjYc4KnfgfIS4RLtZSrDFG2tN16yS8skFa3IHyvWdb
-# D9PvZ4iYNAS4pjYDRjT/9uzPZ4Pan+53xZIcDgjiTwOh8VGuppxcia6a7xCyKoOA
-# GjvCyQsj5223v1/Ig7Dp9mGI+nh1E3IwmyTIIuVHyK6Lqu352diDY+iCMpk9Zanm
-# SjmB+GMVs+H/gOiofjjtf6oz0ki3rb7sQ8fTnonIL9dyGTJ0ZFYKeb6BLA66d2GA
-# LwxZhLe5WH4Np9HcyXHACkppsE6ynYjTOd7+jN1PRJahN1oERzTzEiV6nCO1M3U1
-# HbPTGyq52IMFSBM2/07WTJSbOeXjvYR7aUxK9/ZkJiacl2iZI7IWe7JKhHohqKuc
-# eQNyOzxTakLcRkzynvIrk33R9YVqtB4L6wtFxhUjvDnQg16xot2KVPdfyPAWd81w
-# tZADmrUtsZ9qG79x1hBdyOl4vUtVPECuyhCxaw+faVjumapPUnwo8ygflJJ74J+B
-# Yxf6UuD7m8yzsfXWkdv52DjL74TxzuFTLHPyARWCSCAbzn3ZIly+qIqDAgMBAAGj
-# ggIGMIICAjAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiIZfROQjAdBgNVHQ4E
-# FgQUt/1Teh2XDuUj2WW3siYWJgkZHA8wDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQM
-# MAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0dHA6Ly9jcmwzLmRp
-# Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNI
-# QTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5kaWdpY2VydC5jb20v
-# RGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0Ex
-# LmNybDA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUFBwIBFhtodHRwOi8v
-# d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUF
-# BzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6
-# Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWdu
-# aW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZI
-# hvcNAQELBQADggIBABxv4AeV/5ltkELHSC63fXAFYS5tadcWTiNc2rskrNLrfH1N
-# s0vgSZFoQxYBFKI159E8oQQ1SKbTEubZ/B9kmHPhprHya08+VVzxC88pOEvz68nA
-# 82oEM09584aILqYmj8Pj7h/kmZNzuEL7WiwFa/U1hX+XiWfLIJQsAHBla0i7QRF2
-# de8/VSF0XXFa2kBQ6aiTsiLyKPNbaNtbcucaUdn6vVUS5izWOXM95BSkFSKdE45O
-# q3FForNJXjBvSCpwcP36WklaHL+aHu1upIhCTUkzTHMh8b86WmjRUqbrnvdyR2yd
-# I5l1OqcMBjkpPpIV6wcc+KY/RH2xvVuuoHjlUjwq2bHiNoX+W1scCpnA8YTs2d50
-# jDHUgwUo+ciwpffH0Riq132NFmrH3r67VaN3TuBxjI8SIZM58WEDkbeoriDk3hxU
-# 8ZWV7b8AW6oyVBGfM06UgkfMb58h+tJPrFx8VI/WLq1dTqMfZOm5cuclMnUHs2uq
-# rRNtnV8UfidPBL4ZHkTcClQbCoz0UbLhkiDvIS00Dn+BBcxw/TKqVL4Oaz3bkMSs
-# M46LciTeucHY9ExRVt3zy7i149sd+F4QozPqn7FrSVHXmem3r7bjyHTxOgqxRCVa
-# 18Vtx7P/8bYSBeS+WHCKcliFCecspusCDSlnRUjZwyPdP0VHxaZg2unjHY3rMYIa
-# tjCCGrICAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu
-# Yy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJT
-# QTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAHHxQbizANJfMU6yMM0NHdMA0GCWCGSAFl
-# AwQCAQUAoIHIMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcC
-# AQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBnAZ6P7YvTwq0fbF62
-# o7E75R0LxsW5OtyYiFESQckLhjBcBgorBgEEAYI3AgEMMU4wTKBGgEQAQgB1AGkA
-# bAB0ADoAIABSAGUAbABlAGEAcwBlAF8AdgAzAC4AMQAyAC4ANQBfADIAMAAyADQA
-# MAA4ADAANgAuADAAMaECgAAwDQYJKoZIhvcNAQEBBQAEggIAoXbLeBCFQhwr4rTK
-# R0WSySG7AtpuY1n5vhwkJPE0JgQ11PFJYphroU2ouWWM8ifejqa6m21JEWGjC9En
-# Rpzpe1+eps7ClsdO+y5NxZc/3vD1j7IddJdzZh77QqDFMqJEeDNY+00OxxnnhbN1
-# wJk29w8qRyIJ7HpCM0E5b8R8Atooip5ihAgrdrIsyyA3Mnl5Y+YMdqtQYe4QtOhE
-# QcEoxAMoI5nLSGsbLhEM8CArl36EmX31eHTVMRJMaM98p0DkURHL030ALmW2V70h
-# M7ovmhOezFyndR1d3HtcfwRB3nr5vHWZe6ythZ3wVgpsN++RdDOvHjb9LC9lkth/
-# BGbcmVqsA9ZHnub1iPt89GsQBSiXjaOnWUxgJi0Qd3s2pwswLxHp05QDUE/d8EF7
-# Wy6aNPI43+G2BjPLVeM3iVbMWd/yxhH6pddaVPAMKVvxJoJ7PfDLihMNyonHt0on
-# xuaM5r2KaVMWpHIkgLiB9tyvdIQb0IW+YU05VAnOqh7CDaEtP7jM6P0usxY9ufEC
-# BFZnOGb3M/c4KbcOuHOIkY3jGqw+DLZFrcWiIe2wbi2TsXDixs+pz8vm/KQczrQ2
-# RJ1R8jrbK7IIRyZmTYf+dStZG3NhNQn1xcPYraHKNOm9CzNmeXJTdfAe0BEApqUN
-# 9AiLj6uvSEp278ysr/EE3ayw2Qmhghc/MIIXOwYKKwYBBAGCNwMDATGCFyswghcn
-# BgkqhkiG9w0BBwKgghcYMIIXFAIBAzEPMA0GCWCGSAFlAwQCAQUAMHcGCyqGSIb3
-# DQEJEAEEoGgEZjBkAgEBBglghkgBhv1sBwEwMTANBglghkgBZQMEAgEFAAQgpuSq
-# fyINa45wSs5Sa6msoQk+zCLDcSK24OqaBM/0/2cCEFtb0VJATq3jxU9l7ewmqjcY
-# DzIwMjQwODA2MjEwMDM5WqCCEwkwggbCMIIEqqADAgECAhAFRK/zlJ0IOaa/2z9f
-# 5WEWMA0GCSqGSIb3DQEBCwUAMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdp
-# Q2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2
-# IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwHhcNMjMwNzE0MDAwMDAwWhcNMzQxMDEz
-# MjM1OTU5WjBIMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4x
-# IDAeBgNVBAMTF0RpZ2lDZXJ0IFRpbWVzdGFtcCAyMDIzMIICIjANBgkqhkiG9w0B
-# AQEFAAOCAg8AMIICCgKCAgEAo1NFhx2DjlusPlSzI+DPn9fl0uddoQ4J3C9Io5d6
-# OyqcZ9xiFVjBqZMRp82qsmrdECmKHmJjadNYnDVxvzqX65RQjxwg6seaOy+WZuNp
-# 52n+W8PWKyAcwZeUtKVQgfLPywemMGjKg0La/H8JJJSkghraarrYO8pd3hkYhftF
-# 6g1hbJ3+cV7EBpo88MUueQ8bZlLjyNY+X9pD04T10Mf2SC1eRXWWdf7dEKEbg8G4
-# 5lKVtUfXeCk5a+B4WZfjRCtK1ZXO7wgX6oJkTf8j48qG7rSkIWRw69XloNpjsy7p
-# Be6q9iT1HbybHLK3X9/w7nZ9MZllR1WdSiQvrCuXvp/k/XtzPjLuUjT71Lvr1KAs
-# NJvj3m5kGQc3AZEPHLVRzapMZoOIaGK7vEEbeBlt5NkP4FhB+9ixLOFRr7StFQYU
-# 6mIIE9NpHnxkTZ0P387RXoyqq1AVybPKvNfEO2hEo6U7Qv1zfe7dCv95NBB+plwK
-# WEwAPoVpdceDZNZ1zY8SdlalJPrXxGshuugfNJgvOuprAbD3+yqG7HtSOKmYCaFx
-# smxxrz64b5bV4RAT/mFHCoz+8LbH1cfebCTwv0KCyqBxPZySkwS0aXAnDU+3tTbR
-# yV8IpHCj7ArxES5k4MsiK8rxKBMhSVF+BmbTO77665E42FEHypS34lCh8zrTioPL
-# QHsCAwEAAaOCAYswggGHMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYG
-# A1UdJQEB/wQMMAoGCCsGAQUFBwMIMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCG
-# SAGG/WwHATAfBgNVHSMEGDAWgBS6FtltTYUvcyl2mi91jGogj57IbzAdBgNVHQ4E
-# FgQUpbbvE+fvzdBkodVWqWUxo97V40kwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDov
-# L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1
-# NlRpbWVTdGFtcGluZ0NBLmNybDCBkAYIKwYBBQUHAQEEgYMwgYAwJAYIKwYBBQUH
-# MAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBYBggrBgEFBQcwAoZMaHR0cDov
-# L2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNI
-# QTI1NlRpbWVTdGFtcGluZ0NBLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAgRrW3qCp
-# tZgXvHCNT4o8aJzYJf/LLOTN6l0ikuyMIgKpuM+AqNnn48XtJoKKcS8Y3U623mzX
-# 4WCcK+3tPUiOuGu6fF29wmE3aEl3o+uQqhLXJ4Xzjh6S2sJAOJ9dyKAuJXglnSoF
-# eoQpmLZXeY/bJlYrsPOnvTcM2Jh2T1a5UsK2nTipgedtQVyMadG5K8TGe8+c+nji
-# kxp2oml101DkRBK+IA2eqUTQ+OVJdwhaIcW0z5iVGlS6ubzBaRm6zxbygzc0brBB
-# Jt3eWpdPM43UjXd9dUWhpVgmagNF3tlQtVCMr1a9TMXhRsUo063nQwBw3syYnhmJ
-# A+rUkTfvTVLzyWAhxFZH7doRS4wyw4jmWOK22z75X7BC1o/jF5HRqsBV44a/rCcs
-# QdCaM0qoNtS5cpZ+l3k4SF/Kwtw9Mt911jZnWon49qfH5U81PAC9vpwqbHkB3NpE
-# 5jreODsHXjlY9HxzMVWggBHLFAx+rrz+pOt5Zapo1iLKO+uagjVXKBbLafIymrLS
-# 2Dq4sUaGa7oX/cR3bBVsrquvczroSUa31X/MtjjA2Owc9bahuEMs305MfR5ocMB3
-# CtQC4Fxguyj/OOVSWtasFyIjTvTs0xf7UGv/B3cfcZdEQcm4RtNsMnxYL2dHZeUb
-# c7aZ+WssBkbvQR7w8F/g29mtkIBEr4AQQYowggauMIIElqADAgECAhAHNje3JFR8
-# 2Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
-# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
-# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0z
-# NzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
-# SW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1
-# NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-# AQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI
-# 82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9
-# xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ
-# 3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5Emfv
-# DqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDET
-# qVcplicu9Yemj052FVUmcJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHe
-# IhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jo
-# n7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ
-# 9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/T
-# Xkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJg
-# o1gJASgADoRU7s7pXcheMBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkw
-# EgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+e
-# yG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQD
-# AgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEF
-# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRw
-# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNy
-# dDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGln
-# aUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglg
-# hkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGw
-# GC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0
-# MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1D
-# X+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw
-# 1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY
-# +/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0I
-# SQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr
-# 5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7y
-# Rp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDop
-# hrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/
-# AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMO
-# Hds3OBqhK/bt1nz8MIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkq
-# hkiG9w0BAQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j
-# MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBB
-# c3N1cmVkIElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5
-# WjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
-# ExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJv
-# b3QgRzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1K
-# PDAiMGkz7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2r
-# snnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C
-# 8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBf
-# sXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY
-# QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8
-# rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaY
-# dj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+
-# wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw
-# ++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+N
-# P8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7F
-# wI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUw
-# AwEB/zAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAU
-# Reuir/SSy4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEB
-# BG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsG
-# AQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1
-# cmVkSURSb290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRp
-# Z2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAow
-# CDAGBgRVHSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/
-# Vwe9mqyhhyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLe
-# JLxSA8hO0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE
-# 1Od/6Fmo8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9Hda
-# XFSMb++hUD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbO
-# byMt9H5xaiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMYID
-# djCCA3ICAQEwdzBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu
-# Yy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYg
-# VGltZVN0YW1waW5nIENBAhAFRK/zlJ0IOaa/2z9f5WEWMA0GCWCGSAFlAwQCAQUA
-# oIHRMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcN
-# MjQwODA2MjEwMDM5WjArBgsqhkiG9w0BCRACDDEcMBowGDAWBBRm8CsywsLJD4Jd
-# zqqKycZPGZzPQDAvBgkqhkiG9w0BCQQxIgQglCIBxGudJQwqEBh+XAoT3nqSoAuS
-# uMjmJTX95zFjdk0wNwYLKoZIhvcNAQkQAi8xKDAmMCQwIgQg0vbkbe10IszR1EBX
-# aEE2b4KK2lWarjMWr00amtQMeCgwDQYJKoZIhvcNAQEBBQAEggIAOkILAZviyFOU
-# Qzt10RYNFHl0zO4rgXcR5oCeJlU1n9y+DwjCTvcrax9qdkEuiEJWDewXbak3TPQK
-# 0ts7jhUIFMDTEn8GZXysruzDlYNLstKM4RbYIK+f2772phehvABS5mn70+L63GXe
-# A5UFYM5M7BAvEY+3DKEwUnN9lAl8YKi1xS545MXYm1B96gI/7oEBDkNV2DoNIZAw
-# R2B4wPTcpI2aG5zZ0jFgVtq8bOXLZ9b9pBrhKbf4PZWxPqAFwUtZryQKdt770u3Y
-# l0WR2SgemKq4aOEvajD1J4fC56lnUoekXt4yH8/fBueCXYx+ADoEkU4/ota7C1oL
-# aCZE4G0iQOH9XFtMUjA87oEPisJG63onir6tsurTjjm/wK8VnFQBSii4ILtfSOfR
-# kDMsu7kS0H5SWliY3sPlDTn4Kwl14EThMmyXUr7SFFHnsibHtfLATTmV6XyeJ03l
-# BmwDl8hdzt5G0pjH/u3bTFcdJu7J0RQuGYgpmNsVYjHCQnZDrJjzIE2os/QYgL6D
-# B/ZYSv96jnYs6cFd93R0ixZMsQPQKcs2gbVYz3nymJL7t605LzW86tENmORsUdgm
-# qh0ky+qe/+D/f88WLLjdHi/xfskiFKEL66Y4EWkECoUUMBRcJlIg1GszTCVmwD1N
-# foIJo8CaFGMoR+QHwDeamNbOOlrCFMQ=
-# SIG # End signature block
diff --git a/lab_3/aimenv/Scripts/activate b/lab_3/aimenv/Scripts/activate
deleted file mode 100644
index 8cf30bf..0000000
--- a/lab_3/aimenv/Scripts/activate
+++ /dev/null
@@ -1,70 +0,0 @@
-# This file must be used with "source bin/activate" *from bash*
-# You cannot run it directly
-
-deactivate () {
- # reset old environment variables
- if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
- PATH="${_OLD_VIRTUAL_PATH:-}"
- export PATH
- unset _OLD_VIRTUAL_PATH
- fi
- if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
- PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
- export PYTHONHOME
- unset _OLD_VIRTUAL_PYTHONHOME
- fi
-
- # Call hash to forget past commands. Without forgetting
- # past commands the $PATH changes we made may not be respected
- hash -r 2> /dev/null
-
- if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
- PS1="${_OLD_VIRTUAL_PS1:-}"
- export PS1
- unset _OLD_VIRTUAL_PS1
- fi
-
- unset VIRTUAL_ENV
- unset VIRTUAL_ENV_PROMPT
- if [ ! "${1:-}" = "nondestructive" ] ; then
- # Self destruct!
- unset -f deactivate
- fi
-}
-
-# unset irrelevant variables
-deactivate nondestructive
-
-# on Windows, a path can contain colons and backslashes and has to be converted:
-if [ "${OSTYPE:-}" = "cygwin" ] || [ "${OSTYPE:-}" = "msys" ] ; then
- # transform D:\path\to\venv to /d/path/to/venv on MSYS
- # and to /cygdrive/d/path/to/venv on Cygwin
- export VIRTUAL_ENV=$(cygpath "C:\Users\Egor\Desktop\ULSTU\AI\aim\aimenv")
-else
- # use the path as-is
- export VIRTUAL_ENV="C:\Users\Egor\Desktop\ULSTU\AI\aim\aimenv"
-fi
-
-_OLD_VIRTUAL_PATH="$PATH"
-PATH="$VIRTUAL_ENV/Scripts:$PATH"
-export PATH
-
-# unset PYTHONHOME if set
-# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
-# could use `if (set -u; : $PYTHONHOME) ;` in bash
-if [ -n "${PYTHONHOME:-}" ] ; then
- _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
- unset PYTHONHOME
-fi
-
-if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
- _OLD_VIRTUAL_PS1="${PS1:-}"
- PS1="(aimenv) ${PS1:-}"
- export PS1
- VIRTUAL_ENV_PROMPT="(aimenv) "
- export VIRTUAL_ENV_PROMPT
-fi
-
-# Call hash to forget past commands. Without forgetting
-# past commands the $PATH changes we made may not be respected
-hash -r 2> /dev/null
diff --git a/lab_3/aimenv/Scripts/activate.bat b/lab_3/aimenv/Scripts/activate.bat
deleted file mode 100644
index 11bc012..0000000
--- a/lab_3/aimenv/Scripts/activate.bat
+++ /dev/null
@@ -1,34 +0,0 @@
-@echo off
-
-rem This file is UTF-8 encoded, so we need to update the current code page while executing it
-for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do (
- set _OLD_CODEPAGE=%%a
-)
-if defined _OLD_CODEPAGE (
- "%SystemRoot%\System32\chcp.com" 65001 > nul
-)
-
-set VIRTUAL_ENV=C:\Users\Egor\Desktop\ULSTU\AI\aim\aimenv
-
-if not defined PROMPT set PROMPT=$P$G
-
-if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT%
-if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%
-
-set _OLD_VIRTUAL_PROMPT=%PROMPT%
-set PROMPT=(aimenv) %PROMPT%
-
-if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%
-set PYTHONHOME=
-
-if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%
-if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH%
-
-set PATH=%VIRTUAL_ENV%\Scripts;%PATH%
-set VIRTUAL_ENV_PROMPT=(aimenv)
-
-:END
-if defined _OLD_CODEPAGE (
- "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul
- set _OLD_CODEPAGE=
-)
diff --git a/lab_3/aimenv/Scripts/deactivate.bat b/lab_3/aimenv/Scripts/deactivate.bat
deleted file mode 100644
index 62a39a7..0000000
--- a/lab_3/aimenv/Scripts/deactivate.bat
+++ /dev/null
@@ -1,22 +0,0 @@
-@echo off
-
-if defined _OLD_VIRTUAL_PROMPT (
- set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
-)
-set _OLD_VIRTUAL_PROMPT=
-
-if defined _OLD_VIRTUAL_PYTHONHOME (
- set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%"
- set _OLD_VIRTUAL_PYTHONHOME=
-)
-
-if defined _OLD_VIRTUAL_PATH (
- set "PATH=%_OLD_VIRTUAL_PATH%"
-)
-
-set _OLD_VIRTUAL_PATH=
-
-set VIRTUAL_ENV=
-set VIRTUAL_ENV_PROMPT=
-
-:END
diff --git a/lab_3/aimenv/Scripts/debugpy.exe b/lab_3/aimenv/Scripts/debugpy.exe
deleted file mode 100644
index 6d0e480..0000000
Binary files a/lab_3/aimenv/Scripts/debugpy.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/ipython.exe b/lab_3/aimenv/Scripts/ipython.exe
deleted file mode 100644
index c5d0b33..0000000
Binary files a/lab_3/aimenv/Scripts/ipython.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/ipython3.exe b/lab_3/aimenv/Scripts/ipython3.exe
deleted file mode 100644
index c5d0b33..0000000
Binary files a/lab_3/aimenv/Scripts/ipython3.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/jupyter-kernel.exe b/lab_3/aimenv/Scripts/jupyter-kernel.exe
deleted file mode 100644
index cc1b7f4..0000000
Binary files a/lab_3/aimenv/Scripts/jupyter-kernel.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/jupyter-kernelspec.exe b/lab_3/aimenv/Scripts/jupyter-kernelspec.exe
deleted file mode 100644
index 72bf4e7..0000000
Binary files a/lab_3/aimenv/Scripts/jupyter-kernelspec.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/jupyter-migrate.exe b/lab_3/aimenv/Scripts/jupyter-migrate.exe
deleted file mode 100644
index 2033e15..0000000
Binary files a/lab_3/aimenv/Scripts/jupyter-migrate.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/jupyter-run.exe b/lab_3/aimenv/Scripts/jupyter-run.exe
deleted file mode 100644
index 1d34b22..0000000
Binary files a/lab_3/aimenv/Scripts/jupyter-run.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/jupyter-troubleshoot.exe b/lab_3/aimenv/Scripts/jupyter-troubleshoot.exe
deleted file mode 100644
index de9c4d6..0000000
Binary files a/lab_3/aimenv/Scripts/jupyter-troubleshoot.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/jupyter.exe b/lab_3/aimenv/Scripts/jupyter.exe
deleted file mode 100644
index 77e316a..0000000
Binary files a/lab_3/aimenv/Scripts/jupyter.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/pip.exe b/lab_3/aimenv/Scripts/pip.exe
deleted file mode 100644
index e378251..0000000
Binary files a/lab_3/aimenv/Scripts/pip.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/pip3.12.exe b/lab_3/aimenv/Scripts/pip3.12.exe
deleted file mode 100644
index e378251..0000000
Binary files a/lab_3/aimenv/Scripts/pip3.12.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/pip3.exe b/lab_3/aimenv/Scripts/pip3.exe
deleted file mode 100644
index e378251..0000000
Binary files a/lab_3/aimenv/Scripts/pip3.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/pygmentize.exe b/lab_3/aimenv/Scripts/pygmentize.exe
deleted file mode 100644
index 9c1459b..0000000
Binary files a/lab_3/aimenv/Scripts/pygmentize.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/python.exe b/lab_3/aimenv/Scripts/python.exe
deleted file mode 100644
index b58faef..0000000
Binary files a/lab_3/aimenv/Scripts/python.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/pythonw.exe b/lab_3/aimenv/Scripts/pythonw.exe
deleted file mode 100644
index ca33b90..0000000
Binary files a/lab_3/aimenv/Scripts/pythonw.exe and /dev/null differ
diff --git a/lab_3/aimenv/Scripts/pywin32_postinstall.py b/lab_3/aimenv/Scripts/pywin32_postinstall.py
deleted file mode 100644
index 147f0cd..0000000
--- a/lab_3/aimenv/Scripts/pywin32_postinstall.py
+++ /dev/null
@@ -1,783 +0,0 @@
-# postinstall script for pywin32
-#
-# copies PyWinTypesxx.dll and PythonCOMxx.dll into the system directory,
-# and creates a pth file
-import glob
-import os
-import shutil
-import sys
-import sysconfig
-
-try:
- import winreg as winreg
-except:
- import winreg
-
-# Send output somewhere so it can be found if necessary...
-import tempfile
-
-tee_f = open(os.path.join(tempfile.gettempdir(), "pywin32_postinstall.log"), "w")
-
-
-class Tee:
- def __init__(self, file):
- self.f = file
-
- def write(self, what):
- if self.f is not None:
- try:
- self.f.write(what.replace("\n", "\r\n"))
- except IOError:
- pass
- tee_f.write(what)
-
- def flush(self):
- if self.f is not None:
- try:
- self.f.flush()
- except IOError:
- pass
- tee_f.flush()
-
-
-# For some unknown reason, when running under bdist_wininst we will start up
-# with sys.stdout as None but stderr is hooked up. This work-around allows
-# bdist_wininst to see the output we write and display it at the end of
-# the install.
-if sys.stdout is None:
- sys.stdout = sys.stderr
-
-sys.stderr = Tee(sys.stderr)
-sys.stdout = Tee(sys.stdout)
-
-com_modules = [
- # module_name, class_names
- ("win32com.servers.interp", "Interpreter"),
- ("win32com.servers.dictionary", "DictionaryPolicy"),
- ("win32com.axscript.client.pyscript", "PyScript"),
-]
-
-# Is this a 'silent' install - ie, avoid all dialogs.
-# Different than 'verbose'
-silent = 0
-
-# Verbosity of output messages.
-verbose = 1
-
-root_key_name = "Software\\Python\\PythonCore\\" + sys.winver
-
-try:
- # When this script is run from inside the bdist_wininst installer,
- # file_created() and directory_created() are additional builtin
- # functions which write lines to Python23\pywin32-install.log. This is
- # a list of actions for the uninstaller, the format is inspired by what
- # the Wise installer also creates.
- file_created
- is_bdist_wininst = True
-except NameError:
- is_bdist_wininst = False # we know what it is not - but not what it is :)
-
- def file_created(file):
- pass
-
- def directory_created(directory):
- pass
-
- def get_root_hkey():
- try:
- winreg.OpenKey(
- winreg.HKEY_LOCAL_MACHINE, root_key_name, 0, winreg.KEY_CREATE_SUB_KEY
- )
- return winreg.HKEY_LOCAL_MACHINE
- except OSError:
- # Either not exist, or no permissions to create subkey means
- # must be HKCU
- return winreg.HKEY_CURRENT_USER
-
-
-try:
- create_shortcut
-except NameError:
- # Create a function with the same signature as create_shortcut provided
- # by bdist_wininst
- def create_shortcut(
- path, description, filename, arguments="", workdir="", iconpath="", iconindex=0
- ):
- import pythoncom
- from win32com.shell import shell
-
- ilink = pythoncom.CoCreateInstance(
- shell.CLSID_ShellLink,
- None,
- pythoncom.CLSCTX_INPROC_SERVER,
- shell.IID_IShellLink,
- )
- ilink.SetPath(path)
- ilink.SetDescription(description)
- if arguments:
- ilink.SetArguments(arguments)
- if workdir:
- ilink.SetWorkingDirectory(workdir)
- if iconpath or iconindex:
- ilink.SetIconLocation(iconpath, iconindex)
- # now save it.
- ipf = ilink.QueryInterface(pythoncom.IID_IPersistFile)
- ipf.Save(filename, 0)
-
- # Support the same list of "path names" as bdist_wininst.
- def get_special_folder_path(path_name):
- from win32com.shell import shell, shellcon
-
- for maybe in """
- CSIDL_COMMON_STARTMENU CSIDL_STARTMENU CSIDL_COMMON_APPDATA
- CSIDL_LOCAL_APPDATA CSIDL_APPDATA CSIDL_COMMON_DESKTOPDIRECTORY
- CSIDL_DESKTOPDIRECTORY CSIDL_COMMON_STARTUP CSIDL_STARTUP
- CSIDL_COMMON_PROGRAMS CSIDL_PROGRAMS CSIDL_PROGRAM_FILES_COMMON
- CSIDL_PROGRAM_FILES CSIDL_FONTS""".split():
- if maybe == path_name:
- csidl = getattr(shellcon, maybe)
- return shell.SHGetSpecialFolderPath(0, csidl, False)
- raise ValueError("%s is an unknown path ID" % (path_name,))
-
-
-def CopyTo(desc, src, dest):
- import win32api
- import win32con
-
- while 1:
- try:
- win32api.CopyFile(src, dest, 0)
- return
- except win32api.error as details:
- if details.winerror == 5: # access denied - user not admin.
- raise
- if silent:
- # Running silent mode - just re-raise the error.
- raise
- full_desc = (
- "Error %s\n\n"
- "If you have any Python applications running, "
- "please close them now\nand select 'Retry'\n\n%s"
- % (desc, details.strerror)
- )
- rc = win32api.MessageBox(
- 0, full_desc, "Installation Error", win32con.MB_ABORTRETRYIGNORE
- )
- if rc == win32con.IDABORT:
- raise
- elif rc == win32con.IDIGNORE:
- return
- # else retry - around we go again.
-
-
-# We need to import win32api to determine the Windows system directory,
-# so we can copy our system files there - but importing win32api will
-# load the pywintypes.dll already in the system directory preventing us
-# from updating them!
-# So, we pull the same trick pywintypes.py does, but it loads from
-# our pywintypes_system32 directory.
-def LoadSystemModule(lib_dir, modname):
- # See if this is a debug build.
- import importlib.machinery
- import importlib.util
-
- suffix = "_d" if "_d.pyd" in importlib.machinery.EXTENSION_SUFFIXES else ""
- filename = "%s%d%d%s.dll" % (
- modname,
- sys.version_info[0],
- sys.version_info[1],
- suffix,
- )
- filename = os.path.join(lib_dir, "pywin32_system32", filename)
- loader = importlib.machinery.ExtensionFileLoader(modname, filename)
- spec = importlib.machinery.ModuleSpec(name=modname, loader=loader, origin=filename)
- mod = importlib.util.module_from_spec(spec)
- spec.loader.exec_module(mod)
-
-
-def SetPyKeyVal(key_name, value_name, value):
- root_hkey = get_root_hkey()
- root_key = winreg.OpenKey(root_hkey, root_key_name)
- try:
- my_key = winreg.CreateKey(root_key, key_name)
- try:
- winreg.SetValueEx(my_key, value_name, 0, winreg.REG_SZ, value)
- if verbose:
- print("-> %s\\%s[%s]=%r" % (root_key_name, key_name, value_name, value))
- finally:
- my_key.Close()
- finally:
- root_key.Close()
-
-
-def UnsetPyKeyVal(key_name, value_name, delete_key=False):
- root_hkey = get_root_hkey()
- root_key = winreg.OpenKey(root_hkey, root_key_name)
- try:
- my_key = winreg.OpenKey(root_key, key_name, 0, winreg.KEY_SET_VALUE)
- try:
- winreg.DeleteValue(my_key, value_name)
- if verbose:
- print("-> DELETE %s\\%s[%s]" % (root_key_name, key_name, value_name))
- finally:
- my_key.Close()
- if delete_key:
- winreg.DeleteKey(root_key, key_name)
- if verbose:
- print("-> DELETE %s\\%s" % (root_key_name, key_name))
- except OSError as why:
- winerror = getattr(why, "winerror", why.errno)
- if winerror != 2: # file not found
- raise
- finally:
- root_key.Close()
-
-
-def RegisterCOMObjects(register=True):
- import win32com.server.register
-
- if register:
- func = win32com.server.register.RegisterClasses
- else:
- func = win32com.server.register.UnregisterClasses
- flags = {}
- if not verbose:
- flags["quiet"] = 1
- for module, klass_name in com_modules:
- __import__(module)
- mod = sys.modules[module]
- flags["finalize_register"] = getattr(mod, "DllRegisterServer", None)
- flags["finalize_unregister"] = getattr(mod, "DllUnregisterServer", None)
- klass = getattr(mod, klass_name)
- func(klass, **flags)
-
-
-def RegisterHelpFile(register=True, lib_dir=None):
- if lib_dir is None:
- lib_dir = sysconfig.get_paths()["platlib"]
- if register:
- # Register the .chm help file.
- chm_file = os.path.join(lib_dir, "PyWin32.chm")
- if os.path.isfile(chm_file):
- # This isn't recursive, so if 'Help' doesn't exist, we croak
- SetPyKeyVal("Help", None, None)
- SetPyKeyVal("Help\\Pythonwin Reference", None, chm_file)
- return chm_file
- else:
- print("NOTE: PyWin32.chm can not be located, so has not " "been registered")
- else:
- UnsetPyKeyVal("Help\\Pythonwin Reference", None, delete_key=True)
- return None
-
-
-def RegisterPythonwin(register=True, lib_dir=None):
- """Add (or remove) Pythonwin to context menu for python scripts.
- ??? Should probably also add Edit command for pys files also.
- Also need to remove these keys on uninstall, but there's no function
- like file_created to add registry entries to uninstall log ???
- """
- import os
-
- if lib_dir is None:
- lib_dir = sysconfig.get_paths()["platlib"]
- classes_root = get_root_hkey()
- ## Installer executable doesn't seem to pass anything to postinstall script indicating if it's a debug build,
- pythonwin_exe = os.path.join(lib_dir, "Pythonwin", "Pythonwin.exe")
- pythonwin_edit_command = pythonwin_exe + ' -edit "%1"'
-
- keys_vals = [
- (
- "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Pythonwin.exe",
- "",
- pythonwin_exe,
- ),
- (
- "Software\\Classes\\Python.File\\shell\\Edit with Pythonwin",
- "command",
- pythonwin_edit_command,
- ),
- (
- "Software\\Classes\\Python.NoConFile\\shell\\Edit with Pythonwin",
- "command",
- pythonwin_edit_command,
- ),
- ]
-
- try:
- if register:
- for key, sub_key, val in keys_vals:
- ## Since winreg only uses the character Api functions, this can fail if Python
- ## is installed to a path containing non-ascii characters
- hkey = winreg.CreateKey(classes_root, key)
- if sub_key:
- hkey = winreg.CreateKey(hkey, sub_key)
- winreg.SetValueEx(hkey, None, 0, winreg.REG_SZ, val)
- hkey.Close()
- else:
- for key, sub_key, val in keys_vals:
- try:
- if sub_key:
- hkey = winreg.OpenKey(classes_root, key)
- winreg.DeleteKey(hkey, sub_key)
- hkey.Close()
- winreg.DeleteKey(classes_root, key)
- except OSError as why:
- winerror = getattr(why, "winerror", why.errno)
- if winerror != 2: # file not found
- raise
- finally:
- # tell windows about the change
- from win32com.shell import shell, shellcon
-
- shell.SHChangeNotify(
- shellcon.SHCNE_ASSOCCHANGED, shellcon.SHCNF_IDLIST, None, None
- )
-
-
-def get_shortcuts_folder():
- if get_root_hkey() == winreg.HKEY_LOCAL_MACHINE:
- try:
- fldr = get_special_folder_path("CSIDL_COMMON_PROGRAMS")
- except OSError:
- # No CSIDL_COMMON_PROGRAMS on this platform
- fldr = get_special_folder_path("CSIDL_PROGRAMS")
- else:
- # non-admin install - always goes in this user's start menu.
- fldr = get_special_folder_path("CSIDL_PROGRAMS")
-
- try:
- install_group = winreg.QueryValue(
- get_root_hkey(), root_key_name + "\\InstallPath\\InstallGroup"
- )
- except OSError:
- vi = sys.version_info
- install_group = "Python %d.%d" % (vi[0], vi[1])
- return os.path.join(fldr, install_group)
-
-
-# Get the system directory, which may be the Wow64 directory if we are a 32bit
-# python on a 64bit OS.
-def get_system_dir():
- import win32api # we assume this exists.
-
- try:
- import pythoncom
- import win32process
- from win32com.shell import shell, shellcon
-
- try:
- if win32process.IsWow64Process():
- return shell.SHGetSpecialFolderPath(0, shellcon.CSIDL_SYSTEMX86)
- return shell.SHGetSpecialFolderPath(0, shellcon.CSIDL_SYSTEM)
- except (pythoncom.com_error, win32process.error):
- return win32api.GetSystemDirectory()
- except ImportError:
- return win32api.GetSystemDirectory()
-
-
-def fixup_dbi():
- # We used to have a dbi.pyd with our .pyd files, but now have a .py file.
- # If the user didn't uninstall, they will find the .pyd which will cause
- # problems - so handle that.
- import win32api
- import win32con
-
- pyd_name = os.path.join(os.path.dirname(win32api.__file__), "dbi.pyd")
- pyd_d_name = os.path.join(os.path.dirname(win32api.__file__), "dbi_d.pyd")
- py_name = os.path.join(os.path.dirname(win32con.__file__), "dbi.py")
- for this_pyd in (pyd_name, pyd_d_name):
- this_dest = this_pyd + ".old"
- if os.path.isfile(this_pyd) and os.path.isfile(py_name):
- try:
- if os.path.isfile(this_dest):
- print(
- "Old dbi '%s' already exists - deleting '%s'"
- % (this_dest, this_pyd)
- )
- os.remove(this_pyd)
- else:
- os.rename(this_pyd, this_dest)
- print("renamed '%s'->'%s.old'" % (this_pyd, this_pyd))
- file_created(this_pyd + ".old")
- except os.error as exc:
- print("FAILED to rename '%s': %s" % (this_pyd, exc))
-
-
-def install(lib_dir):
- import traceback
-
- # The .pth file is now installed as a regular file.
- # Create the .pth file in the site-packages dir, and use only relative paths
- # We used to write a .pth directly to sys.prefix - clobber it.
- if os.path.isfile(os.path.join(sys.prefix, "pywin32.pth")):
- os.unlink(os.path.join(sys.prefix, "pywin32.pth"))
- # The .pth may be new and therefore not loaded in this session.
- # Setup the paths just in case.
- for name in "win32 win32\\lib Pythonwin".split():
- sys.path.append(os.path.join(lib_dir, name))
- # It is possible people with old versions installed with still have
- # pywintypes and pythoncom registered. We no longer need this, and stale
- # entries hurt us.
- for name in "pythoncom pywintypes".split():
- keyname = "Software\\Python\\PythonCore\\" + sys.winver + "\\Modules\\" + name
- for root in winreg.HKEY_LOCAL_MACHINE, winreg.HKEY_CURRENT_USER:
- try:
- winreg.DeleteKey(root, keyname + "\\Debug")
- except WindowsError:
- pass
- try:
- winreg.DeleteKey(root, keyname)
- except WindowsError:
- pass
- LoadSystemModule(lib_dir, "pywintypes")
- LoadSystemModule(lib_dir, "pythoncom")
- import win32api
-
- # and now we can get the system directory:
- files = glob.glob(os.path.join(lib_dir, "pywin32_system32\\*.*"))
- if not files:
- raise RuntimeError("No system files to copy!!")
- # Try the system32 directory first - if that fails due to "access denied",
- # it implies a non-admin user, and we use sys.prefix
- for dest_dir in [get_system_dir(), sys.prefix]:
- # and copy some files over there
- worked = 0
- try:
- for fname in files:
- base = os.path.basename(fname)
- dst = os.path.join(dest_dir, base)
- CopyTo("installing %s" % base, fname, dst)
- if verbose:
- print("Copied %s to %s" % (base, dst))
- # Register the files with the uninstaller
- file_created(dst)
- worked = 1
- # Nuke any other versions that may exist - having
- # duplicates causes major headaches.
- bad_dest_dirs = [
- os.path.join(sys.prefix, "Library\\bin"),
- os.path.join(sys.prefix, "Lib\\site-packages\\win32"),
- ]
- if dest_dir != sys.prefix:
- bad_dest_dirs.append(sys.prefix)
- for bad_dest_dir in bad_dest_dirs:
- bad_fname = os.path.join(bad_dest_dir, base)
- if os.path.exists(bad_fname):
- # let exceptions go here - delete must succeed
- os.unlink(bad_fname)
- if worked:
- break
- except win32api.error as details:
- if details.winerror == 5:
- # access denied - user not admin - try sys.prefix dir,
- # but first check that a version doesn't already exist
- # in that place - otherwise that one will still get used!
- if os.path.exists(dst):
- msg = (
- "The file '%s' exists, but can not be replaced "
- "due to insufficient permissions. You must "
- "reinstall this software as an Administrator" % dst
- )
- print(msg)
- raise RuntimeError(msg)
- continue
- raise
- else:
- raise RuntimeError(
- "You don't have enough permissions to install the system files"
- )
-
- # Pythonwin 'compiles' config files - record them for uninstall.
- pywin_dir = os.path.join(lib_dir, "Pythonwin", "pywin")
- for fname in glob.glob(os.path.join(pywin_dir, "*.cfg")):
- file_created(fname[:-1] + "c") # .cfg->.cfc
-
- # Register our demo COM objects.
- try:
- try:
- RegisterCOMObjects()
- except win32api.error as details:
- if details.winerror != 5: # ERROR_ACCESS_DENIED
- raise
- print("You do not have the permissions to install COM objects.")
- print("The sample COM objects were not registered.")
- except Exception:
- print("FAILED to register the Python COM objects")
- traceback.print_exc()
-
- # There may be no main Python key in HKCU if, eg, an admin installed
- # python itself.
- winreg.CreateKey(get_root_hkey(), root_key_name)
-
- chm_file = None
- try:
- chm_file = RegisterHelpFile(True, lib_dir)
- except Exception:
- print("Failed to register help file")
- traceback.print_exc()
- else:
- if verbose:
- print("Registered help file")
-
- # misc other fixups.
- fixup_dbi()
-
- # Register Pythonwin in context menu
- try:
- RegisterPythonwin(True, lib_dir)
- except Exception:
- print("Failed to register pythonwin as editor")
- traceback.print_exc()
- else:
- if verbose:
- print("Pythonwin has been registered in context menu")
-
- # Create the win32com\gen_py directory.
- make_dir = os.path.join(lib_dir, "win32com", "gen_py")
- if not os.path.isdir(make_dir):
- if verbose:
- print("Creating directory %s" % (make_dir,))
- directory_created(make_dir)
- os.mkdir(make_dir)
-
- try:
- # create shortcuts
- # CSIDL_COMMON_PROGRAMS only available works on NT/2000/XP, and
- # will fail there if the user has no admin rights.
- fldr = get_shortcuts_folder()
- # If the group doesn't exist, then we don't make shortcuts - its
- # possible that this isn't a "normal" install.
- if os.path.isdir(fldr):
- dst = os.path.join(fldr, "PythonWin.lnk")
- create_shortcut(
- os.path.join(lib_dir, "Pythonwin\\Pythonwin.exe"),
- "The Pythonwin IDE",
- dst,
- "",
- sys.prefix,
- )
- file_created(dst)
- if verbose:
- print("Shortcut for Pythonwin created")
- # And the docs.
- if chm_file:
- dst = os.path.join(fldr, "Python for Windows Documentation.lnk")
- doc = "Documentation for the PyWin32 extensions"
- create_shortcut(chm_file, doc, dst)
- file_created(dst)
- if verbose:
- print("Shortcut to documentation created")
- else:
- if verbose:
- print("Can't install shortcuts - %r is not a folder" % (fldr,))
- except Exception as details:
- print(details)
-
- # importing win32com.client ensures the gen_py dir created - not strictly
- # necessary to do now, but this makes the installation "complete"
- try:
- import win32com.client # noqa
- except ImportError:
- # Don't let this error sound fatal
- pass
- print("The pywin32 extensions were successfully installed.")
-
- if is_bdist_wininst:
- # Open a web page with info about the .exe installers being deprecated.
- import webbrowser
-
- try:
- webbrowser.open("https://mhammond.github.io/pywin32_installers.html")
- except webbrowser.Error:
- print("Please visit https://mhammond.github.io/pywin32_installers.html")
-
-
-def uninstall(lib_dir):
- # First ensure our system modules are loaded from pywin32_system, so
- # we can remove the ones we copied...
- LoadSystemModule(lib_dir, "pywintypes")
- LoadSystemModule(lib_dir, "pythoncom")
-
- try:
- RegisterCOMObjects(False)
- except Exception as why:
- print("Failed to unregister COM objects: %s" % (why,))
-
- try:
- RegisterHelpFile(False, lib_dir)
- except Exception as why:
- print("Failed to unregister help file: %s" % (why,))
- else:
- if verbose:
- print("Unregistered help file")
-
- try:
- RegisterPythonwin(False, lib_dir)
- except Exception as why:
- print("Failed to unregister Pythonwin: %s" % (why,))
- else:
- if verbose:
- print("Unregistered Pythonwin")
-
- try:
- # remove gen_py directory.
- gen_dir = os.path.join(lib_dir, "win32com", "gen_py")
- if os.path.isdir(gen_dir):
- shutil.rmtree(gen_dir)
- if verbose:
- print("Removed directory %s" % (gen_dir,))
-
- # Remove pythonwin compiled "config" files.
- pywin_dir = os.path.join(lib_dir, "Pythonwin", "pywin")
- for fname in glob.glob(os.path.join(pywin_dir, "*.cfc")):
- os.remove(fname)
-
- # The dbi.pyd.old files we may have created.
- try:
- os.remove(os.path.join(lib_dir, "win32", "dbi.pyd.old"))
- except os.error:
- pass
- try:
- os.remove(os.path.join(lib_dir, "win32", "dbi_d.pyd.old"))
- except os.error:
- pass
-
- except Exception as why:
- print("Failed to remove misc files: %s" % (why,))
-
- try:
- fldr = get_shortcuts_folder()
- for link in ("PythonWin.lnk", "Python for Windows Documentation.lnk"):
- fqlink = os.path.join(fldr, link)
- if os.path.isfile(fqlink):
- os.remove(fqlink)
- if verbose:
- print("Removed %s" % (link,))
- except Exception as why:
- print("Failed to remove shortcuts: %s" % (why,))
- # Now remove the system32 files.
- files = glob.glob(os.path.join(lib_dir, "pywin32_system32\\*.*"))
- # Try the system32 directory first - if that fails due to "access denied",
- # it implies a non-admin user, and we use sys.prefix
- try:
- for dest_dir in [get_system_dir(), sys.prefix]:
- # and copy some files over there
- worked = 0
- for fname in files:
- base = os.path.basename(fname)
- dst = os.path.join(dest_dir, base)
- if os.path.isfile(dst):
- try:
- os.remove(dst)
- worked = 1
- if verbose:
- print("Removed file %s" % (dst))
- except Exception:
- print("FAILED to remove %s" % (dst,))
- if worked:
- break
- except Exception as why:
- print("FAILED to remove system files: %s" % (why,))
-
-
-# NOTE: If this script is run from inside the bdist_wininst created
-# binary installer or uninstaller, the command line args are either
-# '-install' or '-remove'.
-
-# Important: From inside the binary installer this script MUST NOT
-# call sys.exit() or raise SystemExit, otherwise not only this script
-# but also the installer will terminate! (Is there a way to prevent
-# this from the bdist_wininst C code?)
-
-
-def verify_destination(location):
- if not os.path.isdir(location):
- raise argparse.ArgumentTypeError('Path "{}" does not exist!'.format(location))
- return location
-
-
-def main():
- import argparse
-
- parser = argparse.ArgumentParser(
- formatter_class=argparse.RawDescriptionHelpFormatter,
- description="""A post-install script for the pywin32 extensions.
-
- * Typical usage:
-
- > python pywin32_postinstall.py -install
-
- If you installed pywin32 via a .exe installer, this should be run
- automatically after installation, but if it fails you can run it again.
-
- If you installed pywin32 via PIP, you almost certainly need to run this to
- setup the environment correctly.
-
- Execute with script with a '-install' parameter, to ensure the environment
- is setup correctly.
- """,
- )
- parser.add_argument(
- "-install",
- default=False,
- action="store_true",
- help="Configure the Python environment correctly for pywin32.",
- )
- parser.add_argument(
- "-remove",
- default=False,
- action="store_true",
- help="Try and remove everything that was installed or copied.",
- )
- parser.add_argument(
- "-wait",
- type=int,
- help="Wait for the specified process to terminate before starting.",
- )
- parser.add_argument(
- "-silent",
- default=False,
- action="store_true",
- help='Don\'t display the "Abort/Retry/Ignore" dialog for files in use.',
- )
- parser.add_argument(
- "-quiet",
- default=False,
- action="store_true",
- help="Don't display progress messages.",
- )
- parser.add_argument(
- "-destination",
- default=sysconfig.get_paths()["platlib"],
- type=verify_destination,
- help="Location of the PyWin32 installation",
- )
-
- args = parser.parse_args()
-
- if not args.quiet:
- print("Parsed arguments are: {}".format(args))
-
- if not args.install ^ args.remove:
- parser.error("You need to either choose to -install or -remove!")
-
- if args.wait is not None:
- try:
- os.waitpid(args.wait, 0)
- except os.error:
- # child already dead
- pass
-
- silent = args.silent
- verbose = not args.quiet
-
- if args.install:
- install(args.destination)
-
- if args.remove:
- if not is_bdist_wininst:
- uninstall(args.destination)
-
-
-if __name__ == "__main__":
- main()
diff --git a/lab_3/aimenv/Scripts/pywin32_testall.py b/lab_3/aimenv/Scripts/pywin32_testall.py
deleted file mode 100644
index a54f9d4..0000000
--- a/lab_3/aimenv/Scripts/pywin32_testall.py
+++ /dev/null
@@ -1,124 +0,0 @@
-"""A test runner for pywin32"""
-import os
-import site
-import subprocess
-import sys
-
-# locate the dirs based on where this script is - it may be either in the
-# source tree, or in an installed Python 'Scripts' tree.
-this_dir = os.path.dirname(__file__)
-site_packages = [
- site.getusersitepackages(),
-] + site.getsitepackages()
-
-failures = []
-
-
-# Run a test using subprocess and wait for the result.
-# If we get an returncode != 0, we know that there was an error, but we don't
-# abort immediately - we run as many tests as we can.
-def run_test(script, cmdline_extras):
- dirname, scriptname = os.path.split(script)
- # some tests prefer to be run from their directory.
- cmd = [sys.executable, "-u", scriptname] + cmdline_extras
- print("--- Running '%s' ---" % script)
- sys.stdout.flush()
- result = subprocess.run(cmd, check=False, cwd=dirname)
- print("*** Test script '%s' exited with %s" % (script, result.returncode))
- sys.stdout.flush()
- if result.returncode:
- failures.append(script)
-
-
-def find_and_run(possible_locations, extras):
- for maybe in possible_locations:
- if os.path.isfile(maybe):
- run_test(maybe, extras)
- break
- else:
- raise RuntimeError(
- "Failed to locate a test script in one of %s" % possible_locations
- )
-
-
-def main():
- import argparse
-
- code_directories = [this_dir] + site_packages
-
- parser = argparse.ArgumentParser(
- description="A script to trigger tests in all subprojects of PyWin32."
- )
- parser.add_argument(
- "-no-user-interaction",
- default=False,
- action="store_true",
- help="(This is now the default - use `-user-interaction` to include them)",
- )
-
- parser.add_argument(
- "-user-interaction",
- action="store_true",
- help="Include tests which require user interaction",
- )
-
- parser.add_argument(
- "-skip-adodbapi",
- default=False,
- action="store_true",
- help="Skip the adodbapi tests; useful for CI where there's no provider",
- )
-
- args, remains = parser.parse_known_args()
-
- # win32, win32ui / Pythonwin
-
- extras = []
- if args.user_interaction:
- extras += ["-user-interaction"]
- extras.extend(remains)
- scripts = [
- "win32/test/testall.py",
- "Pythonwin/pywin/test/all.py",
- ]
- for script in scripts:
- maybes = [os.path.join(directory, script) for directory in code_directories]
- find_and_run(maybes, extras)
-
- # win32com
- maybes = [
- os.path.join(directory, "win32com", "test", "testall.py")
- for directory in [
- os.path.join(this_dir, "com"),
- ]
- + site_packages
- ]
- extras = remains + ["1"] # only run "level 1" tests in CI
- find_and_run(maybes, extras)
-
- # adodbapi
- if not args.skip_adodbapi:
- maybes = [
- os.path.join(directory, "adodbapi", "test", "adodbapitest.py")
- for directory in code_directories
- ]
- find_and_run(maybes, remains)
- # This script has a hard-coded sql server name in it, (and markh typically
- # doesn't have a different server to test on) but there is now supposed to be a server out there on the Internet
- # just to run these tests, so try it...
- maybes = [
- os.path.join(directory, "adodbapi", "test", "test_adodbapi_dbapi20.py")
- for directory in code_directories
- ]
- find_and_run(maybes, remains)
-
- if failures:
- print("The following scripts failed")
- for failure in failures:
- print(">", failure)
- sys.exit(1)
- print("All tests passed \\o/")
-
-
-if __name__ == "__main__":
- main()
diff --git a/lab_3/aimenv/pyvenv.cfg b/lab_3/aimenv/pyvenv.cfg
deleted file mode 100644
index b18a31c..0000000
--- a/lab_3/aimenv/pyvenv.cfg
+++ /dev/null
@@ -1,5 +0,0 @@
-home = C:\Users\Egor\AppData\Local\Programs\Python\Python312
-include-system-site-packages = false
-version = 3.12.5
-executable = C:\Users\Egor\AppData\Local\Programs\Python\Python312\python.exe
-command = C:\Users\Egor\AppData\Local\Programs\Python\Python312\python.exe -m venv C:\Users\Egor\Desktop\ULSTU\AI\aim\aimenv
diff --git a/lab_3/aimenv/share/jupyter/kernels/python3/kernel.json b/lab_3/aimenv/share/jupyter/kernels/python3/kernel.json
deleted file mode 100644
index cca38a4..0000000
--- a/lab_3/aimenv/share/jupyter/kernels/python3/kernel.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "argv": [
- "python",
- "-m",
- "ipykernel_launcher",
- "-f",
- "{connection_file}"
- ],
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "metadata": {
- "debugger": true
- }
-}
\ No newline at end of file
diff --git a/lab_3/aimenv/share/jupyter/kernels/python3/logo-32x32.png b/lab_3/aimenv/share/jupyter/kernels/python3/logo-32x32.png
deleted file mode 100644
index be81330..0000000
Binary files a/lab_3/aimenv/share/jupyter/kernels/python3/logo-32x32.png and /dev/null differ
diff --git a/lab_3/aimenv/share/jupyter/kernels/python3/logo-64x64.png b/lab_3/aimenv/share/jupyter/kernels/python3/logo-64x64.png
deleted file mode 100644
index eebbff6..0000000
Binary files a/lab_3/aimenv/share/jupyter/kernels/python3/logo-64x64.png and /dev/null differ
diff --git a/lab_3/aimenv/share/jupyter/kernels/python3/logo-svg.svg b/lab_3/aimenv/share/jupyter/kernels/python3/logo-svg.svg
deleted file mode 100644
index 467b07b..0000000
--- a/lab_3/aimenv/share/jupyter/kernels/python3/logo-svg.svg
+++ /dev/null
@@ -1,265 +0,0 @@
-
-
-
-
diff --git a/lab_3/aimenv/share/man/man1/ipython.1 b/lab_3/aimenv/share/man/man1/ipython.1
deleted file mode 100644
index 0f4a191..0000000
--- a/lab_3/aimenv/share/man/man1/ipython.1
+++ /dev/null
@@ -1,60 +0,0 @@
-.\" Hey, EMACS: -*- nroff -*-
-.\" First parameter, NAME, should be all caps
-.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
-.\" other parameters are allowed: see man(7), man(1)
-.TH IPYTHON 1 "July 15, 2011"
-.\" Please adjust this date whenever revising the manpage.
-.\"
-.\" Some roff macros, for reference:
-.\" .nh disable hyphenation
-.\" .hy enable hyphenation
-.\" .ad l left justify
-.\" .ad b justify to both left and right margins
-.\" .nf disable filling
-.\" .fi enable filling
-.\" .br insert line break
-.\" .sp insert n+1 empty lines
-.\" for manpage-specific macros, see man(7) and groff_man(7)
-.\" .SH section heading
-.\" .SS secondary section heading
-.\"
-.\"
-.\" To preview this page as plain text: nroff -man ipython.1
-.\"
-.SH NAME
-ipython \- Tools for Interactive Computing in Python.
-.SH SYNOPSIS
-.B ipython
-.RI [ options ] " files" ...
-
-.B ipython subcommand
-.RI [ options ] ...
-
-.SH DESCRIPTION
-An interactive Python shell with automatic history (input and output), dynamic
-object introspection, easier configuration, command completion, access to the
-system shell, integration with numerical and scientific computing tools,
-web notebook, Qt console, and more.
-
-For more information on how to use IPython, see 'ipython \-\-help',
-or 'ipython \-\-help\-all' for all available command\(hyline options.
-
-.SH "ENVIRONMENT VARIABLES"
-.sp
-.PP
-\fIIPYTHONDIR\fR
-.RS 4
-This is the location where IPython stores all its configuration files. The default
-is $HOME/.ipython if IPYTHONDIR is not defined.
-
-You can see the computed value of IPYTHONDIR with `ipython locate`.
-
-.SH FILES
-
-IPython uses various configuration files stored in profiles within IPYTHONDIR.
-To generate the default configuration files and start configuring IPython,
-do 'ipython profile create', and edit '*_config.py' files located in
-IPYTHONDIR/profile_default.
-
-.SH AUTHORS
-IPython is written by the IPython Development Team .