Migrate-Aadds.ps1

<#PSScriptInfo
 
.VERSION 1.4
 
.GUID 723874e6-7a38-4bde-b7f5-8627c18fd10c
 
.AUTHOR aaddsfb@microsoft.com
 
.COMPANYNAME Microsoft Corporation
 
.COPYRIGHT (c) Microsoft Corporation
 
.TAGS Azure-AD-Domain-Services Migration
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
    10/18/2019 - Initial release
    12/04/2019 - Ensure well-formed subnetids during abort
    01/17/2020 - Parameter type fix
    02/12/2020 - Add support for MFA and some message fixes
    03/31/2020 - Improve retry conditions
    07/19/2020 - Minor ApiVersion fix
#>


<#
 
.SYNOPSIS
    Migrates an Azure AD Domain Services from a classic virtual network to an Azure Resource Manager virtual network.
 
.DESCRIPTION
    Migrates an Azure AD Domain Services from a classic virtual network to an Azure Resource Manager virtual network.
 
.PARAMETER Prepare [MANADATORY]
    Causes the script to prepare the classic Azure AD Domain Services resource for migration.
 
.PARAMETER Commit [MANADATORY]
    Causes the script to commit the migration for the prepared classic Azure AD Domain Services resource.
 
.PARAMETER Abort [MANADATORY]
    Causes the script to abort the migration and reverts the classic Azure AD Domain Services to a running state.
 
.PARAMETER ManagedDomainFqdn [MANADATORY]
    The fqdn of the managed domain (aadds.corp.contoso.com).
 
.PARAMETER VirtualNetworkResourceGroupName [MANDATORY]
    The name of the Azure Resource Manager resource group that hosts the virtual network to which Azure AD Domain Services will be moved.
 
.PARAMETER VirtualNetworkName [MANDATORY]
    The name of the Azure Resource Manager virtual network to which Azure AD Domain Services will be moved.
 
.PARAMETER VirtualSubnetName [MANADATORY]
    The name of the Azure Resource Manager virtual subnet to which Azure AD Domain Services will be moved.
 
.PARAMETER ClassicVirtualNetworkName [MANADATORY]
    The name of the Classic Virtual Network on which Azure AD Domain Services was enabled. This is only required for Abort case
 
.PARAMETER SubscriptionId [OPTIONAL]
    The Azure subscription that hosts the Azure AD Domain Services resource.
 
.PARAMETER Credential [OPTIONAL]
    The credentials used to authenticate to Azure.
#>

[CmdletBinding()]
Param (
    [Parameter(
        Mandatory=$true,
        ParameterSetName="Prepare")]
        [switch]
        $Prepare,
    [Parameter(
        Mandatory=$true,
        ParameterSetName="Commit")]
        [switch]
        $Commit,
    [Parameter(
        Mandatory=$true,
        ParameterSetName="Abort")]
        [switch]
        $Abort,    
    
    [Parameter(
        Mandatory=$true,
        ParameterSetName="Prepare")]
    [Parameter(
        Mandatory=$true,
        ParameterSetName="Commit")]
    [Parameter(
        Mandatory=$true,
        ParameterSetName="Abort")]
        [string]
        $ManagedDomainFqdn,

    [Parameter(
        Mandatory=$true,
        ParameterSetName="Commit")]
        [string]
        $VirtualNetworkResourceGroupName,
    
    [Parameter(
        Mandatory=$true,
        ParameterSetName="Commit")]
        [string]
        $VirtualNetworkName,

    [Parameter(
        Mandatory=$true,
        ParameterSetName="Abort")]
        [string]
        $ClassicVirtualNetworkName,

    [Parameter(
        Mandatory=$true,
        ParameterSetName="Commit")]
        [string]
        $VirtualSubnetName,

    [Parameter(
        Mandatory=$false,
        ParameterSetName="Prepare")]
    [Parameter(
        Mandatory=$false,
        ParameterSetName="Commit")]
    [Parameter(
        Mandatory=$false,
        ParameterSetName="Abort")]
        [string]
        $SubscriptionId,

    [Parameter(
        Mandatory=$false,
        ParameterSetName="Prepare")]
    [Parameter(
        Mandatory=$false,
        ParameterSetName="Commit")]
    [Parameter(
        Mandatory=$false,
        ParameterSetName="Abort")]
        [pscredential]
        $Credentials
)


