
    Jj:                    f   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
 ddlmZmZmZ ddlmZmZmZmZ  ee      j+                         j,                  d   Zed	z  Zed
z  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#e$dk(  r e#        yy) a  Inventory strict active-object initializers and their +0xec scripts.

This is the broader follow-up to the 0x442c75 caller trace.  It scans only
valid command-boundary ``opcode 0x08`` object initializers that:

* write a valid VA into ``object +0xec``
* write the active/scripted gate ``object +0x14 = 0x0101``

The scan is intentionally strict to avoid the old false-positive raw-byte
candidate problem.  It classifies decoded ``+0xec`` scripts by evidence:
text/prompt payloads, map CNS operands, and direct map-loader references.
    )annotationsN)Path)Any)find_cns_stringsread_sectionsva_to_offset)decode_initializerdecode_streamhex32is_va   outzHwanse2.exeiDB c                ^    t        ||      }|t        dt        |       d      | |||z    S )NzVA z is outside raw sections)r   
ValueErrorr   )exesectionsvasizeoffsets        1tools/summarize_active_object_script_inventory.pyread_atr   &   s=    (B'F~3uRyk)ABCCvv}%%    c           	     :   	 t        | |||      }g }t        dt        t	        |      dz
  d            D ]S  }t        j                  d||      d   }||v s"|j                  ||z   t        ||z         |t        |      ||   d       U |S # t        $ r g cY S w xY w)Nr      z<IatVaatVaHextargetVatargetVaHexname)	r   r   rangemaxlenstructunpack_fromappendr   )	r   r   cns_stringsstart_var   datarefsr   values	            r   cns_refs_in_spanr,   -   s    sHh5 D3s4y1}a01 	""4v6q9KKK 6) F!23!$U|#E* 	 K  	s   B BBc                H    | d   D ]  }|d   |k(  st        |d         c S  y )NwritesfieldOffsetr+   )int)initfield_offsetwrites      r   field_valuer4   F   s6    h '</uW~&&' r   c                R    t        | |      }||dkD  rt        |      S |d|dS dS )Ni  0x04x )r4   r   )r1   r2   r+   s      r   field_value_hexr9   M   s>    l+E ,5<tZ_Zk5QT+FVtqstr   c                   g }|D ]  }|d   dvrt        |d         }|t        |d         z   }| || }d}	 |j                  d|      }|dk  rJt        |d         |z   }	t        | ||	      }
