
    >'h_a                       U d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m	Z	m
Z
 ddlmZmZmZmZ ddlmZmZ 	 ddl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 m!Z!m"Z"m#Z#m$Z$  ejJ                  e&      Z'dZ( ejR                  e( d      Z*e*jW                  d      Z, ejR                  e( d      Z- ejR                  e( d      Z. ejR                  e( d      Z/ ejR                  d      Z0 ed e1             Z2da3de4d<    ejj                         Z6ddZ7 G d dejp                        Z9 G d d      Z:ddZ;	 	 	 	 	 	 ddZ<ddgZ=y# e$ r ddlmZmZ Y w xY w)zSchemas for the LangSmith API.    )annotationsN)MappingSequence)datetimetimezone)AnyOptionalUnioncast)UUIDuuid4)Fieldroot_validator)schemas)utils)ID_TYPE
RUN_TYPE_TClient_dumps_json_ensure_uuidz
langsmith-traceutf-8metadatatagsproject__omit_auto_outputsOptional[Client]_CLIENTc                 <    t         t         t        di | a t         S )N )r   r   )init_kwargss    Z/home/kushmeetdev/Regenta/Chatbot/venv/lib/python3.12/site-packages/langsmith/run_trees.pyget_cached_clientr#   -   s    ?+{+GN    c                      e Zd ZU dZded<    ee      Zded<    ed      Zded	<    ed
       Z	ded<    edd      Z
ded<    edd      Zded<    eeddhi      Zded<    ed d      Zded<    edd      Zded <    ee      Zd!ed"<    ee      Zd#ed$<    ee      Zd%ed&<   	  edd      Zd'ed(<    ed)d*+      Zded,<    ed)d-+      Zded.<    ed/d0+      Zd1ed2<    G d3 d4      Z ed5      dPd6       Z ed/5      dPd7       ZedQd8       ZedRd9       Z fd:Ze e e e d;	 	 	 	 	 	 	 	 	 dSd<Z!dTd=Z"dUd>Z#dVd?Z$dWd@Z%	 	 	 	 dXdAZ&ddddddB	 	 	 	 	 	 	 	 	 	 	 dYdCZ'	 dZddddddddddddD	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d[dEZ(dF Z)d\d]dGZ*d^dHZ+d^dIZ,d_dJZ-e.	 	 	 	 	 	 d`dK       Z/e.	 	 	 	 	 	 dadL       Z0e.	 	 	 	 	 	 dbdM       Z1dcdNZ2dO Z3 xZ4S )dRunTreez1Run Schema with back-references for posting runs.strname)default_factoryr   idchain)defaultrun_typec                 H    t        j                  t        j                        S N)r   nowr   utcr    r$   r"   <lambda>zRunTree.<lambda>;   s    hll9S r$   r   
start_timeNT)r,   excludeOptional[RunTree]
parent_runOptional[str]parent_dotted_order__all__parent_run_id)r)   r4   zlist[RunTree]
child_runsc                 2    t        j                         xs dS )Nr,   )r   get_tracer_projectr    r$   r"   r2   zRunTree.<lambda>D   s     8 8 : Gi r$   project_name)r)   aliassession_name
project_id)r,   r?   Optional[UUID]
session_iddictextraOptional[list[str]]r   z
list[dict]eventszOptional[Any]	ls_client z!The order of the run in the tree.)r,   descriptiondotted_orderzThe trace id of the run.trace_idFz3Whether to allow filesystem access for attachments.zOptional[bool]dangerously_allow_filesystemc                      e Zd ZdZdZdZdZy)RunTree.ConfigzPydantic model configuration.TignoreN)__name__
__module____qualname____doc__arbitrary_types_allowedallow_population_by_field_namerE   r    r$   r"   ConfigrO   V   s    +"&)-&r$   rW   )prec                   |j                  d      9|j                  d      (d|d   v r|d   d   |d<   nd|d   v r|d   d   d   |d<   |j                  d      d|d<   d|v r|j                  d      |d<   nd	|v r|j                  d	      |d<   |j                  d      sd|d<   |j                  d
d      }||j                  |d<   |j                  |d<   d|vrt	               |d<   d|vr||j
                  |d<   n|d   |d<   t        t        |j                  di              |j                  d      g |d<   |j                  d      g |d<   |j                  d      i |d<   |j                  d      i |d<   |S )zAssign name to the run.r(   N
serializedr*   UnnamedclientrH   _clientr6   r:   r8   rL   rE   rG   r   outputsattachments)	getpopr*   rK   r   rL   r   rD   
setdefault)clsvaluesr6   s      r"   infer_defaultszRunTree.infer_defaults]   s    ::f%&**\*B*N--!'!5f!=v--!'!5d!;B!?v::f%&F6Nv"(**X"6F;& "(**Y"7F;zz+&"&F;ZZd3
!&0mmF?#,6,C,CF()v 7F4LV#%%/%8%8z"%+D\z"T6$$Wb12::h'!F8::f%F6N::i ( "F9::m$,$&F=!r$   c                    |j                  d      }|r|j                         r|S t        |d   |d         }|j                  d      }||dz   |z   |d<   |S ||d<   |S )z#Ensure the dotted order of the run.rK   r3   r*   r8   .)ra   strip_create_current_dotted_order)rd   re   current_dotted_orderr8   s       r"   ensure_dotted_orderzRunTree.ensure_dotted_order   s      &zz.9$8$>$>$@M;< &, 
 %jj)>?*%83%>AU%UF>"  &:F>"r$   c                P    | j                   t               | _         | j                   S )zReturn the client.)rH   r#   selfs    r"   r]   zRunTree.client   s"    
 >>!.0DN~~r$   c                    | j                   S r/   )rH   rn   s    r"   r^   zRunTree._client   s     ~~r$   c                >    |dk(  r|| _         yt        | 	  ||      S )zSet the _client specially.r^   N)rH   super__setattr__)ro   r(   value	__class__s      r"   rs   zRunTree.__setattr__   s&     9"DN7&tU33r$   )inputsr_   r   r   c               p   |t         urt        |      | _        |t         ur/| j                  j	                  di       j                  |xs i        |t         ur)d| j                  d<   |i | _        nt        |      | _        |t         ur.d| j                  t        <   |i | _	        yt        |      | _	        yy)aZ  Set the inputs, outputs, tags, and metadata of the run.

        If performed, this will override the default behavior of the
        end() method to ignore new outputs (that would otherwise be added)
        by the @traceable decorator.

        If your LangChain or LangGraph versions are sufficiently up-to-date,
        this will also override the default behavior LangChainTracer.

        Args:
            inputs: The inputs to set.
            outputs: The outputs to set.
            tags: The tags to set.
            metadata: The metadata to set.

        Returns:
            None
        r   Finputs_is_truthyNT)