Process
{
    
    enum actionType
    {
        Unknown
        Prepare
        Commit
        Abort
    }
        
    $subscription = $null
    $aadds = $null
    $creds = $null
    $azProfile = $null
    $action =[actionType]::Unknown

    #
    # Check for the requested action
    if($true -eq $Prepare)
    {
        $action = [actionType]::Prepare
    }
    elseif($true -eq $Commit)
    {
        $action = [actionType]::Commit
    }
    elseif($true -eq $Abort)
    {
        $action = [actionType]::Abort
    }
    
    if($action -eq [actionType]::Unknown)
    {
        Write-Host -ForegroundColor Red "ERROR: Unknown action type."
        return
    }    

    ## check for subscriptionID
    if($null -ne $SubscriptionId)
    {
        $subscription = $SubscriptionId
    }
    
    Write-Host ([string]::Empty)
    Write-Host ([string]::Empty)
    Write-Host "Authenticating to Azure... " -NoNewline
    
    #
    # Collect credentials from the user for authentication
    if($null -eq $Credentials)
    {
        $azProfile = Connect-AzAccount -ErrorAction SilentlyContinue
    }
    else
    {        
        $azProfile = Connect-AzAccount -Credential $Credentials -ErrorAction SilentlyContinue
    }
    
    if($null -eq $azProfile)
    {
        # Authentication failed
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not authenticate to Azure. Check your credentials and try again."
        Return
    }
    else
    {
        Write-Host -ForegroundColor Green "[Success!]"
    }

    Write-Host ("Authenticated to Azure as {0}..." -f $azProfile.Context.Account.Id)   

    #
    # Check for user provided subscription Id
    if($null -eq $subscription)
    {
        #
        # Locate Azure AD Domain Services in a subscription
        # Use the first instance found as there should only be one instance per tenant
        Write-Host "Searching for Azure AD Domain Services instance..." -NoNewline
        ($AzSubs = Get-AzSubscription) | Out-Null 
        foreach($azsub in $AzSubs)
        {
            (Select-AzSubscription $azsub.Id) | Out-Null
            
            $aadds = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01 -ErrorAction SilentlyContinue

            if($null -ne $aadds)
            {
                # Found Azure AD Domain Services in this subscription
                # Add to the subscription List
                $subscription = $azsub.Id
                break
            }
        }

        if($null -eq $subscription)
        {
            Write-Host -ForegroundColor Red "[Failed!]"
            Write-Host -ForegroundColor Red ("ERROR: Could not find a subscription that has the specified Azure AD Domain Services with managed domain name: {0}" -f $ManagedDomainFqdn)
            return
        }
        else
        {
            Write-Host -ForegroundColor Green "[Found!]"
        }
    }
    else 
    {
        Select-AzSubscription $subscription -ErrorAction SilentlyContinue
            
        $aadds = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01 -ErrorAction SilentlyContinue
    }

    #
    # Validate the resource is Azure AD Domain Services
    $pass = $true

    Write-Host "Validating resource type..." -NoNewline
    if($aadds.ResourceType -ne "Microsoft.AAD/domainServices")
    {
        $pass = $false
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: The resource is not an Azure AD Domain Services resource (Status:$($aadds.ResourceType))."        
    
    }
    else {Write-Host -ForegroundColor Green "[Pass!]"}
    
    #
    # Validate service status
    Write-Host "Validating service status..." -NoNewline
    
    #
    # If the action is commit, this should equal PreparedForMigration or FailedToPerformMigration.
    # If the action is abort, this should equal PreparedForMigration, FailedToRollbackMigration or FailedToPerformMigration.
    # If the action is prepare, this should equal Running or FailedToPrepareForMigration.
    if("commit" -eq $action)
    {
        if("PreparedForMigration" -ne $aadds.properties.serviceStatus -and "FailedToPerformMigration" -ne $aadds.properties.serviceStatus)
        {
            $pass = $false
            Write-Host -ForegroundColor Red "[Failed!]"            
            Write-Host -ForegroundColor Red ("ERROR: The managed domain {0} must be prepared prior to this command (Status:{1})." -f $aadds.Name, $aadds.properties.serviceStatus)
        }
        else { Write-Host -ForegroundColor Green "[Pass!]" }            
    }
    elseif("abort" -eq $action)
    {
        if("PreparedForMigration" -ne $aadds.properties.serviceStatus -and "FailedToRollbackMigration" -ne $aadds.properties.serviceStatus -and "FailedToPerformMigration" -ne $aadds.properties.serviceStatus)
        {
            $pass = $false
            Write-Host -ForegroundColor Red "[Failed!]"            
            Write-Host -ForegroundColor Red ("ERROR: The managed domain {0} must be prepared prior to this command (Status:{1})." -f $aadds.Name, $aadds.properties.serviceStatus)
        }
        else { Write-Host -ForegroundColor Green "[Pass!]" }            
    }
    else
    {
        if( ("FailedToPrepareForMigration" -ne $aadds.Properties.ServiceStatus -and "Running" -ne $aadds.properties.serviceStatus) )
        {
            $pass = $false
            Write-Host -ForegroundColor Red "[Failed!]"            
            Write-Host -ForegroundColor Red ("ERROR: The managed domain {0} is not in a state that can be prepared (Status:{1})." -f $aadds.Name, $aadds.properties.serviceStatus)
        }
        else { Write-Host -ForegroundColor Green "[Pass!]" }            
    }
    
    if($pass -eq $false)
        {
            Write-Host -ForegroundColor Red "ERROR: One or more prerequisites checks failed."
            Return
        }

    #
    # Do work based on the action
    $actionStart = Get-Date
    
    switch($action)
    {
        "Prepare"
        {                        
            Write-Host "It is important you let the script complete"
            Write-Host "The preparation may take up to 30 minutes. Please wait..."                        
            
            Write-Host ([String]::Empty)
            $consent = Read-Host -Prompt ("Do you want to prepare {0} for migration: (Y/N)" -f $ManagedDomainFqdn)
            if("Y" -ne $consent)
            {
                Write-Host -ForegroundColor Yellow "[Canceled!] The user canceled the migration."
                return
            }

            Write-Host "Processing your request... " -NoNewline
            # Prepare the instance

            (Set-AzResource -ResourceId $aadds.ResourceId -Properties @{"subnetId" = $null} -ApiVersion 2017-06-01 -Force) | Out-Null

            Write-Host -Foreground Green "[Preparation complete!]"
            Write-Host "Validating ..." -NoNewline                    

            $confirm = $null
            $confirm = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01 -ErrorAction SilentlyContinue
            if($null -eq $confirm)
            {
                Write-Host -ForegroundColor Yellow "[Undetermined!]"
                Write-Host -ForegroundColor Yellow "The script could not validate the preparation status."
                Write-Host -ForegroundColor Yellow (
                    "Please run {0} and check the serviceStatus value is 'PreparedForMigration'" -f "(Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01).Properties"
                    )
                return
            }                    

            ## Check the properties for successful migration
            if($confirm.properties.serviceStatus -ne "PreparedForMigration")
            {                
                Write-Host -ForegroundColor Red "[Failed!]"                            
                Write-Host -ForegroundColor Red ("ERROR: The managed domain {0} did not prepare (Status:{1}." -f $aadds.Name, $aadds.properties.serviceStatus)
            }
            else 
            { 
                Write-Host -ForegroundColor Green "[Pass!]" 
                Write-Host ([String]::Empty)
                Write-Host ([String]::Empty)
                Write-Host "Please turn off all virtual machines joined to Azure AD Domain Services."                        
                Write-Host "You may turn on these virtual machines after you complete the migration."                        
                Write-Host ([String]::Empty)
                Write-Host "When ready to complete the migration, run 'Migrate-Aadds' using the '-Commit' parameter."
                Write-Host "To complete the command, you will need to have the name of your new Azure Resource Manager virtual network and subnet."
                Write-Host ([String]::Empty)
            }                                   
            
            break
        }
        "Commit"
        {            
            $vnet = $null
            $subnet = $null            
            
            #
            # Virtual network resource group name must exist to proceed
            if($null -eq $VirtualNetworkResourceGroupName)
            {
                Write-Host -ForegroundColor Red "ERROR: The virtual network resource group name cannot be blank or null."
                return 
            }


            #
            # Virtual network is valid
            Write-Host "Validating virtual network..." -NoNewline
            if($null -eq $VirtualNetworkName)
            {                
                Write-Host -ForegroundColor Red "[Failed!]"
                Write-Host -ForegroundColor Red ("ERROR: Missing the name of the virtual network (VirtualNetwork:{0})." -f $VirtualNetworkName)
                return
            }
            else 
            {
                #
                # Get the virtual network
                $vnet = Get-AzVirtualNetwork -Name  $VirtualNetworkName -ResourceGroupName $VirtualNetworkResourceGroupName -ErrorAction SilentlyContinue
                if($null -eq $vnet)
                {                    
                    Write-Host -ForegroundColor Red "[Failed!]"
                    Write-Host -ForegroundColor Red ("ERROR: Could not find the virtual network (VirtualNetwork:{0})." -f $VirtualNetworkName)
                    return
                }
            }
            Write-Host -ForegroundColor Green "[Pass!]"

            #
            # Virtual subnet is valid
            Write-Host "Validating virtual subnet..." -NoNewline
            if($null -eq $VirtualSubnetName)
            {
                Write-Host -ForegroundColor Red "[Failed!]"
                Write-Host -ForegroundColor Red ("ERROR: Missing the name of the virtual subnet (VirtualSubnet:{0})." -f $VirtualSubnetName)
                return
            }
            else 
            {
                #
                # Get the virtual subnet
                $subnet = Get-AzVirtualNetworkSubnetConfig -Name $VirtualSubnetName -VirtualNetwork $vnet -ErrorAction SilentlyContinue
                if($null -eq $subnet)
                {                    
                    Write-Host -ForegroundColor Red "[Failed!]"
                    Write-Host -ForegroundColor Red ("ERROR: Could not find the virtual subnet (VirtualSubnet:{0}." -f $VirtualSubnetName)
                    return
                }                   
            }
            Write-Host -ForegroundColor Green "[Pass!]"
            
            #
            # Commit the move to the Azure AD Domain Services resource
            Write-Host ([String]::Empty)
            Write-Host -ForegroundColor Cyan "IMPORTANT! DO NOT convert your classic virtual network while this script runs."
            Write-Host -ForegroundColor Cyan "Perform that operation after the migration is complete."
            Write-Host ([String]::Empty)
            Write-Host -ForegroundColor Cyan "It is important you let the script complete"                    
            Write-Host -ForegroundColor Cyan "The migration may take up to three (3) hours. Please wait..."
            Write-Host ([String]::Empty)
            Write-Host -ForegroundColor Cyan "IMPORTANT! Once started, you cannot stop the migration process nor can you revert the process once the migration completes."
            $consent = Read-Host -Prompt ("Do you want to migrate {0} (Y/N)" -f $ManagedDomainFqdn)
            if("Y" -ne $consent)
            {
                Write-Host -ForegroundColor Yellow "[Canceled!] The user canceled the migration."
                return
            }
            #
            # run the command in the background
            $job = Set-AzResource -ResourceId $aadds.ResourceId -Properties @{"subnetId" = $subnet.Id} -ApiVersion 2017-06-01 -Force -AsJob
            Write-Host "Migration in progess. Progress refreshes every 2 minutes ..."
            
            Write-Host ([String]::Empty)
            Write-Progress -Activity "Migration" -Status ("Last Updated:{0}" -f [System.DateTime]::Now.ToString("G")) -CurrentOperation "Starting..." -PercentComplete 0
            do
            {
                Start-Sleep -Seconds 120
                
                $properties = (Get-AzResource -ResourceId $aadds.ResourceId -ApiVersion 2017-06-01).Properties

                $migrationProgress = $properties.MigrationProperties.MigrationProgress

                [int] $percentComplete = $migrationProgress.CompletionPercentage
                
                #
                # Precaution to ensure Write-Progress does not error
                if(101 -lt $percentComplete)
                {
                    $percentComplete = 100
                }
                                                
                Write-Progress -Activity "Migration" -Status ("Last Updated:{0}" -f [System.DateTime]::Now.ToString("G")) -CurrentOperation ("{0}" -f $migrationProgress.ProgressMessage) -PercentComplete $percentComplete

            } while ("PerformingMigration" -eq $properties.ServiceStatus)

            if("Completed" -ne $job.State)
            {
                Write-Host ([string]::Empty)
                Write-Host -ForegroundColor Red "Migration did not complete successfully."
                Write-Host -ForegroundColor Red ("ERROR: {0}" -f $job.ChildJobs[0].JobStateInfo.Reason)
            }
            else
            {
                Write-Progress -Activity "Migration" -Status ("Last Updated:{0}" -f [System.DateTime]::Now.ToString("G")) -Completed
                Write-Host -ForegroundColor Green "[Migration Complete!]"
            }

            #
            # Validate the migration was successful
            Write-Host "Validating ..." -NoNewline

            # Waiting to give time to refresh the state of Azure AD Domain Services resource.
            Start-Sleep -Seconds 10

            $confirm = $null
            $confirm = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01 -ErrorAction SilentlyContinue
            if($null -eq $confirm)
            {
                Write-Host -ForegroundColor Yellow "[Undetermined!]"
                Write-Host -ForegroundColor Yellow "The script could not validate the Commit status."
                Write-Host -ForegroundColor Yellow (
                    "Please run {0} and check the serviceStatus value is 'Running'" -f "(Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01).Properties")
                return
            }                    

            #
            # Check the properties for successful migration
            if($confirm.properties.serviceStatus -ne "Running")
            {                
                Write-Host -ForegroundColor Red "[Failed!]"                            
                Write-Host -ForegroundColor Red ("ERROR: The managed domain {0} did not migrate successfully (Status:{1}." -f $aadds.Name, $aadds.properties.serviceStatus)
            }
            else 
            { 
                Write-Host -ForegroundColor Green "[Pass!]" 
                Write-Host ([String]::Empty)
                Write-Host ([String]::Empty)
                Write-Host "Migration of the first domain controller for Azure AD Domain Services completed successfully."
                Write-Host ("Migration of the second domain controller is active and should complete at approximately {0}." -f ([System.DateTime]::Now.AddHours(1).ToString("G")))
                Write-Host ("After the second domain controller completes its migration, please update the DNS settings on the {0} virtual network." -f $VirtualNetworkName)
                Write-Host ([String]::Empty)
            }
        
            break
        }
        "Abort"
        {
            #
            # use the oldSubnetID property from the instance to rollback
        
            Write-Host "It is important you let the script complete"            

            $oldSubnetId = $aadds.Properties.migrationProperties.oldSubnetID

            if($aadds.Properties.migrationProperties.oldSubnetID -inotmatch "/")
            {
                Write-Host "Old SubnetId is not in resource format. Value: $oldSubnetId... Converting to Resource format"

                #Get Vnet ResourceId
                $classicVnet = Get-AzResource -ResourceName $ClassicVirtualNetworkName
                $classicVnetResourceId = $classicVnet.ResourceId
                $oldSubnetName = $aadds.Properties.migrationProperties.oldSubnetID
                $oldSubnetId = $classicVnetResourceId + "/subnets/" + "$oldSubnetName"
            }
            
            Write-Host "Old SubnetId: $oldSubnetID"
            
            Write-Host "This process may take up to 30 minutes. Please wait..."
            
            Write-Host ([String]::Empty)
            $consent = Read-Host -Prompt ("Do you want to abort the migration for {0} (Y/N)" -f $ManagedDomainFqdn)
            if("Y" -ne $consent)
            {
                Write-Host -ForegroundColor Yellow "[Canceled!] The user canceled the migration."
                return
            }

            Write-Host "Processing your request... "            

            (Set-AzResource -ResourceId $aadds.ResourceId -Properties @{"subnetId" = $oldSubnetId} -ApiVersion 2017-06-01 -Force) | Out-Null
            
            #
            # Validate
            Write-Host -Foreground Green "[Process Complete!]"
            Write-Host "Validating ..." -NoNewline                    

            $confirm = $null
            $confirm = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01 -ErrorAction SilentlyContinue
            if($null -eq $confirm)
            {
                Write-Host -ForegroundColor Yellow "[Undetermined!]"
                Write-Host -ForegroundColor Yellow "The script could not validate the abort status."
                Write-Host -ForegroundColor Yellow (
                    "Please run {0} and check the serviceStatus value is 'Running'" -f "(Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ApiVersion 2017-06-01).Properties")
                return
            }                    

            #
            # Check the properties for successful migration
            if($confirm.properties.serviceStatus -ne "Running")
            {                
                Write-Host -ForegroundColor Red "[Failed!]"                            
                Write-Host -ForegroundColor Red ("ERROR: The managed domain {0} did not abort its preparation for migration (Status:{1}." -f $aadds.Name, $aadds.properties.serviceStatus)
            }
            else 
            { 
                Write-Host -ForegroundColor Green "[Pass!]" 
                Write-Host ([String]::Empty)
                Write-Host ([String]::Empty)
                Write-Host "This instance of Azure AD Domain Services has returned to its original classic virtual network."                
                Write-Host ([String]::Empty)
            }
            
            break
        }
        default
        {
            Write-Host -ForegroundColor Red "Unknown Command."            
        }
    }


    $actionStop = Get-Date

    Write-Host "Elapsed Time: " ($actionStop - $actionStart)
    
} # End Process

