Public/Install-SitecoreLocal.ps1
#Set-StrictMode -Version Latest ##################################################### # Install-SitecoreLocal ##################################################### <#PSScriptInfo .VERSION 0.0 .GUID 602bc07e-a621-4738-8c27-0edf4a4cea8e .AUTHOR David Walker, Sitecore Dave, Radical Dave .COMPANYNAME David Walker, Sitecore Dave, Radical Dave .COPYRIGHT David Walker, Sitecore Dave, Radical Dave .TAGS sitecore powershell local deploy develop devops install iis solr .LICENSEURI https://github.com/SitecoreDave/SharedSitecore.SitecoreLocal/blob/main/LICENSE .PROJECTURI https://github.com/SitecoreDave/SharedSitecore.SitecoreLocal .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES #> <# .SYNOPSIS PowerShell Module for Local Sitecore deployment/development .DESCRIPTION PowerShell Module for installing Local Sitecore deployment/development - Install-SitecoreLocal, Start-SitecoreLocal, Stop-SitecoreLocal .EXAMPLE PS> .\Install-SitecoreLocal 'name' .EXAMPLE PS> .\Install-SitecoreLocal 'name' '9.3.0' .EXAMPLE PS> .\Install-SitecoreLocal 'name' '9.3.0' 'd:\repos' .EXAMPLE PS> .\Install-SitecoreLocal 'name' '9.3.0' 'd:\repos' -Persist User .Link https://github.com/SitecoreDave/SharedSitecore.SitecoreLocal .OUTPUTS System.String #> ##################################################### # Install-SitecoreLocal ##################################################### #[alias("in-sc-local")] #Set-PSBreakpoint -Variable Now -Mode Read -Action {Set-Variable Now (get-date -uformat '%Y\%m\%d %H:%M:%S') -Option ReadOnly, AllScope -Scope Global -Force -ErrorAction SilentlyContinue} -ErrorAction SilentlyContinue function Install-SitecoreLocal { [CmdletBinding(SupportsShouldProcess,PositionalBinding=$false)] Param ( # Name of new Sitecore Local instance [default=dev] [Parameter(Mandatory=$false)] [string]$name = 'dev', # Version of new Sitecore Local instance [default=9.3.0] #[Parameter(Mandatory=$false)] [string]$version = "9.3.0", [Parameter(Mandatory=$false)] [string]$version = "10.1.0", # Version of new Sitecore Local instance [default=9.3.0 rev. 003498] #[Parameter(Mandatory=$false)] [string]$sitecoreVersion = "9.3.0 rev. 003498", [Parameter(Mandatory=$false)] [string]$sitecoreVersion = "10.1.0 rev. 005207", # hostname of new Sitecore Local instance [default=$prefix.$name.$suffix] [Parameter(Mandatory=$false)] [string]$hostname = '', # Prefix of new Sitecore Local instance [default=$version[\.].[name]] [Parameter(Mandatory=$false)] [string]$prefix = '$version', # Suffix of new Sitecore Local instance [default=local] [Parameter(Mandatory=$false)] [string]$suffix = 'local', # SqlServer of new Sitecore Local instance [default=.] [Parameter(Mandatory=$false)] [string]$sqlServer = '.', # SqlUser of new Sitecore Local instance [default=sa] [Parameter(Mandatory=$false)] [string]$sqlUser = 'sa', # SqlPwd of new Sitecore Local instance [default=''] [Parameter(Mandatory=$false)] [alias('sqlPassword')][string]$sqlPwd = '', # SitecoreUser of new Sitecore Local instance [default=admin] [Parameter(Mandatory=$false)] [alias('SitecoreUser')][string]$scUser = "admin", # SitecorePassword of new Sitecore Local instance [default: ''] [Parameter(Mandatory=$false)] [alias('SitecorePassword')][string]$scPwd = "", # LicenseFile of new Sitecore Local instance [default=$packages\license.xml] [Parameter(Mandatory=$false)] [ValidateScript({Test-Path $_ -PathType 'Leaf'})] [alias('license')] [string]$LicenseFile = "", # wwwroot - location of new Sitecore Local instance [default=d:\webs,c:\inetpub\wwwroot] [Parameter(Mandatory=$false)] [ValidateScript({Test-Path $_ -PathType 'Container'})] [alias('www')] [string]$wwwroot = "", # solrRoot of new Sitecore Local instance [default=\solr\solr-[version[8.1.1]] [Parameter(Mandatory=$false)] [string]$solrRoot = "", # solrService of new Sitecore Local instance [default=solr-[version[8.1.1]]]] [Parameter(Mandatory=$false)] [string]$solrService = "", # solrService of new Sitecore Local instance [default=8.4.0] [Parameter(Mandatory=$false)] [string]$solrVersion = "8.4.0", # solrUrl of new Sitecore Local instance [default=localhost] [Parameter(Mandatory=$false)] [string]$solrHost = "localhost", # solrUrl of new Sitecore Local instance [default=8[version[840]]] [Parameter(Mandatory=$false)] [string]$solrPort = "", # solrUrl of new Sitecore Local instance [default=https://localhost:[solrPort]/solr] [Parameter(Mandatory=$false)] [string]$solrUrl = "", # Identity Server Site Name of new Sitecore Local instance [default=$hostname-si] [Parameter(Mandatory=$false)] [alias('IdentityServerName')] [string]$idName = "", # xConnect Site Name of new Sitecore Local instance [default=$hostname-xconnect] [Parameter(Mandatory=$false)] [alias('xConnectSiteName')] [string]$xcName = "", # Root path to assets [default=packages\assets] [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName)] [ValidateScript({Test-Path $_ -PathType 'Container'})] [string] $assetsRoot = "", # certificats path for certificates [default=assets\certs] [Parameter(Mandatory=$false)] [ValidateScript({Test-Path $_ -PathType 'Container'})] [string]$certs = "", # packages path for downloaded Sitecore packages [default=\repos\docker-images\build\packages] [Parameter(Mandatory=$false)] [ValidateScript({Test-Path $_ -PathType 'Container'})] [string]$packages = "", # LogFolder path for logs [default=.\logs] [Parameter(Mandatory=$false)] [ValidateScript({Test-Path $_ -PathType 'Container'})] [alias('logs')] [string]$LogFolder = "", # Configuration file name [default=[ConfigurationRoot]\[ConfigurationFileName]] [Parameter(Mandatory=$false)] [ValidateScript({Test-Path $_ -PathType 'Leaf'})] [string]$ConfigurationFile = "", # Configuration file name [default=[hostname].json] [Parameter(Mandatory=$false)] [string]$ConfigurationFileName = "", # Configuration file name [default=\assets\[version[.\]\[ConfigurationTemplate]] [Parameter(Mandatory=$false)] [ValidateScript({Test-Path $_ -PathType 'Container'})] [string]$ConfigurationRoot = "", # Configuration file name [default=XP0] [Parameter(Mandatory=$false)] [string]$ConfigurationTemplate = "XP0", # Configuration file name [default='Install-SitecoreLocal.json'] [Parameter(Mandatory=$false)] [string]$ConfigurationTemplateFile = "", # XConnectPackage path for logs [default=.\logs] [Parameter(Mandatory=$false)] [alias('XConnectPackage')] [string]$xcPkg = '', # SitecorePackage path for logs [default=.\logs] [Parameter(Mandatory=$false)] [alias('SitecorePackage')] [string]$scPkg = '', # SitecorePackage path for logs [default=.\logs] # The path to the Identity Server Package to Deploy. [Parameter(Mandatory=$false)] [alias('IdentityServerPackage')] [string]$idPkg = '', # PasswordRecoveryUrl path for logs [default=https://hostname] [Parameter(Mandatory=$false)] [string]$RecoveryUrl = "", # SitecoreIdentityAuthority path for logs [default=https://hostname-si] [Parameter(Mandatory=$false)] [string]$SitecoreIdentityAuthority = '', # XConnectCollectionService path for logs [default=https://hostname-si] [Parameter(Mandatory=$false)] [string]$XConnectCollectionService = '', # ClientSecret for Sitecore instance [default=SIF-Default] [Parameter(Mandatory=$false)] $ClientSecret = "SIF-Default", # Persist these settings - None, User, Machine Process [default=None] [Parameter(Mandatory=$false)] [ValidateSet('None','Machine','Process','User')] [string]$Persist = 'None', # path to assets.json to be installed [default=ConfigurationRoot\assets.json] [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName)] [ValidateScript({Test-Path $_ -PathType 'Leaf'})] [string] $assetsJsonPath = "", # Force - overwrite if exists [Parameter(Mandatory=$false)] [switch]$Force = $false ) begin { $ErrorActionPreference = 'Stop' $VerbosePreference = 'SilentlyContinue' [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $PSScriptName = ($MyInvocation.MyCommand.Name.Replace(".ps1","")) $parametersResults = Get-Parameters $MyInvocation.MyCommand.Parameters $PSBoundParameters "$($PSScriptName):start" -Show -Stamp -StartWatch Write-Host $parametersResults.output -ForegroundColor Green $started = $parametersResults.started $StopWatch = New-Object -TypeName System.Diagnostics.Stopwatch $StopWatch.Start() $PSScriptPath = Join-Path $PSScriptRoot $MyInvocation.MyCommand.Name $PSScriptFolder = Split-Path $PSScriptPath -Parent $PSRootDrive = if (Get-PSDrive 'd' -ErrorAction SilentlyContinue) { 'd:' } else { 'c:' } $PSRepoPath = Split-Path $PSScriptFolder -Parent if ($PSRepoPath.IndexOf('src') -ne -1) { $PSRepoPath = Split-Path (Split-Path $PSRepoPath -Parent) -Parent } if($prefix -eq '$version'){ $prefix = ($version.Replace(".", "")) } #$prefix += ".$name" $suffix = "$name.$suffix" if(!$hostname){ $hostname = "$prefix.$suffix" } if(!$LogFolder){ $LogFolder = Join-Path $PSRepoPath "logs" } $dateFormat = Get-Date -Format "yyyy-MM-dd" ` $logPath = Join-Path $LogFolder "$hostname-$dateFormat.log" if (Test-Path $logPath) { $logPathNew = "$hostname-{0:yyyy-MM-dd-hh-mm}.log" -f ((Get-Date (Get-Item $logPath).CreationTime)) if (Test-Path $logPath) { $logPathNew = "$hostname-{0:yyyy-MM-dd-hh-mm-ss}.log" -f ((Get-Date (Get-Item $logPath).CreationTime)) } Write-Verbose "Renaming $logPath to $logPathNew" Rename-Item -Path $logPath -NewName $logPathNew -Force } #if ($assets) -check for running as deployed module #ie.. module/script version number in path? if ([string]::IsNullOrEmpty($packages)) { $packages = Join-Path $PSRootDrive 'repos\docker-images\build\packages' } if ([string]::IsNullOrEmpty($assetsRoot)) { $assetsRoot = Join-Path $PSRepoPath 'assets' } if ([string]::IsNullOrEmpty($ConfigurationRoot)) { $ConfigurationRoot = Join-Path $assetsRoot "configs\$version\$ConfigurationTemplate" } if ([string]::IsNullOrEmpty($ConfigurationFileName)) { $ConfigurationFileName = "$hostname.json" } if ([string]::IsNullOrEmpty($ConfigurationTemplateFile)) { $ConfigurationTemplateFile = "$PSScriptPath.json"} if ([string]::IsNullOrEmpty($certs)) { $certs = Join-Path $assetsRoot "certs" } if ([string]::IsNullOrEmpty($assetsJsonPath)) { $assetsJsonPath = Join-Path $ConfigurationRoot 'assets-basic.json' } if(!$LicenseFile) { $LicenseFile = "$packages\license.xml" } if(!$RecoveryUrl){ $RecoveryUrl = "https://$hostname" } if(!$idName){ $idName = "$prefix-id.$suffix" } if(!$SitecoreIdentityAuthority){ $SitecoreIdentityAuthority = "https://$idName" } if(!$xcName){ $xcName = "$prefix-xc.$suffix" } if(!$XConnectCollectionService){ $XConnectCollectionService = "https://$xcName" } if (!$solrService) { $solrService = "Solr-$solrVersion" } if (!$solrRoot) { $solrRoot = Join-Path $PSRootDrive "\solr\$solrService" } if (!$solrPort) { $solrPort = "8" + $solrVersion.Replace(".", "") } if (!$solrUrl) { $solrUrl = "https://$($solrHost):$solrPort/solr" } if (!$wwwroot) { if ($PSRootDrive -ne 'c:') { $wwwroot = Join-Path $PSRootDrive 'webs' if (!(Test-Path $wwwroot)) { $wwwroot = Join-Path $PSRootDrive 'inetpub\wwwroot' if (!(Test-Path $wwwroot)) { $wwwroot = '' } } } } if (!$wwwroot) { $wwwroot = Join-Path 'c:' 'inetpub\wwwroot' } if (!(Test-Path $wwwroot)) { Write-Error "MISSING WWWROOT:$wwwroot" Exit 1 } } process { try { if($PSCmdlet.ShouldProcess($ConfigurationRoot)) { Start-Transcript $logPath $parametersUpdated = Get-Parameters $MyInvocation.MyCommand.Parameters $PSBoundParameters "$PSScriptName started" -Show Write-Host $parametersUpdated.output -ForegroundColor Green $parameters = $parametersUpdated.parameters if (!(Test-Path $assetsRoot)) { mkdir $assetsRoot #| Out-Null } if (!$certs) { #validation means it must exist before setting if (!(Test-Path (Join-Path $assetsRoot "certs"))) { mkdir (Join-Path $assetsRoot "certs") } $certs = Join-Path $assetsRoot "certs" } #if (!(Test-Path $configs)) { # mkdir $configs #| Out-Null #} if (!(Test-Path $packages)) { Write-Verbose "Packages not found!" $packages = Join-Path $assetsRoot "packages" if (!(Test-Path $packages)) { mkdir $packages #| Out-Null } } if([string]::IsNullOrEmpty($scPkg)){ $scPkgItem = Get-ChildItem "$packages\Sitecore $version rev. * (OnPrem)_single.scwdp.zip" -ErrorAction SilentlyContinue if ($scPkgItem) { $scPkg = $scPkgItem.FullName } else { Write-Error "File not found - $packages\Sitecore $version rev. * (OnPrem)_single.scwdp.zip" } } $IdentityServerVersion = '' if (!$IdentityServerVersion) { if ($version -eq "10.1.0") { $IdentityServerVersion = "5.1.0 rev. 00290" } } Write-Verbose "Looking for $packages\Sitecore.IdentityServer $IdentityServerVersion (OnPrem)_identityserver.scwdp.zip" if([string]::IsNullOrEmpty($idPkg)){ $idPkgItem = Get-ChildItem "$packages\Sitecore.IdentityServer $IdentityServerVersion (OnPrem)_identityserver.scwdp.zip" -ErrorAction SilentlyContinue if ($idPkgItem) { $idPkg = $idPkgItem.FullName } else { Write-Error "File not found - $packages\Sitecore.IdentityServer $IdentityServerVersion (OnPrem)_identityserver.scwdp.zip" } } Write-Verbose "Looking for $packages\Sitecore $version rev. * (OnPrem)_xp0xconnect.scwdp.zip" if([string]::IsNullOrEmpty($xcPkg)){ $xcPkgItem = Get-ChildItem "$packages\Sitecore $version rev. * (OnPrem)_xp0xconnect.scwdp.zip" if ($xcPkgItem) { $xcPkg = $xcPkgItem.FullName } else { Write-Error "File not found - $packages\Sitecore $version rev. * (OnPrem)_xp0xconnect.scwdp.zip" } } #$scPkgItem = Get-ChildItem -Path "$packages\Sitecore $version rev. * (WDP XP0 packages).zip" #if(!$scPkgItem){ # Write-Error "You must download: Sitecore $version rev. * (WDP XP0 packages).zip in: $packages" # exit 1 #} else { # $scPkg = $scPkgItem.FullName #} $configPkgItem = Get-ChildItem -Path "$packages\XP0 Configuration files $version rev. *.zip" if(!$configPkgItem){ Add-Type -Assembly System.IO.Compression.FileSystem $scPkgZip = [IO.Compression.ZipFile]::OpenRead($scPkg) [System.IO.Compression.ZipFileExtensions]::ExtractToDirectory($scPkgZip, $packages) $scPkgZip.Dispose() $configPkgItem = Get-ChildItem -Path "$packages\XP0 Configuration files $version rev. *.zip" Write-Verbose "ExtractToDirectory:$scPkg" } if(!$configPkgItem){ Write-Error "Error extracting $scPkg" Exit 1 } else { $configPkg = $configPkgItem.FullName } $configTestFile = Join-Path $ConfigurationRoot "XP0-SingleDeveloper.json" if (!(Test-Path $configTestFile) -or $Force) { if ($ConfigurationRoot) { Write-Verbose "Expanding:$configPkg" #Add-Type -Assembly System.IO.Compression.FileSystem #$configPkgZip = [IO.Compression.ZipFile]::OpenRead($configPkg) #[System.IO.Compression.ZipFileExtensions]::ExtractToDirectory($configPkgZip, $ConfigurationRoot) -Force #$configPkgZip.Dispose() Expand-Archive -Path $configPkg -DestinationPath $ConfigurationRoot -Force Write-Verbose "ExtractToDirectory:$configPkg" } } $existing = ![string]::IsNullOrEmpty($ConfigurationFile) if (!$existing -or $Force) { $ConfigurationFileTest = Join-Path $ConfigurationRoot $ConfigurationFileName Write-Host "Creating:$ConfigurationFileTest" -ForegroundColor Cyan Copy-Item $ConfigurationTemplateFile $ConfigurationFileTest $ConfigurationFile = $ConfigurationFileTest Set-SitecoreLocal $ConfigurationFile $ConfigurationFileName $ConfigurationRoot $ConfigurationTemplate $assetsRoot $packages $version $hostname $prefix $suffix # update parameters Write-Host 'Updating parameters...' $parametersResponse = Get-Parameters $MyInvocation.MyCommand.Parameters $parameters "$PSScriptName Updating configs..." Write-Host $parametersResponse.output -ForegroundColor Green $parameters = $parametersResponse.parameters Write-Host 'Updating configs...' Set-SitecoreLocalOverrides @parameters } else { Write-Host "Existing config:$ConfigurationFile" } $config = Get-Content -Raw $ConfigurationFile | ConvertFrom-Json if (!$config) { throw "Error trying to load configuration!" } #Set-SitecoreDockerLicense - use env like docker? if ($Force) { #todo: add a check? #Remove-SitecoreLocal $ConfigurationFile Remove-SitecoreLocalDb $ConfigurationFile } #todo #$moduleName = 'SharedInstallationUtilities' #Install-ModuleFromGithub -ModuleName $moduleName -UriBase "https://raw.githubusercontent.com/Sitecore/Sitecore.HabitatHome.Utilities/master/Shared/assets/modules/SharedInstallationUtilities/SharedInstallationUtilities.psm1" #Import-Module -Name $moduleName #Install-SitecoreAzureToolkit #Set-Location "$reposPath\$dockerimages" # Set-ExecutionPolicy Bypass -Scope Process -Force; # [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; # iex ((New-Object System.Net.WebClient).DownloadString("https://chocolatey.org/install.ps1")) # choco install mkcert # mkcert $cert # Set-Location .. #} #pre pre-req check.. ie.. choco.. and sql #exit 1 #Set-Location $ogp #Set-Location .\xp #Write-Verbose 'Setting/Checkings paths...' #Write-Verbose "resourcePath:$resourcePath" #$sharedResourcePath = Join-Path $assetsConfig.sharedUtilitiesRoot "assets\configuration" #Write-Verbose "sharedResourcePath:$sharedResourcePath" $site = $config.settings.site $sql = $config.settings.sql $xConnect = $config.settings.xConnect $sitecore = $config.settings.sitecore $identityServer = $config.settings.identityServer $solr = $config.settings.solr $assets = $config.assets Write-Verbose 'Installing pre-reqs......' Import-Module (Join-Path $assets.sharedUtilitiesRoot "assets\modules\SharedInstallationUtilities\SharedInstallationUtilities.psm1") -Force Install-SitecoreLocalPrerequisites $solrVersion $ConfigurationFile $parametersResults = Get-Parameters $MyInvocation.MyCommand.Parameters $PSBoundParameters "$hostname - $version" -Show Write-Host $($parametersResults.output) -ForegroundColor Green #confirm IIS is running & may not be if playing with https://github.com/SitecoreDave/SharedSitecore.SitecoreDocker Start-Service w3svc #Install-SingleDeveloper #IdentityServerName = $idName $singleDeveloperParams = @{ Path = $sitecore.singleDeveloperConfigurationPath SqlServer = $sql.server SqlAdminUser = $sql.adminUser SqlAdminPassword = $sql.adminPassword SqlCollectionPassword = $sql.collectionPassword SqlReferenceDataPassword = $sql.referenceDataPassword SqlMarketingAutomationPassword = $sql.marketingAutomationPassword SqlMessagingPassword = $sql.messagingPassword SqlProcessingEnginePassword = $sql.processingEnginePassword SqlReportingPassword = $sql.reportingPassword SqlCorePassword = $sql.corePassword SqlSecurityPassword = $sql.securityPassword SqlMasterPassword = $sql.masterPassword SqlWebPassword = $sql.webPassword SqlProcessingTasksPassword = $sql.processingTasksPassword SqlFormsPassword = $sql.formsPassword SqlExmMasterPassword = $sql.exmMasterPassword SitecoreAdminPassword = $sitecore.adminPassword SolrUrl = $solr.url SolrRoot = $solr.root SolrService = $solr.serviceName Prefix = $site.prefix XConnectCertificateName = $xconnect.siteName IdentityServerCertificateName = $identityServer.name IdentityServerSiteName = $identityServer.name LicenseFile = $assets.licenseFilePath XConnectPackage = $xConnect.packagePath SitecorePackage = $sitecore.packagePath IdentityServerPackage = $identityServer.packagePath XConnectSiteName = $xConnect.siteName SitecoreSitename = $site.hostName PasswordRecoveryUrl = "https://" + $site.hostName SitecoreIdentityAuthority = "https://" + $identityServer.name XConnectCollectionService = "https://" + $xConnect.siteName ClientSecret = $identityServer.clientSecret AllowedCorsOrigins = ("https://{0}" -f $site.hostName) SitePhysicalRoot = $site.webRoot } Write-Host "ConfigurationRoot:$ConfigurationRoot" -ForegroundColor Green Push-Location $ConfigurationRoot #(Join-Path $resourcePath "XP0") Install-SitecoreConfiguration @singleDeveloperParams #Install-SingleDeveloper $ConfigurationFile #currently fails and then breaks site: login failed for: securityuser #Install-SitecoreLocalModules $ConfigurationFile -Verbose Pop-Location #CONFIGURE/FINISH Add-AppPoolMembership Add-AdditionalBindings Edit-CryptographyAlgorithmsBindingRedirect Write-Host "# $PSScriptName ended successfully" -InformationVariable results -ForegroundColor Magenta } } catch { Write-Error "ERROR:$_" -InformationVariable results } #finally { # Write-Host "#####################################################" -ForegroundColor Green # Write-Host "# $PSScriptName ended successfully" -ForegroundColor Magenta #} } end { #Write-Host "#####################################################" -ForegroundColor Green #Write-Host "# $PSScriptName" -ForegroundColor Magenta #Write-Host ("# {0:yyyy-MM-dd hh:mm:ss} $PSCommandPath" -f (Get-Date)) -ForegroundColor Cyan #PSSenderInfo #Write-Host ($PSBoundParameters | Out-String).Trim() -ForegroundColor Cyan #Write-Host "#####################################################" -ForegroundColor Green $parametersResults = Get-Parameters $MyInvocation.MyCommand.Parameters $PSBoundParameters "$($PSScriptName):$results" -Show -StopWatch -Started $started Write-Host $parametersResults.output -ForegroundColor Green $StopWatch.Stop() $StopWatch Write-Verbose "$PSScriptName $hostname $version end" Pop-Location Stop-Transcript } } # SIG # Begin signature block # MIIFwQYJKoZIhvcNAQcCoIIFsjCCBa4CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUb+LpGlo/td0TqaWD91fdBl6j # scagggNOMIIDSjCCAjKgAwIBAgIQHpPHVhJV5LBKSHdfHA+9HzANBgkqhkiG9w0B # AQsFADAoMSYwJAYDVQQDDB1TaGFyZWRTaXRlY29yZS5TaXRlY29yZURvY2tlcjAe # Fw0yMTAxMjcyMTUxMDJaFw0yMjAxMjcyMjExMDJaMCgxJjAkBgNVBAMMHVNoYXJl # ZFNpdGVjb3JlLlNpdGVjb3JlRG9ja2VyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A # MIIBCgKCAQEA0v29oDKrlTF1LgojLFLlqC/jP5LbQ46oGDJGi+D94HTLCcSGpOk9 # HcE5x1aedVMK65CBHFj5BjY8j5NEVDi67fpif3OGmVWagjwclJzylcKlQgTioV6+ # rfffuJtFQ0/C3ftXy+l083ophmRPN8bu6BMWkC1uaHIg2Qqd7cf6Keu5j3LGw2eJ # ncoSyZtxNSjbfX6FHm2KR0y9kD3RmBAUDZEmulht2mvn2ezGgPvJgCaMrW7xXq13 # iCx+TFdeaLLD5+V49WtWsW1PiHRFV7VMkOfjHOgW1mAYhlTCL38ByyqEG6D2dVGy # ATX05fYszuRLfPdelxotvrk78evLiTaYeQIDAQABo3AwbjAOBgNVHQ8BAf8EBAMC # B4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwKAYDVR0RBCEwH4IdU2hhcmVkU2l0ZWNv # cmUuU2l0ZWNvcmVEb2NrZXIwHQYDVR0OBBYEFKT93awe2JYz+yfWHfrRE0AgR6Jg # MA0GCSqGSIb3DQEBCwUAA4IBAQBYCsL16TX6A+72bbWp6IhGIh2SPwPlHJKEhAmX # KK+TGe27yWEqLD2eEAgIHFd4IEFg3Fm+4ybJsAAbVh1+kePtELlrct+7brMaDvN6 # dpwPnh7K3H022C4IekCU5/DyEMZvmGtaQfAOQ9jiQC9aoseYDXg+O6Vs2HbdhL5S # c3K8x/8jm7bLWymyFs6xatO8QzkwfWs2f/4KEzL0dW9iRmKW4HMoItIBSbe2WNKT # TJ2VxIS3Fi+XuQDmkLngeUF5cyDXz9gnhsyImUTjV64tA1EAv0n991XC50fQRPbt # Uybn44qecqGHObWoGYBL6Y0fdMi+PsUR3OympqCPJVPBfTINMYIB3TCCAdkCAQEw # PDAoMSYwJAYDVQQDDB1TaGFyZWRTaXRlY29yZS5TaXRlY29yZURvY2tlcgIQHpPH # VhJV5LBKSHdfHA+9HzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAA # oQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4w # DAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQUSu5XbV9PMvdaiHxowmc3MOtP # umMwDQYJKoZIhvcNAQEBBQAEggEABkzxl30j4k/IOC+AN1BNvDkP942Q603Pky7E # h1AYXpqQx53wYbab83obvXIVifeAfJxASh1Wt/JaTKpnJ6Ged6t4457jLQ96rbtm # Wrcvem2vbBMkbFRMbYptPnilEAtzPCRtqwm6B72ERDS5LQih/796ojskOqh4OLPd # fWSrSsCLIPioiAYhnBiCGVr/4kuaYu4z2fYXtznJcHfqL9bl6nG47RPPDO2xmBuE # u3a5frvDiLs4N92/eqZH1bUqNxRAv5Z4nREW7RqFY7v73lQhzHggDWYtk8ChADea # TGBVcn0rQCGOz/oXBRqCBk9MSz35NH7AIKgHk+ekQPEbGjz2PQ== # SIG # End signature block |