Utilities/IGValidationUtility.ps1

using module "..\CAMP.psm1"
$ExchangePresent = "Exchange"
$SharePointPresent = "SharePoint"
$OneDrivePresent = "OneDrive"


Function Get-RetentionPolicyValidation {
    param (
        $LogFile,
        $Mode
    )
    $ConfigObjectList = @()
    try {

            $ConfigObjectList=@()
            $LabelPolicy =$false
            $PolicyDisabled = $false
            $AnyPolicyEnabled = $false
            $RetentionComplianceRules = $Config["GetRetentionComplianceRule"]
            $RetentionCompliancePolicies = $Config["GetRetentionCompliancePolicy"]
            $GetComplianceTag = $Config["GetComplianceTag"]
            
            $PartialWorkloadsStatus = @{}
            $PartialWorkloadsStatus[$ExchangePresent] = $false
            $PartialWorkloadsStatus[$SharePointPresent] = $false
            $PartialWorkloadsStatus[$OneDrivePresent] = $false
           
            foreach ( $RetentionCompliancePolicy in $RetentionCompliancePolicies) {
                    
                    $PolicyName = $($RetentionCompliancePolicy.Name)
                    $ConfigObject = [CAMPCheckConfig]::new()
                    $ConfigObject.Object = "$PolicyName"
                    $PolicyConfigData = $null

                    if($Mode -eq "Publish")
                    {
                    $RetentionCompliancePolicyRules = $RetentionComplianceRules | Where-Object {($_.Policy -ieq $($RetentionCompliancePolicy.ExchangeObjectId)) -and ($_.Disabled -eq $false) -and($_.PublishComplianceTag -ne "")}
                    foreach( $RetentionCompliancePolicyRule in $RetentionCompliancePolicyRules )
                    {   $PublishComplianceTag = $RetentionCompliancePolicyRule.PublishComplianceTag   
                        $PublishComplianceTag = $($PublishComplianceTag.Split(","))[1] 
                      
                        $GetLabel= $GetComplianceTag | Where-Object{ ($_.Name -eq $PublishComplianceTag) }
                        if( -not (($GetLabel.HasRetentionAction -eq $true) -and ($GetLabel.RetentionDuration -eq "Unlimited")))
                        {if($null -ne $GetLabel)
                        {
                            $LabelPolicy =$true
                            if ($null -eq $PolicyConfigData ) {
                                $PolicyConfigData += "<B>Labels : </B>$($GetLabel.Name)"
                                }
                                else {
                                $PolicyConfigData += ", $($GetLabel.Name)"
                                }
                        }  }  
                    }
                }
                elseif($Mode -eq "Auto")
                {
                    $RetentionCompliancePolicyRules = $RetentionComplianceRules | Where-Object {($_.Policy -ieq $($RetentionCompliancePolicy.ExchangeObjectId)) -and ($_.Disabled -eq $false) -and($_.ApplyComplianceTag -ne "")}
                    foreach( $RetentionCompliancePolicyRule in $RetentionCompliancePolicyRules )
                    {
                        $ApplyComplianceTag = $RetentionCompliancePolicyRule.ApplyComplianceTag   
                         
                      
                        $GetLabel= $GetComplianceTag | Where-Object{ ($_.ExchangeObjectId -eq $ApplyComplianceTag)}
                        if( -not (($GetLabel.HasRetentionAction -eq $true) -and ($GetLabel.RetentionDuration -eq "Unlimited")))
                        {if($null -ne $GetLabel)
                        {

                            $LabelPolicy =$true
                            if ($null -eq $PolicyConfigData ) {
                                $PolicyConfigData += "<B>Labels : </B>$($GetLabel.Name)"
                                }
                                else {
                                $PolicyConfigData += ", $($GetLabel.Name)"
                                }
                        } }   
                    }  
                }
                    $ExchangeLocation = $RetentionCompliancePolicy.ExchangeLocation
                    $SharePointLocation = $RetentionCompliancePolicy.SharePointLocation
                    $OneDriveLocation = $RetentionCompliancePolicy.OneDriveLocation
                    $ModernGroupLocation = $RetentionCompliancePolicy.ModernGroupLocation
                    $PublicFolderLocation = $RetentionCompliancePolicy.PublicFolderLocation
                    $SkypeLocation = $RetentionCompliancePolicy.SkypeLocation
    
                    $WorkloadsStatus= ""
                    if(($RetentionCompliancePolicy.Enabled -eq $true) -and ($null -ne $PolicyConfigData )) 
                    {
                    if(($ExchangeLocation -ne "") )
                    {
                        $WorkloadsStatus+= "Exchange, "
                        $PartialWorkloadsStatus[$ExchangePresent] = $true
                    }
                    if(($SharePointLocation -ne "") )
                    {
                        $WorkloadsStatus += "SharePoint, "
                        $PartialWorkloadsStatus[$SharePointPresent] = $true
                    }
                    if(($OneDriveLocation -ne "") )
                    {
                        $WorkloadsStatus+= "OneDrive, "
                        $PartialWorkloadsStatus[$OneDrivePresent] = $true
                    }
                    if(($ModernGroupLocation -ne "") )
                    {
                        $WorkloadsStatus += "ModernGroup, "
                    }
                    if(($PublicFolderLocation -ne "") )
                    {
                        $WorkloadsStatus += "ExchangePublicFolders, "
                    }
                    if(($SkypeLocation -ne "") )
                    {
                        $WorkloadsStatus += "Skype, "
                    }
                    
                }                
                    $workloadpresent ="<B>Workloads: </B>$WorkloadsStatus"
                    $workloadpresent=$workloadpresent.TrimEnd(", ")
                           
                if (($WorkloadsStatus -ne "")  -and  ($null -ne $PolicyConfigData ) -and ($RetentionCompliancePolicy.Enabled -eq $true)  ) {
                    if ( ($LabelPolicy -eq $true) ) { 
                            $AnyPolicyEnabled =$true
                            $Workload= $workloadpresent
                            $ConfigObject.ConfigData = "$Workload"                                          
                            $ConfigObject.ConfigItem = "$PolicyConfigData"   
                            $ConfigObject.SetResult([CAMPConfigLevel]::Ok, "Pass") 
                            $ConfigObjectList += $ConfigObject                              
                        }
                    }
                    elseif(($null -ne $PolicyConfigData) -and ($RetentionCompliancePolicy.Enabled -eq $true) ) {
                        $AnyPolicyEnabled =$true
                        $ConfigObject.ConfigData = "No workload covered"                                                      
                        $ConfigObject.ConfigItem = "$PolicyConfigData"   
                        $ConfigObject.SetResult([CAMPConfigLevel]::Informational, "Pass")
                        $ConfigObjectList += $ConfigObject   
                }
                elseif(($null -ne $PolicyConfigData) -and ($RetentionCompliancePolicy.Enabled -ne $true) ) {
                    $PolicyDisabled =$true
                    $ConfigObject.ConfigData = "Policy is not enabled"                                                      
                    $ConfigObject.ConfigItem = "$PolicyConfigData"   
                    $ConfigObject.SetResult([CAMPConfigLevel]::Informational, "Pass")
                    $ConfigObjectList += $ConfigObject   
            } 
            }
            
            if (($LabelPolicy -eq $false)-and ($PolicyDisabled -eq $false)) {
                $ConfigObject = [CAMPCheckConfig]::new()
                $ConfigObject.Object = "<B>No active policy or label defined<B>"
                $ConfigObject.ConfigItem = ""
                $ConfigObject.ConfigData = "<B>Affected workloads: </B>Exchange, SharePoint, OneDrive"
                $ConfigObject.SetResult([CAMPConfigLevel]::Ok, "Fail")            
                $ConfigObjectList += $ConfigObject 
           
            }
        
            $PartialLocation=""
            foreach ($Workload in ($PartialWorkloadsStatus.Keys | Sort-Object -CaseSensitive) ) {
          
                if ($PartialWorkloadsStatus[$Workload] -eq $false) {
                    if ( $PartialLocation -eq "") {
                        $PartialLocation += "$($Workload)"
                    }else {
                        $PartialLocation += ", $($Workload)"
                    }
                }
            }
           
            if(($PartialLocation -ne "")  -and (($PolicyDisabled -eq $true) -or ($AnyPolicyEnabled -eq $true)))
            {
                $ConfigObject = [CAMPCheckConfig]::new()
                $ConfigObject.Object = "<B>No policy defined for 1 or more workloads<B>"
                $ConfigObject.ConfigItem = ""
                $ConfigObject.ConfigData = "<B>Affected workloads: </B>$PartialLocation"
                $ConfigObject.SetResult([CAMPConfigLevel]::Ok, "Fail")            
                $ConfigObjectList += $ConfigObject
            }
        }
        catch {
            Write-Host "Error:$(Get-Date) There was an issue while running CAMP. Please try running the tool again after some time." -ForegroundColor:Red
            $ErrorMessage = $_.ToString()
            $StackTraceInfo = $_.ScriptStackTrace
            Write-Log -IsError -ErrorMessage $ErrorMessage -StackTraceInfo $StackTraceInfo -LogFile $LogFile -ErrorAction:SilentlyContinue
        }
        return $ConfigObjectList
    }

