+
    VBi3                    f   ^ RI Ht ^ RIHt ^ RIt^ RIt ^RIH	t	 ]P                  '       d   ^ RIt ! R R]P                  4      t ! R R]P                  4      tR R	 ltR
 R ltR R lt ! R R]4      t ! R R]P.                  4      t ! R R4      tR R ltR#   ]
 d
    ^RIH	t	  Li ; i)    )annotationsN)_escape_innerc                  "    ] tR t^tR R ltRtR# )_HasHTMLc                   V ^8  d   QhRR/#    returnstr )formats   "8/usr/lib/python3.14/site-packages/markupsafe/__init__.py__annotate___HasHTML.__annotate__   s    %%S%    c               	    R # Nr   selfs   "r   __html___HasHTML.__html__   s    #r   r   N)__name__
__module____qualname____firstlineno__r   __static_attributes__r   r   r   r   r      s    %%r   r   c                  "    ] tR t^tR R ltRtR# )	_TPEscapec                    V ^8  d   QhRRRR/# r	   st.Anyr
   Markupr   )r   s   "r   r   _TPEscape.__annotate__   s    22%2v2r   c               	    R # r   r   )r   r!   s   ""r   __call___TPEscape.__call__   s    sr   r   N)r   r   r   r   r&   r   r   r   r   r   r      s    22r   r   c                    V ^8  d   QhRRRR/# r    r   )r   s   "r   r   r      s     ) )e )6 )r   c                   \        V 4      \        J d   \        \        V 4      4      # \	        V R4      '       d   \        V P                  4       4      # \        \        \        V 4      4      4      # )a  Replace the characters ``&``, ``<``, ``>``, ``'``, and ``"`` in
the string with HTML-safe sequences. Use this if you need to display
text that might contain such characters in HTML.

If the object has an ``__html__`` method, it is called and the
return value is assumed to already be safe for HTML.

:param s: An object to be converted to a string and escaped.
:return: A :class:`Markup` string with the escaped text.
r   )typer   r#   r   hasattrr   r!   s   "r   escaper-      sQ     Aw#~mA&''q*ajjl##-A'((r   c                    V ^8  d   QhRRRR/# )r	   r!   zt.Any | Noner
   r#   r   )r   s   "r   r   r   0   s      \  r   c               4    V f   \        4       # \        V 4      # )zLike :func:`escape` but treats ``None`` as the empty string.
Useful with optional values, as otherwise you get the string
``'None'`` when the value is ``None``.

>>> escape(None)
Markup('None')
>>> escape_silent(None)
Markup('')
)r#   r-   r,   s   "r   escape_silentr0   0   s     	yx!9r   c                    V ^8  d   QhRRRR/# )r	   r!   r"   r
   r   r   )r   s   "r   r   r   @   s       S r   c               H    \        V \        4      '       g   \        V 4      # V # )a|  Convert an object to a string if it isn't already. This preserves
a :class:`Markup` string rather than converting it back to a basic
string, so it will still be marked as safe and won't be escaped
again.

>>> value = escape("<User 1>")
>>> value
Markup('&lt;User 1&gt;')
>>> escape(str(value))
Markup('&amp;lt;User 1&amp;gt;')
>>> escape(soft_str(value))
Markup('&lt;User 1&gt;')
)
isinstancer   r,   s   "r   soft_strr4   @   s     a1vHr   c                    a  ] tR t^TtRtRPtRQR V 3R llltR R ltR V 3R lltR R	 lt	R
 V 3R llt
R V 3R lltR V 3R lltR V 3R lltR V 3R lltRRR V 3R llltRRR V 3R llltRSR V 3R llltR R ltR R lt]R R l4       tR  V 3R! lltR" V 3R# lltR$ V 3R% lltR& V 3R' lltR( V 3R) lltRTR* V 3R+ llltRUR, V 3R- llltRUR. V 3R/ llltRVR0 V 3R1 llltRVR2 V 3R3 llltRUR4 V 3R5 lllt RVR6 V 3R7 lllt!R8 V 3R9 llt"RWR: V 3R; lllt#R< V 3R= llt$R> V 3R? llt%R@ V 3RA llt&RB V 3RC llt'RD V 3RE llt(RF V 3RG llt)RH V 3RI llt*RJ RK lt+RL RM lt,RN RO lt-RPt.V ;t/# )Xr#   aB  A string that is ready to be safely inserted into an HTML or XML
document, either because it was escaped or because it was marked
safe.

