
    +jf                     l   d Z ddlmZ ddlZddlZddlZddlmc mZ	 ddl
ZddlZddlZddlmZmZmZ ddlZddlmZ d Zd Z G d d	ej                  Z ej        d
          Z G d dej                  Z G d dej                  Z G d dej                  Z G d de          ZdefdZdS )zR
SAM3 (Segment Anything 3) nodes for detection, segmentation, and video tracking.
    )overrideN)ComfyExtensionioui)Fractionc           	         | d         d         }|                     d          }g }||D ]}|d                             ||          }|d         |d                             |          nd}|8t          j        |j        d         |j        d         t          j        |          }|                    |||                     d	d          f           n| d         d                             ||          }|                     d          }||                    |          }n8t          j        |j        d         |j        d         t          j        |          }|                    ||df           |S )
z?Extract list of (text_embeddings, text_mask) from conditioning.r      sam3_multi_condNconddevicedtypeattention_maskr   r   max_detections)gettotorchonesshapeint64append)	conditioningr   r   	cond_metamultipromptsentryembmasks	            7/home/wildlama/comfy/ComfyUI/comfy_extras/nodes_sam3.py_extract_text_promptsr!      sq   Q"IMM+,,EG 	H 	HE-""&">>C9>?O9P9\5)*--f555bfD|z#)A,	!EKX^___NNCuyy1A1'E'EFGGGG	H 1oa ##6#??}}-..776??DD:cilCIaLTZ[[[DT1~&&&N    c	                    fd}	|dk    r
 |	            S d}
|                                 \  }}}}||z
  ||z
  }}t          dt          |||
z  z
                      }t          dt          |||
z  z
                      }t          t          |||
z  z                       }t          t          |||
z  z                       }||k    s||k    r
 |	            S |||||ddf         }t          j                            |                    d                              dd          ddd	d
          }|	                    ||          }||z
  ||z
  }}j
        dd         \  }}t          |z  |z            t          |z  |z            }}t          |z  |z            t          |z  |z            }}||k    s||k    r
 |	            S d||||f                             d                              d          } t          |          D ]1}!t          j        | dd	d          }"|                     ||"          } 2t          j        | ||fd	d          }#t          j        dd||          }$|#|$dddd||||f<   t          j                            d                              d          fd	d          }%|$d         dk    |%d         dk    z                                  S )zvRefine a coarse detector mask via SAM decoder, cropping to the detection box.

    Returns: [1, H, W] binary mask
    c                      t          j                            d                              d           fdd          d         dk                                    S )Nr   bilinearFsizemodealign_corners)Finterpolate	unsqueezefloat)HWcoarse_masks   r    _coarse_fallbackz&_refine_mask.<locals>._coarse_fallback/   sd    k33A66@@CC1a&#-UD D DDEGIJKLQEGG	Tr"   r   g?N   r	     r%   disabledcropr   .)r4   r4   Fr&   mask_inputs)tolistmaxintmincomfyutilscommon_upscaler,   movedimr   r   ranger*   r+   forward_segmentr   zerosr-   )&
