§
    ±½j²8  ã                  ó¸   — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlZddlmZ ddlZddlmZ ddlmZmZmZ ej        dd	„¦   «         Z G d
„ d¦  «        ZdS )zü
Adversarial Challenge: Chat Concurrency, 64-Shard Routing, and Memory Bounding.
Validates: multi-channel load across 64 shards, fan-out latency p99 < 15ms,
100-msg ring buffer rollover, duplicate spam prevention, whisper blacklist, and shard entropy.
é    )ÚannotationsN)ÚList©ÚChatService)ÚChatChannelTypeÚChatMessageDTOÚSendChatRequestDTOÚreturnr   c                 ó"   — t          d¬¦  «        S )Né@   ©Úcluster_shardsr   © ó    ú]C:\Projects\FreeExile\tests\security_fuzzing\test_chat_concurrency_and_routing_adversarial.pyÚchat_servicer      s   € å bÐ)Ñ)Ô)Ð)r   c                  ó"  — e Zd ZdZej        j        dd„¦   «         Zej        j        dd„¦   «         Zej        j        dd„¦   «         Z	ej        j        dd	„¦   «         Z
ej        j        dd
„¦   «         Zej        j        dd„¦   «         Zdd„ZdS )Ú(TestChatConcurrencyAndRoutingAdversarialzFAdversarial stress and concurrency challenge harness for Milestone M1.r   r   r
   ÚNonec              ƒ  óÊ  ‡‡‡K  — g Šg d¢}|D ]/}t          dd¦  «        D ]}‰                     ||ˆfd„¦  «         ŒŒ0d$ˆfd	„Šˆfd
„t          d¦  «        D ¦   «         }t          j        |ddiŽƒ d{V —†}t	          |¦  «        }d}||u }	|	sòt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}t          ‰¦  «        }d}||k    }	|	sòt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        ‰¦  «        rt          j
        ‰¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }
dd|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}	}t          d„ ‰j        j        j        D ¦   «         ¦  «        }d}||k    }|s—t          j        d|fd||f¦  «        d t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd t          j
        |¦  «        d!œz  }d"d#|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )%zQChallenge H1: 80 concurrent async publishers across all 8 channels and 64 shards.)ÚworldÚrecruitÚsystemúzone:ancient_barrowzzone:iron_forgezguild:iron_clanzparty:raid_team_1zfeedback:9001é   é   c                ó.   •— ‰                      | ¦  «        S ©N)Úappend)ÚmsgÚreceived_messagess    €r   ú<lambda>zgTestChatConcurrencyAndRoutingAdversarial.test_concurrent_multi_channel_load_64_shards.<locals>.<lambda>%   s   ø€ ÐFW×F^ÒF^Ð_bÑFcÔFc€ r   ÚidxÚintr
   Úboolc              “  ó  •K  — t          t          ¦  «        | t          t          ¦  «        z           }t          d| z   d| › �d|d| › �ddd|t          j        k    rdnd	¬
