§
    mV¿jõL  ã                  ób  — d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlmZ ddlZddlZddlZddlZddlZddlmZmZmZmZ ddlmZmZmZ ddlZ ee¦  «                             ¦   «         j        j        j        Z e e¦  «        ej!        vr$ej!         "                    d e e¦  «        ¦  «         ddl#m$Z$m%Z% ddl&m'Z'm(Z( dd	l)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 dd
l1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7 ej8        dd„¦   «         Z9 G d„ d¦  «        Z: G d„ d¦  «        Z; G d„ d¦  «        Z< G d„ d¦  «        Z=dS )a
  
FreeExile Asset Campaign & Graphics Optimization Pipeline E2E Test Suite (2026).
Covers Acceptance Criteria AC1 - AC6 enforcing 4-Tier Test Architecture:
- Tier 1: Functional Feature Coverage (DRQs, LOD, WebP, Culling, Mipmaps, Manifests)
- Tier 2: Boundary & Corner Cases (Missing files, Non-PoT, Extreme Viewports, Zero Lists)
- Tier 3: Cross-Feature State Interleaving (Pipeline Chains, Instancing Draw Calls, AoI Delta)
- Tier 4: Real-World Scenarios (Asset Audits, Tangent Normals, File Size Budgets, Metal Shaders)
é    )ÚannotationsN)ÚPath)ÚAnyÚDictÚListÚTuple)ÚImageÚ	ImageDrawÚ	ImageStat)Úgenerate_sprite_lodsÚevaluate_lod_generation)Úcompress_to_webpÚbatch_compress_directory)ÚAABBÚ	Frustum2DÚEntityBoundsÚproject_isoÚ
intersectsÚcull_entitiesÚbenchmark_culling)Úgenerate_mipmap_chainÚsave_mipmap_chain)ÚDesignPipelineManager)Úis_power_of_twoÚtmp_pathr   Úreturnc           	     ó   — | dz  }t           dz  dz  dz  dz  dz  }|                     ¦   «         rt          j        ||¦  «         nˆt	          j        ddd	¦  «        }t          j        |¦  «        }t          d
¦  «        D ]6}| 	                    |dz  |dz  d|d
z  z
  d|d
z  z
  g|dz  dddf¬¦  «         Œ7| 
                    |dd¬¦  «         |S )zOPrepares a canonical 512x512 sprite texture for deterministic pipeline testing.zhero_test_sprite.pngÚclientÚwebappÚassetsÚmonsterszmob_skeleton_warrior.pngÚRGBA©é   r$   )r   r   r   r   é   é    r$   é   éd   éÈ   éÿ   )ÚfillÚPNGT)ÚformatÚoptimize)Ú	REPO_ROOTÚexistsÚshutilÚcopy2r	   Únewr
   ÚDrawÚrangeÚ	rectangleÚsave)r   Útarget_pathÚ
sample_srcÚimgÚdrawÚis         úGC:\Projects\FreeExile\tests\e2e\test_asset_campaign_and_pipeline_e2e.pyÚsynthetic_rgba_texturer>   -   sù   € ð Ð3Ñ3€KÝ˜XÑ%¨Ñ0°8Ñ;¸jÑHÐKeÑe€JØ×ÒÑÔð ;ÝŒ�Z Ñ-Ô-Ð-Ð-åŒi˜ 
¨LÑ9Ô9ˆÝŒ~˜cÑ"Ô"ˆÝ�r‘”ð 	gð 	gˆAØ�NŠN˜A ™F A¨¡F¨C°!°b±&©L¸#ÀÀBÁ¹,ÐGÈqÐSUÉvÐWZÐ\_ÐadÐNeˆNÑfÔfÐfÐfØ�Š� U°TˆÑ:Ô:Ð:ØÐó    c                  ój   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
dd„Zdd„Zdd„Zdd„ZdS )ÚTestTier1FeatureCoveragez>Tier 1: Functional Feature Coverage (AC1, AC2, AC3, AC4, AC6).r   ÚNonec                ó>  — t           dz  dz  dz  }t           dz  dz  dz  }t          |                     d¦  «        ¦  «        t          |                     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	d
t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd
t	          j	        |¦  «        t	          j	        |¦  «        dœz  }t	          j
        dt          |¦  «        › �¦  «        dz   d|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}dS )zLAC1: Verifies inbox/approved contains >= 20 DRQs with canonical file naming.ÚdocsÚdesign_requestsÚinboxÚapprovedúDRQ-20261001-*.mdé   ©ú>=©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sÚlenÚ	drq_files©Úpy0Úpy1Úpy3Úpy6z Expected >= 20 DRQ files, found ú