NOT_PROVIDEDlistr   rE   rc   updaterv   rD   OVERRIDE_OUTPUTSr_   )ro   rv   r_   r   r   s        r"   setzRunTree.set   s    4 |#T
DI<'JJ!!*b188RH% .3DJJ)*~ "6l,&+/DJJ'(!#G} 'r$   c                    t        |t              r|g}| j                  g | _        | j                  j                  |       y)zAdd tags to the run.N)
isinstancer'   r   extend)ro   r   s     r"   add_tagszRunTree.add_tags   s6    dC 6D99DI		r$   c                    | j                   i | _         t        t        | j                         j                  di       }|j	                  |       y)zAdd metadata to the run.Nr   )rE   r   rD   rc   r{   )ro   r   	metadata_s      r"   add_metadatazRunTree.add_metadata   s>    ::DJtTZZ0;;JK	"r$   c                `    | j                   i | _         | j                   j                  |       y)Upsert the given outputs into the run.

        Args:
            outputs (Dict[str, Any]): A dictionary containing the outputs to be added.

        Returns:
            None
        N)r_   r{   )ro   r_   s     r"   add_outputszRunTree.add_outputs   s'     <<DLG$r$   c                ~    | j                   i | _         | j                   j                  |       d| j                  d<   y)r   NFrx   )rv   r{   rE   )ro   rv   s     r"   
add_inputszRunTree.add_inputs   s8     ;;DK6" */

