§
    óÉ½jS:  ã                   ó  — d 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
Z
ddlZddlmZmZmZmZ ddlmZ ddlmZ ddlmZmZmZmZ ddlmZ ddlmZmZmZ  G d	„ d
ej         ¦  «        Z!e"dk    r ej#        ¦   «          dS dS )a  
Adversarial Stress-Testing and Empirical Security Challenge for Milestone M1:
- Tier 1 Synchronous Trie Profanity Filter Evasion (Homoglyphs, Leetspeak, Diacritics, Zero-width chars)
- Tier 2 Asynchronous Sentinel RMT & Black Market Pattern Detection
- Comprehensive Auto-Mute Enforcement across all 8 Channels
- Cryptographic HMAC-SHA256 Anti-Spoofing and Forgery Resistance
- Strict SLA Performance Benchmarking (< 0.1ms filter, < 2ms item query)
- Empirical Proof of Edge-Case Evasion Vectors (for M4 Hardening)
é    N)ÚAnyÚDictÚListÚTuple)ÚChannelManager)ÚChatService)ÚChatChannelTypeÚItemAffixDTOÚItemSnapshotDTOÚSendChatRequestDTO)ÚItemLinkService)ÚAsyncSentinelRMTDetectorÚChatModerationPipelineÚSynchronousTrieFilterc                   ój   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Zdd	„Z	dd
„Z
dd„Zdd„Zdd„Zdd„ZdS )ÚTestChatModerationAdversarialzLAdversarial stress-test suite challenging the Chat and Moderation subsystem.ÚreturnNc                 óÊ   — d| _         t          ¦   «         | _        t          ¦   «         | _        t          | j         ¬¦  «        | _        t          | j         d¬¦  «        | _        d S )Ns!   FREEEXILE_SECRET_SIGNING_KEY_2026)Úsecret_signing_keyé   )Úitem_secret_keyÚcluster_shards)	Ú
secret_keyr   Útrie_filterr   Úpipeliner   Úitem_link_servicer   Úchat_service)Úselfs    úPC:\Projects\FreeExile\tests\security_fuzzing\test_chat_moderation_adversarial.pyÚsetUpz#TestChatModerationAdversarial.setUp%   sW   € Ø>ˆŒÝ0Ñ2Ô2ˆÔÝ.Ñ0Ô0ˆŒÝ!0ÀDÄOÐ!TÑ!TÔ!TˆÔÝ'¸¼ÐXZÐ[Ñ[Ô[ˆÔÐÐó    c           
      óÎ   — g d¢}|D ]]\  }}| j                              |¦  «        \  }}|                      |d|› d|› d�¦  «         |                      d|d|› d|› d�¦  «         Œ^d	S )
zCAdversarial homoglyph substitutions (@, 0, 1, !, 3, $, 4, 5, 7, 8).))zthang d.m mayÚdot)zthang d-k-m mayÚdash)zthang d_m mayÚ
underscore)zthang d...m mayz	multi-dot)zcon l0nz0 for o)z	thang c4cz4 for a)z	thang c@cz@ for a)zdo b!tchz! for i)zdo b1tchz1 for i)z
thang $h1tz$ and 1)z
thang 5h1tz5 and 1)z	thang di7z7 for t)z
thang 8uoiz8 for b)zwhat the f.u.c.kzall dots)zf_u_c_k youÚunderscores)zf*u*c*k thisÚ	asterisks)zf/u/c/k thatÚslashesú Failed profanity detection for 'ú' (ú)ú***úMissing '***' masking in 'ú' for 'ú'N©r   Úscan_and_censorÚ
assertTrueÚassertIn©r   Úattack_payloadsÚpayloadÚdescÚhas_profÚcensoreds         r   Ú)test_adversarial_homoglyphs_and_leetspeakzGTestChatModerationAdversarial.test_adversarial_homoglyphs_and_leetspeak,   ó¨   € ð2
ð 2
ð 2
ˆð -ð 	eð 	e‰MˆG�TØ!%Ô!1×!AÒ!AÀ'Ñ!JÔ!JÑˆH�hØ�OŠO˜HÐ&\ÈÐ&\Ð&\ÐUYÐ&\Ð&\Ð&\Ñ]Ô]Ð]Ø�MŠM˜% Ð+cÈÐ+cÐ+cÐY`Ð+cÐ+cÐ+cÑdÔdÐdÐdð	eð 	er!   c           
      óÎ   — g d¢}|D ]]\  }}| j                              |¦  «        \  }}|                      |d|› d|› d�¦  «         |                      d|d|› d|› d�¦  «         Œ^d	S )
