§
    JUÂjQ  ã                  ó<  — 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
mZ ddlZddlmZmZmZmZ ddlZddlmZmZ ddlZddlmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*  G d„ d	¦  «        Z+ G d
„ d¦  «        Z, G d„ d¦  «        Z- G d„ d¦  «        Z.dS )aŒ  
FreeExile PBR Power-of-Two (PoT) Texture Atlas VFX & Cocos 3.8.x / Apple Metal Pipeline E2E Test Suite.

Authoritative Specifications:
- ORIGINAL_REQUEST.md (## 2026-10-04T12:05:22Z)
- PROJECT.md (orchestrator_22 Architecture & Interface Contracts)
- FE-SURVEY-SKILLS-VFX-20261004 (explorer_survey_1 Skills & Sigils Specification)
- SURVEY-20261004-ASSET-PIPELINE-TEXTURES (explorer_survey_3 Texture Packing & Normal Maps)

4-Tier Testing Methodology:
- Tier 1: Feature Coverage (12 Active Skills + 5 Support Sigils, PoT 1024/2048, Albedo+Normal, ASTC, Scaffolding)
- Tier 2: Boundary & Corner Cases (Dilation Padding fringe, Normal Blue mean > 128.0, UV bounds [0, 1], Pivot [0.5, 0.90])
- Tier 3: Cross-Feature Combinations (Skill + Sigil Pairwise Sequence, Normal Unit Length |N|=1.0)
- Tier 4: Real-World Workload Scenarios (Combat Loadout Q/W/E/Space Rotation Simulation, Cocos TypeScript Compilation)
é    )ÚannotationsN)ÚPath)ÚAnyÚDictÚListÚTuple)ÚImageÚ	ImageStat)Ú	REPO_ROOTÚCOCOS_VFX_DIRÚCOCOS_MANIFEST_PATHÚCOCOS_ALBEDO_PATHÚCOCOS_NORMAL_PATHÚCOCOS_ASTC_PATHÚCOCOS_MONSTERS_DIRÚCOCOS_CHARACTERS_DIRÚCANONICAL_ACTIVE_SKILLSÚCANONICAL_MOBILITY_SKILLÚCANONICAL_SUPPORT_SIGILSÚCANONICAL_MONSTER_GENERAÚCANONICAL_EXILE_CLASSESÚmatch_clip_identifierÚvalidate_manifest_uv_boundsÚloaded_manifestÚloaded_albedo_imageÚloaded_normal_imagec                  óB   — 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S )ÚTestTier1FeatureCoveragezÉ
    Tier 1: Category-Partition Feature Coverage.
    Verifies that all 12 active skills + 5 support sigils, PoT dimensions,
    Albedo + Normal maps, ASTC mobile container, and scaffolding exist.
    r   úDict[str, Any]ÚreturnÚNonec                ó†  ‡—  |j         di ¦  «        }t          |                     ¦   «         ¦  «        }g }t          D ]FŠt	          ˆfd„|D ¦   «         ¦  «        }|s'|                     ‰d         › d‰d         › d�¦  «         ŒGt          |¦  «        }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|› �¦  «        dz   d|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}dS )z•
        Feature 1: 12 Active Skills High-Fidelity VFX.
        Verifies all 12 active skills (1001-1012) are defined in the manifest clips.
        Úclipsc              3  ó8   •K  — | ]}t          |‰¦  «        V — Œd S ©N©r   )Ú.0ÚcÚskills     €úLC:\Projects\FreeExile\tests\e2e_cocos\test_vfx_texture_atlas_pipeline_e2e.pyú	<genexpr>z`TestTier1FeatureCoverage.test_t1_all_twelve_active_skills_present_in_manifest.<locals>.<genexpr>H   ó.   øè è € ÐLÐL¸AÕ-¨a°Ñ7Ô7ÐLÐLÐLÐLÐLÐLó    Úidú (Úkeyú)r   ©ú==©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚmissing_skills©Úpy0Úpy1Úpy3Úpy6z)Active Skills missing from VFX manifest (z/12): ú. Present clips: ú
>assert %(py8)sÚpy8N)ÚgetÚlistÚkeysr   ÚanyÚappendr5   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚ_format_assertmsgÚAssertionErrorÚ_format_explanation)Úselfr   r#   Ú
clip_namesr6   ÚfoundÚ@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9r)   s              @r*   Ú4test_t1_all_twelve_active_skills_present_in_manifestzMTestTier1FeatureCoverage.test_t1_all_twelve_active_skills_present_in_manifest>   s»  ø€ ð
 $�Ô# G¨RÑ0Ô0ˆÝ˜%Ÿ*š*™,œ,Ñ'Ô'ˆ
Øˆå,ð 	Ið 	IˆEÝÐLÐLÐLÐLÀÐLÑLÔLÑLÔLˆEØð IØ×%Ò%¨¨t¬Ð&GÐ&G¸¸e¼Ð&GÐ&GÐ&GÑHÔHÐHøå�>Ñ"Ô"ð 	
 að 	
Ð" aÒ'ð 	
ð 	
ñ 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð" að 	
ñ 	
ô 	
ð 	
õ 	
ô 
ñ	
ô 	
ð 	
ð 	
õ 	
ìõ ñ 	
ô 	
ð 	
õ 	
ô 
õ ñ 	
ô 	
ð 	
ð 	
ð 	
õ 	
ô 
ñ	
ô 	
ð 	
ð 	
õ 	
ìð "ñ 	
ô 	
ð 	
õ 	
ô 
ð "ñ 	
ô 	
ð 	
ð 	
õ 	
ô 
ð #ñ 	
ô 	
õ 	
ô 
ð '(ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð+½¸NÑ8KÔ8Kð +ð +ÐSað +ð +Ø(ð+ð +ñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
r-   c                ó†  ‡—  |j         di ¦  «        }t          |                     ¦   «         ¦  «        }g }t          D ]FŠt	          ˆfd„|D ¦   «         ¦  «        }|s'|                     ‰d         › d‰d         › d�¦  «         ŒGt          |¦  «        }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|› �¦  «        dz   d|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}dS )z£
        Feature 2: 5 Support Sigils High-Fidelity VFX.
        Verifies all 5 augment sigils (2001, 2002, 2004, 2005, 2006/2003) exist in manifest clips.
        r#   c              3  ó8   •K  — | ]}t          |‰¦  «        V — Œd S r%   r&   )r'   r(   Úsigils     €r*   r+   z_TestTier1FeatureCoverage.test_t1_all_five_support_sigils_present_in_manifest.<locals>.<genexpr>[   r,   r-   r.   r/   r0   r1   r   r2   r4   r5   Úmissing_sigilsr7   z*Support Sigils missing from VFX manifest (z/5): r<   r=   r>   N)r?   r@   rA   r   rB   rC   r5   rD   rE   rF   rG   rH   rI   rJ   rK   rL   )rM   r   r#   rN   rY   rO   rP   rQ   rR   rS   rT   rX   s              @r*   Ú3test_t1_all_five_support_sigils_present_in_manifestzLTestTier1FeatureCoverage.test_t1_all_five_support_sigils_present_in_manifestQ   s»  ø€ ð
 $�Ô# G¨RÑ0Ô0ˆÝ˜%Ÿ*š*™,œ,Ñ'Ô'ˆ
Øˆå-ð 	Ið 	IˆEÝÐLÐLÐLÐLÀÐLÑLÔLÑLÔLˆEØð IØ×%Ò%¨¨t¬Ð&GÐ&G¸¸e¼Ð&GÐ&GÐ&GÑHÔHÐHøå�>Ñ"Ô"ð 	
 að 	
Ð" aÒ'ð 	
ð 	
ñ 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð" að 	
ñ 	
ô 	
ð 	
õ 	
ô 
ñ	
ô 	
ð 	
ð 	
õ 	
ìõ ñ 	
ô 	
ð 	
õ 	
ô 
õ ñ 	
ô 	
ð 	
ð 	
ð 	
õ 	
ô 
ñ	
ô 	
ð 	
ð 	
õ 	
ìð "ñ 	
ô 	
ð 	
õ 	
ô 
ð "ñ 	
ô 	
ð 	
ð 	
õ 	
ô 
ð #ñ 	
ô 	
õ 	
ô 
ð '(ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð+½¸^Ñ9LÔ9Lð +ð +ÐSað +ð +Ø(ð+ð +ñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
r-   r   úImage.Imager   c                óà
  — ddh}|j         \  }}g }||v }|}|r||v }	|	}|�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dœz  }
dd	|
iz  }|                     |¦  «         |r¶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dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }t          j	        d|› d|› d�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}	||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dœz  }t          j	        d|› d|› �¦  «        dz   d|iz  }
t          t          j        |
¦  «        ¦  «        ‚d}|j         \  }}g }||v }|}|r||v }	|	}|�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dœz  }
dd	|
iz  }|                     |¦  «         |r¶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dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }t          j	        d|› d|› d�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}	||f}||f}||k    }|sŽt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        d œz  }
t          j	        d!|› d|› d"|› d|› d#�	¦  «        d$z   d	|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}dS )%z°
        Feature 3: Power-of-Two (PoT) Texture Packing.
        Dimensions must be 1024x1024 or 2048x2048 to prevent GPU sampling penalties and allow ASTC compression.
        é   é   ©Úin)z%(py2)s in %(py4)sÚw_albÚvalid_pot_dimensions©Úpy2Úpy4ú%(py6)sr;   )z%(py8)s in %(py10)sÚh_alb©r>   Úpy10ú%(py12)sÚpy12r   zAlbedo texture dimensions (Úxz%) must be Power-of-Two (1024 or 2048)ú
>assert %(py15)sÚpy15Nr2   )z%(py0)s == %(py2)s)r8   rd   zAtlas should be square, got z
>assert %(py4)sre   Úw_nrmÚh_nrmzNormal map dimensions (©z%(py1)s == %(py4)s©r9   re   zAlbedo (z) and Normal (z#) dimensions must match identicallyú
>assert %(py6)s)ÚsizerD   rE   rF   rG   rH   rI   rC   Ú_format_booloprJ   rK   rL   )rM   r   r   rb   ra   rg   Ú@py_assert1Ú@py_assert3Ú@py_assert0Ú@py_assert9Ú@py_format5rS   Ú@py_format11Ú@py_format13Ú@py_format14Ú@py_format16Ú@py_format3ro   rp   rP   s                       r*   Ú%test_t1_atlas_dimensions_power_of_twoz>TestTier1FeatureCoverage.test_t1_atlas_dimensions_power_of_twod   s€	  € ð !% d˜|Ðà*Ô/‰ˆˆuð	
ð 	
ˆuÐ,Ð,ð 	
ð 	
ð 	
ð 	
ð 	
°Ð:NÐ1Nð 	
ð 	
ð 	
ð 	
ñ 	
õ 	
ìð	
ð 	
ð 	
ð 	
ˆuÐ,ð 	
ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð ñ 	
ô 	
ð 	
õ 	
ä 	ð ñ 	
ô 	
ð 	
ð 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð -ñ 	
ô 	
ð 	
õ 	
ä 	ð -ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ç	‚6ð	
á	„6€6ð	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
°Ð:Nð 	
ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð 27ñ 	
ô 	
ð 	
õ 	
ä 	ð 27ñ 	
ô 	
ð 	
ð 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð ;Oñ 	
ô 	
ð 	
õ 	
ä 	ð ;Oñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ç	‚6ð	
á	„6€6õ	
ìð	
ð 	
ñ 	
ô 	
ð 	
ñ 	
ð 	
õ 	
ìð _¨%Ð^Ð^°%Ð^Ð^Ð^ñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ˜Š~ÐMÐMÐMÕMÔMÐMÐMÐMÐMˆu˜ÐMÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔMˆuÑMÔMÐMÕMÔMˆuÑMÔMÐMÐMÐMÕMÔMÑMÔMÐMÐMÕMÔM˜ÑMÔMÐMÕMÔM˜ÑMÔMÐMÐMÐMÐMÑMÐMÕMÔMÐM¸eÐMÐMÀeÐMÐMÑMÔMÐMÑMÐMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMà*Ô/‰ˆˆuð	
ð 	
ˆuÐ,Ð,ð 	
ð 	
ð 	
ð 	
ð 	
°Ð:NÐ1Nð 	
ð 	
ð 	
ð 	
ñ 	
õ 	
ìð	
ð 	
ð 	
ð 	
ˆuÐ,ð 	
ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð ñ 	
ô 	
ð 	
õ 	
ä 	ð ñ 	
ô 	
ð 	
ð 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð -ñ 	
ô 	
ð 	
õ 	
ä 	ð -ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ç	‚6ð	
á	„6€6ð	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
°Ð:Nð 	
ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð 27ñ 	
ô 	
ð 	
õ 	
ä 	ð 27ñ 	
ô 	
ð 	
ð 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð ;Oñ 	
ô 	
ð 	
õ 	
ä 	ð ;Oñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ç	‚6ð	
á	„6€6õ	
ìð	
ð 	
ñ 	
ô 	
ð 	
ñ 	
ð 	
õ 	
ìð [ eÐZÐZ¨eÐZÐZÐZñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð �uˆ~ð 	
 %¨ ð 	
ˆ~ Ò/ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
ˆ~ ð 	
ñ 	
ô 	
õ 	
ä 	ð ñ 	
ô 	
õ 	
ä 	ð "0ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð g�uÐfÐf˜uÐfÐf°EÐfÐf¸EÐfÐfÐfñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
r-   c                ó*  — t           j        } |¦   «         }|s²t          j        dt           › �¦  «        dz   dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}}t           j
        } |¦   «         }|j        }d}||k    }|�s	t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d	œz  }t          j        d
t          j
        ¦   «         j        › d�¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}}t          j        } |¦   «         }|s²t          j        dt          › �¦  «        dz   dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}}t          j
        } |¦   «         }|j        }d}||k    }|�s	t          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d	œz  }t          j        dt          j
        ¦   «         j        › d�¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}}dS )z¯
        Feature 4 & 7: Dual PBR Textures in Cocos Resources.
        Both Albedo (`*_atlas.png`) and Normal (`*_atlas_normal.png`) files must exist and be non-empty.
        zAlbedo atlas missing at úC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}r   ©r8   rd   re   Nr]   ©ú>)z_%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.stat
}()
}.st_size
} > %(py9)s)r8   rd   re   r;   Úpy9zAlbedo atlas file too small: z bytesz
>assert %(py11)sÚpy11zNormal map atlas missing at r   zNormal map file too small: )r   ÚexistsrD   rJ   rF   rG   rH   rI   rK   rL   ÚstatÚst_sizerE   r   )	rM   rv   rw   rz   rQ   Ú@py_assert8Ú@py_assert7Ú@py_format10Ú@py_format12s	            r*   Ú,test_t1_albedo_and_tangent_normal_maps_existzETestTier1FeatureCoverage.test_t1_albedo_and_tangent_normal_maps_exist{   sB  € õ
 !Ô'ÐYÐ'Ð'Ñ)Ô)ÐYÐ)ÐYÕYÔYÐ+YÕFWÐ+YÐ+YÑYÔYÐYÑYÐYÕYÔYÑYÔYÐYÐYÕYÔYÕ ÑYÔYÐYÕYÔYÕ ÑYÔYÐYÐYÕYÔYÐ'ÑYÔYÕYÔYÐ)ÑYÔYÐYÐYÑYÐYÕYÕYÔYÐYÑYÔYÑYÔYÐYÐYÐYÐYÐYÝ Ô%ð  	AÐ%Ð%Ñ'Ô'ð  	AÐ'Ô/ð  	A°$ð  	AÐ/°$Ò6ð  	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õ  	Aô  	AÐ%ñ  	Aô  	Aõ  	Aô  	AÐ'ñ  	Aô  	Aõ  	Aô  	AÐ/ñ  	Aô  	Aõ  	Aô  	A°$ñ  	Aô  	Að  	Að  	Añ  	Að  	Aõ  	Aô  	Að  9AÕXiÔXnÑXpÔXpÔXxð  9Að  9Að  9Añ  	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å Ô'Ð]Ð'Ð'Ñ)Ô)Ð]Ð)Ð]Õ]Ô]Ð+]ÕJ[Ð+]Ð+]Ñ]Ô]Ð]Ñ]Ð]Õ]Ô]Ñ]Ô]Ð]Ð]Õ]Ô]Õ Ñ]Ô]Ð]Õ]Ô]Õ Ñ]Ô]Ð]Ð]Õ]Ô]Ð'Ñ]Ô]Õ]Ô]Ð)Ñ]Ô]Ð]Ð]Ñ]Ð]Õ]Õ]Ô]Ð]Ñ]Ô]Ñ]Ô]Ð]Ð]Ð]Ð]Ð]Ý Ô%Ð~Ð%Ð%Ñ'Ô'Ð~Ð'Ô/Ð~°$Ð~Ð/°$Ò6Ð~Ð~Ñ~Õ~Ô~Ð~Ð~Ð~Ð~Ð/°$Ð~Ñ~Ô~Ð~Õ~Ô~Ñ~Ô~Ð~Ð~Õ~Ô~Õ Ñ~Ô~Ð~Õ~Ô~Õ Ñ~Ô~Ð~Ð~Õ~Ô~Ð%Ñ~Ô~Õ~Ô~Ð'Ñ~Ô~Õ~Ô~Ð/Ñ~Ô~Õ~Ô~°$Ñ~Ô~Ð~Ð~Ñ~Ð~Õ~Ô~Ð8~ÕVgÔVlÑVnÔVnÔVvÐ8~Ð8~Ð8~Ñ~Ô~Ð~Ñ~Ð~Ð~Ð~Ñ~Ð~Õ~Õ~Ô~Ð~Ñ~Ô~Ñ~Ô~Ð~Ð~Ð~Ð~Ð~Ð~Ð~Ð~Ð~Ð~Ð~Ð~Ð~r-   c                óÞ
  — t           j        } |¦   «         }|s³t          j        dt           › d�¦  «        dz   dt	          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}}t          j
        ¦   «         j        }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          t           d¦  «        5 }|                     d¦  «        }	ddd¦  «         n# 1 swxY w Y   t          g d¢¦  «        }
|	dd…         }||
k    }|sÉt          j        d|fd||
f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |
¦  «        rt          j        |
¦  «        nddœz  }t          j        d|	dd…                              ¦   «         › �¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}}|	d         }|	d         }|	d         }|||f}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"…         d#¬$¦  «        }t"                               |	d"d%…         d#¬$¦  «        }g }d&}||v }|}|rd&}||v }|}|�sst          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  }|                     |¦  «         |r‹t          j        d'|fd-||f¦  «        d.t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd.t          j        |¦  «        d/œz  }d0d1|iz  }|                     |¦  «         t          j        |d2¦  «        i z  }t          j        d3|› d|› �¦  «        d4z   d5|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}}dS )6zà
        Feature 8: ASTC 4x4 Mobile Compression Container.
        Verifies that `.astc` file exists and starts with the canonical 16-byte header:
        Magic: 0x5CA1AB13, blockdim_x=4, blockdim_y=4, blockdim_z=1.
        zASTC container not found at z'. Apple Metal requires ASTC 4x4 binary.r‚   r   rƒ   Né   ©ú>=©z%(py0)s >= %(py3)sÚ	file_size©r8   r:   zASTC file too small (z bytes)ú
>assert %(py5)sÚpy5Úrb)é   é«   é¡   é\   é   r2   )z%(py1)s == %(py3)sÚexpected_magic)r9   r:   z3Invalid ASTC magic bytes: expected 0x5CA1AB13, got é   é   )rž   rž   é   rq   rr   z)Expected ASTC 4x4x1 block footprint, got rl   rs   r;   é   é
   Úlittle)Ú	byteorderé   )r]   r^   r_   )z%(py2)s in %(py5)sÚw©rd   r˜   ú%(py7)sÚpy7)z%(py9)s in %(py12)sÚh©r†   rk   ú%(py14)sÚpy14r   z3ASTC header width/height must be 1024 or 2048, got z
>assert %(py17)sÚpy17)r   rˆ   rD   rJ   rF   rG   rH   rI   rK   rL   r‰   rŠ   rE   ÚopenÚreadÚbytesÚhexÚintÚ
from_bytesrC   ru   )rM   rv   rw   rz   r•   rP   Ú@py_format4Ú@py_format6ÚfÚheaderrŸ   rx   Úblock_xÚblock_yÚblock_zrS   r¨   r¬   rR   Ú@py_assert11Ú@py_assert10Ú@py_format8r|   Ú@py_format15r~   Ú@py_format18s                             r*   Ú4test_t1_astc_texture_container_generation_and_headerzMTestTier1FeatureCoverage.test_t1_astc_texture_container_generation_and_header†   sÂ  € õ Ô%ð 	
Ð%Ð%Ñ'Ô'ð 	
Ð'ð 	
õ 	
ìð d­?ÐcÐcÐcñ	
ô 	
ð 	
ñ 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìõ ñ 	
ô 	
ð 	
õ 	
ä 	õ ñ 	
ô 	
ð 	
ð 	
õ 	
ä 	ð &ñ 	
ô 	
õ 	
ä 	ð (ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ $Ô(Ñ*Ô*Ô2ˆ	ØÐJˆy˜BŠÐJÐJÐJÕJÔJÐJÐJÐJÐJˆy˜BÐJÑJÔJÐJÕJÔJÑJÔJÐJÐJÕJÔJˆyÑJÔJÐJÕJÔJˆyÑJÔJÐJÐJÕJÔJ˜BÑJÔJÐJÐJÑJÐJÕJÔJÐ J¸	Ð JÐ JÐ JÑJÔJÐJÑJÐJÐJÐJÑJÐJÕJÕJÔJÐJÑJÔJÑJÔJÐJÐJÐJÐJÐJå•/ 4Ñ(Ô(ð 	 ¨AØ—V’V˜B‘Z”ZˆFð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 õ Ð7Ð7Ð7Ñ8Ô8ˆØ�b�q�bŒzð 	
ˆz˜^Ò+ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
ˆz˜^ð 	
ñ 	
ô 	
õ 	
ä 	ð ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð ,ñ 	
ô 	
ð 	
õ 	
ä 	ð ,ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð UÀ&ÈÈ!ÈÄ*Ç.Â.ÑBRÔBRÐTÐTñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð ˜”)ˆØ˜”)ˆØ˜”)ˆØ˜ 'Ð*ð 	
¨ið 	
Ð*¨iÒ7ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð*¨ið 	
ñ 	
ô 	
õ 	
ä 	ð +ñ 	
ô 	
õ 	
ä 	ð /8ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð V¸ÐUÐUÀ'ÐUÐUÈGÐUÐUñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ �NŠN˜6 ! B $œ<°8ˆNÑ<Ô<ˆÝ�NŠN˜6 " R %œ=°HˆNÑ=Ô=ˆð	
ð 	
�Lð 	
ˆq�LÐ ð 	
ð 	
ð 	
ð 	
ð 	
¨,ð 	
 Q¨,Ð%6ð 	
ð 	
ð 	
ð 	
ñ 	
õ 	
ìð	
ð 	
ð 	
ð 	
ˆq�Lð 	
ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð ñ 	
ô 	
ð 	
õ 	
ä 	ð ñ 	
ô 	
ð 	
ð 	
õ 	
ä 	ð !ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ç	‚6ð	
á	„6€6ð	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
 Q¨,ð 	
ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð &'ñ 	
ô 	
ð 	
õ 	
ä 	ð &'ñ 	
ô 	
ð 	
ð 	
õ 	
ä 	ð +7ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ç	‚6ð	
á	„6€6õ	
ìð	
ð 	
ñ 	
ô 	
ð 	
ñ 	
ð 	
õ 	
ìð JÀ!ÐIÐIÀaÐIÐIñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
s   Æ;GÇG!Ç$G!c           	     óä
  — t           dz  dz  dz  t           dz  dz  dz  g}d„ |D ¦   «         }t          |¦  «        }|sªt          j        d¦  «        dz   dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        d	œz  }t          t          j	        |¦  «        ¦  «        ‚d
x}}t          j        } |¦   «         }|s²t          j        dt          › �¦  «        dz   dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        d	œz  }t          t          j	        |¦  «        ¦  «        ‚d
x}}t          j        } |¦   «         }|s²t          j        dt          › �¦  «        dz   dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        d	œz  }t          t          j	        |¦  «        ¦  «        ‚d
x}}t          D �]k}t          |z  |› d�z  }|j        } |¦   «         }|s£t          j        d|› �¦  «        dz   dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d	œz  }t          t          j	        |¦  «        ¦  «        ‚d
x}}t          |¦  «        }| }|sˆt          j        d|› d|d
d…         › �¦  «        dz   ddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndiz  }t          t          j	        |¦  «        ¦  «        ‚d
}�Œmt          D �]k}	t          |	z  |	› d�z  }|j        } |¦   «         }|s£t          j        d|› �¦  «        dz   dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d	œz  }t          t          j	        |¦  «        ¦  «        ‚d
x}}t          |¦  «        }| }|sˆt          j        d|	› d|d
d…         › �¦  «        dz   ddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndiz  }t          t          j	        |¦  «        ¦  «        ‚d
}�Œmd
S )zö
        Feature 9: Monster & Character Pipeline Scaffolding.
        Verifies extensible directory templates exist for 10 Monster archetypes and 6 Exile classes,
        and ensures all 16 manifests satisfy 0.0 <= u0, v0, u1, v1 <= 1.0.
        ÚtoolsÚasset_pipelinez&monster_character_pipeline_scaffold.pyz+generate_monster_and_character_pipelines.pyc              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r%   )rˆ   )r'   Úps     r*   r+   z_TestTier1FeatureCoverage.test_t1_monster_and_character_scaffolding_structure.<locals>.<genexpr>°   s*   è è € ÐBÐB !�1—8’8‘:”:ÐBÐBÐBÐBÐBÐBr-   z3Scaffolding script missing in tools/asset_pipeline/z.
>assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}rB   rƒ   NzMonsters directory missing: r‚   r   zCharacters directory missing: r   z_anim_manifest.jsonzMonster manifest missing: Úmanifest_pathzMonster z UV out of bounds: é   z
>assert not %(py0)sr8   ÚerrorszCharacter manifest missing: z
Character )r   rB   rD   rJ   rF   rG   rH   rI   rK   rL   r   rˆ   r   r   r   r   )
rM   Úscaffold_script_candidatesrv   rw   rz   ÚgenusrÉ   rË   Ú@py_format2Úclass_ids
             r*   Ú3test_t1_monster_and_character_scaffolding_structurezLTestTier1FeatureCoverage.test_t1_monster_and_character_scaffolding_structure¦   sá  € õ ˜ÑÐ"2Ñ2Ð5]Ñ]Ý˜ÑÐ"2Ñ2Ð5bÑbð&
Ð"ð CÐBÐ'AÐBÑBÔBÐy�sÐBÑBÔBÐyÐBÐyÕyÔyÐDyÑyÔyÐyÑyÐyÕyÔyÑyÔyÐyÐyÕyÔy�sÑyÔyÐyÕyÔy�sÑyÔyÐyÐyÕyÔyÐBÑyÔyÕyÔyÐBÑyÔyÐyÐyÑyÐyÕyÕyÔyÐyÑyÔyÑyÔyÐyÐyÐyÐyÐyå!Ô(Ð_Ð(Ð(Ñ*Ô*Ð_Ð*Ð_Õ_Ô_Ð,_ÕK]Ð,_Ð,_Ñ_Ô_Ð_Ñ_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_Õ!Ñ_Ô_Ð_Õ_Ô_Õ!Ñ_Ô_Ð_Ð_Õ_Ô_Ð(Ñ_Ô_Õ_Ô_Ð*Ñ_Ô_Ð_Ð_Ñ_Ð_Õ_Õ_Ô_Ð_Ñ_Ô_Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ý#Ô*ÐeÐ*Ð*Ñ,Ô,ÐeÐ,ÐeÕeÔeÐ.eÕOcÐ.eÐ.eÑeÔeÐeÑeÐeÕeÔeÑeÔeÐeÐeÕeÔeÕ#ÑeÔeÐeÕeÔeÕ#ÑeÔeÐeÐeÕeÔeÐ*ÑeÔeÕeÔeÐ,ÑeÔeÐeÐeÑeÐeÕeÕeÔeÐeÑeÔeÑeÔeÐeÐeÐeÐeÐeå-ð 	Qñ 	QˆEÝ.°Ñ6¸EÐ9VÐ9VÐ9VÑVˆMØ Ô'ÐWÐ'Ð'Ñ)Ô)ÐWÐ)ÐWÕWÔWÐ+WÈÐ+WÐ+WÑWÔWÐWÑWÐWÕWÔWÑWÔWÐWÐWÕWÔW�=ÑWÔWÐWÕWÔW�=ÑWÔWÐWÐWÕWÔWÐ'ÑWÔWÕWÔWÐ)ÑWÔWÐWÐWÑWÐWÕWÕWÔWÐWÑWÔWÑWÔWÐWÐWÐWÐWÐWÝ0°Ñ?Ô?ˆFØ�:ÐP�:ÐPÕPÔPÐP¨%ÐPÐPÀFÈ2ÈAÈ2ÄJÐPÐPÑPÔPÐPÑPÐPÐPÕPÔPÑPÔPÐPÐPÕPÔP�vÑPÔPÐPÕPÔP�vÑPÔPÐPÐPÐPÑPÐPÕPÕPÔPÐPÑPÔPÑPÔPÐPÐPÐPÑPå/ð 	Vñ 	VˆHÝ0°8Ñ;ÀÐ>^Ð>^Ð>^Ñ^ˆMØ Ô'ÐYÐ'Ð'Ñ)Ô)ÐYÐ)ÐYÕYÔYÐ+YÈ-Ð+YÐ+YÑYÔYÐYÑYÐYÕYÔYÑYÔYÐYÐYÕYÔY�=ÑYÔYÐYÕYÔY�=ÑYÔYÐYÐYÕYÔYÐ'ÑYÔYÕYÔYÐ)ÑYÔYÐYÐYÑYÐYÕYÕYÔYÐYÑYÔYÑYÔYÐYÐYÐYÐYÐYÝ0°Ñ?Ô?ˆFØ�:ÐU�:ÐUÕUÔUÐU¨HÐUÐUÈÐPRÐQRÐPRÌÐUÐUÑUÔUÐUÑUÐUÐUÕUÔUÑUÔUÐUÐUÕUÔU�vÑUÔUÐUÕUÔU�vÑUÔUÐUÐUÐUÑUÐUÕUÕUÔUÐUÑUÔUÑUÔUÐUÐUÐUÑUð		Vð 	Vr-   N©r   r   r    r!   )r   r[   r   r[   r    r!   ©r    r!   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__rU   rZ   r€   r�   rÃ   rÐ   © r-   r*   r   r   7   s¡   € € € € € ðð ð
ð 
ð 
ð 
ð&
ð 
ð 
ð 
ð&
ð 
ð 
ð 
ð.	ð 	ð 	ð 	ð
ð 
ð 
ð 
ð@Vð Vð Vð Vð Vð Vr-   r   c                  ó:   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„ZdS )ÚTestTier2BoundaryAndCornerCaseszÕ
    Tier 2: Boundary Value Analysis.
    Verifies edge dilation color padding, strict Blue channel mean > 128.0,
    normalized UV unit interval bounds [0.0, 1.0], and anchor bottom-center pivot [0.5, 0.90].
    r   r[   r    r!   c                óÖ  — t          j         |j        d¦  «        ¦  «        }|dd…dd…df         }|dk    }|dd…dd…df         |dd…dd…df         |dd…dd…df         }}}|dk    |dk    z  |dk    z  }t          j        ||¦  «        }	t	          t          j        |	¦  «        ¦  «        }
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z   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )z¿
        Corner Case 1: Dilation Padding Non-Zero RGB on Transparent Boundary Fringe.
        Checks morphological dilation padding around alpha edges to prevent dark halo artifacts.
        ÚRGBANrÊ   r   r¢   é   r„   ©z%(py0)s > %(py3)sÚcount_dilatedr–   zžDilation padding missing: Zero colored pixels found in transparent areas (alpha == 0). Texture edges will suffer from dark halo bleeding on black backgrounds.r—   r˜   )ÚnpÚarrayÚconvertÚlogical_andrµ   ÚsumrD   rE   rF   rG   rH   rI   rJ   rK   rL   )rM   r   ÚrgbaÚalphaÚtransparent_maskÚrÚgÚbÚcolor_present_maskÚdilated_bleed_pixelsrÞ   rP   rv   r·   r¸   s                  r*   Ú@test_t2_edge_texels_dilation_padding_nonzero_rgb_with_zero_alphaz`TestTier2BoundaryAndCornerCases.test_t2_edge_texels_dilation_padding_nonzero_rgb_with_zero_alphaÎ   s*  € õ ŒxÐ3Ð+Ô3°FÑ;Ô;Ñ<Ô<ˆØ�Q�Q�Q˜˜˜˜1�W”ˆà  Aš:ÐØ�q�q�q˜!˜!˜!˜Q�w”-  a a a¨¨¨¨A g¤°°Q°Q°Q¸¸¸¸1°W´ˆaˆ1ˆØ !še¨¨AªÑ.°!°a²%Ñ8Ðå!œ~Ð.>Ð@RÑSÔSÐÝ�BœFÐ#7Ñ8Ô8Ñ9Ô9ˆà ð 	
