
    hh=j                       U d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
mZ d dlZd dlmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZmZmZmZmZmZ d dl m!Z! erd d	l"m#Z#m$Z$m%Z% d d
l&m'Z' d dl(m)Z* d dl+m,Z, d dl-m.Z.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7m8Z8m9Z9 d dl:m;Z; d dl<m=Z=m>Z>m?Z?m@Z@  e
de3          ZAe?ZBdeCd<   e?ZDdeCd<   eeeEgef         ZFdeCd<   eEZGdeCd<   ejH        ejI        ejJ        hZKdZL ejM        eLejN                  ZOdZP ejM        ePejN                  ZQdZR ejM        eRejN                  ZSdZT ejM        eTejN                  ZUe	d         ZVdeCd <   d!d"d#ZWd$d%d&d'd(d)d*d+d,d-d.
ZXd/eCd0<   ejH        Y                                ZZ	 dd5Z[dd;Z\dd@Z]ddCZ^ ej_        dDE          ddJ            Z`ddMZa	 dddPZbddRZcdSdTddVZdejH        Y                                dWk    rddZZendd[Zedd]ZfddaZg ej_        dDE          ddc            Zheji        jj        Zjejjk        ddejjl        deiZmdfeCdg<   ejjn        dhdidjdkejjo        dldmdndkejjp        dodpdqdkejjq        drdsdtdkejjr        dudvdwdkejjs        dxdydzdkejjt        d{d|d}dkejju        d~dddkejjv        ddddkejjw        ddddkejjx        ddd4dkiZydeCd<   ejjz        fZ{ddZ|ddZ}ddZ~ej        dfej        dfej        efej        dfej        efej        dfej        efej        efej        efd	ZdeCd<   ddZeeeddZdeCd<   ddZddZddZddZ G d ded7ef                   ZdS )    )annotationsN)TYPE_CHECKINGAnyCallableLiteralTypeVarcast)EagerSeriesNamespace)MS_PER_SECONDNS_PER_MICROSECONDNS_PER_MILLISECONDNS_PER_SECONDSECONDS_PER_DAYUS_PER_SECOND)issue_warning)ImplementationVersion_DeferredIterablecheck_columns_existisinstance_or_issubclassrequires)
ShapeError)IterableIteratorMapping)
ModuleType)DtypeBaseMaskedDtype)	TypeAliasTypeIs)IntervalUnit)PandasLikeExprPandasLikeSeries)NativeDataFrameTNativeNDFrameTNativeSeriesT)DType)DTypeBackend	IntoDTypeTimeUnit_1DArrayExprT)boundr    UnitCurrent
UnitTargetBinOpBroadcastIntoRhsa  ^
    datetime64\[
        (?P<time_unit>s|ms|us|ns)                 # Match time unit: s, ms, us, or ns
        (?:,                                      # Begin non-capturing group for optional timezone
            \s*                                   # Optional whitespace after comma
            (?P<time_zone>                        # Start named group for timezone
                [a-zA-Z\/]+                       # Match timezone name, e.g., UTC, America/New_York
                (?:[+-]\d{2}:\d{2})?              # Optional offset in format +HH:MM or -HH:MM
                |                                 # OR
                pytz\.FixedOffset\(\d+\)          # Match pytz.FixedOffset with integer offset in parentheses
            )                                     # End time_zone group
        )?                                        # End optional timezone group
    \]                                            # Closing bracket for datetime64
$a  ^
    timestamp\[
        (?P<time_unit>s|ms|us|ns)                 # Match time unit: s, ms, us, or ns
        (?:,                                      # Begin non-capturing group for optional timezone
            \s?tz=                                # Match "tz=" prefix
            (?P<time_zone>                        # Start named group for timezone
                [a-zA-Z\/]*                       # Match timezone name (e.g., UTC, America/New_York)
                (?:                               # Begin optional non-capturing group for offset
                    [+-]\d{2}:\d{2}               # Match offset in format +HH:MM or -HH:MM
                )?                                # End optional offset group
            )                                     # End time_zone group
        )?                                        # End optional timezone group
    \]                                            # Closing bracket for timestamp
    \[pyarrow\]                                   # Literal string "[pyarrow]"
$z^
    timedelta64\[
        (?P<time_unit>s|ms|us|ns)                 # Match time unit: s, ms, us, or ns
    \]                                            # Closing bracket for timedelta64
$a  ^
    duration\[
        (?P<time_unit>s|ms|us|ns)                 # Match time unit: s, ms, us, or ns
    \]                                            # Closing bracket for duration
    \[pyarrow\]                                   # Literal string "[pyarrow]"
$)yearquartermonthweekdayhourminutesecondmillisecondmicrosecond
nanosecondNativeIntervalUnitDmin)dmr4   r5   r6   r8   r9   r:   r;   r<   r=   r>   )
yqmorB   hrC   smsusnsz)Mapping[IntervalUnit, NativeIntervalUnit]
UNITS_DICTimplementationr   returnboolc                6    | t           j        t           j        hv S N)r   PANDASMODINrM   s    R/var/www/histauto/venv/lib/python3.11/site-packages/narwhals/_pandas_like/utils.pyis_pandas_or_modinrV      s    n3^5IJJJ    lhsr%   rhsPandasLikeSeries | object7tuple[pd.Series[Any] | object, pd.Series[Any] | object]c                   ddl m} | j        j        }| j        r0t          ||          r |j        s| j        j        d         |j        fS t          ||          r_|j        r| j        |j        j        d         fS |j        j        |ur#| j        t          |j        ||j                  fS | j        |j        fS t          |t                    rd}t          |          | j        |fS )zValidate RHS of binary operation.

    If the comparison isn't supported, return `NotImplemented` so that the
    "right-hand-side" operation (e.g. `__radd__`) can be tried.
    r   r$   rT   z$Expected Series or scalar, got list.)narwhals._pandas_like.seriesr%   nativeindex
_broadcast
isinstanceiloc	set_index_implementationlist	TypeError)rX   rY   r%   	lhs_indexmsgs        rU   align_and_extract_nativeri      s    >=====
 I
~ .*S*:;; .CN .zq!3:--#'(( (> 	4J
 233:9,,
#*i@STTT  
CJ''#t 4nn:s?rW   objr'   r_   r   c                  t          ||                                j                  r;t          |          x}t          |           x}k    rd| d| }t	          |          |t
          j        u r|                     d          } || _        | S |t
          j	        u r:d|
                                cxk    rdk     rn n|                     |dd          S |                     |d	          S )
z}Wrapper around pandas' set_axis to set object index.

    We can set `copy` / `inplace` based on implementation/version.
    zExpected object of length z, got length: F)deep         r   )axiscopy)rr   )ra   to_native_namespaceIndexlenr   r   CUDFrs   r_   rR   _backend_versionset_axis)rj   r_   rM   expected_len
actual_lenrh   s         rU   rc   rc      s    %;;==CDD E

"C
 *J" J" T<SSzSSoo,,,hhEh""	
....1133::::d:::::||E|666<<A<&&&rW   argskwargsc                   |t           j        u r*|                                dk    r | j        |i |ddi}n | j        |i |ddd}t	          d|          S )zXWrapper around pandas' rename so that we can set `copy` based on implementation/version.rp   inplaceF)rs   r   r'   )r   rR   rx   renamer	   )rj   rM   r|   r}   results        rU   r   r      s     ...''))T11T;V;;U;;;TGVG%GGGG &)))rW      )maxsizenative_dtypeversionr   r)   c                p   t          |           }|j        }|dv r|                                S |dv r|                                S |dv r|                                S |dv r|                                S |dv r|                                S |dv r|                                S |dv r|                                S |dv r|	                                S |d	v r|
                                S |d
v r|                                S |dv r|                                S |dv r|                                S |                    d          r|                                S |dk    rt!          | |          S t"                              |          x}st&                              |          x}r@|                    d          }|                    d          }|                    ||          S t,                              |          x}st.                              |          x}r*|                    d          }|                    |          S |dk    r|                                S |                    d          r)|                    d          r|                                S |                    d          r)|                    d          r|                                S |                    d          r)|                    d          r|                                S |                                S )N>   int64[pyarrow]Int64int64Int64[pyarrow]>   int32[pyarrow]Int32int32Int32[pyarrow]>   int16[pyarrow]Int16int16Int16[pyarrow]>   int8[pyarrow]Int8int8Int8[pyarrow]>   uint64[pyarrow]UInt64uint64UInt64[pyarrow]>   uint32[pyarrow]UInt32uint32UInt32[pyarrow]>   uint16[pyarrow]UInt16uint16UInt16[pyarrow]>   uint8[pyarrow]UInt8uint8UInt8[pyarrow]>   double[pyarrow]float64[pyarrow]Float64float64Float64[pyarrow]>   float[pyarrow]float32[pyarrow]Float32float32Float32[pyarrow]>   string[python]string[pyarrow]large_string[pyarrow]string[pyarrow_numpy]strstring>   bool[pyarrow]rO   booleanboolean[pyarrow]zdictionary<category	time_unit	time_zonezdate32[day][pyarrow]decimalz	[pyarrow]timebinary)r   dtypesr   r   r   r   r   r   r   r   r   r   StringBoolean
startswithCategorical$native_categorical_to_narwhals_dtypePATTERN_PD_DATETIMEmatchPATTERN_PA_DATETIMEgroupDatetimePATTERN_PD_DURATIONPATTERN_PA_DURATIONDurationDateendswithDecimalTimeBinaryUnknown)r   r   dtyper   match_dt_time_unitdt_time_zonedu_time_units           rU   #non_object_native_to_narwhals_dtyper      sI   E^FFFF||~~FFF||~~FFF||~~BBB{{}}JJJ}}JJJ}}JJJ}}FFF||~~    ~~    ~~    }}HHH~~&& $!!###
3L'JJJ%++E222 ;%++E222; "(k!:!:#)<<#<#<|\:::%++E222 -%++E222- "(k!:!:|,,,&&&{{}}	""  u~~k'B'B  ~~ ENN;$?$? {{}}!! enn[&A&A }}>>rW   seriesPandasLikeSeries | Nonec                   |j         }|t          j        u r|                                S t          j        j        j        }| dn ||                     d          d          }|dk    r|                                S |dk    r"|t          j
        ur|                                S |dk    r|                                S |                                S )Nemptyd   T)skipnar   )r   r   rw   r   pdapitypesinfer_dtypeheadr   V1Object)r   r   rM   r   inferinferred_dtypes         rU   object_native_to_narwhals_dtyper      s     ^F,,, }}FL$E &WWEE&++c:J:JSW4X4X4XN!!}}  WGJ%>%>}}  }}==??rW   pd.CategoricalDtype#Literal[Implementation.CUDF] | Nonec                    |j         }|t          j        u r|                                S | j        rK|t
          j        u rt          |           n| j        j	        }|
                    t          |                    S |                                S rQ   )r   r   r   r   orderedr   rw   _cudf_categorical_to_list
categoriesto_listEnumr   )r   r   rM   r   	into_iters        rU   r   r   7  s    
 ^F'*!!### 9 !444 &l333(0 	
 {{,Y77888rW   Callable[[], list[Any]]c                     d fd}|S )NrN   	list[Any]c                 Z     j                                                                         S rQ   )r   to_arrow	to_pylist)r   s   rU   fnz%_cudf_categorical_to_list.<locals>.fnM  s$    &//11;;===rW   )rN   r    )r   r   s   ` rU   r   r   I  s(    > > > > > > IrW   F)allow_objectr   c                   t          |           }|                    d          rEddlm} t	          | d          r ||                                 |          S  || j        |          S |dk    r/|                                rt          | |t          j
                  S |dk    rt          | |          S |t          j        u r|j                                        S |rt          d ||          S d}t!          |          )N)