zEAdversarial Vietnamese diacritics, precomposed vs decomposed Unicode.))u   thang Ä‘.m mayu   Ä‘ with dot)u   thang Ä‘_k_m mayu   Ä‘ with underscore)u   thang Ä‘.á»‹.t mayu    Ä‘á»‹t with separated tone marks)u   thang Ä‘-á»‹-t mayu   Ä‘-á»‹-t with dash)u   thang Ä‘   á»‹   t mayzspaced characters)u   con l.á»“.n mayu   lá»“n with accents)u   thang c.áº·.c mayu   cáº·c with breve and dot)u   thang b.u.á»“.i mayu   buá»“i with grave)zthang d.c.m mayzdcm compound)zthang v.c.l mayzvcl compound)zthang v.k.l mayzvkl compoundr)   r*   r+   r,   r-   r.   r/   Nr0   r4   s         r   Ú>test_adversarial_vietnamese_diacritics_and_precomposed_unicodez\TestChatModerationAdversarial.test_adversarial_vietnamese_diacritics_and_precomposed_unicode;   r;   r!   c                 ó*  — | j                              d¦  «        \  }}|                      |d¦  «         |                      d|¦  «         | j                              d¦  «        \  }}|                      |d¦  «         |                      d|¦  «         dS )zDAttackers inject zero-width spaces (\u200b, \ufeff) to split tokens.u   thang dâ€‹m mayz2Failed to detect zero-width space \u200b injectionr,   u
   con lï»¿onz2Failed to detect zero-width space \ufeff injectionNr0   )r   Ú	has_prof1Ú	censored1Ú	has_prof2Ú	censored2s        r   Ú/test_adversarial_zero_width_character_injectionzMTestChatModerationAdversarial.test_adversarial_zero_width_character_injectionJ   s‘   € à#Ô/×?Ò?Ð@TÑUÔUÑˆ	�9Ø�Š˜	Ð#XÑYÔYÐYØ�Š�e˜YÑ'Ô'Ð'à#Ô/×?Ò?ÀÑPÔPÑˆ	�9Ø�Š˜	Ð#XÑYÔYÐYØ�Š�e˜YÑ'Ô'Ð'Ð'Ð'r!   c                 ó²   — g d¢}|D ]O}| j                              |¦  «        \  }}|                      |d|› d�¦  «         |                      ||¦  «         ŒPdS )zXVerify non-profane words containing substrings (e.g. 'class', 'account') are NOT masked.)z&chao moi nguoi, toi chon class Kiem Tuzhe thong account rat totztoi can mua classic swordz'di danh boss bang hoi luc 8 gio toi nhez$co ai muon vao party farm map khong?znang cap trang bi tai tho renzFalse positive triggered on: 'r/   N)r   r1   ÚassertFalseÚassertEqual)r   Úsafe_messagesÚsafe_msgr8   Úresult_texts        r   Ú:test_legitimate_game_lexicon_not_false_positively_censoredzXTestChatModerationAdversarial.test_legitimate_game_lexicon_not_false_positively_censoredT   s„   € ð
ð 
ð 
ˆð
 &ð 	4ð 	4ˆHØ$(Ô$4×$DÒ$DÀXÑ$NÔ$NÑ!ˆH�kØ×Ò˜XÐ'SÈÐ'SÐ'SÐ'SÑTÔTÐTØ×Ò˜[¨(Ñ3Ô3Ð3Ð3ð	4ð 	4r!   c                 ó¾  — | j                              d¦  «        }|                      |j        o|j        o
|j        dk    ¦  «         |                      ddh                     t          |j        ¦  «        ¦  «        ¦  «         | j                              d¦  «        }|                      |j        o|j        o
|j        dk    ¦  «         |                      ddh                     t          |j        ¦  «        ¦  «        ¦  «         | j                              d¦  «        }|                      |j        o|j        o
|j        dk    ¦  «         |                      ddh                     t          |j        ¦  «        ¦  «        ¦  «         | j                              d	¦  «        }|  	                    |j        p|j        ¦  «         |  
                    |j        d