Passing an object to the constructor converts it to text and wraps
it to mark it safe without escaping. To escape the text, use the
:meth:`escape` class method instead.

>>> Markup("Hello, <em>World</em>!")
Markup('Hello, <em>World</em>!')
>>> Markup(42)
Markup('42')
>>> Markup.escape("Hello, <em>World</em>!")
Markup('Hello &lt;em&gt;World&lt;/em&gt;!')

This implements the ``__html__()`` interface that some frameworks
use. Passing an object that implements ``__html__()`` will wrap the
output of that method, marking it safe.

>>> class Foo:
...     def __html__(self):
...         return '<a href="/foo">foo</a>'
...
>>> Markup(Foo())
Markup('<a href="/foo">foo</a>')

This is a subclass of :class:`str`. It has the same methods, but
escapes their arguments and returns a ``Markup`` instance.

>>> Markup("<em>%s</em>") % ("foo & bar",)
Markup('<em>foo &amp; bar</em>')
>>> Markup("<em>Hello</em> ") + "<foo>"
Markup('<em>Hello</em> &lt;foo&gt;')
c               (    V ^8  d   QhRRRRRRRR/# )	r	   objectr"   encoding
str | Noneerrorsr   r
   te.Selfr   )r   s   "r   r   Markup.__annotate__z   s,     	> 	>	>+5	>FI	>		>r   c                	   < \        VR 4      '       d   VP                  4       pVf   \        SV `  W4      # \        SV `  WW#4      # r   )r+   r   super__new__)clsr7   r8   r:   	__class__s   &&&&r   r@   Markup.__new__z   sD     6:&&__&F7?3//wsH==r   c                   V ^8  d   QhRR/# r	   r
   r;   r   )r   s   "r   r   r<      s      W r   c               	    V # r   r   r   s   "r   r   Markup.__html__   s    r   c                    V ^8  d   QhRRRR/# r	   valuezstr | _HasHTMLr
   r;   r   )r   s   "r   r   r<      s      ^ 7 r   c               	   < \        V\        4      '       g   \        VR 4      '       d.   V P                  \        SV `  V P                  V4      4      4      # \        # r>   )r3   r   r+   rB   r?   __add__r-   NotImplementedr   rJ   rB   s   ""r   rL   Markup.__add__   sC    eS!!WUJ%?%?>>%'/$++e2D"EFFr   c                    V ^8  d   QhRRRR/# rI   r   )r   s   "r   r   r<      s      n G r   c               	    \        V\        4      '       g   \        VR 4      '       d!   V P                  V4      P	                  V 4      # \
        # r>   )r3   r   r+   r-   rL   rM   )r   rJ   s   ""r   __radd__Markup.__radd__   s;    eS!!WUJ%?%?;;u%--d33r   c                    V ^8  d   QhRRRR/# r	   rJ   t.SupportsIndexr
   r;   r   )r   s   "r   r   r<      s     6 6_ 6G 6r   c               	@   < V P                  \        SV `	  V4      4      # r   rB   r?   __mul__rN   s   ""r   rY   Markup.__mul__       ~~egoe455r   c                    V ^8  d   QhRRRR/# rU   r   )r   s   "r   r   r<      s     6 6o 6W 6r   c               	@   < V P                  \        SV `	  V4      4      # r   rX   rN   s   ""r   __rmul__Markup.__rmul__   r[   r   c                    V ^8  d   QhRRRR/# )r	   rJ   r"   r
   r;   r   )r   s   "r   r   r<      s     6 6U 6' 6r   c               	  <a  \        V\        4      '       d4   \        ;QJ d    . V 3R  lV 4       F  NK  	  5M! V 3R  lV 4       4      pM_\        \        V4      R4      '       d.   \        V\        4      '       g   \        VS P                  4      pM\        VS P                  4      3pS P                  \        SS `%  V4      4      # )c              3  P   <"   T F  p\        VSP                  4      x  K  	  R # 5ir   )_MarkupEscapeHelperr-   ).0xr   s   & r   	<genexpr>!Markup.__mod__.<locals>.<genexpr>   s      Mu!-a==us   #&__getitem__)