large_listre   structfixed_size_listr   )native_to_narwhals_dtyper   r   objectz;Unreachable code, object dtype should be handled separately)r   r   narwhals._arrow.utilsr   hasattrr   pyarrow_dtypeis_cudfr   r   rw   r   DASKr   r   r   AssertionError)r   r   rM   r   	str_dtypearrow_native_to_narwhals_dtyperh   s          rU   r   r   S  s?    L!!IOPP S	
 	
 	
 	
 	
 	
 <,, 	T11,2G2G2I2I7SSS--l.H'RRRJ>#9#9#;#; 4'>#6
 
 	
 H2<III,,, ~$$&&& N.tWnMMME  

rW   )rn      r   TypeIs[BaseMaskedDtype]c                    t                      }t          | t          j        j        j                  ot          | d|          du S )z/Return `True` if `dtype` is `"numpy_nullable"`.baseN)r  ra   r   r   
extensionsExtensionDtypegetattr)r   sentinels     rU   is_dtype_numpy_nullabler  {  s@     88ubf/>?? 9vx00D8	
rW   c                z    t          | t          j        j        j                  rddlm} t          | |          S dS )Nr   r   F)ra   r   r   r  r  pandas.core.arrays.maskedr   )r   OldBaseMaskedDtypes     rU   r  r    sT     eRV.=>> 	9      e%7888urW   r*   c                j    |t           j        u rdS t          |           rdS t          |           rdndS )zjGet dtype backend for pandas type.

    Matches pandas' `dtype_backend` argument in `convert_dtypes`.
    Npyarrownumpy_nullable)r   rw   is_dtype_pyarrowr  )r   rM   s     rU   get_dtype_backendr    sE    
 ,,,t y6u==G4GrW   r   Iterable[Any]Iterator[DTypeBackend]c                     fd| D             S )ziYield a `DTypeBackend` per-dtype.

    Matches pandas' `dtype_backend` argument in `convert_dtypes`.
    c              3  8   K   | ]}t          |          V  d S rQ   )r  ).0r   rM   s     rU   	<genexpr>z&iter_dtype_backends.<locals>.<genexpr>  s.      IIe^44IIIIIIrW   r   )r   rM   s    `rU   iter_dtype_backendsr!    s      JIII&IIIIrW   TypeIs[pd.ArrowDtype]c                `    t          t          d          ot          | t          j                  S )N