|
r`|
d   D cg c]  }t        |t        |d	               r| }}t	        |
d
         }|r&|r$t        |
      }|d   |d<   |j                  |       |dz   } |S c c}w )Nr    >   .data.rdatarawraw_sizer   s      r   ecWritesr+   activeGateWritessectionr   )r0   findr	   r   booldictr&   )r   r   rowsrA   	raw_startraw_endr)   indexhitr   r1   r3   	ec_writesactive_gaterows                  r   scan_initializersrM   R   s%   !#D 6?"55'	c'*"5669W%))/7CQwWT]#c)B%c8R8D "&j!1Xs5>':; 	 
 #4(:#;<t*C%,V_C	NKK$!GE# 2 Ks   6!Cc                <   t        | ||dd      }t        | |||d      }g }|d   D ]R  }|j                  dg       D ];  }|j                  d      }	|	|v s|j                  |d   |d   |	|d	   ||	   d
       = T |d   }
|D cg c]  }|d   j	                  d      s| }}|t        |      |d   t        |
      |
d d D cg c]  }|d	   |d   d c}t        |      t        |D cg c]  }|d   j	                  d      s| c}      |d d |d d |d   |d   |d   rdn	|
rdn|rdnd|d   d d D cg c]F  }|j                  d      |j                  d      |j                  d      |j                  dd      dH c}dS c c}w c c}w c c}w c c}w ) NP   i@  )max_commands	max_bytescommandspointerOperandsr+   r   vaHexvalueHexr   textPayloadRefsr    mapdecodedCommandCount   textPreview)rU   preview   mapLoaderRefFoundrouteProofFoundzroute-prooftext/prompt-interactionmap-cns-operand-candidatescript-no-text-no-map-proof
   	opcodeHex
opcodeNamesummaryr8   )rT   rc   rd   re   )scriptVascriptVaHexrX   textPayloadRefCounttextPayloadPreviewsmapCnsOperandRefCountmapCnsNearbyRefCountoperandCnsRefsnearbyCnsRefsr]   r^   classificationfirstCommands)r
   r,   getr&   
startswithr   r#   )r   r   r'   	script_vastreamspan_cns_refsoperand_cns_refscommandoperandtarget	text_refsrefmap_operand_refscmds                 r   
script_rowr}   p   s    3)"PUVF$S(KERM*% 
{{#4b9 		G[[)F$ ''#DM&w/ &#*:#6'/) 		
 ()I'7Y3v;;Q;QRW;XYYY'%&;<"9~ !!} 

   
O}- 
 "%%5!6 #M$cSS[E[E[\aEbS$c d*3B/&s+#$78!"34 '(   +   -. j)#2.
  ) WW[1!ggl3779b1	
7$ $ Z 
 %d
s%   F
F
F,FF:AFc                   | j                         }t        |      }t        ||      }t        ||      }t	        |D ch c]2  }|d   D ](  }t        |t        |d               rt        |d         * 4 c}}      }|D ci c]  }|t        ||||       }	}g }
|D ]  }t        |d   d   d         }|	|   }|
j                  i d|d   d|d   d|d	t        |      d
t        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      d|d   d|d   d|d   d|d   d|d           i }|	j                         D ]   }|j                  |d   d      dz   ||d   <   " |	j                         D cg c]
  }|d   s	| }}|	j                         D cg c]  }|d   dk(  s| }}|	j                         D cg c]  }|d   d k(  s| }}|	j                         D cg c]  }|d   d!k(  s| }}d"t        |      t        |      t        |      t        |      t        |      t        |      |t        t              d#d$d%
|
|D cg c]  }|	|   	 c}||d d |d d |d 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 ))Nr?   r+   r   initializerVar   initializerVaHexrT   rf   rg   
xCandidate   
yCandidate   
wCandidate   
hCandidate   field0x28Hex(   field0x2cHex,   field0x16Hex   scriptClassificationrn   rh   rj   rk   r^   r   r`   r_   ra   zActive object script inventoryFT)
strictInitializerCountuniqueObjectEcScriptCountrouteProofScriptCount!mapCnsOperandCandidateScriptCounttextPromptScriptCountunknownScriptCountclassificationCountsmapLoaderFunctionHexsceneAutoTransitionClaimmanualMovementAssumptionrO   )zIA strict active object initializer is not automatically a map transition.zKText/prompt scripts prove manual interaction scripting, not route behavior.z}Map CNS proximity is only a context candidate unless the decoded script writes a selected map/root or reaches the map loader.)	titlere   	inventoryscriptsrouteProofScriptsmapCnsOperandCandidateScriptstextPromptScriptsunknownScripts	nonClaims)
read_bytesr   r   rM   sortedr   r0   r}   r&   r   r4   r9   valuesrp   r#   MAP_LOADER_FUNCTION)exe_pathr   r   r'   initializersr1   r3   unique_script_vasr   r   r   	ec_targetscriptclass_countsrL   route_scriptsmap_context_scriptstext_scriptsunknown_scriptss                      r   build_summaryr      s   



