§
    {Å®j¹ñ  ã                  ó>  — U 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m	Z	m
Z
mZmZmZmZ 	 ej        j                             dd¦  «         n# e$ r Y nw xY w	 ddlmZ n# e$ r dZY nw xY w	 ddlZn# e$ r dZY nw xY wddlmZmZmZmZmZmZ i Zded<   dMdNd„Z dOd„Z!dPd„Z"dOd„Z#dOd„Z$dOd„Z%	 dQdRd„Z&	 	 	 	 dSdTd%„Z'	 	 	 dUdVd'„Z(	 	 	 	 	 dWdXd5„Z)	 	 	 dYdZd:„Z*dOd;„Z+dOd<„Z,dOd=„Z-	 	 	 	 d[d\dA„Z.	 	 	 	 	 d]d^dC„Z/	 	 	 	 	 	 d_d`dH„Z0	 	 	 	 dadbdJ„Z1	 	 	 dcdddK„Z2	 	 	 dcdddL„Z3dS )eu
  AutoPOE2 - ThÆ° viá»‡n Thá»‹ GiÃ¡c MÃ¡y TÃ­nh & WinOCR DÃ¹ng Chung (Vision OCR Foundation).

Cung cáº¥p cÃ¡c tiá»‡n Ã­ch xá»­ lÃ½ áº£nh quang há»�c vÃ  nháº­n diá»‡n kÃ½ tá»±:
- Nháº­n diá»‡n tráº¡ng thÃ¡i má»Ÿ cá»§a giao diá»‡n (Atlas UI, Inventory).
- TÃ¬m kiáº¿m tá»�a Ä‘á»™ nÃºt báº¥m báº±ng WinOCR (TRAVERSE, SEARCH, ENDGAME).
- QuÃ©t vÃ  phÃ¢n cá»¥m Ä‘iá»ƒm áº£nh theo mÃ u (Color Clustering) cho Reachable Node, Flame.
- XÃ¡c Ä‘á»‹nh tá»�a Ä‘á»™ mÃ n hÃ¬nh cá»§a cÃ¡c thá»±c thá»ƒ quang há»�c (Map Device, Portal).
é    )ÚannotationsN)ÚAnyÚCallableÚListÚOptionalÚSequenceÚTupleÚUnion)ÚImage)ÚCoordinateScalerÚ
ResolutionÚScalingModeÚ	RES_1080PÚ	RES_1440PÚresolve_resolutionz$dict[str, Tuple[float, Image.Image]]Ú_IMAGE_CACHEÚenÚimg_pilr   ÚlangÚstrÚreturnÚdictc                ó6  — | �t           €g ddœS 	 t          | d¦  «        r| j        \  }}|dk    s|dk    rg ddœS n;t          | d¦  «        r+t          | d¦  «        r| j        dk    s| j        dk    rg ddœS 	 t
          j        j                             dd¦  «         n# t          $ r Y nw xY wt          j
        | |¬¦  «        }t          |t          ¦  «        r|S g |rt          |¦  «        nddœS # t          $ r}g dt          |¦  «        d	œcY d}~S d}~ww xY w)
uX   Nháº­n diá»‡n OCR bá»�c lá»›p báº£o vá»‡ Thread-Safety vÃ  khÃ¡ng Exception native 100%.NÚ )ÚlinesÚtextÚsizer   ÚwidthÚheight)r   )r   r   Úerror)ÚwinocrÚhasattrr   r   r   ÚctypesÚwindllÚole32ÚCoInitializeExÚ	ExceptionÚrecognize_pil_syncÚ
isinstancer   r   )r   r   ÚwÚhÚresÚes         ú-C:\Projects\AutoPOE2\src\common\vision_ocr.pyÚsafe_recognize_pil_syncr/   /   s{  € à€�&˜.Ø RÐ(Ð(Ð(ð:å�7˜FÑ#Ô#ð 	1Ø”<‰DˆAˆqØ�AŠvˆv˜˜aš˜Ø!#¨RÐ0Ð0Ð0ð  å�W˜gÑ&Ô&ð 	1­7°7¸HÑ+EÔ+Eð 	1ØŒ} Ò!Ð! W¤^°qÒ%8Ð%8Ø!#¨RÐ0Ð0Ð0ð	ÝŒMÔ×.Ò.¨t°QÑ7Ô7Ð7Ð7øÝð 	ð 	ð 	ØˆDð	øøøõ Ô'¨°dÐ;Ñ;Ô;ˆÝ�c�4Ñ Ô ð 	ØˆJØ°Ð%<¥S¨¡X¤X X¸"Ð=Ð=Ð=øÝð :ð :ð :Ø Rµ#°a±&´&Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9øøøøð:øøøsL   �*C1 »;C1 Á8%B ÂC1 Â
B+Â(C1 Â*B+Â+/C1 ÃC1 Ã1
DÃ;DÄDÄDÚ	img_inputúUnion[str, Image.Image]Úboolc                ó
  ‡‡‡‡‡	‡
— t          | ¦  «        Š	‰	€dS 	 ‰	j        \  Š
Š‰
dz  ‰dz  cŠŠˆˆfd„t          ddd¦  «        D ¦   «         }ˆˆ	ˆ
fd„|D ¦   «         }|sdS t          |¦  «        t	          t          |¦  «        ¦  «        z  Št          |¦  «        }t          ˆfd	„|D ¦   «         ¦  «        t	          t          |¦  «        ¦  «        z  d
z  }‰dk    r|dk    s|dk    r‰dk    rdS n# t          $ r Y nw xY wdS )uì  Kiá»ƒm tra nhanh qua pixel trung tÃ¢m xem cÃ³ modal dialog / menu che giá»¯a mÃ n hÃ¬nh hay khÃ´ng.
    
    TrÃ¡nh viá»‡c crop vÃ  gá»�i WinRT OCR toÃ n mÃ n hÃ¬nh vÃ´ Ã­ch khi nhÃ¢n váº­t Ä‘ang Ä‘á»©ng trong tháº¿ giá»›i 3D.
    - Trong POE2, cÃ¡c modal popup (Confirmation, Drop item, Options ESC menu) cÃ³ khung panel xÃ¡m/Ä‘en
      ráº¥t Ä‘á»“ng Ä‘á»�u vÃ  tá»‘i bao phá»§ vÃ¹ng trung tÃ¢m (avg RGB <= 28.0, max RGB <= 50.0).
    - NgÆ°á»£c láº¡i, trong tháº¿ giá»›i game 3D (Hideout/Map/Town), khu vá»±c trung tÃ¢m hiá»ƒn thá»‹ nhÃ¢n váº­t vÃ  sÃ n
      vá»›i Ä‘á»™ tÆ°Æ¡ng pháº£n cao, hoa vÄƒn chi tiáº¿t (max RGB > 50.0, Ä‘á»™ sÃ¡ng trung bÃ¬nh thÆ°á»�ng > 30.0).
    - Tráº£ vá»� False tá»©c thá»�i (< 0.1ms) náº¿u khÃ´ng cÃ³ modal.
    NFé   c                óL   •— g | ] }t          d dd¦  «        D ]}‰|z   ‰|z   f‘ŒŒ!S )éØÿÿÿé)   é   )Úrange)Ú.0ÚdxÚdyÚcxÚcys      €€r.   ú
<listcomp>z+is_center_modal_present.<locals>.<listcomp>[   sA   ø€ Ð\Ð\Ð\ bÍÈsÐTVÐXZÑI[ÔI[Ð\Ð\À2��R‘˜˜b™Ð!Ð\Ð\Ð\Ð\ó    r6   r7   r8   c                óÂ   •— g | ][}d |d          cxk    r‰k     ¯n nCd |d         cxk    r‰k     ¯+n n-t          ‰                     |¦  «        dd…         ¦  «        dz  ‘Œ\S )r   é   Né   ç      @)ÚsumÚgetpixel)r:   Úptr+   Úimgr*   s     €€€r.   r?   z+is_center_modal_present.<locals>.<listcomp>\   s�   ø€ ÐcÐcÐc°BÀÀbÈÄeÀÀÂÀÈaÂÀÀÀÀÐTUÐY[Ð\]ÔY^ÐTbÐTbÒTbÐTbÐabÒTbÐTbÐTbÐTbÐTb•�C—L’L Ñ$Ô$ R a RÔ(Ñ)Ô)¨CÑ/ÐTbÐTbÐTbr@   c              3  ó(   •K  — | ]}|‰z
  d z  V — ŒdS )r4   N© )r:   ÚvÚavg_vs     €r.   ú	<genexpr>z*is_center_modal_present.<locals>.<genexpr>a   s,   øè è € Ð4Ð4¨!�a˜%‘i AÑ%Ð4Ð4Ð4Ð4Ð4Ð4r@   ç      à?g      <@g      I@g      @g     €A@T)Ú_load_imager   r9   rE   ÚfloatÚlenÚmaxr'   )r0   ÚptsÚvalsÚmax_vÚstd_vrL   r=   r>   r+   rH   r*   s        @@@@@@r.   Úis_center_modal_presentrW   K   sG  øøøøøø€ õ �iÑ
 Ô
 €CØ
€{ØˆuðØŒx‰ˆˆ1Ø�a‘˜˜a™ˆˆˆBØ\Ð\Ð\Ð\Ð\­E°#°r¸2Ñ,>Ô,>Ð\Ñ\Ô\ˆØcÐcÐcÐcÐcÐc¸#ÐcÑcÔcˆØð 	Ø�5Ý�D‘	”	�E¥# d¡)¤)Ñ,Ô,Ñ,ˆÝ�D‘	”	ˆÝÐ4Ð4Ð4Ð4¨tÐ4Ñ4Ô4Ñ4Ô4µu½SÀ¹Y¼YÑ7GÔ7GÑGÈCÑOˆà�TŠMˆM˜e tšm˜m°¸#²°À%È4Â-À-Ø�4øøÝð ð ð Øˆðøøøàˆ5s   ›AC3 Á"BC3 Ã3
D Ã?D úOptional[Image.Image]c                óÄ  — | €dS t          | t          ¦  «        �rt          j                             | ¦  «        sdS 	 t          j                             | ¦  «        }t                               | ¦  «        }|r|d         |k    r|d         S t          j	        | ¦  «         
                    d¦  «        }t          t          ¦  «        dk    r9t                               t          t          t          ¦  «        ¦  «        ¦  «         ||ft          | <   |S # t          $ r Y dS w xY w	 t!          | dd¦  «        dk    r| S |  
                    d¦  «        S # t          $ r | cY S w xY w)uy   Táº£i Ä‘á»‘i tÆ°á»£ng PIL Image tá»« Ä‘Æ°á»�ng dáº«n tá»‡p hoáº·c Ä‘á»‘i tÆ°á»£ng cÃ³ sáºµn (kÃ¨m bá»™ Ä‘á»‡m LRU/mtime).Nr   rB   ÚRGBé   Úmode)r)   r   ÚosÚpathÚexistsÚgetmtimer   Úgetr   ÚopenÚconvertrQ   ÚpopÚnextÚiterr'   Úgetattr)r0   ÚmtimeÚcachedrH   s       r.   rO   rO   j   sm  € àÐØˆtÝ�)�SÑ!Ô!ñ ÝŒw�~Š~˜iÑ(Ô(ð 	Ø�4ð	Ý”G×$Ò$ YÑ/Ô/ˆEÝ!×%Ò% iÑ0Ô0ˆFØð !˜& œ) uÒ,Ð,Ø˜a”yÐ Ý”*˜YÑ'Ô'×/Ò/°Ñ6Ô6ˆCÝ•<Ñ Ô  2Ò%Ð%Ý× Ò ¥¥d­<Ñ&8Ô&8Ñ!9Ô!9Ñ:Ô:Ð:Ø',¨c l�L˜Ñ#ØˆJøÝð 	ð 	ð 	Ø�4�4ð	øøøðÝ�9˜f dÑ+Ô+¨uÒ4Ð4ØÐØ× Ò  Ñ'Ô'Ð'øÝð ð ð ØÐÐÐðøøøs1   ½AD ÂBD Ä
D ÄD Ä$E Ä;E ÅEÅEc           	     óŠ  ‡— t          | ¦  «        }|€dS t          |¦  «        rdS 	 |                     d¦  «        }|j        \  }}t          ��d|                     dd|t          |dz  ¦  «        f¦  «        }t          |¦  «        }d                     d„ | 	                    dg ¦  «        D ¦   «         ¦  «         
                    ¦   «         Šd	‰v sd
‰v sd‰v rdS t          ˆfd„dD ¦   «         ¦  «        rdS |                     t          |dz  ¦  «        t          |dz  ¦  «        ||f¦  «        }t          |¦  «        }d                     d„ | 	                    dg ¦  «        D ¦   «         ¦  «         
                    ¦   «         }	d|	v sd|	v rdS 	 ddlm}
  |
|¦  «        �dS n# t          $ r Y nw xY wn# t          $ r Y nw xY wdS )uH  Kiá»ƒm tra giao diá»‡n Map Device / Atlas Ä‘Ã£ má»Ÿ thá»±c sá»± hay chÆ°a (INV-MAPDEVICE-VERIFY-UI).
    
    YÃªu cáº§u nháº­n diá»‡n Ä‘Æ°á»£c Ã­t nháº¥t má»™t trong cÃ¡c tÃ­n hiá»‡u thá»‹ giÃ¡c Ä‘áº·c trÆ°ng:
    - NÃºt 'TRAVERSE' (nÃºt kÃ­ch hoáº¡t map)
    - Khay hoáº·c tá»« khÃ³a 'WAYSTONE'
    - Há»™p tÃ¬m kiáº¿m 'SEARCH' / 'SEARCH HERE' á»Ÿ thanh trÃªn Atlas
    - Ná»�n báº£n Ä‘á»“ Atlas bao phá»§ trung tÃ¢m (tá»· lá»‡ Ä‘iá»ƒm áº£nh tá»‘i trung tÃ¢m > 55%)
    TUYá»†T Ä�á»�I Cáº¤M dÃ¹ng tá»« 'MAP DEVICE' Ä‘á»©ng láº» vÃ¬ sÃ n Hideout luÃ´n cÃ³ nhÃ£n 3D 'Map Device'.
    NFrZ   r   g)\�Âõ(Ì?ú c              3  óB   K  — | ]}|                      d d¦  «        V — ŒdS ©r   r   N©ra   ©r:   Úlines     r.   rM   z#is_atlas_ui_open.<locals>.<genexpr>Ÿ   s0   è è € ÐYÐY°T˜DŸHšH V¨RÑ0Ô0ÐYÐYÐYÐYÐYÐYr@   r   ÚGOODBYEzBUY OR SELLÚINTRODUCTIONc              3  ó    •K  — | ]}|‰v V — Œ	d S ©NrJ   )r:   ÚkÚblobs     €r.   rM   z#is_atlas_ui_open.<locals>.<genexpr>¤   s?   øè è € ð  Pð  P �1˜�9ð  Pð  Pð  Pð  Pð  Pð  Pr@   )ÚSEARCHÚENDGAMEÚ	INTERLUDEzACT 1zACT 2zACT 3zACT 4ÚATLASÚMAPSÚBONUSÚTIERTgš™™™™™Ù?c              3  óB   K  — | ]}|                      d d¦  «        V — ŒdS rm   rn   ro   s     r.   rM   z#is_atlas_ui_open.<locals>.<genexpr>ª   s0   è è € Ð"`Ð"`¸D 4§8¢8¨F°BÑ#7Ô#7Ð"`Ð"`Ð"`Ð"`Ð"`Ð"`r@   ÚTRAVERSEÚWAYSTONE©Úfind_traverse_button_dual_pass)rO   Úis_loading_screenrc   r   r!   ÚcropÚintr/   Újoinra   ÚupperÚanyÚsrc.common.vision_filtersr‚   r'   )r0   rH   Úrgb_imgr*   r+   Úcrop_bannerÚ
res_bannerÚcrop_bottomÚ
res_bottomÚblob_bottomr‚   rv   s              @r.   Úis_atlas_ui_openr�   …   sC  ø€ õ �iÑ
 Ô
 €CØ