ArrowDtype)r  r   ra   r$  r   s    rU   r  r    s#    2|$$IE2=)I)IIrW   r   r  zMapping[type[DType], str]NW_TO_PD_DTYPES_INVARIANTr   r   r   )r  r  Nr   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   z<Mapping[type[DType], Mapping[DTypeBackend, str | type[Any]]]NW_TO_PD_DTYPES_BACKENDr+   dtype_backendstr | PandasDtypec                x   |dvrd| d}t          |          |j        }|                                 }t                              |          x}r|S t
                              |          x}r||         S t          ||j                  r?|dk    r*dd l}	t          j
        |	                                          S |dk    rdS t          S t          | |j                  rt          |          rut           dk     rjt#          | |j                  rR| j        d	k    rGt'          j        t                     }
d
|
d}d}d| j        d| d| d}t+          |t,                     d	}n| j        }|dk    r| j        x}rd| nd}d| | dS | j        x}rd| nd}d| | dS t          | |j                  r6t          |          rt           dk     rd	}n| j        }|dk    rd| dnd| dS t          | |j                  r,	 dd l}	n$# t4          $ r}d}t5          |          |d }~ww xY wdS t          | |j                  ru|t8          j        u rd}t=          |          t#          | |j                  r0|                                }|                     | j!        d          S d}t          |          t          ||j"        |j#        |j$        |j%        |j&        f          rtO          | ||          S t          |tP                    rd |j)         d!| d}t=          |          d"|  }tU          |          )#N>   Nr  r  z;Expected one of {None, 'pyarrow', 'numpy_nullable'}, got: ''r  r   r  r   )r
  rK   z*available in 'pandas>=2.0', found version .zhttps://pandas.pydata.org/docs/dev/whatsnew/v2.0.0.html#construction-with-datetime64-or-timedelta64-dtype-with-unsupported-resolutionz`nw.Datetime(time_unit=z)` is only z
