
    UHj9u                       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  e	e      j!                         j(                  d   Zedz  Zd	Zd
Zedz  e dz  Zedz  e dz  ZdddddZdddddZdZg dZg dZdddgdddgddddgdgZ d<d Z!d=d!Z"d>d"Z#d?d#Z$d@d$Z%dAd%Z&dBd&Z'dCd'Z(dCd(Z)dDd)Z*dEd*Z+dFd+Z,dGd,Z-dHd-Z.dId.Z/dJd/Z0dKd0Z1dLd1Z2dMd2Z3dNd3Z4dOd4Z5dPd5Z6dQd6Z7eedf	 	 	 	 	 	 	 dRd7Z8dSd8Z9efdTd9Z:dUd:Z;e<d;k(  r e;        yy)VzHScan decoded map1_01a CNS tilemap payload for exit-coordinate encodings.    )annotationsN)Path)Any)decompress_cns   outmap1_01amap2_02dextract_fldz.cns      )topbottomleftright)r   )r   r   )r   r   )r   r      )zseparate-cns-coordinate-payloadzoutside-structured-tilemap-hitzstrict-source-target-cns-ownerzruntime-trigger-proof)zCseparate CNS coordinate payload outside the 37x48 two-layer tilemapz7coordinate-like hit outside the structured tilemap bodyz<strict map1_01a -> map2_02d owner for a CNS coordinate matchz<runtime trigger proving a CNS payload match selects map2_02dzextract_fld/map1_01a.cnszdecoded tilemap payloadzcoordinate scans)pathfieldszextract_fld/map2_02d.cnsztarget CNS payload summaryzout/map_exit_candidates.jsonexitCandidatesblockedTargetCandidatesc                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)r   fallbacks     E/home/exedev/hwanse/tools/summarize_map1_01a_exit_cns_payload_scan.py	load_jsonr"   3   s*    ;;=::dnngn677    c                $    | j                  d      S )N )hex)datas    r!   	hex_bytesr(   9   s    88C=r#   c                2    t        | t              rd| dS dS )N0x04x-
isinstanceint)values    r!   hex_wordr1   =   s    )%5Rc{>3>r#   c                h   t        |       dk  rt        d      t        j                  | dd d      }t        j                  | dd d      }||z  }d}||dz  z   }||dz  z   }|dk  s|dk  s|t        |       k7  r t        d| d| d| d	t        |              |||t        |       dd|||dz  |d

S )N   z5decoded CNS payload is too short for a tilemap headerr   r   littlez2decoded CNS payload is not a 2-layer u16 tilemap: xz, expected z, got )
widthheight	tileCountdecodedSizeheaderOffset
headerSizelayer0Offsetlayer1OffsetlayerByteSizestructuredPayloadEnd)len
ValueErrorr/   
from_bytes)decodedr6   r7   
tile_countlayer0_offsetlayer1_offsetexpected_sizes          r!   parse_tilemaprH   A   s    
7|aPQQNN71Q<2E^^GAaL(3FJM!JN2M!JN2MzVq[MS\$A@gQvhk-s7|nN
 	

 7|%%#a - r#   c                    | j                  d      xs i }t        j                  | j                  d      d      t        |j                  d      xs d      t        |j                  d      xs d      fS )Nsamplesidec   yr   r5   )get
SIDE_ORDERr/   )	candidaterJ   s     r!   candidate_sort_keyrQ   ]   s`    ]]8$*Fy}}V,b1FJJsO q!FJJsO q! r#   c                   g }| D ]  }|j                  d      t        k7  r|j                  d      xs g D ]  }|j                  d      xs i }g |j                  d      xs g |j                  d      xs g }|j                  d      }|j                  d      }t        |v sot        |t              st        |t              s|j                  |         i }|D ]L  }	|	j                  d      xs i }|	||	j                  d      |j                  d      |j                  d      f<   N t        |j                         t        	      S )
Nmapr   rJ   r   selectorTargetCandidatesr5   rM   rK   key)	rN   SOURCETARGETr.   r/   appendsortedvaluesrQ   )
map_exit_candidatesrowsmap_rowrP   rJ   targetsr5   rM   uniquerows
             r!   exit_candidatesrb   f   s<   D& ';;u' %56<" 		'I]]8,2F-- 9:@b-- :;ArG 

3A

3A Z3%7Jq#<NI&		'' F J"(bFIC&**S/BCJ &--/'9::r#   c                T    d| cxk  rdk  rn y d|cxk  rdk  sy  y t        | |g      S )Nr      )bytesr5   rM   s     r!   
byte_pointrg   |   s6    McM  1mm ,!Q=r#   c                    d| cxk  rdk  rn y d|cxk  rdk  sy  y |dk(  rt        j                  d| |      S t        j                  d||       S )Nr     xyz<HHstructpack)r5   rM   orders      r!   
word_pointro      sY    f "#a!16!1 "2}{{5!Q'';;ua##r#   c                    d| cxk  rdk  rn y d|cxk  rdk  sy  y |dk(  r|dz  | z  n| dz  |z  }t        j                  d|      S )Nr   ri   rj   r   z<Irk   )r5   rM   rn   r0   s       r!   packed_u32_pointrq      sZ    f "#a!16!1 "2"d]Q"WMbAE;;tU##r#   c                    t         j                  | d      \  }}|r|dz
  |f||f|dz   |fgS |r||dz
  f||f||dz   fgS ||fgS )Nr   r   r   )SIDE_VECTORrN   )rK   r5   rM   dxdys        r!   side_axis_pointsrw      si    __T6*FB	Q
QFQUAJ//	AE
QFQAJ//F8Or#   c                   | j                  d      xs i }|j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  d      }t        d ||||fD              sg S |dk(  rd	||fd
||fd||fd||fg}n|dk(  rd	||fd
||fd||fd||fg}ng S t               }g }	|D ]4  \  }
}}||f|v r|j                  ||f       |	j	                  |
||f       6 |	S )NspanaxisfromtoperpendicularFromperpendicularToc              3  <   K   | ]  }t        |t                y wNr-   ).0r0   s     r!   	<genexpr>z%span_corner_points.<locals>.<genexpr>   s     P%z%%Ps   r5   zspan min/minzspan max/minzspan min/maxzspan max/maxrM   )rN   allsetaddrY   )rP   ry   rz   startendp_startp_endpointsseenr]   labelr5   rM   s                r!   span_corner_pointsr      sE   == &BD88FDHHVE
((4.Chh*+GHH&'EPE33OPP	s{UG,S'*UE*S%(	
 
We,UE*Wc*UC(	
 	5DD #q!q6T>!QUAqM"	#
 Kr#   c                    | d   }| d   }| d   }| d   }||z   }|dk  s||k\  rddddS ||k  rd	}|}	d
}
n0||k  rd}|}	||z
  dz  dk(  }|rdnd}
nd}|}	||z
  dz  dk(  }|rdnd}
||	kD  r| d}
||
||	kD  dS )Nr;   r<   r=   r?   r   outside-structured-map-payloadF)sectionclassificationcrossesSectionheadertilemap-header-byte-collisionlayer0r   #layer0-aligned-tile-index-collisionlayer0-byte-overlap-collisionlayer1#layer1-aligned-tile-index-collisionlayer1-byte-overlap-collisionz-boundary-crossing-collision )tilemapoffsetlength
header_endlayer0_startlayer1_startstructured_endr   r   section_endr   aligneds               r!   classify_offsetr      s   &J>*L>*L34N
6/CzV~-7>#
 	

 
 8	,	"L(A-2  20 	 $L(A-2  20 	
 [#9$@A(+ r#   c                ^   |d   }|d   }|d   }||cxk  r|k  rn nd}||z
  }n||cxk  r|k  rn i S d}||z
  }ni S |dz  }|dz  dk(  }	||d   z  }
||d   z  }|dk(  r|n||dz  z   }d }|dz   t        |       k  rt        j                  | ||dz    d      }||	||
|d	|t        |      d
S )Nr<   r=   r?   r   r   r   r6   r4   rf   )layer
alignedU16	tileIndextile	tileValuetileValueHex)r@   r/   rB   r1   )rC   r   r   r   r   r   r   rel
tile_indexr   tile_xtile_yword_offsetr0   s                 r!   tile_contextr      s   >*L>*L34Nv,,|#		0.	0 	 |#	JAglG''**F77++F#(A:<<:PQ>QKEQ#g,&w{;?CXN6*  r#   c                    dddddddj                  t        | j                  d            d	      }|t        | j                  d
      xs d      fS )Nr   r   r   r   r3      )r   r   r   r   r   r   r      r   )rN   strr/   )ra   prioritys     r!   hit_priorityr     s[    *+)*/0/0)*)* 
c#cgg&'
(!,  S*/a000r#   c                0   i }i }d}d}d}	g d}
	 | j                  ||
      }|dk  rnD|dz   }
t        ||t        |            }|d   }|d   }|j                  |d      dz   ||<   |j                  |d      dz   ||<   |dz  dk(  r|dz  }|dz  dk(  r|dz  }|	dz  }	|d|d|||d	   |dz  dk(  |dz  dk(  t	        | ||      t        | t        d|d
z
        t        t        |       |t        |      z   d
z                d	}t              t        k  rj                  |       nEt        |      t        d D              k  r't        t        t                    fd      }||<   ]||t        |      |	||t        t        |j                                     t        t        |j                                     |j                  dd      |j                  dd      |j                  dd      |j                  dd      z   t        t              dS )Nr   r   r   r   r   r3   r*   r+   r      )	r   	offsetHexr   r   r   alignedU16OffsetalignedU32OffsettileContext
contextHexc              3  2   K   | ]  }t        |        y wr   r   r   items     r!   r   zscan_pattern.<locals>.<genexpr>6  s     (Pd);(Ps   c                     t        |          S r   r   )indexsampless    r!   <lambda>zscan_pattern.<locals>.<lambda>7  s    |GTYN?[ r#   rU   r   r   r   r   )r   r   
patternHexhitCountalignedU16HitCountalignedU32HitCountsectionCountsclassificationCountsoutsideStructuredHitCountheaderHitCountlayerHitCountr   )findr   r@   rN   r   r(   maxminSAMPLE_LIMITrY   r   rangedictrZ   items)rC   r   r   r   patternsection_countsclassification_countsaligned_u16_countaligned_u32_count	hit_countsearchhit
classifiedr   r   contextworstr   s                    @r!   scan_patternr     sX   %'N,.IGF
ll7F+7q$Wc3w<@
Y'#$45"0"4"4Wa"@1"Dw0E0I0I.Z[0\_`0`n-7a<"7a<"Q	c#Y,()9: #a1 #a1'#>#GC37OSWsUXY`UaOadeOe=f$gh

 w<,&NN7#'"S(P(P%PPc'l+1[\E$GEN= @ (//f^%9%9%;<= $V,A,G,G,I%J K%:%>%>?_ab%c(,,Xq9'++Ha8>;M;MhXY;ZZ'|4 r#   c                "    | |ddddi i dddg ddS )Nr,   r   T)r   r   r   r   r   r   r   r   r   r   r   r   skippedOutOfRanger   )r   r   s     r!   skipped_scanr   I  s3     "%&! r#   c           	     >   | j                  d      xs i }t        | j                  d      xs d      }t        |d         }t        |d         }t        j                  |d      \  }}||z   }||z   }d||dfd||d	fd