>assert %(py8)sÚpy8N)r/   ÚlistÚglobrM   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚ_format_assertmsgÚAssertionErrorÚ_format_explanation)	ÚselfÚ	inbox_dirÚapproved_dirrN   Ú@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9s	            r=   Ú"test_t1_drq_inbox_total_and_namingz;TestTier1FeatureCoverage.test_t1_drq_inbox_total_and_naming@   s£  € å Ñ&Ð):Ñ:¸WÑDˆ	Ý  6Ñ)Ð,=Ñ=À
ÑJˆÝ˜ŸšÐ(;Ñ<Ô<Ñ=Ô=ÅÀ\×EVÒEVÐWjÑEkÔEkÑ@lÔ@lÑlˆ	Ý�9‰~Œ~ÐX ÐXˆ~ Ò#ÐXÐXÑXÕXÔXÐXÐXÐXÐXˆ~ ÐXÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔX�sÑXÔXÐXÕXÔX�sÑXÔXÐXÐXÐXÕXÔXÑXÔXÐXÐXÕXÔX�9ÑXÔXÐXÕXÔX�9ÑXÔXÐXÐXÕXÔXˆ~ÑXÔXÕXÔX ÑXÔXÐXÐXÑXÐXÕXÔXÐ%XÍÈIÉÌÐ%XÐ%XÑXÔXÐXÑXÐXÐXÐXÑXÐXÕXÕXÔXÐXÑXÔXÑXÔXÐXÐXÐXÐXÐXÐXÐXÐXÐXr?   c                óæ  — t           dz  dz  dz  }t           dz  dz  dz  }t          |                     d¦  «        ¦  «        t          |                     d¦  «        ¦  «        z   }dddddddœ}|D ]$}|D ]}d|› d�|j        v r||xx         d	z  cc<   Œ Œ%|                     ¦   «         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 )zAAC1: Verifies all 6 departments have >= 3 DRQs in inbox/approved.rD   rE   rF   rG   rH   r   )ÚSYSÚNPCÚECOÚSECÚCLIÚSRVú-é   é   rJ   ©z%(py0)s >= %(py3)sÚcount©rP   rR   zDepartment prefix z has z DRQs (expected >= 3)ú
>assert %(py5)sÚpy5N)r/   rV   rW   ÚnameÚitemsrX   rY   rZ   r[   r\   r]   r^   r_   r`   )ra   rb   rc   rN   Údept_prefixesÚfÚpfxru   rd   Ú@py_assert1Ú@py_format4Ú@py_format6s               r=   Ú test_t1_drq_department_diversityz9TestTier1FeatureCoverage.test_t1_drq_department_diversityG   sï  € å Ñ&Ð):Ñ:¸WÑDˆ	Ý  6Ñ)Ð,=Ñ=À
ÑJˆÝ˜ŸšÐ(;Ñ<Ô<Ñ=Ô=ÅÀ\×EVÒEVÐWjÑEkÔEkÑ@lÔ@lÑlˆ	àØØØØØð
ð 
ˆð ð 	,ð 	,ˆAØ$ð ,ð ,�Ø�s�:�:�: ¤Ð'Ð'Ø! #Ð&Ð&Ô&¨!Ñ+Ð&Ð&Ñ&øð,ð (×-Ò-Ñ/Ô/ð 	[ð 	[‰JˆC�ØÐZ�5˜A’:ÐZÐZÐZÕZÔZÐZÐZÐZÐZ�5˜AÐZÑZÔZÐZÕZÔZÑZÔZÐZÐZÕZÔZ�5ÑZÔZÐZÕZÔZ�5ÑZÔZÐZÐZÕZÔZ˜AÑZÔZÐZÐZÑZÐZÕZÔZÐZ°CÐZÐZ¸eÐZÐZÐZÑZÔZÐZÑZÐZÐZÐZÑZÐZÕZÕZÔZÐZÑZÔZÑZÔZÐZÐZÐZÐZÐZÐZð	[ð 	[r?   c           
     óÀ  — t           dz  dz  dz  }t           dz  dz  dz  }t          |                     d¦  «        ¦  «        t          |                     d¦  «        ¦  «        z   }g d¢}|D �]p}|                     d¬¦  «        }|D �]S}t          j        } |||¦  «        }	|	�s1t          j        d	|› d
|j        › �¦  «        dz   dt          j
        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |	¦  «        dœz  }
t          t          j        |
¦  «        ¦  «        ‚dx}}	�ŒU�ŒrdS )z=AC1: Validates that all DRQs contain mandatory metadata keys.rD   rE   rF   rG   rH   )u&   \*\*MÃ£ YÃªu Cáº§u \(Request ID\)\*\*:u"   \*\*TÃªn YÃªu Cáº§u \(Title\)\*\*:u4   \*\*PhÃ²ng Ban Khá»Ÿi Táº¡o \(Requesting Dept\)\*\*:u5   \*\*PhÃ¢n Loáº¡i TÃ i NguyÃªn \(Asset Category\)\*\*:u+   \*\*Má»©c Ä�á»™ Æ¯u TiÃªn \(Priority\)\*\*:u1   \*\*Háº¡n Ä�á»‹nh Má»¥c TiÃªu \(Target SLA\)\*\*:úutf-8©ÚencodingzMissing key 'z' in zS
>assert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.search
}(%(py3)s, %(py4)s)
}ÚreÚpatÚcontent)rP   Úpy2rR   Úpy4rS   N)r/   rV   rW   Ú	read_textr†   ÚsearchrX   r^   ry   rZ   r[   r\   r]   r_   r`   )ra   rb   rc   rN   Úrequired_patternsÚdrq_pathrˆ   r‡   r~   re   rg   s              r=   Ú#test_t1_drq_mandatory_metadata_keysz<TestTier1FeatureCoverage.test_t1_drq_mandatory_metadata_keys[   s  € å Ñ&Ð):Ñ:¸WÑDˆ	Ý  6Ñ)Ð,=Ñ=À
ÑJˆÝ˜ŸšÐ(;Ñ<Ô<Ñ=Ô=ÅÀ\×EVÒEVÐWjÑEkÔEkÑ@lÔ@lÑlˆ	ð
ð 
ð 
Ðð "ð 	Zñ 	ZˆHØ×(Ò(°'Ð(Ñ:Ô:ˆGØ(ð Zñ Z�Ý”yÐY�y�y  gÑ.Ô.ÐYÐ.ÑYÕYÔYÐ0YÀÐ0YÐ0YÈ(Ì-Ð0YÐ0YÑYÔYÐYÑYÐYÕYÔYÑYÔYÐYÐYÕYÔY•rÑYÔYÐYÕYÔY•rÑ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 gÑYÔYÐYÕYÔY gÑ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ñZð	Zð 	Zr?   c           	     ó`  — t           dz  dz  dz  }t           dz  dz  dz  }t          |                     d¦  «        ¦  «        t          |                     d¦  «        ¦  «        z   }t          j        d¦  «        }|D �]0}|                     d¬¦  «        }|                     |¦  «        }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|j        › �¦  «        dz   d|
iz  }t          t          j        |¦  «        ¦  «        ‚d	x}	}t#          |                     d¦  «        ¦  «        t#          |                     d¦  «        ¦  «        }}g }	t'          |¦  «        }|}|rt'          |¦  «        }|}|�sÍd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        |¦  «        dœz  }|	                     |¦  «         |r´d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        |¦  «        dœz  }|	                     |¦  «         t          j        |	d¦  «        i z  }t          j        d|› d|› d|j        › �¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}	x}}�Œ2d	S ) zNAC5: Validates power-of-two resolutions specified in all DRQ metadata headers.rD   rE   rF   rG   rH   uG   \*\*(?:Dimensions|KÃ­ch ThÆ°á»›c \(Dimensions\))\*\*:\s*`?(\d+)x(\d+)`?rƒ   r„   N©úis not©z%(py0)s is not %(py3)sÚmrv   zMissing Dimensions metadata in rw   rx   rr   é   z%%(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}r   Úw)r‰   rR   rx   z'%(py10)s
{%(py10)s = %(py7)s(%(py8)s)
}Úh)Úpy7rU   Úpy10r   zNon-PoT resolution Úxz in z
>assert %(py13)sÚpy13)r/   rV   rW   r†   Úcompiler‹   rŒ   rX   rY   rZ   r[   r\   r]   r^   ry   r_   r`   ÚintÚgroupr   ÚappendÚ_format_boolop)ra   rb   rc   rN   Ú	dim_regexrŽ   rˆ   r”   rd   r~   r   r€   r–   r—   rf   Ú@py_assert0Ú@py_assert9Ú@py_format11Ú@py_format12Ú@py_format14s                       r=   Ú$test_t1_drq_resolutions_power_of_twoz=TestTier1FeatureCoverage.test_t1_drq_resolutions_power_of_twom   sã  € å Ñ&Ð):Ñ:¸WÑDˆ	Ý  6Ñ)Ð,=Ñ=À
ÑJˆÝ˜ŸšÐ(;Ñ<Ô<Ñ=Ô=ÅÀ\×EVÒEVÐWjÑEkÔEkÑ@lÔ@lÑlˆ	Ý”JÐiÑjÔjˆ	Ø!ð 	ñ 	ˆHØ×(Ò(°'Ð(Ñ:Ô:ˆGØ× Ò  Ñ)Ô)ˆAØ ÐS�1˜D�=ÐSÐSÐSÕSÔSÐSÐSÐSÐS�1˜DÐSÑSÔSÐSÕSÔSÑSÔSÐSÐSÕSÔS�1ÑSÔSÐSÕSÔS�1ÑSÔSÐSÐSÕSÔS˜DÑSÔSÐSÐSÑSÐSÕSÔSÐ"SÀHÄMÐ"SÐ"SÑSÔSÐSÑSÐSÐSÐSÑSÐSÕSÕSÔSÐSÑSÔSÑSÔSÐSÐSÐSÐSÐSÝ�q—w’w˜q‘z”z‘?”?¥C¨¯ª°©
¬
¡O¤OˆqˆAðð •? 1Ñ%Ô%ð Ð%ð Ð%ð ­/¸!Ñ*<Ô*<ð Ð*<ð ð ñ ð ð õ äñô ð ð õ ìõ #ñ ô ð õ äõ #ñ ô ð ð ð õ äñô ð ð õ ìð $%ñ ô ð õ äð $%ñ ô ð ð õ äð &ñ ô ð ð ñ ð ð ç‚vðá„v€vð &ð ð ð õ äñô ð ð õ ìõ +:ñ ô ð õ äõ +:ñ ô ð ð ð õ äñô ð ð õ ìð ;<ñ ô ð õ äð ;<ñ ô ð ð õ äð +=ñ ô ð ð ñ ð ð ç‚vðá„v€võìðð ñ ô ð ñ ð õ ìð A aÐ@Ð@¨!Ð@Ð@°´Ð@Ð@ñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ñ ð	ð 	r?   r>   r   r   c                ó
  — |dz  }t          ||¦  «        }g }d}||v }|}|rd}	|	|v }
|
}|
rd}||v }|}|�sæt          j        d|fd||f¦  «        t          j        |¦  «        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¦  «        t          j        |	¦  «        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¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}x}	x}
x}}t          j        |d         ¦  «        5 }|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd
|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}ddd¦  «         n# 1 swxY w Y   t          j        |d         ¦  «        5 }|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd
|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}ddd¦  «         n# 1 swxY w Y   t          j        |d         ¦  «        5 }|j        }d}||k    }|sªt          j        d|fd||f¦  «        d t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd t          j        |¦  «        t          j        |¦  «        dœz  }dd
|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}ddd¦  «         dS # 1 swxY w Y   dS )!zIAC2: Verifies lod_generator produces LOD0 (100%), LOD1 (50%), LOD2 (25%).Ú
lod_outputÚlod0Úlod1Úlod2©Úin©z%(py3)s in %(py5)sÚlods©rR   rx   ú%(py7)sr˜   ©z%(py10)s in %(py12)s©r™   Úpy12ú%(py14)sÚpy14)z%(py17)s in %(py19)s)Úpy17Úpy19z%(py21)sÚpy21r   zassert %(py24)sÚpy24Nr#   ©ú==©z,%(py2)s
{%(py2)s = %(py0)s.size
} == %(py5)sÚimg0©rP   r‰   rx   úassert %(py7)s)é   rÂ   Úimg1©é€   rÅ   Úimg2)r   rX   rY   r]   rZ   r[   r\   rŸ   r    r_   r`   r	   ÚopenÚsize)ra   r>   r   Úout_dirr°   r~   rd   rf   r¢   r£   Ú@py_assert11Ú@py_assert16Ú@py_assert18r€   Ú@py_format8Ú@py_format13Ú@py_format15Ú@py_format20Ú@py_format22Ú@py_format23Ú@py_format25r¿   Ú@py_assert3rÃ   rÆ   s                            r=   Ú!test_t1_lod_generator_three_tiersz:TestTier1FeatureCoverage.test_t1_lod_generator_three_tiers|   sš  € à˜\Ñ)ˆÝ#Ð$:¸GÑDÔDˆØCÐCˆvÐCˆv˜ˆ~ÐCÐCÐCÐCÐC &ÐC &¨D .ÐCÐCÐCÐCÐC°VÐC°V¸t°^ÐCÐCÐCÐCÑCÕCÔCÐCÐCÐCÐCˆv˜ÐCÑCÔCÕCÔCˆvÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC˜ÑCÔCÐCÕCÔC˜ÑCÔCÐCÐCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÐC×CÒCÐCÑCÔCÐCÐCÑCÕCÔCÐCÐCÐCÐC &¨DÐCÑCÔCÕCÔC &ÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC¨DÑCÔCÐCÕCÔC¨DÑCÔCÐCÐCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÐC×CÒCÐCÑCÔCÐCÐCÐCÕCÔCÐCÐCÐCÐC°V¸tÐCÑCÔCÕCÔC°VÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC¸tÑCÔCÐCÕCÔC¸tÑCÔCÐCÐCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÐC×CÒCÐCÑCÔCÐCÕCÔCÐCÐCÑCÔCÐCÑCÐCÐCÐCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÝŒZ˜˜VœÑ%Ô%ð 	+¨Ø”9Ð* 
Ð*�9 
Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*�9 
Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�4Ñ*Ô*Ð*Õ*Ô*�4Ñ*Ô*Ð*Ð*Õ*Ô*�9Ñ*Ô*Õ*Ô* 
Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+åŒZ˜˜VœÑ%Ô%ð 	+¨Ø”9Ð* 
Ð*�9 
Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*�9 
Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�4Ñ*Ô*Ð*Õ*Ô*�4Ñ*Ô*Ð*Ð*Õ*Ô*�9Ñ*Ô*Õ*Ô* 
Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+åŒZ˜˜VœÑ%Ô%ð 	+¨Ø”9Ð* 
Ð*�9 
Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*�9 
Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�4Ñ*Ô*Ð*Õ*Ô*�4Ñ*Ô*Ð*Ð*Õ*Ô*�9Ñ*Ô*Õ*Ô* 
Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð 	+ð 	+s9   ÉCLÌLÌLÌ:CPÐPÐPÐ-CS<Ó<T ÔT c                óì  — t          ||dz  ¦  «        }|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›d	�¦  «        d
z   d|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}dS )zJAC2: Guarantees LOD-2 file size is <= 40% of original source texture size.Úeval_lodgš™™™™™Ù?©ú<=)z7%(py2)s
{%(py2)s = %(py0)s.lod2_size_ratio
} <= %(py5)sÚeval_resrÀ   zLOD-2 ratio z.3fz exceeds 0.40 budgetz
>assert %(py7)sr˜   N)r   Úlod2_size_ratiorX   rY   rZ   r[   r\   r]   r^   r_   r`   )	ra   r>   r   rÚ   r~   rf   rÔ   r€   rÍ   s	            r=   Útest_t1_lod_file_size_reductionz8TestTier1FeatureCoverage.test_t1_lod_file_size_reductionˆ   s«  € å*Ð+AÀ8ÈjÑCXÑYÔYˆØÔ'ð 	
¨4ð 	
Ð'¨4Ò/ð 	
ð 	
ð 	
õ 	
ìð	
ð 	
ð 	
ð 	
Ð'¨4ð 	
ñ 	
ô 	
ð 	
õ 	
ä	ñ	
ô 	
ð 	
ð 	
õ 	
ìð ñ 	
ô 	
ð 	
õ 	
ä 	ð ñ 	
ô 	
ð 	
ð 	
õ 	
ä 	ð (ñ 	
ô 	
õ 	
ä 	ð ,0ñ 	
ô 	
ð 	
ð 	
ñ 	
ð 	
õ 	
ìð N˜8Ô3ÐMÐMÐMÐMñ	
ô 	
ð 	
ñ 	
ð 	
ð 	
ð 	
ñ 	
ð 	
õ 	
õ 	
ìð	
ñ 	
ô 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
r?   c                óÒ
  — |dz  }t          ||d¬¦  «        }g }|j        }|j        } |¦   «         }|}	|r|j        }
d}|
|k    }|}	|	�srddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }| 	                    |¦  «         |ržt          j
        d|fd	|
|f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        d
œz  }dd|iz  }| 	                    |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}x}x}x}x}
x}}g }|j        }d}||k    }|}	|r|j        }d}||k    }|}	|	�s~t          j
        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }| 	                    |¦  «         |ržt          j
        d|fd||f¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }| 	                    |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}x}x}x}x}x}}t!          j        |¦  «        5 }g }|j        }d}||k    }|}	|r|j        }d}||k    }|}	|	�s~t          j
        d |fd!||f¦  «        d"t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd"t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }| 	                    |¦  «         |ržt          j
        d |fd#||f¦  «        d"t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd"t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }| 	                    |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}x}x}x}x}x}}ddd¦  «         dS # 1 swxY w Y   dS )$zEAC2: Validates WebP compression ratio <= 50% and RGBA mode retention.zcompressed.webpéP   ©Úqualityç      à?z[%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.output_path
}.exists
}()
}Úres)r‰   rŠ   rS   rU   rØ   )z=%(py12)s
{%(py12)s = %(py10)s.compression_ratio
} <= %(py15)s)r™   rµ   Úpy15z%(py17)sr¸   r   zassert %(py20)sÚpy20Ng      I@©ú>)z2%(py4)s
{%(py4)s = %(py2)s.saved_bytes
} > %(py7)s)r‰   rŠ   r˜   z%(py9)sÚpy9rJ   )z@%(py13)s
{%(py13)s = %(py11)s.reduction_percentage
} >= %(py16)s)Úpy11r›   Úpy16z%(py18)sÚpy18zassert %(py21)srº   ÚWEBPr"   r¼   )z.%(py4)s
{%(py4)s = %(py2)s.format
} == %(py7)sr:   )z0%(py13)s
{%(py13)s = %(py11)s.mode
} == %(py16)s)r   Úoutput_pathr0   Úcompression_ratiorZ   r[   rX   r\   r]   rŸ   rY   r    r_   r`   Úsaved_bytesÚreduction_percentager	   rÇ   r-   Úmode)ra   r>   r   Úout_webprâ   r~   rÔ   re   Ú@py_assert7r¢   rÊ   Ú@py_assert14Ú@py_assert13rh   Ú@py_format16Ú@py_format18Ú@py_format19Ú@py_format21Ú@py_assert6Ú@py_assert12Ú@py_assert15rÍ   Ú@py_format10Ú@py_format17rÐ   rÑ   r:   s                              r=   Útest_t1_webp_compression_apiz5TestTier1FeatureCoverage.test_t1_webp_compression_api�   sÍ  € àÐ/Ñ/ˆÝÐ5°xÈÐLÑLÔLˆØIÐIˆsŒÐIˆÔ%ÐIÐ%Ð%Ñ'Ô'ÐIÐ'ÐIÐ'ÐI¨CÔ,AÐIÀTÐIÐ,AÀTÒ,IÐIÐIÐIÐIÑIÐIÐIÕIÔIÑIÔIÐIÐIÕIÔIˆsÑIÔIÐIÕIÔIˆsÑIÔIÐIÐIÕIÔIˆÑIÔIÕIÔIÐ%ÑIÔIÕIÔIÐ'ÑIÔIÐIÐIÑIÐIÐI×IÒIÐIÑIÔIÐIÐ'ÐIÕIÔIÐIÐIÐIÐIÐ,AÀTÐIÑIÔIÐIÕIÔIÑIÔIÐIÐIÕIÔI¨CÑIÔIÐIÕIÔI¨CÑIÔIÐIÐIÕIÔIÐ,AÑIÔIÕIÔIÀTÑIÔIÐIÐIÑIÐIÐIÐIÐIÐIÑIÐIÐI×IÒIÐIÑIÔIÐIÕIÔIÐIÐIÑIÔIÐIÑIÐIÐIÐIÐIÐIÑIÐIÕIÕIÔIÐIÑIÔIÑIÔIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIÐIØGÐGˆsŒÐG ÐGˆ Ò"ÐGÐGÐGÐGÐG sÔ'?ÐGÀ4ÐGÐ'?À4Ò'GÐGÐGÐGÐGÑGÕGÔGÐGÐGÐGÐGˆ ÐGÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔGˆsÑGÔGÐGÕGÔGˆsÑGÔGÐGÐGÕGÔGˆÑGÔGÕGÔG ÑGÔGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÐG×GÒGÐGÑGÔGÐGÐGÐGÕGÔGÐGÐGÐGÐGÐ'?À4ÐGÑGÔGÐGÕGÔGÑGÔGÐGÐGÕGÔG sÑGÔGÐGÕGÔG sÑGÔGÐGÐGÕGÔGÐ'?ÑGÔGÕGÔGÀ4ÑGÔGÐGÐGÑGÐGÐGÐGÐGÐGÑGÐGÐG×GÒGÐGÑGÔGÐGÕGÔGÐGÐGÑGÔGÐGÑGÐGÐGÐGÐGÐGÑGÐGÕGÕGÔGÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÐGÝŒZ˜Ñ!Ô!ð 	? SØ>Ð>�3”:Ð> Ð>�: Ò'Ð>Ð>Ð>Ð>Ð>¨C¬HÐ>¸Ð>¨H¸Ò,>Ð>Ð>Ð>Ð>Ñ>Õ>Ô>Ð>Ð>Ð>Ð>�: Ð>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>�3Ñ>Ô>Ð>Õ>Ô>�3Ñ>Ô>Ð>Ð>Õ>Ô>�:Ñ>Ô>Õ>Ô> Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Ð>×>Ò>Ð>Ñ>Ô>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>¨H¸Ð>Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>¨CÑ>Ô>Ð>Õ>Ô>¨CÑ>Ô>Ð>Ð>Õ>Ô>¨HÑ>Ô>Õ>Ô>¸Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Ð>×>Ò>Ð>Ñ>Ô>Ð>Õ>Ô>Ð>Ð>Ñ>Ô>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ð	?ð 	?ð 	?ñ 	?ô 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?ð 	?øøøð 	?ð 	?ð 	?ð 	?ð 	?ð 	?s   ÎF8UÕU Õ#U c           	     ó~  — |dz  }|                      ¦   «          t          d¦  «        D ];}|d|› d�z  }t          j        dd|dz  dd	d
f¦  «                             |¦  «         Œ<t          |d¬¦  «        }t          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}d„ |D ¦   «         }t          |¦  «        }|s•d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}}dS )zAAC2: Validates batch_compress_directory on multiple PNG textures.Ú	batch_srcrs   Útex_z.pngr"   rÄ   é(   r(   r)   r*   rÞ   rß   r¼   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)srM   ÚresultsrO   úassert %(py8)srU   Nc              3  ó^   K  — | ](}|j                              ¦   «         o
|j        d k    V — Œ)dS )rá   N)rì   r0   rí   ©Ú.0Úrs     r=   ú	<genexpr>zHTestTier1FeatureCoverage.test_t1_webp_batch_directory.<locals>.<genexpr>¡   s=   è è € Ð[Ð[Èa�1”=×'Ò'Ñ)Ô)ÐI¨aÔ.AÀTÒ.IÐ[Ð[Ð[Ð[Ð[Ð[r?   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úall©rP   r‰   rŠ   )Úmkdirr5   r	   r3   r7   r   rM   rX   rY   rZ   r[   r\   r]   r_   r`   r  )ra   r   Úsrc_dirr<   Úpr  rd   re   rf   rg   rh   r~   rÔ   Ú@py_format5s                 r=   Útest_t1_webp_batch_directoryz5TestTier1FeatureCoverage.test_t1_webp_batch_directory˜   s^  € à˜[Ñ(ˆØ�Š‰ŒˆÝ�q‘”ð 	Kð 	KˆAØ˜. ˜.˜.˜.Ñ(ˆAÝŒI�f˜j¨1¨r©6°3¸¸SÐ*AÑBÔB×GÒGÈÑJÔJÐJÐJÝ*¨7¸BÐ?Ñ?Ô?ˆÝ�7‰|Œ|Ð ˜qÐ ˆ|˜qÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ|˜qÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô �sÑ Ô Ð Õ Ô �sÑ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô �7Ñ Ô Ð Õ Ô �7Ñ Ô Ð Ð Õ Ô ˆ|Ñ Ô Õ Ô ˜qÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð Ø[Ð[ÐSZÐ[Ñ[Ô[Ð[�sÐ[Ñ[Ô[Ð[Ð[Ð[Ð[Ð[Õ[Ô[Ñ[Ô[Ð[Ð[Õ[Ô[�sÑ[Ô[Ð[Õ[Ô[�sÑ[Ô[Ð[Ð[Õ[Ô[Ð[Ñ[Ô[Õ[Ô[Ð[Ñ[Ô[Ð[Ð[Ñ[Ð[Õ[Õ[Ô[Ð[Ñ[Ô[Ñ[Ô[Ð[Ð[Ð[Ð[Ð[Ð[Ð[r?   c                ót  — t          ddddd¬¦  «        }t          dddd¦  «        }t          ddd	d	¦  «        }t          d
ddd¦  «        }t          ||¦  «        }d}||u }|�s0t          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  }dd|iz  }	t          t          j
        |	¦  «        ¦  «        ‚dx}x}}t          ||¦  «        }d}||u }|�s0t          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  }dd|iz  }	t          t          j
        |	¦  «        ¦  «        ‚dx}x}}t          ||¦  «        }d}||u }|�s0t          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  }dd|iz  }	t          t          j
        |	¦  «        ¦  «        ‚dx}x}}dS )zCAC2: Verifies 2D AABB frustum intersection in isometric projection.ç        ç      ‰@ç     À‚@ç      $@)Úmin_xÚmin_yÚmax_xÚmax_yÚpaddingg      Y@g      i@g      Œ@g     @�@g     Øˆ@g     ˜‚@g     �Š@g     P„@T©Úis)z9%(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
} is %(py7)sr   ÚfrustumÚ
box_inside)rP   rQ   r‰   rŠ   r˜   úassert %(py9)srç   NFÚbox_outsideÚbox_boundary)r   r   r   rX   rY   rZ   r[   r\   r]   r_   r`   )
ra   r  r  r!  r"  rÔ   rù   re   rÍ   rü   s
             r=   Ú%test_t1_viewport_culling_intersectionz>TestTier1FeatureCoverage.test_t1_viewport_culling_intersection£   sn  € å #¨S¸ÀUÐTXÐYÑYÔYˆÝ˜% ¨¨uÑ5Ô5ˆ
Ý˜5 %¨°Ñ8Ô8ˆÝ˜E 5¨%°Ñ7Ô7ˆÝ˜' :Ñ.Ô.Ð6°$Ð6Ð.°$Ð6Ð6Ð6Ñ6Õ6Ô6Ð6Ð6Ð6Ð6Ð.°$Ð6Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6�zÑ6Ô6Ð6Õ6Ô6�zÑ6Ô6Ð6Ð6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6˜'Ñ6Ô6Ð6Õ6Ô6˜'Ñ6Ô6Ð6Ð6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6 :Ñ6Ô6Ð6Õ6Ô6 :Ñ6Ô6Ð6Ð6Õ6Ô6Ð.Ñ6Ô6Õ6Ô6°$Ñ6Ô6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ý˜' ;Ñ/Ô/Ð8°5Ð8Ð/°5Ð8Ð8Ð8Ñ8Õ8Ô8Ð8Ð8Ð8Ð8Ð/°5Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8�zÑ8Ô8Ð8Õ8Ô8�zÑ8Ô8Ð8Ð8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8˜'Ñ8Ô8Ð8Õ8Ô8˜'Ñ8Ô8Ð8Ð8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8 ;Ñ8Ô8Ð8Õ8Ô8 ;Ñ8Ô8Ð8Ð8Õ8Ô8Ð/Ñ8Ô8Õ8Ô8°5Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ý˜' <Ñ0Ô0Ð8°DÐ8Ð0°DÐ8Ð8Ð8Ñ8Õ8Ô8Ð8Ð8Ð8Ð8Ð0°DÐ8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8�zÑ8Ô8Ð8Õ8Ô8�zÑ8Ô8Ð8Ð8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8˜'Ñ8Ô8Ð8Õ8Ô8˜'Ñ8Ô8Ð8Ð8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8 <Ñ8Ô8Ð8Õ8Ô8 <Ñ8Ô8Ð8Ð8Õ8Ô8Ð0Ñ8Ô8Õ8Ô8°DÑ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8Ð8r?   c                ó|  — t          d¬¦  «        }|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t	          t          j        |¦  «        ¦  «        ‚d	x}x}}|d
         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t	          t          j        |¦  «        ¦  «        ‚d	x}x}}|d         }d}||k     }|s‹t          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|d         › d�¦  «        dz   d|iz  }t	          t          j        |¦  «        ¦  «        ‚d	x}x}}d	S )zCAC2: Guarantees 1,000 entities culled in < 15ms to sustain 120 FPS.iè  )Únum_entitiesÚtotal_entitiesr¼   )z%(py1)s == %(py4)s)rQ   rŠ   zassert %(py6)srS   NÚculled_percentager  rå   )z%(py1)s > %(py4)sÚ
