§
    µuÈj@  ã                   óè  — d 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ZddlZ	ddl
Z
 ee¦  «                             ¦   «         j        j        Zej                             d eedz  ¦  «        ¦  «         ddlmZmZmZmZmZmZ  ej        d¬¦  «        d„ ¦   «         Zddefd„Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        Ze dk    r ej!        edg¦  «         dS dS )u  
=============================================================================
CHALLENGER 1 EMPIRICAL ADVERSARIAL STRESS HARNESS - M1 ITERATION 2
=============================================================================
Authoritative independent stress-test suite executed by Challenger 1.
Validates:
1. evaluate_scene_gate:
   - Non-existent files (alone and mixed with valid files) -> score=0.0, approved=False, action='RETAKE_SHOT'
   - Empty 0-byte files -> score=0.0, approved=False, action='RETAKE_SHOT'
   - Corrupted/garbage files -> score=0.0, approved=False, action='RETAKE_SHOT'
   - Truncated headers -> score=0.0, approved=False, action='RETAKE_SHOT'
   - Mixed valid and invalid files -> score=0.0, approved=False, action='RETAKE_SHOT'
2. evaluate_shot_gate on frozen video:
   - 48, 120, 240 frames frozen -> docked >= 0.35, capping score <= 0.65, approved=False, action='RETAKE_SHOT'
3. evaluate_shot_gate on ThÃºy Kiá»�u video evaluated as VÆ°Æ¡ng Ã”ng / VÆ°Æ¡ng Quan / Kim Trá»�ng:
   - Static portrait video -> char_match=False, score <= 0.50, approved=False, action='RETAKE_SHOT'
   - Moving ThÃºy Kiá»�u video (non-frozen motion) -> char_match=False, score <= 0.50, approved=False, action='RETAKE_SHOT'
   - Case-insensitive / whitespace-tolerant expected_character names ("VÆ°Æ¡ng Ã”ng", "  vuong_quan  ")
4. Engine dispatch (both force_engine='heuristic' and default force_engine=None):
   - Consistent behavior across invocation modes
=============================================================================
é    N)ÚPathÚ05_Production_Pipeline)ÚVideoCriticVerdictÚShotEvaluationÚSceneEvaluationÚevaluate_shot_gateÚevaluate_scene_gateÚOfflineHeuristicEngineÚsession)Úscopec              #   ó‚   K  — |                       d¦  «        }|V — t          j        t          |¦  «        d¬¦  «         d S )NÚchallenger1_stressT)Úignore_errors)ÚmktempÚshutilÚrmtreeÚstr)Útmp_path_factoryÚtemp_dirs     ú@C:\Projects\KieuStory\tests\test_challenger1_empirical_stress.pyÚharness_sandboxr   .   sD   è è € à×&Ò&Ð';Ñ<Ô<€HØ
€N€N€NÝ
„M•#�h‘-”-¨tÐ4Ñ4Ô4Ð4Ð4Ð4ó    éH   é   é   éÐ  Úmotion©éx   é    éÈ   Úfilepathc                 ó0  — t          j        dŽ }t          j        t          | ¦  «        ||||f¦  «        }t	          |¦  «        D �]<}	|dk    r%t          j        ||df|t
          j        ¬¦  «        }
nù|dk    r™t          j        ||df|t
          j        ¬¦  «        }
t          |dz  t          j	        |	dz  ¦  «        dz  z   ¦  «        }t          |dz  t          j
        |	dz  ¦  «        d	z  z   ¦  «        }t          j        |
||fd
dd¦  «         nZ|dk    r$t          j        ||dft
          j        ¬¦  «        }
n0t
          j                             dd||dft
          j        ¬¦  «        }