%&r$   c                v   | j                   g | _         t        |t              r| j                   j                  |       yt        |t              rO| j                   j                  dt        j                  t        j                        j                         |d       y| j                   j                  |       y)a~  Add an event to the list of events.

        Args:
            events (Union[ls_schemas.RunEvent, Sequence[ls_schemas.RunEvent],
                    Sequence[dict], dict, str]):
                The event(s) to be added. It can be a single event, a sequence
                of events, a sequence of dictionaries, a dictionary, or a string.

        Returns:
            None
        Neventr(   timemessage)rG   r   rD   appendr'   r   r0   r   r1   	isoformatr   )ro   rG   s     r"   	add_eventzRunTree.add_event  s    * ;;DKfd#KKv&$KK#$LL6@@B% KKv&r$   )r_   errorend_timerG   r   c               \   |xs# t        j                  t        j                        | _        | j
                  j                  t              s1|/| j                  s|| _        n| j                  j                  |       ||| _
        || j                  |       || j                  |       yy)z/Set the end time of the run and all child runs.N)r   r0   r   r1   r   rE   ra   r|   r_   r{   r   r   r   )ro   r_   r   r   rG   r   s         r"   endzRunTree.end&  s     !>HLL$> zz~~./"||#*DLLL''0DJNN6"h'  r$   )run_idrZ   rv   r_   r   reference_example_idr3   r   r   rE   r`   c               |   |xs d|i}t        di d|dt        |      d|d|xs i d|xs i d|d|d|d	|	xs# t        j                  t        j
                        d
|
d|xs i d| d| j                  d| j                  d|d|xs i d| j                  }| j                  j                  |       |S )z Add a child run to the run tree.r(   r*   rZ   rv   r_   r   r-   r   r3   r   rE   r6   r>   rH   r   r`   rM   r    )r&   r   r   r0   r   r1   r@   rH   rM   r;   r   )ro   r(   r-   r   rZ   rv   r_   r   r   r3   r   r   rE   r`   serialized_runs                   r"   create_childzRunTree.create_child@  s   $ !2VTN 

F#
 #
 <R	

 Mr
 
 
 "6
 "?X\\(,,%?
 
 +2
 
 **
 nn
 
  $)r!
" *.)J)J#
& 	s#
r$   c                    | j                  h dd      }| j                  | j                  j                         |d<   | j                  | j                  j                         |d<   |S )N>   rv   r_   r;   T)r4   exclude_nonerv   r_   )rD   rv   copyr_   )ro   	self_dicts     r"   _get_dicts_safezRunTree._get_dicts_safei  sd    II7d  
	 ;;""&++"2"2"4Ih<<##'<<#4#4#6Ii r$   c                   | j                         } | j                  j                  di | |j                  d      x}ro|D cg c]  }t	        |       }}| j
                  j                  dt        j                  t        j                        j                         t        |      d       |s$| j                  D ]  }|j                  d        yyc c}w )z,Post the run tree to the API asynchronously.r`   uploaded_attachmentr   F)exclude_child_runsNr    )r   r]   
create_runra   r'   rG   r   r   r0   r   r1   r   r}   r;   post)ro   r   kwargsr`   r(   keys	child_runs          r"   r   zRunTree.postv  s    %%'(( **]33;3*56$CI6D6KK1$LL6@@B"4y "!__ 9	%89 " 7s   Cc                   | j                   s| j                          | j                  j                         D ci c]  \  }}t	        |t
              s|| }}}	 |rIt        d | j                  D        d      }|r*|j                         D ci c]  \  }}||d   vr|| }}}| j                  j                  | j                  | j                  | j                  r| j                  j!                         nd| j"                  r| j"                  j!                         nd| j$                  | j&                  | j(                  | j*                  | j                   | j,                  | j.                  | j                  | j0                  | j2                  |       yc c}}w c c}}w # t        $ r#}t        j                  d|        Y d}~"d}~ww xY w)z5Patch the run tree to the API in a background thread.c              3  H   K   | ]  }|j                  d       dk(  r|  yw)r(   r   N)ra   ).0evs     r"   	<genexpr>z RunTree.patch.<locals>.<genexpr>  s)      66&>-BB s    "Nr   z'Error filtering attachments to upload: )r(   r   rv   r_   r   r:   r@   r   r   rK   rL   rG   r   rE   r`   )r   r   r`   itemsr   tuplenextrG   	Exceptionloggerwarningr]   