CS!H"31K$S(3L  *%  3uW~./ 	E'N    IZZ"r:c8["==ZGZI Z(+G45	# 
T$Z
W
 	
 5+	

 +dD1
 +dD1
 +dD1
 +dD1
 OD$7
 OD$7
 OD$7
 #F+;$<
 "6*?#@
 $V,C%D
 #F+A$B
  v&78!
 	, $&L~~ ].:.>.>sCS?TVW.X[\.\S)*+]$+NN$4OS<M8NSOMO*1..*:s3cBR>SWr>r3ss#*>>#3jCs;K7LPi7iCjLj&-nn&6qs#>N:OSp:psqOq 2&),&7),->)?%(%7145H1I%(%6"%o"6$0$)*=$>(-(,
 *;<BGBK<*)<Sb)A)#2.)#2.
) O  [8 Psjq" =sA   7J 
J&'
J+2J+
J0J00J5>J5J:$J:?J?
c           
        | d   }dLd}| d   D cg c]
  } ||       }}| d   d d D cg c]
  } ||       }}| d   d d D cg c]
  } ||       }}| d   d d D cg c]
  } ||       }}d	j                  d
 t        |d   j                               D              }dj                  g 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)    dd*|d+    dd,|d-    dd.d/d0d1|d    d2d3|d!    d2d4|d#    d2d5|d%    d2d6|d'    d2d7|d)    d2d8t        |d+         j	                          d9d:d;d<| d=d>d?|xs d@gdAdBd?|dAdCd?|dAdDd?|dAdEd<| dF   D 	cg c]  }	dGt        j                  |	       dH c}	dIdJdK      S c c}w c c}w c c}w c c}w c c}	w )MNre   c                    dj                  d | d   d d D              }d| d    dt        j                  | d          d	| d
    d	| d    d	| dS )Nz<br>c              3     K   | ]l  }d t        j                  t        |d                dt        j                  t        |d                dt        j                  t        |d                 n yw)z<code>rc   z</code> rd    re   N)htmlescapestr).0r|   s     r   	<genexpr>z2render_html.<locals>.row_script.<locals>.<genexpr>   s      
 T[[S%5!678SQTUaQbMcAd@eefgkgrgrsvwz  |E  xF  tG  hH  gI  J
s   A2A4ro      z<tr><td><code>rg   z</code></td><td>rn   z	</td><td>rh   rj   z
</td></tr>)joinr   r   )rL   rR   s     r   
row_scriptzrender_html.<locals>.row_script   s    ;; 
?+BQ/
 

]+, -;;s#3456 7,-. /./0 1* 	
r   r   r   r   r   r   rO   r8   c              3  Z   K   | ]#  \  }}d t        j                  |       d| d % yw)z<li>z: </li>N)r   r   )r   keyr+   s      r   r   zrender_html.<locals>.<genexpr>  s5      C t{{3 5'/s   )+r   
z<!doctype html>z<html lang="ko">z<head>z  <meta charset="utf-8" />z/  <title>Active Object Script Inventory</title>z	  <style>z~    body{font-family:system-ui,-apple-system,Segoe UI,sans-serif;margin:24px;line-height:1.5;color:#1f2937;background:#f8fafc}z>    code{background:#e5e7eb;border-radius:4px;padding:1px 4px}zR    table{border-collapse:collapse;width:100%;background:white;margin:12px 0 24px}zR    th,td{border:1px solid #d1d5db;padding:8px;text-align:left;vertical-align:top}z    th{background:#f3f4f6}z)    .marker{font-size:12px;color:#475569}z
  </style>z</head>z<body>z)  <h1>Active Object Script Inventory</h1>z.  <p class="marker">strict initializer count: r   z</p>z6  <p class="marker">unique object +0xec script count: r   z.  <p class="marker">route proof script count: r   z<  <p class="marker">map CNS operand candidate script count: r   z.  <p class="marker">text/prompt script count: r   z*  <p class="marker">unknown script count: r   z1  <p class="marker">scene auto transition claim: r   z0  <p class="marker">manual movement assumption: r   z  <p>This page inventories strict active-object initializers. It does not promote any script to a route without map-loader/root evidence.</p>z
  <script>z4    window.HWANSE_ACTIVE_OBJECT_SCRIPT_INVENTORY = {z      strictInitializerCount: ,z!      uniqueObjectEcScriptCount: z      routeProofScriptCount: z)      mapCnsOperandCandidateScriptCount: z      textPromptScriptCount: z      unknownScriptCount: z       sceneAutoTransitionClaim: z    };z  </script>z   <h2>Classification Counts</h2>z  <ul>z</ul>z  <h2>Route Proof Scripts</h2>z  <table><thead><tr><th>script</th><th>class</th><th>text refs</th><th>map CNS refs</th><th>first commands</th></tr></thead><tbody>z"<tr><td colspan="5">none</td></tr>z  </tbody></table>z%  <h2>Map CNS Operand Candidates</h2>z  <h2>Text/Prompt Scripts</h2>z  <h2>Unknown Scripts</h2>u     <h2>하지 않는 주장</h2>r   z    <li>r   z  </ul>z</body>z</html>)rL   dict[str, Any]returnr   )r   r   itemsr   lowerr   r   )