|dz   |dz   dfd
|dz   |dz   d	fd||dfd||d	fgS )NrJ   rK    r5   rM   rs   r   rj   yxz	one-basedr   outside)rN   r   r/   rt   )	rP   rJ   rK   r5   rM   ru   rv   	outside_x	outside_ys	            r!   coordinate_variantsr   [  s    ]]8$*Fy}}V$*+DF3KAF3KA__T6*FBBIBI	At	At	a!eQUD)	a!eQUD)	Iy$/	Iy$/ r#   c                   g }g }g }t        |      D ]T  \  }}}}	|	dk(  rt        ||      nt        ||      }
| d|	 }|
|j                  t        |d             n7t	        | ||d|
      }|j                  ||d|	d       |j                  |       t        |||	      }| d|	 }||j                  t        |d             n7t	        | ||d|      }|j                  ||d|	d       |j                  |       t        |||	      }| d|	 }||j                  t        |d	             t	        | ||d	|      }|j                  ||d|	d       |j                  |       W |||fS )
Nrj   z byte z	byte-pairrf   )pointpackedOrderz word-pair zu16-pairz packed-u32 z
packed-u32)r   rg   rY   r   r   updatero   rq   )rC   r   rP   
byte_scans
word_scanspacked_scanskindr5   rM   rn   byte_pattern
byte_labelra   word_pattern
word_labelpacked_patternpacked_labels                    r!   scan_coordinate_patternsr   m  s   JJL0; %aE+0D=z!Q'jA>NvVE7+
l:{CDw[,WCJJqq!1%HIc"!!Q.v[0
l:zBCwZVCJJqq!1%HIc")!Q6|E73!\< HIw|^\CJJqq!1%HI$5%6 z<//r#   c                   |j                  d      xs i }t        |j                  d      xs d      }t        |d         }t        |d         }g }g }dt        |||      D 	
cg c]
  \  }	}
