+
    7*iL  c                   sz  a  R^ tq0 t ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIHt ^ RIH	t	H
t
HtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHt ^ RIH t H!t!H"t"H#t$H%t&  ^ RIH't(  ^ RIH+t,  ^ R	I-H.t/ ]P`                  R`8  d   R
 R lt1M]P`                  Ra8  d   R R lt1MR R lt1]P`                  R`8  d   ]t2MRbR R llt2]! R4      t3]R]3,          t4]. ]3,          t5]R]33,          t6RR0t7]"0t8] ^ k ]9! ]R4      '       d   ]8Pu                  ]PD                  4       ]P`                  Rc8  d   R R lt;M^ RIH;t< R R lt;]P`                  Rc8  d   ^ RIH=t= R R lt>M^ RIH>t? R  R! lt@R" R# lt>]P`                  R`8  d   R$ R% ltAMR& R' ltA]P`                  Rd8  d   R( R) ltB],3tCM1^ RI-t-^ RItR* R+ ltB]Pz                  ]-PV                  ]-P\                  3tC]]D]3,          tE]	'       d   ^ R,IFHGtG ]]]D]3,          RR3,          tH]]D]3,          tI]]]3,          tJ]]D,          tK]]D,          tL]]M]D3,          tN]
]N,          tO]]N]3,          tP]]N]3,          tQ]]4RR3,          tR]]]]D,          ]3,          ,          tSR-tT]T'       d   ]U],          tVM]U]]]3,          tVRetWRP                  tYR]Y]"R,          3tZ] ^k ]P`                  Rc8  d   R. R/ lt[M%]P`                  R0,          Rc8X  d   R1 R2 lt[MR3 R4 lt[R5 R6 lt\R7 R8 lt]R9 R: lt^R; R< lt_R= R> lt`R? R@ ltaRA RB ltbRC RD ltcRE RF ltdRG RH lte]! RI]D4      tfRJ RK ltgRL RM lthRN RO ltiRP RQ ltjRR RS ltkRT RU ltlRV RW ltmRfRX RY lltnRZ R[ ltoR\ R] ltpR#   ]) d    ^ RIH*t(  EL1i ; i  ]) d    R_t, EL:i ; i  ]) d    R_t/ ELCi ; i)gi    N)Callable)PathLike)TYPE_CHECKINGAbstractSetAnyr    ClassVarDict
ForwardRef	GeneratorIterableListMappingNewTypeOptionalSequenceSetTupleTypeTypeVarUnion
_eval_typecastget_type_hints)	AnnotatedFinalLiteralNotRequiredRequired)_TypingBase)_Final)GenericAlias)	UnionTypec                H    V ^8  d   QhR\         R\        R\        R\        /#    type_globalnslocalnsreturnr   r   Zformat   "7/usr/lib/python3.14/site-packages/pydantic/v1/typing.py__annotate__r+   <   s(     2 2: 2 2s 2s 2    c                 s$    V P                  W4      # N)	_evaluater#   r$   r%      &&&r*   evaluate_forwardrefr1   <   s    x11r,   c                r    r!   r'   r(   r)   r*   r+   r+   A   s.     T T: T Ts Ts Tr,   c                 sT    \        \        V 4      P                  W\        4       R 7      # ))recursive_guardr   r   r.   setr/   r0   r*   r1   r1   A   s#    
 C))(SU)SSr,   c                r    r!   r'   r(   r)   r*   r+   r+   J   s.     d d: d ds ds dr,   c                 sV    \        \        V 4      P                  WR\        4       R 7      # ))type_paramsr2    r3   r/   r0   r*   r1   r1   J   s'     C))(]`]b)ccr,   c                sH    V ^8  d   QhR\         R\         R\         R\         /# )r"   objr$   r%   r&   r   r(   r)   r*   r+   r+   X   s/     K K Ks KC KSV Kr,   c                 s    \        WVR R7      # )T)Zinclude_extras)r   )r7   r$   r%   r0   r*   get_all_type_hintsr9   X   s    cWTJJr,   _T.ZAnnotatedMetaZ_AnnotatedAliasr   c                r    V ^8  d   QhR\         \        ,          R\        \         \        ,          ,          /# )r"   tr&   r   r   r   r(   r)   r*   r+   r+   q   s'     . .d3i .HT#Y$7 .r,   c                 s    \        V 4      P                  \        9   d    \        \        \
        ,          \        4      # \        V R R4      # )
__origin__N)type__name__AnnotatedTypeNamesr   r   r   r   getattr)r<      &r*   
get_originrD   q   s5    711S	9--q,--r,   )rD   c                r;   r"   tpr&   r=   r(   r)   r*   r+   r+   z   s+     	I 	ItCy 	IXd3i%8 	Ir,   c                s    \        V 4      P                  \        9   d    \        \        \
        ,          \        4      # \        V 4      ;'       g    \        V RR4      # )a  
We can't directly use `typing.get_origin` since we need a fallback to support
custom generic classes like `ConstrainedList`
It should be useless once https://github.com/cython/cython/issues/3537 is
solved and https://github.com/pydantic/pydantic/pull/1753 is merged.
r>   N)	r?   r@   rA   r   r   r   r   _typing_get_originrB   rF   rC   r*   rD   rD   z   sD     8 22S	9--!"%HH\4)HHr,   )_GenericAliasc                `    V ^8  d   QhR\         \        ,          R\        \        R3,          /# )r"   r<   r&   .r   r   r   r(   r)   r*   r+   r+      s&     * *DI *%S/ *r,   c                sb   \        V 4      P                  \        9   d   V P                  V P                  ,           # \        V \        4      '       dS   V P                  pV P                  \        J d1   V'       d)   V^ ,          \        Jd   \        VRR 4      VR,          3pV# \        V RR4      # )zCompatibility version of get_args for python 3.7.

