
    eit                        d dl Z d dl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mZmZmZ d dlmZ d d	lmZ d d
lmZ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-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 d dl&m:Z:m;Z;m<Z<m=Z= d dl>m?Z? d dl>m@Z@ d dlAmBZBmCZCmDZDmEZE d dlFmGZGmHZHmIZI d dlJmKZK  ej                  eM      ZN G d dee#      ZOy)    N)AnyDictMappingOptionalcastTupleList)Sequence)UUID)override)AttachedFunction)CreateCollectionConfigurationUpdateCollectionConfiguration'update_collection_configuration_to_json'create_collection_configuration_to_json)__version__)BaseHTTPClient)DatabaseTenant
Collection)	ServerAPI)Search)	Documents
EmbeddingsIDsIncludeIndexingStatusSchema	Metadatas	ReadLevelURIsWhereWhereDocument	GetResultQueryResultSearchResultCollectionMetadatavalidate_batchconvert_np_embeddings_to_listIncludeMetadataDocuments!IncludeMetadataDocumentsDistances)"IncludeMetadataDocumentsEmbeddings%optional_embeddings_to_base64_stringsserialize_metadatadeserialize_metadata)UserIdentity)ClientAuthProvider)DEFAULT_DATABASEDEFAULT_TENANTSettingsSystem)OpenTelemetryClientOpenTelemetryGranularitytrace_method)ProductTelemetryClientc                       e Zd Zdef fdZedeeef   fd       Zedefd       Z	dedede
eef   defd	Z ed
ej                        edefd              Z edej                        eefdededdfd              Z edej                        eefdededefd              Z edej                        eefdededdfd              Z edej                        eddefdee   dee   dedee   fd              Z edej                        ededdfd              Z edej                        ededefd              Z edej                        edefd              Z edej                        eddeefdee   dee   ded edee    f
d!              Z! ed"ej                        eeefded edefd#              Z" ed$ej                        edddd%eefded&ee#   d'ee$   d(ee%   d)e&ded ede fd*              Z' ed+ej                        eeefdeded ede fd,              Z( ed-ej                        edddeefded&ee#   d'ee$   d(ee%   ded ede fd.              Z) ed/ej                        edddeefd0e*d1ee   d2ee%   d3ee+   ded eddfd4              Z, ed5ej                        eeefd6e*d1eded ede f
d7              Z- ed8ej                        eeefd6e*ded ede.fd9              Z/ ed:ej                        eeee0jb                  fd6e*d;e2e3   ded ed<e0de4fd=              Z5 ed>ej                        eeefdeded eddfd?              Z6 ed@ej                        eeefd6e*ded edefdA              Z7 edBej                        edCeefd6e*dDeded ede8f
dE              Z9 edFej                        eddddde:eefd6e*dGee;   dHee<   dee   dee   dIee=   dJe>ded ede8fdK              Z? edLej                        edddeefd6e*dGee;   dHee<   dIee=   ded eddfdM              Z@ edNej                        dOeBe;eeC   eeD   eeE   eeF   f   dPeddfdQ       ZG edRej                        edddeefdGe;d6e*dSeCdTeeD   dUeeE   dVeeF   ded ede&fdW              ZH edXej                        eddddeefd6e*dGe;dSeeC   dTeeD   dUeeE   dVeeF   ded ede&fdY              ZI edZej                        edddeefd6e*dGe;dSeCdTeeD   dUeeE   dVeeF   ded ede&fd[              ZJ ed\ej                        eddCddeKeefd6e*d]eCdGee;   d^edHee<   dIee=   dJe>ded edeLfd_              ZM ed`ej                        ede&fda              ZN edbej                        edefdc              ZOedePfdd       ZQ edeej                        defdf       ZR edgej                        de&fdh       ZS ediej                        edefdj              ZT edkej                        edeefdlededme*dnedoee
eef      ded edeBdpe&f   fdq              ZU edrej                        eeefdedme*ded eddpf
ds              ZV edtej                        ed%eefdedme*due&ded ede&fdv              ZW xZXS )wFastAPIsystemc                    t         |   |       |j                  j                  d       |j                  j                  d       | j                  t              | _        | j                  t              | _        |j                  | _        t        j                  t        |j                  j                        |j                  j                  |j                  j                  |j                  j                        | _        | j                  j"                  <t%        j&                  d | j(                  | j                  j"                        | _        n&t%        j&                  d | j(                        | _        |j                  j,                  xs i | _        d| j.                  d<   dt0        z   d	z   | j.                  d
<   | j.                  /| j*                  j2                  j5                  | j.                         |j                  j6                  rt| j                  t8              | _        | j:                  j=                         }|j?                         D ],  \  }}|jA                         | j*                  j2                  |<   . y y )Nchroma_server_hostchroma_server_http_port)r>   r?   chroma_server_ssl_enableddefault_api_path)timeoutlimitsverify)rB   rC   zapplication/jsonzContent-TypezChroma Python Client vz( (https://github.com/chroma-core/chroma)z
User-Agent)!super__init__settingsrequirer6   _opentelemetry_clientr9   _product_telemetry_client	_settingsr;   resolve_urlstrr>   r?   r@   chroma_server_api_default_path_api_urlchroma_server_ssl_verifyhttpxClienthttp_limits_sessionchroma_server_headers_headerr   headersupdatechroma_client_auth_providerr1   _auth_providerauthenticateitemsget_secret_value)selfr<   _headersheadervalue	__class__s        ^/home/obispo/Crisostomo_bridge/mision_env/lib/python3.12/site-packages/chromadb/api/fastapi.pyrF   zFastAPI.__init__D   s     45 9:%)\\2E%F")-6L)M&++"6??#E#EF$*OO$K$K&,oo&O&O#__KK	 , 
 >>22>!LL''~~>>DM "LLd>N>NODM<<B'9^$$89 	\" <<#MM!!((6??66"&,,/A"BD**779H!)!1 I050F0F0H%%f-I 7    returnc                 @    t        | j                  j                        S N)dictrT   rW   r^   s    rc   get_request_headerszFastAPI.get_request_headersn   s    DMM))**rd   c                     | j                   S rg   )rO   ri   s    rc   get_api_urlzFastAPI.get_api_urlr   s    }}rd   methodpathkwargsc                    d|v r9t        j                  |j                  d      t         j                        }||d<   t        j
                  j                  |dd d       }| j                  |z   } | j                  j                  ||fi t        t        |      }t        j                  |       t        j                  |j                        S )Njson)optioncontent/)safeencodingerrors)orjsondumpspopOPT_SERIALIZE_NUMPYurllibparsequoterO   rT   requestr   r   r   _raise_chroma_errorloadstext)r^   rm   rn   ro   dataescaped_pathurlresponses           rc   _make_requestzFastAPI._make_requestv   s     V<<

6 26;U;UVD $F9 ||))$S4PT)Umml*(4==((JS&8IJ**84||HMM**rd   zFastAPI.heartbeatc                 B    | j                  dd      }t        |d         S )zNReturns the current server time in nanoseconds to check if the server is alivegetz
/heartbeatznanosecond heartbeat)r   intr^   	resp_jsons     rc   	heartbeatzFastAPI.heartbeat   s'     &&ul;	93455rd   zFastAPI.create_databasenametenantNc                 8    | j                  dd| dd|i       y)zCreates a databasepost	/tenants/
/databasesr   rq   Nr   r^   r   r   s      rc   create_databasezFastAPI.create_database   s-     	xz*$ 	 	
rd   zFastAPI.get_databasec                 `    | j                  dd| d|       }t        |d   |d   |d         S )zReturns a databaser   r   /databases/idr   r   r   r   r   )r   r   )r^   r   r   r   s       rc   get_databasezFastAPI.get_database   sK     &&x{4&1
	 Yv%6y?R
 	
rd   zFastAPI.delete_databasec                 4    | j                  dd| d|        y)zDeletes a databasedeleter   r   Nr   r   s      rc   delete_databasezFastAPI.delete_database   s%     	x{4&1	
rd   zFastAPI.list_databaseslimitoffsetc           	          | j                  dd| dt        j                  ||d            }|D cg c]  }t        |d   |d   |d   	       }}|S c c}w )
zReturns a list of all databasesr   r   r   r   r   paramsr   r   r   r   )r   r   _clean_paramsr   )r^   r   r   r   json_databasesdb	databasess          rc   list_databaseszFastAPI.list_databases   s     ++xz*!//"$ , 	
 %
 4r&z"X,G
	 
 	