ˆ}˜qÒ ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
ˆ}˜qð 	
ñ 	
ô 	
ð 	
õ 	
ô 
ñ	
ô 	
ð 	
ð 	
õ 	
ìð ñ 	
ô 	
ð 	
õ 	
ô 
ð ñ 	
ô 	
ð 	
ð 	
õ 	
ô 
ð  !ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìðVñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
r-   r   c                óÆ  — t          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  }t          j	        d|d›d	�¦  «        d
z   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )z¼
        Corner Case 2: Tangent-Space Normal Map Blue Channel Dominance (Nz >= 0).
        Strict invariant: The mean value of the Blue channel across the texture must be > 128.0.
        rÜ   g      `@r„   rÝ   Úb_meanr–   z&Tangent Normal map Blue channel mean (z.2fzd) must be > 128.0. A value <= 128 indicates incorrect BGR channel ordering or inverted Nz component.r—   r˜   N)r
   ÚStatÚmeanrD   rE   rF   rG   rH   rI   rJ   rK   rL   )rM   r   Ústatsrî   rP   rv   r·   r¸   s           r*   Ú<test_t2_tangent_normal_map_blue_channel_mean_above_thresholdz\TestTier2BoundaryAndCornerCases.test_t2_tangent_normal_map_blue_channel_mean_above_thresholdä   s‘  € õ ”Ð2Ñ3Ô3ˆØ”˜A”ˆàð 	
ˆv˜Š~ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
ˆv˜ð 	
ñ 	
ô 	
ð 	
õ 	
ô 
ñ	
ô 	
ð 	
ð 	
õ 	
ìð ñ 	
ô 	
ð 	
õ 	
ô 
ð ñ 	
ô 	
ð 	
ð 	
õ 	
ô 
ð ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð`°VÐTð `ð `ð `ñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
r-   r   r   c                óž  — t           |j        dd¦  «        ¦  «        }t           |j        dd¦  «        ¦  «        } |j        di ¦  «        }|                     ¦   «         D �]i\  }}|                     dg ¦  «        }t          |¦  «        D �]<\  }}	t          |	d         ¦  «        }
t          |	d         ¦  «        }t          |	d         ¦  «        }t          |	d	         ¦  «        }|
|z  }||z  }|
|z   |z  }||z   |z  }g }d
}||k    }d}||k    }|o|}|r|rd
}||k    }d}||k    }|o|}|�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  }| 
                    |¦  «         |r¢|r 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	          j        |d¦  «        i z  } t	          j        d|› d|› d|d›d|d›d�	¦  «        dz   d| iz  }!t          t	          j        |!¦  «        ¦  «        ‚d x}x}x}x}x}x}x}x}x}}g }d
}||k    }d}||k    }|o|}|r|rd
}||k    }d}||k    }|o|}|�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  }| 
                    |¦  «         |r¢|r 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	          j        |d¦  «        i z  } t	          j        d|› d|› d#|d›d|d›d�	¦  «        dz   d| iz  }!t          t	          j        |!¦  «        ¦  «        ‚d x}x}x}x}x}x}x}x}x}}g }||k    }"|"}|"r||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d&œz  }$d'd(|$iz  }%| 
                    |%¦  «         |"r¶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!d*œz  }d+d,|iz  }&| 
                    |&¦  «         t	          j        |d¦  «        i z  }'t	          j        d|› d|› d-|› d.|› �¦  «        d/z   d0|'iz  }(t          t	          j        |(¦  «        ¦  «        ‚d x}x}x}"}#�Œ>�Œkd S )1z¶
        Corner Case 3: Normalized UV Coordinates Strictly in [0.0, 1.0].
        Verifies that all frame rects in savage_primal_skills_vfx_atlas satisfy 0.0 <= u, v <= 1.0.
        ÚtextureWidthr^   ÚtextureHeightr#   Úframesrl   Úyr¨   r¬   g        ç      ð?©ú<=rú   )z%(py3)s <= %(py6)sz%(py6)s <= %(py8)sÚu0)r:   r;   r>   z%(py10)sri   )z%(py13)s <= %(py16)sz%(py16)s <= %(py18)sÚu1)Úpy13Úpy16Úpy18z%(py20)sÚpy20r   zClip 'ú' frame z U coordinate out of bounds: [z.4fz, ú]z
>assert %(py23)sÚpy23NÚv0Úv1z V coordinate out of bounds: [r„   )z%(py2)s > %(py4)src   rf   r;   )z%(py8)s > %(py10)srh   rj   rk   z# has degenerate rect dimensions: w=z, h=rm   rn   )Úfloatr?   ÚitemsÚ	enumeraterD   rE   rI   rF   rG   rH   rC   ru   rJ   rK   rL   ))rM   r   Útex_wÚtex_hr#   Ú	clip_nameÚ	clip_datarö   ÚidxÚframerl   r÷   r¨   r¬   rû   r  rü   r  rv   rP   rR   rŒ   rQ   rx   Ú@py_assert12Ú@py_assert14Ú@py_assert17Ú@py_assert15rT   r{   Ú@py_format19Ú@py_format21Ú@py_format22Ú@py_format24rw   ry   rz   rS   r|   r}   r~   s)                                            r*   Ú3test_t2_uv_coordinates_bounded_within_unit_intervalzSTestTier2BoundaryAndCornerCases.test_t2_uv_coordinates_bounded_within_unit_intervaló   sp  € õ
 Ð)�oÔ)¨.¸$Ñ?Ô?Ñ@Ô@ˆÝÐ)�oÔ)¨/¸4Ñ@Ô@ÑAÔAˆØ#�Ô# G¨RÑ0Ô0ˆà$)§K¢K¡M¤Mð 	ñ 	Ñ ˆI�yØ—]’] 8¨RÑ0Ô0ˆFÝ'¨Ñ/Ô/ð ñ ‘
��UÝ˜% œ*Ñ%Ô%�Ý˜% œ*Ñ%Ô%�Ý˜% œ*Ñ%Ô%�Ý˜% œ*Ñ%Ô%�à˜‘Y�Ø˜‘Y�Ø˜!‘e˜u‘_�Ø˜!‘e˜u‘_�ðð �sð �s˜bÒ'ð  Cð ˜b CÒ'ð ð ð ð ð ð ð ð ð ¨Cð ¨C°2Ò,<ð ¸ð °2¸Ò,<ð ð ð ð ð ð ñ õ ä ðð ð ð ð �s˜b Cð ñ ô õ äð ñ ô ð õ äñô ð ð õ ìð !ñ ô ð õ äð !ñ ô ð ð õ äð %(ñ ô ð ð ñ ð ð ð ð ð ñ ð ð çŠ6ðáŒ6ˆ6ðð ð ð õ ä ðð ð ð ð ¨C°2¸ð ñ ô õ äð -0ñ ô ð õ äñô ð ð õ ìð 46ñ ô ð õ äð 46ñ ô ð ð õ äð :=ñ ô ð ð ñ ð ð ð ð ð ñ ð ð çŠ6ðáŒ6ˆ6õäðð ñ ô ð ñ ð õ ä ð g˜YÐfÐf°ÐfÐfÐSUÐfÐfÐfÐ]_ÐfÐfÐfÐfñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð �sð �s˜bÒ'ð  Cð ˜b CÒ'ð ð ð ð ð ð ð ð ð ¨Cð ¨C°2Ò,<ð ¸ð °2¸Ò,<ð ð ð ð ð ð ñ õ ä ðð ð ð ð �s˜b Cð ñ ô õ äð ñ ô ð õ äñô ð ð õ ìð !ñ ô ð õ äð !ñ ô ð ð õ äð %(ñ ô ð ð ñ ð ð ð ð ð ñ ð ð çŠ6ðáŒ6ˆ6ðð ð ð õ ä ðð ð ð ð ¨C°2¸ð ñ ô õ äð -0ñ ô ð õ äñô ð ð õ ìð 46ñ ô ð õ äð 46ñ ô ð ð õ äð :=ñ ô ð ð ñ ð ð ð ð ð ñ ð ð çŠ6ðáŒ6ˆ6õäðð ñ ô ð ñ ð õ ä ð g˜YÐfÐf°ÐfÐfÐSUÐfÐfÐfÐ]_ÐfÐfÐfÐfñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð �r˜B’wð ð ð ð ð  2¨¢7ð ð ð ð ñ õ ä ðð ð ð �r˜Bð ñ ô ð õ äñô ð ð õ ìð ñ ô ð õ äð ñ ô ð ð ð õ äñô ð ð õ ìð ñ ô ð õ äð ñ ô ð ð ð ð ñ ð ð ð ð ð ñ ð ð çŠ6ðáŒ6ˆ6ðð õ ä ðð ð ð  2¨ð ñ ô ð õ äñô ð ð õ ìð $&ñ ô ð õ äð $&ñ ô ð ð ð õ äñô ð ð õ ìð )+ñ ô ð õ äð )+ñ ô ð ð ð ð ñ ð ð ð ð ð ñ ð ð çŠ6ðáŒ6ˆ6õäðð ñ ô ð ñ ð õ ä ð c˜YÐbÐb°ÐbÐbÐXYÐbÐbÐ_`ÐbÐbñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ñ ñ#ð	ð 	r-   c                ó  —  |j         dd¦  «        } |j         dd¦  «        } |j         di ¦  «        }|                     ¦   «         D �]Ã\  }}|                      dg ¦  «        D �]¥}|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        |	¦  «        t          j        |
¦  «        d
t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
dœz  }t          j        d|› d|› d|                      d¦  «        › �¦  «        dz   d|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}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        |	¦  «        t          j        |
¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }t          j        d|› d|› d|                      d¦  «        › �¦  «        dz   d|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}	x}
}�Œ§�ŒÅdS )z–
        Corner Case 4: Frame Width and Height Uniformity across Clips.
        Ensures frame rects match declared manifest frame dimensions.
        Ú