sam3_modelorig_image_hwcr0   box_xyxyr.   r/   r   r   
iterationsr1   pad_fracx1y1x2y2bwbhcx1cy1cx2cy2r7   	crop_1008
crop_framecrop_hcrop_wmask_hmask_wmx1my1mx2my2
mask_logit_coarse_inputrefined_crop	full_maskcoarse_fulls&     ` ``                                r    _refine_maskre   *   sg   
T T T T T T T Q!!!H__&&NBB"Wb2gB
aR"x-'((
)
)C
aR"x-'((
)
)C
aR"x-'((
)
)C
aR"x-'((
)
)C
czzSCZZ!!!#c'3s7BQB./D**4>>!+<+<+D+DR+K+KTSWYcjt*uuIV599J3Yc	FF !&rss+NFF37V#$$c#'F*:&;&;C37V#$$c#'F*:&;&;C
czzSCZZ!!!S#c'3s723==a@@JJ1MMJ: V V}Zlchiii//
/UU

=662BchiiiLAq!QvUCCCI(4IaaaCGSW$%- 5 5a 8 8 B B1 E EQPQFYcsxyyyKq\A+a.1"45<<>>>r"   c                   P    e Zd ZdZed             Zed	dej        fd            ZdS )
SAM3_DetectzMOpen-vocabulary detection and segmentation using text, box, or point prompts.c                    t          j        dddg dt           j                            dd          t           j                            dd          t           j                            ddd	d
          t           j                            ddd	d	d          t           j                            ddd	d	d          t           j                            ddd	d	d          t           j                            dddddd          t           j	                            dddddd          t           j
                            ddd d!"          g	t           j                            d#          t           j                            d          g$          S )%Nrg   zSAM3 Detectimage/detection)sam3zsegment anythingzopen vocabularyztext detectionsegmentmodeldisplay_nameimager   Tz%Text conditioning from CLIPTextEncodern   optionaltooltipbboxesz Bounding boxes to segment within)rn   force_inputrq   rr   positive_coordszIPositive point prompts as JSON [{"x": int, "y": int}, ...] (pixel coords)negative_coordszINegative point prompts as JSON [{"x": int, "y": int}, ...] (pixel coords)	threshold      ?              ?{Gz?rn   defaultr>   r<   steprefine_iterations   r      z8SAM decoder refinement passes (0=use raw detector masks)rn   r}   r>   r<   rr   individual_masksFz(Output per-object masks instead of unionrn   r}   rr   masksnode_idrn   categorysearch_aliasesinputsoutputs)r   SchemaModelInputImageConditioningBoundingBoxStringFloatIntBooleanMaskOutputclss    r    define_schemazSAM3_Detect.define_schema[   s   y!&&gggwW==wW==%%n>\`  kR%  S  S$$XHRVae  pR$  S  S	 1@Q_cnr  }L  M  M	 1@Q_cnr  }L  M  M{cWZ`cjnoo0?R\]cdjk  vp  q  q
  !3BT^c  nX   Y  Y
 w''%%h//!
 
 
 	
r"   Nrx   r   Freturnc
                   =>?@ |j         \  }
=>}t          j                            |dd df                             dd          dddd          }=>fd	?d }|t          |t                    r ?|g          }|g|
z  }nt          |t                    rt          |          d
k    rot          |d
         t                    rT?fd|D             }t          |          |
k     r2|	                    |r|d         nd            t          |          |
k     2n9t          |t                    r$t          |          d
k    r ?|          }|g|
z  }|rt          j        |          ng }|rt          j        |          ng }t          |          d
k    pt          |          d
k    }t          j                            |           t          j                                        }|j                                        }|j        j        }d }|r=>fd|D             =>fd|D             z   }dgt          |          z  d
gt          |          z  z   }t%          j        |g||          t%          j        |gt$          j        |          d}|$t          |          d
k    rt+          |||          ng }t          |          d
k    }g }g }t          j                            |
          }t/          |
          D ]}|||dz                                ||          }d }|%||         ||                             ||          }g } g }!||                    ||          }"t/          t5          d
|dz
                      D ]}#|                    ||"          }"t7          j        |"=>fdd          }$|!	                    |$d
         d
k                                               ||s|d
         D ]}%|%                                \  }&}'}(})t%          j        |&|(dz  z
  dz  |'|)dz  z
  dz  g|&|(dz  z   dz  |'|)dz  z   dz  ggg||          }*|                    ||*          }"t/          t5          d
|dz
                      D ]}#|                    ||"          }"t7          j        |"=>fdd          }$|!	                    |$d
         d