€{Øˆuõ ˜ÑÔð Øˆuð Ø—+’+˜eÑ$Ô$ˆØŒ|‰ˆˆ1õ Ñà!Ÿ,š,¨¨1¨aµ°Q¸±X±´Ð'?Ñ@Ô@ˆKÝ0°Ñ=Ô=ˆJØ—8’8ÐYÐY¸Z¿^º^ÈGÐUWÑ=XÔ=XÐYÑYÔYÑYÔY×_Ò_ÑaÔaˆDð ˜DÐ Ð  M°TÐ$9Ð$9¸^ÈtÐ=SÐ=SØ�uÝð  Pð  Pð  Pð  Pð  'Oð  Pñ  Pô  Pñ  Pô  Pð Ø�tð "Ÿ,š,­¨A°©H©¬µs¸1¸t¹8±}´}ÀaÈÐ'KÑLÔLˆKÝ0°Ñ=Ô=ˆJØŸ(š(Ð"`Ð"`ÀJÇNÂNÐSZÐ\^ÑD_ÔD_Ð"`Ñ"`Ô"`Ñ`Ô`×fÒfÑhÔhˆKØ˜[Ð(Ð(¨J¸+Ð,EÐ,EØ�tðØTÐTÐTÐTÐTÐTØ1Ð1°'Ñ:Ô:ÐFØ˜4ð Gøåð ð ð Ø�ðøøøøøåð ð ð Øˆðøøøàˆ5sC   §B0F3 ÃF3 Ã6BF3 ÆF" Æ!F3 Æ"
F/Æ,F3 Æ.F/Æ/F3 Æ3
G Æ?G c           	     óJ  ‡— t          | ¦  «        }|€dS 	 |j        \  }}g }dD ]h}dD ]c}|                     t          ||z  ¦  «        t          ||z  ¦  «        f¦  «        dd…         \  }}}	|                     ||z   |	z   dz  ¦  «         ŒdŒit          |¦  «        t          t          |¦  «        ¦  «        z  }
g }dD ]h}dD ]c}|                     t          ||z  ¦  «        t          ||z  ¦  «        f¦  «        dd…         \  }}}	|                     ||z   |	z   dz  ¦  «         ŒdŒit          |¦  «        t          t          |¦  «        ¦  «        z  }|
dk    s|dk    s|
|z   d	z  d
k    rdS n# t          $ r Y nw xY w	 |j        \  }}g }t          ddd¦  «        D ]�}t          ddd¦  «        D ]m}t          ||z  dz  ¦  «        }t          ||z  dz  ¦  «        }|                     ||f¦  «        dd…         \  }}}	|                     ||z   |	z   dz  ¦  «         ŒnŒ‚|r2t          |¦  «        t          t          |¦  «        ¦  «        z  dk     rdS n# t          $ r Y nw xY wt          €dS d}	 |j        \  }}|                     dt          |dz  ¦  «        ||f¦  «        }t          |¦  «        }d                     d„ |                     dg ¦  «        D ¦   «         ¦  «                             ¦   «         Št!          ˆfd„|D ¦   «         ¦  «        rdS n# t          $ r Y nw xY wdS )u_  XÃ¡c Ä‘á»‹nh xem mÃ n hÃ¬nh hiá»‡n táº¡i cÃ³ Ä‘ang á»Ÿ Loading Screen hay khÃ´ng.
    
    PhÃ¡t hiá»‡n cÃ¡c thÃ´ng Ä‘iá»‡p tip Ä‘áº·c trÆ°ng trÃªn Loading Screen cá»§a POE2
    (vÃ­ dá»¥: 'Remember to return to a Well to refill your flasks and replenish your Life and Mana.'),
    hoáº·c mÃ n hÃ¬nh Ä‘en chuyá»ƒn cáº£nh (Black Transition Frame).
    NF)ç{®Gáz¤?gìQ¸…ë±?çš™™™™™¹?g¤p=
×£À?)çáz®Gáê?g)\�Âõ(ì?çq=
×£pí?ç¸…ëQ¸î?rC   rD   )g×£p=
×ë?çÍÌÌÌÌÌì?gÃõ(\�Âí?r–   g      9@ç       @ç      4@é   éZ   g      Y@g      @T)zREMEMBER TO RETURNzWELL TO REFILLzREPLENISH YOUR LIFEzFLASKS AND REPLENISHzRETURN TO A WELLzREFILL YOUR FLASKSzLOADING SCREENz
DODGE ROLLzDODGE ROLLINGzWAYSTONES CAN BEzINSERTED INTO THE MAP DEVICEzGEMS CAN BE UNSOCKETEDzRESPEC PASSIVE SKILLSzCURRENCY EXCHANGEr   rN   rk   c              3  óB   K  — | ]}|                      d d¦  «        V — ŒdS rm   rn   ro   s     r.   rM   z$is_loading_screen.<locals>.<genexpr>  s0   è è € ÐZÐZ°t˜dŸhšh v¨rÑ2Ô2ÐZÐZÐZÐZÐZÐZr@   r   c              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   )r:   ÚkwÚ
blob_lowers     €r.   rM   z$is_loading_screen.<locals>.<genexpr>	  s(   øè è € Ð3Ð3 Bˆr�ZÐÐ3Ð3Ð3Ð3Ð3Ð3r@   )rO   r   rF   r…   ÚappendrE   rP   rQ   r'   r9   r!   r„   r/   r†   ra   r‡   rˆ   )r0   rH   r*   r+   Úbl_valsÚsxÚsyÚrÚgÚbÚbl_avgÚbr_valsÚbr_avgÚsamplesÚstep_yÚstep_xÚpxÚpyÚkeywordsÚ
crop_lowerÚ	res_lowerrŸ   s                        @r.   rƒ   rƒ   º   s½  ø€ õ �iÑ
 Ô
 €CØ
€{Øˆuð
ØŒx‰ˆˆ1àˆØ*ð 	2ð 	2ˆBØ.ð 2ð 2�ØŸ,š,­¨A°©F©¬µS¸¸R¹±[´[Ð'AÑBÔBÀ2ÀAÀ2ÔF‘��1�aØ—’  A¡¨¡	¨SÑ0Ñ1Ô1Ð1Ð1ð2õ �W‘”¥¥c¨'¡l¤lÑ 3Ô 3Ñ3ˆð ˆØ*ð 	2ð 	2ˆBØ.ð 2ð 2�ØŸ,š,­¨A°©F©¬µS¸¸R¹±[´[Ð'AÑBÔBÀ2ÀAÀ2ÔF‘��1�aØ—’  A¡¨¡	¨SÑ0Ñ1Ô1Ð1Ð1ð2õ �W‘”¥¥c¨'¡l¤lÑ 3Ô 3Ñ3ˆð �DŠ=ˆ=˜F TšM˜M¨f°v©oÀÑ-DÀtÒ-KÐ-KØ�5ð .Løåð ð ð ØˆðøøøðØŒx‰ˆˆ1ØˆÝ˜B  BÑ'Ô'ð 	2ð 	2ˆFÝ  B¨Ñ+Ô+ð 2ð 2�Ý˜˜V™ eÑ+Ñ,Ô,�Ý˜˜V™ eÑ+Ñ,Ô,�ØŸ,š,¨¨B xÑ0Ô0°°!°Ô4‘��1�aØ—’  A¡¨¡	¨SÑ0Ñ1Ô1Ð1Ð1ð	2ð
 ð 	�˜G™œ¥u­S°©\¬\Ñ':Ô':Ñ:¸cÒAÐAØ�4øøÝð ð ð Øˆðøøøõ €~Øˆuð€Hð"	ØŒx‰ˆˆ1à—X’X˜q¥# a¨$¡h¡-¤-°°AÐ6Ñ7Ô7ˆ
Ý+¨JÑ7Ô7ˆ	Ø—X’XÐZÐZ¸y¿}º}ÈWÐVXÑ?YÔ?YÐZÑZÔZÑZÔZ×`Ò`ÑbÔbˆ
ÝÐ3Ð3Ð3Ð3¨(Ð3Ñ3Ô3Ñ3Ô3ð 	Ø�4ð	øåð ð ð Øˆðøøøàˆ5s8   –EE- Å-
E:Å9E:Å>CI É
IÉIÉ.B"L Ì
L ÌL c                óä  — t          | ¦  «        }|€dS 	 |j        \  }}t          |                     |dz  |dz  f¦  «        dd…         ¦  «        dk     rdS n# t          $ r Y nw xY w	 |j        \  }}|                     ¦   «         }|€dS t          dt          |dz  ¦  «        ¦  «        }t          dt          |dz  ¦  «        ¦  «        }d	}	d	}
t          t          |d
z  ¦  «        t          |dz  ¦  «        |¦  «        D ]�}t          t          |dz  ¦  «        t          |dz  ¦  «        |¦  «        D ][}|||f         dd…         \  }}}|
dz  }
|dk    r|dk    r||dz   k    r	||dz   k    s|dk    r|dk    r|dk    r||dz   k    r|	dz  }	Œ\Œ�|
d	k    r|	t          |
¦  «        z  nd	}|dk    �rïd	}d	}t          dt          |dz  ¦  «        ¦  «        }t          dt          |dz  ¦  «        ¦  «        }t          t          |dz  ¦  «        t          |dz  ¦  «        |¦  «        D ]h}t          t          |dz  ¦  «        t          |dz  ¦  «        |¦  «        D ]4}|||f         dd…         \  }}}|dz  }|dk    r|dk    r|dk    r|dz  }Œ5Œi|d	k    r|t          |¦  «        z  nd	}|dk    rdS d	}t          t          |dz  ¦  «        t          |d z  ¦  «        t          dt          |dz  ¦  «        ¦  «        ¦  «        D ]�}t          t          |dz  ¦  «        t          |dz  ¦  «        t          dt          |dz  ¦  «        ¦  «        ¦  «        D ]K}|||f         dd…         \  }}}|dk    r-|d!k    r'|d"k    r!||d#z   k    r||dz   k    r|dz  }|dk    r  dS ŒLŒž| 
                    t          |d$z  ¦  «        t          |d%z  ¦  «        t          |d&z  ¦  «        t          |d'z  ¦  «        f¦  «        }t          |¦  «        }d(                     d)„ |                     d*g ¦  «        D ¦   «         ¦  «                             ¦   «         }d+|v pd,|v pd-|v pd.|v pd/|v S # t          $ r Y dS w xY w)0uz  Kiá»ƒm tra xem báº£ng hÃ nh trang (Inventory) cÃ³ Ä‘ang má»Ÿ hay khÃ´ng.

    Fast-Path (< 0.5ms):
    1. Kiá»ƒm tra dáº£i banner mÃ u vÃ ng/nÃ¢u Ä‘áº·c trÆ°ng á»Ÿ ná»­a trÃªn bÃªn pháº£i (x: 65%..95%, y: 4.8%..7.6%).
    2. Kiá»ƒm tra ná»�n panel trang bá»‹ tá»‘i mÃ u (x: 75%..92%, y: 18%..32%).
    3. Kiá»ƒm tra cá»¥m pixel icon vÃ ng (Gold currency icon) á»Ÿ gÃ³c dÆ°á»›i (x: 65%..75%, y: 70%..85%).
    Náº¿u Fast-Path thá»�a mÃ£n, tráº£ vá»� True ngay láº­p tá»©c (< 0.5ms) khÃ´ng cáº§n gá»�i OCR toÃ n mÃ n hÃ¬nh.
    Náº¿u Fast-Path chÆ°a cháº¯c cháº¯n, tá»± Ä‘á»™ng fallback sang WinRT OCR Ä‘á»ƒ chá»‘ng false negative.
    NFr4   rC   é   rB   gyé&1¬|?g¸…ëQ¸Ž?r   gú~j¼t“¨?gÛù~j¼t³?çÍÌÌÌÌÌä?gffffffî?é‡   és   é   é   é´   é–   é   g
×£p=
·?gš™™™™™™?gìQ¸…ë¡?ç
×£p=
Ç?g{®GázÔ?g      è?r•   é*   gìQ¸…ëÑ?Tçffffffæ?ç333333ë?é}   é_   é2   çš™™™™™á?g{®Gáz„?ç\�Âõ(\ï?çffffffÖ?rk   c              3  óB   K  — | ]}|                      d d¦  «        V — ŒdS rm   rn   ro   s     r.   rM   z$is_inventory_open.<locals>.<genexpr>T  s0   è è € ÐNÐN°˜Ÿš ¨Ñ,Ô,ÐNÐNÐNÐNÐNÐNr@   r   Ú	INVENTORYÚWEAPONÚARMOURÚBAGÚ	COSMETICS)rO   r   rE   rF   r'   ÚloadrR   r…   r9   rP   r„   r/   r†   ra   r‡   )r0   rH   Úw_tmpÚh_tmpr*   r+   Úpixr«   r¬   Úgold_banner_countÚtotal_bannerÚyÚxr¤   r¥   r¦   Úbanner_ratioÚ
dark_countÚ
total_darkÚstep_dark_yÚstep_dark_xÚ
dark_ratioÚgold_icon_foundÚinv_cropr,   rv   s                             r.   Úis_inventory_openrÜ     s   € õ �iÑ
 Ô
 €CØ
€{ØˆuðØ”x‰ˆˆuÝˆs�|Š|˜U a™Z¨°!©Ð4Ñ5Ô5°b°q°bÔ9Ñ:Ô:¸QÒ>Ð>Ø�5ð ?øåð ð ð Øˆðøøøð4ØŒx‰ˆˆ1Ø�hŠh‰jŒjˆØˆ;Ø�5õ �Q�˜A ™I™œÑ'Ô'ˆÝ�Q�˜A ™I™œÑ'Ô'ˆØÐØˆÝ•s˜1˜u™9‘~”~¥s¨1¨u©9¡~¤~°vÑ>Ô>ð 	+ð 	+ˆAÝ�3˜q 4™x™=œ=­#¨a°$©h©-¬-¸Ñ@Ô@ð +ð +�Ø˜a ˜dœ) B Q Bœ-‘��1�aØ Ñ!�Ø˜’H�H  c¢ ¨q°1°r±6ªz¨zÀÀAÈÁFÂ
À
Ø˜’H�H  c¢ ¨a°3ªh¨h¸AÀÀBÁºJ¸JØ%¨Ñ*Ð%øð+ð COÐQRÒBRÐBRÐ(­5°Ñ+>Ô+>Ñ>Ð>ÐXYˆà˜4ÒÑØˆJØˆJÝ˜a¥ Q¨¡Y¡¤Ñ0Ô0ˆKÝ˜a¥ Q¨¡Y¡¤Ñ0Ô0ˆKÝ�3˜q 4™x™=œ=­#¨a°$©h©-¬-¸ÑEÔEð (ð (�Ý�s 1 t¡8™}œ}­c°!°d±(©m¬m¸[ÑIÔIð (ð (�AØ! ! Q $œi¨¨¨œm‘G�A�q˜!Ø !‘O�JØ˜B’w�w 1¨¢7 7¨q°Bªw¨wØ" a™˜
øð	(ð
 <FÈº>¸>˜¥e¨JÑ&7Ô&7Ñ7Ð7ÈqˆJØ˜TÒ!Ð!Ø�tð  ˆOÝ�3˜q 4™x™=œ=­#¨a°$©h©-¬-½¸QÅÀAÈÁIÁÄÑ9OÔ9OÑPÔPð (ð (�Ý�s 1 t¡8™}œ}­c°!°d±(©m¬m½SÀÅCÈÈEÉ	ÁNÄNÑ=SÔ=SÑTÔTð (ð (�AØ! ! Q $œi¨¨¨œm‘G�A�q˜!Ø˜C’x�x A¨¢H H°°b²°¸aÀ!ÀbÁ&ºj¸jÈqÐSTÐWYÑSYÊzÈzØ'¨1Ñ,˜Ø*¨aÒ/Ð/Ø#' 4 4 4øð(ð —8’8�S  T¡™]œ]­C°°D±©M¬M½3¸qÀ4¹x¹=¼=Í#ÈaÐRVÉhÉ-Ì-ÐXÑYÔYˆÝ% hÑ/Ô/ˆØ�xŠxÐNÐN¸¿ºÀÈ"Ñ9MÔ9MÐNÑNÔNÑNÔN×TÒTÑVÔVˆØ˜dÐ"Ðr h°$Ð&6Ðr¸(ÀdÐ:JÐrÈeÐW[ÈmÐrÐ_jÐnrÐ_rÐrøÝð ð ð Øˆuˆuðøøøs9   •A A Á
A%Á$A%Á) Q! ÂH$Q! Ê1C+Q! ÎCQ! Ñ!
Q/Ñ.Q/ÚtokenÚcrop_boxú#Optional[Tuple[int, int, int, int]]úOptional[Tuple[int, int]]c                ó2  ‡— t          | ¦  «        }|€dS 	 |j        \  }}|                     ¦   «         Š‰dv }|r|€ddt          |dz  ¦  «        |f}d\  }}|r%|                     |¦  «        }|d         |d         }}t          |¦  «        }	|	                     dg ¦  «        D �]}
|
                     dd	¦  «                             ¦   «         }|r	d
|v rd|v rŒ6‰|vrŒ;|
                     dg ¦  «        }ˆfd„|D ¦   «         }|r|n|}|sŒht          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }t          |||z   dz  z   ¦  «        }t          |||z   dz  z   ¦  «        }|r|t          |dz  ¦  «        k    r�Œ||fc S n# t          $ r Y nw xY w‰dv rC	 ddl