update_runr(   r*   rv   r   r_   r   r:   r@   r   rK   rL   r   rE   )ro   avr`   uploadedes         r"   patchzRunTree.patch  s   }}HHJ!--335
QAu9MAqD
 
	J"&++
   %0$5$5$7# AqHY$77 1#K # 	77)-4;;##%$+/<<DLL%%'T**,,**!%!:!:]]**]];;**# 	 	
-
#
  	JNNDQCHII	Js5   FF4F" F$F" F" "	G+G		Gc                     y)z"Wait for all _futures to complete.Nr    rn   s    r"   waitzRunTree.wait  s    r$   c                :    | j                   j                  |       S )zReturn the URL of the run.)r   )r]   get_run_urlrn   s    r"   get_urlzRunTree.get_url  s    {{&&4&00r$   c                T    t         |i}t        t         | j                  |fi |      S )zwCreate a new 'child' span from the provided dotted order.

        Returns:
            RunTree: The new span.
        )LANGSMITH_DOTTED_ORDERr   r&   from_headers)rd   rK   r   headerss       r"   from_dotted_orderzRunTree.from_dotted_order  s2     #L
 G-S--g@@AAr$   c           	        	 ddl m}m} ddlm}m} ddlm |% |t        |t              rt        ||      nd      }nt        ||      }|j                  d      x}	rt        |	||f      r|	j                  rt        fd|	j                  D        d      x}
r|
j                   j                  t#        |	j                              x}r|j$                  r|j$                  }|j&                  |d	<   |j(                  |d
<   |j*                  |d<   |j,                  |d<   |j.                  |d<   t1        t3        |j4                  xs g |j                  dg       z               |d<   |j6                  |d<   |j9                  di       }|j9                  di       }|j;                  |j<                         nBt?        |
d      r5|	j                  |
j@                  v r|
j@                  |	j                     d   }ny|
jB                  |d<   |
jD                  |d<   tG        jH                  |fi |S y# t        $ r}t        d      |d}~ww xY w)zCreate a new 'child' span from the provided runnable config.

        Requires langchain to be installed.

        Returns:
            Optional[RunTree]: The new span or None if
                no parent span information is found.
        r   )AsyncCallbackManagerCallbackManager)RunnableConfigensure_config)LangChainTracerz{RunTree.from_runnable_config requires langchain-core to be installed. You can install it with `pip install langchain-core`.N	callbacksc              3  <   K   | ]  }t        |      s|  y wr/   )r   )r   tr   s     r"   r   z/RunTree.from_runnable_config.<locals>.<genexpr>  s     N1z!_/MQNs   r-   rv   r_   r3   r   r   r(   rE   r   	order_map   r]   r>   )% langchain_core.callbacks.managerr   r   langchain_core.runnablesr   r    langchain_core.tracers.langchainr   ImportErrorr   rD   r   ra   r:   r   handlersrun_mapr'   rK   r-   rv   r_   r3   r   sortedr}   r   r(   rc   r{   r   hasattrr   r]   r>   r&   r   )rd   configr   r   r   r   r   r   config_cbtracerr   rK   extra_r   r   s                  @r"   from_runnable_configzRunTree.from_runnable_config  s)   	 OH >#0:640H^V,dG >62G ;;{++R+21EFG  NN   ~~))#b.>.>*?@@@cFVFV"//%(\\z"#&::x $'KKy!'*~~|$%(\\z"!'CHH,SVZZPR=S8S(T!Uv!$v**7B7"--j"=	  .-"2B2BfFVFV2V%//0@0@A!D%}}F8%+%8%8F>",,\DVDDU  	H 	s   H/ /	I	8II	c           	        |j                         }t        t        t           |j	                  t
                    }|s>t        t        t           |j	                  t                    }|sy|j                  d      }|j                         }t        |      }|d   d   }||d<   |d   d   |d<   ||d<   t        |      d	k\  r|d
   d   |d<   |j	                  d      xs# t        j                  t        j                        |d<   |j	                  d      xs d|d<   |j	                  d      xs d|d<   t         j#                  |      }	|	j$                  s|	j&                  r|j)                  di       |d<   |d   j)                  di       |d   d<   i |	j$                  |d   d   }
|
|d   d<   t+        t-        |	j&                  |j	                  dg       z               }||d<   |	j.                  r|	j.                  |d<   t1        di |S )a  Create a new 'parent' span from the provided headers.

        Extracts parent span information from the headers and creates a new span.
        Metadata and tags are extracted from the baggage header.
        The dotted order and trace id are extracted from the trace header.

        Returns:
            Optional[RunTree]: The new span or None if
                no parent span information is found.
        Nr   r   r   rL   r[   r*   rK      r:   r3   r-   r+   r(   parentrE   r   r   r>   r    )r   r   r	   r'   ra   r   bytesLANGSMITH_DOTTED_ORDER_BYTESdecoderi   _parse_dotted_orderlenr   r0   r   r1   _Baggager   r   r   rc   r   r}   r>   r&   )rd   r   r   	init_argslangsmith_tracelangsmith_trace_bytesr8   parsed_dotted_orderrL   baggager   r   s               r"   r   zRunTree.from_headers  s    KKM	x}gkk:P.QR$(-I!J%! )3::7CO-33512EF&q)!, (	*-b1!4	$$7	.!"#q()<R)@)CIo& #,--"= #
LLB
	, !*j 9 DW	*%MM&1=X	&''0w||!*!5!5gr!BIg-6w-?-J-JB.Igz* N'**Mi.@.LMH-5Igz*#gllY]]62-FFGHD $If##,3,@,@	.)###r$   c                    i }| j                   r| j                  |t         <   t        | j                  j                  di       | j                  | j                        }|j                         |d<   |S )z.Return the RunTree as a dictionary of headers.r   r   r   r>   r   )	rL   rK   r   r   rE   ra   r   r@   	to_header)ro   r   r   s      r"   
to_headerszRunTree.to_headersE  sh    ==373D3DG-.0ZZ^^J3**

 %..0	r$   c           	     p    d| j                    d| j                   d| j                   d| j                   d	S )z5Return a string representation of the RunTree object.zRunTree(id=z, name='z', run_type='z', dotted_order='z'))r*   r(   r-   rK   rn   s    r"   __repr__zRunTree.__repr__R  sB     $''(499+ 6'89J9J8K2O	
r$   )re   rD   returnrD   )r   r   )r   r   )
rv   Optional[Mapping[str, Any]]r_   r   r   zOptional[Sequence[str]]r   r   r   None)r   zUnion[Sequence[str], str]r   r   )r   dict[str, Any]r   r   )r_   r   r   r   )rv   r   r   r   )rG   zTUnion[ls_schemas.RunEvent, Sequence[ls_schemas.RunEvent], Sequence[dict], dict, str]r   r   )r_   Optional[dict]r   r7   r   Optional[datetime]rG   z'Optional[Sequence[ls_schemas.RunEvent]]r   zOptional[dict[str, Any]]r   r   )r+   )r(   r'   r-   r   r   zOptional[ID_TYPE]rZ   r   rv   r   r_   r   r   r7   r   rB   r3   r   r   r   r   rF   rE   r   r`   z Optional[ls_schemas.Attachments]r   r&   )T)r   boolr   r   )r   r   r   r'   )rK   r'   r   r   r   r&   )r   r   r   r   r   r5   )r   z-Mapping[Union[str, bytes], Union[str, bytes]]r   r   r   r5   )r   zdict[str, str])5rQ   rR   rS   rT   __annotations__r   r   r*   r-   r3   r6   r8   rz   r;   r@   rC   rD   rE   r   rG   rH   rK   rL   rM   rW   r   rf   rl   propertyr]   r^   rs   ry   r}   r   r   r   r   r   r   r   r   r   r   r   r   classmethodr   r   r   r   r   __classcell__)ru   s   @r"   r&   r&   5   s   ;
IU+B+'*Hc* 1STJT$)$$EJ!E).tT)JJ %_-.!J  GL#  "'t<!HJH-E4- %d ;D
;t4FJ4$T4@I}@ CL#  23MNHdN38#X4 .   # #J      4 /;/;(40<+- ,+- -	+-
 &+- .+- 