frameWidthé€   ÚframeHeightr#   rö   r¨   r2   )zI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py8)sr  Údeclared_fw)r8   rd   re   r;   r>   zFrame width mismatch in clip 'z': expected z, got ú
>assert %(py10)sri   Nr¬   Údeclared_fhzFrame height mismatch in clip ')r?   r  rD   rE   rF   rG   rH   rI   rJ   rK   rL   )rM   r   r  r  r#   r  r  r  rv   rw   rQ   rŒ   rT   r{   s                 r*   Ú1test_t2_frame_dimensions_match_atlas_grid_metricszQTestTier2BoundaryAndCornerCases.test_t2_frame_dimensions_match_atlas_grid_metrics  sé  € ð
 *�oÔ)¨,¸Ñ<Ô<ˆØ)�oÔ)¨-¸Ñ=Ô=ˆà#�Ô# G¨RÑ0Ô0ˆØ$)§K¢K¡M¤Mð 	ñ 	Ñ ˆI�yØ"Ÿš x°Ñ4Ô4ð ñ �Ø”yð  ð �y�y ‘~”~ð �~¨Ò4ð ð ñ õ ä ðð ð ð �~¨ð ñ ô ð õ äñô ð ð õ ìð ñ ô ð õ äð ñ ô ð ð õ äð !ñ ô õ äð "%ñ ô õ äð &ñ ô ð õ äñô ð ð õ ìð *5ñ ô ð õ äð *5ñ ô ð ð ð ð ñ ð õ ä ð p°YÐoÐoÈKÐoÐoÐ_d×_hÒ_hÐilÑ_mÔ_mÐoÐoñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ”yð  ð �y�y ‘~”~ð �~¨Ò4ð ð ñ õ ä ðð ð ð �~¨ð ñ ô ð õ äñô ð ð õ ìð ñ ô ð õ äð ñ ô ð ð õ äð !ñ ô õ äð "%ñ ô õ äð &ñ ô ð õ äñô ð ð õ ìð *5ñ ô ð õ äð *5ñ ô ð ð ð ð ñ ð õ ä ð q°iÐpÐpÈ[ÐpÐpÐ`e×`iÒ`iÐjmÑ`nÔ`nÐpÐpñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ñ ñ	ð	ð 	r-   c           
     ó¸
  —  |j         dddg¦  «        }g }|d         }d}||z
  }t          |¦  «        }d}||k     }	|	}