Narwhals has fallen back to using `time_unit='ns'` to avoid an error.

Hint: to avoid this warning, consider either:
- Upgrading pandas: zA
- Using a bare `nw.Datetime`, if this precision is not importantz, tz= z
timestamp[z
][pyarrow]z, zdatetime64[]z	duration[ztimedelta64[z/'pyarrow>=13.0.0' is required for `Date` dtype.zdate32[pyarrow]z9Converting to Enum is not supported in narwhals.stable.v1T)r   z9Can not cast / initialize Enum without categories presentConverting to z dtype is not supported for zUnknown dtype: )+
ValueErrorr   	base_typer&  getr'  
issubclassr   r  r   r$  r   r   r   r   rV   PANDAS_VERSIONra   r   r   _unparse_versionr   UserWarningr   r   r   ModuleNotFoundErrorr   r   r   NotImplementedErrorrt   CategoricalDtyper   StructArrayListr   r   narwhals_to_native_arrow_dtypeUNSUPPORTED_DTYPES__name__r  )r   r(  rM   r   rh   r   r1  pd_typeinto_pd_typepafound	availablechangelog_urlr   tztz_partr   excrK   s                      rU   narwhals_to_native_dtyperI    s.    ???^m^^^oo^F!!I+//	:::w .229===| +M**)V]++ I%%     =---,,,8
v77 6n-- 	+. D
 3
 3
 %11 0eo6M6M 1.AASSSS	 !hXeo X XI X X ,9X X X  c;///LL ?LI%%-2_'<rElblll2GAAgAAAA&+o 5>)r)))B5\575555v77 
n-- 	+. D
 3
 3
  LL ?L 	)) 10000////	

  v{33 !	4     " 	4 	4 	4CC%c**3	4 ! v{33 gj  MC%c***eV[)) 	G3355B&&u'7&FFFIooFM6<fk6=Y  N .e^WMMM)/00 '`y1``~```!#&&&
#E
#
#C


s   H 
H(H##H(pd.ArrowDtypec                   t          |          rdt          dk    rY	 dd l}n/# t          $ r"}d|  d|j         }t          |          |d }~ww xY wddlm} t          j         || |                    S d|  d| d| d	}t          |          )
N)r
  r
  r   zUnable to convert to z  to to the following exception: )rI  r/  z+ dtype is not supported for implementation z and version r,  )
