
    
3j                     d	   S SK J r   S rS rS rS rGS`S jrSS	S
SSS./S/SS\" S5      SSSS/S\" S5      SS0SS0S./S\" S5      SS0SSS .S!S"S#.S$./S%.r0 S&S'\" S(5      S)S*S+/ S,QS-.S.S/S0S1S2S3S4S5.S6S7S8S9S:S;./S<S=S>.S?./_S@SA\" SB5      SCSDSE/SF.SGSHSISJSKSL.SMSNSOSPSQSRSSSTSUSVSWSX.S$./_SYSZ\" S[5      S\SCSDSE/SF.SGS]SISJSKS^.SMSNSOSPSQSRS_SUSVSWS`.
S$./_SaSb\" Sc5      SCSDSE/SF.SGSHSISJSKSL.SdSe/\Sf   -   SNSOSPSQSRSSSTSUSgSh.
S$./_SiSj\" Sk5      S\SCSDSE/SF.SGS]SISJSKS^.SdSe/\Sf   -   SNSOSPSQSRSSSTSUSgSh.
S$./_SlSm\" Sn5      SoSC0SGSpSHSq.SrSsS_StSuSv.S$./_SwSx\" Sy5      SoSC0SGSpSHSq.Sr/\Sf   -   SsSzS{SuS|.S$./_S}S~\" S5      SS0SGSpS.S/\Sf   -   SSPSQS./SuS.S$./_SS\" S5      SS0S/\Sf   -   SS.S./_SS\" S5      SSS0SSSSS.S./_SS\" S5      SSS0SS0S./_SS\" S5      SSS0SS0S./_SS\" S5      SSS0SSSSS./0S./_SS\" S5      SS\" S5      SSSoS0SS0S./_SS\" S5      SS0SSSSSSSSSSS.
S./_SS\" S5      SS0SSSSSS.S./_SS\" S5      SS0SSSSSS.S./_0 SS\" S5      SSS0SS0SS0S$./_SS\" S5      SSSSS.SS0SS0S$./_SS\" S5      SSSSS.SS0SS0S$./_SS\" S5      SS0SSSSS.SGS 0S$./_GSGS\" GS5      GSGS0GSGSGSGS	GS
.SGS 0S$./_GSGS\" GS5      GSGS0GSGSGSGSGS.SGS 0S$./_GSGS\" GS5      SSGS.GSGSGS.\GS   \GS   \GS   GS.S$./_GS GS!\" GS"5      GSGSGS#.GS$GSGS%.\GS   \GS   \GS   GS.S$./_GS&GS'\" GS(5      GSGSGS).GS*GSGS+.\GS   \GS   \GS   GS.S$./_GS,\" \GS-   GS.5      _GS/\" \GS-   GS05      _GS1\" \GS-   GS5      _GS2GS3\" GS45      SGS50GS6GS7GS.GS8GS90S$./_GS:GS;\" GS<5      GS=GS>0GS?GS@GS%.GS8GSA0S$./_GSBGSC\" GSD5      GSEGSF0GSGGSHGS.GS8GSA0S$./_GSI\" \GSJ   GS.5      _GSK\" \GSJ   GS05      _E\" \GSJ   GSGSGSL9GSM\" GSN5      GSOGSPGSQGSR0GSSGST0S./GSU\" GSV5      GSWGSXGSYGSZ.GS[GS\0S./GS].ErGSaGS^ jrGS_ r	g(b     )loggerc                     SU  S3$ )Nz	<img src=z2 loading=lazy style="width: 0px; min-width: 100%"> srcs    d/home/wildlama/comfy/ComfyUI/custom_nodes/ComfyUI-VideoHelperSuite/videohelpersuite/documentation.pyimager	      s    seMNN    c                     SU  S3$ )Nz<video preload="none" src=z muted loop controls controlslist="nodownload noremoteplayback noplaybackrate" style="width: 0px; min-width: 100%" class="VHS_loopedvideo">r   r   s    r   videor      s    'u  -x  y  yr
   c                     SU  S3$ )Nz<div id=VHS_shortdesc></div>r   )descs    r   