|	r(|d         }d}||z
  }t          |¦  «        }d}||k     }|}
|
�söt          j        d|	fd||f¦  «        d	t	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd	t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }|                     |¦  «         |	rÎt          j        d|fd||f¦  «        d	t	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd	t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j	        |d¦  «        i z  }t          j
        d|› �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}x}x}x}x}x}	x}x}x}x}x}x}} |j         di ¦  «        }|                     ¦   «         D �]¶\  }}t          |                      dg ¦  «        ¦  «        D �]‹\  }}|                      d|¦  «        }g }|d         }d}||z
  }t          |¦  «        }d}||k     }	|	}
|	r(|d         }d}||z
  }t          |¦  «        }d}||k     }|}
|
�süt          j        d|	fd||f¦  «        d	t	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd	t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }|                     |¦  «         |	rÎt          j        d|fd||f¦  «        d	t	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd	t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j	        |d¦  «        i z  }t          j
        d|› d|› d|› �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}x}x}x}x}x}	x}x}x}x}x}x}}�Œ��Œ¸dS )u©   
        Corner Case 5: Bottom-Center Anchor Pivot Precision [0.5, 0.90].
        Ensures ARPG isometric grounding anchor is [0.5, 0.90] with Â±0.001 precision.
        ÚdefaultPivotg      à?gÍÌÌÌÌÌì?r   gü©ñÒMbP?r¢   )ú<)z<%(py9)s
{%(py9)s = %(py2)s((%(py4)s - %(py6)s))
} < %(py12)sÚabs)rd   re   r;   r†   rk   r®   r¯   )zA%(py23)s
{%(py23)s = %(py16)s((%(py18)s - %(py20)s))
} < %(py26)s)rþ   rÿ   r   r  Úpy26z%(py28)sÚpy28z<Invalid defaultPivot in manifest: expected [0.5, 0.90], got z
>assert %(py31)sÚpy31Nr#   rö   ÚpivotzInvalid pivot in clip 'r  z: expected [0.5, 0.90], got )r?   r#  rD   rE   rF   rG   rH   rI   rC   ru   rJ   rK   rL   r  r  )rM   r   Údefault_pivotrv   rw   rQ   rŒ   r‹   r¾   r¿   rx   r  Ú@py_assert19Ú@py_assert21Ú@py_assert22Ú@py_assert25Ú@py_assert24r|   rÁ   Ú@py_format27Ú@py_format29Ú@py_format30Ú@py_format32r#   r  r  r  r  r'  s                                r*   Ú0test_t2_bottom_center_pivot_coordinate_precisionzPTestTier2BoundaryAndCornerCases.test_t2_bottom_center_pivot_coordinate_precision%  sF	  € ð
 ,˜Ô+¨N¸SÀ$¸KÑHÔHˆð	
