
    UHj3                       d 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	 ej                  j                  d e e	e      j                         j                               ddlmZmZ  e	e      j                         j&                  d   Zedz  ZdZd	Zd
ZdZdZg dZg dZh dZddZddZddZ ddZ!dd dZ"d!dZ#d"dZ$d#dZ%d#dZ&d$dZ'd%dZ(e)dk(  r e(        yy)&z;Classify the only exact map1_01a right-exit coordinate hit.    )annotationsN)Path)read_sectionsva_to_offset   outmap1_01amap2_02dright"      )zstrict-source-coordinate-ownerzsource-field-map-ownerztext-or-code-reference-to-hitztarget-map-control-path)zKpacked coordinate hit owned by a map1_01a field-map or strict event contextzPowner selector containing field maps instead of only character/resource CNS dataz?text/code reference tying the coordinate hit to route executionz0control path from the coordinate hit to map2_02d>   r   r                              r             !   r   #   $   c                    d| dS )N0x08x values    G/home/exedev/hwanse/tools/summarize_map1_01a_exit_coordinate_context.pyhex32r$   =       c{    c                    d| dS )Nr   02xr    r!   s    r#   hex8r)   A   r%   r&   c                L    | j                  d       d| j                  d       S )Ngroup:slot)get)rows    r#   selector_keyr0   E   s&    gggq 122r&   c                b   t        t        |       D cg c]-  \  }}t        |j                  d      t              s&|d   ||f/ c}}d       }t        |      D ]K  \  }\  }}}|dz   t        |      k  r||dz      d   n|dz   }||cxk  r|k  s7n :i |dt        |      ic S  y c c}}w )NselectedPointerc                    | d   | d   fS )Nr   r   r    )items    r#   <lambda>z owner_selector.<locals>.<lambda>L   s    $q'47+ r&   )keyr   r   i @  
rootEndHex)sorted	enumerate
isinstancer.   intlenr$   )	selectorsvaindexr/   rootsroot_ends           r#   owner_selectorrD   I   s    @I)@T  	E*%Xbcfcjcjk|c}  @C  YD#
 %	-  	E+E "+5!1 5~a%*QYU%;eEAIq!24c4<s445  	Es
   'B+

B+
c                   g }||dz  z
  }||dz   dz  z   }t        ||d      D ]  }t        ||      }	|	|	dz   t        |       kD  r#t        j                  d| |	      d   }