elapsed_msg      .@©ú<)z%(py1)s < %(py4)szCulling elapsed z
ms >= 15msz
>assert %(py6)s)r   rX   rY   r]   r_   r`   r^   )ra   Úmetricsr¢   rÔ   rd   r  rg   s          r=   Ú$test_t1_viewport_culling_performancez=TestTier1FeatureCoverage.test_t1_viewport_culling_performance­   s7  € å#°Ð6Ñ6Ô6ˆØÐ'Ô(Ð0¨DÐ0Ð(¨DÒ0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð(¨DÐ0Ñ0Ô0Õ0Ô0Ð(Ñ0Ô0Õ0Ô0¨DÑ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ØÐ*Ô+Ð1¨cÐ1Ð+¨cÒ1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð+¨cÐ1Ñ1Ô1Õ1Ô1Ð+Ñ1Ô1Õ1Ô1¨cÑ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ø�|Ô$Ða tÐaÐ$ tÒ+ÐaÐaÐaÕaÔaÐaÐaÐaÐaÐ$ tÐaÑaÔaÕaÔaÐ$ÑaÔaÕaÔa tÑaÔaÐaÐaÑaÐaÕaÔaÐ-aÀÈÔ@UÐ-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Ðar?   c                óº  — t          j        ddd¦  «        }t          |d¬¦  «        }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  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}dS )zAAC2: Verifies power-of-two mipmap chain downsampling down to 1x1.r"   rÄ   )r*   rÅ   é@   r*   rr   )Úmin_dimension)rÄ   )r.  r.  )r&   r&   )r%   r%   )é   r0  )é   r1  )r•   r•   ©rr   rr   c                ó   — g | ]	}|j         ‘Œ
S © )rÈ   )r  r:   s     r=   ú
<listcomp>zITestTier1FeatureCoverage.test_t1_mipmap_chain_scaling.<locals>.<listcomp>¹   s   € Ð*Ð*Ð*˜S�”Ð*Ð*Ð*r?   r¼   )z%(py1)s == %(py3)sÚexpected_dims©rQ   rR   úassert %(py5)srx   N)r	   r3   r   rX   rY   r]   rZ   r[   r\   r_   r`   )	ra   r   Útest_imgÚchainr6  r¢   rd   r   r€   s	            r=   Útest_t1_mipmap_chain_scalingz5TestTier1FeatureCoverage.test_t1_mipmap_chain_scaling´   s  € å”9˜V ZÐ1DÑEÔEˆÝ% h¸aÐ@Ñ@Ô@ˆØbÐbÐbˆØ*Ð* EÐ*Ñ*Ô*Ð;Ð*¨mÒ;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð*¨mÐ;Ñ;Ô;Õ;Ô;Ð*Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;¨mÑ;Ô;Ð;Õ;Ô;¨mÑ;Ô;Ð;Ð;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;r?   N©r   rB   ©r>   r   r   r   r   rB   ©r   r   r   rB   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ri   r�   r�   r§   rÕ   rÜ   rþ   r  r#  r,  r;  r4  r?   r=   rA   rA   =   s
  € € € € € ØHÐHðYð Yð Yð Yð[ð [ð [ð [ð(Zð Zð Zð Zð$ð ð ð ð
+ð 
+ð 
+ð 
+ð
ð 
ð 
ð 
ð?ð ?ð ?ð ?ð	\ð 	\ð 	\ð 	\ð9ð 9ð 9ð 9ðbð bð bð bð<ð <ð <ð <ð <ð <r?   rA   c                  óJ   — e Zd ZdZdd„Zdd„Zdd„Zdd	„Zdd
„Zdd„Z	dd„Z
dS )ÚTestTier2BoundaryAndCornerCasesz?Tier 2: Boundary & Corner Cases (Robustness & Edge Conditions).r   r   r   rB   c                ó  — |dz  }t          j        t          ¦  «        5  t          |¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          ¦  «        5  t	          |¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z9Verifies FileNotFoundError on non-existent source images.zghost_asset.pngN)ÚpytestÚraisesÚFileNotFoundErrorr   r   )ra   r   Únon_existents      r=   Ú#test_t2_missing_file_error_handlingzCTestTier2BoundaryAndCornerCases.test_t2_missing_file_error_handling¿   s  € àÐ"3Ñ3ˆÝŒ]Õ,Ñ-Ô-ð 	/ð 	/Ý  Ñ.Ô.Ð.ð	/ð 	/ð 	/ñ 	/ô 	/ð 	/ð 	/ð 	/ð 	/ð 	/ð 	/øøøð 	/ð 	/ð 	/ð 	/åŒ]Õ,Ñ-Ô-ð 	+ð 	+Ý˜\Ñ*Ô*Ð*ð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð 	+ð 	+s   Ÿ;»?Á?ÁA<Á<B ÂB c                óx  — |dz  }|                      ¦   «          t          |¦  «        }t          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t          t          j
        |¦  «        ¦  «        ‚d
x}x}}d
S )zHVerifies batch_compress_directory on empty directory returns empty list.Ú	empty_dirr   r¼   r  rM   r  rO   r  rU   N)r  r   rM   rX   rY   rZ   r[   r\   r]   r_   r`   )	ra   r   rL  r  rd   re   rf   rg   rh   s	            r=   Ú#test_t2_empty_directory_compressionzCTestTier2BoundaryAndCornerCases.test_t2_empty_directory_compressionÇ   sJ  € à˜{Ñ*ˆ	Ø�ŠÑÔÐÝ*¨9Ñ5Ô5ˆÝ�7‰|Œ|Ð ˜qÐ ˆ|˜qÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ|˜qÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô �sÑ Ô Ð Õ Ô �sÑ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô �7Ñ Ô Ð Õ Ô �7Ñ Ô Ð Ð Õ Ô ˆ|Ñ Ô Õ Ô ˜qÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð Ð Ð r?   c                óÒ  — g d¢}g d¢}|D �]+}t          |¦  «        }d}||u }|�s
t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        d	|› �¦  «        d
z   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}�Œ-|D �]+}t          |¦  «        }d}||u }|�s
t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        d|› �¦  «        d
z   d|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}�Œ-dS )z7Verifies that non-power-of-two dimensions are rejected.)r   éÿÿÿÿrs   é   é   r(   é–   i,  i€  iô  iÀ  i`  )rr   r•   r1  r0  r%   r&   r.  rÅ   rÂ   r$   i   i   Fr  )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} is %(py6)sr   ÚvalrO   zExpected False for rT   rU   NTzExpected True for )
r   rX   rY   rZ   r[   r\   r]   r^   r_   r`   )	ra   Únon_potÚpotrS  rd   re   rf   rg   rh   s	            r=   Ú"test_t2_non_power_of_two_rejectionzBTestTier2BoundaryAndCornerCases.test_t2_non_power_of_two_rejectionÎ   sÀ  € àFÐFÐFˆØAÐAÐAˆØð 	Nñ 	NˆCÝ" 3Ñ'Ô'ÐM¨5ÐMÐ'¨5Ð0ÐMÐMÑMÕMÔMÐMÐMÐMÐMÐ'¨5Ð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ÔM 3ÑMÔMÐMÕMÔM 3ÑMÔMÐMÐMÕMÔMÐ'ÑMÔMÕMÔM¨5ÑMÔMÐMÐMÑMÐMÕMÔMÐ2MÈÐ2MÐ2MÑ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Øð 	Lñ 	LˆCÝ" 3Ñ'Ô'ÐK¨4ÐKÐ'¨4Ð/ÐKÐKÑKÕKÔKÐKÐKÐKÐKÐ'¨4ÐKÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔK•?ÑKÔKÐKÕKÔK•?ÑKÔKÐKÐKÐKÕKÔKÑKÔKÐKÐKÕKÔK 3ÑKÔKÐKÕKÔK 3ÑKÔKÐKÐKÕKÔKÐ'ÑKÔKÕKÔK¨4ÑKÔKÐKÐKÑKÐKÕKÔKÐ1KÀcÐ1KÐ1KÑKÔKÐKÑKÐKÐKÐKÑKÐKÕKÕKÔKÐKÑKÔKÑKÔKÐKÐKÐKÐKÐKÐKÐKÑKð	Lð 	Lr?   c           	     óx  — |dz  }t          j        ddd¦  «                             |¦  «         t          ||dz  ¦  «        }dD ]õ}t          j        ||         ¦  «        5 }|j        }d}||k    }|sªt          j        d|fd||f¦  «        d	t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd	t          j        |¦  «        t          j        |¦  «        d
œz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}ddd¦  «         n# 1 swxY w Y   ŒödS )zHVerifies single-pixel textures downsample cleanly without zero division.z
pixel1.pngr"   r2  )r*   r   r   r*   Úlods_p1)rª   r«   r¬   r¼   r¾   r:   rÀ   rÁ   r˜   N)r	   r3   r7   r   rÇ   rÈ   rX   rY   rZ   r[   r\   r]   r_   r`   )ra   r   Úp1r°   Úkeyr:   r~   rf   rÔ   r€   rÍ   s              r=   Ú%test_t2_single_pixel_lod_downsamplingzETestTier2BoundaryAndCornerCases.test_t2_single_pixel_lod_downsampling×   s   € à˜Ñ$ˆÝŒ	�&˜&Ð"2Ñ3Ô3×8Ò8¸Ñ<Ô<Ð<Ý# B¨°9Ñ(<Ñ=Ô=ˆØ+ð 	*ð 	*ˆCÝ”˜D œIÑ&Ô&ð *¨#Ø”xÐ) 6Ð)�x 6Ò)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)�x 6Ð)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�sÑ)Ô)Ð)Õ)Ô)�sÑ)Ô)Ð)Ð)Õ)Ô)�xÑ)Ô)Õ)Ô) 6Ñ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ð*ð *ð *ñ *ô *ð *ð *ð *ð *ð *ð *øøøð *ð *ð *ð *øð	*ð 	*s   Á CD.Ä.D2	Ä5D2	c                ó  — d„ t          d¦  «        D ¦   «         }t          dd|d¬¦  «        }t          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        d	t          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd	d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}t          dd|¦  «        }t          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        d	t          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd	dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}t          dd|¦  «        }	t          |	¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        d	t          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd	dt          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}dS )zJTests zero viewports, massive viewports, and extreme negative coordinates.c                óN   — g | ]"}t          d |› �|dz   dz  |dz   dz  ¦  «        ‘Œ#S )Úent_rr   r  )r   )r  r<   s     r=   r5  z^TestTier2BoundaryAndCornerCases.test_t2_extreme_viewport_and_camera_coords.<locals>.<listcomp>â   s:   € Ð\Ð\Ð\ÈQ•˜Z A˜Z˜Z¨!¨a©%°4©¸!¸a¹%À4¹ÑHÔHÐ\Ð\Ð\r?   é
   ©r  r  r  ©r  r   r¼   r  rM   Úzero_resrO   r  rU   N)ç     ˆÓ@rc  Úhuge_res)ç    €‡ÃÀre  )r  r  Úfar_res)r5   r   rM   rX   rY   rZ   r[   r\   r]   r_   r`   )
ra   Úentsrb  rd   re   rf   rg   rh   rd  rf  s
             r=   Ú*test_t2_extreme_viewport_and_camera_coordszJTestTier2BoundaryAndCornerCases.test_t2_extreme_viewport_and_camera_coordsà   s°  € à\Ð\ÕRWÐXZÑR[ÔR[Ð\Ñ\Ô\ˆÝ  ¨Z¸ÀsÐKÑKÔKˆÝ�8‰}Œ}Ð! Ð!ˆ} Ò!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ} Ð!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�sÑ!Ô!Ð!Õ!Ô!�sÑ!Ô!Ð!Ð!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�8Ñ!Ô!Ð!Õ!Ô!�8Ñ!Ô!Ð!Ð!Õ!Ô!ˆ}Ñ!Ô!Õ!Ô! Ñ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ý  Ð-?ÀÑFÔFˆÝ�8‰}Œ}Ð" Ð"ˆ} Ò"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ} Ð"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"�sÑ"Ô"Ð"Õ"Ô"�sÑ"Ô"Ð"Ð"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"�8Ñ"Ô"Ð"Õ"Ô"�8Ñ"Ô"Ð"Ð"Õ"Ô"ˆ}Ñ"Ô"Õ"Ô" Ñ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"ÝÐ 2°NÀDÑIÔIˆÝ�7‰|Œ|Ð ˜qÐ ˆ|˜qÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ|˜qÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô �sÑ Ô Ð Õ Ô �sÑ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô �7Ñ Ô Ð Õ Ô �7Ñ Ô Ð Ð Õ Ô ˆ|Ñ Ô Õ Ô ˜qÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð Ð Ð r?   c                óB  — t          j        ¦   «         }t          ddg ¦  «        }g }t          |¦  «        }d}||k    }|}|r%t           j        } |¦   «         }	|	|z
  }
d}|
|k     }|}|�s!t	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        nddt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d	œz  }d
d|iz  }| 
                    |¦  «         |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	        |	¦  «        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}x}x}	x}
x}}dS )zFVerifies cull_entities with empty input returns empty list in < 0.1ms.r`  ©g      ž@g     à�@r   gü©ñÒMbP?r¼   )z0%(py5)s
{%(py5)s = %(py2)s(%(py3)s)
} == %(py8)srM   râ   )r‰   rR   rx   rU   z%(py10)sr™   r)  )z](%(py16)s
{%(py16)s = %(py14)s
{%(py14)s = %(py12)s.perf_counter
}()
} - %(py17)s) < %(py21)sÚtimeÚt0)rµ   r·   ré   r¸   rº   z%(py23)sÚpy23zassert %(py26)sÚpy26N)rk  Úperf_counterr   rM   rX   rY   rZ   r[   r\   r]   rŸ   r    r_   r`   )ra   rl  râ   r~   rf   rò   rù   r¢   rô   rû   rÌ   Ú@py_assert20Ú@py_assert19rh   r¤   rÑ   Ú@py_format24rÓ   Ú@py_format27s                      r=   Útest_t2_zero_entities_cullingz=TestTier2BoundaryAndCornerCases.test_t2_zero_entities_cullingê   sð  € åÔÑ Ô ˆÝ˜JÐ(8¸"Ñ=Ô=ˆØCÐC�s�3‰xŒxÐC˜1ÐCˆx˜1Š}ÐCÐCÐCÐCÐC¥$Ô"3ÐCÐ"3Ð"3Ñ"5Ô"5ÐCÐ"5¸Ñ":ÐC¸eÐCÐ":¸eÒ!CÐCÐCÐCÐCÑCÕCÔCÐCÐCÐCÐCˆx˜1ÐCÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC�sÑCÔCÐCÕCÔC�sÑCÔCÐCÐCÐCÕCÔCÑCÔCÐCÐCÕCÔC�3ÑCÔCÐCÕCÔC�3ÑCÔCÐCÐCÕCÔCˆxÑCÔCÕCÔC˜1ÑCÔCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÐC×CÒCÐCÑCÔCÐCÐCÐCÕCÔCÐCÐCÐCÐCÐ":¸eÐCÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC¥$ÑCÔCÐCÕCÔC¥$ÑCÔCÐCÐCÕCÔCÐ"3ÑCÔCÕCÔCÐ"5ÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC¸ÑCÔCÐCÕCÔC¸ÑCÔCÐCÐCÕCÔC¸eÑCÔCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÐC×CÒCÐCÑCÔCÐCÕCÔCÐCÐCÑCÔCÐCÑCÐCÐCÐCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCr?   r>   c                ó  — t          ||dz  d¬¦  «        }t          ||dz  d¬¦  «        }t          ||dz  d¬¦  «        }|j        }|j        }||k     }|sèt          j        d|fd	||f¦  «        d
t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }	dd|	iz  }
t          t          j	        |
¦  «        ¦  «        ‚dx}x}}|j
        }|j        } |¦   «         }|sžddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}}dS )zJVerifies quality boundary handling (quality=1, quality=100, out-of-range).zq1.webprr   rß   z	q100.webpr(   z	q150.webprR  r)  )z[%(py2)s
{%(py2)s = %(py0)s.compressed_size
} < %(py6)s
{%(py6)s = %(py4)s.compressed_size
}Úres_minÚres_max©rP   r‰   rŠ   rS   r  rU   Nzbassert %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.output_path
}.exists
}()
}Ú	res_clamp)r   Úcompressed_sizerX   rY   rZ   r[   r\   r]   r_   r`   rì   r0   )ra   r>   r   rv  rw  ry  r~   re   rÔ   rg   rh   s              r=   Útest_t2_webp_quality_boundariesz?TestTier2BoundaryAndCornerCases.test_t2_webp_quality_boundariesð   sD  € å"Ð#9¸8ÀiÑ;OÐYZÐ[Ñ[Ô[ˆÝ"Ð#9¸8ÀkÑ;QÐ[^Ð_Ñ_Ô_ˆÝ$Ð%;¸XÈÑ=SÐ]`ÐaÑaÔaˆ	ØÔ&Ð@¨Ô)@Ð@Ð&Ð)@Ò@Ð@Ð@Ð@Õ@Ô@Ð@Ð@Ð@Ð@Ð&Ð)@Ð@Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@ˆwÑ@Ô@Ð@Õ@Ô@ˆwÑ@Ô@Ð@Ð@Õ@Ô@Ð&Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@¨Ñ@Ô@Ð@Õ@Ô@¨Ñ@Ô@Ð@Ð@Õ@Ô@Ð)@Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@ØÔ$Ð-Ð$Ô+Ð-Ð+Ð+Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆyÑ-Ô-Ð-Õ-Ô-ˆyÑ-Ô-Ð-Ð-Õ-Ô-Ð$Ñ-Ô-Õ-Ô-Ð+Ñ-Ô-Õ-Ô-Ð-Ñ-Ô-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-r?   Nr>  r<  r=  )r?  r@  rA  rB  rJ  rM  rV  r[  rh  rt  r{  r4  r?   r=   rD  rD  ¼   s®   € € € € € ØIÐIð+ð +ð +ð +ð!ð !ð !ð !ðLð Lð Lð Lð*ð *ð *ð *ð!ð !ð !ð !ðDð Dð Dð Dð.ð .ð .ð .ð .ð .r?   rD  c                  ó:   — e Zd ZdZdd„Zdd„Zdd	„Zdd
„Zdd„ZdS )Ú!TestTier3CrossFeatureCombinationszATier 3: Cross-Feature State Interleaving & Pipeline Combinations.r>   r   r   r   rB   c                óä  — |dz  }t          ||¦  «        }t          |d¬¦  «        }t          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d	œz  }	d
d|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}}t          d„ |D ¦   «         ¦  «        }|                     ¦   «         j        }|j        }d}||z  }||k    }|sèt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}}dS )zLEnd-to-End Pipeline: Raw Source -> LOD Generation -> Batch WebP Compression.Úpipeline_lodsrÞ   rß   rs   rJ   rL   rM   Úwebp_resultsrO   r  rU   Nc              3  ó6   K  — | ]}d |j         j        v ¯|V — ŒdS )r¬   N)rì   Ústemr  s     r=   r
  z_TestTier3CrossFeatureCombinations.test_t3_full_pipeline_transformation_chain.<locals>.<genexpr>  s1   è è € ÐQÐQ˜q°F¸a¼mÔ>PÐ4PÐ4P˜Ð4PÐ4PÐ4PÐ4PÐQÐQr?   gš™™™™™¹?rØ   )zC%(py2)s
{%(py2)s = %(py0)s.compressed_size
} <= (%(py4)s * %(py6)s)Ú	lod2_webpÚraw_sizerx  r   rç   )r   r   rM   rX   rY   rZ   r[   r\   r]   r_   r`   ÚnextÚstatÚst_sizerz  )ra   r>   r   Úlod_dirr°   r€  rd   re   rf   rg   rh   rƒ  r„  r~   rò   rÔ   rÍ   rü   s                     r=   Ú*test_t3_full_pipeline_transformation_chainzLTestTier3CrossFeatureCombinations.test_t3_full_pipeline_transformation_chainü   s®  € à˜_Ñ,ˆÝ#Ð$:¸GÑDÔDˆÝ/°ÀÐDÑDÔDˆÝ�<Ñ Ô Ð% AÐ%Ð  AÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð  AÐ%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%�sÑ%Ô%Ð%Õ%Ô%�sÑ%Ô%Ð%Ð%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%�<Ñ%Ô%Ð%Õ%Ô%�<Ñ%Ô%Ð%Ð%Õ%Ô%Ð Ñ%Ô%Õ%Ô% AÑ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ÝÐQÐQ LÐQÑQÔQÑQÔQˆ	Ø)×.Ò.Ñ0Ô0Ô8ˆØÔ(Ð;°tÐ;¨H°t©OÐ;Ð(¨OÒ;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð(¨OÐ;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;ˆyÑ;Ô;Ð;Õ;Ô;ˆyÑ;Ô;Ð;Ð;Õ;Ô;Ð(Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;¨HÑ;Ô;Ð;Õ;Ô;¨HÑ;Ô;Ð;Ð;Õ;Ô;°tÑ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;r?   c                ó¸  — t          ¦   «         }|                     ¦   «         }|d         }|d         }||z   }d}||k    }|st          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d	x}x}x}x}}|                     ¦   «         }
g }d
}||
v }|}|rd}||
v }|}|�sXt          j        d|fd||
f¦  «        t          j        |¦  «        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¦  «        t          j        |¦  «        dt          j	        ¦   «         v st          j
        |
¦  «        rt          j        |
¦  «        nd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	S )zXAC6: Verifies DesignPipelineManager scan and reporting over all inbox/approved requests.rF   rG   rI   rJ   )z(%(py1)s + %(py3)s) >= %(py7)s)rQ   rR   r˜   r   rç   NzTotal Requests:z'FREEEXILE DESIGN PIPELINE STATUS REPORTr­   r¯   Ú	report_mdr±   r²   r˜   r³   r´   r¶   r·   r   úassert %(py17)sr¸   )r   Úget_pipeline_summaryrX   rY   r]   r_   r`   Úgenerate_status_reportrZ   r[   r\   rŸ   r    )ra   ÚmgrÚsummaryr¢   rd   rf   rù   re   rÍ   rü   r‹  r~   r£   rÊ   r€   rÎ   rÏ   rõ   rö   s                      r=   Ú*test_t3_design_pipeline_manager_full_cyclezLTestTier3CrossFeatureCombinations.test_t3_design_pipeline_manager_full_cycle  sý  € å#Ñ%Ô%ˆØ×*Ò*Ñ,Ô,ˆØ˜Ô Ð= 7¨:Ô#6Ð=Ð Ð#6Ñ6Ð=¸2Ð=Ð6¸2Ò=Ð=Ð=Ð=Õ=Ô=Ð=Ð=Ð=Ð=Ð6¸2Ð=Ñ=Ô=Õ=Ô=Ð Ñ=Ô=Õ=Ô=Ð#6Ñ=Ô=Õ=Ô=¸2Ñ=Ô=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ø×.Ò.Ñ0Ô0ˆ	ØhÐhÐ ÐhÐ  IÐ-ÐhÐhÐhÐhÐhÐ2[ÐhÐ2[Ð_hÐ2hÐhÐhÐhÐhÑhÕhÔhÐhÐhÐhÐhÐ  IÐhÑhÔhÕhÔhÐ ÑhÔhÐhÕhÔhÑhÔhÐhÐhÕhÔh IÑhÔhÐhÕhÔh IÑhÔhÐhÐhÐhÐhÑhÐhÐhÐhÐhÐhÑhÐhÐh×hÒhÐhÑhÔhÐhÐhÐhÕhÔhÐhÐhÐhÐhÐ2[Ð_hÐhÑhÔhÕhÔhÐ2[ÑhÔhÐhÕhÔhÑhÔhÐhÐhÕhÔhÐ_hÑhÔhÐhÕhÔhÐ_hÑhÔhÐhÐhÐhÐhÑhÐhÐhÐhÐhÐhÑhÐhÐh×hÒhÐhÑhÔhÐhÕhÔhÐhÐhÑhÔhÐhÑhÐhÐhÐhÐhÐhÑhÐhÕhÕhÔhÐhÑhÔhÑhÔhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhÐhr?   c                ó<  ‡‡— g d¢Št          j        d¦  «        Šˆˆfd„t          d¦  «        D ¦   «         }t          dd|d¬¦  «        }t	          |¦  «        }d	}||k    }|sòt          j        d
|fd||f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}d„ |D ¦   «         }t	          |¦  «        }d}	||	k    }d}
|	|
k     }|r|�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
        |	¦  «        t          j
        |
¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}	}
dS )zWAC5: Viewport culling into GPU palette instancing yields <= 30 draw calls for 50+ mobs.)Ú	hellhoundÚskeletonÚraptorÚtreantÚcrawleri9  c           
     óž   •— g | ]I}t          ‰|d z           › d|› �‰                     dd¦  «        ‰                     dd¦  «        ¦  «        ‘ŒJS )rP  Ú_iØÿÿÿr  )r   Úuniform)r  r<   Ú
archetypesÚrngs     €€r=   r5  zbTestTier3CrossFeatureCombinations.test_t3_culling_to_gpu_instancing_draw_calls.<locals>.<listcomp>  sj   ø€ ð 
ð 
ð 
àõ ˜J q¨1¡uÔ-Ð3Ð3°Ð3Ð3°S·[²[ÀÀbÑ5IÔ5IÈ3Ï;Ê;ÐWZÐ\^ÑK_ÔK_Ñ`Ô`ð
ð 
ð 
r?   r(   r`  rj  ç      P@ra  r_  rJ   rL   rM   ÚvisiblerO   r  rU   Nc                óP   — h | ]#}|j                              d d¦  «        d         ’Œ$S )r™  rr   r   )Ú	entity_idÚrsplit)r  Úents     r=   ú	<setcomp>zaTestTier3CrossFeatureCombinations.test_t3_culling_to_gpu_instancing_draw_calls.<locals>.<setcomp>  s/   € ÐQÐQÐQÀ#˜cœm×2Ò2°3¸Ñ:Ô:¸1Ô=ÐQÐQÐQr?   rP  é   )rÙ   r*  )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} <= %(py7)sz%(py7)s < %(py9)sÚvisible_archetypes)rP   rQ   rR   r˜   rç   zassert %(py11)srè   )ÚrandomÚRandomr5   r   rM   rX   rY   rZ   r[   r\   r]   r_   r`   )ra   Úentitiesrž  rd   re   rf   rg   rh   r¥  rù   Ú@py_assert8rü   r¥   r›  rœ  s                @@r=   Ú,test_t3_culling_to_gpu_instancing_draw_callszNTestTier3CrossFeatureCombinations.test_t3_culling_to_gpu_instancing_draw_calls  s÷  øø€ àMÐMÐMˆ
ÝŒm˜DÑ!Ô!ˆð
ð 
ð 
ð 
ð 
å˜3‘Z”Zð
ñ 
ô 
ˆõ   
Ð,<¸hÐPTÐUÑUÔUˆÝ�7‰|Œ|Ð!˜rÐ!ˆ|˜rÒ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ|˜rÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�sÑ!Ô!Ð!Õ!Ô!�sÑ!Ô!Ð!Ð!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�7Ñ!Ô!Ð!Õ!Ô!�7Ñ!Ô!Ð!Ð!Õ!Ô!ˆ|Ñ!Ô!Õ!Ô!˜rÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!ØQÐQÈÐQÑQÔQÐÝÐ%Ñ&Ô&Ð0¨!Ð0Ð&¨!Ò0Ð0¨bÐ0¨!¨bÒ0Ð0Ð0Ð0Ð0Ñ0Õ0Ô0Ð0Ð0Ð0Ð0Ð0Ð&¨!¨bÐ0Ñ0Ô0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0�sÑ0Ô0Ð0Õ0Ô0�sÑ0Ô0Ð0Ð0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0Ð%Ñ0Ô0Ð0Õ0Ô0Ð%Ñ0Ô0Ð0Ð0Õ0Ô0Ð&Ñ0Ô0Õ0Ô0¨!Ñ0Ô0Õ0Ô0¨bÑ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ð0r?   c                óæ  ‡‡	— dŠd}t          |d         ‰z  ¦  «        t          |d         ‰z  ¦  «        fŠ	g d¢}ˆˆ	fd„|D ¦   «         }ddg}||k    }|s—t          j        d|fd	||f¦  «        d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )zNSimulates 64m AoI Spatial Grid cell filtering for network animation broadcast.r�  )g      ^@ç     Àb@r   rr   ))rr   )g     @`@g      d@)r•   )g     €f@r¬  )rs   )ç     @@r­  c                óÐ   •— g | ]b\  }\  }}t          t          |‰z  ¦  «        ‰d          z
  ¦  «        dk    ¯4t          t          |‰z  ¦  «        ‰d         z
  ¦  «        dk    ¯`|‘ŒcS )r   rr   )Úabsr�   )r  ÚmidÚmxÚmyÚ	cell_sizeÚp_cells       €€r=   r5  zeTestTier3CrossFeatureCombinations.test_t3_server_aoi_spatial_filtering_simulation.<locals>.<listcomp>%  s~   ø€ ð 
