
    q9iGe                        d dl Z d dlmZ 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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 d dlmZ d dlmZ d d	lmZmZmZmZ d d
l m!Z!m"Z"m#Z#m$Z$ 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/m0Z1 d dl2m3Z3 d dl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF d dl4mGZGmHZHmIZI  ej                  eK      ZL G d dee      ZMy)    N)UUID)AnyMappingOptionalcastTupleSequenceDictList)override)__version__)UserIdentity)AsyncServerAPI)BaseHTTPClient)CreateCollectionConfigurationUpdateCollectionConfiguration'create_collection_configuration_to_json'update_collection_configuration_to_json)DEFAULT_DATABASEDEFAULT_TENANTSystemSettings)OpenTelemetryClientOpenTelemetryGranularitytrace_method)ProductTelemetryClient)async_to_sync)DatabaseTenant
Collection)Search)	Documents
EmbeddingsIDsIncludeSchema	MetadatasURIsWhereWhereDocument	GetResultQueryResultSearchResultCollectionMetadata%optional_embeddings_to_base64_stringsvalidate_batchconvert_np_embeddings_to_listIncludeMetadataDocuments!IncludeMetadataDocumentsDistances)"IncludeMetadataDocumentsEmbeddingsserialize_metadatadeserialize_metadatac                   t    e Zd ZU i Zeeej                  f   ed<   de	f fdZ
dqdZdrdZded	ed
eddfdZedr fd       Zdej                  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j2                        edefd              Z edej2                        eefdededdfd              Z edej2                        eefdededefd              Z edej2                        eefdededdfd              Z edej2                        eddefde e   d e e   dede!e   fd!              Z" ed"ej2                        ededdfd#              Z# ed$ej2                        edede$fd%              Z% ed&ej2                        ede&fd'              Z' ed(ej2                        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j2                        eee(fded)edefd,              Z+ ed-ej2                        edddd.ee(fded/e e,   d0e e-   d1e e.   d2e/ded)ede)fd3              Z0 ed4ej2                        eee(fdeded)ede)fd5              Z1 ed6ej2                        edddee(fded/e e,   d0e e-   d1e e.   ded)ede)fd7              Z2 ed8ej2                        edddee(fd9e3d:e e   d;e e.   d<e e4   ded)eddfd=              Z5 ed>ej2                        eee(fd?e3d:eded)ede)f
d@              Z6 edAej2                        eee(fd?e3dBe7e8   ded)ede9f
dC              Z: edDej2                        eee(fdeded)eddfdE              Z; edFej2                        eee(fd?e3ded)edefdG              Z< edHej2                        edIee(fd?e3dJeded)ede=f
dK              Z> edLej2                        eddddde?ee(fd?e3dMe e@   dNe eA   de e   d e e   dOe eB   dPeCded)ede=fdQ              ZD edRej2                        edddee(fd?e3dMe e@   dNe eA   dOe eB   ded)eddfdS              ZE edTej                        dUeGe@e eH   e eI   e eJ   e eK   f   dVedefdW       ZL edXej                        edddee(fdMe@d?e3dYeHdZe eI   d[e eJ   d\e eK   ded)ede/fd]              ZM ed^ej                        eddddee(fd?e3dMe@dYe eH   dZe eI   d[e eJ   d\e eK   ded)ede/fd_              ZN ed`ej                        edddee(fd?e3dMe@dYeHdZe eI   d[e eJ   d\e eK   ded)ede/fda              ZO edbej                        eddIddePee(fd?e3dceHdMe e@   ddedNe eA   dOe eB   dPeCded)edeQfde              ZR edfej                        ede/fdg              ZS edhej2                        edefdi              ZTedeUfdj       ZV edkej2                        defdl       ZW edmej2                        de/fdn       ZX edoej2                        edefdp              ZY xZZS )sAsyncFastAPI_clientssystemc                    t         |   |       |j                  j                  d       |j                  j                  d       | j                  t              | _        | j                  t              | _        |j                  | _        t        j                  t        |j                  j                        |j                  j                  |j                  j                  |j                  j                        | _        y )Nchroma_server_hostchroma_server_http_port)r<   r=   chroma_server_ssl_enableddefault_api_path)super__init__settingsrequirer   _opentelemetry_clientr   _product_telemetry_client	_settingsr8   resolve_urlstrr<   r=   r>   chroma_server_api_default_path_api_url)selfr:   	__class__s     c/var/www/html/leadgen/airagagent/rag_env/lib/python3.12/site-packages/chromadb/api/async_fastapi.pyrA   zAsyncFastAPI.__init__H   s      45 9:%)\\2E%F")-6L)M&$00"6??#E#EF$*OO$K$K&,oo&O&O#__KK	 1 
    returnc                 .   K   | j                          | S wN)_get_clientrK   s    rM   
__aenter__zAsyncFastAPI.__aenter__Y   s     s   Nc                    K   t        | j                        dkD  rO| j                  j                         \  }}|j                          d {    t        | j                        dkD  rNy y 7 w)Nr   )lenr9   popitemaclose)rK   _clients      rM   _cleanupzAsyncFastAPI._cleanup]   sR     $-- 1$--//1KQ--/!! $-- 1$!s   A	A-A+A-)A-exc_type	exc_value	tracebackc                 @   K   | j                          d {    y 7 wrQ   r[   )rK   r\   r]   r^   s       rM   	__aexit__zAsyncFastAPI.__aexit__b   s     mmos   c                 P     t                    t        d fd       } |        y )Nc                  B   K    j                          d {    y 7 wrQ   r`   rS   s   rM   sync_cleanupz'AsyncFastAPI.stop.<locals>.sync_cleanupi   s     --/!!s   rO   N)r@   stopr   )rK   rd   rL   s   ` rM   rf   zAsyncFastAPI.stope   s%    		" 
	" 	rN   c                    d }	 t        j                         }|j                         }|| j                  vr| j
                  j                  xs i j                         }d|d<   dt        z   dz   |d<   t        j                  d || j
                  j                  xs d| j                        | j                  |<   | j                  |   S # t        $ r d}Y w xY w)	Nr   zapplication/jsonzContent-TypezChroma Python Client vz( (https://github.com/chroma-core/chroma)z