|
dz  }|
dz	  dz  }|
dz  }|j                  t        |      t        |
      ||gt        |      ||k(  |t        v d|
cxk  xr d	k  nc d
        |S )N   r   z<Ir   i  r      i  @ i  ` )vaHexvalueHexu16lowOpcodeHexisHitscriptLikeLowOpcodepointerLike)	ranger   r<   structunpack_fromappendr$   r)   SCRIPT_LIKE_LOW_OPCODES)exesections	center_vabeforeafterrowsstartrC   r>   offsetr"   lohi
low_opcodes                 r#   dword_contextr_   U   s    D
"E
uqyAo
%CE3" h+>VaZ#c(2""4f5a8V^rkV#T\
2Ye8 ,9_#-1H#H%<*<
 	" Kr&   c                L   | j                  d      xs g D ]  }|j                  d      t        k(  s|j                  d      t        k(  s5|j                  d      t        k(  sN|j                  d      t        k(  sg|j                  d      t
        k(  s|c S  t        d      )NrY   sourcetargetsidexyz,map1_01a right-exit coordinate row not found)r.   SOURCETARGETSIDEXY
ValueError)coordinate_refsr/   s     r#   find_right_exit_rowrm   m   s    ""6*0b GGH'!V+4'!!J C
DDr&   c                   t        |       }t        |      }|j                  d      xs i j                  d      xs i }|j                  d      xs g }t        |      dk7  rt	        d      |d   }t        |d   d      }t        ||      }	t        | ||      }
t        d	 |
D              }t        d
 |
D              }|
D cg c]
  }|d   s	| }}|	r |	j                  d      s|d   dk(  r|dk\  rdnd}d}dg dddg dddg ddg}i dt        dt        dt        dt        t        dd|j                  d       d!|j                  d"      d#|j                  d$      d%|j                  d      d&|j                  d'      d(t        |j                  d)            d*t        |j                  d+      xs g       d,|	rt!        |	      nd d-|	r|	j                  d.      nd d/|	r|	j                  d0      nd d1|	r|	j                  d      ng d2|	r|	j                  d3      ng d4|d   |t        |      |d5d5t"        t$        |t        |      d5d6|
g d7|d8S c c}w )9NpackedScansxysamplesr   z6expected exactly one xy sample for map1_01a right exitr   rH   r   c              3  ,   K   | ]  }|d    s	|  yw)rL   Nr    .0r/   s     r#   	<genexpr>z build_summary.<locals>.<genexpr>   s     :3S\3:   
c              3  ,   K   | ]  }|d    s	d  yw)rM   r   Nr    rs   s     r#   ru   z build_summary.<locals>.<genexpr>   s     Sc<Q8RSrv   rN   	fieldMapsrK   0x22
   zsave-selector-script-wordz!unclassified-coordinate-like-dataa  The only exact xy hit for map1_01a right exit 34,19 is at 0x004f9460, but its low byte is opcode-like 0x22 inside selector 24:0/root 0x004f8dd8. That owner has no field maps and only links cara_at1.cns, and the surrounding words are save-selector-script-like opcodes and local pointers. This hit is therefore not a strict map1_01a coordinate table and must not promote map1_01a->map2_02d.Hwanse2.exe)z0x004f9460 packed xy hitz0x004f8dd8 owner selector rootz"0x00130022 packed coordinate value)pathfieldsz!out/map_exit_coordinate_refs.json)rY   zpackedScans.xy.samplespromotionPolicyzout/save_scene_selectors.json)r2   rx   	linkedCnsra   rb   rc   tile)rd   re   xyPackedHexrI   
xyHitCounttotalxyAlignedHitCountalignedTotalhitVaHex
hitSectionsectionhitHasTextRefstextRefsToWindowhitDataRefCountdataRefsToWindowownerSelectorownerRootHexselectedPointerHexownerRootEndHexr7   ownerFieldMapsownerLinkedCnsr   hitLowOpcodeHexFblocked)z5find a strict map1_01a event/hotspot coordinate tablez=find a code path that ties a map1_01a source tile to map2_02dz+keep geometry-only exits in trial mode only)scriptLikeNeighborCountpointerLikeNeighborCountclassification
proofFoundexitCoordinateContextProofFound"failedExitCoordinateContextGateIdsmissingEvidenceevidenceRefsevidenceRefCount
promotablepromotionStatuscontextRowsremainingProofs
conclusion)r   rm   r.   r<   rk   r;   rD   r_   nextsumrf   rg   rh   ri   rj   boolr0   'FAILED_EXIT_COORDINATE_CONTEXT_GATE_IDSMISSING_EVIDENCE)rT   r=   rl   rU   
right_exitrp   rq   samplehit_vaownercontexthit_rowscript_like_neighborsr/   pointer_neighborsr   r   evidence_refss                     r#   build_summaryr   z   s   S!H$_5J
..
'
-2	2	24	8	>BBffY%2G
7|qQRRQZF"%F9f-EC62G:'::GSWSS(/F3}3EFF ;/GN4Kv4UZosuZu 	$0 	T  "	
 8	
 4	
#M4$&$&$ 	$ 	aa 	$
 	rvvj)$ 	bffWo$ 	RVVN3$ 	FJJw'$ 	fjj+$ 	$vzz*<=>$ 	3vzz*<=CD$ 	e,4$ 	5		"67d$ 	e599\2$ 	E%))K0r$  	E%))K0r!$" 	7>2#$$ $9$'(9$:(+0.U+%.$

 !G$ $M Gs   
I!I!c                @   ddd| d    d| d    dd| d	   d
    d| d	   d    d| d    dd| d    d| d    d| d    d| d    d| d    d| d    dd| d    d| d    d| d     dd!d"j                  | d#         xs d$ d%d"j                  | d&         xs d$ d'| d(    d)| d*    d+d"j                  | d,         xs d- d.t        | d/          d0| d1    d2| d3    d4| d5    d| d6   dd7dd8d9g}| d:   D ]J  }|j                  d;|d<    d=|d>    d?|d@   dA    d|d@   dB    dC|dD    d?|dE    dF|dG    dF|dH    dI       L |j                  g dJ       |j                  dK | dL   D               |j                  g dM       |j                  dN | d/   D               |j                  g dO       | dP   D ]B  }|j                  dQ|dR    dSd"j                  |j	                  dT      xs g       xs d-        D |j                  d       dUj                  |      S )VNz(# map1_01a Right Exit Coordinate Context z
- route: `ra   z -> rb   `z	- tile: `r   rd   ,re   z` side `rc   z- xy packed: `r   z` hits r   z	 aligned r   z- hit: `r   z` section `r   z` low opcode `r   z- owner selector: `r   z` root `r   z`..`r   z- owner field maps: , r   nonez- owner linked CNS: r   z- classification: r   z- proof found: r   z(- failed exit-coordinate context gates: r   -z- missing evidence count: r   z- evidence refs: r   z- promotable: r   z- promotion status: r   r   z## Context RowszD| va | value | u16 | low opcode | hit | script-like | pointer-like |z+| --- | --- | --- | --- | --- | --- | --- |r   z| `rH   z` | `rI   z` | rJ   r   r   z | `rK   rL   z | rM   rN   z |)r   z## Remaining Proofsr   c              3  &   K   | ]	  }d |   yw- Nr    rt   r4   s     r#   ru   zmarkdown.<locals>.<genexpr>        D2dVD   r   )r   z## Missing Evidencer   c              3  &   K   | ]	  }d |   ywr   r    r   s     r#   ru   zmarkdown.<locals>.<genexpr>   r   r   )r   z## Evidence Refsr   r   r   r|   z: r}   
)joinr<   rR   extendr.   )summarylinesr/   refs       r#   markdownr      s   2

