dbatools.library.psm1
|
param( # Automatically skip loading assemblies that are already loaded (useful when SqlServer module is already imported) [Alias('SkipLoadedAssemblies', 'AllowSharedAssemblies')] [switch]$AvoidConflicts ) function Get-DbatoolsLibraryPath { [CmdletBinding()] param() if ($PSVersionTable.PSEdition -eq "Core") { Join-Path -Path $PSScriptRoot -ChildPath core } else { Join-Path -Path $PSScriptRoot -ChildPath desktop } } $script:libraryroot = Get-DbatoolsLibraryPath if ($PSVersionTable.PSEdition -ne "Core") { if (-not ("Redirector" -as [type])) { $source = @" using System; using System.IO; using System.Reflection; public class Redirector { private static string _libPath; public Redirector(string libPath) { _libPath = libPath; this.EventHandler = new ResolveEventHandler(AssemblyResolve); } public readonly ResolveEventHandler EventHandler; protected static Assembly AssemblyResolve(object sender, ResolveEventArgs e) { var requestedName = new AssemblyName(e.Name); var assemblyName = requestedName.Name; // First, check if any version of this assembly is already loaded // This handles version mismatches (e.g., SMO requesting SqlClient 5.0.0.0 when 6.0.2 is loaded) foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { try { if (assembly.GetName().Name == assemblyName) { return assembly; } } catch { // Some assemblies may throw when accessing GetName() } } // Try to load from our lib folder if the file exists string dllPath = Path.Combine(_libPath, assemblyName + ".dll"); if (File.Exists(dllPath)) { try { return Assembly.LoadFrom(dllPath); } catch { // Failed to load, return null to let default resolution continue } } return null; } } "@ $null = Add-Type -TypeDefinition $source } try { $libPath = [System.IO.Path]::Combine($script:libraryroot, "lib") $redirector = New-Object Redirector($libPath) [System.AppDomain]::CurrentDomain.add_AssemblyResolve($redirector.EventHandler) } catch { Write-Verbose "Could not register Redirector: $_" } } else { # PowerShell Core: Use AssemblyLoadContext.Resolving event for version redirection # This handles version mismatches when SqlServer module loads different versions of assemblies # IMPORTANT: Must be implemented in C# because the resolver runs on .NET threads without PowerShell runspaces $dir = [System.IO.Path]::Combine($script:libraryroot, "lib") $dir = ("$dir" + [System.IO.Path]::DirectorySeparatorChar).Replace('\', '\\') if (-not ("CoreRedirector" -as [type])) { $coreSource = @" using System; using System.IO; using System.Reflection; using System.Runtime.Loader; public class CoreRedirector { private static string _libPath; private static bool _registered = false; public static void Register(string libPath) { if (_registered) return; _libPath = libPath; AssemblyLoadContext.Default.Resolving += OnResolving; _registered = true; } private static Assembly OnResolving(AssemblyLoadContext context, AssemblyName assemblyName) { string name = assemblyName.Name; // First, check if any version of this assembly is already loaded // This handles version mismatches (e.g., dbatools.dll requesting ConnectionInfo 17.100.0.0 when 17.200.0.0 is loaded) foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { try { if (assembly.GetName().Name == name) { return assembly; } } catch { // Some assemblies may throw when accessing GetName() } } // Try to load from our lib folder if the file exists string dllPath = _libPath + name + ".dll"; if (File.Exists(dllPath)) { try { return AssemblyLoadContext.Default.LoadFromAssemblyPath(dllPath); } catch { // Failed to load, return null to let default resolution continue } } return null; } } "@ try { $null = Add-Type -TypeDefinition $coreSource -ReferencedAssemblies 'System.Runtime.Loader' } catch { Write-Verbose "Could not compile CoreRedirector: $_" } } try { [CoreRedirector]::Register($dir) } catch { Write-Verbose "Could not register CoreRedirector: $_" } } # REMOVED win-sqlclient logic - SqlClient is now directly in lib $sqlclient = [System.IO.Path]::Combine($script:libraryroot, "lib", "Microsoft.Data.SqlClient.dll") # Get loaded assemblies once for reuse (used for AvoidConflicts checks and later assembly loading) $script:loadedAssemblies = [System.AppDomain]::CurrentDomain.GetAssemblies() # Check for incompatible System.ClientModel or SqlClient versions # Azure.Core 1.44+ requires System.ClientModel 1.1+ with IPersistableModel.Write() method # SqlServer module's SqlClient 5.x includes older System.ClientModel that's incompatible $script:hasIncompatibleClientModel = $false if ($AvoidConflicts) { # Check if System.ClientModel is already loaded with incompatible version $existingClientModel = $script:loadedAssemblies | Where-Object { $_.GetName().Name -eq 'System.ClientModel' } if ($existingClientModel) { $clientModelVersion = $existingClientModel.GetName().Version # System.ClientModel 1.1.0+ has the required IPersistableModel interface changes if ($clientModelVersion -lt [Version]'1.1.0') { $script:hasIncompatibleClientModel = $true Write-Verbose "Detected incompatible System.ClientModel version $clientModelVersion - will skip Azure.Core and Azure.Identity to avoid MissingMethodException" } } # Check if SqlServer's older SqlClient is loaded (which bundles incompatible System.ClientModel) # SqlClient 5.x from SqlServer module uses System.ClientModel 1.0.x # Our Azure.Core requires System.ClientModel 1.1+ if (-not $script:hasIncompatibleClientModel) { $existingSqlClient = $script:loadedAssemblies | Where-Object { $_.GetName().Name -eq 'Microsoft.Data.SqlClient' } if ($existingSqlClient) { $sqlClientVersion = $existingSqlClient.GetName().Version # SqlClient 5.x bundles older System.ClientModel; 6.x bundles compatible versions if ($sqlClientVersion.Major -lt 6) { $script:hasIncompatibleClientModel = $true Write-Verbose "Detected SqlClient $sqlClientVersion (pre-6.0) which uses incompatible System.ClientModel - will skip Azure.Core and Azure.Identity to avoid MissingMethodException" } } } } # Check if SqlClient is already loaded when AvoidConflicts is set $skipSqlClient = $false if ($AvoidConflicts) { $existingAssembly = $script:loadedAssemblies | Where-Object { $_.GetName().Name -eq 'Microsoft.Data.SqlClient' } if ($existingAssembly) { $skipSqlClient = $true Write-Verbose "Skipping Microsoft.Data.SqlClient.dll - already loaded" } } if (-not $skipSqlClient) { try { Import-Module $sqlclient } catch { throw "Couldn't import $sqlclient | $PSItem" } } if ($PSVersionTable.PSEdition -eq "Core") { $names = @( 'Microsoft.SqlServer.Server', 'Azure.Core', 'Azure.Identity', 'Microsoft.IdentityModel.Abstractions', 'Microsoft.SqlServer.Dac', 'Microsoft.SqlServer.Dac.Extensions', 'Microsoft.Data.Tools.Utilities', 'Microsoft.Data.Tools.Schema.Sql', 'Microsoft.SqlServer.TransactSql.ScriptDom', 'Microsoft.SqlServer.Smo', 'Microsoft.SqlServer.SmoExtended', 'Microsoft.SqlServer.SqlWmiManagement', 'Microsoft.SqlServer.WmiEnum', 'Microsoft.SqlServer.Management.RegisteredServers', 'Microsoft.SqlServer.Management.Collector', 'Microsoft.SqlServer.Management.XEvent', 'Microsoft.SqlServer.Management.XEventDbScoped', 'Microsoft.SqlServer.XEvent.XELite' ) } else { $names = @( 'Azure.Core', 'Azure.Identity', 'Microsoft.IdentityModel.Abstractions', 'Microsoft.SqlServer.Dac', 'Microsoft.SqlServer.Dac.Extensions', 'Microsoft.Data.Tools.Utilities', 'Microsoft.Data.Tools.Schema.Sql', 'Microsoft.SqlServer.TransactSql.ScriptDom', 'Microsoft.SqlServer.Smo', 'Microsoft.SqlServer.SmoExtended', 'Microsoft.SqlServer.SqlWmiManagement', 'Microsoft.SqlServer.WmiEnum', 'Microsoft.SqlServer.Management.RegisteredServers', 'Microsoft.SqlServer.Management.IntegrationServices', 'Microsoft.SqlServer.Management.Collector', 'Microsoft.SqlServer.Management.XEvent', 'Microsoft.SqlServer.Management.XEventDbScoped', 'Microsoft.SqlServer.XEvent.XELite' ) } if ($Env:SMODefaultModuleName) { # then it's DSC, load other required assemblies $names += "Microsoft.AnalysisServices.Core" $names += "Microsoft.AnalysisServices" $names += "Microsoft.AnalysisServices.Tabular" $names += "Microsoft.AnalysisServices.Tabular.Json" } # XEvent stuff kills CI/CD if ($PSVersionTable.OS -match "ARM64") { $names = $names | Where-Object { $PSItem -notmatch "XE" } } #endregion Names # Build string of loaded assembly names once for efficient checking $script:loadedAssemblyNames = $script:loadedAssemblies.FullName | Out-String try { $null = Import-Module ([IO.Path]::Combine($script:libraryroot, "third-party", "bogus", "Bogus.dll")) } catch { Write-Error "Could not import $assemblyPath : $($_ | Out-String)" } foreach ($name in $names) { $x64only = 'Microsoft.SqlServer.Replication', 'Microsoft.SqlServer.XEvent.Linq', 'Microsoft.SqlServer.BatchParser', 'Microsoft.SqlServer.Rmo', 'Microsoft.SqlServer.BatchParserClient' if ($name -in $x64only -and $env:PROCESSOR_ARCHITECTURE -eq "x86") { Write-Verbose -Message "Skipping $name. x86 not supported for this library." continue } # Skip Azure.Core and Azure.Identity if System.ClientModel is incompatible # These assemblies depend on System.ClientModel 1.1+ which has breaking API changes if ($script:hasIncompatibleClientModel -and $name -in @('Azure.Core', 'Azure.Identity')) { Write-Verbose "Skipping $name.dll - incompatible System.ClientModel already loaded" continue } # Check if assembly is already loaded (always check to avoid duplicate loads) if ($script:loadedAssemblyNames.Contains("$name,")) { if ($AvoidConflicts) { Write-Verbose "Skipping $name.dll - already loaded" } continue } # Load the assembly $assemblyPath = [IO.Path]::Combine($script:libraryroot, "lib", "$name.dll") try { $null = Import-Module $assemblyPath } catch { Write-Error "Could not import $assemblyPath : $($_ | Out-String)" } } # Keep the assembly resolver registered for Windows PowerShell # It's needed at runtime when SMO and other assemblies try to resolve dependencies # The resolver handles version mismatches (e.g., SMO requesting SqlClient 5.0.0.0 when 6.0.2 is loaded) if ($PSVersionTable.PSEdition -ne "Core" -and $redirector) { # Store the redirector in script scope so it stays alive and can be accessed if needed $script:assemblyRedirector = $redirector } # SIG # Begin signature block # MIIxPgYJKoZIhvcNAQcCoIIxLzCCMSsCAQMxDTALBglghkgBZQMEAgEwewYKKwYB # BAGCNwIBBKBtBGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBid8FloiX+/wzJ # JCbNZt3VG3mEk3f+PY85skG6wLyaXqCCFdswggbXMIIEv6ADAgECAhMzAAYMMkkI # 2l/syh+ZAAAABgwyMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDIwHhcNMjUxMjI4MDUzMzA1WhcNMjUxMjMx # MDUzMzA1WjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExDzANBgNV # BAcTBlZpZW5uYTERMA8GA1UEChMIZGJhdG9vbHMxETAPBgNVBAMTCGRiYXRvb2xz # MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAok0Y86UhOsw66OnBN+rQ # AVtWHWbp5FjcDkDI6JHuG6KQcCLqcEWyQB/NREJOUIRcbwn1g1HvqWTVScpf+1M0 # +LFYluSJ3KGKRlXyHsh30Krgcc8yPQ+Lwh391tlhPllXm3xHTN7Jizx6SWt8Wt4S # LSbAV1Ihv/Qz38JBOxzUnXNRLS6IhYfZld2sZEp+dG9z9j+KtivIWvDSm6HVTu1t # nehOR/F7YbEWxeqEHyAPb6EQIuxJAVOhJCDxx157lpcx8/slLtMTrPImN5zXUMyo # gw1Q54igTvx25fOUjf+noOVx0YUFWVIypvqRPgEZn/c81iNdnEw8xfRveyZ+5PLo # 5/AqBprcc38SpOqZrljOZXh/NFnWucS9RnEFxVgnCut/2gCqdzniXxD+R36xMpPV # m2ubz6hn2qT9LiNITebK04k+6py1wGqggD/xod5FZv2UKayjW9+xvvKdFAoz7k+4 # 7mB9jlZP2Cd2u8llRBuriek0XYHS6RtkToH26WrW+BRDAgMBAAGjggIXMIICEzAM # BgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA6BgNVHSUEMzAxBgorBgEEAYI3 # YQEABggrBgEFBQcDAwYZKwYBBAGCN2H5+cEspPS4DoOuxLIcm56wGDAdBgNVHQ4E # FgQURHxanu+FLn8/wq/8piT/LLhmcmswHwYDVR0jBBgwFoAUZZ9RzoVofy+KRYiq # 3acxux4NAF4wZwYDVR0fBGAwXjBcoFqgWIZWaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENTJTIw # RU9DJTIwQ0ElMjAwMi5jcmwwgaUGCCsGAQUFBwEBBIGYMIGVMGQGCCsGAQUFBzAC # hlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29m # dCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUyMENBJTIwMDIuY3J0MC0GCCsG # AQUFBzABhiFodHRwOi8vb25lb2NzcC5taWNyb3NvZnQuY29tL29jc3AwZgYDVR0g # BF8wXTBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5t # aWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMAgGBmeBDAEE # ATANBgkqhkiG9w0BAQwFAAOCAgEAjEzbAlIYlnXi6ctx2P5GKZNynwOPAjaCMRqG # PWQoFdS8xvQ8jCGsfUVBALu894ktqaE2kjaJRN3ACvB65bcXS+oL4PYMcj0oEFcG # fEXUiSbYpNSlX1Xrppgv2e1nd3AP92YKws6sorqrTq33dcv/lNYWWa25Cz5EGvJy # QmAguRnEf+ZdkZr4+uZ+rjVMVNTmRWDmsE+1jt9pk281KCu7eZN3gCFmDsvfXMg3 # 5KdYokZvi3j/IhkD3wmN89IrShSez0ohRlmPiFMJDqA/TcANbYfA1JY+Q1DrI9Qf # aURx+z/J8DLGJGT7OlkSuUWU525+lJfeG94WFdle9OzIUtL3Vf9rP3CgbfsKqgbu # N5Z5XoYUYedtLC5CYyz5A/ZCq4F9quZdoyMhWtNT60opw3V5zI1n18EGyxHMLCYO # rv3wYnhd27qR2CyFmUt1mav4S+tIB6KPOEaHGfAduLqvPCHT0HfYLr0saa700xRs # ++ZgcBSfjCFnSCgm5BErNCnBVa6/xWcvGDqJn/G2AucJMnp/FTKi9EIs+5KOgDTr # 3BM+R9Bo/3zSYvLE37J3Ldz+nTRTUKFBCckARvyOnfPn/98h5kdALL5mjg6GJymD # Uwkz+Covi4VaH5UmREODGh6qH0TL2LBXfegu0Yj/BJnR3mAZ4BblwE4dn7raFf/4 # pgredT8wggdaMIIFQqADAgECAhMzAAAABft6XDITYd9dAAAAAAAFMA0GCSqGSIb3 # DQEBDAUAMGMxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xNDAyBgNVBAMTK01pY3Jvc29mdCBJRCBWZXJpZmllZCBDb2RlIFNpZ25p # bmcgUENBIDIwMjEwHhcNMjEwNDEzMTczMTUzWhcNMjYwNDEzMTczMTUzWjBaMQsw # CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSswKQYD # VQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgRU9DIENBIDAyMIICIjANBgkq # hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0hqZfD8ykKTA6CDbWvshmBpDoBf7Lv13 # 2RVuSqVwQO3aALLkuRnnTIoRmMGo0fIMQrtwR6UHB06xdqOkAfqB6exubXTHu44+ # duHUCdE4ngjELBQyluMuSOnHaEdveIbt31OhMEX/4nQkph4+Ah0eR4H2sTRrVKmK # rlOoQlhia73Qg2dHoitcX1uT1vW3Knpt9Mt76H7ZHbLNspMZLkWBabKMl6BdaWZX # YpPGdS+qY80gDaNCvFq0d10UMu7xHesIqXpTDT3Q3AeOxSylSTc/74P3og9j3Oue # mEFauFzL55t1MvpadEhQmD8uFMxFv/iZOjwvcdY1zhanVLLyplz13/NzSoU3QjhP # dqAGhRIwh/YDzo3jCdVJgWQRrW83P3qWFFkxNiME2iO4IuYgj7RwseGwv7I9cxOy # aHihKMdT9NeoSjpSNzVnKKGcYMtOdMtKFqoV7Cim2m84GmIYZTBorR/Po9iwlasT # YKFpGZqdWKyYnJO2FV8oMmWkIK1iagLLgEt6ZaR0rk/1jUYssyTiRqWr84Qs3XL/ # V5KUBEtUEQfQ/4RtnI09uFFUIGJZV9mD/xOUksWodGrCQSem6Hy261xMJAHqTqMu # DKgwi8xk/mflr7yhXPL73SOULmu1Aqu4I7Gpe6QwNW2TtQBxM3vtSTmdPW6rK5y0 # gED51RjsyK0CAwEAAaOCAg4wggIKMA4GA1UdDwEB/wQEAwIBhjAQBgkrBgEEAYI3 # FQEEAwIBADAdBgNVHQ4EFgQUZZ9RzoVofy+KRYiq3acxux4NAF4wVAYDVR0gBE0w # SzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTAZBgkrBgEEAYI3FAIEDB4KAFMA # dQBiAEMAQTASBgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFNlBKbAPD2Ns # 72nX9c0pnqRIajDmMHAGA1UdHwRpMGcwZaBjoGGGX2h0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBD # b2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3JsMIGuBggrBgEFBQcBAQSBoTCB # njBtBggrBgEFBQcwAoZhaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j # ZXJ0cy9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ29kZSUyMFNpZ25pbmcl # MjBQQ0ElMjAyMDIxLmNydDAtBggrBgEFBQcwAYYhaHR0cDovL29uZW9jc3AubWlj # cm9zb2Z0LmNvbS9vY3NwMA0GCSqGSIb3DQEBDAUAA4ICAQBFSWDUd08X4g5HzvVf # rB1SiV8pk6XPHT9jPkCmvU/uvBzmZRAjYk2gKYR3pXoStRJaJ/lhjC5Dq/2R7P1Y # RZHCDYyK0zvSRMdE6YQtgGjmsdhzD0nCS6hVVcgfmNQscPJ1WHxbvG5EQgYQ0ZED # 1FN0MOPQzWe1zbH5Va0dSxtnodBVRjnyDYEm7sNEcvJHTG3eXzAyd00E5KDCsEl4 # z5O0mvXqwaH2PS0200E6P4WqLwgs/NmUu5+Aa8Lw/2En2VkIW7Pkir4Un1jG6+tj # /ehuqgFyUPPCh6kbnvk48bisi/zPjAVkj7qErr7fSYICCzJ4s4YUNVVHgdoFn2xb # W7ZfBT3QA9zfhq9u4ExXbrVD5rxXSTFEUg2gzQq9JHxsdHyMfcCKLFQOXODSzcYe # LpCd+r6GcoDBToyPdKccjC6mAq6+/hiMDnpvKUIHpyYEzWUeattyKXtMf+QrJeQ+ # ny5jBL+xqdOOPEz3dg7qn8/oprUrUbGLBv9fWm18fWXdAv1PCtLL/acMLtHoyeSV # MKQYqDHb3Qm0uQ+NQ0YE4kUxSQa+W/cCzYAI32uN0nb9M4Mr1pj4bJZidNkM4JyY # qezohILxYkgHbboJQISrQWrm5RYdyhKBpptJ9JJn0Z63LjdnzlOUxjlsAbQir2Wm # z/OJE703BbHmQZRwzPx1vu7S5zCCB54wggWGoAMCAQICEzMAAAAHh6M0o3uljhwA # AAAAAAcwDQYJKoZIhvcNAQEMBQAwdzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYGA1UEAxM/TWljcm9zb2Z0IElkZW50aXR5 # IFZlcmlmaWNhdGlvbiBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDIwMB4X # DTIxMDQwMTIwMDUyMFoXDTM2MDQwMTIwMTUyMFowYzELMAkGA1UEBhMCVVMxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0 # IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTCCAiIwDQYJKoZIhvcN # AQEBBQADggIPADCCAgoCggIBALLwwK8ZiCji3VR6TElsaQhVCbRS/3pK+MHrJSj3 # Zxd3KU3rlfL3qrZilYKJNqztA9OQacr1AwoNcHbKBLbsQAhBnIB34zxf52bDpIO3 # NJlfIaTE/xrweLoQ71lzCHkD7A4As1Bs076Iu+mA6cQzsYYH/Cbl1icwQ6C65rU4 # V9NQhNUwgrx9rGQ//h890Q8JdjLLw0nV+ayQ2Fbkd242o9kH82RZsH3HEyqjAB5a # 8+Ae2nPIPc8sZU6ZE7iRrRZywRmrKDp5+TcmJX9MRff241UaOBs4NmHOyke8oU1T # Yrkxh+YeHgfWo5tTgkoSMoayqoDpHOLJs+qG8Tvh8SnifW2Jj3+ii11TS8/FGngE # aNAWrbyfNrC69oKpRQXY9bGH6jn9NEJv9weFxhTwyvx9OJLXmRGbAUXN1U9nf4lX # ezky6Uh/cgjkVd6CGUAf0K+Jw+GE/5VpIVbcNr9rNE50Sbmy/4RTCEGvOq3GhjIT # bCa4crCzTTHgYYjHs1NbOc6brH+eKpWLtr+bGecy9CrwQyx7S/BfYJ+ozst7+yZt # G2wR461uckFu0t+gCwLdN0A6cFtSRtR8bvxVFyWwTtgMMFRuBa3vmUOTnfKLsLef # RaQcVTgRnzeLzdpt32cdYKp+dhr2ogc+qM6K4CBI5/j4VFyC4QFeUP2YAidLtvpX # RRo3AgMBAAGjggI1MIICMTAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMC # AQAwHQYDVR0OBBYEFNlBKbAPD2Ns72nX9c0pnqRIajDmMFQGA1UdIARNMEswSQYE # VR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp # b3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBD # AEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQ # T2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24l # MjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNybDCBwwYI # KwYBBQUHAQEEgbYwgbMwgYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZp # Y2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5j # cnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vbmVvY3NwLm1pY3Jvc29mdC5jb20vb2Nz # cDANBgkqhkiG9w0BAQwFAAOCAgEAfyUqnv7Uq+rdZgrbVyNMul5skONbhls5fccP # lmIbzi+OwVdPQ4H55v7VOInnmezQEeW4LqK0wja+fBznANbXLB0KrdMCbHQpbLvG # 6UA/Xv2pfpVIE1CRFfNF4XKO8XYEa3oW8oVH+KZHgIQRIwAbyFKQ9iyj4aOWeAzw # k+f9E5StNp5T8FG7/VEURIVWArbAzPt9ThVN3w1fAZkF7+YU9kbq1bCR2YD+Mtun # SQ1Rft6XG7b4e0ejRA7mB2IoX5hNh3UEauY0byxNRG+fT2MCEhQl9g2i2fs6VOG1 # 9CNep7SquKaBjhWmirYyANb0RJSLWjinMLXNOAga10n8i9jqeprzSMU5ODmrMCJE # 12xS/NWShg/tuLjAsKP6SzYZ+1Ry358ZTFcx0FS/mx2vSoU8s8HRvy+rnXqyUJ9H # BqS0DErVLjQwK8VtsBdekBmdTbQVoCgPCqr+PDPB3xajYnzevs7eidBsM71PINK2 # BoE2UfMwxCCX3mccFgx6UsQeRSdVVVNSyALQe6PT12418xon2iDGE81OGCreLzDc # MAZnrUAx4XQLUz6ZTl65yPUiOh3k7Yww94lDf+8oG2oZmDh5O1Qe38E+M3vhKwmz # IeoB1dVLlz4i3IpaDcR+iuGjH2TdaC1ZOmBXiCRKJLj4DT2uhJ04ji+tHD6n58vh # avFIrmcxghq5MIIatQIBATBxMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmll # ZCBDUyBFT0MgQ0EgMDICEzMABgwySQjaX+zKH5kAAAAGDDIwCwYJYIZIAWUDBAIB # oHwwEAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIJ2T # ToYBEvmq9w20vtgQi8MRMZ7SelOitq4WbeiPmrRSMAsGCSqGSIb3DQEBAQSCAYBw # iA+W0P6kJgvYPbzg3WOQc1MYt49UXNIcQ7P0us9nc/8borkB+HWxqNpjSVhm8cMz # 5PcybxYVIzBm5/gWq84QHUWfy8n4wZ3Xc0gRwm7P77CpykZBbUMRtmxvIAJU4kUg # Q1ZfOxuywnFKTzu/FzwuN9C8Ick7HoZBz15VBTvSBiBwKcbRDyRpasUfyjx505t/ # xe3DQYNfv5Ecf7rPwbweba2k9x9JXNZrMPrsmQ0/PTf157EOktetScAzTnSiZBlP # k8YE9W0mqBMAaPgG2XrufbEmXSj8czycSMgJLSbFfxHxe0oLZh192kNtxo+Enim5 # vrSI3958oc4O7IqHXbg8LLthM0vzAO+vZ32x2yYf78uB9ISIpdDfN9LVpIFBGxog # gcgN/pqnjk4rhTYqXvQWG546OKtyiArbBfVeJ9JwsqRfZYwjTw8wHwnzA/6jRlO6 # samqBZvQtNH/z4/sX+8LSEcaG42xc6jGrIUIXc6ieJYGzlx0VGTgBGAxS0UMIs+h # ghgfMIIYGwYKKwYBBAGCNwMDATGCGAswghgHBgkqhkiG9w0BBwKgghf4MIIX9AIB # AzEPMA0GCWCGSAFlAwQCAQUAMIIBbQYLKoZIhvcNAQkQAQSgggFcBIIBWDCCAVQC # AQEGCisGAQQBhFkKAwEwMTANBglghkgBZQMEAgEFAAQgJURq4sQ4GgadQgN4PRas # kfnqW0tEX+ohSybqhEYTSVICBmlJn5w8pRgTMjAyNTEyMjgxMDE2MTAuMjI0WjAE # gAIB9AIJAKdSinl5WU89oIHhpIHeMIHbMQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRp # b25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046QTUwMC0wNUUwLUQ5NDcxNTAz # BgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9y # aXR5oIIPITCCB4IwggVqoAMCAQICEzMAAAAF5c8P/2YuyYcAAAAAAAUwDQYJKoZI # hvcNAQEMBQAwdzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw # b3JhdGlvbjFIMEYGA1UEAxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlv # biBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDIwMB4XDTIwMTExOTIwMzIz # MVoXDTM1MTExOTIwNDIzMVowYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0Eg # VGltZXN0YW1waW5nIENBIDIwMjAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK # AoICAQCefOdSY/3gxZ8FfWO1BiKjHB7X55cz0RMFvWVGR3eRwV1wb3+yq0OXDEqh # UhxqoNv6iYWKjkMcLhEFxvJAeNcLAyT+XdM5i2CgGPGcb95WJLiw7HzLiBKrxmDj # 1EQB/mG5eEiRBEp7dDGzxKCnTYocDOcRr9KxqHydajmEkzXHOeRGwU+7qt8Md5l4 # bVZrXAhK+WSk5CihNQsWbzT1nRliVDwunuLkX1hyIWXIArCfrKM3+RHh+Sq5RZ8a # Yyik2r8HxT+l2hmRllBvE2Wok6IEaAJanHr24qoqFM9WLeBUSudz+qL51HwDYyID # PSQ3SeHtKog0ZubDk4hELQSxnfVYXdTGncaBnB60QrEuazvcob9n4yR65pUNBCF5 # qeA4QwYnilBkfnmeAjRN3LVuLr0g0FXkqfYdUmj1fFFhH8k8YBozrEaXnsSL3kdT # D01X+4LfIWOuFzTzuoslBrBILfHNj8RfOxPgjuwNvE6YzauXi4orp4Sm6tF245Da # FOSYbWFK5ZgG6cUY2/bUq3g3bQAqZt65KcaewEJ3ZyNEobv35Nf6xN6FrA6jF944 # 7+NHvCjeWLCQZ3M8lgeCcnnhTFtyQX3XgCoc6IRXvFOcPVrr3D9RPHCMS6Ckg8wg # gTrtIVnY8yjbvGOUsAdZbeXUIQAWMs0d3cRDv09SvwVRd61evQIDAQABo4ICGzCC # AhcwDgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRr # aSg6NS9IY0DPe9ivSek+2T3bITBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEF # BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9z # aXRvcnkuaHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoA # UwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUyH7SaoUqG8oZ # mAQHJ89QEE9oqKIwgYQGA1UdHwR9MHsweaB3oHWGc2h0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZp # Y2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5j # cmwwgZQGCCsGAQUFBwEBBIGHMIGEMIGBBggrBgEFBQcwAoZ1aHR0cDovL3d3dy5t # aWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJZGVudGl0eSUy # MFZlcmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUy # MDIwMjAuY3J0MA0GCSqGSIb3DQEBDAUAA4ICAQBfiHbHfm21WhV150x4aPpO4dhE # mSUVpbixNDmv6TvuIHv1xIs174bNGO/ilWMm+Jx5boAXrJxagRhHQtiFprSjMktT # liL4sKZyt2i+SXncM23gRezzsoOiBhv14YSd1Klnlkzvgs29XNjT+c8hIfPRe9rv # VCMPiH7zPZcw5nNjthDQ+zD563I1nUJ6y59TbXWsuyUsqw7wXZoGzZwijWT5oc6G # vD3HDokJY401uhnj3ubBhbkR83RbfMvmzdp3he2bvIUztSOuFzRqrLfEvsPkVHYn # vH1wtYyrt5vShiKheGpXa2AWpsod4OJyT4/y0dggWi8g/tgbhmQlZqDUf3UqUQsZ # aLdIu/XSjgoZqDjamzCPJtOLi2hBwL+KsCh0Nbwc21f5xvPSwym0Ukr4o5sCcMUc # Sy6TEP7uMV8RX0eH/4JLEpGyae6Ki8JYg5v4fsNGif1OXHJ2IWG+7zyjTDfkmQ1s # nFOTgyEX8qBpefQbF0fx6URrYiarjmBprwP6ZObwtZXJ23jK3Fg/9uqM3j0P01nz # VygTppBabzxPAh/hHhhls6kwo3QLJ6No803jUsZcd4JQxiYHHc+Q/wAMcPUnYKv/ # q2O444LO1+n6j01z5mggCSlRwD9faBIySAcA9S8h22hIAcRQqIGEjolCK9F6nK9Z # yX4lhthsGHumaABdWzCCB5cwggV/oAMCAQICEzMAAABWfo+dWAiO6WAAAAAAAFYw # DQYJKoZIhvcNAQEMBQAwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGlt # ZXN0YW1waW5nIENBIDIwMjAwHhcNMjUxMDIzMjA0NjUxWhcNMjYxMDIyMjA0NjUx # WjCB2zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT # B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UE # CxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVs # ZCBUU1MgRVNOOkE1MDAtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3NvZnQgUHVi # bGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEB # BQADggIPADCCAgoCggIBALSln5v7pdNu/3fEZW/DJ/4NEFL7y6mNlbMt7SPFNrRU # rKU2aJmTg9wR0/C5Efka4TCYG9VYwChTcrGivXC0l4nzxkiAazwoLPT+MtuJayRJ # q1ekOc+AZqjISD62YRL2Z1qQkuBzu42Enov58Zgu/9RK/peS4Nz5ksW/HdiFXAEc # UsNQeJsQelyNJ5HpfcGtXWG9sHxqaH62hZsWTsU/XjYbeCx9EQUlbnm2umTaY0v9 # ILX5u6oiIsj+qej0c002zJ1arB51f3f61tMx8fkPkDWecFKipk2SQfYVPOd/tqV+ # aw3yt9rjWPf1gTgJs26oKRHUJG4jGr1DMlA0oZsnCL4B3UJ0ttO7E4/DPpCS97Tn # WoT7j6jMLGggoHX8MEMdDvUynuxUr2wBGLNQJ5XQpfyhxmQjlb1Dao8i9dCS3tP/ # hg/f8p6lxlhaVzo2rp72f3CkToYzeDOXuscdG9poqnD4ouP4otmYXimpZSRE+wip # aRUobN8MoOhf36I0MULz521g+DcsepYY1o8JqC3MesNRUgrWrywpct9wS0UpU1OK # ilMWmvHe2DexKqZ/VztEmNLpjryhV61h+68ZfvYmonIrXZ005LAJ0Y73pHSk95YO # 5UTH5n2VPL1zYjdFGCc0/RI6o0ZtLjf4dKF8T4TXz2KnhW8j1xhsc2mFM+s8d6k3 # AgMBAAGjggHLMIIBxzAdBgNVHQ4EFgQUvrYz8rurWf4eRrMi78s9R/hTSFowHwYD # VR0jBBgwFoAUa2koOjUvSGNAz3vYr0npPtk92yEwbAYDVR0fBGUwYzBhoF+gXYZb # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw # UHVibGljJTIwUlNBJTIwVGltZXN0YW1waW5nJTIwQ0ElMjAyMDIwLmNybDB5Bggr # BgEFBQcBAQRtMGswaQYIKwYBBQUHMAKGXWh0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwUHVibGljJTIwUlNBJTIwVGltZXN0 # YW1waW5nJTIwQ0ElMjAyMDIwLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQM # MAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBmBgNVHSAEXzBdMFEGDCsGAQQB # gjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v # cGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wCAYGZ4EMAQQCMA0GCSqGSIb3DQEB # DAUAA4ICAQAOA6gFxLDtuo/y2uxYJ/0In4rfMbmXpKmee/mHvrB/4UU2xBIxmK2Y # LKsEf5VFHyghaW2RfJrGmT0CTkeGGFBFPF8oy65/GNYwkpqMYfZe7VokqHPyRQcN # +eiQJsxhsXgQNhFksUbk69QLmXup2GjfP8LRZIh3LPIDGncVwbOg8VYcruWJ4Sz0 # JH7pipt5RX7cBO6Ynle39ZbJJpYLAugHkhgsxj2VIAr3B+U7/0Hvc+2yCJkg90rs # 4TiMGj/nikE2H+u04n8iSpFkEnRn0wOinLuNZPCweqDyvjC5NY28cSucD6i0i+ts # YytOEgVxxCUhJ7BbdM8VpMT/5YHo9Q8alJ5q2BHZMb8ykhyAKhVkmbpf+YSPrycb # xT4bDUARJOHErpQ5CUKXHVYv4Jn/5hxTmIQwY7GtebOC/trAYpd11f0/EYkeukPM # WL0y0VsXdnVbKzqAsJ7FOFiHogtCYpwr9VixxIe0Ms6/UUq+JCiS1naTWC4YI5KI # 05hJAIxTu++Ld8Qe3p27yBdBjrFdfcZwlM6vRBisrdIDLmqYSpTYyfmk6Y1jGQxq # PhjirJ6fdx5n7ZpdEsqdxffjN8vsuliRlGaCGSattu4w44xJ3baVK4fQXT3VSH1S # Q/wLvNUc4dOVBwIr6K0NzrPDxCxyIIjnfU1s23YJhs3CC7f3XVUBETGCB0YwggdC # AgEBMHgwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh # dGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5n # IENBIDIwMjACEzMAAABWfo+dWAiO6WAAAAAAAFYwDQYJYIZIAWUDBAIBBQCgggSf # MBEGCyqGSIb3DQEJEAIPMQIFADAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQw # HAYJKoZIhvcNAQkFMQ8XDTI1MTIyODEwMTYxMFowLwYJKoZIhvcNAQkEMSIEIGmj # w4vpInJO0t5ctpYoj/aCz+aT/VNoBU38s5DfQ8RNMIG5BgsqhkiG9w0BCRACLzGB # qTCBpjCBozCBoAQgtgwzJU2k4/CVd4k4OV56XuAkh+tNeN2fl/aOTQYDDKgwfDBl # pGMwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5nIENB # IDIwMjACEzMAAABWfo+dWAiO6WAAAAAAAFYwggNhBgsqhkiG9w0BCRACEjGCA1Aw # ggNMoYIDSDCCA0QwggIsAgEBMIIBCaGB4aSB3jCB2zELMAkGA1UEBhMCVVMxEzAR # BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2Eg # T3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOkE1MDAtMDVFMC1E # OTQ3MTUwMwYDVQQDEyxNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lIFN0YW1waW5n # IEF1dGhvcml0eaIjCgEBMAcGBSsOAwIaAxUA/3P3KRUqkFmAXl4IMkSdmW72BBGg # ZzBlpGMwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh # dGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5n # IENBIDIwMjAwDQYJKoZIhvcNAQELBQACBQDs+15aMCIYDzIwMjUxMjI4MDc0NDI2 # WhgPMjAyNTEyMjkwNzQ0MjZaMHcwPQYKKwYBBAGEWQoEATEvMC0wCgIFAOz7XloC # AQAwCgIBAAICJrMCAf8wBwIBAAICEkYwCgIFAOz8r9oCAQAwNgYKKwYBBAGEWQoE # AjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkq # hkiG9w0BAQsFAAOCAQEAXD88PxvVxGimjCxWVMSnDhtvJBJY9hJfFQFhUZLBTEox # nYPcsSBtYyjRQin5eM/PTTN4YsN+GGA4M7ld9vus0GGdWJbpu3VDpiTYOC3TlyYo # aAiRGiZXNPyMT+TWP79T9JZczbUVXWRgxj1qBc1nm/UmyrPVkpLYb/pZoukpXvsX # wD5WMeGFR5x8TP3DhOj7fb5k2WWDxv4WXfeIOo2k7JUWLJdrFtkI4igR4nIB+J5L # 9SNaSzm2DzUhEfQFBMHeE6OoBKRBknhEiF/OD659Q3NIbtrEq/iNXWxQf9MSiB4t # bDaNuHOXTLDYkDmXIK/xriFiCzgQxL+eDlQ2+BW7LzANBgkqhkiG9w0BAQEFAASC # AgCVZfYZBYjyNIjPPlEsfXhCerLEKjD6RvU8i+MDTmMfAALNr5+rR+kVfK0/VD2+ # vwLGOz2PCqP/kw7ag9vk9nHiInCM02ReZFVKndOtVxPbcpVEt/MymqzkF4XIRd4D # ubGnnVtbJXj/CgVdj0/jnp6KKOzamGn8eSeCu2XogHZOkNxXKpPP+U3hMHgMTp7u # RcNRN/W8yxqCrjck5/hOSqiCOxG+KIVhYelHL+F9fFatYz/oR9L9c6j/SfC+KqN7 # TtZQe7DU5qcgEqdw5BscRGr0l2pYf0SnukVIx4hnLOGUka4iZ0/zOEodL70fgABW # 2ELrxGXqaykxaN0BqPbYDR2uzLW7KtH/2Z6fZRP2W2poSxZ9osoczk7LP4I5/IYX # P7hLg8qNxeQR1PyFlDp6NlRTnR1ggfLg7EscDiaTx5AXsdfS4q1zGYom3fC9lDBK # H4KdIyJQkjVFuqjCGy3zcz91FH0J9qyAr1HQAFfCQyVUr0QO9/+iB6FRniwSjhCj # ll2Yz9ZRrfCkFFdkWLLmIOXSJJxdKbIKRIUcKcW/D/V4TkiYs0UFOcTfQawu8X5L # fKg380o9s4UqjlwX/owTbTHByFdwnfnJR97oUzjIOXwykiMy3mzM10v9JP9FKerC # JEzbNx34led9xgLRY9MN2/cJzyTw3vYZB2N2sCuz0nuFSg== # SIG # End signature block |