
    N3Lj@                       d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
mZ ddlmZmZ  e	e      j!                         j"                  d   Zed	z  Zed
z  Zedz  Zd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'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)-a  Build a selector-root opcode matrix for selected-root related handlers.

`selected_root_live_writer_frontier_review` grounds the VM primitives:
selector-byte writer 0x4f and selectedRoot opcodes 0x07/0x08/0x09.  This pass
does not re-prove those handlers.  It scans every known selector root and asks:

* which roots contain the selector-byte writer opcode 0x4f in the byte-writing
  mode,
* whether opcode 0x07 ever selects an exact selector-root start,
* whether opcode 0x09 ever stores an exact selector-root start or crosses into
  another root,
* whether any source/predecessor route roots select the current 2:0 route root.

The strict distinction matters: many dwords have low byte 0x07/0x08/0x09/0x4f
as data, so only exact-root targets are allowed to promote route proof.
    )annotationsN)Counter)Path)Any)read_sectionsva_to_offset   zHwanse2.exeoutwebz0:0z1:0z2:0c                V    t        j                  | dd      S t        |       d      S )N T)quote)htmlescapestrvalues    1tools/build_selected_root_opcode_matrix_review.pyhr   (   s%    ;;U]r$GGE
$GG    c                    | dS d| dS )Nr   0x08x r   s    r   hxr   ,   s    24bs$44r   c                b    | sy| j                  d      xs g }dj                  d |D              S )Nr   selectorKeys,c              3  2   K   | ]  }t        |        y w)Nr   .0items     r   	<genexpr>zselector_key.<locals>.<genexpr>4   s     /$CI/s   )getjoincontextkeyss     r   selector_keyr*   0   s0    ;;~&,"D88/$///r   c                V    | sy| j                  d      xs g }|rt        |d         S dS )Nr   r   r   )r%   r   r'   s     r   primary_selectorr,   7   s0    ;;~&,"D3tAw<'R'r   c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   z<Ir   )r   lenstructunpack_from)exesectionsvaoffs       r   dword_atr6   >   s?    
x
$C
{cAgC(dC-a00r   c                x    	 | j                  dd      \  }}t        |      t        |      fS # t        $ r Y yw xY w)N:r	   )NN)splitint
ValueError)selectorgroupslots      r   selector_group_slotr?   E   s@    nnS!,t5z3t9$$ s   *- 	99c            
        t        j                  t        dz  j                  d            } g }| j	                  d      xs g D ]  }t        |j	                  d      t              rt        |j	                  d      t              sB|j                  i |t        |d         t        |d         t        |      t        |      d        |j                  d 	       |S )
Nz#selector_root_structure_review.jsonutf-8encodingrootsrootVa
rangeEndVa)startendr<   primarySelectorc                    | d   S )NrG   r   )rows    r   <lambda>zroot_contexts.<locals>.<lambda>\   s
    #g, r   )key)jsonloadsOUT	read_textr%   
isinstancer:   appendr*   r,   sort)datacontextsrK   s      r   root_contextsrW   M   s    ::sBBMMW^M_`DHxx &B 
#''(+S1CGGLDY[^9_S]+3|,-(-#3C#8	

 MM.M/Or   c                F    |y | D ]  }|d   |cxk  r|d   k  s|c S   y )NrG   rH   r   )rV   r4   r(   s      r   context_for_varY   `   s>    	z 7r2GEN2N 3 r   c                    | syt        |       |k  rdj                  |       S dj                  | d |       dt        |       |z
   z   S )N-z, z +)r/   r&   )valueslimits     r   compactr^   i   sN    