WX&'tGH,=+>a@
GFOC()76?3+?*@QWHYYZ[
/08M7NiX_`sXtWuv
7:&'{7<3H2IX_`qXrWsstu
go67x@W?XX\]dev]w\xxyz
tyy1A)BCMvNO
tyy1A)BCMvNO
W%5678
',/01
2499WEi=j3k3ror2st
$S1B)C%D$EF
G$6789
./0
w'89:;


N5/E2 }% 
#g,uS_$5T#e*Q-#e*UV- YN#$DWc#>S:T9UUXY\]jYkXllnp	


 
LL01	LLD1B)CDD	LL01	LLD1B)CDD	LL-.~& Vr#f+b37783D3J)K)Rs(STUV	LL99Ur&   c                B   dj                  d | d   D              }dj                  d | d   D              }dj                  d | d   D              }dj                  d	 | d
   D              }dj                  dddd| d    d| d    d| d   d    d| d   d    d| d    dd| d    d| d    d| d    d | d!    d"| d#    d$t        j                  d%j                  | d&         xs d'       d(d)t        j                  | d*          d+| d,    d-t        j                  d%j                  | d.         xs d/       d0t        | d          d1| d2    d3| d4    d5t        j                  | d6          d7d8t        j                  | d9          d7d:|d;d<| d=d>| d=d?| d=g      S )@Nr   c              3     K   | ]v  }d t        j                  |d          dt        j                  |d          d|d   d    d|d   d    d	t        j                  |d
          d|d    d|d    d|d    d x yw)z<tr><td><code>rH   z</code></td><td><code>rI   z</code></td><td>rJ   r   r   r   z</td><td><code>rK   rL   z	</td><td>rM   rN   z