m}  || ¦  «        }|r|d         t          |dz  ¦  «        k    r|S n# t          $ r Y nw xY wdS )u¢  TÃ¬m tÃ¢m Ä‘iá»ƒm pixel (X, Y) cá»§a má»™t tá»« khÃ³a vÄƒn báº£n trÃªn mÃ n hÃ¬nh.
    
    @param img_input: Ä�Æ°á»�ng dáº«n áº£nh hoáº·c Ä‘á»‘i tÆ°á»£ng PIL Image
    @param token: Tá»« khÃ³a cáº§n tÃ¬m (khÃ´ng phÃ¢n biá»‡t hoa thÆ°á»�ng, vÃ­ dá»¥: 'TRAVERSE')
    @param crop_box: VÃ¹ng cáº¯t (left, top, right, bottom) Ä‘á»ƒ thu háº¹p pháº¡m vi quÃ©t
    @return: (cx, cy) hoáº·c None náº¿u khÃ´ng tÃ¬m tháº¥y
    N)r   ÚTRAVERSÚACTIVATEÚENTERr   r¾   )r   r   rB   r   r   r   rä   ÚMAPÚwordsc                óh   •— g | ].}‰|                      d d¦  «                             ¦   «         v ¯,|‘Œ/S ©r   r   ©ra   r‡   )r:   r*   Útoken_uppers     €r.   r?   z'find_button_by_text.<locals>.<listcomp>€  s=   ø€ ÐZÐZÐZ 1°ÀÇÂÀfÈbÑ@QÔ@Q×@WÒ@WÑ@YÔ@YÐ1YÐ1Y˜QÐ1YÐ1YÐ1Yr@   c              3  ó2   K  — | ]}|d          d         V — ŒdS ©Úbounding_rectrÓ   NrJ   ©r:   r*   s     r.   rM   z&find_button_by_text.<locals>.<genexpr>„  ó,   è è € ÐFÐF°A˜˜/Ô*¨3Ô/ÐFÐFÐFÐFÐFÐFr@   c              3  óP   K  — | ]!}|d          d         |d          d         z   V — Œ"dS ©rí   rÓ   r   NrJ   rî   s     r.   rM   z&find_button_by_text.<locals>.<genexpr>…  s<   è è € ÐdÐdÐRS˜˜/Ô*¨3Ô/°!°OÔ2DÀWÔ2MÑMÐdÐdÐdÐdÐdÐdr@   c              3  ó2   K  — | ]}|d          d         V — ŒdS ©rí   rÒ   NrJ   rî   s     r.   rM   z&find_button_by_text.<locals>.<genexpr>†  rï   r@   c              3  óP   K  — | ]!}|d          d         |d          d         z   V — Œ"dS ©rí   rÒ   r   NrJ   rî   s     r.   rM   z&find_button_by_text.<locals>.<genexpr>‡  s<   è è € ÐeÐeÐST˜˜/Ô*¨3Ô/°!°OÔ2DÀXÔ2NÑNÐeÐeÐeÐeÐeÐer@   r4   )r   râ   rã   r�   rÃ   )rO   r   r‡   r…   r„   r/   ra   ÚminrR   r'   r‰   r‚   )r0   rÝ   rÞ   rH   Úorig_wÚorig_hÚis_traverse_or_enterÚx_offÚy_offr,   rp   Ú	line_textræ   Úmatched_wordsÚtarget_wordsÚmin_xÚmax_xÚmin_yÚmax_yr=   r>   r‚   Úbtn_posrê   s                          @r.   Úfind_button_by_textr  Z  sß  ø€ õ �iÑ
 Ô
 €CØ
€{Øˆtð'Øœ‰ˆ�Ø—k’k‘m”mˆð  +Ð.ZÐZÐØð 	: HÐ$4Ø˜1�c &¨4¡-Ñ0Ô0°&Ð9ˆHà‰ˆˆuØð 	4Ø—(’(˜8Ñ$Ô$ˆCØ# Aœ;¨°¬�5ˆEå% cÑ*Ô*ˆØ—G’G˜G RÑ(Ô(ð 	ñ 	ˆDØŸš ¨Ñ,Ô,×2Ò2Ñ4Ô4ˆIà#ð ¨°9Ð(<Ð(<ÀÈ)ÐASÐASØØ )Ð+Ð+ØØ—H’H˜W bÑ)Ô)ˆEØZÐZÐZÐZ¨ÐZÑZÔZˆMØ,9ÐD˜=˜=¸uˆLØð ØÝÐFÐF¸ÐFÑFÔFÑFÔFˆEÝÐdÐdÐWcÐdÑdÔdÑdÔdˆEÝÐFÐF¸ÐFÑFÔFÑFÔFˆEÝÐeÐeÐXdÐeÑeÔeÑeÔeˆEÝ�U˜e e™m¨qÑ0Ñ0Ñ1Ô1ˆBÝ�U˜e e™m¨qÑ0Ñ0Ñ1Ô1ˆBð $ð ¨­S°¸$±Ñ-?Ô-?Ò(?Ð(?ÙØ�r�6ˆMˆMˆMð-	øõ. ð ð ð Øˆðøøøð Ð9Ð9Ð9ð	ØPÐPÐPÐPÐPÐPØ4Ð4°YÑ?Ô?ˆGØð ˜7 1œ:­¨V°d©]Ñ);Ô);Ò;Ð;Ø�øøÝð 	ð 	ð 	ØˆDð	øøøð ˆ4s$   –F(G  Ç 
GÇGÇ0H È
HÈHTú!Optional[Union[str, Image.Image]]Úscale_xúOptional[float]Úscale_yÚreturn_none_if_missingc                ó¬  — | €4|rdS |�|nd}|�|nd}t          d|z  ¦  «        t          d|z  ¦  «        fS t          | ¦  «        }|€4|rdS |�|nd}|�|nd}t          d|z  ¦  «        t          d|z  ¦  «        fS |j        \  }}|�|n|dz  }|�|n|dz  }dD ]P}	t          ||	¦  «        }
|
r<|
d         t          |d	z  ¦  «        k    r |
d
         t          |dz  ¦  «        k    r|
c S ŒQ	 ddlm}  ||¦  «        }|r|d         t          |d	z  ¦  «        k    r|S n# t          $ r Y nw xY w|s$t          d|z  ¦  «        t          d|z  ¦  «        fS dS )uw  XÃ¡c Ä‘á»‹nh vá»‹ trÃ­ nÃºt TRAVERSE trÃªn giao diá»‡n Map Device / Atlas (SSoT Common Kernel).

    Quy chuáº©n nháº­n diá»‡n (Doc 56 / Doc 48 / SSoT 2026):
    - KÃ­ch thÆ°á»›c nÃºt: ~150x40 á»Ÿ 1440p (co giÃ£n theo tá»· lá»‡ mÃ n hÃ¬nh).
    - VÃ¹ng panel phá»¥ báº£n á»Ÿ giá»¯a / dÆ°á»›i mÃ n hÃ¬nh:
      x in [0.30 * w .. 0.60 * w], y in [0.35 * h .. 0.88 * h].
    - Sá»­ dá»¥ng WinOCR tÃ¬m cÃ¡c token: TRAVERSE, TRAVERS, TRAVER, ACTIVATE, ENTER (loáº¡i trá»« tooltip).
    - Dual-Pass Fallback qua CLAHE + Template Matching khi chá»¯ bá»‹ bloom/chÃ³i.
    - KhÃ´ng click mÃ¹ ra ngoÃ i panel hoáº·c vÃ¹ng Quest Tracker.
    Nç      ð?iD  iì  ç      ¤@ç     €–@)r   râ   ÚTRAVERrã   ÚTRAVERSFÚRAVERSEr   ç333333ã?rB   rÅ   r�   )r…   rO   r   r  r‰   r‚   r'   )r0   r  r  r	  r¢   r£   rH   r*   r+   rÝ   Úposr‚   r  s                r.   Úfind_traverse_button_screen_posr  Ÿ  sÜ  € ð  ÐØ!ð 	Ø�4ØÐ+ˆWˆW°ˆØÐ+ˆWˆW°ˆÝ�4˜"‘9‰~Œ~�s 3¨¡8™}œ}Ð,Ð,å
�iÑ
 Ô
 €CØ
€{Ø!ð 	Ø�4ØÐ+ˆWˆW°ˆØÐ+ˆWˆW°ˆÝ�4˜"‘9‰~Œ~�s 3¨¡8™}œ}Ð,Ð,àŒ8�D€A€qØÐ'ˆˆ¨a°&©j€BØÐ'ˆˆ¨a°&©j€Bð Vð ð ˆÝ! # uÑ-Ô-ˆØð 	ð �1Œv�˜Q ™X™œÒ&Ð&¨3¨q¬6µS¸¸T¹±]´]Ò+BÐ+BØ�
�
�
øðØLÐLÐLÐLÐLÐLØ0Ð0°Ñ5Ô5ˆØð 	�w˜q”z¥S¨¨T©¡]¤]Ò2Ð2ØˆNøøÝð ð ð Øˆðøøøð "ð -Ý�4˜"‘9‰~Œ~�s 3¨¡8™}œ}Ð,Ð,Øˆ4s   Ã,0D Ä
D+Ä*D+úTuple[int, int]c           	     óø  ‡— | €0|�|nd}|�|nd}t          d|z  ¦  «        t          d|z  ¦  «        fS t          | ¦  «        }|€0|�|nd}|�|nd}t          d|z  ¦  «        t          d|z  ¦  «        fS |j        \  }}|�|n|dz  }|�|n|dz  }t          d|z  ¦  «        t          d|z  ¦  «        f}	 t          |dz  ¦  «        }	t          d|z  ¦  «        }
|                     |	|
t          |d	z  ¦  «        t          d
|z  ¦  «        f¦  «        }t	          |¦  «        }|                     dg ¦  «        D �]/}|                     dg ¦  «        D �]}|                     dd¦  «                             ¦   «         Št          ˆfd„dD ¦   «         ¦  «        rX|d         }t          |	|d         z   |d         dz  z   ¦  «        }t          |
|d         z   |d         dz  z   ¦  «        }||fc c S t          ˆfd„dD ¦   «         ¦  «        r[|d         }t          |	|d         z   |d         z   d|z  z   ¦  «        }t          |
|d         z   |d         dz  z   ¦  «        }||fc c S �Œ�Œ1n# t          $ r Y nw xY w|S )u  XÃ¡c Ä‘á»‹nh vá»‹ trÃ­ click tab ENDGAME trÃªn thanh tab World Map (SSoT Common Kernel).

    Quy chuáº©n nháº­n diá»‡n:
    - VÃ¹ng tab bar á»Ÿ Ä‘á»‰nh mÃ n hÃ¬nh: y in [0.02 * h .. 0.12 * h], x in [0.15 * w .. 0.85 * w].
    - Nháº­n diá»‡n vÄƒn báº£n WinOCR vá»›i cÃ¡c tá»« khÃ³a: ENDGAME, NDGAME, END, GAME hoáº·c cÄƒn theo INTERLUDE.
    - Ä�iá»ƒm pixel tham chiáº¿u chuáº©n (~65% thanh tab World Map):
      (1647 * sx, 94 * sy). Táº¡i 2560x1440: (1647, 94); táº¡i 1197x897: (770, 59); táº¡i 1920x1080: (1235, 71).
    Nr  io  é^   r  r  ç333333Ã?r·   r¿   é‚   r   ræ   r   r   c              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   ©r:   ru   Úts     €r.   rM   z'find_endgame_tab_pos.<locals>.<genexpr>þ  s'   øè è € ÐsÐs !�q˜A�vÐsÐsÐsÐsÐsÐsr@   )	rx   ÚNDGAMEÚENDÚGAMEÚENIYÚENIXz;AMEÚAMEÚENRXrí   rÓ   r   r˜   rÒ   r   c              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   r  s     €r.   rM   z'find_endgame_tab_pos.<locals>.<genexpr>  s'   øè è € ÐLÐL A˜˜a˜ÐLÐLÐLÐLÐLÐLr@   )ry   ÚINTERLUDÚINTERr¶   )	r…   rO   r   r„   r/   ra   r‡   rˆ   r'   )r0   r  r  r¢   r£   rH   r*   r+   Údefault_posÚ
crop_x_offÚ
crop_y_offÚtab_cropr,   rp   ÚwordÚrectr=   r>   r  s                     @r.   Úfind_endgame_tab_posr,  Ù  sæ  ø€ ð ÐØÐ+ˆWˆW°ˆØÐ+ˆWˆW°ˆÝ�4˜"‘9‰~Œ~�s 2¨¡7™|œ|Ð+Ð+å
�iÑ
 Ô
 €CØ
€{ØÐ+ˆWˆW°ˆØÐ+ˆWˆW°ˆÝ�4˜"‘9‰~Œ~�s 2¨¡7™|œ|Ð+Ð+àŒ8�D€A€qØÐ'ˆˆ¨a°&©j€BØÐ'ˆˆ¨a°&©j€BÝ�t˜b‘y‘>”>¥3 r¨B¡w¡<¤<Ð0€KðÝ˜˜T™‘]”]ˆ
Ý˜˜b™‘\”\ˆ
Ø—8’8˜Z¨µS¸¸T¹±]´]ÅCÈÈbÉÁMÄMÐRÑSÔSˆÝ% hÑ/Ô/ˆØ—G’G˜G RÑ(Ô(ð 	"ñ 	"ˆDØŸš ¨"Ñ-Ô-ð "ñ "�Ø—H’H˜V RÑ(Ô(×.Ò.Ñ0Ô0�ÝÐsÐsÐsÐsÐ'rÐsÑsÔsÑsÔsð 
"Ø Ô0�DÝ˜Z¨$¨s¬)Ñ3°d¸7´mÀcÑ6IÑIÑJÔJ�BÝ˜Z¨$¨s¬)Ñ3°d¸8´nÀsÑ6JÑJÑKÔK�BØ˜r˜6�M�M�M�M�MÝÐLÐLÐLÐLÐ)KÐLÑLÔLÑLÔLð "Ø Ô0�Då˜Z¨$¨s¬)Ñ3°d¸7´mÑCÀcÈBÁhÑNÑOÔO�BÝ˜Z¨$¨s¬)Ñ3°d¸8´nÀsÑ6JÑJÑKÔK�BØ˜r˜6�M�M�M�M�Mñ"ñ"ð	"øõ ð ð ð Øˆðøøøð Ðs    Â6D8I* Ç/A5I* É%I* É*
I7É6I7r4   ç      >@rš   Úcolor_predicateúCallable[[int, int, int], bool]ÚroiÚstepr…   Úcluster_radius_xrP   Úcluster_radius_yÚmin_cluster_sizeúList[Tuple[int, int, int]]c                ób  ‡— t          | ¦  «        }|€g S |j        \  }}	|rt          d|d         ¦  «        nd}
|rt          d|d         ¦  «        nd}|rt          ||d         ¦  «        n|}|rt          |	|d         ¦  «        n|	}g }t	          |||¦  «        D ]]}t	          |
||¦  «        D ]I}|                     ||f¦  «        dd…         \  }}} ||||¦  «        r|                     ||f¦  «         ŒJŒ^|sg S g }|D ]Š}d}|D ]k}t          |d         |d         d         z
  ¦  «        |k     rAt          |d         |d         d         z
  ¦  «        |k     r|                     |¦  «         d} nŒl|s|                     |g¦  «         Œ‹ˆfd„|D ¦   «         }g }|D ]y}t          d	„ |D ¦   «         ¦  «        t          |¦  «        z  }t          d
„ |D ¦   «         ¦  «        t          |¦  «        z  }|                     ||t          |¦  «        f¦  «         Œz| 
                    d„ d¬¦  «         |S )u   Thuáº­t toÃ¡n phÃ¢n cá»¥m Ä‘iá»ƒm áº£nh theo mÃ u (Color Clustering).
    
    @param color_predicate: HÃ m nháº­n (r, g, b) vÃ  tráº£ vá»� True náº¿u thá»�a mÃ£n
    @param roi: VÃ¹ng quan tÃ¢m (x1, y1, x2, y2)
    @return: Danh sÃ¡ch cÃ¡c cá»¥m dáº¡ng [(cx, cy, sá»‘_Ä‘iá»ƒm), ...]
    Nr   rB   r4   rC   FTc                ó:   •— g | ]}t          |¦  «        ‰k    ¯|‘ŒS rJ   )rQ   )r:   Úcr4  s     €r.   r?   z'find_color_clusters.<locals>.<listcomp>=  s*   ø€ Ð?Ð?Ð?�1¥C¨¡F¤FÐ.>Ò$>Ð$>ˆQÐ$>Ð$>Ð$>r@   c              3  ó&   K  — | ]}|d          V — ŒdS ©r   NrJ   ©r:   Úps     r.   rM   z&find_color_clusters.<locals>.<genexpr>@  ó&   è è € Ð!Ð!˜!��1”Ð!Ð!Ð!Ð!Ð!Ð!r@   c              3  ó&   K  — | ]}|d          V — ŒdS ©rB   NrJ   r;  s     r.   rM   z&find_color_clusters.<locals>.<genexpr>A  r=  r@   c                ó   — | d         S ©Nr4   rJ   )Úitems    r.   ú<lambda>z%find_color_clusters.<locals>.<lambda>D  s
   €  $ q¤'€ r@   )ÚkeyÚreverse)rO   r   rR   rö   r9   rF   r    ÚabsrE   rQ   Úsort)r0   r.  r0  r1  r2  r3  r4  rH   r*   r+   Úx1Úy1Úx2Úy2Úmatched_ptsrÒ   rÓ   r¤   r¥   r¦   ÚclustersrG   Úfoundr8  ÚvalidÚresultsr=   r>   s         `                     r.   Úfind_color_clustersrQ    s“  ø€ õ �iÑ
 Ô
 €CØ
€{Øˆ	àŒ8�D€A€qØÐ	%�ˆQ��A”‰Œˆ A€BØÐ	%�ˆQ��A”‰Œˆ A€BØÐ	%�ˆQ��A”‰Œˆ A€BØÐ	%�ˆQ��A”‰Œˆ A€Bà€KÝ�2�r˜4Ñ Ô ð +ð +ˆÝ�r˜2˜tÑ$Ô$ð 	+ð 	+ˆAØ—l’l A q 6Ñ*Ô*¨2¨A¨2Ô.‰GˆAˆq�!Øˆ˜q ! QÑ'Ô'ð +Ø×"Ò" A q 6Ñ*Ô*Ð*øð	+ð
 ð Øˆ	à,.€HØð "ð "ˆØˆØð 	ð 	ˆAÝ�2�a”5˜1˜Qœ4 œ7‘?Ñ#Ô#Ð&6Ò6Ð6½3¸rÀ!¼uÀqÈÄtÈAÄw¹Ñ;OÔ;OÐRbÒ;bÐ;bØ—’˜‘”�Ø�Ø�øØð 	"Ø�OŠO˜R˜DÑ!Ô!Ð!øà?Ð?Ð?Ð?˜Ð?Ñ?Ô?€EØ€GØð )ð )ˆÝÐ!Ð!˜qÐ!Ñ!Ô!Ñ!Ô!¥S¨¡V¤VÑ+ˆÝÐ!Ð!˜qÐ!Ñ!Ô!Ñ!Ô!¥S¨¡V¤VÑ+ˆØ�Š˜˜B¥ A¡¤Ð'Ñ(Ô(Ð(Ð(à‡L‚LÐ)Ð)°4€LÑ8Ô8Ð8Ø€Nr@   r  FÚallow_hideoutúList[Tuple[int, int, str]]c                ó  ‡‡— t          | ¦  «        }|�t          €g S |j        \  }}|dz  |dz  }}h d£}		 t          |¦  «        }
g }|
                     dg ¦  «        D �]}|                     dd¦  «                             ¦   «         Š‰                     ¦   «         Št          ‰¦  «        dk     rŒS|                     d	g ¦  «        }|sŒlt          d
