Git.psd1

@{
    # Script module or binary module file associated with this manifest.
    RootModule           = 'Git.psm1'

    # Version number of this module.
    # Placeholder. build.ps1 derives the real version from CHANGELOG.md and
    # passes it to Build-Module via -SemVer; Build-Module rewrites this field
    # in the built manifest. Bumping it here has no effect.
    ModuleVersion        = '2.2.0'

    # Supported PSEditions
    CompatiblePSEditions = @('Desktop', 'Core')

    # ID used to uniquely identify this module.
    # Preserved from the v1.x manifest. PSGallery uses GUID for module
    # identity; a new GUID would orphan upgraders, so this value is fixed.
    GUID                 = '5878A10C-EFEF-495E-AFF6-0C9347D4BDE7'

    # Author of this module
    Author               = 'Manuel'

    # Company or vendor of this module
    CompanyName          = 'mtb.me'

    # Copyright statement for this module
    Copyright            = '(c) 2026 mtb.me. All rights reserved.'

    # Description of the functionality provided by this module
    Description          = 'Common Git workflow helpers: branch maintenance, tagging, and repository synchronization.'

    # Minimum version of the PowerShell engine required by this module
    PowerShellVersion    = '5.1'

    # Modules that must be imported into the global environment prior to importing this module.
    # Pinned to the minimum required Execution version; no upper bound.
    # 5.6.0 is the floor because the display-layer writers (Write-Ok,
    # Write-Fail, Write-Header, Write-Item, Write-Dim, Write-Change)
    # land there.
    RequiredModules      = @(
        @{ ModuleName = 'Execution'; ModuleVersion = '5.6.0' }
    )

    # Format files (.format.ps1xml) shipped with the module.
    # Registers the default table view for 'Git.BranchResult' records
    # emitted by the -PassThru paths.
    FormatsToProcess     = @('Git.Format.ps1xml')

    # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export.
    FunctionsToExport    = @('Add-AssumedUnchanged','Add-GitTag','Clear-GitBranches','Clear-GitBranchesIncludingGone','Invoke-Gitk','Invoke-GitkAll','Merge-GitAllRemoteBranches','Merge-GitBranchUseTheirs','Push-GitAllTrackedBranches','Remove-AssumedUnchanged','Remove-GitAllBranches','Reset-GitAllBranches','Set-GitTrackAllRemoteBranches','Set-GitTrackMatchedRemoteBranches','Update-GitAllBranches','Update-GitBranch')

    # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export.
    CmdletsToExport      = @()

    # Variables to export from this module
    VariablesToExport    = @()

    # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export.
    AliasesToExport      = @('agt','cgb','cgbi','gk','gka','pgst','ugab','ugb')

    # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell.
    PrivateData          = @{
        PSData = @{
            # Tags applied to this module. These help with module discovery in online galleries.
            Tags         = @('Git', 'Branch', 'Tag', 'Workflow', 'PowerShell', 'Windows', 'PSEdition_Desktop', 'PSEdition_Core')

            # A URL to the license for this module.
            LicenseUri   = 'https://github.com/ww3d/git/blob/main/LICENSE'

            # A URL to the main website for this project.
            ProjectUri   = 'https://github.com/ww3d/git'

            # ReleaseNotes of this module.
            # Placeholder. build.ps1 extracts the matching version section
            # from CHANGELOG.md and writes it here in the built manifest via
            # Update-Metadata. Editing this here has no effect.
            ReleaseNotes = 'Git v2.2.0+sha.759f721

## [v2.2.0] - 2026-07-31
 
### Added
 
- `Clear-GitBranchesIncludingGone` (Alias `cgbi`) als duenner Wrapper um
  `Clear-GitBranches -IncludeGoneRemoteBranches`. Der Aufraeum-Fall nach
  einem Merge, bei dem die Forge den Remote-Branch bereits geloescht hat,
  ist der haeufigste — der lange Schalter war dafuer unnoetige Reibung.
  Der Wrapper implementiert nichts nach: `-ProtectedBranches`, `-PassThru`,
  `-WhatIf` und `-Confirm` gehen unveraendert an `Clear-GitBranches`.
- `Clear-GitBranches -ProtectedBranches <string[]>`: zusaetzliche
  Branch-Namen, die nie geloescht werden, zusaetzlich zum Default-Branch
  und zum aktuellen Branch. Vergleich per exaktem Namen, nicht per Muster.
- Private `Get-GitDefaultBranch`: loest den Default-Branch ueber
  `git symbolic-ref refs/remotes/origin/HEAD` auf, faellt auf
  `git config --get init.defaultBranch` zurueck (nur wenn der Branch lokal
  existiert) und schuetzt bei Unklarheit `main` **und** `master`.
  Ueberschutz statt Raten: ein zu viel geschuetzter Branch kostet einen
  Handgriff, ein falsch geratener kostet den Default-Branch.
- Manifest-Invarianten-Test, der die `[Alias()]`-Attribute unter
  `src/Git/Public/` einsammelt und gegen `AliasesToExport` beider
  Manifeste sowie gegen die real exportierten Aliase prueft. Drift wird
  damit ein roter Test statt einer stillen Luecke.
 
### Changed
 
- **Schutz-Logik zentralisiert.** Die vier Detection-Funktionen liefern
  jetzt **rohe** Kandidaten; saemtliche Default-Branch- und
  Current-Branch-Filter sind aus ihnen entfernt. `Clear-GitBranches`
  filtert die zusammengefuehrte Kandidatenliste an genau **einer** Stelle:
  Default-Branch(es), aktueller Branch und `-ProtectedBranches`, jeweils
  per exaktem Namensvergleich. Vorher war der Schutz auf drei Funktionen
  mit je eigener, teils unverankerter Regex verteilt.
- `RequiredModules`-Pin `Execution` von `>= 5.1.0` auf `>= 5.6.0`
  angehoben — die Display-Writer (`Write-Ok`, `Write-Header`, `Write-Item`,
  `Write-Dim`) landen dort.
- `Clear-GitBranches` schreibt seine Statusausgabe ueber die
  Execution-Display-Writer statt ueber `Write-Host`: `Write-Header` vor der
  Kandidatenliste, `Write-Item` je Kandidat, `Write-Ok` je geloeschtem
  Branch (mit dem Branchnamen statt der git-Rohtextzeile) und `Write-Dim`
  fuer "No merged branches were found.". `Write-Warning` beim kaputten
  HEAD-Resolve bleibt `Write-Warning` — eine Warnung ist kein Statusglyph.
  Der `-PassThru`-Datenpfad (`Git.BranchResult`) ist unveraendert.
- `Clear-GitBranches` loest das Schutz-Set vor der Detection auf und reicht
  es als `-ExcludeBranches` an `Get-RebasedAndSquashedBranches` durch. Das ist
  ein reiner Performance-Skip — dieser Helfer faellt pro Kandidat auf ein
  echtes `git merge --no-commit --no-ff` zurueck, und das fuer den
  Default-Branch zu fahren ist Arbeit, deren Ergebnis das Gate ohnehin
  verwirft. Das zentrale Gate bleibt die einzige Policy-Stelle und filtert
  die Gesamtliste unveraendert danach.
- Aliase werden als `[Alias(''…'')]`-Attribut an der jeweiligen
  Public-Funktion deklariert statt als `Set-Alias`-Block in `Git.psm1` und
  im `Prefix` von `build.psd1`. ModuleBuilder leitet `AliasesToExport` im
  gebauten Manifest daraus ab; der Alias steht damit neben der Funktion,
  die er benennt, und es gibt keine zweite Liste mehr, die driften kann.
 
### Removed
 
- `Write-Progress`-Block in `Clear-GitBranches` inklusive `try/finally`
  und `$index`/`$total`. Die Fortschrittsanzeige war bei einer
  per-Item-Bestaetigung nie sichtbar — toter Code.
 
### Fixed
 
- `Get-GitMergedOrRebasedBranches`: unverankertes `-notmatch ''(master|main)''`
  verwarf legitime Branches wie `feature/mainpage` oder `masterfix`.
  Zusaetzlich verwarf `-notmatch [regex]::Escape($currentBranch)` auf dem
  Branch `feat` auch `feat-2`. Beide Filter sind entfernt; der aktuelle
  Branch wird per exaktem Vergleich uebersprungen.
- `Get-GitRemoteGoneBranches`: `-notmatch ''^(master|main)''` ohne Ende-Anker
  liess `maintenance` und `main-old` still verschwinden. Filter entfernt.
- `Get-GitMergedBranches`: drei gestapelte `Where-Object`-Filter durch
  einmaliges Parsen ersetzt. Der `* `-Marker wird beim Parsen gestrippt,
  nicht durch einen Filter, der die ganze Zeile verwarf.
- `Get-RebasedAndSquashedBranches` wurde von `Clear-GitBranches`
  parameterlos aufgerufen, obwohl es `-ExcludeBranches` kennt — dadurch
  war `main`/`master` loeschbar, sobald der User nicht darauf stand. Das
  zentrale Gate schliesst die Luecke; der Parameter bleibt fuer Aufrufer
  mit eigener Policy erhalten.
- `git branch`-Pseudo-Refs (`(HEAD detached at …)`,
  `(no branch, rebasing …)`) werden beim Parsen verworfen statt als
  Loesch-Kandidat weitergereicht.
- Branches, die in einem zweiten Worktree ausgecheckt sind (`+ `-Marker),
  werden beim Parsen verworfen. `git branch -D` verweigert sie
  ("Cannot delete branch … used by worktree"), und weil der Loeschaufruf
  ohne `-IgnoreExitCode` laeuft, brach der komplette Loeschlauf mitten in
  der Schleife mit einem terminierenden Fehler ab. Das zentrale Gate kann
  das nicht abfangen, weil es nur den aktuellen Branch kennt.
- Tote Fehler-Wachen in allen `-IgnoreExitCode`-Aufrufen der Detection-
  Funktionen und in `Clear-GitBranches`. `Invoke-NativeCommand` setzt
  `Success = $true` fest, sobald `-IgnoreExitCode` gesetzt ist, weshalb
  `if (-not $result.Success)` nie ausloesen konnte; die Pruefungen laufen
  jetzt ueber `ExitCode`. Sichtbare Folgen: `Get-GitMergedBranches` reichte
  bei kaputtem HEAD die git-Fehlerzeile als Branch-Kandidaten `error:`
  weiter; ein real fehlgeschlagenes `git cherry` in
  `Get-RebasedAndSquashedBranches` galt als "keine Commits, also merged"
  statt in den dokumentierten Test-Merge-Fallback zu fallen; und
  `Clear-GitBranches` warf ausserhalb eines Repositories eine Exception,
  statt die vorgesehene Warnung auszugeben. Der Aufrufer-Vertrag steht
  jetzt in der Hilfe von `Invoke-Git`.
- **Stiller Datenverlust in `Update-GitAllBranches`.** `$isAncestor` las das
  Ergebnis von `git merge-base --is-ancestor` ueber `.Success`, das unter
  `-IgnoreExitCode` konstant `$true` ist — damit galt *jeder* Branch als
  Ancestor seines Upstreams. Ein nicht-aktueller, divergierter Branch nahm
  deshalb den Fast-Forward-Pfad, und dessen Compare-and-Swap-`git update-ref`
  lief durch, weil der erwartete Alt-Wert genau der lokale Stand war, den es
  gerade verwarf: der Branch wurde auf den Upstream-Stand gesetzt, die
  lokalen Commits hingen nur noch im Reflog. Ohne Warnung, mit einem
  `-PassThru`-Record `FastForward` / `Success`. Betroffen waren dieselben
  Fundstellen auch bei `:94` (Upstream-Ref), `:111` (lokaler Ref), `:163`
  (CAS-Wache) und `Update-GitBranch.ps1:43` (Upstream-Aufloesung, wo
  git-Fehlertext als Branchname an `git rebase` ging). Alle fuenf pruefen
  jetzt `ExitCode`.
- `Get-GitMergedOrRebasedBranches`: ein fehlgeschlagenes `git cherry` brach
  mit `break` die gesamte Suche ab; alle danach iterierten Branches wurden
  still nicht mehr geprueft. Jetzt `continue` — Skip pro Branch, konsistent
  mit `Get-RebasedAndSquashedBranches`.
- `build.ps1`: ModuleBuilder-Abhängigkeit unter `3.2.0` pinnen. Die
  Upstream-Release `ModuleBuilder 3.2.0` (2026-05-11) verwendet im eigenen
  `.psm1` PowerShell-7-only-Syntax (Ternär-Operator `?:`, Pipe-leading
  Whitespace), sodass `Import-Module` auf Windows PowerShell 5.1 schon mit
  Parser-Fehlern abbricht und die CI-Matrix `PowerShell (powershell)`
  jedes Mal rot läuft. Sowohl `Install-Module` als auch `Import-Module`
  nutzen jetzt `-MaximumVersion ''3.1.9''`; der `Where-Object`-Filter vor
  `Install-Module` verhindert unnötige Reinstalls, wenn lokal bereits eine
  passende 3.1.x-Version vorhanden ist. Patch-Releases der 3.1.x-Schiene
  bleiben offen; der Pin wird zurückgezogen, sobald ModuleBuilder upstream
  einen Fix für den 5.1-Pfad veröffentlicht.'


            # Prerelease string of this module.
            # Placeholder. Build-Module derives this from the -SemVer suffix
            # passed by build.ps1 (e.g. '2.0.0-beta1' -> 'beta1'). Empty for
            # stable releases. Must exist as a property so Build-Module
            # rewrites it; otherwise it only emits a warning.
            Prerelease   = ''
        } # End of PSData hashtable
    } # End of PrivateData hashtable
}

