modules/AzStack.Insights/rules/locale/AzStackHci.DiagnosticSettings.OsConfig.HealthCheck.psd1

@{
    # Default message used when a non-healthy section did not carry its own upstream Message.
    DefaultErrorMessage = "OS configuration health check '{0}' reported a non-healthy result."
    Evaluated           = "Health section '{0}' result '{1}' mapped to status '{2}'."
    SecurityContractInvalid = "The security health section has an incompatible or incomplete data contract. Its health could not be evaluated."
    SecurityResultMessage = "{0}: producer result {1}. Coverage describes configured comparisons, not runtime protection. Detailed settings, provenance and collection errors remain in the linked OS configuration report."
    SecurityCapabilityUnavailable = "This OS configuration schema does not provide the security assessment capability. No healthy assessment is inferred."
    StoredLocalAccountLockoutScope = "Stored configuration only; local accounts only; domain accounts out of scope"

    # Stable identity used for any section name not present in the table below (future / unknown sections).
    Fallback = @{
        Id          = "89082729-14bc-4847-b4e1-c176b2be66cf"
        Name        = "OS Configuration Health Check"
        Description = "An OS configuration health section reported by Get-AzStackHciOsConfigSettings that is not yet individually modelled by this consumer."
        ErrorCode   = "AzLocal_OsConfig_HealthCheckFailed"
        Remediation = "Review the named health section in the AzStackHci.DiagnosticSettings report and follow the guidance in the upstream message to remediate the affected node(s), then re-run the check."
    }

    # Stable SectionName (top-level summary property) -> rule identity + remediation. GUIDs are fixed so
    # cache keys / report anchors are deterministic across runs. Severity/Result are supplied by the upstream
    # module per section and are not re-declared here.
    Sections = @{
        SecurityBaselineHealth = @{
            Id          = "ce01f296-62c4-47f7-99fd-ea2f77ef9caa"
            Name        = "Security Baseline"
            Description = "Reports configured settings compared with the applicable published security baseline. Domain GPO detection is independent; a deviation does not identify its policy writer."
            PublicDocs  = @(
                "https://learn.microsoft.com/en-us/azure/azure-local/manage/manage-secure-baseline#view-and-download-security-settings"
            )
            ErrorCode   = "AzLocal_OsConfig_SecurityBaselineDelta"
            Remediation = "Review the Security Baseline tab in the linked OS configuration report. Compare confirmed deviations with coverage, provenance and collection errors before deciding whether an approved configuration change is needed. This assessment does not certify runtime protection."
        }
        DefenderHealth = @{
            Id          = "58e08d72-edbf-49bb-bc48-ffb3ee71d865"
            Name        = "Defender / ASR"
            Description = "Reports configured ASR source comparisons against catalog expectations. Matching available sources can coexist with incomplete coverage; neither GPO assignments nor reported configuration prove enforcement."
            ErrorCode   = "AzLocal_OsConfig_DefenderAsrDelta"
            Remediation = "Review the Defender / ASR tab in the linked OS configuration report. Compare catalog expectations with each configured source, coverage and supporting evidence. OSConfig defaults are context, not the comparison target. Do not infer a policy writer or runtime enforcement from these findings."
        }
        ClusterDriftControl = @{
            Id          = "4dca4ca1-e2ee-4cd3-b631-0ca602dc85d4"
            Name        = "Cluster Drift Control"
            Description = "Reports the collected Drift Control state across the cluster node(s). Unavailable evidence does not establish a healthy state."
            ErrorCode   = "AzLocal_OsConfig_DriftControlUnhealthy"
            Remediation = "Review the Drift Control findings and collection errors for the affected node(s) in the OS configuration report. Confirm which nodes supplied evidence, investigate the reported agent or configuration condition, then re-run collection."
        }
        ArcAgentHealth = @{
            Id          = "1310a1b7-015a-4e4b-a90d-b54b9abc24e3"
            Name        = "Arc Agent Health"
            Description = "Reports the health of the Azure Connected Machine (Arc) agent across the cluster node(s)."
            ErrorCode   = "AzLocal_OsConfig_ArcAgentUnhealthy"
            Remediation = "Investigate the Azure Connected Machine agent on the affected node(s). Confirm the 'himds' service is running and the agent status is 'Connected' (azcmagent show). Restart the agent or re-onboard the node if it is disconnected, then re-run the check."
        }
        NonMicrosoftServices = @{
            Id          = "82b90d20-f68c-4307-bc65-9dc5378e80f2"
            Name        = "Non-Microsoft Services"
            Description = "Reports non-Microsoft Windows services present on the cluster node(s), to provide details of third-party software components."
            ErrorCode   = "AzLocal_OsConfig_NonMicrosoftServicesPresent"
            Remediation = "Review the listed non-Microsoft services to identify the third-party software components (backup, AV, monitoring, etc.) installed on the node(s). Azure Local expects a clean, validated software baseline; confirm each third-party agent is expected and supported for your configuration, then re-run the check."
        }
        StorageHealth = @{
            Id          = "03270b48-b5e1-4bba-ad9c-6e4d984c63d3"
            Name        = "Storage Health"
            Description = "Reports the storage subsystem health (Storage Spaces Direct / physical disks) as summarised by the OS configuration check."
            ErrorCode   = "AzLocal_OsConfig_StorageUnhealthy"
            Remediation = "Investigate the storage subsystem on the affected node(s). Review Get-StorageSubSystem / Get-PhysicalDisk / Get-VirtualDisk health and any active Storage Health faults, replace or retire failed disks, and allow repair jobs to complete, then re-run the check."
        }
        KeyServicesHealth = @{
            Id          = "11880106-defc-4c3a-8790-91158bc93926"
            Name        = "Key Services Health"
            Description = "Reports the state of key Windows services required for Azure Local cluster operation across the node(s)."
            ErrorCode   = "AzLocal_OsConfig_KeyServicesUnhealthy"
            Remediation = "Review the key services flagged as not running / not in their expected start state. Start the affected service(s) and set the correct startup type, investigate why they stopped (event logs), then re-run the check."
        }
        StabilityEvents = @{
            Id          = "b0b5b586-c8b1-4b2c-89d6-39a0027a431f"
            Name        = "Stability Events"
            Description = "Reports recent system stability events (unexpected reboots, bugchecks, critical errors) observed on the cluster node(s)."
            ErrorCode   = "AzLocal_OsConfig_StabilityEventsDetected"
            Remediation = "Investigate the reported stability events (unexpected shutdowns / bugchecks) on the affected node(s). Correlate with the System event log and any memory.dmp, engage the hardware vendor for recurring bugchecks, and confirm firmware/driver currency, then re-run the check."
        }
        GPOHealthCheck = @{
            Id          = "fc98ff50-d4d1-439e-92ae-48250d5f44c9"
            Name        = "Domain Group Policies Applied"
            Description = "Reports whether domain Group Policy Objects (GPOs) are applied across the cluster node(s)."
            PublicDocs  = @(
                "https://learn.microsoft.com/en-us/azure/azure-local/deploy/deployment-prep-active-directory#considerations-for-large-scale-deployments"
            )
            ErrorCode   = "AzLocal_OsConfig_GpoUnhealthy"
            Remediation = "Review the domain Group Policies applied to the affected node(s). Confirm they do not conflict with Azure Local settings or the security baseline, then re-run the check."
        }
        NetworkATCHealth = @{
            Id          = "2ebb24e0-34b2-4ad4-9c07-8fb3dc303ec0"
            Name        = "Network ATC Health"
            Description = "Reports the health of the Network ATC intents (deployment / configuration state) across the cluster node(s)."
            ErrorCode   = "AzLocal_OsConfig_NetworkAtcUnhealthy"
            Remediation = "Investigate the Network ATC intents on the affected node(s). Run Get-NetIntent / Get-NetIntentStatus to confirm every intent reports a 'Success'/'Completed' provisioning and configuration state, remediate any failed or provisioning intents, then re-run the check."
        }
        PowerPlanHealth = @{
            Id          = "a8280b2d-90cf-48a3-a978-b2894297a733"
            Name        = "Power Plan Health"
            Description = "Reports whether each cluster node's active power plan is set to High performance, which Azure Local requires for predictable performance."
            PublicDocs  = @(
                "https://learn.microsoft.com/troubleshoot/windows-server/performance/slow-performance-when-using-power-plan"
            )
            ErrorCode   = "AzLocal_OsConfig_PowerPlanNotHighPerformance"
            Remediation = "Set the active power plan to 'High performance' on the affected node(s): <code>powercfg /setactive 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c</code> (verify with <code>powercfg /getactivescheme</code>). A non-High-performance plan (e.g. Balanced) can throttle CPU and degrade cluster performance. Re-run the check after applying."
        }
        TimeSyncHealth = @{
            Id          = "51d463ee-0c6f-44b8-80ca-6adc414761df"
            Name        = "Time Synchronization Health"
            Description = "Reports whether each cluster node's Windows Time (W32Time) service is synchronised to a real domain/NTP source rather than the local hardware clock."
            ErrorCode   = "AzLocal_OsConfig_TimeSourceNotSynchronized"
            Remediation = "Configure W32Time on the affected node(s) to synchronise from the domain hierarchy / a valid NTP source instead of 'Local CMOS Clock' or 'Free-running System Clock' (w32tm /query /source, w32tm /resync). An unsynchronised clock breaks Kerberos authentication and cluster communication. Re-run the check after correcting the time source."
        }
        PendingRebootHealth = @{
            Id          = "977acbaa-e900-4a26-8f81-fe6ae21e8a9e"
            Name        = "Pending Reboot Health"
            Description = "Reports whether a reboot is pending on each cluster node (Component Based Servicing / Windows Update / pending file rename operations)."
            ErrorCode   = "AzLocal_OsConfig_RebootPending"
            Remediation = "Complete a coordinated reboot of the affected node(s) using the cluster-aware drain/resume workflow (Suspend-ClusterNode -Drain, reboot, Resume-ClusterNode) so pending servicing operations finish. A lingering pending-reboot state can block updates and leave configuration half-applied. Re-run the check after the reboot."
        }
    }
}