r3   tupler+   r*   r   rc   r-   rB   r?   __mod__rN   s   b"r   rj   Markup.__mod__   s    eU##EMuMEEMuMMET%[-00E39O9O't{{;E )<>E~~egoe455r   c                   V ^8  d   QhRR/# r   r   )r   s   "r   r   r<      s     B BS Br   c               	T   < V P                   P                   R \        SV `  4        R2# )())rB   r   r?   __repr__r   rB   s   "r   rp   Markup.__repr__   s*    ..))*!EG,<,>+?qAAr   c                    V ^8  d   QhRRRR/# )r	   iterablezcabc.Iterable[str | _HasHTML]r
   r;   r   )r   s   "r   r   r<      s     H H: H' Hr   c               	h   < V P                  \        SV `	  \        V P                  V4      4      4      # r   )rB   r?   joinmapr-   )r   rt   rB   s   ""r   rv   Markup.join   s&    ~~egl3t{{H+EFGGr   c               $    V ^8  d   QhRRRRRR/# r	   sepr9   maxsplitrV   r
   list[te.Self]r   )r   s   "r   r   r<      s)     I I I3BI	Ir   c               	h   < \         SV `  W4       Uu. uF  q0P                  V4      NK  	  up# u upi r   )r?   splitrB   r   r{   r|   vrB   s   "&& r   r   Markup.split   s/     ,17=+GH+Gaq!+GHHH   /c               $    V ^8  d   QhRRRRRR/# rz   r   )r   s   "r   r   r<      s)     J J J3BJ	Jr   c               	h   < \         SV `  W4       Uu. uF  q0P                  V4      NK  	  up# u upi r   )r?   rsplitrB   r   s   "&& r   r   Markup.rsplit   s/     ,17>#+HI+Haq!+HIIIr   c                    V ^8  d   QhRRRR/# )r	   keependsboolr
   r}   r   )r   s   "r   r   r<      s      I II	Ir   c               	h   < \         SV `  V4       Uu. uF  q P                  V4      NK  	  up# u upi r   )r?   
splitlinesrB   )r   r   r   rB   s   "& r   r   Markup.splitlines   s0     ,17+=h+GH+Gaq!+GHHHr   c                   V ^8  d   QhRR/# r   r   )r   s   "r   r   r<      s     	# 	#S 	#r   c               0    ^ RI Hp V! \        V 4      4      # )u   Convert escaped markup back into a text string. This replaces
HTML entities with the characters they represent.

>>> Markup("Main &raquo; <em>About</em>").unescape()
'Main » <em>About</em>'
)unescape)htmlr   r   )r   r   s   " r   r   Markup.unescape   s     	"D	""r   c                   V ^8  d   QhRR/# r   r   )r   s   "r   r   r<      s     0 0c 0r   c                  \        V 4      pVP                  R4      ;pR8w  d/   VP                  RV4      ;pR8X  d   MVRV  W^,           R  2pKF  VP                  R4      ;pR8w  d/   VP                  RV4      ;pR8X  d   MVRV  W^,           R  2pKF  RP                  VP                  4       4      pV P	                  V4      P                  4       # )u   :meth:`unescape` the markup, remove tags, and normalize
whitespace to single spaces.

>>> Markup("Main &raquo;        <em>About</em>").striptags()
'Main » About'
z<!--z-->N<> )r   findrv   r   rB   r   )r   rJ   startends   "   r   	striptagsMarkup.striptags   s     D	 

6**ur1zz%//B6Ve}oe!GI&6%78E 

3'uB.zz#u--"4Ve}oe!GI&6%78E '~~e$--//r   c                    V ^8  d   QhRRRR/# )r	   r!   r"   r
   r;   r   )r   s   "r   r   r<      s     	 	u 	G 	r   c               L    \        V4      pVP                  V Jd	   V ! V4      # V# )zdEscape a string. Calls :func:`escape` and ensures that for
