<component id="20" name="Salesforce Lookup" componentClassID="Microsoft.ManagedComponentHost" description="Executes a custom script." localeId="1033" version="9" contactInfo="Executes a custom script.;Microsoft Corporation;Microsoft SqlServer v9; © 2004 Microsoft Corporation; All Rights Reserved; http://www.microsoft.com/sql/support;0"><properties><property id="21" name="SourceCode" state="cdata" dataType="System.String" isArray="true" description="Stores the source code of the component" typeConverter="NOTBROWSABLE"><arrayElements arrayElementCount="15"><arrayElement dataType="System.String"><![CDATA[ComponentWrapper.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF8]]></arrayElement><arrayElement dataType="System.String"><![CDATA[' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!
' This is CozyRoc Script Component Plus Extended Script
' Microsoft SQL Server Integration Services component wrapper
' This module defines the base class for your component
' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!

Imports System
Imports System.Data
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports CozyRoc.SqlServer.SSIS

<CLSCompliant(False)> _
Public Class UserComponent
    Inherits ScriptComponentPlus

    Public Connections As New Connections(Me)
    Public Variables As New Variables(Me)

    Public Overrides Sub ProcessInput(ByVal InputID As Integer, ByVal InputName As String, ByVal Buffer As PipelineBuffer, ByVal OutputMap As OutputNameMap)

        If InputID = MyBase.ComponentMetaData.InputCollection("Input").ID Then
            Input_ProcessInput(New InputBuffer(Me, InputID, True, Buffer, OutputMap))
        End If

    End Sub

    Public Overridable Sub Input_ProcessInput(ByVal Buffer As InputBuffer)

        While Buffer.NextRow()
            Input_ProcessInputRow(Buffer)
        End While

    End Sub

    Public Overridable Sub Input_ProcessInputRow(ByVal Row As InputBuffer)

    End Sub

End Class

Public Class Connections

    Dim ParentComponent As ScriptComponent

    <CLSCompliant(False)> _
    Public Sub New(ByVal Component As ScriptComponent)
        ParentComponent = Component
    End Sub

    Public ReadOnly Property Connection() As IDTSConnectionManager100
        Get
            Return ParentComponent.ComponentMetaData.RuntimeConnectionCollection("Connection").ConnectionManager
        End Get
    End Property

End Class

Public Class Variables

    Dim ParentComponent As ScriptComponent

    <CLSCompliant(False)> _
    Public Sub New(ByVal Component As ScriptComponent)
        ParentComponent = Component
    End Sub

End Class
]]></arrayElement><arrayElement dataType="System.String"><![CDATA[BufferWrapper.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF8]]></arrayElement><arrayElement dataType="System.String"><![CDATA[' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!
' This is CozyRoc Script Component Plus Extended Script
' Microsoft SQL Server Integration Services buffer wrappers
' This module defines classes for accessing data flow buffers
' THIS IS AUTO-GENERATED CODE THAT WILL BE OVERWRITTEN! DO NOT EDIT!


Option Strict Off   ' This allows usage of PipelineBuffer typed accessors.

Imports System
Imports System.Data
Imports Microsoft.SqlServer.Dts.Pipeline
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports CozyRoc.SqlServer.SSIS

<CLSCompliant(False)> _
Public Class InputBuffer
    Inherits ScriptBufferPlus

    Public Sub New(ByVal Component As ScriptComponent, ByVal ObjectID As Integer, ByVal IsInput As Boolean, ByVal Buffer As PipelineBuffer, ByVal OutputMap As OutputNameMap)
        MyBase.New(Component, ObjectID, IsInput, Buffer, OutputMap)
    End Sub

    Public Overrides ReadOnly Property StaticInputColumns() As String()
        Get
            Return New String() {}
        End Get
    End Property

    Public Overrides ReadOnly Property StaticOutputColumns() As String()
        Get
            Return New String() {}
        End Get
    End Property

    Public Overloads Function NextRow() As Boolean
        NextRow = MyBase.NextRow()
    End Function

    Public Overloads Function EndOfRowset() As Boolean
        EndOfRowset = MyBase.EndOfRowset
    End Function

End Class
]]></arrayElement><arrayElement dataType="System.String"><![CDATA[ScriptMain.vb]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF8]]></arrayElement><arrayElement dataType="System.String"><![CDATA[' COZYROC SQL Server Integration Services user script component
'
' Copyright (c) 2006-2013 COZYROC LLC
' 
' Permission is hereby granted, free of charge, to any person
' obtaining a copy of this software and associated documentation
' files (the "Software"), to deal in the Software without
' restriction, including without limitation the rights to use,
' copy, modify, merge, publish, distribute, sublicense, and/or sell
' copies of the Software, and to permit persons to whom the
' Software is furnished to do so, subject to the following
' conditions:
' 
' The above copyright notice and this permission notice shall be
' included in all copies or substantial portions of the Software.
' 
' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
' EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
' OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
' NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
' HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
' WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
' FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
' OTHER DEALINGS IN THE SOFTWARE.

Imports System
Imports System.ComponentModel
Imports System.Collections
Imports System.Xml
Imports System.Web.Services.Protocols

Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper
Imports CozyRoc.SqlServer.SSIS
Imports CozyRoc.SqlServer.SSIS.Attributes
Imports CozyRoc.Sforce.Service


'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
<ColumnMappings()> _
<SortProperties(New String() {"Connection", "SalesforceObject", "KeyField", "ValueField", "UseCache"})> _
<ValidateProperties("Validate")> _
<Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute> _
<CLSCompliant(False)> _
Public Class ScriptMain
    Inherits UserComponent


    Private Const QueryTemplate_3P As String = "select {0} from {1} where {2}"
    Private Const ListDelimiter As String = "," + vbLf


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Overrides Sub Input_ProcessInputRow(ByVal Row As InputBuffer)
        Dim valueList() As String

        If m_cache Is Nothing Then
            valueList = GetLookupRow_(Row)
        Else
            ' Cache is enabled.
            Dim cacheKey As String = GetCacheKey_(Row)

            If m_cache.Contains(cacheKey) Then
                valueList = CType(m_cache(cacheKey), String())
            Else
                valueList = GetLookupRow_(Row)
                m_cache(cacheKey) = valueList
            End If
        End If

        If Not valueList Is Nothing Then
            Dim output As IDTSOutput100 = MyBase.ComponentMetaData.OutputCollection(0)

            ' Lookup row found.
            Dim colsCount As Integer = m_valueIdx.Length
            For colIndex As Integer = 0 To colsCount - 1
                Dim value As String = valueList(colIndex)
                Dim valueIndex As Integer = m_valueIdx(colIndex)

                If String.IsNullOrEmpty(value) Then
                    Call Row.Buffer.SetNull(valueIndex)
                    Continue For
                End If

                Try
                    Select Case m_valueType(colIndex)
                        Case DataType.DT_DBTIMESTAMP
                        Case DataType.DT_DATE
                        Case DataType.DT_FILETIME
                        Case DataType.DT_DBDATE
                            Row.Buffer(valueIndex) = Convert.ToDateTime(value)

                        Case DataType.DT_IMAGE
                            Row.Buffer(valueIndex) = Convert.FromBase64String(value)

                        Case Else
                            Row.Buffer(valueIndex) = value
                    End Select
                Catch ex As Exception
                    Call FireError_(String.Format( _
                        "Failed to process '{0}' for column '{1}'.", _
                        value, _
                        output.OutputColumnCollection(colIndex).Name))
                End Try
            Next
        End If
    End Sub ' Input_ProcessInputRow


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Overrides Sub PreExecute()
        Call MyBase.PreExecute()

        ' Setup connection.
        m_connection = CType( _
            Me.Connections.Connection.AcquireConnection(Nothing), _
            ISforceConnection)
        m_service = CType(m_connection.Connect(), SforceService)

        If Me.UseCache Then
            m_cache = New Hashtable()
        End If

        Dim input As IDTSInput100 = MyBase.ComponentMetaData.InputCollection(0)
        Dim colsCount As Integer = input.InputColumnCollection.Count

        ' Setup key index and where list.
        m_keyIdx = New Integer(colsCount - 1) {}
        For colIndex As Integer = 0 To colsCount - 1
            Dim inputCol As IDTSInputColumn100 = input.InputColumnCollection(colIndex)

            ' Set key index.
            m_keyIdx(colIndex) = Me.HostComponent.BufferManager.FindColumnByLineageID( _
                input.Buffer, _
                inputCol.LineageID)

            ' Set where list.
            Dim extCol As IDTSExternalMetadataColumn100 = input.ExternalMetadataColumnCollection.GetObjectByID( _
                inputCol.ExternalMetadataColumnID)

            If Not String.IsNullOrEmpty(m_whereTemplate_P) Then
                m_whereTemplate_P += " AND "
            End If

            m_whereTemplate_P += String.Format( _
                "{0} = {1}", _
                extCol.Name, _
                "{" + colIndex.ToString() + "}")
        Next

        Dim output As IDTSOutput100 = MyBase.ComponentMetaData.OutputCollection(0)
        colsCount = output.OutputColumnCollection.Count

        ' Setup value index and field list.
        m_valueIdx = New Integer(colsCount - 1) {}
        m_valueType = New DataType(colsCount - 1) {}
        Dim fieldList As String = String.Empty
        For colIndex As Integer = 0 To colsCount - 1
            Dim outputCol As IDTSOutputColumn100 = output.OutputColumnCollection(colIndex)

            ' Set value index and type.
            m_valueIdx(colIndex) = Me.HostComponent.BufferManager.FindColumnByLineageID( _
                input.Buffer, _
                outputCol.LineageID)
            m_valueType(colIndex) = outputCol.DataType

            ' Set field list.
            If Not String.IsNullOrEmpty(fieldList) Then
                fieldList += ", "
            End If

            fieldList += outputCol.Name
        Next

        ' Setup query template.
        m_queryTemplate_1P = String.Format( _
            QueryTemplate_3P, _
            fieldList, _
            Me.SalesforceObject, _
            "{0}")
    End Sub ' PreExecute


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Overrides Sub PostExecute()
        Call MyBase.PostExecute()

        Call m_connection.Close()
    End Sub ' PostExecute


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Function Validate(ByRef errMessage As String) As Boolean
        Dim result As Boolean

        Try
            If String.IsNullOrEmpty(Me.Connection) Then
                Throw New ApplicationException("Select Salesforce connection.")
            End If

            If String.IsNullOrEmpty(Me.SalesforceObject) Then
                Throw New ApplicationException("Select object.")
            End If

            If String.IsNullOrEmpty(Me.KeyField) Then
                Throw New ApplicationException("Specify key field(s).")
            End If

            If String.IsNullOrEmpty(Me.ValueField) Then
                Throw New ApplicationException("Select value field.")
            End If

            Dim keyList() As String = Me.KeyField.Split( _
                New String() {ListDelimiter}, _
                StringSplitOptions.None)

            Dim input As IDTSInput100 = Me.ComponentMetaData.InputCollection(0)
            If input.IsAttached AndAlso input.InputColumnCollection.Count < keyList.Length Then
                Throw New Exception("Map input columns.")
            End If

            Dim output As IDTSOutput100 = MyBase.ComponentMetaData.OutputCollection(0)
            If output.OutputColumnCollection.Count = 0 Then
                ' Setup collection output columns.
                Call SetupOutputColumns_()
            End If

            ' Store connection information in the runtime connection collection, too.
            ' Cannot directly use RuntimeConnectionCollection in the property get/set
            ' because of issues with multi-threading.
            Me.ComponentMetaData.RuntimeConnectionCollection("Connection").ConnectionManagerID = Me.Connection

            result = True
        Catch ex As Exception
            result = False
            errMessage = ex.Message
        End Try

        Validate = result
    End Function    'Validate


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Overrides Sub ReinitializeMetaData()
        Call MyBase.ReinitializeMetaData()

        If MyBase.ComponentMetaData.InputCollection.Count = 0 Then
            ' At least one input must exist.
            Throw New Exception("No inputs.")
        End If

        If String.IsNullOrEmpty(Me.KeyField) Then
            Throw New Exception("Key field(s) not selected.")
        End If

        ' Get object fields.
        Dim fieldList() As Field = GetFields_()

        Dim input As IDTSInput100 = MyBase.ComponentMetaData.InputCollection(0)

        ' Cleanup.
        input.ExternalMetadataColumnCollection.IsUsed = True
        Call input.InputColumnCollection.RemoveAll()
        Call input.ExternalMetadataColumnCollection.RemoveAll()

        ' Setup field metadata.
        Dim keyList() As String = Me.KeyField.Split( _
            New String() {ListDelimiter}, _
            StringSplitOptions.None)
        For Each key As String In keyList
            ' Find field.
            Dim field As Field = FindField_(fieldList, key)

            Dim dtsType As DataType
            Dim fieldLen, prec, scale, codePage As Integer
            Call GetDtsTypeFromField_(field, dtsType, fieldLen, prec, scale, codePage)

            ' Setup external column.
            Dim column As IDTSExternalMetadataColumn100 = input.ExternalMetadataColumnCollection.[New]()
            column.Name = field.name
            column.DataType = dtsType
            column.Length = fieldLen
            column.Precision = prec
            column.Scale = scale
            column.CodePage = codePage
        Next
    End Sub ' ReinitializeMetaData


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Returns list of objects in the currently selected Salesforce connection.
    Public Function GetObjectList() As String()
        Dim result As New ArrayList

        Dim connection As ISforceConnection = CType( _
            Me.DesignConnections(Me.Connection).AcquireConnection(Nothing), _
            ISforceConnection)
        Dim service As SforceService = CType(connection.Connect(), SforceService)

        Try
            Dim dgr As DescribeGlobalResult = service.describeGlobal()

            For Each sobject As DescribeGlobalSObjectResult In dgr.sobjects
                If sobject.queryable Then
                    Call result.Add(sobject.name)
                End If
            Next

            Call result.Sort()
        Finally
            Call connection.Close()
        End Try

        GetObjectList = CType(result.ToArray(GetType(String)), String())
    End Function    ' GetObjectList


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Returns list of fields in the currently selected object.
    Public Function GetFieldList() As String()
        Dim result As ArrayList = New ArrayList()

        Dim fieldList() As Field = GetFields_()
        For Each field As Field In fieldList
            Call result.Add(field.name)
        Next

        Call result.Sort()

        GetFieldList = CType(result.ToArray(GetType(String)), String())
    End Function    ' GetFieldList


#Region "Properties"
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Category("Settings")> _
    <Description("Select Salesforce Connection Manager.")> _
    <Connection("ConnectionType")> _
    Public Property Connection() As String
        Get
            Connection = m_sforceConnection
        End Get
        Set(ByVal value As String)
            m_sforceConnection = value
        End Set
    End Property    ' Connection


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Category("Settings")> _
    <Description("Select lookup object.")> _
    <List("GetObjectList")> _
    <RefreshProperties(RefreshProperties.All)> _
    Public Property SalesforceObject() As String
        Get
            SalesforceObject = m_object
        End Get
        Set(ByVal value As String)
            If m_object <> value Then
                m_object = value

                m_fields = Nothing
                Me.KeyField = String.Empty
                Me.ValueField = String.Empty
            End If
        End Set
    End Property    ' SalesforceObject


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Category("Settings")> _
    <Description("Specify one or more key fields.")> _
    <List("GetFieldList", True, False)> _
    Public Property KeyField() As String
        Get
            KeyField = m_keyField
        End Get
        Set(ByVal value As String)
            If m_keyField <> value Then
                If Not String.IsNullOrEmpty(m_keyField) Then
                    ' Force external columns to be reloaded.
                    If Me.ComponentMetaData.InputCollection.Count > 0 Then
                        Dim input As IDTSInput100 = Me.ComponentMetaData.InputCollection(0)
                        Call input.ExternalMetadataColumnCollection.RemoveAll()
                    End If
                End If

                m_keyField = value
            End If
        End Set
    End Property    ' KeyField


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Category("Settings")> _
    <Description("Specify one or more lookup fields.")> _
    <List("GetFieldList", True, False)> _
    Public Property ValueField() As String
        Get
            ValueField = m_valueField
        End Get
        Set(ByVal value As String)
            If m_valueField <> value Then
                If Not String.IsNullOrEmpty(m_valueField) Then
                    ' Force output columns to be reloaded.
                    If Me.ComponentMetaData.OutputCollection.Count > 0 Then
                        Dim output As IDTSOutput100 = Me.ComponentMetaData.OutputCollection(0)
                        Call output.OutputColumnCollection.RemoveAll()
                    End If
                End If

                m_valueField = value
            End If
        End Set
    End Property    ' ValueField


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    <Category("Settings")> _
    <Description("Select whether memory cache is used.")> _
    <DefaultValue(True)> _
    Public Property UseCache() As Boolean
        Get
            UseCache = m_useCache
        End Get
        Set(ByVal value As Boolean)
            m_useCache = value
        End Set
    End Property    ' UseCache
#End Region ' Properties


#Region "Internals"
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private ReadOnly Property ConnectionType() As String()
        Get
            ConnectionType = New String() {"SFORCE"}
        End Get
    End Property    ' ConnectionType


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub FireError_(ByVal message As String)
        Dim cancel As Boolean = False
        Call MyBase.ComponentMetaData.FireError( _
            0, _
            "Salesforce Lookup", _
            message, _
            String.Empty, _
            0, _
            cancel)
    End Sub ' FireError_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Function FindField_( _
        ByVal fieldList() As Field, _
        ByVal name As String) As Field

        Dim result As Field = Nothing

        For Each field As Field In fieldList
            If field.name.Equals(name, StringComparison.OrdinalIgnoreCase) Then
                ' Found.
                result = field
                Exit For
            End If
        Next

        If result Is Nothing Then
            Throw New Exception(String.Format("'{0}' field not found.", name))
        End If

        FindField_ = result
    End Function    ' FindField_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Setups cache key based on specified key attributes.
    Private Function GetCacheKey_(ByVal row As InputBuffer) As String
        Dim result As String = String.Empty

        For Each idx As Integer In m_keyIdx
            Dim key As String = String.Empty
            If Not row.Buffer.IsNull(idx) Then
                key = row.Buffer(idx).ToString() + "_"
            End If

            result += key
        Next

        GetCacheKey_ = result
    End Function    ' GetCacheKey_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Uses SOQL to retrieve required lookup row.
    Private Function GetLookupRow_(ByVal row As InputBuffer) As String()
        Dim result() As String = Nothing

        ' Setup fetch conditions.
        Dim colsCount As Integer = m_keyIdx.Length
        Dim whereList() As Object = New Object(colsCount - 1) {}
        For colIndex As Integer = 0 To colsCount - 1
            Dim keyIndex As Integer = m_keyIdx(colIndex)

            Dim key As String = String.Empty

            If row.Buffer.IsNull(keyIndex) Then
                key = "NULL"
            Else
                Dim keyObj As Object = row.Buffer(keyIndex)
                If TypeOf keyObj Is String Then
                    key = String.Format("'{0}'", keyObj)
                Else
                    key = keyObj.ToString()
                End If
            End If

            whereList(colIndex) = key
        Next

        ' Query data.
        Dim record As sObject = Nothing
        Dim query As String = String.Format( _
            m_queryTemplate_1P, _
            String.Format(m_whereTemplate_P, whereList))
        Try
            Dim qr As QueryResult = m_service.query(query)
            If Not qr.records Is Nothing AndAlso qr.records.Length > 0 Then
                record = qr.records(0)
            End If
        Catch ex As Exception
            Call FireError_(ex.Message)
        End Try

        If Not record Is Nothing Then
            Dim fieldsCount As Integer = m_valueIdx.Length
            result = New String(fieldsCount - 1) {}
            For fieldIndex As Integer = 0 To fieldsCount - 1
                Dim fieldNode As XmlElement = record.Any(fieldIndex)
                result(fieldIndex) = fieldNode.InnerText
            Next
        End If

        GetLookupRow_ = result
    End Function    ' GetLookupRow_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Function GetFields_() As Field()
        Dim result() As Field = m_fields

        If result Is Nothing Then
            Dim connection As ISforceConnection = CType( _
                Me.DesignConnections(Me.Connection).AcquireConnection(Nothing), _
                ISforceConnection)
            Dim service As SforceService = CType(connection.Connect(), SforceService)

            Try
                result = service.describeSObject(Me.SalesforceObject).fields
            Finally
                Call connection.Close()
            End Try

            m_fields = result
        End If

        GetFields_ = result
    End Function    ' GetFields_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub SetupOutputColumns_()
        ' Get entity attributes.
        Dim fieldList() As Field = GetFields_()

        Dim valueList() As String = Me.ValueField.Split( _
            New String() {ListDelimiter}, _
            StringSplitOptions.None)

        Dim output As IDTSOutput100 = Me.ComponentMetaData.OutputCollection(0)

        For Each value As String In valueList
            ' Find Salesforce field.
            Dim field As Field = FindField_(fieldList, value)

            Dim dtsType As DataType
            Dim fieldLen, prec, scale, codePage As Integer
            Call GetDtsTypeFromField_(field, dtsType, fieldLen, prec, scale, codePage)

            ' Setup output column.
            Dim column As IDTSOutputColumn100 = output.OutputColumnCollection.[New]()
            column.Name = field.name
            Call column.SetDataTypeProperties( _
                dtsType, _
                fieldLen, _
                prec, _
                scale, _
                codePage)
        Next
    End Sub ' SetupOutputColumns_


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Private Sub GetDtsTypeFromField_( _
        ByVal field As Field, _
        ByRef DtsType As DataType, _
        ByRef fieldLen As Integer, _
        ByRef Precision As Integer, _
        ByRef Scale As Integer, _
        ByRef CodePage As Integer)

        fieldLen = field.length
        Precision = field.precision
        Scale = field.scale
        CodePage = 0

        Select Case field.soapType
            Case soapType.tnsID
                DtsType = DataType.DT_WSTR
            Case soapType.xsdbase64Binary
                DtsType = DataType.DT_IMAGE
            Case soapType.xsdboolean
                DtsType = DataType.DT_BOOL
            Case soapType.xsddouble
                DtsType = DataType.DT_NUMERIC
            Case soapType.xsdint
                DtsType = DataType.DT_BYREF_I4
            Case soapType.xsddate
                DtsType = DataType.DT_DBDATE
            Case soapType.xsddateTime
                DtsType = DataType.DT_DBTIMESTAMP
            Case soapType.xsdtime
                DtsType = DataType.DT_DBTIME
            Case soapType.xsdanyType
                DtsType = DataType.DT_WSTR

            Case soapType.xsdstring
                DtsType = DataType.DT_WSTR
                If fieldLen >= 4000 Then
                    ' DT_WSTR is limited to 4000.
                    DtsType = DataType.DT_NTEXT
                    fieldLen = 0
                End If

            Case Else
                Throw New Exception("Unhandled soap type.")
        End Select
    End Sub ' GetDtsTypeFromField_
#End Region ' Internals


#Region "Attributes"
    Private m_sforceConnection As String
    Private m_object As String
    Private m_keyField As String
    Private m_valueField As String
    Private m_useCache As Boolean

    Private m_connection As ISforceConnection
    Private m_service As SforceService
    Private m_cache As Hashtable
    Private m_queryTemplate_1P As String
    Private m_whereTemplate_P As String
    Private m_keyIdx() As Integer
    Private m_valueIdx() As Integer
    Private m_fields() As Field
    Private m_valueType() As DataType
#End Region ' Attributes

End Class   ' ScriptMain
]]></arrayElement><arrayElement dataType="System.String"><![CDATA[Project]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF16LE]]></arrayElement><arrayElement dataType="System.String"><![CDATA[<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<c:Project xmlns:c="http://schemas.microsoft.com/codeprojectml/2010/08/main" xmlns:msb="http://schemas.microsoft.com/developer/msbuild/2003" runtimeVersion="4.0" schemaVersion="1.0">
	<msb:PropertyGroup>
		<msb:Language>msBuild</msb:Language>
		<msb:CodeName>ScriptComponent_22b4f911b2584ff4bfeab0b76184dee6</msb:CodeName>
		<msb:DisplayName>ScriptComponent_22b4f911b2584ff4bfeab0b76184dee6</msb:DisplayName>
		<msb:ProjectId>{02669F91-249B-4614-A8DF-85532DCEE230}</msb:ProjectId>
	</msb:PropertyGroup>
	<msb:ItemGroup>
		<msb:Project Include="ScriptComponent_22b4f911b2584ff4bfeab0b76184dee6.vbproj"/>
		<msb:Folder Include="My Project\"/>
		<msb:File Include="ScriptMain.vb"/>
		<msb:File Include="ComponentWrapper.vb"/>
		<msb:File Include="BufferWrapper.vb"/>
	</msb:ItemGroup>
</c:Project>]]></arrayElement><arrayElement dataType="System.String"><![CDATA[ScriptComponent_22b4f911b2584ff4bfeab0b76184dee6.vbproj]]></arrayElement><arrayElement dataType="System.String"><![CDATA[UTF16LE]]></arrayElement><arrayElement dataType="System.String"><![CDATA[<?xml version="1.0" encoding="utf-16"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <ProjectTypeGuids>{30D016F9-3734-4E33-A861-5E7D899E18F3};{F184B08F-C81C-45F6-A57F-5ABD9991F28F}</ProjectTypeGuids>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>8.0.30703</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{642BC940-5890-4144-9BC5-86BE0BA42FFD}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>My Project</AppDesignerFolder>
    <RootNamespace>ScriptComponent_22b4f911b2584ff4bfeab0b76184dee6</RootNamespace>
    <AssemblyName>ScriptComponent_22b4f911b2584ff4bfeab0b76184dee6</AssemblyName>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <OptionCompare>Binary</OptionCompare>
    <OptionExplicit>On</OptionExplicit>
    <OptionStrict>On</OptionStrict>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>.\bin\Debug\</OutputPath>
    <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
    <DefineDebug>true</DefineDebug>
    <DefineTrace>true</DefineTrace>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
    <DebugSymbols>false</DebugSymbols>
    <Optimize>true</Optimize>
    <OutputPath>.\bin\Release\</OutputPath>
    <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
    <DefineDebug>false</DefineDebug>
    <DefineTrace>true</DefineTrace>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <!-- This sections specifies references for the project. -->
  <ItemGroup>
    <Reference Include="CozyRoc.SSISPlus.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=16cf490bb80c34ea, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>C:\Program Files (x86)\Microsoft SQL Server\120\SDK\Assemblies\CozyRoc.SSISPlus.2014.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Data" />
    <Reference Include="System.Windows.Forms" />
    <Reference Include="System.Xml" />
    <Reference Include="Microsoft.SqlServer.TxScript, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    <Reference Include="Microsoft.SqlServer.DTSRuntimeWrap, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    <Reference Include="Microsoft.SqlServer.DTSPipelineWrap, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    <Reference Include="Microsoft.SqlServer.PipelineHost, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    <Reference Include="System">
      <Private>False</Private>
    </Reference>
    <Reference Include="System.Data">
      <Private>False</Private>
    </Reference>
    <Reference Include="Microsoft.SqlServer.ManagedDTS">
      <Private>False</Private>
    </Reference>
    <Reference Include="CozyRoc.Sforce">
      <Private>False</Private>
    </Reference>
    <Reference Include="System.Web.Services">
      <Private>False</Private>
    </Reference>
    <Reference Include="System.Xml">
      <Private>False</Private>
    </Reference>
  </ItemGroup>
  <!-- Visual Basic supports Importing namespaces (equivalent to using statements in C#).-->
  <ItemGroup>
    <Import Include="Microsoft.VisualBasic" />
    <Import Include="System" />
    <Import Include="System.Collections" />
    <Import Include="System.Data" />
    <Import Include="System.Diagnostics" />
    <Import Include="System.Windows.Forms" />
  </ItemGroup>
  <ItemGroup>
    <AppDesigner Include="My Project\" />
  </ItemGroup>
  <!-- Include the build rules for a VB project.-->
  <Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" />
  <!-- This section defines VSTA properties that describe the host-changable project properties. -->
  <ProjectExtensions>
    <VisualStudio>
      <FlavorProperties GUID="{30D016F9-3734-4E33-A861-5E7D899E18F3}">
        <ProjectProperties HostName="VSTAHostName" HostPackage="{B3A685AA-7EAF-4BC6-9940-57959FA5AC07}" ApplicationType="usd" Language="vb" TemplatesPath="" />
        <Host Name="SSIS_SC120" />
        <ProjectClient>
          <HostIdentifier>SSIS_SC120</HostIdentifier>
        </ProjectClient>
      </FlavorProperties>
    </VisualStudio>
  </ProjectExtensions>
  <ItemGroup>
    <Compile Include="ScriptMain.vb" />
    <Compile Include="BufferWrapper.vb" />
    <Compile Include="ComponentWrapper.vb" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="My Project\" />
  </ItemGroup>
</Project>]]></arrayElement></arrayElements></property><property id="22" name="BinaryCode" state="cdata" dataType="System.String" isArray="true" description="Stores the binary representation of the component" typeConverter="NOTBROWSABLE"><arrayElements arrayElementCount="2"><arrayElement dataType="System.String"><![CDATA[ScriptComponent_22b4f911b2584ff4bfeab0b76184dee6.dll]]></arrayElement><arrayElement dataType="System.String"><![CDATA[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
iAAACkUMAAAAAgAAAAsAAAAUAAAAGgAAACMAAABQAAAALAAAADUAAAA+AAAAbAAAAGwAAABHAAAA
K2oEIIIAAABUK2wEIC0BAABUK2MEHwtUK10EIIMAAABUK1QEIANAAABUK0sEIIUAAABUK0IEIIcA
AABUKzkEIIYAAABUKzAEIIIAAABUKycEIIIAAABUBUogoA8AADIXBCAvAQAAVAUWVCsLcokCAHBz
WAAACnoqAAAAQlNKQgEAAQAAAAAADAAAAHY0LjAuMzAzMTkAAAAABQBsAAAAyA4AACN+AAA0DwAA
NBMAACNTdHJpbmdzAAAAAGgiAAC0AgAAI1VTABwlAAAQAAAAI0dVSUQAAAAsJQAASAcAACNCbG9i
AAAAAAAAAAIAAAFXHaIJCQ4AAAD6JTMAFgAAAQAAAFMAAAALAAAAGQAAADYAAAAiAAAAlgAAAAIA
AABAAAAAJQAAAAUAAAAOAAAAEwAAAAoAAAABAAAADAAAAAIAAAADAAAAAgAAAAAA/RIBAAAAAAAK
AD8BFQEKAHMBVQEGAIMBfAEKANsBFQEGAFkCfAEKANsCsQIOAC0DFgMSAHwDWwMWAK0DWwMSALwD
WwMOAGAEFgMaABsF8wQeAKUGjgYaAAMH8wQOAJAHFgMeAK8HjgYGANoHxwciAI0IdwgiAKYIdwgi
ANMIuwgGAP0I6ggKADwJFQkKAFQJEwAiAIkJbAkGAL4JngkGANwJfAEGAAAKfAEKABkKEwAGAGcK
SAoGAHsKfAESAIIKWwMGAI8KfAEmAPIKyQomACELyQomAEwLyQomAGkLyQomAKwLyQomANsLyQoG
AOkLfAEmAAUMyQoGADIMfAEGAFkMfAEGAGEMfAEKAIYMFQkmAKIMyQomANsMyQomABENyQomAC8N
yQomAFwNyQoWAJ0NWwMmAMENyQomAAwOyQoGAKQOfAEGALkOfAEGAG0PxwceAHcPjgYeAIwPjgYq
APQAxw8qAP0Pxw8eAA8QjgYGAFEQfAEKAF8QFQkGAIEQfAEeAJkQjgYeAKEQjgYuALgQrRAyALgQ
rRAeAOsQjgYeADIRjgYSAGsRWwMOALQRkhEOANARkhEOAOgRkhEiAAASdwgiABYSdwgiACsSdwgO
AD0SkhEiAFESdwgiAGwSdwgOAH4SkhEGAIwSngkGAKwSngkGAOQSyhIAAAAAAQAAAAAAAQABAAAA
AAApADcABQABAAEAAAAAAGsANwAJAAEAAgAAARAAdgA3AA0AAQADAAUBAACAAAAADQAFAAgABQEA
AI4AAAANAAUADwABAAAAqQC1AB0ABgARAAEAAADmALUALQAGABYAAQAAAPQAtQANAAgAGgABAAAA
AAG1AA0ACQAcAAEAAAAKAbUAIAAKAB0AMQCeASAAMQDHAS0AMQDpAToAMQAOAkcAIQDqApAABgD0
AMkABgAAAc0AAQDABOEAAQDABOEAUYBOBfUAUYBfBfUAAQBRB/UAAQBkB/UAAQBtB/UAAQB4B/UA
AQCFB3UBAQCiB3gBAQC9B3wBAQDkB4ABAQDsB/UAAQD/B/UAAQARCIQBAQAaCIQBAQAlCIgBAQAu
CI0BUCAAAAAABhhPARMAAQBYIAAAAAAGGE8BEwABAGAgAAAAABEYigEXAAEAjCAAAAAAEwiRARsA
AQCkIAAAAAATCLcBKAABALwgAAAAABMI4AE1AAEA1CAAAAAAEwj+AUIAAQDsIAAAAABGAkQCYwAB
AAghAAAAAEYCTQJoAAIAHCEAAAAAgwBeAmwAAgA0IQAAAABGAmYCcQACAEghAAAAABEAbwJ4AAIA
ZCEAAAAAAQCNAoAAAwCAIQAAAAAGGE8BEwAEAIghAAAAAAMIoQKLAAQAvCEAAAAABhhPARMABADQ
IQAAAAAGGE8BrwAEAOAhAAAAAEYK9gO7AAkA9CEAAAAARgoNBLsACQAIIgAAAACGACUEwAAJACAi
AAAAAIYALQTAAAkAOCIAAAAABhhPARMACQBYIgAAAABGAnQE0QAJAIgiAAAAAEYDkwTbAA0AnCIA
AAAARgOmBNsADgCgIgAAAAAGGE8B5QAPALAiAAAAAAYINAXrABAA3CIAAAAABhhPAeUAEADsIgAA
AAAGGE8BEwARAPQiAAAAAEYCpgTbABEAjCQAAAAARgJtBRMAEgDEJgAAAABGAngFEwASANgmAAAA
AAYAhAU4ARIALCgAAAAARgKYBRMAEwBYKQAAAAAGAK0FuwATAAwqAAAAAAYAuwW7ABMAbCoAAAAA
Bgg0BXEAEwCEKgAAAAAGCMgFPgETAJAqAAAAAAYI3QVxABQAqCoAAAAABgjyBT4BFADgKgAAAAAG
CAcGcQAVAPgqAAAAAAYIFAY+ARUAYCsAAAAABgghBnEAFgB4KwAAAAAGCDAGPgEWAOArAAAAAAYI
PwbAABcA+CsAAAAABghMBkMBFwAELAAAAAABCFkGuwAYACQsAAAAAAEAbAY+ARgAUCwAAAAAAQCr
BkgBGQCgLAAAAAABAMUGUQEbABAtAAAAAAEA1gZXARwAfC4AAAAAAQDkBl4BHQD0LgAAAAABAO8G
EwAdAKQvAAAAAAEADAdkAR0AAAABAEsCAAABAIQCAAABAIQCAAABAMoDAAACANQDAAADAN0DAAAE
AOUDAAAFAOwDAAABAIEEAAACAIkEAAADAOUDAAAEAOwDAAABAOUDAAABALwEAAABAMoDAAABAMoD
AAABALwEAAABAI0FAAABANcFAAABANcFAAABANcFAAABANcFAAABANcFAAABAHcGAAABALYGAAAC
AMAGAAABANIGAAABANIGAAABACEHAAACACcHAAADAC8HAAAEADgHAAAFAEIHAAAGAEgHCQBPARMA
kQBPAZoBoQBPAakBEQBPARMAqQBPARMAJABPARMALABPARMANABPARMAPABPARMAJAChAosALACh
AosANAChAosAPAChAosAsQBPARMAuQBPARMAwQBPAT4ByQDNCUMCGQBEAmMAGQBNAmgAKQDuCVAC
GQBmAnEA2QAKCmACGQBPARMA4QBPAXACRADqApAATAA0CosATAA+Cu0CTABPARMA6QBPAUMBOQBP
Aa8A+QAlBMAA+QAtBMAAAQFPAUMBWQBPARMAQQALCwcDCQE4Cw0DEQFZCxMDGQFiC2gACQGMCxoD
IQFZCyADKQHFC+sAiQDzC2MAiQBZCywDiQD8CzQDCQEdDDoDQQFZC0AD8QA4DEcDOQBGDEwDSQBR
DFEDUQFqDFYDSQD8C10DUQF1DGMDYQGSDGkDMQHADHADaQFZC3YDcQHvDHEA8QD4DH0DYQH/DBcA
QQBtBRMAYQBCDSwDeQBUDZcDiQBPARMAGQF5DZsDiQGTDWgAiQFZC6EDWQCvDagDkQHWDa4DGQFG
DGgAgQHoDWgAmQH2DbQDGQE0DroDgQFZDmgAoQF2DsAD8QCEDscDeQHvDHEASQFmAnEA8QCEDs0D
aQGTDWgA8QCLDvUAcQHoDWgAcQGRDtQD8QD4DNkDQQB4BRMAeQCeDhMAqQFPAT4B8QDMDvkDGQHS
DsAAOQFPAT4BKQHhDj4BOQH5DnEAWQCYBRMAEQGTDWgAoQEFD0MBiQEQDxMAoQEQDxMAoQEaDxUE
aQAeD3EAeQEnDz4BeQEwDxsEeQE9D1EDeQFID1EDeQFWD1EDeQFgD1EDuQFPARMAWQDnDz0E0QFZ
C0ME2QFCDSwD4QEeEEoEwQEtEFAEyQE6EMAAyQEeD3EAuQFIEFcEuQFMEBMAuQFXEFwE8QFpEIwE
QQGTDWgAaQEQDxMACQF3EKYE8QBEArEE8QD4DLkESQCSEMwESQBZC9EE8QD4DOAEgQDDEOcECQLJ
EO4EAQLVEPUEEQLdEHEA4QEBERsFIQIREV4BaQEaDy8FcQEnDz4BcQEcETUFaQA7EWgAaQBGEWgA
aQBUEWgAaQBeEVsFMQJPARMAOQJPAT4BQQJPAXUFSQJPARMAUQJPAUMBWQJPAT4BYQJPAT4BaQJP
AT4BcQJPAToGgQJPAT4BgQJPAW8GiQJPAVEDkQJPARMAmQJPAT4BDgAoAPgADgAsADMBKQCDACUC
LgCjBNcGLgCzBP8GLgCrBOAGQAArAMgBQAATAKABQwATAKABQwAbAK8BSQCDAP0BYwAbAK8BYwAT
AKABaQCDADYCgAArAMgBgwAbAK8BgwB7AMgBgwBzAMgBiQCDABECoAArAMgBowDDAHgCowATAKAB
wAArAMgBwwDrAPwCwwATAKAB4AArAMgB4wALAfwCAAETAKABAAErAMgBAwELAfwCIAErAMgBIAET
AKABKQF7BO0FKQGDBPsFKQFzBA8GQAETAKABQAErAMgBSQGLBKABSQGTBEEGSQFzBFQGSQF7BO0F
YAErAMgBYAETAKABYwFTBGcFYwELAfwCYwFbBHsFYwFjBMgBYwFLBMgBaQGbBHYGaQF7BO0FaQFz
BIoGgAErAMgBiQFzBK8GiQF7BO0FiQGbBHYGoAErAMgBqQFzBMMFqQF7BO0FqQFrBL0FwAErAMgB
wAETAKAB4AErAMgBAAIrAMgBAAITAKABQAMLAfwCgAMLAfwC6QHuAfMB+AFIAkwCVwJcAmsCawLz
AgIDAgNIAkgCJwOEA+EDAwQhBGQEewRcAlwCXAKTBFwCmQRIAp8ESAK/BNYE/AQiBT8FYQUEAAEA
BgAFAAcABgAJAAgACwAJAAAAcwFPAAAALAJUAAAA2wFZAAAAOAJeAAAA9AKYAAAAOQTEAAAATATE
AAAAQwXwAAAAQwWSAQAAOgiSAQAASwiSAQAAVAiSAQAAXwiWAQAAaAjEAAIABAADAAIABQAFAAIA
BgAHAAIABwAJAAIADwALAAIAEgANAAIAEwAPAAIAGwARAAEAJgATAAIAJQATAAIAJwAVAAEAKAAV
AAEAKgAXAAIAKQAXAAEALAAZAAIAKwAZAAIALQAbAAEALgAbAAIALwAdAHUAdQCIAM0B1AHbAeIB
2gLhAjEDBIAAAAAAAAAAAAAAAAAAAAAAtQAAAAQAAAAAAAAAAAAAAAEACgAAAAAACgAAAAAAAAAA
AAAACgATAAAAAAABAAAAAAAAAAAAAACdAAADAAAAAAwAAAAAAAAAAAAAAKYAPgMAAAAADAAAAAAA
AAAAAAAApgCMAwAAAAAMAAAAAAAAAAAAAACmANAEAAAAAAEAAAAAAAAAAAAAAJ0AfwYAAAAABAAA
AAAAAAAAAAAAAQB8AQAAAAAMAAAAAAAAAAAAAACmAKUKAAAAAAwAAAAAAAAAAAAAAKYAqA8AAAAA
BAAAAAAAAAAAAAAAAQCtEAAAAAACAAAAAAAAAAAAAAABAK0QAAAAAAUABAAGAAQAAAAQAAwAggIA
ABAAGQCCAgAAAAAbAIICLQBmAi0A6AIAAAA8TW9kdWxlPgBtc2NvcmxpYgBNaWNyb3NvZnQuVmlz
dWFsQmFzaWMATXlBcHBsaWNhdGlvbgBTY3JpcHRDb21wb25lbnRfMjJiNGY5MTFiMjU4NGZmNGJm
ZWFiMGI3NjE4NGRlZTYuTXkATXlDb21wdXRlcgBNeVByb2plY3QATXlXZWJTZXJ2aWNlcwBUaHJl
YWRTYWZlT2JqZWN0UHJvdmlkZXJgMQBJbnB1dEJ1ZmZlcgBTY3JpcHRDb21wb25lbnRfMjJiNGY5
MTFiMjU4NGZmNGJmZWFiMGI3NjE4NGRlZTYAVXNlckNvbXBvbmVudABDb25uZWN0aW9ucwBWYXJp
YWJsZXMAU2NyaXB0TWFpbgBNaWNyb3NvZnQuVmlzdWFsQmFzaWMuQXBwbGljYXRpb25TZXJ2aWNl
cwBBcHBsaWNhdGlvbkJhc2UALmN0b3IATWljcm9zb2Z0LlZpc3VhbEJhc2ljLkRldmljZXMAQ29t
cHV0ZXIAU3lzdGVtAE9iamVjdAAuY2N0b3IAZ2V0X0NvbXB1dGVyAG1fQ29tcHV0ZXJPYmplY3RQ
cm92aWRlcgBnZXRfQXBwbGljYXRpb24AbV9BcHBPYmplY3RQcm92aWRlcgBVc2VyAGdldF9Vc2Vy
AG1fVXNlck9iamVjdFByb3ZpZGVyAGdldF9XZWJTZXJ2aWNlcwBtX015V2ViU2VydmljZXNPYmpl
Y3RQcm92aWRlcgBBcHBsaWNhdGlvbgBXZWJTZXJ2aWNlcwBFcXVhbHMAbwBHZXRIYXNoQ29kZQBU
eXBlAEdldFR5cGUAVG9TdHJpbmcAQ3JlYXRlX19JbnN0YW5jZV9fAFQAaW5zdGFuY2UARGlzcG9z
ZV9fSW5zdGFuY2VfXwBnZXRfR2V0SW5zdGFuY2UATWljcm9zb2Z0LlZpc3VhbEJhc2ljLk15U2Vy
dmljZXMuSW50ZXJuYWwAQ29udGV4dFZhbHVlYDEAbV9Db250ZXh0AEdldEluc3RhbmNlAENvenlS
b2MuU1NJU1BsdXMuMjAxNABDb3p5Um9jLlNxbFNlcnZlci5TU0lTAFNjcmlwdEJ1ZmZlclBsdXMA
TWljcm9zb2Z0LlNxbFNlcnZlci5UeFNjcmlwdABNaWNyb3NvZnQuU3FsU2VydmVyLkR0cy5QaXBl
bGluZQBTY3JpcHRDb21wb25lbnQATWljcm9zb2Z0LlNxbFNlcnZlci5QaXBlbGluZUhvc3QAUGlw
ZWxpbmVCdWZmZXIAT3V0cHV0TmFtZU1hcABDb21wb25lbnQAT2JqZWN0SUQASXNJbnB1dABCdWZm
ZXIAT3V0cHV0TWFwAGdldF9TdGF0aWNJbnB1dENvbHVtbnMAZ2V0X1N0YXRpY091dHB1dENvbHVt
bnMATmV4dFJvdwBFbmRPZlJvd3NldABTdGF0aWNJbnB1dENvbHVtbnMAU3RhdGljT3V0cHV0Q29s
dW1ucwBTY3JpcHRDb21wb25lbnRQbHVzAFByb2Nlc3NJbnB1dABJbnB1dElEAElucHV0TmFtZQBJ
bnB1dF9Qcm9jZXNzSW5wdXQASW5wdXRfUHJvY2Vzc0lucHV0Um93AFJvdwBQYXJlbnRDb21wb25l
bnQATWljcm9zb2Z0LlNxbFNlcnZlci5EVFNSdW50aW1lV3JhcABNaWNyb3NvZnQuU3FsU2VydmVy
LkR0cy5SdW50aW1lLldyYXBwZXIASURUU0Nvbm5lY3Rpb25NYW5hZ2VyMTAwAGdldF9Db25uZWN0
aW9uAENvbm5lY3Rpb24AUXVlcnlUZW1wbGF0ZV8zUABMaXN0RGVsaW1pdGVyAFByZUV4ZWN1dGUA
UG9zdEV4ZWN1dGUAVmFsaWRhdGUAZXJyTWVzc2FnZQBSZWluaXRpYWxpemVNZXRhRGF0YQBHZXRP
YmplY3RMaXN0AEdldEZpZWxkTGlzdABzZXRfQ29ubmVjdGlvbgB2YWx1ZQBnZXRfU2FsZXNmb3Jj
ZU9iamVjdABzZXRfU2FsZXNmb3JjZU9iamVjdABnZXRfS2V5RmllbGQAc2V0X0tleUZpZWxkAGdl
dF9WYWx1ZUZpZWxkAHNldF9WYWx1ZUZpZWxkAGdldF9Vc2VDYWNoZQBzZXRfVXNlQ2FjaGUAZ2V0
X0Nvbm5lY3Rpb25UeXBlAEZpcmVFcnJvcl8AbWVzc2FnZQBDb3p5Um9jLlNmb3JjZQBDb3p5Um9j
LlNmb3JjZS5TZXJ2aWNlAEZpZWxkAEZpbmRGaWVsZF8AZmllbGRMaXN0AG5hbWUAR2V0Q2FjaGVL
ZXlfAHJvdwBHZXRMb29rdXBSb3dfAEdldEZpZWxkc18AU2V0dXBPdXRwdXRDb2x1bW5zXwBEYXRh
VHlwZQBHZXREdHNUeXBlRnJvbUZpZWxkXwBmaWVsZABEdHNUeXBlAGZpZWxkTGVuAFByZWNpc2lv
bgBTY2FsZQBDb2RlUGFnZQBtX3Nmb3JjZUNvbm5lY3Rpb24AbV9vYmplY3QAbV9rZXlGaWVsZABt
X3ZhbHVlRmllbGQAbV91c2VDYWNoZQBJU2ZvcmNlQ29ubmVjdGlvbgBtX2Nvbm5lY3Rpb24AU2Zv
cmNlU2VydmljZQBtX3NlcnZpY2UAU3lzdGVtLkNvbGxlY3Rpb25zAEhhc2h0YWJsZQBtX2NhY2hl
AG1fcXVlcnlUZW1wbGF0ZV8xUABtX3doZXJlVGVtcGxhdGVfUABtX2tleUlkeABtX3ZhbHVlSWR4
AG1fZmllbGRzAG1fdmFsdWVUeXBlAFNhbGVzZm9yY2VPYmplY3QAS2V5RmllbGQAVmFsdWVGaWVs
ZABVc2VDYWNoZQBDb25uZWN0aW9uVHlwZQBTeXN0ZW0uQ29tcG9uZW50TW9kZWwARWRpdG9yQnJv
d3NhYmxlQXR0cmlidXRlAEVkaXRvckJyb3dzYWJsZVN0YXRlAFN5c3RlbS5Db2RlRG9tLkNvbXBp
bGVyAEdlbmVyYXRlZENvZGVBdHRyaWJ1dGUAU3lzdGVtLkRpYWdub3N0aWNzAERlYnVnZ2VySGlk
ZGVuQXR0cmlidXRlAE1pY3Jvc29mdC5WaXN1YWxCYXNpYy5Db21waWxlclNlcnZpY2VzAFN0YW5k
YXJkTW9kdWxlQXR0cmlidXRlAEhpZGVNb2R1bGVOYW1lQXR0cmlidXRlAFN5c3RlbS5Db21wb25l
bnRNb2RlbC5EZXNpZ24ASGVscEtleXdvcmRBdHRyaWJ1dGUAU3lzdGVtLlJ1bnRpbWUuQ29tcGls
ZXJTZXJ2aWNlcwBSdW50aW1lSGVscGVycwBHZXRPYmplY3RWYWx1ZQBSdW50aW1lVHlwZUhhbmRs
ZQBHZXRUeXBlRnJvbUhhbmRsZQBBY3RpdmF0b3IAQ3JlYXRlSW5zdGFuY2UATXlHcm91cENvbGxl
Y3Rpb25BdHRyaWJ1dGUAZ2V0X1ZhbHVlAHNldF9WYWx1ZQBTeXN0ZW0uUnVudGltZS5JbnRlcm9w
U2VydmljZXMAQ29tVmlzaWJsZUF0dHJpYnV0ZQBTdHJpbmcAU2NyaXB0QnVmZmVyAENMU0NvbXBs
aWFudEF0dHJpYnV0ZQBNaWNyb3NvZnQuU3FsU2VydmVyLkRUU1BpcGVsaW5lV3JhcABNaWNyb3Nv
ZnQuU3FsU2VydmVyLkR0cy5QaXBlbGluZS5XcmFwcGVyAElEVFNDb21wb25lbnRNZXRhRGF0YTEw
MABnZXRfQ29tcG9uZW50TWV0YURhdGEASURUU0lucHV0Q29sbGVjdGlvbjEwMABnZXRfSW5wdXRD
b2xsZWN0aW9uAElEVFNJbnB1dDEwMABnZXRfSXRlbQBnZXRfSUQASURUU1J1bnRpbWVDb25uZWN0
aW9uQ29sbGVjdGlvbjEwMABnZXRfUnVudGltZUNvbm5lY3Rpb25Db2xsZWN0aW9uAElEVFNSdW50
aW1lQ29ubmVjdGlvbjEwMABnZXRfQ29ubmVjdGlvbk1hbmFnZXIASURUU091dHB1dDEwMABFeGNl
cHRpb24AQ29udGFpbnMAc2V0X0l0ZW0ASURUU091dHB1dENvbGxlY3Rpb24xMDAAZ2V0X091dHB1
dENvbGxlY3Rpb24ASW50MzIASXNOdWxsT3JFbXB0eQBnZXRfQnVmZmVyAFNldE51bGwAQ29udmVy
dABEYXRlVGltZQBUb0RhdGVUaW1lAEZyb21CYXNlNjRTdHJpbmcAUHJvamVjdERhdGEAU2V0UHJv
amVjdEVycm9yAElEVFNPdXRwdXRDb2x1bW5Db2xsZWN0aW9uMTAwAGdldF9PdXRwdXRDb2x1bW5D
b2xsZWN0aW9uAElEVFNPdXRwdXRDb2x1bW4xMDAAZ2V0X05hbWUARm9ybWF0AENsZWFyUHJvamVj
dEVycm9yAElEVFNFeHRlcm5hbE1ldGFkYXRhQ29sdW1uMTAwAElEVFNJbnB1dENvbHVtbjEwMABB
Y3F1aXJlQ29ubmVjdGlvbgBDb25uZWN0AElEVFNJbnB1dENvbHVtbkNvbGxlY3Rpb24xMDAAZ2V0
X0lucHV0Q29sdW1uQ29sbGVjdGlvbgBnZXRfQ291bnQAUGlwZWxpbmVDb21wb25lbnQAZ2V0X0hv
c3RDb21wb25lbnQASURUU0J1ZmZlck1hbmFnZXIxMDAAZ2V0X0J1ZmZlck1hbmFnZXIAZ2V0X0xp
bmVhZ2VJRABGaW5kQ29sdW1uQnlMaW5lYWdlSUQASURUU0V4dGVybmFsTWV0YWRhdGFDb2x1bW5D
b2xsZWN0aW9uMTAwAGdldF9FeHRlcm5hbE1ldGFkYXRhQ29sdW1uQ29sbGVjdGlvbgBnZXRfRXh0
ZXJuYWxNZXRhZGF0YUNvbHVtbklEAEdldE9iamVjdEJ5SUQAQ29uY2F0AEVtcHR5AGdldF9EYXRh
VHlwZQBDbG9zZQBBcHBsaWNhdGlvbkV4Y2VwdGlvbgBTdHJpbmdTcGxpdE9wdGlvbnMAU3BsaXQA
Z2V0X0lzQXR0YWNoZWQAc2V0X0Nvbm5lY3Rpb25NYW5hZ2VySUQAZ2V0X01lc3NhZ2UAc2V0X0lz
VXNlZABSZW1vdmVBbGwATmV3AGdldF9uYW1lAHNldF9OYW1lAHNldF9EYXRhVHlwZQBzZXRfTGVu
Z3RoAHNldF9QcmVjaXNpb24Ac2V0X1NjYWxlAHNldF9Db2RlUGFnZQBBcnJheUxpc3QARGVzY3Jp
YmVHbG9iYWxSZXN1bHQARGVzY3JpYmVHbG9iYWxTT2JqZWN0UmVzdWx0AE1pY3Jvc29mdC5TcWxT
ZXJ2ZXIuTWFuYWdlZERUUwBNaWNyb3NvZnQuU3FsU2VydmVyLkR0cy5SdW50aW1lAGdldF9EZXNp
Z25Db25uZWN0aW9ucwBDb25uZWN0aW9uTWFuYWdlcgBfU2ZvcmNlU2VydmljZQBkZXNjcmliZUds
b2JhbABnZXRfc29iamVjdHMAZ2V0X3F1ZXJ5YWJsZQBBZGQAU29ydABBcnJheQBUb0FycmF5AE9w
ZXJhdG9ycwBDb21wYXJlU3RyaW5nAEZpcmVFcnJvcgBTdHJpbmdDb21wYXJpc29uAElzTnVsbABz
T2JqZWN0AFF1ZXJ5UmVzdWx0AFN5c3RlbS5YbWwAWG1sRWxlbWVudABxdWVyeQBnZXRfcmVjb3Jk
cwBnZXRfQW55AGdldF9Jbm5lclRleHQARGVzY3JpYmVTT2JqZWN0UmVzdWx0AGRlc2NyaWJlU09i
amVjdABnZXRfZmllbGRzAFNldERhdGFUeXBlUHJvcGVydGllcwBzb2FwVHlwZQBnZXRfbGVuZ3Ro
AGdldF9wcmVjaXNpb24AZ2V0X3NjYWxlAGdldF9zb2FwVHlwZQBTU0lTU2NyaXB0Q29tcG9uZW50
RW50cnlQb2ludEF0dHJpYnV0ZQBDb3p5Um9jLlNxbFNlcnZlci5TU0lTLkF0dHJpYnV0ZXMAVmFs
aWRhdGVQcm9wZXJ0aWVzQXR0cmlidXRlAFNvcnRQcm9wZXJ0aWVzQXR0cmlidXRlAENvbHVtbk1h
cHBpbmdzQXR0cmlidXRlAERlZmF1bHRWYWx1ZUF0dHJpYnV0ZQBEZXNjcmlwdGlvbkF0dHJpYnV0
ZQBDYXRlZ29yeUF0dHJpYnV0ZQBDb25uZWN0aW9uQXR0cmlidXRlAFJlZnJlc2hQcm9wZXJ0aWVz
QXR0cmlidXRlAFJlZnJlc2hQcm9wZXJ0aWVzAExpc3RBdHRyaWJ1dGUAQ29tcGlsYXRpb25SZWxh
eGF0aW9uc0F0dHJpYnV0ZQBSdW50aW1lQ29tcGF0aWJpbGl0eUF0dHJpYnV0ZQBTeXN0ZW0uUnVu
dGltZS5WZXJzaW9uaW5nAFRhcmdldEZyYW1ld29ya0F0dHJpYnV0ZQBTY3JpcHRDb21wb25lbnRf
MjJiNGY5MTFiMjU4NGZmNGJmZWFiMGI3NjE4NGRlZTYuZGxsAAAAAAtJAG4AcAB1AHQAABVDAG8A
bgBuAGUAYwB0AGkAbwBuAABTRgBhAGkAbABlAGQAIAB0AG8AIABwAHIAbwBjAGUAcwBzACAAJwB7
ADAAfQAnACAAZgBvAHIAIABjAG8AbAB1AG0AbgAgACcAewAxAH0AJwAuAAELIABBAE4ARAAgAAAT
ewAwAH0AIAA9ACAAewAxAH0AAAN7AAADfQAABSwAIAAAO3MAZQBsAGUAYwB0ACAAewAwAH0AIABm
AHIAbwBtACAAewAxAH0AIAB3AGgAZQByAGUAIAB7ADIAfQAAB3sAMAB9AAA7UwBlAGwAZQBjAHQA
IABTAGEAbABlAHMAZgBvAHIAYwBlACAAYwBvAG4AbgBlAGMAdABpAG8AbgAuAAAdUwBlAGwAZQBj
AHQAIABvAGIAagBlAGMAdAAuAAArUwBwAGUAYwBpAGYAeQAgAGsAZQB5ACAAZgBpAGUAbABkACgA
cwApAC4AACdTAGUAbABlAGMAdAAgAHYAYQBsAHUAZQAgAGYAaQBlAGwAZAAuAAAFLAAKAAAlTQBh
AHAAIABpAG4AcAB1AHQAIABjAG8AbAB1AG0AbgBzAC4AABVOAG8AIABpAG4AcAB1AHQAcwAuAAA1
SwBlAHkAIABmAGkAZQBsAGQAKABzACkAIABuAG8AdAAgAHMAZQBsAGUAYwB0AGUAZAAuAAANUwBG
AE8AUgBDAEUAACNTAGEAbABlAHMAZgBvAHIAYwBlACAATABvAG8AawB1AHAAAC0nAHsAMAB9ACcA
IABmAGkAZQBsAGQAIABuAG8AdAAgAGYAbwB1AG4AZAAuAAEDXwAACU4AVQBMAEwAAAsnAHsAMAB9
ACcAASlVAG4AaABhAG4AZABsAGUAZAAgAHMAbwBhAHAAIAB0AHkAcABlAC4AAADRZe19sX76S5iH
bDP+lgRsAAi3elxWGTTgiQiwP19/EdUKOgMgAAEDAAABBAAAEgwHBhUSGAESDAQAABIIBwYVEhgB
EggEAAASEQcGFRIYARIRBAAAEhQHBhUSGAESFAQIABIMBAgAEggECAASEQQIABIUBCABAhwDIAAI
BCAAEhUDIAAOAh4ABxABAR4AHgAHMAEBARAeAAITAAQgABMABwYVEhkBEwAEKAATAAgWz0kLuAw0
6giJhF3NgIDMkQsgBQESIQgCEiUSKQQgAB0OAyAAAgQoAB0OAwYSJAMGEigJIAQBCA4SJRIpBSAB
ARIcAwYSIQUgAQESIQQgABIxBCgAEjECBg46cwBlAGwAZQBjAHQAIAB7ADAAfQAgAGYAcgBvAG0A
IAB7ADEAfQAgAHcAaABlAHIAZQAgAHsAMgB9AAQsAAoABSABAhAOBCABAQ4EIAEBAgggAhI1HRI1
DgUgAQ4SHAYgAR0OEhwFIAAdEjUQIAYBEjUQETkQCBAIEAgQCAIGAgMGEj0DBhJBAwYSRQMGHQgE
Bh0SNQQGHRE5AygADgMoAAIFIAEBEU0IAQABAAAAAAAFIAIBDg4YAQAKTXlUZW1wbGF0ZQgxMC4w
LjAuMAAABAEAAAAGFRIYARIMBhUSGAESCAYVEhgBEhEGFRIYARIUBAcBEgwEBwESCAQHARIRBAcB
EhQTAQAOTXkuQXBwbGljYXRpb24AABMBAA5NeS5XZWJTZXJ2aWNlcwAAEAEAC015LkNvbXB1dGVy
AAAMAQAHTXkuVXNlcgAABAABHBwDBwECAwcBCAYAARIVEWkEBwESFQMHAQ4FEAEAHgAECgEeAAQH
AR4AByAEAQ4ODg5hAQA0U3lzdGVtLldlYi5TZXJ2aWNlcy5Qcm90b2NvbHMuU29hcEh0dHBDbGll
bnRQcm90b2NvbBJDcmVhdGVfX0luc3RhbmNlX18TRGlzcG9zZV9fSW5zdGFuY2VfXwAAAAYVEhgB
EwAGFRIZARMABAoBEwAFIAEBEwAIBwMTABMAEwAFAQAAAAAEBwEdDgUgABKAhQUgABKAiQYgARKA
jRwFIAASgJEGIAESgJUcBAcBEjEEIAEcHAIdDgUgAgEcHAUgABKAoQYgARKAmRwEAAECDgQgABIl
BCABAQgGAAERgK0OBSACAQgcBQABHQUOBgABARKAnQUgABKAtQYgARKAuRwGAAMODhwcEgcKHQ4O
CBKAmQgOCBKAnQgROQMgABwFIAASgMUGIAESgMEcBSAAEoDJBSAAEoDNBSACCAgIBSAAEoDRBiAB
EoC9CAUAAg4ODgYAAw4ODg4EIAAROQcABA4OHBwcFwcLCA4SgI0SgJkIEoC9EoDBCBKAuQgICSAC
HQ4dDhGA2REHBwICEoCNHQ4SgJkSgJ0dDgUgABKAvQUgAQERORsHDh0SNRKAjR0OCBKAvRE5EjUI
DggIHQ4IHQ4FIAASgOkGIAESgO0cBSAAEoDhBiAAHRKA5QQgAQgcByABEoD1EhUWBwgSPR0OEoDd
EkESgOESgOUIHRKA5RAHBh0SNR0OEoDdEjUIHRI1BgADCA4OAgUHARKAjQUHARKAmQYHAh0OHQ4K
IAYBCA4ODggQAgcgAgIOEYD9BQACDg4cDAcFEjUSNRI1CB0SNQQgAQIIBCABHAgJBwYODggOCB0I
BgACDg4dHAYgARKBBQ4GIAAdEoEBBiAAHRKBDR4HEQgdDg4SgQEdDh0cCA4IHBKBBRKAnQgIEoEJ
CAgGIAESgREODAcEHRI1HRI1Ej0SQQUgABKAuQkgBQEROQgICAgbBw4dEjUSgJkdDggSgLkRORI1
CAgIDh0OCB0OBSAAEYEVBQcBEYEVDQEACFZhbGlkYXRlAAAFIAEBHQ5BAQAFAAAACkNvbm5lY3Rp
b24QU2FsZXNmb3JjZU9iamVjdAhLZXlGaWVsZApWYWx1ZUZpZWxkCFVzZUNhY2hlAAAFAQABAAAp
AQAkU2VsZWN0IHdoZXRoZXIgbWVtb3J5IGNhY2hlIGlzIHVzZWQuAAANAQAIU2V0dGluZ3MAABMB
AA5Db25uZWN0aW9uVHlwZQAAKgEAJVNlbGVjdCBTYWxlc2ZvcmNlIENvbm5lY3Rpb24gTWFuYWdl
ci4AAAYgAQERgT0SAQANR2V0T2JqZWN0TGlzdAAAGgEAFVNlbGVjdCBsb29rdXAgb2JqZWN0LgAA
BiADAQ4CAhMBAAxHZXRGaWVsZExpc3QBAAAAJAEAH1NwZWNpZnkgb25lIG9yIG1vcmUga2V5IGZp
ZWxkcy4AACcBACJTcGVjaWZ5IG9uZSBvciBtb3JlIGxvb2t1cCBmaWVsZHMuAAAIAQAIAAAAAAAe
AQABAFQCFldyYXBOb25FeGNlcHRpb25UaHJvd3MBRwEAGi5ORVRGcmFtZXdvcmssVmVyc2lvbj12
NC4wAQBUDhRGcmFtZXdvcmtEaXNwbGF5TmFtZRAuTkVUIEZyYW1ld29yayA0ACBdAAAAAAAAAAAA
AD5dAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwXQAAAAAAAAAAAAAAAAAAAABfQ29yRGxsTWFp
bgBtc2NvcmVlLmRsbAAAAAAA/yUAIAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAQAAAAGAAAgAAAAAAAAAAA
AAAAAAAAAQABAAAAMAAAgAAAAAAAAAAAAAAAAAAAAQAAAAAASAAAAFhgAADsAgAAAAAAAAAAAADs
AjQAAABWAFMAXwBWAEUAUgBTAEkATwBOAF8ASQBOAEYATwAAAAAAvQTv/gAAAQAAAAAAAAAAAAAA
AAAAAAAAPwAAAAAAAAAEAAAAAgAAAAAAAAAAAAAAAAAAAEQAAAABAFYAYQByAEYAaQBsAGUASQBu
AGYAbwAAAAAAJAAEAAAAVAByAGEAbgBzAGwAYQB0AGkAbwBuAAAAAAAAALAETAIAAAEAUwB0AHIA
aQBuAGcARgBpAGwAZQBJAG4AZgBvAAAAKAIAAAEAMAAwADAAMAAwADQAYgAwAAAALAACAAEARgBp
AGwAZQBEAGUAcwBjAHIAaQBwAHQAaQBvAG4AAAAAACAAAAAwAAgAAQBGAGkAbABlAFYAZQByAHMA
aQBvAG4AAAAAADAALgAwAC4AMAAuADAAAACMADUAAQBJAG4AdABlAHIAbgBhAGwATgBhAG0AZQAA
AFMAYwByAGkAcAB0AEMAbwBtAHAAbwBuAGUAbgB0AF8AMgAyAGIANABmADkAMQAxAGIAMgA1ADgA
NABmAGYANABiAGYAZQBhAGIAMABiADcANgAxADgANABkAGUAZQA2AC4AZABsAGwAAAAAACgAAgAB
AEwAZQBnAGEAbABDAG8AcAB5AHIAaQBnAGgAdAAAACAAAACUADUAAQBPAHIAaQBnAGkAbgBhAGwA
RgBpAGwAZQBuAGEAbQBlAAAAUwBjAHIAaQBwAHQAQwBvAG0AcABvAG4AZQBuAHQAXwAyADIAYgA0
AGYAOQAxADEAYgAyADUAOAA0AGYAZgA0AGIAZgBlAGEAYgAwAGIANwA2ADEAOAA0AGQAZQBlADYA
LgBkAGwAbAAAAAAANAAIAAEAUAByAG8AZAB1AGMAdABWAGUAcgBzAGkAbwBuAAAAMAAuADAALgAw
AC4AMAAAADgACAABAEEAcwBzAGUAbQBiAGwAeQAgAFYAZQByAHMAaQBvAG4AAAAwAC4AMAAuADAA
LgAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAADAAAAFA9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==]]></arrayElement></arrayElements></property><property id="27" name="UserComponentTypeName" dataType="System.String">CozyRoc.SqlServer.SSIS.ScriptComponentHostPlus, CozyRoc.SSISPlus.2014, Version=1.0.0.0, Culture=neutral, PublicKeyToken=16cf490bb80c34ea</property><property id="29" name="VSTAProjectName" dataType="System.String" description="Specifies the name of the Microsoft Visual Studio Tools for Applications project. Project names must be unique within a package." typeConverter="NOTBROWSABLE">ScriptComponent_22b4f911b2584ff4bfeab0b76184dee6</property><property id="30" name="ScriptLanguage" dataType="System.String" description="Specifies the programming language used by the script." typeConverter="Microsoft.SqlServer.VSTAHosting.ScriptingLanguages, Microsoft.SqlServer.VSTAScriptingLib, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91">VisualBasic</property></properties><connections><connection id="32" name="Connection" connectionManagerID="{CC92795A-FF75-41D2-A69C-1B4452DCFEA7}" /></connections><inputs><input id="33" name="Input" hasSideEffects="true"><externalMetadataColumns isUsed="True" /></input></inputs><outputs><output id="36" name="Output" synchronousInputId="33"><externalMetadataColumns /></output></outputs></component>