
    !jH                      d Z ddlmZmZ ddlZddlZ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mZmZmZ dd	lmZ dd
lmZ ddlZddlZddlmZ ddlmZ 	 ddl m!Z! n# e"$ r	 ddl m#Z! Y nw xY wddl$m%Z% ddl&m'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZA ddlBmCZCmDZDmEZEmFZF ddlGmHZHmIZImJZJ ddlKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZb ddlcmdZd ddlemfZf ddlgmhZh ddlimjZj ddlkmlZl ddlmmnZn ddlompZpmqZq dd lrmsZsmtZt dd!lumvZvmwZw dd"lxmyZy dd#lzm{Z{ dd$l|m}Z} dd%l~mZmZmZmZmZmZ  G d& d'          ZdS )(zQ
Simple Storage Service (aka S3) client to perform bucket and object operations.
    )absolute_importannotationsN)Iterable)datetime	timedelta)BytesIO)random)IOBinaryIOIteratorTextIOTupleUnioncast)
urlunsplit)ElementTree)Retry)HTTPHeaderDict)BaseHTTPResponse)HTTPResponse)Timeout   )	__title____version__time)COPYREPLACEComposeSource
CopySourceSnowballObjectTags)CredentialsStaticProvider)Provider)BucketCompleteMultipartUploadResultEventIterableListAllMyBucketsResultListMultipartUploadsResultListPartsResultObjectPart
PostPolicyparse_copy_objectparse_list_objects)DeleteErrorDeleteObjectDeleteRequestDeleteResult)InvalidResponseErrorS3ErrorServerError)_DEFAULT_USER_AGENTMAX_MULTIPART_COUNTMAX_MULTIPART_OBJECT_SIZEMAX_PART_SIZEMIN_PART_SIZEBaseURLDictTypeObjectWriteResultProgressType
ThreadPoolcheck_bucket_namecheck_non_empty_string	check_sse
check_ssec
genheadersget_part_infoheaders_to_stringsis_valid_policy_typemakedirsmd5sum_hashqueryencoderead_part_datasha256_hash)	LegalHold)LifecycleConfig)NotificationConfig)ObjectLockConfig)ReplicationConfig)	Retention)SelectObjectReaderSelectRequest)
presign_v4
sign_v4_s3)SseSseCustomerKey)	SSEConfig)Tagging)VersioningConfig)Element
SubElementfindtextgetbytesmarshal	unmarshalc                     e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   ded<   	 	 	 	 	 	 	 	 dddZd Z	 ddd&Zdd/Z	 	 	 	 	 	 	 ddd4Z		 	 	 	 	 	 	 ddd5Z
dd6Zdd9Zdd<Zd= Zd> Zd? Zd@ ZdA ZdB ZdC Zd dGZ	 	 dddJZddLZddMZddNZddOZddPZddSZddUZd	dWZddXZd
dZZ dd\Z!dd]Z"	 	 	 dddeZ#ddgZ$ddhZ%	 	 	 	 	 	 	 	 	 ddd|Z&	 	 	 	 	 	 dddZ'	 	 	 	 	 	 dddZ(	 	 	 	 	 	 	 dddZ)ddZ*ddZ+	 	 	 	 	 dddZ,ddZ-ddZ.ddZ/	 dd dZ0d!dZ1d Z2	 	 	 	 	 	 	 	 	 dd"dZ3	 	 	 	 	 	 	 	 d#d$dZ4	 	 	 	 d%d&dZ5	 dd'dZ6	 	 d(d)dZ7	 dd*dZ8 e9d          ddddfd+dZ: e9d          ddddfd,dZ; e9d          fd-dZ<d.dZ=ddÄZ>d/dńZ?d0dǄZ@ddȄZAd1dʄZBd2d̄ZCdd̈́ZDd3d΄ZEd4dЄZF	 dd'dфZG	 dd5d҄ZH	 dd6dӄZI	 dd'dԄZJ	 dd'dՄZK	 dd7dքZLddׄZMd8dلZNd9dڄZO	 dd:dۄZP	 dd;d݄ZQ	 	 	 	 	 	 	 d<d=dZR	 	 	 	 	 	 	 	 	 	 	 d>d?dZS	 	 	 	 	 	 	 	 d@dAdZT	 	 	 	 d%dBdZUdS (C  Minioab  
    Simple Storage Service (aka S3) client to perform bucket and object
    operations.

    :param endpoint: Hostname of a S3 service.
    :param access_key: Access key (aka user ID) of your account in S3 service.
    :param secret_key: Secret Key (aka password) of your account in S3 service.
    :param session_token: Session token of your account in S3 service.
    :param secure: Flag to indicate to use secure (TLS) connection to S3
        service or not.
    :param region: Region name of buckets in S3 service.
    :param http_client: Customized HTTP client.
    :param credentials: Credentials provider of your account in S3 service.
    :param cert_check: Flag to indicate to verify SSL certificate or not.
    :return: :class:`Minio <Minio>` object

    Example::
        # Create client with anonymous access.
        client = Minio("play.min.io")

        # Create client with access and secret key.
        client = Minio("s3.amazonaws.com", "ACCESS-KEY", "SECRET-KEY")

        # Create client with access key and secret key with specific region.
        client = Minio(
            "play.minio.io:9000",
            access_key="Q3AM3UQ867SPQQA43P2F",
            secret_key="zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG",
            region="my-region",
        )

    **NOTE on concurrent usage:** `Minio` object is thread safe when using
    the Python `threading` library. Specifically, it is **NOT** safe to share
    it between multiple processes, for example when using
    `multiprocessing.Pool`. The solution is simply to create a new `Minio`
    object in each process, and not share it between processes.

    dict[str, str]_region_mapr<   	_base_urlstr_user_agentzTextIO | None_trace_streamProvider | None	_providerzurllib3.PoolManager_httpNTendpoint
access_key
str | None
secret_keysession_tokensecureboolregionhttp_clienturllib3.PoolManager | Nonecredentials
cert_checkc
                2   |r)t          |t          j                  st          d          i | _        t          |rdnd|z   |          | _        t          | _        d | _	        |r"|t          d          t          |||          }|| _        t          d          j        }
|pmt          j        t          |
|
          d|	rd	nd
t          j                            d          pt%          j                    t)          ddg d                    | _        d S )Nz7HTTP client should be instance of `urllib3.PoolManager`zhttps://zhttp://z+secret key must be provided with access key   )minutes)connectread
   CERT_REQUIRED	CERT_NONESSL_CERT_FILEg?)i  i  i  i  )totalbackoff_factorstatus_forcelist)timeoutmaxsize	cert_reqsca_certsretries)
isinstanceurllib3PoolManager
ValueErrorrf   r<   rg   r7   ri   rj   r#   rl   r   secondsr   osenvirongetcertifiwherer   rm   )selfrn   ro   rq   rr   rs   ru   rv   rx   ry   r   s              S/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/minio/api.py__init__zMinio.__init__   sA     	z+w7JKK 	I    !0ZZyH<
 
 /! 	P! !NOOO(ZOOK$ A&&&.  

G$7G':::)3DooZ^^O44G"!5!5!5  
%
 
%
 
%



    c                \    t          | d          r| j                                         d S d S )Nrm   )hasattrrm   clearr   s    r   __del__zMinio.__del__   s8    4!! 	J	 	r   Fmethodbucket_nameresponser   retryreturntuple[str | None, str | None]c                    dddd                     |j        d          \  }}|j                             d          }|r
|r|d|z   z  }|r)|r'|dk    r!|r| j                             |          rd	\  }}||fS )
zc
        Handle redirect response indicates whether retry HEAD request
        on failure.
        )PermanentRedirectzMoved Permanently)RedirectzTemporary redirect)
BadRequestzBad request)-  3    NNzx-amz-bucket-regionz; use region HEAD)	RetryHeadN)r   statusheadersrf   )r   r   r   r   r   codemessageru   s           r   _handle_redirect_responsezMinio._handle_redirect_response   s     <3.
 
 #ho|
,
,	 	g
 !%%&;<< 	0v 	0//G 	0 	0%+v%5%5+%5 $$[11 &6 0MD'W}r   hostr   DictType | Nonebodybytes | NonecredsCredentials | Nonetuple[DictType, datetime]c                   |pi }|                     d          }||d<   | j        |d<   d}d}|rt          t          |                    |d<   |r2| j        j        rd}|rdnt          |          }n#t          |          }n|rdnt          |          }|r||d<   |r||d<   |r|j        r
|j        |d<   t          j
                    }t          j        |          |d	<   ||fS )
z$Build headers with given parameters.Content-MD5Hostz
User-AgentNzContent-LengthzUNSIGNED-PAYLOADx-amz-content-sha256X-Amz-Security-Tokenz
x-amz-date)r   ri   rh   lenrg   is_httpsrJ   rM   rr   r   utcnowto_amz_date)	r   r   r   r   r   md5sum_addedsha256md5sumdates	            r   _build_headerszMinio._build_headers   s&    -R{{=11 $ 0 	7(+CIIG$% 	A~& ++!-D;t3D3D$T**)@TT{4/@/@F 	,%+GM" 	5.4G*+ 	BU( 	B.3.AG*+{}} $ 0 6 6}r   object_namequery_paramspreload_contentno_body_tracec
                d     j         r j                                         nd}
 j                            ||          }                     |j        |||
          \  }}|
r;t          ||||
t          t          |	                    d                    |          } j
        r9 j
                            d           |j        r
d|j        z   nd} j
                             d|j         | d            j
                            t          |d	
                      j
                            d           |	s| j
                            d            j
                            t          |t                     r|                                nt          |                      j
                            d            j
                            d           t%                      }|pi                                 D ]S\  }}t          |t(          t*          f          r|D ]}|                    ||           =|                    ||           T j                            t3          |          |||           j
        ri j
                            dj         d            j
                            t          j                              j
                            d           j        dv r j
        r|re j
                            d            j
                            j                                                    j
                            d            j
                            d           S                     d	           |s                                  j
        rXdk    rRj        rK j
                            j                                                    j
                            d           dk    rdj        	                    dd                              d          vr j
        r j
                            d           j        dk    r$j        stA          dj         j                  tC          j        t          t          j        	                    d                    j        rj                                        nd          j        sUdk    rO j
        r j
                            d           tC          j        j        	                    d          d          j        rtE          j#                  nd} j
        r j
                            d            fd fd fdd fdd fdd d}|s|	                    j                  }|r
 |            nd \  }}|stA          dj         j                  tE          t          t          |          t          tH          t          df         |          |j        j        	                    d!          j        	                    d"          #          }|j%        d$v r j&        '                    d           |)%Execute HTTP request.Nr   r   r   r   z---------START-HTTP---------
?  z
 HTTP/1.1
