
    $gLj1                    L   d Z ddlm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  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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!d"dZ"d&dZ#d'dZ$d(dZ%e&dk(  r e%        yy))ao  Review indirect producers for the status/comment selector byte +0.

Direct absolute writes to 0x004576d8+0 are absent.  The remaining plausible
writer class is an object/text VM command that writes to object+0xa8[offset].
This report scans known object-VM dynamic selector writer opcodes and keeps the
status/menu +0 consumers next to the negative producer evidence.
    )annotationsN)Counter)Path)Any)offset_to_varead_sectionsva_to_offset   zHwanse2.exeoutwebi N i N i.N iN c                V    t        j                  | dd      S t        |       d      S )N T)quote)htmlescapestr)values    =tools/build_status_comment_indirect_selector_writer_review.pyhr      s%    ;;U]r$GGE
$GG    c                    | yd| d| dS )Nr   0x0x )r   widths     r   hxr   #   s"    }awaZ !!r   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+   )   sS    zz3:00'0BC dD)41r1  	s   ,A AAc                \    | D ]  }|j                  d      |k(  s|c S  t        d|       )Nr)   zmissing section )getRuntimeError)sectionsr)   sections      r   section_by_namer1   1   s<     ;;v$&N )$0
11r   c                 8   t        d      } | j                  d      }g }t        |t              rX|D ]S  }t        |j                  d      t              s#t        |j                  d      t              sC|j                  |       U |j                  d        |S )Nz#selector_root_structure_review.jsonrootsrootVa
rangeEndVac                    t        | d         S )Nr4   int)rows    r   <lambda>zroot_contexts.<locals>.<lambda>@   s    c#h-0 r   )key)r+   r-   r'   listr8   appendsort)r*   r3   rowsroots       r   root_contextsrA   8   s    :;DHHWED% 	"D$((8,c2z$((<BXZ]7^D!	" 	II0I1Kr   c                d    | D ]+  }t        |d         |cxk  rt        |d         k  s'|c S  - y )Nr4   r5   r7   )r3   var@   s      r   context_for_varD   D   s@     tH~">s4+='>>K ? r   c                    | d   }|dk(  r| d   dk(  rdd| d   d | d   dd	d
S |dk(  r| d   dk(  rdd| d   d | d   ddd
S |dk(  r| d   dk(  rdd| d   | d   | d   ddd
S y )Nr         0x8czselector-next-enabled-producer   r
   
0x0040b55fui   availability array 0x0059e360/0x0059e370에서 다음 enabled row를 찾아 object+0xa8[target]에 기록)	opcodeHexroletargetOffsetselectorOffsetsourceStateBytehandlerVaHexmeaning   0x8dz"descriptor-match-selector-producer
0x0040b696uW   active descriptor row +0x48/+0x4a 계열 비교 결과를 object+0xa8[target]에 기록   0x8fz&global-state-derived-selector-producer
0x0040b84auk   object+0xa8[selector] 값을 switch로 삼아 0x00457744..49 상태를 읽고 object+0xa8[target]에 기록r   )rawops     r   classify_opcoderZ   K   s    	QB	Tzc!fk4F""1v( C
 	
 
Tzc!fk8F""1v(p
 	
 
Tzc!fk<F!!f"1v( E
 	
 r   c                "   t        |d      }t        |d         }|t        |d         z   }t               }g }t        ||dz
        D ]D  }| |   dvr| ||dz    }t	        |      }	|	s"t        ||      }
|
1t        ||
      }t        |
cxk  xr	 t        k  nc }t        |
cxk  xr	 t        k  nc }|j                  t        |
      |j                  d      d|	t        |	d   d	      |	d
   t        |	d
   d	      nd|	d   dk(  |||r|j                  dg       ng |r|j                  d      nd|r|j                  d      nd|r|j                  d      nd|r|j                  dg       ng |r|j                  dg       ng d       G |S )Nz.datarX   raw_size   >   rF   rR   rU    )commandVaHexrawHexrM   rI   rN   r   r   selectorKeys	rootVaHexrangeEndVaHex	rootClass	fieldMaps	linkedCns)targetOffsetHexselectorOffsetHex#targetsStatusCommentSelectorOffset0inStatusMenuPayloadRangeinStatusCommentPayloadRangerootSelectorKeysrb   rootRangeEndVaHexrd   re   rf   )r1   r8   rA   rangerZ   r   rD   STATUS_MENU_MINSTATUS_MENU_MAXSTATUS_COMMENT_PAYLOAD_MINSTATUS_COMMENT_PAYLOAD_MAXr=   r   hexr-   )exer/   r*   startendr3   r?   posrX   decodedrC   r@   in_status_menuin_status_comments                 r   scan_dynamic_writersr{   n   s   8W-DUE
