Ë
    î0Ójr,  ã                   ó¼  — d 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                  j                  Z
ej                  j                  d e ee«      j                  «       j                  «      «       ddlmZmZ ddlmZ e
dz  dz  Ze
dz  d	z  Ze
dz  Z ee«      ej                  vr"ej                  j                  d ee«      «       e
d
z  dz  Zd„ Zd„ Z ej2                  dej4                  «      Z ej2                  dej4                  «      Z ej2                  dej4                  «      Zh d£Zd„ Zd„ Z d„ Z!e"dk(  r e!«        yy)aR  
Lista de personajes de personajes.txt que aun llevan ROPA o ACCESORIOS de
CUERPO en su linea, para auditarlos con test_accesorios.py --nude y limpiarlos.

Regla (usuario, 16-10-2026): personaje base = sin accesorios de ropa/vestimenta
en el cuerpo. Los accesorios de CABEZA (sombrero, lazos, cintas del pelo,
diademas, aureolas, cuernos, orejas, aretes...) son IDENTIDAD y NO se tocan.

Es heuristica por regex, NO verdad: sirve para producir la lista de trabajo.
Cada linea marcada se confirma/descarta mirando la imagen (--nude), igual que
el piloto de clean_accesorios.py.

    python Engine/pendientes_cuerpo.py            # informa y escribe el .txt
    python Engine/pendientes_cuerpo.py --stdout   # solo por pantalla

Salida: Archivos/pendientes_cuerpo.txt
Formato parseable: <clave>|<linea>   (compatible con character_keys/selected_chars)
é    N)Údatetime)ÚPath)Úcompute_character_keysÚparse_character_line)Ú
lora_stemsÚArchivoszpersonajes.txtzpendientes_cuerpo.txtÚOutputz.cierre_enviadoc                 ój   — 	 ddl m}  || «       y # t        $ r}t        d|z  «       Y d }~y d }~ww xY w)Nr   )Úsend_telegram_msgz![i] aviso Telegram no enviado: %s)Únotifierr   Ú	ExceptionÚprint)Úmessager   Úes      ú:C:\Users\Usuario\Downloads\NEW\Engine\pendientes_cuerpo.pyÚnotifyr   ,   s3   € ð7Ý.Ù˜'Õ"øÜò 7ÜÐ1°AÑ5×6Ñ6ûð7ús   ‚ ‘	2š-­2c                 óâ  — dj                  t        |«      «      }	 t        j                  «       r%t        j	                  d¬«      |k(  rt        d«       yddt        | «      z  dt        |«      z  g}| r$|d	d
gt        | «      D �cg c]  }d|z  ‘Œ	 c}z   z  }|r$|d	dgt        |«      D �cg c]  }d|z  ‘Œ	 c}z   z  }t        dj                  |«      «       	 t        j                  j                  dd¬«       t        j                  |d¬«       t        dt        | «      t        |«      fz  «       y# t        $ r Y Œêw xY wc c}w c c}w # t        $ r}t        d|z  «       Y d}~ŒXd}~ww xY w)aW  Aviso FINAL: solo cuando quedan 0 pendientes auto-curables.

    'auto-curable' = pendiente con LoRA en disco. Si quedan 0, el curado
    automatico ha terminado (todo curado, o solo quedan los que exigen
    intervencion manual). El centinela compara la firma (las claves manuales)
    para no reenviar; solo reenvia si esa firma cambia.
    Ú