User-AgentF)timeoutheadersverifylimits)asyncioget_event_loop__hash__RuntimeErrorr9   rF   chroma_server_headerscopyr   httpxAsyncClientchroma_server_ssl_verifyhttp_limits)rK   	loop_hashloopri   s       rM   rR   zAsyncFastAPI._get_cliento   s     		))+DI DMM)~~;;ArGGIG&8GN#(<= L! (-'8'8~~>>G%''	(DMM)$ }}Y'''  	I	s   $C	 	CCc                 H    t        | j                         j                        S rQ   )dictrR   ri   rS   s    rM   get_request_headersz AsyncFastAPI.get_request_headers   s    D$$&..//rN   c                     | j                   S rQ   )rJ   rS   s    rM   get_api_urlzAsyncFastAPI.get_api_url   s    }}rN   methodpathkwargsc                   K   d|v r9t        j                  |j                  d      t         j                        }||d<   t        j
                  j                  |dd d       }| j                  |z   } | j                         j                  ||fi t        t        |       d {   }t        j                  |       t        j                  |j                        S 7 8w)Njson)optioncontent/)safeencodingerrors)orjsondumpspopOPT_SERIALIZE_NUMPYurllibparsequoterJ   rR   requestr   r   r   _raise_chroma_errorloadstext)rK   r}   r~   r   dataescaped_pathurlresponses           rM   _make_requestzAsyncFastAPI._make_request   s      V<<