ð 
ð 
Ù!�C™˜"˜bÝ•3�r˜Y‘Ñ'Ô'¨&°¬)Ñ3Ñ4Ô4¸Ò9Ð9½cÅ#ÀbÈIÁoÑBVÔBVÐY_Ð`aÔYbÑBbÑ>cÔ>cÐghÒ>hÐ>hð Ø>hÐ>hÐ>hr?   r•   r¼   )z%(py0)s == %(py3)sÚaoi_mobsrv   r8  rx   N)	r�   rX   rY   rZ   r[   r\   r]   r_   r`   )
ra   Ú
player_posÚmobsrµ  rd   r~   r   r€   r³  r´  s
           @@r=   Ú/test_t3_server_aoi_spatial_filtering_simulationzQTestTier3CrossFeatureCombinations.test_t3_server_aoi_spatial_filtering_simulation  sF  øø€ àˆ	Ø#ˆ
Ý�j ”m yÑ0Ñ1Ô1µ3°zÀ!´}È	Ñ7QÑ3RÔ3RÐSˆð
ð 
ð 
ˆð

ð 
ð 
ð 
ð 
Ø%)ð
ñ 
ô 
ˆð ˜q˜6Ð!ˆx˜6Ò!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆx˜6Ð!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆxÑ!Ô!Ð!Õ!Ô!ˆxÑ!Ô!Ð!Ð!Õ!Ô!˜6Ñ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!r?   c                ól  — d}d}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  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}}d
S )zOSimulates bitmask delta compression for actor animation states (83% reduction).é   rP  g      è?rJ   rt   Úsavings_ratiorv   r8  rx   N)rX   rY   rZ   r[   r\   r]   r_   r`   )	ra   Úfull_state_sizeÚchanged_fields_maskÚdelta_payload_sizer»  rd   r~   r   r€   s	            r=   Ú+test_t3_animation_delta_compression_bitmaskzMTestTier3CrossFeatureCombinations.test_t3_animation_delta_compression_bitmask+  së   € àˆØ(ÐØ&ÐØ(Ð+=Ñ=ÀÑPˆØ $Ð$ˆ} Ò$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆ} Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ˆ}Ñ$Ô$Ð$Õ$Ô$ˆ}Ñ$Ô$Ð$Ð$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$r?   Nr=  r<  )	r?  r@  rA  rB  r‰  r‘  rª  r¸  r¿  r4  r?   r=   r}  r}  ù   s‚   € € € € € ØKÐKð<ð <ð <ð <ðið ið ið ið1ð 1ð 1ð 1ð"ð "ð "ð "ð %ð %ð %ð %ð %ð %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 )ÚTestTier4RealWorldScenarioszMTier 4: Real-World Scenarios (Comprehensive Asset Campaign & Quality Audits).r   rB   c           	     óf  — t           dz  dz  dz  }t          |                     d¦  «        ¦  «        }t          |¦  «        }d}||k    }|�st	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndd	t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd	t	          j	        |¦  «        t	          j	        |¦  «        d
œz  }t	          j
        dt          |¦  «        › �¦  «        dz   d|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}|D �]C}dt          |¦  «        v rŒt          j        |¦  «        5 }	t!          j        |	¦  «        }
t          |
j        ¦  «        dk    r|
j        d         n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|j        › d|d›d�¦  «        dz   d|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}ddd¦  «         n# 1 swxY w Y   �ŒEdS )zPAC5: Audits all *_normal.png files in assets/ verifying mean Blue channel > 128.r   r   r    z**/*_normal.pngr_  rJ   rL   rM   Únormal_mapsrO   z"Expected >= 10 normal maps, found rT   rU   NÚ
savage_vfxrs   r•   r  g      `@rå   )z%(py0)s > %(py3)sÚ	blue_meanrv   zNormal map z B-mean ú.1fz <= 128rw   rx   )r/   rV   rW   rM   rX   rY   rZ   r[   r\   r]   r^   r_   r`   Ústrr	   rÇ   r   ÚStatÚmeanry   )ra   Ú
assets_dirrÃ  rd   re   rf   rg   rh   Ún_pathr:   r†  rÅ  r~   r   r€   s                  r=   Ú-test_t4_client_assets_normal_map_blue_channelzITestTier4RealWorldScenarios.test_t4_client_assets_normal_map_blue_channel7  s3  € å Ñ)¨HÑ4°xÑ?ˆ
Ý˜:Ÿ?š?Ð+<Ñ=Ô=Ñ>Ô>ˆÝ�;ÑÔÐ^ 2Ð^Ð 2Ò%Ð^Ð^Ñ^Õ^Ô^Ð^Ð^Ð^Ð^Ð 2Ð^Ñ^Ô^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^�sÑ^Ô^Ð^Õ^Ô^�sÑ^Ô^Ð^Ð^Ð^Õ^Ô^Ñ^Ô^Ð^Ð^Õ^Ô^�;Ñ^Ô^Ð^Õ^Ô^�;Ñ^Ô^Ð^Ð^Õ^Ô^ÐÑ^Ô^Õ^Ô^ 2Ñ^Ô^Ð^Ð^Ñ^Ð^Õ^Ô^Ð'^ÍCÐP[ÑL\ÔL\Ð'^Ð'^Ñ^Ô^Ð^Ñ^Ð^Ð^Ð^Ñ^Ð^Õ^Õ^Ô^Ð^Ñ^Ô^Ñ^Ô^Ð^Ð^Ð^Ð^Ð^Ð^Ð^Ø!ð 	dñ 	dˆFØ�s 6™{œ{Ð*Ð*ØÝ”˜FÑ#Ô#ð d sÝ ”~ cÑ*Ô*�Ý,/°´	©N¬N¸aÒ,?Ð,?˜DœI aœL˜LÀS�	Ø#(Ðc�y 5Ò(ÐcÐcÐcÕcÔcÐcÐcÐcÐc�y 5ÐcÑcÔcÐcÕcÔcÑcÔcÐcÐcÕcÔc�yÑcÔcÐcÕcÔc�yÑcÔcÐcÐcÕcÔc 5ÑcÔcÐcÐcÑcÐcÕcÔcÐ*c¸¼Ð*cÐ*cÈYÐ*cÐ*cÐ*cÐ*cÑcÔcÐcÑcÐcÐcÐcÑcÐcÕcÕcÔcÐcÑcÔcÑcÔcÐcÐcÐcÐcÐcðdð dð dñ dô dð dð dð dð dð dð døøøð dð dð dð dùð	dð 	ds   ÆDJ$Ê$J(	Ê+J(	c           	     óx  — t           dz  dz  dz  }|dz                       d¦  «        D �]�}d|j        v s|                     ¦   «         j        dk    rŒ*t          j        |¦  «        5 }g }|j        }t          |¦  «        }|}|r|j	        }t          |¦  «        }	|	}|�söd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  }
|                     |
¦  «         |rÇd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¦  «        i z  }t          j        d|j        › d|j        › d�¦  «        dz   d|iz  }t'          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}}	ddd¦  «         n# 1 swxY w Y   �Œ‘dS )zMAC5: Validates power-of-two resolutions across monster and character sprites.r   r   r    r!   ú*.pngÚ_normalr   z@%(py7)s
{%(py7)s = %(py2)s(%(py5)s
{%(py5)s = %(py3)s.width
})
}r   r:   )r‰   rR   rx   r˜   zF%(py14)s
{%(py14)s = %(py9)s(%(py12)s
{%(py12)s = %(py10)s.height
})
})rç   r™   rµ   r·   zAsset z (z) violates power-of-two rulez
>assert %(py17)sr¸   N)r/   rW   ry   r†  r‡  r	   rÇ   Úwidthr   ÚheightrZ   r[   rX   r\   r]   rŸ   r    r^   rÈ   r_   r`   )ra   rÊ  Úm_pathr:   r~   rf   rù   r¢   rÊ   rô   rÍ   rÏ   rõ   rö   s                 r=   Ú"test_t4_client_assets_power_of_twoz>TestTier4RealWorldScenarios.test_t4_client_assets_power_of_twoD  sJ  € å Ñ)¨HÑ4°xÑ?ˆ
Ø! JÑ.×4Ò4°WÑ=Ô=ð 	ñ 	ˆFØ˜FœKÐ'Ð'¨6¯;ª;©=¬=Ô+@ÀAÒ+EÐ+EØÝ”˜FÑ#Ô#ð  sðð  s¤yð • yÑ1Ô1ð Ð1ð Ð1ð ÀcÄjð µoÀjÑ6QÔ6Qð Ð6Qð ð ñ ð ð õ äñô ð ð õ ìõ 'ñ ô ð õ äõ 'ñ ô ð ð ð õ äñô ð ð õ ìð (+ñ ô ð õ äð (+ñ ô ð ð õ äð (1ñ ô õ äð 2ñ ô ð ð ñ ð ð çŠ6ðáŒ6ˆ6ð 2ð ð ð õ äñô ð ð õ ìõ 7Fñ ô ð õ äõ 7Fñ ô ð ð ð õ äñô ð ð õ ìð GJñ ô ð õ äð GJñ ô ð ð õ äð GQñ ô õ äð 7Rñ ô ð ð ñ ð ð çŠ6ðáŒ6ˆ6õäðð ñ ô ð ñ ð õ ä ð S˜Vœ[ÐRÐR¨C¬HÐRÐRÐRñô ð ñ ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ùð	ð 	s   Á'H:J-Ê-J1	Ê4J1	c                ó2  — t           dz  dz  dz  }|dz                       d¦  «        D ]å}|                     ¦   «         j        d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|j        › d|d›d�¦  «        dz   d|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}Œæ|dz                       d¦  «        D ]ï}d|j        v rŒ|                     ¦   «         j        d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|j        › d|d›d�¦  «        dz   d|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}ŒðdS )z[AC5: Enforces file size limits: UI icon <= 150KB, character atlas <= 2MB, map tile <= 50KB.r   r   r    Ú
animationsz*_anim_atlas.pngg      �@g       @rØ   )z%(py0)s <= %(py3)sÚsize_kbrv   zAtlas z exceeds 2MB budget (rÆ  zKB)rw   rx   NÚ
currenciesrÎ  rÏ  r¬  zCurrency icon z exceeds 150KB budget ()r/   rW   r†  r‡  rX   rY   rZ   r[   r\   r]   r^   ry   r_   r`   )	ra   rÊ  ÚanimrÖ  rd   r~   r   r€   Úcurs	            r=   Ú$test_t4_file_size_budget_enforcementz@TestTier4RealWorldScenarios.test_t4_file_size_budget_enforcementO  s„  € å Ñ)¨HÑ4°xÑ?ˆ
Ø ,Ñ.×4Ò4Ð5GÑHÔHð 	`ð 	`ˆDØ—i’i‘k”kÔ)¨FÑ2ˆGØ$Ð_�7˜fÒ$Ð_Ð_Ð_Õ_Ô_Ð_Ð_Ð_Ð_�7˜fÐ_Ñ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_�7Ñ_Ô_Ð_Õ_Ô_�7Ñ_Ô_Ð_Ð_Õ_Ô_˜fÑ_Ô_Ð_Ð_Ñ_Ð_Õ_Ô_Ð&_¨t¬yÐ&_Ð&_ÈwÐ&_Ð&_Ð&_Ð&_Ñ_Ô_Ð_Ñ_Ð_Ð_Ð_Ñ_Ð_Õ_Õ_Ô_Ð_Ñ_Ô_Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_Ø Ñ-×3Ò3°GÑ<Ô<ð 	hð 	hˆCØ˜CœHÐ$Ð$ØØ—h’h‘j”jÔ(¨6Ñ1ˆGØ#Ðg�7˜eÒ#ÐgÐgÐgÕgÔgÐgÐgÐgÐg�7˜eÐgÑgÔgÐgÕgÔgÑgÔgÐgÐgÕgÔg�7ÑgÔgÐgÕgÔg�7ÑgÔgÐgÐgÕgÔg˜eÑgÔgÐgÐgÑgÐgÕgÔgÐ%g°c´hÐ%gÐ%gÐW^Ð%gÐ%gÐ%gÐ%gÑgÔgÐgÑgÐgÐgÐgÑgÐgÕgÕgÔgÐgÑgÔgÑgÔgÐgÐgÐgÐgÐgÐgð		hð 	hr?   c                óš  — t           dz  dz  dz  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}}| 
                    d¬¦  «        }d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚d
x}}d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚d
x}}d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚d
x}}g }d}||v }
|
}|
sd}||v }|}|�sXt          j        d|
fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }	dd|	iz  }|                     |¦  «         |
s‹t          j        d|fd||f¦  «        t          j        |¦  «        dt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd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
S )#zSAC2/AC5: Verifies Metal GPU instancing shader contract for 200+ instances batching.r   r   r    r!   z monster_palette_instancing.metalzShader not found at zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}Ú
metal_filer  Nrƒ   r„   Úinstance_idr­   )z%(py1)s in %(py3)sÚcoder7  r8  rx   ÚMonsterInstanceDataÚdiscard_fragmentÚpaletteLUTIndexÚelementalTintr¯   r±   r²   r˜   r³   r´   r¶   r·   rr   rŒ  r¸   )r/   r0   rX   r^   rZ   r[   r\   r]   r_   r`   r‹   rY   rŸ   r    )ra   rÜ  r~   rÔ   r  rÞ  r¢   rd   r   r€   rf   r£   rÊ   rÍ   rÎ   rÏ   rõ   rö   s                     r=   Ú(test_t4_metal_instancing_shader_contractzDTestTier4RealWorldScenarios.test_t4_metal_instancing_shader_contract[  s5  € å Ñ)¨HÑ4°xÑ?À*ÑLÐOqÑqˆ
ØÔ ÐGÐ Ð Ñ"Ô"ÐGÐ"ÐGÕGÔGÐ$G¸:Ð$GÐ$GÑGÔGÐGÑGÐGÕGÔGÑGÔGÐGÐGÕGÔGˆzÑGÔGÐGÕGÔGˆzÑGÔGÐGÐGÕGÔGÐ ÑGÔGÕGÔGÐ"ÑGÔGÐGÐGÑGÐGÕGÕGÔGÐGÑGÔGÑGÔGÐGÐGÐGÐGÐGØ×#Ò#¨WÐ#Ñ5Ô5ˆØÐ$ˆ} Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆ} Ð$Ñ$Ô$Õ$Ô$ˆ}Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ Ñ$Ô$Ð$Õ$Ô$ Ñ$Ô$Ð$Ð$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ø$Ð,Ð$¨Ð,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð$¨Ð,Ñ,Ô,Õ,Ô,Ð$Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,¨Ñ,Ô,Ð,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ø!Ð)Ð! TÐ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð! TÐ)Ñ)Ô)Õ)Ô)Ð!Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô) TÑ)Ô)Ð)Õ)Ô) TÑ)Ô)Ð)Ð)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)ØCÐCÐ ÐCÐ  DÐ(ÐCÐCÐCÐCÐC¨OÐC¨O¸tÐ,CÐCÐCÐCÐCÑCÕCÔCÐCÐCÐCÐCÐ  DÐCÑCÔCÕCÔCÐ ÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC DÑCÔCÐCÕCÔC DÑCÔCÐCÐCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÐC×CÒCÐCÑCÔCÐCÐCÐCÕCÔCÐCÐCÐCÐC¨O¸tÐCÑCÔCÕCÔC¨OÑCÔCÐCÕCÔCÑCÔCÐCÐCÕCÔC¸tÑCÔCÐCÕCÔC¸tÑCÔCÐCÐCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÐC×CÒCÐCÑCÔCÐCÕCÔCÐCÐCÑCÔCÐCÑCÐCÐCÐCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCÐCr?   c           	     ó   — t           dz  dz  dz  }t           dz  dz  dz  }t          |                     d¦  «        ¦  «        t          |                     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	d
t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd
t	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}t          j        d¦  «        }	t          j        d¦  «        }
t          ¦   «         }|D �]Ý}|                     d¬¦  «        }|	                     |¦  «        }|
                     |¦  «        }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|j        › �¦  «        dz   d|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}}|                     d¦  «        }||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  }t	          j        d |› �¦  «        d!z   d"|iz  }t          t	          j        |¦  «        ¦  «        ‚d}|                     |¦  «         g }d}||u}|}|r|j        }d} ||¦  «        }d#}||v }|}|�s‘t	          j        d|fd$||f¦  «        d%t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd%t	          j	        |¦  «        d&œz  }d'd(|iz  }|                     |¦  «         |rÄt	          j        d)|fd*||f¦  «        d%t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd%t	          j	        |¦  «        t	          j	        |¦  «        t	          j	        |¦  «        t	          j	        |¦  «        d+œz  }d,d-|iz  }|                     |¦  «         t	          j        |d.¦  «        i z  } d/d0| iz  }!t          t	          j        |!¦  «        ¦  «        ‚dx}x}x}x}x}x}x}x}}�ŒßdS )1zIAC1/AC6: Validates that all 21 DRQs have unique IDs and valid priorities.rD   rE   rF   rG   rH   rI   rJ   rL   rM   ÚfilesrO   r  rU   Nu>   \*\*MÃ£ YÃªu Cáº§u \(Request ID\)\*\*:\s*`?([A-Za-z0-9_\-]+)`?uA   \*\*Má»©c Ä�á»™ Æ¯u TiÃªn \(Priority\)\*\*:\s*`?([A-Za-z0-9_]+)`?rƒ   r„   r‘   r“   Úm_idrv   zCould not find Request ID in rw   rx   rr   )únot in)z%(py0)s not in %(py2)sÚreq_idÚseen_ids)rP   r‰   zDuplicate Request ID z