k                                               |D ]\  }+},}- |||+|,||=>f          }.|.d         d
         }/|.d         d
         }0|.d         d
         }1|0                                }2|2|k    }3|/|3                                          }4|2|3                                          }5|1|3         }6|5!                    d          d |-         }7|4|7         }4|5|7         }5|6|7         }6tE          |4|5          D ]\  }8}9| 	                    t;          |8d
                   t;          |8d                   t;          |8d         |8d
         z
            t;          |8d         |8d         z
            t;          |9          d           tE          |6|4          D ]5\  }:}8|!	                    tG          |||         |:|8=>|||	  	                   6|	                    |            t          |!          d
k    rnt%          j$        |!d
          };|	r|	                    |;           n|	                    |;d
k    %                    d
                                                     n|	rH|	                    t%          j&        d
=>t          j        '                                                     nF|	                    t%          j&        =>t          j        '                                                     |(                    d           t          j        '                                @@fd |D             }|	rt%          j$        |d
          nt%          j)        |          }<tU          j+        |<|          S )!N.r2   r3   r	   r4   r%   r5   r6   c                    g }| D ][}|d         |d         dz  z   z  }|d         |d         dz  z   z  }|                     |||d         z  |d         z  g           \t          j        |gt          j                  S )Nxwidthr   yheightr   )r   r   tensorfloat32)box_listcoordsdcxcyr.   r/   s        r    _boxes_to_tensorz-SAM3_Detect.execute.<locals>._boxes_to_tensorz   s    F I IfqzA~-2fq{Q.!3r2qzA~q{QGHHHH<>>>>r"   r   c                 .    g | ]}|r |          nd S N ).0frame_boxesr   s     r    
<listcomp>z'SAM3_Detect.execute.<locals>.<listcomp>   s1    "t"t"t^iK#Y#3#3K#@#@#@UY"t"t"tr"   c                 H    g | ]}|d          z  dz  |d         z  dz  gS r   r4   r   r   r   pr.   r/   s     r    r   z'SAM3_Detect.execute.<locals>.<listcomp>   8    RRRQ1S6A:,afqj4.?@RRRr"   c                 H    g | ]}|d          z  dz  |d         z  dz  gS r   r   r   s     r    r   z'SAM3_Detect.execute.<locals>.<listcomp>   r   r"   r   )point_coordspoint_labelsr   )point_inputsr9   Fr&   r   )
box_inputs)text_embeddings	text_maskboxesrw   	orig_sizer   scoresr   T)
descending)r   r   r   r   scoredimr   c                 :    g | ]}|                               S r   )r   )r   midevs     r    r   z'SAM3_Detect.execute.<locals>.<listcomp>   s#    333AQTT$ZZ333r"   ),r   r?   r@   rA   rB   
isinstancedictlistlenr   jsonloadsmodel_managementload_model_gpuget_torch_devicerl   	get_dtypediffusion_modelr   r   int32r!   ProgressBarrC   r   rD   r<   r*   r+   r-   r;   sigmoidcpuargsortzipre   catanyrE   intermediate_deviceupdatestackr   
NodeOutput)Ar   rl   ro   r   rs   ru   rv   rw   r   r   BCimage_inper_frame_boxessharedpos_ptsneg_pts
has_pointsr   r   rF   r   
all_coords
all_labels	cond_listhas_textall_bbox_dicts	all_maskspbarbframeb_boxesframe_bbox_dictsframe_masksr_   r`   r   
box_cxcywhr   r   rO   rP   sam_boxr   r   max_detresults
pred_boxesr   r   probskeep
kept_boxeskept_scores
kept_masksorderboxr   r   combinedmask_outr.   r/   r   r   sA                                                                @@@@r    executezSAM3_Detect.executes   s,	   [
1a;--eC!Gn.D.DR.K.KTSWYcjt-uu	? 	? 	? 	? 	? 	? &$'' /))6(33#)(Q,FD)) 	/c&kkAoo*VTUYX\B]B]o"t"t"t"tms"t"t"t/**Q..#**/+[?2+>+>W[\\\ /**Q..FD)) /c&kkAoo))&11#)(Q, 2AH$*_---b1@H$*_---b\\A%9W)9
--e444'88::%%''[0
  	RRRRR'RRRRRRRR'RRRSJs7||+qcCLL.@@J %j\v V V V %j\U[ \ \ \ L
 KWJbgjkwgxgx{|g|g|),FFF  CE	y>>A% 	{&&q))q J	 J	AQqsUO&&fE&BBEG*q/A/M)!,//vU/KK!K ''77L7YY
s1&7!&;<<== [ [A!+!;!;Ez!;!Z!ZJJ}Zq!f:]bccc""DGaK#6#6#8#8999 "8"")!* 
> 
>J%/%6%6%8%8NBB#lrBqDyD.@219PTBT-U/1BqDyD.@219PTBT-U-W ,X28G G GG ",!;!;Eg!;!V!VJ"3q*;a*?#@#@AA _ _%/%?%?S]%?%^%^

=1a&zafgggD&&Q!':':'<'<==== 8A _ _3G$*?i!Y1a&J J J %W-a0
 *1-(+((y('-1133
#Dkoo//"4[
#++t+<<XgXF'.
)%0'.
"%j+">">  JC$++"3q6]]s1v!&s1vA!7!75QRUVWRXCYCY!&u- -    
 "*j99 _ _FAs&&|"E!HaaFEK\(^ (^ _ _ _ __ !!"2333;!## 9[a888# H$$X....$$hl%7%7A%7%>%>%D%D%F%FGGGG# m$$U[AqAWAkAkAmAm%n%n%noooo$$U[Ae>T>h>h>j>j%k%k%klllKKNNNN%99;;3333333	2B^59YA....T]H^H^}X~666r"   )NNNNrx   r   F	__name__
__module____qualname____doc__classmethodr   r   r   r  r   r"   r    rg   rg   X   ss        WW
 
 [
. K7 K7  oq  o| K7 K7 K7 [K7 K7 K7r"   rg   SAM3_TRACK_DATAc                   P    e Zd ZdZed             Zed	dej        fd            ZdS )
SAM3_VideoTrackzDTrack objects across video frames using SAM3's memory-based tracker.c                 R   t          j        dddg dt           j                            ddd          t           j                            dd	          t           j                            d
d
dd          t           j                            dddd          t           j                            ddddddd          t           j                            dddddd          t           j                            ddddd           gt          
                    d!d!	          g"          S )#Nr
  zSAM3 Video Trackri   )rj   videotrack	propagateimageszVideo frames as batched images)rn   rr   rl   rm   initial_maskTz5Mask(s) for the first frame to track (one per object)rp   r   z;Text conditioning for detecting new objects during trackingdetection_thresholdrx   ry   rz   r{   z,Score threshold for text-prompted detection.)rn   r}   r>   r<   r~   rr   max_objects   r   @   zZMax tracked objects. Initial masks count toward this limit. 0 uses the internal cap of 64.r   detect_intervalr	   zIRun detection every N frames (1=every frame). Higher values save compute.)rn   r}   r>   rr   
track_datar   )r   r   r   r   r   r   r   r   r   SAM3TrackDatar   r   s    r    r   zSAM3_VideoTrack.define_schema  sR   y%+&BBBxhHhiiwW==n>TX  cZ  [  [%%n>\`  kh%  i  i4CXbekntw  C  M{  |  |]PQWX^`  kG  H  H.=NXY_`  kv  w  w $$\$MM
 
 
 	
r"   Nrx   r   r	   r   c                    |j         \  }}	}
}t          j                            |           t          j                                        }|j                                        }|j        j        }|dd df                             dd          }d }|*|	                    d          
                    ||          }t          j                            |          }d }|/t          |          dk    rd t          |||          D             }n|t          d          |                    |||||||||		  	        }|	|
f|d
<   t#          j        |          S )N.r2   r3   r	   r   r   c                     g | ]
\  }}}||fS r   r   )r   r   r   r`   s       r    r   z+SAM3_VideoTrack.execute.<locals>.<listcomp>/  s"    oooLCqS$Kooor"   z4Either initial_mask or conditioning must be provided)	r  initial_masksr   text_promptsnew_det_threshr  r  target_devicetarget_dtyper   )r   r?   r   r   r   rl   r   r   rB   r,   r   r@   r   r   r!   
ValueErrorforward_videor   r   )r   r  rl   r  r   r  r  r  Nr.   r/   r   r   r   rF   	frames_in
init_masksr   r  results                       r    r  zSAM3_VideoTrack.execute  sj   \
1a--e444'88::%%''[0
37O++B22	
#%//2255V55QQJ{&&q))#L(9(9A(=(=oo<QR^`fhm<n<noooLL!STTT))JTP\.K+6PU * W W  !!f{}V$$$r"   )NNrx   r   r	   r  r   r"   r    r
  r
    sk        NN
 
 [
( % %  IK  IV % % % [% % %r"   r
  c                       e Zd ZdZed             Zg dZi Zedd            Z	edd            Z
edd
ej        fd            ZdS )SAM3_TrackPreviewul   Visualize tracked objects with distinct colors as a video preview. No tensor output — saves to temp video.c                 <   t          j        dddt                              dd          t           j                            ddd          t           j                            d	d	d
ddd          t           j                            dddddd          gd          S )Nr&  zSAM3 Track Previewri   r  rm   r  T)rn   rq   opacityrx   ry   rz   皙?r|   fps      8@g      ^@)r   rn   r   r   is_output_node)r   r   r  r   r   r   r   s    r    r   zSAM3_TrackPreview.define_schema>  s    y'-&##L|#LLxhNNyy#SV\_fjkku5$CUZadee	  
 
 
 	