¦  «         dS )zKAdversarial RMT inputs combining phones, social tags, and payment keywords.z:Ban vang gia cuc re chuyen khoan atm qua so 0987654321 nheé<   ÚPHONE_VNÚPAYMENT_KEYWORDz8Shopacc gia re lien he zalo: shop_game88 thanh toan momoÚSOCIAL_HANDLEz?Thu mua ngoc so luong lon inbox telegram @crypto_king nhan usdtÚCRYPTO_PAYMENTzDToi can ban cay kiem pham cap 50 doi 100 Hon Nguyen Thach trong gamer   N)r   Úprocessr2   Úis_rmtÚshould_auto_muteÚ
risk_scoreÚissubsetÚsetÚviolation_reasonsrE   rF   )r   Úres1Úres2Úres3Úres_safes        r   Ú3test_adversarial_rmt_phone_and_payment_combinationszQTestChatModerationAdversarial.test_adversarial_rmt_phone_and_payment_combinations`   s­  € ð Œ}×$Ò$Ð%aÑbÔbˆØ�Š˜œÐW¨Ô(=ÐWÀ$Ä/ÐUWÒBWÑXÔXÐXØ�Š˜Ð%6Ð7×@Ò@ÅÀTÔE[ÑA\ÔA\Ñ]Ô]Ñ^Ô^Ð^ð Œ}×$Ò$Ð%_Ñ`Ô`ˆØ�Š˜œÐW¨Ô(=ÐWÀ$Ä/ÐUWÒBWÑXÔXÐXØ�Š˜Ð*;Ð<×EÒEÅcÈ$ÔJ`ÑFaÔFaÑbÔbÑcÔcÐcð Œ}×$Ò$Ð%fÑgÔgˆØ�Š˜œÐW¨Ô(=ÐWÀ$Ä/ÐUWÒBWÑXÔXÐXØ�Š˜Ð*:Ð;×DÒDÅSÈÔI_ÑE`ÔE`ÑaÔaÑbÔbÐbð ”=×(Ò(Ð)oÑpÔpˆØ×Ò˜œÐE¨HÔ,EÑFÔFÐFØ×Ò˜Ô,¨aÑ0Ô0Ð0Ð0Ð0r!   c           
   ƒ   óš  K  — d}t          |ddt          j        dd¬¦  «        }| j                             |¦  «        ƒ d{V —†}|                      |j        ¦  «         |                      d|j        ¦  «         | j         	                    |¦  «        \  }}|  
                    |o|d	k    ¦  «         t          j        d
dift          j        dddœft          j        d
dift          j        dddœft          j        dddœft          j        dddœft          j        d
dift          j        d
difg}|D ]t\  }}t          d |dd|dœ|¤Ž}	| j                             |	¦  «        ƒ d{V —†}
|                      |
j        d|j        › �¦  «         |                      d|
j        ¦  «         Œut          dddt          j        dd¬¦  «        }| j                             |¦  «        ƒ d{V —†}|  
                    |j        ¦  «         | j                             |¦  «         | j         	                    |¦  «        \  }}|                      |¦  «         dS )!zDTriggering auto-mute persists and shuts down chat on ALL 8 channels.i=† ÚRMTBot99é2   Úzone_sanctuaryzEBan vang SLL chuyen khoan atm lien he zalo: @boss88 qua so 0912345678)Ú	sender_idÚsender_nameÚsender_levelÚchannelÚzone_idÚcontentNu
   khÃ³a chatr   rf   zHello worldz
Hello zone)re   rf   zRecruit partyÚguild_01zHello guild)Úguild_idrf   Úparty_01zHello party)Úparty_idrf   i90  zSecret message)Ú	target_idrf   zGM please helpzFake system announcement)ra   rb   rc   rd   z"Auto-muted player sent message on u   táº¡m khÃ³a chati>† ÚHonestPlayerzToi di danh boss day© )r   r	   ÚZONEr   Úhandle_send_chatrE   Úsuccessr3   Úerror_messageÚis_player_mutedr2   ÚWORLDÚRECRUITÚGUILDÚPARTYÚWHISPERÚFEEDBACKÚSYSTEMÚnameÚunmute_player)r   ra   Úrmt_reqÚres_rmtÚis_mutedÚrem_secÚchannels_to_testÚch_typeÚextra_kwargsÚattemptÚresÚ	clean_reqÚ	res_cleanÚis_muted_afterÚ_s                  r   Ú4test_auto_mute_enforcement_blocks_all_eight_channelszRTestChatModerationAdversarial.test_auto_mute_enforcement_blocks_all_eight_channelsv   s»  è è € àˆ	Ý$Ø¨ZÀbÝ#Ô(Ð2BØ[ð
ñ 
ô 
ˆð
 Ô)×:Ò:¸7ÑCÔCÐCÐCÐCÐCÐCÐCˆØ×Ò˜œÑ)Ô)Ð)Ø�Š�l GÔ$9Ñ:Ô:Ð:à Ô-×=Ò=¸iÑHÔHÑˆ�'Ø�Š˜Ð0 W¨q¢[Ñ1Ô1Ð1õ Ô" Y°Ð$>Ð?ÝÔ!Ð/?ÈLÐ#YÐ#YÐZÝÔ$ y°/Ð&BÐCÝÔ"°ÈÐ$VÐ$VÐWÝÔ"°ÈÐ$VÐ$VÐWÝÔ$°EÐFVÐ&WÐ&WÐXÝÔ%¨	Ð3CÐ'DÐEÝÔ# iÐ1KÐ%LÐMð	J