d |	|
f c}
}	fdt	        |      fg}|D ]p  \  }}|sHdD ]B  }|j                  t        | d	| d
             |j                  t        | d| d             D QdD ]  }g }g }|D ]d  \  }}	}
|dk(  rt        |	|
      nt        |
|	      }t        |	|
|      }|g }|g }|||j                  |       |Q|T|j                  |       f |r3|j                  t        | || d	| d
dj                  |                   n |j                  t        | d	| d
             |r3|j                  t        | || d| ddj                  |                   |j                  t        | d| d              s ||fS c c}
}	w )NrJ   rK   r   r5   rM   zaxis 3-pointzspan corner)rj   r   z byte sequence zbyte-sequencez word sequence zu16-sequencerj   r#   )rN   r   r/   rw   r   rY   r   rg   ro   r   join)rC   r   rP   rJ   rK   r5   rM   byte_sequencesword_sequencespxpysequence_specslabel_prefixr   rn   
byte_parts
word_parts_label	byte_part	word_parts                       r!   scan_sequence_patternsr
    s   ]]8$*Fy}}V$*+DF3KAF3KANN	7GaQR7STVR4R.TU	*956N !/ +mf% m%%ll^?SXRY3Z\k&lm%%ll^?SXRY3Z\j&klm ! %	mEJJ"( 