úutf-8©Úencodingz5[i] cierre ya avisado (sin cambios) -> no se reenvia.Nu   ðŸ�� Tanda terminada (final)u   âœ… Curados: %du   âš ï¸� Intervencion manual: %dÚ u   âœ… Check listo:u     âœ… %su   âš ï¸� Pendientes (manual):u     âš ï¸� %sT)ÚparentsÚexist_okz-[i] no se escribio el centinela de cierre: %sz0[OK] aviso final enviado (curados=%d, manual=%d))ÚjoinÚsortedÚCIERRE_FLAGÚexistsÚ	read_textr   ÚOSErrorÚlenr   ÚparentÚmkdirÚ
write_text)ÚcuradosÚautoÚmanualÚfirmaÚlineasÚcÚmr   s           r   Úsend_cierrer,   4   sz  € ð �I‰I”f˜V“nÓ%€EðÜ×ÑÔ¤K×$9Ñ$9À7Ð$9Ó$KÈuÒ$TÜÐIÔJØð -Ø¤# g£,Ñ.Ø.´°V³Ñ<ð>€Fñ Ø�2Ð)Ð*ÄfÈWÄoÓ-VÁoÀ¨j¸1«nÀoÑ-VÑVÑVˆÙØ�2Ð4Ð5Ü.4°V¬nÓ=©n¨�= 1Ó$¨nÑ=ñ>ñ 	>ˆä
ˆ4�9‰9�VÓÔðCÜ×Ñ× Ñ ¨¸Ð Ô=Ü×Ñ˜u¨wÐÔ7ô 
Ð
<Ü�‹\œ3˜v›;Ð'ñ(õ )øô# ò Ùðüò .Wùò >øô
 ò CÜÐ=ÀÑA×BÑBûðCús5   œ8D4 ÂEÂ+EÃ8E Ä4	E Ä?E Å	E.ÅE)Å)E.a¼  hat|bow|ribbon|hair|headdress|headband|hairband|halo|crown|tiara|circlet|veil|hood|beret|eyepatch|glasses|eyewear|blindfold|earring|ear[ _]pierc|hairclip|hairpin|ornament|horn|antler|ears\b|ear_covers|scrunchie|headgear|headwear|wreath|braid|ahoge|ponytail|sidelock|bangs|mole|makeup|lipstick|nail|freckles|tattoo|marking|pupil|eyeshadow|eyebrow|face|facial|mask|x_hair|butterfly|flower|forehead|tacet|vision|crown_of_thorns|super_crown|ear_bowaÀ  sleeve(?!less)|shirt|blouse|sweater|cardigan|turtleneck|dress|skirt|shorts|pants|jeans|trouser|coat|jacket|cape|robe|cloak|kimono|yukata|hanfu|sarong|poncho|tunic|vest|blazer|suit|uniform|serafuku|sailor|gakuran|apron|leotard|bodysuit|unitard|swimsuit|bikini|tank_top|crop_top|tube_top|halter|camisole|bustier|corset|\bbra\b|underwear|panties|panty|thong|boxer|brief|neckwear|necktie|neck_ribbon|\btie\b|bowtie|scarf|neckerchief|ascot|cravat|shawl|stole|legwear|thighhigh|pantyhose|legging|tight|stocking|sock|kneehigh|footwear|shoe|boot|sandal|heel|sneaker|loafer|mary_jane|okobo|geta|\bzori\b|glove|mitten|arm_warmer|wrist_guard|gauntlet|bracer|wristband|wrist_cuff|armband|sash|\bobi\b|belt|suspender|garter|thigh_strap|thigh_band|thighlet|harness|underbust|\bstraps\b|\bstrap\b|clothing|clothes|outfit|garment|pelvic_curtain|waist_bow|cutout|hip_vent|side_slit|pilot_suit|plugsuit|superhero_suit|herooutfit|bodystocking|bunny_suit|playboy_bunny|china_dress|tracen|japanese_clothes|chinese_clothes|covered_navel|covered_breast|choker|necklace|jewelry|jewel|brooch|gemstone|bracelet|bangle|armlet|\bring\b|pendant|chain|amulet|pauldron|shoulder_armor|gorget|armor|epaulette|anklet|zettai|lingerie|bloomers|shimapanz&chain|cheelai|\bass\b|navel|skin_tight>+   ú
Sense illuúLauma_ILv3.1úP-IL-BowsetteúER_MarikaV1-ILúDC_PowerGirl3D-ILúMomoYaoyorozu-IL-v1úChar-ZZZ-Belle-V2-ILúfftifa-illu-nvwls-v1úkeqing-gi-richy-v1_ixlúagnes-tachyon-nekoforgeúayase_momo-koto-Illustrious v01ú!training_565609-20260702044914529ú"training_4293681-20260708121102976ú"training_8576657-20260726000628564ú(Robertlu1021_yunli_honkai_star_rail_v2.0ú.dbz-bulma-anime-illustriousxl-lora-nochekaiserú/mikoto-misaka-s3-illustriousxl-lora-nochekaiserú3mina-ashido-epilogue-illustriousxl-lora-nochekaiserú3mitsuri-kanroji-s3s4-illustriousxl-lora-nochekaiserú6elinalise-dragonroad-s2-illustriousxl-lora-nochekaiserÚAsaÚLilyÚ18illÚFurinaÚzhao_1ÚVentiILÚ
himekoilxlÚAtomic_EvaILÚJN_Reina_IllusÚMavis_DraculaILÚNM_AW_re4remakeÚDelia_Ketchum_ILÚReZero_Rem_IlluXLÚJN_Ellen_Joe_IllusÚAngewomonDigimonIXLÚse_beatrice_re_zeroÚReneeGravesNoobXL_byKonanÚdomina_overwatch_ilxl_goofyÚ"blackCatRivals_illustrious_byJaneBÚ#SSO_mizushima_reikoXLIllustrious001Ú,Hoseki_ZenlessZoneZero_Seed_IllustriousXL_v1Ú0Hoseki_ZenlessZoneZero_AstraYao_IllustriousXL_v2Ú7Hoseki_ZenlessZoneZero_EvelynChevalier_IllustriousXL_v2c                 ó^   — | j                  «       j                  «       j                  dd«      S )NÚ Ú_)ÚstripÚlowerÚreplace)Úts    r   Únormr_   ¬   s"   € Ø�7‰7‹9�?‰?Ó×$Ñ$ S¨#Ó.Ð.ó    c                 óô   — t        | «      \  }}g }|D ]b  }t        |«      }|rt        j                  |«      rŒ&t        j                  |«      sŒ<t
        j                  |«      rŒR|j                  |«       Œd |S )N)r   r_   ÚFALSEÚsearchÚBODYÚHEADÚappend)ÚlineÚ_loraÚtagsÚoutr^   Úns         r   Úbody_tokensrl   °   s_   € Ü& tÓ,�K€Eˆ4Ø
