
    tni|                     h   d dl Z d dlmZ d dlmZmZ d dlmZ d dlm	Z	 d dl
mZmZmZmZ d dlmZmZmZmZ  G d d	          Z G d
 d          Z G d d          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          ZdS )    N)BytesIOreadableseekable)FULL_OBJECT_CHECKSUM_ARGS)IN_MEMORY_UPLOAD_TAG)CompleteMultipartUploadTaskCreateMultipartUploadTaskSubmissionTaskTask)ChunksizeAdjusterDeferredOpenFileget_callbacksget_filtered_dictc                   (    e Zd ZddZd Zd Zd ZdS )AggregatedProgressCallback   c                 0    || _         || _        d| _        dS )a  Aggregates progress updates for every provided progress callback

        :type callbacks: A list of functions that accepts bytes_transferred
            as a single argument
        :param callbacks: The callbacks to invoke when threshold is reached

        :type threshold: int
        :param threshold: The progress threshold in which to take the
            aggregated progress and invoke the progress callback with that
            aggregated progress total
        r   N)
_callbacks
_threshold_bytes_seen)self	callbacks	thresholds      N/var/www/html/gpu-tools/venv/lib/python3.11/site-packages/s3transfer/upload.py__init__z#AggregatedProgressCallback.__init__"   s      $#    c                 r    | xj         |z  c_         | j         | j        k    r|                                  d S d S N)r   r   _trigger_callbacks)r   bytes_transferreds     r   __call__z#AggregatedProgressCallback.__call__2   sG    --t..##%%%%% /.r   c                 H    | j         dk    r|                                  dS dS )z@Flushes out any progress that has not been sent to its callbacksr   N)r   r    r   s    r   flushz AggregatedProgressCallback.flush7   s0    a##%%%%%  r   c                 J    | j         D ]} || j                   d| _        d S )N)r!   r   )r   r   )r   callbacks     r   r    z-AggregatedProgressCallback._trigger_callbacks<   s:     	9 	9HHt'788888r   N)r   )__name__
__module____qualname__r   r"   r%   r     r   r   r   r   !   sU            & & &
& & &
    r   r   c                   @    e Zd ZdZd ZddZddZd Zd Zd	 Z	d
 Z
dS )InterruptReadera  Wrapper that can interrupt reading using an error

    It uses a transfer coordinator to propagate an error if it notices
    that a read is being made while the file is being read from.

    :type fileobj: file-like obj
    :param fileobj: The file-like object to read from

    :type transfer_coordinator: s3transfer.futures.TransferCoordinator
    :param transfer_coordinator: The transfer coordinator to use if the
        reader needs to be interrupted.
    c                 "    || _         || _        d S r   )_fileobj_transfer_coordinator)r   fileobjtransfer_coordinators      r   r   zInterruptReader.__init__P   s    %9"""r   Nc                 f    | j         j        r| j         j        | j                            |          S r   )r0   	exceptionr/   read)r   amounts     r   r5   zInterruptReader.readT   s4     %/ 	7,66}!!&)))r   r   c                 <    | j                             ||           d S r   )r/   seek)r   wherewhences      r   r8   zInterruptReader.seek^   s     5&)))))r   c                 4    | j                                         S r   )r/   tellr$   s    r   r<   zInterruptReader.tella   s    }!!###r   c                 8    | j                                          d S r   )r/   closer$   s    r   r>   zInterruptReader.closed   s    r   c                     | S r   r+   r$   s    r   	__enter__zInterruptReader.__enter__g   s    r   c                 .    |                                   d S r   )r>   )r   argskwargss      r   __exit__zInterruptReader.__exit__j   s    