short_descr      s    #D600r
   c                 6   [        U [        5      (       a6  0 nU R                  5        H  u  p4[        U40 UD6U[        U40 UD6'   M      U$ [        U [        5      (       a(  / nU  H  nUR                  [        U40 UD65        M      U$ U R                  " S0 UD6$ )Nr   )
isinstancedictitemsformat_eachlistappendformat)r   kwargsreskvs        r   r   r   
   s    $::<CA,7,DV,DCA(()  
$AJJ{1//0 
;;   r
   Nc           	          Uc  US-   nUc  UR                  5       nUc  UR                  5       nUc  UR                  5       n[        XX#XES9$ )z:Utility function for nodes with image/latent/mask variantss)lowerlowersupperupperscap)
capitalizer!   r   )r   r   r    r!   r"   r#   s         r   format_typer%      sR    ~
{ }~tV]]r
   zNDetermines what the output resolution will be if input resolutions don't matchzAlways use the resolution for AzAlways use the resolution for Bz#Pick the smaller resolution by areaz"Pick the larger resolution by area)zmatch Azmatch Bzmatch smallerzmatch largerz4Determines what method to use if scaling is requiredzwWhen sizes don't match, should the resized image have it's aspect ratio changed, or be cropped to maintain aspect ratioz`This is a VHS_PATH input. When edited, it provides a list of possible valid files or directorieszkhttps://github.com/Kosinkadink/ComfyUI-VideoHelperSuite/assets/4284322/729b7185-1fca-41d8-bc8d-a770bb2a5ce6z8The current top-most completion may be selected with TabzVYou can navigate up a directory by pressing Ctrl+B (or Ctrl+W if supported by browser)zFThe filter on suggested file types can be disabled by pressing Ctrl+G.z4If converted to an input, this functions as a stringu    Get {cap} Count 🎥🅥🅗🅢z3Return the number of {lowers} in an input as an INTz{lowers}zThe input {lower}countz#The number of {lowers} in the input)InputsOutputsu'   Select Every Nth {cap} 🎥🅥🅗🅢z&Keep only 1 {lower} for every intervalzThe output {lowers})z{upper}r&   zIThe interval from which one frame is kept. 1 means no frames are skipped.zA number of frames which that is skipped from the start. This applies before select_every_nth. As a result, multiple copies of the node can each have a different skip_first_frames to divide the {lower} into groups)select_every_nthzskip_first_{lowers})r'   r(   Widgets)merge_strategyscale_methodcrop_methodVHS_PATHGetCountSelectEveryNthVHS_VideoCombineu   Video Combine 🎥🅥🅗🅢z&Combine an image sequence into a videoz$The images to be turned into a videoz$(optional) audio to add to the videoz(optional) Connect to a Meta Batch manager to divide extremely long image sequences into sub batches. See the documentation for Meta Batch Manager)z(optional) If provided, the node will take latents as input instead of images. This drastically reduces the required RAM (not VRAM) when working with long (100+ frames) sequencesz\Unlike on Load Video, this isn't always a strict upgrade over using a standalone VAE Decode.zIf you have multiple Video Combine outputs, then the VAE decode will be performed for each output node increasing execution timezIf you make any change to output settings on the Video Combine (such as changing the output format), the VAE decode will be performed again as the decoded result is (by design) not cached)imagesaudio