„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }||dz  k    s||dz  k     s	||dz  k    rŒì|sd‰v rŒót          |¦  «        dk    st          ‰¦  «        dk    r�Œh d£}t          ˆfd„|D ¦   «         ¦  «        r�Œ<h d£}t          ‰                     ¦   «         ¦  «                             |¦  «        r�Œvt          ˆfd„dD ¦   «         ¦  «        }|r‡t          ˆfd„dD ¦   «         ¦  «        r�Œ°t          ||z   dz  ¦  «        }t          ||z   dz  ¦  «        }||dz  k    r||dz  k     r�Œî||dz  k    s	||dz  k     r�Œ|                     ||‰f¦  «         �Œ|S # t           $ r g cY S w xY w) u”  TÃ¬m tá»�a Ä‘á»™ nhÃ£n Portal trÃªn mÃ n hÃ¬nh Hideout báº±ng WinOCR thÃ´ng minh.
    
    Tá»± Ä‘á»™ng lá»�c bá»� cÃ¡c nhÃ£n tÄ©nh cá»§a Hideout (NPC, Stash, Waypoint, Map Device, HUD).
    Báº¥t ká»³ nhÃ£n nÃ o cÃ²n láº¡i quanh khu vá»±c chÆ¡i trung tÃ¢m Hideout (y in 250..950, x in 500..1800)
    chÃ­nh lÃ  nhÃ£n cá»•ng Portal map (nhÆ° 'PLANTATION', 'DESERTED', 'THE WELL OF SOULS', 'PORTAL').
    Nr  r  >F   ú
MAP DEVICEúAUT0-MINIMAPúRELIC LOCKERÚAXEÚBOWÚFOGÚFPSÚGEMÚORBÚALVAÚANGEÚBELTÚGOLDÚLIFEÚMACEÚMANAÚPOE2ÚRINGr}   ÚWANDÚWARDÚWELLÚZOOMÚANVILÚBEASTÚBENCHÚBOOTSÚCHARMÚFLAILÚFLASKÚFOCUSÚHILDAÚSTAFFÚSTASHÚSWORDÚZOLINÚAMULETrÉ   ÚDAGGERÚDEVICEÚFARROWÚGLOVESÚHELMETÚNATIVEÚPLAYERÚQUESTSÚQUIVERÚREVEALÚSCROLLÚSHIELDÚSPIRITÚZELINAÚCHAMBERÚDORYANIÚHUNTINGÚSCEPTREÚSCIENCEÚCROSSBOWÚMIRROREDÚWAYPOINTr€   Ú	CORRUPTEDrË   Ú	REFORGINGÚ
EXPEDITIONÚ
PRECURSORSÚ
REFLECTIONÚUNIDENTIFIEDÚDISENCHANTINGÚPOE2VISUALTOOLr   r   r   rC   ræ   c              3  ó2   K  — | ]}|d          d         V — ŒdS rì   rJ   ©r:   Úw_infos     r.   rM   z+find_portal_label_by_ocr.<locals>.<genexpr>r  ó,   è è € ÐIÐI¸˜˜Ô/°Ô4ÐIÐIÐIÐIÐIÐIr@   c              3  óP   K  — | ]!}|d          d         |d          d         z   V — Œ"dS rñ   rJ   r˜  s     r.   rM   z+find_portal_label_by_ocr.<locals>.<genexpr>s  s<   è è € ÐlÐlÐ\b˜˜Ô/°Ô4°v¸oÔ7NÈwÔ7WÑWÐlÐlÐlÐlÐlÐlr@   c              3  ó2   K  — | ]}|d          d         V — ŒdS ró   rJ   r˜  s     r.   rM   z+find_portal_label_by_ocr.<locals>.<genexpr>t  rš  r@   c              3  óP   K  — | ]!}|d          d         |d          d         z   V — Œ"dS rõ   rJ   r˜  s     r.   rM   z+find_portal_label_by_ocr.<locals>.<genexpr>u  s<   è è € ÐmÐmÐ]c˜˜Ô/°Ô4°v¸oÔ7NÈxÔ7XÑXÐmÐmÐmÐmÐmÐmr@   r¾   r’   g®Gázî?ÚHIDEOUTé   r»   >   õ   â€œõ   â€�Ú?ú!ú"ú#ú$ú%ú&ú'ú:ú@c              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   )r:   Úcir  s     €r.   rM   z+find_portal_label_by_ocr.<locals>.<genexpr>…  s'   øè è € Ð5Ð5˜r�2˜�7Ð5Ð5Ð5Ð5Ð5Ð5r@   >   úCOULDN'TÚIÚMEÚMYÚCANÚFORÚHADÚNOTÚPLSÚWASÚWTBÚWTSÚYOUÚHAVEÚMOVEÚNEEDÚBUYINGÚOUTSIDEÚSELLINGc              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   )r:   rž   Út_us     €r.   rM   z+find_portal_label_by_ocr.<locals>.<genexpr>‹  s7   øè è € ð 
!ð 
!¨r  s ð 
!ð 
!ð 
!ð 
!ð 
!ð 
!r@   )@ÚBURNINGÚMONOLITHÚ	MINESHAFTÚDESERTEDÚMARSHÚCREEKÚFORTRESSÚSOULSÚPORTALÚSANDSPITÚCRATERÚVAULTÚISLEÚGROVErž  ÚCROSSCUTÚRUINSÚBASTIONÚCITADELÚTEMPLEÚSANCTUMÚPLATEAUÚMEADOWSÚCANALÚSEWERÚDEPTHSÚCRYPTÚTOMBÚBARROWSÚ	GRAVEYARDÚRIDGEÚSPIREÚPEAKÚVALLEYÚGORGEÚCANYONÚOASISÚDUNEÚSTRANDÚATOLLÚREEFÚSHOREÚBEACHÚBAYÚCOVEÚISLANDÚVOLCANOÚCALDERAÚPITÚCAVERNÚCELLARÚDUNGEONÚPRISONÚFOUNDRYÚGARDENÚORCHARDÚPARKÚ	COURTYARDÚPLAZAÚTERRACEÚ	PROMENADEÚARENAÚ	COLOSSEUMÚBLIGHTEDc              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   )r:   ÚqrÂ  s     €r.   rM   z+find_portal_label_by_ocr.<locals>.<genexpr>—  s7   øè è € ð ð  A�q˜C�xð ð ð ð ð ð r@   )ÚREACHÚTRAVELÚDEFEATÚRAVELÚ
KINGSMARCHr’  r“  r‘  r‹  r‰  rl  r‡  ÚENIGMAÚ	PRECURSORr4   r¿   rÅ   g
×£p=
ç?ç{®Gáz´?)rO   r!   r   r/   ra   Ústripr‡   rQ   rö   rR   rˆ   ÚsetÚsplitÚintersectionr…   r    r'   )r0   r  r  rR  rH   r*   r+   r¢   r£   Ú	blacklistr,   Ú
candidatesrp   ræ   rÿ   r   r  r  Úchat_indicatorsÚ
chat_wordsÚis_map_keywordr=   r>   r  rÂ  s                          @@r.   Úfind_portal_label_by_ocrr  H  sS  øø€ õ �iÑ
 Ô
 €CØ
€{•f�nØˆ	àŒ8�D€A€qØ�‰Z˜˜V™ˆ€Bð
ð 
ð 
€IðBÝ% cÑ*Ô*ˆØˆ
Ø—G’G˜G RÑ(Ô(ð ;	/ñ ;	/ˆDØ—’˜ Ñ$Ô$×*Ò*Ñ,Ô,ˆAØ—'’'‘)”)ˆCÝ�1‰vŒv˜ŠzˆzØØ—H’H˜W bÑ)Ô)ˆEØð ØÝÐIÐIÀ5ÐIÑIÔIÑIÔIˆEÝÐlÐlÐfkÐlÑlÔlÑlÔlˆEÝÐIÐIÀ5ÐIÑIÔIÑIÔIˆEÝÐmÐmÐglÐmÑmÔmÑmÔmˆEð �q˜4‘xÒÐ 5¨1¨t©8Ò#3Ð#3°u¸qÀ4¹xÒ7GÐ7GØð !ð  Y°#Ð%5Ð%5Øõ �5‰zŒz˜AŠ~ˆ~¥ Q¡¤¨"¢ ÙØ^Ð^Ð^ˆOÝÐ5Ð5Ð5Ð5 _Ð5Ñ5Ô5Ñ5Ô5ð Ùð nð  nð  nˆJÝ�3—9’9‘;”;ÑÔ×,Ò,¨ZÑ8Ô8ð Ùå ð 
!ð 
!ð 
!ð 
!ð 
6ð 
!ñ 
!ô 
!ñ 
ô 
ˆNð ð /Ýð ð ð ð ð *ð ñ ô ñ ô ð ñ
 Ý˜% %™-¨1Ñ,Ñ-Ô-�Ý˜% %™-¨1Ñ,Ñ-Ô-�à˜˜D™’=�= R¨!¨d©(¢] ]Ùà˜˜D™’=�= B¨¨T©¢M MÙØ×!Ò! 2 r¨1 +Ñ.Ô.Ð.ùàÐøÝð ð ð Øˆ	ˆ	ˆ	ðøøøs   ¶II; É;J
Ê	J
c                ó^  ‡— t          | ¦  «        }|€dS 	 t          |¦  «        }|                     dg ¦  «        D ]`}|                     dd¦  «                             ¦   «                              dd¦  «        Šd‰v rt          ˆfd„d	D ¦   «         ¦  «        r d
S Œan# t          $ r Y nw xY wdS )u_   Kiá»ƒm tra xem Atlas Node Ä‘ang chá»�n cÃ³ bá»‹ cáº¡n kiá»‡t (REVIVES AVAILABLE: 0) hay khÃ´ng.NFr   r   r   rk   ÚREVIVEc              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   )r:   Úzr  s     €r.   rM   z)is_atlas_node_depleted.<locals>.<genexpr>¶  s'   øè è € Ð$lÐ$l° Q¨! VÐ$lÐ$lÐ$lÐ$lÐ$lÐ$lr@   )z:0z:OzAVAILABLE:0zAVAILABLE:Oz=0z=OT)rO   r/   ra   r‡   Úreplacerˆ   r'   )r0   rH   r,   rp   r  s       @r.   Úis_atlas_node_depletedr  ¬  s×   ø€ å
�iÑ
 Ô
 €CØ
€{ØˆuðÝ% cÑ*Ô*ˆØ—G’G˜G RÑ(Ô(ð 	ð 	ˆDØ—’˜ Ñ$Ô$×*Ò*Ñ,Ô,×4Ò4°S¸"Ñ=Ô=ˆAà˜1ˆ}ˆ}¥Ð$lÐ$lÐ$lÐ$lÐ5kÐ$lÑ$lÔ$lÑ!lÔ!lˆ}Ø�t�tøð		øõ
 ð ð ð Øˆðøøøàˆ5s   –BB ÂB Â
B*Â)B*c           
     ó<  ‡— t          | ¦  «        }|�t          |¦  «        rdS t          ��Ë	 |j        \  }}t	          |dz  ¦  «        t	          |dz  ¦  «        t	          |dz  ¦  «        t	          |dz  ¦  «        fddt	          |dz  ¦  «        t	          |d	z  ¦  «        ft	          |d
z  ¦  «        dt	          |dz  ¦  «        t	          |d	z  ¦  «        fdd|t	          |dz  ¦  «        fg}|D ]ö}|                     |¦  «        }t          |¦  «        }|                     dg ¦  «        D ]¹}|                     dd¦  «                             ¦   «         }	|	 	                    dd¦  «         	                    dd¦  «        Šd‰v s]d‰v sYd‰v rt          ˆfd„dD ¦   «         ¦  «        s:t          ˆfd„dD ¦   «         ¦  «        sd|	v rt          ˆfd„dD ¦   «         ¦  «        r  dS ŒºŒ÷n# t          $ r Y nw xY w	 t          |¦  «        }
|
rdS n# t          $ r Y nw xY wdS )uv   Kiá»ƒm tra quang há»�c xem Map Device hoáº·c cá»•ng portal cÃ³ thá»±c sá»± xuáº¥t hiá»‡n trong khung hÃ¬nh hay khÃ´ng.NFr“   çš™™™™™©?ç¸…ëQ¸Þ?rN   r   r  r¾   rÅ   r—   r¿   r   r   r   rk   r©  rz  ÚMAPDEVÚMAPDc              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   ©r:   ru   Úcleans     €r.   rM   z(is_map_device_visible.<locals>.<genexpr>Ô  ó'   øè è € Ð3cÐ3cÀ1°A¸°JÐ3cÐ3cÐ3cÐ3cÐ3cÐ3cr@   ©ÚEVIÚFCÚTNCÚRRc              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   ©r:   Údr#  s     €r.   rM   z(is_map_device_visible.<locals>.<genexpr>Õ  ó'   øè è € ÐQÐQ¨a˜q E˜zÐQÐQÐQÐQÐQÐQr@   ©ÚUEVICEÚWEVICEÚEVICErå   c              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   r+  s     €r.   rM   z(is_map_device_visible.<locals>.<genexpr>Ö  ó'   øè è € Ð1]Ð1]À°!°u°*Ð1]Ð1]Ð1]Ð1]Ð1]Ð1]r@   ©ÚDEVÚDEVIr&  T)rO   rƒ   r!   r   r…   r„   r/   ra   r‡   r  rˆ   r'   r  )r0   rH   r*   r+   Úregionsr¤   Úcrop_imgr,   rp   r   Úp_labelsr#  s              @r.   Úis_map_device_visibler:  ½  su  ø€ å
�iÑ
 Ô
 €CØ
€{Õ'¨Ñ,Ô,€{ØˆuÝÑð	Ø”8‰DˆAˆqå�Q˜‘X‘”¥ A¨¡H¡¤­s°1°t±8©}¬}½cÀ!ÀdÁ(¹m¼mÐLØ�A•s˜1˜t™8‘}”}¥c¨!¨d©(¡m¤mÐ4Ý�Q˜‘X‘” ¥3 q¨4¡x¡=¤=µ#°a¸$±h±-´-Ð@Ø�A�q�#˜a $™h™-œ-Ð(ð	ˆGð ð $ð $�ØŸ8š8 A™;œ;�Ý-¨hÑ7Ô7�ØŸGšG G¨RÑ0Ô0ð 
$ð 
$�DØŸ8š8 F¨BÑ/Ô/×5Ò5Ñ7Ô7�DØ ŸLšL¨¨bÑ1Ô1×9Ò9¸#¸rÑBÔB�Eà  EÐ)Ð)Ø# uÐ,Ð,Ø" e˜O˜OµÐ3cÐ3cÐ3cÐ3cÐHbÐ3cÑ3cÔ3cÑ0cÔ0c˜OÝÐQÐQÐQÐQÐ3PÐQÑQÔQÑQÔQð ,à! T˜M˜M­cÐ1]Ð1]Ð1]Ð1]ÐF\Ð1]Ñ1]Ô1]Ñ.]Ô.]˜Mà#˜t˜t˜tøð
$ð$øõ ð 	ð 	ð 	ØˆDð	øøøðÝ+¨CÑ0Ô0ˆØð 	Ø�4ð	øåð ð ð Øˆðøøøàˆ5s*   ­F5G' Ç$G' Ç'
G4Ç3G4Ç8H È
HÈHc           	     óÐ  — t          | ¦  «        }|�t          |¦  «        rdS t          �¼	 |j        \  }}|                     t          |dz  ¦  «        t          |dz  ¦  «        t          |dz  ¦  «        t          |dz  ¦  «        f¦  «        }t          |¦  «        }d„ |                     dg ¦  «        D ¦   «         }t          d	„ |D ¦   «         ¦  «        S # t          $ r Y nw xY wdS )
un   Kiá»ƒm tra quang há»�c xem Game Menu chÃ­nh cá»§a POE2 (RESUME GAME, OPTIONS, EXIT) cÃ³ Ä‘ang má»Ÿ hay khÃ´ng.NFrÅ   r  r´   rÃ   c                ó^   — g | ]*}|                      d d¦  «                             ¦   «         ‘Œ+S rè   ré   )r:   Úls     r.   r?   z(is_game_menu_visible.<locals>.<listcomp>î  s2   € ÐMÐMÐM°1�Q—U’U˜6 2Ñ&Ô&×,Ò,Ñ.Ô.ÐMÐMÐMr@   r   c              3  ó.   K  — | ]}d |v pd|v pd|v V — ŒdS )ÚRESUMEzEXIT TOÚMICROTRANSACTIONNrJ   )r:   r  s     r.   rM   z'is_game_menu_visible.<locals>.<genexpr>ï  s<   è è € ÐcÐcÐXY˜ A˜ÐR¨°a¨ÐRÐ;MÐQRÐ;RÐcÐcÐcÐcÐcÐcr@   )
rO   rƒ   r!   r   r„   r…   r/   ra   rˆ   r'   )r0   rH   r*   r+   r8  r,   Útextss          r.   Úis_game_menu_visiblerB  ä  sò   € å
�iÑ
 Ô
 €CØ
€{Õ'¨Ñ,Ô,€{ØˆuÝÐð	Ø”8‰DˆAˆqØ—x’x¥ Q¨¡X¡¤µ°A¸±H±´½sÀ1ÀtÁ8¹}¼}ÍcÐRSÐVZÑRZÉmÌmÐ \Ñ]Ô]ˆHÝ)¨(Ñ3Ô3ˆCØMÐM¸¿ºÀÈÑ8LÔ8LÐMÑMÔMˆEÝÐcÐcÐ]bÐcÑcÔcÑcÔcÐcøÝð 	ð 	ð 	ØˆDð	øøøàˆ5s   «B*C Ã
C#Ã"C#©i  é  Úfallback_posÚ	fast_pathc                ó`  ‡6‡7‡8‡9‡:‡;‡<‡=‡>‡?‡@‡A‡B‡C‡D‡E‡F‡G— t          | ¦  «        }|€V|�|ndŠ@|�|ndŠAt          t          |d         ‰@z  ¦  «        ¦  «        t          t          |d         ‰Az  ¦  «        ¦  «        fS |j        \  ŠCŠ<t	          ‰C‰<¦  «        }t          t          |¬¦  «        }|�Q|�O|Š@|ŠAt          t          |d         |z  ¦  «        ¦  «        Š:t          t          |d         |z  ¦  «        ¦  «        Š;n3|j        Š@|j        ŠA| 	                    |d         |d         ¦  «        \  Š:Š;|�r½| 
                    ¦   «         }|��¢t          dt          d‰@z  ¦  «        ¦  «        }	d}