r   r   )r   )r(   r)   r*   __doc__r   r5   r8   r<   r>   r@   rD   r+   r   r   r-   r-   B   s         : : :* * * ** * * *$ $ $        r   r-   c                   `    e Zd ZdZddZed             Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd ZdS )UploadInputManageraJ  Base manager class for handling various types of files for uploads

    This class is typically used for the UploadSubmissionTask class to help
    determine the following:

        * How to determine the size of the file
        * How to determine if a multipart upload is required
        * How to retrieve the body for a PutObject
        * How to retrieve the bodies for a set of UploadParts

    The answers/implementations differ for the various types of file inputs
    that may be accepted. All implementations must subclass and override
    public methods from this class.
    Nc                 0    || _         || _        || _        d S r   )_osutilr0   _bandwidth_limiter)r   osutilr2   bandwidth_limiters       r   r   zUploadInputManager.__init__~   s    %9""3r   c                      t          d          )a  Determines if the source for the upload is compatible with manager

        :param upload_source: The source for which the upload will pull data
            from.

        :returns: True if the manager can handle the type of source specified
            otherwise returns False.
        zmust implement _is_compatible()NotImplementedErrorclsupload_sources     r   is_compatiblez UploadInputManager.is_compatible   s     ""CDDDr   c                      t          d          )a  Whether the body it provides are stored in-memory

        :type operation_name: str
        :param operation_name: The name of the client operation that the body
            is being used for. Valid operation_names are ``put_object`` and
            ``upload_part``.

        :rtype: boolean
        :returns: True if the body returned by the manager will be stored in
            memory. False if the manager will not directly store the body in
            memory.
        z%must implement store_body_in_memory()rN   r   operation_names     r   stores_body_in_memoryz(UploadInputManager.stores_body_in_memory   s     ""IJJJr   c                      t          d          )zProvides the transfer size of an upload

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The future associated with upload request
        z&must implement provide_transfer_size()rN   r   transfer_futures     r   provide_transfer_sizez(UploadInputManager.provide_transfer_size   s     ""JKKKr   c                      t          d          )a  Determines where a multipart upload is required

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The future associated with upload request

        :type config: s3transfer.manager.TransferConfig
        :param config: The config associated to the transfer manager

        :rtype: boolean
        :returns: True, if the upload should be multipart based on
            configuration and size. False, otherwise.
        z*must implement requires_multipart_upload()rN   r   rZ   configs      r   requires_multipart_uploadz,UploadInputManager.requires_multipart_upload   s     ""NOOOr   c                      t          d          )a  Returns the body to use for PutObject

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The future associated with upload request

        :type config: s3transfer.manager.TransferConfig
        :param config: The config associated to the transfer manager

        :rtype: s3transfer.utils.ReadFileChunk
        :returns: A ReadFileChunk including all progress callbacks
            associated with the transfer future.
        z$must implement get_put_object_body()rN   rY   s     r   get_put_object_bodyz&UploadInputManager.get_put_object_body   s     ""HIIIr   c                      t          d          )a  Yields the part number and body to use for each UploadPart

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The future associated with upload request

        :type chunksize: int
        :param chunksize: The chunksize to use for this upload.

        :rtype: int, s3transfer.utils.ReadFileChunk
        :returns: Yields the part number and the ReadFileChunk including all
            progress callbacks associated with the transfer future for that
            specific yielded part.
        z)must implement yield_upload_part_bodies()rN   )r   rZ   	chunksizes      r   yield_upload_part_bodiesz+UploadInputManager.yield_upload_part_bodies   s     ""MNNNr   c                     t          || j                  }| j        r"| j                            || j        d          }|S )NF)enabled)r-   r0   rJ   get_bandwith_limited_stream)r   r1   s     r   _wrap_fileobjz UploadInputManager._wrap_fileobj   sN    !'4+EFF" 	-II3U J  G r   c                 J    t          |d          }|rt          |          gS g S )Nprogress)r   r   )r   rZ   r   s      r   _get_progress_callbacksz*UploadInputManager._get_progress_callbacks   s1    !/:>>	  	;.y99::	r   c                     d |D             S )Nc                     g | ]	}|j         
S r+   )r%   ).0r'   s     r   
<listcomp>z;UploadInputManager._get_close_callbacks.<locals>.<listcomp>   s    MMM8MMMr   r+   )r   aggregated_progress_callbackss     r   _get_close_callbacksz'UploadInputManager._get_close_callbacks   s    MM/LMMMMr   r   )r(   r)   r*   rE   r   classmethodrS   rW   r[   r_   ra   rd   rh   rk   rq   r+   r   r   rG   rG   n   s         4 4 4 4
 	E 	E [	EK K KL L LP P PJ J JO O O     N N N N Nr   rG   c                   ^    e Zd ZdZed             Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd ZdS )UploadFilenameInputManagerzUpload utility for filenamesc                 ,    t          |t                    S r   )
isinstancestrrP   s     r   rS   z(UploadFilenameInputManager.is_compatible   s    ----r   c                     dS )NFr+   rU   s     r   rW   z0UploadFilenameInputManager.stores_body_in_memory   s    ur   c                     |j                             | j                            |j         j        j                             d S r   )metar[   rI   get_file_size	call_argsr1   rY   s     r   r[   z0UploadFilenameInputManager.provide_transfer_size   sC    22L&&';'E'MNN	
 	
 	
 	
 	
r   c                 ,    |j         j        |j        k    S r   )rz   sizemultipart_thresholdr]   s      r   r_   z4UploadFilenameInputManager.requires_multipart_upload   s    #(F,FFFr   c                    |                      |          \  }}|                     |          }|                     |          }|                     |          }|j        j        }| j                            |||||          S )Nr1   
chunk_sizefull_file_sizer   close_callbacks)&_get_put_object_fileobj_with_full_sizerh   rk   rq   rz   r~   rI   #open_file_chunk_reader_from_fileobj)r   rZ   r1   	full_sizer   r   r~   s          r   ra   z.UploadFilenameInputManager.get_put_object_body   s    !HH
 
 $$W--00AA	33I>>#( |??$+ @ 
 
 	
r   c              #     K   |j         j        }|                     ||          }t          d|dz             D ]}|                     |          }|                     |          }||dz
  z  }|                     |j         j        j        |||          \  }	}
| 	                    |	          }	| j
                            |	||
||          }||fV  d S )N   )
start_byte	part_sizer   r   )rz   r~   _get_num_partsrangerk   rq   '_get_upload_part_fileobj_with_full_sizer|   r1   rh   rI   r   )r   rZ   rc   r   	num_partspart_numberr   r   r   r1   r   read_file_chunks               r   rd   z3UploadFilenameInputManager.yield_upload_part_bodies  s     (-2''CC	 IM22 	/ 	/K44_EEI"77	BBO"kAo6J "&!M!M$.6%#-	 "N " "GY ((11G #lNN$(# / O  O .....5	/ 	/r   c                 >    t          ||| j        j                  }|S )N)open_function)r   rI   open)r   r1   r   s      r   _get_deferred_open_filez2UploadFilenameInputManager._get_deferred_open_file2  s)    "Zt|/@
 
 
 r   c                 l    |j         j        j        }|j         j        }|                     |d          |fS )Nr   )rz   r|   r1   r~   r   r   rZ   r1   r~   s       r   r   zAUploadFilenameInputManager._get_put_object_fileobj_with_full_size8  s6    !&08#(++GQ77==r   c                 R    |d         }|d         }|                      ||          |fS )Nr   r   )r   )r   r1   rC   r   r   s        r   r   zBUploadFilenameInputManager._get_upload_part_fileobj_with_full_size=  s2    L)
+,	++GZ@@)KKr   c                 x    t          t          j        |j        j        t          |          z                      S r   )intmathceilrz   r~   float)r   rZ   r   s      r   r   z)UploadFilenameInputManager._get_num_partsB  s-    49_16y9I9IIJJKKKr   N)r(   r)   r*   rE   rr   rS   rW   r[   r_   ra   rd   r   r   r   r   r+   r   r   rt   rt      s        &&. . [.  
 
 

G G G
 
 
0/ / />  > > >
L L L
L L L L Lr   rt   c                   @    e Zd ZdZed             Zd Zd Zd Zd Z	dS )UploadSeekableInputManagerz&Upload utility for an open file objectc                 >    t          |          ot          |          S r   r   rP   s     r   rS   z(UploadSeekableInputManager.is_compatibleI  s    &&B8M+B+BBr   c                     |dk    rdS dS )N
put_objectFTr+   rU   s     r   rW   z0UploadSeekableInputManager.stores_body_in_memoryM  s    \))54r   c                    |j         j        j        }|                                }|                    dd           |                                }|                    |           |j                             ||z
             d S )Nr      )rz   r|   r1   r<   r8   r[   )r   rZ   r1   start_positionend_positions        r   r[   z0UploadSeekableInputManager.provide_transfer_sizeS  s    !&08 !Q||~~^$$$22>)	
 	
 	
 	
 	
r   c                 t    |                     |d                   }t          |          t          |          fS )Nr   )r5   r   len)r   r1   rC   datas       r   r   zBUploadSeekableInputManager._get_upload_part_fileobj_with_full_size`  s3     ||F;/00 t}}c$ii''r   c                 n    |j         j        j        }|                                |j         j        z   }||fS r   )rz   r|   r1   r<   r~   r   s       r   r   zAUploadSeekableInputManager._get_put_object_fileobj_with_full_sizeo  s4    !&08 ||~~ 4 99}r   N)
r(   r)   r*   rE   rr   rS   rW   r[   r   r   r+   r   r   r   r   F  sr        00C C [C  
 
 
( ( (    r   r   c                   f     e Zd ZdZd fd	Zed             Zd Zd Zd Z	d Z
d	 ZddZd Z xZS )UploadNonSeekableInputManagerz7Upload utility for a file-like object that cannot seek.Nc                 \    t                                          |||           d| _        d S )Nr   )superr   _initial_data)r   rK   r2   rL   	__class__s       r   r   z&UploadNonSeekableInputManager.__init__z  s/    !57HIII r   c                      t          |          S r   )r   rP   s     r   rS   z+UploadNonSeekableInputManager.is_compatible~  s    &&&r   c                     dS )NTr+   rU   s     r   rW   z3UploadNonSeekableInputManager.stores_body_in_memory  s    tr   c                     d S r   r+   rY   s     r   r[   z3UploadNonSeekableInputManager.provide_transfer_size  s	     	r   c                     |j         j        |j         j        |j        k    S |j         j        j        }|j        }|                     ||d          | _        t          | j                  |k     rdS dS )NFT)rz   r~   r   r|   r1   _readr   r   )r   rZ   r^   r1   r   s        r   r_   z7UploadNonSeekableInputManager.requires_multipart_upload  sr    $0"',0JJJ "&08.	!ZZEBBt!""Y..54r   c                     |                      |          }|                     |          }|j        j        j        }|                     | j        |                                z   ||          }d | _        |S r   )rk   rq   rz   r|   r1   
_wrap_datar   r5   )r   rZ   r   r   r1   bodys         r   ra   z1UploadNonSeekableInputManager.get_put_object_body  so    00AA	33I>>!&08/O
 
 "r   c              #      K   |j         j        j        }d}	 |                     |          }|                     |          }|dz  }|                     ||          }|sd S |                     |||          }d }||fV  i)Nr   Tr   )rz   r|   r1   rk   rq   r   r   )	r   rZ   rc   file_objectr   r   r   part_contentpart_objects	            r   rd   z6UploadNonSeekableInputManager.yield_upload_part_bodies  s      %*4<	+44_EEI"77	BBO1K::k9==L //i K
  L{****	+r   Tc                 X   t          | j                  dk    r|                    |          S |t          | j                  k    r'| j        d|         }|r| j        |d         | _        |S |t          | j                  z
  }| j        |                    |          z   }|rd| _        |S )a=  
        Reads a specific amount of data from a stream and returns it. If there
        is any data in initial_data, that will be popped out first.

        :type fileobj: A file-like object that implements read
        :param fileobj: The stream to read from.

        :type amount: int
        :param amount: The number of bytes to read from the stream.

        :type truncate: bool
        :param truncate: Whether or not to truncate initial_data after
            reading from it.

        :return: Generator which generates part bodies from the initial data.
        r   Nr   )r   r   r5   )r   r1   r6   truncater   amount_to_reads         r   r   z#UploadNonSeekableInputManager._read  s    $ t!""a''<<''' S+,,,,%gvg.D  A%)%7%@"K
  #d&8"9"99!GLL$@$@@  	%!$Dr   c                     |                      t          |                    }| j                            |t	          |          t	          |          ||          S )a  
        Wraps data with the interrupt reader and the file chunk reader.

        :type data: bytes
        :param data: The data to wrap.

        :type callbacks: list
        :param callbacks: The callbacks associated with the transfer future.

        :type close_callbacks: list
        :param close_callbacks: The callbacks to be called when closing the
            wrapper for the data.

        :return: Fully wrapped data.
        r   )rh   r   rI   r   r   )r   r   r   r   r1   s        r   r   z(UploadNonSeekableInputManager._wrap_data  sX      $$WT]]33|??4yyt99+ @ 
 
 	