Mostly compatible with the python 3.8 `typing` module version
and able to handle almost all use cases.
N__args__ir6   )r?   r@   rA   rL   __metadata__
isinstancerI   r>   r    ZEllipsisZlistrB   )r<   Zres   & r*   get_argsrP      s     711::..a''**C||x'CCF(4JCH~s2w/Jq*b))r,   rP   c                rJ   r"   rF   r&   .rK   r(   r)   r*   r+   r+      s&      d3i E#s(O r,   c                s    \        V R4      '       d   \        3V P                  ,          #  V \        R,          8X  g(   \        P
                  R8  d   V \        R,          8X  d   R# R#   \         d     R# i ; i)a!  
In python 3.9, `typing.Dict`, `typing.List`, ...
do have an empty `__args__` by default (instead of the generic ~T for example).
In order to still support `Dict` for example and consider it as `Dict[Any, Any]`,
we retrieve the `_nparams` value that tells us how many parameters it needs.
_nparamsr6      	   r6   )hasattrr   rS   r   sysversion_infotupleZ	TypeErrorrH   rC   r*   _generic_get_argsr\      sn     2z""6BKK''	U2Y#"2"2f"<uRy 	  			s   :A) )A87A8c                rJ   rR   rK   r(   r)   r*   r+   r+      s*     \ \T#Y \5c? \r,   c                s    \        V 4      P                  \        9   d   V P                  V P                  ,           # \        V 4      ;'       g!    \        V RR4      ;'       g    \        V 4      # )a  Get type arguments with all substitutions performed.

For unions, basic simplifications used by Union constructor are performed.
Examples::
    get_args(Dict[str, int]) == (str, int)
    get_args(int) == ()
    get_args(Union[int, Union[T, int], str][int]) == (int, str)
    get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
    get_args(Callable[[], T][int]) == ([], int)
rL   r6   )r?   r@   rA   rL   rM   _typing_get_argsrB   r\   rH   rC   r*   rP   rP      sU     8 22;;00#[[wr:r'B[[FWXZF[[r,   c                \    V ^8  d   QhR\         \        ,          R\         \        ,          /# rE   r   r   r(   r)   r*   r+   r+      s"      T#Y 49 r,   c                s    V # )zPython 3.9 and older only supports generics from `typing` module.
They convert strings to ForwardRef automatically.

Examples::
    typing.List['Hero'] == typing.List[ForwardRef('Hero')]