#d:&'
'COE!#DUC!G$ 
s8--#a !#&(C(:eR((B@@6"Y?YY "2''#,  $&gn&=q#AIPQaIbInR0@(A1%Etv7>~7NRS7S,:/@DHDHH^R$@b6:TXXk2BFTXXo%>B6:TXXk2:>TXXk26B:>TXXk26B	

> Kr   c                    t        d      } g }dD ]  }t        | j                  |      t              r| j                  |g       ng D ]  }|j                  d      dk(  s|j                  d      dk(  s-|j	                  ||j                  d      |j                  d      |j                  d	      |j                  d
      |j                  d      |j                  d      d         |S )Nz status_menu_vm_table_review.json)opcode13Tablesopcode14TablessourceModeHex0x03sourceOffsetHex0x00recordVaHexclassificationsourceExpression	itemCountentryTableVaHexrecordRawHex)tabler   r   r   r   r   r   )r+   r'   r-   r<   r=   )r*   r?   
table_namer9   s       r   source_consumersr      s    78DD: 
/9$((::NPT/U488J+[] 	Cww'61cgg>O6PTZ6Z!+'*ww}'=*-''2B*C,/GG4F,G%(WW[%9+.773D+E(+(?
	 Kr   c                 B   t         j                         } t        |       }t        | |      }|D cg c]
  }|d   s	| }}|D cg c]
  }|d   s	| }}|D cg c]
  }|d   s	| }}t	        d |D              }t	        d |D              }t               }	t        |      t        |      t        |      t        |      t        |	      t        |      t        |j                  d            t        |      t        |      dd
}
d	d
d|
|	||||d	S c c}w c c}w c c}w )Nri   rj   rk   c              3  &   K   | ]	  }|d      yw)rg   Nr   .0r9   s     r   	<genexpr>zbuild.<locals>.<genexpr>   s     CsC 12C   c              3  &   K   | ]	  }|d      yw)rK   Nr   r   s     r   r   zbuild.<locals>.<genexpr>   s     #HC$4#Hr      a0  Object-VM dynamic selector writers 0x8c/0x8d/0x8f do have target offset +0 candidates elsewhere, but none are inside the status/menu payload range and none are inside the status-comment payload. The status/comment +0 producer therefore remains unresolved; the known +0 records are consumers, not writers.)
dynamicWriterCandidateCounttarget0CandidateCounttarget0InStatusMenuPayloadCount"target0InStatusCommentPayloadCountsourceOffset0ConsumerCounttarget0OpcodeCountstopTargetOffsets)statusCommentSelectorIndirectWriterProvenstatusMenuTarget0WriterProvendecisionr
   z5hwanse-status-comment-indirect-selector-writer-reviewz=tools/build_status_comment_indirect_selector_writer_review.py)	versionkindsourcesummarysourceOffset0Consumerstarget0WriterCandidatestarget0StatusMenuCandidatestarget0StatusCommentCandidatesdynamicWriterRows)
EXE
read_bytesr   r{   r   r   lenr(   most_commonbool)rt   r/   r?   r9   target0target0_status_menutarget0_status_commenttarget_countstarget0_opcode_countssource_rowsr   s              r   buildr      s6   
..
CS!HX.D"Qsc*O&PsQGQ*1U3S9S5T3UU-4[c<Y8Zc[[CdCCM##H#HH"$K'*4y!$W+./B+C.12H.I&)+&6#$9: !:!:2!>?59:P5Q)-.A)B|G" GQ"-#*':*@!
 
- RU[s"   
DD
DD
D%Dc           	         | d   }dj                  d |j                         D              }dj                  d | d   D              }dj                  d | d   D              }dt        |d	          d
| d| d| d	S )Nr   r   c              3  b   K   | ]'  \  }}|d k7  rdt        |       dt        |       d ) yw)r   z<div class='card'><b>z
</b><span>z</span></div>Nr   )r   kvs      r   r   zrender_html.<locals>.<genexpr>   s:      Aq
?  !vZ!v]Cs   -/c              3     K   | ]a  }d t        |d          dt        |d          dt        |d          dt        |d          dt        |d          dt        |d	          d
 c yw)z<tr><td>r   z</td><td><code>r   </code></td><td>r   	</td><td>r   r   r   z</code></td></tr>Nr   r   s     r   r   zrender_html.<locals>.<genexpr>   s      
 	W  s=)*+ ,%&'( )'()* +[!"# $s,-./ 0	
s   A'A)r   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j                  |j                  d      xs g              dt        dj                  |j                  d      xs g              d  yw)z<tr><td><code>r_   z</code></td><td><code>r`   r   rK   r   rL   rg   rj   rk   z, rl   re   z
</td></tr>N)r   joinr-   r   s     r   r   zrender_html.<locals>.<genexpr>   s      	s>*+, -s8}%& '[!"# $V~ &'() */012 32345 6377#56<"=>? @377;/52678 9
	s   CCr   uL  <!doctype html>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Status Comment Indirect Selector Writer Review</title>