ð 	
�= Ô#ð 	
 cð 	
Ð# cÑ)ð 	
�sÐ)Ñ*Ô*ð 	
¨Uð 	
Ð*¨UÒ2ð 	
ð 	
ð 	
ð 	
ð 	
¸=ÈÔ;Kð 	
Èdð 	
Ð;KÈdÑ;Rð 	
µsÐ;RÑ7SÔ7Sð 	
ÐV[ð 	
Ð7SÐV[Ò7[ð 	
ð 	
ð 	
ð 	
ñ 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð*¨Uð 	
ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìõ ñ 	
ô 	
ð 	
õ 	
ä 	õ ñ 	
ô 	
ð 	
ð 	
õ 	
ä 	ð $ñ 	
ô 	
õ 	
ä 	ð '*ñ 	
ô 	
õ 	
ä 	ð +ñ 	
ô 	
õ 	
ä 	ð .3ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ç	‚6ð	
á	„6€6ð	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð7SÐV[ð 	
ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìõ 8;ñ 	
ô 	
ð 	
õ 	
ä 	õ 8;ñ 	
ô 	
ð 	
ð 	
õ 	
ä 	ð <Lñ 	
ô 	
õ 	
ä 	ð OSñ 	
ô 	
õ 	
ä 	ð 8Tñ 	
ô 	
õ 	
ä 	ð W\ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ð 	
ð 	
ç	‚6ð	
á	„6€6õ	
ìð	
ð 	
ñ 	
ô 	
ð 	
ñ 	
ð 	
õ 	
ìð [È=ÐZÐZñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð $�Ô# G¨RÑ0Ô0ˆØ$)§K¢K¡M¤Mð 	ñ 	Ñ ˆI�yÝ'¨	¯ª°hÀÑ(CÔ(CÑDÔDð ñ ‘
��UØŸ	š	 '¨=Ñ9Ô9�ðð ˜5 œ8ð  cð ˜8 c™>ð •s˜>Ñ*Ô*ð ¨Uð Ð*¨UÒ2ð ð ð ð ð ¸5À¼8ð Àdð ¸8Àd¹?ð µs¸?Ñ7KÔ7Kð Èeð Ð7KÈeÒ7Sð ð ð ð ñ õ ä ðð ð ð Ð*¨Uð ñ ô ð õ äñô ð ð õ ìõ ñ ô ð õ äõ ñ ô ð ð õ äð $ñ ô õ äð '*ñ ô õ äð +ñ ô õ äð .3ñ ô ð ð ñ ð ð ð ð ð ñ ð ð çŠ6ðáŒ6ˆ6ðð õ ä ðð ð ð Ð7KÈeð ñ ô ð õ äñô ð ð õ ìõ 8;ñ ô ð õ äõ 8;ñ ô ð ð õ äð <Dñ ô õ äð GKñ ô õ äð 8Lñ ô õ äð OTñ ô ð ð ñ ð ð ð ð ð ñ ð ð çŠ6ðáŒ6ˆ6õäðð ñ ô ð ñ ð õ ä ð j¨iÐiÐiÀÐiÐiÐbgÐiÐiñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ñ ñð	ð 	r-   N)r   r[   r    r!   ©r   r[   r    r!   rÑ   )	rÓ   rÔ   rÕ   rÖ   rì   rò   r  r  r2  r×   r-   r*   rÙ   rÙ   Ç   sƒ   € € € € € ðð ð
ð 
ð 
ð 
ð,
ð 
ð 
ð 
ðð ð ð ð@ð ð ð ð$ð ð ð ð ð r-   rÙ   c                  óh   — e Zd ZdZej                             dg d¢¦  «        dd„¦   «         Zdd„ZdS )Ú!TestTier3CrossFeatureCombinationsz³
    Tier 3: Cross-Feature State Interleaving.
    Verifies Active Skill + Support Sigil animation sequence compatibility
    and normal map vector unit length normalization.
    zskill_id,sigil_id))ié  iÑ  )iê  iÕ  )iï  iÔ  )iñ  iÒ  )ië  iÖ  r   r   Úskill_idrµ   Úsigil_idr    r!   c                óì  ‡‡—  |j         di ¦  «        }d}d}t          ˆfd„t          D ¦   «         d¦  «        }t          ˆfd„t          D ¦   «         d¦  «        }g }	d}