r6   rH   rC   r*   convert_genericsr`      s	     	r,   c                r^   rE   r_   r(   r)   r*   r+   r+      s"     & &T#Y &49 &r,   c                s<  a  \        S 4      pV'       d   \        S R4      '       g   S # \        S 4      pV\        J d)   \        \	        V^ ,          4      .VR,          O5,          # \
        ;QJ d    . V 3R lV 4       F  NK  	  5M! V 3R lV 4       4      pW28X  d   S # \        S \        4      '       d   \        W4      # \        S \        4      '       d&   \        P                  ! \        P                  V4      #  \        S RV4       S #   \         d     S # i ; i)a  
Recursively searches for `str` type hints and replaces them with ForwardRef.

Examples::
    convert_generics(list['Hero']) == list[ForwardRef('Hero')]
    convert_generics(dict['Hero', 'Team']) == dict[ForwardRef('Hero'), ForwardRef('Team')]
    convert_generics(typing.Dict['Hero', 'Team']) == typing.Dict[ForwardRef('Hero'), ForwardRef('Team')]
    convert_generics(list[str | 'Hero'] | int) == list[str | ForwardRef('Hero')] | int
rL   :   NNc              3   s   <"   T FG  p\        V\        4      '       d"   \        S\        4      '       d   \        V4      M
\	        V4      x  KI  	  R # 5ir-   )rN   strTypingGenericAliasr   r`   ).0ZargrF   s   & r*   	<genexpr>Z#convert_generics.<locals>.<genexpr>   sA      
  *#s33
