Private/Invoke-OwnerLensPrepareEntraSnapshot.ps1

<#
.SYNOPSIS
Creates an OwnerLens Microsoft Entra snapshot file.
 
.DESCRIPTION
Exports service principals, application registrations, groups, group membership facts, owners, credentials, and permissions into the local JSON snapshot consumed by OwnerLens.
#>


function Invoke-OwnerLensPrepareEntraSnapshot {
  [CmdletBinding()]
  param(
  [string]$OutputPath = ".\data\entra-snapshot.json"
  )

$ownerExpand = "owners(`$select=id,displayName,userPrincipalName,mail)"

function Write-EntraSnapshotProgress {
  param([string]$Message)

  $timestamp = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
  Write-Host "[$timestamp] $Message"
}

function Get-EntraGroupMembersIncludingServicePrincipals {
  param(
    [Parameter(Mandatory = $true)]
    [string]$GroupId
  )

  $members = @()
  $uri = "/beta/groups/$($GroupId)/members?`$select=id,displayName,userPrincipalName,mail,appId,servicePrincipalType&`$top=999"

  while ($uri) {
    $currentUri = $uri
    $response = Invoke-OwnerLensRestRequestWithRetry `
      -OperationName "Microsoft Graph group members request" `
      -Request {
        return Invoke-MgGraphRequest -Method GET -Uri $currentUri -OutputType PSObject -ErrorAction Stop
      }
    $members += @($response.value)

    $nextLinkProperty = $response.PSObject.Properties["@odata.nextLink"]
    $uri = if ($nextLinkProperty) { $nextLinkProperty.Value } else { $null }
  }

  return $members
}

function Get-EntraOAuth2PermissionGrants {
  $grants = @()
  $uri = "/v1.0/oauth2PermissionGrants?`$select=id,clientId,consentType,principalId,resourceId,scope&`$top=999"

  while ($uri) {
    $currentUri = $uri
    $response = Invoke-OwnerLensRestRequestWithRetry `
      -OperationName "Microsoft Graph OAuth2 permission grants request" `
      -Request {
        return Invoke-MgGraphRequest -Method GET -Uri $currentUri -OutputType PSObject -ErrorAction Stop
      }
    $grants += @($response.value)

    $nextLinkProperty = $response.PSObject.Properties["@odata.nextLink"]
    $uri = if ($nextLinkProperty) { $nextLinkProperty.Value } else { $null }
  }

  return $grants
}

function ConvertTo-GraphBatchRelativeUrl {
  param(
    [Parameter(Mandatory = $true)]
    [string]$Url
  )

  if ($Url.StartsWith("https://graph.microsoft.com/v1.0", [System.StringComparison]::OrdinalIgnoreCase)) {
    return $Url.Substring("https://graph.microsoft.com/v1.0".Length)
  }

  if ($Url.StartsWith("/v1.0/", [System.StringComparison]::OrdinalIgnoreCase)) {
    return $Url.Substring("/v1.0".Length)
  }

  if ($Url.StartsWith("/", [System.StringComparison]::Ordinal)) {
    return $Url
  }

  return "/$Url"
}

function Get-EntraServicePrincipalAppRoleAssignmentsBatch {
  param(
    [array]$ServicePrincipals = @()
  )

  $assignments = @()
  $pendingRequests = @(
    foreach ($sp in @($ServicePrincipals)) {
      if ($sp -and -not [string]::IsNullOrWhiteSpace([string]$sp.Id)) {
        [pscustomobject]@{
          servicePrincipalId = [string]$sp.Id
          servicePrincipalDisplayName = [string]$sp.DisplayName
          url = "/servicePrincipals/$($sp.Id)/appRoleAssignments?`$select=id,appRoleId,principalId,principalDisplayName,resourceId,resourceDisplayName&`$top=999"
        }
      }
    }
  )
  $completedRequestCount = 0
  $totalInitialRequestCount = $pendingRequests.Count
  $batchSize = 20

  while ($pendingRequests.Count -gt 0) {
    $currentBatch = @($pendingRequests | Select-Object -First $batchSize)
    $pendingRequests = @($pendingRequests | Select-Object -Skip $currentBatch.Count)

    $batchRequests = @()
    $requestById = @{}

    for ($requestIndex = 0; $requestIndex -lt $currentBatch.Count; $requestIndex++) {
      $requestId = [string]($requestIndex + 1)
      $request = $currentBatch[$requestIndex]
      $requestById[$requestId] = $request
      $batchRequests += [pscustomobject]@{
        id = $requestId
        method = "GET"
        url = $request.url
      }
    }

    $body = @{ requests = $batchRequests } | ConvertTo-Json -Depth 10
    $currentBody = $body
    $response = Invoke-OwnerLensRestRequestWithRetry `
      -OperationName "Microsoft Graph app role assignments batch request" `
      -Request {
        return Invoke-MgGraphRequest -Method POST -Uri "/v1.0/`$batch" -Body $currentBody -ContentType "application/json" -OutputType PSObject -ErrorAction Stop
      }

    foreach ($batchResponse in @($response.responses)) {
      $request = $requestById[[string]$batchResponse.id]

      if (-not $request) {
        continue
      }

      if ($batchResponse.status -lt 200 -or $batchResponse.status -ge 300) {
        throw "Graph batch app role assignment query failed for service principal $($request.servicePrincipalDisplayName) ($($request.servicePrincipalId)) with status $($batchResponse.status)."
      }

      $assignments += @($batchResponse.body.value)
      $nextLinkProperty = $batchResponse.body.PSObject.Properties["@odata.nextLink"]

      if ($nextLinkProperty) {
        $pendingRequests += [pscustomobject]@{
          servicePrincipalId = $request.servicePrincipalId
          servicePrincipalDisplayName = $request.servicePrincipalDisplayName
          url = ConvertTo-GraphBatchRelativeUrl -Url $nextLinkProperty.Value
        }
      }

      $completedRequestCount += 1
    }

    Write-EntraSnapshotProgress "Loaded app role assignment pages: $completedRequestCount; initial service principal requests: $totalInitialRequestCount; pending page requests: $($pendingRequests.Count)"
  }

  return $assignments
}

$requiredGraphModules = @(
  "Microsoft.Graph.Authentication",
  "Microsoft.Graph.Applications"
)

foreach ($moduleName in $requiredGraphModules) {
  try {
    Import-Module $moduleName -ErrorAction Stop
  } catch {
    throw "Microsoft Graph PowerShell module missing: $moduleName. Install: Install-Module Microsoft.Graph -Scope CurrentUser"
  }
}

Write-EntraSnapshotProgress "Checking Microsoft Graph context"
$context = Get-MgContext

if (-not $context) {
  throw 'Not connected. Run: Connect-MgGraph -TenantId "<tenant-id>" -Scopes "Application.Read.All","Group.Read.All","Directory.Read.All"'
}

$tenantDisplayName = $null
try {
  Write-EntraSnapshotProgress "Loading tenant display name"
  $organizationResponse = Invoke-OwnerLensRestRequestWithRetry `
    -OperationName "Microsoft Graph organization request" `
    -Request {
      return Invoke-MgGraphRequest -Method GET -Uri "/v1.0/organization?`$select=id,displayName" -OutputType PSObject -ErrorAction Stop
    }
  $organization = @($organizationResponse.value) |
    Where-Object { $_.id -eq $context.TenantId } |
    Select-Object -First 1

  if (-not $organization) {
    $organization = @($organizationResponse.value) | Select-Object -First 1
  }

  if ($organization -and -not [string]::IsNullOrWhiteSpace([string]$organization.displayName)) {
    $tenantDisplayName = [string]$organization.displayName
  }
} catch {
  Write-EntraSnapshotProgress "Tenant display name lookup failed: $($_.Exception.Message)"
}

$snapshot = [ordered]@{
  meta = [ordered]@{
    provider = "entra"
    snapshotVersion = "0.4"
    createdAt = (Get-Date).ToUniversalTime().ToString("o")
    tenantId = $context.TenantId
    tenantDisplayName = $tenantDisplayName
    account = $context.Account
    scopes = $context.Scopes
  }
  servicePrincipals = @()
  applications = @()
  oauth2PermissionGrants = @()
  appRoleAssignments = @()
  groups = @()
  groupMembers = @()
}

$oauth2PermissionGrantIds = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::OrdinalIgnoreCase)