1B274-Jr2.ZPRTVEW	&r2u5	$!#J$!#J)i.C%%i0)i.C%%i0
1 %% '.w?', %%ll^?SXRY3Z\k&lm%% '.w?&, %%ll^?SXRY3Z\j&klK%	m+mX >))_ Us   %H c                ,    t        fd| D              S )Nc              3  Z   K   | ]"  }t        |j                        xs d        $ yw)r   N)r/   rN   )r   ra   rV   s     r!   r   zsum_key.<locals>.<genexpr>  s#     6#s3773<$1%6s   (+)sum)r]   rV   s    `r!   sum_keyr    s    6666r#   c                    i }| D ]R  }|j                  |      xs i j                         D ]*  \  }}|j                  |d      t        |xs d      z   ||<   , T t        t	        |j                                     S )Nr   )rN   r   r/   r   rZ   )r]   rV   countsra   r   counts         r!   merge_countsr    s|    F C WWS\/R668 	CLE5"JJua03uz?BF5M	CC v||~&''r#   c                <   |j                  d      xs i }|j                  d      }t        |d         }t        |d         }t        | ||      \  }}}	t        | ||      \  }
}g |||	|
|}t	        |d      }i d|d||dd|j                  d      xs i d	|d
|d|	d|
d|dt	        |d      dt	        |d      dt	        |	d      dt	        |
d      dt	        |d      d|dt	        |d      dt	        |d      dt        |d      d|dkD  iS )NrJ   rK   r5   rM   r   r   rf   ry   bytePairScanswordPairScanspackedU32ScansbyteSequenceScanswordSequenceScansbytePairHitCountr   wordPairHitCountpackedU32HitCountbyteSequenceHitCountwordSequenceHitCountr   r   r    strictCnsCoordinateEvidenceFoundr   )rN   r/   r   r
  r  r  )rC   r   rP   rJ   rK   r5   rM   r   r   r   r   r   	all_scansoutside_hit_counts                 r!   scan_candidater!    s   ]]8$*F== DF3KAF3KA+CGWV_+`(J
L%;GWi%X"NN[*[z[L[>[N[I	+FGaa  		f%+ 		
 	 	, 	^ 	^ 	GJ
; 	GJ
; 	W\:> 	
 C 	
 C 	$%6 	')-=>  	O<!" 	Y8N O#$ 	+,=,A% r#   c                    t        | j                               }t        |      }t        | j	                  t
                    |d   |d   |d   |d   |d   |d   |d   |d   |d	   d

S )Nr9   r6   r7   r8   r;   r<   r=   r>   r?   )
r   r9   r6   r7   r8   r;   r<   r=   r>   r?   )r   
read_bytesrH   r   relative_toROOT)r   rC   r   s      r!   cns_payload_summaryr&    s    T__./GG$GD$$T*+}-!(#[)l+// 1 '(> ? r#   c                    t        | j                               }t        |      }||nt        t        dz  g       }t        |      }|D cg c]  }t        |||       }}g }|D ]  }	|j                  |	j                  d      xs g        |j                  |	j                  d      xs g        |j                  |	j                  d      xs g        |j                  |	j                  d      xs g        |j                  |	j                  d      xs g         t        d |D              }
t        d |D              }t        d	 |D              }t        d
 |D              }t        d |D              }t        d |D              }t        d |D              }t        d |D              }|dkD  }i dt        |      d|
d|d|d|d|dt        d |D              dt        d |D              dt        d |D              dt        d |D              dt        d |D              d |d!|d"|d#t        |d#      d$|}d%|d&    d'|d(    d)|d*    d+t        |       d,| d-}i d.t        d/t        d0t        |       d1t        |      dt        |      d|
d|d|d|d|d|d   d|d   d|d   d|d   d|d   d |d!|||d#   ||rd2nd3|||rg nt        |rg nt         t"        t        t"              |||d4S c c}w )5Nmap_exit_candidates.jsonr  r  r  r  r  c              3  X   K   | ]"  }t        |j                  d       xs g        $ yw)r  Nr@   rN   r   ra   s     r!   r   z build_summary.<locals>.<genexpr>  #     bss377?#;#ArBb   (*c              3  X   K   | ]"  }t        |j                  d       xs g        $ yw)r  Nr*  r+  s     r!   r   z build_summary.<locals>.<genexpr>  r,  r-  c              3  X   K   | ]"  }t        |j                  d       xs g        $ yw)r  Nr*  r+  s     r!   r   z build_summary.<locals>.<genexpr>  s$     dCGG,<$=$C Ddr-  c              3  X   K   | ]"  }t        |j                  d       xs g        $ yw)r  Nr*  r+  s     r!   r   z build_summary.<locals>.<genexpr>  $     "js3sww/B'C'Ir#J"jr-  c              3  X   K   | ]"  }t        |j                  d       xs g        $ yw)r  Nr*  r+  s     r!   r   z build_summary.<locals>.<genexpr>   r1  r-  c              3  @   K   | ]  }|j                  d d        yw)r   r   NrN   r+  s     r!   r   z build_summary.<locals>.<genexpr>!  s     cCGG$?Cc   c              3  @   K   | ]  }|j                  d d        yw)r   r   Nr4  r+  s     r!   r   z build_summary.<locals>.<genexpr>"  s     WC377#3Q7Wr5  c              3  @   K   | ]  }|j                  d d        yw)r   r   Nr4  r+  s     r!   r   z build_summary.<locals>.<genexpr>#  s     U##''/15Ur5  r   candidateCountbytePairScanCountwordPairScanCountpackedU32ScanCountbyteSequenceScanCountwordSequenceScanCountr  c              3  @   K   | ]  }|j                  d d        yw)r  r   Nr4  r+  s     r!   r   z build_summary.<locals>.<genexpr>,       ^3(:A >^r5  r  c              3  @   K   | ]  }|j                  d d        yw)r  r   Nr4  r+  s     r!   r   z build_summary.<locals>.<genexpr>-  r?  r5  r  c              3  @   K   | ]  }|j                  d d        yw)r  r   Nr4  r+  s     r!   r   z build_summary.<locals>.<genexpr>.  s      `S)<a!@ `r5  r  c              3  @   K   | ]  }|j                  d d        yw)r  r   Nr4  r+  s     r!   r   z build_summary.<locals>.<genexpr>/       #f3CGG,BA$F#fr5  r  c              3  @   K   | ]  }|j                  d d        yw)r  r   Nr4  r+  s     r!   r   z build_summary.<locals>.<genexpr>0  rC  r5  r   r   r   r   r  zDecoded map1_01a.cns does not contain a separate strict exit-coordinate payload for map1_01a -> map2_02d. The file is exactly a r6   r5   r7   z two-layer u16 tilemap (r9   z^ bytes), so coordinate-like hits are confined to the header or layer tile-index bytes. Across z! route candidates the scan found z hit(s) outside the structured tilemap payload. CNS payload matches remain tile-index collisions, not promotable hotspot evidence.sourcetarget	sourceCns	targetCnszready-for-reviewblocked)r   r   r  promotionStatus
proofFound"exitCnsPayloadCoordinateProofFoundfailedExitCnsPayloadGateIdsmissingEvidenceevidenceRefsevidenceRefCountcandidateSummariesfalsePositiveSummary
conclusion)r   r#  rH   r"   OUTrb   r!  extendrN   r  r@   r  rW   rX   r&   FAILED_EXIT_CNS_PAYLOAD_GATE_IDS!EXIT_CNS_PAYLOAD_MISSING_EVIDENCEEXIT_CNS_PAYLOAD_EVIDENCE_REFS)source_cns_pathtarget_cns_pathr\   source_decodedsource_tilemap
candidatesrP   candidate_summariesall_candidate_scansra   byte_pair_scan_countword_pair_scan_countpacked_u32_scan_countbyte_sequence_scan_countword_sequence_scan_countr   header_hit_countlayer_hit_countstrict_foundfalse_positive_summaryrS  s                        r!   build_summaryri    s   
 $O$>$>$@AN">2N1D1P-V_((
W !!45J $ 	~~yA  " G""377?#;#ArB""377?#;#ArB""377+;#<#BC""377+>#?#E2F""377+>#?#E2FG bNabbbNabbdPcdd""jVi"jj""jVi"jjcObccWCVWWUATUUO$q(L#121 	1 	3	
 	 !9 	 !9 	C^J]^^ 	C^J]^^ 	S `L_ `` 	#fRe#f f 	#fRe#f f 	* 	 	$%6 	-@BX Y  	+L!&	!!/!8 9>(;S:T U=)* +)*++LM^L_ `n	n && 	(9 	(9	
 	#12 	1 	1 	3 	 !9 	 !9 	23EF 	23EF 	34GH 	 67M N 	 67M N  	*!" 	#$ &7 67M N,81=-9".:-9r?_!-23T6 >?1 6 = [s   Lc           $        dj                  d | j                  d      xs g D              }dj                  d | j                  d      xs i j                         D              }| j                  d      xs i }dj                  ddd	d