2GY8Z8ZJsO`pqt`uus   AA)rD   rX   rP   r   r`   r[   rN   rc   TypesUnionType	functoolsZreduceoperatorZor_ZsetattrAttributeError)rF   originargsZ	converteds   f   r*   r`   r`      s     BWR44I| Y.tAw7C$r(CDD E 

EE 

 
	
 I.//%f88N++##HLL)<<J	2 I " Is   =D DDc                \    V ^8  d   QhR\         \        \        ,          ,          R\        /# rE   r   r   r   boolr(   r)   r*   r+   r+      s#      Xd3i( T r,   c                 s    V \         J # r-   )r   rH   rC   r*   is_unionro      s    U{r,   c                rl   rE   rm   r(   r)   r*   r+   r+     s#     4 4Xd3i( 4T 4r,   c                 sF    V \         J ;'       g    V \        P                  J # r-   )r   typesr   rH   rC   r*   ro   ro     s    U{33bEOO33r,   )
ModelFieldFc                0    V ^8  d   QhR\         R\        /# r"   r#   r&   r   rn   r(   r)   r*   r+   r+   X       # #C #D #r,   c                     V \         9   # r-   
NONE_TYPESr#   rC   r*   is_none_typerz   X      
""r,   :Nr"   Nc                rr   rs   rt   r(   r)   r*   r+   r+   ]  s     	 	C 	D 	r,   c                 sn    \          F  pWJ g   K
   R # 	  \        V 4      '       d   \        V 4      R8H  # R# )TFr-   )rx   is_literal_typeall_literal_values)r#   Z	none_typerO   r*   rz   rz   ]  s5    #I! $ 5!!%e,77r,   c                rr   rs   rt   r(   r)   r*   r+   r+   j  ru   r,   c                 rv   r-   rw   ry   rC   r*   rz   rz   j  r{   r,   c                F    V ^8  d   QhR\         \        ,          R\        /# r"   vr&   )r   r   rb   r(   r)   r*   r+   r+   n  s     - -tCy -S -r,   c           	      s   \        V \        4      '       g9   \        V \        4      '       g#   \        V \        4      '       g   V P                  p \        \        V 4      4      '       d-   R RP                  \        \        \        V 4      4      4       R2# \        V \        4      '       d   \        V 4      P                  RR4      #  V P                  #   \         d    \        T 4      P                  RR4      u # i ; i)zUnion[z, Z]ztyping.Z )rN   typing_baseWithArgsTypesr?   	__class__ro   rD   ZjoinZmapdisplay_as_typerP   rb   Zreplacer@   ri   r   rC   r*   r   r   n  s    a%%jM.J.JS]^_aeSfSfKK
1		#ox{"CDEQGG!]##1v~~i,,-zz -1v~~i,,-s   C &C<;C<c          	      s    V ^8  d   QhR\         \        \        \        ,          3,          R\        \        ,          R\         \        \        \        ,          3,          /# )r"   raw_annotationsmodule_namer&   )r   rb   r   r   r   r(   r)   r*   r+   r+     sF        c49n)=  HUXM  ^bcfhlmphqcq^r  r,   c                s   RpV'       d%    \         P                  V,          pVP                  p/ pV P	                  4        F  w  rV\        V\        4      '       dQ   R\         P                  u;8  d   R8  g   M \         P                  R	8  d   \        VRRR7      pM\        VRR7      p \         P                  R
8  d   \        WbRRR7      pM\        WbR4      p WdV&   K  	  V#   \         d     Li ; i  \         d     L(i ; i)zv
Partially taken from typing.get_type_hints.

Resolve string or ForwardRef annotations into type objects if possible.
NFT)is_argumentZis_class)r   )r5   rU   
   )rU   rV      )rU   r   ra   )rU   i   r6   )rY   modules__dict__ZKeyErrorZitemsrN   rb   rZ   r   r   Z	NameError)r   r   Zbase_globalsZmoduleZannotationsZnamevalues   &&     r*   resolve_annotationsr     s     .2L	+[[-F
 "??LK&,,.eS!!))6Y6#:J:Jj:X"5edK"5e<	7*"5"M"5= "D / -  		$  		s)   C( -#C9C9(C65C69DDc                r~   rs   r   r   rn   r(   r)   r*   r+   r+     s     > >DI >$ >r,   c                 sD    V \         J ;'       g    \        V 4      \         J # r-   )r    rD   ry   rC   r*   is_callable_typer     s    H==
5 1X ==r,   c                r~   rs   r   r(   r)   r*   r+   r+     s"     F F49 F Fr,   c                 sF    \         R J;'       d    \        V 4      \        9   # r-   )r   rD   LITERAL_TYPESry   rC   r*   r|   r|     s    $EE:e#4#EEr,   c                rJ   r"   r#   r&   .rK   r(   r)   r*   r+   r+     s&      $s) c3h r,   c                 s    \        V 4      # r-   rQ   ry   rC   r*   literal_valuesr     s    E?r,   c                rJ   r   rK   r(   r)   r*   r+   r+     s*     
K 
Kd3i 
KE#s(O 
Kr,   c                s    \        V 4      '       g   V 3# \        V 4      p\        ;QJ d    . R V 4       F  NK  	  5# ! R V 4       4      # )z
This method is used to retrieve all Literal values as
Literal can be used recursively (see https://www.python.org/dev/peps/pep-0586)
e.g. `Literal[Literal[Literal[1, 2, 3], "foo"], 5, None]`
c              3   sH   "   T F  p\        V4       F  q"x  K  	  K  	  R # 5ir-   )r}   )rd   r   xs   &  r*   re   Z%all_literal_values.<locals>.<genexpr>  s     Ju0B50I10Is    ")r|   r   r[   )r#   ZvaluesrO   r*   r}   r}     sB     5!!xE"F5JJ5J5JJJJr,   c                r~   rs   r   r(   r)   r*   r+   r+     s"     J Jc Jt Jr,   c                P    ^ RI Hp V! V \        4      ;'       d    \        V R4      # )zm
Check if a given class is a named tuple.
It can be either a `typing.NamedTuple` or `collections.namedtuple`
lenient_issubclassZ_fields)pydantic.v1.utilsr   r[   rX   r#   r   rO   r*   is_namedtupler     s#    
 5eU+IIy0IIr,   c                r~   rs   r   r(   r)   r*   r+   r+     s"     K KS	 Kd Kr,   c                r   )z
Check if a given class is a typed dict (from `typing` or `typing_extensions`)
In 3.10, there will be a public method (https://docs.python.org/3.10/library/typing.html#typing.is_typeddict)
r   Z	__total__)r   r   ZdictrX   r   rO   r*   is_typeddictr     s#    
 5eT*JJwuk/JJr,   c                rr   rs   rt   r(   r)   r*   r+   r+     s     G GC GD Gr,   c                 s2    V \         J ;'       g	    V \        J # r-   )TypedDictRequiredTypedDictNotRequiredry   rC   r*   _check_typeddict_specialr     s    %%FF2F)FFr,   c                rr   rs   rt   r(   r)   r*   r+   r+     s     Z Z Z Zr,   c                P    \        V 4      ;'       g    \        \        V 4      4      # )zF
Check if type is a TypedDict special form (Required or NotRequired).
)r   rD   ry   rC   r*   is_typeddict_specialr     s#     $E*YY.FzRWGX.YYr,   	test_typec                r~   rs   r   r(   r)   r*   r+   r+     s"     V VtCy VT Vr,   c                s^    \        V \        P                  4      ;'       d    \        V R4      # )z6
Check whether type_ was created using typing.NewType
__supertype__)rN   r   r   rX   ry   rC   r*   is_new_typer     s&     eY001UUge_6UUr,   c                r^   rs   r_   r(   r)   r*   r+   r+     s"      d3i DI r,   c                 sF    \        V R 4      '       d   V P                  p K   V # )r   )rX   r   ry   rC   r*   new_type_supertyper     s    
%
)
)##Lr,   c                rl   r   rm   r(   r)   r*   r+   r+     s'     Y YxS	* Yt Yr,   c                 sx    V f   R# V P                   \        P                   8H  ;'       d    \        V RR 4      R8H  # )NF_namer   )r   r   rB   r   rC   r*   _check_classvarr     s5    y;;(,,,XXGT1Jj1XXr,   c                rl   r   rm   r(   r)   r*   r+   r+     s'     r rxS	* rt rr,   c                s    V f   R# V P                   \        P                   8H  ;'       d,    \        P                  R8  ;'       g    \	        V RR4      R8H  # )z1
Check if a given type is a `typing.Final` type.
NFr   r   rU   r   )r   r   rY   rZ   rB   r   rC   r*   _check_finalvarr     sL     	y;;%//)qqs/?/?&/H/p/pGTUW^`dLeipLpqr,   c                r~   r"   ann_typer&   r   r(   r)   r*   r+   r+     s     	 	$s) 	 	r,   c                 s    \        V 4      '       g   \        \        V 4      4      '       d   R # V P                  \        8X  d$   V P                  P                  R4      '       d   R # R# )Tz	ClassVar[F)r   rD   r   r   Z__forward_arg__Z
startswithr   rC   r*   is_classvarr     sL    x  OJx4H$I$I Z'H,D,D,O,OP[,\,\r,   c                r~   r   r   r(   r)   r*   r+   r+     s"     N N$s) N Nr,   c                 r   r-   )r   rD   r   rC   r*   is_finalvarr     s    8$MM
88L(MMr,   c                s8    V ^8  d   QhRRR\         R\         RR/# )r"   fieldrq   r$   r%   r&   Nr8   r(   r)   r*   r+   r+     s)     7 7\ 7S 73 7SW 7r,   c                s   RpV P                   P                  \        8X  d(   Rp\        V P                   Y;'       g    R4      V n         V P                  P                  \        8X  d(   Rp\        V P                  Y;'       g    R4      V n        V'       d   V P                  4        V P                  '       d!   V P                   F  p\        WAVR7       K  	  V P                  e   V P                  4        R# R# )zU
Try to update ForwardRefs on fields based on this ModelField, globalns and localns.
FTNr$   r%   )
r#   r   r   r1   Zouter_type_prepareZ
sub_fieldsupdate_field_forward_refsZdiscriminator_keyZ&prepare_discriminated_union_sub_fields)r   r$   r%   r   Zsub_fs   &&&  r*   r   r     s     G{{
*)%++xDQ""j0/0A0A8__X\]%%E%eP & *446 +r,   c                s   V ^8  d   QhR\         \        ,          R\        R,          R\        \        \         \        ,          \
        \        3,          \        3,          RRR\        \         \        ,          R3,          R	R
