
    zLj,                       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mZ ddl	m
Z
  ee      j                         j                  d   Zedz  Zedz  Zed	z  Zed
z  Z ee      ej(                  vr"ej(                  j+                  d ee             ddlmZmZm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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  Compare the two VM routes that bind object+0xa8 to 0x004576d8.

The selector byte writer is still unresolved, but the base binding itself is
now grounded through two VM families:

* active-object VM dispatcher 0x00402321, table 0x00440538, opcode 0x43;
* text/status 0x40-prefixed interpreter 0x0041b66d, table 0x0047f1d8,
  sub-opcode 0x1b with mode 1.

This report records that bridge explicitly so future analysis can target the
remaining value producer rather than re-proving the base.
    )annotationsN)Path)Any   toolsoutwebzHwanse2.exe)offset_to_varead_sectionsva_to_offseti!#@ i8D id@ imA iG iA ivE c                    | yd| d| dS )N 0x0x )valuewidths     4tools/build_status_comment_base_bind_route_review.pyhxr   -   s"    }awaZ !!    c                V    t        j                  | dd      S t        |       d      S )Nr   T)quote)htmlescapestr)r   s    r   hr   3   s%    ;;U]r$GGE
$GGr   c                    	 t        j                  t        | z  j                  d            }t        |t              r|S i S # t        $ r i cY S w xY w)Nutf-8encoding)jsonloadsOUT	read_textFileNotFoundError
isinstancedict)namedatas     r   	load_jsonr+   7   sS    zz3:00'0BC dD)41r1  	s   ,A AAc                    t        ||      }|t        dt        |             t        j                  d| |      d   S )Nzunmapped VA <Ir   )r   RuntimeErrorr   structunpack_from)exesectionsvaoffs       r   
read_dwordr5   ?   sC    
x
$C
{\"R&233dC-a00r   c                ~    t        |      D ]  }	 t        | |||dz  z         }||k(  s|c S  y # t        $ r Y  y w xY w)N   )ranger5   r.   )r1   r2   table_va
handler_vamax_entriesindexr   s          r   table_index_for_handlerr=   F   sZ    {# 	sHh.BCE JL 	  		s   /	<<c                   t        j                  d|      }g }| j                  |      }|dk7  rt        ||      }d}|D ]G  }t	        |d         |cxk  r!t	        |d         t	        |d         z   k  s6n 9t        |d         } n |j                  t        |      t        |      || t        d|dz
        t        t        |       |d	z          j                  d
      d       | j                  ||dz         }|dk7  r|S )Nr-   r   rawraw_sizer)   r          )fileOffsetHexvaHexsection
contextHexr   )r/   packfindr
   intr   appendr   maxminlenhex)	r1   r2   r   needlerowsposr3   section_namerG   s	            r   exact_dword_refsrU   Q   s   [[u%F!#D
((6
C
)(C( 	G75>"cZC,?#gjFYBZ,ZZ"76?3	 	!#CB'!#ar"2SS385LMQQRUV		
 hhvsQw' )  Kr   c                   g }| j                  |      }|dk7  rt        ||      }d}|D ]G  }t        |d         |cxk  r!t        |d         t        |d         z   k  s6n 9t        |d         } n |dk(  rv|j	                  t        |      t        |      |j                  d      t        |      | t        d|d	z
        t        t        |       |d
z          j                  d      d       | j                  ||dz         }|dk7  r|S )Nr?   r   r@   rA   r)   z.datarD   r   rB   8   )rF   rE   
patternHexclassificationrH   r   )rJ   r
   rK   r   rL   r   rP   classify_401b_payloadrM   rN   rO   )r1   r2   patternrR   rS   r3   rT   rG   s           r   find_pattern_rowsr\   h   s   !#D