>assert %(py4)srŠ   )ÚCRITICALÚHIGHÚMEDIUMÚLOW)z%(py2)s is not %(py5)sÚm_prio)r‰   rx   r²   r˜   r­   )zQ%(py15)s
{%(py15)s = %(py11)s
{%(py11)s = %(py9)s.group
}(%(py13)s)
} in %(py18)s)rç   rè   r›   rã   rê   z%(py20)srä   r   zassert %(py23)srm  )r/   rV   rW   rM   rX   rY   rZ   r[   r\   r]   r_   r`   r†   rœ   Úsetr‹   rŒ   r^   ry   rž   ÚaddrŸ   r    )"ra   rb   rc   rå  rd   re   rf   rg   rh   Úid_regexÚ
prio_regexré  r|   Útxtræ  rî  r~   r   r€   rè  Ú@py_format3r  rÔ   r¢   Ú@py_assert10rú   ró   Ú@py_assert17rË   rÍ   r÷   rø   rÑ   rr  s"                                     r=   Ú+test_t4_drq_comprehensive_campaign_coveragezGTestTier4RealWorldScenarios.test_t4_drq_comprehensive_campaign_coveragee  s4  € å Ñ&Ð):Ñ:¸WÑDˆ	Ý  6Ñ)Ð,=Ñ=À
ÑJˆÝ�Y—^’^Ð$7Ñ8Ô8Ñ9Ô9½DÀ×ARÒARÐSfÑAgÔAgÑ<hÔ<hÑhˆÝ�5‰zŒzÐ˜RÐˆz˜RÒÐÐÐÕÔÐÐÐÐˆz˜RÐÑÔÐÕÔÑÔÐÐÕÔ�sÑÔÐÕÔ�sÑÔÐÐÐÕÔÑÔÐÐÕÔ�5ÑÔÐÕÔ�5ÑÔÐÐÕÔˆzÑÔÕÔ˜RÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÝ”:Ð_Ñ`Ô`ˆÝ”ZÐ dÑeÔeˆ
Ý‘5”5ˆØð 	cñ 	cˆAØ—+’+ w�+Ñ/Ô/ˆCØ—?’? 3Ñ'Ô'ˆDØ×&Ò& sÑ+Ô+ˆFØ#ÐM�4˜tÐ#ÐMÐMÐMÕMÔMÐMÐMÐMÐM�4˜tÐMÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔM�4ÑMÔMÐMÕMÔM�4ÑMÔMÐMÐMÕMÔM˜tÑMÔMÐMÐMÑMÐMÕMÔMÐ%MÀQÄVÐ%MÐ%MÑMÔMÐMÑMÐMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMÐMÐMØ—Z’Z ‘]”]ˆFØ Ð)ÐKÐKÐKÕKÔKÐKÐKÐKÐK�6 ÐKÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔK�6ÑKÔKÐKÕKÔK�6ÑKÔKÐKÐKÐKÕKÔKÑKÔKÐKÐKÕKÔK ÑKÔKÐKÕKÔK ÑKÔKÐKÐKÐKÐKÑKÐKÕKÔKÐ+KÀ6Ð+KÐ+KÑKÔKÐKÑKÐKÐKÐKÑKÐKÕKÕKÔKÐKÑKÔKÑKÔKÐKÐKÐKØ�LŠL˜Ñ Ô Ð ØbÐb Ðb�6 Ð%ÐbÐbÐbÐbÐb¨&¬,Ðb°qÐb¨,¨,°q©/¬/ÐbÐ=bÐb¨/Ð=bÐ*bÐbÐbÐbÐbÑbÕbÔbÐbÐbÐbÐb�6 ÐbÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔb�6ÑbÔbÐbÕbÔb�6ÑbÔbÐbÐbÕbÔb ÑbÔbÐbÐbÑbÐbÐbÐbÐbÐbÑbÐbÐb×bÒbÐbÑbÔbÐbÐbÐbÕbÔbÐbÐbÐbÐb¨/Ð=bÐbÑbÔbÐbÕbÔbÑbÔbÐbÐbÕbÔb¨&ÑbÔbÐbÕbÔb¨&ÑbÔbÐbÐbÕbÔb¨,ÑbÔbÕbÔb°qÑbÔbÕbÔb¨/ÑbÔbÕbÔbÐ=bÑbÔbÐbÐbÑbÐbÐbÐbÐbÐbÑbÐbÐb×bÒbÐbÑbÔbÐbÕbÔbÐbÐbÑbÔbÐbÑbÐbÐbÐbÐbÐbÑbÐbÕbÕbÔbÐbÑbÔbÑbÔbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÐbÑbð	cð 	cr?   Nr<  )	r?  r@  rA  rB  rÌ  rÓ  rÚ  rã  r÷  r4  r?   r=   rÁ  rÁ  4  s�   € € € € € ØWÐWðdð dð dð dð	ð 	ð 	ð 	ð
hð 
hð 
hð 
hðDð Dð Dð Dðcð cð cð cð cð cr?   rÁ  )r   r   r   r   )>rB  Ú
__future__r   ÚbuiltinsrZ   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterX   ÚjsonÚmathÚpathlibr   r¦  r†   r1   Úsysrk  Útypingr   r   r   r   ÚPILr	   r
   r   rF  Ú__file__ÚresolveÚparentr/   rÇ  ÚpathÚinsertÚ"tools.asset_pipeline.lod_generatorr   r   Ú'tools.asset_pipeline.texture_compressorr   r   Ú+tools.asset_pipeline.viewport_culling_utilsr   r   r   r   r   r   r   Ú!tools.asset_pipeline.mipmap_utilsr   r   Ú,tools.asset_pipeline.design_pipeline_managerr   Ú*tools.asset_pipeline.design_pipeline_typesr   Úfixturer>   rA   rD  r}  rÁ  r4  r?   r=   ú<module>r     sä  ððð ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €€€€Ø €€€Ø Ð Ð Ð Ð Ð Ø €€€Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø €€€ð ˆD�‰NŒN×"Ò"Ñ$Ô$Ô+Ô2Ô9€	Ø€3€y�>„>˜œÐ!Ð!Ø„H‡O‚O�A�s�s˜9‘~”~Ñ&Ô&Ð&à \Ð \Ð \Ð \Ð \Ð \Ð \Ð \Ø ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð WÐ VÐ VÐ VÐ VÐ VÐ VÐ VØ NÐ NÐ NÐ NÐ NÐ NØ FÐ FÐ FÐ FÐ FÐ Fð „ðð ð ñ „ðð|<ð |<ð |<ð |<ð |<ñ |<ô |<ð |<ð~:.ð :.ð :.ð :.ð :.ñ :.ô :.ð :.ðz8%ð 8%ð 8%ð 8%ð 8%ñ 8%ô 8%ð 8%ðvBcð Bcð Bcð Bcð Bcñ Bcô Bcð Bcð Bcð Bcr?   