d}d}t          dt          ‰:d‰@z  z
  ¦  «        ¦  «        }t          ‰Ct          ‰:d‰@z  z   ¦  «        ¦  «        }t          dt          ‰;d	‰Az  z
  ¦  «        ¦  «        }t          ‰<t          ‰;d	‰Az  z   ¦  «        ¦  «        }t          |||	¦  «        D ]È}t          |||	¦  «        D ]´}|||f         dd
…         \  }}}|dk    r%d	|cxk    rdk    rn n|dk    r||dz   k    r|
dz  }
ŒC|dk    r|dk    r||dz   k    r	||dz   k    s|dk    r||dz  k    r||dz  k    r|dz  }Œd|cxk    rdk    r(n Œ�d|cxk    rdk    rn ŒŸd|cxk    rd	k    rn Œ¯|dz  }ŒµŒÉ|
d
k    s|d
k    s|dk    r‰:‰;fS ‰:‰;fS t          |¦  «        r‰:‰;fS g Š6t          ���	 t          ‰Cdz  ¦  «        t          ‰<dz  ¦  «        t          ‰Cdz  ¦  «        t          ‰<dz  ¦  «        fddt          ‰Cdz  ¦  «        t          ‰<dz  ¦  «        ft          ‰Cdz  ¦  «        dt          ‰Cdz  ¦  «        t          ‰<dz  ¦  «        fdd‰Ct          ‰<d z  ¦  «        fg}|D �]ï\  Š>Š?}}|                     ‰>‰?||f¦  «        }t#          |¦  «        }|                     d!g ¦  «        D �]§}|                     d"d#¦  «                             ¦   «         ŠB‰B                     d$d#¦  «                             d%d#¦  «        Š7d&‰7v s^d'‰7v sZd(‰7v rt+          ˆ7fd)„d*D ¦   «         ¦  «        s;t+          ˆ7fd+„d,D ¦   «         ¦  «        s d-‰Bv �rt+          ˆ7fd.„d/D ¦   «         ¦  «        rð|                     d0g ¦  «        }ˆ<ˆ>ˆ?ˆCfd1„|D ¦   «         }d2„ |D ¦   «         }|r|n|}|rµt          d3„ |D ¦   «         ¦  «        ‰>z   }t          d4„ |D ¦   «         ¦  «        ‰>z   } t          d5„ |D ¦   «         ¦  «        ‰?z   }!t          d6„ |D ¦   «         ¦  «        ‰?z   }"t          || z   d7z  ¦  «        }#t          |!|"z   d7z  ¦  «        t          d8‰Az  ¦  «        z   }$|#|$fc c S �Œ©�Œñ	 t-          |‰@‰A¬9¦  «        }%|%rVt/          d:„ |%D ¦   «         ¦  «        t1          |%¦  «        z  }&t/          d;„ |%D ¦   «         ¦  «        t1          |%¦  «        z  }'|&|'fS n# t2          $ r Y nw xY w|                     d!g ¦  «        D �]‚}|                     d"d#¦  «                             ¦   «         ŠBt+          ˆBfd<„d=D ¦   «         ¦  «        �r;|                     d0g ¦  «        D �]#ŠDt+          ˆDfd>„d=D ¦   «         ¦  «        �rt          ‰Dd?         d@         ‰Dd?         dA         d7z  z   ¦  «        }(t          ‰Dd?         dB         ‰Dd?         dC         d7z  z   ¦  «        })t          t          |(dD‰@z  z
  ¦  «        ¦  «        }*t          t          d‰Az  ¦  «        t          t          |)dE‰Az  z
  ¦  «        ¦  «        ¦  «        }+|*dk    rB|+dk    r<t5          |*‰:z
  ¦  «        dk    rt5          |+‰;z
  ¦  «        dk    r‰:‰;fc c S |*|+fc c S �Œ%�Œ„g Š6|                     d!g ¦  «        D ]±}|                     d"d#¦  «                             ¦   «         ŠBt+          ˆBfdF„dGD ¦   «         ¦  «        rl|                     d0g ¦  «        D ]UŠD‰6                     ‰Dd?         d@         ‰Dd?         dA         d7z  z   ‰Dd?         dB         ‰Dd?         dC         d7z  z   f¦  «         ŒVŒ²n# t2          $ r g Š6Y nw xY w	 d]dN„},t          dt          ‰:d‰@z  z
  ¦  «        ¦  «        t          dt          ‰;dO‰Az  z
  ¦  «        ¦  «        t          ‰Ct          ‰:d‰@z  z   ¦  «        ¦  «        t          ‰<t          ‰;dO‰Az  z   ¦  «        ¦  «        f}-t9          ||,|-d‰@z  d‰Az  dP¬Q¦  «        }.|.rPt          |.ˆ:ˆ;fdR„¬S¦  «        }/|/d         ‰:z
  d7z  |/d         ‰;z
  d7z  z   d‰@z  d7z  k     r‰:‰;fS |/d         |/d         fS n# t2          $ r Y nw xY w	 d]dT„}0t          dt          ‰:d‰@z  z
  ¦  «        ¦  «        t          dt          ‰;dU‰Az  z
  ¦  «        ¦  «        t          ‰Ct          ‰:d‰@z  z   ¦  «        ¦  «        t          ‰<t          ‰;dU‰Az  z   ¦  «        ¦  «        f}1t9          ||0|1d‰@z  d‰Az  dP¬Q¦  «        }2‰Cd7z  t          ‰<dVz  ¦  «        cŠ8Š9dU‰Az  d7z  Š=t          dW‰CdXz  z  ¦  «        t          dY‰<dZz  z  ¦  «        cŠFŠGd	‰Az  d7z  ŠE|2reˆ6ˆ8ˆ9ˆ=ˆAˆEˆFˆGfd[„|2D ¦   «         }3|3rNˆ:ˆ;ˆ@fd\„|3D ¦   «         }4|4r‰:‰;fS |3d         }5t          |5d         ¦  «        t          |5d         d‰Az  z   ¦  «        fS n# t2          $ r Y nw xY w‰:‰;fS )^u²  XÃ¡c Ä‘á»‹nh vá»‹ trÃ­ tÆ°Æ¡ng tÃ¡c Map Device trong Hideout.

    Thá»© tá»± Æ°u tiÃªn:
    0. Fast-Path (< 0.5ms náº¿u fast_path=True): PhÃ¢n cá»¥m mÃ u lá»­a & mÃ u ngá»�c xanh táº¡i bá»‡ Ä‘Ã¡ Shoreline Hideout.
    1. Nháº­n diá»‡n nhÃ£n 'MAP DEVICE' / 'DEVICE' / 'MAP DEV' qua OCR (loáº¡i trá»« HUD vÃ  vÃ¹ng minimap).
    2. QuÃ©t cá»¥m mÃ u ngá»�c xanh (Cyan gem / runes) trÃªn bá»‡ Ä‘Ã¡ Map Device táº¡i Shoreline Hideout.
    3. QuÃ©t cá»¥m mÃ u ngá»�n lá»­a (Flame color clustering) trÃªn cÃ¡c ngá»�n Ä‘uá»‘c bá»‡ Ä‘Ã¡.
    4. Tá»�a Ä‘á»™ fallback Ä‘Ã£ calibrate táº¡i Shoreline Hideout: (1866, 471) @1440p hoáº·c (872, 293) @windowed (tá»± Ä‘á»™ng co giÃ£n theo Resolution).
    Nr  r   rB   ©Ú