s   AzFastAPI.create_tenantc                 0    | j                  ddd|i       y )Nr   z/tenantsr   r   r   )r^   r   s     rc   create_tenantzFastAPI.create_tenant   s     	6:VTNCrd   zFastAPI.get_tenantc                 J    | j                  dd|z         }t        |d         S )Nr   r   r   )r   )r   r   )r^   r   r   s      rc   
get_tenantzFastAPI.get_tenant   s+     &&ukD.@A	9V,--rd   zFastAPI.get_user_identityc                 8    t        di | j                  dd      S )Nr   z/auth/identity )r0   r   ri   s    rc   get_user_identityzFastAPI.get_user_identity   s      Jd008HIJJrd   zFastAPI.list_collectionsdatabasec           	          | j                  dd| d| dt        j                  ||d            }|D cg c]  }t        j                  |       }}|S c c}w )z!Returns a list of all collectionsr   r   r   /collectionsr   r   )r   r   r   CollectionModel	from_json)r^   r   r   r   r   json_collectionsjson_collectioncollection_modelss           rc   list_collectionszFastAPI.list_collections   s      --x{8*LA!//"$ . 	
 $4
 %%o6
 

 ! 
s   AzFastAPI.count_collectionsc                 T    | j                  dd| d| d      }t        t        |      S )zReturns a count of collectionsr   r   r   z/collections_countr   r   r   )r^   r   r   r   s       rc   count_collectionszFastAPI.count_collections   s9     &&x{8*4FG
	 C##rd   zFastAPI.create_collectionFschemaconfigurationmetadataget_or_createc           
          |rt        ||      nd}|r|j                         nd}	| j                  dd| d| d||||	|d      }
