
    IjWL              
      H   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	 ddl
mZ ej                  j                  d e e	e      j!                         j"                               ddlmZmZ ddlmZmZ  e	e      j!                         j0                  d   Zed	z  Zd
ZdZdZdZdZddddZ edddddedddddedddddiZ!d1dZ"d2dZ#d3dZ$d4d Z%d5d!Z&d6d"Z'd6d#Z(d7d$Z)d5d%Z*d8d&Z+d8d'Z,d9d(Z-d:d;d)Z.d<d*Z/d=d+Z0d>d,Z1d>d-Z2d:d?d.Z3d@d/Z4e5d0k(  r e4        yy)AzOSummarize selected-pointer opcode 0x07/0x08/0x09 paths in route selector roots.    )annotationsN)Path)Any)read_sectionsva_to_offset)handler_for_opcodesection_name_for_va   outmap1_01amap2_02dz0:0z1:0z2:0i@ iɭ@ i@ )      	   zsource-side confirmed selectoriP ip5P )rolerootstartendz target-side predecessor selectoridG iEH zcurrent merge/frontier selectoriT ix5T c                    d| dS )N0x08x )values    R/home/exedev/hwanse/tools/summarize_save_selector_selected_pointer_opcode_paths.pyhex32r   8   s    c{    c                4    t        |        dt        |       S )Nz..)r   )r   r   s     r   	range_hexr   <   s    El^2eCj\**r   c                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     r   	load_jsonr)   @   s*    ;;=::dnngn677r   c                |    |y t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   z<Ir   )r   lenstructunpack_from)exesectionsvaoffsets       r   dword_atr3   F   sG    	z(B'F~!c#h.dC033r   c                    |j                  dd      \  }}t        |      t        |      t        fd| D        i       S )N:r
   c              3  r   K   | ].  }|j                  d       k(  r|j                  d      k(  r| 0 yw)groupslotNget).0rowr7   r8   s     r   	<genexpr>zselector_row.<locals>.<genexpr>T   s9      	
www5(SWWV_-D 	
s   47)splitintnext)	selectorslabel
group_text	slot_textr7   r8   s       @@r   selector_rowrE   O   sI    !KKQ/J	
OEy>D	
$	
 	 r   c                p    | y t         j                         D ]  \  }}|d   | cxk  r|d   k  s|c S   y )Nr   r   CONTEXT_RANGESitemsr   rB   r<   s      r   context_for_valuerK   \   sJ    }$**, 
sw<5-3u:-L . r   c                Z    | y t         j                         D ]  \  }}| |d   k(  s|c S  y )Nr   rG   rJ   s      r   exact_root_for_valuerM   e   s<    }$**, 
sCKL r   c                    |ddiS t        |      }t        |      }|rd|dS |rd|dS t        | |      }|rd|dS |dz	  d	k  r|d
z  dk  rddiS ddiS )Nkind
unreadablezselector-root)rO   selectorzselector-rangepointer)rO   section   i   i  i   zscript-scalar-or-pairscalar)rK   rM   r	   )r0   r   contextr   rS   s        r   classify_valuerW   n   s    }%%&G&D'T::(g>>!(E2G!g6656>g"=/00Hr   c                    t        | |      }t        |   }||d   t        |d         t        |d   |d         |j	                  d      xs g dS )Nr   r   r   r   	fieldMaps)rQ   r   rootHexrangeHexrY   )rE   rH   r   r   r:   )rA   rB   r<   rV   s       r   context_summaryr\      s\    
y%
(CU#G)gg.?WW[)/R r   c           
     6   |dz	  dz  }t        | ||dz         }|||dz  z   nd }t        | ||      }t        ||      }||t        |      nd t        ||      |t        |      nd |t        |      nd ||t        t           d   k(  t        |      t        k(  dS )Nr      r+   r   )indexoperandTableHexoperandTableClassselectedSlotHexselectedValueHexselectedValueClassselectedCurrentRootselectedCurrentRange)r3   rW   r   rH   CURRENT_SELECTORrK   )	r/   r0   r1   r   r_   tableselected_slotselected_valueselected_classs	            r   decode_opcode07rl      s    aZ4ES(BF+E).):EEAI%Mc8];N#Hn=N+0+<5<$+He<3@3L5/RV5C5OE.1UY,-@P1QRX1YY 1. AEU U	 	r   c           	         |dz	  dz  }|dk(  r|dz   }d}n|dk(  rt        | ||dz         }d}nd }d}|d	|d
||t        |      nd t        ||      |t        t           d   k(  t        |      t        k(  dS )Nr   r^   r   r+   znext-streamr
   zstream+4-pointerzunsupported-moder   02xr   )modemodeHexstoredPointerSourcestoredPointerHexstoredPointerClassstoresCurrentRootstoresCurrentRange)r3   r   rW   rH   rg   rK   )r/   r0   r1   r   ro   storedstored_sources          r   decode_opcode09rx      s    QJ$Dqya%	#xa0**Sz?,-3-?E&MT,Xv>#~6F'G'OO/7;KK r   c                   t            }g }t        |d   |d   d      D ]  }t        | ||      }||dz  }|t        vr"t	        | ||      }t        |      t        |      d|d|j                  d      |j                  d      t        |   k(  d	d
}	|dk(  r1|	j                  t        | |||             t        k7  xr |	d   |	d<   nO|dk(  r|	j                  ddd       n5|dk(  r0|	j                  t        | |||             t        k7  xr |	d   |	d<   |j                  |	        |D 	cg c]  }	|	d   dk(  s|	 }
}	|D 	cg c]  }	|	d   dk(  s|	 }}	|D 	cg c]  }	|	d   dk(  s|	 }}	|D 	cg c]  }	|	j                  d      dk(  s|	 }}	|D 	cg c]  }	|	j                  d      dk(  s|	 }}	|d   t        |d   |d         t        |
      t        |      t        |      t        |      t        |      t        d |
D              t        d |
D              t        d |D              t        d |D              t        fd |D              t        d! |D              |d"S c c}	w c c}	w c c}	w c c}	w c c}	w )#Nr   r   r+   r^   r   rn   handlerVaHex	handlerVaF)rQ   vaHexvalueHex	opcodeHexrz   validHandlerroutePromotionCandidater   rf   r   r   zNactivates 0x0059de30 if it is nonzero; static target depends on runtime globalT)meaningrequiresRuntimeSelectedPointerr   ru   r~   0x070x080x09ro   r   r
   r   c              3  D   K   | ]  }|j                  d       sd  yw)re   r
   Nr9   r;   r<   s     r   r=   zscan_context.<locals>.<genexpr>   s     .lSSWWUjMkq.l     c              3  D   K   | ]  }|j                  d       sd  yw)rf   r
   Nr9   r   s     r   r=   zscan_context.<locals>.<genexpr>   s     /nccggVlNm/nr   c              3  D   K   | ]  }|j                  d       sd  yw)rt   r
   Nr9   r   s     r   r=   zscan_context.<locals>.<genexpr>   s     -iCCGGTgLha-ir   c              3  D   K   | ]  }|j                  d       sd  yw)ru   r
   Nr9   r   s     r   r=   zscan_context.<locals>.<genexpr>   s     .kSSWWUiMjq.kr   c              3     K   | ]5  }t        |j                  d       rt        |d    d      nd      k(  s2d 7 yw)rr   rT   Nr
   )rK   r:   r?   )r;   r<   rB   s     r   r=   zscan_context.<locals>.<genexpr>   sF      +IZ038J0KC&',QUJ
J1 +s   3>>c              3  D   K   | ]  }|j                  d       sd  yw)r   r
   Nr9   r   s     r   r=   zscan_context.<locals>.<genexpr>   s     +d#IbAcA+dr   )rQ   r   r[   opcode07Countopcode08Countopcode09Countopcode09Mode0Countopcode09Mode1Countopcode07SelectsCurrentRootCount opcode07SelectsCurrentRangeCountopcode09StoresCurrentRootCountopcode09StoresCurrentRangeCountopcode09StoresOwnRangeCountroutePromotionCandidateCountrows)rH   ranger3   OPCODE_HANDLERSr   r   r:   updaterl   rg   rx   appendr   r,   sum)r/   r0   rB   rV   r   r1   r   opcodehandlerr<   opcode07_rowsopcode08_rowsopcode09_rowsopcode09_mode0_rowsopcode09_mode1_rowss     `            r   scan_contextr      s   U#GDGG$gena8 h+=($S(F;2YefS\*#KK7#KK48OO',
 T>JJsHb%@A-26F-F-f3OeKfC)*t^JJk26  t^JJsHb%@A-26F-F-d3OcKdC)*C9: %)GSC,<,FSGMG$(GSC,<,FSGMG$(GSC,<,FSGMG*7P33776?a;O3PP*7P33776?a;O3PPgg.?]+]+]+!"56!"56+..lM.l+l,//n]/n,n*--i=-i*i+..kM.k+k'* + + ( ),+d+d(d#  HGGPPs<   4I4I4I9I9$I>2I><JJ J:Jc                   t        |       }||nt        t        dz  g       }t        t        t
        g}|D cg c]  }t        ||       }}|D cg c]  }t        | ||       }}|D cg c]  }|d   t
        k7  s| }}t        d |D              }	t        d |D              }
t        d |D              }t        d |D              }d}t        t        t        t        t
        ||||
|	|d   d	d
g d|dS c c}w c c}w c c}w )Nsave_scene_selectors.jsonrQ   c              3  2   K   | ]  }|d    |d   z     yw)r   r   Nr   r   s     r   r=   z build_summary.<locals>.<genexpr>   s)      5 	./#6W2XX5   c              3  2   K   | ]  }|d    |d   z     yw)r   r   Nr   r   s     r   r=   z build_summary.<locals>.<genexpr>   s)      3 	-.5U1VV3r   c              3  &   K   | ]	  }|d      yw)r   Nr   r   s     r   r=   z build_summary.<locals>.<genexpr>   s     .as?/C.a   c              3  :   K   | ]  }|d    t         k(  s|  yw)rQ   N)rg   r   s     r   r=   z build_summary.<locals>.<genexpr>   s     TJCS0STs   a]  The source-side 0:0 and target-side 1:0 roots contain opcode 0x08 activators, but their local opcode 0x07/0x09 selected-pointer writers never select or store the current 2:0 root/range. All opcode 0x09 rows in those non-current roots are mode 0 next-stream stores back into their own root windows. Current 2:0 has its own mode 0 continuation stores, but those only preserve internal current-root streams. Therefore the static selected-pointer opcode paths do not prove a 0:0/1:0 -> 2:0 runtime jump; promotion still requires a selector 2:0 save, selected-pointer runtime trace, or strict map1_01a hotspot.r   Fblocked)zIcapture a selector 2:0 gameplay savedat or selected-pointer runtime tracezFprove opcode 0x08 activates 0x0059de30 == 0x00540714 on the route pathz3find a strict map1_01a source coordinate or hotspot)sourcetargetsourceSelectorpredecessorSelectorcurrentSelectorcontextscontextScans)sourceOrPredecessorOpcode08ActivatorCount)sourceOrPredecessorCurrentRootWriterCount*sourceOrPredecessorCurrentRangeWriterCount!currentInternalOpcode09StoreCount&selectedPointerOpcodePathPromotesRoutepromotionStatusremainingProofs
conclusion)r   r)   OUTSOURCE_SELECTORPREDECESSOR_SELECTORrg   r\   r   r   r@   SOURCETARGET)r/   rA   r0   labelsrB   r   scansr<   non_current_scans*source_or_predecessor_current_target_count(source_or_predecessor_current_root_count$source_or_predecessor_opcode08_countcurrent_scanr   s                 r   build_summaryr      s:   S!H&2		#HcBceg8hI35EFF?EFe	51FHF=CDE\#x/DED(-UZDT1TUU14 5$5 2. 03 3$3 0, ,/.aO`.a+a(TuTTL	[  )3+5Y5]6`-9:[-\27$

 !' + GDUs   C8C=+D=Dc                f    d| d    d| d    d| d    d| d    d	| d
    d| d    d| d    d| d    S )Nzop7=r   z op8=r   z op9=r   z mode0=r   z mode1=r   z selectCurrent=r   z storeCurrent=r   z promoteCandidates=r   r   )r<   s    r   
scan_briefr     s    
s?#$E#o*>)?uSEYDZ [)*+737K3L2M N?@A B=>? @ !?@A		Cr   c                    g }| d   D ]  }|j                  d      r|j                  |       &|j                  d      dk(  r|j                  |       L|j                  d      dk(  sat        |      dk  sp|j                  |        |d d S )Nr   r   r~   r   r   
   (   )r:   r   r,   )scanr   r<   s      r   interesting_rowsr   '  s    DF| 77,-KKWW[!V+KKWW[!V+D	BKK 9r   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g}| d   D ]2  }|j                  d|d     d!|d"    d#|d$    d!t        |       d%	       4 |j                  g d&       d'}| d   D ]  }t        |      D ]  }d(}|j	                  d)      xs |j	                  d*      xs d+}|j	                  d,      xs |j	                  d-      xs i }|j	                  d.      xs |j	                  d/      xs d+}|j	                  d       }|r| d0| }|j                  d|d     d1|d2    d1|d3    d1|d4    d1| d!| d5|j	                  d6       d%         |s|j                  d7       |j                  g d8       |j                  d9 | d:   D               |j                  d       d;j                  |      S )<Nz-# Save Selector Selected-Pointer Opcode Paths z	- route: r   z -> r   z- selectors: source `r   z`, predecessor `r   z`, current `r   `z-- source/predecessor opcode 0x08 activators: r   z+- source/predecessor current-root writers: r   z,- source/predecessor current-range writers: r   z'- current internal opcode 0x09 stores: r   z/- selected-pointer opcode path promotes route: r   z- promotion status: `r   r   z## Context Countsz$| selector | role | range | counts |z| --- | --- | --- | --- |r   z| `rQ   z` | r   z | `r[   z |)r   z## Route-Relevant Rowsr   zY| selector | va | opcode | value | selected/stored pointer | kind | promotion candidate |z+| --- | --- | --- | --- | --- | --- | --- |FTrc   rr   -rd   rs   rO   r    z` | `r|   r~   r}   z | r   z| - | - | - | - | - | - | - |)r   z## Remaining Proofsr   c              3  &   K   | ]	  }d |   yw)z- Nr   r;   items     r   r=   zmarkdown.<locals>.<genexpr>c  s     D2dVDr   r   
)r   r   extendr   r:   join)	summarylinesr   any_rowsr<   pointer_hexpointer_classrO   rQ   s	            r   markdownr   3  s   7

GH%&d78+<*=>
(8 9::J7ShKiJjjvw~  @Q  xR  wS  ST  	U
7@k8l7mn
5g>i6j5kl
6w?k7l6mn
1':]2^1_`
9'Bj:k9lm
(9 :;1=


.##E& ' 
$z"#4V~T$z:J9K4PZ[_P`Oaacd	

 
LL   H' #D) 	CH''"45[AS9T[X[KGG$89`SWWEY=Z`^`M $$V,I	0BIcD$((4Hq
+LLd:&'uS\N%K@P?QQVWZ[eWfVg h=TF#cgg6O.P-QQSU	 45	LL01	LLD1B)CDD	LL99Ur   c           !        dj                  d | d   D              }g }| d   D ][  }t        |      D ]I  }|j                  d      xs |j                  d      xs d}|j                  d      xs |j                  d      xs i }|j                  d	      xs |j                  d
      xs d}|j                  d      }|r| d| }|j                  dt	        j
                  |d          dt	        j
                  |d          dt	        j
                  |d          dt	        j
                  |d          dt	        j
                  |       dt	        j
                  |       d|j                  d       d       L ^ 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*t	        j
                  | d+          d,t	        j
                  | d-          d.| d/    d0| d1    d2t	        j
                  | d3          d4d5| d6    d7| d8    d.| d/    d9| d:    d;	d<t	        j
                  | d=          d>d?d@|dAdBdCdj                  |      dAdD|	 dEdFg      S )GNr   c              3     K   | ]q  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  t        |             d	 s yw)<tr><td><code>rQ   </code></td><td>r   z</td><td><code>r[   
</td></tr>N)htmlescaper   )r;   r   s     r   r=   zhtml_page.<locals>.<genexpr>i  s       	[[j!123 4{{4<() *[[j!123 4{{:d+,- .		s   A7A9r   rc   rr   r   rd   rs   rO   r   rQ   r   r   z</code></td><td><code>r|   r~   r}   r   z	</td><td>r   r   r   c              3  N   K   | ]  }d t        j                  |       d  yw)z<li>z</li>N)r   r   r   s     r   r=   zhtml_page.<locals>.<genexpr>  s#     \tDKK-.e4\s   #%r   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z<  <title>Save Selector Selected-Pointer Opcode Paths</title>z	  <style>zg    :root { color-scheme: dark; font-family: system-ui, sans-serif; background: #101010; color: #eee; }z&    body { margin: 0; padding: 24px; }z[    table { width: 100%; border-collapse: collapse; margin: 12px 0 20px; font-size: 13px; }zi    th, td { border-bottom: 1px solid #303030; padding: 7px 8px; text-align: left; vertical-align: top; }z,    th { background: #181818; color: #ddd; }z    code { color: #d7f0ff; }z
  </style>z</head>z<body>z6  <h1>Save Selector Selected-Pointer Opcode Paths</h1>z  <p>route r   z -&gt; r   z+; source/predecessor current-range writers r   z.; selected-pointer opcode path promotes route r   z; promotion status <code>r   z</code>.</p>z/  <p>source/predecessor opcode 0x08 activators r   z*; source/predecessor current-root writers r   z&; current internal opcode 0x09 stores r   z.</p>z  <p>r   z</p>z  <h2>Context Counts</h2>zc  <table><thead><tr><th>selector</th><th>role</th><th>range</th><th>counts</th></tr></thead><tbody>z  </tbody></table>z  <h2>Route-Relevant Rows</h2>z  <table><thead><tr><th>selector</th><th>va</th><th>opcode</th><th>value</th><th>selected/stored pointer</th><th>kind</th><th>promotion candidate</th></tr></thead><tbody>z  <h2>Remaining Proofs</h2><ul>z</ul>z</body></html>)r   r   r:   r   r   r   )
r   
count_rows
route_rowsr   r<   r   r   rO   rQ   proofss
             r   	html_pager   h  s     N+ J J' #D) 	C''"45[AS9T[X[KGG$89`SWWEY=Z`^`M $$V,I	0BIcD$((4Hq
+![[j)9:; <![[W67 8![[[)9:; <![[Z9: ;![[56 7{{4() *ww89: ;
	& WW\IZA[\\F99"PFq0es6&@
dkk'("345WT[[QYIZ=[<\  ]H  IP  Q}  I~  H  m  nu  v^  n_  m`  `y  z~  zE  zE  FM  N_  F`  za  yb  bn  	o
9'Bm:n9o  pZ  [b  cN  [O  ZP  P{  |C  Dp  |q  {r  rX  Y`  aD  YE  XF  FK  	L
GL12348#m( 	u


)&7=  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |:|j                  j                  dd       |j                  t        |       d	       y y )
NT)parentsexist_ok0save_selector_selected_pointer_opcode_paths.jsonF),r5   )ensure_ascii
separatorsr   r    r!   )mkdir
write_textr$   dumpsparentr   )r   out_dirhtml_outs      r   write_outputsr     s    MM$M.AAMM

7:FM N  dT:Ig.A r   c                    t        j                         } | j                  dt        t        dz         | j                  dt        t
        dz         | j                  dt        t
               | j                  dt        d d	       | j                         }t        |j                  j                         t        |j                  g             }t        ||j                  |j                         t        d
|j                  dz          y )Nz--exezHwanse2.exe)typedefaultz--selectorsr   z	--out-dirz
--html-outz!Optional HTML report output path.)r   r   helpz5wrote save selector selected-pointer opcode paths -> r   )argparseArgumentParseradd_argumentr   ROOTr   
parse_argsr   r/   
read_bytesr)   rA   r   r   r   print)parserargsr   s      r   mainr    s    $$&F
dD=4HI
D#@[:[\
$<
4DghD$.."%G '4<<7	A$,,  RD  CD  BE  F  Gr   __main__)r   r?   returnstr)r   r?   r   r?   r  r  )r'   r   r(   r   r  r   )r/   bytesr0   
list[dict]r1   
int | Noner  r  )rA   r  rB   r  r  dict)r   r  r  z
str | None)r0   r  r   r  r  r  )
r/   r  r0   r  r1   r?   r   r?   r  r  )r/   r  r0   r  rB   r  r  r  )N)r/   r  rA   zlist[dict] | Noner  r  )r<   r  r  r  )r   r  r  r  )r   r  r  r  )r   r  r   r   r   zPath | Noner  None)r  r  )6__doc__
__future__r   r  r   r$   r-   syspathlibr   typingr   r'   insertr  __file__resolver   probe_exe_scene_tablesr   r   summarize_script_handler_tabler   r	   r   r  r   r   r   r   r   rg   r   rH   r   r   r)   r3   rE   rK   rM   rW   r\   rl   rx   r   r   r   r   r   r   r   r  __name__r   r   r   <module>r     sg   U "     
   3tH~--/667 8 > R H~''*
Ul		   

 0	 2	 1	,+84
"	$,7t-`	2j>BBG zF r   