Framework/Models/AzSKConfig.ps1
Set-StrictMode -Version Latest class AzSKConfig { [string] $MaintenanceMessage [string] $AzSKRGName [string] $AzSKRepoURL [string] $AzSKServerVersion [string[]] $SubscriptionMandatoryTags = @() [string] $ERvNetResourceGroupNames [string] $UpdateCompatibleCCVersion [string] $AzSKApiBaseURL; [bool] $PublishVulnDataToApi; [string] $ControlTelemetryKey; [bool] $EnableControlTelemetry; [string] $PolicyMessage; [string] $AzSKLocation; [string] $InstallationCommand; [string] $PublicPSGalleryUrl; [string] $AzSKCARunbookVersion; [string] $AzSKCAMinReqdRunbookVersion; [string] $AzSKAlertsMinReqdVersion; [string] $AzSKARMPolMinReqdVersion; [string[]] $PrivacyAcceptedSources = @(); [string] $OutputFolderPath; [int] $BackwardCompatibleVersionCount; [string[]] $DefaultControlExculdeTags = @() [string[]] $DefaultControlFiltersTags = @() [System.Version[]] $AzSKVersionList = @() [int] $CAScanIntervalInHours; [string] $ConfigSchemaBaseVersion; [string] $AzSKASCMinReqdVersion; #Bool flag to check selfsigned cert to avoid break of current configurations [bool] $AllowSelfSignedWebhookCertificate; [bool] $EnableDevOpsKitSetupCheck; [bool] $UpdateToLatestVersion; [string] $CASetupRunbookURL; [string] $AzSKConfigURL; [bool] $IsAlertMonitoringEnabled; [string] $SupportDL; [string] $RunbookScanAgentBaseVersion; [string] $PolicyOrgName; [bool] $StoreComplianceSummaryInUserSubscriptions; [string] $LatestPSGalleryVersion; [string] $SchemaTemplateURL; [bool] $EnableAzurePolicyBasedScan; [string] $AzSKInitiativeName; hidden static [AzSKConfig] $Instance = $null; static [AzSKConfig] GetInstance([bool] $useOnlinePolicyStore, [string] $onlineStoreUri, [bool] $enableAADAuthForOnlinePolicyStore) { if ( $null -eq [AzSKConfig]::Instance) { [AzSKConfig]::Instance = [AzSKConfig]::LoadRootConfiguration($useOnlinePolicyStore,$onlineStoreUri,$enableAADAuthForOnlinePolicyStore) } if(-not ([string]::IsNullOrWhiteSpace([AzSKConfig]::Instance.AzSKServerVersion))) { [AzSKConfig]::Instance.MaintenanceMessage = ([AzSKConfig]::Instance.MaintenanceMessage -f [AzSKConfig]::Instance.AzSKServerVersion); } return [AzSKConfig]::Instance } hidden static [AzSKConfig] LoadRootConfiguration([bool] $useOnlinePolicyStore, [string] $onlineStoreUri, [bool] $enableAADAuthForOnlinePolicyStore) { #Config filename will be static constant return [AzSKConfig] ([ConfigurationHelper]::LoadServerConfigFile("AzSK.json", $useOnlinePolicyStore, $onlineStoreUri, $enableAADAuthForOnlinePolicyStore)); } hidden [string] GetLatestAzSKVersion([string] $moduleName) { if([string]::IsNullOrWhiteSpace($this.AzSKServerVersion)) { $this.AzSKServerVersion = "0.0.0.0"; try { if((-not [string]::IsNullOrWhiteSpace($this.AzSKConfigURL)) -and (-not $this.UpdateToLatestVersion)) { try { $serverFileContent = [ConfigurationHelper]::InvokeControlsAPI($this.AzSKConfigURL, '', '', ''); if($null -ne $serverFileContent) { if(-not [string]::IsNullOrWhiteSpace($serverFileContent.CurrentVersionForOrg)) { $this.AzSKServerVersion = $serverFileContent.CurrentVersionForOrg } } } catch { # If unable to fetch server config file or module version property then continue and download latest version module. } } if($this.AzSKServerVersion -eq '0.0.0.0') { $repoUrl = $this.AzSKRepoURL; #Searching for the module in the repo $Url = "$repoUrl/api/v2/Search()?`$filter=IsLatestVersion&searchTerm=%27$moduleName%27&includePrerelease=false" [System.Uri] $validatedUri = $null; if([System.Uri]::TryCreate($Url, [System.UriKind]::Absolute, [ref] $validatedUri)) { $SearchResult = @() $SearchResult += Invoke-RestMethod -Method Get -Uri $validatedUri -UseBasicParsing if($SearchResult.Length -and $SearchResult.Length -gt 0) { #filter latest module $SearchResult = $SearchResult | Where-Object -FilterScript { return $_.title.'#text' -eq $moduleName } $moduleName = $SearchResult.title.'#text' # get correct casing for the module name $PackageDetails = Invoke-RestMethod -Method Get -UseBasicParsing -Uri $SearchResult.id $this.AzSKServerVersion = $PackageDetails.entry.properties.version } } } } catch { $this.AzSKServerVersion = "0.0.0.0"; } } return $this.AzSKServerVersion; } #Function to get list of AzSK version using API hidden [System.Version[]] GetAzSKVersionList([string] $moduleName) { if(($this.AzSKVersionList | Measure-Object).Count -eq 0) { try { $repoUrl = $this.AzSKRepoURL; #Searching for the module in the repo $Url = "$repoUrl/api/v2/FindPackagesById()?id='$moduleName'&`$skip=0&`$top=40&`$orderby=Version desc" [System.Uri] $validatedUri = $null; if([System.Uri]::TryCreate($Url, [System.UriKind]::Absolute, [ref] $validatedUri)) { $searchResult = Invoke-RestMethod -Method Get -Uri $validatedUri -UseBasicParsing $versionList =@() if($searchResult.Length -and $searchResult.Length -gt 0) { $versionList += $SearchResult | Where-Object {$_.title.'#text' -eq $ModuleName } | ForEach-Object {[System.Version] $_.properties.version } $this.AzSKVersionList = $versionList } } } catch { $this.AzSKVersionList = @(); } } return $this.AzSKVersionList; } hidden [string] GetAzSKLatestPSGalleryVersion([string] $moduleName) { if([string]::IsNullOrWhiteSpace($this.LatestPSGalleryVersion)) { $this.LatestPSGalleryVersion = "0.0.0.0"; try { if($this.LatestPSGalleryVersion -eq '0.0.0.0') { $repoUrl = $this.AzSKRepoURL; #Searching for the module in the repo $Url = "$repoUrl/api/v2/Search()?`$filter=IsLatestVersion&searchTerm=%27$moduleName%27&includePrerelease=false" [System.Uri] $validatedUri = $null; if([System.Uri]::TryCreate($Url, [System.UriKind]::Absolute, [ref] $validatedUri)) { $SearchResult = @() $SearchResult += Invoke-RestMethod -Method Get -Uri $validatedUri -UseBasicParsing if($SearchResult.Length -and $SearchResult.Length -gt 0) { #filter latest module $SearchResult = $SearchResult | Where-Object -FilterScript { return $_.title.'#text' -eq $moduleName } $moduleName = $SearchResult.title.'#text' # get correct casing for the module name $PackageDetails = Invoke-RestMethod -Method Get -UseBasicParsing -Uri $SearchResult.id $this.LatestPSGalleryVersion = $PackageDetails.entry.properties.version } } } } catch { $this.LatestPSGalleryVersion = "0.0.0.0"; } } return $this.LatestPSGalleryVersion; } } # SIG # Begin signature block # MIIjkAYJKoZIhvcNAQcCoIIjgTCCI30CAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAA3mYHqOiDnJ7w # 24+fxa+6qHDLj31OAUhdlyn9V9WD26CCDYEwggX/MIID56ADAgECAhMzAAAB32vw # LpKnSrTQAAAAAAHfMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjAxMjE1MjEzMTQ1WhcNMjExMjAyMjEzMTQ1WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQC2uxlZEACjqfHkuFyoCwfL25ofI9DZWKt4wEj3JBQ48GPt1UsDv834CcoUUPMn # s/6CtPoaQ4Thy/kbOOg/zJAnrJeiMQqRe2Lsdb/NSI2gXXX9lad1/yPUDOXo4GNw # PjXq1JZi+HZV91bUr6ZjzePj1g+bepsqd/HC1XScj0fT3aAxLRykJSzExEBmU9eS # yuOwUuq+CriudQtWGMdJU650v/KmzfM46Y6lo/MCnnpvz3zEL7PMdUdwqj/nYhGG # 3UVILxX7tAdMbz7LN+6WOIpT1A41rwaoOVnv+8Ua94HwhjZmu1S73yeV7RZZNxoh # EegJi9YYssXa7UZUUkCCA+KnAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUOPbML8IdkNGtCfMmVPtvI6VZ8+Mw # UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1 # ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDYzMDA5MB8GA1UdIwQYMBaAFEhu # ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu # bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w # Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx # MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAnnqH # tDyYUFaVAkvAK0eqq6nhoL95SZQu3RnpZ7tdQ89QR3++7A+4hrr7V4xxmkB5BObS # 0YK+MALE02atjwWgPdpYQ68WdLGroJZHkbZdgERG+7tETFl3aKF4KpoSaGOskZXp # TPnCaMo2PXoAMVMGpsQEQswimZq3IQ3nRQfBlJ0PoMMcN/+Pks8ZTL1BoPYsJpok # t6cql59q6CypZYIwgyJ892HpttybHKg1ZtQLUlSXccRMlugPgEcNZJagPEgPYni4 # b11snjRAgf0dyQ0zI9aLXqTxWUU5pCIFiPT0b2wsxzRqCtyGqpkGM8P9GazO8eao # mVItCYBcJSByBx/pS0cSYwBBHAZxJODUqxSXoSGDvmTfqUJXntnWkL4okok1FiCD # Z4jpyXOQunb6egIXvkgQ7jb2uO26Ow0m8RwleDvhOMrnHsupiOPbozKroSa6paFt # VSh89abUSooR8QdZciemmoFhcWkEwFg4spzvYNP4nIs193261WyTaRMZoceGun7G # CT2Rl653uUj+F+g94c63AhzSq4khdL4HlFIP2ePv29smfUnHtGq6yYFDLnT0q/Y+ # Di3jwloF8EWkkHRtSuXlFUbTmwr/lDDgbpZiKhLS7CBTDj32I0L5i532+uHczw82 # oZDmYmYmIUSMbZOgS65h797rj5JJ6OkeEUJoAVwwggd6MIIFYqADAgECAgphDpDS # AAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0 # ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5MDlaFw0yNjA3MDgyMTA5MDla # MH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMT # H01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwggIiMA0GCSqGSIb3DQEB # AQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQTTS68rZYIZ9CGypr6VpQqrgG # OBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULTiQ15ZId+lGAkbK+eSZzpaF7S # 35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYSL+erCFDPs0S3XdjELgN1q2jz # y23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494HDdVceaVJKecNvqATd76UPe/7 # 4ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZPrGMXeiJT4Qa8qEvWeSQOy2u # M1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5bmR/U7qcD60ZI4TL9LoDho33 # X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGSrhwjp6lm7GEfauEoSZ1fiOIl # XdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADhvKwCgl/bwBWzvRvUVUvnOaEP # 6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON7E1JMKerjt/sW5+v/N2wZuLB # l4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xcv3coKPHtbcMojyyPQDdPweGF # RInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqwiBfenk70lrC8RqBsmNLg1oiM # CwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFEhuZOVQ # BdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud # DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFHItOgIxkEO5FAVO # 4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwubWljcm9zb2Z0 # LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y # Mi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUFBzAChkJodHRwOi8vd3d3Lm1p # Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y # Mi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGCNy4DMIGDMD8GCCsGAQUFBwIB # FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2RvY3MvcHJpbWFyeWNw # cy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AcABvAGwAaQBjAHkA # XwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAGfyhqWY # 4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4sPvjDctFtg/6+P+gKyju/R6mj # 82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKLUtCw/WvjPgcuKZvmPRul1LUd # d5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7pKkFDJvtaPpoLpWgKj8qa1hJ # Yx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft0N3zDq+ZKJeYTQ49C/IIidYf # wzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4MnEnGn+x9Cf43iw6IGmYslmJ # aG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxvFX1Fp3blQCplo8NdUmKGwx1j # NpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG0QaxdR8UvmFhtfDcxhsEvt9B # xw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf0AApxbGbpT9Fdx41xtKiop96 # eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkYS//WsyNodeav+vyL6wuA6mk7 # r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrvQQqxP/uozKRdwaGIm1dxVk5I # RcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIVZTCCFWECAQEwgZUwfjELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z # b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAd9r8C6Sp0q00AAAAAAB3zAN # BglghkgBZQMEAgEFAKCBsDAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor # BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQg/NXPZjwR # Vo23XRZL1Iizw0NXNDX4m2i9y0dG1UGybXYwRAYKKwYBBAGCNwIBDDE2MDSgFIAS # AE0AaQBjAHIAbwBzAG8AZgB0oRyAGmh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20g # MA0GCSqGSIb3DQEBAQUABIIBAGMVy4LvNgKSRStNwNBJEWZ4ger7EiWyKIB/9VIb # F8D25ist0vqysfMhKqUVfqZJTrBgkBexOiBKs6O8JR2oJne+j67vLfKuqu2/EKXz # hA0aIAhTPO2ti0v23YHrhmzxuMrZ2pTbE7Ydg0QeuA9l/7juvsjoBTzU0yp+3vH4 # WkaLxIaOhMp2t5NZ985XJImJxP3v3PexOrliLsVV3Df06Kc6ctB8gYuUIt7TDdJq # anAwpci362lzREO9ASbvqkO89NWBPDG+LxqpRsCVjRlH2p7X6/9RO6vHpXEgVyXC # +YM9+to483WhOsiIa2f3tZRTVuolj1ZDkPhdjvC6ScVHJgahghLtMIIS6QYKKwYB # BAGCNwMDATGCEtkwghLVBgkqhkiG9w0BBwKgghLGMIISwgIBAzEPMA0GCWCGSAFl # AwQCAQUAMIIBVAYLKoZIhvcNAQkQAQSgggFDBIIBPzCCATsCAQEGCisGAQQBhFkK # AwEwMTANBglghkgBZQMEAgEFAAQgSwkjcZgHuzq1Z+tOi6exIe64pTmn/P1h3+NX # BSa0jekCBmFExIOHhhgSMjAyMTA5MjgxMTE0NTUuODFaMASAAgH0oIHUpIHRMIHO # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBN # aWNyb3NvZnQgT3BlcmF0aW9ucyBQdWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVz # IFRTUyBFU046RDlERS1FMzlBLTQzRkUxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1l # LVN0YW1wIFNlcnZpY2Wggg5BMIIE9TCCA92gAwIBAgITMwAAAWH1ojNeoCokaQAA # AAABYTANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz # aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv # cnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAx # MDAeFw0yMTAxMTQxOTAyMjFaFw0yMjA0MTExOTAyMjFaMIHOMQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3NvZnQgT3Bl # cmF0aW9ucyBQdWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046RDlE # RS1FMzlBLTQzRkUxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZp # Y2UwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCXiJ2oQa1P/xs06ocV # MgAvFF3LelCQpG9sRGSld4I4IJiwIXga8SZO7R/j8NrU3Mmqy0X5ldsaOaAZOaVv # znA3P5/03E3kFOiSDeT5U3J9AvUZSkOrfTrlP1gMgMRk4yhOBDZ1I17cYjZQ/ytm # RjC746UTgSoe07ZFCSumRlsP7k0WmzQcUYNd0745Bh1xFBAyfIpmnMPQQnkfS+rp # 3a99rY+HbjhSBw/JtXrN0jTffGauCAwT9wnG/h0IMaW3hyFJStMus5syJL3ze92c # cHxrxb9PzGse/ViWNHA/KaAp2RYo3Ilq39Hg9U9v/ux4HsM63cT3UhaHJFEPEKLy # AyGJAgMBAAGjggEbMIIBFzAdBgNVHQ4EFgQUVh6andYb+9UlY+SwHT3zROz4Sy8w # HwYDVR0jBBgwFoAU1WM6XIoxkPNDe3xGG8UzaFqFbVUwVgYDVR0fBE8wTTBLoEmg # R4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWlj # VGltU3RhUENBXzIwMTAtMDctMDEuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEF # BQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNUaW1T # dGFQQ0FfMjAxMC0wNy0wMS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggr # BgEFBQcDCDANBgkqhkiG9w0BAQsFAAOCAQEAEEwPW6lQZseU0zIc4/kPM1pD0F4A # nEkIqstmGFhdIVq+RhIjdi7QPhFnbtcvKMrGWruAj+0szPFU0qt9QiyYjst/WeEb # xKtpq9BH7Rb5l9gsUO2cs65IVjGWmUC5GGx+aGmyBcJ3Vt+J4ffNATmN/ebX5zUv # 2OjdH/o13aBZ+3yNnON0xWLFKiD1ozhyZaDHpLZQ+v7kumZ+MbHv5SLRZvn1jnAd # gMclxAd2URHkoPY+/hqBJdcU/4iblf0qO05VncMmnELuJb9zAbL8c0SGyoWcKw2K # IJqMifq8IEAfJikuPzNUg0bSKbWpqExSeek5Og7lF8dSbnU6HpYIxGT2uTCCBnEw # ggRZoAMCAQICCmEJgSoAAAAAAAIwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBS # b290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTEwMDcwMTIxMzY1NVoX # DTI1MDcwMTIxNDY1NVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0 # b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh # dGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggEi # MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpHQ28dxGKOiDs/BOX9fp/aZRr # dFQQ1aUKAIKF++18aEssX8XD5WHCdrc+Zitb8BVTJwQxH0EbGpUdzgkTjnxhMFmx # MEQP8WCIhFRDDNdNuDgIs0Ldk6zWczBXJoKjRQ3Q6vVHgc2/JGAyWGBG8lhHhjKE # HnRhZ5FfgVSxz5NMksHEpl3RYRNuKMYa+YaAu99h/EbBJx0kZxJyGiGKr0tkiVBi # sV39dx898Fd1rL2KQk1AUdEPnAY+Z3/1ZsADlkR+79BL/W7lmsqxqPJ6Kgox8NpO # BpG2iAg16HgcsOmZzTznL0S6p/TcZL2kAcEgCZN4zfy8wMlEXV4WnAEFTyJNAgMB # AAGjggHmMIIB4jAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU1WM6XIoxkPND # e3xGG8UzaFqFbVUwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQD # AgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb # 186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29t # L3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoG # CCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgaAGA1Ud # IAEB/wSBlTCBkjCBjwYJKwYBBAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vUEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsG # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABl # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQAH5ohRDeLG4Jg/gXEDPZ2j # oSFvs+umzPUxvs8F4qn++ldtGTCzwsVmyWrf9efweL3HqJ4l4/m87WtUVwgrUYJE # Evu5U4zM9GASinbMQEBBm9xcF/9c+V4XNZgkVkt070IQyK+/f8Z/8jd9Wj8c8pl5 # SpFSAK84Dxf1L3mBZdmptWvkx872ynoAb0swRCQiPM/tA6WWj1kpvLb9BOFwnzJK # J/1Vry/+tuWOM7tiX5rbV0Dp8c6ZZpCM/2pif93FSguRJuI57BlKcWOdeyFtw5yj # ojz6f32WapB4pm3S4Zz5Hfw42JT0xqUKloakvZ4argRCg7i1gJsiOCC1JeVk7Pf0 # v35jWSUPei45V3aicaoGig+JFrphpxHLmtgOR5qAxdDNp9DvfYPw4TtxCd9ddJgi # CGHasFAeb73x4QDf5zEHpJM692VHeOj4qEir995yfmFrb3epgcunCaw5u+zGy9iC # tHLNHfS4hQEegPsbiSpUObJb2sgNVZl6h3M7COaYLeqN4DMuEin1wC9UJyH3yKxO # 2ii4sanblrKnQqLJzxlBTeCG+SqaoxFmMNO7dDJL32N79ZmKLxvHIa9Zta7cRDyX # UHHXodLFVeNp3lfB0d4wwP3M5k37Db9dT+mdHhk4L7zPWAUu7w2gUDXa7wknHNWz # fjUeCLraNtvTX4/edIhJEqGCAs8wggI4AgEBMIH8oYHUpIHRMIHOMQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSkwJwYDVQQLEyBNaWNyb3NvZnQg # T3BlcmF0aW9ucyBQdWVydG8gUmljbzEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046 # RDlERS1FMzlBLTQzRkUxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNl # cnZpY2WiIwoBATAHBgUrDgMCGgMVABVuUoQMOXpExF7y/+FdbNK2w895oIGDMIGA # pH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT # B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UE # AxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwDQYJKoZIhvcNAQEFBQAC # BQDk/RqGMCIYDzIwMjEwOTI4MDgzNzI2WhgPMjAyMTA5MjkwODM3MjZaMHQwOgYK # KwYBBAGEWQoEATEsMCowCgIFAOT9GoYCAQAwBwIBAAICD8owBwIBAAICESwwCgIF # AOT+bAYCAQAwNgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQAC # AwehIKEKMAgCAQACAwGGoDANBgkqhkiG9w0BAQUFAAOBgQBTV7nvmjM8c4mHRQpt # A5yuD7uepUTq1oJvuRaj9eO+YYp1bKJcCL73R6NhypcKANGsqhTQgTc7A+P0Wo30 # L1vH/Zj0bA+EbnUengFBUMtjVJjZBrcK85ld4jwpuFI+NtisA49yHdTcEqaW0mKT # 2udOJw/i4DaGp+JA3QoqJkrZYjGCAw0wggMJAgEBMIGTMHwxCzAJBgNVBAYTAlVT # MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1l # LVN0YW1wIFBDQSAyMDEwAhMzAAABYfWiM16gKiRpAAAAAAFhMA0GCWCGSAFlAwQC # AQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkE # MSIEIPzIczTlg5+bFKRcv2i3e580Y00EHdzk9zNnX5s6FTXnMIH6BgsqhkiG9w0B # CRACLzGB6jCB5zCB5DCBvQQgYc+Lp+ppEi3f8wPtDeWCwxqeL1v1QbTVv5aZobQJ # OG8wgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ # MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u # MSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAWH1 # ojNeoCokaQAAAAABYTAiBCAGTrJzSZnz6svrmwVPrr4lKRBhBAw2kD5ALIfCylqK # 1DANBgkqhkiG9w0BAQsFAASCAQBHjT9B4pFC9infg42fVTz9QQWuQaBafplfaWFs # rQlMwR/ChVDjqF01FW8YRQdhcFKl1Y4vgkchHf0KooNXOvQsHmf6WPs3XnTU9UWj # cBQ0Tgriyh4kwQg6RZhUW8qgbgsAH+m6SUk7aR5zN2rAApNgHUifgkSMfblamRNp # OucKZtX7Xp+NLBnLUhmtrX1NV2cuUs21Tej680i16n9cY/jMbvLvr2AKQF8ps0c2 # cB/Pg1iL7rRARlfQLwf1HEmXRrcbubUS/K5vMfZGvQ+59BcZP/FpDFkqhY+3SVD/ # KPfT/JHiKWiOvnAnbqYNruiwpnMUL0FWvMWTNWCzZC3sDMFb # SIG # End signature block |