t        j                  |
      }|S )zCreates a collectionNr   r   r   r   )r   r   r   r   r   r   )r   serialize_to_jsonr   r   r   )r^   r   r   r   r   r   r   r   config_jsonserialized_schemar   models               rc   create_collectionzFastAPI.create_collection
  s      4M8L 	
 ;AF446d&&x{8*LA$!,+!. ' 

	  )))4rd   zFastAPI.get_collectionc           	      f    | j                  dd| d| d|       }t        j                  |      }|S )zReturns a collectionr   r   r   /collections/r   r   r   )r^   r   r   r   r   r   s         rc   get_collectionzFastAPI.get_collection,  sD     &&x{8*M$H
	
  )))4rd   z FastAPI.get_or_create_collectionc           	      2    | j                  ||||d||      S )NT)r   r   r   r   r   r   r   )r   )r^   r   r   r   r   r   r   s          rc   get_or_create_collectionz FastAPI.get_or_create_collection=  s1     %%' & 
 	
rd   zFastAPI._modifyr   new_namenew_metadatanew_configurationc           	      `    | j                  dd| d| d| |||rt        |      ndd       y)zUpdates a collectionputr   r   r   N)r   r   r   r   )r   r   )r^   r   r   r   r   r   r   s          rc   _modifyzFastAPI._modifyT  sS     	x{8*M"F ,$ % &M%&  	 	
rd   zFastAPI._forkcollection_idc           
      p    | j                  dd| d| d| dd|i      }t        j                  |      }|S )zForks a collectionr   r   r   r   z/forkr   r   r   )r^   r   r   r   r   r   r   s          rc   _forkzFastAPI._forkn  sT     &&x{8*M-PUVh' ' 
	
  )))4rd   zFastAPI._get_indexing_statusc           
      p    | j                  dd| d| d| d      }t        |d   |d   |d   |d	   
      S )Nr   r   r   r   z/indexing_statusnum_indexed_opsnum_unindexed_ops	total_opsop_indexing_progress)r   r   r   r   )r   r   r^   r   r   r   r   s        rc   _get_indexing_statuszFastAPI._get_indexing_status  sb     &&x{8*M-P`a
	 %&78'(;<,!*+A!B	
 	
rd   zFastAPI._searchsearches
read_levelc           
      F   |D cg c]  }|j                          c}|d}| j                  dd| d| d| d|      }|j                  dd	      }	|	4|	D 