6 26;U;UVD $F9 ||))$S4PT)Umml*3))+33FCU4VCTUU**84||HMM** Vs   B#C %C&9C zAsyncFastAPI.heartbeatc                 ^   K   | j                  dd       d {   }t        |d         S 7 w)Nget znanosecond heartbeat)r   int)rK   r   s     rM   	heartbeatzAsyncFastAPI.heartbeat   s3      ++E26682344 7s   -+-zAsyncFastAPI.create_databasenametenantc                 T   K   | j                  dd| dd|i       d {    y 7 w)Npost	/tenants/
/databasesr   r   r   rK   r   r   s      rM   create_databasezAsyncFastAPI.create_database   s;        xz*$ ! 
 	
 	
s   (&(zAsyncFastAPI.get_databasec                    K   | j                  dd| d| d|i       d {   }t        |d   |d   |d         S 7 w)	Nr   r   /databases/r   paramsidr   r   r   r   )r   r   )rK   r   r   r   s       rM   get_databasezAsyncFastAPI.get_database   sf      ++x{4&1f% , 
 
 ~HV$4Xh=O
 	

s    A >A zAsyncFastAPI.delete_databasec                 P   K   | j                  dd| d|        d {    y 7 w)Ndeleter   r   r   r   s      rM   delete_databasezAsyncFastAPI.delete_database   s3        x{4&1
 	
 	
s   &$&zAsyncFastAPI.list_databaseslimitoffsetc           	         K   | j                  dd| dt        j                  ||d             d {   }|D cg c]  }t        |d   |d   |d   	       c}S 7 )c c}w w)
Nr   r   r   r   r   r   r   r   r   r   )r   r   _clean_paramsr   )rK   r   r   r   r   dbs         rM   list_databaseszAsyncFastAPI.list_databases   s      ++xz*!//"$ , 	
 	
 
 4r&z"X,G
 	
	

s    2A%AA%A A% A%zAsyncFastAPI.create_tenantc                 L   K   | j                  ddd|i       d {    y 7 w)Nr   z/tenantsr   r   r   )rK   r   s     rM   create_tenantzAsyncFastAPI.create_tenant   s2        $ ! 
 	
 	
s   $"$zAsyncFastAPI.get_tenantc                 f   K   | j                  dd|z          d {   }t        |d         S 7 w)Nr   r   r   )r   )r   r   )rK   r   	resp_jsons      rM   
get_tenantzAsyncFastAPI.get_tenant   s?      ,,$
 
	
 9V,--
s   1/1zAsyncFastAPI.get_user_identityc                 T   K   t        di | j                  dd       d {   S 7 w)Nr   z/auth/identity )r   r   rS   s    rM   get_user_identityzAsyncFastAPI.get_user_identity  s*      RT%7%7?O%PPRRPs   (&(zAsyncFastAPI.list_collectionsdatabasec           	         K   | j                  dd| d| dt        j                  ||d             d {   }|D cg c]  }t        j                  |       }}|S 7 (c c}w w)Nr   r   r   /collectionsr   r   )r   r   r   CollectionModel	from_json)rK   r   r   r   r   r   json_collectionmodelss           rM   list_collectionszAsyncFastAPI.list_collections  s      ,,x{8*LA!//"$ - 	
 	
	 OX
;JO%%o6
 
 	

s!   5A'A A' A"A'"A'zAsyncFastAPI.count_collectionsc                 p   K   | j                  dd| d| d       d {   }t        t        |      S 7 w)Nr   r   r   z/collections_countr   r   r   )rK   r   r   r   s       rM   count_collectionszAsyncFastAPI.count_collections!  sG     
 ,,x{8*4FG
 
	
 C##
s   646zAsyncFastAPI.create_collectionFschemaconfigurationmetadataget_or_createc           
         K   |rt        ||      nd}|r|j                         nd}	| j                  dd| d| d||||	|d       d{   }
t        j                  |
      }|S 7 w)zCreates a collectionNr   r   r   r   )r   r   r   r   r   r   )r   serialize_to_jsonr   r   r   )rK   r   r   r   r   r   r   r   config_jsonserialized_schemar   models               rM   create_collectionzAsyncFastAPI.create_collection-  s       4M8L 	
 ;AF446d,,x{8*LA$!,+!. - 

 

	  )))4