T)
titled_key
)r   r   r   z	HTTP/1.1 )         z----------END-HTTP----------
)cache_contentr   application/xmlcontent-type;i0  z$server failed with HTTP status code c                 4                          d          S NTr   r   r   r   r   s   r   <lambda>z!Minio._url_open.<locals>.<lambda>p       77Xt  r   c                 4                          d          S r   r   r   s   r   r   z!Minio._url_open.<locals>.<lambda>s  r   r   c                 4                          d          S r   r   r   s   r   r   z!Minio._url_open.<locals>.<lambda>v  r   r   c                     dS )N)AccessDeniedzAccess denied r   r   r   r   z!Minio._url_open.<locals>.<lambda>y  s    : r   c                     rdn rdndS )N)	NoSuchKeyzObject does not existNoSuchBucketzBucket does not exist)ResourceNotFoundzRequest resource not foundr   r   r   s   r   r   z!Minio._url_open.<locals>.<lambda>z  s+    H66 H>>G r   c                     dS N)MethodNotAllowedz9The specified method is not allowed against this resourcer   r   r   r   r   z!Minio._url_open.<locals>.<lambda>  	      r   c                      rdndfS )Nr   )ResourceConflictzRequest resource conflictsr   )r   s   r   r   z!Minio._url_open.<locals>.<lambda>  s    H99G r   c                     dS r   r   r   r   r   r   z!Minio._url_open.<locals>.<lambda>  r   r   )r   r   r   i  i  i  i  i  r   zx-amz-request-idz
x-amz-id-2r   )r   r   )(rl   retrieverg   buildr   netlocrW   r   rh   r   rj   writequerypathrG   r   bytesdecoder   itemslisttupleaddrm   urlopenr   r   r   datar~   release_connsplitr6   r4   r5   fromxmlr   r   rf   pop)r   r   ru   r   r   r   r   r   r   r   r   urlr   r   http_headerskeyvaluevalresponse_error	error_mapfuncr   r   r   s   `` ``                  @r   	_url_openzMinio._url_open   s    .2^E'')))n""##% # 
 
 ++CJuMM 		 S'++&<==>> G  	+$$%EFFF),:S39__E$$%M%M%M5%M%M%MNNN$$"7t<<<   $$T***  /T%5"((..."((%/e%<%<KDKKMMM#d))   "((...$$T***%''"=b//11 	- 	-JC%$// -  / /C $$S#..../   e,,,,:%%sOO + & 
 
  	+$$%D%D%D%DEEE$$"8#344   $$T***?o--! K" 3&,,T222&,,X]-A-A-C-CDDD&,,T222"(()IJJJOD))) 	$!!### 	+&F"2"2x}"2$$X]%9%9%;%;<<<$$T*** &  !)9)=)="B* *%**  ! K"(()IJJJ#%%hm%!L8?LLO   'S(*..~>>??*2-A$$&&&T   } 	6!1!1! K"(()IJJJ& $$^44   7?mM222 	G$$%EFFF                   ;:        
 7
 
	B  	==11D&*<DDFFFMD' !L8?LLO   %S$U39%w// $$%788 $$\22''	 	 	N "???& $$[$777r   c	                   |                      |          }		 |                     ||	|||||||	  	        S # t          $ r}
|
j        dk    r Y d}
~
nd}
~
ww xY w	 |                     ||	|||||||	  	        S # t          $ rl}
|
j        dk    r |                     |||
j                  \  }}|
                    t          t          |          t          t          |                    d}
~
ww xY w)r   )r   r   r   r   r   r   r   r   N)	_get_regionr  r5   r   r   r   copyr   rh   )r   r   r   r   r   r   r   r   r   ru   excr   r   s                r   _executezMinio._execute  sO    !!+..	>>'') /+ " 
 
 
  	 	 	x;&& '&&&&	
	@>>'') /+ " 
 
 
  	@ 	@ 	@x;&& ::S\ MD' ((4T??Dg,>,>???	@s-   5 
AAAA7 7
C-A'C((C-c                ~   | j         j        r| j         j        S |r| j        sdS | j                            |          }|r|S |                     dd|ddi          }t          j        |j        	                                          }|j
        sd}n!|j
        dk    r| j         j        rd}n|j
        }|| j        |<   |S )zg
        Return region of given bucket either from region cache or set in
        constructor.
        	us-east-1GETlocationr   )r   r   EUz	eu-west-1)rg   ru   rl   rf   r   r  ET
fromstringr   r   textis_aws_host)r   r   ru   r   elements        r   r  zMinio._get_region  s     >  	)>(( 	$. 	;!%%k22 	M >>#$b)	 " 
 
 - 4 4 6 677| 	" FF\T!!dn&@! FF\F(.%r   app_nameapp_versionc                T    |r|st          d          t           d| d| | _        dS )z
        Set your application name and version to user agent header.

        :param app_name: Application name.
        :param app_version: Application version.

        Example::
            client.set_app_info('my_app', '1.0.2')
        z)Application name/version cannot be empty.r   /N)r   r7   ri   )r   r  r  s      r   set_app_infozMinio.set_app_info   sH      	J[ 	JHIII1LLHLL{LLr   streamr   c                6    |st          d          || _        dS )zb
        Enable http trace.

        :param stream: Stream for writing HTTP call tracing.
        z)Input stream for trace output is invalid.N)r   rj   )r   r"  s     r   trace_onzMinio.trace_on  s*      	JHIII#r   c                    d| _         dS )z%
        Disable HTTP trace.
        N)rj   r   s    r   	trace_offzMinio.trace_off  s     "r   c                    d| j         _        dS )z3Enables accelerate endpoint for Amazon S3 endpoint.TNrg   accelerate_host_flagr   s    r   enable_accelerate_endpointz Minio.enable_accelerate_endpoint  s    .2+++r   c                    d| j         _        dS )z4Disables accelerate endpoint for Amazon S3 endpoint.FNr(  r   s    r   disable_accelerate_endpointz!Minio.disable_accelerate_endpoint#  s    .3+++r   c                    d| j         _        dS )z2Enables dualstack endpoint for Amazon S3 endpoint.TNrg   dualstack_host_flagr   s    r   enable_dualstack_endpointzMinio.enable_dualstack_endpoint'  s    -1***r   c                    d| j         _        dS )z3Disables dualstack endpoint for Amazon S3 endpoint.FNr.  r   s    r   disable_dualstack_endpointz Minio.disable_dualstack_endpoint+  s    -2***r   c                    d| j         _        dS )zEnables virtual style endpoint.TNrg   virtual_style_flagr   s    r   enable_virtual_style_endpointz#Minio.enable_virtual_style_endpoint/  s    ,0)))r   c                    d| j         _        dS )z Disables virtual style endpoint.FNr4  r   s    r   disable_virtual_style_endpointz$Minio.disable_virtual_style_endpoint3  s    ,1)))r   requestrU   rT   c                \   t          || j        j                   t          |           t	          |t
                    st          d          t          |          }|                     d|||dt          t          t          |                    idddd	          }t          |          S )
aY  
        Select content of an object by SQL expression.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param request: :class:`SelectRequest <SelectRequest>` object.
        :return: A reader contains requested records and progress information.

        Example::
            with client.select_object_content(
                    "my-bucket",
                    "my-object.csv",
                    SelectRequest(
                        "select * from S3Object",
                        CSVInputSerialization(),
                        CSVOutputSerialization(),
                        request_progress=True,
                    ),
            ) as result:
                for data in result.stream():
                    print(data.decode())
                print(result.stats())
        s3_checkz"request must be SelectRequest typePOSTr   r   2)selectzselect-typeF)r   r   r   r   r   r   )rA   rg   r  rB   r   rU   r   ra   r  r   rh   rJ   rT   )r   r   r   r9  r   r   s         r   select_object_contentzMinio.select_object_content7  s    : 	+0JKKKK{+++'=11 	CABBBw==##"Dk$.?.?$@$@A$&s;;! ! 
 
 "(+++r   r  object_lockc                   t          |d| j        j                   | j        j        r1|r/| j        j        |k    rt	          d| j        j         d|           | j        j        p|pd}|rddind}d}|dk    r/t          d	          }t          |d
|           t          |          }|                     d||||           || j	        |<   dS )aM  
        Create a bucket with region and object lock.

        :param bucket_name: Name of the bucket.
        :param location: Region in which the bucket will be created.
        :param object_lock: Flag to set object-lock feature.

        Examples::
            # Create bucket.
            client.make_bucket("my-bucket")

            # Create bucket on specific region.
            client.make_bucket("my-bucket", "us-west-1")

            # Create bucket with object-lock feature on specific region.
            client.make_bucket("my-bucket", "eu-west-2", object_lock=True)
        Tr;  zregion must be z, but passed r  z x-amz-bucket-object-lock-enabledtrueNCreateBucketConfigurationLocationConstraintPUT)r   r   r   )