ddddddt        j                  | d          ddt        j                  t        | d                dt        j                  t        | d                dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   dt        j                  t        | d                dd t        j                  t        | d!                d"t        j                  t        | d#                d"t        j                  t        | d$                d%t        j                  t        | d&                d"t        j                  t        | d'                d(t        j                  t        | d)                d"t        j                  t        | d*                d"t        j                  t        | d+                d,t        j                  t        | d-                d.d/t        j                  t        | j                  d0                   d1t        j                  d2j                  | j                  d3      xs g       xs d4       d5t        j                  t        | j                  d6                   d.d7d8dj                  d9 | j                  d:      xs g D              d;d<d8dj                  d= | j                  d>      xs g D              d;d?d@| dAdBdC| dAdDdEdFg      S )GN
c              3    K   | ]V  }d t        j                  t        |j                  d                   dt        j                  t        |j                  d      xs i j                  d                   dt        j                  t        |j                  d      xs i j                  d                   dt        j                  t        |j                  d                   d	t        j                  t        |j                  d
                   d	t        j                  t        |j                  d                   d	t        j                  t        |j                  d                   d	t        j                  t        |j                  d                   d	t        j                  t        |j                  d                   d	t        j                  t        |j                  d                   d	t        j                  t        |j                  d                   d	t        j                  t        |j                  d                   d Y yw)z<tr><td>rK   z</td><td><code>r   r5   ,rM   </code></td><td>r  z	</td><td>r  r  r  r  r   r   r   r  