s   A	A)A'A)zAsyncFastAPI.get_collectionc           	         K   | j                  dd| d| d|        d {   }t        j                  |      }|S 7 w)Nr   r   r   /collections/r   r   r   )rK   r   r   r   r   r   s         rM   get_collectionzAsyncFastAPI.get_collectionO  sR      ,,x{8*M$H
 
	
  )))4
s   ?=?z%AsyncFastAPI.get_or_create_collectionc           	      N   K   | j                  ||||d||       d {   S 7 w)NT)r   r   r   r   r   r   r   )r   )rK   r   r   r   r   r   r   s          rM   get_or_create_collectionz%AsyncFastAPI.get_or_create_collection`  s?      ++' , 
 
 	
 
s   %#%zAsyncFastAPI._modifyr   new_namenew_metadatanew_configurationc           	      |   K   | j                  dd| d| d| |||rt        |      nd d       d {    y 7 w)Nputr   r   r   )r   r   r   r   )r   r   )rK   r   r   r   r   r   r   s          rM   _modifyzAsyncFastAPI._modifyw  sa        x{8*M"F ,$ % &M%&  ! 
 	
 	
s   2<:<zAsyncFastAPI._forkcollection_idc           
         K   | j                  dd| d| d| dd|i       d {   }t        j                  |      }|S 7 w)Nr   r   r   r   z/forkr   r   r   )rK   r   r   r   r   r   r   s          rM   _forkzAsyncFastAPI._fork  sb      ,,x{8*M-PUVh' - 
 
	
  )))4
s   $AAAzAsyncFastAPI._searchsearchesc           
      `  K   d|D cg c]  }|j                          c}i}| j                  d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 7 \c c}
w c c}
}	w w)
z&Performs hybrid search on a collectionr   r   r   r   r   z/searchr   N	metadatas)to_dictr   r   r6   r-   )rK   r   r   r   r   spayloadr   metadata_batchesr   r   s              rM   _searchzAsyncFastAPI._search  s      X>		>?,,x{8*M-PWX - 
 
	 %==d;' "2&  ( %.  7?6J(2PTT
 &Ik" I&&)  ?
&s?   B.B%B.B!B."B(-B#B(
B.#B((B.zAsyncFastAPI.delete_collectionc           	      V   K   | j                  dd| d| d|        d {    y 7 w)Nr   r   r   r   r   )rK   r   r   r   s       rM   delete_collectionzAsyncFastAPI.delete_collection  s9        x{8*M$H
 	
 	
s   )')zAsyncFastAPI._countc           
      v   K   | j                  dd| d| d| d       d{   }t        t        |      S 7 w)z0Returns the number of embeddings in the databaser   r   r   r   z/countNr   )rK   r   r   r   r   s        rM   _countzAsyncFastAPI._count  sM      ,,x{8*M-PVW
 
	
 C##
s    979zAsyncFastAPI._peek
   nc                 V   K   | j                  ||||t               d {   }|S 7 w)N)r   r   r   include)_getr4   )rK   r   r   r   r   resps         rM   _peekzAsyncFastAPI._peek  s;      YY6  
 
 
s   )')zAsyncFastAPI._getidswherewhere_documentr   c
                   K   |D 
cg c]
  }
|
dk7  s	|
 }}
| j                  d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 7 ~c c}w 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   r6   r+   )rK   r   r   r   r   r   r   r   r   r   ifiltered_includer   r   r   s                  rM   r   zAsyncFastAPI._get  s     (/>!!v+A>>,,x{8*M-PTU "0+ - 
 
	 MM+t4	  !* 3;2F$X.DPI 
 %  }}\48mmK6vt,
 	