+-Z#%/ "'
"' 
"'N #'#'+:>-1(  ( 	(
 %( 8( +( 
(:  ''
 %)%)!%"&#/3)-'+$( $8<'' '
 "' #' '  ' ' -' '' %' "' ' 6'  
!'R9"*
X1 BB B 
	B B >> > 
	> >@ 6$C6$OR6$	6$ 6$p
r$   r&   c                  V    e Zd ZdZ	 	 	 d	 	 	 	 	 ddZed	d       Zed
d       ZddZy)r   zBaggage header information.Nc                >    |xs i | _         |xs g | _        || _        y)zInitialize the Baggage object.Nr   )ro   r   r   r>   s       r"   __init__z_Baggage.__init__]  s"     !BJB	(r$   c                &   |s |        S i }g }d}	 |j                  d      D ]  }|j                  dd      \  }}|t        k(  r3t        j                  t        j
                  j                  |            }T|t        k(  r/t        j
                  j                  |      j                  d      }|t        k(  st        j
                  j                  |      } 	  | |||      S # t        $ r"}t        j                  d|        Y d}~1d}~ww xY w)z4Create a Baggage object from the given header value.N,=r   zError parsing baggage header: r   )splitLANGSMITH_METADATAjsonloadsurllibparseunquoteLANGSMITH_TAGSLANGSMITH_PROJECTr   r   r   )	rd   header_valuer   r   r>   itemkeyrt   r   s	            r"   from_headerz_Baggage.from_headerh  s     5L
	A$**3/ ?!ZZQ/
