Migrate-Aadds.ps1

<#PSScriptInfo
 
.VERSION 1.1
 
.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
 
#>


<#
 
.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 Service resource for migration.
 
.PARAMETER Commit [MANADATORY]
    Causes the script to commit the migration for the prepared classic Azure AD Domain Service resource.
 
.PARAMETER Abort [MANADATORY]
    Causes the script to abort the migration and reverts the classic Azure AD Domain Service 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")]
        [pscredential]
        $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)
    {
        $creds = Get-Credential -ErrorAction SilentlyContinue        
        $azProfile = Connect-AzAccount -Credential $creds -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 Service instance..." -NoNewline
        ($AzSubs = Get-AzSubscription) | Out-Null 
        foreach($azsub in $AzSubs)
        {
            (Select-AzSubscription $azsub.Id) | Out-Null
            
            $aadds = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ErrorAction SilentlyContinue

            if($null -ne $aadds)
            {
                # Found Azure AD DS 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 Azure AD Domain Services."
            return
        }
        else
        {
            Write-Host -ForegroundColor Green "[Found!]"
        }
    }
    else 
    {
        Select-AzSubscription $subscription -ErrorAction SilentlyContinue
            
        $aadds = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -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 AAD DS 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
    if( ("commit" -eq $action) -or ("abort" -eq $action))
    {
        if("PreparedForMigration" -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} -Force) | Out-Null

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

            $confirm = $null
            $confirm = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -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).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 DS 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} -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).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                    

            $confirm = $null
            $confirm = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -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).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} -Force) | Out-Null
            
            #
            # Validate
            Write-Host -Foreground Green "[Process Complete!]"
            Write-Host "Validating ..." -NoNewline                    

            $confirm = $null
            $confirm = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -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).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
