WSAPI/HostSetsAndVirtualVolumeSets.psm1

####################################################################################
## © 2020,2021 Hewlett Packard Enterprise Development LP
##
## Permission is hereby granted, free of charge, to any person obtaining a
## copy of this software and associated documentation files (the "Software"),
## to deal in the Software without restriction, including without limitation
## the rights to use, copy, modify, merge, publish, distribute, sublicense,
## and/or sell copies of the Software, and to permit persons to whom the
## Software is furnished to do so, subject to the following conditions:
##
## The above copyright notice and this permission notice shall be included
## in all copies or substantial portions of the Software.
##
## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
## THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
## OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
## ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
## OTHER DEALINGS IN THE SOFTWARE.
##
## File Name: HostSetsAndVirtualVolumeSets.psm1
## Description: Host sets and virtual volume sets cmdlets
##
## Created: February 2020
## Last Modified: February 2020
## History: v3.0 - Created
#####################################################################################

$Info = "INFO:"
$Debug = "DEBUG:"
$global:VSLibraries = Split-Path $MyInvocation.MyCommand.Path
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

############################################################################################################################################
## FUNCTION New-HostSet_WSAPI
############################################################################################################################################
Function New-HostSet_WSAPI 
{
  <#
  
  .SYNOPSIS
    Creates a new host Set.
    
  .DESCRIPTION
    Creates a new host Set.
    Any user with the Super or Edit role can create a host set. Any role granted hostset_set permission can add hosts to a host set.
    You can add hosts to a host set using a glob-style pattern. A glob-style pattern is not supported when removing hosts from sets.
    For additional information about glob-style patterns, see “Glob-Style Patterns” in the HPE 3PAR Command Line Interface Reference.
      
  .PARAMETER HostSetName
    Name of the host set to be created.
  
  .PARAMETER Comment
    Comment for the host set.
    
  .PARAMETER Domain
    The domain in which the host set will be created.
    
  .PARAMETER SetMembers
    The host to be added to the set. The existence of the hist will not be checked.

  .PARAMETER WsapiConnection
    WSAPI Connection object created with Connection command

  .EXAMPLE
    New-HostSet_WSAPI -HostSetName MyHostSet
    Creates a new host Set with name MyHostSet.
    
  .EXAMPLE
    New-HostSet_WSAPI -HostSetName MyHostSet -Comment "this Is Test Set" -Domain MyDomain
    Creates a new host Set with name MyHostSet.
    
  .EXAMPLE
    New-HostSet_WSAPI -HostSetName MyHostSet -Comment "this Is Test Set" -Domain MyDomain -SetMembers MyHost
    Creates a new host Set with name MyHostSet with Set Members MyHost.
    
  .EXAMPLE
    New-HostSet_WSAPI -HostSetName MyHostSet -Comment "this Is Test Set" -Domain MyDomain -SetMembers "MyHost,MyHost1,MyHost2"
    Creates a new host Set with name MyHostSet with Set Members MyHost.

  .Notes
    NAME : New-HostSet_WSAPI
    LASTEDIT: February 2020
    KEYWORDS: New-HostSet_WSAPI
   
  .Link
     http://www.hpe.com
 
  #Requires PS -Version 3.0
  
  #>

  [CmdletBinding()]
  Param(
      [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
      [System.String]
      $HostSetName,      
      
      [Parameter(Position=1, Mandatory=$false, ValueFromPipeline=$true)]
      [System.String]
      $Comment,    
      
      [Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$true)]
      [System.String]
      $Domain, 
      
      [Parameter(Position=3, Mandatory=$false, ValueFromPipeline=$true)]
      [String[]]
      $SetMembers,
      
      [Parameter(Position=4, Mandatory=$false, ValueFromPipeline=$true)]
      $WsapiConnection = $global:WsapiConnection
  )

  Begin 
  {
    # Test if connection exist
    Test-WSAPIConnection -WsapiConnection $WsapiConnection
  }

  Process 
  {
    # Creation of the body hash
    Write-DebugLog "Running: Creation of the body hash" $Debug
    $body = @{}    
    $body["name"] = "$($HostSetName)"
   
    If ($Comment) 
    {
        $body["comment"] = "$($Comment)"
    }  

    If ($Domain) 
    {
        $body["domain"] = "$($Domain)"
    }
    
    If ($SetMembers) 
    {
        $body["setmembers"] = $SetMembers
    }
    
    $Result = $null
    
    #Request
    $Result = Invoke-WSAPI -uri '/hostsets' -type 'POST' -body $body -WsapiConnection $WsapiConnection
    $status = $Result.StatusCode    
    if($status -eq 201)
    {
        write-host ""
        write-host "Cmdlet executed successfully" -foreground green
        write-host ""
        Write-DebugLog "SUCCESS: Host Set:$HostSetName created successfully" $Info
        
        Get-HostSet_WSAPI -HostSetName $HostSetName
        Write-DebugLog "End: New-HostSet_WSAPI" $Debug
    }
    else
    {
        write-host ""
        write-host "FAILURE : While creating Host Set:$HostSetName " -foreground red
        write-host ""
        Write-DebugLog "FAILURE : While creating Host Set:$HostSetName " $Info
        
        return $Result.StatusDescription
    }    
  }
  End 
  {
  }  
}
#ENG New-HostSet_WSAPI