cg c]#  }
|
|
D cg c]  }|t        |      nd	 c}nd	% c}}
|d<   t	        |      S c c}w c c}w c c}}
w )
z&Performs hybrid search on a collection)r   r   r   r   r   r   z/searchr   	metadatasN)to_dictr   r   r/   r&   )r^   r   r   r   r   r   spayloadr   metadata_batchesr   r   s               rc   _searchzFastAPI._search  s     /777$

 &&x{8*M-PWX ' 
	 %==d;' "2&  ( %.  7?6J(2PTT
 &Ik" I&&1 8&s   BB$B:BBzFastAPI.delete_collectionc           	      :    | j                  dd| d| d|        y)zDeletes a collectionr   r   r   r   Nr   )r^   r   r   r   s       rc   delete_collectionzFastAPI.delete_collection  s+     	x{8*M$H	
rd   zFastAPI._countc           
      Z    | j                  dd| d| d| d      }t        t        |      S )z0Returns the number of embeddings in the databaser   r   r   r   z/countr   r   s        rc   _countzFastAPI._count  s?     &&x{8*M-PVW
	 C##rd   zFastAPI._peek
   nc           
      R    t        t        | j                  ||||t                    S )N)r   r   r   include)r   r$   _getr,   )r^   r   r   r   r   s        rc   _peekzFastAPI._peek  s4     II!:  	
 		
rd   zFastAPI._getidswherewhere_documentr   c
                 t   |D 
cg c]
  }
|
dk7  s	|
 }}
| j                  dd| d|	 d| d||||||d      }|j                  d	d       }||D cg c]  }|t        |      nd  }}t        |d
   |j                  dd       ||j                  dd       d |j                  dd       |      S c c}
w c c}w )Nr   r   r   r   r   z/get)r   r   r   r   r   r   r   r   r   
embeddings	documentsuris)r   r   r   r   r   r   included)r   r   r/   r$   )r^   r   r   r   r   r   r   r   r   r   ifiltered_includer   r   r   s                  rc   r   zFastAPI._get  s    (/>!!v+A>>&&x{8*M-PTU "0+ ' 
	 MM+t4	  !* 3;2F$X.DPI 
 %  }}\48mmK6vt,
 	
/ ?$s   
B0B0B5zFastAPI._deletec           
      H    | j                  dd| d| d| d|||d       y)	z$Deletes embeddings from the databaser   r   r   r   z/delete)r   r   r   r   Nr   )r^   r   r   r   r   r   r   s          rc   _deletezFastAPI._delete  sF     	x{8*M-PWX"0 	 	
 rd   zFastAPI._submit_batchbatchr   c                     d}|d   |d   D cg c]  }|t        |      nd }}|d   | j                         rt        |d         n|d   ||d   |d   d}| j                  d||	       yc c}w )
z?
        Submits a batch of embeddings to the database
        N   r            )r   r   r   r   r   r   r   )r.   supports_base64_encodingr-   r   )r^   r   r   serialized_metadatasr   r   s         rc   _submit_batchzFastAPI._submit_batch2  s       $8 !&a$ 190D"8,$N$  $ 8,,. @aIq-q!H
 	63T2$s   A.zFastAPI._addr   r   r   r   c	                     |||||f}	t        |	d| j                         i       | j                  |	d| d| dt        |       d       y)zi
        Adds a batch of embeddings to the database
        - pass in column oriented data lists
        max_batch_sizer   r   r   z/addTr(   get_max_batch_sizer  rM   )
r^   r   r   r   r   r   r   r   r   r   s
             rc   _addzFastAPI._addU  sj    $ 
 	u/1H1H1JKLx{8*M#mBTAUUYZ	
 rd   zFastAPI._updatec	                     |||nd|||f}	t        |	d| j                         i       | j                  |	d| d| dt        |       d       y)zl
        Updates a batch of embeddings in the database
        - pass in column oriented data lists
        Nr  r   r   r   z/updateTr  