# MIInNwYJKoZIhvcNAQcCoIInKDCCJyQCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCA85ZIG8pNAyuYl
# h4BrhNpnTLqVyl92D60xtYD7DqoaDKCCEXAwggiCMIIHaqADAgECAhM2AAAA6Gad
# G0hCpUxFAAEAAADoMA0GCSqGSIb3DQEBCwUAMEExEzARBgoJkiaJk/IsZAEZFgNH
# QkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxFTATBgNVBAMTDEFNRSBDUyBDQSAwMTAe
# Fw0xOTAzMjUxMzE3MTBaFw0yMDAzMjQxMzE3MTBaMC8xLTArBgNVBAMTJE1pY3Jv
# c29mdCBBenVyZSBEZXBlbmRlbmN5IENvZGUgU2lnbjCCASIwDQYJKoZIhvcNAQEB
# BQADggEPADCCAQoCggEBANzmuspUXRFHozpraZYcR8lLf8oaCK27bhl7agSI00Vc
# GZy2slaHQ8JZ+Bqiao7e2hpEVxeJ0s9lfIUe30ye3RwDa7oNloC8u8fa/W0QusGD
# T7p4c7wwbRJ5MrXowwB/nSgsOKtoCoJMpk6LDpRhgwhn4va4PjVrajBxrxN1eVIP
# Kw1GPkzh3qkLQ0SIhuiYUlZur4HSG6Mdkl7jYk1ifVtNupf+FO4Nflw+ZRsczZUg
# jo74fVEoBI9qzrZSkCg5wku1qGsTXrd9DtRgOQEEp96NruISfEb22ZZtpMrJg71H
# p/oAEqqlOBN5FIjzWi+mxznE1CNMBNFCbtsZOvHVSJMCAwEAAaOCBYMwggV/MCkG
# CSsGAQQBgjcVCgQcMBowDAYKKwYBBAGCN1sCATAKBggrBgEFBQcDAzA9BgkrBgEE
# AYI3FQcEMDAuBiYrBgEEAYI3FQiGkOMNhNW0eITxiz6Fm90Wzp0SgWCE2K5IhaaW
# JgIBZAIBDTCCAnYGCCsGAQUFBwEBBIICaDCCAmQwYgYIKwYBBQUHMAKGVmh0dHA6
# Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lpbmZyYS9DZXJ0cy9CWTJQS0lDU0NBMDEu
# QU1FLkdCTF9BTUUlMjBDUyUyMENBJTIwMDEoMSkuY3J0MFIGCCsGAQUFBzAChkZo
# dHRwOi8vY3JsMS5hbWUuZ2JsL2FpYS9CWTJQS0lDU0NBMDEuQU1FLkdCTF9BTUUl
# MjBDUyUyMENBJTIwMDEoMSkuY3J0MFIGCCsGAQUFBzAChkZodHRwOi8vY3JsMi5h
# bWUuZ2JsL2FpYS9CWTJQS0lDU0NBMDEuQU1FLkdCTF9BTUUlMjBDUyUyMENBJTIw
# MDEoMSkuY3J0MFIGCCsGAQUFBzAChkZodHRwOi8vY3JsMy5hbWUuZ2JsL2FpYS9C
# WTJQS0lDU0NBMDEuQU1FLkdCTF9BTUUlMjBDUyUyMENBJTIwMDEoMSkuY3J0MFIG
# CCsGAQUFBzAChkZodHRwOi8vY3JsNC5hbWUuZ2JsL2FpYS9CWTJQS0lDU0NBMDEu
# QU1FLkdCTF9BTUUlMjBDUyUyMENBJTIwMDEoMSkuY3J0MIGtBggrBgEFBQcwAoaB
# oGxkYXA6Ly8vQ049QU1FJTIwQ1MlMjBDQSUyMDAxLENOPUFJQSxDTj1QdWJsaWMl
# MjBLZXklMjBTZXJ2aWNlcyxDTj1TZXJ2aWNlcyxDTj1Db25maWd1cmF0aW9uLERD
# PUFNRSxEQz1HQkw/Y0FDZXJ0aWZpY2F0ZT9iYXNlP29iamVjdENsYXNzPWNlcnRp
# ZmljYXRpb25BdXRob3JpdHkwHQYDVR0OBBYEFMhZoWfS7cerFd3KJYxV4M3+DOEi
# MA4GA1UdDwEB/wQEAwIHgDBQBgNVHREESTBHpEUwQzEpMCcGA1UECxMgTWljcm9z
# b2Z0IE9wZXJhdGlvbnMgUHVlcnRvIFJpY28xFjAUBgNVBAUTDTIzNjE2OSs0NTMz
# NzQwggHUBgNVHR8EggHLMIIBxzCCAcOgggG/oIIBu4Y8aHR0cDovL2NybC5taWNy
# b3NvZnQuY29tL3BraWluZnJhL0NSTC9BTUUlMjBDUyUyMENBJTIwMDEuY3Jshi5o
# dHRwOi8vY3JsMS5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEuY3Jshi5o
# dHRwOi8vY3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEuY3Jshi5o
# dHRwOi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEuY3Jshi5o
# dHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEuY3JshoG6
# bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEsQ049QlkyUEtJQ1NDQTAxLENO
# PUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxDTj1TZXJ2aWNlcyxDTj1D
# b25maWd1cmF0aW9uLERDPUFNRSxEQz1HQkw/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
# TGlzdD9iYXNlP29iamVjdENsYXNzPWNSTERpc3RyaWJ1dGlvblBvaW50MB8GA1Ud
# IwQYMBaAFBtmohn8m+ul2oSPGJjpEKTDe5K9MB8GA1UdJQQYMBYGCisGAQQBgjdb
# AgEGCCsGAQUFBwMDMA0GCSqGSIb3DQEBCwUAA4IBAQCVZn2MgvVx6Lix7aYfjSp6
# t9NYHifbtXl3VxQk20PyxzmNbXoXHQMtgWioOWP4SaQ0Jpw23TgpczqPCS/BWy0E
# t2iZ12XatAQRPqrsU4YKcTTExKEPa/gdOz63Okmi+5GQH78d53M5I39DJWzPja7d
# RdZgASuswapduSUZMAFJJOslCFtBYAuzrJDy+UH2k7NZQ4+ExtFuuwZZA16c1IbQ
# O9JwjGdYna9ZlNtWIc2RSDeNjX8St40y7hhxxrszktg13D1oGZX8+oeQBsPyzigY
# U+5JuPoUWGkFBUL8LKR6z3wddTWFZWrW5zfy2aQTxSYOpRYNcUmuAYfLBVhSNI/j
# MIII5jCCBs6gAwIBAgITHwAAABS0xR/G8oC+cQAAAAAAFDANBgkqhkiG9w0BAQsF
# ADA8MRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYDQU1FMRAw
# DgYDVQQDEwdhbWVyb290MB4XDTE2MDkxNTIxMzMwM1oXDTIxMDkxNTIxNDMwM1ow
# QTETMBEGCgmSJomT8ixkARkWA0dCTDETMBEGCgmSJomT8ixkARkWA0FNRTEVMBMG
# A1UEAxMMQU1FIENTIENBIDAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
# AQEA1VeBAtb5+tD3G4C53TfNJNxmYfzhiXKtKQzSGxuav660bTS1VEeDDjSnFhsm
# nlb6GkPCeYmCJwWgZGs+3oWJ8yad3//VoP99bXG8azzTJmT2PFM1yKxUXUJgi7I9
# y3C4ll/ATfBwbGGRXD+2PdkdlVpxKWzeNEPVwbCtxWjUhHr6Ecy9R6O23j+2/RSZ
# SgfzYctDzDWhNf0PvGPflm31PSk4+ozca337/Ozu0+naDKg5i/zFHhfSJZkq5dPP
# G6C8wDrdiwHh6G5IGrMd2QXnmvEfjtpPqE+G8MeWbszaWxlxEjQJQC6PBwn+8Qt4
# Vqlc0am3Z3fBw8kzRunOs8Mn/wIDAQABo4IE2jCCBNYwEAYJKwYBBAGCNxUBBAMC
# AQEwIwYJKwYBBAGCNxUCBBYEFJH8M85CnvaT5uJ9VNcIGLu413FlMB0GA1UdDgQW
# BBQbZqIZ/JvrpdqEjxiY6RCkw3uSvTCCAQQGA1UdJQSB/DCB+QYHKwYBBQIDBQYI
# KwYBBQUHAwEGCCsGAQUFBwMCBgorBgEEAYI3FAIBBgkrBgEEAYI3FQYGCisGAQQB
# gjcKAwwGCSsGAQQBgjcVBgYIKwYBBQUHAwkGCCsGAQUFCAICBgorBgEEAYI3QAEB
# BgsrBgEEAYI3CgMEAQYKKwYBBAGCNwoDBAYJKwYBBAGCNxUFBgorBgEEAYI3FAIC
# BgorBgEEAYI3FAIDBggrBgEFBQcDAwYKKwYBBAGCN1sBAQYKKwYBBAGCN1sCAQYK
# KwYBBAGCN1sDAQYKKwYBBAGCN1sFAQYKKwYBBAGCN1sEAQYKKwYBBAGCN1sEAjAZ
# BgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwEgYDVR0TAQH/
# BAgwBgEB/wIBADAfBgNVHSMEGDAWgBQpXlFeZK40ueusnA2njHUB0QkLKDCCAWgG
# A1UdHwSCAV8wggFbMIIBV6CCAVOgggFPhiNodHRwOi8vY3JsMS5hbWUuZ2JsL2Ny
# bC9hbWVyb290LmNybIYxaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraWluZnJh
# L2NybC9hbWVyb290LmNybIYjaHR0cDovL2NybDIuYW1lLmdibC9jcmwvYW1lcm9v
# dC5jcmyGI2h0dHA6Ly9jcmwzLmFtZS5nYmwvY3JsL2FtZXJvb3QuY3JshoGqbGRh
# cDovLy9DTj1hbWVyb290LENOPUFNRVJPT1QsQ049Q0RQLENOPVB1YmxpYyUyMEtl
# eSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9QU1F
# LERDPUdCTD9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0P2Jhc2U/b2JqZWN0Q2xh
# c3M9Y1JMRGlzdHJpYnV0aW9uUG9pbnQwggGrBggrBgEFBQcBAQSCAZ0wggGZMDcG
# CCsGAQUFBzAChitodHRwOi8vY3JsMS5hbWUuZ2JsL2FpYS9BTUVST09UX2FtZXJv
# b3QuY3J0MEcGCCsGAQUFBzAChjtodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtp
# aW5mcmEvY2VydHMvQU1FUk9PVF9hbWVyb290LmNydDA3BggrBgEFBQcwAoYraHR0
# cDovL2NybDIuYW1lLmdibC9haWEvQU1FUk9PVF9hbWVyb290LmNydDA3BggrBgEF
# BQcwAoYraHR0cDovL2NybDMuYW1lLmdibC9haWEvQU1FUk9PVF9hbWVyb290LmNy
# dDCBogYIKwYBBQUHMAKGgZVsZGFwOi8vL0NOPWFtZXJvb3QsQ049QUlBLENOPVB1
# YmxpYyUyMEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRp
# b24sREM9QU1FLERDPUdCTD9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9
# Y2VydGlmaWNhdGlvbkF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAKLdKhpqP
# H6QBaM3CAOqQi8oA4WQeZLW3QOXNmWm7UA018DQEa1yTqEQbuD5OlR1Wu/F289Dm
# XNTdsZM4GTKEaZehIiVaMoLvEJtu5h6CTyfWqPetNyOJqR1sGqod0Xwn5/G/zcTY
# Sxn5K3N8KdlcDrZAIyfq3yaEJYHGnA9eJ/f1RrfbJgeo/RAhICctOONwfpsBXcgi
# TuTmlD/k0DqogvzJgPq9GOkIyX/dxk7IkPzX/n484s0zHR4IKU58U3G1oPSQmZ5O
# HAvgHaEASkdN5E20HyJv5zN7du+QY08fI+VIci6pagLfXHYaTX3ZJ/MUM9XU+oU5
# y4qMLzTj1JIG0LVfuHK8yoB7h2inyTe7bn6h2G8NxZ02aKZ0xa+n/JnoXKNsaVPG
# 1SoTuItMsXV5pQtIShsBqnXqFjY3bJMlMhIofMcjiuOwRCW+prZ+PoYvE2P+ML7g
# s3L65GZ9BdKF3fSW3TvmpOujPQ23rzSle9WGxFJ02fNbaF9C7bG44uDzMoZU4P+u
# vQaB7KE4OMqAvYYfFy1tv1dpVIN/qhx0H/9oNiOJpuZZ39ZibLt9DXbsq5qwyHmd
# JXaisxwB53wJshUjc1i76xqFPUNGb8EZQ3aFKl2w9B47vfBi+nU3sN0tpnLPtew4
# LHWq4LBD5uiNZVBOYosZ6BKhSlk1+Y/0y1IxghUdMIIVGQIBATBYMEExEzARBgoJ
# kiaJk/IsZAEZFgNHQkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxFTATBgNVBAMTDEFN
# RSBDUyBDQSAwMQITNgAAAOhmnRtIQqVMRQABAAAA6DANBglghkgBZQMEAgEFAKCB
# rjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYK
# KwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQg6BrMYUioCdv6BCi6yRlNoENkvdYR
# kEwPI34Sk+x8rpYwQgYKKwYBBAGCNwIBDDE0MDKgFIASAE0AaQBjAHIAbwBzAG8A
# ZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTANBgkqhkiG9w0BAQEFAASC
# AQCDK3zdRl1oaZ511ZPrOQMWO4W8Qg1xSLdJOvcB2Vamafw0j5XYDdRq5R5zJKiG
# qlxduyCt45faoMN+2TmkH95gpEa2AYu+ubPVzhY09/DpXQExSgZyHoGsaoZmamZO
# H8LxTErqRcdwvIZTDa7etz0nwAH+CQ0zHDo/huxAkamrY8ARyvnmGwfyoYOxDjrB
# RXmRLO//ZcS4Gr8OXL16wYrHQSEfQtyN45bSLsqrcRCsaLQzTEnvsF77zgjvCw7o
# 0+AT1dVw0Ao1THlAh4MxTfY1ox2/qk/7915bxt0jDFBT7+aV+MoAT6rODtrdbYQW
# XLSCk2SpkOQN2sV3m8hXg+7RoYIS5TCCEuEGCisGAQQBgjcDAwExghLRMIISzQYJ
# KoZIhvcNAQcCoIISvjCCEroCAQMxDzANBglghkgBZQMEAgEFADCCAVEGCyqGSIb3
# DQEJEAEEoIIBQASCATwwggE4AgEBBgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIB
# BQAEIAP92UBfzWr8lMzMoYzxRGjztOMVHapn20EhUdq6BuMkAgZd00zXOCsYEzIw
# MTkxMjA1MjI0MTQ1LjU4M1owBIACAfSggdCkgc0wgcoxCzAJBgNVBAYTAlVTMRMw
# EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNh
# IE9wZXJhdGlvbnMxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOkQ2QkQtRTNFNy0x
# Njg1MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIOPDCC
# BPEwggPZoAMCAQICEzMAAAEeDrzlSxaiAxsAAAAAAR4wDQYJKoZIhvcNAQELBQAw
# fDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
# ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd
# TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMTkxMTEzMjE0MDQwWhcN
# MjEwMjExMjE0MDQwWjCByjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0
# b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEmMCQG
# A1UECxMdVGhhbGVzIFRTUyBFU046RDZCRC1FM0U3LTE2ODUxJTAjBgNVBAMTHE1p
# Y3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggEiMA0GCSqGSIb3DQEBAQUAA4IB
# DwAwggEKAoIBAQDOE7cYEKL89fBcrqzt/Bt1qpVfnrSxYwlYgs3r3C/tGlZeFEon
# cyqOa+RRYGQfW+p3AJHwCcWH+sZkONhw5raY7vnCtjtuKt8bvqNQ0aewxXd9utR5
# wWVUX5xKEezwCIfXnpwavixR+Gd6QKy91NcvE8FXQVPdVhDr3FMizOqkqchyHYrj
# 4M9LgtxbkiDycaxsav3X68TttcwpBcMCn2obFSZjCaUVzHbGr6EfoL03Teabx0WZ
# rEe2x7QT0ZkYQBCYmJS1UXQSAVVjqb1wnMXr7+1H8fHLrd1/dtM2DsR/DXwnwEoz
# 9Z1Upreflph3d1V2IbV9zKOefXgp/IB2aRS7AgMBAAGjggEbMIIBFzAdBgNVHQ4E
# FgQUjBMo55F4RuBL+36bP9mvJ9pmilswHwYDVR0jBBgwFoAU1WM6XIoxkPNDe3xG
# G8UzaFqFbVUwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQu
# Y29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGltU3RhUENBXzIwMTAtMDctMDEuY3Js
# MFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3Nv
# ZnQuY29tL3BraS9jZXJ0cy9NaWNUaW1TdGFQQ0FfMjAxMC0wNy0wMS5jcnQwDAYD
# VR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDCDANBgkqhkiG9w0BAQsFAAOC
# AQEALmTcjnWWI5CCEyJUDSXodjSHPN2w3oiARSDvg5jI27H2hj7r9C+/+eMU5kfk
# zI9mTJ/3m1uaUyaGvWO+aGXfF6hTvyhGAQo2oclwuQccPqVqk+9ARrIPptCHRmGh
# QAyWEJujVgtWrWN/KtKLHH6GWIBkeExySJF2aTfu7j69cgPz5DDSvl3UmghUBl1u
# TXUh/0MeQskhdwfJ4BKUaLO2qAAXmlQH42tRVasa0qNYMdPm7xF1YQVlr1EBnvm9
# lUHTab0NqVF+Eu6kbn3LUs0ogHgWmBAmkQjWOaytaLywMIhHdwYOyp7SwaJUHx69
# cP1XNrOdoknGhUXodOHSXX4hbTCCBnEwggRZoAMCAQICCmEJgSoAAAAAAAIwDQYJ
# KoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
# eSAyMDEwMB4XDTEwMDcwMTIxMzY1NVoXDTI1MDcwMTIxNDY1NVowfDELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0
# IFRpbWUtU3RhbXAgUENBIDIwMTAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
# AoIBAQCpHQ28dxGKOiDs/BOX9fp/aZRrdFQQ1aUKAIKF++18aEssX8XD5WHCdrc+
# Zitb8BVTJwQxH0EbGpUdzgkTjnxhMFmxMEQP8WCIhFRDDNdNuDgIs0Ldk6zWczBX
# JoKjRQ3Q6vVHgc2/JGAyWGBG8lhHhjKEHnRhZ5FfgVSxz5NMksHEpl3RYRNuKMYa
# +YaAu99h/EbBJx0kZxJyGiGKr0tkiVBisV39dx898Fd1rL2KQk1AUdEPnAY+Z3/1
# ZsADlkR+79BL/W7lmsqxqPJ6Kgox8NpOBpG2iAg16HgcsOmZzTznL0S6p/TcZL2k
# AcEgCZN4zfy8wMlEXV4WnAEFTyJNAgMBAAGjggHmMIIB4jAQBgkrBgEEAYI3FQEE
# AwIBADAdBgNVHQ4EFgQU1WM6XIoxkPNDe3xGG8UzaFqFbVUwGQYJKwYBBAGCNxQC
# BAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYD
# VR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZF
# aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9v
# Q2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcw
# AoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJB
# dXRfMjAxMC0wNi0yMy5jcnQwgaAGA1UdIAEB/wSBlTCBkjCBjwYJKwYBBAGCNy4D
# MIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vUEtJL2Rv
# Y3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABf
# AFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEB
# CwUAA4ICAQAH5ohRDeLG4Jg/gXEDPZ2joSFvs+umzPUxvs8F4qn++ldtGTCzwsVm
# yWrf9efweL3HqJ4l4/m87WtUVwgrUYJEEvu5U4zM9GASinbMQEBBm9xcF/9c+V4X
# NZgkVkt070IQyK+/f8Z/8jd9Wj8c8pl5SpFSAK84Dxf1L3mBZdmptWvkx872ynoA
# b0swRCQiPM/tA6WWj1kpvLb9BOFwnzJKJ/1Vry/+tuWOM7tiX5rbV0Dp8c6ZZpCM
# /2pif93FSguRJuI57BlKcWOdeyFtw5yjojz6f32WapB4pm3S4Zz5Hfw42JT0xqUK
# loakvZ4argRCg7i1gJsiOCC1JeVk7Pf0v35jWSUPei45V3aicaoGig+JFrphpxHL
# mtgOR5qAxdDNp9DvfYPw4TtxCd9ddJgiCGHasFAeb73x4QDf5zEHpJM692VHeOj4
# qEir995yfmFrb3epgcunCaw5u+zGy9iCtHLNHfS4hQEegPsbiSpUObJb2sgNVZl6
# h3M7COaYLeqN4DMuEin1wC9UJyH3yKxO2ii4sanblrKnQqLJzxlBTeCG+SqaoxFm
# MNO7dDJL32N79ZmKLxvHIa9Zta7cRDyXUHHXodLFVeNp3lfB0d4wwP3M5k37Db9d
# T+mdHhk4L7zPWAUu7w2gUDXa7wknHNWzfjUeCLraNtvTX4/edIhJEqGCAs4wggI3
# AgEBMIH4oYHQpIHNMIHKMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMSYwJAYD
# VQQLEx1UaGFsZXMgVFNTIEVTTjpENkJELUUzRTctMTY4NTElMCMGA1UEAxMcTWlj
# cm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUAOckG4+3p
# qzET/o43WLrKWYzKsNyggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMK
# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
# IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0Eg
# MjAxMDANBgkqhkiG9w0BAQUFAAIFAOGTjAswIhgPMjAxOTEyMDUyMjAwNDNaGA8y
# MDE5MTIwNjIyMDA0M1owdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA4ZOMCwIBADAK
# AgEAAgIizQIB/zAHAgEAAgIRqDAKAgUA4ZTdiwIBADA2BgorBgEEAYRZCgQCMSgw
# JjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3
# DQEBBQUAA4GBAIgbNtb++F96jqPElGWNrpwFHepri9gk2K/Huhm1Q7eUtOUR2Psq
# hJZB0UA9LW22dniFv5bjzfpiXS9+7dr8WetSz1sdS7P8FiWx2Hhq/YWL/Svpm/Hz
# yEgb+DStQKvWvWfq2o9b/nKwlcBOgsyMMkbxSuQHiGhz9PhHDTJldBXuMYIDDTCC
# AwkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
# BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEm
# MCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAEeDrzl
# SxaiAxsAAAAAAR4wDQYJYIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsq
# hkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQg2eNLxPdWzQD84tDxlP0DTeseRpJm
# n/jWBX7X85SOkoQwgfoGCyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCBzO+RYw99x
# OlHlvaefPKE3cS3NJdWU8foiBBwPjdZfRzCBmDCBgKR+MHwxCzAJBgNVBAYTAlVT
# MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1l
# LVN0YW1wIFBDQSAyMDEwAhMzAAABHg685UsWogMbAAAAAAEeMCIEIJQ7mDkjnO0n
# w8mgLBlIgZJM6/AT6Gi7zUJTMgdDNgf+MA0GCSqGSIb3DQEBCwUABIIBAGbw18dT
# Tapix0BD9HWi3GK4n3YVvh+IS/NoxnUcP636qFg06nSqekvYNPw8p/xDa0gQzjy/
# 2vCSDEwFZt/pfyjan2G2V2VVxJNP/f8Zo2Ru29g3YKHKDPITiPZrja2uVEWZkRsm
# leyaLvsvgRdeIlU0Wf7UX59O4lSC6fEDv4eDA4UtMmrWTI/Q0V7oLQqTPmDDSQbz
# p10Hjg4dIgAvNGt4j5mczrxiYiG22OBU5viXSWkN8jIoezP29gFfdsQVBkb6a484
# cWSvvde18hmrRtAhucbnBUjXMUK+xZXdkU8fi7GTIJ3HU0wNLsRtC2axr4Ss3Gpe
# y/Yy7o5/ecynuus=
# SIG # End signature block