rA   rg   r  ru   r   r]   r^   r`   r  rf   )r   r   r  rA  r   r   r  s          r   make_bucketzMinio.make_bucketd  s4   . 	+t#'>#=	? 	? 	? 	?>  	  DN1X== -dn&; - -"*- -   >(CHC %/88 $ 	
 {""9::Gw 4h???G$$D# 	 	
 	
 	
 )1%%%r   list[Bucket]c                    |                      d          }t          t          |j                                                  }|j        S )a  
        List information of all accessible buckets.

        :return: List of :class:`Bucket <Bucket>` object.

        Example::
            buckets = client.list_buckets()
            for bucket in buckets:
                print(bucket.name, bucket.creation_date)
        r  )r  rb   r(   r   r   buckets)r   r   results      r   list_bucketszMinio.list_buckets  s;     ==''18=3G3G3I3IJJ~r   c                    t          || j        j                   	 |                     d|           dS # t          $ r}|j        dk    r Y d}~nd}~ww xY wdS )a;  
        Check if a bucket exists.

        :param bucket_name: Name of the bucket.
        :return: True if the bucket exists.

        Example::
            if client.bucket_exists("my-bucket"):
                print("my-bucket exists")
            else:
                print("my-bucket does not exist")
        r;  r   Tr   NFrA   rg   r  r  r5   r   r   r   r  s      r   bucket_existszMinio.bucket_exists  s     	+0JKKKK	MM&+...4 	 	 	x>)) *))))	 us   5 
AAAc                    t          || j        j                   |                     d|           | j                            |d           dS )z
        Remove an empty bucket.

        :param bucket_name: Name of the bucket.

        Example::
            client.remove_bucket("my-bucket")
        r;  DELETEN)rA   rg   r  r  rf   r  r   r   s     r   remove_bucketzMinio.remove_bucket  sO     	+0JKKKKh,,,[$/////r   c                    t          || j        j                   |                     d|ddi          }|j                                        S )z
        Get bucket policy configuration of a bucket.

        :param bucket_name: Name of the bucket.
        :return: Bucket policy configuration as JSON string.

        Example::
            policy = client.get_bucket_policy("my-bucket")
        r;  r  policyr   r   )rA   rg   r  r  r   r   r   r   r   s      r   get_bucket_policyzMinio.get_bucket_policy  sU     	+0JKKKK==;h^ ! 
 
 }##%%%r   c                p    t          || j        j                   |                     d|ddi           dS )z
        Delete bucket policy configuration of a bucket.

        :param bucket_name: Name of the bucket.

        Example::
            client.delete_bucket_policy("my-bucket")
        r;  rR  rV  r   rW  NrA   rg   r  r  rS  s     r   delete_bucket_policyzMinio.delete_bucket_policy  s>     	+0JKKKKh8R.IIIIIr   rV  str | bytesc                (   t          || j        j                   t          |           |                     d|t          |t                    r|n|                                dt          t          t          |                    iddi           dS )z
        Set bucket policy configuration to a bucket.

        :param bucket_name: Name of the bucket.
        :param policy: Bucket policy configuration as JSON string.

        Example::
            client.set_bucket_policy("my-bucket", policy)
        r;  rF  r   rV  r   r   r   r   N)rA   rg   r  rH   r  r   r   encoder   rh   rJ   )r   r   rV  s      r   set_bucket_policyzMinio.set_bucket_policy  s     	+0JKKKKV$$$%fe44I&--//"Dk&.A.A$B$BC"B 	 	
 	
 	
 	
 	
r   rP   c                    t          || j        j                   |                     d|ddi          }t	          t
          |j                                                  S )a  
        Get notification configuration of a bucket.

        :param bucket_name: Name of the bucket.
        :return: :class:`NotificationConfig <NotificationConfig>` object.

        Example::
            config = client.get_bucket_notification("my-bucket")
        r;  r  notificationr   rW  )rA   rg   r  r  rb   rP   r   r   rX  s      r   get_bucket_notificationzMinio.get_bucket_notification  sa     	+0JKKKK==;nb-A ! 
 
 +X]-A-A-C-CDDDr   configc                   t          || j        j                   t          |t                    st          d          t          |          }|                     d||dt          t          t          |                    iddi           dS )	a  
        Set notification configuration of a bucket.

        :param bucket_name: Name of the bucket.
        :param config: class:`NotificationConfig <NotificationConfig>` object.

        Example::
            config = NotificationConfig(
                queue_config_list=[
                    QueueConfig(
                        "QUEUE-ARN-OF-THIS-BUCKET",
                        ["s3:ObjectCreated:*"],
                        config_id="1",
                        prefix_filter_rule=PrefixFilterRule("abc"),
                    ),
                ],
            )
            client.set_bucket_notification("my-bucket", config)
        r;  z&config must be NotificationConfig typerF  r   rc  r   r_  N)rA   rg   r  r   rP   r   ra   r  r   rh   rJ   r   r   re  r   s       r   set_bucket_notificationzMinio.set_bucket_notification  s    0 	+0JKKKK&"455 	GEFFFv"Dk$.?.?$@$@A("- 	 	
 	
 	
 	
 	
r   c                J    |                      |t                                 dS )a  
        Delete notification configuration of a bucket. On success, S3 service
        stops notification of events previously set of the bucket.

        :param bucket_name: Name of the bucket.

        Example::
            client.delete_bucket_notification("my-bucket")
        N)rh  rP   rS  s     r   delete_bucket_notificationz Minio.delete_bucket_notification0  s'     	$$[2D2F2FGGGGGr   rZ   c                   t          || j        j                   t          |t                    st          d          t          |          }|                     d||dt          t          t          |                    iddi           dS )	a5  
        Set encryption configuration of a bucket.

        :param bucket_name: Name of the bucket.
        :param config: :class:`SSEConfig <SSEConfig>` object.

        Example::
            client.set_bucket_encryption(
                "my-bucket", SSEConfig(Rule.new_sse_s3_rule()),
            )
        r;  zconfig must be SSEConfig typerF  r   
encryptionr   r_  N)rA   rg   r  r   rZ   r   ra   r  r   rh   rJ   rg  s       r   set_bucket_encryptionzMinio.set_bucket_encryption<  s     	+0JKKKK&),, 	><===v"Dk$.?.?$@$@A&+ 	 	
 	
 	
 	
 	
r   SSEConfig | Nonec                   t          || j        j                   	 |                     d|ddi          }t	          t
          |j                                                  S # t          $ r}|j	        dk    r Y d}~nd}~ww xY wdS )z
        Get encryption configuration of a bucket.

        :param bucket_name: Name of the bucket.
        :return: :class:`SSEConfig <SSEConfig>` object.

        Example::
            config = client.get_bucket_encryption("my-bucket")
        r;  r  rl  r   rW  .ServerSideEncryptionConfigurationNotFoundErrorN)
rA   rg   r  r  rb   rZ   r   r   r5   r   r   r   r   r  s       r   get_bucket_encryptionzMinio.get_bucket_encryptionT  s     	+0JKKKK		}}*B/ %  H
 Y(<(<(>(>??? 	 	 	xKKK LKKKK	 t   AA# #
B-A>>Bc                    t          || j        j                   	 |                     d|ddi           dS # t          $ r}|j        dk    r Y d}~dS d}~ww xY w)z
        Delete encryption configuration of a bucket.

        :param bucket_name: Name of the bucket.

        Example::
            client.delete_bucket_encryption("my-bucket")
        r;  rR  rl  r   rW  rp  NrN  rO  s      r   delete_bucket_encryptionzMinio.delete_bucket_encryptionk  s     	+0JKKKK	MM*B/      
  	 	 	xKKK LKKKKK	s   9 
AAAr   zs3:ObjectCreated:*zs3:ObjectRemoved:*zs3:ObjectAccessed:*prefixsuffixeventstuple[str, ...]r'   c                     t           j        j                    j        j        rt          d          t	           fd          S )a  
        Listen events of object prefix and suffix of a bucket. Caller should
        iterate returned iterator to read new events.

        :param bucket_name: Name of the bucket.
        :param prefix: Listen events of object starts with prefix.
        :param suffix: Listen events of object ends with suffix.
        :param events: Events to listen.
        :return: Iterator of event records as :dict:.

        Example::
            with client.listen_bucket_notification(
                "my-bucket",
                prefix="my-prefix/",
                events=["s3:ObjectCreated:*", "s3:ObjectRemoved:*"],
            ) as events:
                for event in events:
                    print(event)
        r;  z:ListenBucketNotification API is not supported in Amazon S3c            
                              d pdpdt          t          t                             dd          S )Nr  r   )rw  rx  ry  F)r   r   )r  r   r   rh   )r   ry  rw  r   rx  s   r   r   z2Minio.listen_bucket_notification.<locals>.<lambda>  sN    DMM$l$l"5:v66 
 !& " 	 	 r   )rA   rg   r  r   r'   )r   r   rw  rx  ry  s   `````r   listen_bucket_notificationz Minio.listen_bucket_notification  s    8 	+0JKKKK>% 	L   	 	 	 	 	 	 	 	
 
 	
r   r\   c                   t          || j        j                   t          |t                    st          d          t          |          }|                     d||dt          t          t          |                    iddi           dS )	a4  
        Set versioning configuration to a bucket.

        :param bucket_name: Name of the bucket.
        :param config: :class:`VersioningConfig <VersioningConfig>`.

        Example::
            client.set_bucket_versioning(
                "my-bucket", VersioningConfig(ENABLED),
            )
        r;  z$config must be VersioningConfig typerF  r   
versioningr   r_  N)rA   rg   r  r   r\   r   ra   r  r   rh   rJ   rg  s       r   set_bucket_versioningzMinio.set_bucket_versioning  s      	+0JKKKK&"233 	ECDDDv"Dk$.?.?$@$@A&+ 	 	
 	
 	
 	
 	
r   c                    t          || j        j                   |                     d|ddi          }t	          t
          |j                                                  S )a  
        Get versioning configuration of a bucket.

        :param bucket_name: Name of the bucket.
        :return: :class:`VersioningConfig <VersioningConfig>`.

        Example::
            config = client.get_bucket_versioning("my-bucket")
            print(config.status)
        r;  r  r  r   rW  )rA   rg   r  r  rb   r\   r   r   rX  s      r   get_bucket_versioningzMinio.get_bucket_versioning  sc     	+0JKKKK==&+ ! 
 

 )8=+?+?+A+ABBBr   application/octet-streamr      	file_pathcontent_typemetadatasse
Sse | NoneprogressProgressType | None	part_sizeintnum_parallel_uploadstagsTags | None	retentionRetention | None
legal_holdr>   c                   t          j        |          j        }t          |d          5 }|                     |||||t          t          t          df         |          ||||	|
||          cddd           S # 1 swxY w Y   dS )a  
        Uploads data from a file to an object in a bucket.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param file_path: Name of file to upload.
        :param content_type: Content type of the object.
        :param metadata: Any additional metadata to be uploaded along
            with your PUT request.
        :param sse: Server-side encryption.
        :param progress: A progress object
        :param part_size: Multipart part size
        :param num_parallel_uploads: Number of parallel uploads.
        :param tags: :class:`Tags` for the object.
        :param retention: :class:`Retention` configuration object.
        :param legal_hold: Flag to set legal hold for the object.
        :return: :class:`ObjectWriteResult` object.

        Example::
            # Upload data.
            result = client.fput_object(
                "my-bucket", "my-object", "my-filename",
            )

            # Upload data with metadata.
            result = client.fput_object(
                "my-bucket", "my-object", "my-filename",
                metadata={"My-Project": "one"},
            )

            # Upload data with tags, retention and legal-hold.
            date = datetime.utcnow().replace(
                hour=0, minute=0, second=0, microsecond=0,
            ) + timedelta(days=30)
            tags = Tags(for_object=True)
            tags["User"] = "jsmith"
            result = client.fput_object(
                "my-bucket", "my-object", "my-filename",
                tags=tags,
                retention=Retention(GOVERNANCE, date),
                legal_hold=True,
            )
        rbN)	r  r  r  r  r  r  r  r  r  )r   statst_sizeopen
put_objectr   r   r=   )r   r   r   r  r  r  r  r  r  r  r  r  r  	file_size	file_datas                  r   fput_objectzMinio.fput_object  s    v GI&&.	)T"" 	i??)eHdN3X>>!#%9#% #  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AA99A= A=request_headersssecSseCustomerKey | None
version_idextra_query_paramstmp_file_pathc
                   t          || j        j                   t          |           t          j                            |          rt          d| d          t          t          j        	                    |                     | 
                    ||||          }
t          t          t          |
j                            }|p| d| d}d}	 |                     ||||||          }|	r?t!          |j                            d	d
                    }|	                    ||           t)          |d          5 }|                    d          D ].}|                    |          }|	r|	                    |           /	 ddd           n# 1 swxY w Y   t          j                            |          rt	          j        |           t	          j        ||           |
|r)|                                 |                                 S S # |r)|                                 |                                 w w xY w)a  
        Downloads data of an object to file.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param file_path: Name of file to download.
        :param request_headers: Any additional headers to be added with GET
                                request.
        :param ssec: Server-side encryption customer key.
        :param version_id: Version-ID of the object.
        :param extra_query_params: Extra query parameters for advanced usage.
        :param tmp_file_path: Path to a temporary file.
        :param progress: A progress object
        :return: Object information.

        Example::
            # Download data of an object.
            client.fget_object("my-bucket", "my-object", "my-filename")

            # Download data of an object of version-ID.
            client.fget_object(
                "my-bucket", "my-object", "my-filename",
                version_id="dfbd25b3-abec-4184-a4e8-5a35a5c1174d",
            )

            # Download data of an SSE-C encrypted object.
            client.fget_object(
                "my-bucket", "my-object", "my-filename",
                ssec=SseCustomerKey(b"32byteslongsecretkeymustprovided"),
            )
        r;  zfile z is a directory)r  .z.part.minioN)r  r  r  r  content-lengthr   r   total_lengthwbi   )amt)rA   rg   r  rB   r   r   isdirr   rI   dirnamestat_objectrK   r   rh   etag
get_objectr  r   r   set_metar  r"  r   updateexistsremoverenamecloser  )r   r   r   r  r  r  r  r  r  r  r  r  r   lengthtmp_filer   sizes                    r   fget_objectzMinio.fget_object*  s   V 	+0JKKKK{+++7==## 	A?Y???@@@ 	++,,,!	   
 
 4TY//00 =	==D=== 	 	( /%#5 '  H  PX-112BAFFGG!!k!OOOmT** .h$OO	O:: . .D#>>$//D . ---.. . . . . . . . . . . . . . .
 w~~i(( %	)$$$ImY/// (   %%''''(x (   %%''''(s3   A,H AF	H FH FAH -Ioffsetr  c	           	        t          || j        j                   t          |           t	          |           t          t          |r|                                ni           }	|	                    |pi            |s|r|r||z   dz
  nd}
d| d|
 |	d<   |r	|pi }||d<   | 	                    d||t          t          |	          |d	
          S )a  
        Get data of an object. Returned response should be closed after use to
        release network resources. To reuse the connection, it's required to
        call `response.release_conn()` explicitly.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param offset: Start byte position of object data.
        :param length: Number of bytes of object data from offset.
        :param request_headers: Any additional headers to be added with GET
                                request.
        :param ssec: Server-side encryption customer key.
        :param version_id: Version-ID of the object.
        :param extra_query_params: Extra query parameters for advanced usage.
        :return: :class:`urllib3.response.BaseHTTPResponse` object.

        Example::
            # Get data of an object.
            try:
                response = client.get_object("my-bucket", "my-object")
                # Read data from response.
            finally:
                response.close()
                response.release_conn()

            # Get data of an object of version-ID.
            try:
                response = client.get_object(
                    "my-bucket", "my-object",
                    version_id="dfbd25b3-abec-4184-a4e8-5a35a5c1174d",
                )
                # Read data from response.
            finally:
                response.close()
                response.release_conn()

            # Get data of an object from offset and length.
            try:
                response = client.get_object(
                    "my-bucket", "my-object", offset=512, length=1024,
                )
                # Read data from response.
            finally:
                response.close()
                response.release_conn()

            # Get data of an SSE-C encrypted object.
            try:
                response = client.get_object(
                    "my-bucket", "my-object",
                    ssec=SseCustomerKey(b"32byteslongsecretkeymustprovided"),
                )
                # Read data from response.
            finally:
                response.close()
                response.release_conn()
        r;  r   r   bytes=-Range	versionIdr  F)r   r   r   )