¦	  «	        }‰                     |¦  «        ƒ d {V —†}|j        S )Ni@ ÚTester_é2   zConcurrent message payload Úancient_barrowÚ	iron_clanÚraid_team_1iA r   ©	Ú	sender_idÚsender_nameÚsender_levelÚchannelÚcontentÚzone_idÚguild_idÚparty_idÚ	target_id)Úlistr   Úlenr	   ÚWHISPERÚhandle_send_chatÚsuccess)r#   Úch_typeÚreqÚresr   s       €r   Ú	publisherzhTestChatConcurrencyAndRoutingAdversarial.test_concurrent_multi_channel_load_64_shards.<locals>.publisher(   s§   øè è € Ý�?Ñ+Ô+¨Cµ#µoÑ2FÔ2FÑ,FÔGˆGÝ$Ø! C™-Ø+ c˜O˜OØØØ;°cÐ;Ð;Ø(Ø$Ø&Ø%,µÔ0GÒ%GÐ%G˜'˜'ÈQð
ñ 
ô 
ˆCð %×5Ò5°cÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:ˆCØ”;Ðr   c                ó&   •— g | ]} ‰|¦  «        ‘ŒS r   r   )Ú.0Úir>   s     €r   ú
<listcomp>ziTestChatConcurrencyAndRoutingAdversarial.test_concurrent_multi_channel_load_64_shards.<locals>.<listcomp>8   s!   ø€ Ð1Ð1Ð1 !��˜1‘”Ð1Ð1Ð1r   éP   Úreturn_exceptionsFNT©Úis©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} is %(py6)sÚallÚresults©Úpy0Úpy1Úpy3Úpy6úassert %(py8)sÚpy8r   )ú>)z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sr7   r!   c              3  ó@   K  — | ]}t          |¦  «        d k    ¯dV — ŒdS ©r   r   N©r7   ©r@   Úshards     r   ú	<genexpr>zhTestChatConcurrencyAndRoutingAdversarial.test_concurrent_multi_channel_load_64_shards.<locals>.<genexpr>?   s6   è è € ð 
ð 
ØÍ#ÈeÉ*Ì*ÐWXÊ.È.ˆAÈ.È.È.È.ð
ð 
r   é   ©ú>=)z%(py0)s >= %(py3)sÚnon_empty_shards©rK   rM   úassert %(py5)sÚpy5©r#   r$   r
   r%   )ÚrangeÚsubscribe_clientÚasyncioÚgatherrH   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr7   ÚsumÚcluster_routerÚregistryÚshards)Úselfr   ÚchannelsÚchÚsub_idÚtasksrI   Ú@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9r[   Ú@py_assert1Ú@py_format4Ú@py_format6r>   r!   s    `              @@r   Ú,test_concurrent_multi_channel_load_64_shardszUTestChatConcurrencyAndRoutingAdversarial.test_concurrent_multi_channel_load_64_shards   s!  øøøè è € ð 35Ðð
ð 
ð 
ˆð ð 	eð 	eˆBÝ  2™,œ,ð eð e�Ø×-Ò-¨b°&Ð:cÐ:cÐ:cÐ:cÑdÔdÐdÐdðeð	ð 	ð 	ð 	ð 	ð 	ð  2Ð1Ð1Ð1¥u¨R¡y¤yÐ1Ñ1Ô1ˆÝœ¨ÐGÀÐGÐGÐGÐGÐGÐGÐGÐGˆå�7‰|Œ|Ð#˜tÐ#ˆ|˜tÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆ|˜tÐ#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#�sÑ#Ô#Ð#Õ#Ô#�sÑ#Ô#Ð#Ð#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#�7Ñ#Ô#Ð#Õ#Ô#�7Ñ#Ô#Ð#Ð#Õ#Ô#ˆ|Ñ#Ô#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#ÝÐ$Ñ%Ô%Ð)¨Ð)Ð%¨Ò)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð%¨Ð)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�sÑ)Ô)Ð)Õ)Ô)�sÑ)Ô)Ð)Ð)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)Ð$Ñ)Ô)Ð)Õ)Ô)Ð$Ñ)Ô)Ð)Ð)Õ)Ô)Ð%Ñ)Ô)Õ)Ô)¨Ñ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)õ ð 
ð 
Ø'Ô6Ô?ÔFð
ñ 
ô 
ñ 
ô 
Ðð $%Ð$Ð 1Ò$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$Ð 1Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ÐÑ$Ô$Ð$Õ$Ô$ÐÑ$Ô$Ð$Ð$Õ$Ô$ 1Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$r   c           	   ƒ  ól  ‡‡K  — dŠd5ˆfd„}d5ˆfd„}t          dd	¦  «        D ]&}|d
z  dk    r|n|}|                     d||¦  «         Œ't          d¦  «        D �]}t          d|z   d|› �dt          j        d|› �¬¦  «        }|                     |¦  «        ƒ d{V —†}|j        }	d}
|	|
u }|sªt          j        d|fd|	|
f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}}
�Œd}d}
||
z  }‰|k    }	|	sªt          j        d|	fd‰|f¦  «        dt          j
        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |¦  «        t          j        |
¦  «        dœz  }dd |iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}x}
}|j                             ¦   «         }|d!         }d"}||k     }|s‹t          j        d#|fd$||f¦  «        t          j        |¦  «        t          j        |¦  «        d%œz  }t          j        d&|d!         › d'�¦  «        d(z   d)|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}t%          d*¬+¦  «        }dŠd5ˆfd,„}t          dd-¦  «        D ]}|                     d||¦  «         Œt          d.¦  «        D �]}t          d/|z   d0|› �dt          j        d1|› �¬¦  «        }|                     |¦  «        ƒ d{V —†}|j        }	d}
|	|
u }|sªt          j        d|fd|	|
f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        t          j        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}}
�Œd.}d2}
||
z  }‰|k    }	|	sªt          j        d|	fd‰|f¦  «        d3t          j
        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        nd3t          j        |¦  «        t          j        |
¦  «        dœz  }dd |iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}x}
}|j                             ¦   «         }|d!         }d"}||k     }|s‹t          j        d#|fd$||f¦  «        t          j        |¦  «        t          j        |¦  «        d%œz  }t          j        d4|d!         › d'�¦  «        d(z   d)|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}dS )6zOChallenge H2: Fan-out latency percentiles under burst load meet p99 < 15ms SLA.r   r    r   r
   r   c                ó   •— ‰dz  Šd S ©Nr   r   ©r    Údelivery_counts    €r   Ú	sync_sinkzkTestChatConcurrencyAndRoutingAdversarial.test_fan_out_latency_percentiles_burst_sla_15ms.<locals>.sync_sinkI   s   ø€ à˜aÑˆNˆNˆNr   c              “  ó   •K  — ‰dz  Šd S r€   r   r�   s    €r   Ú
async_sinkzlTestChatConcurrencyAndRoutingAdversarial.test_fan_out_latency_percentiles_burst_sla_15ms.<locals>.async_sinkM   s   øè è € à˜aÑˆNˆNˆNr   r   ié  é
   r   éd   ià“ ÚBroadcaster_é(   zWorld broadcast pulse #©r-   r.   r/   r0   r1   NTrE   ©z/%(py2)s
{%(py2)s = %(py0)s.success
} is %(py5)sr=   ©rK   Úpy2r^   úassert %(py7)sÚpy7éè  ©ú==)z%(py0)s == (%(py3)s * %(py5)s)r‚   )rK   rM   r^   rO   rP   Úp99g      .@©ú<)z%(py1)s < %(py4)s)rL   Úpy4zMixed p99 latency zms breached 15.0ms SLA!z
>assert %(py6)srN   r   r   c                ó   •— ‰dz  Šd S r€   r   )r    Úsync_deliveriess    €r   Úmem_sinkzjTestChatConcurrencyAndRoutingAdversarial.test_fan_out_latency_percentiles_burst_sla_15ms.<locals>.mem_sinki   s   ø€ à˜qÑ ˆOˆOˆOr   i¡  r(   i0W ÚSyncBroadcaster_zSync pulse #i   r˜   zSync p99 latency )r    r   r
   r   )r`   ra   r	   r   ÚWORLDr9   r:   rd   re   rf   rg   rh   ri   rj   rk   rm   Úget_latency_statsÚ_format_assertmsgr   )rp   r   rƒ   r…   rA   ÚcbÚbr<   r=   rz   rw   Ú@py_assert3r|   Ú@py_format8ru   Ú@py_assert6rx   ry   ÚstatsÚ@py_assert0Ú@py_format5Úchat_service_syncr™   Ú