subclasses the correct type is returned.
)r-   rB   )rA   r!   rvs   "" r   r-   Markup.escape   s'    
 AY<<s"r7N	r   c                    V ^8  d   QhRRRR/# )r	   keyzt.SupportsIndex | slicer
   r;   r   )r   s   "r   r   r<      s     8 86 8g 8r   c               	@   < V P                  \        SV `	  V4      4      # r   )rB   r?   rh   )r   r   rB   s   ""r   rh   Markup.__getitem__   s    ~~eg1#677r   c                   V ^8  d   QhRR/# rE   r   )r   s   "r   r   r<      s     4 4w 4r   c               	>   < V P                  \        SV `	  4       4      # r   )rB   r?   
capitalizerq   s   "r   r   Markup.capitalize   s    ~~eg0233r   c                   V ^8  d   QhRR/# rE   r   )r   s   "r   r   r<           / /' /r   c               	>   < V P                  \        SV `	  4       4      # r   )rB   r?   titlerq   s   "r   r   Markup.title       ~~egmo..r   c                   V ^8  d   QhRR/# rE   r   )r   s   "r   r   r<      r   r   c               	>   < V P                  \        SV `	  4       4      # r   )rB   r?   lowerrq   s   "r   r   Markup.lower   r   r   c                   V ^8  d   QhRR/# rE   r   )r   s   "r   r   r<      r   r   c               	>   < V P                  \        SV `	  4       4      # r   )rB   r?   upperrq   s   "r   r   Markup.upper   r   r   c               (    V ^8  d   QhRRRRRRRR/# )r	   oldr   newcountrV   r
   r;   r   )r   s   "r   r   r<     s.     M M3 MS M MW Mr   c               	`   < V P                  \        SV `	  WP                  V4      V4      4      # r   )rB   r?   replacer-   )r   r   r   r   rB   s   """"r   r   Markup.replace  s&    ~~egoc;;s3CUKLLr   c               $    V ^8  d   QhRRRRRR/# r	   widthrV   fillcharr   r
   r;   r   )r   s   "r   r   r<     &     K K? Kc Kw Kr   c               	^   < V P                  \        SV `	  WP                  V4      4      4      # r   )rB   r?   ljustr-   r   r   r   rB   s   """r   r   Markup.ljust  $    ~~egmE;;x3HIJJr   c               $    V ^8  d   QhRRRRRR/# r   r   )r   s   "r   r   r<     r   r   c               	^   < V P                  \        SV `	  WP                  V4      4      4      # r   )rB   r?   rjustr-   r   s   """r   r   Markup.rjust  r   r   c                    V ^8  d   QhRRRR/# r	   charsr9   r
   r;   r   )r   s   "r   r   r<   
       5 5J 5W 5r   c               	@   < V P                  \        SV `	  V4      4      # r   )rB   r?   lstripr   r   rB   s   ""r   r   Markup.lstrip
      ~~egnU344r   c                    V ^8  d   QhRRRR/# r   r   )r   s   "r   r   r<     r   r   c               	@   < V P                  \        SV `	  V4      4      # r   )rB   r?   rstripr   s   ""r   r   Markup.rstrip  r   r   c               $    V ^8  d   QhRRRRRR/# r   r   )r   s   "r   r   r<     s&     L LO Ls L Lr   c               	^   < V P                  \        SV `	  WP                  V4      4      4      # r   )rB   r?   centerr-   r   s   """r   r   Markup.center  s$    ~~egnUKK4IJKKr   c                    V ^8  d   QhRRRR/# r   r   )r   s   "r   r   r<     s     4 4: 4G 4r   c               	@   < V P                  \        SV `	  V4      4      # r   )rB   r?   stripr   s   ""r   r   Markup.strip      ~~egmE233r   c                    V ^8  d   QhRRRR/# )r	   tablez#cabc.Mapping[int, str | int | None]r
   r   r   )r   s   "r   r   r<     s     8 828 
	8r   c               	@   < V P                  \        SV `	  V4      4      # r   )rB   r?   	translate)r   r   rB   s   ""r   r   Markup.translate  s    
 ~~eg/677r   c                    V ^8  d   QhRRRR/# )r	   tabsizerV   r
   r;   r   )r   s   "r   r   r<     s     ; ;_ ;W ;r   c               	@   < V P                  \        SV `	  V4      4      # r   )rB   r?   