- ?
s3   C
B:B:*C B?CC3ACCzAsyncFastAPI._deletec           
      d   K   | j                  dd| d| d| d|||d       d {    y 7 w)Nr   r   r   r   z/delete)r   r   r   r   r   )rK   r   r   r   r   r   r   s          rM   _deletezAsyncFastAPI._delete   sU        x{8*M-PWX O ! 
 	
 	

 	
s   &0.0zAsyncFastAPI._submit_batchbatchr   c                   K   | j                          d{   }d}|d   |d   D cg c]  }|t        |      nd }}|d   |rt        |d         n|d   ||d   |d   d}| j                  d||	       d{   S 7 jc c}w 7 w)
z?
        Submits a batch of embeddings to the database
        N   r            )r   r   r   r   r   r   r   )supports_base64_encodingr5   r/   r   )rK   r  r   r	  serialized_metadatasr   r   s          rM   _submit_batchzAsyncFastAPI._submit_batch2  s      *.)F)F)H#H #8 !&a$ 190D"8,$N$  $ 8' @aIq-q!H
 '' ( 
 
 	
' $I$
s+   B
BB
B=B
<B=B
B
zAsyncFastAPI._addr   r   r   r   c	                    K   |||||f}	t        |	d| j                          d {   i       | j                  |	d| d| dt        |       d       d {    y7 77 w)Nmax_batch_sizer   r   r   z/addTr0   get_max_batch_sizer  rH   )
rK   r   r   r   r   r   r   r   r   r  s
             rM   _addzAsyncFastAPI._addZ  s      
 	u/t7N7N7P1PQR  x{8*M#mBTAUUYZ
 	
 	
  2Q	
!   "A A1A AA A zAsyncFastAPI._updatec	                    K   |||nd |||f}	t        |	d| j                          d {   i       | j                  |	d| d| dt        |       d       d {    y7 77 w)Nr  r   r   r   z/updateTr  
rK   r   r   r   r   r   r   r   r   r  s
             rM   _updatezAsyncFastAPI._updateu  s      $0Jd
 	u/t7N7N7P1PQR  x{8*M#mBTAUU\]
 	
 	

  2Q	
s!   &A$A 1A$A"A$"A$zAsyncFastAPI._upsertc	                    K   |||||f}	t        |	d| j                          d {   i       | j                  |	d| d| dt        |       d       d {    y7 77 w)Nr  r   r   r   z/upsertTr  r  s
             rM   _upsertzAsyncFastAPI._upsert  s      
 	u/t7N7N7P1PQR  x{8*M#mBTAUU\]
 	
 	
  2Q	
r  zAsyncFastAPI._queryquery_embeddings	n_resultsc
                    K   |D 
cg c]
  }
|
dk7  s	|
 }}
| j                  dd| d|	 d| d||t        |      nd ||||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 7 c c}w c c}}w 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   r1   r   r6   r,   )rK   r   r  r   r  r   r   r   r   r   r   r   r   r   r   r   s                   rM   _queryzAsyncFastAPI._query  s^     (/>!!v+A>>,,x{8*M-PVW#/ %BBR$S&"0+	 - 
 
	 %==d;' "2   ( %.  7?6J(2PTT
     % mmK6 }}\48&mmK6vt,	
 		
; ?
$ sE   C>
C,C,7C>C1C>+C86C3C8AC>3C88C>zAsyncFastAPI.resetc                 b   K   | j                  dd       d {   }t        t        |      S 7 w)Nr   z/reset)r   r   boolrK   r   s     rM   resetzAsyncFastAPI.reset  s/      ,,VX>>	D)$$ ?   /-/zAsyncFastAPI.get_versionc                 b   K   | j                  dd       d {   }t        t        |      S 7 w)Nr   z/version)r   r   rH   r  s     rM   get_versionzAsyncFastAPI.get_version  s0      ,,UJ??	C## @r   c                     | j                   S rQ   )rF   rS   s    rM   get_settingszAsyncFastAPI.get_settings  s    ~~rN   z"AsyncFastAPI.get_pre_flight_checksc                    K   | j                   !| j                  dd       d {   }|| _         | j                   S 7 w)Nr   z/pre-flight-checks)pre_flight_checksr   r  s     rM   get_pre_flight_checksz"AsyncFastAPI.get_pre_flight_checks  sD      !!)"008LMMI%.D"%%% Ns   "><>z%AsyncFastAPI.supports_base64_encodingc                    K   | j                          d {   }t        t        |j                  dd            }|S 7 &w)Nr	  F)r'  r   r  r   )rK   r&  b64_encoding_enableds      rM   r	  z%AsyncFastAPI.supports_base64_encoding  sF      #'"<"<">>##''(BEJ 
 $#	 ?   ?='?zAsyncFastAPI.get_max_batch_sizec                    K   | j                          d {   }t        t        |j                  dd            }|S 7 &w)Nr  )r'  r   r   r   )rK   r&  r  s      rM   r  zAsyncFastAPI.get_max_batch_size  s@      #'"<"<">>c#4#8#89I2#NO ?r*  )rO   r8   re   )[__name__