rV   r4  r  ImportErrorrh   r  rI  r   r$  r8  )r   rM   r   rB  rH  rh   _to_arrow_dtypes          rU   r=  r=  D  s     .)) >n.F.F	,      	, 	, 	,Z%ZZQTQXZZCc""+	, 	VUUUUU}__UG<<===	3 	3 	3	3 	3(/	3 	3 	3  c
"
""s   ! 
AAAr   c                    dt          |           v rdS t          |                                           t          |           k    rdS dS )Nr  r   r   r   )r   lowerr%  s    rU   int_dtype_mapperrP  W  sF    CJJ
5zzSZZ''w7rW   i  i@B )	)rK   rJ   )rK   rI   )rJ   rK   )rJ   rI   )rI   rK   )rI   rJ   )rH   rK   )rH   rJ   )rH   rI   zGMapping[tuple[UnitCurrent, UnitTarget], tuple[BinOpBroadcast, IntoRhs]]_TIMESTAMP_DATETIME_OP_FACTORrH   r(   currentr,   r   c                    ||k    r| S t                               ||f          x}r|\  }} || |          S d| d}t          |          )Nzunexpected time unit zD, please report an issue at https://github.com/narwhals-dev/narwhals)rQ  r2  r  )rH   rR  r   itemr   factorrh   s          rU   calculate_timestamp_datetimerV  n  sx     ),00'91EFFFt 
Fr!V}}	3 	3 	3 	3  

rW   rn   )rK   rJ   rI   rH   zMapping[TimeUnit, int]_TIMESTAMP_DATE_FACTORc                2    | t           z  t          |         z  S rQ   )r   rW  )rH   r   s     rU   calculate_timestamp_daterY    s    !7	!BBBrW   dfr&   column_nameslist[str] | _1DArrayNativeDataFrameT | Anyc                   t          |          | j        d         k    r| j        |k                                    r| S | j        j        j        dk    s&|t          j        u rU|                                dk     r=t          || j        
                                          x}r|| j        dd|f         S 	 | |         S # t          $ r3}t          || j        
                                          x}r|| d}~ww xY w)zsSelect columns by name.

    Prefer this over `df.loc[:, column_names]` as it's
    generally more performant.
    rn   brm   )rD  N)rv   shapecolumnsallr   kindr   rR   rx   r   tolistlocKeyError)rZ  r[  rM   errores        rU   select_columns_by_nameri    s    <BHQK''RZ<-G,L,L,N,N'	

$$.///++--66 (
@Q@Q@S@STTTT5 	Kvaaao&&,   '
@Q@Q@S@STTTT5 	Qs   7B? ?
C<	.C77C<c                v    | j         t          j        t          j        t          j        hv o| j        j        dk    S )NrO   )rd   r   rR   rS   r  r^   r   )rH   s    rU   is_non_nullable_booleanrk    s9     	
!>#79LM	N 	%HNf$rW   r   c                   | t           j        t           j        hv rddl}|S | t           j        u rddl}|S d|  }t          |          )zCReturns numpy or cupy module depending on the given implementation.r   Nz!Expected pandas/modin/cudf, got: )r   rR   rS   numpyrw   cupyr  )rM   npcprh   s       rU   import_array_modulerq    sc    ./1EFFF	,,,	
>n
>
>C