r^   r   r   r   r   r   r   r   r   r   s
             rc   _updatezFastAPI._updatet  sq    $ $0Jd
 	u/1H1H1JKLx{8*M#mBTAUU\]	
 rd   zFastAPI._upsertc	                     |||||f}	t        |	d| j                         i       | j                  |	d| d| dt        |       d       y)zl
        Upserts a batch of embeddings in the database
        - pass in column oriented data lists
        r  r   r   r   z/upsertTr  r  s
             rc   _upsertzFastAPI._upsert  sj    $ 
 	u/1H1H1JKLx{8*M#mBTAUU\]	
 rd   zFastAPI._queryquery_embeddings	n_resultsc
                    |D 
cg c]
  }
|
dk7  s	|
 }}
	 | j                  dd| d|	 d| d||t        |      nd ||||d      }|j                  d	d       }|0|D cg c]#  }||D cg c]  }|t        |      nd  c}nd % }}}t	        |d
   |j                  dd       |j                  dd       ||j                  dd       |j                  dd       d |      S c c}
w c c}w c c}}w )Nr   r   r   r   r   z/query)r   r  r  r   r   r   r   r   r   	distancesr   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   r   r   r   r   r   s                   rc   _queryzFastAPI._query  sS    (/>!!v+A>>>&&x{8*M-PVW#/ %BBR$S&"0+	 ' 
	  %==d;' "2   ( %.  7?6J(2PTT
     % mmK6 }}\48&mmK6vt,	
 		
? ?, s"   
C#C#"C--C(C-(C-zFastAPI.resetc                 F    | j                  dd      }t        t        |      S )zResets the databaser   z/resetr   r   boolr   s     rc   resetzFastAPI.reset  s#     &&vx8	D)$$rd   zFastAPI.get_versionc                 F    | j                  dd      }t        t        |      S )z!Returns the version of the serverr   z/version)r   r   rM   r   s     rc   get_versionzFastAPI.get_version  s#     &&uj9	C##rd   c                     | j                   S )z"Returns the settings of the client)rK   ri   s    rc   get_settingszFastAPI.get_settings  s     ~~rd   zFastAPI.get_pre_flight_checksc                 d    | j                   | j                  dd      }|| _         | j                   S )Nr   z/pre-flight-checks)pre_flight_checksr   r   s     rc   get_pre_flight_checkszFastAPI.get_pre_flight_checks  s5    !!)**52FGI%.D"%%%rd   z FastAPI.supports_base64_encodingc                 f    | j                         }t        t        |j                  dd            }|S )Nr  F)r  r   r  r   )r^   r  b64_encoding_enableds      rc   r  z FastAPI.supports_base64_encoding  s:     !668##''(BEJ 
 $#rd   zFastAPI.get_max_batch_sizec                 f    | j                         }t        t        |j                  dd            }|S )Nr  )r  r   r   r   )r^   r  r  s      rc   r	  zFastAPI.get_max_batch_size  s4     !668c#4#8#89I2#NOrd   zFastAPI.attach_functionfunction_idinput_collection_idoutput_collectionr   r   c                     | j                  dd| d| d| d||||d      }t        | t        |d   d	         |d   d
   |d   d   |||||	      }	|j                  dd      }
|	|
fS )z"Attach a function to a collection.r   r   r   r   z/functions/attach)r   r$  r&  r   r   attached_functionr   r   function_name	clientr   r   r)  r%  r&  r   r   r   createdTr   r   r   r   )r^   r$  r   r%  r&  r   r   r   r   r(  r,  s              rc   attach_functionzFastAPI.attach_function  s     &&x{8*MBUAVVgh*%6 	 ' 	
	 -I12489./7#$78I 3/

 --t
 "7++rd   zFastAPI.get_attached_functionc                     | j                  dd| d| d| d|       }|d   }t        | t        |d         |d   |d	   ||d
   |j                  d      ||	      S )z;Get an attached function by name for a specific collection.r   r   r   r   z/functions/r(  r   r   r)  r&  r   r*  r-  )r^   r   r%  r   r   r   afs          rc   get_attached_functionzFastAPI.get_attached_function>  s     &&x{8*MBUAVVabfagh
	
 *+BtH~F_- 3 !4566(#

 
	
rd   zFastAPI.detach_functiondelete_outputc                 n    | j                  dd| d| d| d| d	d|i      }t        t        |d	         S )
z/Detach a function and prevent any further runs.r   r   r   r   z/attached_functions/z/detachr2  r   successr  )r^   r   r%  r2  r   r   r   s          rc   detach_functionzFastAPI.detach_functionZ  s^     &&x{8*MBUAVVjkojppwx ' 
	 D)I.//rd   )Y__name__