U,,#zz&,,*>*>u*EFHN*!<<//6<<SAD--#)<<#7#7#>L? H4lKK  	ANN;A3?@@	As   B&C% 8!C% %	D.DDc                    d|v r| j                  |d         S d|v r1| j                  t        t        |d         j                  d            S | j                  d       S )Nr   s   baggager   )r  r   r   r   )rd   r   s     r"   r   z_Baggage.from_headers~  s[    ??79#5667"??4wz/B#C#J#J7#STT??4((r$   c                .   g }| j                   rLt        | j                         }|j                  t         dt        j
                  j                  |              | j                  rRdj                  | j                        }|j                  t         dt        j
                  j                  |              | j                  rA|j                  t         dt        j
                  j                  | j                                dj                  |      S )z,Return the Baggage object as a header value.z	metadata=r  ztags=zproject=)
r   r   r   LANGSMITH_PREFIXr  r	  quoter   joinr>   )ro   r   serialized_metadataserialized_tagss       r"   r   z_Baggage.to_header  s    =="-dmm"<LL#$Ifll.@.@AT.U-VW 99!hhtyy1OLL#$E&,,*<*<_*M)NO LL#$HV\\-?-?@Q@Q-R,ST xxr$   )NNN)r   zOptional[dict[str, str]]r   rF   r>   r7   )r  r7   r   r   )r   zMapping[Union[str, bytes], Any]r   r   r   )	rQ   rR   rS   rT   r   r   r  r   r   r    r$   r"   r   r   Z  s`    % .2$(&*		)*	) "	) $		) L L* ) )r$   r   c           	         | j                  d      }|D cg c])  }t        j                  |dd d      t        |dd       f+ c}S c c}w )zParse the dotted order string.rh   Ni%Y%m%dT%H%M%S%fZ)r  r   strptimer   )rK   partsparts      r"   r   r     sX    s#E  
		4:'9	:Dcd<LM  s   .Ac                    | xs# t        j                  t        j                        }|xs
 t	               }|j                  d      t        |      z   S )z Create the current dotted order.r  )r   r0   r   r1   r   strftimer'   )r3   r   stid_s       r"   rj   rj     s@     
	1x||HLL1B

EGC;;)*SX55r$   )r!   r   r   r   )rK   r'   r   zlist[tuple[datetime, UUID]])r3   r   r   rB   r   r'   )>rT   
__future__r   r  loggingsyscollections.abcr   r   r   r   typingr   r	   r
   r   uuidr   r   pydantic.v1r   r   r   pydantic	threadingurllib.parser  	langsmithr   
ls_schemasr   langsmith.clientr   r   r   r   r   	getLoggerrQ   r   r  internr   encoder   r  r  r  r|   objectry   r   r   Lock_LOCKr#   RunBaser&   r   r   rj   r9   r    r$   r"   <module>r5     sw   $ "   
 - ' - - 1   +  S S			8	$ #'7&8$>? 5<<WE SZZ#3"4H => /056CJJ"2!37;< 3::34 D&(# 	  	b
j   b
J> >B6"6,:66 i
 }   s   E EE