|                     |
¦  «         �Œ>|                     ¦   «          | S )NÚmp4vÚfrozené   )Údtyper   é   g      $@é–   éP   é2   )éÿ   r,   r,   éÿÿÿÿÚblackr   r,   )Úcv2ÚVideoWriter_fourccÚVideoWriterr   ÚrangeÚnpÚfullÚuint8ÚintÚsinÚcosÚcircleÚzerosÚrandomÚrandintÚwriteÚrelease)r"   Ú
num_framesÚfpsÚwidthÚheightÚmodeÚcolorÚfourccÚoutÚiÚframeÚcxÚcys                r   Úcreate_test_videorK   5   s‚  € ÝÔ# VÐ,€FÝ
Œ/�#˜h™-œ-¨°°u¸f°oÑ
FÔ
F€CÝ�:ÑÔð ñ ˆØ�8ÒÐÝ”G˜V U¨AÐ.°½R¼XÐFÑFÔFˆEˆEØ�XÒÐÝ”G˜V U¨AÐ.°½R¼XÐFÑFÔFˆEÝ�U˜Q‘Y¥¤¨¨D©Ñ!1Ô!1°CÑ!7Ñ7Ñ8Ô8ˆBÝ�V˜a‘Z¥"¤&¨¨T©Ñ"2Ô"2°RÑ"7Ñ7Ñ8Ô8ˆBÝŒJ�u˜r 2˜h¨¨O¸RÑ@Ô@Ð@Ð@Ø�WŠ_ˆ_Ý”H˜f e¨QÐ/µr´xÐ@Ñ@Ô@ˆEˆEå”I×%Ò% a¨¨v°u¸aÐ.@ÍÌÐ%ÑQÔQˆEØ�	Š	�%ÑÔÐÑØ‡K‚K�M„M€MØ€Or   c                   ó,   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚTestChallengerSceneGateStressc                 óØ   — dD ]f}t          dddg|¬¦  «        }|j        dk    sJ d|j        › �¦   «         ‚|j        du sJ ‚|j        d	k    sJ ‚|j        €J ‚|j        j        dk    sJ ‚Œgd
S )zNNon-existent files must yield score=0.0, approved=False, action='RETAKE_SHOT'.©NÚ	heuristicÚsc_test_missingznon_existent_1.mp4znon_existent_2.mp4©Úforce_engineç        zExpected 0.0, got FÚRETAKE_SHOTN)r	   Úoverall_scoreÚapprovedÚsuggested_actionÚ
scene_evalÚscore)ÚselfÚengineÚvs      r   Ú&test_scene_gate_pure_nonexistent_fileszDTestChallengerSceneGateStress.test_scene_gate_pure_nonexistent_filesN   s¬   € à)ð 	-ð 	-ˆFÝ#Ð$5Ð8LÐNbÐ7cÐrxÐyÑyÔyˆAØ”? cÒ)Ð)Ð)Ð+QÀÄÐ+QÐ+QÑ)Ô)Ð)Ø”: Ð&Ð&Ð&Ð&ØÔ%¨Ò6Ð6Ð6Ð6Ø”<Ð+Ð+Ð+Ø”<Ô%¨Ò,Ð,Ð,Ð,Ð,ð	-ð 	-r   c                 ó  — |dz  }t          |dd¬¦  «         t          |dz  ¦  «        }dD ]S}t          dt          |¦  «        |g|¬¦  «        }|j        d	k    sJ ‚|j        d
u sJ ‚|j        dk    sJ ‚d|j        v sJ ‚ŒTdS )z^1 valid file + 1 non-existent file must yield score=0.0, approved=False, action='RETAKE_SHOT'.zvalid_for_mix.mp4é0   r   ©r?   rC   zphantom_file.mp4rO   Úsc_mixed_missingrR   rT   FrU   zMissing fileN)rK   r   r	   rV   rW   rX   Úcritique_notes)r[   r   Úvalid_pÚ	missing_pr\   r]   s         r   Ú+test_scene_gate_mixed_valid_and_nonexistentzITestChallengerSceneGateStress.test_scene_gate_mixed_valid_and_nonexistentX   sÀ   € à!Ð$7Ñ7ˆÝ˜'¨b°xÐ@Ñ@Ô@Ð@Ý˜Ð*<Ñ<Ñ=Ô=ˆ	à)ð 	6ð 	6ˆFÝ#Ð$6½¸W¹¼ÀyÐ8QÐ`fÐgÑgÔgˆAØ”? cÒ)Ð)Ð)Ð)Ø”: Ð&Ð&Ð&Ð&ØÔ%¨Ò6Ð6Ð6Ð6Ø! QÔ%5Ð5Ð5Ð5Ð5Ð5ð	6ð 	6r   c                 ó4  — |dz  }|dz  }|                      d¦  «         |                      d¦  «         dD ]`}t          dt          |¦  «        t          |¦  «        g|¬¦  «        }|j        dk    sJ ‚|j        du sJ ‚|j        d	k    sJ ‚d
|j        v sJ ‚ŒadS )zNEmpty 0-byte files must yield score=0.0, approved=False, action='RETAKE_SHOT'.z
zero_1.mp4z
zero_2.mp4r   rO   Úsc_zero_bytesrR   rT   FrU   zZero-byte fileN©Úwrite_bytesr	   r   rV   rW   rX   rc   )r[   r   Úzero_1Úzero_2r\   r]   s         r   Ú%test_scene_gate_empty_zero_byte_fileszCTestChallengerSceneGateStress.test_scene_gate_empty_zero_byte_filese   sÎ   € à  <Ñ/ˆØ  <Ñ/ˆØ×Ò˜3ÑÔÐØ×Ò˜3ÑÔÐà)ð 	8ð 	8ˆFÝ# Oµc¸&±k´kÅ3ÀvÁ;Ä;Ð5OÐ^dÐeÑeÔeˆAØ”? cÒ)Ð)Ð)Ð)Ø”: Ð&Ð&Ð&Ð&ØÔ%¨Ò6Ð6Ð6Ð6Ø# qÔ'7Ð7Ð7Ð7Ð7Ð7ð	8ð 	8r   c                 óF  — |dz  }|dz  }|                      d¦  «         |                      d¦  «         dD ]i}t          dt          |¦  «        t          |¦  «        g|¬¦  «        }|j        dk    sJ ‚|j        d	u sJ ‚|j        d
k    sJ ‚d|j        v sd|j        v sJ ‚ŒjdS )zZCorrupted/garbage header files must yield score=0.0, approved=False, action='RETAKE_SHOT'.zgarbage_1.mp4zgarbage_2.mp4s%   RANDOM_GARBAGE_HEADER_DATA_1234567890s      ftypmp42corrupted_tailrO   Ú
sc_garbagerR   rT   FrU   zUnreadable filezZero framesNri   )r[   r   Úgarb_1Úgarb_2r\   r]   s         r   Ú'test_scene_gate_corrupted_garbage_fileszETestChallengerSceneGateStress.test_scene_gate_corrupted_garbage_filess   sß   € à  ?Ñ2ˆØ  ?Ñ2ˆØ×ÒÐCÑDÔDÐDØ×ÒÐDÑEÔEÐEà)ð 	`ð 	`ˆFÝ# Lµ3°v±;´;ÅÀFÁÄÐ2LÐ[aÐbÑbÔbˆAØ”? cÒ)Ð)Ð)Ð)Ø”: Ð&Ð&Ð&Ð&ØÔ%¨Ò6Ð6Ð6Ð6Ø%¨Ô)9Ð9Ð9¸]ÈaÔN^Ð=^Ð=^Ð=^Ð^øð	`ð 	`r   c                 ó
  — |dz  }t          |dd¬¦  «         |dz  }|                     d¦  «         t          dt          |¦  «        t          |¦  «        g¦  «        }|j        dk    sJ ‚|j        d	u sJ ‚|j        d