Ðð &6ð 	Að 	AÑ!ˆG�\Ý(ð Ø#°È"Øðð à#/ðð ˆGð Ô)×:Ò:¸7ÑCÔCÐCÐCÐCÐCÐCÐCˆCØ×Ò˜Sœ[Ð*]ÈwÌ|Ð*]Ð*]Ñ^Ô^Ð^Ø�MŠMÐ,¨cÔ.?Ñ@Ô@Ð@Ð@õ 'Ø¨ÀbÝ#Ô(Ð2BÐLbð
ñ 
ô 
ˆ	ð Ô+×<Ò<¸YÑGÔGÐGÐGÐGÐGÐGÐGˆ	Ø�Š˜	Ô)Ñ*Ô*Ð*ð 	Ô×'Ò'¨	Ñ2Ô2Ð2Ø Ô-×=Ò=¸iÑHÔHÑˆ˜Ø×Ò˜Ñ(Ô(Ð(Ð(Ð(r!   c                 ó  — d\  }}}| j                              |||ddddt          ddd¬	¦  «        f¬
¦  «        }|j        }|                      | j                              ||||¦  «        ¦  «         |                      | j                              ||d|¦  «        ¦  «         |                      | j                              d|||¦  «        ¦  «         |                      | j                              |d||¦  «        ¦  «         |d         dk    rdnd|dd…         z   }| j                              ||¦  «        }|                      |j        ¦  «         |  	                    d|j
                             ¦   «         ¦  «         |                      | j                              d|¦  «        j        ¦  «         | j                              dddddddd¬¦  «        }|                      | j                              d|j        ¦  «        j        ¦  «         dS )z8Adversarial tampering of item attributes and signatures.)Úitem_godly_sword_001zThai Co Long Kiemé   rŒ   r   é
   zTan ThuÚaff_1ÚCongg      $@)Úaffix_idÚ	stat_nameÚ
stat_value)Ú	item_uuidÚitem_name_keyÚrarityÚelementÚqualityÚ
item_levelÚcrafter_nameÚaffixesé   Úitem_stolen_sword_999zHuyen Vu Trong KiemÚ0Ú1NÚmismatchÚfake_uuid_noneÚitem_expired_001zKiem CuzVo Danhiöÿÿÿ)r“   r”   r•   r–   r—   r˜   r™   Úttl_seconds)r   Úcreate_item_snapshotr
   Úhmac_signaturer2   Úverify_item_signaturerE   Úquery_item_snapshotÚis_validr3   rq   Úlower)	r   Úuuid_valÚname_keyÚlegit_rarityÚsnapshotÚ	valid_sigÚcorrupted_sigÚquery_tamperedÚexpired_snaps	            r   Ú!test_hmac_tamper_attacks_rejectedz?TestChatModerationAdversarial.test_hmac_tamper_attacks_rejected¥   s<  € à+YÑ(ˆ�(˜LØÔ)×>Ò>Ø¨h¸|ÐUVØ "°9Ý!¨7¸fÐQUÐVÑVÔVÐXð ?ñ 
ô 
ˆð
 Ô+ˆ	Ø�Š˜Ô.×DÒDÀXÈxÐYeÐgpÑqÔqÑrÔrÐrð 	×Ò˜Ô/×EÒEÀhÐPXÐZ[Ð]fÑgÔgÑhÔhÐhà×Ò˜Ô/×EÒEÐF]Ð_gÐiuð  xAñ  Bô  Bñ  	Cô  	Cð  	Cà×Ò˜Ô/×EÒEÀhÐPeÐgsÐu~ÑÔñ  	Aô  	Að  	Aà )¨!¤°Ò 3Ð 3˜˜¸À	È!È"È"ÄÑMˆØÔ/×CÒCÀHÈmÑ\Ô\ˆØ×Ò˜Ô0Ñ1Ô1Ð1Ø�Š�j .Ô">×"DÒ"DÑ"FÔ"FÑGÔGÐGà×Ò˜Ô/×CÒCÐDTÐV_Ñ`Ô`ÔiÑjÔjÐjð Ô-×BÒBØ(¸	È!ÐUVØ !°)Èð Cñ 