6{eyy  99VFU^$CK%,?+@'AAAr   c                l   |dz	  dz  }|dk7  ry |dz	  dz   d|dz	  dz   }| d   }t        |      \  }}t        |      \  }}	||k(  rd}
n||k(  r|dk(  r|	d	k(  rd
}
n
||k(  rd}
nd}
dt        |      t        |      |||
| j                  d      xs g | j                  d      | j                  d      d	S )N      r	      r8      rI   self-selector-writerr   same-group-slot1-to-slot0-aliaszsame-group-other-slot-alias$cross-group-selector-write-candidatezopcode4f-selector-byte-writer	fieldMaps	rootVaHex	rootClass)	kindvaHexvalueHexr<   targetSelectorclassificationrg   rh   ri   )r?   r   r%   )r(   r4   r   modetargetsourcesource_groupsource_slottarget_grouptarget_slotrn   s              r   classify_opcode4frv   q   s    QJ$Dqy"$%Qt';&<=F&'F 3F ;L+ 3F ;L+/		%+*:{a?O:		%6?/BuI ([[-3[[-[[-
 
r   c                L   |dz	  dz  }|dvry |dk(  r|dz   nt        | ||dz         }t        ||      }	t        |	      }
dt        |      t        |      |d   |t        |      |
|||v ndt	        |
xr |
|d   k7        |j                  d	      xs g |j                  d
      dS )Nr`   ra   >   r   r	   r   r.   zopcode09-selected-root-storerI   Frg   rh   )rj   rk   rl   r<   ro   storedPointerHexstoredPointerSelectorstoredPointerIsExactRootstoredPointerCrossesRootrg   rh   )r6   rY   r,   r   boolr%   )r2   r3   rV   exact_root_startsr(   r4   r   ro   storedtarget_contexttarget_selectors              r   classify_opcode09r      s     QJ$D6qyR!VhsHb1f&EF#Hf5N&~6O.BuI-.vJ!0CICUF.?$?[`$()j_PWXiPj=j$k[[-3[[- r   c                   |dz	  dz  ry |dz	  dz  }t        | ||dz         }t        ||      }	|	sy |||dz  z   nd }
|
t        | ||
      nd }t        ||      }dt        |      t        |      |d   |t        |      t        |	      t        |
      t        |      t        |      |||v ndt	        |xr t        |      |d   k7        |j                  d	      xs g |j                  d
      dS )Nrb   i  r`   ra   r.   z/opcode07-selected-root-indexed-writer-candidaterI   Frg   rh   )rj   rk   rl   r<   indexoperandTableHexoperandTableSelectorselectedSlotHexselectedValueHexselectedValueSelectorselectedValueIsExactRootselectedValueCrossesRootrg   rh   )r6   rY   r   r,   r|   r%   )r2   r3   rV   r}   r(   r4   r   r   tabletable_contextselected_slotselected_valueselected_contexts                r   classify_opcode07r      s    	vaZ4ES(BF+E"8U3M).):EEAI%M?L?XXc8];^bN%h?ABuI-.e9 0 ?m,~.!12B!CKYKeN6G$Gkp$(a!12B!CwO`Ga!a%
 [[-3[[-! r   c                    t         j                         } t        |       }t               }|D ch c]  }t	        |d          }}g }g }g }d}t               }	|D ]  }