rA   rg   r  rB   rD   r   r=   r   r  r  )r   r   r   r  r  r  r  r  r  r   ends              r   r  zMinio.get_object  s   H 	+0JKKKK{+++4x4!?R@@,"--- 	7V 	7+196F?Q&&rC66666GG 	9!3!9r.8{+}}7+++!  
 
 	
r   sourcer   metadata_directivetagging_directivec           
     
   t          || j        j                   t          |           t	          |t
                    st          d          t          |           |$t	          |t                    st          d          |$t	          |t                    st          d          |	/|	t          t          fvrt          dt           dt                     |
/|
t          t          fvrt          dt           dt                     d	}|j        N|j        G|                     |j        |j        |j        |j        
          }t'          t(          |j                  }|j        |j        |t,          k    rd|	t          k    rt          d          |
t          k    rt          d          |                     ||t1          j        |          g|||||          S t5          |||||          }|	r|	|d<   |
r|
|d<   |                    |                                           |                     d|||          }t=          |          \  }}t?          |||j         !                    d          ||j         |          S )a  
        Create an object by server-side copying data from another object.
        In this API maximum supported source object size is 5GiB.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param source: :class:`CopySource` object.
        :param sse: Server-side encryption of destination object.
        :param metadata: Any user-defined metadata to be copied along with
                         destination object.
        :param tags: Tags for destination object.
        :param retention: :class:`Retention` configuration object.
        :param legal_hold: Flag to set legal hold for destination object.
        :param metadata_directive: Directive used to handle user metadata for
                                   destination object.
        :param tagging_directive: Directive used to handle tags for destination
                                   object.
        :return: :class:`ObjectWriteResult <ObjectWriteResult>` object.

        Example::
            # copy an object from a bucket to another.
            result = client.copy_object(
                "my-bucket",
                "my-object",
                CopySource("my-sourcebucket", "my-sourceobject"),
            )
            print(result.object_name, result.version_id)

            # copy an object with condition.
            result = client.copy_object(
                "my-bucket",
                "my-object",
                CopySource(
                    "my-sourcebucket",
                    "my-sourceobject",
                    modified_since=datetime(2014, 4, 1, tzinfo=timezone.utc),
                ),
            )
            print(result.object_name, result.version_id)

            # copy an object from a bucket with replacing metadata.
            metadata = {"test_meta_key": "test_meta_value"}
            result = client.copy_object(
                "my-bucket",
                "my-object",
                CopySource("my-sourcebucket", "my-sourceobject"),
                metadata=metadata,
                metadata_directive=REPLACE,
            )
            print(result.object_name, result.version_id)
        r;  zsource must be CopySource typeNtags must be Tags type retention must be Retention typezmetadata directive must be z or ztagging directive must be r  r  zRCOPY metadata directive is not applicable to source object size greater than 5 GiBzQCOPY tagging directive is not applicable to source object size greater than 5 GiB)r  r  r  r  r  zx-amz-metadata-directivezx-amz-tagging-directiverF  )r   r   x-amz-version-id)last_modified)"rA   rg   r  rB   r   r   r   rC   r!   rS   r   r   r  r  r  r   r   r  r  r   r  r  r:   compose_objectr   ofrE   r  gen_copy_headersr  r.   r>   r   r   )r   r   r   r  r  r  r  r  r  r  r  r  r  r   r   r  r  s                    r   copy_objectzMinio.copy_object  s   @ 	+0JKKKK{+++&*-- 	?=>>>#JtT$:$:5666 Iy)I)I ?@@@"."4/99N4NNWNNOOO!-!$88M$MMGMMNNN= V]%:##""!,[	 $  D TY''D ))}$$!T)) 5   !D(( 5   &&[=+;F+C+C*D(% '    
 
  	E2DG./ 	C1BG-.v..00111==#	 ! 
 
 099m   !344'
 
 
 	
r   sourceslist[ComposeSource]c                   d}d}d}|D ]}|dz  }|                      |j        |j        |j        |j                  }|                    t          t          |j                  t          t          |j
                             t          t          |j                  }|j        |j        }n|j        
||j        z  }|t          k     rPt          |          dk    r=|t          |          k    r*t          d|j         d|j         d| dt                     ||z  }|t           k    rt          d	t                      |t"          k    rt          |t"          z            }||t"          z  z
  }	|	dk    r|dz  }nt"          }	|	t          k     rPt          |          dk    r=|t          |          k    r*t          d|j         d|j         d
| dt                     ||z  }|dz  }|t$          k    rt          dt$                     |S )zCalculate part count.r   r   r  Nzsource r   z: size z must be greater than z*destination object size must be less than z : for multipart split upload of z, last part size is less than z9Compose sources create more than allowed multipart count )r  r   r   r  r  build_headersr   r  r  rh   r  r  r  r;   r   r   r9   r:   r8   )
r   r  object_size
part_countisrcr  r  countlast_part_sizes
             r   _calc_part_countzMinio._calc_part_countt  s   
 3	  3	 CFA##>X	 $  D d3	22Ddi4H4HIIITY''Dz%z'
" =((LLA%%W%% <co < < < < < <,9< <  
 4K666 303 3  
 m##D=011!%)>!?!A%%QJEE%2N&66G))S\\))$G#/ G GCO G G9=G G7DG G  
 e#

a

+++/,/ /   r   	upload_idpart_numberr=   tuple[str, datetime | None]c           	     t    |                      d|||t          |          |d          }t          |          S )zExecute UploadPartCopy S3 API.rF  
partNumberuploadIdr   r   )r  rh   r.   )r   r   r   r  r  r   r   s          r   _upload_part_copyzMinio._upload_part_copy  sP     ==!+..%  ! 	
 	
 !***r   c	                   t          || j        j                   t          |           t	          |t
          t          f          r|st          d          d}	|D ]/}
t	          |
t                    st          d|	 d          |	dz  }	0t          |           |$t	          |t                    st          d          |$t	          |t                    st          d	          |                     |          }|dk    rc|d         j        V|d         j        I|                     ||t!          j        |d                   ||||||rt$          nd|rt$          nd

  
        S t'          |||||          }|                     |||          }t	          |t*                    r|                                ni }	 d}g }|D ]}
t/          t0          |
j                  }|
j        |
j        }n|
j        
||
j        z  }|
j        pd}t/          t4          |
j                  }|                    |           |t8          k    r{|dz  }|
j        d| d||
j        z   dz
   |d<   n|
j        d| d||z   dz
   |d<   |                     |||||          \  }}|                    t?          ||                     |dk    r|dz  }|}|t8          z   }|t8          k     r||z   }|                                 }d| d| |d<   |                     |||||          \  }}|                    t?          ||                     |}|||z
  z  }|dk    | !                    ||||          }tE          t/          tF          |j$                  t/          tF          |j%                  |j&        |j'        |j(        |j)                  S # tT          $ r }|r| +                    |||           |d}~ww xY w)ai  
        Create an object by combining data from different source objects using
        server-side copy.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param sources: List of :class:`ComposeSource` object.
        :param sse: Server-side encryption of destination object.
        :param metadata: Any user-defined metadata to be copied along with
                         destination object.
        :param tags: Tags for destination object.
        :param retention: :class:`Retention` configuration object.
        :param legal_hold: Flag to set legal hold for destination object.
        :return: :class:`ObjectWriteResult <ObjectWriteResult>` object.

        Example::
            sources = [
                ComposeSource("my-job-bucket", "my-object-part-one"),
                ComposeSource("my-job-bucket", "my-object-part-two"),
                ComposeSource("my-job-bucket", "my-object-part-three"),
            ]

            # Create my-bucket/my-object by combining source object
            # list.
            result = client.compose_object("my-bucket", "my-object", sources)
            print(result.object_name, result.version_id)

            # Create my-bucket/my-object with user metadata by combining
            # source object list.
            result = client.compose_object(
                "my-bucket",
                "my-object",
                sources,
                metadata={"test_meta_key": "test_meta_value"},
            )
            print(result.object_name, result.version_id)

            # Create my-bucket/my-object with user metadata and
            # server-side encryption by combining source object list.
            client.compose_object(
                "my-bucket", "my-object", sources, sse=SseS3(),
            )
            print(result.object_name, result.version_id)
        r;  z,sources must be non-empty list or tuple typer   zsources[z] must be ComposeSource typer   Nr  r  )r  r  r  r  r  r  r  r  r  zx-amz-copy-source-ranger  ),rA   rg   r  rB   r   r   r   r   r   rC   r!   rS   r  r  r  r  r   r  r   rE   _create_multipart_uploadrY   r   r   r  r  r=   r  r:   r  appendr,   r  _complete_multipart_uploadr>   rh   r   r   r  r  r  r  	Exception_abort_multipart_upload)r   r   r   r  r  r  r  r  r  r  r  r  r   r  ssec_headersr  total_partsr  r  r  _start_bytes	end_bytesheaders_copyrK  r  s                             r   r  zMinio.compose_object  s   n 	+0JKKKK{+++'D%=11 	M 	MKLLL 	 	Cc=11 M !KA!K!K!KLLLFAA#JtT$:$:5666 Iy)I)I ?@@@**733
a
!)
!)##[*-
*C*C(%.6#@77D-1";''t $    XsD)ZHH11g
 
	 )33(G(GOs{{}}}RC	KK /4 /4C11:):DDZ+CJ&Dqx55|,,,=((1$Kz-CVCCfSZ.?.ACC   9:: /=V==fTk!m==   9: #44##!# GD!  &&tK'>'>???Qhh1$K"(K +m ;Im++$/$$6	#*<<>>L:::y:: !!:; #44##!#$ GD!  &&tK'>'>???(FI33D' Qhh( 44[)[ F %S&,--S&,--!#     	 	 	 ,,i   I	s   ;HO 
O.O))O.c                <    |                      d||d|i           dS )z$Execute AbortMultipartUpload S3 API.rR  r  rW  N)r  )r   r   r   r  s       r   r  zMinio._abort_multipart_uploadh  s:     	$i0	 	 	
 	
 	
 	
 	
r   parts
list[Part]r&   c                   t          d          }|D ]Q}t          |d          }t          |dt          |j                             t          |dd|j        z   dz              Rt          |          }|                     d|||dt          t          t          |                    dd	|i
          }	t          |	          S )z'Execute CompleteMultipartUpload S3 API.CompleteMultipartUploadr,   