source_resÚ
target_resé   é   éd   éP   rC   r¹   éÜ   éŒ   é(   rš   r³   rÀ   g      ô?gÍÌÌÌÌÌð?r»   én   r·   é
   r“   r  r  rN   r  r¾   rÅ   r—   r¿   r   r   r   rk   r©  rz  r  r   c              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   r"  s     €r.   rM   z-find_map_device_screen_pos.<locals>.<genexpr>K  r$  r@   r%  c              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   r+  s     €r.   rM   z-find_map_device_screen_pos.<locals>.<genexpr>L  r-  r@   r.  rå   c              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   r+  s     €r.   rM   z-find_map_device_screen_pos.<locals>.<genexpr>M  r3  r@   r4  ræ   c                ó¾   •— g | ]Y}|d          d         ‰z   d‰z  k    r|d          d         ‰z   d‰z  k     s'd‰z  |d          d         ‰z   cxk    r	d‰z  k    ¯Tn n|‘ŒZS )rí   rÓ   r—   rÒ   r¼   g{®Gáz”?rÄ   rJ   )r:   r™  r+   Úrx1Úry1r*   s     €€€€r.   r?   z.find_map_device_screen_pos.<locals>.<listcomp>P  s¶   ø€ ð 'ð 'ð 'Ø'-Ø%+¨OÔ%<¸SÔ%AÀCÑ%GÈ4ÐRSÉ8Ò$SÐ$SÐY_Ð`oÔYpÐqtÔYuÐx{ÑY{ð  @Dð  GHñ  @Hò  YHð  YHØ $ q¡¨V°OÔ-DÀSÔ-IÈCÑ-OÐ \Ð \Ò \Ð \ÐTXÐ[\ÑT\Ò \Ð \Ð \Ð \Ð \ð #à \Ð \Ð \r@   c                óî   ‡— g | ]qŠt          ˆfd „dD ¦   «         ¦  «        sR‰                     dd¦  «                             ¦   «                              dd¦  «                             dd¦  «        dv ¯o‰‘ŒrS )c              3  ól   •K  — | ].}|‰                      d d¦  «                             ¦   «         v V — Œ/dS rm   ré   ©r:   ru   r™  s     €r.   rM   z8find_map_device_screen_pos.<locals>.<listcomp>.<genexpr>W  sZ   øè è € ð  #Gð  #GÈ1 1¨¯
ª
°6¸2Ñ(>Ô(>×(DÒ(DÑ(FÔ(FÐ#Fð  #Gð  #Gð  #Gð  #Gð  #Gð  #Gr@   )rå   r5  rz  r/  r0  r1  r   r   rk   r©  )ÚDr&  r'  r(  )rˆ   ra   r‡   r  r˜  s    @r.   r?   z.find_map_device_screen_pos.<locals>.<listcomp>U  s²   ø€ ð )ð )ð )Ø'-Ý"ð  #Gð  #Gð  #Gð  #Gð  QFð  #Gñ  #Gô  #Gñ   Gô   Gð)ð  &Ÿzšz¨&°"Ñ5Ô5×;Ò;Ñ=Ô=×EÒEÀcÈ2ÑNÔN×VÒVÐWZÐ\^Ñ_Ô_Ðc|Ð|Ð|ð #à|Ð|Ð|r@   c              3  ó2   K  — | ]}|d          d         V — ŒdS rì   rJ   r˜  s     r.   rM   z-find_map_device_screen_pos.<locals>.<genexpr>\  ó,   è è € Ð'`Ð'`È¨¨Ô(?ÀÔ(DÐ'`Ð'`Ð'`Ð'`Ð'`Ð'`r@   c              3  óP   K  — | ]!}|d          d         |d          d         z   V — Œ"dS rñ   rJ   r˜  s     r.   rM   z-find_map_device_screen_pos.<locals>.<genexpr>]  sU   è è € ð  (Dð  (DÐlr¨¨Ô(?ÀÔ(DÀvÈoÔG^Ð_fÔGgÑ(gð  (Dð  (Dð  (Dð  (Dð  (Dð  (Dr@   c              3  ó2   K  — | ]}|d          d         V — ŒdS ró   rJ   r˜  s     r.   rM   z-find_map_device_screen_pos.<locals>.<genexpr>^  r_  r@   c              3  óP   K  — | ]!}|d          d         |d          d         z   V — Œ"dS rõ   rJ   r˜  s     r.   rM   z-find_map_device_screen_pos.<locals>.<genexpr>_  sU   è è € ð  (Eð  (EÐms¨¨Ô(?ÀÔ(DÀvÈoÔG^Ð_gÔGhÑ(hð  (Eð  (Eð  (Eð  (Eð  (Eð  (Er@   r4   r½   ©r  r  c              3  ó&   K  — | ]}|d          V — ŒdS r:  rJ   r;  s     r.   rM   z-find_map_device_screen_pos.<locals>.<genexpr>i  ó&   è è € Ð4Ð4 a˜Q˜qœTÐ4Ð4Ð4Ð4Ð4Ð4r@   c              3  ó&   K  — | ]}|d          V — ŒdS r?  rJ   r;  s     r.   rM   z-find_map_device_screen_pos.<locals>.<genexpr>j  re  r@   c              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   )r:   ru   r   s     €r.   rM   z-find_map_device_screen_pos.<locals>.<genexpr>r  s'   øè è € ÐLÐL Q�q˜D�yÐLÐLÐLÐLÐLÐLr@   )rŽ  ÚWAYPOINÚWAYPOIc              3  ól   •K  — | ].}|‰                      d d¦  «                             ¦   «         v V — Œ/dS rm   ré   r\  s     €r.   rM   z-find_map_device_screen_pos.<locals>.<genexpr>t  sB   øè è € ÐnÐnÀq˜q F§J¢J¨v°rÑ$:Ô$:×$@Ò$@Ñ$BÔ$BÐBÐnÐnÐnÐnÐnÐnr@   rí   rÓ   r   rÒ   r   i„  io  c              3  ó    •K  — | ]}|‰v V — Œ	d S rt   rJ   )r:   r¦   r   s     €r.   rM   z-find_map_device_screen_pos.<locals>.<genexpr>‚  s'   øè è € ÐUÐU Q�q˜D�yÐUÐUÐUÐUÐUÐUr@   )r�  ÚSALVAGErm  rk  r¤   r…   r¥   r¦   r   r2   c                ón   — |dk    r|dk    r|| dz   k    r	|| dz   k    p|dk    o|| dz  k    o||dz  k    S )NrR  r8   rS  rµ   gš™™™™™õ?gš™™™™™ñ?rJ   ©r¤   r¥   r¦   s      r.   Úis_cyan_gemz/find_map_device_screen_pos.<locals>.is_cyan_gem�  sW   € Ø˜’HÐG  c¢ÐG¨a°!°b±&ªjÐG¸QÀÀRÁºZð ?Ø˜’HÐ=  Q¨¡X¢Ð=°!°a¸#±g²+ð?r@   é    r8   ©r.  r0  r2  r3  r4  c                ó>   •— | d         ‰z
  dz  | d         ‰z
  dz  z   S ©Nr   r4   rB   rJ   )r8  Ú	default_xÚ	default_ys    €€r.   rC  z,find_map_device_screen_pos.<locals>.<lambda>¢  s(   ø€ ˜q œt iÑ/°AÑ5¸¸1¼À	Ñ9IÈaÑ8OÑO€ r@   ©rD  c                óL   — | dk    od|cxk    odk    nc o|dk    o| |dz   k    S )Né¾   r›   rO  r  rÂ   rJ   rn  s      r.   Úis_flamez,find_map_device_screen_pos.<locals>.is_flame¬  s;   € Ø˜’8ÐL  a  ¢ ¨3¢   ÐL°1¸²8ÐLÀÀQÈÁVÂÐLr@   éx   gHáz®Gá?i$  g     ”’@i�  g     Ø‹@c                óÒ   •‡— g | ]bŠt          ˆˆfd „‰D ¦   «         ¦  «        sD‰d         ‰z
  dz  ‰d         ‰z
  dz  z   ‰k    r#‰d         ‰z
  dz  ‰d         ‰	z
  dz  z   ‰k    ¯`‰‘ŒcS )c              3  ól   •K  — | ].\  }}‰d          |z
  dz  ‰d         |z
  dz  z   d‰z  dz  k     V — Œ/dS )r   r4   rB   r¹   NrJ   )r:   ÚbxÚbyr8  r£   s      €€r.   rM   z8find_map_device_screen_pos.<locals>.<listcomp>.<genexpr>Å  sV   øè è € ÐiÐiÑU[ÐUWÐY[˜A˜aœD 2™I¨!Ñ+¨q°¬t°b©y¸QÑ.>Ñ>À#ÈÁ(ÈqÁÒPÐiÐiÐiÐiÐiÐir@   r   r4   rB   )rˆ   )
r:   r8  Ú	bench_ptsÚ	cx_screenÚ	cy_screenÚplayer_radius_sqr£   Úwaypoint_radius_sqÚ
waypoint_xÚ
waypoint_ys
    @€€€€€€€€r.   r?   z.find_map_device_screen_pos.<locals>.<listcomp>Ã  s¬   øø€ ð ð ð ØÝÐiÐiÐiÐiÐiÐ_hÐiÑiÔiÑiÔiðð �q”T˜IÑ%¨!Ñ+¨q°¬t°iÑ/?ÀAÑ.EÑEÐIYÒYÐYØ�q”T˜JÑ&¨1Ñ,°°!´°zÑ0AÀaÑ/GÑGÐK]Ò]Ð]ð ð ^Ð]Ð]r@   c                ób   •— g | ]+}|d          ‰z
  dz  |d         ‰z
  dz  z   d‰z  dz  k     ¯)|‘Œ,S )r   r4   rB   rz  rJ   )r:   r8  rt  ru  r¢   s     €€€r.   r?   z.find_map_device_screen_pos.<locals>.<listcomp>Ê  sY   ø€ ð  ð  ð  ØØ˜!œ˜yÑ(¨QÑ.°!°A´$¸Ñ2BÀqÑ1HÑHÈCÐRTÉHÐYZÉ?ÒZÐZð ØZÐZÐZr@   ©r¤   r…   r¥   r…   r¦   r…   r   r2   )rO   r…   Úroundr   r   r   r   r  r  Útransform_pointrÌ   rR   rö   r9   rƒ   r!   r„   r/   ra   r‡   r  rˆ   r  rE   rQ   r'   rF  r    rQ  )Hr0   r  r  rE  rF  rH   r,   ÚscalerrÏ   r1  ÚflamesÚcyansÚstoneÚroi_x1Úroi_x2Úroi_y1Úroi_y2rÒ   rÓ   r¤   r¥   r¦   r7  Úrx2Úry2r8  rp   ræ   Úvalid_wordsrý   rþ   rÿ   r   r  r  r=   r>   r9  r­   r®   ÚwxÚwyÚcalc_xÚcalc_yro  Úpedestal_roiÚcyan_clustersÚ	best_cyanry  Ú	flame_roirM  Úvalid_flamesÚnear_defaultÚ
best_flamer  r#  r€  r�  rt  ru  r+   r‚  rX  rY  r¢   r£   r   r*   r™  rƒ  r„  r…  sH                                                         @@@@@@@@@@@@@@@@@@r.   Úfind_map_device_screen_posr   õ  s1  øøøøøøøøøøøøøøøøøø€ õ  �iÑ
 Ô
 €CØ
€{ØÐ+ˆWˆW°ˆØÐ+ˆWˆW°ˆÝ•5˜ aœ¨2Ñ-Ñ.Ô.Ñ/Ô/µµU¸<È¼?ÈRÑ;OÑ5PÔ5PÑ1QÔ1QÐQÐQàŒ8�D€A€qÝ
�Q˜Ñ
Ô
€CÝ­¸sÐCÑCÔC€FàÐ˜wÐ2ØˆØˆÝ�˜l¨1œo°Ñ7Ñ8Ô8Ñ9Ô9ˆ	Ý�˜l¨1œo°Ñ7Ñ8Ô8Ñ9Ô9ˆ	ˆ	àŒ^ˆØŒ^ˆØ%×5Ò5°lÀ1´oÀ|ÐTUÄÑWÔWÑˆ	�9ð ñ $Ø�hŠh‰jŒjˆØ‰?Ý�q�#˜a "™f™+œ+Ñ&Ô&ˆDØˆFØˆEØˆEÝ˜�C 	¨C°"©HÑ 4Ñ5Ô5Ñ6Ô6ˆFÝ˜�C 	¨C°"©HÑ 4Ñ5Ô5Ñ6Ô6ˆFÝ˜�C 	¨B°©GÑ 3Ñ4Ô4Ñ5Ô5ˆFÝ˜�C 	¨B°©GÑ 3Ñ4Ô4Ñ5Ô5ˆFÝ˜6 6¨4Ñ0Ô0ð 	#ð 	#�Ý˜v v¨tÑ4Ô4ð #ð #�AØ! ! Q $œi¨¨¨œm‘G�A�q˜!Ø˜C’x�x B¨! N N¢N N¨s¢N N N N N°q¸C²x°xÀQÈÈRÉÂZÀZØ !™˜˜Ø˜sš(˜( q¨C¢x x°A¸¸B¹²J°JÀ1ÀqÈ1ÁuÂ9À9Ø˜sš(˜( q¨1¨t©8¢| |¸¸AÀ¹Hº¸Ø ™
˜˜Ø˜q˜˜š˜ Cš˜˜˜˜¨B°!¨N¨NªN¨N°sªN¨N¨N¨N¨N¸rÀQ¸}¸}º}¸}È"º}¸}¸}¸}¸}Ø ™
˜øð#ð ˜!’� ¨!¢ °¸"²°Ø  )Ð+Ð+Ø˜)Ð#Ð#õ ˜ÑÔð $Ø˜)Ð#Ð#ð ,.€IÝÑðN	å�Q˜‘X‘”¥ A¨¡H¡¤­s°1°t±8©}¬}½cÀ!ÀdÁ(¹m¼mÐLØ�A•s˜1˜t™8‘}”}¥c¨!¨d©(¡m¤mÐ4Ý�Q˜‘X‘” ¥3 q¨4¡x¡=¤=µ#°a¸$±h±-´-Ð@Ø�A�q�#˜a $™h™-œ-Ð(ð	ˆGð '.ð !*ñ !*Ñ"��S˜#˜sØŸ8š8 S¨#¨s°CÐ$8Ñ9Ô9�Ý-¨hÑ7Ô7�ØŸGšG G¨RÑ0Ô0ð *ñ *�DØŸ8š8 F¨BÑ/Ô/×5Ò5Ñ7Ô7�DØ ŸLšL¨¨bÑ1Ô1×9Ò9¸#¸rÑBÔB�Eà  EÐ)Ð)Ø# uÐ,Ð,Ø" e˜O˜OµÐ3cÐ3cÐ3cÐ3cÐHbÐ3cÑ3cÔ3cÑ0cÔ0c˜OÝÐQÐQÐQÐQÐ3PÐQÑQÔQÑQÔQð ,à! T˜M™M­cÐ1]Ð1]Ð1]Ð1]ÐF\Ð1]Ñ1]Ô1]Ñ.]Ô.]˜Mà $§¢¨°"Ñ 5Ô 5˜ð'ð 'ð 'ð 'ð 'ð 'ð 'Ø16ð'ñ 'ô '˜ð
)ð )Ø1<ð)ñ )ô )˜ð
 9FÐ'V } }È;˜Ø'ð *Ý$'Ð'`Ð'`ÐS_Ð'`Ñ'`Ô'`Ñ$`Ô$`ÐcfÑ$f˜EÝ$'ð  (Dð  (Dð  wCð  (Dñ  (Dô  (Dñ  %Dô  %Dð  GJñ  %J˜EÝ$'Ð'`Ð'`ÐS_Ð'`Ñ'`Ô'`Ñ$`Ô$`ÐcfÑ$f˜EÝ$'ð  (Eð  (Eð  xDð  (Eñ  (Eô  (Eñ  %Eô  %Eð  HKñ  %K˜Eå!$ e¨e¡m°qÑ%8Ñ!9Ô!9˜BÝ!$ e¨e¡m°qÑ%8Ñ!9Ô!9½CÀÀRÁ¹L¼LÑ!H˜BØ#% r 6˜M˜M˜M˜M˜Mùñ=*ðBÝ3°CÀÈRÐPÑPÔP�Øð "ÝÐ4Ð4¨8Ð4Ñ4Ô4Ñ4Ô4½¸H¹¼ÑE�BÝÐ4Ð4¨8Ð4Ñ4Ô4Ñ4Ô4½¸H¹¼ÑE�BØ˜r˜6�Mð"øõ ð ð ð Ø�ðøøøð Ÿš ¨Ñ,Ô,ð 6ñ 6�Ø—x’x ¨Ñ+Ô+×1Ò1Ñ3Ô3�ÝÐLÐLÐLÐLÐ*KÐLÑLÔLÑLÔLñ 
6Ø"&§(¢(¨7°BÑ"7Ô"7ð 	6ñ 	6˜ÝÐnÐnÐnÐnÐLmÐnÑnÔnÑnÔnñ 6Ý!$ V¨OÔ%<¸SÔ%AÀFÈ?ÔD[Ð\cÔDdÐghÑDhÑ%hÑ!iÔ!i˜BÝ!$ V¨OÔ%<¸SÔ%AÀFÈ?ÔD[Ð\dÔDeÐhiÑDiÑ%iÑ!jÔ!j˜BÝ%(­¨r°C¸"±H©}Ñ)=Ô)=Ñ%>Ô%>˜FÝ%(­¨R°"©W©¬µs½5ÀÀcÈBÁhÁÑ;OÔ;OÑ7PÔ7PÑ%QÔ%Q˜FØ%¨š{˜{¨v¸ª{¨{Ý#& v°	Ñ'9Ñ#:Ô#:¸bÒ#@Ð#@ÅSÈÐR[ÑI[ÑE\ÔE\Ð`bÒEbÐEbØ+4°iÐ+?Ð$?Ð$?Ð$?Ð$?Ð$?Ø'-¨v ~Ð 5Ð 5Ð 5Ð 5Ð 5ùùð ˆIØŸš ¨Ñ,Ô,ð ð �Ø—x’x ¨Ñ+Ô+×1Ò1Ñ3Ô3�ÝÐUÐUÐUÐUÐ*TÐUÑUÔUÑUÔUð Ø"&§(¢(¨7°BÑ"7Ô"7ð ð ˜Ø!×(Ò(Ø" ?Ô3°CÔ8¸6À/Ô;RÐSZÔ;[Ð^_Ñ;_Ñ_Ø" ?Ô3°CÔ8¸6À/Ô;RÐS[Ô;\Ð_`Ñ;`Ñ`ð*ñ ô ð ð øð	øõ ð 	ð 	ð 	ØˆIˆIˆIð	øøøðð	?ð 	?ð 	?ð 	?õ
 �•3�y 3¨¡8Ñ+Ñ,Ô,Ñ-Ô-Ý�•3�y 3¨¡8Ñ+Ñ,Ô,Ñ-Ô-Ý�•3�y 3¨¡8Ñ+Ñ,Ô,Ñ-Ô-Ý�•3�y 3¨¡8Ñ+Ñ,Ô,Ñ-Ô-ð	
ˆõ ,ØØ'ØØ "™WØ "™WØð
ñ 
ô 
ˆð ð 	.ÝØØOÐOÐOÐOÐOðñ ô ˆIð ˜!”˜yÑ(¨QÑ.°)¸A´,ÀÑ2JÈqÑ1PÑPÐTWÐZ\ÑT\ÐabÑSbÒbÐbØ  )Ð+Ð+Ø˜Q”< ¨1¤Ð-Ð-ð	.øõ ð ð ð Øˆðøøøð(ð	Mð 	Mð 	Mð 	Mõ �•3�y 3¨¡8Ñ+Ñ,Ô,Ñ-Ô-Ý�•3�y 3¨¡8Ñ+Ñ,Ô,Ñ-Ô-Ý�•3�y 3¨¡8Ñ+Ñ,Ô,Ñ-Ô-Ý�•3�y 3¨¡8Ñ+Ñ,Ô,Ñ-Ô-ð	
ˆ	õ 'ØØ$ØØ "™WØ "™WØð
ñ 
ô 
ˆð  ! A™v¥s¨1¨t©8¡}¤}Ðˆ	�9Ø "™H¨™?ÐÝ!$ S¨A°©JÑ%7Ñ!8Ô!8½#¸cÀQÈÁYÑ>OÑ:PÔ:PÐˆ
�JØ  2™g¨!™^Ðàð 	Hðð ð ð ð ð ð ð ð ð ð Ø#ðñ ô ˆLð ð Hð ð  ð  ð  ð  ð  Ø+ð ñ  ô  �ð  ð 0Ø$ iÐ/Ð/Ø)¨!œ_�
Ý˜: aœ=Ñ)Ô)­3¨z¸!¬}¸rÀB¹wÑ/FÑ+GÔ+GÐGÐGøøÝð ð ð Øˆðøøøð �iÐÐs~   ÌJ$b Ö3b Ö8A)X# Ø"b Ø#
X0Ø-b Ø/X0Ø0Fb ßb ß	Cb âb'â&b'â+C*f' æf' æ'
f4æ3f4æ8D*l ë#7l ì
l)ì(l)Úmap_device_posc                óB	  ‡‡‡‡‡‡‡— | �t          | ¦  «        nd}|€¹|�|ndŠ|�|ndŠ|�Jt          t          |d         ‰z  ¦  «        ¦  «        t          t          |d         ‰z  ¦  «        ¦  «        fS |�|\  }}nt          d‰‰¬¦  «        \  }}t          t          |d‰z  z
  ¦  «        ¦  «        t          t          |d‰z  z
  ¦  «        ¦  «        fS |j        \  ŠŠt          ‰‰¦  «        }t          t          |¬¦  «        }	|�|�|Š|Šn|	j        Š|	j	        Š|�|\  ŠŠnt          |‰‰¬¦  «        \  ŠŠ|�Kt          t          |d         ‰z  ¦  «        ¦  «        }
t          t          |d         ‰z  ¦  «        ¦  «        }nDt          t          ‰d‰z  z
  ¦  «        ¦  «        }
t          t          ‰d‰z  z
  ¦  «        ¦  «        }	 t          |‰‰¬¦  «        }|r%t          |ˆˆfd	„¬
¦  «        }|d         |d         fS n# t          $ r Y nw xY w	 d"d„}t          dt          ‰d‰z  z
  ¦  «        ¦  «        t          t          ‰dz  ¦  «        t          ‰d‰z  z
  ¦  «        ¦  «        t          t          ‰dz  ¦  «        t          ‰d‰z  z   ¦  «        ¦  «        t          t          ‰dz  ¦  «        t          ‰d‰z  z   ¦  «        ¦  «        f}t          |||t          dt          d‰z  ¦  «        ¦  «        d‰z  d‰z  t          dt          d‰z  ‰z  ¦  «        ¦  «        ¬¦  «        }|s¡t          ‰dz  ¦  «        t          ‰dz  ¦  «        t          ‰dz  ¦  «        t          ‰dz  ¦  «        f}t          |||t          dt          d‰z  ¦  «        ¦  «        d‰z  d‰z  t          dt          d‰z  ‰z  ¦  «        ¦  «        ¬¦  «        }|r·ˆˆfd„|D ¦   «         }|r¦‰dk    r~‰dk    rxddlŠˆˆˆˆˆfd„|D ¦   «         }|r"t          |d „ ¬
¦  «        }|d         |d         fS t          t          ‰¦  «        ¦  «        t          t          ‰d‰z  z   ¦  «        ¦  «        fS t          |d!„ ¬
¦  «        }|d         |d         fS n# t          $ r Y nw xY w|
|fS )#u#  XÃ¡c Ä‘á»‹nh vá»‹ trÃ­ Portal map (vortex xoÃ¡y hoáº·c nhÃ£n map portal) trong Hideout.

    Thá»© tá»± Æ°u tiÃªn:
    1. Nháº­n diá»‡n nhÃ£n Portal ná»•i báº±ng OCR (`find_portal_label_by_ocr`), chá»�n portal há»£p lá»‡ gáº§n bá»‡ Ä‘Ã¡ Map Device nháº¥t.
    2. QuÃ©t cá»¥m mÃ u vortex xoÃ¡y Portal (xanh lam, cyan, ngá»�c bÃ­ch hoáº·c ngá»�n lá»­a) quanh bá»‡ Ä‘Ã¡ Map Device.
    3. Tá»�a Ä‘á»™ fallback tÆ°Æ¡ng Ä‘á»‘i quanh bá»‡ Ä‘Ã¡ Map Device tháº­t: (altar_x - 30*sx, altar_y - 40*sy)
       thay vÃ¬ tá»�a Ä‘á»™ ma thuáº­t (220, 187).
    Nr  r   rB   rc  r»   rQ  rH  c                ó>   •— | d         ‰z
  dz  | d         ‰z
  dz  z   S rs  rJ   )r<  Úaltar_xÚaltar_ys    €€r.   rC  z(find_portal_screen_pos.<locals>.<lambda>  s(   ø€ °!°A´$¸±.ÀQÑ1FÈ!ÈAÌ$ÐQXÉ.Ð]^ÑI^Ñ1^€ r@   rv  r¤   r…   r¥   r¦   r   r2   c                ó¨   — |dk    r|| dz   k    r||k    s|dk    rdS | dk    r|dk    r|dk    rdS | dk    r|d	k    r| |d
z   k    r| |dz   k    rdS dS )Nrp  r·   rP  TéÒ   éá   éð   rx  r›   rQ  rš   FrJ   rn  s      r.   Úis_vortex_pixelz/find_portal_screen_pos.<locals>.is_vortex_pixel  s}   € à�C’�˜A  B¡šJ˜J¨A°ªE¨E°Q¸#²X°XØ�tà�S’�˜Q #šX˜X¨!¨sª(¨(Ø�tà�S’�˜Q "šW˜W¨¨Q°©Vª¨¸¸AÀ¹Fº
¸
Ø�tØ�5r@   ih  r  rD  r•   r¾   r4   rC   rš   é#   )r.  r0  r1  r2  r3  r4  r  r—   c                óæ   •— g | ]m}|d          d‰z  k     r|d         d‰z  k    sM|d          d‰z  k    r|d         d‰z  k    s/|d          d‰z  k    r|d         d‰z  k     s|d         d‰z  k    ¯k|‘ŒnS )r   g{®GázÄ?rB   gÍÌÌÌÌÌÜ?r”   g=
×£p=ê?rÅ   r  rJ   )r:   r8  r+   r*   s     €€r.   r?   z*find_portal_screen_pos.<locals>.<listcomp>I  s›   ø€ ð ð ð ØØ˜!œ˜t a™xš˜¨A¨a¬D°4¸!±8ªO¨OØ˜1œ  q¡š˜¨Q¨q¬T°D¸1±Hª_¨_Ø˜1œ  q¡š˜¨Q¨q¬T°D¸1±Hª_¨_Ø�a”D˜D 1™HÒ$Ð$ð	 ð %Ð$Ð$r@   c                ó„   •— g | ]<} ‰j         |d          ‰z
  |d         ‰z
  ¦  «        dt          ‰‰¦  «        z  k    ¯:|‘Œ=S )r   rB   i  )ÚhypotrR   )r:   r8  r¤  r¥  Úmathr¢   r£   s     €€€€€r.   r?   z*find_portal_screen_pos.<locals>.<listcomp>S  s[   ø€ ð "ð "ð "ØØ%˜4œ: a¨¤d¨W¡n°a¸´d¸W±nÑEÔEÈÍsÐSUÐWYÉ{Ì{ÑIZÒZÐZð ØZÐZÐZr@   c                ó   — | d         S rA  rJ   ©r8  s    r.   rC  z(find_portal_screen_pos.<locals>.<lambda>X  s
   € ¸Q¸q¼T€ r@   c                ó   — | d         S rA  rJ   r±  s    r.   rC  z(find_portal_screen_pos.<locals>.<lambda>\  s
   € ¸¸1¼€ r@   r‡  )rO   r…   rˆ  r   r   r   r   r   r  r  r  rö   r'   rR   rQ  r¯  )r0   r  r  rE  r¡  rH   Úmd_xÚmd_yr,   rŠ  rt  ru  r9  Úchosenrª  Ú	roi_altarrM  Úroi_generalÚvalid_clustersÚ
near_altarÚbestr¤  r¥  r+   r¯  r¢   r£   r*   s                        @@@@@@@r.   Úfind_portal_screen_posr»  Ø  st  øøøøøøø€ ð %.Ð$9�+�iÑ
 Ô
 Ð
 ¸t€CØ
€{ØÐ+ˆWˆW°ˆØÐ+ˆWˆW°ˆØÐ#Ý•u˜\¨!œ_¨rÑ1Ñ2Ô2Ñ3Ô3µS½¸|ÈA¼ÐQSÑ?SÑ9TÔ9TÑ5UÔ5UÐUÐUØÐ%Ø'‰JˆD�$�$å3°DÀ"ÈbÐQÑQÔQ‰JˆD�$Ý•5˜  R¡™Ñ(Ô(Ñ)Ô)­3­u°T¸BÀ¹G±^Ñ/DÔ/DÑ+EÔ+EÐEÐEàŒ8�D€A€qÝ
�Q˜Ñ
Ô
€CÝ­¸sÐCÑCÔC€FàÐ˜wÐ2ØˆØˆˆàŒ^ˆØŒ^ˆð Ð!Ø)Ñˆ��å5°cÀ2ÈrÐRÑRÔRÑˆ�ð ÐÝ�˜l¨1œo°Ñ2Ñ3Ô3Ñ4Ô4ˆ	Ý�˜l¨1œo°Ñ2Ñ3Ô3Ñ4Ô4ˆ	ˆ	å�˜g¨¨R©Ñ/Ñ0Ô0Ñ1Ô1ˆ	Ý�˜g¨¨R©Ñ/Ñ0Ô0Ñ1Ô1ˆ	ðÝ+¨C¸ÀRÐHÑHÔHˆØð 	(Ý˜Ð'^Ð'^Ð'^Ð'^Ð'^Ð_Ñ_Ô_ˆFØ˜!”9˜f QœiÐ'Ð'ð	(øõ ð ð ð ØˆðøøøðIð
	ð 
	ð 
	ð 
	õ �•3�w  r¡Ñ)Ñ*Ô*Ñ+Ô+Ý•�A˜‘H‘”�s 7¨S°2©XÑ#5Ñ6Ô6Ñ7Ô7Ý•�A˜‘H‘”�s 7¨S°2©XÑ#5Ñ6Ô6Ñ7Ô7Ý•�A˜‘H‘”�s 7¨S°2©XÑ#5Ñ6Ô6Ñ7Ô7ð	
ˆ	õ 'ØØ+ØÝ�Q�˜A ™F™œÑ$Ô$Ø "™WØ "™WÝ  ¥S¨¨b©°2©Ñ%6Ô%6Ñ7Ô7ð
ñ 
ô 
ˆð ð 	å�A˜‘H‘”Ý�A˜‘H‘”Ý�A˜‘H‘”Ý�A˜‘H‘”ð	ˆKõ +ØØ /ØÝ˜�C  B¡™KœKÑ(Ô(Ø!# b¡Ø!# b¡Ý!$ R­¨R°"©W°r©\Ñ):Ô):Ñ!;Ô!;ðñ ô ˆHð ð 	(ðð ð ð ð Ø#ðñ ô ˆNð ð (Ø˜Q’;�; 7¨Q¢; ;Ø�K�K�Kð"ð "ð "ð "ð "ð "ð "ð "Ø#1ð"ñ "ô "�Jð "ð 0Ý" :°>°>ÐBÑBÔB˜Ø# Aœw¨¨Q¬Ð/Ð/å�u W™~œ~Ñ.Ô.µµE¸'ÀBÈÁGÑ:KÑ4LÔ4LÑ0MÔ0MÐMÐMÝ˜>¨~¨~Ð>Ñ>Ô>�Ø˜A”w  Q¤Ð'Ð'øøÝð ð ð Øˆðøøøð �iÐÐs1   Ç8H È
HÈHÈHR Ð,=R Ñ*!R Ò
RÒR©i  i*  Úinventory_openr   úOptional[int]c                ó¼  ‡‡‡‡‡‡— t          |d         |z  ¦  «        }t          |d         |z  ¦  «        }t          | ¦  «        }	|	€|rdn||fS |	j        \  }
}|
dz  |dz  cŠŠdŠ|�|Šn|r|
dk    rdnt          |
dz  ¦  «        Šd d„}t          d‰z  ¦  «        t          d‰z  ¦  «        t          d‰z  ¦  «        t          d‰z  ¦  «        f}t          |	||t	          dd‰z  ¦  «        t	          dd‰z  ¦  «        d¬¦  «        }|rËd‰z  d‰z  cŠŠd‰z  Šˆˆˆˆˆˆfd„|D ¦   «         }|rI|                     d„ ¬¦  «         |d         }t          |d         ¦  «        t          |d         ¦  «        fS ˆˆˆˆˆfd„|D ¦   «         }|rI|                     d„ ¬¦  «         |d         }t          |d         ¦  «        t          |d         ¦  «        fS |rdn||fS )!uƒ  TÃ¬m kiáº¿m tá»�a Ä‘á»™ cá»§a Node kháº£ dá»¥ng (mÃ u xanh lÃ¡ cÃ¢y / reachable green node) trÃªn Atlas.
    
    Quy táº¯c an toÃ n (INV-ATLAS-FARM-NODE):
    - Giá»›i háº¡n ROI chuáº©n: y in [200..1280], x in [250..2200]
    - Khi Inventory má»Ÿ: Giá»›i háº¡n ná»­a bÃªn trÃ¡i mÃ n hÃ¬nh (x < 650 trÃªn 1197x897 hoáº·c x < w * 0.55).
    - Loáº¡i bá»� khu vá»±c Ä‘á»�n thá»� trung tÃ¢m (The Well of Souls).
    - Lá»�c bá»� cÃ¡c cá»¥m Ä‘iá»ƒm áº£nh quÃ¡ to (size > 140 lÃ  cÃ¡c cáº¥u trÃºc Gateway/Pinnacle arena).
    - Æ¯u tiÃªn cÃ¡c cá»¥m Regular Map cÃ³ kÃ­ch thÆ°á»›c chuáº©n trong khu vá»±c báº£n Ä‘á»“ cÃ y chÃ­nh (y lá»›n hÆ¡n).
    r   rB   Nr  r  é   éŠ  rÃ   r¤   r…   r¥   r¦   r   r2   c                ób   — |dk    r|| dz   k    r	||dz   k    p|dk    o|| dz  k    o||dz  k    S ©Nrº   r»   rP  gÍÌÌÌÌÌô?rJ   rn  s      r.   Úis_green_nodez0find_reachable_green_node.<locals>.is_green_node‡  óN   € Ø�C’Ð5˜A  B¡šJÐ5¨1¨q°2©vª:Ðe¸1¸sº7Ð;dÀqÈ1ÈtÉ8Â|Ð;dÐXYÐ\]Ð`dÑ\dÒXdÐer@   éú   éÈ   é˜  éˆ  ç      2@r«  rš   rq  ç     ˆ“@ç      ~@ç      ^@c                óô   •— g | ]t}t          j        |d          ‰z
  |d         ‰z
  ¦  «        ‰k    rG|d          d‰z  k    r8d‰z  |d         cxk    r	d‰z  k    rn n|d         dk    r‰�|d          ‰k     ¯r|‘ŒuS ©r   rB   g     Àw@ç     Àr@ç     À’@r4   rP  ©r¯  r®  ©r:   r8  Úcenter_xÚcenter_yÚlimit_xÚmin_distance_from_centerr¢   r£   s     €€€€€€r.   r?   z-find_reachable_green_node.<locals>.<listcomp>š  sª   ø€ ð 
ð 
ð 
ØÝŒz˜!˜Aœ$ ™/¨1¨Q¬4°(©?Ñ;Ô;Ð?WÒWÐWØ�!”˜ ™
Ò"Ð"Ø˜‘
˜a œdÐ1Ð1Ò1Ð1 f¨r¡kÒ1Ð1Ð1Ð1Ð1Ø�!”˜’�Ø� A a¤D¨7¢N Nð ð
 %3 N Nr@   c                ó   — | d          S rA  rJ   r±  s    r.   rC  z+find_reachable_green_node.<locals>.<lambda>¥  s   € ¨A¨a¬D¨5€ r@   rv  c                óÖ   •— g | ]e}t          j        |d          ‰z
  |d         ‰z
  ¦  «        ‰k    r8d‰z  |d         cxk    r	d‰z  k    rn n|d         dk    r‰�|d          ‰k     ¯c|‘ŒfS )r   rB   rÐ  rÑ  r4   rP  rÒ  )r:   r8  rÔ  rÕ  rÖ  r×  r£   s     €€€€€r.   r?   z-find_reachable_green_node.<locals>.<listcomp>ª  s—   ø€ ð 
ð 
ð 
ØÝŒz˜!˜Aœ$ ™/¨1¨Q¬4°(©?Ñ;Ô;Ð?WÒWÐWØ˜‘
˜a œdÐ1Ð1Ò1Ð1 f¨r¡kÒ1Ð1Ð1Ð1Ð1Ø�!”˜’�Ø� A a¤D¨7¢N Nð	 ð %3 N Nr@   c                ó   — | d          S rA  rJ   r±  s    r.   rC  z+find_reachable_green_node.<locals>.<lambda>²  s   € °A°a´D°5€ r@   r‡  )r…   rO   r   rQ  rR   rG  )r0   r  r  rE  r	  r½  r   rt  ru  rH   r*   r+   rÄ  Ú	atlas_roirM  Úvalid_nodesrº  Úfallback_candidatesrÔ  rÕ  rÖ  r×  r¢   r£   s                     @@@@@@r.   Úfind_reachable_green_noderÞ  d  s”  øøøøøø€ õ$ �L ”O gÑ-Ñ.Ô.€IÝ�L ”O gÑ-Ñ.Ô.€Iå
�iÑ
 Ô
 €CØ
€{Ø-ÐIˆtˆt°I¸yÐ3IÐIàŒ8�D€A€qØ�‰Z˜˜V™€F€Bˆð €GØÐØˆˆØ	ð 6Ø˜dš˜�#�#­¨A°©H©¬ˆðfð fð fð fõ �S˜2‘X‘”¥ C¨"¡H¡¤­s°4¸"±9©~¬~½sÀ4È"Á9¹~¼~ÐN€IÝ"ØØ%ØÝ˜T 2¨¡7Ñ+Ô+Ý˜T 2¨¡7Ñ+Ô+Øðñ ô €Hð ð .Ø# b™[¨%°"©*Ðˆ�(Ø#(¨2¡:Ð ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
Øð
ñ 
ô 
ˆð ð 	.à×Ò  ÐÑ1Ô1Ð1Ø˜q”>ˆDÝ�t˜A”w‘<”<¥ T¨!¤W¡¤Ð-Ð-ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
Øð
ñ 
ô 
Ðð ð 	.Ø×$Ò$¨¨Ð$Ñ9Ô9Ð9Ø& qÔ)ˆDÝ�t˜A”w‘<”<¥ T¨!¤W¡¤Ð-Ð-à)ÐEˆ4ˆ4°	¸9Ð/EÐEr@   úList[Tuple[int, int]]c                ó:  ‡‡‡‡‡‡— t          | ¦  «        }|€g S |j        \  }}|dz  |dz  cŠŠdŠ|�|Šn|r|dk    rdnt          |dz  ¦  «        Šdd„}t          d‰z  ¦  «        t          d‰z  ¦  «        t          d‰z  ¦  «        t          d‰z  ¦  «        f}	t          |||	t	          dd‰z  ¦  «        t	          dd‰z  ¦  «        d¬¦  «        }
|
sg S d‰z  d‰z  cŠŠd‰z  Šˆˆˆˆˆˆfd„|
D ¦   «         }|                     d„ ¬¦  «         d„ |D ¦   «         S )uy   TÃ¬m danh sÃ¡ch táº¥t cáº£ cÃ¡c Node kháº£ dá»¥ng (mÃ u xanh lÃ¡ cÃ¢y) há»£p lá»‡ trÃªn Atlas xáº¿p theo Ä‘á»™ Æ°u tiÃªn.Nr  r  rÀ  rÁ  rÃ   r¤   r…   r¥   r¦   r   r2   c                ób   — |dk    r|| dz   k    r	||dz   k    p|dk    o|| dz  k    o||dz  k    S rÃ  rJ   rn  s      r.   rÄ  z5find_all_reachable_green_nodes.<locals>.is_green_nodeÎ  rÅ  r@   rÆ  rÇ  rÈ  rÉ  rÊ  r«  rš   rq  rË  rÌ  rÍ  c                óô   •— g | ]t}t          j        |d          ‰z
  |d         ‰z
  ¦  «        ‰k    rG|d          d‰z  k    r8d‰z  |d         cxk    r	d‰z  k    rn n|d         dk    r‰�|d          ‰k     ¯r|‘ŒuS rÏ  rÒ  rÓ  s     €€€€€€r.   r?   z2find_all_reachable_green_nodes.<locals>.<listcomp>á  sª   ø€ ð ð ð ØÝŒ:�a˜”d˜X‘o q¨¤t¨h¡Ñ7Ô7Ð;SÒSÐSØˆaŒD�E˜B‘JÒÐØ�B‰J˜!˜Aœ$Ð-Ð-Ò-Ð- &¨2¡+Ò-Ð-Ð-Ð-Ð-ØˆaŒD�CŠKˆKØˆ_  !¤ w¢ ð 	
