Ë
    Úqj±A  ã            	      óØ  — d dl mZ d dlZd dlZd dlZd dlZddlmZ ddlm	Z	 ddl
mZ ddlmZ  G d„ d	«      Z G d
„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z G d„ d«      Z G d „ d! ej4                  d!g d"¢«      «      Z G d#„ d$«      Zej:                  d%„ «       Zy)&é    )ÚannotationsNé   )Úevent)Úurl)ÚDefaultDialect)ÚBaseDDLElementc                  ó$   — e Zd ZdZdZdZd„ Zd„ Zy)Ú
AssertRuleFNTc                 ó   — y ©N© ©ÚselfÚexecute_observeds     ú]/var/www/html/kelly-backend/venv/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.pyÚprocess_statementzAssertRule.process_statement   s   € Øó    c                ó   — J d«       ‚)Nz?All statements are complete, but pending assertion rules remainr   ©r   s    r   Úno_more_statementszAssertRule.no_more_statements   s   € ð	
ð%ó	
ˆur   )Ú__name__Ú
__module__Ú__qualname__Úis_consumedÚerrormessageÚconsume_statementr   r   r   r   r   r
   r
      s   „ Ø€KØ€LØÐòó
r   r
   c                  ó   — e Zd Zy)ÚSQLMatchRuleN©r   r   r   r   r   r   r   r   &   s   „ Ør   r   c                  ó   — e Zd Zdd„Zd„ Zy)Ú	CursorSQLNc                ó.   — || _         || _        || _        y r   )Ú	statementÚparamsr   )r   r#   r$   r   s       r   Ú__init__zCursorSQL.__init__+   s   € Ø"ˆŒØˆŒØ!2ˆÕr   c                ó�  — |j                   d   }| j                  |j                  k7  s%| j                  �\| j                  |j                  k7  rCd| _        d| j                  ›d| j                  ›d|j                  ›d|j                  ›�| _        y |j                   j                  d«       d| _        |j                   sd| _        y y )Nr   TzTesting for exact SQL z parameters z
 received Ú )Ú