||
u}|}|rd}||u}|}|�sXt	          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  }|	 
                    |¦  «         |r‹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	          j        |	d¦  «        i z  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}	x}x}
x}}|                     ¦   «         D ]-\  }}t          ||¦  «        r|€|}t          ||¦  «        r|€|}Œ.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  }t	          j        d‰› d�¦  «        dz   d|iz  }t          t	          j        |¦  «        ¦  «        ‚d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  }t	          j        d‰› d�¦  «        dz   d|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}	}t#          |                      dg ¦  «        ¦  «        }t#          |                      dg ¦  «        ¦  «        }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}	}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}	}|                      d$d%¦  «        }|                      d$d%¦  «        }||z
  }t%          |¦  «        }
d&}|
|k    }|�sLt	          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*d+t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd+t	          j	        |
¦  «        t	          j	        |¦  «        d,œz  }t	          j        d-|› d.|› d/�¦  «        d0z   d1|iz  } t          t	          j        | ¦  «        ¦  «        ‚dx}x}
x}}dS )2a  
        Pairwise Check 1: Active Skill + Support Sigil Augmentation Compatibility.
        When a martial skill is linked to a support sigil, their animation frame sequences,
        playback fps, and frame dimensions must be compatible for simultaneous playback.
        r#   Nc              3  ó4   •K  — | ]}|d          ‰k    ¯|V — ŒdS ©r.   Nr×   )r'   Úsr6  s     €r*   r+   zrTestTier3CrossFeatureCombinations.test_t3_active_skill_and_support_sigil_sequence_compatibility.<locals>.<genexpr>Z  s1   øè è € ÐTÐT ÀÀ$ÄÈ8Ò@SÐ@S˜!Ð@SÐ@SÐ@SÐ@SÐTÐTr-   c              3  ó4   •K  — | ]}|d          ‰k    ¯|V — ŒdS r:  r×   )r'   r;  r7  s     €r*   r+   zrTestTier3CrossFeatureCombinations.test_t3_active_skill_and_support_sigil_sequence_compatibility.<locals>.<genexpr>[  s1   øè è € ÐUÐU ÀÀ4ÄÈHÒATÐAT˜!ÐATÐATÐATÐATÐUÐUr-   ©úis not)z%(py2)s is not %(py5)sÚ	skill_defr©   rª   r«   )z%(py9)s is not %(py12)sÚ	sigil_defr­   r®   r¯   r   zassert %(py17)sr°   ©z%(py0)s is not %(py3)sÚ