</td></tr>Nhtmlescapers   s     r#   ru   zhtml_page.<locals>.<genexpr>   s       	[[W./ 0[[Z12 35z!}oQs5z!}o .[[^!456 77|n ()* +=!" #	s   A<A>r   r   c              3  N   K   | ]  }d t        j                  |       d  ywz<li></li>Nr   r   s     r#   ru   zhtml_page.<locals>.<genexpr>  s#     \tDKK-.e4\   #%r   c              3  N   K   | ]  }d t        j                  |       d  ywr   r   r   s     r#   ru   zhtml_page.<locals>.<genexpr>  s#     ]$T[[./u5]r   r   c              3     K   | ]\  }d t        j                  |d          dt        j                  dj                  |j                  d      xs g       xs d       d ^ yw)z
<li><code>r|   z	</code>: r   r}   r   r   N)r   r   r   r.   )rt   r   s     r#   ru   zhtml_page.<locals>.<genexpr>  s_       T[[V-.iDIIcggV^N_NeceDfDmjm8n7ootus   A"A$r   zZ<!doctype html><meta charset="utf-8"><title>map1_01a Right Exit Coordinate Context</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1100px;margin:24px auto}table{border-collapse:collapse}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}</style>z/<h1>map1_01a Right Exit Coordinate Context</h1>z<p>Route <code>ra   z -&gt; rb   z</code>, tile <code>r   rd   r   re   z</code>, xy packed <code>r   z</code>.</p>z<p>Hit <code>r   z</code> low opcode <code>r   z</code>; owner selector <code>r   z</code> root <code>r   z</code>..<code>r   z</code>; owner field maps: r   r   r   z.</p>z<p>classification: r   z; proofFound: r   z$; failedExitCoordinateContextGates: r   r   z; missingEvidenceCount: z; evidenceRefs: r   z; promotable: r   z; promotion status: r   z</p>z<p>r   z<table><thead><tr><th>va</th><th>value</th><th>u16</th><th>low opcode</th><th>hit</th><th>script-like</th><th>pointer-like</th></tr></thead><tbody>z</tbody></table>z<h2>Remaining Proofs</h2><ul>z</ul>z<h2>Missing Evidence</h2><ul>z<h2>Evidence Refs</h2><ul>)r   r   r   r<   )r   rY   proofsmissingrefss        r#   	html_pager      s   99  =) D WW\IZA[\\Fgg]'J[B\]]G77 >* D 99f 	n9
'(+,GGH4E3FFZ[bci[jkn[oZppqry  {A  sB  CF  sG  rH  Ha  bi  jw  bx  ay  yE  	F

+,,EgN_F`Eaa  AH  IX  AY  @Z  Zm  nu  vD  nE  mF  FU  V]  ^o  Vp  Uq  qL  MQ  MX  MX  Y]  Yb  Yb  cj  k{  c|  Y}  YG  AG  MH  LI  IN  	O
dkk'2B*CDE^T[\hTiSj  kO  PT  P[  P[  \`  \e  \e  fm  nR  fS  \T  \[  X[  P\  O]  ]u  vy  zA  BS  zT  vU  uV  Vf  gn  oA  gB  fC  CQ  RY  Zf  Rg  Qh  h|  }A  }H  }H  IP  Qb  Ic  }d  |e  ei  	j
dkk',/016 	^
'xu5
'y6
$TF%0  r&   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok%map1_01a_exit_coordinate_context.jsonFr   )ensure_asciiindentr   utf-8encoding)mkdir
write_textjsondumps)r   out_dirs     r#   write_outputsr   "  sD    MM$M.66BB

7q9D@ C r&   c            	        t        j                         } | j                  dt        t        dz         | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  dt        t
               | j                         }t        |j                  j                         t        j                  |j                  j                  d	
            t        j                  |j                  j                  d	
                  }t        ||j                          t#        d|j                   dz          y )Nz--exer{   )typedefaultz--selectorszsave_scene_selectors.jsonz--coordinate-refszmap_exit_coordinate_refs.jsonz	--out-dirr   r   z*wrote map1_01a exit coordinate context -> r   )argparseArgumentParseradd_argumentr   ROOTOUT
parse_argsr   rT   
read_bytesr   loadsr=   	read_textrl   r   r   print)parserargsr   s      r#   mainr   *  s   $$&F
dD=4HI
D#@[:[\
+$Fe@ef
$<D

4>>++W+=>

4''1171CDG
 '4<<(	6t||Fm7m6n
opr&   __main__)r"   r;   returnstr)r/   dictr   r   )r=   
list[dict]r>   r;   r   zdict | None)r   r   )rT   bytesrU   r   rV   r;   rW   r;   rX   r;   r   r   )rl   r   r   r   )rT   r   r=   r   rl   r   r   r   )r   r   r   r   )r   r   r   r   r   None)r   r   )*__doc__
__future__r   r   r   r   rP   syspathlibr   r|   insertr   __file__resolveparentprobe_exe_scene_tablesr   r   r   r   r   rf   rg   rh   ri   rj   r   r   rS   r$   r)   r0   rD   r_   rm   r   r   r   r   r   __name__r    r&   r#   <module>r     s    A "     
  3tH~--/667 8 > H~''*
Ul		+ '  .3	0
EWt'T!Hq  zF r&   