k    sJ ‚dS )zL1 valid file + 1 corrupted 0-byte file must fail immediately with score=0.0.zvalid_mix_corrupt.mp4r`   r   ra   zcorrupt_sub.mp4r   Úsc_mix_corruptrT   FrU   N)rK   rj   r	   r   rV   rW   rX   )r[   r   rd   Ú	corrupt_pr]   s        r   Ú)test_scene_gate_mixed_valid_and_corruptedzGTestChallengerSceneGateStress.test_scene_gate_mixed_valid_and_corrupted�   s¢   € à!Ð$;Ñ;ˆÝ˜'¨b°xÐ@Ñ@Ô@Ð@Ø#Ð&7Ñ7ˆ	Ø×Ò˜cÑ"Ô"Ð"åÐ 0µ3°w±<´<ÅÀYÁÄÐ2PÑQÔQˆØŒ #Ò%Ð%Ð%Ð%ØŒz˜UÐ"Ð"Ð"Ð"ØÔ! ]Ò2Ð2Ð2Ð2Ð2Ð2r   N)Ú__name__Ú
__module__Ú__qualname__r^   rf   rm   rr   rv   © r   r   rM   rM   M   sb   € € € € € ð-ð -ð -ð6ð 6ð 6ð8ð 8ð 8ð`ð `ð `ð
3ð 
3ð 
3ð 
3ð 
3r   rM   c                   ó`   — e Zd Zej                             dg d¢¦  «        d„ ¦   «         Zd„ ZdS )Ú"TestChallengerShotGateFrozenStressÚframe_count)r`   r   éð   c                 ó€  — |d|› d�z  }t          ||dd¬¦  «         dD ]ž}t          d|› �t          |¦  «        d|¬	¦  «        }|j        d
k    sJ d|j        › d�¦   «         ‚|j        du sJ ‚|j        dk    sJ ‚|j        €J ‚t          d„ |j        j        D ¦   «         ¦  «        sJ d|j        j        › �¦   «         ‚ŒŸdS )zŸ
        Frozen video across multiple durations (2s, 5s, 10s):
        MUST dock >= 0.35, capping score <= 0.65, approved=False, action='RETAKE_SHOT'.
        Úfrozen_zf.mp4r%   )éŒ   r)   r    ©r?   rC   rD   rO   Úshot_frozen_Únone)Úshot_idÚ