skill_clipr–   zSkill z clip missing from manifestr—   r˜   Ú
sigil_clipzSupport Sigil rö   rž   r’   r”   Úskill_framesz has insufficient frames: Úsigil_frameszSigil Úfpsr‘   r¡   )rú   )z<%(py5)s
{%(py5)s = %(py0)s((%(py1)s - %(py2)s))
} <= %(py8)sr#  Ú	skill_fpsÚ	sigil_fps)r8   r9   rd   r˜   r>   zFPS mismatch between Skill (z) and Sigil (r1   r  ri   )r?   Únextr   r   rD   rE   rF   rG   rH   rI   rC   ru   rK   rL   r  r   rJ   r5   r#  )!rM   r   r6  r7  r#   rB  rC  r?  r@  rv   rR   rw   rx   r¾   r¿   r¸   rÀ   r|   rÁ   r~   rÂ   Úc_nameÚc_datarP   r·   rD  rE  rG  rH  rŒ   Ú@py_assert6rT   r{   s!     ``                             r*   Ú=test_t3_active_skill_and_support_sigil_sequence_compatibilityz_TestTier3CrossFeatureCombinations.test_t3_active_skill_and_support_sigil_sequence_compatibilityD  s  øø€ ð$ $�Ô# G¨RÑ0Ô0ˆØˆ
Øˆ
åÐTÐTÐTÐTÕ%<ÐTÑTÔTÐVZÑ[Ô[ˆ	ÝÐUÐUÐUÐUÕ%=ÐUÑUÔUÐW[Ñ\Ô\ˆ	à>Ð> Ð>ˆy Ð$Ð>Ð>Ð>Ð>Ð>¸$Ð>¨¸$Ð)>Ð>Ð>Ð>Ð>Ñ>Õ>Ô>Ð>Ð>Ð>Ð>ˆy Ð>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>ˆyÑ>Ô>Ð>Õ>Ô>ˆyÑ>Ô>Ð>Ð>Õ>Ô> Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Ð>×>Ò>Ð>Ñ>Ô>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>¨¸$Ð>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>¨Ñ>Ô>Ð>Õ>Ô>¨Ñ>Ô>Ð>Ð>Õ>Ô>¸$Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Ð>×>Ò>Ð>Ñ>Ô>Ð>Õ>Ô>Ð>Ð>Ñ>Ô>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>à#Ÿkšk™mœmð 	$ð 	$‰NˆF�FÝ$ V¨YÑ7Ô7ð $¸JÐ<NØ#�
Ý$ V¨YÑ7Ô7ð $¸JÐ<NØ#�
øà!%ÐUˆz Ð%ÐUÐUÐUÕUÔUÐUÐUÐUÐUˆz ÐUÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔUˆzÑUÔUÐUÕUÔUˆzÑUÔUÐUÐUÕUÔU ÑUÔUÐUÐUÑUÐUÕUÔUÐ'U°Ð'UÐ'UÐ'UÑUÔUÐUÑUÐUÐUÐUÑUÐUÕUÕUÔUÐUÑUÔUÑUÔUÐUÐUÐUÐUÐUØ!%Ð]ˆz Ð%Ð]Ð]Ð]Õ]Ô]Ð]Ð]Ð]Ð]ˆz Ð]Ñ]Ô]Ð]Õ]Ô]Ñ]Ô]Ð]Ð]Õ]Ô]ˆzÑ]Ô]Ð]Õ]Ô]ˆzÑ]Ô]Ð]Ð]Õ]Ô] Ñ]Ô]Ð]Ð]Ñ]Ð]Õ]Ô]Ð']¸Ð']Ð']Ð']Ñ]Ô]Ð]Ñ]Ð]Ð]Ð]Ñ]Ð]Õ]Õ]Ô]Ð]Ñ]Ô]Ñ]Ô]Ð]Ð]Ð]Ð]Ð]å˜:Ÿ>š>¨(°BÑ7Ô7Ñ8Ô8ˆÝ˜:Ÿ>š>¨(°BÑ7Ô7Ñ8Ô8ˆà Ð]ˆ|˜qÒ Ð]Ð]Ð]Õ]Ô]Ð]Ð]Ð]Ð]ˆ|˜qÐ]Ñ]Ô]Ð]Õ]Ô]Ñ]Ô]Ð]Ð]Õ]Ô]ˆ|Ñ]Ô]Ð]Õ]Ô]ˆ|Ñ]Ô]Ð]Ð]Õ]Ô]˜qÑ]Ô]Ð]Ð]Ñ]Ð]Õ]Ô]Ð"]¨8Ð"]Ð"]È|Ð"]Ð"]Ñ]Ô]Ð]Ñ]Ð]Ð]Ð]Ñ]Ð]Õ]Õ]Ô]Ð]Ñ]Ô]Ñ]Ô]Ð]Ð]Ð]Ð]Ð]Ø Ð]ˆ|˜qÒ Ð]Ð]Ð]Õ]Ô]Ð]Ð]Ð]Ð]ˆ|˜qÐ]Ñ]Ô]Ð]Õ]Ô]Ñ]Ô]Ð]Ð]Õ]Ô]ˆ|Ñ]Ô]Ð]Õ]Ô]ˆ|Ñ]Ô]Ð]Ð]Õ]Ô]˜qÑ]Ô]Ð]Ð]Ñ]Ð]Õ]Ô]Ð"]¨8Ð"]Ð"]È|Ð"]Ð"]Ñ]Ô]Ð]Ñ]Ð]Ð]Ð]Ñ]Ð]Õ]Õ]Ô]Ð]Ñ]Ô]Ñ]Ô]Ð]Ð]Ð]Ð]Ð]à—N’N 5¨"Ñ-Ô-ˆ	Ø—N’N 5¨"Ñ-Ô-ˆ	Ø˜yÑ(Ðs�sÐ(Ñ)Ô)Ðs¨QÐsÐ)¨QÒ.ÐsÐsÑsÕsÔsÐsÐsÐsÐsÐ)¨QÐsÑsÔsÐsÕsÔsÑsÔsÐsÐsÕsÔs�sÑsÔsÐsÕsÔs�sÑsÔsÐsÐsÐsÕsÔsÑsÔsÐsÐsÕsÔs�9ÑsÔsÐsÕsÔs�9ÑsÔsÐsÐsÐsÕsÔsÑsÔsÐsÐsÕsÔs˜yÑsÔsÐsÕsÔs˜yÑsÔsÐsÐsÕsÔsÐ)ÑsÔsÕsÔs¨QÑsÔsÐsÐsÑsÐsÕsÔsÐ0sÈyÐ0sÐ0sÐgpÐ0sÐ0sÐ0sÑsÔsÐsÑsÐsÐsÐsÑsÐsÕsÕsÔsÐsÑsÔsÑsÔsÐsÐsÐsÐsÐsÐsÐsÐsÐsÐsÐsr-   r   r[   c                óö  — t          j         |j        d¦  «        ¦  «        }|dd…dd…df         }|dk    }t          j        |¦  «        st	          j        d¦  «         |dd…dd…dd…f         |                              t           j        ¦  «        }|dd…df         dz  dz  d	z
  }|dd…d
f         dz  dz  d	z
  }|dd…df         dz  dz  d	z
  }t          j        ||z  ||z  z   ||z  z   ¦  «        }	t          t          j
        |	¦  «        ¦  «        }
d}||
k    }d}|
|k    }|r|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  }t          j        d|
d›d�¦  «        dz   d|iz  }t%          t          j        |¦  «        ¦  «        ‚dx}x}x}}dS )u  
        Pairwise Check 2: Tangent Vector Unit Length Invariant (|N| = 1.0).
        For all non-transparent texels, the unpacked normal vector must have unit length:
        |N| = sqrt(Nx^2 + Ny^2 + Nz^2) â‰ˆ 1.0 within 8-bit quantization tolerance (Â±0.08).
        rÛ   NrÊ   é   z4No opaque pixels in normal map to test vector lengthr   g     ào@g       @rø   r¢   rÜ   gq=