r   r   )T)r(   r)   r*   rE   r   rr   rS   rW   r[   r_   ra   rd   r   r   __classcell__)r   s   @r   r   r   w  s        AA! ! ! ! ! ! ' ' ['    
  "  + + +(( ( ( (T
 
 
 
 
 
 
r   r   c                   v    e Zd ZdZddgZedgz   Zg dZg dez   Zd Z		 ddZ
d	 Zd
 Zd Zd Zd Zd Zd ZdS )UploadSubmissionTaskz.Task for submitting tasks to execute an uploadChecksumTypeMpuObjectSize)ChecksumAlgorithmSSECustomerKeySSECustomerAlgorithmSSECustomerKeyMD5RequestPayerExpectedBucketOwner)r   r   r   r   r   r   r   c                     t           t          t          g}|j        j        j        }|D ]}|                    |          r|c S t          d| dt          |           d          )ao  Retrieves a class for managing input for an upload based on file type

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The transfer future for the request

        :rtype: class of UploadInputManager
        :returns: The appropriate class to use for managing a specific type of
            input for uploads.
        zInput z
 of type: z is not supported.)	rt   r   r   rz   r|   r1   rS   RuntimeErrortype)r   rZ   upload_manager_resolver_chainr1   upload_manager_clss        r   _get_upload_input_manager_clsz2UploadSubmissionTask._get_upload_input_manager_cls  s     '&))