ð
 !/  r@   c                ó   — | d          S rA  rJ   r±  s    r.   rC  z0find_all_reachable_green_nodes.<locals>.<lambda>é  s   €  A a¤D 5€ r@   rv  c                ób   — g | ],}t          |d          ¦  «        t          |d         ¦  «        f‘Œ-S )r   rB   )r…   ©r:   r8  s     r.   r?   z2find_all_reachable_green_nodes.<locals>.<listcomp>ê  s1   € Ð8Ð8Ð8 q�S��1”‰YŒY�˜A˜aœD™	œ	Ð"Ð8Ð8Ð8r@   r‡  ©rO   r   r…   rQ  rR   rG  )r0   r  r  r½  r   rH   r*   r+   rÄ  rÛ  rM  rÜ  rÔ  rÕ  rÖ  r×  r¢   r£   s               @@@@@@r.   Úfind_all_reachable_green_nodesrç  ¹  s£  øøøøøø€ õ �iÑ
 Ô
 €CØ
€{Øˆ	àŒ8�D€A€qØ�‰Z˜˜V™€F€Bˆà€GØÐØˆˆØ	ð 6Ø˜dš˜�#�#­¨A°©H©¬ˆðfð fð fð fõ �S˜2‘X‘”¥ C¨"¡H¡¤­s°4¸"±9©~¬~½sÀ4È"Á9¹~¼~ÐN€IÝ"ØØ%ØÝ˜T 2¨¡7Ñ+Ô+Ý˜T 2¨¡7Ñ+Ô+Øðñ ô €Hð ð Øˆ	à "™ e¨b¡jÐ€HˆhØ$ r™zÐðð ð ð ð ð ð ð ð Øðñ ô €Kð ×Ò˜˜ÐÑ)Ô)Ð)Ø8Ð8¨KÐ8Ñ8Ô8Ð8r@   c                ó6  ‡‡‡— t          | ¦  «        }|€dS |j        \  }}|dz  |dz  }}dd
„}	t          d|z  ¦  «        t          d|z  ¦  «        t          d|z  ¦  «        t          d|z  ¦  «        f}
t          ||	|
t	          dd|z  ¦  «        t	          dd|z  ¦  «        d¬¦  «        }|rkd|z  d|z  cŠŠd|z  Šˆˆˆfd„|D ¦   «         }|rI|                     d„ ¬¦  «         |d         }t          |d         ¦  «        t          |d         ¦  «        fS dS )uþ  TÃ¬m kiáº¿m tá»�a Ä‘á»™ cá»§a Node sÃ¡ng / Node Ä‘Ã£ má»Ÿ (Active / Glowing Node) trÃªn Atlas.
    
    Quy chuáº©n nháº­n diá»‡n (Doc 56 / User Request):
    - Node Ä‘Ã£ má»Ÿ hoáº·c Ä‘ang sÃ¡ng cÃ³ hÃ o quang mÃ u vÃ ng kim / há»• phÃ¡ch (amber/gold) Ä‘áº·c trÆ°ng,
      hoáº·c xoÃ¡y xanh vortex cá»§a Portal instance Ä‘Ã£ má»Ÿ sáºµn.
    - Lá»�c bá»� vÃ¹ng Ä‘á»�n thá»� trung tÃ¢m (The Well of Souls).
    - Tráº£ vá»� tá»�a Ä‘á»™ (x, y) cá»§a cá»¥m sÃ¡ng rÃµ nÃ©t nháº¥t, hoáº·c None náº¿u khÃ´ng cÃ³.
    Nr  r  r¤   r…   r¥   r¦   r   r2   c                ó”   — | dk    r|dk    r|dk     p| dk    o|dk    o|dk    o| |dz   k    }|dk    o|| dz   k    o||d	z   k    }|p|S )