rW   c                      e Zd ZdS )PandasLikeSeriesNamespaceN)r?  
__module____qualname__r   rW   rU   rs  rs    s          rW   rs  )rM   r   rN   rO   )rX   r%   rY   rZ   rN   r[   )rj   r'   r_   r   rM   r   rN   r'   )
rj   r'   r|   r   rM   r   r}   r   rN   r'   )r   r   r   r   rN   r)   )r   r   r   r   rM   r   rN   r)   rQ   )r   r   r   r   rM   r   rN   r)   )r   r   rN   r   )
r   r   r   r   rM   r   r   rO   rN   r)   )r   r   rN   r  )r   r   rM   r   rN   r*   )r   r  rM   r   rN   r  )r   r   rN   r"  )
r   r+   r(  r*   rM   r   r   r   rN   r)  )r   r+   rM   r   r   r   rN   rJ  )r   r   rN   r   )rH   r(   rR  r,   r   r,   rN   r(   )rH   r(   r   r,   rN   r(   )rZ  r&   r[  r\  rM   r   rN   r]  )rH   r%   rN   rO   )rM   r   rN   r   )
__future__r   	functoolsoperatorretypingr   r   r   r   r   r	   pandasr   narwhals._compliantr
   narwhals._constantsr   r   r   r   r   r   narwhals._exceptionsr   narwhals._utilsr   r   r   r   r   r   narwhals.exceptionsr   collections.abcr   r   r   r   r   pandas._typingr   PandasDtypepandas.core.dtypes.dtypesr   typing_extensionsr    r!   narwhals._durationr"   narwhals._pandas_like.exprr#   r]   r%   narwhals._pandas_like.typingr&   r'   r(   narwhals.dtypesr)   narwhals.typingr*   r+   r,   r-   r.   r0   __annotations__r1   intr2   r3   rR   rw   rS   PANDAS_LIKE_IMPLEMENTATIONPD_DATETIME_RGXcompileVERBOSEr   PA_DATETIME_RGXr   PD_DURATION_RGXr   PA_DURATION_RGXr   r?   
ALIAS_DICTrL   rx   r4  rV   ri   rc   r   	lru_cacher   r   r   r   r   r  r  r!  r  MAINr   r   r   r&  r   r   r   r   r   r   r   r   r   r   r   r'  r   r>  rI  r=  rP  floordivmulrQ  rV  rW  rY  ri  rk  rq  rs  r   rW   rU   <module>r     sv   " " " " " " "      				 G G G G G G G G G G G G G G G G     4 4 4 4 4 4                / . . . . .                + * * * * * ;;;;;;;;;;      33333399999933333333//////999999======         
 &%%%%%KKKKKKKKKKKKGG>222E%K%%%%$J$$$$ (#sS 9N9999G  
 !bj"*==  !bj"*==  !bj"*==  !bj"*==  '
!      U##
		
				


9 9
      &7799K K K K   @' ' ' '.
* 
* 
* 
* R   G G G ! GT   4 ;?         $    # # # # # #L ))++v55
 
 
 
 
   	H 	H 	H 	HJ J J J R   J J J ! J 
	
 

M88      N%# 
 N%# 
 L.'QXYY
L.'QXYY
L.'QXYY
K_fUU
M$" 
 M$" 
 M$" 
 L.'QXYY
N%# ?$Y  $ $ $ $J n& ` ` ` `F# # # #&    $e,$i0<!34$e,<!34<',.,.,.
 
          

	
	2 2     C C C C   :       T S S S S 45G5L M S S S S SrW   