re   sr   rL   
route_rowsmap_rows	text_rowsunknown_rowsclass_itemsitems
             r   render_htmlr      s   	A
 .55H-IJc*S/JJJ+23R+STWUW+XYC
3YHY,34G,H",MNSCNIN/67G/H"/MNJsONLN''  #9!:!@!@!BC K 99 === 	= 	%	=
 	:= 	= 	I= 	I= 	]= 	]= 	%= 	4= 	= 	= 	=  	4!=" ;1=U;V:WW[\#=$ C1E`CaBbbfg%=& ;1=T;U:VVZ['=( IKnIoHpptu)=* ;1=T;U:VVZ[+=, 7q9M7N6OtT-=. >a@Z>[=\\`a/=0 =Q?Y=Z<[[_`1=2 	X3=4 	5=6 	?7=8 )+C)D(EQG9=: ,A.I,J+K1M;=< (*A(B'C1E==> 4A6Y4Z3[[\]?=@ (*A(B'C1EA=B %Q';%<$=Q?C=D +3q1K/L+M+S+S+U*VWE=F 	G=H 	I=J 	+K=L U#M=N 	)O=P 	NQ=R 
@?@S=T 	U=V 	0W=X 	NY=Z 
[=\ 	]=^ 	)_=` 	Na=b 
c=d 	e=f 	%g=h 	Ni=j 
k=l 	m=n 	*o=p 	q=r ;B+:N	O$HT[[&'u
-	Os=t 	u=v 	w=x 	y= = = KYNN| 
Ps   GG#G("G-0 G2
c                 x   t        j                  t              } | j                  dt        t
               | j                  dt        d d       | j                         }t        j                  d       t        |j                        }t        d	z  j                  t        j                  |d
d      dz   d       |j                  M|j                  j                  j                  dd       |j                  j                  t!        |      d       t#        t        j                  |d   d
d             y )N)descriptionz--exe)typedefaultz
--html-outzHOptional HTML review path. By default only the JSON evidence is written.)r   r   helpT)exist_okz#active_object_script_inventory.jsonF)r   :)ensure_ascii
separatorsr   zutf-8)encoding)parentsr   re      )r   indent)argparseArgumentParser__doc__add_argumentr   EXE
parse_argsOUTmkdirr   r   
write_textjsondumpshtml_outparentr   print)parserargsre   s      r   mainr   P  s   $$9F
dC8
W	   DIItIDHH%G00<<

7:FM =  }} ""4$"?  W!5 H	$**WY'eA
FGr   __main__)
r   bytesr   
list[dict]r   r0   r   r0   r   r   )i  )r   r   r   r   r'   dict[int, str]r(   r0   r   r0   r   list[dict[str, Any]])r1   r   r2   r0   r   z
int | None)r1   r   r2   r0   r   r   )r   r   r   r   r   r   )
r   r   r   r   r'   r   rr   r0   r   r   )r   r   r   r   )re   r   r   r   )r   None)%r   
__future__r   r   r   r   r$   pathlibr   typingr   probe_exe_scene_tablesr   r   r   'summarize_object_payload_442c75_callersr	   r
   r   r   __file__resolver   ROOTr   r   r   r   r,   r4   r9   rM   r}   r   r   r   __name__ r   r   <module>r      s   #       P P  H~''*
Ul
]  & 	   	
  2u
<:	::  : 	:
 :zFRWtH. zF r   