meta_batchvaezThe frame rate which will be used for the output video. Consider converting this to an input and connecting this to a Load Video with Video Info(Loaded)->fps. When including audio, failure to properly set this will result in audio desynczThe number of additional times the video should repeat. Can cause performance issues when used with long (100+ frames) sequenceszbA prefix to add to the name of the output filename. This can include subfolders or format strings.zThe output format to use. Formats starting with, 'image' are saved with PIL, but formats starting with 'video' utilize the video_formats system. 'video' options require ffmpeg and selecting one frequently adds additional options to the node.zPlay the video normally, then repeat the video in reverse so that it 'pingpongs' back and forth. This is frequently used to minimize the appearance of skips on very short animations.z^Specifies if output files should be saved to the output folder, or the temporary output foldera  Displays a preview for the processed result. If advanced previews is enabled, the output is always converted to a format viewable from the browser. If the video has audio, it will also be previewed when moused over. Additional preview options can be accessed with right click.)
frame_rate
loop_countfilename_prefixr   pingpongsave_outputvideopreviewzDetermines how much to prioritize quality over filesize. Numbers vary between formats, but on each format that includes it, the default value provides visually loss less outputzThe pixel format to use for output. Alternative options will often have higher quality at the cost of increased file size and reduced compatibility with external software.z"The most common and default formatzaUse 10 bit color depth. This can improve color quality when combined with 16bit input color depthz(Include transparency in the output video)yuv420pyuv420p10leyuva420pzVHS supports outputting 16bit images. While this produces higher quality output, the difference usually isn't visible without postprocessing and it significantly increases file size and processing time.zSDetermines if metadata for the workflow should be included in the output video file)crfpix_fmtinput_color_depthsave_metadata)r'   r*   zCommon Format WidgetsVHS_LoadVideou   Load Video 🎥🅥🅗🅢z#Loads a video from the input folderz(optional) Connect to a Meta Batch manager to divide extremely long sequences into sub batches. See the documentation for Meta Batch Managerz(optional) If provided the node will output latents instead of images. This drastically reduces the required RAM (not VRAM) when working with long (100+ frames) sequencesz}Using this is strongly encouraged unless connecting to a node that requires a blue image connection such as Apply Controllnet)r4   r5   zThe loaded imagesz"The length of images just returnedzThe audio from the loaded videozZExposes additional info about the video such as the source frame rate, or the total lengthzRThe loaded images pre-converted to latents. Only available when a vae is connected)IMAGEframe_countr3   
video_infoLATENTz_The video file to be loaded. Lists all files with a video extension in the ComfyUI/Input foldera  Drops or duplicates frames so that the produced output has the target frame rate. Many motion models are trained on videos of a specific frame rate and will give better results if input matches that frame rate. If set to 0, all frames are returned. May give unusual results with inputs that have a variable frame rate like animated gifs. Reducing this value can also greatly reduce the execution time and memory requirements.z~Previously was used to provide suggested resolutions. Instead, custom_width and custom_height can be disabled by setting to 0.z^Allows for an arbitrary width to be entered, cropping to maintain aspect ratio if both are setz_Allows for an arbitrary height to be entered, cropping to maintain aspect ratio if both are setzBThe maximum number of frames to load. If 0, all frames are loaded.z?A number of frames which are discarded before producing output.al  Similar to frame rate. Keeps only the first of every n frames and discard the rest. Has better compatibility with variable frame rate inputs such as gifs. When combined with force_rate, select_every_nth_applies after force_rate so the resulting output has a frame rate equivalent to force_rate/select_every_nth. select_every_nth does not apply to skip_first_frameszyUpdates other widgets so that only values supported by the given format can be entered and provides recommended defaults.zFAn upload button is provided to upload local files to the input folderaC  Displays a preview for the selected video input. If advanced previews is enabled, this preview will reflect the frame_load_cap, force_rate, skip_first_frames, and select_every_nth values chosen. If the video has audio, it will also be previewed when moused over. Additional preview options can be accessed with right click.)r   
force_rate
force_sizecustom_widthcustom_heightframe_load_capskip_first_framesr)   r   choose video to uploadr;   VHS_LoadVideoFFmpegu"   Load Video FFmpeg 🎥🅥🅗🅢zBLoads a video from the input folder using ffmpeg instead of opencvzbProvides faster execution speed, transparency support, and allows specifying start time in secondsz'Transparency data from the loaded video)rD   maskr3   rF   rG   zSA timestamp, in seconds from the start of the video, to start loading frames from. )
r   rH   rI   rJ   rK   rL   
start_timer   rN   r;   VHS_LoadVideoPathu"   Load Video (Path) 🎥🅥🅗🅢z$Loads a video from an arbitrary pathzThe video file to be loaded.z9You can also select an image to load it as a single framer.   aV  Displays a preview for the selected video input. Will only be shown if Advanced Previews is enabled. This preview will reflect the frame_load_cap, force_rate, skip_first_frames, and select_every_nth values chosen. If the video has audio, it will also be previewed when moused over. Additional preview options can be accessed with right click.)
r   rH   rI   rJ   rK   rL   rM   r)   r   r;   VHS_LoadVideoFFmpegPathu)   Load Video FFmpeg (Path) 🎥🅥🅗🅢zCLoads a video from an arbitrary path using ffmpeg instead of opencvVHS_LoadImagesu   Load Images 🎥🅥🅗🅢zBLoads a sequence of images from a subdirectory of the input folderr4   z'The alpha channel of the loaded images.)rD   MASKrE   zeThe directory images will be loaded from. Filtered to process jpg, png, ppm, bmp, tif, and webp fileszBThe maximum number of images to load. If 0, all images are loaded.z[An upload button is provided to upload a local folder containing images to the input foldera  Displays a preview for the selected video input. Will only be shown if Advanced Previews is enabled. This preview will reflect the image_load_cap, skip_first_images, and select_every_nth values chosen. Additional preview options can be accessed with right click.)	directoryimage_load_caprQ   zchoose folder to uploadr;   VHS_LoadImagesPathu#   Load Images (Path) 🎥🅥🅗🅢z1Loads a sequence of images from an arbitrary pathz?A number of images which are discarded before producing output.z<Keeps only the first of every n frames and discard the rest.)rV   rW   skip_first_imagesr)   r;   VHS_LoadImagePathu"   Load Image (Path) 🎥🅥🅗🅢z%Load a single image from a given pathr5   zF(optional) If provided the node will output latents instead of images.)rD   rU   zThe image file to be loaded.zAllows for conveniently scaling the input without requiring an additional node. Provides options to maintain aspect ratio or conveniently target common training formats for Animate Diff)rJ   rK   )r	   rI   r;   VHS_LoadAudiou"   Load Audio (Path) 🎥🅥🅗🅢z*Loads an audio file from an arbitrary pathr3   zThe loaded audiozThe audio file to be loaded.zKAn offset from the start of the sound file that the audio should start from)
audio_fileseek_seconds)r(   r*   VHS_LoadAudioUploadu$   Load Audio (Upload) 🎥🅥🅗🅢z,Loads an audio file from the input directoryzVery similar in functionality to the built-in LoadAudio. It was originally added before VHS swapped to use Comfy's internal AUDIO format, but provides the additional options for start time and durationz,A maximum limit for the audio. Disabled if 0zHAn upload button is provided to upload an audio file to the input folder)r3   rQ   durationzchoose audio to uploadVHS_AudioToVHSAudiou*   Audio to legacy VHS_AUDIO 🎥🅥🅗🅢z6utility function for compatibility with external nodesa  VHS used to use an internal VHS_AUDIO format for routing audio between inputs and outputs. This format was intended to only be used internally and was designed with a focus on performance over ease of use. Since ComfyUI now has an internal AUDIO format, VHS now uses this format. However, some custom node packs were made that are external to both ComfyUI and VHS that use VHS_AUDIO. This node was added so that those external nodes can still functionz)An input in the standardized AUDIO format	vhs_audiozDAn output in the legacy VHS_AUDIO format for use with external nodesVHS_VHSAudioToAudiou*   Legacy VHS_AUDIO to Audio 🎥🅥🅗🅢zDAn input in the legacy VHS_AUDIO format produced by an external nodez*An output in the standardized AUDIO formatVHS_PruneOutputsu   Prune Outputs 🎥🅥🅗🅢zBAutomates deletion of undesired outputs from a Video Combine node.aD  Video Combine produces a number of file outputs in addition to the final output. Some of these, such as a video file without audio included, are implementation limitations and are not feasible to solve. As an alternative, the Prune Outputs node is added to automate the deletion of these file outputs if they are not desired	filenameszQA connection from a Video Combine node to indicate which outputs should be prunedoptionszWhich files should be deletedzDelete any files that were required for intermediate processing but are not the final output, like the no-audio output file when audio is includedzUDelete all produced files that aren't the final output, including the first frame png)IntermediatezIntermediate and Utility)r'   r*   VHS_BatchManageru#   Meta Batch Manager 🎥🅥🅗🅢zKSplit the processing of a very long video into sets of smaller Meta BatcheszThe Meta Batch Manager allows for extremely long input videos to be processed when all other methods for fitting the content in RAM fail. It does not effect VRAM usage.zgIt must be connected to at least one Input (a Load Video or Load Images) AND at least one Video Combinezkhttps://github.com/Kosinkadink/ComfyUI-VideoHelperSuite/assets/4284322/7cb3fb7e-59d8-4cb2-a09f-9c6698de8b1fzIt functions by holding both the inputs and ouputs open between executions, and automatically requeue's the workflow until one of the inputs is unable to provide additional images.zBecause each sub execution only contains a subset of the total frames, each sub execution creates a hard window which temporal smoothing can not be applied across. This results in jumps in the output.z*Add all connected nodes to this Meta Batchframes_per_batchaV  How many frames to process for each sub execution. If loading as image, each frame will use about 50MB of RAM (not VRAM), and this can safely be set in the 100-1000 range, depending on available memory. When loading and combining from latent space (no blue image noodles exist), this value can be much higher, around the 2,000 to 20,000 rangeVHS_VideoInfou   Video Info 🎥🅥🅗🅢z5Splits information on a video into a numerous outputsrF   z!A connection to a Load Video nodezThe frame rate of the videoz]How many total frames the video contains before accounting for frame rate or select_every_nthz-The length of images just returned in secondsz	The widthz
The heightzThe frame rate after accounting for force_rate and select_every_nth. This output is of particular use as it can be connected to the converted frame_rate input of a Video Combine node to ensure audio remains synchronized.zpThe number of frames returned by the current execution. Identical to the frame_count returned by the node itselfzNThe duration in seconds of returned images after accounting for frame_load_capzjThe width of the video after scaling. These coordinates are in image space even if loading to latent spacezkThe height of the video after scaling. These coordinates are in image space even if loading to latent space)
   source_fps🟨   source_frame_count🟨   source_duration🟨   source_width🟨   source_height🟨   loaded_fps🟦   loaded_frame_count🟦   loaded_duration🟦   loaded_width🟦   loaded_height🟦VHS_VideoInfoSourceu"   Video Info Source 🎥🅥🅗🅢ztSplits information on a video into a numerous outputs describing the file itself without accounting for load optionszThe original widthzThe original height)rj   rk   rl   rm   rn   VHS_VideoInfoLoadedu"   Video Info Loaded 🎥🅥🅗🅢zrSplits information on a video into a numerous outputs describing the file itself after accounting for load optionsz{The width of the video after scaling. This is the dimension of the corresponding image even if loading as a latent directlyz|The height of the video after scaling. This is the dimension of the corresponding image even if loading as a latent directly)ro   rp   rq   rr   rs   VHS_SelectFilenameu$   VAE Select Filename 🎥🅥🅗🅢zcSelect a single filename from the VHS_FILENAMES output by a Video Combine and return it as a stringa;  Take care when combining this node with Prune Outputs. The VHS_FILENAMES object is immutable and will always contain the full list of output files, but execution order is undefined behavior (currently, Prune Outputs will generally execute first) and SelectFilename may return a path to a file that no longer exists.z)A VHS_FILENAMES from a Video Combine nodefilenamezCA string representation of the full output path for the chosen fileindexz]The index of which file should be selected. The default, -1, chooses the most complete outputVHS_VAEEncodeBatchedu#   VAE Encode Batched 🎥🅥🅗🅢z>Encode images as latents with a manually specified batch size.zSome people have ran into VRAM issues when encoding or decoding large batches of images. As a workaround, this node lets you manually set a batch size when encoding images.z}Unless these issues have been encountered, it is simpler to use the native VAE Encode or to encode directly from a Load VideozThe images to be encoded.zThe VAE to use when encoding.)pixelsr5   rG   zThe encoded latents.	per_batchz5The maximum number of images to encode in each batch.VHS_VAEDecodeBatchedu#   VAE Decode Batched 🎥🅥🅗🅢z=Decode latents to images with a manually specified batch sizezSome people have ran into VRAM issues when encoding or decoding large batches of images. As a workaround, this node lets you manually set a batch size when decoding latents.zUnless these issues have been encountered, it is simpler to use the native VAE Decode or to decode from a Video Combine directlyzThe latents to be decoded.zThe VAE to use when decoding.)samplesr5   rD   zThe decoded images.z5The maximum number of images to decode in each batch.VHS_SplitLatentsu   Split Latents 🎥🅥🅗🅢z&Split a set of latents into two groupslatentszThe latents to be split.zThe first group of latentsz}The number of latents in group A. This will be equal to split_index unless the latents input has length less than split_indexzThe second group of latentsz The number of latents in group B)LATENT_AA_countLATENT_BB_countsplit_indexzGThe index of the first latent that will be in the second output groups.VHS_SplitImagesu   Split Images 🎥🅥🅗🅢z%Split a set of images into two groupsr2   zThe images to be split.zThe first group of imagesz{The number of images in group A. This will be equal to split_index unless the images input has length less than split_indexzThe second group of imageszThe number of images in group B)IMAGE_Ar   IMAGE_Br   VHS_SplitMasksu   Split Masks 🎥🅥🅗🅢z$Split a set of masks into two groupsrP   zThe masks to be split.zThe first group of maskszxThe number of masks in group A. This will be equal to split_index unless the mask input has length less than split_indexzThe second group of maskszThe number of masks in group B)MASK_Ar   MASK_Br   VHS_MergeLatentsu   Merge Latents 🎥🅥🅗🅢z<Combine two groups of latents into a single group of latents)	latents_A	latents_BzThe combined group of latentsz The length of the combined group)rG   r&   r+   r,   r-   )r+   r,   cropVHS_MergeImagesu   Merge Images 🎥🅥🅗🅢z:Combine two groups of images into a single group of images)images_Aimages_BzThe combined group of images)rD   r&   VHS_MergeMasksu   Merge Masks 🎥🅥🅗🅢z8Combine two groups of masks into a single group of masks)mask_Amask_BzThe combined group of masks)rU   r&   VHS_GetLatentCountr/   latentVHS_GetImageCountr	   VHS_GetMaskCountVHS_DuplicateLatentsu   Repeat Latents 🎥🅥🅗🅢z1Append copies of a latent to itself so it repeatszThe latents to be repeatedzThe latent with repeatszZThe number of latents in the output. Equal to the length of the input latent * multiply_bymultiply_byzWControls the number of times the latent should repeat. 1, the default, means no change.VHS_DuplicateImagesu   Repeat Images 🎥🅥🅗🅢z0Append copies of a image to itself so it repeatsIMAGESzThe image to be repeatedzThe image with repeatszWThe number of image in the output. Equal to the length of the input image * multiply_byzUControls the number of times the mask should repeat. 1, the default, means no change.VHS_DuplicateMasksu   Repeat Masks 🎥🅥🅗🅢z/Append copies of a mask to itself so it repeatsmaskszThe masks to be repeatedzThe mask with repeatszUThe number of mask in the output. Equal to the length of the input mask * multiply_byVHS_SelectEveryNthLatentr0   VHS_SelectEveryNthImage)r    u   Unbatch 🎥🅥🅗🅢z7Unbatch a list of items into a single concatenated itemzFUseful for when you want a single video output from a complex workflowz/Has no relation to the Meta Batch system of VHSbatchedz)Any input which may or may not be batched	unbatchedzA single output element. Torch tensors are concatenated across dim 0, all other types are added which functions as concatenation for strings and arrays, but may give undesired results for other typesu   Select Latest 🎥🅥🅗🅢zWExperimental virtual node to select the most recently modified file from a given folderzrAssists in the creation of workflows where outputs from one execution are used elsewhere in subsequent executions.zbA path which can consist of a combination of folders and a prefix which candidate files must matchz`A string which chich the selected file must end with. Useful for limiting to a target extension.)r8   filename_postfixFilenamezEA string representing a file path to the most recently modified file.)VHS_SelectEveryNthMaskVHS_UnbatchVHS_SelectLatestc                    [        U [        5      (       a  US:  a  SOSnSnU  Hy  nUS:X  a  M  UR                  S5      nU(       a  US [        S5      *  nOUnU R	                  SS5      (       d  U(       a  SOSnUS	U S