function Add-OAuth2PermissionGrantSnapshot {
  param(
    [Parameter(Mandatory = $true)]
    $Grant
  )

  if ([string]::IsNullOrWhiteSpace([string]$Grant.Id)) {
    return
  }

  if (-not $oauth2PermissionGrantIds.Add([string]$Grant.Id)) {
    return
  }

  $snapshot.oauth2PermissionGrants += [pscustomobject]@{
    id = $Grant.Id
    clientId = $Grant.ClientId
    consentType = $Grant.ConsentType
    principalId = $Grant.PrincipalId
    resourceId = $Grant.ResourceId
    scope = $Grant.Scope
  }
}

Write-EntraSnapshotProgress "Loading service principals from Microsoft Graph"
$servicePrincipals = Get-MgServicePrincipal `
  -All `
  -Property Id,AppId,DisplayName,ServicePrincipalType,PublisherName,AccountEnabled,AppOwnerOrganizationId,AppDisplayName,Homepage,LoginUrl,ReplyUrls,ServicePrincipalNames,Tags,AppRoles `
  -ExpandProperty $ownerExpand
$servicePrincipals = @($servicePrincipals)
Write-EntraSnapshotProgress "Loaded $($servicePrincipals.Count) service principals"

$servicePrincipalById = @{}

foreach ($sp in $servicePrincipals) {
  $servicePrincipalById[$sp.Id] = $sp
}

Write-EntraSnapshotProgress "Loading applications from Microsoft Graph"
$applications = Get-MgApplication `
  -All `
  -Property Id,AppId,DisplayName,SignInAudience,PublisherDomain,IdentifierUris,Tags,AppRoles,Api,RequiredResourceAccess,Web,Spa,PublicClient,PasswordCredentials,KeyCredentials,CreatedDateTime,DeletedDateTime,DisabledByMicrosoftStatus,Info,Notes `
  -ExpandProperty $ownerExpand
$applications = @($applications)
Write-EntraSnapshotProgress "Loaded $($applications.Count) applications"

$applicationOwnersByAppId = New-ApplicationOwnerIndex -Applications $applications

foreach ($app in $applications) {
  $applicationOwners = Get-ApplicationOwnersByAppId -AppId $app.AppId -ApplicationOwnersByAppId $applicationOwnersByAppId

  $snapshot.applications += [pscustomobject]@{
    id = $app.Id
    appId = $app.AppId
    displayName = $app.DisplayName
    signInAudience = $app.SignInAudience
    publisherDomain = $app.PublisherDomain
    identifierUris = $app.IdentifierUris
    tags = @(ConvertTo-EntraSnapshotTags -Tags $app.Tags)
    appRoles = @($app.AppRoles | ForEach-Object { ConvertTo-ApplicationAppRoleSnapshot -AppRole $_ })
    oauth2PermissionScopes = @($app.Api.Oauth2PermissionScopes | ForEach-Object { ConvertTo-SafeSnapshotValue -Value $_ })
    requiredResourceAccess = @($app.RequiredResourceAccess | ForEach-Object { ConvertTo-SafeSnapshotValue -Value $_ })
    web = ConvertTo-SafeSnapshotValue -Value $app.Web
    spa = ConvertTo-SafeSnapshotValue -Value $app.Spa
    publicClient = ConvertTo-SafeSnapshotValue -Value $app.PublicClient
    passwordCredentials = @($app.PasswordCredentials | ForEach-Object { ConvertTo-SafeSnapshotValue -Value $_ })
    keyCredentials = @($app.KeyCredentials | ForEach-Object { ConvertTo-SafeSnapshotValue -Value $_ })
    createdDateTime = if ($app.CreatedDateTime) { $app.CreatedDateTime.ToUniversalTime().ToString("o") } else { $null }
    deletedDateTime = if ($app.DeletedDateTime) { $app.DeletedDateTime.ToUniversalTime().ToString("o") } else { $null }
    disabledByMicrosoftStatus = $app.DisabledByMicrosoftStatus
    info = ConvertTo-SafeSnapshotValue -Value $app.Info
    notes = $app.Notes
    owners = @($applicationOwners)
  }
}

foreach ($sp in $servicePrincipals) {
  $servicePrincipalOwners = Get-ExpandedOwnerSnapshots -DirectoryObject $sp
  $applicationOwners = Get-ApplicationOwnersByAppId -AppId $sp.AppId -ApplicationOwnersByAppId $applicationOwnersByAppId

  $snapshot.servicePrincipals += [pscustomobject]@{
    id = $sp.Id
    appId = $sp.AppId
    displayName = $sp.DisplayName
    appDisplayName = $sp.AppDisplayName
    servicePrincipalType = $sp.ServicePrincipalType
    publisherName = $sp.PublisherName
    accountEnabled = $sp.AccountEnabled
    appOwnerOrganizationId = $sp.AppOwnerOrganizationId
    homepage = $sp.Homepage
    loginUrl = $sp.LoginUrl
    replyUrls = $sp.ReplyUrls
    servicePrincipalNames = $sp.ServicePrincipalNames
    tags = @(ConvertTo-EntraSnapshotTags -Tags $sp.Tags)
    servicePrincipalOwners = @($servicePrincipalOwners)
    applicationOwners = @($applicationOwners)
    appRoles = @(
      $sp.AppRoles | ForEach-Object {
        [pscustomobject]@{
          id = $_.Id
          value = $_.Value
          displayName = $_.DisplayName
          description = $_.Description
          isEnabled = $_.IsEnabled
          allowedMemberTypes = $_.AllowedMemberTypes
        }
      }
    )
  }
}