video_pathÚexpected_characterrS   çÍÌÌÌÌÌä?úScore z# exceeds 0.65 cap for frozen video!FrU   Nc              3   ó   K  — | ]}d |v V — Œ	dS ©ÚFrozenNrz   ©Ú.0Úds     r   ú	<genexpr>z[TestChallengerShotGateFrozenStress.test_shot_gate_frozen_penalty_and_cap.<locals>.<genexpr>¨   ó&   è è € ÐIÐI¨�x 1�}ÐIÐIÐIÐIÐIÐIr   zNo Frozen defect in )	rK   r   r   rV   rW   rX   Ú	shot_evalÚanyÚvisual_defects)r[   r   r}   Úfrozen_filer\   r]   s         r   Ú%test_shot_gate_frozen_penalty_and_capzHTestChallengerShotGateFrozenStress.test_shot_gate_frozen_penalty_and_cap“   s"  € ð &Ð(D°+Ð(DÐ(DÐ(DÑDˆÝ˜+°+ÀHÐTcÐdÑdÔdÐdà)ð 	ð 	ˆFÝ"Ø4 {Ð4Ð4Ý˜{Ñ+Ô+Ø#)Ø#ð	ñ ô ˆAð ”? dÒ*Ð*Ð*Ð,i°Q´_Ð,iÐ,iÐ,iÑ*Ô*Ð*Ø”: Ð&Ð&Ð&Ð&ØÔ%¨Ò6Ð6Ð6Ð6Ø”;Ð*Ð*Ð*ÝÐIÐI¨a¬kÔ.HÐIÑIÔIÑIÔIÐ~Ð~ÐK~ÐbcÔbmÔb|ÐK~ÐK~Ñ~Ô~ÐIÐ~ð	ð 	r   c                 óö   — t          g d¢¦  «        D ]f\  }}|d|› d�z  }t          |dd|¬¦  «         t          d|› �t          |¦  «        ¦  «        }|j        dk    sJ ‚|j        d	u sJ ‚|j        d
k    sJ ‚ŒgdS )zQFrozen videos with various colors (not pure black) must all be penalized <= 0.65.))éÜ   r˜   r˜   )r+   é<   éF   )éd   é´   r   Úfrozen_color_z.mp4r™   r%   r‚   Ú
shot_fcol_rˆ   FrU   N)Ú	enumeraterK   r   r   rV   rW   rX   )r[   r   ÚidxÚcolÚpr]   s         r   Ú%test_shot_gate_frozen_bright_and_darkzHTestChallengerShotGateFrozenStress.test_shot_gate_frozen_bright_and_darkª   s¶   € å!Ð"RÐ"RÐ"RÑSÔSð 	7ð 	7‰HˆC�ØÐ";°#Ð";Ð";Ð";Ñ;ˆAÝ˜a¨B°XÀSÐIÑIÔIÐIÝ"Ð#5°Ð#5Ð#5µs¸1±v´vÑ>Ô>ˆAØ”? dÒ*Ð*Ð*Ð*Ø”: Ð&Ð&Ð&Ð&ØÔ%¨Ò6Ð6Ð6Ð6Ð6ð	7ð 	7r   N)rw   rx   ry   ÚpytestÚmarkÚparametrizer–   r£   rz   r   r   r|   r|   ’   sV   € € € € € Ø„[×Ò˜]¨N¨N¨NÑ;Ô;ðð ñ <Ô;ðð,7ð 7ð 7ð 7ð 7r   r|   c                   óB   — e Zd Zed„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )Ú*TestChallengerCharacterContaminationStressc                 óô   — t           dz  dz  dz  dz  | _        | j                             ¦   «         s
J d¦   «         ‚t          j        t          | j        ¦  «        ¦  «        | _        | j        €
J d¦   «         ‚d S )NÚ	04_AssetsÚ
charactersÚ01_Main_Protagonistsúthuy_kieu_maiden_16yo_720p.pngz%Thuy Kieu master portrait must exist!z*Failed to decode Thuy Kieu master portrait)ÚPROJECT_ROOTÚkieu_portraitÚexistsr/   Úimreadr   Úkieu_img)Úclss    r   Úsetup_classz6TestChallengerCharacterContaminationStress.setup_classº   s„   € å(¨;Ñ6¸ÑEÐH^Ñ^ð  bBñ  BˆÔØÔ ×'Ò'Ñ)Ô)ÐRÐRÐ+RÑRÔRÐ)Ý”z¥# cÔ&7Ñ"8Ô"8Ñ9Ô9ˆŒØŒ|Ð'Ð'Ð)UÑ'Ô'Ð'Ð'Ð'r   c                 ó6  — |dz  }| j         j        dd…         \  }}t          j        t	          |¦  «        t          j        dŽ d||f¦  «        }t          d¦  «        D ]}|                     | j         ¦  «         Œ|                     ¦   «          t          dt	          |¦  «        d¬	¦  «        }|j
        d