t        |
d   |
d   d      D ]  }t        | ||      }||dz  }|dvr|	d|dxx   d	z  cc<   |d
k(  r|d	z  }9|dk(  r"t        |
||      }|sN|j                  |       `|dk(  r&t        | ||||
||      }|sy|j                  |       |dk(  st        | ||||
||      }|s|j                  |         t        t        h}|D cg c]  }|d   |v r|d   r|d   t        k(  r| }}|D cg c]  }|d   |v r|d   r|d   t        k(  r| }}t        d |D              }t        d |D              }|D cg c]  }|d   dk(  s| }}|D cg c]
  }|d   s	| }}|D cg c]
  }|d   s	| }}|D cg c]
  }|d   s	| }}|D cg c]
  }|d   s	| }}i dt        |      dt        g |||D ch c]  }|d   	 c}      dt!        |	      dt        |      d|j#                  dd      d |j#                  d!d      d"t        |      d#t        |      d$t        |      d%t        |      d&t%        d' |D              d(|d)t        |      d*t!        |      d+t        |      d,t        |      d-t        |      t        |      d.d/d0}d1d2d3|g d4|||d d5 ||||d6g d7d8S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )9NrG   r   rH   r.   ra   >      r`   	   O   r   02xr	   r`   r   r   r   r<   r   r   rz   ry   c              3  &   K   | ]	  }|d      yw)rn   Nr   r"   rK   s     r   r$   zbuild_report.<locals>.<genexpr>  s     #ScC(8$9#Ss   c              3  8   K   | ]  }t        |d            yw)ro   Nr    r   s     r   r$   zbuild_report.<locals>.<genexpr>  s     "M3s6{#3"Ms   rn   rf   r   r{   selectorRootCount rootsWithSelectedRootOpcodeCountrh   lowByteCountsInRootRangesopcode4fMode1WriterCountopcode4fSelfWriterCountrd   opcode4fSlotAliasCountre   opcode4fCrossGroupCountopcode07CandidateCountopcode07ExactRootSelectCountopcode07CrossRangeSelectCount&opcode07CrossRangeExactRootSelectCountc              3  ,   K   | ]  }|d    s	d  yw)r   r	   Nr   r   s     r   r$   zbuild_report.<locals>.<genexpr>  s     5{C[^_y[za5{s   
opcode08LowByteConsumerCountopcode09CandidateCountopcode09ModeCountsopcode09ExactRootStoreCountopcode09CrossRangeStoreCount0sourceOrPredecessorToCurrentExactRootSelectCountFzGeneralized selector-root opcode scanning finds grounded 0x4f mode1 self/slot-alias writers, but no opcode 0x07 exact-root selection and no opcode 0x09 exact-root store. Source/predecessor roots still do not select or store the current 2:0 route root.)/sourceOrPredecessorToCurrentExactRootStoreCountrouteProducerPromoteddecisionz)hwanse-selected-root-opcode-matrix-reviewz1tools/build_selected_root_opcode_matrix_review.pyz1opcode-matrix-grounded-no-upstream-route-producer)zIOpcode 0x4f is counted as selector-byte writer only when stream[+1] == 1.zmOpcode 0x07 range hits are not promotion proof unless the selected value equals an exact selector-root start.z]Opcode 0x09 mode0 stores the continuation pointer; it is not a cross-root producer by itself.zEOpcode 0x08 consumes selectedRoot but does not identify who wrote it.(   )opcode07ExactRootSelectsopcode09ExactRootStores)zjFind a source/predecessor or higher-level root that writes selectedRoot to the current route root exactly.zeFind a live stream/root producer that reaches 0x00406dbb with selector 2:0 outside save/load restore.znFind a non-selector-only event/field dispatcher that chooses the current selector root during normal gameplay.)rj   rq   statussummarystrictInterpretationopcode4fRowsopcode07ExactRootRowsopcode07CrossRangeSamplesopcode09ExactRootRowsopcode09CrossRangeRows sourceOrPredecessorToCurrentRowsremainingProofs)EXE
read_bytesr   rW   r:   r   ranger6   rv   rS   r   r   SOURCE_SELECTORPREDECESSOR_SELECTORCURRENT_SELECTORr/   dictr%   sum)r2   r3   rV   rK   r}   opcode4f_rowsopcode09_rowsopcode07_rowsopcode08_countlow_byte_countsr(   r4   r   opcodesource_or_predecessorsource_current_root_selectssource_current_root_storesopcode4f_class_countsopcode09_mode_countscross_group_4fexact_opcode07cross_range_opcode07exact_opcode09cross_range_opcode09r   s                            r   build_reportr      s   
..
CS!HH6>?sS\*??*,M*,M*,MN$+IO .('%.!< 	.BS(B/E}T\F55b-.!3.~!#4'U;!((-4'XxART[]_afg!((-4'XxART[]_afg!((-+	..0 -.BC$#z?33*+'(,<< 	# # %"z?33*+'(,<< 	" " $#S]#SS""M}"MM%2vcc:J6KOu6ucvNv%2Vcc:T6UcVNV+8\CC@Z<[C\\%2Vcc:T6UcVNV+8\CC@Z<[C\\S]*C L]K]K]K K -
 	$T/%: 	#C$6 	"#8#<#<=SUV#W 	!"7";";<]_`"a 	"3~#6 	!#m"4 	'N(; 	(-A)B  	1#5{CW5{2{!" 	'#$ 	!#m"4%& 	d#78'( 	&s>':)* 	',@(A+, 	;C@[<\-. <??Y;Z!&`5GB <EE!
 &!/%9#2%>!/"6(C'A-

) k @B#" wV\V\
sS   L,9!L1 !L6+L;9L;
M M 
M#M-
M
8M

MM0Mc                n   | d   }d| d   fd|d   fd|d   fd|d   fd	|d
   fd|d   fd|d   fg}dj                  d |D              }dj                  d | d   D              }dj                  d | d   D              }d| dt        |d          ddj                  d | d   D               d| d| dS )Nr   r   rD   r   z
0x4f mode1r   z
0x4f aliasr   z0x07 exact rootr   z0x09 exact rootr   zroute producerr   r   c              3  X   K   | ]"  \  }}d t        |       dt        |       d $ yw)z<div class='card'><b>z
</b><span>z</span></div>Nr   )r"   kvs      r   r$   zrender_html.<locals>.<genexpr>S  s/     fX\XY[\/!vZ!v]Sfs   (*c              3  
  K   | ]{  }d t        |d          dt        |d          dt        |d          dt        |d          dt        |d	          d
t        t        |j                  d      xs g d             d } yw)<tr><td><code>rk   </code><br>rn   	</td><td>r<   z -> rm   z
<br><code>rl   </code></td><td>rg      
</td></tr>N)r   r^   r%   r   s     r   r$   zrender_html.<locals>.<genexpr>T  s       	s7|_%[37G3H1I0J KZ!"$q-=)>'?&@
1SQ[_K]J^ _-3Q789 :	s   BBr   c              3     K   | ]p  }d t        |d          dt        |d          dt        |d          dt        |d          dt        |d	          d
t        |d          dt        |d          d r yw)r   rk   z</code><br><code>rl   r   r<   z table r   z</td><td><code>r   r   r   r   r   r   Nr   r   s     r   r$   zrender_html.<locals>.<genexpr>\  s       	s7|_%%6qZ7I6J KZ!"'!C0F,G*H)I Js-./0AcBY>Z<[;\ ]/012 3		s   A6A8r   u  <!doctype html>
<meta charset="utf-8">
<title>Selected Root Opcode Matrix</title>
<style>
body{font-family:system-ui,sans-serif;background:#111;color:#eee;margin:24px auto;max-width:1280px;line-height:1.45}
code{color:#9bd4ff} .cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:16px 0}
.card{background:#1c2430;border:1px solid #344154;border-radius:8px;padding:10px} .card b{display:block;color:#a6b7cc} .card span{font-size:1.25rem}
table{border-collapse:collapse;width:100%;margin:12px 0 24px} th,td{border:1px solid #38465a;padding:7px 9px;vertical-align:top} th{background:#202a38}
.note{background:#181f2a;border-left:4px solid #8ab4ff;padding:10px 12px;margin:12px 0}
</style>
<h1>Selected Root Opcode Matrix</h1>
<p><a href="index.html">index</a> · <a href="selected_root_live_writer_frontier_review.html">selected root writer</a> · <a href="../out/selected_root_opcode_matrix_review.json">json</a></p>
<div class="cards">z</div>
<div class="note">r   z*</div>
<h2>Strict Interpretation</h2>
<ul>c              3  :   K   | ]  }d t        |       d  yw)z<li>z</li>Nr   r!   s     r   r$   zrender_html.<locals>.<genexpr>t  s     NttAdG9E"Ns   r   z</ul>
<h2>0x4f Mode1 Selector Writers</h2>
<table><thead><tr><th>address</th><th>selector</th><th>field maps</th></tr></thead><tbody>a  </tbody></table>
<h2>0x07 Cross-Range Samples</h2>
<p>These are range hits only. None select an exact selector-root start, so they are not route producer proof.</p>
<table><thead><tr><th>address</th><th>source/table</th><th>selected value</th><th>exact root?</th></tr></thead><tbody>z</tbody></table>
</html>)r&   r   )reportr   cards	card_htmlr   cross07_rowss         r   render_htmlr   H  sE   YG	6(#$	'-./	w9:;	w789	G$BCD	G$ABC	7#:;<E f`effIGG  .) M 77  56 L ; WZ()* +WWNv6L/MNNO P[[hZi jw xD  wE E) r   c                     t               } t        dz  j                  t        j                  | dd      dz   d       t
        dz  j                  t        |       d       t        d	       y )
Nz'selected_root_opcode_matrix_review.jsonF   )ensure_asciiindent
rA   rB   z'selected_root_opcode_matrix_review.htmlzselected root opcode matrix ok)r   rP   
write_textrN   dumpsWEBr   print)r   s    r   mainr   }  se    ^F44@@

6a84? A  	44@@VAT_f@g	
*+r   __main__)r   r   returnr   )r   
int | Noner   r   )r(   dict[str, Any] | Noner   r   )r2   bytesr3   list[dict[str, Any]]r4   r:   r   r   )r<   r   r   ztuple[int | None, int | None])r   r   )rV   r   r4   r   r   r   )r`   )r\   z	list[str]r]   r:   r   r   )r(   dict[str, Any]r4   r:   r   r:   r   r   )r2   r   r3   r   rV   r   r}   zset[int]r(   r   r4   r:   r   r:   r   r   )r   r   )r   r   r   r   )r   None))__doc__
__future__r   r   rN   r0   collectionsr   pathlibr   typingr   probe_exe_scene_tablesr   r   __file__resolveparentsROOTr   rP   r   r   r   r   r   r   r*   r,   r6   r?   rW   rY   r^   rv   r   r   r   r   r   __name__r   r   r   <module>r     sm    #       > H~''*
]
Ul
Ul  H50(1&B:	" #  	
  	  <$	$"$ #$  	$
 $ 	$ $ $Nrj2j, zF r   