__module____qualname__r5   rF   r   r   rM   rj   rl   r   r   r   r8   r7   	OPERATIONr   r   r3   r   r   r   r   r   r
   r   r   r   r   r0   r   r2   r   r   r   r   r   r'   r  r   r   r   r   r   r   r   r   r   r    INDEX_AND_WALr	   r   r&   r   r   r   r$   r   r*   r   r"   r#   r   r   r   ALLr   r   r   r   r!   r  r
  r  r  r+   r%   r  r  r  r4   r  r  r  r	  r.  r1  r5  __classcell__)rb   s   @rc   r;   r;   C   s   (Iv (IT +WS#X%6 + + S  +C +s +d38n +QT +  %'?'I'IJ63 6  K6 +-E-O-OP %



 

 
	

  Q

 (*B*L*LM %

 
 
	
  N
 +-E-O-OP %	
	
 	
 
		
  Q	
 *,D,N,NO  $ $$	}  	
 
(	  P. )+C+M+MND# D$ D  OD &(@(J(JK.s .v .  L. -/G/Q/QRK< K  SK ,.F.P.PQ  $ $$(!}! ! 	!
 ! 
/	"!  R!2 -/G/Q/QR*<L$$69$	$  S$ -/G/Q/QR $(AE15#$(     =>	
 -.    
  S@ *,D,N,NO %(	  	
 
  P *,D,N,N  $(AE15$(

  
   =>	

 -.
 
 
 

 
& #%=%G%GH #'59EI$(

 3-
 12	

 $$AB
 
 
 

  I
0 /#;#E#EF
 %(  	
  
  G  02J2T2TU %(	

 
 	

 

  V
" #%=%G%GH
 %( ) 7 7#'#' v,#' 	#'
 #' #' 
#'  I#'J -/G/Q/QR %(	



 

 	


 


  S

 "$<$F$FG %(	$$ $ 	$
 
$  H$ /#;#E#EF $(

 
 	

 
 

  G
$ .":"D"DE "!%# $263$(,
,
 c],
 	,

 },
 ,
 !/,
 ,
 ,
 ,
 
,
  F,
\ #%=%G%GH "!%26$( c] 	
 !/   
  I* )+C+G+GH 3Z YYTN	
 3  3 
 3 I 3D .":">">? *.)-#$(  	
 I& I& tn   
  @: #%=%A%AB
 ,0)-)-#$(  Z(	
 I& I& tn   
  C: #%=%A%AB *.)-#$(  	
 I& I& tn   
  C: "$<$@$@A
 "!%26<$(5
5
 %5
 c]	5

 5
 5
 !/5
 5
 5
 5
 
5
  B5
n /#;#?#?@%t %  A%
 ')A)K)KL$S $  M$
 h   13K3U3UV&s & W& *,D,N,N$$ $$ .0H0R0RSC   T
 +-E-I-IJ ,0$($,$, $, "	$,
 $, c3h($, $, $, 
!4'	($,  K$,L 13K3O3OP
 %(

 "
 	

 
 

  Q
4 +-E-I-IJ
 $$(00 "0 	0
 0 0 
0  K0rd   r;   )Prx   loggingtypingr   r   r   r   r   r   r	   r
   uuidr   rQ   urllib.parser|   	overridesr   $chromadb.api.models.AttachedFunctionr   %chromadb.api.collection_configurationr   r   r   r   chromadbr   chromadb.api.base_http_clientr   chromadb.typesr   r   r   r   chromadb.apir   "chromadb.execution.expression.planr   chromadb.api.typesr   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   chromadb.authr0   r1   chromadb.configr2   r3   r4   r5    chromadb.telemetry.opentelemetryr6   r7   r8   chromadb.telemetry.productr9   	getLoggerr6  loggerr;   r   rd   rc   <module>rP     s      B B B      A  ! 8 J J " 5     ,  ' O N 
 >			8	$i0ni i0rd   