((7
C
)(C( 	G75>"cZC,?#gjFYBZ,ZZ"76?3	 7"KKV%'W")++c"2&;B&?"%c!S2X&6SXsRx9P"Q"U"UVY"Z hhwa(# )$ Kr   c                :    | y| dk(  ry| dk(  ry| dk(  ry| dk(  ry	y
)NunknowniN z4status-comment-group-selector-base-bind-before-40-14iN z'chapter-number-title-selector-base-bindiN z-status-menu-region-payload-selector-base-bindiN z0status-menu-secondary-payload-selector-base-bindzother-40-1b-mode1r   )r3   s    r   rZ   rZ      s9    	z	ZE	Z8	Z>	ZAr   c                    t         j                         } t        |       }t        | |t        t
        d      }t        | |t        t        d      }t        | |t
              }t        | |t              }t        | |d      }dt        t              t        t              |t        |d      ndt        t
              t        |      dd|d	k(  d
	dt        t              t        t              dt        t              t        |      dd|dk(  d
	g}t        d      }t        d      }	|t        |d      ndt        t
              d|t        |d      ndt        t              t        |      t        d |D              t        d |D              |j!                  di       j!                  dd      |	j!                  di       j!                  dd      ddd}
ddg d|
||||ddS ) N   @   s   @ zactive-object   r   zU43 00 00 00 (4-byte active-object command shape; stream use may be context-dependent)z*object+0xa8 = 0x004576d8; object+0x40 += 4C   )	vmFamilydispatcherVaHexhandlerTableVaHex	opcodeHexhandlerVaHexhandlerTableRefCountcommandShapeactionbaseBindProvenztext/status 0x40-prefixedz	0x40 0x1bz*40 1b mode slot; mode 1 selects 0x004576d8zamode 0=0x0059e310, mode 1=0x004576d8, mode 2=0x00457750+slot*0xd8, mode 3=0x0059db30[object+0xf2]   z+status_comment_backing_base_ref_review.jsonz+status_comment_selector_meaning_review.jsonc              3  D   K   | ]  }|d    j                  d        yw)rY   zstatus-commentN
startswith.0rows     r   	<genexpr>zbuild.<locals>.<genexpr>   s#     0|hk5E1F1Q1QRb1c0|    c              3  D   K   | ]  }|d    j                  d        yw)rY   chapterNro   rq   s     r   rt   zbuild.<locals>.<genexpr>   s"     *o[^3/?+@+K+KI+V*oru   summaryobjectA8BackingBaseBindCountr   meaningCandidateFa   The base bridge is grounded in two VM families: active-object opcode 0x43 and text/status command 40 1b mode 1. The status-comment and chapter payloads use the text/status route.  This still proves only the selector base, not the writer of backing byte +0.)activeObjectOpcodeHex activeObjectBaseBindHandlerVaHextextStatusOpcodeHextextStatusSubOpcodeIndexHextextStatusBaseBindHandlerVaHexmode1PayloadUseCount!statusCommentPayloadMode1UseFoundchapterPayloadMode1UseFoundry   selectorMeaningCandidateselectorValueWriterProvendecisionr   z,hwanse-status-comment-base-bind-route-review)z/out/status_comment_backing_base_ref_review.jsonz/out/status_comment_selector_meaning_review.jsonz$out/status_menu_vm_table_review.json)activeObjectHandlerRefstextStatusHandlerRefs)versionkindsourceArtifactsrx   handlerRowsmode1PayloadRowshandlerPointerRefs)EXE
read_bytesr   r=   ACTIVE_HANDLER_TABLE_VAACTIVE_BASE_BIND_HANDLER_VATEXT_STATUS_HANDLER_TABLE_VA TEXT_STATUS_BASE_BIND_HANDLER_VArU   r\   r   ACTIVE_DISPATCHER_VArO   TEXT_STATUS_INTERPRETER_VAr+   anyget)r1   r2   active_index
text_indexactive_refs	text_refspattern_rowshandler_rowsbacking_basemeaningrx   s              r   buildr      s   
..
CS!H*3:QSnpstL(h8TVvxz{J"32MNK h0PQI$S(4GHL (!"67!#$;!<0<0HL!,b:;$'$4sB*d2
	
 4!"<=!#$@!A$?@$'	NHy(D0
	
L2 JKLEFG8D8PL!!4VX,./J,K*<F<Rr*a'8XZ*,-M*N #L 1-00|o{0|-|'**obn*o'o(4(8(8B(G(K(KLjlm(n$+KK	2$>$B$BCUWY$Z%*_G$ >

 #('2%.
 r   c                    dj                  d | d   j                         D              }dj                  d | d   D              }dj                  d | d   D              }d| d	| d