k    sJ d|j
        › d�¦   «         ‚|j        j        du sJ ‚|j        du sJ ‚|j        dk    sJ ‚t          d„ |j        j        D ¦   «         ¦  «        sJ ‚dS )u|   ThÃºy Kiá»�u video evaluated as VÆ°Æ¡ng Ã”ng: MUST detect cross-contamination, char_match=False, score <= 0.50, RETAKE_SHOT.ztk_static_as_vo.mp4Nr(   r$   r   r`   Úshot_test_voÚ	vuong_ong©r‡   ç      à?r‰   z) exceeds 0.50 for cross-contaminated shotFrU   c              3   óB   K  — | ]}d |                      ¦   «         v V — ŒdS ©zcross-contaminationN©Úlowerr�   s     r   r�   zwTestChallengerCharacterContaminationStress.test_contamination_static_portrait_evaluated_as_vuong_ong.<locals>.<genexpr>Ï   ó0   è è € ÐZÐZ¸!Ð(¨A¯GªG©I¬IÐ5ÐZÐZÐZÐZÐZÐZr   ©r²   Úshaper/   r1   r   r0   r2   r=   r>   r   rV   r’   Úcharacter_matchrW   rX   r“   r”   ©r[   r   Úvid_pÚhÚwrF   Ú_r]   s           r   Ú9test_contamination_static_portrait_evaluated_as_vuong_ongzdTestChallengerCharacterContaminationStress.test_contamination_static_portrait_evaluated_as_vuong_ongÁ   s4  € àÐ"7Ñ7ˆØŒ}Ô" 2 A 2Ô&‰ˆˆ1ÝŒo�c %™jœj­#Ô*@À&Ð*IÈ2ÐPQÐSTÈvÑVÔVˆÝ�r‘”ð 	%ð 	%ˆAØ�IŠI�d”mÑ$Ô$Ð$Ð$Ø�Š‰Œˆå˜~­s°5©z¬zÈkÐZÑZÔZˆØŒ $Ò&Ð&Ð&Ð(k°´Ð(kÐ(kÐ(kÑ&Ô&Ð&ØŒ{Ô*¨eÐ3Ð3Ð3Ð3ØŒz˜UÐ"Ð"Ð"Ð"ØÔ! ]Ò2Ð2Ð2Ð2ÝÐZÐZ¸q¼{Ô?YÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZr   c                 ó6  — |dz  }| j         j        dd…         \  }}t          j        t	          |¦  «        t          j        dŽ d||f¦  «        }t          d¦  «        D ]}|                     | j         ¦  «         Œ|                     ¦   «          t          dt	          |¦  «        d¬	¦  «        }|j
        d
k    sJ d|j
        › d�¦   «         ‚|j        j        du sJ ‚|j        du sJ ‚|j        dk    sJ ‚t          d„ |j        j        D ¦   «         ¦  «        sJ ‚dS )u|   ThÃºy Kiá»�u video evaluated as VÆ°Æ¡ng Quan: MUST detect cross-contamination, char_match=False, score <= 0.50, RETAKE_SHOT.ztk_static_as_vq.mp4Nr(   r$   r   r`   Úshot_test_vqÚ
vuong_quanr¸   r¹   r‰   z exceeds 0.50FrU   c              3   óB   K  — | ]}d |                      ¦   «         v V — ŒdS r»   r¼   r�   s     r   r�   zxTestChallengerCharacterContaminationStress.test_contamination_static_portrait_evaluated_as_vuong_quan.<locals>.<genexpr>ß   r¾   r   r¿   rÂ   s           r   Ú:test_contamination_static_portrait_evaluated_as_vuong_quanzeTestChallengerCharacterContaminationStress.test_contamination_static_portrait_evaluated_as_vuong_quanÑ   s4  € àÐ"7Ñ7ˆØŒ}Ô" 2 A 2Ô&‰ˆˆ1ÝŒo�c %™jœj­#Ô*@À&Ð*IÈ2ÐPQÐSTÈvÑVÔVˆÝ�r‘”ð 	%ð 	%ˆAØ�IŠI�d”mÑ$Ô$Ð$Ð$Ø�Š‰Œˆå˜~­s°5©z¬zÈlÐ[Ñ[Ô[ˆØŒ $Ò&Ð&Ð&Ð(O°´Ð(OÐ(OÐ(OÑ&Ô&Ð&ØŒ{Ô*¨eÐ3Ð3Ð3Ð3ØŒz˜UÐ"Ð"Ð"Ð"ØÔ! ]Ò2Ð2Ð2Ð2ÝÐZÐZ¸q¼{Ô?YÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZr   c                 óŠ  — |dz  }| j         j        dd…         \  }}t          j        t	          |¦  «        t          j        dŽ d||f¦  «        }t          d¦  «        D ]ª}t          t          j	        |dz  ¦  «        dz  ¦  «        }t          t          j
        |dz  ¦  «        d	z  ¦  «        }t          j        d