U SU SU S[        X   US-   S9 S3-  nM{     U$ [        U [        5      (       a:  US:X  a  US-  nSnOSnSnX0S   -  nU SS   H  nUSU S[        XS9 S3-  nM     U$ [        U 5      $ )N   g?r    	collapsed
_collapsedFz VHS_precollapsez<div vhs_title="z#" style="display: flex; font-size: zem" class="VHS_collapsezy"><div style="color: #AAA; height: 1.5em;">[<span style="font-family: monospace">-</span>]</div><div style="width: 100%">z: )depthz</div></div>    z<div style="font-size: zem">r   )r   r   endswithlengetas_htmlr   str)	entryr   sizehtmlr   collapse_singlenamecollapse_flagis	            r   r   r   A  s   %aisQAKjj6O,3|,,-27))K2O2OSb.hjM'v-RSWRXXqr  rA  AA  BF  AG  GI  JQ  RW  RZ  bg  hi  bi  Jj  Ik  kw  x  xD  %A:QJEDDaqrA.tfE'!:Q9RRXYYD u:r
   c                 J   [          HA  nUR                  S5      (       a  US [        S5      *  n[        [         U   5      X   l        MC     / nU  H)  n[        X   S5      (       a  M  UR                  U5        M+     [        U5      S:  a  [        R                  " SU5        g g )Nr   DESCRIPTIONr   z&Some nodes have not been documented %s)	descriptionsr   r   r   r   hasattrr   r   warning)nodesr   undocumented_nodess      r   format_descriptionsr   ]  s    ::l##%C%%&A&|A7  ux//%%a(  "?AST #r
   )NNNN)r   )
r   r	   r   r   r   r%   common_descriptionsr   r   r   r   r
   r   <module>r      sA   Oy1!
^ X32<:	 ; Mf	
wx>\L: 4Z@u5v'
 
7
 A*MuBv'
 *7

 i !x
9) Vr7Dl9m86 k		
 F Y L Ow p
 B B;~BD 
 kn	
)p r@ 1:>c3d e } P
 &<3sg t C Xy{__ L O#k _
Arx >
  LP  AQh e } P
 &:3sg t C Xy{_l O#k _
yrp <jIo>p e } P
 &<3sg 23no  sF  GQ  sR  R C Xy{__ L O r
qrf I:  W\  L]h e } P
 &:3sg 23no  sF  GQ  sR  R C Xy{__ L O r
gr^ 3Z  AE  6F  e
 &:< ~_l %B b
_r@ >
K~@  e
 &:<   CV  Wa  Cb  b__[ b
Arb <jIp>qW
 &:
 225H5TT T  gG !BVC D b	
cr@ 8*Eq:r	$ 77:Mj:YYf
ArR @*M{B| P	$ 1dC#m		
Srj F
  TL  IM J<
 
\
kr| F
  TL  IM J[
 
B
}rN 7  EI  :J Kh
 
4 s +C
Ord <j  JW  ?X om	
wx { O	C 
  v
er~ 1:>u3v9
 9 $C O(* z $V p J L
r` >
  LB  AC9
 9 $C O13
arx >
  L@  AA9
 z $V p [ ]
yrP	 ?  Mr  Bs B@
 
Z
 
q
	Q	rj	 @*  NN  CO s D-.

 
)
 
M

k	rF
 @*  NM  CN t G/.

 
'
 
M

G
rd
 7Dl9m-
 2 T26	
 	`
e
rB 7Dk9l+
 0 R05	
 	`
Cr` 5zBh7i(
 . O.4	
 	`
ar~ 9:  GE  <F11

 34

 ..>?+N;#M2
r^ 7  EA  :B//

 14

 ..>?+N;#M2
_r~ 5zB|7},,

 /4

 ..>?+N;#M2
r^ +&9*&ExP_r` %8%DgNarb $7
$CVLcrd >
K~@/
 -n

 	p

er| <jI{>|,
 +k

 	n

}rT :JGx<y+
 +i

 	n

Url ,?@P,QS[ \mrn {+>?O+PRYZorr **=>N*OQW`fg
 -j9r.sL5>
 
  `
	 8  E^  :_x~

 
\
		Qrh8
Ur
   