<style>
  :root { --bg:#f6f7f9; --panel:#fff; --line:#d8dee8; --text:#20242b; --muted:#687080; }
  * { box-sizing:border-box; }
  body { margin:0; background:var(--bg); color:var(--text); font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif; }
  main { width:min(1180px, calc(100vw - 28px)); margin:0 auto; padding:24px 0 40px; }
  h1 { margin:0 0 6px; font-size:28px; }
  h2 { margin:22px 0 8px; font-size:18px; }
  p { margin:0; line-height:1.45; color:var(--muted); }
  .decision { margin:14px 0; padding:12px; border:1px solid #efc3bb; background:#fff5f3; border-radius:8px; color:var(--text); }
  .cards { display:grid; grid-template-columns:repeat(auto-fit,minmax(180px,1fr)); gap:10px; margin:16px 0; }
  .card,section { background:var(--panel); border:1px solid var(--line); border-radius:8px; padding:12px; }
  .card b { display:block; color:var(--muted); font-size:12px; }
  .card span { display:block; margin-top:4px; font-weight:700; overflow-wrap:anywhere; }
  table { width:100%; border-collapse:collapse; font-size:13px; }
  th,td { border-top:1px solid var(--line); padding:7px; text-align:left; vertical-align:top; }
  th { color:var(--muted); font-size:12px; }
  code { font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; }
  @media (max-width:760px) { main { width:min(100vw - 18px,1180px); padding-top:16px; } table { display:block; overflow-x:auto; white-space:nowrap; } }
</style>
<main>
  <h1>Status Comment Indirect Selector Writer Review</h1>
  <p>object+0xa8[+0]을 읽는 status/menu selector record와, object VM dynamic writer opcode 0x8c/0x8d/0x8f의 +0 write 후보를 대조합니다.</p>
  <div class="decision"><b>결론:</b> r   z</div>
  <div class="cards">z</div>
  <section>
    <h2>Source Offset +0 Consumers</h2>
    <table><thead><tr><th>table</th><th>record</th><th>class</th><th>source</th><th>count</th><th>entry table</th></tr></thead><tbody>a  </tbody></table>
  </section>
  <section>
    <h2>Dynamic Writer Target +0 Candidates</h2>
    <table><thead><tr><th>command</th><th>raw</th><th>op</th><th>role</th><th>target</th><th>status/menu</th><th>status/comment</th><th>root selectors</th><th>field maps</th></tr></thead><tbody>z&</tbody></table>
  </section>
</main>
)r   itemsr   )r*   scardsconsumer_rowstarget_rowss        r   render_htmlr      s    YAGG GGI E
 GG 
 01
 
M ''  12 K(4 )*!J-(8'9 :W G HU  GV VC DO  CP PE% %r   c                 P   t         j                  d       t        j                  d       t               } t         dz  j	                  t        j                  | dd      d       t        d	z  j	                  t        |       d       | d
   }t        d|d    d|d    d       y )NT)exist_okz3status_comment_indirect_selector_writer_review.jsonF),:)ensure_ascii
separatorsr   r    z3status_comment_indirect_selector_writer_review.htmlr   z>wrote status comment indirect selector writer review (target0=r   z, statusMenu=r   ))	r$   mkdirWEBr   
write_textr"   dumpsr   print)r*   r   s     r   mainr     s    IItIIItI7D@@LL

4e
C M  	@@LLD M  	YA		-./}Q?`=a<bbc	er   __main__)r   r   returnr   )r]   )r   z
int | Noner   r8   r   r   )r)   r   r   dict[str, Any])r/   list[dict[str, Any]]r)   r   r   r   )r   r   )r3   r   rC   r8   r   dict[str, Any] | None)rX   bytesr   r   )rt   r   r/   r   r   r   )r   r   )r*   r   r   r   )r   None)'__doc__
__future__r   r   r"   collectionsr   pathlibr   typingr   probe_exe_scene_tablesr   r   r	   __file__resolveparentsROOTr   r$   r   ro   rp   rq   rr   r   r   r+   r1   rA   rD   rZ   r{   r   r   r   r   __name__r   r   r   <module>r      s    #      L L H~''*
]
Ul
Ul' ' H"22	 F%P($NEP& zF r   