d|gdd
|gg¦  «        }	t          j        | j         |	||ft          j        ¬¦  «        }
|                     |
¦  «         Œ«|                     ¦   «          t!          dt	          |¦  «        d¬¦  «        }t#          d„ |j        j        D ¦   «         ¦  «        r
J d¦   «         ‚t#          d„ |j        j        D ¦   «         ¦  «        sJ ‚|j        j        du sJ ‚|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚dS )uÉ   
        Adversarial: ThÃºy Kiá»�u video WITH MICRO-MOTION (not frozen), evaluated as VÆ°Æ¡ng Ã”ng.
        MUST still detect cross-contamination, char_match=False, score <= 0.50, RETAKE_SHOT.
        ztk_moving_as_vo.mp4Nr(   r$   r   r   ç       @é   é   é   r   ©Ú
borderModeÚshot_moving_vor·   r¸   c              3   ó   K  — | ]}d |v V — Œ	dS r‹   rz   r�   s     r   r�   zyTestChallengerCharacterContaminationStress.test_contamination_moving_kieu_video_evaluated_as_vuong_ong.<locals>.<genexpr>ô   r‘   r   zShould have micro-motionc              3   óB   K  — | ]}d |                      ¦   «         v V — ŒdS r»   r¼   r�   s     r   r�   zyTestChallengerCharacterContaminationStress.test_contamination_moving_kieu_video_evaluated_as_vuong_ong.<locals>.<genexpr>ö   r¾   r   Fr¹   rU   ©r²   rÀ   r/   r1   r   r0   r2   r6   r3   r7   r8   Úfloat32Ú
warpAffineÚBORDER_REFLECTr=   r>   r   r“   r’   r”   rÁ   rV   rW   rX   ©r[   r   rÃ   rÄ   rÅ   rF   rG   ÚdxÚdyÚMÚshiftedr]   s               r   Ú;test_contamination_moving_kieu_video_evaluated_as_vuong_ongzfTestChallengerCharacterContaminationStress.test_contamination_moving_kieu_video_evaluated_as_vuong_ongá   sÎ  € ð
  Ð"7Ñ7ˆØŒ}Ô" 2 A 2Ô&‰ˆˆ1ÝŒo�c %™jœj­#Ô*@À&Ð*IÈ2ÐPQÐSTÈvÑVÔVˆÝ�r‘”ð 	ð 	ˆAå•R”V˜A ™G‘_”_ qÑ(Ñ)Ô)ˆBÝ•R”V˜A ™G‘_”_ qÑ(Ñ)Ô)ˆBÝ”
˜Q  2˜J¨¨A¨r¨
Ð3Ñ4Ô4ˆAÝ”n T¤]°A¸¸1°vÍ#ÔJ\Ð]Ñ]Ô]ˆGØ�IŠI�gÑÔÐÐØ�Š‰ŒˆåÐ/µ°U±´ÐP[Ð\Ñ\Ô\ˆåÐIÐI¨a¬kÔ.HÐIÑIÔIÑIÔIÐeÐeÐKeÑeÔeÐIåÐZÐZ¸q¼{Ô?YÐZÑZÔZÑZÔZÐZÐZÐZØŒ{Ô*¨eÐ3Ð3Ð3Ð3ØŒ $Ò&Ð&Ð&Ð&ØŒz˜UÐ"Ð"Ð"Ð"ØÔ! ]Ò2Ð2Ð2Ð2Ð2Ð2r   c                 óz  — |dz  }| j         j        dd…         \  }}t          j        t	          |¦  «        t          j        dŽ d||f¦  «        }t          d¦  «        D ]ª}t          t          j	        |dz  ¦  «        dz  ¦  «        }t          t          j
        |dz  ¦  «        d	z  ¦  «        }t          j        d