Write-EntraSnapshotProgress "Loading global OAuth2 permission grants from Microsoft Graph REST"
$oauth2PermissionGrants = @(Get-EntraOAuth2PermissionGrants)
Write-EntraSnapshotProgress "Loaded $($oauth2PermissionGrants.Count) global OAuth2 permission grants"

foreach ($grant in $oauth2PermissionGrants) {
  Add-OAuth2PermissionGrantSnapshot -Grant $grant
}

Write-EntraSnapshotProgress "Loading app role assignments from Microsoft Graph REST batch for $($servicePrincipals.Count) service principals"
$appRoleAssignments = @(Get-EntraServicePrincipalAppRoleAssignmentsBatch -ServicePrincipals $servicePrincipals)
Write-EntraSnapshotProgress "Loaded $($appRoleAssignments.Count) app role assignments"

foreach ($assignment in $appRoleAssignments) {
  $resourceServicePrincipal = $servicePrincipalById[$assignment.ResourceId]
  $appRole = $null

  if ($resourceServicePrincipal -and $resourceServicePrincipal.AppRoles) {
    $appRole = $resourceServicePrincipal.AppRoles | Where-Object { [string]$_.Id -eq [string]$assignment.AppRoleId } | Select-Object -First 1
  }

  $snapshot.appRoleAssignments += [pscustomobject]@{
    id = $assignment.Id
    appRoleId = $assignment.AppRoleId
    appRoleDisplayName = if ($appRole) { $appRole.DisplayName } else { $null }
    appRoleValue = if ($appRole) { $appRole.Value } else { $null }
    principalId = $assignment.PrincipalId
    principalDisplayName = $assignment.PrincipalDisplayName
    resourceId = $assignment.ResourceId
    resourceDisplayName = $assignment.ResourceDisplayName
  }
}

$canReadGroups = $false

try {
  Import-Module Microsoft.Graph.Groups -ErrorAction Stop
  $canReadGroups = $true
} catch {
  Write-Warning "Microsoft.Graph.Groups could not be loaded. Skipping group snapshot. $($_.Exception.Message)"
}

if ($canReadGroups) {
  Write-EntraSnapshotProgress "Loading groups from Microsoft Graph"
  $groups = Get-MgGroup `
    -All `
    -Property Id,DisplayName,Description,Mail,MailEnabled,SecurityEnabled,GroupTypes,ProxyAddresses,Visibility
  $groups = @($groups)
  Write-EntraSnapshotProgress "Loaded $($groups.Count) groups"

  for ($groupIndex = 0; $groupIndex -lt $groups.Count; $groupIndex++) {
    $group = $groups[$groupIndex]
    Write-EntraSnapshotProgress "[$($groupIndex + 1)/$($groups.Count)] Loading group members for group: $($group.DisplayName) ($($group.Id))"
    $members = Get-EntraGroupMembersIncludingServicePrincipals -GroupId $group.Id
    $members = @($members)
    Write-EntraSnapshotProgress "[$($groupIndex + 1)/$($groups.Count)] Loaded $($members.Count) group members"

    $memberEmails = @(
      $members | ForEach-Object {
        $mail = Get-DirectoryObjectSnapshotValue -DirectoryObject $_ -Name "Mail"
        $userPrincipalName = Get-DirectoryObjectSnapshotValue -DirectoryObject $_ -Name "UserPrincipalName"

        if ($mail) {
          $mail
        } elseif ($userPrincipalName) {
          $userPrincipalName
        }
      } | Where-Object { $_ } | Select-Object -Unique
    )

    foreach ($member in $members) {
      $memberSnapshot = ConvertTo-GroupMemberSnapshot -Group $group -Member $member -ServicePrincipalById $servicePrincipalById
      if ($memberSnapshot.memberId) {
        $snapshot.groupMembers += $memberSnapshot
      }
    }

    $snapshot.groups += [pscustomobject]@{
      id = $group.Id
      displayName = $group.DisplayName
      description = $group.Description
      mail = $group.Mail
      mailEnabled = $group.MailEnabled
      securityEnabled = $group.SecurityEnabled
      groupTypes = $group.GroupTypes
      proxyAddresses = $group.ProxyAddresses
      visibility = $group.Visibility
      memberEmails = $memberEmails
      memberEmailCount = $memberEmails.Count
    }
  }
}

$snapshot.meta.servicePrincipalCount = $snapshot.servicePrincipals.Count
$snapshot.meta.applicationCount = $snapshot.applications.Count
$snapshot.meta.oauth2PermissionGrantCount = $snapshot.oauth2PermissionGrants.Count
$snapshot.meta.appRoleAssignmentCount = $snapshot.appRoleAssignments.Count
$snapshot.meta.groupCount = $snapshot.groups.Count
$snapshot.meta.groupMemberCount = $snapshot.groupMembers.Count

$outputDirectory = Split-Path -Parent $OutputPath
if (-not [string]::IsNullOrWhiteSpace($outputDirectory) -and -not (Test-Path $outputDirectory)) {
  New-Item -ItemType Directory -Path $outputDirectory -Force | Out-Null
}

$snapshot | ConvertTo-Json -Depth 20 | Out-File $OutputPath -Encoding utf8
}