# SIG # Begin signature block
# MIIlugYJKoZIhvcNAQcCoIIlqzCCJacCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDPbws/QSh/4M/p
# pjQZCcXOngZDugLkROAm7JqM3E2qYqCCC5YwggT7MIID46ADAgECAhMzAAAE4qOH
# mdFtQCqWAAEAAATiMA0GCSqGSIb3DQEBCwUAMHkxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBUZXN0aW5nIFBD
# QSAyMDEwMB4XDTIxMDkwMjE5MjYyN1oXDTIyMDkwMTE5MjYyN1owfDELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdQ29kZSBTaWdu
# IFRlc3QgKERPIE5PVCBUUlVTVCkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
# AoIBAQC08O5FqM6i91zE1YIK4epCwArU+0xTEScHJ0Vfy32sK+Xf3dM/vHm1iLfc
# 7hhDNwVxfHvaHgjNYC2Qr2cff4F40aShGrc6xyIdmcSiygICYGQrF7FWKQ4thEdX
# HuAMiuVYZQ9Jo+vxOXRJTSa3zsFFrbkCOgun7Vu9UeFxOQT1ByNomsxky0gCRu+P
# YdaqnbOyxNsnCDaGUUHp+D1EpBv4Cdrgy9o359Z4nFUyUm4MVMjpG6jC2n8dPonw
# hAcbjIvyJzA1v88jVCMfDrHt0AkIHN69J4wahtOrJeERgXjklilV0hMRwkVkfpnJ
# 18aw7NqWsDi4ekmBd2EL6d+HljzNAgMBAAGjggF3MIIBczATBgNVHSUEDDAKBggr
# BgEFBQcDAzAdBgNVHQ4EFgQUCekP9tRzR3NLSbCNG+oPPWd/nuYwRQYDVR0RBD4w
# PKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEWMBQGA1UEBRMN
# MjMwMDcyKzQ2NzYwNTAfBgNVHSMEGDAWgBS/ZaKrb3WjTkWWVwXPOYf0wBUcHDBc
# BgNVHR8EVTBTMFGgT6BNhktodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L2NybC9NaWNyb3NvZnQlMjBUZXN0aW5nJTIwUENBJTIwMjAxMCgxKS5jcmwwaQYI
# KwYBBQUHAQEEXTBbMFkGCCsGAQUFBzAChk1odHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRlc3RpbmclMjBQQ0ElMjAyMDEw
# KDEpLmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCTxe9mJYSi
# GUIIw4imC+gePdQLAeeMTTa8Uwa406/66Su7fVZTGNFMpLwofA1WfxvAX4+5+U+J
# aFJod4KyAdUngWtPlyPmkR0kXQ6mTxvqMFEih/s0mRyW6dHMHrCezmY//89C5zau
# E3LBcI4gqAQ2ZabPxj2+j6+Er8StKv07PigCuM4M16DIQUAY6kNgnate4WoiiQSu
# mXhMiwtUh6jgSnTpOqpNfXk+YJxNoqHH8qqyW7FcQ88jyoxM4LYdAQVN3eYD7eJn
# xfW2nWIbDRaZpBkv9N1t8yObWcyC/YrRLuq3QLqpll20Y1eFsm+gypEoiERqpPUT
# 3p7K5897ABKoMIIGkzCCBHugAwIBAgITMwAAAC01ekaIyQdx2AAAAAAALTANBgkq
# hkiG9w0BAQsFADCBkDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjE6MDgGA1UEAxMxTWljcm9zb2Z0IFRlc3RpbmcgUm9vdCBDZXJ0aWZpY2F0ZSBB
# dXRob3JpdHkgMjAxMDAeFw0yMDEyMTAyMDQzMjBaFw0zNTA2MTcyMTA0MTFaMHkx
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1p
# Y3Jvc29mdCBUZXN0aW5nIFBDQSAyMDEwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
# MIIBCgKCAQEAvzxggau+7P/XF2PypkLRE2KcsBfOukYaeyIuVXOaVLnG1NHKmP53
# Rw2OnfBezPhU7/LPKtRi8ak0CgTXxQWG8hD1TdOWCGaF2wJ9GNzieiOnmildrnkY
# zwxj8Br/gampQz+pC7lR8bNIOvxELl8RxVY6/8oOzYgIwf3H1fU+7+pOG3KLI71F
# N54fcMGnybggc+3zbD2LIQXPdxL+odwH6Q1beAlsMlUQR9A3yMf3+nP+RjTkVhao
# N2RT1jX7w4C2jraGkaEQ1sFK9uN61BEKst4unhCX4IGuEl2IAV3MpMQoUpxg8Arm
# iK9L6VeK7KMPNx4p9l0h09faXQ7JTtuNbQIDAQABo4IB+jCCAfYwDgYDVR0PAQH/
# BAQDAgGGMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFOqfXzO2
# 0F+erestpsECu0A4y+e1MB0GA1UdDgQWBBS/ZaKrb3WjTkWWVwXPOYf0wBUcHDBU
# BgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNy
# b3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBkGCSsGAQQBgjcU
# AgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUowEE
# fjCIM+u5MZzK64V2Z/xltNEwWQYDVR0fBFIwUDBOoEygSoZIaHR0cDovL2NybC5t
# aWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGVzUm9vQ2VyQXV0XzIw
# MTAtMDYtMTcuY3JsMIGNBggrBgEFBQcBAQSBgDB+ME0GCCsGAQUFBzAChkFodHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Rlc1Jvb0NlckF1dF8y
# MDEwLTA2LTE3LmNydDAtBggrBgEFBQcwAYYhaHR0cDovL29uZW9jc3AubWljcm9z
# b2Z0LmNvbS9vY3NwMA0GCSqGSIb3DQEBCwUAA4ICAQAntNCFsp7MD6QqU3PVbdrX
# MQDI9v9jyPYBEbUYktrctPmvJuj8Snm9wWewiAN5Zc81NQVYjuKDBpb1un4SWVCb
# 4PDVPZ0J87tGzYe9dOJ30EYGeiIaaStkLLmLOYAM6oInIqIwVyIk2SE/q2lGt8Ov
# wcZevNmPkVYjk6nyJi5EdvS6ciPRmW9bRWRT4pWU8bZIQL938LE4lHOQAixrAQiW
# es5Szp2U85E0nLdaDr5w/I28J/Z1+4zW1Nao1prVCOqrosnoNUfVf1kvswfW3FY2
# l1PiAYp8sGyO57GaztXdBoEOBcDLedfcPra9+NLdEF36NkE0g+9dbokFY7KxhUJ8
# WpMiCmN4yj9LKFLvQbctGMJJY9EwHFifm2pgaiaafKF1Gyz+NruJzEEgpysMo/f9
# AVBQ/qCdPQQGEWp3QDIaef4ts9QTx+RmDKCBDMTFLgFmmhbtUY0JWjLkKn7soz/L
# IcDUle/p5TiFD4VhfZnAcvYQHXfuslnyp+yuhWzASnAQNnOIO6fc1JFIwkDkcM+k
# /TspfAajzHooSAwXkrOWrjRDV6wI0YzMVHrEyQ0hZ5NnIXbL3lrTkOPjf3NBu1na
# SNEaySduStDbFVjV3TXoENEnZiugJKYSwmhzoYHM1ngipN5rNdqJiK5ukp6E8LDz
# i3l5/7XctJQY3+ZgHDJosjGCGXowghl2AgEBMIGQMHkxCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1pY3Jvc29mdCBUZXN0aW5n
# IFBDQSAyMDEwAhMzAAAE4qOHmdFtQCqWAAEAAATiMA0GCWCGSAFlAwQCAQUAoIGu
# MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgor
# BgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCCLOy5N8yR4saWWRyrphtH4W14cOimp
# dy3Z7NObyVTjmDBCBgorBgEEAYI3AgEMMTQwMqAUgBIATQBpAGMAcgBvAHMAbwBm
# AHShGoAYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3DQEBAQUABIIB
# ADeQgddKiXYKA9OruKYP+s2eudRBUUMnI7QEBUdPB593aYycL5/ZOfe4be9lpe53
# t1ePp/LreOvnWRfTEbm3DlaxicfQ1FwG0Wp3lwGq6Vwm06lgZD9gAg/A+Yv9+50Q
# 1jD5HtSeTp+pT9Nq4rzk63GEG1ouwppDXGi3DAFOa02AE0LGMVAwXywpcrSskF9G
# 9OOzsCgL8BhZBbyjtB+7N9QV7Wr4t5z40XYoINt/cvCq2ccI0gxmj3Q5hxd404Ie
# 10H+45GoA8TK4d/xUqMdGwe+I36UlpxJN7cNnf26XH4vHtPdtEhwLbtxfKoEyz5B
# y7H1M46zi+tvMpXEtO60oX+hghcJMIIXBQYKKwYBBAGCNwMDATGCFvUwghbxBgkq
# hkiG9w0BBwKgghbiMIIW3gIBAzEPMA0GCWCGSAFlAwQCAQUAMIIBVQYLKoZIhvcN
# AQkQAQSgggFEBIIBQDCCATwCAQEGCisGAQQBhFkKAwEwMTANBglghkgBZQMEAgEF
# AAQgr0AM0NLvWE3ekeNS+NbmWa/sqsGTABZKNpTHBLI7n/4CBmKEr/+B4hgTMjAy
# MjA2MTAxMDA1MDcuMjE0WjAEgAIB9KCB1KSB0TCBzjELMAkGA1UEBhMCVVMxEzAR
# BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjEpMCcGA1UECxMgTWljcm9zb2Z0IE9wZXJhdGlv
# bnMgUHVlcnRvIFJpY28xJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOjg5N0EtRTM1
# Ni0xNzAxMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIR
# XDCCBxAwggT4oAMCAQICEzMAAAGrCQnvq2PU6KkAAQAAAaswDQYJKoZIhvcNAQEL
# BQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
# B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UE
# AxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjIwMzAyMTg1MTI4
# WhcNMjMwNTExMTg1MTI4WjCBzjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjEpMCcGA1UECxMgTWljcm9zb2Z0IE9wZXJhdGlvbnMgUHVlcnRvIFJp
# Y28xJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOjg5N0EtRTM1Ni0xNzAxMSUwIwYD
# VQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0B
# AQEFAAOCAg8AMIICCgKCAgEAyZ1LWjl16EBJSyxwurLHbCb9aKs1R+qQYHKYMi1j
# MSegq2SGt3vA2wmziD4G4ze4FfzVac7bvSWSsLR7WaYOpC3jbROZvyXCyNAozqYR
# o1Ah9cOuietU3drDWXH1sB/tVkQDeQcWqXpgA7eSNDo9+0DiJUdfclW/3ye2ORu2
# rMp4kxo1Z3x0FoAPdEKWIyhqNMMZvJg0pO/EGFYgvInxZh0n80EOmo/NCX6nGbpl
# lVJ4FAAg65tmNTS9+kQLEcLm8jUSuupqkb7SgGGE436CWVWSU8BZm/aK/SaCMJOP
# tg0pfvIvbHZO+u8dWrkY81rl81unLf23ly+KJiox/VFlVlxx2v7a8CmTmJvlrg7x
# KICA9JTBgag7BtkbWiceKPQBM8uSApR+Bo/MV93kllJtGXZeDfjv8uNZAtH4qMDI
# AIVvTpupbO8e1AlM0PxjSPljZIGdIKpXbM0dJW2zj5pR+RSGwpL4YBdLePldSBgD
# tIw2iDvo2eyzmXTWcRfuwcN1jKRiHO5AoWtPvRdVNl5fbm1IF/LdVpzNh3UlIj/3
# A4apsVTnY3KuWwDWqKbE6Gy52zs/Gj6M7dGNX+QL4AQ6hVpcN2aKexzc+2UEJWH+
# yBiej0BTKZuVJGZ57WDCWeVknS6Icoj2rYcWBlYzXTI8bmBW3SmteckWLVbGaaD4
# Ef8CAwEAAaOCATYwggEyMB0GA1UdDgQWBBQUW87yjV41xIIhBky+oZ900v6mqjAf
# BgNVHSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQ
# hk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQl
# MjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBe
# MFwGCCsGAQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2Nl
# cnRzL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAM
# BgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEBCwUA
# A4ICAQDKS5SBNzUoyzMyCwduGCOAQa/90IcV/RvL30LjlJHvvT+50I016qVPrXQS
# HPXfEYVTodyL5MtQ9SeG9SdK7PvGSJZGu7lGNlmZKicRW/yelrfPVC95R+eC3KLQ
# l3qqVLKSgRUnq0O5HUrD3FT3K+2FlaFCz/KbI7CH6bG3QL3Bt4sn3Z6va9z2XLXa
# kXFsI0Mn6ZDu/nbSEC+t5apnTYY4mHDRHhzWI/f2I0HMc6jP4Ow7SxiPCFrP0eu9
# gwTM4PUwl0s9Z9QWxn/+JN3ePMTKSTTZaOdk3Mh7YQ1+ZD8puUZcd5J7wliqKZMX
# GXmR4x8tQQuMCHSaFDW8sIlnbQHALg7nsSDvI79i4Gej7hGtXQIPaCngE7XQoVbZ
# JD8yG9FYrsduBLoHO3vSuQh5JS2julGQcyqueG5shNxd12TLoa1mybAzeG+pe5K0
# x5TVbk03ccDzKmM8t39uiZ8bH3oe7Dw6t+1xC+Tu2F027gmEDIpRdQ/t0owIl+s5
# 2mWDSPW0TRqIT6kNNJBWY/MZ7MIvjayXI8lVem7jHETSGkAKva5rQse/8sHpFXkL
# gI7gyz+l9qX/8Xc76Ell7mLF6/Mo2RddvE85rVH5Iitb+sdkzpEgMtMnFMYUMzWF
# APJp8a71L9ru6aS+KWAEc3Fl+TQhgTtFFYlwbuiJj4UZ3HVyzTCCB3EwggVZoAMC
# AQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNV
# BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w
# HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29m
# dCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTIxMDkzMDE4MjIy
# NVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAw
# ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM57RyIQt5osvXJHm9
# DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9cT8dm95VTcVrifkpa/rg2
# Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzBRMhxXFExN6AKOG6N
# 7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBbfowQHJ1S/rboYiXc
# ag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCOMcg1KL3jtIckw+DJ
# j361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYwXE8s4mKyzbnijYjk
# lqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW/aUgfX782Z5F37Zy
# L9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/wEPK3Rxjtp+iZfD9M
# 269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFphAXPKZ6Je1yh2AuIzGHLX
# pyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2BjUYhEfb3BvR/bLU
# HMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXbGjfHCBUYP3irRbb1Hode
# 2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYBBAGCNxUBBAUCAwEA
# ATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnPEP8vBO4wHQYDVR0OBBYE
# FJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYMKwYBBAGCN0yDfQEB
# MEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMv
# RG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkrBgEE
# AYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
# /zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEug
# SaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9N
# aWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsG
# AQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jv
# b0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAnVV9/Cqt
# 4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518JxNj/aZGx80HU5bbsP
# MeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgADsAW+iehp4LoJ7nvfam++
# Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2pFaq95W2KFUn0CS9
# QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefwC2qBwoEZQhlSdYo2
# wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7T7uG+jIa2Zb0j/aR
# AfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFORy3BFARxv2T5JL5z
# bcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgkujhLmm77IVRrakURR6nx
# t67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3LwUFJfn6Tvsv4O+S3
# Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzbaukz5m/8K6TT4JDVnK+AN
# uOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE0ZDxyKs6ijoIYn/Z
# cGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggLPMIICOAIBATCB/KGB1KSB0TCB
# zjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
# ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEpMCcGA1UECxMg
# TWljcm9zb2Z0IE9wZXJhdGlvbnMgUHVlcnRvIFJpY28xJjAkBgNVBAsTHVRoYWxl
# cyBUU1MgRVNOOjg5N0EtRTM1Ni0xNzAxMSUwIwYDVQQDExxNaWNyb3NvZnQgVGlt
# ZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQBbqHr/bhYKjtZnPoIRUB4v
# O1yYPqCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMA0GCSqG
# SIb3DQEBBQUAAgUA5k1/8jAiGA8yMDIyMDYxMDEyMzE0NloYDzIwMjIwNjExMTIz
# MTQ2WjB0MDoGCisGAQQBhFkKBAExLDAqMAoCBQDmTX/yAgEAMAcCAQACAg0kMAcC
# AQACAhFiMAoCBQDmTtFyAgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisGAQQBhFkK
# AwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcNAQEFBQADgYEAlFOF
# RvLNv9hUwqInQhkQlmSWHvAZwbKCdkzbcVsTVZp0btCY/17V3QgRAh0TBS2Os2vR
# pmT95C8cw+g+A4c7dSX/+GVnDJQg+osVzsp/PqCNOvhmx1+teSJlUfWWTYAXZV1J
# 9vfnOLMoAB+U/pGPWDKfmRSmxaQQY8WxUiZtgykxggQNMIIECQIBATCBkzB8MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNy
# b3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAasJCe+rY9ToqQABAAABqzAN
# BglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8G
# CSqGSIb3DQEJBDEiBCBQOp4ReiF9ZORX/8XZebfleVsVNFaJynCfler0nI/pDzCB
# +gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIA4cr/qwhWARVJUPcCu+To7JAq9H
# EUcrKtpTNs3X8ApXMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh
# c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
# b3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIw
# MTACEzMAAAGrCQnvq2PU6KkAAQAAAaswIgQgmddJkbDCeeBoA9qYthoU6uz/Jg58
# HvHDtnllEfnXG6cwDQYJKoZIhvcNAQELBQAEggIAa/SseyrUHWSsJW/iaWXMopPk
# amRPuquflLvLU0jsO1HXyvoY/2gvwua9pwAkLE/2YLDJHTeEx1jNX0NJpLVyGhNG
# 77MTqR4kOk8KLpGQjK4F3zgBRz2s/AqwB5YajCg/Lj0eqzNDRYhUbkmZsnsMA78x
# CJUJtQOMc2W7hDUVe99rgnHT9Cc9KjN4o1HNa1bvGdJsSkCQ4TcnhpnqUYa8drzJ
# 6Kf6cifCB5+g6ZURJr/pQcBYQtvy2G90Tiw5qg/ZvsfLw25q0Me28wZuUkW7cz1u
# qa0vqSZs0MQi6hoCTtJkhUk40uRw3xgJ/O7PLADBnI/KGQsNug/UxLSPoMwIypC6
# wB8D/5OqkfgnuVhBSyhf2/ErxRzFPn09UrGeW5c7VFlDElqBq2mB3oJPs4QrT8kK
# aZB4CRJa0RkuIZGkJYQGOjmwoX3mvwS//eHmIZ1z6p86DgdrJQuoYoYko01K5fTB
# bLN7CiixDHbJW9EtOetSfSu6wsFjfHOPqpdT4Z4dw1xTGfL8E5Q3B35vqRPQCZGt
# T/Rx7W6YFmAfsJR4j2bOMNJdhBTxSUonpTjRMHTBJJYTrQpGh8XPNMb+sM8RI99S
# ODofgIO4torc/WF5Dt7bnsu95rNjauXGdZW+pkvR1hwYacXSpWCKxofwxkfZmWH0
# 2IYk5KXi6akMbhy0bGQ=
# SIG # End signature block