????
Current Path : C:/Program Files/IIS/Microsoft Web Deploy V3/Scripts/ |
Current File : C:/Program Files/IIS/Microsoft Web Deploy V3/Scripts/BackupScripts.ps1 |
# Web Deploy: Powershell script to configure automatic backups on the server. # Copyright (C) Microsoft Corp. 2010 # # Requirements: IIS 7, Windows Server 2008 (or higher) # $BackupSectionName = "system.webServer/wdeploy/backup" $TurnedOnAttrName = "turnedOn" $EnabledAttrName = "enabled" $BackupPathAttrName = "backupPath" $NumBackupsAttrName = "numberOfBackups" $ContinueSyncOnBackupFailureAttrName = "continueSyncOnBackupFailure" $ExcludedProvidersElemName = "excludedProviders" $BackupSettingsProviderElemName = "backupSettingsProvider" $CanSetEnabledAttrName = "canSetEnabled" $CanSetNumberOfBackupsAttrName = "canSetNumberOfBackups" $CanSetContinueSyncOnFailureAttrName = "canSetContinueSyncOnBackupFailure" $CanAddExcludedProvidersAttrName = "canAddExcludedProviders" $DefaultExcludedProviders = @("appHostAuthOverride","appPoolEnable32Bit","appPoolNetFx","appPoolPipeline","createApp","setAcl") <# .SYNOPSIS Turns the backup feature on or off. .DESCRIPTION Turns the backup feature on or off. Overrides all server and site level backup settings. .EXAMPLE TurnOn-Backups -On $true Turns on the backup feature, however in order for backups to be made, they still need to be enabled at the server or site level. Use the Configure-Backups function to accomplish this. #> function TurnOn-Backups { param( [Parameter(Mandatory=$true)] [bool]$On ) . .\Common.ps1 Initialize try { $serverManager = New-Object Microsoft.Web.Administration.ServerManager $appHostConfig = $serverManager.GetApplicationHostConfiguration() $configSection = $appHostConfig.GetSection($BackupSectionName) $configSection.SetAttributeValue($TurnedOnAttrName, $On) if($On) { write-log $Global:Info $Resources.BackupTurningOn } else { write-log $Global:Info $Resources.BackupTurningOff } $serverManager.CommitChanges() } finally { if($serverManager -ne $null) { $serverManager.Dispose() } } } <# .SYNOPSIS Configures backup settings at the server or site level. .DESCRIPTION Use this function to set server or site level backup settings. When server level backup settings are set, this function automatically adds default excluded providers. When site level backup settings are set, they take preference over server level backup settings. .EXAMPLE Configure-Backups -Enabled $true Turns on the backup feature at the server level, because a site is not specified. .EXAMPLE Configure-Backups -SiteName foo -Enabled $true -SetExcludedProviders @("dbmysql","dbfullsql") Turns on the backup feature for site "foo". Also sets its excluded providers to "dbmysql" and "dbfullsql" providers. .EXAMPLE Configure-Backups -SiteName foo -BackupPath "{SitePathParent}\{siteName}_snapshots" Sets the physical file path for where the backups for site "foo" will be stored. The variables "{SitePathParent}" and "{SiteName}" are special because they get translated by Web Deploy. If the physical path of site "foo" were "c:\foo", the path in the example would translate to "c:\foo_snapshots" #> function Configure-Backups { param( [string] $SiteName = [string]::Empty, [System.Nullable``1[[System.Boolean]]] $Enabled, [string] $BackupPath, [System.Nullable``1[[System.Int32]]] $NumberOfBackups, [System.Nullable``1[[System.Boolean]]] $ContinueSyncOnBackupFailure, [string[]] $AddExcludedProviders = $null ) . .\Common.ps1 Initialize # Setup default excluded providers at the server level if([string]::IsNullOrEmpty($SiteName)) { if($null -eq $AddExcludedProviders) { $AddExcludedProviders = @() } foreach($provider in $DefaultExcludedProviders) { $AddExcludedProviders += $provider } } if($null -ne $AddExcludedProviders) { $ExcludedProviders = @(RemoveDuplicatesFromList -List $AddExcludedProviders) } $serverManager = $null if([string]::IsNullOrEmpty($SiteName)) { write-log $Global:Info $Resources.ServerBackupConfigChanges } else { write-log $Global:Info $Resources.SiteBackupConfigChanges $SiteName } try { # Cleans up existing Excluded providers $ExcludedProviders = VerifyAndDeleteExcludedProviders -SiteName $siteName -ExcludedProviders $ExcludedProviders ` -SectionName $BackupSectionName $serverManager = New-Object Microsoft.Web.Administration.ServerManager $appHostConfig = $serverManager.GetApplicationHostConfiguration() if([string]::IsNullOrEmpty($SiteName)) { $configSection = $appHostConfig.GetSection($BackupSectionName) } else { $configSection = $appHostConfig.GetSection($BackupSectionName, $SiteName) } if($Enabled -ne $null) { write-log $Global:Info $Resources.BackupSettingEnabled $Enabled $configSection.SetAttributeValue($EnabledAttrName, $Enabled) } if(-not [string]::IsNullOrEmpty($BackupPath)) { write-log $Global:Info $Resources.BackupSettingPath $BackupPath write-log $Global:Warning $Resources.BackupSettingPathWarn $configSection.SetAttributeValue($BackupPathAttrName, $BackupPath) } if($NumberOfBackups -ne $null) { write-log $Global:Info $Resources.BackupSettingNumber $NumberOfBackups $configSection.SetAttributeValue($NumBackupsAttrName, $NumberOfBackups) } if($ContinueSyncOnBackupFailure -ne $null) { write-log $Global:Info $Resources.BackupSettingContinueSync $ContinueSyncOnBackupFailure $configSection.SetAttributeValue($ContinueSyncOnBackupFailureAttrName, $ContinueSyncOnBackupFailure) } if($null -ne $ExcludedProviders) { # Find the ExcludedProviders Element $configSection.ChildElements | out-null foreach($child in $configSection.ChildElements) { $excludedProvidersElem = $null if($child.Schema -is [Microsoft.Web.Administration.ConfigurationCollectionSchema] -and ` $child.Schema.AddElementNames -eq "provider") { $excludedProvidersElem = $child break } } # Add specified providers to the ExcludedProviders collection $providersCollection = $excludedProvidersElem.GetCollection() # Add each provider to providers collection foreach($provider in $ExcludedProviders) { # Need to explicitly call GetCollection().CreateElement or creation won't work $newProvider = $excludedProvidersElem.GetCollection().CreateElement() $newProvider.SetAttributeValue("name", $provider) $providersCollection.Add($newProvider) | out-null write-log $Global:Info $Resources.BackupAddingProviders $provider } } $serverManager.CommitChanges() } finally { if($serverManager -ne $null) { $serverManager.Dispose() } } } <# .SYNOPSIS Configures which backup settings a site can manage themselves using the BackupSettingsProvider. .DESCRIPTION These settings are only set at the server level, and allow a server administrator to control which backup settings a site can manage themselves using the BackupSettingsProvider. .EXAMPLE Configure-BackupSettingsProvider -CanSetEnabled $true -CanAddExcludedProviders $false Ensures that site administrators can set the "Enabled" setting for backups but cannot modify the list of "ExcludedProviders." #> function Configure-BackupSettingsProvider { param( [System.Nullable``1[[System.Boolean]]] $CanSetEnabled, [System.Nullable``1[[System.Boolean]]] $CanSetNumBackups, [System.Nullable``1[[System.Boolean]]] $CanSetContinueSyncOnBackupFailure, [System.Nullable``1[[System.Boolean]]] $CanAddExcludedProviders ) . .\Common.ps1 Initialize $serverManager = $null try { $serverManager = New-Object Microsoft.Web.Administration.ServerManager $appHostConfig = $serverManager.GetApplicationHostConfiguration() $configSection = $appHostConfig.GetSection($BackupSectionName) $backupProviderElem = GetBackupSettingsProviderElem -ConfigSection $configSection if($CanSetEnabled -ne $null) { write-log $Global:Info $Resources.BackupSettingCanSetEnabled $CanSetEnabled $backupProviderElem.SetAttributeValue($CanSetEnabledAttrName, $CanSetEnabled) } if($CanSetNumBackups -ne $null) { write-log $Global:Info $Resources.BackupSettingCanSetNumBackups $CanSetNumBackups $backupProviderElem.SetAttributeValue($CanSetNumberOfBackupsAttrName, $CanSetNumBackups) } if($CanSetContinueSyncOnBackupFailure -ne $null) { write-log $Global:Info $Resources.BackupSettingCanSetContinueSync $CanSetContinueSyncOnBackupFailure $backupProviderElem.SetAttributeValue($CanSetContinueSyncOnFailureAttrName, $CanSetContinueSyncOnBackupFailure) } if($CanAddExcludedProviders -ne $null) { write-log $Global:Info $Resources.BackupSettingCanSetExcludedProviders $CanAddExcludedProviders $backupProviderElem.SetAttributeValue($CanAddExcludedProvidersAttrName, $CanAddExcludedProviders) } $serverManager.CommitChanges() } finally { if($serverManager -ne $null) { $serverManager.Dispose() } } } <# .SYNOPSIS Resets backup settings at either the server or site level. .DESCRIPTION Resets backup settings at either the server or site level. .EXAMPLE Reset-BackupSettings Resets all backup settings at the server level. .EXAMPLE Reset-BackupSettings -SiteName foo Resets all backup settings for site "foo" #> function Reset-BackupSettings { param( [string] $SiteName ) . .\Common.ps1 Initialize $serverManager = $null try { $serverManager = New-Object Microsoft.Web.Administration.ServerManager $appHostConfig = $serverManager.GetApplicationHostConfiguration() if([string]::IsNullOrEmpty($SiteName)) { write-log $Global:Info $Resources.BackupResetServerConfig $configSection = $appHostConfig.GetSection($BackupSectionName) } else { write-log $Global:Info $Resources.BackupResetSiteConfig $SiteName $configSection = $appHostConfig.GetSection($BackupSectionName, $SiteName) } $configSection.Delete() $serverManager.CommitChanges() } finally { if($serverManager -ne $null) { $serverManager.Dispose() } } } <# .SYNOPSIS Returns the current server or site level backup settings .DESCRIPTION Returns the current server or site level backup settings as an object. .EXAMPLE Get-BackupSettings Returns the global backup settings .Example $settings = Get-BackupSettings -SiteName "foo" $settings | get-member # Lists all properties of $settings write-host $settings.Enabled # Outputs whether backups are enabled for site "foo" #> function Get-BackupSettings { param( [string] $SiteName ) . .\Common.ps1 Initialize $serverManager = $null $properties = @{ SiteName = $SiteName Enabled = "" BackupPath = "" NumberOfBackups = "" ContinueSyncOnFailure = "" CanSetEnabled = "" CanSetNumberOfBackups = "" CanSetContinueSyncOnFailure = "" CanAddExcludedProviders = "" ExcludedProviders = @() } $settings = new-object PSObject -Property $properties try { $serverManager = New-Object Microsoft.Web.Administration.ServerManager $appHostConfig = $serverManager.GetApplicationHostConfiguration() if([string]::IsNullOrEmpty($SiteName)) { $configSection = $appHostConfig.GetSection($BackupSectionName) } else { $configSection = $appHostConfig.GetSection($BackupSectionName, $SiteName) } $settings.Enabled = $configSection.GetAttributeValue($EnabledAttrName) $settings.BackupPath = $configSection.GetAttributeValue($BackupPathAttrName) $settings.NumberOfBackups = $configSection.GetAttributeValue($NumBackupsAttrName) $settings.ContinueSyncOnFailure = $configSection.GetAttributeValue($ContinueSyncOnBackupFailureAttrName) $providersCollection = @(GetExcludedProvidersColletion $configSection) foreach($provider in $providersCollection) { $settings.ExcludedProviders += $provider.GetAttributeValue("name") } $providerElem = GetBackupSettingsProviderElem -ConfigSection $configSection $settings.CanSetEnabled = $providerElem.GetAttributeValue($CanSetEnabledAttrName) $settings.CanSetNumberOfBackups = $providerElem.GetAttributeValue($CanSetNumberOfBackupsAttrName) $settings.CanSetContinueSyncOnFailure = $providerElem.GetAttributeValue($CanSetContinueSyncOnFailureAttrName) $settings.CanAddExcludedProviders = $providerElem.GetAttributeValue($CanAddExcludedProvidersAttrName) return $settings } finally { if($serverManager -ne $null) { $serverManager.Dispose() } } } # SIG # Begin signature block # MIInvwYJKoZIhvcNAQcCoIInsDCCJ6wCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDWr+FHadl15mag # OexsD8gtmapwnprl0A5WxAPauhYYiKCCDXYwggX0MIID3KADAgECAhMzAAADrzBA # DkyjTQVBAAAAAAOvMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjMxMTE2MTkwOTAwWhcNMjQxMTE0MTkwOTAwWjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDOS8s1ra6f0YGtg0OhEaQa/t3Q+q1MEHhWJhqQVuO5amYXQpy8MDPNoJYk+FWA # hePP5LxwcSge5aen+f5Q6WNPd6EDxGzotvVpNi5ve0H97S3F7C/axDfKxyNh21MG # 0W8Sb0vxi/vorcLHOL9i+t2D6yvvDzLlEefUCbQV/zGCBjXGlYJcUj6RAzXyeNAN # xSpKXAGd7Fh+ocGHPPphcD9LQTOJgG7Y7aYztHqBLJiQQ4eAgZNU4ac6+8LnEGAL # go1ydC5BJEuJQjYKbNTy959HrKSu7LO3Ws0w8jw6pYdC1IMpdTkk2puTgY2PDNzB # tLM4evG7FYer3WX+8t1UMYNTAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQURxxxNPIEPGSO8kqz+bgCAQWGXsEw # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW # MBQGA1UEBRMNMjMwMDEyKzUwMTgyNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAISxFt/zR2frTFPB45Yd # mhZpB2nNJoOoi+qlgcTlnO4QwlYN1w/vYwbDy/oFJolD5r6FMJd0RGcgEM8q9TgQ # 2OC7gQEmhweVJ7yuKJlQBH7P7Pg5RiqgV3cSonJ+OM4kFHbP3gPLiyzssSQdRuPY # 1mIWoGg9i7Y4ZC8ST7WhpSyc0pns2XsUe1XsIjaUcGu7zd7gg97eCUiLRdVklPmp # XobH9CEAWakRUGNICYN2AgjhRTC4j3KJfqMkU04R6Toyh4/Toswm1uoDcGr5laYn # TfcX3u5WnJqJLhuPe8Uj9kGAOcyo0O1mNwDa+LhFEzB6CB32+wfJMumfr6degvLT # e8x55urQLeTjimBQgS49BSUkhFN7ois3cZyNpnrMca5AZaC7pLI72vuqSsSlLalG # OcZmPHZGYJqZ0BacN274OZ80Q8B11iNokns9Od348bMb5Z4fihxaBWebl8kWEi2O # PvQImOAeq3nt7UWJBzJYLAGEpfasaA3ZQgIcEXdD+uwo6ymMzDY6UamFOfYqYWXk # ntxDGu7ngD2ugKUuccYKJJRiiz+LAUcj90BVcSHRLQop9N8zoALr/1sJuwPrVAtx # HNEgSW+AKBqIxYWM4Ev32l6agSUAezLMbq5f3d8x9qzT031jMDT+sUAoCw0M5wVt # CUQcqINPuYjbS1WgJyZIiEkBMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr # /Xmfwb1tbWrJUnMTDXpQzTGCGZ8wghmbAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp # Z25pbmcgUENBIDIwMTECEzMAAAOvMEAOTKNNBUEAAAAAA68wDQYJYIZIAWUDBAIB # BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIGQQjmyoOeVHq3HIx0WkjLDp # WAtb+G6h1Kw0mBNK798VMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A # cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB # BQAEggEAcgWSfUQDXAwJUagT/2WgUT69amw5zHal3FviKxkP2Kj1zAjoJZkaR9aL # 9VQxYMZUKy7DaXDYT7YwgXYIVwGkVGHEhFKZ+rQDs06pqrTN+qs8c6CWYlHbCNC1 # j4JHtJiMMz/I2mWbBc+1tmO7SpSBR9HrkUYdgx+AuMqyrAlldWP2Xsjojx4nyHyA # TeiaTYGURCUHaxKLG/kOUkoPRv9rSWGtxPxGW3lid/e8dYFGVPhJgiwYCXPhcQE/ # kEqtlFGtyjS8LStsNHbNJ/NNTDUijPX3VVQho19NzAG6o4Gi9iM5VCKSfxZopEFz # Kng2Otx6Xqy9yYQe+t6f1K8coKQud6GCFykwghclBgorBgEEAYI3AwMBMYIXFTCC # FxEGCSqGSIb3DQEHAqCCFwIwghb+AgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFZBgsq # hkiG9w0BCRABBKCCAUgEggFEMIIBQAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl # AwQCAQUABCDLnkxPzgN5WV543anmrYzhCNDs0dAH184PajAygi241AIGZdYHe7H8 # GBMyMDI0MDIyODIxMTAzOC4yMjFaMASAAgH0oIHYpIHVMIHSMQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl # bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNO # OjE3OUUtNEJCMC04MjQ2MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBT # ZXJ2aWNloIIReDCCBycwggUPoAMCAQICEzMAAAHg1PwfExUffl0AAQAAAeAwDQYJ # KoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjMx # MDEyMTkwNzE5WhcNMjUwMTEwMTkwNzE5WjCB0jELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3Bl # cmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjoxNzlFLTRC # QjAtODI0NjElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCC # AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKyHnPOhxbvRATnGjb/6fuBh # h3ZLzotAxAgdLaZ/zkRFUdeSKzyNt3tqorMK7GDvcXdKs+qIMUbvenlH+w53ssPa # 6rYP760ZuFrABrfserf0kFayNXVzwT7jarJOEjnFMBp+yi+uwQ2TnJuxczceG5FD # HrII6sF6F879lP6ydY0BBZkZ9t39e/svNRieA5gUnv/YcM/bIMY/QYmd9F0B+ebF # Yi+PH4AkXahNkFgK85OIaRrDGvhnxOa/5zGL7Oiii7+J9/QHkdJGlfnRfbQ3QXM/ # 5/umBOKG4JoFY1niZ5RVH5PT0+uCjwcqhTbnvUtfK+N+yB2b9rEZvp2Tv4ZwYzEd # 9A9VsYMuZiCSbaFMk77LwVbklpnw4aHWJXJkEYmJvxRbcThE8FQyOoVkSuKc5OWZ # 2+WM/j50oblA0tCU53AauvUOZRoQBh89nHK+m5pOXKXdYMJ+ceuLYF8h5y/cXLQM # OmqLJz5l7MLqGwU0zHV+MEO8L1Fo2zEEQ4iL4BX8YknKXonHGQacSCaLZot2kyJV # RsFSxn0PlPvHVp0YdsCMzdeiw9jAZ7K9s1WxsZGEBrK/obipX6uxjEpyUA9mbVPl # jlb3R4MWI0E2xI/NM6F4Ac8Ceax3YWLT+aWCZeqiIMLxyyWZg+i1KY8ZEzMeNTKC # EI5wF1wxqr6T1/MQo+8tAgMBAAGjggFJMIIBRTAdBgNVHQ4EFgQUcF4XP26dV+8S # usoA1XXQ2TDSmdIwHwYDVR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYD # VR0fBFgwVjBUoFKgUIZOaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j # cmwvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwG # CCsGAQUFBwEBBGAwXjBcBggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIw # MjAxMCgxKS5jcnQwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcD # CDAOBgNVHQ8BAf8EBAMCB4AwDQYJKoZIhvcNAQELBQADggIBAMATzg6R/A0ldO7M # qGxD1VJji5yVA1hHb0Hc0Yjtv7WkxQ8iwfflulX5Us64tD3+3NT1JkphWzaAWf2w # KdAw35RxtQG1iON3HEZ0X23nde4Kg/Wfbx5rEHkZ9bzKnR/2N5A16+w/1pbwJzdf # RcnJT3cLyawr/kYjMWd63OP0Glq70ua4WUE/Po5pU7rQRbWEoQozY24hAqOcwuRc # m6Cb0JBeTOCeRBntEKgjKep4pRaQt7b9vusT97WeJcfaVosmmPtsZsawgnpIjbBa # 55tHfuk0vDkZtbIXjU4mr5dns9dnanBdBS2PY3N3hIfCPEOszquwHLkfkFZ/9bxw # 8/eRJldtoukHo16afE/AqP/smmGJh5ZR0pmgW6QcX+61rdi5kDJTzCFaoMyYzUS0 # SEbyrDZ/p2KOuKAYNngljiOlllct0uJVz2agfczGjjsKi2AS1WaXvOhgZNmGw42S # FB1qaloa8Kaux9Q2HHLE8gee/5rgOnx9zSbfVUc7IcRNodq6R7v+Rz+P6XKtOgyC # qW/+rhPmp/n7Fq2BGTRkcy//hmS32p6qyglr2K4OoJDJXxFs6lwc8D86qlUeGjUy # o7hVy5VvyA+y0mGnEAuA85tsOcUPlzwWF5sv+B5fz35OW3X4Spk5SiNulnLFRPM5 # XCsSHqvcbC8R3qwj2w1evPhZxDuNMIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJ # mQAAAAAAFTANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT # Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNh # dGUgQXV0aG9yaXR5IDIwMTAwHhcNMjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1 # WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD # Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEB # BQADggIPADCCAgoCggIBAOThpkzntHIhC3miy9ckeb0O1YLT/e6cBwfSqWxOdcjK # NVf2AX9sSuDivbk+F2Az/1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhg # fWpSg0S3po5GawcU88V29YZQ3MFEyHFcUTE3oAo4bo3t1w/YJlN8OWECesSq/XJp # rx2rrPY2vjUmZNqYO7oaezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/d # vI2k45GPsjksUZzpcGkNyjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7mka9 # 7aSueik3rMvrg0XnRm7KMtXAhjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKR # Hh09/SDPc31BmkZ1zcRfNN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn427DZM9itu # qBJR6L8FA6PRc6ZNN3SUHDSCD/AQ8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyO # ArxCaC4Q6oRRRuLRvWoYWmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2ZItb # oKaDIV1fMHSRlJTYuVD5C4lh8zYGNRiER9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6 # bMURHXLvjflSxIUXk8A8FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6t # AgMBAAGjggHdMIIB2TASBgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQW # BBQqp1L+ZMSavoKRPEY1Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacb # UzUZ6XIwXAYDVR0gBFUwUzBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYz # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnku # aHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIA # QwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2 # VsuP6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwu # bWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEw # LTA2LTIzLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93 # d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYt # MjMuY3J0MA0GCSqGSIb3DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/q # XBS2Pk5HZHixBpOXPTEztTnXwnE2P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7pZmc6 # U03dmLq2HnjYNi6cqYJWAAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2CDPVt # I1TkeFN1JFe53Z/zjj3G82jfZfakVqr3lbYoVSfQJL1AoL8ZthISEV09J+BAljis # 9/kpicO8F7BUhUKz/AyeixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTp # kbKpW99Jo3QMvOyRgNI95ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32THJvEKt1MMU0 # sHrYUP4KWN1APMdUbZ1jdEgssU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138e # W0QBjloZkWsNn6Qo3GcZKCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQTHa1V1QJ # sWkBRH58oWFsc/4Ku+xBZj1p/cvBQUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7 # Fx0ViY1w/ue10CgaiQuPNtq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0llOZ0 # dFtq0Z4+7X6gMTN9vMvpe784cETRkPHIqzqKOghif9lwY1NNje6CbaUFEMFxBmoQ # tB1VM1izoXBm8qGCAtQwggI9AgEBMIIBAKGB2KSB1TCB0jELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxh # bmQgT3BlcmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjox # NzlFLTRCQjAtODI0NjElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy # dmljZaIjCgEBMAcGBSsOAwIaAxUAbfPR1fBX6HxYfyPx8zYzJU5fIQyggYMwgYCk # fjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD # Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQUFAAIF # AOmJvw4wIhgPMjAyNDAyMjgyMjE3NTBaGA8yMDI0MDIyOTIyMTc1MFowdDA6Bgor # BgEEAYRZCgQBMSwwKjAKAgUA6Ym/DgIBADAHAgEAAgIFODAHAgEAAgIRUDAKAgUA # 6YsQjgIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAID # B6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBBQUAA4GBAErMic/nNPp5tSOJsfCe # cCou9ByTN3G55pr1uxb+X3idhClgYGc3ljiCPGpHiDsoGXrc4dK+WWhXosUk2fv4 # 6uOPrhy11gttQCsn+i9NRKfttUNZl3FIUO2oKEwmp78mrjzCAwD8dlydsjn4dHDC # v8eIDkmbT8xHYmeUT9tHQQbPMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUt # U3RhbXAgUENBIDIwMTACEzMAAAHg1PwfExUffl0AAQAAAeAwDQYJYIZIAWUDBAIB # BQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQx # IgQglNgK47c71WKJOG5g2y+AApAEcyqHADjhpZ4/dB+p4sEwgfoGCyqGSIb3DQEJ # EAIvMYHqMIHnMIHkMIG9BCDj7lK/8jnlbTjPvc77DCCSb4TZApY9nJm5whsK/2kK # wTCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw # DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # JjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB4NT8 # HxMVH35dAAEAAAHgMCIEIG01xKO9hBFTAtjUO/ZHX2/vm3tWdTGjY5wDebXC55bI # MA0GCSqGSIb3DQEBCwUABIICAJoPjC43AcUU9lN9+c549gXuhqz1C9aqKQVB8mux # cW5LCtrWVm27c88KBVypkN7OUgF2u3yaEElY7KiJXtyNORQT/1FVQsaXFY/MQQ/5 # 7FgsChpzNqEFgPJ4gJ4ok8cIvY4tBOvDerylx8eDvWG/bgOhI5QAtYVQtCA1thfa # 0Cp5EXnNteBM7vnQOHKqynPf+q9mRbSMu5JWXqf/z3/gNkVog02BO1rcd9+ajDo7 # fB3j6/aEQBmwiK9j3bNOQHDysqXrS7wNGaheO18w5E3Q+juM+TKHYmdae9eRUvGf # lq9f83UC720KX74V4ErZJgSexKqs3SZFlgehxfWJI5mpYppPZlshVXmBpkF29o6x # NmDPXtj2Jt4x5r8yCi0FWZErwyTnpgI/8lxqBfq1nCbtlB/+Xud+3yql94kuXuKv # XH5cfgPw5rCFqnEAobmoSsAX+9eadG4VJc4QngMt9narUPpILvDN9GbcK5qtH5lq # xAzjNhsWTo/AEmvP3CyKMvDueQcEZiixUZasdCC2IvRJ4aps28HIZiyml8WIDGCJ # MwKS9tEEROWSRw7S3q3JYP/cKm8X+9gU0q1Bos3mI/zVQdB1z6IbuZddY3W+0Rda # X8I+gm2nJ26XH3QsFjWFORoziGbhx4HzZWmfW2yNl8pHux2J5/d9S33drPg17sVf # hxIi # SIG # End signature block