sync_statsr‚   r˜   s                           @@r   Ú/test_fan_out_latency_percentiles_burst_sla_15mszXTestChatConcurrencyAndRoutingAdversarial.test_fan_out_latency_percentiles_burst_sla_15msD   s?  øøè è € ð ˆð	 ð 	 ð 	 ð 	 ð 	 ð 	 ð	 ð 	 ð 	 ð 	 ð 	 ð 	 õ
 �q˜$‘”ð 	:ð 	:ˆAØ "™f¨šk˜k��¨zˆBØ×)Ò)¨'°1°bÑ9Ô9Ð9Ð9å�s‘”ð 		'ñ 		'ˆAÝ$Ø! A™+Ø.¨1Ð.Ð.ØÝ'Ô-Ø5°!Ð5Ð5ðñ ô ˆCð %×5Ò5°cÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:ˆCØ”;Ð& $Ð&�; $Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&�; $Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&�3Ñ&Ô&Ð&Õ&Ô&�3Ñ&Ô&Ð&Ð&Õ&Ô&�;Ñ&Ô&Õ&Ô& $Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ñ&à!$Ð+ tÐ+  t¡Ð+ˆ~ Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+ˆ~ Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆ~Ñ+Ô+Ð+Õ+Ô+ˆ~Ñ+Ô+Ð+Ð+Õ+Ô+ Ñ+Ô+Õ+Ô+ tÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØÔ+×=Ò=Ñ?Ô?ˆØ�UŒ|Ð^˜dÐ^ˆ|˜dÒ"Ð^Ð^Ð^Õ^Ô^Ð^Ð^Ð^Ð^ˆ|˜dÐ^Ñ^Ô^Õ^Ô^ˆ|Ñ^Ô^Õ^Ô^˜dÑ^Ô^Ð^Ð^Ñ^Ð^Õ^Ô^Ð$^¸¸u¼Ð$^Ð$^Ð$^Ñ^Ô^Ð^Ñ^Ð^Ð^Ð^Ñ^Ð^Õ^Õ^Ô^Ð^Ñ^Ô^Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^Ð^õ (°rÐ:Ñ:Ô:ÐØˆð	!ð 	!ð 	!ð 	!ð 	!ð 	!õ �q˜$‘”ð 	Eð 	EˆAØ×.Ò.¨w¸¸8ÑDÔDÐDÐDå�r‘”ð 		'ñ 		'ˆAÝ$Ø! A™+Ø2¨qÐ2Ð2ØÝ'Ô-Ø* qÐ*Ð*ðñ ô ˆCð *×:Ò:¸3Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?ˆCØ”;Ð& $Ð&�; $Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&�; $Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&�3Ñ&Ô&Ð&Õ&Ô&�3Ñ&Ô&Ð&Ð&Õ&Ô&�;Ñ&Ô&Õ&Ô& $Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ñ&à"$Ð+ tÐ+ " t¡)Ð+ˆ )Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+ˆ )Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆÑ+Ô+Ð+Õ+Ô+ˆÑ+Ô+Ð+Ð+Õ+Ô+ "Ñ+Ô+Õ+Ô+ tÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø&Ô5×GÒGÑIÔIˆ
Ø˜%Ô Ðg 4ÐgÐ  4Ò'ÐgÐgÐgÕgÔgÐgÐgÐgÐgÐ  4ÐgÑgÔgÕgÔgÐ ÑgÔgÕgÔg 4ÑgÔgÐgÐgÑgÐgÕgÔgÐ)g¸ZÈÔ=NÐ)gÐ)gÐ)gÑgÔgÐgÑgÐgÐgÐgÑgÐgÕgÕgÔgÐgÑgÔgÑgÔgÐgÐgÐgÐgÐgÐgÐgÐgÐgr   c           
   ƒ  óœ  K  — t          j        ¦   «          t          j        ¦   «         \  }}d}t          d¦  «        D ]‘}t	          di dd|› �“dd|z   “dd|› �“d	d
“dd
“dt
          j        “dd“dd|› �“dd|› �“dt          t          j        ¦   «         dz  ¦  «        “dd“dd“dd“dd“dd
“dd
“Ž}|j	         
                    ||¦  «         Œ’|                     |¦  «        }t          |¦  «        }d}	||	k    }
|
�st          j        d|
fd||	f¦  «        d t          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd d!t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd!t          j        |¦  «        t          j        |	¦  «        d"œz  }t          j        d#t          |¦  «        › d$�¦  «        d%z   d&|iz  }t)          t          j        |¦  «        ¦  «        ‚d'x}x}
}	|d         }|j        }d(}	||	k    }
|
st          j        d|
fd)||	f¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |	¦  «        d*œz  }d+d&|iz  }t)          t          j        |¦  «        ¦  «        ‚d'x}x}x}
}	|d,         }|j        }d-}	||	k    }
|
st          j        d|
fd)||	f¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |	¦  «        d*œz  }d+d&|iz  }t)          t          j        |¦  «        ¦  «        ‚d'x}x}x}
}	t          j        ¦   «         \  }}t          j        ¦   «          ||z
  d.z  }d/}||k     }|s±t          j        d0|fd1||f¦  «        d2t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd2t          j        |¦  «        d3œz  }t          j        d4|d5›d6�¦  «        d7z   d8|iz  }t)          t          j        |¦  «        ¦  «        ‚d'x}}d'S )9zRChallenge H3: 100-message ring buffer strictly bounds memory under 1,500 messages.r   iÜ  Ú