expandtabs)r   r   rB   s   "&r   r   Markup.expandtabs  s    ~~eg09::r   c                   V ^8  d   QhRR/# rE   r   )r   s   "r   r   r<           2 2W 2r   c               	>   < V P                  \        SV `	  4       4      # r   )rB   r?   swapcaserq   s   "r   r   Markup.swapcase       ~~eg.011r   c                    V ^8  d   QhRRRR/# )r	   r   rV   r
   r;   r   )r   s   "r   r   r<   #  s     4 4? 4' 4r   c               	@   < V P                  \        SV `	  V4      4      # r   )rB   r?   zfill)r   r   rB   s   ""r   r   Markup.zfill#  r   r   c                   V ^8  d   QhRR/# rE   r   )r   s   "r   r   r<   &  r   r   c               	>   < V P                  \        SV `	  4       4      # r   )rB   r?   casefoldrq   s   "r   r   Markup.casefold&  r   r   c                    V ^8  d   QhRRRR/# )r	   prefixr   r
   r;   r   )r   s   "r   r   r<   )  s     < <3 <g <r   c               	@   < V P                  \        SV `	  V4      4      # r   )rB   r?   removeprefix)r   r   rB   s   ""r   r   Markup.removeprefix)      ~~eg26:;;r   c                    V ^8  d   QhRRRR/# )r	   suffixr   r
   r;   r   )r   s   "r   r   r<   ,  s     < <3 <7 <r   c                	@   < V P                  \        SV `	  V4      4      # r   )rB   r?   removesuffix)r   r  rB   s   &&r   r  Markup.removesuffix,  r   r   c                    V ^8  d   QhRRRR/# r	   r{   r   r
   z tuple[te.Self, te.Self, te.Self]r   )r   s   "r   r   r<   /  s     / /S /(H /r   c               	n   < \         SV `  V4      w  r!pV P                  pV! V4      V! V4      V! V4      3# r   )r?   	partitionrB   r   r{   leftrightrA   rB   s   ""   r   r	  Markup.partition/  s9     7,S15nn4y#c(CJ..r   c                    V ^8  d   QhRRRR/# r  r   )r   s   "r   r   r<   4  s     / /c /)I /r   c               	n   < \         SV `  V4      w  r!pV P                  pV! V4      V! V4      V! V4      3# r   )r?   
rpartitionrB   r
  s   ""   r   r  Markup.rpartition4  s9     7-c25nn4y#c(CJ..r   c               $    V ^8  d   QhRRRRRR/# )r	   argsr"   kwargsr
   r;   r   )r   s   "r   r   r<   9  s&     E EE EU Ew Er   c                	n    \        V P                  4      pV P                  VP                  WV4      4      # r   EscapeFormatterr-   rB   vformat)r   r  r  	formatters   &*, r   r   Markup.format9  s,    #DKK0	~~i//FCDDr   c                    V ^8  d   QhRRRR/# )r	   mappingzcabc.Mapping[str, t.Any]r
   r;   r   )r   s   "r   r   r<   =  s"     D D)D 
	Dr   c               	p    \        V P                  4      pV P                  VP                  V RV4      4      # )Nr   r  )r   r  r  s   "" r   
format_mapMarkup.format_map=  s0    
 $DKK0	~~i//b'BCCr   c                    V ^8  d   QhRRRR/# )r	   format_specr   r
   r;   r   )r   s   "r   r   r<   E  s      3 g r   c               	,    V'       d   \        R 4      hV # )z,Unsupported format specification for Markup.)
ValueError)r   r!  s   ""r   __html_format__Markup.__html_format__E  s    KLLr   r   ) Nstrict)Nr   )F)r   )r   r   )   )0r   r   r   r   __doc__	__slots__r@   r   rL   rR   rY   r^   rj   rp   rv   r   r   r   r   r   classmethodr-   rh   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r   r  r$  r   __classcell__rB   s   @r   r#   r#   T   s   !F I	> 	> 6 66 66 6B BH HI I
J J
I I
	#0> 	 	8 84 4/ // // /M MK KK K5 55 5L L4 48 8; ;2 24 42 2< << </ /
/ /
ED r   r#   c                  D   a  ] tR tRtRtR V 3R lltR V 3R lltRtV ;t# )r  iL  c                    V ^8  d   QhRRRR/# )r	   r-   r   r
   Noner   )r   s   "r   r   EscapeFormatter.__annotate__O  s      y T r   c                	0   < Wn         \        SV `	  4        R # r   )r-   r?   __init__)r   r-   rB   s   &&r   r3  EscapeFormatter.__init__O  s    !'r   c               $    V ^8  d   QhRRRRRR/# )r	   rJ   r"   r!  r   r
   r   )r   s   "r   r   r1  S  s!     $ $% $c $c $r   c                	>  < \        VR 4      '       d   VP                  V4      pM_\        VR4      '       d5   V'       d   \        RV R\        V4       R24      hVP	                  4       pM\
        SV `  V\        V4      4      p\        V P                  V4      4      # )r$  r   zFormat specifier z given, but z{ does not define __html_format__. A class that defines __html__ must define __html_format__ to work with format specifiers.)	r+   r$  r#  r*   r   r?   format_fieldr   r-   )r   rJ   r!  r   rB   s   &&& r   r7  EscapeFormatter.format_fieldS  s    5+,,&&{3BUJ'' '}Le NG G 
 !B %eS-=>B4;;r?##r   )r-   )	r   r   r   r   r*  r3  r7  r   r,  r-  s   @r   r  r  L  s    I $ $r   r  c                  f    ] tR tRtRtRtR R ltR R ltR R ltR	 R
 lt	R R lt