| dS )Nr   c              3  X   K   | ]"  \  }}d t        |       dt        |       d $ yw)z<div class='card'><b>z
</b><span>z</span></div>Nr   )rr   kvs      r   rt   zrender_html.<locals>.<genexpr>   s3      Aq  !vZ!v]Cs   (*rx   c              3    K   | ]  }d t        |d          dt        |d          dt        |d          dt        |d          dt        |d          dt        |d	          d
t        |d          d
t        |d          d  yw)z<tr><td>rd   </td><td><code>re   z</code></td><td><code>rf   rg   rh   </code></td><td>rj   z	</td><td>rk   rl   z
</td></tr>Nr   rq   s     r   rt   zrender_html.<locals>.<genexpr>   s       	Z!" #s,-./ 0s./01 2s;'() *s>*+, -^$%& 'X  !%&'( )		s   BBr   c           
   3  |   K   | ]4  }d t        |d          dt        |d          dt        |d          d 6 yw)z<tr><td><code>rF   r   rY   r   rH   z</code></td></tr>Nr   rq   s     r   rt   zrender_html.<locals>.<genexpr>   s]       	s7|_% &%&'( )s<()* +	s   :<r   u  <!doctype html>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Status Comment Base Bind Route Review</title>
<style>
  :root { color-scheme: light dark; }
  body { margin:24px; font-family:system-ui,-apple-system,Segoe UI,sans-serif; line-height:1.45; }
  h1 { margin:0 0 8px; font-size:24px; }
  h2 { margin:24px 0 10px; font-size:18px; }
  .muted { color:#667085; }
  .cards { display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:10px; margin:16px 0; }
  .card { border:1px solid #d0d5dd; border-radius:8px; padding:10px 12px; background:rgba(127,127,127,.05); }
  .card b { display:block; color:#667085; font-size:12px; }
  .card span { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; overflow-wrap:anywhere; }
  .scroll { overflow-x:auto; }
  table { width:100%; border-collapse:collapse; }
  th,td { border:1px solid #d0d5dd; padding:7px 8px; vertical-align:top; }
  th { text-align:left; background:rgba(127,127,127,.08); }
  code { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:12px; }
</style>
<h1>Status Comment Base Bind Route Review</h1>
<p class="muted">상태창 문구 selector의 base bind 경로를 active-object VM과 text/status VM으로 분리합니다.</p>
<div class="cards">z</div>
<h2>Handler Routes</h2>
<div class="scroll"><table>
<thead><tr><th>VM</th><th>dispatcher</th><th>table</th><th>opcode</th><th>handler</th><th>command shape</th><th>action</th><th>proven</th></tr></thead>
<tbody>z</tbody>
</table></div>
<h2>40 1b mode 1 Payload Uses</h2>
<div class="scroll"><table>
<thead><tr><th>VA</th><th>classification</th><th>context</th></tr></thead>
<tbody>z</tbody>
</table></div>
)joinitems)r*   cardsr   payload_rowss       r   render_htmlr      s    GG O))+ E 77  & L 77  *+ L, 7  	~ 
 	~ ?! !r   c                    t               } t        j                  d       t        j                  d       t        dz  j	                  t        j                  | dd      d       t        d	z  j	                  t        |       d       y )
NT)exist_okz*status_comment_base_bind_route_review.jsonFrb   )ensure_asciiindentr   r    z*status_comment_base_bind_route_review.html)r   r$   mkdirWEB
write_textr"   dumpsr   )r*   s    r   mainr     sy    7DIItIIItI77CC

4eA6 D  	77CCD D r   __main__)   )r   
int | Noner   rK   returnr   )r   r   r   r   )r)   r   r   dict[str, Any])r1   bytesr2   list[dict[str, Any]]r3   rK   r   rK   )r1   r   r2   r   r9   rK   r:   rK   r;   rK   r   r   )r1   r   r2   r   r   rK   r   r   )r1   r   r2   r   r[   r   r   r   )r3   r   r   r   )r   r   )r*   r   r   r   )r   None)-__doc__
__future__r   r   r"   r/   syspathlibr   typingr   __file__resolveparentsROOTTOOLSr$   r   r   r   pathinsertprobe_exe_scene_tablesr
   r   r   r   r   r   r   r   r   BACKING_BASE_VAr   r   r+   r5   r=   rU   r\   rZ   r   r   r   __name__r   r   r   <module>r      s   #    
   H~''*w
Ul
Ul
]u:SXXHHOOAs5z" L L " $ ( ' ) #-  "H21.0DN;| zF r   