PartNumberETag"r=  r   )Content-Typer   r  r_  )
r]   r^   rh   r  r  r`   r  r   rJ   r&   )
r   r   r   r  r  r  parttagr   r   s
             r   r  z Minio._complete_multipart_uploadv  s     344 	; 	;DWf--CsL#d.>*?*?@@@sFC$)Oc$9::::  == 1#CT):):;;  %i0 ! 

 

 -X666r   c                   |                     d          sd|d<   |                     d|||ddi          }t          j        |j                                                  }t          t          t          |dd                    S )	z%Execute CreateMultipartUpload S3 API.r  r  r=  uploadsr   r  UploadIdT)	r   r  r  r  r   r   r   rh   r_   )r   r   r   r   r   r  s         r   r  zMinio._create_multipart_upload  s     {{>** 	A&@GN#==#R ! 
 
 - 4 4 6 677C':t<<===r   r   r   c           	         |                      d|||||d          }t          |||j                            d          |j                            dd                              dd          |j                  S )zExecute PutObject S3 API.rF  T)r   r   r   r   r  r  r   r  )r  r>   r   r   replace)r   r   r   r   r   r   r   s          r   _put_objectzMinio._put_object  s     ==% ! 
 
 !  !344  ,,44S"==
 
 	
r   c           	         |                      ||||t          |          |d          }t          t          |j                  S )zExecute UploadPart S3 API.r  rW  )r  rh   r   r  )r   r   r   r   r   r  r  rK  s           r   _upload_partzMinio._upload_part  sV     !!!+..%  " 	
 	
 C%%%r   c                &    |d          | j         | fS )z Upload_part task for ThreadPool.r{   )r  )r   argss     r   _upload_part_taskzMinio._upload_part_task  s    Aw))4000r   r   c                   t          || j        j                   t          |           t	          |           |$t          |t                    st          d          |$t          |t                    st          d          t          t          |d                    st          d          t          ||	          \  }	}|r|                    ||           t          |||||          }|pd|d	<   |}d
}d
}d}d}d}g }d}	 |s|dz  }|d
k    rV||k    r||z
  }	d}t          ||	|          }t          |          |	k    r#t!          d|	 dt          |           d          nBt          ||	dz   ||          }t          |          |	k    r|}d}n|dd         }|dd         }|t          |          z  }|dk    r|                     ||||          S |sB|                     |||          }|
r)|
dk    r#t'          |
          }|                                 |||t          |t*                    r't-          t.          |                                          nd||f}|
dk    r/t-          t&          |                              | j        |           n- | j        | }|                    t;          ||                     ||r}|                                }t;          d
d          g|z  }|                                sA|                                 \  }}t;          ||          ||dz
  <   |                                A| !                    ||t-          tD          |          |          }tG          t-          tD          |j$                  t-          tD          |j%                  |j&        |j'        |j(        |j)                  S # tT          $ r }|r| +                    |||           |d}~ww xY w)a   
        Uploads data from a stream to an object in a bucket.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param data: An object having callable read() returning bytes object.
        :param length: Data size; -1 for unknown size and set valid part_size.
        :param content_type: Content type of the object.
        :param metadata: Any additional metadata to be uploaded along
            with your PUT request.
        :param sse: Server-side encryption.
        :param progress: A progress object;
        :param part_size: Multipart part size.
        :param num_parallel_uploads: Number of parallel uploads.
        :param tags: :class:`Tags` for the object.
        :param retention: :class:`Retention` configuration object.
        :param legal_hold: Flag to set legal hold for the object.
        :return: :class:`ObjectWriteResult` object.

        Example::
            # Upload data.
            result = client.put_object(
                "my-bucket", "my-object", io.BytesIO(b"hello"), 5,
            )

            # Upload data with metadata.
            result = client.put_object(
                "my-bucket", "my-object", io.BytesIO(b"hello"), 5,
                metadata={"My-Project": "one"},
            )

            # Upload data with tags, retention and legal-hold.
            date = datetime.utcnow().replace(
                hour=0, minute=0, second=0, microsecond=0,
            ) + timedelta(days=30)
            tags = Tags(for_object=True)
            tags["User"] = "jsmith"
            result = client.put_object(
                "my-bucket", "my-object", io.BytesIO(b"hello"), 5,
                tags=tags,
                retention=Retention(GOVERNANCE, date),
                legal_hold=True,
            )
        r;  Nr  r  r~   z$input data must have callable read()r  r  r  r   r   Fr   T)r  z(stream having not enough data;expected: z, got: z bytesr  r   r  ),rA   rg   r  rB   rC   r   r!   r   rS   callablegetattrrF   r  rE   rL   r   IOErrorr  r  r@   start_parallelrY   r   r=   r   add_taskr  r  r  r,   rK  emptyr   r  rh   r>   r   r   r  r  r  r  r  r  )r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r   r  uploaded_sizer  one_bytestopr  r  pool	part_datar  r  rK  upload_resultr  s                                 r   r  zMinio.put_object  s   x 	+0JKKKK{+++#JtT$:$:5666 Iy)I)I ?@@@f--.. 	ECDDD -fi @ @	: 	L+FKKKXsD)ZHH"."L2L	"&V	 <:q >>"j00$/-$?	# .i(! ! !I 9~~22%;)2; ;$'	NN; ; ;   3 !/i!mX! ! !I
 9~~22%0
##,RSS>$-crcN	Y/??++#[)W   ! . $ = =#['! !I , .0Dq0H0H)*>??++---   &c>::EXs{{}}555@D
 (!++T**33.    -4,d3DLLk4!8!8999y  <:|  Ca
2 ,,.. C(.

%K+/T+B+BE+a-( !,,.. C !;;[$sI*>*> M %S-344S-344("*&/     	 	 	 ,,i   I	s    	CO G/O 
O9O44O9	recursivestart_afterinclude_user_metainclude_version
use_api_v1use_url_encoding_typefetch_ownerc
                N    |                      ||rdnd||||||rdnd|		  	        S )a  
        Lists object information of a bucket.

        :param bucket_name: Name of the bucket.
        :param prefix: Object name starts with prefix.
        :param recursive: List recursively than directory structure emulation.
        :param start_after: List objects after this key name.
        :param include_user_meta: MinIO specific flag to control to include
                                 user metadata.
        :param include_version: Flag to control whether include object
                                versions.
        :param use_api_v1: Flag to control to use ListObjectV1 S3 API or not.
        :param use_url_encoding_type: Flag to control whether URL encoding type
                                      to be used or not.
        :return: Iterator of :class:`Object <Object>`.

        Example::
            # List objects information.
            objects = client.list_objects("my-bucket")
            for obj in objects:
                print(obj)

            # List objects information whose names starts with "my/prefix/".
            objects = client.list_objects("my-bucket", prefix="my/prefix/")
            for obj in objects:
                print(obj)

            # List objects information recursively.
            objects = client.list_objects("my-bucket", recursive=True)
            for obj in objects:
                print(obj)

            # List objects information recursively whose names starts with
            # "my/prefix/".
            objects = client.list_objects(
                "my-bucket", prefix="my/prefix/", recursive=True,
            )
            for obj in objects:
                print(obj)

            # List objects information recursively after object name
            # "my/prefix/world/1".
            objects = client.list_objects(
                "my-bucket", recursive=True, start_after="my/prefix/world/1",
            )
            for obj in objects:
                print(obj)
        Nr   r  )	delimiterr  rw  r  r  r  encoding_typer  )_list_objects)
r   r   rw  r  r  r  r  r  r  r  s
             r   list_objectszMinio.list_objects  sO    x !!'0ddS/#!+#8B%%d# " 

 

 
	
r   extra_headersr+   c                   t          || j        j                   t          |           t	          |           t          t          |r|                                ni           }|r|                    |           |pi }|                    |rd|ini            | 	                    d||||          }	|	j        
                    d          }
|
t          j        |
          }nd}t          ||||	j        
                    dd                              d	d          t          |	j        
                    d
d                    |	j        
                    d          |	j        |	j        
                    d                    S )a  
        Get object information and metadata of an object.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param ssec: Server-side encryption customer key.
        :param version_id: Version ID of the object.
        :param extra_headers: Extra HTTP headers for advanced usage.
        :param extra_query_params: Extra query parameters for advanced usage.
        :return: :class:`Object <Object>`.

        Example::
            # Get object information.
            result = client.stat_object("my-bucket", "my-object")

            # Get object information of version-ID.
            result = client.stat_object(
                "my-bucket", "my-object",
                version_id="dfbd25b3-abec-4184-a4e8-5a35a5c1174d",
            )

            # Get SSE-C encrypted object information.
            result = client.stat_object(
                "my-bucket", "my-object",
                ssec=SseCustomerKey(b"32byteslongsecretkeymustprovided"),
            )
        r;  r  r   r  zlast-modifiedNr  r   r  r  0r   r  )r  r  r  r  r  r  )rA   rg   r  rB   rD   r   r=   r   r  r  r   r   from_http_headerr+   r  r  )r   r   r   r  r  r  r  r   r   r   r  r  s               r   r  zMinio.stat_object  s   J 	+0JKKKK{+++4x4!?R@@ 	*NN=))))/RK[*55LLL==% ! 
 
  $$_55 1%88MM M'!%%fb1199#rBBX%))*:C@@AA!)--n==%'++,>??	
 	
 	
 		
r   c                    t          || j        j                   t          |           |                     d|||rd|ind           dS )a  
        Remove an object.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param version_id: Version ID of the object.

        Example::
            # Remove object.
            client.remove_object("my-bucket", "my-object")

            # Remove version of an object.
            client.remove_object(
                "my-bucket", "my-object",
                version_id="dfbd25b3-abec-4184-a4e8-5a35a5c1174d",
            )
        r;  rR  r  NrW  )rA   rg   r  rB   r  )r   r   r   r  s       r   remove_objectzMinio.remove_object  sj    . 	+0JKKKK{+++6@J+z22d	 	 	
 	
 	
 	
 	
r   delete_object_listlist[DeleteObject]quietbypass_governance_moder3   c                   t          t          ||                    }dt          t          t	          |                    i}|rd|d<   |                     d|||ddi          }t          j        |j        	                                          }|j
                            d	          r#t          g t          j        |          g          n+t          t          |j        	                                          S )
au  
        Delete multiple objects.

        :param bucket_name: Name of the bucket.
        :param delete_object_list: List of maximum 1000
            :class:`DeleteObject <DeleteObject>` object.
        :param quiet: quiet flag.
        :param bypass_governance_mode: Bypass Governance retention mode.
        :return: :class:`DeleteResult <DeleteResult>` object.
        )r&  r   rC  z!x-amz-bypass-governance-retentionr=  deleter   r_  Error)ra   r2   r   rh   rJ   r  r  r  r   r   r  endswithr3   r0   r  rb   )	r   r   r$  r&  r'  r   r   r   r  s	            r   _delete_objectszMinio._delete_objects6  s    " }%7uEEEFF4[%6%677
 " 	B;AG78=="B ! 
 
 - 4 4 6 677 {##G,,ALk1'::;<<<<)=)=)?)?@@	
r   Iterable[DeleteObject]Iterator[DeleteError]c              #  "  K   t          || j        j                   t          j        |          }	 d t          t          d          |          D             }|sdS |                     ||d|          }|j        D ]}|j	        dk    r|V  ^)a  
        Remove multiple objects.

        :param bucket_name: Name of the bucket.
        :param delete_object_list: An iterable containing
            :class:`DeleteObject <DeleteObject>` object.
        :param bypass_governance_mode: Bypass Governance retention mode.
        :return: An iterator containing :class:`DeleteError <DeleteError>`
            object.

        Example::
            # Remove list of objects.
            errors = client.remove_objects(
                "my-bucket",
                [
                    DeleteObject("my-object1"),
                    DeleteObject("my-object2"),
                    DeleteObject(
                        "my-object3", "13f88b18-8dcd-4c83-88f2-8631fdb6250c",
                    ),
                ],
            )
            for error in errors:
                print("error occurred when deleting object", error)

            # Remove a prefix recursively.
            delete_object_list = list(
                map(
                    lambda x: DeleteObject(x.object_name),
                    client.list_objects(
                        "my-bucket",
                        "my/prefix/",
                        recursive=True,
                    ),
                )
            )
            errors = client.remove_objects("my-bucket", delete_object_list)
            for error in errors:
                print("error occurred when deleting object", error)
        r;  Tc                    g | ]\  }}|S r   r   ).0r  delete_objects      r   
<listcomp>z(Minio.remove_objects.<locals>.<listcomp>  s)       "2!]  r     )r&  r'  NoSuchVersionN)
rA   rg   r  	itertoolschainzipranger,  
error_listr   )r   r   r$  r'  objectsrK  errors          r   remove_objectszMinio.remove_objects\  s      \ 	+0JKKKK '_-?@@	  69$KK!37 7  G  ))'=	 *  F  *     :00KKK/	 r      )daysexpiresr   response_headersrequest_datedatetime | Nonec	                   t          || j        j                   t          |           |                                dk     s|                                dk    rt          d          |                     |          }	|pi }
|
                    |rd|ini            |
                    |pi            | j        r| j        	                                nd}|r|j
        r
|j
        |
d<   | j                            ||	|||
          }|rFt          |||	||pt          j                    t          |                                                    }t!          |          S )	a  
        Get presigned URL of an object for HTTP method, expiry time and custom
        request parameters.

        :param method: HTTP method.
        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param expires: Expiry in seconds; defaults to 7 days.
        :param response_headers: Optional response_headers argument to
                                 specify response fields like date, size,
                                 type of file, data about server, etc.
        :param request_date: Optional request_date argument to
                             specify a different request date. Default is
                             current date.
        :param version_id: Version ID of the object.
        :param extra_query_params: Extra query parameters for advanced usage.
        :return: URL string.

        Example::
            # Get presigned URL string to delete 'my-object' in
            # 'my-bucket' with one day expiry.
            url = client.get_presigned_url(
                "DELETE",
                "my-bucket",
                "my-object",
                expires=timedelta(days=1),
            )
            print(url)
        r;  r   i:	 z*expires must be between 1 second to 7 daysr  Nr   r   )rA   rg   r  rB   total_secondsr   r  r  rl   r   rr   r   rV   r   r   r  r   )r   r   r   r   r@  rA  rB  r  r  ru   r   r   r  s                r   get_presigned_urlzMinio.get_presigned_url  s   P 	+0JKKKK{+++  ""Q&&'*?*?*A*AF*J*JIJJJ!!+..)/RK[*55LLL,2333-1^E''))) 	GU( 	G383FL/0n""##% # 
 
  	-G))++,, C #r   c           
     <    |                      d|||||||          S )aS  
        Get presigned URL of an object to download its data with expiry time
        and custom request parameters.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param expires: Expiry in seconds; defaults to 7 days.
        :param response_headers: Optional response_headers argument to
                                  specify response fields like date, size,
                                  type of file, data about server, etc.
        :param request_date: Optional request_date argument to
                              specify a different request date. Default is
                              current date.
        :param version_id: Version ID of the object.
        :param extra_query_params: Extra query parameters for advanced usage.
        :return: URL string.

        Example::
            # Get presigned URL string to download 'my-object' in
            # 'my-bucket' with default expiry (i.e. 7 days).
            url = client.presigned_get_object("my-bucket", "my-object")
            print(url)

            # Get presigned URL string to download 'my-object' in
            # 'my-bucket' with two hours expiry.
            url = client.presigned_get_object(
                "my-bucket", "my-object", expires=timedelta(hours=2),
            )
            print(url)
        r  )rA  rB  r  r  rF  )r   r   r   r@  rA  rB  r  r  s           r   presigned_get_objectzMinio.presigned_get_object  s:    P %%-%!1 & 	
 	
 		
r   c                2    |                      d|||          S )aF  
        Get presigned URL of an object to upload data with expiry time and
        custom request parameters.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param expires: Expiry in seconds; defaults to 7 days.
        :return: URL string.

        Example::
            # Get presigned URL string to upload data to 'my-object' in
            # 'my-bucket' with default expiry (i.e. 7 days).
            url = client.presigned_put_object("my-bucket", "my-object")
            print(url)

            # Get presigned URL string to upload data to 'my-object' in
            # 'my-bucket' with two hours expiry.
            url = client.presigned_put_object(
                "my-bucket", "my-object", expires=timedelta(hours=2),
            )
            print(url)
        rF  rH  )r   r   r   r@  s       r   presigned_put_objectzMinio.presigned_put_object"	  s%    8 %%;W
 
 	
r   r-   c                @   t          |t                    st          d          | j        st          d          t	          |j        | j        j                   |                    | j        	                                | 
                    |j                            S )aK  
        Get form-data of PostPolicy of an object to upload its data using POST
        method.

        :param policy: :class:`PostPolicy <PostPolicy>`.
        :return: :dict: contains form-data.

        Example::
            policy = PostPolicy(
                "my-bucket", datetime.utcnow() + timedelta(days=10),
            )
            policy.add_starts_with_condition("key", "my/object/prefix/")
            policy.add_content_length_range_condition(
                1*1024*1024, 10*1024*1024,
            )
            form_data = client.presigned_post_policy(policy)
        zpolicy must be PostPolicy typez:anonymous access does not require presigned post form-datar;  )r   r-   r   rl   rA   r   rg   r  	form_datar   r  )r   rV  s     r   presigned_post_policyzMinio.presigned_post_policyB	  s    $ &*-- 	?=>>>~ 	L   	)C	E 	E 	E 	EN##%%V/00
 
 	
r   c                p    t          || j        j                   |                     d|ddi           dS )z
        Delete replication configuration of a bucket.

        :param bucket_name: Name of the bucket.

        Example::
            client.delete_bucket_replication("my-bucket")
        r;  rR  replicationr   rW  Nr[  rS  s     r   delete_bucket_replicationzMinio.delete_bucket_replicationa	  s?     	+0JKKKKh=":MNNNNNr   ReplicationConfig | Nonec                   t          || j        j                   	 |                     d|ddi          }t	          t
          |j                                                  S # t          $ r}|j	        dk    r Y d}~nd}~ww xY wdS )a  
        Get bucket replication configuration of a bucket.

        :param bucket_name: Name of the bucket.
        :return: :class:`ReplicationConfig <ReplicationConfig>` object.

        Example::
            config = client.get_bucket_replication("my-bucket")
        r;  r  rP  r   rW  %ReplicationConfigurationNotFoundErrorN)
rA   rg   r  r  rb   rR   r   r   r5   r   rq  s       r   get_bucket_replicationzMinio.get_bucket_replicationm	  s     	+0JKKKK	}}{-1D %  H .0D0D0F0FGGG 	 	 	xBBB CBBBB	 trs  rR   c                   t          || j        j                   t          |t                    st          d          t          |          }|                     d||dt          t          t          |                    iddi           dS )	aP  
        Set bucket replication configuration to a bucket.

        :param bucket_name: Name of the bucket.
        :param config: :class:`ReplicationConfig <ReplicationConfig>` object.

        Example::
            config = ReplicationConfig(
                "REPLACE-WITH-ACTUAL-ROLE",
                [
                    Rule(
                        Destination(
                            "REPLACE-WITH-ACTUAL-DESTINATION-BUCKET-ARN",
                        ),
                        ENABLED,
                        delete_marker_replication=DeleteMarkerReplication(
                            DISABLED,
                        ),
                        rule_filter=Filter(
                            AndOperator(
                                "TaxDocs",
                                {"key1": "value1", "key2": "value2"},
                            ),
                        ),
                        rule_id="rule1",
                        priority=1,
                    ),
                ],
            )
            client.set_bucket_replication("my-bucket", config)
        r;  z%config must be ReplicationConfig typerF  r   rP  r   r_  N)rA   rg   r  r   rR   r   ra   r  r   rh   rJ   rg  s       r   set_bucket_replicationzMinio.set_bucket_replication	  s    H 	+0JKKKK&"344 	FDEEEv"Dk$.?.?$@$@A', 	 	
 	
 	
 	
 	
r   c                p    t          || j        j                   |                     d|ddi           dS )z
        Delete notification configuration of a bucket.

        :param bucket_name: Name of the bucket.

        Example::
            client.delete_bucket_lifecycle("my-bucket")
        r;  rR  	lifecycler   rW  Nr[  rS  s     r   delete_bucket_lifecyclezMinio.delete_bucket_lifecycle	  s?     	+0JKKKKh;:KLLLLLr   LifecycleConfig | Nonec                   t          || j        j                   	 |                     d|ddi          }t	          t
          |j                                                  S # t          $ r}|j	        dk    r Y d}~nd}~ww xY wdS )a  
        Get bucket lifecycle configuration of a bucket.

        :param bucket_name: Name of the bucket.
        :return: :class:`LifecycleConfig <LifecycleConfig>` object.

        Example::
            config = client.get_bucket_lifecycle("my-bucket")
        r;  r  rY  r   rW  NoSuchLifecycleConfigurationN)
rA   rg   r  r  rb   rO   r   r   r5   r   rq  s       r   get_bucket_lifecyclezMinio.get_bucket_lifecycle	  s     	+0JKKKK	}}{+r1B %  H _hm.B.B.D.DEEE 	 	 	x999 :9999	 trs  rO   c                   t          || j        j                   t          |t                    st          d          t          |          }|                     d||dt          t          t          |                    iddi           dS )	a  
        Set bucket lifecycle configuration to a bucket.

        :param bucket_name: Name of the bucket.
        :param config: :class:`LifecycleConfig <LifecycleConfig>` object.

        Example::
            config = LifecycleConfig(
                [
                    Rule(
                        ENABLED,
                        rule_filter=Filter(prefix="documents/"),
                        rule_id="rule1",
                        transition=Transition(
                            days=30, storage_class="GLACIER",
                        ),
                    ),
                    Rule(
                        ENABLED,
                        rule_filter=Filter(prefix="logs/"),
                        rule_id="rule2",
                        expiration=Expiration(days=365),
                    ),
                ],
            )
            client.set_bucket_lifecycle("my-bucket", config)
        r;  z#config must be LifecycleConfig typerF  r   rY  r   r_  N)rA   rg   r  r   rO   r   ra   r  r   rh   rJ   rg  s       r   set_bucket_lifecyclezMinio.set_bucket_lifecycle	  s    @ 	+0JKKKK&/22 	DBCCCv"Dk$.?.?$@$@A%r* 	 	
 	
 	
 	
 	
r   c                p    t          || j        j                   |                     d|ddi           dS )z
        Delete tags configuration of a bucket.

        :param bucket_name: Name of the bucket.

        Example::
            client.delete_bucket_tags("my-bucket")
        r;  rR  taggingr   rW  Nr[  rS  s     r   delete_bucket_tagszMinio.delete_bucket_tags
  s>     	+0JKKKKh9b/JJJJJr   c                   t          || j        j                   	 |                     d|ddi          }t	          t
          |j                                                  }|j        S # t          $ r}|j
        dk    r Y d}~nd}~ww xY wdS )z
        Get tags configuration of a bucket.

        :param bucket_name: Name of the bucket.
        :return: :class:`Tags <Tags>` object.

        Example::
            tags = client.get_bucket_tags("my-bucket")
        r;  r  rb  r   rW  NoSuchTagSetN)rA   rg   r  r  rb   r[   r   r   r  r5   r   )r   r   r   rb  r  s        r   get_bucket_tagszMinio.get_bucket_tags
  s     	+0JKKKK	}}{)R %  H  )=)=)?)?@@G< 	 	 	x>)) *))))	 ts   AA* *
B
4BB
r!   c                8   t          || j        j                   t          |t                    st          d          t          t          |                    }|                     d||dt          t          t          |                    iddi           dS )	a[  
        Set tags configuration to a bucket.

        :param bucket_name: Name of the bucket.
        :param tags: :class:`Tags <Tags>` object.

        Example::
            tags = Tags.new_bucket_tags()
            tags["Project"] = "Project One"
            tags["User"] = "jsmith"
            client.set_bucket_tags("my-bucket", tags)
        r;  r  rF  r   rb  r   r_  N)rA   rg   r  r   r!   r   ra   r[   r  r   rh   rJ   )r   r   r  r   s       r   set_bucket_tagszMinio.set_bucket_tags'
  s     	+0JKKKK$%% 	75666wt}}%%"Dk$.?.?$@$@A#R 	 	
 	
 	
 	
 	
r   c           	         t          || j        j                   t          |           |rd|ini }d|d<   |                     d||t          t          |                     dS )a)  
        Delete tags configuration of an object.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param version_id: Version ID of the Object.

        Example::
            client.delete_object_tags("my-bucket", "my-object")
        r;  r  r   rb  rR  r   r   N)rA   rg   r  rB   r  r   r=   )r   r   r   r  r   s        r   delete_object_tagszMinio.delete_object_tags@
  s      	+0JKKKK{+++4>FZ00B"$Y#h55	 	 	
 	
 	
 	
 	
r   c           	     z   t          || j        j                   t          |           |rd|ini }d|d<   	 |                     d||t          t          |                    }t          t          |j	        
                                          }|j        S # t          $ r}|j        dk    r Y d}~nd}~ww xY wdS )	aW  
        Get tags configuration of a object.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param version_id: Version ID of the Object.
        :return: :class:`Tags <Tags>` object.

        Example::
            tags = client.get_object_tags("my-bucket", "my-object")
        r;  r  r   rb  r  rj  re  N)rA   rg   r  rB   r  r   r=   rb   r[   r   r   r  r5   r   )r   r   r   r  r   r   rb  r  s           r   get_object_tagszMinio.get_object_tags[
  s    " 	+0JKKKK{+++4>FZ00B"$Y	}}'!(L99	 %  H  )=)=)?)?@@G< 	 	 	x>)) *))))	 t   AB 
B8"B33B8c                   t          || j        j                   t          |           t	          |t
                    st          d          t          t          |                    }|rd|ini }d|d<   | 	                    d|||dt          t          t          |                    it          t          |                     d	S )
a  
        Set tags configuration to an object.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param version_id: Version ID of the Object.
        :param tags: :class:`Tags <Tags>` object.

        Example::
            tags = Tags.new_object_tags()
            tags["Project"] = "Project One"
            tags["User"] = "jsmith"
            client.set_object_tags("my-bucket", "my-object", tags)
        r;  r  r  r   rb  rF  r   r   r   r   r   N)rA   rg   r  rB   r   r!   r   ra   r[   r  r   rh   rJ   r=   )r   r   r   r  r  r   r   s          r   set_object_tagszMinio.set_object_tags~
  s    * 	+0JKKKK{+++$%% 	75666wt}}%%4>FZ00B"$Y#"Dk$.?.?$@$@Ah55 	 	
 	
 	
 	
 	
r   c                L   t          || j        j                   t          |           t	          t          d                    }|rd|ini }d|d<   |                     d|||dt          t          t          |                    it          t          |                     d	S )
a'  
        Enable legal hold on an object.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param version_id: Version ID of the object.

        Example::
            client.enable_object_legal_hold("my-bucket", "my-object")
        r;  Tr  r   
legal-holdrF  r   rp  NrA   rg   r  rB   ra   rN   r  r   rh   rJ   r=   r   r   r   r  r   r   s         r   enable_object_legal_holdzMinio.enable_object_legal_hold
  s      	+0JKKKK{+++y''4>FZ00B%'\"#"Dk$.?.?$@$@Ah55 	 	
 	
 	
 	
 	
r   c                L   t          || j        j                   t          |           t	          t          d                    }|rd|ini }d|d<   |                     d|||dt          t          t          |                    it          t          |                     d	S )
a)  
        Disable legal hold on an object.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param version_id: Version ID of the object.

        Example::
            client.disable_object_legal_hold("my-bucket", "my-object")
        r;  Fr  r   rs  rF  r   rp  Nrt  ru  s         r   disable_object_legal_holdzMinio.disable_object_legal_hold
  s      	+0JKKKK{+++y''((4>FZ00B%'\"#"Dk$.?.?$@$@Ah55 	 	
 	
 	
 	
 	
r   c           	     z   t          || j        j                   t          |           |rd|ini }d|d<   	 |                     d||t          t          |                    }t          t          |j	        
                                          }|j        S # t          $ r}|j        dk    r Y d}~nd}~ww xY wd	S )
a  
        Returns true if legal hold is enabled on an object.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param version_id: Version ID of the object.

        Example::
            if client.is_object_legal_hold_enabled("my-bucket", "my-object"):
                print("legal hold is enabled on my-object")
            else:
                print("legal hold is not enabled on my-object")
        r;  r  r   rs  r  rj  NoSuchObjectLockConfigurationNF)rA   rg   r  rB   r  r   r=   rb   rN   r   r   r   r5   r   )r   r   r   r  r   r   r  r  s           r   is_object_legal_hold_enabledz"Minio.is_object_legal_hold_enabled
  s    & 	+0JKKKK{+++4>FZ00B%'\"	}}'!(L99	 %  H #9hm.B.B.D.DEEJ$$ 	 	 	x::: ;::::	 urn  c                P    |                      |t          ddd                     dS )z
        Delete object-lock configuration of a bucket.

        :param bucket_name: Name of the bucket.

        Example::
            client.delete_object_lock_config("my-bucket")
        N)set_object_lock_configrQ   rS  s     r   delete_object_lock_configzMinio.delete_object_lock_config  s8     	##)$d;;	
 	
 	
 	
 	
r   rQ   c                    t          || j        j                   |                     d|ddi          }t	          t
          |j                                                  S )a  
        Get object-lock configuration of a bucket.

        :param bucket_name: Name of the bucket.
        :return: :class:`ObjectLockConfig <ObjectLockConfig>` object.

        Example::
            config = client.get_object_lock_config("my-bucket")
        r;  r  object-lockr   rW  )rA   rg   r  r  rb   rQ   r   r   rX  s      r   get_object_lock_configzMinio.get_object_lock_config  sa     	+0JKKKK==;mR-@ ! 
 
 )8=+?+?+A+ABBBr   c                   t          || j        j                   t          |t                    st          d          t          |          }|                     d||dt          t          t          |                    iddi           dS )	aG  
        Set object-lock configuration to a bucket.

        :param bucket_name: Name of the bucket.
        :param config: :class:`ObjectLockConfig <ObjectLockConfig>` object.

        Example::
            config = ObjectLockConfig(GOVERNANCE, 15, DAYS)
            client.set_object_lock_config("my-bucket", config)
        r;  z$config must be ObjectLockConfig typerF  r   r  r   r_  N)rA   rg   r  r   rQ   r   ra   r  r   rh   rJ   rg  s       r   r}  zMinio.set_object_lock_config!  s     	+0JKKKK&"233 	ECDDDv"Dk$.?.?$@$@A', 	 	
 	
 	
 	
 	
r   c           	     l   t          || j        j                   t          |           |rd|ini }d|d<   	 |                     d||t          t          |                    }t          t          |j	        
                                          S # t          $ r}|j        dk    r Y d}~nd}~ww xY wdS )	an  
        Get retention configuration of an object.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param version_id: Version ID of the object.
        :return: :class:`Retention <Retention>` object.

        Example::
            config = client.get_object_retention("my-bucket", "my-object")
        r;  r  r   r  r  rj  rz  N)rA   rg   r  rB   r  r   r=   rb   rS   r   r   r5   r   )r   r   r   r  r   r   r  s          r   get_object_retentionzMinio.get_object_retention<  s    " 	+0JKKKK{+++4>FZ00B$&[!
	}}'!(L99	 %  H Y(<(<(>(>??? 	 	 	x::: ;::::	 ts   AB 
B1B,,B1rS   c                z   t          || j        j                   t          |           t	          |t
                    st          d          t          |          }|rd|ini }d|d<   |                     d|||dt          t          t          |                    it          t          |                     d	S )
a  
        Set retention configuration on an object.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param version_id: Version ID of the object.
        :param config: :class:`Retention <Retention>` object.

        Example::
            config = Retention(
                GOVERNANCE, datetime.utcnow() + timedelta(days=10),
            )
            client.set_object_retention("my-bucket", "my-object", config)
        r;  zconfig must be Retention typer  r   r  rF  r   rp  N)rA   rg   r  rB   r   rS   r   ra   r  r   rh   rJ   r=   )r   r   r   re  r  r   r   s          r   set_object_retentionzMinio.set_object_retention^  s    * 	+0JKKKK{+++&),, 	><===v4>FZ00B$&[!#"Dk$.?.?$@$@Ah55 	 	
 	
 	
 	
 	
r   object_listIterable[SnowballObject]staging_filenamecompressionc
                   t          || j        j                   dt                       d}
t	          j        |          }|pi }d|d<   |}|	rdnd}|rdnt                      }t          j        |||	          5 }|D ]}|j	        r!|
                    |j	        |j                   *t          j        |j                  }t          t          |j                  |_        t          t#          j        |j        pt#          j                                        |_        |                    |t          t.          t0          t2                   df         |j                             	 ddd           n# 1 swxY w Y   |sPt          t          |                                          }t          t          |                              d
           nt;          j        |          j        }|t@          k     rd
n|}|r1| !                    ||
t          tD          |          ||||||	  	        S | #                    ||
t          tH          |          |t          t.          tJ          df         |          |||||
  
        S )a  
        Uploads multiple objects in a single put call. It is done by creating
        intermediate TAR file optionally compressed which is uploaded to S3
        service.

        :param bucket_name: Name of the bucket.
        :param object_list: An iterable containing
            :class:`SnowballObject <SnowballObject>` object.
        :param metadata: Any additional metadata to be uploaded along
            with your PUT request.
        :param sse: Server-side encryption.
        :param tags: :class:`Tags` for the object.
        :param retention: :class:`Retention` configuration object.
        :param legal_hold: Flag to set legal hold for the object.
        :param staging_filename: A staging filename to create intermediate
            tarball.
        :param compression: Flag to compress TAR ball.
        :return: :class:`ObjectWriteResult` object.

        Example::
            # Upload snowball object.
            result = client.upload_snowball_objects(
                "my-bucket",
                [
                    SnowballObject("my-object1", filename="/etc/hostname"),
                    SnowballObject(
                        "my-object2", data=io.BytesIO("hello"), length=5,
                    ),
                    SnowballObject(
                        "my-object3", data=io.BytesIO("world"), length=5,
                        mod_time=datetime.now(),
                    ),
                ],
            )
        r;  z	snowball.z.tarrC  z X-Amz-Meta-Snowball-Auto-Extractzw:gzwN)namemodefileobjr   )r  r  r  r  r  r  )&rA   rg   r  r	   r6  r7  r   tarfiler  filenamer   r   TarInfor   r  r  r  r   to_floatmod_timer   mtimeaddfiler   r
   r   r   tellseekr   r  r  r;   r  rh   r  r   r=   )r   r   r  r  r  r  r  r  r  r  r   r  r  r  tarobjinfor  r  s                      r   upload_snowball_objectszMinio.upload_snowball_objects  s   ^ 	+0JKKKK0&((000  ok22>r7=34$-vv#-$$GII\t$@@@ 
	NC" 	N 	N< NGGCL#/::::"?3?;;D $S#* 5 5DI!$cl&CdkmmDD" "DJ KKd5ED+A38&L&LMMMM	N
	N 
	N 
	N 
	N 
	N 
	N 
	N 
	N 
	N 
	N 
	N 
	N 
	N 
	N 
	N  	+'7++0022F'""''****WT]]*F-//AAV	 	##S*++!#%# $ 
 
 
 7##%40(;;!  
 
 	
s   <C*E33E7:E7continuation_tokenr  r  bool | Nonemax_keys
int | Noneversion_id_markerIterator[Object]c              #    K   t          || j        j                   |
rd}d}|ri }|rd|d<   n|sd|d<   |s|s|r||d<   |rd|d	<   |rd|d
<   |pd|d<   |r||d<   t          |pd          |d<   |pd|d<   |	r|r|	|d<   n|r|	|d<   n|	|d<   |
r|
|d<   |                     d|t          t          |                    }t          |          \  }}}	}
|sd}
|s|	}|E d{V  |dS dS )a6  
        List objects optionally including versions.
        Note: Its required to send empty values to delimiter/prefix and 1000 to
        max-keys when not provided for server-side bucket policy evaluation to
        succeed; otherwise AccessDenied error will be returned for such
        policies.
        r;  Tr   versionsr>  z	list-typezcontinuation-tokenrC  zfetch-ownerr  r  encoding-typer4  zmax-keysrw  
key-markermarkerzstart-afterzversion-id-markerr  rW  N)rA   rg   r  rh   r  r   r=   r/   )r   r   r  r  r  r  r  r  rw  r  r  r  r  is_truncatedr   r   r;  s                    r   r  zMinio._list_objects  s     0 	+0JKKKK 	#"O ,	E )$&j!! )%(k"" /: /% E2DE./ 2+1E-($ /(.E*%!*bE+ 7)6o& #H$4 5 5E*$lE(O 7" 7*5E,'' 7&1E(OO+6E-(  ?->)*}}!(E22 %  H #8,, BG\;0A # 5$(!! 5)4&Y  ,	 ,	 ,	 ,	 ,	r   
key_markermax_uploadsupload_id_markerr)   c
           
     F   |	pi }
|
                     d|pdt          |pd          |pddd           |r||
d<   |r||
d<   |r||
d<   |                     d|t          t          |
          t          t
          t          d	f         |          
          }t          |          S )a  
        Execute ListMultipartUploads S3 API.

        :param bucket_name: Name of the bucket.
        :param delimiter: (Optional) Delimiter on listing.
        :param encoding_type: (Optional) Encoding type.
        :param key_marker: (Optional) Key marker.
        :param max_uploads: (Optional) Maximum upload information to fetch.
        :param prefix: (Optional) Prefix on listing.
        :param upload_id_marker: (Optional) Upload ID marker.
        :param extra_headers: (Optional) Extra headers for advanced usage.
        :param extra_query_params: (Optional) Extra query parameters for
            advanced usage.
        :return:
            :class:`ListMultipartUploadsResult <ListMultipartUploadsResult>`
                object
        r   r4  r  )r  r  zmax-uploadsrw  r  r  r  zupload-id-markerr  N)r   r   )r  rh   r  r   r=   r   r)   )r   r   r  r  r  r  rw  r  r  r  r   r   s               r   _list_multipart_uploadszMinio._list_multipart_uploads8  s    < */R&_"";#6$77 ,B!& 	
 	
 	
  	:,9L) 	4)3L& 	@/?L+,==h55x~.>>	 ! 
 
 *(333r   	max_partspart_number_markerr*   c                   |pi }|                     |t          |pd          d           |r||d<   |                     d||t          t          |          t          t
          t          df         |                    }	t          |	          S )a6  
        Execute ListParts S3 API.

        :param bucket_name: Name of the bucket.
        :param object_name: Object name in the bucket.
        :param upload_id: Upload ID.
        :param max_parts: (Optional) Maximum parts information to fetch.
        :param part_number_marker: (Optional) Part number marker.
        :param extra_headers: (Optional) Extra headers for advanced usage.
        :param extra_query_params: (Optional) Extra query parameters for
            advanced usage.
        :return: :class:`ListPartsResult <ListPartsResult>` object
        r4  )r  z	max-partszpart-number-markerr  N)r   r   r   )r  rh   r  r   r=   r   r*   )
r   r   r   r  r  r  r  r  r   r   s
             r   _list_partszMinio._list_partso  s    0 */R% !2d33 	
 	
 	
  	D1CL-.==#h55x~.>> ! 
 
 x(((r   )NNNTNNNT)rn   rh   ro   rp   rq   rp   rr   rp   rs   rt   ru   rp   rv   rw   rx   rk   ry   rt   )F)
r   rh   r   rp   r   r   r   rt   r   r   )
r   rh   r   r   r   r   r   r   r   r   )NNNNNTF)r   rh   ru   rh   r   rp   r   rp   r   r   r   r   r   r   r   rt   r   rt   r   r   )r   rh   r   rp   r   rp   r   r   r   r   r   r   r   rt   r   rt   r   r   )r   rp   r   rh   )r  rh   r  rh   )r"  r   )r   rh   r   rh   r9  rU   r   rT   )NF)r   rh   r  rp   rA  rt   )r   rH  )r   rh   r   rt   )r   rh   )r   rh   r   rh   )r   rh   rV  r]  )r   rh   r   rP   )r   rh   re  rP   )r   rh   re  rZ   )r   rh   r   rn  )r   r   rv  )
r   rh   rw  rh   rx  rh   ry  rz  r   r'   )r   rh   re  r\   )r   rh   r   r\   )	r  NNNr   r  NNF)r   rh   r   rh   r  rh   r  rh   r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  rt   r   r>   )NNNNNN)r   rh   r   rh   r  rh   r  r   r  r  r  rp   r  r   r  rp   r  r  )r   r   NNNN)r   rh   r   rh   r  r  r  r  r  r   r  r  r  rp   r  r   r   r   )NNNNFNN)r   rh   r   rh   r  r   r  r  r  r   r  r  r  r  r  rt   r  rp   r  rp   r   r>   )r  r  r   r  )r   rh   r   rh   r  rh   r  r  r   r=   r   r  )NNNNF)r   rh   r   rh   r  r  r  r  r  r   r  r  r  r  r  rt   r   r>   )r   rh   r   rh   r  rh   )
r   rh   r   rh   r  rh   r  r  r   r&   )r   rh   r   rh   r   r=   r   rh   )N)r   rh   r   rh   r   r   r   r   r   r   r   r>   )r   rh   r   rh   r   r   r   r   r  rh   r  r  r   rh   )r   rh   r   rh   r   r   r  r  r  rh   r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  rt   r   r>   )NFNFFFTF)r   rh   rw  rp   r  rt   r  rp   r  rt   r  rt   r  rt   r  rt   r  rt   )NNNN)r   rh   r   rh   r  r  r  rp   r  r   r  r   r   r+   )r   rh   r   rh   r  rp   )FF)
r   rh   r$  r%  r&  rt   r'  rt   r   r3   )r   rh   r$  r-  r'  rt   r   r.  )r   rh   r   rh   r   rh   r@  r   rA  r   rB  rC  r  rp   r  r   r   rh   )r   rh   r   rh   r@  r   rA  r   rB  rC  r  rp   r  r   r   rh   )r   rh   r   rh   r@  r   r   rh   )rV  r-   r   re   )r   rh   r   rR  )r   rh   re  rR   )r   rh   r   r[  )r   rh   re  rO   )r   rh   r   r  )r   rh   r  r!   )r   rh   r   rh   r  rp   r   r  )r   rh   r   rh   r  r!   r  rp   )r   rh   r   rh   r  rp   r   rt   )r   rh   r   rQ   )r   rh   re  rQ   )r   rh   r   rh   r  rp   r   r  )r   rh   r   rh   re  rS   r  rp   )NNNNFNF)r   rh   r  r  r  r   r  r  r  r  r  r  r  rt   r  rp   r  rt   r   r>   )NNNNFNNNNFF)r   rh   r  rp   r  rp   r  rp   r  r  r  rt   r  r  rw  rp   r  rp   r  rp   r  rt   r  rt   r   r  )NNNNNNNN)r   rh   r  rp   r  rp   r  rp   r  r  rw  rp   r  rp   r  r   r  r   r   r)   )r   rh   r   rh   r  rh   r  r  r  rp   r  r   r  r   r   r*   )V__name__
__module____qualname____doc____annotations__r   r   r   r   r  r  r  r!  r$  r&  r*  r,  r0  r2  r6  r8  r@  rG  rL  rP  rT  rY  r\  ra  rd  rh  rj  rm  rr  ru  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r,  r=  r   rF  rI  rK  rN  rQ  rU  rW  rZ  r^  r`  rc  rf  rh  rk  rm  rq  rv  rx  r{  r~  r  r}  r  r  r  r  r  r  r   r   r   rd   rd   W   s	        % %L      
 &*%)(,!%6:+/#+
 +
 +
 +
 +
Z        8! ! ! !N '+&*!%'+,0$("'r r r r rn '+&*!%'+,0$("'2@ 2@ 2@ 2@ 2@h! ! ! !FM M M M	$ 	$ 	$ 	$" " "3 3 34 4 42 2 23 3 31 1 12 2 2+, +, +, +,` $( %	31 31 31 31 31j       ,0 0 0 0& & & & 
J 
J 
J 
J
 
 
 
(E E E E "
 "
 "
 "
H
H 
H 
H 
H
 
 
 
0   .   . '>-
 -
 -
 -
 -
^
 
 
 
8C C C C0 !;(,",0() $*.$K K K K Kd 04*.%)26(,,0]( ]( ]( ]( ](F /3*.%)26Z
 Z
 Z
 Z
 Z
B #(, $*.$-1,0M
 M
 M
 M
 M
^? ? ? ?B+ + + +4 #(, $*.$\ \ \ \ \|
 
 
 
7 7 7 76> > > >2 -1
 
 
 
 
4& & & &,1 1 1 7$((,$% &* l l l l lb "&#&*&+$)$*. %F
 F
 F
 F
 F
X +/%)-126F
 F
 F
 F
 F
X "&	
 
 
 
 
H  +0$
 $
 $
 $
 $
T ,1	J  J  J  J  J b "+!2!2!204,0%)26E E E E EV "+!2!2!204,0%)261
 1
 1
 1
 1
n "+!2!2!2	
 
 
 
 
@
 
 
 
>
O 
O 
O 
O   0.
 .
 .
 .
`
M 
M 
M 
M   0*
 *
 *
 *
X
K 
K 
K 
K   ,
 
 
 
: &*	
 
 
 
 
> &*	! ! ! ! !P &*#
 #
 #
 #
 #
R &*	
 
 
 
 
D &*	
 
 
 
 
D &*	# # # # #J
 
 
 
C C C C 
 
 
 
> &*	         N &*#
 #
 #
 #
 #
R )-" $*.$+/ %g
 g
 g
 g
 g
X .2$((,'+&+#'!%&*,0$$)J J J J J^ %)(,%)&*!%+/-12654 54 54 54 54x %)-1-126)) )) )) )) )) )) ))r   rd   )r  
__future__r   r   r6  r   r  collections.abcr   r   r   ior   r	   typingr
   r   r   r   r   r   r   urllib.parser   	xml.etreer   r  r   r   r   urllib3._collectionsr   urllib3.responser   ImportErrorr   urllib3.utilr   r   r   r   r   commonconfigr   r   r   r   r    r!   rx   r"   r#   credentials.providersr$   	datatypesr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   deleteobjectsr0   r1   r2   r3   r<  r4   r5   r6   helpersr7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   	legalholdrN   lifecycleconfigrO   notificationconfigrP   objectlockconfigrQ   replicationconfigrR   r  rS   r?  rT   rU   signerrV   rW   r  rX   rY   	sseconfigrZ   rb  r[   versioningconfigr\   xmlr]   r^   r_   r`   ra   rb   rd   r   r   r   <module>r     s  0  4 3 3 3 3 3 3 3     				  $ $ $ $ $ $ ( ( ( ( ( ( ( (             E E E E E E E E E E E E E E E E E E # # # # # # ' ' ' ' ' '         / / / / / /B1111111 B B BAAAAAAAAB !           * * * * * * * * * *1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 4 4 4 4 4 4 4 + + + + + +? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?* * * * * * * * * * * * = = = = = = = = = =M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M !           , , , , , , 2 2 2 2 2 2 . . . . . . 0 0 0 0 0 0             5 5 5 5 5 5 5 5 * * * * * * * * $ $ $ $ $ $ $ $                   . . . . . . L L L L L L L L L L L L L L L LA1) A1) A1) A1) A1) A1) A1) A1) A1) A1)s   $A+ +A98A9