R R ltRtR# )rc   ie  z"Helper for :meth:`Markup.__mod__`.c               $    V ^8  d   QhRRRRRR/# )r	   objr"   r-   r   r
   r0  r   )r   s   "r   r    _MarkupEscapeHelper.__annotate__j  s!     ( (E (9 ( (r   c                	    Wn         W n        R # r   r;  r-   )r   r;  r-   s   &&&r   r3  _MarkupEscapeHelper.__init__j  s    !'r   c                    V ^8  d   QhRRRR/# )r	   r   r"   r
   r;   r   )r   s   "r   r   r<  n  s     : :u :G :r   c               	\    V P                  V P                  V,          V P                  4      # r   )rB   r;  r-   )r   r   s   ""r   rh   _MarkupEscapeHelper.__getitem__n  s    ~~dhhsmT[[99r   c                   V ^8  d   QhRR/# r   r   )r   s   "r   r   r<  q  s     * *C *r   c               	J    \        V P                  V P                  4      4      # r   )r   r-   r;  r   s   "r   __str___MarkupEscapeHelper.__str__q  s    4;;txx())r   c                   V ^8  d   QhRR/# r   r   )r   s   "r   r   r<  t  s     0 0S 0r   c               	\    \        V P                  \        V P                  4      4      4      # r   )r   r-   reprr;  r   s   "r   rp   _MarkupEscapeHelper.__repr__t  s    4;;tDHH~.//r   c                   V ^8  d   QhRR/# )r	   r
   intr   )r   s   "r   r   r<  w  s      C r   c               	,    \        V P                  4      # r   )rL  r;  r   s   "r   __int___MarkupEscapeHelper.__int__w  s    488}r   c                   V ^8  d   QhRR/# )r	   r
   floatr   )r   s   "r   r   r<  z  s      e r   c               	,    \        V P                  4      # r   )rQ  r;  r   s   "r   	__float___MarkupEscapeHelper.__float__z  s    TXXr   )r-   r;  Nr>  )r   r   r   r   r)  r*  r3  rh   rE  rp   rN  rS  r   r   r   r   rc   rc   e  s-    ,!I(:*0 r   rc   c                    V ^8  d   QhRRRR/# )r	   namer   r
   r"   r   )r   s   "r   r   r   ~  s      c e r   c                    V R 8X  d<   ^ RI p^ RIpVP                  R\        ^R7       VP                  P                  R4      # \        V 4      h)__version__NzThe '__version__' attribute is deprecated and will be removed in MarkupSafe 3.1. Use feature detection, or `importlib.metadata.version("markupsafe")`, instead.)
stacklevel
markupsafe)importlib.metadatawarningswarnDeprecationWarningmetadataversionAttributeError)rV  	importlibr\  s   &  r   __getattr__rc  ~  sS    }!D  	 	
 !!)),77

r   )
__future__r   collections.abcabccabcstringtypingt	_speedupsr   ImportError_nativeTYPE_CHECKINGtyping_extensionsteProtocolr   r   r-   r0   r4   r   r#   	Formatterr  rc   rc  r   r   r   <module>rs     s    "   '( ???"&qzz &3

 3)0 (uS up$f&& $2 2k  '&'s   B   B0/B0