cleanup.ps1
|
[CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] param( $module = "dbatools" ) # Which process should we be looking for? if ($psedition -eq 'Core') { $process = "pwsh" } else { $process = "powershell" } if (($PSVersionTable.PSVersion.Major -le 5) -or ($PSVersionTable.PSVersion.Major -gt 6 -and $PSVersionTable.OS -contains "Windows")) { $isElevated = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) $ise = Get-Process powershell_ise -ErrorAction SilentlyContinue if ($ise) { return "PowerShell ISE found in use. Please close this program before using this script." } } else { $isElevated = $null; $ise = $null; } $installedVersion = Get-InstalledModule $module -AllVersions | Select-Object Version, InstalledLocation Write-Output "The currently installed version(s) of $module is/are: " $installedVersion.Version $results = foreach ($v in $installedVersion) { if ($v.InstalledLocation -match "C:\\Users") { Add-Member -Force -InputObject $v -MemberType NoteProperty -Name IsUserScope -value $true } else { if (-not $isElevated) { Write-Output "$module version $v.Version cannot be removed without elevated session." } Add-Member -Force -InputObject $v -MemberType NoteProperty -Name IsUserScope -value $false } $v } $newestVersion = Find-Module $module | Select-Object Version Write-Output "`nThe latest version of $module in the PSGallery is: $($newestVersion.Version)" $olderVersions = @( ) if ($installedVersion.Count -gt 1) { $olderVersions = @($installedVersion | Where-Object { [version]$_.Version -lt [version]$newestVersion.Version }) } if ( ($olderVersions.Count -gt 0) -and $newestVersion.Version -in $installedVersion.Version ) { Write-Output "Latest version of $module found on $env:COMPUTERNAME." Write-Output "Older versions of $module also found. These will be uninstalled now." if ($isElevated) { $processes = Get-Process $process -IncludeUserName -ErrorAction SilentlyContinue | Where-Object Id -NE $pid } else { $processes = Get-Process $process -ErrorAction SilentlyContinue | Where-Object Id -NE $PID } if ($processes.Count -gt 0) { if ($Pscmdlet.ShouldProcess("$env:COMPUTERNAME", "Killing $($processes.Count) processes of powershell running")) { Write-Output "Death to the following process(es): $(($processes.Id) -join ",")" $processes | Stop-Process -ErrorVariable dangit -ErrorAction SilentlyContinue -Force if ($dangit) { Write-Warning "Not able to kill following processes: $((Get-Process $process | Where-Object Id -NE $pid).Id -join ",")" } } } if ($Pscmdlet.ShouldProcess("$env:COMPUTERNAME", "Removing old versions of $module.")) { foreach ($v in $olderVersions.Version) { Uninstall-Module $module -RequiredVersion $v -ErrorVariable dangit -ErrorAction SilentlyContinue -Force if ($dangit) { if ($dangit.Exception -like "*Administrator rights*") { Write-Warning "Elevated session is required to uninstall $module version: $v" } else { Write-Warning "Unable to remove $module version [$v] due to: `n`t$($dangit.Exception)" } } } } Write-Output "The End" } elseif ( ($olderVersions.Count -gt 0) -and $newestVersion.Version -notin $installedVersion.Version ) { Write-Output "Update of $module is available" Write-Output "Older versions of $module found. These will be uninstalled now." if ($isElevated) { $processes = Get-Process $process -ErrorAction SilentlyContinue -IncludeUserName | Where-Object Id -NE $pid } else { $processes = Get-Process $process -ErrorAction SilentlyContinue | Where-Object Id -NE $PID } if ($processes.Count -gt 0) { if ($Pscmdlet.ShouldProcess("$env:COMPUTERNAME", "Killing $($processes.Count) processes of powershell running")) { Write-Output "Death to the following process(es): $(($processes.Id) -join ",")" $processes | Stop-Process -ErrorVariable dangit -ErrorAction SilentlyContinue -Force if ($dangit) { Write-Warning "Not able to kill following processes: $((Get-Process $process | Where-Object Id -NE $pid).Id -join ",")" } } } if ($Pscmdlet.ShouldProcess("$env:COMPUTERNAME", "Removing old versions of $module.")) { foreach ($v in $olderVersions.Version) { Uninstall-Module $module -RequiredVersion $v -ErrorVariable dangit -ErrorAction SilentlyContinue -Force if ($dangit) { if ($dangit.Exception -like "*Administrator rights*") { Write-Warning "Elevated session is required to uninstall $module version: $v" } else { Write-Warning "Unable to remove $module version [$v] due to: `n`t$($dangit.Exception)" } } } } Write-Output "Continuing to install latest release of $module" Install-Module $module -Force Write-Output "The End" } else { Write-Output "No update/actions required." } # SIG # Begin signature block # MIItZgYJKoZIhvcNAQcCoIItVzCCLVMCAQMxDTALBglghkgBZQMEAgEwewYKKwYB # BAGCNwIBBKBtBGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBbC7m38uJKN0Fh # yce8/lpvD8KrpB4HRQCSsGB5ShHRlaCCFWUwggaTMIIEe6ADAgECAhMzAAhQvC/V # 2KdBaYGiAAAACFC8MA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDQwHhcNMjYxMDE0MDI0NTE1WhcNMjYxMDE3 # MDI0NTE1WjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExDzANBgNV # BAcTBlZpZW5uYTERMA8GA1UEChMIZGJhdG9vbHMxETAPBgNVBAMTCGRiYXRvb2xz # MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAkyXrYmh3hUg+igahmqfc # uPn8UU25vMufdgNzVV9vmM/GRhS+LD0XJ7sNqQUdXTmhtFN5iczhE+rnmPm3/zDU # cWEqYAJ8y46Y0x+IrmfbbIqQMEYveIT/wbNUC3baYSnfd5CHTBhc2w0SeWiqRW56 # 244+9w7LkTHkTHp+WJRLIWW9am2hjgRwG8Fvaqq/0KbBAHbUeGF3a57e+9QpB7vS # R3PyZoS8wZ03edj1BM/SGAg76f9k7fnELp/HOtTt6gyaFs8AsA+6HYVJHiqJM74K # WTYyHtLt9kWK1sea5/C/KXpbW9+sMP+b/JSlFaifLfuWp0oPUUO/Pby/+NdiNxrD # 3tAg4UiWaPFlPXw6r6X5I29t88wEh0eik9tkjikaDikKioQt3B5Bu6d4KINaL0vl # ymXJV1bOLknkBWnWwrvQxDNnEK6s/MLUW4h7ixLNlrbg3DYqrh0NRCUNvJg4IqyO # z5r0ZnwgHMRkFePXCl7Gytfm5Tz0B7haUSfpOjcKQHAJAgMBAAGjggHTMIIBzzAM # BgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA6BgNVHSUEMzAxBgorBgEEAYI3 # YQEABggrBgEFBQcDAwYZKwYBBAGCN2H5+cEspPS4DoOuxLIcm56wGDAdBgNVHQ4E # FgQU8iEP+t70ALlNYB0WwXz7yUQM8DgwHwYDVR0jBBgwFoAUmvFUd3UMhxY3RqCs # 3nn59H/BeOkwZwYDVR0fBGAwXjBcoFqgWIZWaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENTJTIw # RU9DJTIwQ0ElMjAwNC5jcmwwdAYIKwYBBQUHAQEEaDBmMGQGCCsGAQUFBzAChlho # dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUy # MElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUyMENBJTIwMDQuY3J0MFQGA1UdIARN # MEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wDQYJKoZIhvcNAQEMBQADggIB # ABmg2ZWx48fFny1C7m/4QszNMrFckHVw2U2dfvtjv/5dthl+dhJwQvYauUdJjjyK # lT/aS5sEII3mO7oxmvaQN+Vw2SqmP9zK0e40R8IyHoNlK+CKj5UuLA3/oibeJU5y # Y3pbl3etCfYJngK1HUyKfSiu7kn7OOiluFAab5Gf6JHuW00dNYSGxQ663Axcb4GV # dXjTfWOGovdVIelGGDaEQl5cqeL7IHP+/QSsnNhHY2akT4lwgMHSjqeuF6q72pq+ # VZTv+avySJmLlhhACZhbOPGj3P/RC/1jb0P1g9h32Ff3mP5ZsFuVQklNefaxFPbU # hgAMPrtvttd3bBumHEnA3mgqQJJni/aKn2XSgXo6SC53PfexxOeScF4h7pXLBSLV # +fpwFpJzvgdQsB5ZuNNb4lFsvAUbkwkfqV/FSBgTpUYBOqZJtYizA9b3EhgaikqU # 05I3RNVZvePolX3Q9FoI7/ZrrphdCDhRviZTzmA4ajc5EB0UOyLRKZt/qY8KxYRB # BS13LFQSIVyl1cLsbBz0yaFQEpRg2gJ6KfnKOjozlO+0jog1jPF+R0sgLy/3UN8M # l447L3W752urIJRfzzirGodTrVLjkrtnNma5w+SdHN7e8/1JSPNxEcCmTzIseQza # GHUCNNoUYAFCnULSU/w+3I/mPWuFsvPKDfiXrTdE8eehMIIHKDCCBRCgAwIBAgIT # MwAAABcnRQkLi4evxgAAAAAAFzANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQGEwJV # UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTQwMgYDVQQDEytNaWNy # b3NvZnQgSUQgVmVyaWZpZWQgQ29kZSBTaWduaW5nIFBDQSAyMDIxMB4XDTI2MDMy # NjE4MTEzMVoXDTMxMDMyNjE4MTEzMVowWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZl # cmlmaWVkIENTIEVPQyBDQSAwNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC # ggIBAILHZP4DD2YqAZXMn5OrQ8yfj0beK0ixilvHsKUtJEcV7VEQt09xnWwipY6G # xJ/LrLKoRqkKUYf0l70VcDVxCBm++lBuSD5AidUuv/QQ+tUELCsz3qVtEjY/E14L # Bcb0uzJbaEbopCCKe0OY0IGjjOkMivfvumVV1KWJmbpQHusfCa8GdHTZBPq2eupa # raKHMHqVElVMTO6HQ5p/Mgx4ydgzT7H697kQ4sd1+Kr4deIx/0lvtgse1iDIciIk # DttNYuoVIsZpOHtmVvFuwtcD3U46ugSm/s6PMW67e2SkL0V+UDgOnYS6rj6o+bFS # p8an5NfSAtEmn00k7PMguNxMPeuQUUVvFS/XHKDpq+K8UMu2goGEzZN3Xfy6YTWk # 05pxqe5Ji08ch5AeYHqFoWLrhq8sEvBNMCb9FuK3zrRwVdHvbCr7lCHiFKZ7Meop # cRFY+lUF74A+sngipz5o94yYiSgJZlA7bYecs0VQVJeOLDIhuC+Uf8sgAkSpNp9P # PENmAqGUtTvOvqDCyrdY2lxhAjo27FafCHdVUMPIXuidCoqzkuXtuV5U3RjxW+qA # TjmmnIFu/Co39G6fl8wIJHPdpgxjSRmEo73Z4/u3jMepnltAwCBnS0TY/P+NvTCL # KRQX89yg6qqTe9UuJENiy3q93cYQw3MylRS9By8Ebjr4I4hvAgMBAAGjggHcMIIB # 2DAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFJrx # VHd1DIcWN0agrN55+fR/wXjpMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUF # BwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3Np # dG9yeS5odG0wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwEgYDVR0TAQH/BAgw # BgEB/wIBADAfBgNVHSMEGDAWgBTZQSmwDw9jbO9p1/XNKZ6kSGow5jBwBgNVHR8E # aTBnMGWgY6Bhhl9odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9N # aWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ29kZSUyMFNpZ25pbmclMjBQQ0El # MjAyMDIxLmNybDB9BggrBgEFBQcBAQRxMG8wbQYIKwYBBQUHMAKGYWh0dHA6Ly93 # d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSUQlMjBW # ZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAyMS5jcnQwDQYJKoZI # hvcNAQEMBQADggIBAJB1Whn9TSbfyXaIppkWWzFq+m2mg4vJpHVr1krZNIXWQ6cU # mEwOx7oqQKCy96iISNdNVzpe3zogoefvo2TmpkHQFe/aIxFDaCIAmZi9lyay2hmp # 8HYzcp3nCcmFQk60X9voeypJ6VjqeGsXTrOivWUOYNCLEFlwsH3NHX5EpCyjWN6Q # 3Fi5ST4do3eTVLnuqTQ7/9huTBTSYQsJbTg3m8gIxnHlPlzs2r/u4u9tWEJ0Pt/Z # tmkDhTu86QHWigHgBoRHemOgnQxp3ksXKLo1r2n1m7+Gst46NTkUi1LljGyq+V9f # EBOEnXvoKaRiy0pGbK1IdnsmEpF9Xp71l+2T84Nv8IrikZUBWqw5/jffttAas4cc # JDci832CadS4OHwl29uF6hY8fEg3UYHmxSJjnzi1c3vF0PwsJKxGom9Dx7treBlZ # OBWK6BGzVBar43Qb02N7okeU3UKMl6GB74fk8aS0mNr6O4YSvQ/66RKRwvqppnEV # BOHdIMjvWW9b77duX8TN3pI7w31R3D6t6jK9EcLJOJKymVlBIFNUl0+ajeoKka7I # cW0+jkIGff8U9OKol3cz0Eeiop3Qb0qaDp8ZwC8XCcs1cDaSi/vbvBGWMvfKl+ov # uIBP9ienG6XpHAdGVw5/10MaDVFG+v3Y0/8JZVchvryB5Hau9T82x+a2MXXAMIIH # njCCBYagAwIBAgITMwAAAAeHozSje6WOHAAAAAAABzANBgkqhkiG9w0BAQwFADB3 # MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMUgw # RgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFJvb3QgQ2Vy # dGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAwHhcNMjEwNDAxMjAwNTIwWhcNMzYwNDAx # MjAxNTIwWjBjMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv # cmF0aW9uMTQwMgYDVQQDEytNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ29kZSBTaWdu # aW5nIFBDQSAyMDIxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsvDA # rxmIKOLdVHpMSWxpCFUJtFL/ekr4weslKPdnF3cpTeuV8veqtmKVgok2rO0D05Bp # yvUDCg1wdsoEtuxACEGcgHfjPF/nZsOkg7c0mV8hpMT/GvB4uhDvWXMIeQPsDgCz # UGzTvoi76YDpxDOxhgf8JuXWJzBDoLrmtThX01CE1TCCvH2sZD/+Hz3RDwl2MsvD # SdX5rJDYVuR3bjaj2QfzZFmwfccTKqMAHlrz4B7ac8g9zyxlTpkTuJGtFnLBGaso # Onn5NyYlf0xF9/bjVRo4Gzg2Yc7KR7yhTVNiuTGH5h4eB9ajm1OCShIyhrKqgOkc # 4smz6obxO+HxKeJ9bYmPf6KLXVNLz8UaeARo0BatvJ82sLr2gqlFBdj1sYfqOf00 # Qm/3B4XGFPDK/H04kteZEZsBRc3VT2d/iVd7OTLpSH9yCORV3oIZQB/Qr4nD4YT/ # lWkhVtw2v2s0TnRJubL/hFMIQa86rcaGMhNsJrhysLNNMeBhiMezU1s5zpusf54q # lYu2v5sZ5zL0KvBDLHtL8F9gn6jOy3v7Jm0bbBHjrW5yQW7S36ALAt03QDpwW1JG # 1Hxu/FUXJbBO2AwwVG4Fre+ZQ5Od8ouwt59FpBxVOBGfN4vN2m3fZx1gqn52Gvai # Bz6ozorgIEjn+PhUXILhAV5Q/ZgCJ0u2+ldFGjcCAwEAAaOCAjUwggIxMA4GA1Ud # DwEB/wQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU2UEpsA8PY2zv # adf1zSmepEhqMOYwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0 # dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0 # bTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAPBgNVHRMBAf8EBTADAQH/MB8G # A1UdIwQYMBaAFMh+0mqFKhvKGZgEByfPUBBPaKiiMIGEBgNVHR8EfTB7MHmgd6B1 # hnNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQl # MjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZpY2F0ZSUy # MEF1dGhvcml0eSUyMDIwMjAuY3JsMIHDBggrBgEFBQcBAQSBtjCBszCBgQYIKwYB # BQUHMAKGdWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWlj # cm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlm # aWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNydDAtBggrBgEFBQcwAYYhaHR0cDov # L29uZW9jc3AubWljcm9zb2Z0LmNvbS9vY3NwMA0GCSqGSIb3DQEBDAUAA4ICAQB/ # JSqe/tSr6t1mCttXI0y6XmyQ41uGWzl9xw+WYhvOL47BV09Dgfnm/tU4ieeZ7NAR # 5bguorTCNr58HOcA1tcsHQqt0wJsdClsu8bpQD9e/al+lUgTUJEV80Xhco7xdgRr # ehbyhUf4pkeAhBEjABvIUpD2LKPho5Z4DPCT5/0TlK02nlPwUbv9URREhVYCtsDM # +31OFU3fDV8BmQXv5hT2RurVsJHZgP4y26dJDVF+3pcbtvh7R6NEDuYHYihfmE2H # dQRq5jRvLE1Eb59PYwISFCX2DaLZ+zpU4bX0I16ntKq4poGOFaaKtjIA1vRElIta # OKcwtc04CBrXSfyL2Op6mvNIxTk4OaswIkTXbFL81ZKGD+24uMCwo/pLNhn7VHLf # nxlMVzHQVL+bHa9KhTyzwdG/L6uderJQn0cGpLQMStUuNDArxW2wF16QGZ1NtBWg # KA8Kqv48M8HfFqNifN6+zt6J0GwzvU8g0rYGgTZR8zDEIJfeZxwWDHpSxB5FJ1VV # U1LIAtB7o9PXbjXzGifaIMYTzU4YKt4vMNwwBmetQDHhdAtTPplOXrnI9SI6HeTt # jDD3iUN/7ygbahmYOHk7VB7fwT4ze+ErCbMh6gHV1UuXPiLciloNxH6K4aMfZN1o # LVk6YFeIJEokuPgNPa6EnTiOL60cPqfny+Fq8UiuZzGCF1cwghdTAgEBMHEwWjEL # MAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkG # A1UEAxMiTWljcm9zb2Z0IElEIFZlcmlmaWVkIENTIEVPQyBDQSAwNAITMwAIULwv # 1dinQWmBogAAAAhQvDALBglghkgBZQMEAgGgfDAQBgorBgEEAYI3AgEMMQIwADAZ # BgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYB # BAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgUoOtQL0x9SXpa+JLkOwyPwv4JAuQNisG # CLfSQWLsqOQwCwYJKoZIhvcNAQEBBIIBgDc7VRgLYXzVq8XaEBeDqKK0kHKkfeNT # s9xmh2fWZ4YAVDsaK2SlT7EHvOcjunsH1XXmFwveu0w/cIZ4KAPy/Dkim4Y6aNAX # dvA+LZ2iLx1CTN3/RminS2VkmD+6lSv7dGUFStPfkqHM4QLXWPgKDVZZJV42p6G/ # CGgwOGLHvy867Vc1gMnqYdemP+saEIaxBR/cdwPz7VDfs0fyaY0mzvCqxDjnfxy8 # e+CxZJ656wDg2azGFvpANQjg2k04ulIpdye087qyOmDJnTYAwIMuPJZr9CO741xP # U2QoMHQTSH2JNkHBB9W1HrNIE/mRr+liM61CnBmd96VhPWxcw2bEtZSczjylLTkv # OQu/6lhd35gqWWbzm+H+CR5dn7zCgtiFzoQkOdE2I+cOeZC804FhdRW4PMjfE6nu # Dv5H0I8MgPG6/ILSzpVusSJRJsvrAmDidiSq3+Pv9u9UV5Rz5iGmo0nnKbEdEBRs # ZOMD/j1TPS2XK7MRNKmxxbd5/iBNOH3Q2qGCFL0wghS5BgorBgEEAYI3AwMBMYIU # qTCCFKUGCSqGSIb3DQEHAqCCFJYwghSSAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggF1 # BgsqhkiG9w0BCRABBKCCAWQEggFgMIIBXAIBAQYKKwYBBAGEWQoDATAxMA0GCWCG # SAFlAwQCAQUABCCSzNMZzXsKkTxaQghFkwfZLI/D5mudP/5395PTtdgdAgIGasBg # qSc5GBMyMDI2MTAxNTA4NTYwMS4yNDVaMASAAgH0AgkAz5js0Auay72ggemkgeYw # geMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsT # JE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMe # blNoaWVsZCBUU1MgRVNOOjQ5MUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3Nv # ZnQgUHVibGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eaCCDykwggeCMIIF # aqADAgECAhMzAAAABeXPD/9mLsmHAAAAAAAFMA0GCSqGSIb3DQEBDAUAMHcxCzAJ # BgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNV # BAMTP01pY3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZp # Y2F0ZSBBdXRob3JpdHkgMjAyMDAeFw0yMDExMTkyMDMyMzFaFw0zNTExMTkyMDQy # MzFaMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp # b24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGluZyBD # QSAyMDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnnznUmP94MWf # BX1jtQYioxwe1+eXM9ETBb1lRkd3kcFdcG9/sqtDlwxKoVIcaqDb+omFio5DHC4R # BcbyQHjXCwMk/l3TOYtgoBjxnG/eViS4sOx8y4gSq8Zg49REAf5huXhIkQRKe3Qx # s8Sgp02KHAznEa/Ssah8nWo5hJM1xznkRsFPu6rfDHeZeG1Wa1wISvlkpOQooTUL # Fm809Z0ZYlQ8Lp7i5F9YciFlyAKwn6yjN/kR4fkquUWfGmMopNq/B8U/pdoZkZZQ # bxNlqJOiBGgCWpx69uKqKhTPVi3gVErnc/qi+dR8A2MiAz0kN0nh7SqINGbmw5OI # RC0EsZ31WF3Uxp3GgZwetEKxLms73KG/Z+MkeuaVDQQheangOEMGJ4pQZH55ngI0 # Tdy1bi69INBV5Kn2HVJo9XxRYR/JPGAaM6xGl57Ei95HUw9NV/uC3yFjrhc087qL # JQawSC3xzY/EXzsT4I7sDbxOmM2rl4uKK6eEpurRduOQ2hTkmG1hSuWYBunFGNv2 # 1Kt4N20AKmbeuSnGnsBCd2cjRKG79+TX+sTehawOoxfeOO/jR7wo3liwkGdzPJYH # gnJ54UxbckF914AqHOiEV7xTnD1a69w/UTxwjEugpIPMIIE67SFZ2PMo27xjlLAH # WW3l1CEAFjLNHd3EQ79PUr8FUXetXr0CAwEAAaOCAhswggIXMA4GA1UdDwEB/wQE # AwIBhjAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUa2koOjUvSGNAz3vYr0np # Ptk92yEwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93 # d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNV # HSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAPBgNV # HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFMh+0mqFKhvKGZgEByfPUBBPaKiiMIGE # BgNVHR8EfTB7MHmgd6B1hnNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz # L2NybC9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3Ql # MjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3JsMIGUBggrBgEFBQcB # AQSBhzCBhDCBgQYIKwYBBQUHMAKGdWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w # a2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24l # MjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNydDANBgkq # hkiG9w0BAQwFAAOCAgEAX4h2x35ttVoVdedMeGj6TuHYRJklFaW4sTQ5r+k77iB7 # 9cSLNe+GzRjv4pVjJviceW6AF6ycWoEYR0LYhaa0ozJLU5Yi+LCmcrdovkl53DNt # 4EXs87KDogYb9eGEndSpZ5ZM74LNvVzY0/nPISHz0Xva71QjD4h+8z2XMOZzY7YQ # 0Psw+etyNZ1CesufU211rLslLKsO8F2aBs2cIo1k+aHOhrw9xw6JCWONNboZ497m # wYW5EfN0W3zL5s3ad4Xtm7yFM7Ujrhc0aqy3xL7D5FR2J7x9cLWMq7eb0oYioXhq # V2tgFqbKHeDick+P8tHYIFovIP7YG4ZkJWag1H91KlELGWi3SLv10o4KGag42psw # jybTi4toQcC/irAodDW8HNtX+cbz0sMptFJK+KObAnDFHEsukxD+7jFfEV9Hh/+C # SxKRsmnuiovCWIOb+H7DRon9TlxydiFhvu88o0w35JkNbJxTk4MhF/KgaXn0GxdH # 8elEa2Imq45gaa8D+mTm8LWVydt4ytxYP/bqjN49D9NZ81coE6aQWm88TwIf4R4Y # ZbOpMKN0CyejaPNN41LGXHeCUMYmBx3PkP8ADHD1J2Cr/6tjuOOCztfp+o9Nc+Zo # IAkpUcA/X2gSMkgHAPUvIdtoSAHEUKiBhI6JQivRepyvWcl+JYbYbBh7pmgAXVsw # ggefMIIFh6ADAgECAhMzAAAAWvYNZ4yF7d0IAAAAAABaMA0GCSqGSIb3DQEBDAUA # MGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # MjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGluZyBDQSAy # MDIwMB4XDTI2MDEwODE4NTkwM1oXDTI3MDEwNzE4NTkwM1owgeMxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJ # cmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1Mg # RVNOOjQ5MUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3NvZnQgUHVibGljIFJT # QSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIP # ADCCAgoCggIBAO/0O0eWjgUb9rnHcQLRdfWPN4H+91a3YnlaP46E1m4uD+JKx6cs # WMStX79fxLJUAqHJqQWE19UlNMhS9jEB32dAJ4yuWsHyUuM+dphjDz4E5jl4gYGZ # EmaOrKvNt+KqlFayyg/oTg3BlLRu4aBq8668A5qlHcfsuh6DdSqFID1ixJFZzHrZ # FG1iGBG7U1Bn2ONLDo7jbwX5rMcPduTAUw/c7M3WhSxQBuZpQiz8RQGKIqCKfIxg # QkKdzpCpU0SWQOE/DgTXbz3c15KMRCdkGlL2zb+lnuSV4sseQm3qflZiZckLyn2x # JI8ZXDkq+Ig+b/rsPPIfI8di228WvK1j67JXpyeVCaSUO9ErzlLnTrnjQkeXVQIp # 73xuVBVrmvoTf/v4a7MnrmuKSyIXc5vJUHEGB345+O8omFt1w8b+Xg9D9PKIRqDP # Ev7HRk0C+Yvxu8FvHJvSocSIZK+v/FmKFOipYnpP76yAmJNnyheucShOgk8QiU53 # USn/+AyMb7xW905gZnyNqb29HeVdQ175pDHJGEz8Cx5wiHeVliGz5hABucFDylR9 # z3LSTmB6+3ZuIxeG9BZS46P6ANPkuVuD5m8wgc7GLLzg73CsDF09ukt8Uf8dTcMB # X3ro+7/k9M6Xt8WPG7IL9v/4DvyMY03tkb9Y9Ri6HWavXRPYRCUePspPAgMBAAGj # ggHLMIIBxzAdBgNVHQ4EFgQUjmOyQ6twMcP1ZbRytJxI4fnXmcIwHwYDVR0jBBgw # FoAUa2koOjUvSGNAz3vYr0npPtk92yEwbAYDVR0fBGUwYzBhoF+gXYZbaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwUHVibGlj # JTIwUlNBJTIwVGltZXN0YW1waW5nJTIwQ0ElMjAyMDIwLmNybDB5BggrBgEFBQcB # AQRtMGswaQYIKwYBBQUHMAKGXWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lv # cHMvY2VydHMvTWljcm9zb2Z0JTIwUHVibGljJTIwUlNBJTIwVGltZXN0YW1waW5n # JTIwQ0ElMjAyMDIwLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsG # AQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBmBgNVHSAEXzBdMFEGDCsGAQQBgjdMg30B # ATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz # L0RvY3MvUmVwb3NpdG9yeS5odG0wCAYGZ4EMAQQCMA0GCSqGSIb3DQEBDAUAA4IC # AQCAlM8r+t3hIb2h1lDTAx+iYkQlxFuU7QONeyIFIBZ29xvGl8pehKxErDzIniOp # IX/eluUAwQKoaI0zwuKAdR0mrSHXCniMoLNko5W+5r7sXNamKX7QMV3BfGOX3gi9 # qVfxyUe7AHXbqQ8KBQHNYCnNFtQQHgARrlYhtyAKol5ctM0CAc/y3oY7bTMsVJvn # A5u7DVWPeXoST2KEMDeLBvJYq0IJZ6yMpDOWLZ4UP82bksyShIB/XdawirIGLdse # udryRxVMk313mAcjGRb59+Ittt6otVvYQWqH+PGrTUzEcez8aQuO3umoNZjKuFoX # 5VsPP/gSZse+orhG3zfZk9IDyE3DfUFrhvkv6H0tijK1D0uIGhwMBWSm9ktQ6oeU # +aurZFx3MI+LODnHsbRFZAy11uMvwKq+ZNC1Se4tIM1u9piWAhnTPoh6mULKikHO # VhHaO953tkzDCtjsse5GUKOx9yg9nqHKWMgnODp62/uPPzC/yDEISrXCcU7UB7tA # Tr3zWNEdtM4d009iXWI6dV/SdcIIX44rpoLyCLw+nXjxp+fY/dygLO7UdSQaVaUF # Vj3K2nVyuujPspt5Lunc5FvuYPqmi/z8kASmmwbiF+W0P0UTWFaC84MWfU2h6MDg # 5s0oxmdNFK76jXr3wZfdSoV7FCKfq5GdeGoy5UwDQwMC0DGCA9QwggPQAgEBMHgw # YTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEy # MDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5nIENBIDIw # MjACEzMAAABa9g1njIXt3QgAAAAAAFowDQYJYIZIAWUDBAIBBQCgggEtMBoGCSqG # SIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgqscGW6TJ1XYt # Lxn64IGogxBcPBCWC0hgGytk5FWyDtgwgd0GCyqGSIb3DQEJEAIvMYHNMIHKMIHH # MIGgBCBiuWRAi+p96PRsBt3TwW3jNozgPQS+Qco1CVm/NaU0QzB8MGWkYzBhMQsw # CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD # VQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAIT # MwAAAFr2DWeMhe3dCAAAAAAAWjAiBCCGp0gzKktPCttfbHUkxJPargotsNZtskPo # BDamUJTKUDANBgkqhkiG9w0BAQsFAASCAgCN/5CTB52BrUdcTB9Nn4XlkMYbC4pw # O7Mapf4lhluRjN0dAK+CLefF6wevImXHT4htuzKrs8EBjZPzvTuF3ZB+/SMA2No6 # LEOrWs0o/6AViuffxvllVjY6ol99IiUVvUWjl/WzaOsFiGXydxnOfteXHDGpRV0b # l0macrRY2S3icGmFPXm1f4gyvEyKVXVX00NOggqGhWi0Saebpg5YZYEwxZL3Oj7u # 44k2/ja05rTyKjANh2/0N27bk1qKHUn+nwSjg7BLR0fz2tLBNJAUtqehvD5bDlo0 # w+nAx6hLrL8XhdjlE1YkU/apN01E/0yrkCHAKv1cMWZeBKHd0b1RmTgP2hUB7f6o # 2/ss6IPJH58QDLIH9kr1Et3rQmW3kGVYc77TsmsRC0O7Ow4BDv+/E/Gv/++54Yp/ # D6pfngXsE2Yivxi+tbVYnlAq1DKqxjDoK1GX03jW/o/Qa/cHVykhIGrCKSLaBriS # PSi5qvVIIcAltQkKfUqNumeQMRo7VubqKySLHURY0gxGtZD7QK6POdjJeBAD4/xY # AKCz8TwLvc+kslcb0wGjkLUbKDzJG7ywHeDVvUq8eTiCD17nKJPnquJHeq1waQFg # pqNbJs7GWLYh0egbFPsCuLkMVdeXnH0EK2VFg2sQn2Cl0loW+tdeRpvH5XvdgOP0 # TRjdZ+KgJgbnkw== # SIG # End signature block |