% "&08"? 	* 	*!//88 *))))*IWIIWIII
 
 	
r   Nc                 *    |                      |          || j        |          }|j        j        |                    |           |                    ||          s|                     ||||||           dS |                     ||||||           dS )a  
        :param client: The client associated with the transfer manager

        :type config: s3transfer.manager.TransferConfig
        :param config: The transfer config associated with the transfer
            manager

        :type osutil: s3transfer.utils.OSUtil
        :param osutil: The os utility associated to the transfer manager

        :type request_executor: s3transfer.futures.BoundedExecutor
        :param request_executor: The request executor associated with the
            transfer manager

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The transfer future associated with the
            transfer request that tasks are being submitted for
        N)r   r0   rz   r~   r[   r_   _submit_upload_request_submit_multipart_request)r   clientr^   rK   request_executorrZ   rL   upload_input_managers           r   _submitzUploadSubmissionTask._submit3  s    6 
tAA 
  

$,.? A  A
 $, 66GGG $==V
 
 	 '' $     ** $    r   c                 (   |j         j        }|                     |j                  }|                     |d          }	| j                            |t          | j        ||                    |          |j	        |j
        |dd          |	           d S )Nr   )r   r1   bucketkey
extra_argsT)r2   main_kwargsis_finaltag)rz   r|   _extra_put_object_argsr   _get_upload_task_tagr0   submitPutObjectTaskra   r   r   )
r   r   r^   rK   r   rZ   r   r|   put_object_extra_argsput_object_tags
             r   r   z+UploadSubmissionTask._submit_upload_requestl  s     $(2	 $ ; ; !
 !

 22 ,
 

 	"))%)%?$3GG'    (.$="7      	* 	
 	
 	
 	
 	
r   c                    |j         j        }t          D ]3}||j        v r(d|j        d<   |                    dd          |j        d<   4|                     |j                  }	| j                            |t          | j        ||j	        |j
        |	d                    }