×£pí?gHáz®Gñ?rù   )z%(py1)s <= %(py4)sz%(py4)s <= %(py6)sÚmean_length)r9   re   r;   zNormal vector mean length is z.3fuS   , expected 1.0 Â± 0.08. Vectors are unnormalized, which causes lighting distortion.r=   r>   )rß   rà   rá   rB   ÚpytestÚskipÚastypeÚfloat32Úsqrtr  rð   rD   rE   rI   rF   rG   rH   rJ   rK   rL   )rM   r   rä   rå   Úopaque_maskÚ
rgb_opaqueÚnxÚnyÚnzÚlengthsrP  rx   rP   rQ   rw   rS   rT   s                    r*   Ú;test_t3_normal_map_tangent_vector_unit_length_normalizationz]TestTier3CrossFeatureCombinations.test_t3_normal_map_tangent_vector_unit_length_normalizationr  sû  € õ ŒxÐ3Ð+Ô3°FÑ;Ô;Ñ<Ô<ˆØ�Q�Q�Q˜˜˜˜1�W”ˆØ˜b’jˆåŒv�kÑ"Ô"ð 	PÝŒKÐNÑOÔOÐOà˜!˜!˜!˜Q˜Q˜Q   ˜(”^ KÔ0×7Ò7½¼
ÑCÔCˆ
ð ˜˜˜˜A˜Ô Ñ&¨#Ñ-°Ñ3ˆØ˜˜˜˜A˜Ô Ñ&¨#Ñ-°Ñ3ˆØ˜˜˜˜A˜Ô Ñ&¨#Ñ-°Ñ3ˆå”'˜"˜r™' B¨¡GÑ+¨b°2©gÑ5Ñ6Ô6ˆÝ�BœG GÑ,Ô,Ñ-Ô-ˆàð 	
ˆt�{Ò*ð 	
 dð 	
�{ dÒ*ð 	
ð 	
ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
ð 	
ˆt�{ dð 	
ñ 	
ô 	
õ 	
ô 
ð ñ 	
ô 	
ð 	
õ 	
ô 
ñ	
ô 	
ð 	
ð 	
õ 	
ìð #ñ 	
ô 	
ð 	
õ 	
ô 
ð #ñ 	
ô 	
ð 	
ð 	
õ 	
ô 
ð '+ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìðJ¨KÐUð Jð Jð Jñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
r-   N)r   r   r6  rµ   r7  rµ   r    r!   r3  )	rÓ   rÔ   rÕ   rÖ   rQ  ÚmarkÚparametrizerM  r\  r×   r-   r*   r5  r5  =  s~   € € € € € ðð ð „[×ÒØð	
ð 	
ð 	
ñ	ô 	ð"tð "tð "tñ	ô 	ð"tðH
ð 
ð 
ð 
ð 
ð 
r-   r5  c                  ó"   — e Zd ZdZd	d„Zd
d„ZdS )Ú#TestTier4RealWorldWorkloadScenariosz²
    Tier 4: Real-World Workload Scenarios.
    Simulates high-intensity combat rotation Q/W/E/Space at 120 FPS,
    and runs the Cocos Creator TypeScript compilation check.
    r   r   r    r!   c           
     ó  —  |j         di ¦  «        }dt          d         fdt          d         fdt          d         fdt          fg}d}|D �]‚\  }}d	}|                     ¦   «         D ]\  }}	t	          ||¦  «        r|	} nŒ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  }t          j        d|› d|d         › d|d         › d�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}}
|                      dg ¦  «        }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|› d�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}
x}}|                      d d!¦  «        }t          |¦  «        t          |¦  «        z  d"z  }||z  }�Œ„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)�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}}
d	S )*z¹
        Workload Scenario 1: Full Combat Rotation Simulation (Q / W / E / Space).
        Simulates player executing rotation skills and verifies duration and frame integrity.
        r#   ÚQr   ÚWr¡   ÚEé   ÚSpaceNr=  rA  Úmatched_clipr–   zCombat rotation hotkey [z	] skill 'r0   z' (ID r.   z) missing from manifest!r—   r˜   rö   rž   r’   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr5   r7   z
Clip for [z] has fewer than 4 framesr=   r>   rF  r‘   g     @�@g      ‰@r„   rÝ   Útotal_simulated_duration_msz"Full rotation duration too short: z.1fÚms)r?   r   r   r  r   rD   rE   rF   rG   rH   rI   rJ   rK   rL   r5   r  )rM   r   r#   Úrotation_skillsrh  r0   Údefnrg  rJ  rK  rP   rv   r·   r¸   rö   rQ   rR   rS   rT   rF  Úduration_mss                        r*   Ú/test_t4_full_combat_loadout_sequence_simulationzSTestTier4RealWorldWorkloadScenarios.test_t4_full_combat_loadout_sequence_simulation�  s  € ð
 $�Ô# G¨RÑ0Ô0ˆàÕ)¨!Ô,Ð-ØÕ)¨!Ô,Ð-ØÕ)¨!Ô,Ð-ØÕ.Ð/ð	
ˆð '(Ð#à(ð 	7ñ 	7‰IˆC�ØˆLØ"'§+¢+¡-¤-ð ð ‘�˜Ý(¨°Ñ6Ô6ð Ø#)�LØ�Eðð (,ð �< tÐ+ð ð ð õ ìðð ð ð �< tð ñ ô ð õ äñô ð ð õ ìð  ñ ô ð õ äð  ñ ô ð ð õ äð (,ñ ô ð ð ñ ð õ ìð q¨3ÐpÐp¸¸e¼ÐpÐpÈDÐQUÌJÐpÐpÐpñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð "×%Ò% h°Ñ3Ô3ˆFÝ�v‘;”;ÐP !ÐP�; !Ò#ÐPÐPÑPÕPÔPÐPÐPÐPÐP�; !ÐPÑPÔPÐPÕPÔPÑPÔPÐPÐPÕPÔP•3ÑPÔPÐPÕPÔP•3ÑPÔPÐPÐPÐPÕPÔPÑPÔPÐPÐPÕPÔP�vÑPÔPÐPÕPÔP�vÑPÔPÐPÐPÕPÔP�;ÑPÔPÕPÔP !ÑPÔPÐPÐPÑPÐPÕPÔPÐ%P°#Ð%PÐ%PÐ%PÑPÔPÐPÑPÐPÐPÐPÑPÐPÕPÕPÔPÐPÑPÔPÑPÔPÐPÐPÐPÐPÐPÐPÐPà×"Ò" 5¨"Ñ-Ô-ˆCÝ˜v™;œ;­¨s©¬Ñ3°vÑ=ˆKØ'¨;Ñ6Ð'Ñ'à-2ð 	
Ð*¨UÒ2ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð*¨Uð 	
ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð +ñ 	
ô 	
ð 	
õ 	
ä 	ð +ñ 	
ô 	
ð 	
ð 	
õ 	
ä 	ð .3ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð UÐ1LÐTÐTÐTÐTñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
r-   c                óÂ  — t           dz  dz  }|j        } |¦   «         }|s£t          j        d|› �¦  «        dz   dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}}t          j        g d¢t          |¦  «        d	d	d	d
¬¦  «        }|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  }t          j        d|j        › d|j        › d|j        › �¦  «        dz   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}dS )zÝ
        Workload Scenario 2: Cocos Creator TypeScript Compilation Gate.
        Executes `npm run build:web` (`tsc --noEmit`) in client/cocos/.
        Must terminate with exit code 0 and zero TypeScript errors.
        ÚclientÚcocosz$Cocos client directory not found at r‚   Ú	cocos_dirrƒ   N)ÚnpmÚrunz	build:webTé   )ÚcwdÚshellÚcapture_outputÚtextÚtimeoutr   r2   )z2%(py2)s
{%(py2)s = %(py0)s.returncode
} == %(py5)sÚresult)r8   rd   r˜   z/Cocos TypeScript compilation failed (exit code z)!
STDOUT:
z	
STDERR:
z
>assert %(py7)sr«   )r   rˆ   rD   rJ   rF   rG   rH   rI   rK   rL   Ú
subprocessrs  ÚstrÚ
returncoderE   ÚstdoutÚstderr)	rM   rq  rv   rw   rz   rz  rR   r¸   rÀ   s	            r*   Ú,test_t4_cocos_creator_typescript_compilationzPTestTier4RealWorldWorkloadScenarios.test_t4_cocos_creator_typescript_compilationÁ  sÆ  € õ  Ñ(¨7Ñ2ˆ	ØÔÐUÐÐÑ!Ô!ÐUÐ!ÐUÕUÔUÐ#UÈ)Ð#UÐ#UÑUÔUÐUÑUÐUÕUÔUÑUÔUÐUÐUÕUÔUˆyÑUÔUÐUÕUÔUˆyÑUÔUÐUÐUÕUÔUÐÑUÔUÕUÔUÐ!ÑUÔUÐUÐUÑUÐUÕUÕUÔUÐUÑUÔUÑUÔUÐUÐUÐUÐUÐUå”Ø'Ð'Ð'Ý�I‘”ØØØØð
ñ 
ô 
ˆð Ô ð 	
 Að 	
Ð  AÒ%ð 	
ð 	
ð 	
õ 	
ìð		
ð 	
ð 	
ð 	
Ð  Að 	
ñ 	
ô 	
ð 	
õ 	
ô 
ñ		
ô 	
ð 	
ð 	
õ 	
ìð	 ñ 	
ô 	
ð 	
õ 	
ô 
ð	 ñ 	
ô 	
ð 	
ð 	
õ 	
ô 
ð	 !ñ 	
ô 	
õ 	
ô 
ð	 %&ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð(¸fÔ>Oð (ð (Øœð(ð (àœð(ð (ñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð		
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
r-   NrÑ   rÒ   )rÓ   rÔ   rÕ   rÖ   rm  r€  r×   r-   r*   r`  r`  –  sG   € € € € € ðð ð"
ð "
ð "
ð "
ðH
ð 
ð 
ð 
ð 
ð 
r-   r`  )/rÖ   Ú
__future__r   ÚbuiltinsrF   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterD   ÚjsonÚpathlibr   r{  Útypingr   r   r   r   Únumpyrß   ÚPILr	   r
   rQ  Ú tests.e2e_cocos.vfx_test_helpersr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rÙ   r5  r`  r×   r-   r*   ú<module>rŒ     sT  ððð ð  #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )à Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  Ø €€€ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð6HVð HVð HVð HVð HVñ HVô HVð HVð`nð nð nð nð nñ nô nð nðlQ
ð Q
ð Q
ð Q
ð Q
ñ Q
ô Q
ð Q
ðrA
ð A
ð A
ð A
ð A
ñ A
ô A
ð A
ð A
ð A
r-   