HP.Sinks.psm1
# # Copyright 2018-2024 HP Development Company, L.P. # All Rights Reserved. # # NOTICE: All information contained herein is, and remains the property of HP Development Company, L.P. # # The intellectual and technical concepts contained herein are proprietary to HP Development Company, L.P # and may be covered by U.S. and Foreign Patents, patents in process, and are protected by # trade secret or copyright law. Dissemination of this information or reproduction of this material # is strictly forbidden unless prior written permission is obtained from HP Development Company, L.P. using namespace HP.CMSLHelper # CMSL is normally installed in C:\Program Files\WindowsPowerShell\Modules # but if installed via PSGallery and via PS7, it is installed in a different location if (Test-Path "$PSScriptRoot\..\HP.Private\HP.CMSLHelper.dll") { Add-Type -Path "$PSScriptRoot\..\HP.Private\HP.CMSLHelper.dll" } else{ Add-Type -Path "$PSScriptRoot\..\..\HP.Private\1.8.1\HP.CMSLHelper.dll" } enum LogType{ Simple CMTrace } enum LogSeverity{ Information = 1 Warning = 2 Error = 3 } function Get-HPPrivateThreadID { [Threading.Thread]::CurrentThread.ManagedThreadId } function Get-HPPrivateUserIdentity { [System.Security.Principal.WindowsIdentity]::GetCurrent().Name } function Get-HPPrivateLogVar { $Env:HPCMSL_LOG_FORMAT } <# .SYNOPSIS Sends a message to a syslog server .DESCRIPTION This command forwards data to a syslog server. This command currently supports UDP (default) and TCP connections. For more information, see RFC 5424 in the 'See also' section. .PARAMETER message Specifies the message to send .PARAMETER severity Specifies the severity of the message. If not specified, the severity defaults to 'Informational'. .PARAMETER facility Specifies the facility of the message. If not specified, the facility defaults to 'User Message'. .PARAMETER clientname Specifies the client name. If not specified, this command uses the current computer name. .PARAMETER timestamp Specifies the event time stamp. If not specified, this command uses the current time. .PARAMETER port Specifies the target port. If not specified and HPSINK_SYSLOG_MESSAGE_TARGET_PORT is not set, this command uses port 514 for both TCP and UDP. .PARAMETER tcp If specified, this command uses TCP instead of UDP. Default is UDP. Switching to TCP may generate additional traffic but allows the protocol to acknowledge delivery. .PARAMETER tcpframing Specifies octet-counting or non-transparent-framing TCP framing. This parameter only applies if the -tcp parameter is specified. Default value is octet-counting unless HPSINK_SYSLOG_MESSAGE_TCPFRAMING is specified. For more information, see RFC 6587 in the "See also" section. .PARAMETER maxlen Specifies maximum length (in bytes) of message that the syslog server accepts. Common sizes are between 480 and 2048 bytes. Default is 2048 if not specified and HPSINK_SYSLOG_MESSAGE_MAXLEN is not set. .PARAMETER target Specifies the target computer on which to perform this operation. Local computer is assumed if not specified and HPSINK_SYSLOG_MESSAGE_TARGET is not set. .PARAMETER PassThru If specified, this command sends the message to the pipeline upon completion and any error in the command is non-terminating. .NOTES This command supports the following environment variables. These overwrite the defaults documented above. - HPSINK_SYSLOG_MESSAGE_TARGET_PORT: override default target port - HPSINK_SYSLOG_MESSAGE_TCPFRAMING: override TCP Framing format - HPSINK_SYSLOG_MESSAGE_MAXLEN: override syslog message max length - HPSINK_SYSLOG_MESSAGE_TARGET: override host name of the syslog server Defaults can be configured via the environment. This affects all related commands. For example, when applying them to eventlog-related commands, all eventlog-related commands are affected. In the following example, the HPSINK_EVENTLOG_MESSAGE_TARGET and HPSINK_EVENTLOG_MESSAGE_SOURCE variables affect both the Register-EventLogSink and Send-ToEventLog commands. ```PowerShell $ENV:HPSINK_EVENTLOG_MESSAGE_TARGET="remotesyslog.mycompany.com" $ENV:HPSINK_EVENTLOG_MESSAGE_SOURCE="mysource" Register-EventLogSink "hello" | Send-ToEventLog ``` .INPUTS The message can be piped to this command, rather than provided via the -message parameter. .OUTPUTS If the -PassThru parameter is specified, the original message is returned. This allows chaining multiple SendTo-XXX commands. .EXAMPLE "hello" | Send-ToSyslog -tcp -server mysyslogserver.mycompany.com This sends "hello" to the syslog server on mysyslogserver.mycompany.com via TCP. Alternately, the syslog server could be set in the environment variable HPSINK_SYSLOG_MESSAGE_TARGET. .LINK [RFC 5424 - "The Syslog Protocol"](https://tools.ietf.org/html/rfc5424) .LINK [RFC 6587 - "Transmission of Syslog Messages over TCP"](https://tools.ietf.org/html/rfc6587) .LINK [Send-ToEventlog](https://developers.hp.com/hp-client-management/doc/Send-ToEventLog) #> function Send-ToSyslog { [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Send-ToSyslog")] param ( [ValidateNotNullOrEmpty()][Parameter(Position = 0,ValueFromPipeline = $True,Mandatory = $True)] $message, [Parameter(Position = 1,Mandatory = $false)] [syslog_severity_t]$severity = [syslog_severity_t]::informational, [Parameter(Position = 2,Mandatory = $false)] [syslog_facility_t]$facility = [syslog_facility_t]::user_message, [Parameter(Position = 3,Mandatory = $false)] [string]$clientname, [Parameter(Position = 4,Mandatory = $false)] [string]$timestamp, [Parameter(Position = 5,Mandatory = $false)] [int]$port = $HPSINK:HPSINK_SYSLOG_MESSAGE_TARGET_PORT, [Parameter(Position = 6,Mandatory = $false)] [switch]$tcp, [ValidateSet("octet-counting","non-transparent-framing")][Parameter(Position = 7,Mandatory = $false)] [string]$tcpframing = $ENV:HPSINK_SYSLOG_MESSAGE_TCPFRAMING, [Parameter(Position = 8,Mandatory = $false)] [int]$maxlen = $ENV:HPSINK_SYSLOG_MESSAGE_MAXLEN, [Parameter(Position = 9,Mandatory = $false)] [switch]$PassThru, [Parameter(Position = 10,Mandatory = $false)] [string]$target = $ENV:HPSINK_SYSLOG_MESSAGE_TARGET ) # Create a UDP Client Object $tcpclient = $null $use_tcp = $false #defaults (change these in environment) if ($target -eq $null -or $target -eq "") { throw "parameter $target is required" } if ($tcpframing -eq $null -or $tcpframing -eq "") { $tcpframing = "octet-counting" } if ($port -eq 0) { $port = 514 } if ($maxlen -eq 0) { $maxlen = 2048 } if ($tcp.IsPresent -eq $false) { switch ([int]$ENV:HPSINK_SYSLOG_MESSAGE_USE_TCP) { 0 { $use_tcp = $false } 1 { $use_tcp = $true } } } else { $use_tcp = $tcp.IsPresent } Write-Verbose "Sending message to syslog server" if ($use_tcp) { Write-Verbose "TCP Connection to $target`:$port" $client = New-Object System.Net.Sockets.TcpClient } else { Write-Verbose "UDP Connection to $target`:$port" $client = New-Object System.Net.Sockets.UdpClient } try { $client.Connect($target,$port) } catch { if ($_.Exception.innerException -ne $null) { Write-Error $_.Exception.innerException.Message -Category ConnectionError -ErrorAction Stop } else { Write-Error $_.Exception.Message -Category ConnectionError -ErrorAction Stop } } if ($use_tcp -and -not $client.Connected) { $prefix = "udp" if ($use_tcp) { $prefix = $tcp } throw "Could not connect to syslog host $prefix`://$target`:$port" } Write-Verbose "Syslog faciliy=$($facility.value__), severity=$($severity.value__)" $priority = ($facility.value__ * 8) + $severity.value__ Write-Verbose "Priority is $priority" if (($clientname -eq "") -or ($clientname -eq $null)) { Write-Verbose "Defaulting to client = $($ENV:computername)" $clientname = $env:computername } if (($timestamp -eq "") -or ($timestamp -eq $null)) { $timestamp = Get-Date -Format "yyyy:MM:dd:-HH:mm:ss zzz" Write-Verbose "Defaulting to timestamp = $timestamp" } $msg = "<{0}>{1} {2} {3}" -f $priority,$timestamp,$hostname,$message Write-Verbose ("Sending the message: $msg") if ($use_tcp) { Write-Verbose ("Sending via TCP") if ($msg.Length -gt $maxlen) { $maxlen = $maxlen - ([string]$maxlen).Length Write-Verbose ("This message has been truncated because maximum effective length is $maxlen but the message is $($msg.length) ") $msg = $msg.substring(0,$maxlen - ([string]$maxlen).Length) } switch ($tcpframing) { "octet-counting" { Write-Verbose "Encoding TCP payload with 'octet-counting'" $encoded = '{0} {1}' -f $msg.Length,$msg $bytes = [System.Text.Encoding]::ASCII.GetBytes($encoded) } "non-transparent-framing" { Write-Verbose "Encoding with 'non-transparent-framing'" $encoded = '{0}{1}' -f $msg.Length,$msg $bytes = [System.Text.Encoding]::ASCII.GetBytes($encoded) } } try { [void]$client.getStream().Write($bytes,0,$bytes.Length) } catch { throw ("Could not send syslog message: $($_.Exception.Message)") } } else { Write-Verbose ("Sending via UDP") try { $bytes = [System.Text.Encoding]::ASCII.GetBytes($msg) if ($bytes.Length -gt $maxlen) { Write-Verbose ("This message has been truncated, because maximum length is $maxlen but the message is $($bytes.length) ") $bytes = $bytes[0..($maxlen - 1)] } [void]$client.Send($bytes,$bytes.Length) } catch { if (-not $PassThru.IsPresent) { throw ("Could not send syslog message: $($_.Exception.Message)") } else { Write-Error -Message $_.Exception.Message -ErrorAction Continue } } } Write-Verbose "Send complete" $client.Close(); if ($PassThru) { return $message } } <# .SYNOPSIS Registers a source in an event log .DESCRIPTION This command registers a source in an event log. must be executed before sending messages to the event log via the Send-ToEventLog command. The source must match the source in the Send-ToEventLog command. By default, it is assumed that the source is 'HP-CSL'. This command can be unregistered using the Unregister-EventLogSink command. .PARAMETER logname Specifies the log section in which to register this source .PARAMETER source Specifies the event log source that will be used when logging. The source can also be specified via the HPSINK_EVENTLOG_MESSAGE_SOURCE environment variable. .PARAMETER target Specifies the target computer on which to perform this command. Local computer is assumed if not specified, unless environment variable HPSINK_EVENTLOG_MESSAGE_TARGET is defined. Important: the user identity running the PowerShell script must have permissions to write to the remote event log. .NOTES This command reads the following environment variables for setting defaults: - HPSINK_EVENTLOG_MESSAGE_SOURCE: override default source name - HPSINK_EVENTLOG_MESSAGE_LOG: override default message log name - HPSINK_EVENTLOG_MESSAGE_TARGET: override event log server name .LINK [Unregister-EventLogSink](https://developers.hp.com/hp-client-management/doc/Unregister-EventLogSink) .LINK [Send-ToEventLog](https://developers.hp.com/hp-client-management/doc/Send-ToEventLog) .EXAMPLE Register-EventLogSink #> function Register-EventLogSink { [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Register-EventLogSink")] param ( [Parameter(Position = 0,Mandatory = $false)] [string]$logname = $ENV:HPSINK_EVENTLOG_MESSAGE_LOG, [Parameter(Position = 1,Mandatory = $false)] [string]$source = $ENV:HPSINK_EVENTLOG_MESSAGE_SOURCE, [Parameter(Position = 2,Mandatory = $false)] [string]$target = $ENV:HPSINK_EVENTLOG_MESSAGE_TARGET ) #defaults (change these in environment) if ($source -eq $null -or $source -eq "") { $source = "HP-CSL" } if ($logname -eq $null -or $logname -eq "") { $logname = "Application" } if ($target -eq $null -or $target -eq "") { $target = "." } Write-Verbose "Registering source $logname / $source" $params = @{ LogName = $logname source = $source } if ($target -ne ".") { $params.Add("ComputerName",$target) } New-EventLog @params } <# .SYNOPSIS Unregisters a source registered by the Register-EventLogSink command .DESCRIPTION This command removes a registration that was previously registered by the Register-EventLogSink command. Note: Switching between formats changes the file encoding. The 'Simple' mode uses unicode encoding (UTF-16) while the 'CMTrace' mode uses UTF-8. This is partly due to historical reasons (default encoding in UTF1-16 and existing log is UTF-16) and partly due to limitations in CMTrace tool, which seems to have trouble with UTF-16 in some cases. As a result, it is important to start with a new log when switching modes. Writing UTF-8 to UTF-16 files or vice versa will cause encoding and display issues. .PARAMETER source Specifies the event log source that was registered via the Register-EventLogSink command. The source can also be specified via the HPSINK_EVENTLOG_MESSAGE_SOURCE environment variable. .PARAMETER target Specifies the target computer on which to perform this command. Local computer is assumed if not specified, unless environment variable HPSINK_EVENTLOG_MESSAGE_TARGET is defined. Important: the user identity running the PowerShell script must have permissions to write to the remote event log. .NOTES This command reads the following environment variables for setting defaults: - HPSINK_EVENTLOG_MESSAGE_SOURCE: override default source name - HPSINK_EVENTLOG_MESSAGE_TARGET: override event log server name .LINK [Register-EventLogSink](https://developers.hp.com/hp-client-management/doc/Register-EventLogSink) .LINK [Send-ToEventLog](https://developers.hp.com/hp-client-management/doc/Send-ToEventLog) .EXAMPLE Unregister-EventLogSink #> function Unregister-EventLogSink { [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Unregister-EventLogSink")] param ( [Parameter(Position = 0,Mandatory = $false)] [string]$source = $ENV:HPSINK_EVENTLOG_MESSAGE_SOURCE, [Parameter(Position = 1,Mandatory = $false)] [string]$target = $ENV:HPSINK_EVENTLOG_MESSAGE_TARGET ) #defaults (change these in environment) if ($source -eq $null -or $source -eq "") { $source = "HP-CSL" } if ($target -eq $null -or $target -eq "") { $target = "." } Write-Verbose "Unregistering source $source" $params = @{ source = $source } if ($target -ne ".") { $params.Add("ComputerName",$target) } Remove-EventLog @params } <# .SYNOPSIS Sends a message to an event log .DESCRIPTION This command sends a message to an event log. The source should be initialized with the Register-EventLogSink command to register the source name prior to using this command. .PARAMETER id Specifies the event id that will be registered under the 'Event ID' column in the event log. Default value is 0. .PARAMETER source Specifies the event log source that will be used when logging. This source should be registered via the Register-EventLogSink command. The source can also be specified via the HPSINK_EVENTLOG_MESSAGE_SOURCE environment variable. .PARAMETER message Specifies the message to log. This parameter is required. .PARAMETER severity Specifies the severity of the message. If not specified, the severity is set as 'Information'. .PARAMETER category Specifies the category of the message. The category shows up under the 'Task Category' column. If not specified, it is 'General', unless environment variable HPSINK_EVENTLOG_MESSAGE_CATEGORY is defined. .PARAMETER logname Specifies the log in which to log (e.g. Application, System, etc). If not specified, it will log to Application, unless environment variable HPSINK_EVENTLOG_MESSAGE_LOG is defined. .PARAMETER rawdata Specifies any raw data to add to the log entry .PARAMETER target Specifies the target computer on which to perform this operation. Local computer is assumed if not specified, unless environment variable HPSINK_EVENTLOG_MESSAGE_TARGET is defined. Important: the user identity running the PowerShell script must have permissions to write to the remote event log. .PARAMETER PassThru If specified, this command sends the message to the pipeline upon completion and any error in the command is non-terminating. .EXAMPLE "hello" | Send-ToEventLog .NOTES This command reads the following environment variables for setting defaults. - HPSINK_EVENTLOG_MESSAGE_SOURCE: override default source name - HPSINK_EVENTLOG_MESSAGE_CATEGORY: override default category id - HPSINK_EVENTLOG_MESSAGE_LOG: override default message log name - HPSINK_EVENTLOG_MESSAGE_TARGET: override event log server name Defaults can be configured via the environment. This affects all related commands. For example, when applying them to eventlog-related commands, all eventlog-related commands are affected. In the following example, the HPSINK_EVENTLOG_MESSAGE_TARGET and HPSINK_EVENTLOG_MESSAGE_SOURCE variables affect both the Register-EventLogSink and Send-ToEventLog commands. ```PowerShell $ENV:HPSINK_EVENTLOG_MESSAGE_TARGET="remotesyslog.mycompany.com" $ENV:HPSINK_EVENTLOG_MESSAGE_SOURCE="mysource" Register-EventLogSink "hello" | Send-ToEventLog ``` .LINK [Unregister-EventLogSink](https://developers.hp.com/hp-client-management/doc/Unregister-EventLogSink) .LINK [Register-EventLogSink](https://developers.hp.com/hp-client-management/doc/Register-EventLogSink) .LINK [Send-ToSyslog](https://developers.hp.com/hp-client-management/doc/Send-ToSyslog) #> function Send-ToEventLog { [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Send-ToEventlog")] param ( [Parameter(Position = 0,Mandatory = $false)] [string]$source = $ENV:HPSINK_EVENTLOG_MESSAGE_SOURCE, [Parameter(Position = 1,Mandatory = $false)] [int]$id = 0, [ValidateNotNullOrEmpty()][Parameter(Position = 2,ValueFromPipeline = $true,Mandatory = $True)] $message, [Parameter(Position = 3,Mandatory = $false)] [eventlog_severity_t]$severity = [eventlog_severity_t]::informational, [Parameter(Position = 4,Mandatory = $false)] [int16]$category = $ENV:HPSINK_EVENTLOG_MESSAGE_CATEGORY, [Parameter(Position = 5,Mandatory = $false)] [string]$logname = $ENV:HPSINK_EVENTLOG_MESSAGE_LOG, [Parameter(Position = 6,Mandatory = $false)] [byte[]]$rawdata = $null, [Parameter(Position = 7,Mandatory = $false)] [string]$target = $ENV:HPSINK_EVENTLOG_MESSAGE_TARGET, [Parameter(Position = 8,Mandatory = $false)] [switch]$PassThru ) #defaults (change these in environment) if ($source -eq $null -or $source -eq "") { $source = "HP-CSL" } if ($logname -eq $null -or $logname -eq "") { $logname = "Application" } if ($target -eq $null -or $target -eq "") { $target = "." } Write-Verbose "Sending message (category=$category, id=$id) to eventlog $logname with source $source" $params = @{ EntryType = $severity.value__ Category = $category Message = $message LogName = $logname source = $source EventId = $id } if ($target -ne ".") { $params.Add("ComputerName",$target) Write-Verbose ("The target machine is remote ($target)") } if ($rawdata -ne $null) { $params.Add("RawData",$rawdata) } try { Write-EventLog @params } catch { if (-not $PassThru.IsPresent) { throw ("Could not send eventlog message: $($_.Exception.Message)") } else { Write-Error -Message $_.Exception.Message -ErrorAction Continue } } if ($PassThru) { return $message } } <# .SYNOPSIS Writes a 'simple' LOG entry Private command. Do not export #> function Write-HPPrivateSimple { [CmdletBinding()] param ( [Parameter(Mandatory = $True,Position = 0)] [LogSeverity]$Severity, [Parameter(Mandatory = $True,Position = 1)] [string]$Message, [Parameter(Mandatory = $True,Position = 2)] [string]$Component, [Parameter(Mandatory = $False,Position = 3)] [string]$File = $Null ) $prefix = switch ($severity) { Error { " [ERROR] " } Warning { " [WARN ] " } default { "" } } if ($File) { if (-not [System.IO.Directory]::Exists([System.IO.Path]::GetDirectoryName($File))) { throw [System.IO.DirectoryNotFoundException]"Path not found: $([System.IO.Path]::GetDirectoryName($File))" } } $context = Get-HPPrivateUserIdentity $line = "[$(Get-Date -Format o)] $Context - $Prefix $Message" if ($File) { $line | Out-File -Width 1024 -Append -Encoding unicode -FilePath $File } else { $line } } <# .SYNOPSIS Writes a 'CMTrace' LOG entry Private command. Do not export #> function Write-HPPrivateCMTrace { [CmdletBinding()] param ( [Parameter(Mandatory = $True,Position = 0)] [LogSeverity]$Severity, [Parameter(Mandatory = $True,Position = 1)] [string]$Message, [Parameter(Mandatory = $True,Position = 2)] [string]$Component, [Parameter(Mandatory = $False,Position = 3)] [string]$File ) $line = "<![LOG[$Message]LOG]!>" + ` "<time=`"$(Get-Date -Format "HH:mm:ss.ffffff")`" " + ` "date=`"$(Get-Date -Format "M-d-yyyy")`" " + ` "component=`"$Component`" " + ` "context=`"$(Get-HPPrivateUserIdentity)`" " + ` "type=`"$([int]$Severity)`" " + ` "thread=`"$(Get-HPPrivateThreadID)`" " + ` "file=`"`">" if ($File) { if (-not [System.IO.Directory]::Exists([System.IO.Path]::GetDirectoryName($File))) { throw [System.IO.DirectoryNotFoundException]"Path not found: $([System.IO.Path]::GetDirectoryName($File))" } } if ($File) { $line | Out-File -Append -Encoding UTF8 -FilePath $File -Width 1024 } else { $line } } <# .SYNOPSIS Sets the format used by the Write-Log* commands .DESCRIPTION This command sets the log format used by the Write-Log* commands. The two formats supported are simple (human readable) format and CMtrace format used by configuration manager. The format is stored in the HPCMSL_LOG_FORMAT environment variable. To set the default format without using this command, update the variable by setting it to either 'Simple' or 'CMTrace' ahead of time. The default format is 'Simple'. .PARAMETER Format Specifies the log format. The value must be one of the following values: - Simple: human readable - CMTrace: XML format used by the CMTrace tool .EXAMPLE Set-HPCMSLLogFormat -Format CMTrace .LINK [Write-LogInfo](https://developers.hp.com/hp-client-management/doc/Write-LogInfo) .LINK [Write-LogWarning](https://developers.hp.com/hp-client-management/doc/Write-LogWarning) .LINK [Write-LogError](https://developers.hp.com/hp-client-management/doc/Write-LogError) .LINK [Get-HPCMSLLogFormat](https://developers.hp.com/hp-client-management/doc/Get-HPCMSLLogFormat) #> function Set-HPCMSLLogFormat { [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Set-HPCMSLLogFormat")] param( [Parameter(Mandatory = $True,Position = 0)] [LogType]$Format ) $Env:HPCMSL_LOG_FORMAT = $Format $Global:CmslLog = $Global:CmslLogType Write-Debug "Set log type to $($Global:CmslLog)" } <# .SYNOPSIS Retrieves the format used by the log commands .DESCRIPTION This command retrieves the configured log format used by the Write-Log* commands. This command returns the value of the HPCMSL_LOG_FORMAT environment variable or 'Simple' if the variable is not configured. .PARAMETER Format Specifies the log format. The value must be one of the following values: - Simple: human readable - CMTrace: XML format used by the CMTrace tool .EXAMPLE Get-HPCMSLLogFormat -Format CMTrace .LINK [Write-LogInfo](https://developers.hp.com/hp-client-management/doc/Write-LogInfo) .LINK [Write-LogWarning](https://developers.hp.com/hp-client-management/doc/Write-LogWarning) .LINK [Write-LogError](https://developers.hp.com/hp-client-management/doc/Write-LogError) .LINK [Set-HPCMSLLogFormat](https://developers.hp.com/hp-client-management/doc/Set-HPCMSLLogFormat) #> function Get-HPCMSLLogFormat { [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Get-HPCMSLLogFormat")] param() if (-not $Global::CmslLog) { $Global:CmslLog = Get-HPPrivateLogVar } if (-not $Global:CmslLog) { $Global:CmslLog = 'Simple' } Write-Verbose "Configured log type is $($Global:CmslLog)" switch ($Global:CmslLog) { 'CMTrace' { 'CMTrace' } Default { 'Simple' } } } <# .SYNOPSIS Writes a 'warning' log entry .DESCRIPTION This command writes a 'warning' log entry to default output or a specified file. .PARAMETER Message Specifies the message to write .PARAMETER Component Specifies a 'Component' tag for the message entry. Some log readers use this parameter to group messages. If not specified, the component tag is 'General'. This parameter is ignored in 'Simple' mode due to backwards compatibility reasons. .PARAMETER File Specifies the file to update with the new log entry. If not specified, the log entry is written to the pipeline. .EXAMPLE Write-LogWarning -Component "Repository" -Message "Something bad may have happened" -File myfile.log .LINK [Write-LogInfo](https://developers.hp.com/hp-client-management/doc/Write-LogInfo) .LINK [Write-LogError](https://developers.hp.com/hp-client-management/doc/Write-LogError) .LINK [Get-HPCMSLLogFormat](https://developers.hp.com/hp-client-management/doc/Get-HPCMSLLogFormat) .LINK [Set-HPCMSLLogFormat](https://developers.hp.com/hp-client-management/doc/Set-HPCMSLLogFormat) #> function Write-LogWarning { [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Write-LogWarning")] param( [Parameter(Mandatory = $True,Position = 0)] [string]$Message, [Parameter(Mandatory = $False,Position = 1)] [string]$Component = "General", [Parameter(Mandatory = $False,Position = 2)] [string]$File ) if ($File) { $file = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($file) } switch (Get-HPCMSLLogFormat) { CMTrace { Write-HPPrivateCMTrace -Severity Warning -Message $Message -Component $Component -File $File } default { Write-HPPrivateSimple -Severity Warning -Message $Message -Component $Component -File $file } } } <# .SYNOPSIS Writes an 'error' log entry .DESCRIPTION This command writes an 'error' log entry to default output or a specified file. .PARAMETER Message Specifies the message to write .PARAMETER Component Specifies a 'Component' tag for the message entry. Some log readers use this parameter to group messages. If not specified, the component tag is 'General'. This parameter is ignored in 'Simple' mode due to backwards compatibility reasons. .PARAMETER File Specifies the file to update with the new log entry. If not specified, the log entry is written to pipeline. .EXAMPLE Write-LogError -Component "Repository" -Message "Something bad happened" -File myfile.log .LINK [Write-LogInfo](https://developers.hp.com/hp-client-management/doc/Write-LogInfo) .LINK [Write-LogWarning](https://developers.hp.com/hp-client-management/doc/Write-LogWarning) .LINK [Get-HPCMSLLogFormat](https://developers.hp.com/hp-client-management/doc/Get-HPCMSLLogFormat) .LINK [Set-HPCMSLLogFormat](https://developers.hp.com/hp-client-management/doc/Set-HPCMSLLogFormat) #> function Write-LogError { [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Write-LogError")] param( [Parameter(Mandatory = $True,Position = 0)] [string]$Message, [Parameter(Mandatory = $False,Position = 1)] [string]$Component = "General", [Parameter(Mandatory = $False,Position = 2)] [string]$File ) if ($File) { $file = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($file) } switch (Get-HPCMSLLogFormat) { CMTrace { Write-HPPrivateCMTrace -Severity Error -Message $Message -Component $Component -File $file } default { Write-HPPrivateSimple -Severity Error -Message $Message -Component $Component -File $file } } } <# .SYNOPSIS Writes an 'informational' log entry .DESCRIPTION This command writes an 'informational' log entry to default output or a specified file. .PARAMETER Message Specifies the message to write .PARAMETER Component Specifies a 'Component' tag for the message entry. Some log readers use this parameter to group messages. If not specified, the component tag is 'General'. This parameter is ignored in 'Simple' mode due to backwards compatibility reasons. .PARAMETER File Specifies the file to update with the new log entry. If not specified, the log entry is written to pipeline. .EXAMPLE Write-LogInfo -Component "Repository" -Message "Nothing bad happened" -File myfile.log #> function Write-LogInfo { [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Write-LogInfo")] param( [Parameter(Mandatory = $True,Position = 0)] [string]$Message, [Parameter(Mandatory = $False,Position = 1)] [string]$Component = "General", [Parameter(Mandatory = $False,Position = 2)] [string]$File ) if ($File) { $file = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($file) } switch (Get-HPCMSLLogFormat) { CMTrace { Write-HPPrivateCMTrace -Severity Information -Message $Message -Component $Component -File $file } default { Write-HPPrivateSimple -Severity Information -Message $Message -Component $Component -File $file } } } # SIG # Begin signature block # MIIoGAYJKoZIhvcNAQcCoIIoCTCCKAUCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBUNEMI2ohyKkEB # 1/HR3s0acJQ5knKGVTPpWW89Q/Y9NKCCDYowggawMIIEmKADAgECAhAIrUCyYNKc # TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV # BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z # NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg # SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg # UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw # ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0 # JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr # Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF # LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F # LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh # 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ # wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay # g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI # YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp # QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro # OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB # WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+ # YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P # AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk # BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC # hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v # dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j # b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED # MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql # +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF # UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h # mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw # YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld # AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw # 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP # LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE # QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn # KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji # WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq # yK+p/pQd52MbOoZWeE4wggbSMIIEuqADAgECAhAGbBUteYe7OrU/9UuqLvGSMA0G # CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg # SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg # UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjQxMTA0MDAwMDAwWhcNMjUxMTAz # MjM1OTU5WjBaMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAG # A1UEBxMJUGFsbyBBbHRvMRAwDgYDVQQKEwdIUCBJbmMuMRAwDgYDVQQDEwdIUCBJ # bmMuMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAhwvYomD82RHJaNe6 # hXdd082g5HbXVXhZD/0KKEfihtjmrlbGPRShWeEdNQuy+fJ8QWxwvBT2pxeSZgTU # 7mF4Y6KywswKBs7BTypqoMeCRATSVeTbkqYrGQWR3Of/FJOmWDoXUoSQ+xpcBNx5 # c1VVWafuBjCTF63uA6oVjkZyJDX5+I8IV6XK9T8QIk73c66WPuG3/QExXuQDLRl9 # 7PgzAq0eduyiERUnvaMiTEKIjtyglzj33CI9b0N9ju809mjwCCX/JG1dyLFegKGD # ckCBL4itfrX6QNmFXp3AvLJ4KkQw5KsZBFL4uvR7/Zkhp7ovO+DYlquRDQyD13de # QketEgoxUXhRkALQbNCoIOfj3miEgYvOhtkc5Ody+tT+TTccp9D1EtKfn31hHtJi # mbm1fQ5vUz+gEu7eDX8IBUu/3yonKjZwG3j337SKzTUJcrjBfteYMiyFf1hvnJ1Y # YNG1NudpLCbz5Lg0T0oYNDtv/ZTH0rqt0V3kFTE2l+TJWE6NAgMBAAGjggIDMIIB # /zAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiIZfROQjAdBgNVHQ4EFgQUdIsz # G4bM4goMS/SCP9csSmH2W2YwPgYDVR0gBDcwNTAzBgZngQwBBAEwKTAnBggrBgEF # BQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIH # gDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRw # Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu # Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGln # aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hB # Mzg0MjAyMUNBMS5jcmwwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUFBzABhhho # dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6Ly9jYWNl # cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNB # NDA5NlNIQTM4NDIwMjFDQTEuY3J0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQAD # ggIBAGdZql3ql/27gF6v+IQZ/OT7MTSbokLTaIzd3ESqKnrbBmHPMGkGrynLVmyV # 23O9o15tIUmyKqlbEjmqAnivgv7nUrpi4bUjvCoBuTWAtEkO+doAf7AxhUgS9Nl2 # zUtBLtuijJ2gorDnkB1+9LPsuraiRyiPHc2lo04pJEPzgo/o15+/VREr6vzkBBhw # b7oyGiQocAlfPiUtL/9xlWSHUKnaUdLTfLjXIaDs2av1Z9c9tt9GpQLAS1Hbyfqj # 6lyALau1X0XehqaN3O/O8rqd/is0jsginICErfhxZfhS/pbKuLOGaXDrk8bRmYUL # StyhU148ktTgPBfcumuhuNACbcw8WZZnDcKnuzEoYJX6xsJi+jCHNh+zEyk3k+Xb # c6e5DlwKqDsruFJVX3ATS1WQtW5mvpIxokIZuoST9D5errD3wNX5x5HinfSK+5FA # QQ6DFLzftBxySkqq+flMYy/sI0KRnV00tFcgUnlqHVnidwsA3bVPDTy8fPGdNv+j # pfbNfW4CCTOiV8gKCpEYyMcvcf5xV3TFOim4Hb4+PvVy1dwswFgFxJWUyEUI6OKL # T67blyUDNRqqL7kXtn4XJvdKVjALkeUMZDHxfdaQ30TCtDRPHWpNskTH3F3aqNFM # 8QVJxN0unuKdIbJiYJkldVgMyhT0I95EKSKsuLWK+VKUWu/MMYIZ5DCCGeACAQEw # fTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNV # BAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hB # Mzg0IDIwMjEgQ0ExAhAGbBUteYe7OrU/9UuqLvGSMA0GCWCGSAFlAwQCAQUAoHww # EAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYK # KwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIGOcrIku # 0XqJL4+WBdDBz3mROWERsIUvRORpTMpZhMwnMA0GCSqGSIb3DQEBAQUABIIBgHRN # a9V1wE5uM/4TWg3Gh3zzwdZ5y/N1ZvRDqMf2FrrQhpb6ydyUGFoopDTi0zf7HLB7 # SfF8CPKYi0xfKokOklPHmCq1Vxrj2O/71HR2lITICpim9oZR5fXd1PfV3E1ri9+X # PRRev+kQ+IRiEfTKmh/M5O+vNyZhX4pRwe1wdEGFFVpHBjUZsQQtztnEuzccE60R # EmKT+MNdg+FMOxcf0PdP0A4sqE+Ve+g1mRchJFP0L3wuT7PC2uTZEMUSdjPsEjoo # 12YeWQ40LGjoZLcZQEfVTMijAe05Q07B4PwgjW1w7zMBVk32eghA2j0Qv43suYtP # S9f8AnvmQyOgKszxngxp1TN32bjaA7Dm7rGDWqRtOgDIOQWNG0Eys6GjlIfzxip+ # 0cYDIBdkG37A8Yaun5hXxBJTnngk1lnt1GSRa4Y4VCJZY8FQOL1JJZn3Ip8MBhoV # faNXi7YHe/e5DaYF4FVipxxiZxNF/lJIQwUIe9d+/Y02D425eIs4m80z4iDGjqGC # Fzowghc2BgorBgEEAYI3AwMBMYIXJjCCFyIGCSqGSIb3DQEHAqCCFxMwghcPAgED # MQ8wDQYJYIZIAWUDBAIBBQAweAYLKoZIhvcNAQkQAQSgaQRnMGUCAQEGCWCGSAGG # /WwHATAxMA0GCWCGSAFlAwQCAQUABCB95Uc1EboW69xioft5qEEB4Bhepo/pXxwD # 9KWBifQq3gIRAIvWhfZkKl3NNSiV6WAi4W0YDzIwMjQxMjAzMjAyMzA3WqCCEwMw # gga8MIIEpKADAgECAhALrma8Wrp/lYfG+ekE4zMEMA0GCSqGSIb3DQEBCwUAMGMx # CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMy # RGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcg # Q0EwHhcNMjQwOTI2MDAwMDAwWhcNMzUxMTI1MjM1OTU5WjBCMQswCQYDVQQGEwJV # UzERMA8GA1UEChMIRGlnaUNlcnQxIDAeBgNVBAMTF0RpZ2lDZXJ0IFRpbWVzdGFt # cCAyMDI0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvmpzn/aVIauW # MLpbbeZZo7Xo/ZEfGMSIO2qZ46XB/QowIEMSvgjEdEZ3v4vrrTHleW1JWGErrjOL # 0J4L0HqVR1czSzvUQ5xF7z4IQmn7dHY7yijvoQ7ujm0u6yXF2v1CrzZopykD07/9 # fpAT4BxpT9vJoJqAsP8YuhRvflJ9YeHjes4fduksTHulntq9WelRWY++TFPxzZrb # ILRYynyEy7rS1lHQKFpXvo2GePfsMRhNf1F41nyEg5h7iOXv+vjX0K8RhUisfqw3 # TTLHj1uhS66YX2LZPxS4oaf33rp9HlfqSBePejlYeEdU740GKQM7SaVSH3TbBL8R # 6HwX9QVpGnXPlKdE4fBIn5BBFnV+KwPxRNUNK6lYk2y1WSKour4hJN0SMkoaNV8h # yyADiX1xuTxKaXN12HgR+8WulU2d6zhzXomJ2PleI9V2yfmfXSPGYanGgxzqI+Sh # oOGLomMd3mJt92nm7Mheng/TBeSA2z4I78JpwGpTRHiT7yHqBiV2ngUIyCtd0pZ8 # zg3S7bk4QC4RrcnKJ3FbjyPAGogmoiZ33c1HG93Vp6lJ415ERcC7bFQMRbxqrMVA # Niav1k425zYyFMyLNyE1QulQSgDpW9rtvVcIH7WvG9sqYup9j8z9J1XqbBZPJ5XL # ln8mS8wWmdDLnBHXgYly/p1DhoQo5fkCAwEAAaOCAYswggGHMA4GA1UdDwEB/wQE # AwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMCAGA1Ud # IAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATAfBgNVHSMEGDAWgBS6FtltTYUv # cyl2mi91jGogj57IbzAdBgNVHQ4EFgQUn1csA3cOKBWQZqVjXu5Pkh92oFswWgYD # VR0fBFMwUTBPoE2gS4ZJaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 # VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNybDCBkAYIKwYB # BQUHAQEEgYMwgYAwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNv # bTBYBggrBgEFBQcwAoZMaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lD # ZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNydDANBgkq # hkiG9w0BAQsFAAOCAgEAPa0eH3aZW+M4hBJH2UOR9hHbm04IHdEoT8/T3HuBSyZe # q3jSi5GXeWP7xCKhVireKCnCs+8GZl2uVYFvQe+pPTScVJeCZSsMo1JCoZN2mMew # /L4tpqVNbSpWO9QGFwfMEy60HofN6V51sMLMXNTLfhVqs+e8haupWiArSozyAmGH # /6oMQAh078qRh6wvJNU6gnh5OruCP1QUAvVSu4kqVOcJVozZR5RRb/zPd++PGE3q # F1P3xWvYViUJLsxtvge/mzA75oBfFZSbdakHJe2BVDGIGVNVjOp8sNt70+kEoMF+ # T6tptMUNlehSR7vM+C13v9+9ZOUKzfRUAYSyyEmYtsnpltD/GWX8eM70ls1V6QG/ # ZOB6b6Yum1HvIiulqJ1Elesj5TMHq8CWT/xrW7twipXTJ5/i5pkU5E16RSBAdOp1 # 2aw8IQhhA/vEbFkEiF2abhuFixUDobZaA0VhqAsMHOmaT3XThZDNi5U2zHKhUs5u # HHdG6BoQau75KiNbh0c+hatSF+02kULkftARjsyEpHKsF7u5zKRbt5oK5YGwFvgc # 4pEVUNytmB3BpIiowOIIuDgP5M9WArHYSAR16gc0dP2XdkMEP5eBsX7bf/MGN4K3 # HP50v/01ZHo/Z5lGLvNwQ7XHBx1yomzLP8lx4Q1zZKDyHcp4VQJLu2kWTsKsOqQw # ggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIx # CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 # dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBH # NDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVT # MRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1 # c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqG # SIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbS # g9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9 # /UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXn # HwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0 # VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4f # sbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUmcJgmf6AaRyBD40Nj # gHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0 # QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvv # mz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T # /jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk # 42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXcheMBK9Rp6103a50g5r # mQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4E # FgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5n # P+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcG # CCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu # Y29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln # aUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8v # Y3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNV # HSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIB # AH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxp # wc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIl # zpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQ # cAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfe # Kuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+j # Sbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJsh # IUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6 # OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDw # N7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR # 81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2 # VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIFjTCCBHWgAwIBAgIQ # DpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQGEwJVUzEV # MBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29t # MSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMjIwODAx # MDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM # RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQD # ExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUAA4IC # DwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Yq3aa # za57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllV # cq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT # +CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd # 463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+ # EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmgZ92k # J7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse5w5j # rubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 # f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJU # KSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+wh # X8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQAB # o4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5n # P+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8wDgYDVR0P # AQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29j # c3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdp # Y2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MEUGA1UdHwQ+MDww # OqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJ # RFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRVHSAAMA0GCSqGSIb3DQEBDAUAA4IB # AQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyhhyzshV6pGrsi+IcaaVQi7aSId229 # GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO0Cre+i1Wz/n096wwepqLsl7Uz9FD # RJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo8L8vC6bp8jQ87PcDx4eo0kxAGTVG # amlUsLihVo7spNU96LHc/RzY9HdaXFSMb++hUD38dglohJ9vytsgjTVgHAIDyyCw # rFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5xaiNrIv8SuFQtJ37YOtnwtoeW/VvR # XKwYw02fc7cBqZ9Xql4o4rmUMYIDdjCCA3ICAQEwdzBjMQswCQYDVQQGEwJVUzEX # MBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0 # ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBAhALrma8Wrp/lYfG # +ekE4zMEMA0GCWCGSAFlAwQCAQUAoIHRMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0B # CRABBDAcBgkqhkiG9w0BCQUxDxcNMjQxMjAzMjAyMzA3WjArBgsqhkiG9w0BCRAC # DDEcMBowGDAWBBTb04XuYtvSPnvk9nFIUIck1YZbRTAvBgkqhkiG9w0BCQQxIgQg # S/qRJP1J4ZVdHF54X2CYjdaAseWrimGxA5vzwZxBCEkwNwYLKoZIhvcNAQkQAi8x # KDAmMCQwIgQgdnafqPJjLx9DCzojMK7WVnX+13PbBdZluQWTmEOPmtswDQYJKoZI # hvcNAQEBBQAEggIALsqjWWV1fv9lXh84r4djYjmx83Y3srcaB2Y7hQ9d8AJd5hhc # FTxleSM+ceVE6IrFvO31TrW4lOCEGJCAJS7baRjqcjeG4UMGHawA98BhKQwSobth # 5okpWZvOItSuXcRowhcz4lVfUWx22YFCnxfQTeyvXExwQ58U8Ynzb6oVBBumysFO # h1bGyt2NReVU0RhBQ1qugtMKhjZzM5ub2O3U2DdK2F2t/6M4r2S8hbKicjHVqZXL # ajdTaAl6HON6ScW5YIlC0DVRcHRFfkwjhSmAkQMeAUU5XR8pJdmBpBCt/hoNRxPY # sH926/f5srF02Hoi5sk2yoQAVDdbhXSQ8Wxm547uKoRUHxDVsdnAWG3x4g3ouBpm # rz2R2vkQvvndOw9VOlSTkIXBkZQOJLi6kiQbgZRaIuJSxLt4rYoKz166H3YqT8vK # zfAxDLh930DaXBz1Nu2GIUf4VnJSns2kZ63CdZe+04RqiSWyuwW6tIKFrWxJF9SC # 2Gt0juzzbviXlZC//G95amSZxuAAU8sPOHwMEVFL7qAIxnm3P2OacA7eXMMaEJox # LRGoGQ6o1XV493RwMv2dk4Z6GIIWNm65ysfQENAsJFS5WJNV35LizGQ5O1FE4bau # bu4Cdq368fWzUtv74Q1Y+P/ZjYH1HPZWY/1uKwMUicamgBdCuVC5si4dPgs= # SIG # End signature block |