g }|                     |j                  }|                     |d          }|j         j        }t                      }|                    |j        |          }|                    ||          }|D ]]\  }}|                    | j                            |t'          | j        |||j	        |j
        ||d	d
|
i          |                     ^|                     |j                  }| j                            |t+          | j        ||j	        |j
        |d|
|dd                     d S )NFULL_OBJECTr   Checksum r   )r   r   r   r   )r2   r   upload_part)r   r1   r   r   r   r   	upload_id)r2   r   pending_main_kwargsr   )r   partsT)r2   r   r   r   )rz   r|   r   r   replace_extra_create_multipart_argsr0   r   r
   r   r   _extra_upload_part_argsr   r~   r   adjust_chunksizemultipart_chunksizerd   appendUploadPartTask_extra_complete_multipart_argsr	   )r   r   r^   rK   r   rZ   r   r|   checksumcreate_multipart_extra_argscreate_multipart_futurepart_futuresextra_part_argsupload_part_tagr~   adjusterrc   part_iteratorr   r1   complete_multipart_extra_argss                        r   r   z.UploadSubmissionTask._submit_multipart_request  s    $(2	 2 	 	H9///7D	$^4<D<L<L= =	$%89 '+&G&G '
 '
#
 #'"<"C"C%%)%?$'.$="=	   #
 #
 66y7KLL 33 -
 
 #($&&--f.H$OO	,EEY
 
 %2 	 	 K*11$"-1-G&,'.&/&6#,=+6*9% % ()@-   (! 2     * )-(K(K )
 )
