functions/Invoke-Data.ps1
function Invoke-Data { [CmdletBinding()] [OutputType([PSObject])] param ( [Parameter(Mandatory = $True, ValueFromPipelineByPropertyName)] [psobject]$RawData, [Parameter(Mandatory = $True, ValueFromPipelineByPropertyName)] [string]$OutDir ) begin { # Get function definition files. $functions = @( Get-ChildItem -Path "$PSScriptRoot\data" -Filter *.ps1 -ErrorAction SilentlyContinue ) # Dot source the files foreach ($import in @($functions)) { try { . $import.fullname } catch { Write-Error -Message "Failed to import function $($import.fullname): $_" } } } process { #$OutDirFilePath = "$($OutDir)\metadata_new.json" $SplitDirectory = "$($OutDir)\Datamart" $Msg = "$(" " * 4)Creating new $(($RawData.DatamartNM).ToLower()) object..."; Write-Host $Msg -ForegroundColor Gray; Write-Verbose $Msg; Write-Log $Msg; $Data = New-HCEmptyDatamartObject #region DATAMART $Data.ContentId = $RawData.ContentId.ToString() $Data.DatamartNM = $RawData.DatamartNM $Data.DatamartNoSpacesNM = (Get-CleanFileName -Name $RawData.DatamartNM -RemoveSpace) $Data.DataMartTypeDSC = $RawData.DataMartTypeDSC $Data.DescriptionTXT = $RawData.DescriptionTXT $Data.DestinationDatabaseName = $RawData.DestinationDatabaseName $Data.DestinationObjectPrefix = $RawData.DestinationObjectPrefix $Data.DestinationSchemaName = $RawData.DestinationSchemaName $Data.SamTypeCode = $RawData.SamTypeCode $Data.Status = $RawData.Status $Data.VersionText = $RawData.VersionText $Data.SAMDVersionText<#extension#> = $RawData.SAMDVersionText $Data._hcposh<#extension#> = $RawData._hcposh #endregion #region ENTITIES foreach ($Entity in $RawData.Tables.GetEnumerator()) { $HCEntity = New-HCEmptyEntityObject #region GENERAL PROPS $HCEntity.ContentId = $Entity.ContentId.ToString() $HCEntity.DescriptionTXT = $Entity.DescriptionTXT $HCEntity.DatabaseNM = $Entity.DatabaseNM $HCEntity.SchemaNM = $Entity.SchemaNM $HCEntity.TableNM = $Entity.TableNM $HCEntity.TableTypeNM = $Entity.TableTypeNM $HCEntity.ViewName = $Entity.ViewName $HCEntity.LoadType = $Entity.LoadType $HCEntity.LastModifiedTimestamp = $Entity.LastModifiedTimestamp $HCEntity.IsPersisted = $Entity.IsPersisted $HCEntity.IsPublic = $Entity.IsPublic $IsUniversal = $Entity.AttributeValues | Where-Object AttributeName -eq 'IsUniversal' if ($IsUniversal) { $HCEntity | Add-Member -Type NoteProperty -Name IsUniversal -Value $([System.Convert]::ToBoolean($IsUniversal.TextValue)) } #endregion #region PROTECTION PROPS $IsProtected = $Entity.AttributeValues | Where-Object AttributeName -eq 'IsProtected' if ($IsProtected) { #New attributes introduced with CAP 4.0 $HCEntity | Add-Member -Type NoteProperty -Name IsProtected -Value $([System.Convert]::ToBoolean($IsProtected.TextValue)) } #endregion #region FULLYQUALIFIEDNAME PROPS $HCFullyQualifiedName = New-HCEmptyFullyQualifiedNameObject $HCFullyQualifiedName.Table = "$($Entity.DatabaseNM).$($Entity.SchemaNM).$($Entity.TableNM)" $HCFullyQualifiedName.View = "$($Entity.DatabaseNM).$($Entity.SchemaNM).$($Entity.ViewName)" $HCEntity.FullyQualifiedNames = $HCFullyQualifiedName #endregion #region COLUMN PROPS foreach ($Column in $Entity.Columns.GetEnumerator()) { $HCColumn = New-HCEmptyColumnObject $HCColumn.ContentId = $Column.ContentId.ToString() $HCColumn.ColumnNM = $Column.ColumnNM $HCColumn.DataSensitivityCD = $Column.DataSensitivityCD $HCColumn.DataTypeDSC = $Column.DataTypeDSC $HCColumn.DescriptionTXT = $Column.DescriptionTXT $HCColumn.IsIncrementalColumnValue = $Column.IsIncrementalColumnValue $HCColumn.IsSystemColumnValue = $Column.IsSystemColumnValue $HCColumn.IsNullableValue = $Column.IsNullableValue $HCColumn.IsPrimaryKeyValue = $Column.IsPrimaryKeyValue $HCColumn.Ordinal = $Column.Ordinal $HCColumn.Status = $Column.Status $HCEntity.Columns += $HCColumn } #endregion #region INDEX PROPS foreach ($Index in $Entity.Indexes.GetEnumerator()) { $HCIndex = New-HCEmptyIndexObject $HCIndex.IndexName = $Index.IndexName $HCIndex.IndexTypeCode = $Index.IndexTypeCode $HCIndex.IsActive = $Index.IsActive foreach ($IndexColumn in $Index.IndexColumns.GetEnumerator()) { $HCIndexColumn = New-HCEmptyIndexColumnObject $HCIndexColumn.Ordinal = $IndexColumn.Ordinal $HCIndexColumn.ColumnNM = $IndexColumn.Column.ColumnNM $HCIndexColumn.IsCovering = $IndexColumn.IsCovering $HCIndexColumn.IsDescending = $IndexColumn.IsDescending $HCIndex.IndexColumns += $HCIndexColumn } $HCEntity.Indexes += $HCIndex } #endregion #region BINDING PROPS foreach ($Binding in $Entity.FedByBindings.GetEnumerator()) { $HCBinding = New-HCEmptyBindingObject $HCBinding.ContentId = $Binding.ContentId.ToString() $HCBinding.BindingName = $Binding.BindingName $HCBinding.BindingNameNoSpaces = (Get-CleanFileName -Name $Binding.BindingName -RemoveSpace) $HCBinding.BindingStatus = $Binding.BindingStatus $HCBinding.BindingDescription = $Binding.BindingDescription $HCBinding.ClassificationCode = $Binding.ClassificationCode $HCBinding.GrainName = $Binding.GrainName $HCBinding.BindingType = $Binding.GetType().ToString().split('.')[-1] switch ($HCBinding.BindingType) { 'SqlBinding' { $HCBinding.Script = $Binding.UserDefinedSQL } 'RBinding' { $HCBinding.Script = $Binding.Script } } #New attributes introduced with CAP 4.0 $IsProtected = $Binding.AttributeValues | Where-Object AttributeName -eq 'IsProtected' if ($IsProtected) { $HCBinding | Add-Member -Type NoteProperty -Name IsProtected -Value $([System.Convert]::ToBoolean($IsProtected.TextValue)) } $LoadType = if ($Binding.LoadType) { $Binding.LoadType } else { $HCEntity.LoadType } if ($LoadType) { $HCBinding | Add-Member -Type NoteProperty -Name LoadType -Value $LoadType if ($Binding.IncrementalConfigurations) { $HCBinding | Add-Member -Type NoteProperty -Name IncrementalConfigurations -Value @() foreach ($IncrementalConfiguration in $Binding.IncrementalConfigurations.GetEnumerator()) { $HCIncrementalConfiguration = New-HCEmptyIncrementalConfigurationObject $HCIncrementalConfiguration.IncrementalColumnName = $IncrementalConfiguration.IncrementalColumnName $HCIncrementalConfiguration.OverlapNumber = $IncrementalConfiguration.OverlapNumber $HCIncrementalConfiguration.OverlapType = $IncrementalConfiguration.OverlapType $HCIncrementalConfiguration.SourceDatabaseName = $IncrementalConfiguration.SourceDatabaseName $HCIncrementalConfiguration.SourceSchemaName = $IncrementalConfiguration.SourceSchemaName $HCIncrementalConfiguration.SourceTableAlias = $IncrementalConfiguration.SourceTableAlias $HCIncrementalConfiguration.SourceTableName = $IncrementalConfiguration.SourceTableName $HCBinding.IncrementalConfigurations += $HCIncrementalConfiguration } } } $HCEntity.Bindings += $HCBinding } #endregion #region EXTENSION PROPS $ExtensionContentIds = New-HCEmptyExtensionContentIdsObject if ($Entity.ParentEntityRelationships.Count -or $Entity.ChildEntityRelationships.Count) { $HCEntity | Add-Member -Type NoteProperty -Name IsExtended -Value $true -Force $HCEntity | Add-Member -Type NoteProperty -Name ExtensionContentIds -Value $ExtensionContentIds -Force } if ($Entity.ParentEntityRelationships.Count) { $HCEntity.ExtensionContentIds.CoreEntity = $Entity.ContentId.ToString() foreach ($Relationship in $Entity.ParentEntityRelationships.GetEnumerator()) { $HCEntity.ExtensionContentIds."$($Relationship.ChildRoleName)" = $Relationship.ChildEntity.ContentId.ToString() } } if ($Entity.ChildEntityRelationships.Count) { $HCEntity.ExtensionContentIds."$($Entity.ChildEntityRelationships.ChildRoleName)" = $Entity.ChildEntityRelationships.ChildEntity.ContentId.ToString() foreach ($Relationship in $Entity.ChildEntityRelationships.ParentEntity.ParentEntityRelationships.GetEnumerator()) { $HCEntity.ExtensionContentIds."$($Relationship.ChildRoleName)" = $Relationship.ChildEntity.ContentId.ToString() $HCEntity.ExtensionContentIds."$($Relationship.ParentRoleName)" = $Relationship.ParentEntity.ContentId.ToString() } } #endregion #region CUSTOM GROUP PROPS $HCEntity.EntityGroupNM = $HCEntity.Bindings[0].GrainName #Set the EntityGroupNM to the first Grain name for now // not a perfect solution if ($HCEntity.Bindings) { $HCEntity.ClassificationCode = $HCEntity.Bindings[0].ClassificationCode #Set the ClassificationCode to the first ClassificationCode for now // not a perfect solution } if ($Entity.AllowsDataEntry -eq $true) { $HCEntity.ClassificationCode = 'DataEntry' } #endregion $Data.Entities += $HCEntity } #endregion #region Update extension entity classification foreach ($Extension in $Data.Entities | Where-Object { ($_.ExtensionContentIds.PsObject.Properties.Value | Measure-Object).Count -eq 3 }) { foreach ($property in $Extension.ExtensionContentIds.PsObject.Properties) { $Entity = $Data.Entities[$Data.Entities.ContentId.IndexOf($property.Value)]; $Entity | Add-Member -Type NoteProperty -Name ExtensionTypeNM -Value $property.Name -Force; $Entity.ExtensionContentIds = $Extension.ExtensionContentIds; if ($property.Name -eq "OverridingExtensionView") { $Entity.ClassificationCode = "OverridingExtensionView"; } elseif ($property.Name -ne "CoreEntity" -and $Entity.ClassificationCode -notmatch "-") { $Entity.ClassificationCode = "$($Entity.ClassificationCode)-Extension" } foreach ($Binding in $Entity.Bindings) { $Binding.ClassificationCode = $Entity.ClassificationCode; } } } #endregion $Data.MaxLastModifiedTimestamp<#extension#> = ($Data.Entities.LastModifiedTimestamp | Measure-Object -Maximum).Maximum $Msg = "$(" " * 8)$(($Data.Entities | Measure-Object).Count) - Entities"; Write-Host $Msg -ForegroundColor White; Write-Verbose $Msg; Write-Log $Msg; $Msg = "$(" " * 8)$(($Data.Entities.Bindings | Measure-Object).Count) - Bindings"; Write-Host $Msg -ForegroundColor White; Write-Verbose $Msg; Write-Log $Msg; #region ADD DATA ENTRY DATA if ($RawData.DataEntryData) { foreach ($HCEntity in $Data.Entities | Where-Object { $_.ClassificationCode -eq 'DataEntry' }) { $DataEntryDataIndex = $RawData.DataEntryData.FullyQualifiedNM.IndexOf($HCEntity.FullyQualifiedNames.View) if ($DataEntryDataIndex -ne -1) { #New property added to store a maximum of 300 records for that Data entry entity #@{ FullyQualifiedNM = $Csv.BaseName; Data = Import-Csv -Path $Csv.FullName; Msg = $null } $DataEntryRecordCNT = ($RawData.DataEntryData[$DataEntryDataIndex].Data | Measure-Object).Count if ($DataEntryRecordCNT -gt 300) { $Msg = "Displaying only 300 out of $($DataEntryRecordCNT) records" } else { $Msg = "Displaying $($DataEntryRecordCNT) records" } $DataEntryData = New-Object PSObject $DataEntryData | Add-Member -Type NoteProperty -Name FullyQualifiedNM -Value $RawData.DataEntryData[$DataEntryDataIndex].FullyQualifiedNM $DataEntryData | Add-Member -Type NoteProperty -Name Data -Value ($RawData.DataEntryData[$DataEntryDataIndex].Data | Select-Object -First 300) $DataEntryData | Add-Member -Type NoteProperty -Name Data_All -Value ($RawData.DataEntryData[$DataEntryDataIndex].Data) $DataEntryData | Add-Member -Type NoteProperty -Name Msg -Value $Msg $HCEntity | Add-Member -Type NoteProperty -Name DataEntryData -Value $DataEntryData } } } #endregion #region PARSE BINDINGS $Msg = "$(" " * 4)Parsing tables and columns from sql..."; Write-Host $Msg -ForegroundColor Gray; Write-Verbose $Msg; Write-Log $Msg; foreach ($HCEntity in $Data.Entities) { foreach ($HCBinding in $HCEntity.Bindings | Where-Object BindingType -eq 'SqlBinding' | Where-Object {-not([String]::IsNullOrEmpty($_.Script))}) { #For each SqlBinding that has a Script value: $SourcedByEntities = $(Invoke-SqlParser -Query $HCBinding.Script -Log $False -SelectStar $False -Brackets $False) foreach ($SourcedByEntity in $SourcedByEntities | Where-Object { $_.DatabaseNM -and $_.SchemaNM -and $_.TableNM }) { $HCSourcedByEntity = New-HCEmptySourcedByEntityObject #$HCSourcedByEntity.ServerNM = $SourcedByEntity.ServerNM $HCSourcedByEntity.DatabaseNM = $SourcedByEntity.DatabaseNM $HCSourcedByEntity.SchemaNM = $SourcedByEntity.SchemaNM $HCSourcedByEntity.TableNM = $SourcedByEntity.TableNM $HCSourcedByEntity.FullyQualifiedNM = $SourcedByEntity.FullyQualifiedNM $HCSourcedByEntity.AliasNM = $SourcedByEntity.AliasNM $HCSourcedByEntity.BindingCount = 1 #if table originated from a system table if ($HCSourcedByEntity.SchemaNM -eq 'CatalystAdmin') { $HCSourcedByEntity.TableOrigin = 'System' } #or if table originated from a local table elseif (($Data.Entities.FullyQualifiedNames.Table -contains $HCSourcedByEntity.FullyQualifiedNM) -or ` ($Data.Entities.FullyQualifiedNames.View -contains $HCSourcedByEntity.FullyQualifiedNM)) { $HCSourcedByEntity.TableOrigin = 'Local' $HCSourcedByEntity.SourceContentId = ($Data.Entities | Where-Object { (($_.FullyQualifiedNames.Table -eq $HCSourcedByEntity.FullyQualifiedNM) -or ($_.FullyQualifiedNames.View -eq $HCSourcedByEntity.FullyQualifiedNM)) -and $_.ClassificationCode -ne 'OverridingExtensionView' }).ContentId #if it's a universal entity then it originates outside of this datamart if ($Data.Entities[$Data.Entities.ContentId.IndexOf($HCSourcedByEntity.SourceContentId)].IsUniversal) { $HCSourcedByEntity.TableOrigin = 'External' } } #else table must have originated externally else { $HCSourcedByEntity.TableOrigin = 'External' } foreach ($SourcedByColumn in $SourcedByEntity.Columns) { $HCSourcedByColumn = New-HCEmptySourcedByColumnObject $HCSourcedByColumn.ColumnNM = $SourcedByColumn.ColumnNM $HCSourcedByColumn.FullyQualifiedNM = $SourcedByColumn.FullyQualifiedNM $HCSourcedByColumn.AliasNM = $SourcedByColumn.AliasNM $HCSourcedByColumn.BindingCount = 1 $HCSourcedByEntity.SourcedByColumns += $HCSourcedByColumn } #check for missing alias ie PossibleColumns if ($SourcedByEntity.PossibleColumns) { $HCSourcedByEntity | Add-Member -Type NoteProperty -Name SourcedByPossibleColumns -Value @() foreach ($SourcedByPossibleColumn in $SourcedByEntity.PossibleColumns) { $HCSourcedByPossibleColumn = New-HCEmptySourcedByPossibleColumnObject $HCSourcedByPossibleColumn.ColumnNM = $SourcedByPossibleColumn.ColumnNM $HCSourcedByPossibleColumn.FullyQualifiedNM = "$($HCSourcedByEntity.FullyQualifiedNM).$($HCSourcedByPossibleColumn.ColumnNM)" $HCSourcedByEntity.SourcedByPossibleColumns += $HCSourcedByPossibleColumn } } $HCBinding.SourcedByEntities += $HCSourcedByEntity } } #region LEVEL-UP SOURCES (BINDING TO ENTITY) $HCEntityGroups = $HCEntity.Bindings.SourcedByEntities | Group-Object -Property FullyQualifiedNM foreach ($HCEntityGroup in $HCEntityGroups) { $HCSourcedByEntity = New-HCEmptySourcedByEntityObject #$HCSourcedByEntity.ServerNM = $HCEntityGroup.Group[0].ServerNM $HCSourcedByEntity.DatabaseNM = $HCEntityGroup.Group[0].DatabaseNM $HCSourcedByEntity.SchemaNM = $HCEntityGroup.Group[0].SchemaNM $HCSourcedByEntity.TableNM = $HCEntityGroup.Group[0].TableNM $HCSourcedByEntity.FullyQualifiedNM = $HCEntityGroup.Group[0].FullyQualifiedNM $HCSourcedByEntity.TableOrigin = $HCEntityGroup.Group[0].TableOrigin $HCSourcedByEntity.SourceContentId = $HCEntityGroup.Group[0].SourceContentId $HCSourcedByEntity.BindingCount = ($HCEntityGroup.Group.BindingCount | Measure-Object -Sum).Sum $HCSourcedByEntity.PSObject.Properties.Remove('AliasNM') $ColumnGroups = $HCEntityGroup.Group.SourcedByColumns | Group-Object ColumnNM foreach ($ColumnGroup in $ColumnGroups) { $HCSourcedByColumn = New-HCEmptySourcedByColumnObject $HCSourcedByColumn.ColumnNM = $ColumnGroup.Group[0].ColumnNM $HCSourcedByColumn.FullyQualifiedNM = $ColumnGroup.Group[0].FullyQualifiedNM $HCSourcedByColumn.BindingCount = ($ColumnGroup.Group.BindingCount | Measure-Object -Sum).Sum $HCSourcedByColumn.PSObject.Properties.Remove('AliasNM') $HCSourcedByEntity.SourcedByColumns += $HCSourcedByColumn } $HCEntity.SourcedByEntities += $HCSourcedByEntity } #endregion } #endregion #region UPDATE EXTENSION ENTITIES function Get-Entity ($ContentId) { return $Data.Entities[$Data.Entities.ContentId.IndexOf($ContentId)] } foreach ($HCEntity in $Data.Entities | Where-Object { $_.ExtensionTypeNM -eq 'CoreEntity' }) { $ExtensionEntityId = $HCEntity.ExtensionContentIds.ExtensionEntity; $ExtensionEntity = Get-Entity($ExtensionEntityId); $OverridingExtensionViewId = $HCEntity.ExtensionContentIds.OverridingExtensionView; $OverridingExtensionView = Get-Entity($OverridingExtensionViewId); #Add the SourcedByEntities from the OverridingExtensionView to the CoreEntity $HCEntity.SourcedByEntities += $OverridingExtensionView.SourcedByEntities | Where-Object { $_.SourceContentId -ne $HCEntity.ContentId }; #Add the Columns from the ExtensionEntity to the CoreEntity $ColumnsExt = $ExtensionEntity.Columns | Where-Object { $_.IsSystemColumnValue -eq $false -and $_.IsPrimaryKeyValue -eq $false }; $MaxOrdinal = ($HCEntity.Columns.Ordinal | Measure-Object -Maximum).Maximum + 1; foreach ($ColumnExt in $ColumnsExt | Sort-Object Ordinal) { $ColumnExt | Add-Member -Type NoteProperty -Name IsExtended -Value $True; $ColumnExt.Ordinal = $MaxOrdinal; $MaxOrdinal++; } $HCEntity.Columns += $ColumnsExt; #Add the OverridingExtensionView as a property of the CoreEntity $HCEntity | Add-Member -Type NoteProperty -Name OverridingExtensionView -Value $OverridingExtensionView; #Remove the OverridingExtensionView as a true entity $Data.Entities = $Data.Entities | Where-Object { $_.ContentId -ne $OverridingExtensionViewId }; #if the CoreEntity is not a public entity, then turn off the extension and overridingextension as being public #if (!($HCEntity.IsPublic)) #{ # $ExtensionEntity.IsPublic = $false; # $OverridingExtensionView.IsPublic = $false; #} } #endregion #region UPDATE OVERRIDING VIEW ENTITIES (SEPARATE FROM EXTENSIONS) $OverrideList = $Data.Entities | Group-Object -Property { $_.FullyQualifiedNames.View } | Where-Object Count -gt 1 $OverrideObjects = @(); foreach ($Override in $OverrideList) { $OverrideObject = New-Object PSObject $OverrideObject | Add-Member -Type NoteProperty -Name OverriddenContentId -Value $Null $OverrideObject | Add-Member -Type NoteProperty -Name OverridingContentId -Value $Null foreach ($Entity in $Override.Group) { if ($Entity.IsPersisted) { $OverrideObject.OverriddenContentId = $Entity.ContentId } else { $OverrideObject.OverridingContentId = $Entity.ContentId } } $OverrideObjects += $OverrideObject; } foreach ($OverrideObject in $OverrideObjects) { $OverriddenEntity = $Data.Entities[$Data.Entities.ContentId.IndexOf($OverrideObject.OverriddenContentId)]; $OverriddenEntity | Add-Member -Type NoteProperty -Name IsOverridden -Value $True $OverriddenEntity.ViewName = $OverriddenEntity.ViewName + 'BASE' $OverriddenEntity.FullyQualifiedNames.View = $OverriddenEntity.FullyQualifiedNames.View + 'BASE' $OverridingEntity = $Data.Entities[$Data.Entities.ContentId.IndexOf($OverrideObject.OverridingContentId)]; $OverridingEntity | Add-Member -Type NoteProperty -Name DoesOverride -Value $True } #endregion #region LEVEL-UP SOURCES (ENTITY TO DATAMART) $DataGroups = $Data.Entities.SourcedByEntities | Group-Object -Property FullyQualifiedNM foreach ($DataGroup in $DataGroups) { $HCSourcedByEntity = New-HCEmptySourcedByEntityObject #$HCSourcedByEntity.ServerNM = $DataGroup.Group[0].ServerNM $HCSourcedByEntity.DatabaseNM = $DataGroup.Group[0].DatabaseNM $HCSourcedByEntity.SchemaNM = $DataGroup.Group[0].SchemaNM $HCSourcedByEntity.TableNM = $DataGroup.Group[0].TableNM $HCSourcedByEntity.FullyQualifiedNM = $DataGroup.Group[0].FullyQualifiedNM $HCSourcedByEntity.TableOrigin = $DataGroup.Group[0].TableOrigin $HCSourcedByEntity.SourceContentId = $DataGroup.Group[0].SourceContentId $HCSourcedByEntity.BindingCount = ($DataGroup.Group.BindingCount | Measure-Object -Sum).Sum $HCSourcedByEntity.PSObject.Properties.Remove('AliasNM') $ColumnGroups = $DataGroup.Group.SourcedByColumns | Group-Object ColumnNM foreach ($ColumnGroup in $ColumnGroups) { $HCSourcedByColumn = New-HCEmptySourcedByColumnObject $HCSourcedByColumn.ColumnNM = $ColumnGroup.Group[0].ColumnNM $HCSourcedByColumn.FullyQualifiedNM = $ColumnGroup.Group[0].FullyQualifiedNM $HCSourcedByColumn.BindingCount = ($ColumnGroup.Group.BindingCount | Measure-Object -Sum).Sum $HCSourcedByColumn.PSObject.Properties.Remove('AliasNM') $HCSourcedByEntity.SourcedByColumns += $HCSourcedByColumn } $Data.SourcedByEntities += $HCSourcedByEntity } #endregion #region ADD GIT REPO PROPERTIES # try { # $Msg = "$(" " * 4)Adding git properties..."; Write-Host $Msg -ForegroundColor Gray; Write-Verbose $Msg; Write-Log $Msg; # function checkGit { # [CmdletBinding()] # param () # begin { # if (!(Test-Path $((Get-Location).Path + '\.git'))) { throw; } # } # process { # git --version # $GitUrl = (git config --local remote.origin.url).Replace(".git", "") # $Data | Add-Member -Type NoteProperty -Name Team -Value $(($GitUrl -split "/")[3]) # $Data | Add-Member -Type NoteProperty -Name Repository -Value $(($GitUrl -split "/")[4]) # $Data | Add-Member -Type NoteProperty -Name Branch -Value $(git rev-parse --abbrev-ref HEAD) # } # } # checkGit -ErrorAction Stop # } # catch { # $Msg = "$(" " * 8)Git not installed or not inside a git directory -- unable to add git properties"; Write-Host $Msg -ForegroundColor Yellow; Write-Verbose $Msg; Write-Log $Msg 'warning'; # } #endregion #region SPLIT OBJECT INTO SMALLER FILES if (!$NoSplit) { $Msg = "$(" " * 4)Splitting data object into smaller files..."; Write-Host $Msg -ForegroundColor Gray; Write-Verbose $Msg; Write-Log $Msg; Split-ObjectToFiles -Data $Data -splitDirectory $SplitDirectory } #endregion $Msg = "Success!`r`n"; Write-Host $Msg -ForegroundColor Green; Write-Verbose $Msg; Write-Log $Msg; $Output = New-Object PSObject $Output | Add-Member -Type NoteProperty -Name Data -Value $Data $Output | Add-Member -Type NoteProperty -Name Outdir -Value $OutDir return $Output } } # SIG # Begin signature block # MIIpNQYJKoZIhvcNAQcCoIIpJjCCKSICAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAzltoSh0UHigNR # mCIqGM85mD/16iJR9dGP4pekY78TVqCCDiMwggawMIIEmKADAgECAhAIrUCyYNKc # TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV # BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z # NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg # SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg # UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw # ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0 # JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr # Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF # LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F # LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh # 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ # wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay # g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI # YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp # QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro # OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB # WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+ # YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P # AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk # BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC # hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v # dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j # b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED # MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql # +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF # UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h # mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw # YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld # AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw # 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP # LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE # QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn # KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji # WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq # yK+p/pQd52MbOoZWeE4wggdrMIIFU6ADAgECAhADsuWQRbq1qj3ect5VAxkgMA0G # CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg # SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg # UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjMwNTE2MDAwMDAwWhcNMjYwNTIw # MjM1OTU5WjBzMQswCQYDVQQGEwJVUzENMAsGA1UECBMEVXRhaDEVMBMGA1UEBxMM # U291dGggSm9yZGFuMR4wHAYDVQQKExVIZWFsdGggQ2F0YWx5c3QsIEluYy4xHjAc # BgNVBAMTFUhlYWx0aCBDYXRhbHlzdCwgSW5jLjCCAiIwDQYJKoZIhvcNAQEBBQAD # ggIPADCCAgoCggIBAObA/ZMm0ngFmqmUW8QpvB5R2WwUIbCHZkoYN3LLelwf6FCX # NNCZOxBz6CppjoQ4kL1HtQNpENDPMTMxG5/lMTlZvf1mu/mYEYXOddPsgv+QP4bd # P+9w+NVE4vguFffuBSzQi8KmnrgGgDVLuhTjvN5WlP/AhzHldDNhKtkQh/bzIgrL # sivSLRo3ow2kVCzJTZYwXudZ/cI2vrNf0jKRQgcC/ao1emvt68RNQJPxDpmd4Eb5 # DOF+jd9w0Sb77/m/ir2rTbVjoLOlPxD9FlGsdB+kyMV45D9hYuD4D1s998j/wDeL # ezs/sXgrJToXS0Yjpxaul++7GVuLYgBQvB1UAVejXjDuJO2FF7gUeJihWk/OKmaW # kQTGavOt8/RcOrru1LdJ733fJnMZsmonQPokOdlUADNKBSAEskgRbD3SQ/Y9LKcm # 8w/hj9L6PSXBF/E/Kaq92SArEjkvYDlsXp7xslKgAxP26pzq7/hn2gro6/jjLUyh # xt60j8Pm0tjhOdQhCcioRO2zouopusZmPMO6H95T1PEkhd/cEmkywmMqOMVMpAUg # O796xTvZ4kjOsaQTOKvAEJDjc42EHZd2RWcVUMI41iHpNILkYHSPHe4mVQC8BdZx # qzGI6ay7U1mEvCYlMYQZwDZ/xYxI7q0YBjQOm5jVuPvAHmlE6pUiWuGz3JKXAgMB # AAGjggIDMIIB/zAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiIZfROQjAdBgNV # HQ4EFgQUaRlF8Nw4+YnDPBwkIaUEjV2a1MowDgYDVR0PAQH/BAQDAgeAMBMGA1Ud # JQQMMAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0dHA6Ly9jcmwz # LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5 # NlNIQTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5kaWdpY2VydC5j # b20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIx # Q0ExLmNybDA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUFBwIBFhtodHRw # Oi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsG # AQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0 # dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVT # aWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAkGA1UdEwQCMAAwDQYJKoZI # hvcNAQELBQADggIBABpsvUpsQVtdpqQNUxSC3Ix3qXeJ81vNGS7sXYxlYhvEChJF # gixfjebMfHZu0YLJ3xIeX7VwW8wyF+9RkI4RnPtkJD2JSmDd2mH4y/gy138EZMHa # n+XbMeMXcsOTL9cI5zUBw86EGj/xcL5NIj9DDym8DPh9/OZY5L5sGXrO1VjA/mUM # lnpqpoNZaNsjQ7Gla6K5BC0xIoHxNYTX1uRSjmYkKdnNMTcHqOLcgxwaXzix26Bs # n1pKO+NMe3DqthjFX0Pe6Z47b3GrjEYT4IoJP0N3H1crDfpm2vlBMwdSrNvr+epH # VfZqOx8/VwS7VKygkP5Dp4zXyOa3W+11sMQIQ4AS4lER4g1GS/DmrlP2FWYGaaVJ # YB01y1tWA23V3VM/Z/aeOR3uUE8p6tc5AFu2jNa16l9f5XNp9p5Fx2QzFh6pGqBu # d0ict3T/vGWZWxzOhWqqp/Xd1oV5lMwW50t9CEKWpHidZXZZUkw2vwLnkZZzpFzs # +b1HFxPKAvBXcwWO9ZV+FGeDk09ZBy3E4hY9JaF2Z9KiYa8EMzEOtHaHAkynD6Za # TFhRSAnO3OMixVE/ro6dW7drPYKxKKYf1Y5QXaPU9ijer9ub0gnYDjPqsh3gWolp # 7vjAE7t5JDE1PQDqCuuUn8FQakB/NJVs3Nt/Xz5ADD7e6h6JADmUr1l2e4agMYIa # aDCCGmQCAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu # Yy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJT # QTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhADsuWQRbq1qj3ect5VAxkgMA0GCWCGSAFl # AwQCAQUAoHwwEAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQB # gjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkE # MSIEIBXI2PmtmPWNVz02vnMzONc9SX362lZUjvkq7rYuDcoqMA0GCSqGSIb3DQEB # AQUABIICAMjVzFSLYdvH3UA2qQf+pdvAs4DiJb2c1Jksz05DtWtBJkecj3uKSdu/ # krh/KmN60m41bfM3JHlcGVCHgpwGudSyLjuWjhv5lMIiUJFDdOlRxh3sYHxCKP8d # om9jSfgeFufC/gUluj23Z26HWi+8Zr2vttKRGvyPMKgNiSzHJCxnGDYtgbmL5Y/H # VbuH0L09fTrQHR11QqOzkRyXj1jJN2BAuzXnMQT70lpC61R5WXPplIYq3QAq7Six # fp9K/PawuxRkmloK2i1QzS1ThzNp6g+NNu22zW0efWT/qlt+JWobIwzM/2JlGw0e # dXtfrJX0w2MUs07GNMvU34ymz6CM2nOBJisqhyfPLtMAwZWSZLUOtWGx9+Id/gfp # rT4QfewKhTdiT/sjbV4jfByeRZ9LrXfEbNULh668mw77OmcGipwD8UJ+PZs5dvww # JHnqUp7uQNTdVoq29DoBmiJ2QM914ih0HHdK+SVHgv+pO9CbzutdtHc6KVSPMNQI # 1JPwH3lCtWE11ikcy2qsFuFr8oDHQd3IRWOvk3ALKgPZcOInNCwD7GrrVFf2relr # yHa3cmHnXDXqIQ3PDceha11I/j703h7yHJIJkvWLg0UpFlhcUTxdIwcs0yVRyBaJ # XFK8cbed2om9gQY2Le+IlIhxaiEZmUIlVW4qzHeHMHo1983T0T4+oYIXPjCCFzoG # CisGAQQBgjcDAwExghcqMIIXJgYJKoZIhvcNAQcCoIIXFzCCFxMCAQMxDzANBglg # hkgBZQMEAgEFADB4BgsqhkiG9w0BCRABBKBpBGcwZQIBAQYJYIZIAYb9bAcBMDEw # DQYJYIZIAWUDBAIBBQAEIGv2WyN/i3nG1SMHlxZ9g/9t5PoCMyNWxbWrDTUK1w7s # AhEA4aAx0HMTwpbXu4iv7y6dsRgPMjAyMzA1MTcxNzA5MjZaoIITBzCCBsAwggSo # oAMCAQICEAxNaXJLlPo8Kko9KQeAPVowDQYJKoZIhvcNAQELBQAwYzELMAkGA1UE # BhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQDEzJEaWdpQ2Vy # dCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGluZyBDQTAeFw0y # MjA5MjEwMDAwMDBaFw0zMzExMjEyMzU5NTlaMEYxCzAJBgNVBAYTAlVTMREwDwYD # VQQKEwhEaWdpQ2VydDEkMCIGA1UEAxMbRGlnaUNlcnQgVGltZXN0YW1wIDIwMjIg # LSAyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAz+ylJjrGqfJru43B # DZrboegUhXQzGias0BxVHh42bbySVQxh9J0Jdz0Vlggva2Sk/QaDFteRkjgcMQKW # +3KxlzpVrzPsYYrppijbkGNcvYlT4DotjIdCriak5Lt4eLl6FuFWxsC6ZFO7Khbn # UEi7iGkMiMbxvuAvfTuxylONQIMe58tySSgeTIAehVbnhe3yYbyqOgd99qtu5Wbd # 4lz1L+2N1E2VhGjjgMtqedHSEJFGKes+JvK0jM1MuWbIu6pQOA3ljJRdGVq/9XtA # bm8WqJqclUeGhXk+DF5mjBoKJL6cqtKctvdPbnjEKD+jHA9QBje6CNk1prUe2nhY # HTno+EyREJZ+TeHdwq2lfvgtGx/sK0YYoxn2Off1wU9xLokDEaJLu5i/+k/kezbv # BkTkVf826uV8MefzwlLE5hZ7Wn6lJXPbwGqZIS1j5Vn1TS+QHye30qsU5Thmh1EI # a/tTQznQZPpWz+D0CuYUbWR4u5j9lMNzIfMvwi4g14Gs0/EH1OG92V1LbjGUKYvm # QaRllMBY5eUuKZCmt2Fk+tkgbBhRYLqmgQ8JJVPxvzvpqwcOagc5YhnJ1oV/E9mN # ec9ixezhe7nMZxMHmsF47caIyLBuMnnHC1mDjcbu9Sx8e47LZInxscS451NeX1XS # fRkpWQNO+l3qRXMchH7XzuLUOncCAwEAAaOCAYswggGHMA4GA1UdDwEB/wQEAwIH # gDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMCAGA1UdIAQZ # MBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATAfBgNVHSMEGDAWgBS6FtltTYUvcyl2 # mi91jGogj57IbzAdBgNVHQ4EFgQUYore0GH8jzEU7ZcLzT0qlBTfUpwwWgYDVR0f # BFMwUTBPoE2gS4ZJaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1 # c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNybDCBkAYIKwYBBQUH # AQEEgYMwgYAwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBY # BggrBgEFBQcwAoZMaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 # VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNydDANBgkqhkiG # 9w0BAQsFAAOCAgEAVaoqGvNG83hXNzD8deNP1oUj8fz5lTmbJeb3coqYw3fUZPwV # +zbCSVEseIhjVQlGOQD8adTKmyn7oz/AyQCbEx2wmIncePLNfIXNU52vYuJhZqMU # KkWHSphCK1D8G7WeCDAJ+uQt1wmJefkJ5ojOfRu4aqKbwVNgCeijuJ3XrR8cuOyY # QfD2DoD75P/fnRCn6wC6X0qPGjpStOq/CUkVNTZZmg9U0rIbf35eCa12VIp0bcrS # BWcrduv/mLImlTgZiEQU5QpZomvnIj5EIdI/HMCb7XxIstiSDJFPPGaUr10CU+ue # 4p7k0x+GAWScAMLpWnR1DT3heYi/HAGXyRkjgNc2Wl+WFrFjDMZGQDvOXTXUWT5D # mhiuw8nLw/ubE19qtcfg8wXDWd8nYiveQclTuf80EGf2JjKYe/5cQpSBlIKdrAqL # xksVStOYkEVgM4DgI974A6T2RUflzrgDQkfoQTZxd639ouiXdE4u2h4djFrIHprV # wvDGIqhPm73YHJpRxC+a9l+nJ5e6li6FV8Bg53hWf2rvwpWaSxECyIKcyRoFfLpx # tU56mWz06J7UWpjIn7+NuxhcQ/XQKujiYu54BNu90ftbCqhwfvCXhHjjCANdRyxj # qCU4lwHSPzra5eX25pvcfizM/xdMTQCi2NYBDriL7ubgclWJLCcZYfZ3AYwwggau # MIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIxCzAJ # BgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k # aWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAe # Fw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVTMRcw # FQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1c3Rl # ZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqGSIb3 # DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbSg9Ge # TKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9/UO0 # hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXnHwZl # jZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0VAsh # aG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4fsbVY # TXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUmcJgmf6AaRyBD40NjgHt1 # biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0QCir # c0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvvmz3+ # DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T/jnA # +bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk42Pg # puE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXcheMBK9Rp6103a50g5rmQzS # M7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU # uhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6 # mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsG # AQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t # MEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl # cnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3Js # My5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAE # GTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAH1Z # jsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxpwc8d # B+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIlzpVp # P0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQcAp8 # 76i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfeKuv2 # nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+jSbl3 # ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJshIUDQ # txMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6OOmc # 4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDwN7+Y # AN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR81fZ # vAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2VVQr # H4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIFjTCCBHWgAwIBAgIQDpsY # jvnQLefv21DiCEAYWjANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQGEwJVUzEVMBMG # A1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw # IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMjIwODAxMDAw # MDAwWhcNMzExMTA5MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGln # aUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhE # aWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw # ggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Yq3aaza57 # G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o # k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFh # mzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463J # T17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFw # q1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yh # Tzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU # 75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LV # jHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJ # bOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8Qg # UWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo4IB # OjCCATYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6 # mK4cD08wHwYDVR0jBBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/ # BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3Au # ZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2Vy # dC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4 # oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJv # b3RDQS5jcmwwEQYDVR0gBAowCDAGBgRVHSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBw # oL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyhhyzshV6pGrsi+IcaaVQi7aSId229GhT0 # E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtD # IeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlU # sLihVo7spNU96LHc/RzY9HdaXFSMb++hUD38dglohJ9vytsgjTVgHAIDyyCwrFig # DkBjxZgiwbJZ9VVrzyerbHbObyMt9H5xaiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwY # w02fc7cBqZ9Xql4o4rmUMYIDdjCCA3ICAQEwdzBjMQswCQYDVQQGEwJVUzEXMBUG # A1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQg # RzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBAhAMTWlyS5T6PCpKPSkH # gD1aMA0GCWCGSAFlAwQCAQUAoIHRMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRAB # BDAcBgkqhkiG9w0BCQUxDxcNMjMwNTE3MTcwOTI2WjArBgsqhkiG9w0BCRACDDEc # MBowGDAWBBTzhyJNhjOCkjWplLy9j5bp/hx8czAvBgkqhkiG9w0BCQQxIgQgxONz # BR273IyxzFvRHaisgUsGM9B+qgWvd5Y+AqSnRGQwNwYLKoZIhvcNAQkQAi8xKDAm # MCQwIgQgx/ThvjIoiSCr4iY6vhrE/E/meBwtZNBMgHVXoCO1tvowDQYJKoZIhvcN # AQEBBQAEggIASn+3807OGXkWBKRwJOXBvLXGCTOxnFSFdAm04HGGBQPiMb5UmM/b # Q97h1VMk5SIW7WgypFTSpbEGn880ozO9TwsG5VFhvhLl/EVF3K3gkG5Z/bVWY8tp # Lh5F3MLQSgEApMw6MOUffQ8vGpuikzWa5Sdkmxt1FsxpCRPPOntQCUUhOy+BJ9J1 # YF++Z+S9yS85LGhaipSv/90j+ZCExgFke0W7EsSVrf4qXM1F0kI5yvWYc1uZZqNZ # aYNXYYLaMCXnqcq/XapcCdsWwj2rodikC132satDrNm/UiLu8JpHWkqYihBH5GAp # N0nZimcyiU5EUrSwqxGdjlv6Qs5lbe25/lvKb2HuoutnCjxJoxWUsVL8f520jzeC # 68xzhMWHI03W8cx363GhOayPwRKZX0lwcbBhAxMWSJe9XH2xffv1doQNWGmcMB10 # l6qpuo7ssv23BkMzuidXvHnFeT9bXF12CJnIcZqumsxCED7Y0cZzpEkzKNEW2hPB # IE5HcGvuaq5/nQxQH3i+Y1c3UtE/wXl8Hlfr9syklu2M+z6dWhrcdPSZoQLYfPNX # iYa9Nk/q1lPpgT9TK53K3pF+gGjtWi7q6jT7EDG1qhkrb0+/8yaRLbYOLjKmX/f5 # Y2Ce0t6nNI3knVyoacyl4NV7T8WUuovNeTqVTidTWilVCZNcVt0bVhg= # SIG # End signature block |