message_idÚmsg_r-   i€ r.   ÚPlayer_Úsender_titleÚ Úsender_guild_tagr0   r5   r   Úraw_contentzBarrow combat callout #Úfiltered_contentÚtimestamp_msr�   Úis_censoredFÚmoderation_risk_scoreÚlinked_itemsr   r2   r)   r3   r4   r‡   r‘   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr7   ÚhistoryrJ   zHistory length z exceeded 100!z
>assert %(py8)srP   NÚmsg_1400)z2%(py3)s
{%(py3)s = %(py1)s.message_id
} == %(py6)s)rL   rM   rN   rO   éÿÿÿÿÚmsg_1499i   g       @r”   )z%(py0)s < %(py3)sÚdelta_mbr\   zMemory delta z.2fz%MB indicates unbounded buffer growth!ú
>assert %(py5)sr^   )ÚtracemallocÚstartÚget_traced_memoryr`   r   r   ÚZONEr$   ÚtimeÚchannel_managerÚadd_to_historyÚget_channel_historyr7   rd   re   rf   rg   rh   ri   r�   rj   rk   rª   Ústop)rp   r   Ú	mem_startÚ_Úchannel_keyrA   r    r¶   ru   rv   rw   rx   ry   r¤   Úmem_endrº   rz   r{   r|   s                      r   Ú-test_ring_buffer_memory_bounding_and_rolloverzVTestChatConcurrencyAndRoutingAdversarial.test_ring_buffer_memory_bounding_and_rollover   sb  è è € õ 	ÔÑÔÐÝ"Ô4Ñ6Ô6‰ˆ	�1à+ˆõ �t‘”ð 	Jð 	JˆAÝ ð ð ð Ø% !˜:˜:˜:ðà! A™+˜+ðð * a˜M˜M˜Mðð  ˜Rð	ð
 "$ ðõ (Ô,Ð,ðð ˜!ðð :°aÐ9Ð9Ð9ðð "?¸1Ð!>Ð!>Ð!>ðõ !¥¤¡¤¨tÑ!3Ñ4Ô4Ð4ðð "˜Eðð '( aðð  ˜Rðð )Ð(ðð ˜ðð  ˜ð!ˆCð$ Ô(×7Ò7¸ÀSÑIÔIÐIÐIà×2Ò2°;Ñ?Ô?ˆÝ�7‰|Œ|ÐR˜sÐRˆ|˜sÒ"ÐRÐRÑRÕRÔRÐRÐRÐRÐRˆ|˜sÐRÑRÔRÐRÕRÔRÑRÔRÐRÐRÕRÔR�sÑRÔRÐRÕRÔR�sÑRÔRÐRÐRÐRÕRÔRÑRÔRÐRÐRÕRÔR�7ÑRÔRÐRÕRÔR�7ÑRÔRÐRÐRÕRÔRˆ|ÑRÔRÕRÔR˜sÑRÔRÐRÐRÑRÐRÕRÔRÐ$Rµc¸'±l´lÐ$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ð �qŒzÐ2ˆzÔ$Ð2¨
Ð2Ð$¨
Ò2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð$¨
Ð2Ñ2Ô2Õ2Ô2ˆzÑ2Ô2Õ2Ô2Ð$Ñ2Ô2Õ2Ô2¨
Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ð2Ø�rŒ{Ð3ˆ{Ô%Ð3¨Ð3Ð%¨Ò3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð%¨Ð3Ñ3Ô3Õ3Ô3ˆ{Ñ3Ô3Õ3Ô3Ð%Ñ3Ô3Õ3Ô3¨Ñ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3å Ô2Ñ4Ô4‰
ˆ�ÝÔÑÔÐØ˜iÑ'¨KÑ8ˆØÐbˆx˜#Š~ÐbÐbÐbÕbÔbÐbÐbÐbÐbˆx˜#ÐbÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔbˆxÑbÔbÐbÕbÔbˆxÑbÔbÐbÐbÕbÔb˜#ÑbÔbÐbÐbÑbÐbÕbÔbÐb¨xÐbÐbÐbÐbÑbÔbÐbÑbÐbÐbÐbÑbÐbÕbÕbÔbÐbÑbÔbÑbÔbÐbÐbÐbÐbÐbÐbÐbr   c              ƒ  óT  K  — t          dddt          j        d¬¦  «        }|                     |¦  «        ƒ d{V —†}|j        }d}||u }|sªt          j        d|fd	||f¦  «        d
t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd
t          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}t          dddt          j        d¬¦  «        }	|                     |	¦  «        ƒ d{V —†}
|
j        }d}||u }|sªt          j        d|fd	||f¦  «        dt          j        ¦   «         v st          j	        |
¦  «        rt          j
        |
¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}g }d}|
j        }|j        } |¦   «         }||v }|}|s d}|
j        }|j        } |¦   «         }||v }|}|�sÊt          j        d|fd||f¦  «        t          j
        |¦  «        dt          j        ¦   «         v st          j	        |
¦  «        rt          j
        |
¦  «        ndt          j
        |¦  «        t          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }|                     |¦  «         |sÄt          j        d|fd||f¦  «        t          j
        |¦  «        dt          j        ¦   «         v st          j	        |
¦  «        rt          j
        |
¦  «        ndt          j
        |¦  «        t          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}x}x}x}x}}t          dd dt          j        d!d"¬#¦  «        }|                     |¦  «        ƒ d{V —†}|j        }d}||u }|sªt          j        d|fd	||f¦  «        d$t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd$t          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}t%          j        d%¦  «        ƒ d{V —† t          dd dt          j        d!d"¬#¦  «        }|                     |¦  «        ƒ d{V —†}|j        }d}||u }|sªt          j        d|fd	||f¦  «        d&t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd&t          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}dS )'zSChallenge H4: Duplicate spam within 5s is rejected on World/Zone, allowed on Party.i!¡ ÚSpamCandidateé   z WTS Than Ma Kiem +15 gia cuc re!rŠ   NTrE   r‹   Úres1rŒ   rŽ   r�   z$  wts than ma kiem +15 gia cuc re!  FÚres1_dupÚspamÚnhanh©Úin)zi%(py3)s in %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.error_message
}.lower
}()
})rM   r^   r�   Úpy9Úpy11z%(py13)sÚpy13)zo%(py16)s in %(py24)s
{%(py24)s = %(py22)s
{%(py22)s = %(py20)s
{%(py20)s = %(py18)s.error_message
}.lower
}()
})Úpy16Úpy18Úpy20Úpy22Úpy24z%(py26)sÚpy26r   zassert %(py29)sÚpy29i"¡ ÚHealerÚteam_dungeonz"Boss dang cast ultimate! Ne chieu!)r-   r.   r/   r0   r4   r1   Úres_p1g      Ð?Úres_p2)r	   r   r›   r9   r:   rd   re   rf   rg   rh   ri   rj   rk   Úerror_messageÚlowerr   Ú_format_boolopÚPARTYrb   Úsleep)rp   r   Úreq1rÍ   rz   rw   r    r|   r¡   Úreq1_duprÎ   ru   r¢   Ú@py_assert8Ú@py_assert10r¤   Ú@py_assert15Ú@py_assert19Ú@py_assert21Ú@py_assert23Ú@py_assert17Ú@py_format12Ú@py_format14Ú@py_format25Ú@py_format27Ú@py_format28Ú@py_format30Úreq_party_1rß   Úreq_party_2rà   s                                  r   Ú-test_duplicate_spam_prevention_world_and_zonezVTestChatConcurrencyAndRoutingAdversarial.test_duplicate_spam_prevention_world_and_zone©   sŒ  è è € õ "ØØ'ØÝ#Ô)Ø6ð
ñ 
ô 
ˆð "×2Ò2°4Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8ˆØŒ|Ð#˜tÐ#ˆ|˜tÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆ|˜tÐ#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#ˆtÑ#Ô#Ð#Õ#Ô#ˆtÑ#Ô#Ð#Ð#Õ#Ô#ˆ|Ñ#Ô#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#õ &ØØ'ØÝ#Ô)Ø:ð
ñ 
ô 
ˆð &×6Ò6°xÑ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@ˆØÔÐ( 5Ð(Ð 5Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð 5Ð(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆxÑ(Ô(Ð(Õ(Ô(ˆxÑ(Ô(Ð(Ð(Õ(Ô(ÐÑ(Ô(Õ(Ô( 5Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(àdÐdˆvÐd˜Ô/ÐdÐ/Ô5ÐdÐ5Ð5Ñ7Ô7ÐdˆvÐ7Ð7ÐdÐdÐdÐdÐd¸7ÐdÀhÔF\ÐdÐF\ÔFbÐdÐFbÐFbÑFdÔFdÐd¸7ÐFdÐ;dÐdÐdÐdÐdÑdÕdÔdÐdÐdÐdÐdˆvÐ7ÐdÑdÔdÕdÔdˆvÑdÔdÐdÕdÔdÑdÔdÐdÐdÕdÔd˜ÑdÔdÐdÕdÔd˜ÑdÔdÐdÐdÕdÔdÐ/ÑdÔdÕdÔdÐ5ÑdÔdÕdÔdÐ7ÑdÔdÐdÐdÑdÐdÐdÐdÐdÐdÑdÐdÐd×dÒdÐdÑdÔdÐdÐdÐdÕdÔdÐdÐdÐdÐd¸7ÐFdÐdÑdÔdÕdÔd¸7ÑdÔdÐdÕdÔdÑdÔdÐdÐdÕdÔdÀhÑdÔdÐdÕdÔdÀhÑdÔdÐdÐdÕdÔdÐF\ÑdÔdÕdÔdÐFbÑdÔdÕdÔdÐFdÑdÔdÐdÐdÑdÐdÐdÐdÐdÐdÑdÐdÐd×dÒdÐdÑdÔdÐdÕdÔdÐdÐdÑdÔdÐdÑdÐdÐdÐdÐdÐdÑdÐdÕdÕdÔdÐdÑdÔdÑdÔdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdÐdõ )ØØ ØÝ#Ô)Ø#Ø8ð
ñ 
ô 
ˆð $×4Ò4°[ÑAÔAÐAÐAÐAÐAÐAÐAˆØŒ~Ð% Ð%ˆ~ Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ~ Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆvÑ%Ô%Ð%Õ%Ô%ˆvÑ%Ô%Ð%Ð%Õ%Ô%ˆ~Ñ%Ô%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%õ Œm˜DÑ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ý(ØØ ØÝ#Ô)Ø#Ø8ð
ñ 
ô 
ˆð $×4Ò4°[ÑAÔAÐAÐAÐAÐAÐAÐAˆØŒ~Ð% Ð%ˆ~ Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ~ Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆvÑ%Ô%Ð%Õ%Ô%ˆvÑ%Ô%Ð%Ð%Õ%Ô%ˆ~Ñ%Ô%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%r   c              ƒ  ó  ‡‡K  — t          dddt          j        dd¬¦  «        }‰                     |¦  «        ƒ d{V —†}|j        }d}||u }|sªt          j        d|fd	||f¦  «        d
t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd
t          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}d}	|j        }|	|v }
|
sªt          j        d|
fd|	|f¦  «        t          j
        |	¦  «        d
t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd
t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}
}t          dddt          j        dd¬¦  «        }‰                     |¦  «        ƒ d{V —†}|j        }d}||u }|sªt          j        d|fd	||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}d}	|j        }|	|v }
|
sªt          j        d|
fd|	|f¦  «        t          j
        |	¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}
}‰                     ddd¬¦  «         t          dddt          j        dd¬¦  «        }‰                     |¦  «        ƒ d{V —†}|j        }d}||u }|sªt          j        d|fd	||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}d}	|j        }|	|v }
|
sªt          j        d|
fd|	|f¦  «        t          j
        |	¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}
}d*ˆfd!„Šˆfd"„t          d#¦  «        D ¦   «         }t!          j        |Ž ƒ d{V —†}t%          |¦  «        }
d}|
|u }|sòt          j        d|fd$|
|f¦  «        d%t          j        ¦   «         v st          j	        t$          ¦  «        rt          j
        t$          ¦  «        nd%d&t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd&t          j
        |
¦  «        t          j
        |¦  «        d'œz  }d(d)|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}}dS )+z]Challenge H5: Whisper protection (self-whisper, invalid target, blacklist under concurrency).iÁ'	 Ú	Narcissusé   zTalking to myself©r-   r.   r/   r0   r5   r1   NFrE   r‹   Úself_resrŒ   rŽ   r�   u   chÃ­nh mÃ¬nhrÑ   ©z5%(py1)s in %(py5)s
{%(py5)s = %(py3)s.error_message
}©rL   rM   r^   r   zTalking to voidÚinv_resu   khÃ´ng há»£p lá»‡éÂ'	 T)Ú	player_idÚblocked_player_idÚ
is_blockedÚSenderzCan you hear me?Úblocked_resu   Ä‘Ã£ cháº·nr#   r$   r
   r%   c           	   “  óœ   •K  — t          d| z   d| › �dt          j        dd| › �¬¦  «        }‰                     |¦  «        ƒ d {V —†}|j        S )Ni$(	 ÚFan_rú   r   zHello fan mail #rû   )r	   r   r8   r9   r:   )r#   ÚrÚrespr   s      €r   Úwhisper_attemptzsTestChatConcurrencyAndRoutingAdversarial.test_whisper_blacklist_and_protection_concurrency.<locals>.whisper_attempt
  sq   øè è € Ý"Ø! C™-Ø( 3˜L˜LØÝ'Ô/Ø!Ø0¨3Ð0Ð0ðñ ô ˆAð &×6Ò6°qÑ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9ˆDØ”<Ðr   c                ó&   •— g | ]} ‰|¦  «        ‘ŒS r   r   )r@   rA   r
  s     €r   rB   znTestChatConcurrencyAndRoutingAdversarial.test_whisper_blacklist_and_protection_concurrency.<locals>.<listcomp>  s#   ø€ Ð7Ð7Ð7¨�� Ñ#Ô#Ð7Ð7Ð7r   é   rG   rH   rI   rJ   rO   rP   r_   )r	   r   r8   r9   r:   rd   re   rf   rg   rh   ri   rj   rk   rá   Úset_blacklist_entryr`   rb   rc   rH   )rp   r   Úself_reqrü   rz   rw   r    r|   r¡   r¤   ru   Úinv_reqrÿ   Úblocked_reqr  rt   rI   rv   rx   ry   r
  s    `                  @r   Ú1test_whisper_blacklist_and_protection_concurrencyzZTestChatConcurrencyAndRoutingAdversarial.test_whisper_blacklist_and_protection_concurrencyÝ   sÝ  øøè è € õ &ØØ#ØÝ#Ô+ØØ'ð
ñ 
ô 
ˆð &×6Ò6°xÑ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@ˆØÔÐ( 5Ð(Ð 5Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð 5Ð(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆxÑ(Ô(Ð(Õ(Ô(ˆxÑ(Ô(Ð(Ð(Õ(Ô(ÐÑ(Ô(Õ(Ô( 5Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÐ7 Ô!7Ð7ˆ~Ð!7Ð7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7ˆ~Ð!7Ð7Ñ7Ô7Õ7Ô7ˆ~Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7 Ñ7Ô7Ð7Õ7Ô7 Ñ7Ô7Ð7Ð7Õ7Ô7Ð!7Ñ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7õ %ØØ#ØÝ#Ô+ØØ%ð
ñ 
ô 
ˆð %×5Ò5°gÑ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>ˆØŒÐ' %Ð'ˆ %Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆ %Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Ð'Õ'Ô'ˆÑ'Ô'Õ'Ô' %Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ø"Ð; gÔ&;Ð;Ð"Ð&;Ð;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð"Ð&;Ð;Ñ;Ô;Õ;Ô;Ð"Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô; gÑ;Ô;Ð;Õ;Ô; gÑ;Ô;Ð;Ð;Õ;Ô;Ð&;Ñ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;ð 	×(Ò(°7ÈgÐbfÐ(ÑgÔgÐgå(ØØ ØÝ#Ô+ØØ&ð
ñ 
ô 
ˆð )×9Ò9¸+ÑFÔFÐFÐFÐFÐFÐFÐFˆØÔ"Ð+ eÐ+Ð" eÐ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð" eÐ+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆ{Ñ+Ô+Ð+Õ+Ô+ˆ{Ñ+Ô+Ð+Ð+Õ+Ô+Ð"Ñ+Ô+Õ+Ô+ eÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØÐ9 Ô 9Ð9ˆ}Ð 9Ð9Ð9Ð9Ð9Õ9Ô9Ð9Ð9Ð9Ð9ˆ}Ð 9Ð9Ñ9Ô9Õ9Ô9ˆ}Ñ9Ô9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9 Ñ9Ô9Ð9Õ9Ô9 Ñ9Ô9Ð9Ð9Õ9Ô9Ð 9Ñ9Ô9Ð9Ð9Ñ9Ð9Ð9Ð9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9ð
	 ð 
	 ð 
	 ð 
	 ð 
	 ð 
	 ð 8Ð7Ð7Ð7­U°2©Y¬YÐ7Ñ7Ô7ˆÝœ¨Ð.Ð.Ð.Ð.Ð.Ð.Ð.ˆÝ�7‰|Œ|Ð#˜tÐ#ˆ|˜tÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆ|˜tÐ#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#�sÑ#Ô#Ð#Õ#Ô#�sÑ#Ô#Ð#Ð#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#�7Ñ#Ô#Ð#Õ#Ô#�7Ñ#Ô#Ð#Ð#Õ#Ô#ˆ|Ñ#Ô#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#r   c              ƒ  ó”	  K  — d}t          |ddt          j        d¬¦  «        }|                     |¦  «        ƒ d{V —†}|j        }d}||u }|sªt          j        d|fd	||f¦  «        d
t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd
t          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        d
t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd
t          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}t          j        dddft          j        dddft          j        dddft          j        dddft          j        dddft          j        dddft          j        dddfg}
|
D �]Ë\  }}}}t          |dd|d||||t          j        k    rdnd¬¦	  «	        }|                     |¦  «        ƒ d{V —†}|j        }d}||u }|sªt          j        d|fd	||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}d}|j        }||v }|sªt          j        d|fd||f¦  «        t          j
        |¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}�ŒÍ|                     |¦  «         |                     |¦  «        \  }}d}||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        d œz  }d!d"|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )#zEChallenge H6: RMT violation persists auto-mute across all 8 channels.ia®
 ÚRMTBotr  zOBan vang SLL gia re lien he telegram @shopvang chuyen khoan atm momo 0912345678rŠ   NFrE   r‹   Úrmt_resrŒ   rŽ   r�   é<   rY   )z2%(py2)s
{%(py2)s = %(py0)s.risk_score
} >= %(py5)sr®   r)   Úclan_1Úparty_1zTrying to evade mute!iG²
 r   r,   Ú	probe_resu   táº¡m khÃ³a chatrÑ   rý   rþ   )z%(py0)s is %(py3)sÚis_mutedr\   r]   r^   )r	   r   r›   r9   r:   rd   re   rf   rg   rh   ri   rj   rk   Ú
risk_scorer¿   ÚRECRUITÚGUILDrä   r8   ÚFEEDBACKrá   Úunmute_playerÚis_player_muted)rp   r   r-   Úrmt_reqr  rz   rw   r    r|   r¡   Útest_channelsrr   Úz_idÚg_idÚp_idÚ	probe_reqr  r¤   ru   r  rÆ   r{   s                         r   Ú,test_persistent_mute_cross_channel_isolationzUTestChatConcurrencyAndRoutingAdversarial.test_persistent_mute_cross_channel_isolation  sÎ  è è € ð ˆ	Ý$ØØ ØÝ#Ô)Øeð
ñ 
ô 
ˆð %×5Ò5°gÑ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>ˆØŒÐ' %Ð'ˆ %Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆ %Ð'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Ð'Õ'Ô'ˆÑ'Ô'Õ'Ô' %Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÔ!Ð' RÐ'Ð! RÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð! RÐ'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Õ'Ô'ˆwÑ'Ô'Ð'Ð'Õ'Ô'Ð!Ñ'Ô'Õ'Ô' RÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'õ Ô" B¨¨BÐ/µ/Ô2FÐHXÐZ\Ð^`Ð1aÝÔ$ b¨"¨bÐ1µOÔ4IÈ2ÈxÐY[Ð3\ÝÔ" B¨¨IÐ6½Ô9PÐRTÐVXÐZ\Ð8]ÝÔ% r¨2¨rÐ2ð	
ˆð %2ð 	Añ 	AÑ ˆB��d˜DÝ*Ø#Ø$ØØØ/ØØØØ%'­?Ô+BÒ%BÐ%B˜'˜'Èð
ñ 
ô 
ˆIð +×;Ò;¸IÑFÔFÐFÐFÐFÐFÐFÐFˆIØÔ$Ð-¨Ð-Ð$¨Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð$¨Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-�9Ñ-Ô-Ð-Õ-Ô-�9Ñ-Ô-Ð-Ð-Õ-Ô-Ð$Ñ-Ô-Õ-Ô-¨Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ø%Ð@¨Ô)@Ð@Ð%Ð)@Ð@Ð@Ð@Ð@Õ@Ô@Ð@Ð@Ð@Ð@Ð%Ð)@Ð@Ñ@Ô@Õ@Ô@Ð%Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@¨Ñ@Ô@Ð@Õ@Ô@¨Ñ@Ô@Ð@Ð@Õ@Ô@Ð)@Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ñ@ð 	×"Ò" 9Ñ-Ô-Ð-Ø"×2Ò2°9Ñ=Ô=‰ˆ�!Ø Ð ˆx˜5Ð Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆx˜5Ð Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆxÑ Ô Ð Õ Ô ˆxÑ Ô Ð Ð Õ Ô ˜5Ñ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð r   c                ób  — |j         j        }g d¢}t          d¦  «        D ]e}|                     d|› �¦  «         |                     d|› �¦  «         |                     d|› �¦  «         |                     d|› d|› �¦  «         Œf|D ]}|                     |dd	„ ¬
¦  «         Œd„ |j        D ¦   «         }t          d„ |D ¦   «         ¦  «        }d}||k    }	|	s°t          j        d|	fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }
t          j        d|› d�¦  «        dz   d|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}	}t!          |¦  «        dz  }t#          |¦  «        }d}||z  }||k     }	|	sít          j        d|	fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          j        d|› �¦  «        dz   d |iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}}dS )!zYChallenge H7: 1,000 distinct channels achieve balanced distribution across all 64 shards.)r   r   r   éú   zzone:dungeon_zguild:syndicate_zparty:team_zwhisper:100z:200r   c                ó   — d S r   r   )r    s    r   r"   zZTestChatConcurrencyAndRoutingAdversarial.test_shard_distribution_entropy.<locals>.<lambda>Q  s   € ÀT€ r   )Ú	client_idÚcallbackc                ó,   — g | ]}t          |¦  «        ‘ŒS r   rT   rU   s     r   rB   z\TestChatConcurrencyAndRoutingAdversarial.test_shard_distribution_entropy.<locals>.<listcomp>S  s   € ÐCÐCÐC¨%�3˜u™:œ:ÐCÐCÐCr   c              3  ó&   K  — | ]}|d k    ¯dV — ŒdS rS   r   )r@   Úcounts     r   rW   z[TestChatConcurrencyAndRoutingAdversarial.test_shard_distribution_entropy.<locals>.<genexpr>T  s&   è è € ÐDÐD˜e¸%À!º)¸)˜¸)¸)¸)¸)ÐDÐDr   r   r‘   )z%(py0)s == %(py3)sÚ	non_emptyr\   zOnly z3/64 shards populated! Distribution entropy too low.r»   r^   Ng      P@g      @r”   )z%(py0)s < (%(py2)s * %(py4)s)Úmax_in_shardÚavg_per_shard)rK   r�   r–   zExtreme clustering in shard: z
>assert %(py7)sr�   )rm   rn   r`   r   Ú	subscribero   rl   rd   re   rf   rg   rh   ri   r�   rj   rk   r7   Úmax)rp   r   rn   Úsample_channelsrA   rr   Úshard_occupancyr/  ru   rz   r{   r|   r1  r0  r    rv   r¡   s                    r   Útest_shard_distribution_entropyzHTestChatConcurrencyAndRoutingAdversarial.test_shard_distribution_entropyF  s>  € àÔ.Ô7ˆØ%CÐ%CÐ%CˆÝ�s‘”ð 	=ð 	=ˆAØ×"Ò"Ð#6°1Ð#6Ð#6Ñ7Ô7Ð7Ø×"Ò"Ð#9°aÐ#9Ð#9Ñ:Ô:Ð:Ø×"Ò"Ð#4°Ð#4Ð#4Ñ5Ô5Ð5Ø×"Ò"Ð#;°Ð#;Ð#;¸Ð#;Ð#;Ñ<Ô<Ð<Ð<à!ð 	Kð 	KˆBØ×Ò˜r¨QÐ9IÐ9IÐÑJÔJÐJÐJàCÐC°8´?ÐCÑCÔCˆÝÐDÐD ÐDÑDÔDÑDÔDˆ	ð Ðfˆy˜BŠÐfÐfÐfÕfÔfÐfÐfÐfÐfˆy˜BÐfÑfÔfÐfÕfÔfÑfÔfÐfÐfÕfÔfˆyÑfÔfÐfÕfÔfˆyÑfÔfÐfÐfÕfÔf˜BÑfÔfÐfÐfÑfÐfÕfÔfÐ f¨	Ð fÐ fÐ fÑfÔfÐfÑfÐfÐfÐfÑfÐfÕfÕfÔfÐfÑfÔfÑfÔfÐfÐfÐfÐfÐfÝ˜OÑ,Ô,¨tÑ3ˆå˜?Ñ+Ô+ˆØ.1Ða˜m¨cÑ1Ðaˆ|Ð1Ò1ÐaÐaÐaÕaÔaÐaÐaÐaÐaˆ|Ð1ÐaÑaÔaÐaÕaÔaÑaÔaÐaÐaÕaÔaˆ|ÑaÔaÐaÕaÔaˆ|ÑaÔaÐaÐaÐaÕaÔaÑaÔaÐaÐaÕaÔa˜mÑaÔaÐaÕaÔa˜mÑaÔaÐaÐaÕaÔa¨cÑaÔaÐaÐaÑaÐaÕaÔaÐ3aÐS_Ð3aÐ3aÑaÔaÐaÑaÐaÐaÐaÑaÐaÕaÕaÔaÐaÑaÔaÑaÔaÐaÐaÐaÐaÐaÐaÐaÐaÐar   N)r   r   r
   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚpytestÚmarkrb   r}   r¨   rÉ   r÷   r  r&  r6  r   r   r   r   r      s$  € € € € € ØPÐPà„[Ôð&%ð &%ð &%ñ Ôð&%ðP „[Ôð8hð 8hð 8hñ Ôð8hðt „[Ôð'cð 'cð 'cñ Ôð'cðR „[Ôð1&ð 1&ð 1&ñ Ôð1&ðf „[Ôð:$ð :$ð :$ñ Ôð:$ðx „[Ôð)!ð )!ð )!ñ Ôð)!ðVbð bð bð bð bð br   r   )r
   r   )r:  Ú
__future__r   Úbuiltinsrf   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterd   rb   rÀ   r¼   Útypingr   r;  Úserver.chat.chat_servicer   Úserver.chat.chat_typesr   r   r	   Úfixturer   r   r   r   r   ú<module>rF     s  ððð ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø €€€à 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ VÐ Vð „ð*ð *ð *ñ „ð*ðCbð Cbð Cbð Cbð Cbñ Cbô Cbð Cbð Cbð Cbr   