__module____qualname__r9   r
   r   rr   rs   __annotations__r   rA   rT   r[   r   ra   r   rf   rR   r   rH   rz   r|   r   r   r   	OPERATIONr   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-   r   r   r   r+   r   r2   r$   r)   r*   r%   r   r  ALLr   r#   r'   r"   r(   r  r  r  r  r3   r,   r  r  r"  r   r$  r'  r	  r  __classcell__)rL   s   @rM   r8   r8   =   sH    .0Hd3)))*/
v 
""
   PT   (U.. (> 0WS#X%6 0 0 S  ++!$+04S#X+	+$ *,D,N,NO5 5  P5 02J2T2TU %	
	
 	
 
		
  V	
 -/G/Q/QR %

 
 
	
  S
 02J2T2TU %

 
 
	
  V
 /1I1S1ST  $ $$	
}
 
 	

 
(	
  U
, .0H0R0RS
 
 
  T
 +-E-O-OP.S .V .  Q. 24L4V4VWS S  XS 13K3U3UV  $ $$(}  	
  
/	"  W. 24L4V4VW*<L$$69$	$  X$ 24L4V4VW $(AE15#$(     =>	
 -.    
  X@ /1I1S1ST %(	  	
 
  U /1I1S1S  $(AE15$(

  
   =>	

 -.
 
 
 

 
& (*B*L*LM #'59EI$(

 3-
 12	

 $$AB
 
 
 

  N
. &(@(J(JK
 %(  	
  
  L (*B*L*LM
 %('' v,' 	'
 ' 
'  N'< 24L4V4VW %(		
	
 	
 		

 
	
  X	
 ')A)K)KL %(	$$ $ 	$
 
$  M$ &(@(J(JK $(  	
  
  L" %'?'I'IJ "!%# $263$(+
+
 c]+
 	+

 }+
 +
 !/+
 +
 +
 +
 
+
  K+
Z (*B*L*LM "!%26$( c] 	
 !/   
  N  .0H0L0LM%
Z YYTN	
%
 %
 
%
 N%
N %'?'C'CD *.)-#$(  	
 I& I& tn   
  E2 (*B*F*FG
 ,0)-)-#$(  Z(	
 I& I& tn   
  H6 (*B*F*FG *.)-#$(  	
 I& I& tn   
  H2 ')A)E)EF
 "!%26<$(3
3
 %3
 c]	3

 3
 3
 !/3
 3
 3
 3
 
3
  G3
j &(@(D(DE%T %  F% ,.F.P.PQ$3 $  R$ h   ,.F.P.P&S && /1I1S1S$ $$ 35M5W5WX#   YrN   r8   )Nrl   uuidr   urllib.parser   r   typingr   r   r   r   r   r	   r
   r   loggingrr   	overridesr   chromadbr   chromadb.authr   chromadb.api.async_apir   chromadb.api.base_http_clientr   %chromadb.api.collection_configurationr   r   r   r   chromadb.configr   r   r   r    chromadb.telemetry.opentelemetryr   r   r   chromadb.telemetry.productr   chromadb.utils.async_to_syncr   chromadb.typesr   r   r    r   "chromadb.execution.expression.planr!   chromadb.api.typesr"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   	getLoggerr-  loggerr8   r   rN   rM   <module>rG     s        L L L      & 1 8  O N 
 > 6 J J 5    *  
		8	$O>> OrN   