# SIG # Begin signature block
# MIIn8gYJKoZIhvcNAQcCoIIn4zCCJ98CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDZrwfEfNRebkZs
# n150dRnK34dQ4LTeyyD09d/IWHpj36CCIP4wggWNMIIEdaADAgECAhAOmxiO+dAt
# 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV
# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa
# Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy
# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD
# ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
# ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E
# MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy
# unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF
# xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1
# 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB
# MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR
# WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6
# nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB
# YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S
# UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x
# q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB
# NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP
# TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC
# AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
# Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv
# bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0
# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB
# LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc
# Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov
# Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy
# oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW
# juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF
# mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z
# twGpn1eqXijiuZQwggahMIIEiaADAgECAhAHhD2tAcEVwnTuQacoIkZ5MA0GCSqG
# SIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx
# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRy
# dXN0ZWQgUm9vdCBHNDAeFw0yMjA2MjMwMDAwMDBaFw0zMjA2MjIyMzU5NTlaMFox
# CzAJBgNVBAYTAkxWMRkwFwYDVQQKExBFblZlcnMgR3JvdXAgU0lBMTAwLgYDVQQD
# EydHb0dldFNTTCBHNCBDUyBSU0E0MDk2IFNIQTI1NiAyMDIyIENBLTEwggIiMA0G
# CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCtHvQHskNmiqJndyWVCqX4FtYp5FfJ
# LO9Sh0BuwXuvBeNYt21xf8h/pLJ/7YzeKcNq9z4zEhecqtD0xhbvSB8ksBAfWBMZ
# O0NLfOT0j7WyNuD7rv+ZFza+mxIQ79s1dCiwUMwGonaoDK7mqZfDpKEExR6UyKBh
# 3aatT73U2Imx/x+fYTmQFq+N8FrLs6Fh6YEGWJTgsxyw1fAChCfgtEcZkdtcgK7q
# uqskHtW6PJ9l5VNJ7T3WXpznsOOxrz3qx0CzWjwK8+3Kv2X6piWvd8YRfAOycSrT
# 4/PM0cHLFc5xs/4m/ek4FCnYSem43doFftBxZBQkHKoPW3Bt6VIrhVIwvO7hrUjh
# chJJZYdSld3bANDviJ5/ToP7ENv97U9MtKFvmC5dzd1p4HxFR0p5wWmYQbW+y3RF
# m0np6H9m57MUMNp0ysmdJjb0f7+dVLX3OEBUb6H+r1LRLZT/xEOTuwOxGg2S4w25
# KGL9SCBUW4nkBljPHeJToU+THt0P8ZQf4B9IFlGxtLK0g3uOAnwSFgKtmNjhkTl8
# caLAQwbgEINCqrhc0b6k2Z8+QwgVAL0nIuzM9ckKP8xtIcWg85L3/l0cTkHQde+j
# KGDG2CdxBHtflLIUtwqD7JA2uCxWlIzRNgwT0kH2en0+QV8KziSGaqO2r06kwboq
# 2/xy4e98CEfSYwIDAQABo4IBWTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNV
# HQ4EFgQUyfwQ71DIy2t/vQhE7zpik+1bXpowHwYDVR0jBBgwFoAU7NfjgtJxXWRM
# 3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMD
# MHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNl
# cnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20v
# RGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRw
# Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAc
# BgNVHSAEFTATMAcGBWeBDAEDMAgGBmeBDAEEATANBgkqhkiG9w0BAQsFAAOCAgEA
# C9sK17IdmKTCUatEs7+yewhJnJ4tyrLwNEnfl6HrG8Pm7HZ0b+5Jc+GGqJT8kRc7
# mihuVrdsYNHdicueDL9imhtCusI/rUmjwhtflp+XgLkmgLGrmsEho1b+lGiRp7LC
# /10di8SAOilDkHj5Zx142xRvBrrWj9eOdSGHwYubAsEd6CDojwcaVz9pfXMzYO3k
# c0O6PXg1TkcgkYlCUAuDHuk/sZx68W0FVj1P2iMh+VUq9lL1puroAydoeWVUh/+c
# MXeqfgpBqlAW+r8ma5F6yKL0stVQH8vYb1ES0mJSIPyIfkIjC1V0pbZS3p0QWsKa
# afEor8fLfLNfSxntVI/ugut0+6ekluPWRpEXH+JAiNdRjbLbZchCREe3/Xl0Ylwk
# A+eQVJfM0A7XiuFtY/mOpK2AN+E25t5mQYFhpdxZX5LTDKWgDnb+A6QnEt4iNyuk
# cLaJuS8IPgPz0E2ALZLt3Rqs+lXifK/GwnNIWQNbf7FmLDB9ph8i8dvsR1hsjc2K
# PEW4bAsbvLcz8hN1zE1/QbOV92vDGoFjwZOi2koQ+UyEh0e8jDFHAKJeTI+p8EPE
# /mqvojLFAnt31yXIA2tjt0ERtsjkhBNmZY6SEOfnIoOwvyqavLPya1Ut3/2cOFLu
# NQ8Ql6HaZsNQErnnzn+ZEAaUTkPZaeVyoHIkODECLzkwgga0MIIEnKADAgECAhAN
# x6xXBf8hmS5AQyIMOkmGMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUw
# EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
# ITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yNTA1MDcwMDAw
# MDBaFw0zODAxMTQyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdp
# Q2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3Rh
# bXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTEwggIiMA0GCSqGSIb3DQEBAQUA
# A4ICDwAwggIKAoICAQC0eDHTCphBcr48RsAcrHXbo0ZodLRRF51NrY0NlLWZloMs
# VO1DahGPNRcybEKq+RuwOnPhof6pvF4uGjwjqNjfEvUi6wuim5bap+0lgloM2zX4
# kftn5B1IpYzTqpyFQ/4Bt0mAxAHeHYNnQxqXmRinvuNgxVBdJkf77S2uPoCj7GH8
# BLuxBG5AvftBdsOECS1UkxBvMgEdgkFiDNYiOTx4OtiFcMSkqTtF2hfQz3zQSku2
# Ws3IfDReb6e3mmdglTcaarps0wjUjsZvkgFkriK9tUKJm/s80FiocSk1VYLZlDwF
# t+cVFBURJg6zMUjZa/zbCclF83bRVFLeGkuAhHiGPMvSGmhgaTzVyhYn4p0+8y9o
# HRaQT/aofEnS5xLrfxnGpTXiUOeSLsJygoLPp66bkDX1ZlAeSpQl92QOMeRxykvq
# 6gbylsXQskBBBnGy3tW/AMOMCZIVNSaz7BX8VtYGqLt9MmeOreGPRdtBx3yGOP+r
# x3rKWDEJlIqLXvJWnY0v5ydPpOjL6s36czwzsucuoKs7Yk/ehb//Wx+5kMqIMRvU
# BDx6z1ev+7psNOdgJMoiwOrUG2ZdSoQbU2rMkpLiQ6bGRinZbI4OLu9BMIFm1UUl
# 9VnePs6BaaeEWvjJSjNm2qA+sdFUeEY0qVjPKOWug/G6X5uAiynM7Bu2ayBjUwID
# AQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU729TSunk
# Bnx6yuKQVvYv1Ensy04wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08w
# DgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEB
# BGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsG
# AQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVz
# dGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdp
# Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgG
# BmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBABfO+xaAHP4H
# PRF2cTC9vgvItTSmf83Qh8WIGjB/T8ObXAZz8OjuhUxjaaFdleMM0lBryPTQM2qE
# JPe36zwbSI/mS83afsl3YTj+IQhQE7jU/kXjjytJgnn0hvrV6hqWGd3rLAUt6vJy
# 9lMDPjTLxLgXf9r5nWMQwr8Myb9rEVKChHyfpzee5kH0F8HABBgr0UdqirZ7bowe
# 9Vj2AIMD8liyrukZ2iA/wdG2th9y1IsA0QF8dTXqvcnTmpfeQh35k5zOCPmSNq1U
# H410ANVko43+Cdmu4y81hjajV/gxdEkMx1NKU4uHQcKfZxAvBAKqMVuqte69M9J6
# A47OvgRaPs+2ykgcGV00TYr2Lr3ty9qIijanrUR3anzEwlvzZiiyfTPjLbnFRsjs
# Yg39OlV8cipDoq7+qNNjqFzeGxcytL5TTLL4ZaoBdqbhOhZ3ZRDUphPvSRmMThi0
# vw9vODRzW6AxnJll38F0cuJG7uEBYTptMSbhdhGQDpOXgpIUsWTjd6xpR6oaQf/D
# Jbg3s6KCLPAlZ66RzIg9sC+NJpud/v4+7RWsWCiKi9EOLLHfMR2ZyJ/+xhCx9yHb
# xtl5TPau1j/1MIDpMPx0LckTetiSuEtQvLsNz3Qbp7wGWqbIiOWCnb5WqxL3/BAP
# vIXKUjPSxyZsq8WhbaM2tszWkPZPubdcMIIG7TCCBNWgAwIBAgIQCoDvGEuN8QWC
# 0cR2p5V0aDANBgkqhkiG9w0BAQsFADBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGlt
# ZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExMB4XDTI1MDYwNDAwMDAw
# MFoXDTM2MDkwMzIzNTk1OVowYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lD
# ZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2VydCBTSEEyNTYgUlNBNDA5NiBUaW1l
# c3RhbXAgUmVzcG9uZGVyIDIwMjUgMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
# AgoCggIBANBGrC0Sxp7Q6q5gVrMrV7pvUf+GcAoB38o3zBlCMGMyqJnfFNZx+wvA
# 69HFTBdwbHwBSOeLpvPnZ8ZN+vo8dE2/pPvOx/Vj8TchTySA2R4QKpVD7dvNZh6w
# W2R6kSu9RJt/4QhguSssp3qome7MrxVyfQO9sMx6ZAWjFDYOzDi8SOhPUWlLnh00
# Cll8pjrUcCV3K3E0zz09ldQ//nBZZREr4h/GI6Dxb2UoyrN0ijtUDVHRXdmncOOM
# A3CoB/iUSROUINDT98oksouTMYFOnHoRh6+86Ltc5zjPKHW5KqCvpSduSwhwUmot
# uQhcg9tw2YD3w6ySSSu+3qU8DD+nigNJFmt6LAHvH3KSuNLoZLc1Hf2JNMVL4Q1O
# pbybpMe46YceNA0LfNsnqcnpJeItK/DhKbPxTTuGoX7wJNdoRORVbPR1VVnDuSeH
# VZlc4seAO+6d2sC26/PQPdP51ho1zBp+xUIZkpSFA8vWdoUoHLWnqWU3dCCyFG1r
# oSrgHjSHlq8xymLnjCbSLZ49kPmk8iyyizNDIXj//cOgrY7rlRyTlaCCfw7aSURO
# wnu7zER6EaJ+AliL7ojTdS5PWPsWeupWs7NpChUk555K096V1hE0yZIXe+giAwW0
# 0aHzrDchIc2bQhpp0IoKRR7YufAkprxMiXAJQ1XCmnCfgPf8+3mnAgMBAAGjggGV
# MIIBkTAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTkO/zyMe39/dfzkXFjGVBDz2GM
# 6DAfBgNVHSMEGDAWgBTvb1NK6eQGfHrK4pBW9i/USezLTjAOBgNVHQ8BAf8EBAMC
# B4AwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwgZUGCCsGAQUFBwEBBIGIMIGFMCQG
# CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXQYIKwYBBQUHMAKG
# UWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFRp
# bWVTdGFtcGluZ1JTQTQwOTZTSEEyNTYyMDI1Q0ExLmNydDBfBgNVHR8EWDBWMFSg
# UqBQhk5odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRU
# aW1lU3RhbXBpbmdSU0E0MDk2U0hBMjU2MjAyNUNBMS5jcmwwIAYDVR0gBBkwFzAI
# BgZngQwBBAIwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQBlKq3xHCcE
# ua5gQezRCESeY0ByIfjk9iJP2zWLpQq1b4URGnwWBdEZD9gBq9fNaNmFj6Eh8/Ym
# RDfxT7C0k8FUFqNh+tshgb4O6Lgjg8K8elC4+oWCqnU/ML9lFfim8/9yJmZSe2F8
# AQ/UdKFOtj7YMTmqPO9mzskgiC3QYIUP2S3HQvHG1FDu+WUqW4daIqToXFE/JQ/E
# ABgfZXLWU0ziTN6R3ygQBHMUBaB5bdrPbF6MRYs03h4obEMnxYOX8VBRKe1uNnzQ
# VTeLni2nHkX/QqvXnNb+YkDFkxUGtMTaiLR9wjxUxu2hECZpqyU1d0IbX6Wq8/gV
# utDojBIFeRlqAcuEVT0cKsb+zJNEsuEB7O7/cuvTQasnM9AWcIQfVjnzrvwiCZ85
# EE8LUkqRhoS3Y50OHgaY7T/lwd6UArb+BOVAkg2oOvol/DJgddJ35XTxfUlQ+8Hg
# gt8l2Yv7roancJIFcbojBcxlRcGG0LIhp6GvReQGgMgYxQbV1S3CrWqZzBt1R9xJ
# gKf47CdxVRd/ndUlQ05oxYy2zRWVFjF7mcr4C34Mj3ocCVccAvlKV9jEnstrniLv
# UxxVZE/rptb7IRE2lskKPIJgbaP5t2nGj/ULLi49xTcBZU8atufk+EMF/cWuiC7P
# OGT75qaL6vdCvHlshtjdNXOCIUjsarfNZzCCBxswggUDoAMCAQICEAYFIuuX3jJX
# cLz8AeYyZmYwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UEBhMCTFYxGTAXBgNVBAoT
# EEVuVmVycyBHcm91cCBTSUExMDAuBgNVBAMTJ0dvR2V0U1NMIEc0IENTIFJTQTQw
# OTYgU0hBMjU2IDIwMjIgQ0EtMTAeFw0yNTEyMjkwMDAwMDBaFw0yNjEyMjgyMzU5
# NTlaMGExCzAJBgNVBAYTAkRFMQ8wDQYDVQQIEwZCYXllcm4xETAPBgNVBAcTCEZh
# cmNoYW50MRYwFAYDVQQKEw1NYW51ZWwgVGFuemVyMRYwFAYDVQQDEw1NYW51ZWwg
# VGFuemVyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuxv/b0+nhaEE
# 94ewtCEHJFhCdgrwn6iF1lZ41Y40alX0LnSGBniZxw480yw+F9o6qhhprIpKvEoW
# WW1q+KNMxjdbLgKPlMcudU8DTfUVxKRxlVuqSMdizawGlQgwtwrj5RDsWEE2k0nq
# guNejIRWrWDn6JblBaj/WIx8DZ9YuYl6egi/KtJF5lYC6StOgymjFdZQ6WKs5v9Q
# IZMCvMw0BqpthVkFUXEQ07J49/h50bkl1dfNAnT2K8V2QeVGuJ5YOSs3GFMXiAxZ
# g6LJTHT0poTL5I5XD62X9xQ56LMRa9IDmFx6x4sMDrkn5oNVSGw7Vmx7cnI/5u1C
# 1pEymuN8vTa3DeMcVOngt7k9wRLyA+OTzdlobO+o+Hfr2S9zFVh+7PVDC0wUzrTd
# W7u1c63IK89HPHnTc37lnGFQUGPXYKXIooN6UhIbHRDTUFVO/sH2LysKLRyFWEs8
# qdOsszmx2zL+WNKmjrBmQBvPzrV7IimT6rpmpCYxEnoY/bFvXsmK5avv/Osj+efn
# GkCc9hm7oLxy494MFy3u5S1XqkB0jweBCJo750sGG3N8QapKAicVYobSXBdeLxsm
# H82yzsczRNPRAdyAGbFIe5vVpl43OSwclH9gRpREbdE63Bb8Uvyn+8FqECSb1f7N
# uLXsMwue6nHTf7Lc/u48srSd6yRnY70CAwEAAaOCAdQwggHQMB8GA1UdIwQYMBaA
# FMn8EO9QyMtrf70IRO86YpPtW16aMB0GA1UdDgQWBBREAaQBaa2AQTUPKUUkMbf9
# S5f5sDA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUFBwIBFhtodHRwOi8v
# d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoG
# CCsGAQUFBwMDMIGXBgNVHR8EgY8wgYwwRKBCoECGPmh0dHA6Ly9jcmwzLmRpZ2lj
# ZXJ0LmNvbS9Hb0dldFNTTEc0Q1NSU0E0MDk2U0hBMjU2MjAyMkNBLTEuY3JsMESg
# QqBAhj5odHRwOi8vY3JsNC5kaWdpY2VydC5jb20vR29HZXRTU0xHNENTUlNBNDA5
# NlNIQTI1NjIwMjJDQS0xLmNybDCBgwYIKwYBBQUHAQEEdzB1MCQGCCsGAQUFBzAB
# hhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wTQYIKwYBBQUHMAKGQWh0dHA6Ly9j
# YWNlcnRzLmRpZ2ljZXJ0LmNvbS9Hb0dldFNTTEc0Q1NSU0E0MDk2U0hBMjU2MjAy
# MkNBLTEuY3J0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggIBABqpRiImY/Bk
# WSYmqNEZsmjcqPNRBEp9bYFMylajgTFR7dOLqF9sCStkO+cs/X64RKHkZtlaCrQa
# ecZp6j/Dpq1fnkp2NfwuAaX2Osp/h6tMKnjaun3gvTdmI/j2iyJv6YJRxZ7daee7
# q9bkPzCTINwNc7AqWHbZ3Whlg+MmhLXaFHpoasR5JO9Vh+A8z8Y593G1bc7/Wjp2
# JWBNrCLjSUuz83YcDtf7yaURHuoJ96NDrHpbggaYU1s75sMhfBwAMTuYN2HmQe6/
# ShmDwGPtNzja0OtUdL0siHUp3Gouuqiux+ii7sjK0BDqvW3cbIQhCY41HkrJt4YF
# e+KAUzZXeger2mTb9StmWLTLuqTKvUnCpzsVlqEO1I6NwsXgV2u46/0EYqk42vBT
# e1vwXXj2Eawp5g4sSHQqbcxTAr/H5wZDIMp32tSyDMqV7zXhT6UWvxy5xua9Zkvf
# j7bn7CzUWgX/+GMyP8KlgXEDG5rCY1uSxleFBvn0ACZjWRp+kWl17WbdrIL22Kkl
# 2s1px/g9dfRbhHwNVAX1Mx2S7uCreeRs5qAA1cEjct2ulpNIbuPAEDDKenUHDTfN
# k0osUL9uaOjSx6HiVkcwPHgFzyMyu+SCVOUTpBhwBXIH+/r77s6XVnQWmjUHcZUY
# Y6KuwZiQ+E7joeAaZ0JGyW+LWx8WPfg7MYIGSjCCBkYCAQEwbjBaMQswCQYDVQQG
# EwJMVjEZMBcGA1UEChMQRW5WZXJzIEdyb3VwIFNJQTEwMC4GA1UEAxMnR29HZXRT
# U0wgRzQgQ1MgUlNBNDA5NiBTSEEyNTYgMjAyMiBDQS0xAhAGBSLrl94yV3C8/AHm
# MmZmMA0GCWCGSAFlAwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAw
# GQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisG
# AQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIDeaWKJYZ+ynvZFJelokM9Haskhe8J3V
# EWx8TR5P6LCZMA0GCSqGSIb3DQEBAQUABIICAAxbLVtORK2wZ/SIKhX3ETvPYmX1
# 456D4Sa1ogHksM72D41z3e9Cn/ZZJIfk/XX3sbC1Mey6dmxhm+TQZPG3bK427XGD
# l9ZFkqXHZ04Mv6v7Kk7/UdJqQRDr/MTPcpAMNbzGXhczOfHFypPpTZja3UBfc8gp
# dGrOc7keVdiOJTtQ3MelyV86YxOde7vpcxB8CGNMDS4MRXWJUxi4d0nvimGByCkH
# vzZVcgnU+N433q/r6rn0BeJPn3X4OD7bNMDz70arWsEX51aP5hh5t9FiPxU7Ub8h
# /OU/zPLmxFWNfDxozokKbJJfFOCrJqVs6abjV49GtHg4HA1KgN7MLrXxkqFXMj8t
# EAC0L1HqTxN0RFwoVmIFUjj2jOu+i293w6Fg3WGgb6sQuxQ/j1YU15IiPMAvUm75
# 5zoJdz6Aht3F1KNrV9K3Hq5vNCjebU7tKRt1I3u9/PMli5O65Kl53hXMxMmk/WDK
# P+SZ9aoNlLQdmIKVqbrWOCeF+YnNH9P8kIko07ZT3WlUFqZZ/a2qQB8hAN6lgtoy
# nX8Ar2n2YwK6xwqqEa3cXhmeldxS1Xczwch+Q/Xp4okGqP8wYsR6rZ2VNKl6n0+I
# gJQLFVbJi8vTJrdOEzmTdZkGHoWJI5csyqoCeAYBMVzE05UTJSc99Kj2kxrAEae8
# tf/tYVjgHPf0nz/MoYIDJjCCAyIGCSqGSIb3DQEJBjGCAxMwggMPAgEBMH0waTEL
# MAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhE
# aWdpQ2VydCBUcnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAy
# MDI1IENBMQIQCoDvGEuN8QWC0cR2p5V0aDANBglghkgBZQMEAgEFAKBpMBgGCSqG
# SIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTI2MDczMDIyMzkx
# MFowLwYJKoZIhvcNAQkEMSIEIOCV5D0NbRTBNoy3vtUCs2iHpngjNGdPQmoU9GSk
# C5CzMA0GCSqGSIb3DQEBAQUABIICAM+2oeytFrjfHrP7GydX6uRz7Jn4kiZBcAqK
# WeGxkTkSEg2E91Ol4CURyv6RDsorvrafqYGOVWxusuIcIaQ2zafOS/9I7w/gSMhV
# iil0vgfK4bEPB/PE7uI1td8UQuH0Kp6GK2OF8XT5xHBwm0vY3xaYz8LgWij24Imo
# 7uuDmqbKR/otlmUi/AQ5Lqx/bYA3PFXS6ANlZFlR4BdEAuwzVxE5LrgsE7fFRSEf
# Vm93fJ9IdKVs+9mYIkzcNjkz5Yzh2Y/taVakSgMfcNNcyR60jGNmH3PK1LAC9Nac
# 89Yc53NOGrZc3LDQBS9fxraFzvqW7eYE87D4Gk0ASQLKncpgHdq5WRQHJKBi9DPn
# GJQPnNOuMyQ03kqhXRyXy7ar/hqdgb/+mLWsB0PRc8clDMAubxggEYI454l5RRLK
# 14Mcompx2EokKY0xVIgQrqlmcw0j+9CdrI1+Tgu4tIEm1A/ogLa2NMF/x0FW0lZC
# rDF+q0fXITHiGnQeB4NlHFSaaqjSGurjEc1hDk6NcjahkKGBbe8nMqPwNQaWu4cv
# CFZL03Uw59xwcTBMrR5j7Pj4iyufhETLPR9RzuclqbpUDDSzmbpUyUs+Q7+eziWk
# 6egdeTnR1IieDbgQpdGBoxOsfXOOlK63f26EAPpO06CfUbpLkIVLHneFqj1BSpEB
# lWcucGAb
# SIG # End signature block