</td></tr>N)htmlescaper   rN   r+  s     r!   r   zhtml_page.<locals>.<genexpr>a  s      	{{3swwv/01 2[[cggfo&;%@%@%E!FGH;;sCGGFO1r66s;<=
> ?{{3sww'9:;<= >{{3sww'9:;<= >{{3sww':;<=> ?{{3sww'=>?@A B{{3sww'=>?@A B{{3sww'789:; <{{3sww789: ;{{3sww'BCDEF G{{3sww'IJKLM N	s   IIrQ  c           	   3     K   | ]H  \  }}d t        j                  t        |             dt        j                  t        |             d J yw)z<tr><td><code>rn  ro  N)rp  rq  r   )r   rV   r0   s      r!   r   zhtml_page.<locals>.<genexpr>r  sS      $
 C		[[S*+ ,{{3u:&' (	$s   AAr   rG  z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">z/  <title>map1_01a Exit CNS Payload Scan</title>a    <style>body{font-family:system-ui,sans-serif;margin:24px;line-height:1.45;max-width:1200px}table{border-collapse:collapse;width:100%;margin:16px 0}td,th{border:1px solid #ddd;padding:6px 8px;text-align:left;vertical-align:top}th{background:#f5f5f5}code{white-space:nowrap}</style>z</head>z<body>z)  <h1>map1_01a Exit CNS Payload Scan</h1>z  <p>rS  z</p>z  <p><b>Route:</b> <code>rE  z</code> -&gt; <code>rF  z</code>; source CNS <code>r   z</code> r6   r5   r7   z; promotion status <code>rJ  z</code>.</p>z)  <p><b>Scan:</b> byte/word/packed scans r9  /r:  r;  z; byte/word sequence scans r<  r=  z; header/layer/outside hits r   r   r   z!; strict CNS coordinate evidence r  z.</p>z  <p><b>proof found:</b> rK  z.; <b>failed exit CNS payload gates:</b> <code>rm  rM  r,   z</code>; <b>evidence refs:</b> rP  z  <h2>Missing Evidence</h2>z  <ul>c              3  N   K   | ]  }d t        j                  |       d  yw)z    <li></li>N)rp  rq  r   s     r!   r   zhtml_page.<locals>.<genexpr>  s#     g$HT[[./u5gs   #%rN  z  </ul>z  <h2>Evidence Refs</h2>c              3     K   | ]m  }d t        j                  t        |j                  d                   dt        j                  dj	                  |j                  d      xs g              d o yw)z    <li><code>r   z	</code>: z, r   ru  N)rp  rq  r   rN   r   )r   refs     r!   r   zhtml_page.<locals>.<genexpr>  se      
  T[[SWWV_)=>?y{{499SWWX%6%<"=>?uF
s   A3A5rO  z  <h2>Candidates</h2>z  <table><thead><tr><th>side</th><th>tile</th><th>byte hits</th><th>word hits</th><th>packed hits</th><th>byte seq</th><th>word seq</th><th>header</th><th>layer</th><th>outside</th><th>strict evidence</th></tr></thead><tbody>z</tbody></table>z   <h2>Classification Counts</h2>zL  <table><thead><tr><th>classification</th><th>hits</th></tr></thead><tbody>z</body>z</html>r   )r   rN   r   rp  rq  r   )summarycandidate_rowsclassification_rows
source_cnss       r!   	html_pager|  `  s   YY  ;;34: N" )) $
 #;;'=>D"KKM$  [)/RJ99"9 	e3
GL12348[[WX%6!789 :[[WX%6!789 :  $C
v0F,G HI{{3z~~g67894;;s:>>ZbKcGd;e:f g&&*kk#g>O6P2Q&R%SS_a 8{{3w':;<=>a{{3w':;<=>a{{3w';<=>? @({{3w'>?@AB!{{3w'>?@AB C){{3w'789:;1{{3w789:!{{3w'BCDEF G.{{3w'IJKLMUT ({{3w{{<89:; <[['++6S*T*ZXZ![!b_bcd e%%)[[W[[AS5T1U%V$WW\	^ 	&		g'++N_B`Bfdfgg"		 
 {{>28b
 	

 	 %%%57
 	+
VWjVkk{|
AA A Ar#   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok#map1_01a_exit_cns_payload_scan.jsonFr   )ensure_asciiindentrk  r   r   )mkdir
write_textr   dumps)rx  out_dirs     r!   write_outputsr    sD    MM$M.44@@

7q9D@ A r#   c                    t        j                  t              } | j                  dt        t
               | j                  dt        t               | j                  dt        t               | j                         }t        |j                  |j                  t        |j                  dz  g             }t        ||j                         t        d|j                  d	z          y )
N)descriptionz	--out-dir)typedefaultz--source-cnsz--target-cnsr(  )rY  rZ  r\   z(wrote map1_01a exit CNS payload scan -> r  )argparseArgumentParser__doc__add_argumentr   rT  
SOURCE_CNS
TARGET_CNS
parse_argsri  r{  
target_cnsr"   r  r  print)parserargsrx  s      r!   mainr    s    $$9F
$<
T:F
T:FD%dll5O&OQSTG
 '4<<(	2<<??
@	Br#   __main__)r   r   r    r   returnr   )r'   re   r  r   )r0   z
int | Noner  r   )rC   re   r  r   )rP   r   r  ztuple[int, int, int])r\   
list[dict]r  r  )r5   r/   rM   r/   r  bytes | None)r5   r/   rM   r/   rn   r   r  r  )rK   r   r5   r/   rM   r/   r  zlist[tuple[int, int]])rP   r   r  zlist[tuple[str, int, int]])r   r   r   r/   r   r/   r  r   )rC   re   r   r   r   r/   r  r   )ra   r   r  ztuple[int, int])rC   re   r   r   r   r   r   r   r   re   r  r   )r   r   r   r   r  r   )rP   r   r  zlist[tuple[str, int, int, str]])rC   re   r   r   rP   r   r  z)tuple[list[dict], list[dict], list[dict]])rC   re   r   r   rP   r   r  ztuple[list[dict], list[dict]])r]   r  rV   r   r  r/   )r]   r  rV   r   r  zdict[str, int])rC   re   r   r   rP   r   r  r   )r   r   r  r   )rY  r   rZ  r   r\   zlist[dict] | Noner  r   )rx  r   r  r   )rx  r   r  r   r  None)r  r  )=r  
__future__r   r  rp  r   rl   syspathlibr   typingr   r   insertr   __file__resolveparent
decode_cnsr   r~  r%  rT  rW   rX   r  r  rO   rt   r   rV  rW  rX  r"   r(   r1   rH   rQ   rb   rg   ro   rq   rw   r   r   r   r   r   r   r   r   r
  r  r  r!  r&  ri  r|  r  r  __name__r   r#   r!   <module>r     s   N "     
   3tH~--/667 8 % H~''*
Ul		M!vhdO3
M!vhdO3
!Q;
	 $  % ! (4MOa3bc'4P3QR+8HJc7de" 8?8;,$$ F(V<	14n$$0D7*t7(>$ '&-1XXX +X 
	Xv[| 25 $ zF r#   