statementsr#   r$   Ú
parametersr   r   Úpopr   )r   r   Ústmts      r   r   zCursorSQL.process_statement0   s¢   € Ø×*Ñ*¨1Ñ-ˆØ�>‰>˜TŸ^™^Ò+Ø�K‰KÐ#¨¯©°t·±Ò(Fà%)ˆDÕ"ð —N“NØ—K“KØ—N“NØ—O’Oðð Õð ×'Ñ'×+Ñ+¨AÔ.Ø#ˆDÔØ#×.Ò.Ø)-�Õ&ð /r   )NT©r   r   r   r%   r   r   r   r   r!   r!   *   s   „ ó3ó
.r   r!   c                  ó:   — e Zd Z	 d	d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)
ÚCompiledSQLNc                ó<   — || _         || _        || _        || _        y r   )r#   r$   ÚdialectÚenable_returning)r   r#   r$   r0   r1   s        r   r%   zCompiledSQL.__init__G   s!   € ð #ˆŒØˆŒØˆŒØ 0ˆÕr   c                óN   — t        j                  dd| j                  «      }||k(  S ©Nú[\n\t]Ú )ÚreÚsubr#   ©r   r   Úreceived_statementr+   s       r   Ú_compare_sqlzCompiledSQL._compare_sqlO   s#   € Ü�v‰v�i  T§^¡^Ó4ˆØ! TÑ)Ð)r   c                óR  — | j                   dk(  r^t        «       }d|_        | j                  r?dx|_        x|_        |_        d|_        d|_        d|_	        d|_
        |j                  sJ ‚|S t        j                  j                  | j                   «      j                  «       «       S ©NÚdefaultT)r0   r   Úsupports_default_metavaluer1   Úinsert_returningÚupdate_returningÚdelete_returningÚuse_insertmanyvaluesÚsupports_multivalues_insertÚupdate_returning_multifromÚdelete_returning_multifromÚinsert_executemany_returningr   ÚURLÚcreateÚget_dialect)r   r   r0   s      r   Ú_compile_dialectzCompiledSQL._compile_dialectS   s¡   € Ø�<‰<˜9Ò$Ü$Ó&ˆGð 26ˆGÔ.à×$Ò$ð ð�Ô(ð ¨7Ô+CØÔ,à/3�Ô,Ø6:�Ô3Ø59�Ô2Ø59�Ô2ð ×;Ò;Ð;Ð;àˆNä—7‘7—>‘> $§,¡,Ó/×;Ñ;Ó=Ó?Ð?r   c                ó`  — |j                   }| j                  |«      }d}d}d|j                  v r|j                  d   }nd}t        |j                  t
        «      r|j                  j                  ||¬«      }nH|j                  j                  |||j                  j                  |j                  j                  |¬«      }t        j                  ddt        |«      «      }|j                  }	|	s|j                  |¬«      g}
||
fS |	D �cg c]  }|j                  ||¬«      ‘Œ }
}||
fS c c}w )zxreconstruct the statement and params in terms
        of a target dialect, which for CompiledSQL is just DefaultDialect.NÚschema_translate_map)r0   rL   )Ú	cache_keyr0   Úcolumn_keysÚfor_executemanyrL   r4   r5   )Úextracted_parameters)ÚcontextrJ   Úexecution_optionsÚ
isinstanceÚclauseelementr   ÚcompileÚcompiledrN   rO   r6   r7   Ústrr)   Úconstruct_params)r   r   rQ   Úcompare_dialectrM   rP   Úmap_rV   Ú_received_statementr)   Ú_received_parametersÚms               r   r[   zCompiledSQL._received_statementm   sm  € ð #×*Ñ*ˆØ×/Ñ/Ð0@ÓAˆð ˆ	àð 	ð " W×%>Ñ%>Ñ>Ø×,Ñ,Ð-CÑD‰DàˆDäÐ&×4Ñ4´nÔEØ'×5Ñ5×=Ñ=Ø'Ø%)ð >ó ‰Hð
 (×5Ñ5×=Ñ=Ø#Ø'Ø#×,Ñ,×8Ñ8Ø '× 0Ñ 0× @Ñ @Ø%)ð >ó ˆHô !Ÿf™f Y°´C¸³MÓBÐØ%×0Ñ0ˆ
áà×)Ñ)Ø)=ð *ó ð$Ð ð #Ð$8Ð8Ð8ñ $ó	$ñ $�Að ×)Ñ)ØÐ,@ð *õ ð $ð	 !ð $ð #Ð$8Ð8Ð8ùò$s   ÄD+c                óâ  — |j                   }| j                  |«      \  }}| j                  |«      }| j                  ||«      }|r||�zt	        |«      }t	        |«      }|r\|rZt        |j                  d«      «      }	t        t	        |«      «      D ]!  \  }
}|	D ]  }||vs||   |	|   k7  sŒ Œ ||
=  n d}n|r|rŒZ|s|rd}|rd| _        d | _	        y | j                  ||«      ||dœz  | _	        y )Nr   FT)r9   Úreceived_parameters)rQ   r[   Ú_all_paramsr:   ÚlistÚdictr*   Ú	enumerater   r   Ú_failure_message)r   r   rQ   r[   r\   r$   Ú
equivalentÚ
all_paramsÚall_receivedÚparamÚidxÚreceivedÚ	param_keys                r   r   zCompiledSQL.process_statement¢   s+  € Ø"×*Ñ*ˆà48×4LÑ4LØó5
Ñ1ÐÐ1ð ×!Ñ! 'Ó*ˆà×&Ñ&Ð'7Ð9LÓMˆ
áØÐ!Ü! &›\�
Ü#Ð$8Ó9�Ù ¡\Ü  §¡°Ó!2Ó3�Eä)2´4¸Ó3EÖ)F™˜˜Xã).˜Ið !*°Ñ 9Ø#+¨IÑ#6¸%À	Ñ:JÓ#Já %ð */ð !-¨SÐ 1Ù!ð *Gð$ &+˜
Øñ- !¢\ñ. ¡Ø!&�JáØ#ˆDÔØ $ˆDÕà $× 5Ñ 5Ø  &ó!ð ':Ø';ññ!ˆDÕr   c                ó¬   — | j                   rHt        | j                   «      r| j                  |«      }n| j                   }t        |t        «      s|g}|S y r   )r$   ÚcallablerS   ra   )r   rQ   r$   s      r   r`   zCompiledSQL._all_paramsÕ   sE   € Ø�;Š;Ü˜Ÿ™Ô$ØŸ™ WÓ-‘àŸ™�Ü˜f¤dÔ+Ø ˜�ØˆMàr   c                óz   — d| j                   j                  dd«      ›dt        |«      j                  dd«      ›d�S ©NzTesting for compiled statement
Ú%ú%%ú partial params zE, received
%(received_statement)r with params %(received_parameters)r)r#   ÚreplaceÚrepr©r   r   Úexpected_paramss      r   rd   zCompiledSQL._failure_messageá   s7   � ð —‘×&Ñ& s¨DÕ1Ü�_Ó%×-Ñ-¨c°4Õ8ðð	
r   r<   )
r   r   r   r%   r:   rJ   r[   r   r`   rd   r   r   r   r.   r.   F   s+   „ àJNó1ò*ò@ò439òj1òf
ó	
r   r.   c                  ó"   — e Zd Z	 dd„Zd„ Zd„ Zy)ÚRegexSQLNc                óš   — t         j                  | «       t        j                  |«      | _        || _        || _        || _        || _        y r   )	r   r%   r6   rU   ÚregexÚ
orig_regexr$   r0   r1   )r   rz   r$   r0   r1   s        r   r%   zRegexSQL.__init__î   s?   € ô 	×Ñ˜dÔ#Ü—Z‘Z Ó&ˆŒ
ØˆŒØˆŒØˆŒØ 0ˆÕr   c                óz   — d| j                   j                  dd«      ›dt        |«      j                  dd«      ›d�S )Nz Testing for compiled statement ~rp   rq   rr   zE, received %(received_statement)r with params %(received_parameters)r)r{   rs   rt   ru   s      r   rd   zRegexSQL._failure_messageø   s7   � ð —‘×'Ñ'¨¨TÕ2Ü�_Ó%×-Ñ-¨c°4Õ8ðð	
r   c                óJ   — t        | j                  j                  |«      «      S r   )Úboolrz   Úmatch)r   r   r9   s      r   r:   zRegexSQL._compare_sql  s   € Ü�D—J‘J×$Ñ$Ð%7Ó8Ó9Ð9r   )Nr=   F)r   r   r   r%   rd   r:   r   r   r   rx   rx   í   s   „ àFKó1ò	
ó:r   rx   c                  ó<   ‡ — e Zd Zd„ Zd„ Zˆ fd„Zd„ Zd„ Zd„ Zˆ xZ	S )Ú
DialectSQLc                ó.   — |j                   j                  S r   )rQ   r0   r   s     r   rJ   zDialectSQL._compile_dialect  s   € Ø×'Ñ'×/Ñ/Ð/r   c                ó:   — t        j                  dd|«      }||k(  S r3   )r6   r7   )r   Ú	real_stmtÚreceived_stmtr+   s       r   Ú_compare_no_spacezDialectSQL._compare_no_space  s   € Ü�v‰v�i  YÓ/ˆØ Ñ$Ð$r   c                óÒ   •— t         ‰| �  |«      \  }}|j                  D ]   }| j                  |j                  |«      sŒ  n t        d|z  «      ‚||j                  j                  fS )NzICan't locate compiled statement %r in list of statements actually invoked)Úsuperr[   r(   r†   r#   ÚAssertionErrorrQ   Úcompiled_parameters)r   r   r…   Úreceived_paramsr„   Ú	__class__s        €r   r[   zDialectSQL._received_statement  s{   ø€ Ü).©Ñ)DØó*
Ñ&ˆ�ð
 *×4Ô4ˆIØ×%Ñ% i×&9Ñ&9¸=ÕIÙð 5ô !ð.Ø0=ñ>óð ð
 Ð.×6Ñ6×JÑJÐJÐJr   c                ó¢  ‡‡— |j                   }t        j                  dd| j                  «      }|j	                  dd«      }|dk(  rt        j                  dd|«      }n^d }|dk(  rd	}n=|d
k(  rd}n5|j                  d«      r$t        j                  d«      Š|dk(  rdndŠˆˆfd„}t        j                  d||«      }|j	                  dd«      }|S )Nr4   r5   z::z!!Úpyformatz	:([\w_]+)z%(\1)sÚqmarkÚ?Úformatz%sÚnumericé   Únumeric_dollarÚ$Ú:c                ó"   •— ‰› t        ‰«      › �S r   )Únext)r]   ÚcounterÚnum_identifiers    €€r   Úreplz4DialectSQL._dialect_adjusted_statement.<locals>.repl5  s   ø€ Ø,Ð-¬d°7«m¨_Ð=Ð=r   )Ú
paramstyler6   r7   r#   rs   Ú
startswithÚ	itertoolsÚcount)r   r0   rœ   r+   r›   r™   rš   s        @@r   Ú_dialect_adjusted_statementz&DialectSQL._dialect_adjusted_statement   sÌ   ù€ Ø×'Ñ'ˆ
Ü�v‰v�i  T§^¡^Ó4ˆð �|‰|˜D $Ó'ˆà˜Ò#Ü—6‘6˜,¨	°4Ó8‰Dð ˆDØ˜WÒ$Ø‘Ø˜xÒ'Ø‘Ø×&Ñ& yÔ1Ü#Ÿ/™/¨!Ó,�à(2Ð6FÒ(F¡ÈC�õ>ô —6‘6˜,¨¨dÓ3ˆDð �|‰|˜D $Ó'ˆàˆr   c                óV   — | j                  |j                  j                  «      }||k(  S r   )r    rQ   r0   r8   s       r   r:   zDialectSQL._compare_sql?  s.   € Ø×/Ñ/Ø×$Ñ$×,Ñ,ó
ˆð " TÑ)Ð)r   c                ó¬   — d| j                  |j                  j                  «      j                  dd«      ›dt	        |«      j                  dd«      ›d�S ro   )r    rQ   r0   rs   rt   ru   s      r   rd   zDialectSQL._failure_messageE  sS   � ð ×0Ñ0Ø$×,Ñ,×4Ñ4óç‘'˜#˜tÓ$ñ%ô �_Ó%×-Ñ-¨c°4Õ8ðð
	
r   )
r   r   r   rJ   r†   r[   r    r:   rd   Ú__classcell__©rŒ   s   @r   r�   r�     s"   ø„ ò0ò%ôKò"ò>*ö
r   r�   c                  ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚCountStatementsc                ó    — || _         d| _        y ©Nr   ©rŸ   Ú_statement_count)r   rŸ   s     r   r%   zCountStatements.__init__T  s   € ØˆŒ
Ø !ˆÕr   c                ó.   — | xj                   dz  c_         y )Nr“   )rª   r   s     r   r   z!CountStatements.process_statementX  s   € Ø×Ò Ñ"Ör   c                óv   — | j                   | j                  k7  r J d| j                   | j                  fz  «       ‚y )Nz,desired statement count %d does not match %dr©   r   s    r   r   z"CountStatements.no_more_statements[  sC   € Ø�:‰:˜×.Ñ.Ò.ðÐHØ—
‘
Ø×%Ñ%ðLñ ó �5ð /r   N)r   r   r   r%   r   r   r   r   r   r¦   r¦   S  s   „ ò"ò#ór   r¦   c                  ó   — e Zd Zd„ Zd„ Zy)ÚAllOfc                ó$   — t        |«      | _        y r   )ÚsetÚrules©r   r±   s     r   r%   zAllOf.__init__d  s   € Ü˜“Zˆ�
r   c                óX  — t        | j                  «      D ]k  }d |_        |j                  |«       |j                  r0| j                  j                  |«       | j                  sd| _         y |j                  rŒdd | _         y  t        | j                  «      d   j                  | _        y ©NTr   )ra   r±   r   r   r   Údiscard©r   r   Úrules      r   r   zAllOf.process_statementg  s‹   € Ü˜Ÿ™Ö$ˆDØ $ˆDÔØ×"Ñ"Ð#3Ô4Ø×ÒØ—
‘
×"Ñ" 4Ô(Ø—z’zØ'+�DÔ$ÙØ×&Ó&à$(�Ô!Ùð %ô !% T§Z¡ZÓ 0°Ñ 3× @Ñ @ˆDÕr   Nr,   r   r   r   r®   r®   c  s   „ ò óAr   r®   c                  ó*   ‡ — e Zd Zd„ Zd„ Zˆ fd„Zˆ xZS )ÚEachOfc                ó$   — t        |«      | _        y r   )ra   r±   r²   s     r   r%   zEachOf.__init__y  s   € Ü˜%“[ˆ�
r   c                óv  — | j                   sd| _        d| _        | j                   r| j                   d   }|j                  |«       |j                  r| j                   j	                  d«       n|j
                  r|j
                  | _        |j                  rn| j                   rŒ| j                   sd| _        y y )NTFr   )r±   r   r   r   r*   r   r¶   s      r   r   zEachOf.process_statement|  s—   € Ø�zŠzØ#ˆDÔØ%*ˆDÔ"à�jŠjØ—:‘:˜a‘=ˆDØ×"Ñ"Ð#3Ô4Ø×ÒØ—
‘
—‘˜qÕ!Ø×"Ò"Ø$(×$5Ñ$5�Ô!Ø×%Ò%Øð �j‹jð �zŠzØ#ˆDÕð r   c                óÂ   •— | j                   r7| j                   d   j                  s| j                   d   j                  «        y | j                   rt        ‰| �	  «        y y r¨   )r±   r   r   rˆ   )r   rŒ   s    €r   r   zEachOf.no_more_statementsŽ  sE   ø€ Ø�:Š:˜dŸj™j¨™m×7Ò7Ø�J‰J�q‰M×,Ñ,Õ.Ø�ZŠZÜ‰GÑ&Õ(ð r   )r   r   r   r%   r   r   r£   r¤   s   @r   r¹   r¹   x  s   ø„ ò!ò$÷$)ð )r   r¹   c                  ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ÚConditionalc                ó<   •— |rt        ‰| �  |Ž  y t        ‰| �  |Ž  y r   )rˆ   r%   )r   Ú	conditionr±   Ú
else_rulesrŒ   s       €r   r%   zConditional.__init__–  s    ø€ ÙÜ‰GÑ˜eÒ$ä‰GÑ˜jÒ)r   )r   r   r   r%   r£   r¤   s   @r   r¾   r¾   •  s   ø„ ÷*ð *r   r¾   c                  ó   — e Zd Zd„ Zy)ÚOrc                óÀ   — | j                   D ](  }|j                  |«       |j                  sŒ!d| _         y  t        | j                   «      d   j                  | _        y r´   )r±   r   r   ra   r   r¶   s      r   r   zOr.process_statementž  sQ   € Ø—J”JˆDØ×"Ñ"Ð#3Ô4Ø×ÓØ#'�Ô Ùð	 ô !% T§Z¡ZÓ 0°Ñ 3× @Ñ @ˆDÕr   N)r   r   r   r   r   r   r   rÃ   rÃ   �  s   „ óAr   rÃ   c                  ó   — e Zd Zd„ Zd„ Zy)ÚSQLExecuteObservedc                ó‚   — || _         || _        |r|| _        g | _        y |r|g| _        g | _        y g | _        g | _        y r   )rQ   rT   r)   r(   )r   rQ   rT   Úmultiparamsr$   s        r   r%   zSQLExecuteObserved.__init__©  sK   € ØˆŒØ*ˆÔáØ)ˆDŒOð
 ˆ�ñ	 Ø%˜hˆDŒOð ˆ�ð !ˆDŒOØˆ�r   c                ó,   — t        | j                  «      S r   )rW   r(   r   s    r   Ú__repr__zSQLExecuteObserved.__repr__µ  s   € Ü�4—?‘?Ó#Ð#r   N)r   r   r   r%   rÊ   r   r   r   rÆ   rÆ   ¨  s   „ ò
ó$r   rÆ   c                  ó   — e Zd Zy)ÚSQLCursorExecuteObservedNr   r   r   r   rÌ   rÌ   ¹  s   „ ð 	r   rÌ   )r#   r)   rQ   Úexecutemanyc                  ó   — e Zd Zd„ Zd„ Zd„ Zy)ÚSQLAsserterc                ó   — g | _         y r   )Úaccumulatedr   s    r   r%   zSQLAsserter.__init__Ã  s
   € ØˆÕr   c                ó*   — | j                   | _        | ` y r   )rÑ   Ú_finalr   s    r   Ú_closezSQLAsserter._closeÆ  s   € Ø×&Ñ&ˆŒØÑr   c                ó2  — t        |Ž }t        | j                  «      }|rO|j                  d«      }|j	                  |«       |j
                  rn |j                  rJ |j                  «       ‚|rŒO|r