€CÛˆÜ�‹GˆÙ”E—L‘L ”OØÜ�;‰;�q�>¤$§+¡+¨a¥.Ø�J‰J�q�Mð ð €Jr`   c                  ó€  — t        j                  «       } | j                  ddd¬«       | j                  «       }t        j                  d¬«      j                  «       D �cg c]A  }|j                  «       r/|j                  «       j                  d«      s|j                  «       ‘ŒC }}t        |«      }t        «       }g }|D ]R  \  }}}	|t        v rŒt        |«      }
|
sŒt        |	xr |	j                  «       |v «      }|j                  |||	||
f«       ŒT t!        |d«      D ��ci c]  \  }}||“Œ
 }}}t#        d	t%        |«      t%        |«      fz  «       |D �cg c]
  }|d
   rŒ	|‘Œ }}|D �cg c]  }|d
   sŒ	|d   rŒ|‘Œ }}t#        dt'        d„ |D «       «      z  «       t#        dt%        |«      z  «       t#        dt%        |«      z  «       |D ],  \  }}}	}}
t#        d|d d d›ddj)                  |
«      ›�«       Œ. |j*                  ry t-        j.                  «       j1                  d«      }t2        j5                  ddd¬«      5 }|j7                  d|z  «       |j7                  d«       |j7                  d«       |j7                  dt%        |«      t%        |«      fz  «       |j7                  d«       |j7                  d«       |j7                  d «       |D ]  \  }}}	}}
|j7                  |›d!|›d�«       Œ! |j7                  d«       |j7                  d"«       |D ]c  \  }}}	}}
|j9                  |d#«      }|rd$n|	sd%nd&}|j7                  d'|d(›d|›d)|›d*�«       |j7                  d+dj)                  |
«      z  «       Œe 	 d d d «       t#        d,t2        j;                  t<        «      z  «       |D �cg c]  }|d   sŒ	|d-   ‘Œ }}|D �cg c]  }|d   rŒ	|d-   ‘Œ }}|rt#        d.t%        |«      z  «       y t?        t        ||«       y c c}w c c}}w c c}w c c}w # 1 sw Y   ŒŸxY wc c}w c c}w )/Nz--stdoutÚ
store_truezno escribe el .txt)ÚactionÚhelpz	utf-8-sigr   Ú#é   z%PENDIENTES DE CUERPO: %d de %d lineasé   é   z  con LoRA en disco : %dc              3   ó,   K  — | ]  }|d    sŒ	d–— Œ y­w)rt   rr   N© )Ú.0Úhs     r   Ú	<genexpr>zmain.<locals>.<genexpr>Õ   s   è ø€ Ð*C±d°¸aÀ»d¬1±dùs   ‚
�z  LoRA ausente      : %dz  sin <lora:>       : %dz  é.   Ú46rY   z, z%Y-%m-%d %H:%M:%SÚwr   r   )r   Únewlinez8# PENDIENTES DE ROPA/ACCESORIOS DE CUERPO | generado %s
z<# regla: personaje base = sin ropa ni accesorios de CUERPO.
z?#        los accesorios de CABEZA son identidad y NO se tocan.
z# %d de %d lineas.
zG# heuristica por regex: confirmar cada una mirando la imagen (--nude).
z#
z1# ===== LISTA (parseable: <clave>|<linea>) =====
Ú|z# ===== DETALLE =====
Ú?zLoRA en discozSIN <lora:>zLoRA AUSENTE en discoz# LÚ3z  [z]
z#     cuerpo: %s
z
[OK] -> %sr   zA[i] quedan %d auto-curables; el aviso final saldra al llegar a 0.) ÚargparseÚArgumentParserÚadd_argumentÚ
parse_argsÚPERSOr   Ú
splitlinesr[   Ú
startswithr   r   ÚCURADOSrl   Úboolr\   rf   Ú	enumerater   r!   Úsumr   Ústdoutr   ÚnowÚstrftimeÚOUTÚopenÚwriteÚgetÚrelative_toÚBASE_DIRr,   )ÚapÚargsÚlÚrowsÚitemsÚ	availableÚhitsÚkeyrg   ÚloraÚtoksÚon_diskÚiÚline_norx   Úsin_loraÚoffÚstampÚfrk   Úestador&   r'   s                          r   Úmainr§   ¼   sÅ  € Ü	×	 Ñ	 Ó	"€BØ‡O�O�J |Ð:N€OÔOØ�=‰=‹?€Dä$Ÿ™¸˜ÓD×OÑOÔQó <ÑQ˜!Ø�w‰wŒy §¡£×!5Ñ!5°cÔ!:ð �G‰G�IÐQ€Dð <ä" 4Ó(€EÜ“€Ià€DÛ ‰ˆˆT�4Ø”'‰>ØÜ˜4Ó ˆÚÜ˜4Ò= D§J¡J£L°IÐ$=Ó>ˆGØ�K‰K˜˜d D¨'°4Ð8Õ9ð !ô '0°°aÔ&8Ô9Ñ&8™7˜1˜dˆt�Q‰wÐ&8€GÑ9ä	Ð
1´S¸³YÄÀEÃ
Ð4KÑ
KÔLÙÓ,™4�a q¨£t’˜4€HÐ,ÙÓ
0‘d�˜a ›d¨1¨Q«4Š1�d€CÐ
0Ü	Ð
$¤sÑ*C±dÓ*CÓ'CÑ
CÔDÜ	Ð
$¤s¨3£xÑ
/Ô0Ü	Ð
$¤s¨8£}Ñ
4Ô5Û*.Ñ&ˆˆT�4˜ $Ý˜c # 2›h¨¯	©	°$¬Ð8Õ9ð +/à‡{‚{Øä�L‰L‹N×#Ñ#Ð$7Ó8€EÜ	�‰�# °ˆÔ	6¸!Ø	�‰ÐKÈeÑSÔTØ	�‰ÐOÔPØ	�‰ÐRÔSØ	�‰Ð&¬#¨d«)´S¸³ZÐ)@Ñ@ÔAØ	�‰ÐZÔ[Ø	�‰�ŒØ	�‰ÐDÔEÛ.2Ñ*ˆC��t˜W dØ�G‰G¢¢dÐ+Õ,ð /3à	�‰�ŒØ	�‰Ð)Ô*Û.2Ñ*ˆC��t˜W dØ—‘˜D #Ó&ˆAÙ)0‘oÙ,0‘}Ð6Mð à�GŠG«Aªs²FÐ;Ô<Ø�G‰GÐ(¨4¯9©9°T«?Ñ:Õ;ñ /3÷ 
7ô$ 
ˆ.œ3Ÿ?™?¬8Ó4Ñ
4Ô5ñ Ó'™$�Q ! A£$ˆAˆa‹D˜$€DÐ'Ù Ó-™D�q¨¨!«ˆa�‹d˜D€FÐ-ÙÜÐQÜ�D“	ñõ 	ô 	”G˜T 6Õ*ùòs<ùó :ùò -ùÚ
0÷ 
7Ð	6üò, (ùÚ-sP   ÁAPÄ$PÅ
P Å%P Å/
P%Å:P%Æ P%ÉE P*Î=
P6ÏP6Ï
P;Ï P;Ð*P3Ú__main__)#Ú__doc__r�   ÚreÚsysr   Úpathlibr   Ú__file__Úresolver"   r”   ÚpathÚinsertÚstrÚprompt_builderr   r   Úcharacter_keysr   r…   r�   ÚARCHIVOSr   r   r,   ÚcompileÚIre   rd   rb   rˆ   r_   rl   r§   Ú__name__rv   r`   r   Ú<module>r¸      s_  ðñó$ Û 	Û 
Ý Ý á�‹>×!Ñ!Ó#×*Ñ*×1Ñ1€Ø ‡�‡��‘3‘t˜H“~×-Ñ-Ó/×6Ñ6Ó7Ô 8ç GÝ %à�:ÑÐ 0Ñ0€Ø�ÑÐ5Ñ5€ð �jÑ €Ù€xƒ=˜Ÿ™Ñ Ø‡H�H‡O�O�A‘s˜8“}Ô%ð ˜Ñ!Ð$5Ñ5€ò7ò)ðF €r‡z�zðAð ‡D�Dó	€ð €r‡z�zðGð$ ‡D�Dó'€ð0 	ˆ�
‰
Ð<¸b¿d¹dÓC€ò
(€òV/ò	ò>+ðB ˆzÒÙ…Fð r`   