% 	"))'%)%?$'.$="?	  "9)% %   	
 	
 	
 	
 	
r   c                 ,    t          || j                  S r   )r   UPLOAD_PART_ARGSr   r   s     r   r   z,UploadSubmissionTask._extra_upload_part_args  s     !T-BCCCr   c                 ,    t          || j                  S r   )r   COMPLETE_MULTIPART_ARGSr  s     r   r   z3UploadSubmissionTask._extra_complete_multipart_args  s     T-IJJJr   c                 .    t          || j                  S N)blocklisted_keys)r   CREATE_MULTIPART_BLOCKLISTr  s     r   r   z1UploadSubmissionTask._extra_create_multipart_args  s!     )H
 
 
 	
r   c                 .    t          || j                  S r  )r   PUT_OBJECT_BLOCKLISTr  s     r   r   z+UploadSubmissionTask._extra_put_object_args  s!     )B
 
 
 	
r   c                 B    d }|                     |          rt          }|S r   )rW   r   )r   r   rV   r   s       r   r   z)UploadSubmissionTask._get_upload_task_tag  s'    55nEE 	'&C
r   r   )r(   r)   r*   rE   r
  r   r  r  r  r   r   r   r   r   r   r   r   r   r+   r   r   r   r     s        88*O<!:o=N!N     	""
 
 
> 7 7 7 7r%
 %
 %
Na
 a
 a
FD D D
K K K
 
 


 
 

    r   r   c                       e Zd ZdZd ZdS )r   z Task to do a nonmultipart uploadc                 ^    |5 } |j         d|||d| ddd           dS # 1 swxY w Y   dS )aP  
        :param client: The client to use when calling PutObject
        :param fileobj: The file to upload.
        :param bucket: The name of the bucket to upload to
        :param key: The name of the key to upload to
        :param extra_args: A dictionary of any extra arguments that may be
            used in the upload.
        )BucketKeyBodyNr+   )r   )r   r   r1   r   r   r   r   s          r   _mainzPutObjectTask._main  s      	OFNV4NN:NNN	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	Os   "&&Nr(   r)   r*   rE   r  r+   r   r   r   r     s.        **
O 
O 
O 
O 
Or   r   c                       e Zd ZdZd ZdS )r   z+Task to upload a part in a multipart uploadc           
          |5 } |j         d|||||d|}	ddd           n# 1 swxY w Y   |	d         }
|
|d}d|v r.|d                                         }d| }||	v r|	|         ||<   |S )a  
        :param client: The client to use when calling PutObject
        :param fileobj: The file to upload.
        :param bucket: The name of the bucket to upload to
        :param key: The name of the key to upload to
        :param upload_id: The id of the upload
        :param part_number: The number representing the part of the multipart
            upload
        :param extra_args: A dictionary of any extra arguments that may be
            used in the upload.

        :rtype: dict
        :returns: A dictionary representing a part::

            {'Etag': etag_value, 'PartNumber': part_number}

            This value can be appended to a list to be used to complete
            the multipart upload.
        )r  r  UploadId
PartNumberr  NETag)r  r  r   r   r+   )r   upper)r   r   r1   r   r   r   r   r   r   responseetagpart_metadataalgorithm_namechecksum_members                 r   r  zUploadPartTask._main"  s    ,  	)v) "&   H	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 !%[AA*,,'(;<BBDDN999O(**19/1Jo.s   #''Nr  r+   r   r   r   r     s)        55& & & & &r   r   )r   ior   s3transfer.compatr   r   s3transfer.constantsr   s3transfer.futuresr   s3transfer.tasksr	   r
   r   r   s3transfer.utilsr   r   r   r   r   r-   rG   rt   r   r   r   r   r   r+   r   r   <module>r$     s          0 0 0 0 0 0 0 0 : : : : : : 3 3 3 3 3 3                             B) ) ) ) ) ) ) )XxN xN xN xN xN xN xN xNvZL ZL ZL ZL ZL!3 ZL ZL ZLz. . . . .!; . . .bG
 G
 G
 G
 G
$6 G
 G
 G
TK K K K K> K K K\O O O O OD O O O ) ) ) ) )T ) ) ) ) )r   