############################################################################################################################################
## FUNCTION Update-HostSet_WSAPI
############################################################################################################################################
Function Update-HostSet_WSAPI 
{
  <#
  .SYNOPSIS
    Update an existing Host Set.
  
  .DESCRIPTION
    Update an existing Host Set.
    Any user with the Super or Edit role can modify a host set. Any role granted hostset_set permission can add a host to the host set or remove a host from the host set.
    
  .EXAMPLE
    Update-HostSet_WSAPI -HostSetName xxx -RemoveMember -Members as-Host4
        
  .EXAMPLE
    Update-HostSet_WSAPI -HostSetName xxx -AddMember -Members as-Host4
    
  .EXAMPLE
    Update-HostSet_WSAPI -HostSetName xxx -ResyncPhysicalCopy
    
  .EXAMPLE
    Update-HostSet_WSAPI -HostSetName xxx -StopPhysicalCopy
        
  .EXAMPLE
    Update-HostSet_WSAPI -HostSetName xxx -PromoteVirtualCopy
        
  .EXAMPLE
    Update-HostSet_WSAPI -HostSetName xxx -StopPromoteVirtualCopy
        
  .EXAMPLE
    Update-HostSet_WSAPI -HostSetName xxx -ResyncPhysicalCopy -Priority high
        
  .PARAMETER HostSetName
    Existing Host Name
    
  .PARAMETER AddMember
    Adds a member to the VV set.
    
  .PARAMETER RemoveMember
    Removes a member from the VV set.
    
  .PARAMETER ResyncPhysicalCopy
    Resynchronize the physical copy to its VV set.
  
  .PARAMETER StopPhysicalCopy
    Stops the physical copy.
  
  .PARAMETER PromoteVirtualCopy
    Promote virtual copies in a VV set.
    
  .PARAMETER StopPromoteVirtualCopy
    Stops the promote virtual copy operations in a VV set.
    
  .PARAMETER NewName
    New name of the set.
    
  .PARAMETER Comment
    New comment for the VV set or host set.
    To remove the comment, use “”.

  .PARAMETER Members
    The volume or host to be added to or removed from the set.
  
  .PARAMETER Priority
    1: high
    2: medium
    3: low

  .PARAMETER WsapiConnection
    WSAPI Connection object created with Connection command
    
  .Notes
    NAME : Update-HostSet_WSAPI
    LASTEDIT: February 2020
    KEYWORDS: Update-HostSet_WSAPI
   
  .Link
     http://www.hpe.com
 
  #Requires PS -Version 3.0
  #>


  [CmdletBinding()]
  Param(
    [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
    [System.String]
    $HostSetName,
    
    [Parameter(Position=1, Mandatory=$false, ValueFromPipeline=$true)]
    [switch]
    $AddMember,    
    
    [Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$true)]
    [switch]
    $RemoveMember,
    
    [Parameter(Position=3, Mandatory=$false, ValueFromPipeline=$true)]
    [switch]
    $ResyncPhysicalCopy,
    
    [Parameter(Position=4, Mandatory=$false, ValueFromPipeline=$true)]
    [switch]
    $StopPhysicalCopy,
    
    [Parameter(Position=5, Mandatory=$false, ValueFromPipeline=$true)]
    [switch]
    $PromoteVirtualCopy,
    
    [Parameter(Position=6, Mandatory=$false, ValueFromPipeline=$true)]
    [switch]
    $StopPromoteVirtualCopy,
    
    [Parameter(Position=7, Mandatory=$false, ValueFromPipeline=$true)]
    [System.String]
    $NewName,
    
    [Parameter(Position=8, Mandatory=$false, ValueFromPipeline=$true)]
    [System.String]
    $Comment,
    
    [Parameter(Position=9, Mandatory=$false, ValueFromPipeline=$true)]
    [String[]]
    $Members,
    
    [Parameter(Position=10, Mandatory=$false, ValueFromPipeline=$true)]
    [System.String]
    $Priority,

    [Parameter(Position=11, Mandatory=$false, ValueFromPipeline=$true)]
    $WsapiConnection = $global:WsapiConnection    
  )

  Begin 
  {
    # Test if connection exist
    Test-WSAPIConnection -WsapiConnection $WsapiConnection
  }

  Process 
  {
    Write-DebugLog "Running: Creation of the body hash" $Debug
    # Creation of the body hash
    $body = @{}
    $counter
    
    If ($AddMember) 
    {
          $body["action"] = 1
          $counter = $counter + 1
    }
    If ($RemoveMember) 
    {
          $body["action"] = 2
          $counter = $counter + 1
    }
    If ($ResyncPhysicalCopy) 
    {
          $body["action"] = 3
          $counter = $counter + 1
    }
    If ($StopPhysicalCopy) 
    {
          $body["action"] = 4
          $counter = $counter + 1
    }
    If ($PromoteVirtualCopy) 
    {
          $body["action"] = 5
          $counter = $counter + 1
    }
    If ($StopPromoteVirtualCopy) 
    {
          $body["action"] = 6
          $counter = $counter + 1
    }
    if($counter -gt 1)
    {
        return "Please Select Only One from [ AddMember | RemoveMember | ResyncPhysicalCopy | StopPhysicalCopy | PromoteVirtualCopy | StopPromoteVirtualCopy]. "
    }
    
    If ($NewName) 
    {
          $body["newName"] = "$($NewName)"
    }
    
    If ($Comment) 
    {
          $body["comment"] = "$($Comment)"
    }
    
    If ($Members) 
    {
          $body["setmembers"] = $Members
    }
    
    If ($Priority) 
    {    
        $a = "high","medium","low"
        $l=$Priority
        if($a -eq $l)
        {
            if($Priority -eq "high")
            {
                $body["priority"] = 1
            }    
            if($Priority -eq "medium")
            {
                $body["priority"] = 2
            }
            if($Priority -eq "low")
            {
                $body["priority"] = 3
            }
        }
        else
        { 
            Write-DebugLog "Stop: Exiting Since -Priority $Priority in incorrect "
            Return "FAILURE : -Priority :- $Priority is an Incorrect Priority [high | medium | low] can be used only . "
        } 
    }
    
    $Result = $null    
    $uri = '/hostsets/'+$HostSetName 
    
    #Request
    Write-DebugLog "Request: Request to Update-HostSet_WSAPI : $HostSetName (Invoke-WSAPI)." $Debug
    $Result = Invoke-WSAPI -uri $uri -type 'PUT' -body $body -WsapiConnection $WsapiConnection
    
    if($Result.StatusCode -eq 200)
    {
        write-host ""
        write-host "Cmdlet executed successfully" -foreground green
        write-host ""
        Write-DebugLog "SUCCESS: Host Set:$HostSetName successfully Updated" $Info
                
        # Results
        if($NewName)
        {
            Get-HostSet_WSAPI -HostSetName $NewName
        }
        else
        {
            Get-HostSet_WSAPI -HostSetName $HostSetName
        }
        Write-DebugLog "End: Update-HostSet_WSAPI" $Debug
    }
    else
    {
        write-host ""
        write-host "FAILURE : While Updating Host Set: $HostSetName " -foreground red
        write-host ""
        Write-DebugLog "FAILURE : While Updating Host Set: $HostSetName " $Info
        
        return $Result.StatusDescription
    }
  }

  End {  }

}#END Update-HostSet_WSAPI