# SIG # Begin signature block
# MIInKAYJKoZIhvcNAQcCoIInGTCCJxUCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB/3AJlLi8WXvSf
# ZrSFXEJ1lzioMbdCiL+uhaNy/j37pKCCDLowggX1MIID3aADAgECAhMzAAACHU0Z
# yE7XD1dIAAAAAAIdMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBD
# b2RlIFNpZ25pbmcgUENBIDIwMjQwHhcNMjYwNDE2MTg1OTQzWhcNMjcwNDE1MTg1
# OTQzWjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYD
# VQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IB
# DwAwggEKAoIBAQDQvewXxx9gZZFC6Ys1WBay8BJ8kGA4JQnH5CMafqOASlTpK9H8
# o5ZXTXt0caVQTNMUPt445wXYD+dFtaKWTwDn1I52oUSrC9vJin1Gsqt+zyKJL5Dg
# 3eQXbQNR61DmMy20GLTIO3SFed9Rfi/ophgCLGFLDR3r0KvHjwMb/jYWS0celV/4
# Lz27LfAekm8v9E5IXaeiXbAUYZKK090n4CVl3JBtbN+9DtI9SNu/yjvozW52/u7R
# X/Ttpa/KDlpuokZ+Zcbvmtd9ur9gFLvZzh41o9MsE/clQtdaFWGvuo6Jua/ntpgk
# ey3E5/vBFe+MJPG6phdnuo6r57ZudCudiI1bAgMBAAGjggGbMIIBlzAOBgNVHQ8B
# Af8EBAMCB4AwHwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYBBQUHAwMwHQYDVR0O
# BBYEFH6QuMwqcPG0hQlQ6c5jCtTTLrVeMEUGA1UdEQQ+MDykOjA4MR4wHAYDVQQL
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xFjAUBgNVBAUTDTIzMDAxMis1MDc1NTkw
# HwYDVR0jBBgwFoAUf1k/VCHarU/vBeXmo9ctBpQSCDEwYAYDVR0fBFkwVzBVoFOg
# UYZPaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0
# JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDI0LmNybDBtBggrBgEFBQcBAQRh
# MF8wXQYIKwYBBQUHMAKGUWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMv
# Y2VydHMvTWljcm9zb2Z0JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDI0LmNy
# dDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4ICAQBKTbYOjzwTG/DXGaz9
# s6+fQeaTtDcFmMY+5UyVFCyj7Pv+5i37qfX8lSL/tBIfYQfWsMuBQlfZurJD6r4H
# VJ2CeH+1fgiq8dcHdVKoZ3Sa2qXoX3cq9iS8cVb06B7+5/XJ7I0OxHH9fDsvJ3T3
# w5V/ZtAIFmLrl+P0CtG+92uzRsn0nTbdFjOkLMLWPLAU3THohKRlSEMgFJpPkm5n
# 5UAZ35xX6FWCrDLsSKb555bTifwa8mJBwdlof0bmfYidH+dxZ1FdDxvLnNl9zeKs
# A4kejaaIqqIPguhwAti5Ql7BlTNoJNwxCvBmqW2MQLnCkYN/VVUsR3V2x/rcTNzo
# Bf/Z/SpROvdaA2ZOOd1uioXJt3tdLQ7vHpqpib0KfWr/FWXW10q38VxfCnRQBqzb
# SuztR7nEMuzX7Ck+B/XaPDXd1qh72+QYyB0Z2VzWmO9zsnb9Uq/dwu8LGeQqnyu6
# 7SDGACvnXii2fb9+US492VTnXSnFKyqwgzUyFMtZK1/sHYTv6bG4TtQUygQxTN+Z
# V+aJIlKO2MqZ7bKrAnOzS9m6NgoTdWOq11bTOZwKlIEV/EhV9SWkDmdpR/hPPT2v
# 6TEj4F8PT/zHjRezIU5c/DGlt/VhY/pK0XkJtEyMmmS1BMtjU/rqBZVMIm3dnxQs
# /TBByr+Cf8Z1r7aifQVQ+WSqzjCCBr0wggSloAMCAQICEzMAAAA5O7Y3Gb8GHWcA
# AAAAADkwDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRl
# IEF1dGhvcml0eSAyMDExMB4XDTI0MDgwODIwNTQxOFoXDTM2MDMyMjIyMTMwNFow
# VzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEo
# MCYGA1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAyNDCCAiIwDQYJ
# KoZIhvcNAQEBBQADggIPADCCAgoCggIBANgBnB7jOMeqlRYHNa265v4IY9fH8TKh
# emHfPINe1gpLaV3dhg324WwH06LcHbpnsBukCDNitryo0dtS/EW6I/yEL/bLSY8h
# KpbfQuWusBPr9qazYcDxCW/qnjb5JsI1s8bNOg3bVATvQVL4tcf03aTycsz8QeCd
# M0l/yHRObJ9QqazM1r6VPEOJ7LL+uEEb73w6QCuhs89a1uv1zerOYMnsneRRwCbp
# yW11IcggU0cRKDDq1pjVJzIbIF6+oiXXbReOsgeI8zu1FyQfK0fVkaya8SmVHQ/t
# Of23mZ4W9k0Ri22QW9p3UgSC5OUDktKxxcCmGL6tXLfOGSWHIIV4YrTJTT6PNty5
# REojHJuZHArkF9VnHTERWoTjAzfI3kP+5b4alUdhgAZ7ttOu1bVnXfHaqPYl2rPs
# 20ji03LOVWsh/radgE17es5hL+t6lV0eVHrVhsssROWJuz2MXMCt7iw7lFPG9LXK
# Gjsmonn2gotGdHIuEg5JnJMJVmixd5LRlkmgYRZKzhxSCwyoGIq0PhaA7Y+VPct5
# pCHkijcIIDm0nlkK+0KyepolcqGm0T/GYQRMhHJlGOOmVQop36wUVUYklUy++vDW
# eEgEo4s7hxN6mIbf2MSIQ/iIfMZgJxC69oukMUXCrOC3SkE/xIkgpfl22MM1itkZ
# 35nNXkMolU1lAgMBAAGjggFOMIIBSjAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGC
# NxUBBAMCAQAwHQYDVR0OBBYEFH9ZP1Qh2q1P7wXl5qPXLQaUEggxMBkGCSsGAQQB
# gjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU
# ci06AjGQQ7kUBU7h6qfHMdEjiTQwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2Ny
# bC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0MjAx
# MV8yMDExXzAzXzIyLmNybDBeBggrBgEFBQcBAQRSMFAwTgYIKwYBBQUHMAKGQmh0
# dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0MjAx
# MV8yMDExXzAzXzIyLmNydDANBgkqhkiG9w0BAQwFAAOCAgEAFJQfOChP7onn6fLI
# MKrSlN1WYKwDFgAddymOUO3FrM8d7B/W/iQ6DxXsDn7D5W4wMwYeLystcEqfkjz4
# NURRgazyMu5yRzQh4LqjA4tStTcJh1opExo7nn5PuPBYnbu0+THSuVHTe0VTTPVh
# ily/piFrDo3axQ9P4C+Ol5yet+2gTfekICS5xS+cYfSIvgn0JksVBVMYVI5QFu/q
# hnLhsEFEUzG8fvv0hjgkO+lkpV9ty6GkN4vdnd7ya6Q6aR9y34aiM1qmxaxBi6OU
# nyNl6fkuun/diTFnYDLTppOkr/mg5WSfCiDVMNCxtj4wPKC5OmHm1DQIt/MNokbb
# H3UGsFP1QbzsLocuSqLCvH09Io3fDPTmscR9Y75G4qX7RTX8AdBPo0I6OEojf39z
# uFZt0qOHm65YWQE69cZM2ueE1MB05dNNgHK9gTE7zKvK/fg8B2qjW88MT/WF5V5u
# vZGtqa9FSL2RazArA+rDPuf6JGYz4HpgMZHB4S6szWSKYBv0VisCzfxgeU+dquXW
# 9bd0auYlOB58DPcOYKdc3Se94g+xL4pcEhbB54JOgAkwYTu/9dLeH2pDqeJZAABV
# DWRQCaXfO5LgyKwKCLYXpigrZYCjUSBcr+Ve8PFWMhVTQl0v4q8J/AUmQN5W4n10
# 1cY2L4A7GTQG1h32HHAvfQESWP0xghnEMIIZwAIBATBuMFcxCzAJBgNVBAYTAlVT
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jv
# c29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMjQCEzMAAAIdTRnITtcPV0gAAAAAAh0w
# DQYJYIZIAWUDBAIBBQCggZAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwLwYJ
# KoZIhvcNAQkEMSIEIGwAsSdEd8+Pz8IB/WZfwGIKSAOjA9zHkcjNPP4TEWQLMEIG
# CisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEBBQAEggEAcD1NtNICEUxa9Z8F
# Hgzu/ArmsXONrTGg9SFSUlLP8HEE5dDlER0u2uOqu+6v78BYtMg2cUiTEEQP8iIj
# HWT9glg5hhBNTc/tGpl33juJbU6dx8pTl76frb1TVv/nOVFyjfnjL8xJO8qVchfo
# 8OT2ARDMN8QN4juLRyMlc+JP+F5b4fv9qiV43cUlBozqlO1hrymVtqNXSt8PY/II
# A98Kfe5byutBKHbXbgrXrWDQCkmh0uJ1lxSkUvVebfYJu6DdQ12paqL4dUA/9Fq9
# MOf6OZdhoVt6KPss/QXUXX+kF/jtbfymRO0p6+duqxZJn+TXESAbj6hLzHbxDyyK
# CrnxyKGCF5QwgheQBgorBgEEAYI3AwMBMYIXgDCCF3wGCSqGSIb3DQEHAqCCF20w
# ghdpAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFSBgsqhkiG9w0BCRABBKCCAUEEggE9
# MIIBOQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCAdhY0MKvsokiK4
# GdR+ee0nIU6e1DsyvUmXjfiOrMn+uQIGaqouD+PFGBMyMDI2MTAwNTIwMjk0MS4w
# MTVaMASAAgH0oIHRpIHOMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
# Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScw
# JQYDVQQLEx5uU2hpZWxkIFRTUyBFU046ODkwMC0wNUUwLUQ5NDcxJTAjBgNVBAMT
# HE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WgghHqMIIHIDCCBQigAwIBAgIT
# MwAAAiJB0vaq/8i1/wABAAACIjANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJV
# UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGlt
# ZS1TdGFtcCBQQ0EgMjAxMDAeFw0yNjAyMTkxOTM5NTZaFw0yNzA1MTcxOTM5NTZa
# MIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
# UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQL
# ExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxk
# IFRTUyBFU046ODkwMC0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1l
# LVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC1
# ueKJukIuUsAAJo/AY5DZRqH7bhgv7CWGNlEdbRGoITrdE6Wsn57NaNu1BTdjBbFc
# v7Rfixte0x+HRvXSqsD+WeSX/6/y9wE0Mz+xRPTGIY20K7aQDa68OyzVyUeUCypy
# ZC/gW/3ytO/ZOnU9H2ri77kJP8ABrqyy1UxX/OseEgvHsj8yikWT0ARtrjWbXMHF
# zSOo5hQcfUmMXKqWWz6+N0+UynhGy1n+doW4WZgpH8Y5W7hpSokWj1M/Lu4wi3o6
# Dz9vVWukcgUFGjLAl4YZpOhah7HuiC/alXImMQf8C3A8q/6/1hFoeIZB4UGkywxB
# /OSTOSsL6+39pDqzM7CgOpf4V799kN94yM9uXJI5T/SiA5MdIZIhEW0+bh85RqDh
# 5YW3/oav54RPxw5OPlH64QV6KJkl0FIElMVoLNo8UWRQcMD179x7WASjC6LsaNZ7
# yK0qcESIsL1wiQmdfQBxcqrFCpIQfnmQFkOp9IyXUWqza8tmpz8E6aXg9b1eiAT3
# PVTgrOlPi/hYZCfPxX/6jGtyPjy1CiwOmJamohmSU//COAenfRT2G2HMRUpCX1zs
# +AmDmdQM1XRab4YSALLAlDzGCsgI77nnuJjoXAliJmv7NfrvWAcA5KqCUOWQ6kSP
# t5r28MfKXWJJpSXtFeS/MkDzJy/iJRVyHcFy/B+MtwIDAQABo4IBSTCCAUUwHQYD
# VR0OBBYEFFkHwGoDJ5ZbEEiu8KstiusqaozQMB8GA1UdIwQYMBaAFJ+nFV0AXmJd
# g/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly93d3cubWljcm9z
# b2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0El
# MjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYBBQUHMAKGUGh0dHA6
# Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwVGlt
# ZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0l
# AQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMA0GCSqGSIb3DQEBCwUA
# A4ICAQBiAM+nqrpwG29txSXv42o+CsTe2C4boaRfFju9JaWkLTHwq7pknNONL3n+
# UG3x/B083EKXiFYrAmul7BTHCGXU63/xRsZ2wj3ZmR0A4d9nf9saCJVm4juPVFBa
# i/oktOOYH2j+1+zM70woN5ongB/pvy7X8AfY6JB4XPvb80Qz7fY5eddbnwjzg1sZ
# hUPFbbcweWeACINrzqFK62mMeXKmhtufMraoogJeJXfWY3x4/pbubgENT3+pXT65
# 203CPF9kfdKE7GKAIRYy3xkBTDvFd8dufjOpCn38nK6qMlVtnBjDhWQG0PM3E/ox
# Bs5UBrI6pBYkmIHtbjifDquHT+ThaVV7xHc6InoSc3aNzX49JHUgQmuvDdMjLkbY
# XeA0/1q5IxSg2U+ycZBOvAi3udZPKhA5VzODjf/ucu/vFtXrYcRkmGKN3jujaK3/
# yMZi2Ju5NEL3ISWorwp7RjeZg+JMIK0fosuVj+YCm5r64LH/D9QJDAj+XfZaNeFd
# v90K5A0QRRGP/poB9yTIVjEXj/uJzp8L4Dd44sAquqDOiHdkLgxfK8nPqpCSWPZ9
# G+RCPm85o9cAfxENtrSuOwcpyKzxsRCYCL+PK4+98orit9EVJ/LLoCeG+jLlj0Ka
# D4Qy6sZe4rWMr1brQLosTBZNwFnXxNjInCWBd0i7is1yTS/4qTCCB3EwggVZoAMC
# 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
# cGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNNMIICNQIBATCB+aGB0aSBzjCB
# yzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
# ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMc
# TWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVsZCBU
# U1MgRVNOOjg5MDAtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1T
# dGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQC7ycXVZx3bsDpJkr7Vucgpksoz
# uKCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# JjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMA0GCSqGSIb3
# DQEBCwUAAgUA7m5ezDAiGA8yMDI2MTAwNTE3MzcxNloYDzIwMjYxMDA2MTczNzE2
# WjB0MDoGCisGAQQBhFkKBAExLDAqMAoCBQDubl7MAgEAMAcCAQACAjzjMAcCAQAC
# AhJMMAoCBQDub7BMAgEAMDYGCisGAQQBhFkKBAIxKDAmMAwGCisGAQQBhFkKAwKg
# CjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcNAQELBQADggEBALhJPg90
# Sf2omu8BvlQPYy5MGA19pdP8H6k08z+eKEZVXCYlpZTjWcnCLD+PC2WfB9D82N4P
# X+hBhtVSt3jxqT6Kp3caqDwMiW3nP6l8KHADW/hku9MhEb8YPNjQEgix16oZlxN7
# Z3Dncms7CvJ/iFcHRG4KneZONYgOH3XC81wiw+tQuz409FAnWVJgnVEBG//W3s/0
# gESBZAdJskcfbAMBDzl/UxGmmOrKX4Vgti1YQaBJ1jAt6c66+9D5W6s4g7povGd9
# jM+AlnA+LWVjIyr1rOiEzEI73sGUMMjmUqlmGpkb2j4cTWtnT3EEwRCO+ahfma3j
# 7Lhxv9F3B4rQ0+4xggQNMIIECQIBATCBkzB8MQswCQYDVQQGEwJVUzETMBEGA1UE
# CBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9z
# b2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQ
# Q0EgMjAxMAITMwAAAiJB0vaq/8i1/wABAAACIjANBglghkgBZQMEAgEFAKCCAUow
# GgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCD40Uwp
# g9wCs+eRN4tLe7putW0TCPtLMu2yqjbcROp4bDCB+gYLKoZIhvcNAQkQAi8xgeow
# gecwgeQwgb0EIAVgXQEKBOfGgjNskmDOmbcEIOnHGNwA+QcRufDR5AkTMIGYMIGA
# pH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
# B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UE
# AxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAIiQdL2qv/Itf8A
# AQAAAiIwIgQgb7+25fiMaCaUXFEMF5Fbihk1NFqy1kIPUXwAtjxPuZwwDQYJKoZI
# hvcNAQELBQAEggIARq7of6ePoDIDTzmeGGCkkNHnKDcH+EQOESYCcG5x1MzXEz8H
# C+pf+z6DlyuqdnZW2BNQe3Uvr3e0hhILtUwdXdfh35twJVG6PXaM9Bd5pT3uxdqy
# MWXXQadpM9RbrJ4qZMZTvDEkQMV+xfAohMmKD/vbqlxPiVItFZTFtX0XBwDw8MbH
# UJaNikjCV1f6ZLW0Y3ifqHpydOMSpV3nrjJaFpi9+QhlGBXr51ESraekPQVdG5dB
# kpIsDLOGTJf3Mg8fTiC9L92kAMWn8cSfkXgojccTZ2DfUOxDlWclIwFkkdzoRHWn
# rI6/Q7Oyzi3gzkq3qnUWN/HIXo2OtfdytSsNuxuXSEvVExcw7x5B3IoqUMcZkml9
# 7tkohuFzzFZxL/9V5vhQdGzyyClnCg/2ykfh1Q6p+fz6Hccli05tCN8dFnVoijpn
# p3GKDBoR9vXq6GIKPkSzoZXYpIoG4lEsv+Arzy7dulDePe0Dl8zZTooWDNHUapnf
# 1jlsHRF9kVuz7PP4Nng9Rg7sYlOtHi89IRTqi668aG3rxshXZYO2oojsBefnw4fA
# 1Cfbi/aBtHNbgedcFkBqtowX0RljX+fGKy3ioxqo2i9Yw+1mYxEdS+h0Itsd79Cp
# 0s/nMrK98aXuDxj3YJTGQE1tpRRmEFMFhF+ySXjgomwT1hmM5bBaFhLmyVM=
# SIG # End signature block