J d|z  «       ‚|j
                  s|j                  «        y y )Nr   z$Additional SQL statements remain:
%s)r¹   ra   rÓ   r*   r   r   r   r   )r   r±   r·   Úobservedr#   s        r   Úassert_zSQLAsserter.assert_Ê  s�   € Ü�uˆ~ˆä˜Ÿ™Ó$ˆÙØ Ÿ™ Q›ˆIØ×"Ñ" 9Ô-Ø×ÒØØ×"Ò"Ø/˜d×/Ñ/Ó/�uò ñ ØLÐAÀHÑLÓL�5Ø×!Ò!Ø×#Ñ#Õ%ð "r   N)r   r   r   r%   rÔ   r×   r   r   r   rÏ   rÏ   Â  s   „ òòó&r   rÏ   c              #  ó®  ‡‡K  — t        «       Šg Št        j                  | d«      ˆfd„«       }t        j                  | d«      ˆˆfd„«       }	 ‰–— t        j                  | d|«       t        j                  | d|«       ‰j	                  «        y # t        j                  | d|«       t        j                  | d|«       ‰j	                  «        w xY w­w)NÚbefore_executec                ó   •— |||f‰d d  y r   r   )ÚconnrT   rÈ   r$   rR   Úorigs        €r   Úconnection_executez)assert_engine.<locals>.connection_executeá  s   ø€ ð   ¨fÐ4ˆ‰Q‰r   Úafter_cursor_executec                ó,  •— |sy ‰j                   r+‰j                   d   j                  |u r‰j                   d   }n2t        |‰d   ‰d   ‰d   «      }‰j                   j                  |«       |j                  j                  t        ||||«      «       y )Néÿÿÿÿr   r“   r   )rÑ   rQ   rÆ   Úappendr(   rÌ   )	rÛ   Úcursorr#   r)   rQ   rÍ   ÚobsÚasserterrÜ   s	          €€r   Úcursor_executez%assert_engine.<locals>.cursor_executeé  s’   ø€ ñ Øð × Ò Ø×$Ñ$ RÑ(×0Ñ0°GÑ;à×&Ñ& rÑ*‰Cä$ W¨d°1©g°t¸A±wÀÀQÁÓHˆCØ× Ñ ×'Ñ'¨Ô,Ø�‰×ÑÜ$Ø˜: w°óõ	
r   )rÏ   r   Úlistens_forÚremoverÔ   )ÚenginerÝ   rå   rä   rÜ   s      @@r   Úassert_engineré   Û  s¼   ùè ø€ ä‹}€Hà€Dä
×Ñ�vÐ/Ó0ó5ó 1ð5ô ×Ñ�vÐ5Ó6ô
ó 7ð
ð*ØŠä�‰�VÐ3°^ÔDÜ�‰�VÐ-Ð/AÔBØ�‰Õøô 	�‰�VÐ3°^ÔDÜ�‰�VÐ-Ð/AÔBØ�‰Õüs   „A
CÁB Á?CÂA CÃC)Ú
__future__r   ÚcollectionsÚ
contextlibrž   r6   r5   r   rè   r   Úengine.defaultr   Úschemar   r
   r   r!   r.   rx   r�   r¦   r®   r¹   r¾   rÃ   rÆ   Ú
namedtuplerÌ   rÏ   Úcontextmanagerré   r   r   r   Ú<module>rñ      sü   ðõ #ã Û Û Û 	å Ý Ý +Ý #÷
ñ 
ô	�:ô 	ô.�ô .ô8d
�,ô d
ôN:ˆ{ô :ô4I
�ô I
ôX�jô ô AˆJô Aô*)ˆZô )ô:*�&ô *ôAˆô A÷$ñ $ô"	Ø€K×ÑØ"Ú=óô	÷&ñ &ð2 ×Ññ(ó ñ(r   