############################################################################################################################################
## FUNCTION Remove-HostSet_WSAPI
############################################################################################################################################
Function Remove-HostSet_WSAPI
 {
  <#
  .SYNOPSIS
    Remove a Host Set.
  
  .DESCRIPTION
    Remove a Host Set.
    Any user with Super or Edit role, or any role granted host_remove permission, can perform this operation. Requires access to all domains.
        
  .EXAMPLE
    Remove-HostSet_WSAPI -HostSetName MyHostSet
    
  .PARAMETER HostSetName
    Specify the name of Host Set to be removed.

  .PARAMETER WsapiConnection
    WSAPI Connection object created with Connection command
    
  .Notes
    NAME : Remove-HostSet_WSAPI
    LASTEDIT: February 2020
    KEYWORDS: Remove-HostSet_WSAPI
   
  .Link
     http://www.hpe.com
 
  #Requires PS -Version 3.0
  #>

  [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')]
  Param(
    [Parameter(Mandatory = $true,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Specifies the name of Host Set.')]
    [String]$HostSetName,
    
    [Parameter(Mandatory=$false, ValueFromPipeline=$true , HelpMessage = 'Connection Paramater')]
    $WsapiConnection = $global:WsapiConnection
    )
  Begin 
  {
    # Test if connection exist
    Test-WSAPIConnection -WsapiConnection $WsapiConnection
  }

  Process 
  {    
    #Build uri
    Write-DebugLog "Running: Building uri to Remove-HostSet_WSAPI." $Debug
    $uri = '/hostsets/'+$HostSetName
    
    $Result = $null

    #Request
    Write-DebugLog "Request: Request to Remove-HostSet_WSAPI : $HostSetName (Invoke-WSAPI)." $Debug
    $Result = Invoke-WSAPI -uri $uri -type 'DELETE' -WsapiConnection $WsapiConnection
    
    $status = $Result.StatusCode
    if($status -eq 200)
    {
        write-host ""
        write-host "Cmdlet executed successfully" -foreground green
        write-host ""
        Write-DebugLog "SUCCESS: Host Set:$HostSetName successfully remove" $Info
        Write-DebugLog "End: Remove-HostSet_WSAPI" $Debug
        
        return ""
    }
    else
    {
        write-host ""
        write-host "FAILURE : While Removing Host Set:$HostSetName " -foreground red
        write-host ""
        Write-DebugLog "FAILURE : While creating Host Set:$HostSetName " $Info
        Write-DebugLog "End: Remove-HostSet_WSAPI" $Debug
        
        return $Result.StatusDescription
    }    
    
  }
  End {}  
}
#END Remove-HostSet_WSAPI

############################################################################################################################################
## FUNCTION Get-HostSet_WSAPI
############################################################################################################################################
Function Get-HostSet_WSAPI 
{
  <#
  .SYNOPSIS
    Get Single or list of Hotes Set.
  
  .DESCRIPTION
    Get Single or list of Hotes Set.
        
  .EXAMPLE
    Get-HostSet_WSAPI
    Display a list of Hotes Set.
    
  .EXAMPLE
    Get-HostSet_WSAPI -HostSetName MyHostSet
    Get the information of given Hotes Set.
    
  .EXAMPLE
    Get-HostSet_WSAPI -Members MyHost
    Get the information of Hotes Set that contain MyHost as Member.
    
  .EXAMPLE
    Get-HostSet_WSAPI -Members "MyHost,MyHost1,MyHost2"
    Multiple Members.
    
  .EXAMPLE
    Get-HostSet_WSAPI -Id 10
    Filter Host Set with Id
    
  .EXAMPLE
    Get-HostSet_WSAPI -Uuid 10
    Filter Host Set with uuid
    
  .EXAMPLE
    Get-HostSet_WSAPI -Members "MyHost,MyHost1,MyHost2" -Id 10 -Uuid 10
    Multiple Filter
    
  .PARAMETER HostSetName
    Specify name of the Hotes Set.
    
  .PARAMETER Members
    Specify name of the Hotes.

  .PARAMETER Id
    Specify id of the Hotes Set.
    
  .PARAMETER Uuid
    Specify uuid of the Hotes Set.
 
  .PARAMETER WsapiConnection
    WSAPI Connection object created with Connection command
 
  .Notes
    NAME : Get-HostSet_WSAPI
    LASTEDIT: February 2020
    KEYWORDS: Get-HostSet_WSAPI
   
  .Link
     http://www.hpe.com
 
  #Requires PS -Version 3.0
  #>


  [CmdletBinding()]
  Param(
      [Parameter(Position=0, Mandatory=$false, ValueFromPipeline=$true)]
      [System.String]
      $HostSetName,
      
      [Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$true)]
      [System.String]
      $Members,
      
      [Parameter(Position=3, Mandatory=$false, ValueFromPipeline=$true)]
      [System.String]
      $Id,
      
      [Parameter(Position=4, Mandatory=$false, ValueFromPipeline=$true)]
      [System.String]
      $Uuid,
      
      [Parameter(Position=5, Mandatory=$false, ValueFromPipeline=$true)]
      $WsapiConnection = $global:WsapiConnection
  )

  Begin 
  {
    # Test if connection exist
    Test-WSAPIConnection -WsapiConnection $WsapiConnection     
  }

  Process 
  {
    Write-DebugLog "Request: Request to Get-HostSet_WSAPI HostSetName : $HostSetName (Invoke-WSAPI)." $Debug
    #Request
    
    $Result = $null
    $dataPS = $null        
    $Query="?query="" """
    
    # Results
    if($HostSetName)
    {
        #Build uri
        $uri = '/hostsets/'+$HostSetName
        #Request
        $Result = Invoke-WSAPI -uri $uri -type 'GET' -WsapiConnection $WsapiConnection
        If($Result.StatusCode -eq 200)
        {
            $dataPS = $Result.content | ConvertFrom-Json
            
            write-host ""
            write-host "Cmdlet executed successfully" -foreground green
            write-host ""
            Write-DebugLog "SUCCESS: Get-HostSet_WSAPI successfully Executed." $Info
            
            return $dataPS
        }
        else
        {
            write-host ""
            write-host "FAILURE : While Executing Get-HostSet_WSAPI." -foreground red
            write-host ""
            Write-DebugLog "FAILURE : While Executing Get-HostSet_WSAPI. " $Info
            
            return $Result.StatusDescription
        }
    }
    if($Members)
    {        
        $count = 1
        $lista = $Members.split(",")
        foreach($sub in $lista)
        {            
            $Query = $Query.Insert($Query.Length-3," setmembers EQ $sub")            
            if($lista.Count -gt 1)
            {
                if($lista.Count -ne $count)
                {
                    $Query = $Query.Insert($Query.Length-3," OR ")
                    $count = $count + 1
                }                
            }
        }        
    }
    if($Id)
    {
        if($Members)
        {
            $Query = $Query.Insert($Query.Length-3," OR id EQ $Id")
        }
        else
        {
            $Query = $Query.Insert($Query.Length-3," id EQ $Id")
        }
    }
    if($Uuid)
    {
        if($Members -or $Id)
        {
            $Query = $Query.Insert($Query.Length-3," OR uuid EQ $Uuid")
        }
        else
        {
            $Query = $Query.Insert($Query.Length-3," uuid EQ $Uuid")
        }
    }
    
    if($Members -Or $Id -Or $Uuid)
    {
        #Build uri
        $uri = '/hostsets/'+$Query
        
        #Request
        $Result = Invoke-WSAPI -uri $uri -type 'GET' -WsapiConnection $WsapiConnection
        If($Result.StatusCode -eq 200)
        {            
            $dataPS = ($Result.content | ConvertFrom-Json).members            
        }
    }    
    else
    {
        #Request
        $Result = Invoke-WSAPI -uri '/hostsets' -type 'GET' -WsapiConnection $WsapiConnection
        If($Result.StatusCode -eq 200)
        {            
            $dataPS = ($Result.content | ConvertFrom-Json).members            
        }        
    }

    If($Result.StatusCode -eq 200)
    {
        if($dataPS.Count -gt 0)
        {
            write-host ""
            write-host "Cmdlet executed successfully" -foreground green
            write-host ""
            Write-DebugLog "SUCCESS: Get-HostSet_WSAPI successfully Executed." $Info
            
            return $dataPS
        }
        else
        {
            write-host ""
            write-host "FAILURE : While Executing Get-HostSet_WSAPI. Expected Result Not Found with Given Filter Option : Members/$Members Id/$Id Uuid/$Uuid." -foreground red
            write-host ""
            Write-DebugLog "FAILURE : While Executing Get-HostSet_WSAPI. Expected Result Not Found with Given Filter Option : Members/$Members Id/$Id Uuid/$Uuid." $Info
            
            return 
        }        
    }
    else
    {
        write-host ""
        write-host "FAILURE : While Executing Get-HostSet_WSAPI." -foreground red
        write-host ""
        Write-DebugLog "FAILURE : While Executing Get-HostSet_WSAPI. " $Info
        
        return $Result.StatusDescription
    }
  }
    End {}
}#END Get-HostSet_WSAPI

############################################################################################################################################
## FUNCTION New-VvSet_WSAPI
############################################################################################################################################
Function New-VvSet_WSAPI 
{
  <#
  
  .SYNOPSIS
    Creates a new virtual volume Set.
    
  .DESCRIPTION
    Creates a new virtual volume Set.
    Any user with the Super or Edit role can create a host set. Any role granted hostset_set permission can add hosts to a host set.
    You can add hosts to a host set using a glob-style pattern. A glob-style pattern is not supported when removing hosts from sets.
    For additional information about glob-style patterns, see “Glob-Style Patterns” in the HPE 3PAR Command Line Interface Reference.
    
  .EXAMPLE
    New-VvSet_WSAPI -VVSetName MyVVSet
    Creates a new virtual volume Set with name MyVVSet.
    
  .EXAMPLE
    New-VvSet_WSAPI -VVSetName MyVVSet -Comment "this Is Test Set" -Domain MyDomain
    Creates a new virtual volume Set with name MyVVSet.
    
  .EXAMPLE
    New-VvSet_WSAPI -VVSetName MyVVSet -Comment "this Is Test Set" -Domain MyDomain -SetMembers xxx
     Creates a new virtual volume Set with name MyVVSet with Set Members xxx.
    
  .EXAMPLE
    New-VvSet_WSAPI -VVSetName MyVVSet -Comment "this Is Test Set" -Domain MyDomain -SetMembers "xxx1,xxx2,xxx3"
    Creates a new virtual volume Set with name MyVVSet with Set Members xxx.
    
  .PARAMETER VVSetName
    Name of the virtual volume set to be created.
  
  .PARAMETER Comment
    Comment for the virtual volume set.
    
  .PARAMETER Domain
    The domain in which the virtual volume set will be created.
    
  .PARAMETER SetMembers
    The virtual volume to be added to the set. The existence of the hist will not be checked.

  .PARAMETER WsapiConnection
    WSAPI Connection object created with Connection command
    
  .Notes
    NAME : New-VvSet_WSAPI
    LASTEDIT: February 2020
    KEYWORDS: New-VvSet_WSAPI
   
  .Link
     http://www.hpe.com
 
  #Requires PS -Version 3.0
  
  #>

  [CmdletBinding()]
  Param(
      [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
      [System.String]
      $VVSetName,      
      
      [Parameter(Position=1, Mandatory=$false, ValueFromPipeline=$true)]
      [System.String]
      $Comment,    
      
      [Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$true)]
      [System.String]
      $Domain, 
      
      [Parameter(Position=3, Mandatory=$false, ValueFromPipeline=$true)]
      [String[]]
      $SetMembers,
      
      [Parameter(Position=4, Mandatory=$false, ValueFromPipeline=$true)]
      $WsapiConnection = $global:WsapiConnection
  )

  Begin 
  {
    # Test if connection exist
    Test-WSAPIConnection -WsapiConnection $WsapiConnection
  }

  Process 
  {
    # Creation of the body hash
    Write-DebugLog "Running: Creation of the body hash" $Debug
    $body = @{}    
    $body["name"] = "$($VVSetName)"
   
    If ($Comment) 
    {
        $body["comment"] = "$($Comment)"
    }  

    If ($Domain) 
    {
        $body["domain"] = "$($Domain)"
    }
    
    If ($SetMembers) 
    {
        $body["setmembers"] = $SetMembers
    }
    
    $Result = $null
    
    #Request
    $Result = Invoke-WSAPI -uri '/volumesets' -type 'POST' -body $body -WsapiConnection $WsapiConnection
    $status = $Result.StatusCode    
    if($status -eq 201)
    {
        write-host ""
        write-host "Cmdlet executed successfully" -foreground green
        write-host ""
        Write-DebugLog "SUCCESS: virtual volume Set:$VVSetName created successfully" $Info
        
        Get-VvSet_WSAPI -VVSetName $VVSetName
        Write-DebugLog "End: New-VvSet_WSAPI" $Debug
    }
    else
    {
        write-host ""
        write-host "FAILURE : While creating virtual volume Set:$VVSetName " -foreground red
        write-host ""
        Write-DebugLog "FAILURE : While creating virtual volume Set:$VVSetName " $Info
        
        return $Result.StatusDescription
    }    
  }
  End 
  {
  }  
}
#ENG New-VvSet_WSAPI

############################################################################################################################################
## FUNCTION Update-VvSet_WSAPI
############################################################################################################################################
Function Update-VvSet_WSAPI 
{
  <#
  .SYNOPSIS
    Update an existing virtual volume Set.
  
  .DESCRIPTION
    Update an existing virtual volume Set.
    Any user with the Super or Edit role can modify a host set. Any role granted hostset_set permission can add a host to the host set or remove a host from the host set.
    
  .EXAMPLE
    Update-VvSet_WSAPI -VVSetName xxx -RemoveMember -Members testvv3.0
    
  .EXAMPLE
    Update-VvSet_WSAPI -VVSetName xxx -AddMember -Members testvv3.0
    
  .EXAMPLE
    Update-VvSet_WSAPI -VVSetName xxx -ResyncPhysicalCopy
    
  .EXAMPLE
    Update-VvSet_WSAPI -VVSetName xxx -StopPhysicalCopy
    
  .EXAMPLE
    Update-VvSet_WSAPI -VVSetName xxx -PromoteVirtualCopy
    
  .EXAMPLE
    Update-VvSet_WSAPI -VVSetName xxx -StopPromoteVirtualCopy
    
  .EXAMPLE
    Update-VvSet_WSAPI -VVSetName xxx -Priority xyz
    
  .EXAMPLE
    Update-VvSet_WSAPI -VVSetName xxx -ResyncPhysicalCopy -Priority high
    
  .EXAMPLE
    Update-VvSet_WSAPI -VVSetName xxx -ResyncPhysicalCopy -Priority medium
    
  .EXAMPLE
    Update-VvSet_WSAPI -VVSetName xxx -ResyncPhysicalCopy -Priority low
    
  .EXAMPLE
    Update-VvSet_WSAPI -VVSetName xxx -NewName as-vvSet1 -Comment "Updateing new name"

  .PARAMETER VVSetName
    Existing virtual volume Name
    
  .PARAMETER AddMember
    Adds a member to the virtual volume set.
    
  .PARAMETER RemoveMember
    Removes a member from the virtual volume set.
    
  .PARAMETER ResyncPhysicalCopy
    Resynchronize the physical copy to its virtual volume set.
  
  .PARAMETER StopPhysicalCopy
    Stops the physical copy.
  
  .PARAMETER PromoteVirtualCopy
    Promote virtual copies in a virtual volume set.
    
  .PARAMETER StopPromoteVirtualCopy
    Stops the promote virtual copy operations in a virtual volume set.
    
  .PARAMETER NewName
    New name of the virtual volume set.
    
  .PARAMETER Comment
    New comment for the virtual volume set or host set.
    To remove the comment, use “”.

  .PARAMETER Members
    The volume to be added to or removed from the virtual volume set.
  
  .PARAMETER Priority
    1: high
    2: medium
    3: low
 
  .PARAMETER WsapiConnection
    WSAPI Connection object created with Connection command
 
  .Notes
    NAME : Update-VvSet_WSAPI
    LASTEDIT: February 2020
    KEYWORDS: Update-VvSet_WSAPI
   
  .Link
     http://www.hpe.com
 
  #Requires PS -Version 3.0
  #>


  [CmdletBinding()]
  Param(
    [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
    [System.String]
    $VVSetName,
    
    [Parameter(Position=1, Mandatory=$false, ValueFromPipeline=$true)]
    [switch]
    $AddMember,    
    
    [Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$true)]
    [switch]
    $RemoveMember,
    
    [Parameter(Position=3, Mandatory=$false, ValueFromPipeline=$true)]
    [switch]
    $ResyncPhysicalCopy,
    
    [Parameter(Position=4, Mandatory=$false, ValueFromPipeline=$true)]
    [switch]
    $StopPhysicalCopy,
    
    [Parameter(Position=5, Mandatory=$false, ValueFromPipeline=$true)]
    [switch]
    $PromoteVirtualCopy,
    
    [Parameter(Position=6, Mandatory=$false, ValueFromPipeline=$true)]
    [switch]
    $StopPromoteVirtualCopy,
    
    [Parameter(Position=7, Mandatory=$false, ValueFromPipeline=$true)]
    [System.String]
    $NewName,
    
    [Parameter(Position=8, Mandatory=$false, ValueFromPipeline=$true)]
    [System.String]
    $Comment,
    
    [Parameter(Position=9, Mandatory=$false, ValueFromPipeline=$true)]
    [String[]]
    $Members,
    
    [Parameter(Position=10, Mandatory=$false, ValueFromPipeline=$true)]
    [System.String]
    $Priority,

    [Parameter(Position=11, Mandatory=$false, ValueFromPipeline=$true)]
    $WsapiConnection = $global:WsapiConnection
  )

  Begin 
  {
    # Test if connection exist
    Test-WSAPIConnection -WsapiConnection $WsapiConnection
  }

  Process 
  {
    Write-DebugLog "Running: Creation of the body hash" $Debug
    # Creation of the body hash
    $body = @{}
    $counter
    
    If ($AddMember) 
    {
          $body["action"] = 1
          $counter = $counter + 1
    }
    If ($RemoveMember) 
    {
          $body["action"] = 2
          $counter = $counter + 1
    }
    If ($ResyncPhysicalCopy) 
    {
          $body["action"] = 3
          $counter = $counter + 1
    }
    If ($StopPhysicalCopy) 
    {
          $body["action"] = 4
          $counter = $counter + 1
    }
    If ($PromoteVirtualCopy) 
    {
          $body["action"] = 5
          $counter = $counter + 1
    }
    If ($StopPromoteVirtualCopy) 
    {
          $body["action"] = 6
          $counter = $counter + 1
    }
    if($counter -gt 1)
    {
        return "Please Select Only One from [ AddMember | RemoveMember | ResyncPhysicalCopy | StopPhysicalCopy | PromoteVirtualCopy | StopPromoteVirtualCopy]. "
    }
    
    If ($NewName) 
    {
          $body["newName"] = "$($NewName)"
    }
    
    If ($Comment) 
    {
          $body["comment"] = "$($Comment)"
    }
    
    If ($Members) 
    {
          $body["setmembers"] = $Members
    }
    
    If ($Priority) 
    {    
        $a = "high","medium","low"
        $l=$Priority
        if($a -eq $l)
        {
            if($Priority -eq "high")
            {
                $body["priority"] = 1
            }    
            if($Priority -eq "medium")
            {
                $body["priority"] = 2
            }
            if($Priority -eq "low")
            {
                $body["priority"] = 3
            }
        }
        else
        { 
            Write-DebugLog "Stop: Exiting Since -Priority $Priority in incorrect "
            Return "FAILURE : -Priority :- $Priority is an Incorrect Priority [high | medium | low] can be used only . "
        } 
    }
    
    $Result = $null    
    $uri = '/volumesets/'+$VVSetName 
    
    #Request
    Write-DebugLog "Request: Request to Update-VvSet_WSAPI : $VVSetName (Invoke-WSAPI)." $Debug
    $Result = Invoke-WSAPI -uri $uri -type 'PUT' -body $body -WsapiConnection $WsapiConnection
    
    if($Result.StatusCode -eq 200)
    {
        write-host ""
        write-host "Cmdlet executed successfully" -foreground green
        write-host ""
        Write-DebugLog "SUCCESS: virtual volume Set:$VVSetName successfully Updated" $Info
                
        # Results
        if($NewName)
        {
            Get-VvSet_WSAPI -VVSetName $NewName
        }
        else
        {
            Get-VvSet_WSAPI -VVSetName $VVSetName
        }
        Write-DebugLog "End: Update-VvSet_WSAPI" $Debug
    }
    else
    {
        write-host ""
        write-host "FAILURE : While Updating virtual volume Set: $VVSetName " -foreground red
        write-host ""
        Write-DebugLog "FAILURE : While Updating virtual volume Set: $VVSetName " $Info
        
        return $Result.StatusDescription
    }
  }

  End {  }

}#END Update-VvSet_WSAPI

############################################################################################################################################
## FUNCTION Remove-VvSet_WSAPI
############################################################################################################################################
Function Remove-VvSet_WSAPI
 {
  <#
  .SYNOPSIS
    Remove a virtual volume Set.
  
  .DESCRIPTION
    Remove a virtual volume Set.
    Any user with Super or Edit role, or any role granted host_remove permission, can perform this operation. Requires access to all domains.
        
  .EXAMPLE
    Remove-VvSet_WSAPI -VVSetName MyvvSet
    
  .PARAMETER VVSetName
    Specify the name of virtual volume Set to be removed.

  .PARAMETER WsapiConnection
    WSAPI Connection object created with Connection command
    
  .Notes
    NAME : Remove-VvSet_WSAPI
    LASTEDIT: February 2020
    KEYWORDS: Remove-VvSet_WSAPI
   
  .Link
     http://www.hpe.com
 
  #Requires PS -Version 3.0
  #>

  [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High')]
  Param(
    [Parameter(Mandatory = $true,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'Specifies the name of virtual volume Set.')]
    [String]$VVSetName,
    
    [Parameter(Mandatory=$false, ValueFromPipeline=$true , HelpMessage = 'Connection Paramater')]
    $WsapiConnection = $global:WsapiConnection
    )
  Begin 
  {
    # Test if connection exist
    Test-WSAPIConnection -WsapiConnection $WsapiConnection
  }

  Process 
  {    
    #Build uri
    Write-DebugLog "Running: Building uri to Remove-VvSet_WSAPI." $Debug
    $uri = '/volumesets/'+$VVSetName
    
    $Result = $null

    #Request
    Write-DebugLog "Request: Request to Remove-VvSet_WSAPI : $VVSetName (Invoke-WSAPI)." $Debug
    $Result = Invoke-WSAPI -uri $uri -type 'DELETE' -WsapiConnection $WsapiConnection
    
    $status = $Result.StatusCode
    if($status -eq 200)
    {
        write-host ""
        write-host "Cmdlet executed successfully" -foreground green
        write-host ""
        Write-DebugLog "SUCCESS: virtual volume Set:$VVSetName successfully remove" $Info
        Write-DebugLog "End: Remove-VvSet_WSAPI" $Debug
        
        return ""
    }
    else
    {
        write-host ""
        write-host "FAILURE : While Removing virtual volume Set:$VVSetName " -foreground red
        write-host ""
        Write-DebugLog "FAILURE : While creating virtual volume Set:$VVSetName " $Info
        Write-DebugLog "End: Remove-VvSet_WSAPI" $Debug
        
        return $Result.StatusDescription
    }    
    
  }
  End {}  
}
#END Remove-VvSet_WSAPI

############################################################################################################################################
## FUNCTION Get-VvSet_WSAPI
############################################################################################################################################
Function Get-VvSet_WSAPI 
{
  <#
  .SYNOPSIS
    Get Single or list of virtual volume Set.
  
  .DESCRIPTION
    Get Single or list of virtual volume Set.
        
  .EXAMPLE
    Get-VvSet_WSAPI
    Display a list of virtual volume Set.
    
  .EXAMPLE
    Get-VvSet_WSAPI -VVSetName MyvvSet
    Get the information of given virtual volume Set.
    
  .EXAMPLE
    Get-VvSet_WSAPI -Members Myvv
    Get the information of virtual volume Set that contain MyHost as Member.
    
  .EXAMPLE
    Get-VvSet_WSAPI -Members "Myvv,Myvv1,Myvv2"
    Multiple Members.
    
  .EXAMPLE
    Get-VvSet_WSAPI -Id 10
    Filter virtual volume Set with Id
    
  .EXAMPLE
    Get-VvSet_WSAPI -Uuid 10
    Filter virtual volume Set with uuid
    
  .EXAMPLE
    Get-VvSet_WSAPI -Members "Myvv,Myvv1,Myvv2" -Id 10 -Uuid 10
    Multiple Filter
    
  .PARAMETER VVSetName
    Specify name of the virtual volume Set.
    
  .PARAMETER Members
    Specify name of the virtual volume.

  .PARAMETER Id
    Specify id of the virtual volume Set.
    
  .PARAMETER Uuid
    Specify uuid of the virtual volume Set.
 
  .PARAMETER WsapiConnection
    WSAPI Connection object created with Connection command
 
  .Notes
    NAME : Get-VvSet_WSAPI
    LASTEDIT: February 2020
    KEYWORDS: Get-VvSet_WSAPI
   
  .Link
     http://www.hpe.com
 
  #Requires PS -Version 3.0
  #>


  [CmdletBinding()]
  Param(
      [Parameter(Position=0, Mandatory=$false, ValueFromPipeline=$true)]
      [System.String]
      $VVSetName,
      
      [Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$true)]
      [System.String]
      $Members,
      
      [Parameter(Position=3, Mandatory=$false, ValueFromPipeline=$true)]
      [System.String]
      $Id,
      
      [Parameter(Position=4, Mandatory=$false, ValueFromPipeline=$true)]
      [System.String]
      $Uuid,
      
      [Parameter(Position=0, Mandatory=$false, ValueFromPipeline=$true)]
      $WsapiConnection = $global:WsapiConnection
  )

  Begin 
  {
    # Test if connection exist
    Test-WSAPIConnection -WsapiConnection $WsapiConnection     
  }

  Process 
  {
    Write-DebugLog "Request: Request to Get-VvSet_WSAPI VVSetName : $VVSetName (Invoke-WSAPI)." $Debug
    #Request
    
    $Result = $null
    $dataPS = $null        
    $Query="?query="" """
    
    # Results
    if($VVSetName)
    {
        #Build uri
        $uri = '/volumesets/'+$VVSetName
        #Request
        $Result = Invoke-WSAPI -uri $uri -type 'GET' -WsapiConnection $WsapiConnection         
        If($Result.StatusCode -eq 200)
        {
            $dataPS = $Result.content | ConvertFrom-Json
            
            write-host ""
            write-host "Cmdlet executed successfully" -foreground green
            write-host ""
            Write-DebugLog "SUCCESS: Get-VvSet_WSAPI successfully Executed." $Info
            
            return $dataPS
        }
        else
        {
            write-host ""
            write-host "FAILURE : While Executing Get-VvSet_WSAPI." -foreground red
            write-host ""
            Write-DebugLog "FAILURE : While Executing Get-VvSet_WSAPI. " $Info
            
            return $Result.StatusDescription
        }
    }
    if($Members)
    {        
        $count = 1
        $lista = $Members.split(",")
        foreach($sub in $lista)
        {            
            $Query = $Query.Insert($Query.Length-3," setmembers EQ $sub")            
            if($lista.Count -gt 1)
            {
                if($lista.Count -ne $count)
                {
                    $Query = $Query.Insert($Query.Length-3," OR ")
                    $count = $count + 1
                }                
            }
        }        
    }
    if($Id)
    {
        if($Members)
        {
            $Query = $Query.Insert($Query.Length-3," OR id EQ $Id")
        }
        else
        {
            $Query = $Query.Insert($Query.Length-3," id EQ $Id")
        }
    }
    if($Uuid)
    {
        if($Members -or $Id)
        {
            $Query = $Query.Insert($Query.Length-3," OR uuid EQ $Uuid")
        }
        else
        {
            $Query = $Query.Insert($Query.Length-3," uuid EQ $Uuid")
        }
    }
    
    if($Members -Or $Id -Or $Uuid)
    {
        #Build uri
        $uri = '/volumesets/'+$Query
        
        #Request
        $Result = Invoke-WSAPI -uri $uri -type 'GET' -WsapiConnection $WsapiConnection    
        If($Result.StatusCode -eq 200)
        {            
            $dataPS = ($Result.content | ConvertFrom-Json).members            
        }
    }    
    else
    {
        #Request
        $Result = Invoke-WSAPI -uri '/volumesets' -type 'GET' -WsapiConnection $WsapiConnection
        If($Result.StatusCode -eq 200)
        {            
            $dataPS = ($Result.content | ConvertFrom-Json).members            
        }        
    }

    If($Result.StatusCode -eq 200)
    {
        if($dataPS.Count -gt 0)
        {
            write-host ""
            write-host "Cmdlet executed successfully" -foreground green
            write-host ""
            Write-DebugLog "SUCCESS: Get-VvSet_WSAPI successfully Executed." $Info
            
            return $dataPS
        }
        else
        {
            write-host ""
            write-host "FAILURE : While Executing Get-VvSet_WSAPI. Expected Result Not Found with Given Filter Option : Members/$Members Id/$Id Uuid/$Uuid." -foreground red
            write-host ""
            Write-DebugLog "FAILURE : While Executing Get-VvSet_WSAPI. Expected Result Not Found with Given Filter Option : Members/$Members Id/$Id Uuid/$Uuid." $Info
            
            return 
        }
    }
    else
    {
        write-host ""
        write-host "FAILURE : While Executing Get-VvSet_WSAPI." -foreground red
        write-host ""
        Write-DebugLog "FAILURE : While Executing Get-VvSet_WSAPI. " $Info
        
        return $Result.StatusDescription
    }
  }
    End {}
}#END Get-VvSet_WSAPI

############################################################################################################################################
## FUNCTION Set-VvSetFlashCachePolicy_WSAPI
############################################################################################################################################
Function Set-VvSetFlashCachePolicy_WSAPI 
{
  <#
  .SYNOPSIS
    Setting a VV-set Flash Cache policy.
    
  .DESCRIPTION
    Setting a VV-set Flash Cache policy.
    
  .EXAMPLE
    Set-VvSetFlashCachePolicy_WSAPI
    
  .PARAMETER VvSet
    Name Of the VV-set to Set Flash Cache policy.
  
  .PARAMETER Enable
    To Enable VV-set Flash Cache policy
    
  .PARAMETER Disable
    To Disable VV-set Flash Cache policy
    
  .PARAMETER WsapiConnection
    WSAPI Connection object created with Connection command
  
  .Notes
    NAME : Set-VvSetFlashCachePolicy_WSAPI
    LASTEDIT: February 2020
    KEYWORDS: Set-VvSetFlashCachePolicy_WSAPI
   
  .Link
     http://www.hpe.com
 
  #Requires PS -Version 3.0
  #>


  [CmdletBinding()]
  Param(
      [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
      [System.String]
      $VvSet,
      
      [Parameter(Position=1, Mandatory=$false, ValueFromPipeline=$true)]
      [Switch]
      $Enable,
      
      [Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$true)]
      [Switch]
      $Disable,
      
      [Parameter(Position=3, Mandatory=$false, ValueFromPipeline=$true)]
      $WsapiConnection = $global:WsapiConnection
      
      )

  Begin 
  {
    # Test if connection exist
    Test-WSAPIConnection -WsapiConnection $WsapiConnection
  }

  Process 
  {
    $Massage = ""
    Write-DebugLog "Running: Creation of the body hash" $Debug
    # Creation of the body hash
    $body = @{}        
    
    If($Enable) 
    {
        $body["flashCachePolicy"] = 1
        $Massage = "Enable"
    }        
    elseIf($Disable) 
    {
        $body["flashCachePolicy"] = 2 
        $Massage = "Disable"
    }
    else
    {
        $body["flashCachePolicy"] = 2 
        $Massage = "Default (Disable)"
    }        
    
    $Result = $null
        
    #Request
    Write-DebugLog "Request: Request to Set-VvSetFlashCachePolicy_WSAPI(Invoke-WSAPI)." $Debug    
    
    #Request
    $uri = '/volumesets/'+$VvSet
    
    $Result = Invoke-WSAPI -uri $uri -type 'PUT' -body $body -WsapiConnection $WsapiConnection
    
    $status = $Result.StatusCode
    if($status -eq 200)
    {
        write-host ""
        write-host "Cmdlet executed successfully" -foreground green
        write-host ""
        Write-DebugLog "SUCCESS: Successfully Set Flash Cache policy $Massage to vv-set $VvSet." $Info
                
        # Results
        return $Result
        Write-DebugLog "End: Set-VvSetFlashCachePolicy_WSAPI" $Debug
    }
    else
    {
        write-host ""
        write-host "FAILURE : While Setting Flash Cache policy $Massage to vv-set $VvSet." -foreground red
        write-host ""
        Write-DebugLog "FAILURE : VV-set Flash Cache policy To $Massage." $Info
        
        return $Result.StatusDescription
    }
  }

  End {  }

}#END Set-VvSetFlashCachePolicy_WSAPI


Export-ModuleMember New-HostSet_WSAPI , Update-HostSet_WSAPI , Remove-HostSet_WSAPI , Get-HostSet_WSAPI , New-VvSet_WSAPI ,
Update-VvSet_WSAPI , Remove-VvSet_WSAPI , Get-VvSet_WSAPI , Set-VvSetFlashCachePolicy_WSAPI
# SIG # Begin signature block
# MIIh0AYJKoZIhvcNAQcCoIIhwTCCIb0CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCtdu3VLajF+VSe
# PLJ8Byal3r763Rkm5Ieljt0uOU7tZqCCEKswggUpMIIEEaADAgECAhB4Lu4fcD9z
# xUgD+jf1OoqlMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAkdCMRswGQYDVQQI
# ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoT
# D1NlY3RpZ28gTGltaXRlZDEkMCIGA1UEAxMbU2VjdGlnbyBSU0EgQ29kZSBTaWdu
# aW5nIENBMB4XDTIxMDUyODAwMDAwMFoXDTIyMDUyODIzNTk1OVowgZAxCzAJBgNV
# BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRIwEAYDVQQHDAlQYWxvIEFsdG8x
# KzApBgNVBAoMIkhld2xldHQgUGFja2FyZCBFbnRlcnByaXNlIENvbXBhbnkxKzAp
# BgNVBAMMIkhld2xldHQgUGFja2FyZCBFbnRlcnByaXNlIENvbXBhbnkwggEiMA0G
# CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDmclZSXJBXA55ijwwFymuq+Y4F/quF
# mm2vRdEmjFhzRvTpnGjIYtVcG11ka4JGCROmNVDZGAelnqcXn5DKO710j5SICTBC
# 5gXOLwga7usifs21W+lVT0BsZTiUnFu4hEhuFTlahJIEvPGVgO1GBcuItD2QqB4q
# 9j15GDI5nGBSzIyJKMctcIalxsTSPG1kiDbLkdfsIivhe9u9m8q6NRqDUaYYQTN+
# /qGCqVNannMapH8tNHqFb6VdzUFI04t7kFtSk00AkdD6qUvA4u8mL2bUXAYz8K5m
# nrFs+ckx5Yqdxfx68EO26Bt2qbz/oTHxE6FiVzsDl90bcUAah2l976ebAgMBAAGj
# ggGQMIIBjDAfBgNVHSMEGDAWgBQO4TqoUzox1Yq+wbutZxoDha00DjAdBgNVHQ4E
# FgQUlC56g+JaYFsl5QWK2WDVOsG+pCEwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB
# /wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZIAYb4QgEBBAQDAgQQMEoG
# A1UdIARDMEEwNQYMKwYBBAGyMQECAQMCMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8v
# c2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEATBDBgNVHR8EPDA6MDigNqA0hjJodHRw
# Oi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29SU0FDb2RlU2lnbmluZ0NBLmNybDBz
# BggrBgEFBQcBAQRnMGUwPgYIKwYBBQUHMAKGMmh0dHA6Ly9jcnQuc2VjdGlnby5j
# b20vU2VjdGlnb1JTQUNvZGVTaWduaW5nQ0EuY3J0MCMGCCsGAQUFBzABhhdodHRw
# Oi8vb2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAY+1n2UUlQU6Z
# VoEVaZKqZf/zrM/d7Kbx+S/t8mR2E+uNXStAnwztElqrm3fSr+5LMRzBhrYiSmea
# w9c/0c7qFO9mt8RR2q2uj0Huf+oAMh7TMuMKZU/XbT6tS1e15B8ZhtqOAhmCug6s
# DuNvoxbMpokYevpa24pYn18ELGXOUKlqNUY2qOs61GVvhG2+V8Hl/pajE7yQ4diz
# iP7QjMySms6BtZV5qmjIFEWKY+UTktUcvN4NVA2J0TV9uunDbHRt4xdY8TF/Clgz
# Z/MQHJ/X5yX6kupgDeN2t3o+TrColetBnwk/SkJEsUit0JapAiFUx44j4w61Qanb
# Zmi0tr8YGDCCBYEwggRpoAMCAQICEDlyRDr5IrdR19NsEN0xNZUwDQYJKoZIhvcN
# AQEMBQAwezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3Rl
# cjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQx
# ITAfBgNVBAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0xOTAzMTIwMDAw
# MDBaFw0yODEyMzEyMzU5NTlaMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3
# IEplcnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VS
# VFJVU1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0
# aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIAS
# ZRc2DsPbCLPQrFcNdu3NJ9NMrVCDYeKqIE0JLWQJ3M6Jn8w9qez2z8Hc8dOx1ns3
# KBErR9o5xrw6GbRfpr19naNjQrZ28qk7K5H44m/Q7BYgkAk+4uh0yRi0kdRiZNt/
# owbxiBhqkCI8vP4T8IcUe/bkH47U5FHGEWdGCFHLhhRUP7wz/n5snP8WnRi9UY41
# pqdmyHJn2yFmsdSbeAPAUDrozPDcvJ5M/q8FljUfV1q3/875PbcstvZU3cjnEjpN
# rkyKt1yatLcgPcp/IjSufjtoZgFE5wFORlObM2D3lL5TN5BzQ/Myw1Pv26r+dE5p
# x2uMYJPexMcM3+EyrsyTO1F4lWeL7j1W/gzQaQ8bD/MlJmszbfduR/pzQ+V+DqVm
# sSl8MoRjVYnEDcGTVDAZE6zTfTen6106bDVc20HXEtqpSQvf2ICKCZNijrVmzyWI
# zYS4sT+kOQ/ZAp7rEkyVfPNrBaleFoPMuGfi6BOdzFuC00yz7Vv/3uVzrCM7LQC/
# NVV0CUnYSVgaf5I25lGSDvMmfRxNF7zJ7EMm0L9BX0CpRET0medXh55QH1dUqD79
# dGMvsVBlCeZYQi5DGky08CVHWfoEHpPUJkZKUIGy3r54t/xnFeHJV4QeD2PW6WK6
# 1l9VLupcxigIBCU5uA4rqfJMlxwHPw1S9e3vL4IPAgMBAAGjgfIwge8wHwYDVR0j
# BBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYEFFN5v1qqK0rPVIDh
# 2JvAnfKyA2bLMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MBEGA1Ud
# IAQKMAgwBgYEVR0gADBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsLmNvbW9k
# b2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDA0BggrBgEFBQcBAQQo
# MCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG
# 9w0BAQwFAAOCAQEAGIdR3HQhPZyK4Ce3M9AuzOzw5steEd4ib5t1jp5y/uTW/qof
# nJYt7wNKfq70jW9yPEM7wD/ruN9cqqnGrvL82O6je0P2hjZ8FODN9Pc//t64tIrw
# kZb+/UNkfv3M0gGhfX34GRnJQisTv1iLuqSiZgR2iJFODIkUzqJNyTKzuugUGrxx
# 8VvwQQuYAAoiAxDlDLH5zZI3Ge078eQ6tvlFEyZ1r7uq7z97dzvSxAKRPRkA0xdc
# Ods/exgNRc2ThZYvXd9ZFk8/Ub3VRRg/7UqO6AZhdCMWtQ1QcydER38QXYkqa4Ux
# FMToqWpMgLxqeM+4f452cpkMnf7XkQgWoaNflTCCBfUwggPdoAMCAQICEB2iSDBv
# myYY0ILgln0z02owDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMV
# VGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENl
# cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE4MTEwMjAwMDAwMFoXDTMwMTIzMTIz
# NTk1OVowfDELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3Rl
# cjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQw
# IgYDVQQDExtTZWN0aWdvIFJTQSBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3
# DQEBAQUAA4IBDwAwggEKAoIBAQCGIo0yhXoYn0nwli9jCB4t3HyfFM/jJrYlZilA
# hlRGdDFixRDtsocnppnLlTDAVvWkdcapDlBipVGREGrgS2Ku/fD4GKyn/+4uMyD6
# DBmJqGx7rQDDYaHcaWVtH24nlteXUYam9CflfGqLlR5bYNV+1xaSnAAvaPeX7Wpy
# vjg7Y96Pv25MQV0SIAhZ6DnNj9LWzwa0VwW2TqE+V2sfmLzEYtYbC43HZhtKn52B
# xHJAteJf7wtF/6POF6YtVbC3sLxUap28jVZTxvC6eVBJLPcDuf4vZTXyIuosB69G
# 2flGHNyMfHEo8/6nxhTdVZFuihEN3wYklX0Pp6F8OtqGNWHTAgMBAAGjggFkMIIB
# YDAfBgNVHSMEGDAWgBRTeb9aqitKz1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQUDuE6
# qFM6MdWKvsG7rWcaA4WtNA4wDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYB
# Af8CAQAwHQYDVR0lBBYwFAYIKwYBBQUHAwMGCCsGAQUFBwMIMBEGA1UdIAQKMAgw
# BgYEVR0gADBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLnVzZXJ0cnVzdC5j
# b20vVVNFUlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5jcmwwdgYIKwYB
# BQUHAQEEajBoMD8GCCsGAQUFBzAChjNodHRwOi8vY3J0LnVzZXJ0cnVzdC5jb20v
# VVNFUlRydXN0UlNBQWRkVHJ1c3RDQS5jcnQwJQYIKwYBBQUHMAGGGWh0dHA6Ly9v
# Y3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggIBAE1jUO1HNEphpNve
# aiqMm/EAAB4dYns61zLC9rPgY7P7YQCImhttEAcET7646ol4IusPRuzzRl5ARokS
# 9At3WpwqQTr81vTr5/cVlTPDoYMot94v5JT3hTODLUpASL+awk9KsY8k9LOBN9O3
# ZLCmI2pZaFJCX/8E6+F0ZXkI9amT3mtxQJmWunjxucjiwwgWsatjWsgVgG10Xkp1
# fqW4w2y1z99KeYdcx0BNYzX2MNPPtQoOCwR/oEuuu6Ol0IQAkz5TXTSlADVpbL6f
# ICUQDRn7UJBhvjmPeo5N9p8OHv4HURJmgyYZSJXOSsnBf/M6BZv5b9+If8AjntIe
# Q3pFMcGcTanwWbJZGehqjSkEAnd8S0vNcL46slVaeD68u28DECV3FTSK+TbMQ5Lk
# uk/xYpMoJVcp+1EZx6ElQGqEV8aynbG8HArafGd+fS7pKEwYfsR7MUFxmksp7As9
# V1DSyt39ngVR5UR43QHesXWYDVQk/fBO4+L4g71yuss9Ou7wXheSaG3IYfmm8SoK
# C6W59J7umDIFhZ7r+YMp08Ysfb06dy6LN0KgaoLtO0qqlBCk4Q34F8W2WnkzGJLj
# tXX4oemOCiUe5B7xn1qHI/+fpFGe+zmAEc3btcSnqIBv5VPU4OOiwtJbGvoyJi1q
# V3AcPKRYLqPzW0sH3DJZ84enGm1YMYIQezCCEHcCAQEwgZAwfDELMAkGA1UEBhMC
# R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9y
# ZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSQwIgYDVQQDExtTZWN0aWdvIFJT
# QSBDb2RlIFNpZ25pbmcgQ0ECEHgu7h9wP3PFSAP6N/U6iqUwDQYJYIZIAWUDBAIB
# BQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIB
# BDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQg
# aejtam3fcBzRxXaMCo3ljWMut2eE6l8cYpoH5OeQu9wwDQYJKoZIhvcNAQEBBQAE
# ggEASHmjTvUgcxlQCEI5vFMSw2nBarqMF4fOC1Owczad3E8kyiIhf74JnZnVMFNE
# UtwdbfHYwkFtBO9M//42eeau8oI3uuhsY1BPSNhHyO63tOjhULYdza/RZmfwS/DH
# RpqWNjdrK4/rzzAZRTI7ZOpyfLX4WJcDt+FqAZB7KRA2kIqygd3BBuQ87Weg6Xgp
# 4PPZ2iOepvJIj2fDHupeYiJKTeMKjCpebJlCZK9sRepjVezJOMk2vDa0rsHfc8TS
# lch0SsRSziN5dFllqHWfmPEc6wg+BKA9l4QWH2oGMwbp8jUyiO9dwcOM5bJT1zJ/
# 3b2UUpX/m9omBuib7URE5D8PgqGCDj0wgg45BgorBgEEAYI3AwMBMYIOKTCCDiUG
# CSqGSIb3DQEHAqCCDhYwgg4SAgEDMQ0wCwYJYIZIAWUDBAIBMIIBDwYLKoZIhvcN
# AQkQAQSggf8EgfwwgfkCAQEGC2CGSAGG+EUBBxcDMDEwDQYJYIZIAWUDBAIBBQAE
# IDY2jv1MYD/O9+WCalbRbMiRCkK474V7/aUxF+dbhHG+AhUAk34aH9ppiFMttRLr
# e1jYPwU/bbUYDzIwMjEwNjE5MDUxOTEyWjADAgEeoIGGpIGDMIGAMQswCQYDVQQG
# EwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsTFlN5
# bWFudGVjIFRydXN0IE5ldHdvcmsxMTAvBgNVBAMTKFN5bWFudGVjIFNIQTI1NiBU
# aW1lU3RhbXBpbmcgU2lnbmVyIC0gRzOgggqLMIIFODCCBCCgAwIBAgIQewWx1Elo
# UUT3yYnSnBmdEjANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UEBhMCVVMxFzAVBgNV
# BAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
# b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
# b3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9v
# dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNjAxMTIwMDAwMDBaFw0zMTAx
# MTEyMzU5NTlaMHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRTeW1hbnRlYyBDb3Jw
# b3JhdGlvbjEfMB0GA1UECxMWU3ltYW50ZWMgVHJ1c3QgTmV0d29yazEoMCYGA1UE
# AxMfU3ltYW50ZWMgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTCCASIwDQYJKoZIhvcN
# AQEBBQADggEPADCCAQoCggEBALtZnVlVT52Mcl0agaLrVfOwAa08cawyjwVrhpon
# ADKXak3JZBRLKbvC2Sm5Luxjs+HPPwtWkPhiG37rpgfi3n9ebUA41JEG50F8eRzL
# y60bv9iVkfPw7mz4rZY5Ln/BJ7h4OcWEpe3tr4eOzo3HberSmLU6Hx45ncP0mqj0
# hOHE0XxxxgYptD/kgw0mw3sIPk35CrczSf/KO9T1sptL4YiZGvXA6TMU1t/HgNuR
# 7v68kldyd/TNqMz+CfWTN76ViGrF3PSxS9TO6AmRX7WEeTWKeKwZMo8jwTJBG1kO
# qT6xzPnWK++32OTVHW0ROpL2k8mc40juu1MO1DaXhnjFoTcCAwEAAaOCAXcwggFz
# MA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMGYGA1UdIARfMF0w
# WwYLYIZIAYb4RQEHFwMwTDAjBggrBgEFBQcCARYXaHR0cHM6Ly9kLnN5bWNiLmNv
# bS9jcHMwJQYIKwYBBQUHAgIwGRoXaHR0cHM6Ly9kLnN5bWNiLmNvbS9ycGEwLgYI
# KwYBBQUHAQEEIjAgMB4GCCsGAQUFBzABhhJodHRwOi8vcy5zeW1jZC5jb20wNgYD
# VR0fBC8wLTAroCmgJ4YlaHR0cDovL3Muc3ltY2IuY29tL3VuaXZlcnNhbC1yb290
# LmNybDATBgNVHSUEDDAKBggrBgEFBQcDCDAoBgNVHREEITAfpB0wGzEZMBcGA1UE
# AxMQVGltZVN0YW1wLTIwNDgtMzAdBgNVHQ4EFgQUr2PWyqNOhXLgp7xB8ymiOH+A
# dWIwHwYDVR0jBBgwFoAUtnf6aUhHn1MS1cLqBzJ2B9GXBxkwDQYJKoZIhvcNAQEL
# BQADggEBAHXqsC3VNBlcMkX+DuHUT6Z4wW/X6t3cT/OhyIGI96ePFeZAKa3mXfSi
# 2VZkhHEwKt0eYRdmIFYGmBmNXXHy+Je8Cf0ckUfJ4uiNA/vMkC/WCmxOM+zWtJPI
# TJBjSDlAIcTd1m6JmDy1mJfoqQa3CcmPU1dBkC/hHk1O3MoQeGxCbvC2xfhhXFL1
# TvZrjfdKer7zzf0D19n2A6gP41P3CnXsxnUuqmaFBJm3+AZX4cYO9uiv2uybGB+q
# ueM6AL/OipTLAduexzi7D1Kr0eOUA2AKTaD+J20UMvw/l0Dhv5mJ2+Q5FL3a5NPD
# 6itas5VYVQR9x5rsIwONhSrS/66pYYEwggVLMIIEM6ADAgECAhB71OWvuswHP6EB
# IwQiQU0SMA0GCSqGSIb3DQEBCwUAMHcxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRT
# eW1hbnRlYyBDb3Jwb3JhdGlvbjEfMB0GA1UECxMWU3ltYW50ZWMgVHJ1c3QgTmV0
# d29yazEoMCYGA1UEAxMfU3ltYW50ZWMgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTAe
# Fw0xNzEyMjMwMDAwMDBaFw0yOTAzMjIyMzU5NTlaMIGAMQswCQYDVQQGEwJVUzEd
# MBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVj
# IFRydXN0IE5ldHdvcmsxMTAvBgNVBAMTKFN5bWFudGVjIFNIQTI1NiBUaW1lU3Rh
# bXBpbmcgU2lnbmVyIC0gRzMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQCvDoqq+Ny/aXtUF3FHCb2NPIH4dBV3Z5Cc/d5OAp5LdvblNj5l1SQgbTD53R2D
# 6T8nSjNObRaK5I1AjSKqvqcLG9IHtjy1GiQo+BtyUT3ICYgmCDr5+kMjdUdwDLNf
# W48IHXJIV2VNrwI8QPf03TI4kz/lLKbzWSPLgN4TTfkQyaoKGGxVYVfR8QIsxLWr
# 8mwj0p8NDxlsrYViaf1OhcGKUjGrW9jJdFLjV2wiv1V/b8oGqz9KtyJ2ZezsNvKW
# lYEmLP27mKoBONOvJUCbCVPwKVeFWF7qhUhBIYfl3rTTJrJ7QFNYeY5SMQZNlANF
# xM48A+y3API6IsW0b+XvsIqbAgMBAAGjggHHMIIBwzAMBgNVHRMBAf8EAjAAMGYG
# A1UdIARfMF0wWwYLYIZIAYb4RQEHFwMwTDAjBggrBgEFBQcCARYXaHR0cHM6Ly9k
# LnN5bWNiLmNvbS9jcHMwJQYIKwYBBQUHAgIwGRoXaHR0cHM6Ly9kLnN5bWNiLmNv
# bS9ycGEwQAYDVR0fBDkwNzA1oDOgMYYvaHR0cDovL3RzLWNybC53cy5zeW1hbnRl
# Yy5jb20vc2hhMjU2LXRzcy1jYS5jcmwwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgw
# DgYDVR0PAQH/BAQDAgeAMHcGCCsGAQUFBwEBBGswaTAqBggrBgEFBQcwAYYeaHR0
# cDovL3RzLW9jc3Aud3Muc3ltYW50ZWMuY29tMDsGCCsGAQUFBzAChi9odHRwOi8v
# dHMtYWlhLndzLnN5bWFudGVjLmNvbS9zaGEyNTYtdHNzLWNhLmNlcjAoBgNVHREE
# ITAfpB0wGzEZMBcGA1UEAxMQVGltZVN0YW1wLTIwNDgtNjAdBgNVHQ4EFgQUpRMB
# qZ+FzBtuFh5fOzGqeTYAex0wHwYDVR0jBBgwFoAUr2PWyqNOhXLgp7xB8ymiOH+A
# dWIwDQYJKoZIhvcNAQELBQADggEBAEaer/C4ol+imUjPqCdLIc2yuaZycGMv41Up
# ezlGTud+ZQZYi7xXipINCNgQujYk+gp7+zvTYr9KlBXmgtuKVG3/KP5nz3E/5jMJ
# 2aJZEPQeSv5lzN7Ua+NSKXUASiulzMub6KlN97QXWZJBw7c/hub2wH9EPEZcF1rj
# pDvVaSbVIX3hgGd+Yqy3Ti4VmuWcI69bEepxqUH5DXk4qaENz7Sx2j6aescixXTN
# 30cJhsT8kSWyG5bphQjo3ep0YG5gpVZ6DchEWNzm+UgUnuW/3gC9d7GYFHIUJN/H
# ESwfAD/DSxTGZxzMHgajkF9cVIs+4zNbgg/Ft4YCTnGf6WZFP3YxggJaMIICVgIB
# ATCBizB3MQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRp
# b24xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMTH1N5
# bWFudGVjIFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0ECEHvU5a+6zAc/oQEjBCJBTRIw
# CwYJYIZIAWUDBAIBoIGkMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkq
# hkiG9w0BCQUxDxcNMjEwNjE5MDUxOTEyWjAvBgkqhkiG9w0BCQQxIgQgCU+C5vly
# 4/LuHAvgQ9oJkPMM/mv06MSOWMmHVQvdnAowNwYLKoZIhvcNAQkQAi8xKDAmMCQw
# IgQgxHTOdgB9AjlODaXk3nwUxoD54oIBPP72U+9dtx/fYfgwCwYJKoZIhvcNAQEB
# BIIBAB2kV5DLzdevm39sXihxzMRXXTVh5MvkXr2hSPn2gcQi0wNxJXYpHYGkfVCS
# R0vPVmxzzriSjhnCpd8BZ93X5Weq9yfeNHHcq1mgJXTMzF0f65kEpwYEeg6CCnsZ
# McoeYyxIzRwEj1cNoIn8P2m0/wzX9VEuJYeIjQ4AkcL3heyrdNAvFUuUmTFArqD7
# i5RGJ6lcuuOEs9R4vYcwh3phYUHWo2f15dcRefYSwbWroKwNTvyYBziB0hXgTN+E
# 3u4FAl5xG3mVwF0fWU1l8/tGqioxR8fkN+lQitFafOkYUiTd5TbEvqSVIi7szMDi
# HOzpn2jSkMHJKjearMg+OkYRnAw=
# SIG # End signature block