/# )r"   modelfieldsrq   json_encodersr%   
DictStrAnyexc_to_suppress.r&   N)
r   r   r	   r   r   rb   r   AnyCallabler   ZBaseExceptionr(   r)   r*   r+   r+   "  sv     $8 $89$8\"$8 d3ij89;FG$8 	$8
 4.34$8 
$8r,   c                sh   V P                   \        P                  9   d;   \        P                  V P                   ,          P                  P	                  4       pM/ pVP                  V P                  V 4       V F  p \        WeVR7       K  	  \        VP                  4       4       Fj  p\        V\        4      '       d   \        V4      pM\        V\        4      '       d   TpMK@   \        YT;'       g    R4      p	TP                  T4      Y)&   Kl  	  R#   T d     K  i ; i  T d     K  i ; i)zD
Try to update model fields ForwardRefs based on model and localns.
r   N)Z
__module__rY   r   r   ZcopyZ
setdefaultr@   r   r4   ZkeysrN   rb   r   r1   Zpop)
r   r   r   r%   r   r$   ZfZkeyZfrZnew_keys
   &&&&&     r*   update_model_forward_refsr   "  s    3;;&;;u//099>>@.	%aGL  =%%'(c3'_BZ((B	)"4HG "/!2!23!7 )  		  		s*   >D)D&8D&D#"D#&D10D1c                s    V ^8  d   QhR\         \        ,          R\        R\        \         \        ,          3,          /# )r"   r#   r&   N)r   r   r   rn   r(   r)   r*   r+   r+   I  s.      T#Y 5tT#Y)>#? r,   c                s    V \         J d   R# \        V 4      f   R# \        V 4      pV'       d   \        V^ ,          \         4      '       g   R# V^ ,          # )zx