NrÇ  é¥   rP  r§  rx  rÂ   é¹   r«  rš   rJ   )r¤   r¥   r¦   Úis_goldÚis_blue_vortexs        r.   Úis_glowing_nodez7find_active_glowing_atlas_node.<locals>.is_glowing_node  s{   € à�s’7Ð2˜q 3šwÐ2¨1¨sª7Ðg¸¸CºÐ8fÀAÈÂGÐ8fÐPQÐTWÒPWÐ8fÐ\]Ð`aÐdfÑ`fÒ\fˆà˜cš'Ð? a¨!¨b©&¢jÐ?°Q¸¸R¹²ZˆØÐ(˜.Ð(r@   rÆ  r¹   iÊ  rÉ  r™   rQ  r8   rq  rË  rÌ  rÍ  c                ó‚   •— g | ];}t          j        |d          ‰z
  |d         ‰z
  ¦  «        ‰k    r|d         dk    ¯9|‘Œ<S )r   rB   r4   rp  rÒ  )r:   r8  rÔ  rÕ  r×  s     €€€r.   r?   z2find_active_glowing_atlas_node.<locals>.<listcomp>  sV   ø€ ð 
ð 
ð 
ØÝŒz˜!˜Aœ$ ™/¨1¨Q¬4°(©?Ñ;Ô;Ð?WÒWÐWØ�!”˜’�ð à��r@   c                ó&   — | d          | d          fS )Nr4   rB   rJ   r±  s    r.   rC  z0find_active_glowing_atlas_node.<locals>.<lambda>  s   € ¨A¨a¬D¨5°1°Q´4°%¨.€ r@   rv  r   rB   r‡  ræ  )r0   r  r  r	  rH   r*   r+   r¢   r£   rî  rÛ  rM  r  rº  rÔ  rÕ  r×  s                 @@@r.   Úfind_active_glowing_atlas_noderñ  í  sq  øøø€ õ �iÑ
 Ô
 €CØ
€{ØˆtàŒ8�D€A€qØ�‰Z˜˜V™ˆ€Bð)ð )ð )ð )õ �S˜2‘X‘”¥ C¨"¡H¡¤­s°4¸"±9©~¬~½sÀ4È"Á9¹~¼~ÐN€IÝ"ØØ'ØÝ˜T 2¨¡7Ñ+Ô+Ý˜T 2¨¡7Ñ+Ô+Øðñ ô €Hð ð .Ø# b™[¨%°"©*Ðˆ�(Ø#(¨2¡:Ð ð
ð 
ð 
ð 
ð 
ð 
Øð
ñ 
ô 
ˆ
ð
 ð 	.Ø�OŠOÐ 8Ð 8ˆOÑ9Ô9Ð9Ø˜a”=ˆDÝ�t˜A”w‘<”<¥ T¨!¤W¡¤Ð-Ð-àˆ4r@   c                óÄ	  — t          | ¦  «        }|€B|s>t          t          d|z  ¦  «        ¦  «        t          t          d|z  ¦  «        ¦  «        fS dS |j        \  }}|dz  |dz  }}t          j                             t          j                             t          j                             t          ¦  «        ddd¦  «        ¦  «        }	g d¢}
	 d	dl
}|                     |                     d
¦  «        |j        ¬¦  «        }t          |dz  ¦  «        t          |dz  ¦  «        }}t          |dz  ¦  «        t          |dz  ¦  «        }}|
D �]d}t          j                             |	|¦  «        }t          j                             |¦  «        sŒCt          j        |¦  «                             d
¦  «        }t#          dt          t          |j        |z  ¦  «        ¦  «        ¦  «        }t#          dt          t          |j        |z  ¦  «        ¦  «        ¦  «        }|                     |                     ||ft          j        j        ¦  «        |j        ¬¦  «        }||                     ¦   «         z
  }|j                             |¦  «        }|dk     r�ŒHt5          ||j        d         |z
  ¦  «        }t5          ||j        d	         |z
  ¦  «        }d}d}t9          ||d¦  «        D ]¾}t9          ||d¦  «        D ]ª}||||z   …|||z   …f         }||                     ¦   «         z
  } |j                             | ¦  «        }!|!dk    r]t;          |                     | |z  ¦  «        |!|z  z  ¦  «        }"|"|k    r,|"}t          ||dz  z   ¦  «        t          ||dz  z   ¦  «        f}Œ«Œ¿|dk    r|r|c S �Œfn# t>          $ r Y nw xY wd$d„}#t          |dz  ¦  «        t          |dz  ¦  «        t          |dz  ¦  «        t          |dz  ¦  «        f}$tA          ||#|$t#          dd|z  ¦  «        t#          dd|z  ¦  «        d¬ ¦  «        }%|%r[d!„ |%D ¦   «         }&|&rM|& !                    d"„ ¬#¦  «         t          |&d	         d	         ¦  «        t          |&d	         d         ¦  «        fS |s>t          t          d|z  ¦  «        ¦  «        t          t          d|z  ¦  «        ¦  «        fS dS )%u·  Nháº­n diá»‡n biá»ƒu tÆ°á»£ng Player Avatar hÃ¬nh trÃ²n vÃ ng trÃªn cÃ¢y Atlas (Doc 48 / Live Test Fix).

    CÆ¡ cháº¿ Endgame Atlas POE2:
    Khi click vÃ o chÃ­nh Node mÃ  nhÃ¢n váº­t Ä‘ang Ä‘á»©ng (Player Avatar táº¡i Ä‘á»‰nh Great Wall / Current Node),
    nÃºt TRAVERSE xuáº¥t hiá»‡n ngay láº­p tá»©c ('The Burning Monolith').
    HÃ m nÃ y Æ°u tiÃªn Ä‘á»‹nh vá»‹ node hiá»‡n táº¡i trÆ°á»›c khi quÃ©t cÃ¡c green node á»Ÿ xa.

    Thuáº­t toÃ¡n Dual-Pass:
    Pass 1: So khá»›p máº«u NCC Template Matching vá»›i cÃ¡c template pin/avatar thá»±c táº¿ tá»« captures/.
    Pass 2: QuÃ©t phÃ¢n cá»¥m mÃ u vÃ ng kim / há»• phÃ¡ch (Golden Pin Ring) trong vÃ¹ng Atlas trung tÃ¢m.
    Pass 3: Fallback tá»�a Ä‘á»™ Ä‘á»‰nh Great Wall Ä‘Ã£ hiá»‡u chuáº©n (1280 * sx, 560 * sy) náº¿u return_none_if_missing=False.

    @param img_input: Ä�Æ°á»�ng dáº«n tá»‡p áº£nh hoáº·c Ä‘á»‘i tÆ°á»£ng PIL Image.
    @param scale_x: Tá»· lá»‡ co dÃ£n trá»¥c X (tÃ¹y chá»�n).
    @param scale_y: Tá»· lá»‡ co dÃ£n trá»¥c Y (tÃ¹y chá»�n).
    @param return_none_if_missing: True náº¿u tráº£ vá»� None khi khÃ´ng phÃ¡t hiá»‡n, False náº¿u fallback tá»�a Ä‘á»™ chuáº©n.
    @return: (cx, cy) pixel trÃªn mÃ n hÃ¬nh hoáº·c None.
    Ng      ”@g     €�@r  r  z..Úcaptures)zpin_1280_560.pngzplayer_icon_crop.pngztest_player_icon_crop.pngr   ÚL)Údtypeg333333Ó?gš™™™™™É?r¾   gš™™™™™é?r[   gñhãˆµøä>rB   g      ð¿rŸ  r4   r¤   r…   r¥   r¦   r   r2   c                óJ   — | dk    o|dk    o|dk     o| |dz   k    o||dz   k    S )Nrê  r  rµ   r«  rš   rJ   rn  s      r.   Úis_avatar_goldz3find_player_avatar_on_atlas.<locals>.is_avatar_goldr  s8   € Ø�C’ÐM˜A šGÐM¨¨CªÐM°A¸¸B¹²JÐMÀ1ÀqÈ2ÁvÂ:ÐNr@   rÊ  r-  rš   rq  c                ó>   — g | ]}d |d         cxk    rdk    ¯n n|‘ŒS )rš   r4   iô  rJ   rå  s     r.   r?   z/find_player_avatar_on_atlas.<locals>.<listcomp>€  s=   € Ð:Ð:Ð:�q¨¨a°¬dÐ(9Ð(9Ò(9Ð(9°cÒ(9Ð(9Ð(9Ð(9Ð(9�Ð(9Ð(9Ð(9r@   c                ó   — | d          S rA  rJ   r±  s    r.   rC  z-find_player_avatar_on_atlas.<locals>.<lambda>‚  s   €  a¨¤d U€ r@   rv  r‡  )"rO   r…   rˆ  r   r]   r^   Úabspathr†   ÚdirnameÚ__file__ÚnumpyÚarrayrc   Úfloat32r_   r   rb   rR   r   r   ÚresizeÚ
ResamplingÚBICUBICÚmeanÚlinalgÚnormrö   Úshaper9   rP   rE   r'   rQ  rG  )'r0   r  r  r	  rH   r*   r+   r¢   r£   Úcaptures_dirÚtemplate_candidatesÚnpÚf_grayrX  rY  r’  r“  Útpl_nameÚtpl_pathÚtpl_imgÚtwÚthÚ
tpl_scaledÚt_meanÚt_normrÖ  Úlimit_yÚ
best_scoreÚbest_locrÒ   rÓ   ÚpatchÚp_meanÚp_normr8  r÷  rÛ  rM  rO  s'                                          r.   Úfind_player_avatar_on_atlasr  $  sØ  € õ0 �iÑ
 Ô
 €CØ
€{Ø%ð 	MÝ•u˜V gÑ-Ñ.Ô.Ñ/Ô/µµU¸5À7¹?Ñ5KÔ5KÑ1LÔ1LÐLÐLØˆtàŒ8�D€A€qØ�‰Z˜˜V™ˆ€Bõ ”7—?’?¥2¤7§<¢<µ´·²ÅÑ0IÔ0IÈ4ÐQUÐWaÑ#bÔ#bÑcÔc€LØcÐcÐcÐð&ØÐÐÐØ—’˜#Ÿ+š+ cÑ*Ô*°"´*�Ñ=Ô=ˆÝ�q˜4‘x‘=”=¥# a¨$¡h¡-¤-ˆSˆÝ�q˜4‘x‘=”=¥# a¨$¡h¡-¤-ˆSˆà+ð 	 ñ 	 ˆHÝ”w—|’| L°(Ñ;Ô;ˆHÝ”7—>’> (Ñ+Ô+ð ØÝ”j Ñ*Ô*×2Ò2°3Ñ7Ô7ˆGÝ�R��U 7¤=°2Ñ#5Ñ6Ô6Ñ7Ô7Ñ8Ô8ˆBÝ�R��U 7¤>°BÑ#6Ñ7Ô7Ñ8Ô8Ñ9Ô9ˆBØŸš '§.¢.°"°b°½5Ô;KÔ;SÑ"TÔ"TÐ\^Ô\f˜ÑgÔgˆJØ *§/¢/Ñ"3Ô"3Ñ3ˆFØ”Y—^’^ FÑ+Ô+ˆFØ˜Š}ˆ}Ùå˜#˜vœ|¨Aœ°Ñ3Ñ4Ô4ˆGÝ˜#˜vœ|¨Aœ°Ñ3Ñ4Ô4ˆGØˆJØˆHå˜3 ¨Ñ+Ô+ð 	Lð 	L�Ý˜s G¨QÑ/Ô/ð Lð L�AØ" 1 Q¨¡V 8¨Q¨q°2©v¨XÐ#5Ô6�EØ" U§Z¢Z¡\¤\Ñ1�FØœYŸ^š^¨FÑ3Ô3�FØ ’}�}Ý! "§&¢&¨°&©Ñ"9Ô"9¸VÀf¹_Ñ"MÑNÔN˜Ø˜zš>˜>Ø)*˜JÝ(+¨A°°a±©KÑ(8Ô(8½#¸aÀ"ÈÁ'¹kÑ:JÔ:JÐ'K˜HøðLð ˜TÒ!Ð! hÐ!Ø���ùð=	 øõ> ð ð ð ØˆðøøøðOð Oð Oð Oõ �Q˜‘X‘”¥ A¨¡H¡¤­s°1°t±8©}¬}½cÀ!ÀdÁ(¹m¼mÐL€IÝ"ØØ&ØÝ˜T 4¨"¡9Ñ-Ô-Ý˜T 4¨"¡9Ñ-Ô-Øðñ ô €Hð ð 6Ø:Ð:˜HÐ:Ñ:Ô:ˆØð 	6Ø�JŠJ˜?˜?ˆJÑ+Ô+Ð+Ý�u˜Q”x ”{Ñ#Ô#¥S¨¨q¬°!¬Ñ%5Ô%5Ð5Ð5ð "ð ?Ý•5˜ "™Ñ%Ô%Ñ&Ô&­­E°%¸"±*Ñ,=Ô,=Ñ(>Ô(>Ð>Ð>àˆ4s   ÃK N2 Î/N2 Î2
N?Î>N?)r   )r   r   r   r   r   r   )r0   r1   r   r2   )r0   r1   r   rX   rt   )r0   r1   rÝ   r   rÞ   rß   r   rà   )NNNT)
r0   r  r  r  r  r  r	  r2   r   rà   )NNN)r0   r  r  r  r  r  r   r  )Nr4   r-  r-  rš   )r0   r1   r.  r/  r0  rß   r1  r…   r2  rP   r3  rP   r4  r…   r   r5  )r  r  F)
r0   r1   r  rP   r  rP   rR  r2   r   rS  )NNrC  F)r0   r1   r  r  r  r  rE  r  rF  r2   r   r  )NNNNN)r0   r  r  r  r  r  rE  rà   r¡  rà   r   r  )r  r  r¼  FFN)r0   r1   r  rP   r  rP   rE  r  r	  r2   r½  r2   r   r¾  r   rà   )r  r  FN)r0   r1   r  rP   r  rP   r½  r2   r   r¾  r   rß  )r  r  T)
r0   r1   r  rP   r  rP   r	  r2   r   rà   )4Ú__doc__Ú
__future__r   r#   r¯  r]   Ú	threadingÚtypingr   r   r   r   r   r	   r
   r$   r%   r&   r'   ÚPILr   ÚImportErrorr!   Úsrc.common.coordinate_transformr   r   r   r   r   r   r   Ú__annotations__r/   rW   rO   r�   rƒ   rÜ   r  r  r,  rQ  r  r  r:  rB  r   r»  rÞ  rç  rñ  r  rJ   r@   r.   ú<module>r"     s?  ððð ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ Hð	Ø
„MÔ×&Ò& t¨QÑ/Ô/Ð/Ð/øØð 	ð 	ð 	Ø€Dð	øøøðØÐÐÐÐÐÐøØð ð ð Ø€E€E€EðøøøðØ€M€M€M€MøØð ð ð Ø€F€F€Fðøøøðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 68€Ð 7Ð 7Ð 7Ñ 7ð:ð :ð :ð :ð :ð8ð ð ð ð>ð ð ð ð62ð 2ð 2ð 2ðjSð Sð Sð SðlGð Gð Gð GðZ 59ðBð Bð Bð Bð BðL 48Ø#Ø#Ø#'ð	7ð 7ð 7ð 7ð 7ðv 48Ø#Ø#ð3ð 3ð 3ð 3ð 3ðr 04ØØ"Ø"Øð6ð 6ð 6ð 6ð 6ðv ØØð	að að að að aðHð ð ð ð"$ð $ð $ð $ðNð ð ð ð&  $Ø#Ø$.Øð` ð ` ð ` ð ` ð ` ðH 48Ø#Ø#Ø.2Ø04ðI ð I ð I ð I ð I ð\ ØØ$/Ø#(Ø ØðRFð RFð RFð RFð RFðn ØØ Øð19ð 19ð 19ð 19ð 19ðl ØØ#'ð	4ð 4ð 4ð 4ð 4ðr ØØ#'ð	eð eð eð eð eð eð es5   ­ A ÁAÁAÁA! Á!A+Á*A+Á/A4 Á4A>Á=A>