####################################################################################
#                                                                                  #
# Attivo Networks, Inc.                                                            #
#                                                                                  #
# CONFIDENTIAL                                                                     #
#                                                                                  # 
# Copyright 2014 - 2015 Attivo Networks, Inc.   All Rights Reserved.               #
#                                                                                  #  
# NOTICE: All information contained in this file, is and shall remain the property #
# of Attivo Networks and its suppliers, if any.                                    #
#                                                                                  #
# The intellectual and technical concepts contained herein are confidential and    #
# proprietary to Attivo Networks and are protected by trade secret and copyright   #
# law.  In addition, elements of the technical concepts are patent pending.        #
# This file is part of the Attivo Networks BOTsink Solutions product suite.        # 
# No part of the BOTsink Solutions product suite, including this file, may be used,#
# copied, or modified, except in accordance with the terms contained in the Attivo #
# Networks license agreement under which you obtained this file.  In no case may   #
# you use this software outside of its intended use or distribute this software to # 
# 3rd parties.                                                                     # 
#                                                                                  # 
####################################################################################

param (
    [switch]$NoAvCheck = $false
 )
 
$currDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)

Function UserConvertFrom-JSON {
    param(
        $json,
        [switch]$raw  
    )

    Begin
    {
    	$script:startStringState = $false
    	$script:valueState = $false
    	$script:arrayState = $false	
    	$script:saveArrayState = $false
        $script:startQuoteState = $false
        $script:escapeState = $false

    	function scan-characters ($c) {
    		switch -regex ($c)
    		{
    			"{" { 
                        if($script:startQuoteState -eq $false) {
                            "(New-Object PSObject "
    				        $script:saveArrayState=$script:arrayState
    				        $script:valueState=$script:startStringState=$script:arrayState=$false	
                        } else {
                                $c
                        }    							
    			    }
    			"}" { 
                        if($script:startQuoteState -eq $false) {
                           ")"; $script:arrayState=$script:saveArrayState
                        } else {
                                $c
                        }
                    }
    			'"' {
                        if($script:escapeState -ne $true)
                        {
                            if($script:startQuoteState -eq $true) {
                                $script:startQuoteState = $false
                            }
                            else {
                                $script:startQuoteState = $true
                            }
    				        if($script:startStringState -eq $false -and $script:valueState -eq $false -and $script:arrayState -eq $false) {
    					        '| Add-Member -Passthru NoteProperty "'
                        
    				        }
    				        else {'"'}
    				        $script:startStringState = $true
                        }
                        else
                        {
                            $c
                        }
    			    }    			

    			":" {                       
                        if($script:startQuoteState -eq $false) {
                        " " ;$script:valueState = $true
                        } else {
                            $c
                        }
                    }
    			"," {
                    if($script:startQuoteState -eq $false) {
    				    if($script:arrayState) { "," }
    				    else { $script:valueState = $false; $script:startStringState = $false }
                    } else {
                            $c
                    }
    			}	
    			"\[" { 
                        if($script:startQuoteState -eq $false) {
                            "@("; $script:arrayState = $true 
                        } else {
                                $c
                        }
                     }
    			"\]" { 
                        if($script:startQuoteState -eq $false) {
                            ")"; $script:arrayState = $false 
                        } else {
                                $c
                        }                        
                     }
                "\\" 
                    {
                    	if($script:escapeState -ne $true)
						{
							$script:escapeState = $true
                            $c = $null
						}
                        else
                        {
                            $c
                        }
                    }
    			"[\t\r\n]" {}

                default { $c }
    		}
    	}
    	
    	function parse($target)
    	{
            $result = ""
            ForEach($c in $target.ToCharArray()) {	
                $char = scan-characters $c
                if($char -ne $null)
                {
                    if($char -eq '$' -or $char -eq '`') 
                    {
                        $char = '`' + $char
                        $script:escapeState = $false						
                    }
                    elseif ( $script:escapeState -eq $true -and ($char -eq '"' ))
                    {
                        $char = '`' + $char
                        $script:escapeState = $false
                    }
                    elseif($script:escapeState -eq $true -and ($char -ne '"' ) )
                    {
                        #$char = '\' + $char
                        $script:escapeState = $false
                    }
                    
                    $result = $result + $char
                }
            }
            $result 	
    	}
    }

    Process { 
        if($_) { $result = parse $_ } 
    }

    End { 
        If($json) { $result = parse $json }

        If(-Not $raw) {
            $result | Invoke-Expression
        } else {
            $result 
        }
    }
}