r"   ))gQ?Gz?gQ?)rz   rx   r)  )(\?g)\(?r.  )zG?g333333?g{Gz?)g(\?g?Gz?)g?g(\?g(\?)g{Gz?r-  RQ?)rx   rx   rx   )r0  r0  gp=
ף?)g
ףp=
?g      ?gQ?)gGz?r1  gQ?)gzG?g(\?r/  r2   c                 b   | |f}|t           j        v rt           j        |         S t          j        g dg dg dg dg dgg dg dg dg dg dgg dg dg dg dg dgg dg dg dg dg dgg dg dg dg dg dgg dg dg dg dg dgg dg dg dg dg dgg dg dg dg dg dgg dg dg dg dg dgg dg dg dg dg dgg
t          j                  }g g }}t          d          D ]}||                             |d	                              |d
          }t          j        |	                                
                    d	          
                    d	          d          }t          j        |dd
d
          d         d	k    }	|                    |                    |                      |                    |	                    |                      |d	         j        \  }
}|d	         j        \  }}|||
|||ft           j        |<   t           j        |         S )N)r	   r	   r	   )r	   r   r	   )r   r	   r   )r	   r	   r   )r   r   r	   )r	   r   r   r   
   r   r	   )r	   r	   r	   r	   r2   )stridepadding)r   r   )r&  _glyph_cacher   r   boolrC   repeat_interleaver*   padr-   r,   