Tries to get the class of a Type[T] annotation. Returns True if Type is used
without brackets. Otherwise returns None.
TN)r?   rD   rP   rN   )r#   rk   rO   r*   	get_classr   I  sD    
 }% E?Dz$q'400Awr,   c                sF    V ^8  d   QhR\         R\        \         ,          /# rE   )r   r
   r(   r)   r*   r+   r+   [  s      c d3i r,   c                s    \        V 4      pV\        J d   \        \        V 4      ^ ,          4      # \	        V4      '       d/   \        V 4       UUu. uF  p\        V4       F  q3NK  	  K  	  upp# V .# u uppi )zr
Return all the types that are allowed by type `tp`
`tp` can be a `Union` of allowed types or an `Annotated` type
)rD   r   get_sub_typesrP   ro   )rF   rj   r<   r   s   &   r*   r   r   [  sg    
 ^FXb\!_--	&		#B<B<aq1AA1A<BBt Cs   A3c                s    V ^8  d   Qh/ ^ \         9   d   \        \        ,          ;R&   ^\         9   d    \        \        \        \        3,          ;R&   # )r"   r   rx   )__conditional_annotations__r   r   r   r(   r)   r*   r+   r+      s@      R $ #s3x #S Z
 C BE#sC-  B[
 r,   r6   rT   )rU   i   i   )NNr   r   )'r   NoArgAnyCallableNoneTyperz   r   r   r   r|   r}   r   r   r   r   r   r   r   r   r   TupleGeneratorr   DictAnySetStrListStrIntStrAbstractSetIntStrDictIntStrAnyCallableGeneratorReprArgsAnyClassMethodr   r   rP   rD   r   r   r9   ro   StrPathMappingIntStrAnyrW   )rr   rg   rh   rY   ZtypingZcollections.abcr    Zosr   r   r   r   ZTypingCallabler   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   Ztyping_extensionsr   r   r   r   r   r   r   r   r   ZImportErrorr   r   rc   rp   r   rf   rZ   r1   r9   r:   r   r   ZAnyArgTCallablerA   r   rX   ZaddrD   rG   rI   rP   r]   r\   r`   ro   r   rb   r   Zpydantic.v1.fieldsrq   r   r   r   r   r   Zintr   r   r   r   r   r   ZMYPYZclassmethodr   Z__all__r   r   rx   rz   r   r   r   r|   r   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r+   )r   s   @r*   <module>r      s      
  $      2 -19
1 f2 	
"Td f (K T]S#X&!"c'*  !b)
 &'89  #) #
69fnn% f. 8	I f$*  4(\" f&R g ()M 4 ))5+=+=uOM X
 -uS#Xd:;Nc3hJ38nGXF3iG38_F#F+%Mvs{+!+tT"9:hsmS012HD$S) %S#s]3(V >> %)(GDM#B
 B f# 	bV#	#-$ F>F
KJKGZ K%	VYr	N7,$8N$c  -,,-
    Ns6   "N	 )N 0N- 	NN	N*)N*-	N:9N: