
    ̩Lj&W                       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mZ ddlmZmZmZ dd	lmZmZmZmZmZ  e	e      j7                         j8                  d
   Zedz  Zedz  Zedz  Z dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*d'd(dZ+d)dZ,d*dZ-d+dZ.d,d-dZ/d.dZ0d/dZ1d0dZ2d1d Z3d2d!Z4d3d"Z5d4d#Z6d5d$Z7d6d%Z8e9d&k(  r e: e8             y)7a  Review selected-root/add-descriptor candidates for the normal HUD menu opener.

The descriptor stack is grounded and the previous frontier excluded direct
input/descriptor intersections as the normal-field ESC/X opener.  This pass
checks the next static frontier:

* Is the top menu object-construction sequence duplicated anywhere else?
* Do selected-root tables point at that sequence or at its exact region
  child initializers?
* Do runtime descriptor add commands (opcode 0x62) occur in a context that
  also reaches the top menu object sequence?

Promotion is intentionally strict.  A row is not considered an opener unless
it connects descriptor add/root selection to the exact #6/#3/#4 top-menu
construction sequence, not merely to a prompt/event stream.
    )annotationsN)Counter)Path)Any)is_asset_ascii_false_opcodemonotonic_u16_table_aroundscript_data_sections)offset_to_varead_sectionsva_to_offset)c_string_previewdecode_commanddecode_streamis_vasection_name_for   zHwanse2.exeoutwebilM iM iXM iM iHM iM 8-J s$      M (     XM (     M ( 	 s      XM (     M ( 	 s      HM (     M ( 	 c                    | dS d| d| dS )N-0x0x )valuewidths     5tools/build_hud_menu_selected_root_frontier_review.pyhxr   M   s#    -3;r%%z):%;;    c                V    t        j                  | dd      S t        |       d      S )N T)quote)htmlescapestr)r   s    r   hr'   Q   s%    ;;U]r$GGE
$GGr    c                   g }t        |      D ]u  }t        |d         }|t        |d         z   }| j                  |||      }|dk7  s;t        ||      }||j	                  |       | j                  ||dz   |      }|dk7  r;w |S )Nrawraw_sizer   )r	   intfindr
   append)	exesectionspatternhitssectionstartendposvas	            r   scan_patternr8   U   s    D'1 2GEN#c'*-..hhws+Rih,B~B((7C!GS1C	 Ri	2 Kr    c                    t        j                  d|      }g }| j                  |      }|dk7  r:t        ||      }||j	                  |       | j                  ||dz         }|dk7  r:|S )N<Ir+   r   )structpackr-   r
   r.   )r/   r0   r   needlerefsr6   r7   s          r   all_dword_refsr?   c   sl    [[u%FD
((6
C
)(C(>KKOhhvsQw'	 )
 Kr    c           
         t        ||      }|g S g }t        |      D ]K  }||dz  z   dz   t        |       kD  r |S |j                  t	        j
                  d| ||dz  z         d          M |S )N   r:   r   )r   rangelenr.   r;   unpack_from)r/   r0   table_va
max_valuesoffvaluesindexs          r   read_table_valuesrJ   o   s    
x
*C
{	Fz" I?QS)M 	f((sC%!)ODQGHI Mr    c                    |t        |      t        ||      t        ||      d}|d   rt        | ||      }|r||d<   |S )N)r   valueHexr3   isVarM   text)r   r   r   r   )r/   r0   r   rowrN   s        r   preview_valuerP   {   sO    uI#He4h&	C 6{Xu5CKJr    c                   g }t        |      D ]V  }t        |d         }|t        |d         z   }| j                  d||      }|dk7  s<t        ||      }|	 t	        | ||      }t        |t              r|j                  d      nd }	|j                  d      dk(  r|	rt        |	d   d	         }
t        | ||
d
      }t        |      }|j                  |t        |      |j                  d      |
t        |
      |d d D cg c]  }t        | ||       c}t        |v t        |v t!        t"        t$        t&        h|z        d	       | j                  d|dz   |      }|dk7  rY |S # t
        $ r i }Y w xY wc c}w )Nr)   r*      r+   pointerOperandsopcode   r   r   
   slot   )		commandVacommandVaHexrW   tableVa
tableVaHexvaluePreviewcontainsTopMenuSequence#containsTopMenuParentSelectedScriptcontainsExactTopRegionScriptr   )r	   r,   r-   r
   r   	Exception
isinstancedictgetrJ   setr.   r   rP   TOP_MENU_SEQUENCE_VA"TOP_MENU_PARENT_SELECTED_SCRIPT_VAboolTOP_MENU_REGION6_SCRIPT_VATOP_MENU_REGION3_SCRIPT_VATOP_MENU_REGION4_SCRIPT_VA)r/   r0   rowsr3   r4   r5   r6   r7   cmdpointer_operandsrE   rH   	value_setr   s                 r   scan_selected_root_storesrp      s   !#D'1 $2GEN#c'*-..hhws+Rih,B~(h;C BLCQUAV377+<#=\` 778$,1A"#3A#6w#?@H.sHhKF #FIKK)+,.rF$'GGFO'/*,X,^degfg^h,iUZ]3%-P,i7Ky7XCeirCr<@$>$>$>!"
 #,!,=( ((7C!GS1CA Ri	$2J K9 ! C -js   E*E<*E98E9c                   dt        ||      }|(| t        d|dz
        t        t        |       |dz          t        t        t        dt              dz
              D cg c]!  }t        j                  d||dz          d   # c}v ryt        fd	t        t        t        fD              ry
d|cxk  rdk  ry dv rdv ryt        fddD              ryyc c}w )Nr    r   `         r:   rA   top-menu-pointer-nearbyc              3  N   K   | ]  }t        j                  d |      v   yw)r:   N)r;   r<   ).0r   windows     r   	<genexpr>z'classify_add_context.<locals>.<genexpr>   s'       Q%6;;tU#v-  Qs   "%top-menu-region-script-nearbyr   i<J zintro-title-selected-root   /   zprompt/event-contextc              3  &   K   | ]  }|v  
 y w)Nr   )rw   byterx   s     r   ry   z'classify_add_context.<locals>.<genexpr>   s     
9d46>
9s   )d   f   r   zactive-object-motion-contextzgeneric-runtime-index-add)r   maxminrC   rf   rB   r;   unpackanyri   rj   rk   )r/   r0   r7   rG   rI   rx   s        @r   classify_add_contextr      s    F
x
$C
SC"H%s3s8S3Y'?@]bcfghjmntjuxyjycz]{|TYdF54K LQ O||(
  Q<VXr  uO  <P  Q  Q.R%:%* &&W.%

9&8
99-&  }s   "&Cc           
     N   ||dz  z
  }t        |dz
  d      }g }t        ||dz   d      D ]x  }t        ||      }||dz   t        |       kD  r#t	        j
                  d| |      d   }|j                  t        |      t        |      t        ||      t        ||      d       z |S )NrA      r       r:   )
entryVaHexrL   rM   r3   )
r   rB   r   rC   r;   rD   r.   r   r   r   )	r/   r0   r7   
aligned_vastart_varl   
current_varG   r   s	            r   pointer_table_previewr      s    rAvJ:?A&H!#DHj2oq9 

8Z0;#'CH,""4c215 nuIh.+He<		

 Kr    c                   g }g }t        |      D ]L  }t        |d         }|t        |d         z   }| j                  d||      }|dk7  s<t        ||      }||dz   t	        |       k  r| |dz      }	| |dz   |dz    dk(  r|dz  rb|j                  |t        |      |	d	|	d
dt        ||dz  z
        t        ||      t        | ||      d       | j                  d|dz   |      }t        | ||      }
t        | ||      }|
s<|s:|j                  |t        |      |	d	|	d
t        | ||      t        ||      d       | j                  d|dz   |      }|dk7  rO ||fS )Nr)   r*      br+   rA   r      s     r   02xz!unaligned-byte-inside-dword-table)r7   vaHexoperand
operandHexreasonalignedVaHexr3   pointerTablePreview)r7   r   r   r   contextr3   )r	   r,   r-   r
   rC   r.   r   r   r   r   r   r   )r/   r0   rl   rejectedr3   r4   r5   r6   r7   r   ascii_falsenumeric_falses               r   scan_descriptor_add_commandsr      s   !#D%'H'1 (2GEN#c'*-..hhws+Rih,B~#'SX"5cAg, sQwsQw';6Av &()+B+20273-.@*M022a=0A+;Hb+I7LSRZ\^7_	 "hhwa= "=c8R"PK$>sHb$QM&}&()+B+20273-.@+?Xr+R+;Hb+I	 ((7C!GS1CI Ri	(2R >r    c                   g }|D ]  }	 t        | ||d      }|j                  dg       }|j                  |t	        |      |d d D cg c]E  }|j                  d      |j                  d      |j                  d      |j                  d      d	G c}d
        |S # t        $ r1}|j                  |t	        |      t        |      d       Y d }~d }~ww xY wc c}w )N   )max_commandscommands)startVa
startVaHexerrorr   	opcodeHex
opcodeNamesummary)r   r   r   r   )r   r   r   )r   rd   ra   r.   r   r&   )	r/   r0   startsrl   r4   streamr   exccommands	            r   decode_hit_contextsr     s    !#D 
	"3%bIFzz*b1H 	  i $,CR=   ")W!5%,[[%=&-kk,&?#*;;y#9		

, K%  	KKEESQTXVW	s   !BA
C	C''CCc                    t         j                         } t        |       }t        | |t              }t        | |t
              }t        | |t              }t        | |      }t        | |      \  }}t        d |D              }t        d |D              }	t        d |D              }
|D cg c]  }|d   dv r| }}|D cg c]  }|d   s|d   r| }}|D cg c]  }|d   s|d	   d
k(  r| }}i dt        |      d|D cg c]  }t        |       c}dt        |      d|D cg c]  }t        |       c}dt        |      d|D cg c]  }t        |       c}dt        |      dt        |      dt        |      dt        |      dt        |      dt        |      dt        t        |j                                     dt        t        |	j                                     dt        t        |
j                                     dt        | |t               D cg c]  }t        |       c}dd}ddd|t#        | ||      t#        | ||      t#        | ||      d ||||t        |      D ci c]  }||D cg c]  }|d   |k(  s| c}d d! ! c}}g d"g d#d$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 )%Nc              3  &   K   | ]	  }|d      yw)r   Nr   rw   rO   s     r   ry   zbuild_report.<locals>.<genexpr>-  s     KS^K   c              3  &   K   | ]	  }|d      ywr   Nr   r   s     r   ry   zbuild_report.<locals>.<genexpr>.  s     N3S.Nr   c              3  &   K   | ]	  }|d      ywr   r   r   s     r   ry   zbuild_report.<locals>.<genexpr>/  s     %`Cc,&7%`r   r   >   ru   rz   r^   r`   r_   rY   idG exactTopMenuPatternHitCountexactTopMenuPatternHitsHexexactRightPanelPatternHitCountexactRightPanelPatternHitsHex shiftedRightPanelPatternHitCountshiftedRightPanelPatternHitsHexselectedRootStoreCountselectedRootPromotionCountintroTitleSelectedRootRowsdescriptorAddCommandCount#descriptorAddRejectedUnalignedCount!descriptorAddPromotedContextCountdescriptorAddContextCountsdescriptorAddOperandCounts"descriptorAddRejectedOperandCountstopMenuSequenceAllRefsHexdecisionu  selected-root/table scan과 global 0x62 add-descriptor command scan에서도 normal-field ESC/X opener는 아직 증명되지 않았다. 정확한 #6/#3/#4 top-menu 조립 패턴은 0x004ddc84 1건뿐이고, selected-root table 중 top-menu sequence나 exact region scripts로 승격되는 행은 없다. 기존 0x47/0x4d operand 후보는 4-byte command가 아니라 dword pointer table 내부 unaligned byte로 재분류했다.z-hwanse-hud-menu-selected-root-frontier-reviewz5tools/build_hud_menu_selected_root_frontier_review.pyz"normal-field-opener-still-unproven)exactTopMenuexactRightPanelshiftedRightPanel   )z60x004ddc6c direct dword ref remains data-context only.zVExact #6/#3/#4 top-menu construction pattern is not duplicated in another data stream.zaSelected-root tables do not contain 0x004ddc6c or the exact #6/#3/#4 child initializer addresses.za0x62 add-descriptor command-like hits exist, but none occur in a top-menu pointer/region context.zwHigh operands 0x47 and 0x4d are rejected as unaligned bytes inside dword pointer tables, not real opcode 0x62 commands.)ztTrace the producer of the mode/state byte that chooses a selected-root table before descriptor add commands execute.zFollow VM opcode 0x81 table selectors whose selected entries later execute 0x62, but do not promote them unless they connect to the exact menu region construction.zvInspect higher-level field mode dispatcher roots that call or schedule command streams after cancel/ESC edge handling.)kindsourcestatusr   patternHitContexts#selectedRootRowsWithTopMenuEvidencer    descriptorAddPromotedContextRows#rejectedDescriptorAddFalsePositivesdescriptorAddSamplesByContextnegativeEvidencenextFrontier)EXE
read_bytesr   r8   EXACT_TOP_MENU_PATTERNEXACT_RIGHT_PANEL_PATTERNSHIFTED_RIGHT_PANEL_PATTERNrp   r   r   rC   r   rc   sorteditemsr?   rf   r   )r/   r0   exact_top_hitsexact_right_hitsshifted_right_hitsselected_root_rowsdescriptor_add_rowsrejected_descriptor_add_rowscontext_countsoperand_countsrejected_operand_countsrO   promoted_add_rowsselected_root_promotionsintro_parent_rowshitrefr   r   s                      r   build_reportr   #  s   
..
CS!H!#x1GHN#C3LM%c85PQ23A8TUXZb8c55K7JKKNN:MNNN%%`C_%`` 'y>YY 	  & ()S1O-P 	    &45[9IZ9W 	 %s>':$.&I3r#w&I 	)#.>*? 	(=M)Nc"S')N	
 	+C0B,C 	*?Q+RBsG+R 	!#&8"9 	%c*B&C 	%c*;&< 	$S)<%= 	.s3O/P 	,S1B-C 	%d6.2F2F2H+I&J 	%d6.2F2F2H+I&J 	-d6:Q:W:W:Y3Z.[  	$XWk9l%m#bg%m!" 	K%G4 @I6/X~N23BRS!4S(DV!W

 0H&7,=/K ".1*
 %8VcC	Ng<UcVWZXZ[[*


3 S
 
 'J)N+R &n0 W*
sH   (J,>J1J6J;'K K'K
<
KK K KKc                   | 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              }dj                  d |d   j                         D              }dj                  d | d   d d D              }dj                  d | d   D              }dj                  d | d   D              }dj                  d | d   D              }	t        j                  | d       }
d!t	        |d"          d#| d$|xs d% d&| d'|xs d( d)|xs d* d+| d,|	 d-|
 d.S )/Nr   r   zexact top patternr   zselected-root rowsr   zselected-root promotionsr   z0x62 commandsr   z0x62 rejectedr   z0x62 promotedr   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'   )rw   kvs      r   ry   zrender_html.<locals>.<genexpr>  s/     gTXTUWX+AaD6AaD6Og   (*c              3     K   | ]J  }d t        |d          dt        t        j                  |j                  dg       dd d             d L yw)	<tr><td><code>r   </code></td><td>r   NrV   Fensure_ascii