# SIG # Begin signature block
# MII9MQYJKoZIhvcNAQcCoII9IjCCPR4CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCmKLLbRT+TOp2I
# JldU67LAyjeXw74xdSfUL4z1itR7taCCIfYwggXMMIIDtKADAgECAhBUmNLR1FsZ
# lUgTecgRwIeZMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVu
# dGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAy
# MDAeFw0yMDA0MTYxODM2MTZaFw00NTA0MTYxODQ0NDBaMHcxCzAJBgNVBAYTAlVT
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jv
# c29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRo
# b3JpdHkgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALORKgeD
# Bmf9np3gx8C3pOZCBH8Ppttf+9Va10Wg+3cL8IDzpm1aTXlT2KCGhFdFIMeiVPvH
# or+Kx24186IVxC9O40qFlkkN/76Z2BT2vCcH7kKbK/ULkgbk/WkTZaiRcvKYhOuD
# PQ7k13ESSCHLDe32R0m3m/nJxxe2hE//uKya13NnSYXjhr03QNAlhtTetcJtYmrV
# qXi8LW9J+eVsFBT9FMfTZRY33stuvF4pjf1imxUs1gXmuYkyM6Nix9fWUmcIxC70
# ViueC4fM7Ke0pqrrBc0ZV6U6CwQnHJFnni1iLS8evtrAIMsEGcoz+4m+mOJyoHI1
# vnnhnINv5G0Xb5DzPQCGdTiO0OBJmrvb0/gwytVXiGhNctO/bX9x2P29Da6SZEi3
# W295JrXNm5UhhNHvDzI9e1eM80UHTHzgXhgONXaLbZ7LNnSrBfjgc10yVpRnlyUK
# xjU9lJfnwUSLgP3B+PR0GeUw9gb7IVc+BhyLaxWGJ0l7gpPKWeh1R+g/OPTHU3mg
# trTiXFHvvV84wRPmeAyVWi7FQFkozA8kwOy6CXcjmTimthzax7ogttc32H83rwjj
# O3HbbnMbfZlysOSGM1l0tRYAe1BtxoYT2v3EOYI9JACaYNq6lMAFUSw0rFCZE4e7
# swWAsk0wAly4JoNdtGNz764jlU9gKL431VulAgMBAAGjVDBSMA4GA1UdDwEB/wQE
# AwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIftJqhSobyhmYBAcnz1AQ
# T2ioojAQBgkrBgEEAYI3FQEEAwIBADANBgkqhkiG9w0BAQwFAAOCAgEAr2rd5hnn
# LZRDGU7L6VCVZKUDkQKL4jaAOxWiUsIWGbZqWl10QzD0m/9gdAmxIR6QFm3FJI9c
# Zohj9E/MffISTEAQiwGf2qnIrvKVG8+dBetJPnSgaFvlVixlHIJ+U9pW2UYXeZJF
# xBA2CFIpF8svpvJ+1Gkkih6PsHMNzBxKq7Kq7aeRYwFkIqgyuH4yKLNncy2RtNwx
# AQv3Rwqm8ddK7VZgxCwIo3tAsLx0J1KH1r6I3TeKiW5niB31yV2g/rarOoDXGpc8
# FzYiQR6sTdWD5jw4vU8w6VSp07YEwzJ2YbuwGMUrGLPAgNW3lbBeUU0i/OxYqujY
# lLSlLu2S3ucYfCFX3VVj979tzR/SpncocMfiWzpbCNJbTsgAlrPhgzavhgplXHT2
# 6ux6anSg8Evu75SjrFDyh+3XOjCDyft9V77l4/hByuVkrrOj7FjshZrM77nq81YY
# uVxzmq/FdxeDWds3GhhyVKVB0rYjdaNDmuV3fJZ5t0GNv+zcgKCf0Xd1WF81E+Al
# GmcLfc4l+gcK5GEh2NQc5QfGNpn0ltDGFf5Ozdeui53bFv0ExpK91IjmqaOqu/dk
# ODtfzAzQNb50GQOmxapMomE2gj4d8yu8l13bS3g7LfU772Aj6PXsCyM2la+YZr9T
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggaoMIIEkKADAgECAhMzAAKajpPw
# gw8GGQINAAAAApqOMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDMwHhcNMjYwNjI5MTIyNTE0WhcNMjYwNzAy
# MTIyNTE0WjBpMQswCQYDVQQGEwJQTDEXMBUGA1UECB4OAUEA8wBkAHoAawBpAGUx
# DzANBgNVBAcTBldpZWx1bjEXMBUGA1UEChMOc29mdDRwbSBzcCB6b28xFzAVBgNV
# BAMTDnNvZnQ0cG0gc3Agem9vMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKC
# AYEAhMGKmy7Gt4CE101CTF4dlSRRUeC0YxhbrNfAcmOBSzaCL03tsI23+QAHEo4P
# VjpT57aSNoOUYkiGV9UfgIvs/GtJwwjUf45yu10umzM++kISP8lU1vWXcStG0QEk
# gvEnJERags1RU5Qxoc8BOWoKTU7YZ53sFOmjJ2w57+y0wR3HCddL5ZXClVhXifks
# P9hvOtgjaNl1gNavDm4dU/1IImMM/0V++5ZaIbeg/XzATbexJ873gUZsZzXKifra
# UnS0hhE6w79w/ZWlK9OAOa5X1wEY7CiaFCqlaVomkQ2QxxF8EaakwQAQPNf4jgAw
# zGwGB1efKF05XSHxXp8t8eTAI0EphTv2rsgbViHM7g6s7P6g3JlN0tec9AndUwyk
# e3iFP3yQPNTgkhIOumKVWR9BtOSU3r99sCMdxejvvA4+LMWngflM2g7tCH3iP4UK
# 1GPerM/x4q9aAzPddlODjZD1JlO6gMUbZr/h/ufq7mX7TYC03tRbbdpm8wCM/OZ4
# pfMvAgMBAAGjggHWMIIB0jAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA9
# BgNVHSUENjA0BgorBgEEAYI3YQEABggrBgEFBQcDAwYcKwYBBAGCN2GCycz3dYGA
# 0Y0Tg469piSB0sq0aDAdBgNVHQ4EFgQU7TqVKg6lwu/5YtvRThb6akqaJ1QwHwYD
# VR0jBBgwFoAUpEMMf3ZapYXnPo0oDwwXokVpcMYwZwYDVR0fBGAwXjBcoFqgWIZW
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw
# SUQlMjBWZXJpZmllZCUyMENTJTIwQU9DJTIwQ0ElMjAwMy5jcmwwdAYIKwYBBQUH
# AQEEaDBmMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp
# b3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUy
# MENBJTIwMDMuY3J0MFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNo
# dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5o
# dG0wDQYJKoZIhvcNAQEMBQADggIBAAmUdPVUR0c2s5+vKT3aTWsxLxt2Mc5UgcjT
# LrNneWS/25jguHMrkQvgP4ZYxBe9lpMzp0GKu/kT6DE6BhrruioLsRQ0nwKkSt+v
# PasSxuX/KBPxzzb7lcOY8eUoFvs693mnkOMwSw6yxUi4bKvamQ5TgXq96Onz4It6
# bIQwKWFYedSPfD0ZmTsn4PWllcxZLjsNbiVd9prz37R537drRiIp3CfMBaqAx6gg
# 6DelPiXxLZMP+n8b2TL2foZNxdVKdRm0Y90uu2HJ3UgCV2BAhkIFk1BxUj9xjvcR
# eOUgd9r89LcQ4bhXzLOI3bGFWzGH/ueI+MV9J85zu7I8ecT83bvbGOs7wctQh/sc
# AK8XvoXWnq/6RVv+rgXk0RgwysQQEHnO0z0+2lQK4UeJpsQ2WtmmxEgS05aEEIx6
# ID8MUkp72rY4mN9weHFzKfikjuX06Hjv9YzTFovHFD3Tdtmiy7m/etv3F+rgDbWa
# 1cf0E4rmDlRIvqklxA8hpbum6uZJxsZnTfK30fZtPbE4D6MpQjaJdp2xm9fB0hEs
# NcijvF+9wUjM1gvS8InRiMmo2Kvk+4Xhu+cjYqjyW5i4Wew6N20oRBpycwbLvJT4
# qXgFp/RCBeTe+/llgmsL5gf38f1fiqEd4jYGJb1yJIX3zjDv+6zCwHGLVN1e33gR
# yV1GaGG5MIIGqDCCBJCgAwIBAgITMwACmo6T8IMPBhkCDQAAAAKajjANBgkqhkiG
# 9w0BAQwFADBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENB
# IDAzMB4XDTI2MDYyOTEyMjUxNFoXDTI2MDcwMjEyMjUxNFowaTELMAkGA1UEBhMC
# UEwxFzAVBgNVBAgeDgFBAPMAZAB6AGsAaQBlMQ8wDQYDVQQHEwZXaWVsdW4xFzAV
# BgNVBAoTDnNvZnQ0cG0gc3Agem9vMRcwFQYDVQQDEw5zb2Z0NHBtIHNwIHpvbzCC
# AaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAITBipsuxreAhNdNQkxeHZUk
# UVHgtGMYW6zXwHJjgUs2gi9N7bCNt/kABxKOD1Y6U+e2kjaDlGJIhlfVH4CL7Pxr
# ScMI1H+OcrtdLpszPvpCEj/JVNb1l3ErRtEBJILxJyREWoLNUVOUMaHPATlqCk1O
# 2Ged7BTpoydsOe/stMEdxwnXS+WVwpVYV4n5LD/YbzrYI2jZdYDWrw5uHVP9SCJj
# DP9FfvuWWiG3oP18wE23sSfO94FGbGc1yon62lJ0tIYROsO/cP2VpSvTgDmuV9cB
# GOwomhQqpWlaJpENkMcRfBGmpMEAEDzX+I4AMMxsBgdXnyhdOV0h8V6fLfHkwCNB
# KYU79q7IG1YhzO4OrOz+oNyZTdLXnPQJ3VMMpHt4hT98kDzU4JISDrpilVkfQbTk
# lN6/fbAjHcXo77wOPizFp4H5TNoO7Qh94j+FCtRj3qzP8eKvWgMz3XZTg42Q9SZT
# uoDFG2a/4f7n6u5l+02AtN7UW23aZvMAjPzmeKXzLwIDAQABo4IB1jCCAdIwDAYD
# VR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwPQYDVR0lBDYwNAYKKwYBBAGCN2EB
# AAYIKwYBBQUHAwMGHCsGAQQBgjdhgsnM93WBgNGNE4OOvaYkgdLKtGgwHQYDVR0O
# BBYEFO06lSoOpcLv+WLb0U4W+mpKmidUMB8GA1UdIwQYMBaAFKRDDH92WqWF5z6N
# KA8MF6JFaXDGMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0
# LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUy
# MEFPQyUyMENBJTIwMDMuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZY
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQl
# MjBJRCUyMFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDAzLmNydDBUBgNVHSAE
# TTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4IC
# AQAJlHT1VEdHNrOfryk92k1rMS8bdjHOVIHI0y6zZ3lkv9uY4LhzK5EL4D+GWMQX
# vZaTM6dBirv5E+gxOgYa67oqC7EUNJ8CpErfrz2rEsbl/ygT8c82+5XDmPHlKBb7
# Ovd5p5DjMEsOssVIuGyr2pkOU4F6vejp8+CLemyEMClhWHnUj3w9GZk7J+D1pZXM
# WS47DW4lXfaa89+0ed+3a0YiKdwnzAWqgMeoIOg3pT4l8S2TD/p/G9ky9n6GTcXV
# SnUZtGPdLrthyd1IAldgQIZCBZNQcVI/cY73EXjlIHfa/PS3EOG4V8yziN2xhVsx
# h/7niPjFfSfOc7uyPHnE/N272xjrO8HLUIf7HACvF76F1p6v+kVb/q4F5NEYMMrE
# EBB5ztM9PtpUCuFHiabENlrZpsRIEtOWhBCMeiA/DFJKe9q2OJjfcHhxcyn4pI7l
# 9Oh47/WM0xaLxxQ903bZosu5v3rb9xfq4A21mtXH9BOK5g5USL6pJcQPIaW7purm
# ScbGZ03yt9H2bT2xOA+jKUI2iXadsZvXwdIRLDXIo7xfvcFIzNYL0vCJ0YjJqNir
# 5PuF4bvnI2Ko8luYuFnsOjdtKEQacnMGy7yU+Kl4Baf0QgXk3vv5ZYJrC+YH9/H9
# X4qhHeI2BiW9ciSF984w7/uswsBxi1TdXt94EcldRmhhuTCCBygwggUQoAMCAQIC
# EzMAAAAYDeuRVamKAJgAAAAAABgwDQYJKoZIhvcNAQEMBQAwYzELMAkGA1UEBhMC
# VVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWlj
# cm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTAeFw0yNjAz
# MjYxODExMzJaFw0zMTAzMjYxODExMzJaMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBW
# ZXJpZmllZCBDUyBBT0MgQ0EgMDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
# AoICAQDIgNpgNFaiif2VWeWP5I6PnFXxJ/lB37fJR55GCvR7GLZBMkBijbiKVwgp
# BI3xM5nf484znH/qncJ+OCq6y3jgnQW+R8Zd7U+7LjlrmcskalzSQ0ghMxEpnBW8
# /HHs2V8ZJzQk6HP+SDsbvsL7LdlH/eO2l4mknhDBwr0Z/Q966TvEth5b8kCxj1vq
# iV4YNthLGRqZR9u2fK/yBMWu83p6O4uo2Edg++gEew5IL7vnnnKFqmSh/R9vPJy3
# WF1YcZewAUx8sXZNUnx3ZhVg59l2LpitPiwzE6FMqIsqaEvVe3MzuFd2a/uWDZH6
# VbDyUiRK78mIg1DQYA9zDEyyBFcNI+nxVSzglvL6u7PRuNqgcV3sf6ELxw89ysQM
# /Z4R1hRFWXRpyOWKKAKtfBHTk0UnNiPcxmLMMYs8jeUjOidfVPjTIry/UVwnwxdl
# kK85cZfBEMYZ/DBNOwdomP459Y1n8izKkbhsa+p4lw+cQVxATBFx9ggR79HhryT7
# HDmpPLvkJvBZ4wW4CW32UT2SMyDe28nIOU3m+hfHlVeKcLBQcym5VoRDjIcCVI7u
# qgGW2PNME0cfei8zCwCy6HCsssJWFS7eg/YbFhnATJcyWfMrkNuAbMfMN8Npg8cr
# S6jVVowyD0GG5zdgi+uQVcSK/638mA1xEYK3pnIoQgO09uuDBwIDAQABo4IB3DCC
# AdgwDgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBSk
# Qwx/dlqlhec+jSgPDBeiRWlwxjBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEF
# BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9z
# aXRvcnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMBIGA1UdEwEB/wQI
# MAYBAf8CAQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1zSmepEhqMOYwcAYDVR0f
# BGkwZzBloGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwv
# TWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENB
# JTIwMjAyMS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsGAQUFBzAChmFodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIw
# VmVyaWZpZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3J0MA0GCSqG
# SIb3DQEBDAUAA4ICAQBxxyBW+X6mhdRiSwD9PMMWcGUAnx5/QUwnNvZdFGEX+4DR
# DIr9WCh4C87wHtw+lg1D3uzK10DstPX0LFLBFAC3vWMYX4ImXwoLhoR0xlN8mUdo
# rJ3bgnpCJWuI1531Z1rCwPuUrSkBxfOIGDk3p2ECb3Ho/xHi5PRSR/OUrWuQHwXi
# aXMTuXu3IRLezwVkZpFmNwYRD57R9Nx2F/yM7tzOY0Hh0hGCaYEK38/6FrS0SXad
# XWyDUCfn5XOGACRjUCnHx+JQUG0f4SHD+iblpAI0gl+ZHnVmdXXxHTZeTa0CYCIh
# FxKP2922s0g6zLmeiV13LWUmtt/UF7TrWXpMi2/0UNniaDoH7rnPGRV5xVX8uXy4
# sZii4aswzqPM7Y7+mzcranqZ8EjZk5gjLhQ3A2sZaprlOu8CaRmyfcIiVH7zVfgA
# vm81MWXFziAf7my7QOvnyEFPGddq8MSfPtfRyw/Uq3uH6KpoaJNIfPYH6fceZSi5
# 3Rat1A9grExq3ROjhhSpTcchuBItAMNVPxoKNbUm+iR/X3XkL+9WQginjyHe+hXL
# clY8vAGXFD1p40PqMIpAYsmEJBFKW9df4//1N5oQDr/FY9IBJl/oSS979i5rtT7N
# Zz9KvYraCPRBGs0QCy+sWvgQa0coM70QJVLeVwmSxUO/0od0w9Qry7bSLrxGoDCC
# B54wggWGoAMCAQICEzMAAAAHh6M0o3uljhwAAAAAAAcwDQYJKoZIhvcNAQEMBQAw
# dzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFI
# MEYGA1UEAxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENl
# cnRpZmljYXRlIEF1dGhvcml0eSAyMDIwMB4XDTIxMDQwMTIwMDUyMFoXDTM2MDQw
# MTIwMTUyMFowYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2ln
# bmluZyBQQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALLw
# wK8ZiCji3VR6TElsaQhVCbRS/3pK+MHrJSj3Zxd3KU3rlfL3qrZilYKJNqztA9OQ
# acr1AwoNcHbKBLbsQAhBnIB34zxf52bDpIO3NJlfIaTE/xrweLoQ71lzCHkD7A4A
# s1Bs076Iu+mA6cQzsYYH/Cbl1icwQ6C65rU4V9NQhNUwgrx9rGQ//h890Q8JdjLL
# w0nV+ayQ2Fbkd242o9kH82RZsH3HEyqjAB5a8+Ae2nPIPc8sZU6ZE7iRrRZywRmr
# KDp5+TcmJX9MRff241UaOBs4NmHOyke8oU1TYrkxh+YeHgfWo5tTgkoSMoayqoDp
# HOLJs+qG8Tvh8SnifW2Jj3+ii11TS8/FGngEaNAWrbyfNrC69oKpRQXY9bGH6jn9
# NEJv9weFxhTwyvx9OJLXmRGbAUXN1U9nf4lXezky6Uh/cgjkVd6CGUAf0K+Jw+GE
# /5VpIVbcNr9rNE50Sbmy/4RTCEGvOq3GhjITbCa4crCzTTHgYYjHs1NbOc6brH+e
# KpWLtr+bGecy9CrwQyx7S/BfYJ+ozst7+yZtG2wR461uckFu0t+gCwLdN0A6cFtS
# RtR8bvxVFyWwTtgMMFRuBa3vmUOTnfKLsLefRaQcVTgRnzeLzdpt32cdYKp+dhr2
# ogc+qM6K4CBI5/j4VFyC4QFeUP2YAidLtvpXRRo3AgMBAAGjggI1MIICMTAOBgNV
# HQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNlBKbAPD2Ns
# 72nX9c0pnqRIajDmMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNo
# dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5o
# dG0wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAf
# BgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHeg
# dYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0
# JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUl
# MjBBdXRob3JpdHklMjAyMDIwLmNybDCBwwYIKwYBBQUHAQEEgbYwgbMwgYEGCCsG
# AQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01p
# Y3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRp
# ZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6
# Ly9vbmVvY3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEA
# fyUqnv7Uq+rdZgrbVyNMul5skONbhls5fccPlmIbzi+OwVdPQ4H55v7VOInnmezQ
# EeW4LqK0wja+fBznANbXLB0KrdMCbHQpbLvG6UA/Xv2pfpVIE1CRFfNF4XKO8XYE
# a3oW8oVH+KZHgIQRIwAbyFKQ9iyj4aOWeAzwk+f9E5StNp5T8FG7/VEURIVWArbA
# zPt9ThVN3w1fAZkF7+YU9kbq1bCR2YD+MtunSQ1Rft6XG7b4e0ejRA7mB2IoX5hN
# h3UEauY0byxNRG+fT2MCEhQl9g2i2fs6VOG19CNep7SquKaBjhWmirYyANb0RJSL
# WjinMLXNOAga10n8i9jqeprzSMU5ODmrMCJE12xS/NWShg/tuLjAsKP6SzYZ+1Ry
# 358ZTFcx0FS/mx2vSoU8s8HRvy+rnXqyUJ9HBqS0DErVLjQwK8VtsBdekBmdTbQV
# oCgPCqr+PDPB3xajYnzevs7eidBsM71PINK2BoE2UfMwxCCX3mccFgx6UsQeRSdV
# VVNSyALQe6PT12418xon2iDGE81OGCreLzDcMAZnrUAx4XQLUz6ZTl65yPUiOh3k
# 7Yww94lDf+8oG2oZmDh5O1Qe38E+M3vhKwmzIeoB1dVLlz4i3IpaDcR+iuGjH2Td
# aC1ZOmBXiCRKJLj4DT2uhJ04ji+tHD6n58vhavFIrmcxghqRMIIajQIBATBxMFox
# CzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzAp
# BgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBBT0MgQ0EgMDMCEzMAApqO
# k/CDDwYZAg0AAAACmo4wDQYJYIZIAWUDBAIBBQCgXjAQBgorBgEEAYI3AgEMMQIw
# ADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQg0rJ8
# crXUnRHOgPeuDX0xCPJHLRVaoSMLpPIrTel6eaEwDQYJKoZIhvcNAQEBBQAEggGA
# FlL4g09iEgQAkpxEC1phaIvveKcFSyoKKkGPe6IbZpGtPdIa0nPJKL2q4NAka0hc
# fuhjIM3vpIgELMeCXPYJB6434jobGGAAxsb8sZbVBiX9FtBUR/28fqYjq6P0b2e1
# +ppz6+Rzscirh+aFdepsNa3PdPw06dtWOH38GEnCIusfMRQL13ol2AYlY7uMVZy6
# YFlaW2to8zN06CtOixq+41l7i/mDBBmjC/dUPguEztVl7t8ZCu5h03b4X5FEOsjE
# Zb8//eMl939BLQsOXHk3HnXrVOHfLyFS9eFZeswYtS14Y0pbfO/KTURw25NuHPam
# XpmV/awvKAWChBTQni0Ir9ICC720+3xjjhJW+3B2rNzXuhs7djpPadzgFkY6le+K
# l+7D/6UXWQ1N4S5X0GjKjgqGlqnp1exty7QWiuPhwZ+tjBPQmijoBqhl9iXbTmV2
# vgNnUj7+8yDWqUTK5NCDqtjKvMzR5qcWc5N7keAwB4AG7k32HUSRvICnKUKh5YtV
# oYIYETCCGA0GCisGAQQBgjcDAwExghf9MIIX+QYJKoZIhvcNAQcCoIIX6jCCF+YC
# AQMxDzANBglghkgBZQMEAgEFADCCAWIGCyqGSIb3DQEJEAEEoIIBUQSCAU0wggFJ
# AgEBBgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIHvoOXn6aOdFPDpYh1Bd
# m8yjThuu2DBvF3IjDwXzGdsYAgZqHFcJ8wMYEzIwMjYwNjMwMjA0NzU2LjA5Mlow
# BIACAfSggeGkgd4wgdsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNV
# BAsTHm5TaGllbGQgVFNTIEVTTjpBNTAwLTA1RTAtRDk0NzE1MDMGA1UEAxMsTWlj
# cm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHmggg8hMIIH
# gjCCBWqgAwIBAgITMwAAAAXlzw//Zi7JhwAAAAAABTANBgkqhkiG9w0BAQwFADB3
# MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMUgw
# RgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFJvb3QgQ2Vy
# dGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAwHhcNMjAxMTE5MjAzMjMxWhcNMzUxMTE5
# MjA0MjMxWjBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBp
# bmcgQ0EgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJ5851Jj
# /eDFnwV9Y7UGIqMcHtfnlzPREwW9ZUZHd5HBXXBvf7KrQ5cMSqFSHGqg2/qJhYqO
# QxwuEQXG8kB41wsDJP5d0zmLYKAY8Zxv3lYkuLDsfMuIEqvGYOPURAH+Ybl4SJEE
# Snt0MbPEoKdNihwM5xGv0rGofJ1qOYSTNcc55EbBT7uq3wx3mXhtVmtcCEr5ZKTk
# KKE1CxZvNPWdGWJUPC6e4uRfWHIhZcgCsJ+sozf5EeH5KrlFnxpjKKTavwfFP6Xa
# GZGWUG8TZaiTogRoAlqcevbiqioUz1Yt4FRK53P6ovnUfANjIgM9JDdJ4e0qiDRm
# 5sOTiEQtBLGd9Vhd1MadxoGcHrRCsS5rO9yhv2fjJHrmlQ0EIXmp4DhDBieKUGR+
# eZ4CNE3ctW4uvSDQVeSp9h1SaPV8UWEfyTxgGjOsRpeexIveR1MPTVf7gt8hY64X
# NPO6iyUGsEgt8c2PxF87E+CO7A28TpjNq5eLiiunhKbq0XbjkNoU5JhtYUrlmAbp
# xRjb9tSreDdtACpm3rkpxp7AQndnI0Shu/fk1/rE3oWsDqMX3jjv40e8KN5YsJBn
# czyWB4JyeeFMW3JBfdeAKhzohFe8U5w9WuvcP1E8cIxLoKSDzCCBOu0hWdjzKNu8
# Y5SwB1lt5dQhABYyzR3dxEO/T1K/BVF3rV69AgMBAAGjggIbMIICFzAOBgNVHQ8B
# Af8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGtpKDo1L0hjQM97
# 2K9J6T7ZPdshMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w
# EwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEw
# DwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2io
# ojCBhAYDVR0fBH0wezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
# aW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBS
# b290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNybDCBlAYIKwYB
# BQUHAQEEgYcwgYQwgYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0
# aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQw
# DQYJKoZIhvcNAQEMBQADggIBAF+Idsd+bbVaFXXnTHho+k7h2ESZJRWluLE0Oa/p
# O+4ge/XEizXvhs0Y7+KVYyb4nHlugBesnFqBGEdC2IWmtKMyS1OWIviwpnK3aL5J
# edwzbeBF7POyg6IGG/XhhJ3UqWeWTO+Czb1c2NP5zyEh89F72u9UIw+IfvM9lzDm
# c2O2END7MPnrcjWdQnrLn1Ntday7JSyrDvBdmgbNnCKNZPmhzoa8PccOiQljjTW6
# GePe5sGFuRHzdFt8y+bN2neF7Zu8hTO1I64XNGqst8S+w+RUdie8fXC1jKu3m9KG
# IqF4aldrYBamyh3g4nJPj/LR2CBaLyD+2BuGZCVmoNR/dSpRCxlot0i79dKOChmo
# ONqbMI8m04uLaEHAv4qwKHQ1vBzbV/nG89LDKbRSSvijmwJwxRxLLpMQ/u4xXxFf
# R4f/gksSkbJp7oqLwliDm/h+w0aJ/U5ccnYhYb7vPKNMN+SZDWycU5ODIRfyoGl5
# 9BsXR/HpRGtiJquOYGmvA/pk5vC1lcnbeMrcWD/26ozePQ/TWfNXKBOmkFpvPE8C
# H+EeGGWzqTCjdAsno2jzTeNSxlx3glDGJgcdz5D/AAxw9Sdgq/+rY7jjgs7X6fqP
# TXPmaCAJKVHAP19oEjJIBwD1LyHbaEgBxFCogYSOiUIr0Xqcr1nJfiWG2GwYe6Zo
# AF1bMIIHlzCCBX+gAwIBAgITMwAAAFZ+j51YCI7pYAAAAAAAVjANBgkqhkiG9w0B
# AQwFADBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcg
# Q0EgMjAyMDAeFw0yNTEwMjMyMDQ2NTFaFw0yNjEwMjIyMDQ2NTFaMIHbMQswCQYD
# VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3Nv
# ZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046
# QTUwMC0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRp
# bWUgU3RhbXBpbmcgQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEAtKWfm/ul027/d8Rlb8Mn/g0QUvvLqY2Vsy3tI8U2tFSspTZomZOD3BHT
# 8LkR+RrhMJgb1VjAKFNysaK9cLSXifPGSIBrPCgs9P4y24lrJEmrV6Q5z4BmqMhI
# PrZhEvZnWpCS4HO7jYSei/nxmC7/1Er+l5Lg3PmSxb8d2IVcARxSw1B4mxB6XI0n
# kel9wa1dYb2wfGpofraFmxZOxT9eNht4LH0RBSVueba6ZNpjS/0gtfm7qiIiyP6p
# 6PRzTTbMnVqsHnV/d/rW0zHx+Q+QNZ5wUqKmTZJB9hU853+2pX5rDfK32uNY9/WB
# OAmzbqgpEdQkbiMavUMyUDShmycIvgHdQnS207sTj8M+kJL3tOdahPuPqMwsaCCg
# dfwwQx0O9TKe7FSvbAEYs1AnldCl/KHGZCOVvUNqjyL10JLe0/+GD9/ynqXGWFpX
# OjaunvZ/cKROhjN4M5e6xx0b2miqcPii4/ii2ZheKallJET7CKlpFShs3wyg6F/f
# ojQxQvPnbWD4Nyx6lhjWjwmoLcx6w1FSCtavLCly33BLRSlTU4qKUxaa8d7YN7Eq
# pn9XO0SY0umOvKFXrWH7rxl+9iaicitdnTTksAnRjvekdKT3lg7lRMfmfZU8vXNi
# N0UYJzT9EjqjRm0uN/h0oXxPhNfPYqeFbyPXGGxzaYUz6zx3qTcCAwEAAaOCAcsw
# ggHHMB0GA1UdDgQWBBS+tjPyu6tZ/h5GsyLvyz1H+FNIWjAfBgNVHSMEGDAWgBRr
# aSg6NS9IY0DPe9ivSek+2T3bITBsBgNVHR8EZTBjMGGgX6BdhltodHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBQdWJsaWMlMjBS
# U0ElMjBUaW1lc3RhbXBpbmclMjBDQSUyMDIwMjAuY3JsMHkGCCsGAQUFBwEBBG0w
# azBpBggrBgEFBQcwAoZdaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j
# ZXJ0cy9NaWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmclMjBD
# QSUyMDIwMjAuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUH
# AwgwDgYDVR0PAQH/BAQDAgeAMGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEw
# PwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9j
# cy9SZXBvc2l0b3J5Lmh0bTAIBgZngQwBBAIwDQYJKoZIhvcNAQEMBQADggIBAA4D
# qAXEsO26j/La7Fgn/Qifit8xuZekqZ57+Ye+sH/hRTbEEjGYrZgsqwR/lUUfKCFp
# bZF8msaZPQJOR4YYUEU8XyjLrn8Y1jCSmoxh9l7tWiSoc/JFBw356JAmzGGxeBA2
# EWSxRuTr1AuZe6nYaN8/wtFkiHcs8gMadxXBs6DxVhyu5YnhLPQkfumKm3lFftwE
# 7pieV7f1lskmlgsC6AeSGCzGPZUgCvcH5Tv/Qe9z7bIImSD3SuzhOIwaP+eKQTYf
# 67TifyJKkWQSdGfTA6Kcu41k8LB6oPK+MLk1jbxxK5wPqLSL62xjK04SBXHEJSEn
# sFt0zxWkxP/lgej1DxqUnmrYEdkxvzKSHIAqFWSZul/5hI+vJxvFPhsNQBEk4cSu
# lDkJQpcdVi/gmf/mHFOYhDBjsa15s4L+2sBil3XV/T8RiR66Q8xYvTLRWxd2dVsr
# OoCwnsU4WIeiC0JinCv1WLHEh7Qyzr9RSr4kKJLWdpNYLhgjkojTmEkAjFO774t3
# xB7enbvIF0GOsV19xnCUzq9EGKyt0gMuaphKlNjJ+aTpjWMZDGo+GOKsnp93Hmft
# ml0Syp3F9+M3y+y6WJGUZoIZJq227jDjjEndtpUrh9BdPdVIfVJD/Au81Rzh05UH
# AivorQ3Os8PELHIgiOd9TWzbdgmGzcILt/ddVQERMYIHQzCCBz8CAQEweDBhMQsw
# CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD
# VQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAIT
# MwAAAFZ+j51YCI7pYAAAAAAAVjANBglghkgBZQMEAgEFAKCCBJwwEQYLKoZIhvcN
# AQkQAg8xAgUAMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0B
# CQUxDxcNMjYwNjMwMjA0NzU2WjAvBgkqhkiG9w0BCQQxIgQgAR558GN2H5Bwn6Jn
# RN76ss9Bivvm+OxOALzY91VPvVEwgbkGCyqGSIb3DQEJEAIvMYGpMIGmMIGjMIGg
# BCC2DDMlTaTj8JV3iTg5Xnpe4CSH60143Z+X9o5NBgMMqDB8MGWkYzBhMQswCQYD
# VQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQD
# EylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAA
# AFZ+j51YCI7pYAAAAAAAVjCCA14GCyqGSIb3DQEJEAISMYIDTTCCA0mhggNFMIID
# QTCCAikCAQEwggEJoYHhpIHeMIHbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25z
# MScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046QTUwMC0wNUUwLUQ5NDcxNTAzBgNV
# BAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5
# oiMKAQEwBwYFKw4DAhoDFQD/c/cpFSqQWYBeXggyRJ2ZbvYEEaBnMGWkYzBhMQsw
# CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD
# VQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDAN
# BgkqhkiG9w0BAQsFAAIFAO3uYlowIhgPMjAyNjA2MzAxNTQyMThaGA8yMDI2MDcw
# MTE1NDIxOFowdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA7e5iWgIBADAHAgEAAgIm
# 3TAHAgEAAgISQTAKAgUA7e+z2gIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEE
# AYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IB
# AQB+2LHG4QkacTa4E1Lz1SIGLpzMjie2gM6gA9zjFj3FqYeQlPy+gVUchX+GTPmK
# X6fgMwFcErM+RE0F6mnYJRh84RutRoclO88URjSqUYyEoLU95KUj8Fn13w6m9P54
# 9y91YnBLsSeFen79CwFQeW3MGtOQOYeCSb9LK31tc150UTfoCJMb0J2lCnvimf18
# 3VIujDTJVVdeQh1RHEmw/c2UzbyL2RFEgw19bYt3xB5nrTkI2GNFbjeCedNqSr5P
# W/7jULjz7CTtxStlEyvq+2YSmnDPw6AlAGCQFB8/wrui76xMBwL2/cz1p3hpfpzR
# j6VFkgm3PLgJ/+W1BE6i3/34MA0GCSqGSIb3DQEBAQUABIICAKDo1Oo3G6DO8kNI
# pv2VGNFHu35I4uHjWNLJjwiKtgGcQLb+uDfmhKItCXWHXxRGjlm6jhyIpQlbb+dW
# OCyeHBpYunrhgPv0PMp6gAKSspArSc4+m7RSEIDtje6mM0OXTrsYPEbc0favElMp
# NO3I24zGcgbC4xex3G8NlwU2Xu2vO4tSH4+CxcAnr0w0dJ06gdobLgIT89JYMLq9
# Vax6b0OkSG4+n7LrrKQLUfqTxe85nIOAWainRApExR87Y21SjAQTi4GfkQv3e71f
# 10YJkJXXbjMkNBMk2DbTR4f0CZE1ICXlnzanpTdjyUZtWJ16oOz00mel/hLl4nfg
# YTeNCI1ml3Bx9n/wVns+Tn3J2hQyMeoXiC3tpt4d146fjoqMUW9eWRggUIJEThwI
# uElEYIz/EAWmSrb+r4pdiU9auhXoZDoA/Ncw36+V7YN7BAXI15fsQZiKudjhS7xq
# X80AujZswLpHEz98weyfx2rBvgtfO+DHQdK3ljimUhUYHUq9/xO2pD0CIecw7oL/
# 8rxM3uSSDc6hYKn+kJTwDcxv6dLp8rq3S0HyYcOksOyufdN68dGKiFm2z+WzBWN9
# 26mlli+Ycq3en3JY2Q91PwL04Y8dBUtN1D1cLSQjDTfYz77SQpo0/qEe+f6N6Lg+
# KrKfj98nJxf9uXQfrzPtTCJJTq2X
# SIG # End signature block