ô 
ˆð 	×Ò˜Ô/×CÒCÐDVÐXdÔXsÑtÔtÔ}Ñ~Ô~Ð~Ð~Ð~r!   c                 óÐ  — ddl }|                     ¦   «         }|r|                     ¦   «          g d¢}d}t          j        ¦   «         }t          |¦  «        D ]2}| j                             ||t          |¦  «        z           ¦  «         Œ3t          j        ¦   «         |z
  |z  dz  }|r| 	                    ¦   «          t          d|d›d�¦  «         |                      |d¦  «         dS )	zGMeasure Tier 1 moderation latency over 1,000 iterations (SLA: < 0.1ms).r   N)zthang d.m may c_a_c f-u-c-kz4chao moi nguoi trong bang hoi, toi la thanh vien moiu   con l_o_n Ä‘.á»‹.t b.u.á»“.iz.ai muon vao party danh boss Thien Hoang khong?u   thang Ä‘_k_m may scam tao ha?éè  z1
[BENCHMARK] Tier 1 Trie Moderation Avg Latency: ú.4fzms (Target: < 0.1ms)gš™™™™™¹?)ÚtracemallocÚ
is_tracingÚstopÚtimeÚperf_counterÚranger   r1   ÚlenÚstartÚprintÚ
assertLess)r   rµ   Úwas_tracingÚbenchmark_payloadsÚ
iterationsr¼   ÚiÚavg_latency_mss           r   Ú!test_sla_tier1_moderation_latencyz?TestChatModerationAdversarial.test_sla_tier1_moderation_latencyÅ   s  € àÐÐÐØ!×,Ò,Ñ.Ô.ˆØð 	Ø×ÒÑÔÐð
ð 
ð 
Ðð
 ˆ