</td></tr>)r'   jsondumpsrd   r   s     r   ry   zrender_html.<locals>.<genexpr>  sb      
 		s<()* +CGGJ3CR8uMNO P	s   AAr   r   c              3  X   K   | ]"  \  }}d t        |       dt        |       d $ yw)z<tr><td>	</td><td>r   Nr   )rw   keyr   s      r   ry   zrender_html.<locals>.<genexpr>  s3      C 1S6()AeH:Z8r   r   c              3     K   | ]g  }d t        |d          dt        |j                  d             dt        |d          dt        t        j                  |d   dd	 d
             d	 i yw)r   rZ   z</code><br>slot rW   z</td><td><code>r\   r   r]   N   Fr   r   )r'   rd   r   r   r   s     r   ry   zrender_html.<locals>.<genexpr>  s       	s>*+,,<Qswwv=O<P Qs<()* +C/3%HIJ K	s   A-A/r   r   c              3     K   | ]j  }d t        |d          dt        |d          dt        |d          dt        |d          dt        t        j                  |d	   d
d d             d l y
w)r   r   z</code><br>r   r   r   z<br>aligned <code>r   r   r   NrX   Fr   r   )r'   r   r   r   s     r   ry   zrender_html.<locals>.<genexpr>  s       	s7|_%[3|3D1E0F GX  21S5H3I2J KC 56r:OPQ R	s   A0A2r   c              3  :   K   | ]  }d t        |       d  ywz<li>z</li>Nr   rw   items     r   ry   zrender_html.<locals>.<genexpr>  s     U$$qwiu-U   r   c              3  :   K   | ]  }d t        |       d  ywr   r   r   s     r   ry   zrender_html.<locals>.<genexpr>  s     PagYe,Pr  r   Fr   a  <!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>HUD Menu Selected Root Frontier Review</title>
  <style>
    body { margin:0; background:#101318; color:#edf1f7; font-family:system-ui,sans-serif; }
    main { max-width:1280px; margin:0 auto; padding:24px; }
    a { color:#8ecbff; }
    .nav { display:flex; flex-wrap:wrap; gap:8px; margin-bottom:16px; }
    .chip { border:1px solid #334155; border-radius:999px; padding:6px 10px; text-decoration:none; background:#161b22; }
    .summary { display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:12px; margin:16px 0; }
    .card { border:1px solid #2b3544; border-radius:8px; padding:12px; background:#161b22; }
    .card b { display:block; color:#9fb1c9; font-size:12px; text-transform:uppercase; }
    .card span { display:block; margin-top:8px; font-size:18px; overflow-wrap:anywhere; }
    section { border:1px solid #273244; border-radius:10px; padding:16px; margin:16px 0; background:#141922; overflow:auto; }
    table { border-collapse:collapse; width:100%; min-width:960px; font-size:13px; }
    th,td { border-bottom:1px solid #283342; padding:8px; text-align:left; vertical-align:top; }
    th { color:#b9c7dc; background:#111722; }
    code { color:#dbeafe; overflow-wrap:anywhere; }
    pre { white-space:pre-wrap; background:#0b0f14; border:1px solid #253044; border-radius:8px; padding:12px; max-height:420px; overflow:auto; }
  </style>
</head>
<body>
<main>
  <div class="nav">
    <a class="chip" href="index.html">index</a>
    <a class="chip" href="hud_menu_opener_frontier_review.html">opener frontier</a>
    <a class="chip" href="hud_menu_preview.html">HUD menu preview</a>
    <a class="chip" href="menu_descriptor_stack_review.html">descriptor stack</a>
    <a class="chip" href="../out/hud_menu_selected_root_frontier_review.json">JSON</a>
  </div>
  <h1>HUD Menu Selected Root Frontier Review</h1>
  <p>r   z</p>
  <div class="summary">z</div>
  <section>
    <h2>Exact Top-Menu Pattern Hits</h2>
    <table><thead><tr><th>start</th><th>decoded commands</th></tr></thead><tbody>z=<tr><td colspan='2'>No exact top-menu pattern hits.</td></tr>z</tbody></table>
  </section>
  <section>
    <h2>0x62 Descriptor Add Contexts</h2>
    <table><thead><tr><th>context</th><th>count</th></tr></thead><tbody>z</tbody></table>
  </section>
  <section>
    <h2>Rejected 0x62 False Positives</h2>
    <table><thead><tr><th>hit</th><th>reason</th><th>pointer table preview</th></tr></thead><tbody>z8<tr><td colspan='3'>No rejected unaligned hits</td></tr>z</tbody></table>
  </section>
  <section>
    <h2>Intro/Title Selected-Root Rows</h2>
    <table><thead><tr><th>command</th><th>table</th><th>values</th></tr></thead><tbody>z"<tr><td colspan='3'>None</td></tr>zQ</tbody></table>
  </section>
  <section>
    <h2>Negative Evidence</h2>
    <ul>zB</ul>
  </section>
  <section>
    <h2>Next Frontier</h2>
    <ul>z</ul>
  </section>
  <section>
    <h2>Raw JSON</h2>
    <pre id="json"></pre>
  </section>
</main>
<script>
window.HWANSE_HUD_MENU_SELECTED_ROOT_FRONTIER_REVIEW = z;
document.getElementById('json').textContent = JSON.stringify(window.HWANSE_HUD_MENU_SELECTED_ROOT_FRONTIER_REVIEW, null, 2);
</script>
</body>
</html>
)joinr   r   r   r'   )reportr   
card_itemscards
exact_rowscontext_rowsselected_rowsrejected_rows	negativesfrontierpayloads              r   render_htmlr  z  sH   YG	6(#$	g&CDE	w'?@A	#W-I%JK	'"=>?	'"GHI	'"EFGJ GGg\fggE 
 ./? J 77 !">?EEG L GG  67< M GG  ?@ M U&AS:TUUIwwP9OPPHjje4G"D 
 w R S]  S`  a`  Ra aI JV Wd er  ep  vp  dq qX Yf  YN  jN  XO O	 
 	 

 8 9@y AEG Gr    c                 2   t               } t        j                  d       t        j                  d       t        dz  j	                  t        j                  | dd      dz   d	       t        d
z  j	                  t        |       d	       t        d       y)NT)exist_okz+hud_menu_selected_root_frontier_review.jsonFr   )r   indent
zutf-8)encodingz+hud_menu_selected_root_frontier_review.htmlz)hud_menu_selected_root_frontier_review okr   )	r   OUTmkdirWEB
write_textr   r   r  print)r  s    r   mainr    s    ^FIItIIItI88DD

6a84? E  	88DD[QWEXcjDk	
56r    __main__)rX   )r   z
int | Noner   r,   returnr&   )r   r   r  r&   )r/   bytesr0   list[dict[str, Any]]r1   r  r  	list[int])r/   r  r0   r  r   r,   r  r  )r   )
r/   r  r0   r  rE   r,   rF   r,   r  r  )r/   r  r0   r  r   r,   r  dict[str, Any])r/   r  r0   r  r  r  )r/   r  r0   r  r7   r,   r  r&   )r/   r  r0   r  r7   r,   r  r  )r/   r  r0   r  r  z1tuple[list[dict[str, Any]], list[dict[str, Any]]])r/   r  r0   r  r   r  r  r  )r  r  )r  r  r  r&   )r  r,   );__doc__
__future__r   r$   r   r;   collectionsr   pathlibr   typingr   "build_menu_descriptor_stack_reviewr   r   r	   probe_exe_scene_tablesr
   r   r   'summarize_object_payload_442c75_callersr   r   r   r   r   __file__resolveparentsROOTr   r  r  rf   ri   rj   rk   SHIFTED_REGION3_SCRIPT_VASHIFTED_REGION4_SCRIPT_VArg   r   r   r   r   r'   r8   r?   rJ   rP   rp   r   r   r   r   r   r  r  __name__
SystemExitr   r    r   <module>r0     s*    #       
 M L  H~''*
]
Ul
Ul! ' ' ' & & %/ "   <H		'T'$(,^6Tnqh
 z
TV
 r    