d|gdd
|gg¦  «        }	t          j        | j         |	||ft          j        ¬¦  «        }
|                     |
¦  «         Œ«|                     ¦   «          t!          dt	          |¦  «        d¬¦  «        }t#          d„ |j        j        D ¦   «         ¦  «        rJ ‚t#          d„ |j        j        D ¦   «         ¦  «        sJ ‚|j        j        du sJ ‚|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚dS )uÃ   
        Adversarial: ThÃºy Kiá»�u video WITH MICRO-MOTION (not frozen), evaluated as VÆ°Æ¡ng Quan.
        MUST detect cross-contamination, char_match=False, score <= 0.50, RETAKE_SHOT.
        ztk_moving_as_vq.mp4Nr(   r$   r   r   rÎ   rÏ   rÐ   rÑ   r   rÒ   Úshot_moving_vqrÊ   r¸   c              3   ó   K  — | ]}d |v V — Œ	dS r‹   rz   r�   s     r   r�   zzTestChallengerCharacterContaminationStress.test_contamination_moving_kieu_video_evaluated_as_vuong_quan.<locals>.<genexpr>  r‘   r   c              3   óB   K  — | ]}d |                      ¦   «         v V — ŒdS r»   r¼   r�   s     r   r�   zzTestChallengerCharacterContaminationStress.test_contamination_moving_kieu_video_evaluated_as_vuong_quan.<locals>.<genexpr>  r¾   r   Fr¹   rU   r×   rÛ   s               r   Ú<test_contamination_moving_kieu_video_evaluated_as_vuong_quanzgTestChallengerCharacterContaminationStress.test_contamination_moving_kieu_video_evaluated_as_vuong_quanü   sÅ  € ð
  Ð"7Ñ7ˆØŒ}Ô" 2 A 2Ô&‰ˆˆ1ÝŒo�c %™jœj­#Ô*@À&Ð*IÈ2ÐPQÐSTÈvÑVÔVˆÝ�r‘”ð 	ð 	ˆAÝ•R”V˜A ™G‘_”_ qÑ(Ñ)Ô)ˆBÝ•R”V˜A ™G‘_”_ qÑ(Ñ)Ô)ˆBÝ”
˜Q  2˜J¨¨A¨r¨
Ð3Ñ4Ô4ˆAÝ”n T¤]°A¸¸1°vÍ#ÔJ\Ð]Ñ]Ô]ˆGØ�IŠI�gÑÔÐÐØ�Š‰ŒˆåÐ/µ°U±´ÐP\Ð]Ñ]Ô]ˆÝÐIÐI¨a¬kÔ.HÐIÑIÔIÑIÔIÐIÐIÐIÝÐZÐZ¸q¼{Ô?YÐZÑZÔZÑZÔZÐZÐZÐZØŒ{Ô*¨eÐ3Ð3Ð3Ð3ØŒ $Ò&Ð&Ð&Ð&ØŒz˜UÐ"Ð"Ð"Ð"ØÔ! ]Ò2Ð2Ð2Ð2Ð2Ð2r   c                 ó  — |dz  }| j         j        dd…         \  }}t          j        t	          |¦  «        t          j        dŽ d||f¦  «        }t          d¦  «        D ]}|                     | j         ¦  «         Œ|                     ¦   «          t          dt	          |¦  «        d¬	¦  «        }|j
        j        d
u sJ ‚|j        dk    sJ ‚t          dt	          |¦  «        d¬	¦  «        }|j
        j        d