#[string]$AvJson = "{`"SoftwareRules`": [{`"servicename`": `"SentinelAgent`",`"processname`" : `"SentinelAgent.exe`",`"publishername`" : `"Sentinel Labs, Inc.`",`"name`" : `"SentinelOne AV`",`"id`" : 1000}]}"
#Above is the format for adding new rules in the following $AvJson  

[string]$AvJson = "{`"SoftwareRules`": []}"


[string] $global:InstalledAvs=""

Function CheckFor3rdPartyAVInstalled
{
	try
	{
		$NameSpace = Get-WmiObject -Namespace "root" -Class "__Namespace" | Select Name | Out-String -Stream | Select-String "SecurityCenter"
		foreach ($SecurityCenter in $NameSpace) 
		{ 
			$AvDisplayName = (Get-WmiObject -Namespace "root\$SecurityCenter" -Class AntiVirusProduct -ErrorAction SilentlyContinue).displayName

		    foreach ($AVName in $AvDisplayName) 
		    {
			    if ( $AVName -ne $NULL -and $AVName.length -gt 1)
			    {
				    if ($global:InstalledAvs -eq $NULL -or $global:InstalledAvs.length -eq 0)
				    {
					    $global:InstalledAvs = $AVName
				    }
				    else
				    {
					    $global:InstalledAvs =  $global:InstalledAvs + "`n" + $AVName
				    }
			    }
            }				
		}
		
		$json = $AvJson | UserConvertFrom-Json

		$numOfRules = $json.SoftwareRules | measure
		$AVrules = $json.SoftwareRules

		for($i=0; $i -le ($numOfRules.count - 1); $i++)
		{
			$ServiceName = $AVrules[$i].servicename
			$ProcessName = $AVrules[$i].processname
			$PublisherName = $AVrules[$i].publishername
			$Name = $AVrules[$i].name

			$ImagePath = (gwmi win32_service | ?{$_.Name -like "$ServiceName"}).pathname

			if ( $ImagePath -eq $NULL -or $ImagePath.length -le 0 )
			{
				continue;
			}   

			$ImagePath = [System.Environment]::ExpandEnvironmentVariables($ImagePath)
			$newProcessname = "\" + $ProcessName

			if ($ImagePath -like "*$newProcessname*" )
			{
				$ImagePath = $ImagePath.replace("`"","");
				$Subject = (Get-AuthenticodeSignature -Filepath $ImagePath).SignerCertificate.Subject

				if( $Subject -eq $NULL -or $Subject.length -le 0 )
				{
					continue;
				}
				
				if ( ($Subject -like "*CN=$PublisherName*") -or ($Subject -like "*CN=`"$PublisherName*") )
				{
					if ($global:InstalledAvs -eq $NULL -or $global:InstalledAvs.length -eq 0)
					{
						$global:InstalledAvs = $Name
					}
					else
					{
						$global:InstalledAvs =  $global:InstalledAvs + "`n" + $Name
					}
				}
			}
		}
	}
	catch
	{
        write-Host "Exception while getting Security product information: Details: $($_.Exception.Message)"
        return
	}		
}

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) 
{
	if ( $NoAvCheck )
	{
		Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & `"$PSCommandPath -NoAvCheck`";`"";
	}
	else
	{
		Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`"";
	}
    exit;
}

if($NoAvCheck -eq $false)
{
	Write-host "Checking for AV/EDR Installations`n"

	CheckFor3rdPartyAVInstalled

	if ( $global:InstalledAvs -ne $NULL -and $global:InstalledAvs.Length -ne 0 )
	{
		do
		{
			Write-host "Following Endpoint Security product(s) discovered on the endpoint`n"
			Write-host "$InstalledAvs`n"
			Write-host -ForegroundColor Yellow "Please add Attivo Application/files in the above Security Products exclusions. Please refer to Attivo documentation for more details.`n"
			Write-host "1. If exclusions is NOT configured in discovered endpoint security products, abort the Attivo Installation[Enter 1 below]."
			Write-host -ForegroundColor Red "   Caution: System behaviour might be unpredicitable if you proceed with the installation"
			Write-host "2. If exclusions is configured in discovered endpoint security products, Continue with the installation[Enter 2 below].`n"
			
			$userresponse1 = Read-host "Enter your choice"
			
			If ($userresponse1 -eq "1")
			{
				write-host -ForegroundColor Yellow "`nAborting the endpoint installation. No files on the endpoint were modified."
				pause			
				exit
			}
			elseif ($userresponse1 -eq "2")
			{
				write-host "`nInstalling Attivo endpoint...`n"	
			}
			#else
			#{
			#	write-host "`nPlease type the choose option 1 or 2`n"
			#}
		}until ((($userresponse1 -eq "1") -or ($userresponse1 -eq "2")))
	}
	else
	{
		Write-host "No Endpoint Security products discovered. Continuing installation. !`n"
	}
}

do
{
$userresponse = Read-host "
1. Install with default parameters (Recommended)  
2. Install default parameters with detailed logging (For Troubleshooting only)
3. Custom options. You will be required to provide the parameters later. 

Enter your Choice"


If ($userresponse -eq "1")
    {
        write-host "`nInstalling Attivo Endpoint software "
        start-process $pwd\Windowssetup.exe -ArgumentList "/ia /service " -NoNewWindow -Wait -PassThru
    }
elseif ($userresponse -eq "2")
   {
        write-host "`nInstalling Attivo Endpoint software with detailed logging enabled..."
        start-process $pwd\Windowssetup.exe  -ArgumentList "/ia /service /v2" -NoNewWindow -Wait -PassThru
   }
elseif ($userresponse -eq "3")
	{
        $CustomParameter = Read-host "`nEnter installation parameters (without the installation binary name.) [/ia /service]"
        start-process $pwd\Windowssetup.exe  -ArgumentList $CustomParameter -NoNewWindow -Wait -PassThru
	}
#else
#    {
#        write-host "Please type the choose option 1 or 2"
#    }
}until ((($userresponse -eq "1") -or ($userresponse -eq "2") -or ($userresponse -eq "3")))

$findfolderPD = get-childitem C:\ProgramData\*\?.?.?.*
$findfolderPF = get-childitem "C:\Program Files\*\?.?.?.*"

if ($findfolderPD -and $userresponse -ne "3")
{
    Write-host "`nInstall Path $findfolderPD"
    write-host "Checking Installation completed. Verifying installation and Endpoint Service Status"
    $Installpath = $findfolderPD.FullName
    $findsys = Get-ChildItem -Path $Installpath 
    [string]$Service = $findsys.Name | Select-String -Pattern "_setup.exe"
    $Servicename = $Service -replace "_setup.exe"
    $statuscount = 0
    do
    {
        if (Get-Service $Servicename -ErrorAction SilentlyContinue)
		{
			if ((Get-Service $serviceName).Status -eq 'Running')
			{
				write-host -ForegroundColor Green "Endpoint Service discovered. Installation Successful. "
				break
			}
			else
			{
				$statuscount++
				Start-Sleep -s 5
			}
		}
		else
		{
			$statuscount++
			Start-Sleep -s 5
		}
    }
    until($statuscount -eq 5)
	if ( $statuscount -ge 5 )
	{
		write-host -ForegroundColor Red "Service not Discovered. Please reinstall in Debug Mode (Choose 2) & Contact Attivo Support for further help."
	}
}
elseif ($findfolderPD -and $userresponse -ne "3")
{
    Write-host "`nInstall Path $findfolderPF"
    write-host "Checking Installation completed. Verifying installation and Endpoint Service Status"
    $Installpath = $findfolderPF.FullName
    $findsys = Get-ChildItem -Path $Installpath 
    [string]$Service = $findsys.Name | Select-String -Pattern "_setup.exe"
    $Servicename = $Service -replace "_setup.exe"
    $statuscount = 0
	do
	{
		if (Get-Service $Servicename -ErrorAction SilentlyContinue)
		{
			if ((Get-Service $serviceName).Status -eq 'Running')
			{
				write-host -ForegroundColor Green "Endpoint Service discovered. Installation Successful. "
				break
			}
			else
			{
				$statuscount++
				Start-Sleep -s 5
			}
		}
		else
		{
			$statuscount++
			Start-Sleep -s 5
		}
    }
    until($statuscount -eq 5)
	
	if ( $statuscount -ge 5 )
	{
		write-host -ForegroundColor Red "Service not Discovered. Please reinstall in Debug Mode (Choose 2) & Contact Attivo Support for further help."
	}
}
elseif ($userresponse -ne "3") 
{
    write-host -ForegroundColor Red "Service not Discovered. Please reinstall in Debug Mode (Choose 2) & Contact Attivo Support for further help."
}

pause


# SIG # Begin signature block
# MIIqegYJKoZIhvcNAQcCoIIqazCCKmcCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU3YyAtdDsPV8G0pF1oOt7qP/w
# ORuggiSuMIIFOzCCAyOgAwIBAgIKYSBNtAAAAAAAJzANBgkqhkiG9w0BAQUFADB/
# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQDEyBN
# aWNyb3NvZnQgQ29kZSBWZXJpZmljYXRpb24gUm9vdDAeFw0xMTA0MTUxOTQ1MzNa
# Fw0yMTA0MTUxOTU1MzNaMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy
# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNVBAMTIkRpZ2lD
# ZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUA
# A4IBDwAwggEKAoIBAQDGzOVz5vvUu+UtLTKm3+WBP8nNJUm2cSrD1ZQ0Z6IKHLBf
# aaZAscS3so/QmKSpQVk609yU1jzbdDikSsxNJYL3SqVTEjju80ltcZF+Y7arpl/D
# pIT4T2JRvvjF7Ns4kuMG5QiRDMQoQVX7y1qJFX5x6DW/TXIJPb46OFBbdzEbjbPH
# JEWap6xtABRaBLe6E+tRCphBQSJOZWGHgUFQpnlcid4ZSlfVLuZdHFMsfpjNGgYW
# pGhz0DQEE1yhcdNafFXbXmThN4cwVgTlEbQpgBLxeTmIogIRfCdmt4i3ePLKCqg4
# qwpkwr9mXZWEwaElHoddGlALIBLMQbtuC1E4uEvLAgMBAAGjgcswgcgwEQYDVR0g
# BAowCDAGBgRVHSAAMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud
# DgQWBBSxPsNpA/i/RwHUmCYaCALvY2QrwzAfBgNVHSMEGDAWgBRi+wohW39DbhHa
# CVRQa/XSlnHxnjBVBgNVHR8ETjBMMEqgSKBGhkRodHRwOi8vY3JsLm1pY3Jvc29m
# dC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNyb3NvZnRDb2RlVmVyaWZSb290LmNy
# bDANBgkqhkiG9w0BAQUFAAOCAgEAIIzBWe1vnGstwUo+dR1FTEFQHL2A6tmwkosG
# KhM/UxaeVjlqimO2eCR59X24uUehCpbC9su9omafBuGs0nkJDv083KwCDHCvPxvs
# eH7U60sFYCbZc2GRIe2waGPglxKrb6AS7dmf0tonPLPkVvnR1IEPcb1CfKaJ3M3V
# vZWiq/GTEX3orDEpqF1mcEGd/HXJ1bMaOSrQhQVQi6yRysSTy3GlnaSUb1gM+m4g
# xAgxtYWdfoH50j3KWxiFbAqG7CIJG6V0NE9/KLyVSqsdtpiwXQmkd3Z+76eOXYT2
# GCTL0W2mw6GcwhB1gP+dMv3mz0M6gvfOj+FyKptit1/tlRo5XC+UbUi3AV8zL7vc
# LXM0iQRCChyLefmj+hfv+qEaEN/gssGV61wMBZc7NT4YiE3bbL8kiY3Ivdifezk6
# JKDV39HzShqX9qZveh+wkKmzrAE5kdNht2TxPlc4A6/OetK1kPWu3DmZ1bY8l+2m
# yxbHfWsqTJCU5kxU/R7NIOzOaJyHWOlhYL7rDsnVGX2f6Xi9DqwhdQePqW7gjGoq
# a5zj52W8vC08bdwE3GdFNjKvBIG8qABuYUyVxVzUjo6fL8EydL29EWUDB83vt14C
# V9qG1BooNK+ISbLPpd2CVm9oqhTiWVT+/+ru7+qScCJggeMlI8CfzA9JsjWqWMM6
# w9kWlBAwggWNMIIEdaADAgECAhAOmxiO+dAt5+/bUOIIQBhaMA0GCSqGSIb3DQEB
# DAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNV
# BAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQg
# SUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBaFw0zMTExMDkyMzU5NTlaMGIxCzAJ
# BgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
# aWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDCC
# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL/mkHNo3rvkXUo8MCIwaTPs
# wqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3EMB/zG6Q4FutWxpdtHauyefLKEdLk
# X9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKyunWZanMylNEQRBAu34LzB4TmdDtt
# ceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsFxl7sWxq868nPzaw0QF+xembud8hI
# qGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU15zHL2pNe3I6PgNq2kZhAkHnDeMe2
# scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJBMtfbBHMqbpEBfCFM1LyuGwN1XXhm
# 2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObURWBf3JFxGj2T3wWmIdph2PVldQnaH
# iZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6nj3cAORFJYm2mkQZK37AlLTSYW3r
# M9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxBYKqxYxhElRp2Yn72gLD76GSmM9GJ
# B+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5SUUd0viastkF13nqsX40/ybzTQRES
# W+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+xq4aLT8LWRV+dIPyhHsXAj6Kxfgom
# mfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIBNjAPBgNVHRMBAf8EBTADAQH/MB0G
# A1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwPTzAfBgNVHSMEGDAWgBRF66Kv9JLL
# gjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMCAYYweQYIKwYBBQUHAQEEbTBrMCQG
# CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKG
# N2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJv
# b3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQu
# Y29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDARBgNVHSAECjAIMAYGBFUd
# IAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0NcVec4X6CjdBs9thbX979XB72arKGH
# LOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnovLbc47/T/gLn4offyct4kvFIDyE7Q
# Kt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65ZyoUi0mcudT6cGAxN3J0TU53/oWajw
# vy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFWjuyk1T3osdz9HNj0d1pcVIxv76FQ
# Pfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPFmCLBsln1VWvPJ6tsds5vIy30fnFq
# I2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9ztwGpn1eqXijiuZQwggWrMIIEk6AD
# AgECAhAKwIa4JLYm2kN+RqKvr7WRMA0GCSqGSIb3DQEBBQUAMGUxCzAJBgNVBAYT
# AlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2Vy
# dC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEVWIENvZGUgU2lnbmluZyBDQTAeFw0y
# MDExMjUwMDAwMDBaFw0yNDAxMDUyMzU5NTlaMIHVMRMwEQYLKwYBBAGCNzwCAQMT
# AlVTMRkwFwYLKwYBBAGCNzwCAQITCERlbGF3YXJlMR0wGwYDVQQPDBRQcml2YXRl
# IE9yZ2FuaXphdGlvbjEQMA4GA1UEBRMHNTAwNjI0MjELMAkGA1UEBhMCVVMxEzAR
# BgNVBAgTCkNhbGlmb3JuaWExEDAOBgNVBAcTB0ZyZW1vbnQxHjAcBgNVBAoTFUF0
# dGl2byBOZXR3b3JrcywgSW5jLjEeMBwGA1UEAxMVQXR0aXZvIE5ldHdvcmtzLCBJ
# bmMuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqSHlmK7rbE25Rbgx
# ouM3Umu9TrYYxiE2NctF3JH6iPRcsYJFGO/uC7V0djoR5owgJxgiLp/zMJBqvOXL
# /hikrccA3yvG7xH+MwwB2RwsSbJOjEoOAbDLvIRUeeEFcxGPB5nH/vA47smbLnXe
# OjL5yaTHC2TQzyJqWcujacmMtDj2NGj1cOzF246BtK5Dd4lY0itwkeKfoOSihBQW
# 93FRUzpcKRXAWU/Pfw4I7KQ6k2wtmmQ4JHED5PvZb8Fh5hAF9wdCBpYZvOdjGFAU
# QqJw23TFqdppPZJVqXc69B0F3ANMLeAo43hj6ViS2sXa9er+N2V4VdIiw1z3F5ZK
# QkNCewIDAQABo4IB5DCCAeAwHwYDVR0jBBgwFoAUrWkGcPyAGxazqRiUa5QChl73
# J4wwHQYDVR0OBBYEFKIiGWJ66Crg3Ffi/pDvJzF7m7L4MC4GA1UdEQQnMCWgIwYI
# KwYBBQUHCAOgFzAVDBNVUy1ERUxBV0FSRS01MDA2MjQyMA4GA1UdDwEB/wQEAwIH
# gDATBgNVHSUEDDAKBggrBgEFBQcDAzBzBgNVHR8EbDBqMDOgMaAvhi1odHRwOi8v
# Y3JsMy5kaWdpY2VydC5jb20vRVZDb2RlU2lnbmluZy1nMS5jcmwwM6AxoC+GLWh0
# dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9FVkNvZGVTaWduaW5nLWcxLmNybDBLBgNV
# HSAERDBCMDcGCWCGSAGG/WwDAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5k
# aWdpY2VydC5jb20vQ1BTMAcGBWeBDAEDMHkGCCsGAQUFBwEBBG0wazAkBggrBgEF
# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRw
# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRFVkNvZGVTaWduaW5nQ0Eu
# Y3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQEFBQADggEBADy9GxfAPISa1LZB
# U7u4zDLsrh1lgL6/a+BhtX+toLkEje9Nv8NsoxpgeufZelFL+U2lAxwblvJI4vCu
# cBh5cYrN5OkN98uCTU23EFeuBlYRdLn4c74PyZTR339AOKIRY2+M3JMws/oOhFbr
# RaQd9fHFNOeIExwFaDt2jXFPgYYuYcipzETNA9cJPnATZfdvKEaGc1yWuDI57q82
# qrt0iynfDL4T3Z6Le6Lzu/LKJK1apNGvqQAfB268Dvbv1VWE1B9VYw/SIOs5Y6RC
# +wFYg8UqdZgBjfLTe/2o2s/SYr6E+ftEWlCHyVLpwqt8o0geG6zMGh0ebNIYDEwJ
# pUq2YqIwggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqGSIb3DQEB
# CwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNV
# BAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQg
# Um9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMxCzAJBgNV
# BAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNl
# cnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwggIi
# MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXHJQPE8pE3
# qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMfUBMLJnOW
# bfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w1lbU5ygt
# 69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRktFLydkf3
# YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYbqMFkdECn
# wHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUmcJgmf6Aa
# RyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP65x9abJTy
# UpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzKQtwYSH8U
# NM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo80VgvCON
# WPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjBJgj5FBAS
# A31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXcheMBK9Rp61
# 03a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAd
# BgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU7NfjgtJx
# XWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUF
# BwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln
# aWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJo
# dHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNy
# bDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQEL
# BQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd4ksp+3CK
# Daopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiCqBa9qVbP
# FXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl/Yy8ZCaH
# bJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeCRK6ZJxur
# JB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYTgAnEtp/N
# h4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/a6fxZsNB
# zU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37xJV77Qpf
# MzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmLNriT1Oby
# F5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0YgkPCr2B
# 2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJRyvmfxqk
# hQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIGtTCCBZ2g
# AwIBAgIQDdDjN0rJW9v6a0NLKkjsBjANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
# EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
# cnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290
# IENBMB4XDTEyMDQxODEyMDAwMFoXDTI3MDQxODEyMDAwMFowZTELMAkGA1UEBhMC
# VVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0
# LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgRVYgQ29kZSBTaWduaW5nIENBMIIBIjAN
# BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuQZ0HF20IKqpIagqQkarJSAXJcsi
# j5CioDFrgwV1r7IOfBJJe2qGZIQPg9xkubFuFgU+HJW55+eIbbhigZB51N314pb5
# w7WII1dKGs9xKekIAI+1mOOnMv2sLrj0k1P0CjlDka/Va+jUn0a9jj2r4vkr1OoA
# QGYkt+h/tER1jXiarjHBN89OH1v4RUrXP8LJkgZkvt4Giq/Q6Iqx8CyIAG8L3IWn
# TMsGv9YuKjJuKXGvjiLzD9DYmEgtqAjLtosjwmPgtnPrb30mT4v3ND03hgy3eCf0
# wobbQ2ta+D099OiwYlbG5+14ofv9enJPMmXEfMPEd6AEMjLtjz+vht1+0QIDAQAB
# o4IDWDCCA1QwEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwEwYD
# VR0lBAwwCgYIKwYBBQUHAwMwfwYIKwYBBQUHAQEEczBxMCQGCCsGAQUFBzABhhho
# dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wSQYIKwYBBQUHMAKGPWh0dHA6Ly9jYWNl
# cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEhpZ2hBc3N1cmFuY2VFVlJvb3RDQS5j
# cnQwgY8GA1UdHwSBhzCBhDBAoD6gPIY6aHR0cDovL2NybDMuZGlnaWNlcnQuY29t
# L0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENBLmNybDBAoD6gPIY6aHR0cDov
# L2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0SGlnaEFzc3VyYW5jZUVWUm9vdENB
# LmNybDCCAcQGA1UdIASCAbswggG3MIIBswYJYIZIAYb9bAMCMIIBpDA6BggrBgEF
# BQcCARYuaHR0cDovL3d3dy5kaWdpY2VydC5jb20vc3NsLWNwcy1yZXBvc2l0b3J5
# Lmh0bTCCAWQGCCsGAQUFBwICMIIBVh6CAVIAQQBuAHkAIAB1AHMAZQAgAG8AZgAg
# AHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMAYQB0AGUAIABjAG8AbgBzAHQAaQB0
# AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4AYwBlACAAbwBmACAAdABoAGUAIABE
# AGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAAUwAgAGEAbgBkACAAdABoAGUAIABS
# AGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAAQQBnAHIAZQBlAG0AZQBuAHQAIAB3
# AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkAYQBiAGkAbABpAHQAeQAgAGEAbgBk
# ACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIAYQB0AGUAZAAgAGgAZQByAGUAaQBu
# ACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUALjAdBgNVHQ4EFgQUrWkGcPyAGxaz
# qRiUa5QChl73J4wwHwYDVR0jBBgwFoAUsT7DaQP4v0cB1JgmGggC72NkK8MwDQYJ
# KoZIhvcNAQEFBQADggEBAJ5bljouEoisqwFtpJ915AGHo6Uy17y6qX6j1hQX98IT
# a3xzjytq5Q8mWWiwjiWbbO/6bJOSCMFNz0WenEbWHnShmxSj+gEvSrEB4XJASBET
# aLk2nZFL18I5EhDBxNy7YhQUKmFdTzh8Zh/GG/+tvk9/lFtzQwAPTXO3Uc8O9nfA
# W800jNljE6oOYRHW8o4n/LR7uLkRIJGGeOoO1Cj/KtUkOOg3suyWu5+8ShZQ4V6/
# UX0joDLHwZSeesnAJqLMJYegEn50ny2NscjnhL650eneu2pOiHNx4SI4yySH6XN+
# UbL/mOtOfi/gyg76s17RugVCqEifg/Y/xMqo32igUGEwggbAMIIEqKADAgECAhAM
# TWlyS5T6PCpKPSkHgD1aMA0GCSqGSIb3DQEBCwUAMGMxCzAJBgNVBAYTAlVTMRcw
# FQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3Rl
# ZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwHhcNMjIwOTIxMDAw
# MDAwWhcNMzMxMTIxMjM1OTU5WjBGMQswCQYDVQQGEwJVUzERMA8GA1UEChMIRGln
# aUNlcnQxJDAiBgNVBAMTG0RpZ2lDZXJ0IFRpbWVzdGFtcCAyMDIyIC0gMjCCAiIw
# DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAM/spSY6xqnya7uNwQ2a26HoFIV0
# MxomrNAcVR4eNm28klUMYfSdCXc9FZYIL2tkpP0GgxbXkZI4HDEClvtysZc6Va8z
# 7GGK6aYo25BjXL2JU+A6LYyHQq4mpOS7eHi5ehbhVsbAumRTuyoW51BIu4hpDIjG
# 8b7gL307scpTjUCDHufLckkoHkyAHoVW54Xt8mG8qjoHffarbuVm3eJc9S/tjdRN
# lYRo44DLannR0hCRRinrPibytIzNTLlmyLuqUDgN5YyUXRlav/V7QG5vFqianJVH
# hoV5PgxeZowaCiS+nKrSnLb3T254xCg/oxwPUAY3ugjZNaa1Htp4WB056PhMkRCW
# fk3h3cKtpX74LRsf7CtGGKMZ9jn39cFPcS6JAxGiS7uYv/pP5Hs27wZE5FX/Nurl
# fDHn88JSxOYWe1p+pSVz28BqmSEtY+VZ9U0vkB8nt9KrFOU4ZodRCGv7U0M50GT6
# Vs/g9ArmFG1keLuY/ZTDcyHzL8IuINeBrNPxB9ThvdldS24xlCmL5kGkZZTAWOXl
# LimQprdhZPrZIGwYUWC6poEPCSVT8b876asHDmoHOWIZydaFfxPZjXnPYsXs4Xu5
# zGcTB5rBeO3GiMiwbjJ5xwtZg43G7vUsfHuOy2SJ8bHEuOdTXl9V0n0ZKVkDTvpd
# 6kVzHIR+187i1Dp3AgMBAAGjggGLMIIBhzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0T
# AQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAgBgNVHSAEGTAXMAgGBmeB
# DAEEAjALBglghkgBhv1sBwEwHwYDVR0jBBgwFoAUuhbZbU2FL3MpdpovdYxqII+e
# yG8wHQYDVR0OBBYEFGKK3tBh/I8xFO2XC809KpQU31KcMFoGA1UdHwRTMFEwT6BN
# oEuGSWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFJT
# QTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcmwwgZAGCCsGAQUFBwEBBIGDMIGA
# MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wWAYIKwYBBQUH
# MAKGTGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRH
# NFJTQTQwOTZTSEEyNTZUaW1lU3RhbXBpbmdDQS5jcnQwDQYJKoZIhvcNAQELBQAD
# ggIBAFWqKhrzRvN4Vzcw/HXjT9aFI/H8+ZU5myXm93KKmMN31GT8Ffs2wklRLHiI
# Y1UJRjkA/GnUypsp+6M/wMkAmxMdsJiJ3HjyzXyFzVOdr2LiYWajFCpFh0qYQitQ
# /Bu1nggwCfrkLdcJiXn5CeaIzn0buGqim8FTYAnoo7id160fHLjsmEHw9g6A++T/
# 350Qp+sAul9Kjxo6UrTqvwlJFTU2WZoPVNKyG39+XgmtdlSKdG3K0gVnK3br/5iy
# JpU4GYhEFOUKWaJr5yI+RCHSPxzAm+18SLLYkgyRTzxmlK9dAlPrnuKe5NMfhgFk
# nADC6Vp0dQ094XmIvxwBl8kZI4DXNlpflhaxYwzGRkA7zl011Fk+Q5oYrsPJy8P7
# mxNfarXH4PMFw1nfJ2Ir3kHJU7n/NBBn9iYymHv+XEKUgZSCnawKi8ZLFUrTmJBF
# YDOA4CPe+AOk9kVH5c64A0JH6EE2cXet/aLol3ROLtoeHYxayB6a1cLwxiKoT5u9
# 2ByaUcQvmvZfpyeXupYuhVfAYOd4Vn9q78KVmksRAsiCnMkaBXy6cbVOepls9Oie
# 1FqYyJ+/jbsYXEP10Cro4mLueATbvdH7WwqocH7wl4R44wgDXUcsY6glOJcB0j86
# 2uXl9uab3H4szP8XTE0AotjWAQ64i+7m4HJViSwnGWH2dwGMMYIFNjCCBTICAQEw
# eTBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
# ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBFViBDb2RlIFNp
# Z25pbmcgQ0ECEArAhrgktibaQ35Goq+vtZEwCQYFKw4DAhoFAKBwMBAGCisGAQQB
# gjcCAQwxAjAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcC
# AQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBR/Rfkf898FBtFrGlI1
# oLYrvHwTyDANBgkqhkiG9w0BAQEFAASCAQA0WCnT2SYbgkLWR58eklFAGaXMQATE
# CiefsGhvh4cLcLxUHILzDTA71bffBOcC4hbeQvv/yvOO5Ei/QlqGjyKSOiJRkkUQ
# TGVXdM4bHyj4ElTArUwCw4FWEQBmHUw2Koa+WAJ7eVZaXwLOEz1LMWfokoptvj3W
# 64bxRLA/qAa0g080xwKACAvWqpyjhNXRlo8o6AdcSzwKsTN1p8+wMw5lzSddoHa9
# 2DWbqOn0oDb5Yir89Lfa+vgir+2N07tZ7Dyb3Nv1T0sVJ74V4LRb8dD6nvxmIUnL
# LfTiGGmY+qO/Qr1q6L82UHpmycL1S/ElO04Eenp0Wns8xhpIfIk7Ywh9oYIDIDCC
# AxwGCSqGSIb3DQEJBjGCAw0wggMJAgEBMHcwYzELMAkGA1UEBhMCVVMxFzAVBgNV
# BAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0
# IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQQIQDE1pckuU+jwqSj0pB4A9
# WjANBglghkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJ
# KoZIhvcNAQkFMQ8XDTIzMDExOTA1MjgwNlowLwYJKoZIhvcNAQkEMSIEIAvWJFVl
# cEOf4XWrSWYVQwa/VTo/24soHx6U9FhaRagDMA0GCSqGSIb3DQEBAQUABIICADch
# +4+w/RQNh4I3DL0f5qcRKAtaHdlkbjxneFYiasomvqP1YvONCSEbfnGk69VzV7eK
# p/c0t5B54tDGLU5e4MncE+yDhcyr3Jxyab7YWdLtTczMItT1M0koZ7dxRBldhFk8
# VxTPrw0E04MpbxmQP8wJs264+PS2hgAUZ6tb4z4Edel+RXVx0sorVzdVwaKbSb53
# /BV17o+1YiQVrxgxE6d9Zt6qFsKomgCJ4cl8w/fEzE+cbu41nLs9CHlir7fUTjab
# Y7VzPgiAGc0fmxO8bc3972OfACUFWDT2azTHsGbtwYW24sk+ym99RA/O6REYEgWe
# jfKCV/k/rphCregh1ksHwwe9/4keqbWfaokri7C/n8DAq2dB/h7RdWOMeU9Reo3D
# WlSeU6ARGqJNsE1s0S+77LuoF2CRLtbyLkokamZy93qpoVWuGsROceMws9rfOcd3
# 1Kpt4kqSPglCdWsvibGYsz4TOxWw/b8hbj+9BX61Ag5udQb8ScJ7Lc28nhVh69NB
# sYoTZA/Vc/qk5lkzllC/DnnClnqYpLQg1SVJzvkZzph7KWJMVGR3Cmxj9q6injmG
# dqDa/JGCa4B/ye89SNUkziwwu+YIl+OL/ykhgER+VnedsxFywNmtzWyEZ2+p6/rX
# YqKLNsidqRljqGMsLt1U4knk+GQYQ4XjJaVmenPl
# SIG # End signature block