# SIG # Begin signature block
# MIInMwYJKoZIhvcNAQcCoIInJDCCJyACAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBszBJJPjyo0XMB
# 3ynLvGYUmXLJjDvYwckfzqsVcfFM0aCCEW8wggiBMIIHaaADAgECAhM2AAABDBla
# ELMo09izAAEAAAEMMA0GCSqGSIb3DQEBCwUAMEExEzARBgoJkiaJk/IsZAEZFgNH
# QkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxFTATBgNVBAMTDEFNRSBDUyBDQSAwMTAe
# Fw0yMDAyMDkxMzI1MDFaFw0yMTAyMDgxMzI1MDFaMC8xLTArBgNVBAMTJE1pY3Jv
# c29mdCBBenVyZSBEZXBlbmRlbmN5IENvZGUgU2lnbjCCASIwDQYJKoZIhvcNAQEB
# BQADggEPADCCAQoCggEBAJL4kx4D2erD4cliqomE3dMX+gvfMz/ovrjRwJqG80Kl
# kGP+kOn35E80o/Ua/SdfQq3gjLNJSJpa6Yn0ph8FOf7U4NT7a8+zrwBTpZ/7llv9
# /jGf037eKxEWsCtMTRfL1dKBOQhn1lHAZvjKdgIgJAFG7ydg1oKsn0wfGBXSgile
# g1IWbTNpR5luLpuHPWRspqDtXCXif/+rjukP5tvDqZmxYP0tQXER4I1eUXiJIXHf
# 7dFZR7VxjZ4BP1rEUU8Gk+BMGpTJTTB21MjwtEjF2U5WAv1KeUpxxlYPKEYGgr2/
# lCXgkoWmPWqSLMbLjcX5uLfMP9j/IW/UnpoaReR1gVsCAwEAAaOCBYIwggV+MCkG
# CSsGAQQBgjcVCgQcMBowDAYKKwYBBAGCN1sDATAKBggrBgEFBQcDAzA8BgkrBgEE
# AYI3FQcELzAtBiUrBgEEAYI3FQiGkOMNhNW0eITxiz6Fm90Wzp0SgWDigi2HkK4D
# AgFkAgEOMIICdgYIKwYBBQUHAQEEggJoMIICZDBiBggrBgEFBQcwAoZWaHR0cDov
# L2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NlcnRzL0JZMlBLSUNTQ0EwMS5B
# TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgxKS5jcnQwUgYIKwYBBQUHMAKGRmh0
# dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUy
# MENTJTIwQ0ElMjAwMSgxKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwyLmFt
# ZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAw
# MSgxKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwzLmFtZS5nYmwvYWlhL0JZ
# MlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgxKS5jcnQwUgYI
# KwYBBQUHMAKGRmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5B
# TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgxKS5jcnQwga0GCCsGAQUFBzAChoGg
# bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEsQ049QUlBLENOPVB1YmxpYyUy
# MEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9
# QU1FLERDPUdCTD9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2VydGlm
# aWNhdGlvbkF1dGhvcml0eTAdBgNVHQ4EFgQUkku2i4tvXu/fb2UHKKZiDd81U7Aw
# DgYDVR0PAQH/BAQDAgeAMFAGA1UdEQRJMEekRTBDMSkwJwYDVQQLEyBNaWNyb3Nv
# ZnQgT3BlcmF0aW9ucyBQdWVydG8gUmljbzEWMBQGA1UEBRMNMjM2MTY5KzQ1Nzc5
# NTCCAdQGA1UdHwSCAcswggHHMIIBw6CCAb+gggG7hjxodHRwOi8vY3JsLm1pY3Jv
# c29mdC5jb20vcGtpaW5mcmEvQ1JML0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0
# dHA6Ly9jcmwxLmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0
# dHA6Ly9jcmwyLmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0
# dHA6Ly9jcmwzLmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGLmh0
# dHA6Ly9jcmw0LmFtZS5nYmwvY3JsL0FNRSUyMENTJTIwQ0ElMjAwMS5jcmyGgbps
# ZGFwOi8vL0NOPUFNRSUyMENTJTIwQ0ElMjAwMSxDTj1CWTJQS0lDU0NBMDEsQ049
# Q0RQLENOPVB1YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNv
# bmZpZ3VyYXRpb24sREM9QU1FLERDPUdCTD9jZXJ0aWZpY2F0ZVJldm9jYXRpb25M
# aXN0P2Jhc2U/b2JqZWN0Q2xhc3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnQwHwYDVR0j
# BBgwFoAUG2aiGfyb66XahI8YmOkQpMN7kr0wHwYDVR0lBBgwFgYKKwYBBAGCN1sD
# AQYIKwYBBQUHAwMwDQYJKoZIhvcNAQELBQADggEBAFdWLRaOg25JZG+Hm01zB/zB
# oSC3MUJ7lWHPIE44xH/7Ek9n0KnzXthnL345WNBcnW3pNbqHGVeLx7SlYJFbsiLi
# vKm3+FUc71F5AQvySUTOpRvHRmEBgzuZo9t6n211l2GQLWdGMGvzrIaeV81wsP2r
# W0G++acIHvczziw0mDTM3UYNeyxI6rFwsZsdfbvzbmsqcZuK9B699sEQoWQO19Fu
# 0sIkj3WPKlATUk9dAAhHkwl2dcPckrvhBvwa9rYPLPAjWsFTZLdRTBubE9ukikdd
# PDTqTM+9FhlPwo7PGMKyBngj9jp4WsfIyDfVfE1W/LgtDa+0SN7mPPNNbW5SKcMw
# ggjmMIIGzqADAgECAhMfAAAAFLTFH8bygL5xAAAAAAAUMA0GCSqGSIb3DQEBCwUA
# MDwxEzARBgoJkiaJk/IsZAEZFgNHQkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxEDAO
# BgNVBAMTB2FtZXJvb3QwHhcNMTYwOTE1MjEzMzAzWhcNMjEwOTE1MjE0MzAzWjBB
# MRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRUwEwYD
# VQQDEwxBTUUgQ1MgQ0EgMDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDVV4EC1vn60PcbgLndN80k3GZh/OGJcq0pDNIbG5q/rrRtNLVUR4MONKcWGyae
# VvoaQ8J5iYInBaBkaz7ehYnzJp3f/9Wg/31tcbxrPNMmZPY8UzXIrFRdQmCLsj3L
# cLiWX8BN8HBsYZFcP7Y92R2VWnEpbN40Q9XBsK3FaNSEevoRzL1Ho7beP7b9FJlK
# B/Nhy0PMNaE1/Q+8Y9+WbfU9KTj6jNxrffv87O7T6doMqDmL/MUeF9IlmSrl088b
# oLzAOt2LAeHobkgasx3ZBeea8R+O2k+oT4bwx5ZuzNpbGXESNAlALo8HCf7xC3hW
# qVzRqbdnd8HDyTNG6c6zwyf/AgMBAAGjggTaMIIE1jAQBgkrBgEEAYI3FQEEAwIB
# ATAjBgkrBgEEAYI3FQIEFgQUkfwzzkKe9pPm4n1U1wgYu7jXcWUwHQYDVR0OBBYE
# FBtmohn8m+ul2oSPGJjpEKTDe5K9MIIBBAYDVR0lBIH8MIH5BgcrBgEFAgMFBggr
# BgEFBQcDAQYIKwYBBQUHAwIGCisGAQQBgjcUAgEGCSsGAQQBgjcVBgYKKwYBBAGC
# NwoDDAYJKwYBBAGCNxUGBggrBgEFBQcDCQYIKwYBBQUIAgIGCisGAQQBgjdAAQEG
# CysGAQQBgjcKAwQBBgorBgEEAYI3CgMEBgkrBgEEAYI3FQUGCisGAQQBgjcUAgIG
# CisGAQQBgjcUAgMGCCsGAQUFBwMDBgorBgEEAYI3WwEBBgorBgEEAYI3WwIBBgor
# BgEEAYI3WwMBBgorBgEEAYI3WwUBBgorBgEEAYI3WwQBBgorBgEEAYI3WwQCMBkG
# CSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjASBgNVHRMBAf8E
# CDAGAQH/AgEAMB8GA1UdIwQYMBaAFCleUV5krjS566ycDaeMdQHRCQsoMIIBaAYD
# VR0fBIIBXzCCAVswggFXoIIBU6CCAU+GI2h0dHA6Ly9jcmwxLmFtZS5nYmwvY3Js
# L2FtZXJvb3QuY3JshjFodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpaW5mcmEv
# Y3JsL2FtZXJvb3QuY3JshiNodHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9hbWVyb290
# LmNybIYjaHR0cDovL2NybDMuYW1lLmdibC9jcmwvYW1lcm9vdC5jcmyGgapsZGFw
# Oi8vL0NOPWFtZXJvb3QsQ049QU1FUk9PVCxDTj1DRFAsQ049UHVibGljJTIwS2V5
# JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz1BTUUs
# REM9R0JMP2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9vYmplY3RDbGFz
# cz1jUkxEaXN0cmlidXRpb25Qb2ludDCCAasGCCsGAQUFBwEBBIIBnTCCAZkwNwYI
# KwYBBQUHMAKGK2h0dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0FNRVJPT1RfYW1lcm9v
# dC5jcnQwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lp
# bmZyYS9jZXJ0cy9BTUVST09UX2FtZXJvb3QuY3J0MDcGCCsGAQUFBzAChitodHRw
# Oi8vY3JsMi5hbWUuZ2JsL2FpYS9BTUVST09UX2FtZXJvb3QuY3J0MDcGCCsGAQUF
# BzAChitodHRwOi8vY3JsMy5hbWUuZ2JsL2FpYS9BTUVST09UX2FtZXJvb3QuY3J0
# MIGiBggrBgEFBQcwAoaBlWxkYXA6Ly8vQ049YW1lcm9vdCxDTj1BSUEsQ049UHVi
# bGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlv
# bixEQz1BTUUsREM9R0JMP2NBQ2VydGlmaWNhdGU/YmFzZT9vYmplY3RDbGFzcz1j
# ZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MA0GCSqGSIb3DQEBCwUAA4ICAQAot0qGmo8f
# pAFozcIA6pCLygDhZB5ktbdA5c2ZabtQDTXwNARrXJOoRBu4Pk6VHVa78Xbz0OZc
# 1N2xkzgZMoRpl6EiJVoygu8Qm27mHoJPJ9ao9603I4mpHWwaqh3RfCfn8b/NxNhL
# Gfkrc3wp2VwOtkAjJ+rfJoQlgcacD14n9/VGt9smB6j9ECEgJy0443B+mwFdyCJO
# 5OaUP+TQOqiC/MmA+r0Y6QjJf93GTsiQ/Nf+fjzizTMdHggpTnxTcbWg9JCZnk4c
# C+AdoQBKR03kTbQfIm/nM3t275BjTx8j5UhyLqlqAt9cdhpNfdkn8xQz1dT6hTnL
# iowvNOPUkgbQtV+4crzKgHuHaKfJN7tufqHYbw3FnTZopnTFr6f8mehco2xpU8bV
# KhO4i0yxdXmlC0hKGwGqdeoWNjdskyUyEih8xyOK47BEJb6mtn4+hi8TY/4wvuCz
# cvrkZn0F0oXd9JbdO+ak66M9DbevNKV71YbEUnTZ81toX0Ltsbji4PMyhlTg/669
# BoHsoTg4yoC9hh8XLW2/V2lUg3+qHHQf/2g2I4mm5lnf1mJsu30NduyrmrDIeZ0l
# dqKzHAHnfAmyFSNzWLvrGoU9Q0ZvwRlDdoUqXbD0Hju98GL6dTew3S2mcs+17Dgs
# dargsEPm6I1lUE5iixnoEqFKWTX5j/TLUjGCFRowghUWAgEBMFgwQTETMBEGCgmS
# JomT8ixkARkWA0dCTDETMBEGCgmSJomT8ixkARkWA0FNRTEVMBMGA1UEAxMMQU1F
# IENTIENBIDAxAhM2AAABDBlaELMo09izAAEAAAEMMA0GCWCGSAFlAwQCAQUAoIGu
# MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgor
# BgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBjXL0BdcqcV53b8kpWO2nZvPfUQdA4
# q5/7rTVSXSBHXDBCBgorBgEEAYI3AgEMMTQwMqAUgBIATQBpAGMAcgBvAHMAbwBm
# AHShGoAYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3DQEBAQUABIIB
# ABnMuFoRwtX4eaYwRzp26GOH9x53IocCDmjLjxKJzB+9Hkfi7pV3czHGIzc2Q5o/
# dpsRrexSMvQzQYNZted5MH90NYgwyeB/Qhc/SaR8kUVY06xGyrB9ovaTXHR94RCh
# Jx+ul5Gq7OUnwS+YOOy8sclN9xdAjmoJGu20da5lyQMuEbSfSN33EaN+svKeP37i
# 2GvK1mfdBassCqHcXWJ9OtWstmUQ9jYsjFTWTAErXPw/27qj3sIOpE7P3tbIWe+O
# QcCkqnRE2L4xnoUllbgWOqz7F90ClBpATzvysvRYZPm32ZFIh0MphyXGAQQVf3X+
# zjv2DVESwV1yfGXKTmc8AVGhghLiMIIS3gYKKwYBBAGCNwMDATGCEs4wghLKBgkq
# hkiG9w0BBwKgghK7MIIStwIBAzEPMA0GCWCGSAFlAwQCAQUAMIIBUQYLKoZIhvcN
# AQkQAQSgggFABIIBPDCCATgCAQEGCisGAQQBhFkKAwEwMTANBglghkgBZQMEAgEF
# AAQgiwUqSmavwWYCqGMDNIqW3nfDysp+BZpSEwdgQmcXnBsCBl8V/u5qVxgTMjAy
# MDA3MjgwNDE5NDEuNzUzWjAEgAIB9KCB0KSBzTCByjELMAkGA1UEBhMCVVMxEzAR
# BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2Eg
# T3BlcmF0aW9uczEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046M0JCRC1FMzM4LUU5
# QTExJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2Wggg45MIIE
# 8TCCA9mgAwIBAgITMwAAAR3CwgiuPrquSAAAAAABHTANBgkqhkiG9w0BAQsFADB8
# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N
# aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDAeFw0xOTExMTMyMTQwMzlaFw0y
# MTAyMTEyMTQwMzlaMIHKMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMSYwJAYD
# VQQLEx1UaGFsZXMgVFNTIEVTTjozQkJELUUzMzgtRTlBMTElMCMGA1UEAxMcTWlj
# cm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCASIwDQYJKoZIhvcNAQEBBQADggEP
# ADCCAQoCggEBAJyFAfqhfvWYChz5UIApKIOCcRO5wwRonHB1LcdxuA5n+0qtcT8W
# 2IY+O147Mx+JKOh6XfRaIFSS0THVzrP/gLdcwhodY2Pv8hHoP1nvuLaK6bQq8hAo
# ax+YX1rooyCDYdYzhEl/OdpVa0f1Pkq8i0XawcoMNx479zuFQBojMupUI0wTavpW
# vuRh8ie7k0cfSqSA4gZlb0FWCa2l6lZmhK5dwaYX8fUxzfY38q/yxdX+FiUTdNOA
# LMDyzm02i+yimHMP1fQByyw2wnSpGpsDu7+yvclm1BrOM+2N/DXAa+HVQwneVyau
# Bp3CWWVHDbUrOPVc0S741inyLM8juq+g/OUCAwEAAaOCARswggEXMB0GA1UdDgQW
# BBQXXloUYN7I8gi+K0NqCM/ArZvCqTAfBgNVHSMEGDAWgBTVYzpcijGQ80N7fEYb
# xTNoWoVtVTBWBgNVHR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5j
# b20vcGtpL2NybC9wcm9kdWN0cy9NaWNUaW1TdGFQQ0FfMjAxMC0wNy0wMS5jcmww
# WgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29m
# dC5jb20vcGtpL2NlcnRzL01pY1RpbVN0YVBDQV8yMDEwLTA3LTAxLmNydDAMBgNV
# HRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMIMA0GCSqGSIb3DQEBCwUAA4IB
# AQBgjJGdkPAMyzjg0BXr4fps+eMb31FfDhF4p2PRJI7kh3AIUSMwuQ8d/P2V7lXe
# EAGFrrzzoQzG/dLb3J+lQdbmpsK0sKfwLJ2Jnx7I0pwUe4qYSbDqzJarhT+1Y4eP
# jm8AWnXrXZUjf/5tnSeDzYB03qOeMqW7D/BN+2q0bohz+001jrG2pVH5llyrygwS
# cp9iPei+zaJbjwvbvIa1YP0XqG4lJEi4hsrbczS+iFE57Pm2edZMtQujVxGPy2Zp
# 1MtNxU5zOB+7dnNrTMW4UFtR+QRnSAwbrWcmuQWdeKXJeH3gWHr/0jAUbIOmhgfw
# ncEBSn9aFt4F+tDJNVYbzEkwMIIGcTCCBFmgAwIBAgIKYQmBKgAAAAAAAjANBgkq
# hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x
# EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
# IDIwMTAwHhcNMTAwNzAxMjEzNjU1WhcNMjUwNzAxMjE0NjU1WjB8MQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg
# VGltZS1TdGFtcCBQQ0EgMjAxMDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
# ggEBAKkdDbx3EYo6IOz8E5f1+n9plGt0VBDVpQoAgoX77XxoSyxfxcPlYcJ2tz5m
# K1vwFVMnBDEfQRsalR3OCROOfGEwWbEwRA/xYIiEVEMM1024OAizQt2TrNZzMFcm
# gqNFDdDq9UeBzb8kYDJYYEbyWEeGMoQedGFnkV+BVLHPk0ySwcSmXdFhE24oxhr5
# hoC732H8RsEnHSRnEnIaIYqvS2SJUGKxXf13Hz3wV3WsvYpCTUBR0Q+cBj5nf/Vm
# wAOWRH7v0Ev9buWayrGo8noqCjHw2k4GkbaICDXoeByw6ZnNPOcvRLqn9NxkvaQB
# wSAJk3jN/LzAyURdXhacAQVPIk0CAwEAAaOCAeYwggHiMBAGCSsGAQQBgjcVAQQD
# AgEAMB0GA1UdDgQWBBTVYzpcijGQ80N7fEYbxTNoWoVtVTAZBgkrBgEEAYI3FAIE
# DB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
# HSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNVHR8ETzBNMEugSaBHhkVo
# dHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29D
# ZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEETjBMMEoGCCsGAQUFBzAC
# hj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1
# dF8yMDEwLTA2LTIzLmNydDCBoAYDVR0gAQH/BIGVMIGSMIGPBgkrBgEEAYI3LgMw
# gYEwPQYIKwYBBQUHAgEWMWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9QS0kvZG9j
# cy9DUFMvZGVmYXVsdC5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8A
# UABvAGwAaQBjAHkAXwBTAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQEL
# BQADggIBAAfmiFEN4sbgmD+BcQM9naOhIW+z66bM9TG+zwXiqf76V20ZMLPCxWbJ
# at/15/B4vceoniXj+bzta1RXCCtRgkQS+7lTjMz0YBKKdsxAQEGb3FwX/1z5Xhc1
# mCRWS3TvQhDIr79/xn/yN31aPxzymXlKkVIArzgPF/UveYFl2am1a+THzvbKegBv
# SzBEJCI8z+0DpZaPWSm8tv0E4XCfMkon/VWvL/625Y4zu2JfmttXQOnxzplmkIz/
# amJ/3cVKC5Em4jnsGUpxY517IW3DnKOiPPp/fZZqkHimbdLhnPkd/DjYlPTGpQqW
# hqS9nhquBEKDuLWAmyI4ILUl5WTs9/S/fmNZJQ96LjlXdqJxqgaKD4kWumGnEcua
# 2A5HmoDF0M2n0O99g/DhO3EJ3110mCIIYdqwUB5vvfHhAN/nMQekkzr3ZUd46Pio
# SKv33nJ+YWtvd6mBy6cJrDm77MbL2IK0cs0d9LiFAR6A+xuJKlQ5slvayA1VmXqH
# czsI5pgt6o3gMy4SKfXAL1QnIffIrE7aKLixqduWsqdCosnPGUFN4Ib5KpqjEWYw
# 07t0MkvfY3v1mYovG8chr1m1rtxEPJdQcdeh0sVV42neV8HR3jDA/czmTfsNv11P
# 6Z0eGTgvvM9YBS7vDaBQNdrvCScc1bN+NR4Iuto229Nfj950iEkSoYICyzCCAjQC
# AQEwgfihgdCkgc0wgcoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJjAkBgNV
# BAsTHVRoYWxlcyBUU1MgRVNOOjNCQkQtRTMzOC1FOUExMSUwIwYDVQQDExxNaWNy
# b3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQBEI59Ed+Kz
# R24NQhD8LH1pHjgnQqCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy
# MDEwMA0GCSqGSIb3DQEBBQUAAgUA4sm3jTAiGA8yMDIwMDcyODA0MjkwMVoYDzIw
# MjAwNzI5MDQyOTAxWjB0MDoGCisGAQQBhFkKBAExLDAqMAoCBQDiybeNAgEAMAcC
# AQACAhB0MAcCAQACAhGYMAoCBQDiywkNAgEAMDYGCisGAQQBhFkKBAIxKDAmMAwG
# CisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJKoZIhvcNAQEF
# BQADgYEATXkBJn36rXQT4SBzYWg2rfJBO/vacD1+A2opl+3ahQlsG03lSZPBPnop
# E45cT36QtYXA8tfgnmSqD7Kz1C2XjKxgwiZiskN9iaAhVqRbT+sMplvaY1WuC+Fe
# mYpMIQ0TFXZm4Xh3O3bxOA1CoJjIH4+9dxrGz/VTyQJis987YK0xggMNMIIDCQIB
# ATCBkzB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYD
# VQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAR3CwgiuPrqu
# SAAAAAABHTANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3
# DQEJEAEEMC8GCSqGSIb3DQEJBDEiBCAVg5XeBmbR6rh0Y0YSI44efw2wpHQheEoI
# gMW66kONLTCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIAK+DMNCn3d8hwuu
# bOkJ7YgKQkXtcRtSXt1yRull75qTMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzAR
# BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3Rh
# bXAgUENBIDIwMTACEzMAAAEdwsIIrj66rkgAAAAAAR0wIgQgt4ZdV/KKGQ5MsS74
# Lh9ylXTWZzytxlvwFMV+umlkTp0wDQYJKoZIhvcNAQELBQAEggEATV4VkAi4YLZB
# cRmEI8XRuWgrjBB8Djr9hMPsugPpCj8i83xy+tY5mkK0a7ij8sNvURdljHTgXj21
# qatYYlObXMKhCBi90RJQJxhME/lO+RLYUdUarbASSxDZgaT52+ZRQxlGDqUMfadJ
# po4/4m+MiiHM6Yo2S+MRwLawIhtGl2NtOQHMNzLgnRerW86KMS60tAYNufbYRoSb
# aM7DIaBMZy3EyqxBgiD75rg/57jDBSLLGJDECGwrvmPJycp6UY8xYfw4CFT8fOmI
# H5YnqyRkn3A/yQ+tr/JTjAeaZkh2IqpYpEhmXcZmH5Q28MYjLSHsQzdgx7RXRSXt
# LAyzZVg/2A==
# SIG # End signature block