u sJ ‚|j        dk    sJ ‚dS )ua   Robustness: expected_character with spaces or capital letters ('  VÆ°Æ¡ng Ã”ng  ', 'VUONG_QUAN').ztk_static_as_vo_case.mp4Nr(   r$   r   r`   Ú
shot_vo_wsz  vuong_ong  r¸   Fr¹   Úshot_vq_upperÚ
VUONG_QUAN)r²   rÀ   r/   r1   r   r0   r2   r=   r>   r   r’   rÁ   rV   )	r[   r   rÃ   rÄ   rÅ   rF   rÆ   Úv1Úv2s	            r   Ú4test_contamination_with_whitespace_and_case_variantsz_TestChallengerCharacterContaminationStress.test_contamination_with_whitespace_and_case_variants  s  € àÐ"<Ñ<ˆØŒ}Ô" 2 A 2Ô&‰ˆˆ1ÝŒo�c %™jœj­#Ô*@À&Ð*IÈ2ÐPQÐSTÈvÑVÔVˆÝ�r‘”ð 	%ð 	%ˆAØ�IŠI�d”mÑ$Ô$Ð$Ð$Ø�Š‰Œˆõ   ­c°%©j¬jÈ_Ð]Ñ]Ô]ˆØŒ|Ô+¨uÐ4Ð4Ð4Ð4ØÔ 4Ò'Ð'Ð'Ð'õ   µ°U±´ÐP\Ð]Ñ]Ô]ˆØŒ|Ô+¨uÐ4Ð4Ð4Ð4ØÔ 4Ò'Ð'Ð'Ð'Ð'Ð'r   N)
rw   rx   ry   Úclassmethodr´   rÇ   rÌ   rà   rå   rì   rz   r   r   r¨   r¨   ¹   s�   € € € € € ØðVð Vñ „[ðVð[ð [ð [ð [ð [ð [ð 3ð 3ð 3ð63ð 3ð 3ð0(ð (ð (ð (ð (r   r¨   c                   ó   — e Zd Zd„ ZdS )Ú%TestChallengerLegitimateCharacterPassc                 ó„  — t           dz  dz  dz  dz  }t          j        t          |¦  «        ¦  «        }|j        dd…         \  }}|dz  }t          j        t          |¦  «        t          j        dŽ d	||f¦  «        }t          d
¦  «        D ]¥}t          t          j
        |dz  ¦  «        dz  ¦  «        }	t          t          j        |dz  ¦  «        dz  ¦  «        }
t          j        dd|	gdd|
gg¦  «        }t          j        ||||ft          j        ¬¦  «        }|                     |¦  «         Œ¦|                     ¦   «          t#          dt          |¦  «        d¬¦  «        }|j        j        du sJ ‚t)          d„ |j        j        D ¦   «         ¦  «        rJ ‚|j        dk    sJ ‚|j        du sJ ‚|j        dk    sJ ‚dS )uq   Oracle check: Bona fide ThÃºy Kiá»�u video with motion evaluated as ThÃºy Kiá»�u MUST pass without contamination.rª   r«   r¬   r­   Nr(   zgenuine_kieu_pass.mp4r$   r   r   rÎ   é
   é   rÑ   r   rÒ   Úshot_genuine_kieuÚ	thuy_kieur¸   Tc              3   óB   K  — | ]}d |                      ¦   «         v V — ŒdS r»   r¼   r�   s     r   r�   zkTestChallengerLegitimateCharacterPass.test_thuy_kieu_video_evaluated_as_thuy_kieu_passes.<locals>.<genexpr>?  s0   è è € Ð^Ð^¸aÐ,°·²±	´	Ð9Ð^Ð^Ð^Ð^Ð^Ð^r   gš™™™™™é?ÚAPPROVE)r®   r/   r±   r   rÀ   r1   r0   r2   r6   r3   r7   r8   rØ   rÙ   rÚ   r=   r>   r   r’   rÁ   r“   r”   rV   rW   rX   )r[   r   r¯   r²   rÄ   rÅ   rÃ   rF   rG   rÜ   rÝ   rÞ   rß   r]   s                 r   Ú2test_thuy_kieu_video_evaluated_as_thuy_kieu_passeszXTestChallengerLegitimateCharacterPass.test_thuy_kieu_video_evaluated_as_thuy_kieu_passes-  sÈ  € å$ {Ñ2°\ÑAÐDZÑZÐ]}Ñ}ˆÝ”:�c -Ñ0Ô0Ñ1Ô1ˆØŒ~˜b˜q˜bÔ!‰ˆˆ1àÐ"9Ñ9ˆÝŒo�c %™jœj­#Ô*@À&Ð*IÈ2ÐPQÐSTÈvÑVÔVˆÝ�r‘”ð 	ð 	ˆAÝ•R”V˜A ™G‘_”_ rÑ)Ñ*Ô*ˆBÝ•R”V˜A ™G‘_”_ qÑ(Ñ)Ô)ˆBÝ”
˜Q  2˜J¨¨A¨r¨
Ð3Ñ4Ô4ˆAÝ”n X¨q°1°a°&ÅSÔEWÐXÑXÔXˆGØ�IŠI�gÑÔÐÐØ�Š‰ŒˆåÐ2µC¸±J´JÐS^Ð_Ñ_Ô_ˆØŒ{Ô*¨dÐ2Ð2Ð2Ð2ÝÐ^Ð^À1Ä;ÔC]Ð^Ñ^Ô^Ñ^Ô^Ð^Ð^Ð^ØŒ $Ò&Ð&Ð&Ð&ØŒz˜TÐ!Ð!Ð!Ð!ØÔ! YÒ.Ð.Ð.Ð.Ð.Ð.r   N)rw   rx   ry   r÷   rz   r   r   rï   rï   ,  s#   € € € € € ð/ð /ð /ð /ð /r   rï   Ú__main__z-v)r   r   r   r   r   r   )"Ú__doc__ÚosÚsysÚtempfiler   Úpathlibr   r¤   Únumpyr3   r/   Ú__file__ÚresolveÚparentr®   ÚpathÚinsertr   Úantigravity_critic_gater   r   r   r   r	   r
   Úfixturer   rK   rM   r|   r¨   rï   rw   Úmainrz   r   r   ú<module>r     s"  ððð ð. 
€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø 
€
€
€
àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5€Ø „‡‚��3�3�|Ð&>Ñ>Ñ?Ô?Ñ @Ô @Ð @ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð €„�iÐ Ñ Ô ð5ð 5ñ !Ô ð5ðð  ð ð ð ð ð0>3ð >3ð >3ð >3ð >3ñ >3ô >3ð >3ðJ 7ð  7ð  7ð  7ð  7ñ  7ô  7ð  7ðNl(ð l(ð l(ð l(ð l(ñ l(ô l(ð l(ðf/ð /ð /ð /ð /ñ /ô /ð /ð2 ˆzÒÐØ€F„K�˜4Ð Ñ!Ô!Ð!Ð!Ð!ð Ðr   