max_pool2dr   r   r   )r   scalekeyatlasglyphsoutlinesr   gpaddedoghgwohows                 r    _get_glyphszSAM3_TrackPreview._get_glyphsV  s   uo#000$1#66WWWWWWWWWWWWWW5WWWWWWWWWWWWWW5WWWWWWWWWWWWWW5WWWWWWWWWWWWWW5WWWWWWWWWWWWWW5WWWWWWWWWWWWWW5WWWWWWWWWWWWWW5WWWWWWWWWWWWWW5WWWWWWWWWWWWWW5WWWWWWWWWWWWWW5
    rr 	* 	*Aa**5!44FFuaPPAU17799..q11;;A>>	JJFfa1===dCaGAMM!$$v,,'''OOADDLL))))B!"B/5xRR.P&s+ -c22r"   c                    | j         dd         \  }}| j        }t                              ||          \  }	}
}}}}t	          j        ||| j                  }d t          |          D             }t          |          ||z   z  |z
  }||dz  z
  }||dz  z
  }t          |          D ]5\  }}||||z   z  z   }|dz
  |dz
  }}t          d|           t          d|           }}t          |||z
            t          |||z
            }}||k    r?||k    r9||z   ||z   }}d| ||||z
  z   ||||z
  z   f         |
|         ||||f         <   t          d|           t          d|           } }t          |||z
            t          |||z
            }"}!|!|k    r?|"| k    r9||z   || z   }}|| |||!|z
  z   |||"| z
  z   f         |	|         ||!| |"f         <   7dS )zKDraw a number on a GPU tensor [H, W, 3] float 0-1 at (cx, cy) with outline.Nr   r   c                 ,    g | ]}t          |          S r   )r=   )r   r   s     r    r   z6SAM3_TrackPreview._draw_number_gpu.<locals>.<listcomp>z  s    ,,,1A,,,r"   r	   r   )r   r   r&  rG  r   r   r   strr   	enumerater<   r>   )#r   numberr   r   colorr;  r.   r/   r   r>  r?  rC  rD  rE  rF  color_tdigstotal_wx0y0ir   dxoy0ox0osy1osx1osy2osx2fy1fx1sy1sx1sy2sx2s#                                      r    _draw_number_gpuz"SAM3_TrackPreview._draw_number_gpus  sC    {2A21+<+H+HQV+W+W("b"b,uV5;GGG,,F,,,d))rEz*U2'Q,"'\dOO 	c 	cDAqa2:&&BAvrAvCQs1sd||$DRS))3r1s7+;+;$Dd{{td{{:sTzSefc#tDy/)3sDI+>>?DQUIW[\`W`L`@ab1rc{{CB3KKC2q2vBBCSyyS3YY8R#XS[bc#s3w-'S#c'])::;F1Ic#gsSVwFV<WX	c 	cr"   Nrx   r+  r   c                     ddl m} |d         }|d         \  }}||j        d         |j        d         }}||d         d}
}	n|j        d         |j        d         }
}	dd l}t          j                                        }t          j                    }d|	                                j
        d d	          d
}t          j                            ||          }t          j        |d          5 }|                    dt#          t%          |dz            d                    }||_        ||_        d|_        t-          j        ||dt,          j                  }|                                }|
dk    rt-          j         fdt7          |
          D             |t,          j                  }t-          j        ||                              d|d          }t-          j        ||                              dd|          }t7          |	          D ]]}|,||j        d         k     r||                                         }nt-          j         ||d          }|
dk    rd ||||dz            !                    |                    }tE          j#        |$                                ||fd          d         }|!                    |          }|dk    }|%                    d          }|%                                rr|!                    t,          j                  &                    d          }||         }|'                    d          } t-          j(        | |d|z
  z  ||z  z   |          }|)                    d          *                    d          }!||z  )                    d          |!z  }"||z  )                    d          |!z  }#|!dk    }$|+                    dg           }%tY          d|dz            }&|!$                                -                                dz  *                    d          .                                /                                }'t7          |
          D ]}(|$|(         rta          |#|(                   ta          |"|(                   }*}) j1        |(te           j1                  z           }+tg          |&|'|(                   },tY          d|,dz  dz            }-th          5                    ||(|)|*|+|,            |(te          |%          k     rK|%|(         d!k     r?th          5                    |ta          |%|(         d"z            |)|*d#|,z  z   dz   |+|-            |6                    |*                    dd          7                    d$          8                                           nN|6                    |*                    dd          7                    d$          8                                           t          j9        :                    |d%&          }.|;                    |<                    |.=                    d&                               _|;                    |<                    d                      d d d            n# 1 swxY w Y   t}          j?        t          jA        t          jB        |d't|          jC        jD                  g          (          S ))Nr   unpack_maskspacked_masksr   r	   r   n_framessam3_track_preview_   z.mp4w)r(   h264i  )rateyuv420pr2   r   c                 T    g | ]$}j         |t          j                   z           %S r   )COLORSr   )r   rS  r   s     r    r   z-SAM3_TrackPreview.execute.<locals>.<listcomp>  s-    (_(_(_QACJ4G)H(_(_(_r"   r   r   nearest)r'   r(   rx   r   r3   )r3   r8   )r>   r         )r;  rz   d   r      rgb24)format )r   )Ecomfy.ldm.sam3.trackerrd  r   uuidr?   r   r   folder_pathsget_temp_directoryuuid4hexospathjoinavopen
add_streamr   roundr   r   pix_fmtr   emptyuint8numpyr   rC   r   arangeviewclonerE   r   r*   r+   r-   r   argmaxr,   wheresumclamp_r   r<   sqrtlongr;   r=   rn  r   r>   r&  ra  copy_mul_byte
VideoFramefrom_ndarraymuxencodereformatr   r   r   PreviewVideoSavedResult
FolderTypetemp)/r   r  r  r(  r*  rd  packedr.   r/   r!  N_objrx  gputemp_dirfilenamefilepathoutputstream	frame_cpuframe_npcolors_tgrid_ygrid_xtr   frame_binaryr   	frame_gpu
bool_masksany_maskobj_idx_mapcolor_overlaymask_3darear   r   hasr   label_scale	size_capsobj_idx_cx_cyrM  	obj_scalescore_scalevframes/   `                                              r    r  zSAM3_TrackPreview.execute  s    	877777N++&1<?FLOqA>!*-quAA|AQuA$5577244C)9"1")=CCC7<<(33WXC((( 5	,F&&vHU3:=N=NPT4U4U&VVFFLFM&FNAq!5;???I ((Hqyy <(_(_(_(_RWX]R^R^(_(_(_.1H H Ha44499!QBBa44499!QBB1XX 'M 'M%!fl1o*=*="1IOO--EE!K1a00E199#/<q1u0@0@0E0E#F#FL"#-0B0B0D0DAq6Xa"b"b"bcd"eK %I!,s!2J)~~!~44H||~~ y&0mmEK&@&@&G&GA&G&N&N(0(="*"4"4R"8"8$)Ka'k9RUbelUl9lnw$x$x	%>>h>77>>1>EED$v-22x2@@DHB$v-22x2@@DHB(C'^^Hb99F"%ac"2"2K!%!2!2!4!4r!9 A Aa A H H M M O O V V X XI#(<< 	{ 	{w< {'*2g;'7'7R[9I9IC$'JwSZ/H$IE(+K79K(L(LI*-aQ!1C*D*DK->>y'SVX[]bjs>ttt&V4439N9N 1 B B9cRXY`RadgRgNhNhCFaR[mH[^_H_afny !C !{ !{ !{OOI$4$4Q$:$:$?$?$D$D$I$I$K$KLLLLOOELLA$6$6$;$;C$@$@$E$E$G$GHHH33HW3MM

6==	)J)JKKLLLLJJv}}T**+++k5	, 5	, 5	, 5	, 5	, 5	, 5	, 5	, 5	, 5	, 5	, 5	, 5	, 5	, 5	,l }"bmN`1a1a0b c cdddds   .V-Z''Z+.Z+)r2   )Nrx   r+  )r  r  r  r  r  r   rn  r6  staticmethodrG  ra  r   r   r  r   r"   r    r&  r&  ;  s        vv
 
 [
  F L3 3 3 \38 c c c \c4 Ge Ge Ge Ge Ge [Ge Ge Ger"   r&  c                   P    e Zd ZdZed             Zeddej        fd            ZdS )SAM3_TrackToMaskz3Select tracked objects by index and output as mask.c                     t          j        dddt                              dd          t           j                            dddd	          gt           j                            d
d
          g          S )Nr  zSAM3 Track to Maskri   r  rm   object_indicesrv  zNComma-separated object indices to include (e.g. '0,2,3'). Empty = all objects.r   r   )r   rn   r   r   r   )r   r   r  r   r   r   r   r   s    r    r   zSAM3_TrackToMask.define_schema  s    y&-&##L|#LL	 0?OY[(x   z z wW==
 
 
 	
r"   rv  r   c           	         ddl m} |d         }|d         \  }}|N|d         }t          j        t	          j        |||t          j                                                            S |j	        d         |j	        d         c}|
                                r.d |                    d	          D             }fd
|D             }nt          t                              }|sFt          j        t	          j        |||t          j                                                            S |d d |d         f                                         }	|dd          D ]}
|	|d d |
f         z  }	 ||	                              d                                          }t#          j        |||fdd          d d df         }t          j        |          S )Nr   rc  re  r   rf  r   r	   c                     g | ]I}|                                                                 (t          |                                           JS r   )stripisdigitr=   )r   rS  s     r    r   z,SAM3_TrackToMask.execute.<locals>.<listcomp>  s?    ```!AGGIIL]L]L_L_`s17799~~```r"   ,c                 4    g | ]}d |cxk    rk     n n|S )r   r   )r   rS  r  s     r    r   z,SAM3_TrackToMask.execute.<locals>.<listcomp>  s.    <<<QQ!^^^^e^^^^^q^^^r"   r%   Fr&   )rw  rd  r   r   r   rE   r?   r   r   r   r  splitr   rC   r  r,   r-   r*   r+   )r   r  r  rd  r  r.   r/   r!  indicesunion_packedrS  unionr   r  s                @r    r  zSAM3_TrackToMask.execute  s   777777N++&1>:&A=Q1U=S=g=g=i=i!j!j!jkkk<?FLO5!! 	)``~/C/CC/H/H```G<<<<'<<<GG5<<((G 	l=Q1U=S=g=g=i=i!j!j!jkkkaaam,2244 	) 	)AF111a4L(LL\**44Q77==??=aV*TYZZZ[\[\[\^_[_`}X&&&r"   N)rv  r  r   r"   r    r  r    sa        ==
 
 [
 ' 'r} ' ' ' [' ' 'r"   r  c                   L    e Zd Zedeeej                          fd            ZdS )SAM3Extensionr   c                 :   K   t           t          t          t          gS r   )rg   r
  r&  r  )selfs    r    get_node_listzSAM3Extension.get_node_list
  s       	
 	
r"   N)	r  r  r  r   r   typer   	ComfyNoder  r   r"   r    r  r  	  sE        
T$r|*<%= 
 
 
 X
 
 
r"   r  r   c                  "   K   t                      S r   )r  r   r"   r    comfy_entrypointr    s      ??r"   ) r  typing_extensionsr   r   r}  r   torch.nn.functionalnn
functionalr*   comfy.model_managementr?   comfy.utilsry  comfy_api.latestr   r   r   r  	fractionsr   r!   re   r  rg   Customr  r
  r&  r  r  r  r   r"   r    <module>r     s    ' & & & & &  				                       3 3 3 3 3 3 3 3 3 3 				        .*? *? *?\g7 g7 g7 g7 g7", g7 g7 g7T 	+,,4% 4% 4% 4% 4%bl 4% 4% 4%n[e [e [e [e [e [e [e [e|-' -' -' -' -'r| -' -' -'`
 
 
 
 
N 
 
 
      r"   