ÝÔ!Ñ#Ô#ˆÝ�zÑ"Ô"ð 	^ð 	^ˆAØÔ×,Ò,Ð-?ÀÅCÐHZÑD[ÔD[Ñ@[Ô-\Ñ]Ô]Ð]Ð]ÝÔ,Ñ.Ô.°Ñ6¸*ÑDÈÑLˆØð 	 Ø×ÒÑÔÐÝÐkÀ>ÐkÐkÐkÐkÑlÔlÐlØ�Š˜¨Ñ,Ô,Ð,Ð,Ð,r!   c           	      óh  — | j                              ddddddd¬¦  «        }d	}t          j        ¦   «         }t	          |¦  «        D ]¥}| j                              d|j        ¦  «        }|j        }|sxd
dt          j	        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d}Œ¦t          j        ¦   «         |z
  |z  d	z  }t          d|d›d�¦  «         |                      |d¦  «         dS )zMMeasure item snapshot retrieval latency over 1,000 iterations (SLA: < 2.0ms).Úbench_sword_001zLoi Dinh Kiemé   é   é   é_   zLoi Than)r“   r”   r•   r–   r—   r˜   r™   r³   z,assert %(py2)s
{%(py2)s = %(py0)s.is_valid
}r„   )Úpy0Úpy2Nz-[BENCHMARK] Item Snapshot Query Avg Latency: r´   zms (Target: < 2.0ms)g       @)r   r£   r¸   r¹   rº   r¦   r¤   r§   Ú@py_builtinsÚlocalsÚ
@pytest_arÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationr½   r¾   )	r   ÚsnaprÁ   r¼   rˆ   r„   Ú@py_assert1Ú@py_format3rÃ   s	            r   Ú(test_sla_item_snapshot_retrieval_latencyzFTestChatModerationAdversarial.test_sla_item_snapshot_retrieval_latencyÚ   sT  € àÔ%×:Ò:Ø'°ÈqØ˜r¨b¸zð ;ñ 
ô 
ˆð ˆ
ÝÔ!Ñ#Ô#ˆÝ�zÑ"Ô"ð 	 ð 	 ˆAØÔ(×<Ò<Ð=NÐPTÔPcÑdÔdˆCØ”<Ð�<ÐÐÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÕÔ�<ÑÔÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÝÔ,Ñ.Ô.°Ñ6¸*ÑDÈÑLˆÝÐf¸nÐfÐfÐfÐfÑgÔgÐgØ�Š˜¨Ñ,Ô,Ð,Ð,Ð,r!   c                 óB  — | j                              d¦  «        \  }}| j                              d¦  «        \  }}| j                              d¦  «        \  }}|                      |d¦  «         |                      |d¦  «         |                      |d¦  «         dt          d¦  «        z   t          d	¦  «        z   t          d¦  «        z   d
z   }| j                              |¦  «        \  }}|                      |d¦  «         | j                             d¦  «        }| j                             d¦  «        }|                      |j        d¦  «         |                      |j        d¦  «         | j                              d¦  «        \  }	}|                      |	d¦  «         dS )zUEmpirically documents 4 adversarial evasion vectors discovered during stress testing.u   thang dâ€Œm mayu   thang dâ€�m mayu   thang dâ� m mayz+Evidence: ZWNJ currently evades Trie filterz*Evidence: ZWJ currently evades Trie filterz2Evidence: Word Joiner currently evades Trie filterzthang iA  i0  z mayz9Evidence: Cyrillic homoglyphs currently evade Trie filterzlien he qua so 098.765.4321zlien he qua so 098 765 4321z:Evidence: Dot-separated phone corrupted by leetspeak tablez<Evidence: Space-separated phone corrupted by leetspeak tablezthang dm1 mayzAEvidence: Digit-suffixed profanity currently evades regex maskingN)r   r1   rE   Úchrr   rQ   rR   )
r   Úhas_prof_zwnjrˆ   Úhas_prof_zwjÚhas_prof_wjÚcyrillic_cacÚhas_prof_cyrillicÚres_dot_phoneÚres_space_phoneÚhas_prof_digit_suffixs
             r   Ú,test_empirical_edge_case_evasions_documentedzJTestChatModerationAdversarial.test_empirical_edge_case_evasions_documentedé   sš  € ð  Ô+×;Ò;Ð<PÑQÔQÑˆ�qØÔ*×:Ò:Ð;OÑPÔP‰ˆ�aØÔ)×9Ò9Ð:NÑOÔO‰ˆ�QØ×Ò˜Ð(UÑVÔVÐVØ×Ò˜Ð'SÑTÔTÐTØ×Ò˜Ð&ZÑ[Ô[Ð[ð  ¥# e¡*¤*Ñ,­s°5©z¬zÑ9½CÀ¹J¼JÑFÈÑOˆØ#Ô/×?Ò?ÀÑMÔMÑÐ˜1Ø×ÒÐ*Ð,gÑhÔhÐhð œ×-Ò-Ð.KÑLÔLˆØœ-×/Ò/Ð0MÑNÔNˆØ×Ò˜Ô-Ð/kÑlÔlÐlØ×Ò˜Ô/Ð1oÑpÔpÐpð $(Ô#3×#CÒ#CÀOÑ#TÔ#TÑ Ð˜qØ×ÒÐ.Ð0sÑtÔtÐtÐtÐtr!   )r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r:   r=   rC   rJ   r\   r‰   r±   rÄ   r×   râ   rm   r!   r   r   r   "   s  € € € € € ØVÐVð\ð \ð \ð \ðeð eð eð eðeð eð eð eð(ð (ð (ð (ð
4ð 
4ð 
4ð 
4ð1ð 1ð 1ð 1ð,-)ð -)ð -)ð -)ð^ð ð ð ð@-ð -ð -ð -ð*-ð -ð -ð -ðuð uð uð uð uð ur!   r   Ú__main__)$ræ   ÚbuiltinsrÍ   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterÏ   ÚasyncioÚhashlibÚhmacr¸   ÚunittestÚtypingr   r   r   r   Úserver.chat.channel_managerr   Úserver.chat.chat_servicer   Úserver.chat.chat_typesr	   r
   r   r   Úserver.chat.item_link_servicer   Úserver.chat.moderationr   r   r   ÚIsolatedAsyncioTestCaser   rã   Úmainrm   r!   r   ú<module>rø      s†  ððð ð € € € € € € € € € € € € €€€€Ø €€€Ø €€€Ø €€€Ø €€€Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )à 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0ðð ð ð ð ð ð ð ð ð ð ð ð :Ð 9Ð 9Ð 9Ð 9Ð 9ðð ð ð ð ð ð ð ð ð ð^uð ^uð ^uð ^uð ^u HÔ$Dñ ^uô ^uð ^uðB ˆzÒÐØ€H„M�O„O€O€O€Oð Ðr!   