
    %Vji=                    r   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZmZmZ d dlZd dlmZ d dl m!Z!m"Z" d d	l#m$Z$m%Z% d d
l&m'Z' d dl(m)Z)  e!j*                    rd dl+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2 n$dededdfdZ/dededdfdZ0dededdfdZ1de3fdZ2dZ4ej5        6                    e7          Z8ej5        9                    ej5        9                    e8                    Z:ej5        ;                    e:d          Z<ej        =                    d          Z>ej        =                    d          Z?ej        dk    Z@e@rdndZA ejB        eC          ZD ejE        d          deFdeFfd            ZGdeFfdZHejI        d eFddfd!            ZJ G d" d#          ZKejI        d eFddfd$            ZLdeFfd%ZMd&e3deNeFeFf         fd'ZOd(eFd)eFd*eFd+eFdeFf
d,ZPejI        d-eFde3fd.            ZQejI        d-eFde3fd/            ZRejI        d-eFde3fd0            ZSejI        d-eFde3fd1            ZTejI        d-eFde3fd2            ZUejI        de3fd3            ZVejI        de3fd4            ZWejI        de3fd5            ZXejI        de3fd6            ZYejI        de3fd7            ZZejI        d eFdeFfd8            Z[d9e\eF         d:e\eF         ddfd;Z]d<e\eF         de\eF         fd=Z^d>eFddfd?Z_d>eFddfd@Z`dAeFdBeFddfdCZadAeFdBeFddfdDZbdEeFdeFfdFZc G dG dH          ZdddJe3de\eF         fdKZeddMeFde\eF         fdNZfd-eFde\eF         fdOZgd-eFde\eF         fdPZhde\eF         fdQZideNe\eF         e\eF         f         fdRZj	 dd-eFdTe3deNe\eF         e\eF         f         fdUZkdVe3de\eF         fdWZl	 	 	 dd-eFdVe3dJe3dXeeF         dTe3deNe\eF         e\eF         e\eF         e\eF         e\eF         e\eF         e\eF         f         fdYZm G dZ d[ed          Znde\eF         fd\Zode\eF         fd]Zpde\eF         fd^Zqd-eFd_e3d&e3deNe\eF         e\eF         e\eF         f         fd`Zrdae%deNe\eF         e\eF         f         fdbZsdce3d_e3deNe\eF         e\eF         e\eF         f         fddZtde\eF         fdeZudeNe\eF         e\eF         f         fdfZvejI        de3fdg            ZwejI        deNe3eFf         fdh            ZxejI        d-eFdieFddfdj            ZyejI        d-eFddfdk            Zzd-eFdeNe\eF         e\eF         e\eF         e\eF         e\eF         e\eF         f         fdlZ{deNe\eF         e\eF         f         fdmZ|dne3de\eF         fdoZ}d-eFdae%dce3d_e3d&e3dne3deNe\eF         e\eF         e\eF         e\eF         e\eF         e\eF         e\eF         f         fdpZ~ G dq dren          ZddsZ ejE        dt          dueFdee         fdv            Zdwe\eF         ddfdxZ	 	 ddyeFd_e3dze3deNe\eF         e\eF         e\eF         e\eF         e\eF         e\eF         e\eF         f         fd{Z G d| d}e          Zd~eFdeNeFeFf         fdZ G d d          ZdeFdeFdBeFddfdZdS )    N)Sequence)cdllwintypes)find_library)Path)AnyOptionalUnion)dynamo_timed)configexc)invalid_vec_isaVecISA)	cache_dir)TorchVersion)_run_build_commandbuild_paths)log_global_cache_errorslog_global_cache_statslog_global_cache_valsuse_global_cacheargskwargsreturnc                      d S N r   r   s     U/root/voice-cloning/.venv/lib/python3.11/site-packages/torch/_inductor/cpp_builder.pyr   r   .           c                      d S r   r   r   s     r   r   r   1   r    r!   c                      d S r   r   r   s     r   r   r   4   r    r!   c                      dS )NFr   r   r!   r   r   r   7   s    ur!   CxxBuildz_inductor/script.ldlinuxdarwinwin32)utf-8r      searchc                    ddl m}m} | D ]}	 |t          j        dk    rt          j        d          s+ddlm}  |            } |t
          j	        
                    |d          |          }|5  t                      }d d d            n# 1 swxY w Y   t          j        |dg           |c S # t          j        t          t           f$ r Y w xY wt"          j        )	Nr   )get_lock_dirLOCK_TIMEOUTr&   TORCH_INDUCTOR_INSTALL_GXX)FileLockzg++.lock)timeout	--version)torch._inductor.codecacher-   r.   sysplatformosgetenvtorch.utils._filelockr0   pathjoininstall_gcc_via_conda
subprocesscheck_outputSubprocessErrorFileNotFoundErrorImportErrorr   InvalidCxxCompiler)r+   r-   r.   cxxr0   lock_dirlocks          r   cpp_compiler_searchrE   L   s^   DDDDDDDD  	{ <7**y!=>> ::::::'<>>xGLL:66    2 2/11C2 2 2 2 2 2 2 2 2 2 2 2 2 2 2#S+$6777JJJ*,={K 	 	 	H	

  s?   B3B3=B33BB3B	B3B	B33CCc            
         t           j                            t                      d          } t           j                            | dd          }t           j                            |          s}t
                              d           t           j                            dd          }|t          j
        d          }|+t          j        |dd	|  d
ddddgt          j                   |S )z>On older systems, this is a quick way to get a modern compilergccbinzg++zDownloading GCC via conda	CONDA_EXEcondaNcreatez	--prefix=z--channel=conda-forgez--quietz-yz
python=3.8gxx)stdout)r6   r9   r:   r   existsloginfoenvirongetshutilwhichr<   
check_callPIPE)prefixcxx_pathrJ   s      r   r;   r;   i   s    W\\)++u--Fw||FE511H7>>(## ,---
{G44=L))E!(((+ 	 "    Or!   compilerc                     	 t          j        | dgt           j                   dS # t          $ r}t	          d|  d          |d}~wt           j        $ r Y dS w xY w)zU
    Check if compiler is ready, in case end user not activate MSVC environment.
    /helpstderrz
Compiler: z is not found.N)r<   r=   STDOUTr?   RuntimeErrorr>   )rY   r   s     r   check_compiler_exist_windowsr`      s    
7 3J<MNNNNNN K K K@@@@AAsJ%   s   "& 
AAAAc                   :    e Zd ZdeddfdZddZddZdefdZdS )	WinPeFileVersionInfo	file_pathr   Nc                     || _         t          j        d          | _        |                                  |                                  d S )Nzversion.dll)rc   ctypesWinDLLversion_dll_setup_functions_get_version_info)selfrc   s     r   __init__zWinPeFileVersionInfo.__init__   sE    "!=77     r!   c                 2   t           j        t           j        g| j        j        _        t           j        | j        j        _        t           j        t           j        t           j        t           j        g| j        j	        _        t           j
        | j        j	        _        t           j        t           j        t          j        t          j                  t          j        t           j                  g| j        j        _        t           j
        | j        j        _        d S r   )r   LPCWSTRLPDWORDrg   GetFileVersionInfoSizeWargtypesDWORDrestypeLPVOIDGetFileVersionInfoWBOOLLPCVOIDre   POINTERc_void_pUINTVerQueryValueWrj   s    r   rh   z%WinPeFileVersionInfo._setup_functions   s    =
09 <D>08 NNO	9
,5 8@},4 N6?++N8=))	4
'0 3;-'///r!   c                    t          j                    }| j                            | j        t          j        |                    }|dk    rt          d| j         d          t          j        |          | _	        | j        
                    | j        d|| j	                  }|st          d| j         d          d S )Nr   zCan't get version info size of .zCan't get version info of )r   rq   rg   ro   rc   re   byrefr_   create_string_bufferversion_infort   )rj   dummysizesuccesss       r   ri   z&WinPeFileVersionInfo._get_version_info   s      77NFL//
 
 199RRRRSSS"7=="66NAtT%6
 
  	OMDNMMMNNN	O 	Or!   c                 d   t          j                    }t          j                    }| j                            | j        dt          j        |          t          j        |                    }|r|j        dk    rdS g }d}|j        t          |j        dz            D ]}|dz  }t          j
        |j        |z   d          }t                              |d d         d          }t                              |dd         d          }	|                    ||	f           nt          d           |S )Nz\VarFileInfo\Translationr         littlezBuffer is None)re   rx   r   ry   rg   rz   r   r~   valuerange	string_atint
from_bytesappendprint)
rj   	lp_bufferu_lenr   translationslang_idioffsetdata	code_pages
             r   get_language_idz$WinPeFileVersionInfo.get_language_id   s/   O%%	"11'L##L	
 
  	%+**1?&5;!+,, : :Q'	&(@!DD..bqb8<<NN4!9h??	##Wi$89999: "###r!   r   N)	__name__
__module____qualname__strrk   rh   ri   r   r   r   r!   r   rb   rb      s        !# !$ ! ! ! !@ @ @ @.O O O O"      r!   rb   c                 <   dt           t          t          f         fd}t          |           sdS t          j                            |           r| }n |            \  }}|du rdS t          |          }|                                }|dk    rt          d          dS )z
    Torch.compile() is only work on MSVC with English language pack well.
    Check MSVC's language pack: https://github.com/pytorch/pytorch/issues/157673#issuecomment-3051682766
    r   c            	      N   t           j                            t           j                            dd          ddd          } t           j                            |           sat           j                            t           j                            dd          ddd          } t           j                            |           sdS 	 | d	d
ddddddg	}t          j        |dd                                          }|sdS t           j                            |ddd          t           j                                      sdS fdt          j	                  D             }|sdS t          |d          d         }t           j                            |dddd          }t           j                            |          rd|fS t           j                            |dddd          }t           j                            |          rd|fS n# t          j        t          f$ r Y dS w xY wdS ) z=
        Finds the path to cl.exe using vswhere.exe.
        zProgramFiles(x86)zC:\Program Files (x86)zMicrosoft Visual Studio	Installerzvswhere.exeProgramFileszC:\Program FilesF z-latestz-prereleasez	-products*z	-requiresz1Microsoft.VisualStudio.Component.VC.Tools.x86.x64z	-propertyinstallationPathTr)   )textencodingVCToolsMSVCc                     g | ]A}t           j                            t           j                            |                    ?|BS r   )r6   r9   isdirr:   ).0dmsvc_tools_paths     r   
<listcomp>zGcheck_msvc_cl_language_id.<locals>.get_msvc_cl_path.<locals>.<listcomp>  sM          7==oq!A!ABB      r!   )reverser   rH   HostX64x64zcl.exeHostX86x86)r6   r9   r:   rQ   rR   rN   r<   r=   striplistdirsortedCalledProcessErrorr?   )vswhere_pathcmdvs_install_pathtoolset_versionslatest_toolset_versioncl_pathr   s         @r   get_msvc_cl_pathz3check_msvc_cl_language_id.<locals>.get_msvc_cl_path   sc    w||JNN.0IJJ%	
 
 w~~l++ 	!7<<
~/BCC)	 L 7>>,// ! y<	 C"
C )5$  egg  # ! y !gll?D'6RRO7>>/22 ! y       O44     
 $ ! y%+,<d%K%K%KA%N" gll& G w~~g&& )W}$ ',,#*  7>>'** )=() -/@A 	 	 	99	 ys-   6H ;AH >"H "AH  AH H"!H"NFi	  znTorch.compile() is only support MSVC with English language pack,Please reinstall its language pack to English.)
tupleboolr   _is_msvc_clr6   r9   rN   rb   r   r_   )rY   r   cl_exe_pathb_retr   r   s         r   check_msvc_cl_language_idr      s    ReD#I. R R R Rh x   	w~~h --//{E>>F'44L**,,G$=
 
 	
 r!   c                     t           rNt          j                            dd          } t	          |           } t          |            t          |            nt          j                    rt          j
        S t          t          j        j        t          t          f          rt          t          j        j                  }nt          j        j        f}t!          |          } | S )NCXXcl)_IS_WINDOWSr6   rQ   rR   normalize_path_separatorr`   r   r   	is_fbcoder   cc
isinstancecpprB   listr   rE   )rY   r+   s     r   get_cpp_compilerr   N  s     /:>>%..+H55$X...!(++++ 	">!fjntUm44 	'6:>**FFjn&F&v..Or!   use_relative_pathc                     t           rt          d          t          j                    r't          j        }| rt          j        nt          j        }nd}d}||fS )NzWindows is not supported yet.ldobjcopy)r   r_   r   r   r   r   objcopy_fallbackr   )r   r   r   s      r   get_ld_and_objcopyr   _  sf      :;;; 		 B %),, ( G BGw;r!   
cubin_filekernel_namer   r   c                    | dz   }| d| d|  }t          j        |                                ddd           | d| }t          j        |                                ddd           t          j        dd|           }|d	| d
| dz   d| d| dz   d| d| dz   |z   }t          j        |                                ddd           |S )N.oz  -r -b binary -z noexecstack -o  T)capture_outputr   checkzB --rename-section .data=.rodata,alloc,load,readonly,data,contents z[\W]_z --redefine-sym _binary_z	_start=__z_start z--redefine-sym _binary_z_size=__z_size z_end=__z_end )r<   runsplitresub)r   r   r   r   obj_filer   	file_names          r   convert_cubin_to_objr   p  s%    D H
H
H
H
HJ
H
HCN399;;t$dKKKK
b
bX`
b
bCN399;;t$dKKKK wZ00I
MY
M
M
M
M
M	N
JI
J
J{
J
J
J	K II
H
Hk
H
H
H	I 		  N399;;t$dKKKKOr!   cpp_compilerc                     t          j        | dg                              d          }d|                                d         v S )Nr2   utf8Appler   )r<   r=   decode
splitlines)r   version_strings     r   _is_apple_clangr     sB    ,lK-HIIPPQWXXNn//11!444r!   c                    t           j        dk    rt          |           S t          rFt	          j        d|           rt          d          t          t	          j        d|                     S t          t	          j        d|                     S )Nr'   z((clang$)|(clang\+\+$))z]Please use clang-cl, due to torch.compile only support MSVC-like CLI (compiler flags syntax).z
(clang-cl)z(clang|clang\+\+))r4   r5   r   r   r   r+   r_   r   r   s    r   	_is_clangr     s     |x|,,,	 <9/>> 	o   BIm\::;;;	.==>>>r!   c                 h    t          |           rdS t          t          j        d|                     S )NFz(gcc|g\+\+|gnu-c\+\+))r   r   r   r+   r   s    r   _is_gccr     s4      u	2LAABBBr!   c                     t           sdS 	  t          j        | dgt          j                                                  j        t           }d|                                d         v S # t          $ r Y dS w xY w)NFr[   r\   	Microsoftr   )	r   r<   r=   r^   r   r   SUBPROCESS_DECODE_ARGSr   r?   )r   
output_msgs     r   r   r     s     uJ#\7$;JDUVVVUWW+- 	
 j3355a888   uus   AA( (
A65A6c                    dt           dd fd}	  t          j        | dgt          j                                                  j        t           }d|                                d         v }|rot          r$t          j
        d|           rt          d	          t          j
        d
|          }|-|                    d          } |t          |                     |S # t          $ r Y dS t          j        $ r Y dS w xY w)Ncompiler_versionr   c                 h    t           rdnd}| t          |          k     rt          d| d          dS )zw
        On Windows: early version icx has `-print-file-name` issue, and can't preload correctly for inductor.
        z2024.2.1z0.0.0z0Intel Compiler error: less than minimal version r}   N)r   r   r_   )r   min_versions     r   _check_minimal_versionz2_is_intel_compiler.<locals>._check_minimal_version  sM     %0<jjWl;7777Q;QQQ   87r!   r2   r\   Intelr   z((icx$)|(icx-cc$))z[Please use icx-cl, due to torch.compile only support MSVC-like CLI (compiler flags syntax).z(\d+[.]\d+[.]\d+[.]\d+)r*   F)r   r<   r=   DEVNULLr   r   r   r   r   r   r+   r_   groupr?   r>   )r   r   r   is_intel_compilericx_ver_searchicx_vers         r   _is_intel_compilerr    sL    $    J#{+J4F   UWW+	- 	 $z'<'<'>'>q'AA 	> 92LAA &u  
  Y'A:NNN)(..q11&&|G'<'<===     uu%   uus   CC 
C>,C>=C>c                  8    t          t                                S r   )r   r   r   r!   r   is_gccr    s    #%%&&&r!   c                  8    t          t                                S r   )r   r   r   r!   r   is_clangr    s    %''(((r!   c                  8    t          t                                S r   )r  r   r   r!   r   r   r     s    .00111r!   c                  8    t          t                                S r   )r   r   r   r!   r   is_apple_clangr	    s    +--...r!   c                  8    t          t                                S r   )r   r   r   r!   r   
is_msvc_clr    s    '))***r!   c                    t           j                                        }d|d<   	  t          j        | dgt          j        |          j        t           }nT# t          $ rG 	  t          j        | dgt          j        |          j        t           }n# t          $ r Y Y dS w xY wY nw xY w|	                    dd          }|	                    d	d          }|S )
NCLC_ALLz-v)r]   envr2   r   r   
)
r6   rQ   copyr<   r=   r^   r   r   	Exceptionreplace)rY   r  r   s      r   get_compiler_version_infor    s   
*//

CCM
0tZ%6C
 
 

(*    	Z4;'
0As  ,.NN  	 	 	222	 N $++D#66N#++D#66Ns5   0A 
B'!0BB'
B!B' B!!B'&B'	dest_listsrc_listc                 D    |                      d |D                        d S )Nc              3   >   K   | ]}t          j        |          V  d S r   r  deepcopy)r   items     r   	<genexpr>z_append_list.<locals>.<genexpr>  s,      >>TT]4((>>>>>>r!   )extend)r  r  s     r   _append_listr    s+    >>X>>>>>>>>r!   	orig_listc                 F    g }| D ]}||vr|                     |           |S r   r   )r   new_listr  s      r   _remove_duplication_in_listr$    s9    H " "xOOD!!!Or!   path_dirc                    t           j                            |           sf	 t          |                               dd           d S # t
          $ r2}|j        t          j        k    rt          d|            Y d }~d S d }~ww xY wd S )NT)parentsexist_okzFail to create path )	r6   r9   rN   r   mkdirOSErrorerrnoEEXISTr_   )r%  r   s     r   _create_if_dir_not_existr-  !  s    7>>(## 	NN   ===== 	 	 	yEL(("5855   )(((((	 s   $A 
B'A>>Bc                    t           j                            |           rt          j        | d          D ]x\  }}}|D ]6}t           j                            ||          }t          j        |           7|D ]6}t           j                            ||          }t          j        |           7yt          j        |            d S d S )NF)topdown)r6   r9   rN   walkr:   removermdir)r%  rootdirsfilesnamerc   dir_paths          r   _remove_dirr8  ,  s    	w~~h !#5!A!A!A 	# 	#D$ % %GLLt44		)$$$$ # #7<<d33""""# 	 r!   cmd_linecwdc                 Z   t          j        |           }	 t          j        ||dt          j        t          j                   d S # t          j        $ rV}|j                            d          }d|v pd|v }|rt          j
        dk    rd}||z  }t          j        ||          |d }~ww xY w)NT)r:  r   rM   r]   r)   z'omp.h' file not foundlibompr'   a  

OpenMP support not found. Please try one of the following solutions:
(1) Set the `CXX` environment variable to a compiler other than Apple clang++/g++ that has builtin OpenMP support;
(2) install OpenMP via conda: `conda install llvm-openmp`;
(3) install libomp via brew: `brew install libomp`;
(4) manually setup OpenMP and set the `OMP_PREFIX` environment variable to point to a path with `include/omp.h` under it.)shlexr   r<   r   rV   r^   r   rM   r   r4   r5   r   CppCompileError)r9  r:  r   eoutputopenmp_probleminstructions          r   _run_compile_cmdrC  8  s    
+h

C6SZ_ZEV	
 	
 	
 	
 	
 	
 ( 6 6 6))1V;Qx6?Q 
	"clh662  k!F!#v..A56s   -A B*AB%%B*c                 v    t          d          5  t          | |           d d d            d S # 1 swxY w Y   d S )Ncompile_file)r   rC  )r9  r:  s     r   run_compile_cmdrF  O  s    	n	%	% ( (3'''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s   .22	orig_pathc                 T    t           r |                     t          j        d          S | S )N/)r   r  r6   sep)rG  s    r   r   r   T  s(     .  ---r!   c                   .   e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 d&dedeee                  deee                  deee                  d	eee                  d
eee                  deee                  deee                  dedededededdfdZd'dZ	d'dZ
d'dZdefdZdee         fdZdee         fdZdee         fdZdee         fdZdee         fdZdee         fdZdee         fdZdefdZdefd Zdefd!Zdefd"Zdefd#Zd$eddfd%ZdS )(BuildOptionsBasez
    This is the Base class for store cxx build options, as a template.
    Actually, to build a cxx shared library. We just need to select a compiler
    and maintains the suitable args.
    r   NFrY   definitionsinclude_dirscflagsldflagslibraries_dirs	librariespassthrough_argsaot_moder   compile_onlyprecompilingpreprocessingr   c                     || _         |pg | _        |pg | _        |pg | _        |pg | _        |pg | _        |pg | _        |pg | _        d | _        |	| _	        |
| _
        || _        || _        || _        d S r   )	_compiler_definitions_include_dirs_cflags_ldflags_libraries_dirs
_libraries_passthrough_argsprecompiled_header	_aot_mode_use_relative_path_compile_only_precompiling_preprocessing)rj   rY   rM  rN  rO  rP  rQ  rR  rS  rT  r   rU  rV  rW  s                 r   rk   zBuildOptionsBase.__init__a  s      "'2'8b(4(:"(,B#*=b*8*>B%._",<,B 26'(9#/#/$1r!   c                 4    | j         rg | _        g | _        d S d S r   )rd  r^  r_  r{   s    r   _process_compile_only_optionsz.BuildOptionsBase._process_compile_only_options  s*     	!#%D  DOOO	! 	!r!   c                 d   t          | j                  | _        t          | j                  | _        t          | j                  | _        t          | j                  | _        t          | j                  | _        t          | j                  | _        t          | j                  | _        d S r   )r$  rZ  r[  r\  r]  r^  r_  r`  r{   s    r   _remove_duplicate_optionsz*BuildOptionsBase._remove_duplicate_options  s    78IJJ89KLL24<@@3DMBB:4;OPP5doFF!<T=S!T!Tr!   c                 V    |                                   |                                  d S r   )rh  rj  r{   s    r   _finalize_optionsz"BuildOptionsBase._finalize_options  s,    **,,,&&(((((r!   c                     | j         S r   )rY  r{   s    r   get_compilerzBuildOptionsBase.get_compiler  
    ~r!   c                     | j         S r   )rZ  r{   s    r   get_definitionsz BuildOptionsBase.get_definitions  s      r!   c                     | j         S r   )r[  r{   s    r   get_include_dirsz!BuildOptionsBase.get_include_dirs      !!r!   c                     | j         S r   )r\  r{   s    r   
get_cflagszBuildOptionsBase.get_cflags  s
    |r!   c                     | j         S r   )r]  r{   s    r   get_ldflagszBuildOptionsBase.get_ldflags  s
    }r!   c                     | j         S r   )r^  r{   s    r   get_libraries_dirsz#BuildOptionsBase.get_libraries_dirs  s    ##r!   c                     | j         S r   )r_  r{   s    r   get_librarieszBuildOptionsBase.get_libraries  s
    r!   c                     | j         S r   )r`  r{   s    r   get_passthrough_argsz%BuildOptionsBase.get_passthrough_args  s    %%r!   c                     | j         S r   )rb  r{   s    r   get_aot_modezBuildOptionsBase.get_aot_mode  ro  r!   c                     | j         S r   )rc  r{   s    r   get_use_relative_pathz&BuildOptionsBase.get_use_relative_path  s    &&r!   c                     | j         S r   )rd  r{   s    r   get_compile_onlyz!BuildOptionsBase.get_compile_only  rt  r!   c                     | j         S r   )re  r{   s    r   get_precompilingz!BuildOptionsBase.get_precompiling  rt  r!   c                     | j         S r   )rf  r{   s    r   get_preprocessingz"BuildOptionsBase.get_preprocessing  s    ""r!   filec                 *   |                                  |                                 |                                 |                                 |                                 |                                 |                                 |                                 |                                 | 	                                | 
                                d}t          |d          5 }t          j        ||           d d d            d S # 1 swxY w Y   d S )N)rY   rM  rN  rO  rP  rQ  rR  rS  rT  r   rU  w)rn  rq  rs  rv  rx  rz  r|  r~  r  r  r  openjsondump)rj   r  attrsfs       r   save_flags_to_jsonz#BuildOptionsBase.save_flags_to_json  s4   ))++//11 1133oo''''))"5577++-- $ 9 9 ; ;))++!%!;!;!=!= 1133
 
 $__ 	 IeQ	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	    %DDD)r   NNNNNNNFFFFFr   )r   r   r   __doc__r   r	   r   r   rk   rh  rj  rl  rn  rq  rs  rv  rx  rz  r|  r~  r  r  r  r  r  r  r   r!   r   rL  rL  Z  s         +/,0&*'+.2)-04"'""#"2 "2"2 d3i("2 tCy)	"2
 c#"2 $s)$"2 !c+"2 DI&"2 #49-"2 "2  "2 "2 "2 "2 
"2 "2 "2 "2H! ! ! !
U U U U) ) ) )c    !c ! ! ! !"$s) " " " "DI    T#Y    $DI $ $ $ $tCy    &d3i & & & &d    't ' ' ' '"$ " " " ""$ " " " "#4 # # # # s  t            r!   rL  Twarning_allc                 "    t           s| rdgng S g S )NWallr   )r  s    r   _get_warning_all_cflagr    s      &.xxB.	r!   c++17std_numc                 .    t           r		 d} d|  gS d|  gS )Nzc++20zstd:zstd=r  )r  s    r   _get_cpp_std_cflagr    s8     "	  w  !! w  !!r!   c                     t           rg d}naddg}t          |           r*t          j        j        rdnd}|                    |           t          |           r|                    d           |S )N)wd4819wd4251wd4244wd4267wd4275wd4018wd4190wd4624wd4067wd4068EHsczZc:__cpluspluszpermissive-zWno-unused-variablezWno-unknown-pragmasz$Werror=ignored-optimization-argumentz!Wno-ignored-optimization-argumentpedantic)r   r   r   aot_inductor#raise_error_on_ignored_optimizationr   r   )r   rO  ignored_optimization_arguments      r   _get_os_related_cpp_cflagsr    s     &
 
 
& ()>?\"" 	9 &J9668 *
 MM7888<   	& MM*%%%Mr!   c                 F    g }t           r|                    d           n	 |S )NNOMINMAXr   r   )r   os_definitionss     r   _get_os_related_cpp_definitionsr    s1     "N  	j))))r!   c                  ,   t           rg } ng d} |                     d           t          j        j        s|                     d           |                     dt          j        j                    t                      r|                     d           | S )N)zfno-trapping-mathzfunsafe-math-optimizationszffinite-math-onlyzfno-signed-zeroszfno-math-errnozfno-finite-math-onlyzfno-unsafe-math-optimizationszffp-contract=zfexcess-precision=fast)r   r   r   r   enable_unsafe_math_opt_flag#enable_floating_point_contract_flagr  )flagss    r   _get_ffast_math_flagsr    s     3
 
 
 	+,,,z5 	:LL8999UVZ%SUUVVV88 	3LL1222Lr!   c                  \    g } g }t           r	ddg} g d}n|                     d           | |fS )z
    When we turn on generate debug symbol.
    On Windows, it should create a [module_name].pdb file. It helps debug by WinDBG.
    On Linux, it should create some debug sections in binary file.
    ZI_DEBUG)DEBUGzASSEMBLYDEBUG zOPT:REFzOPT:ICFgr  )rO  rP  s     r   !_get_inductor_debug_symbol_cflagsr  3  sI     FG !CCCc7?r!   Fmin_optimizec                    g }g }t           j        j        p#t          j                            dd          dk    }t           j        j        }|r6t                      \  }}t          r|g dz  }n-|	                    d           nt          r|rdndg}n|r|ndd	g}|t                      z  }t          rnt          j        d
k    ryt          |           r|	                    d           t          j                    sBt          j                    dk    r|	                    d           n|	                    d           t           j        j        r$t#          |           r|	                    d           ||fS )NTORCHINDUCTOR_DEBUG_SYMBOL01)OdOb0zOy-O0O1O2O3DNDEBUGr'   zfno-tree-loop-vectorizeppc64lezmcpu=nativezmarch=native	flto=thin)r   r  debug_compiler6   rQ   rR   compile_wrapper_opt_levelr  r   r   r  r4   r5   r   r   machine
enable_ltor   )r   r  rO  rP  b_debug_buildwrapper_opt_levels         r   _get_optimization_cflagsr  E  s    FG 	) 	D:>>6<<C  +E 
N;== 	 ****FFMM$ 	N*4dd5FF+7A''T9MF
#%%%F '<8##|$$ 97888 #%% 2#%%22MM-0000MM.111) 	'i.E.E 	'MM+&&&7?r!   do_linkc                     t           r	 ddgS | sdgS t          j                    dk    rdt                      v rg dS ddgS )NDLLMDfPICDarwinclang)sharedr  zundefined dynamic_lookupr  )r   r5   systemr   )r  s    r   _get_shared_cflagsr  t  se     	 t} xH$$4D4F4F)F)F====fr!   extra_flagsc                    g }g }g }g }g }	g }
g }t          | |          \  }}|t          |          z   t          |          z   t                      z   t	          |           z   }|t          |           z  }t          sJt          j        j	        r9t          |           r*|                    d           |                    d           |                    d                    |                     |||||z   |	|
|fS )Nzfuse-ld=lldr  r   )r  r  r  r  r  r  r   r   r  r  r   r   r:   )r   r  r  r  r  rM  rN  rO  rP  rQ  rR  rS  
opt_cflagsopt_ldflagss                 r   get_cpp_optionsr    s+     K LFG "NI"$6|\RRJ 	
W
%
%	&
 
-
-	. 

	 %\
2
2		3  2<@@@K $6.9 $i>U>U $}%%%{###CHH[11222 	+ r!   c                   f     e Zd ZdZ	 	 	 	 	 	 	 	 ddededee         d	ed
ededededdf fdZ xZS )
CppOptionsaH  
    This class is inherited from BuildOptionsBase, and as cxx build options.
    This option need contains basic cxx build option, which contains:
    1. OS related args.
    2. Toolchains related args.
    3. Cxx standard related args.
    Note:
    1. This Options is good for assist modules build, such as x86_isa_help.
    FTr   r   rU  r  r  r   rY   r  rV  rW  r   Nc	                    t                                          ||||           |r|nt                      | _        t	          | j        |p|p| |||          \  }	}
}}}}}t          | j        |	           t          | j        |
           t          | j        |           t          | j	        |           t          | j
        |           t          | j        |           t          | j        |           |                                  d S )N)rU  r   rV  rW  )r   r  r  r  r  )superrk   r   rY  r  r  rZ  r[  r\  r]  r^  r_  r`  rl  )rj   rU  r  r  r   rY   r  rV  rW  rM  rN  rO  rP  rQ  rR  rS  	__class__s                   r   rk   zCppOptions.__init__  s4    	%/%'	 	 	
 	
 	
 &.E3C3E3E %FFG##%
 
 
	
 	T&444T'666T\6***T]G,,,T)>:::T_i000T+-=>>>     r!   )FTr   Fr   FFF)	r   r   r   r  r   r   r   rk   __classcell__r  s   @r   r  r    s          # %'"'""#*! *!*! *! c]	*!
  *! *! *! *! *! 
*! *! *! *! *! *! *! *! *! *!r!   r  c                  
    ddgS )NTORCH_INDUCTOR_CPP_WRAPPERSTANDALONE_TORCH_HEADERr   r   r!   r   !_get_torch_cpp_wrapper_definitionr    s    (*CDDr!   c                      dgS )Nz" C10_USING_CUSTOM_GENERATED_MACROSr   r   r!   r   _use_custom_generated_macrosr    s    011r!   c                  J    t           st          j                    rg d} | S g S g S )N)C10_USE_GLOGC10_USE_MINIMAL_GLOG$C10_DISABLE_TENSORIMPL_EXTENSIBILITY)r   r   r   )fb_internal_macross    r   _use_fb_internal_macrosr    s?      	" " "
 &%I	r!   rT  c                 d   g }g }g }t           r|||fS t          j                    r|                    d           |                    t          j                   |                    t          j                   |                    t          j                   |                    t          j                   |                    t          j	                   |                    t          j
                   |                    t          j                   |                    t          j                   |                    t          j                   |                    d           |r
|st          }n$t          j                            t                    }t%          |           r|                    d           |                    d           |                    d|            |                    dt          j        z              |                    dt          j        z              |||fS )Nnostdincincludez --rtlib=compiler-rtz -fuse-ld=lldz -Wl,--script=z -Bz -L)r   r   r   r   r   sleef_includeopenmp_includepython_include
cc_includelibgcc_includelibgcc_arch_includelibgcc_backward_includeglibc_includelinux_kernel_include_LINKER_SCRIPTr6   r9   basenamer   	glibc_lib)r   rT  r   rO  rN  rS  linker_scripts          r   _setup_standard_sys_libsr    s   
 F L"$ 6|%555 Cj!!! 	K5666K6777K6777K2333K6777K;<<<K?@@@K5666K<===I&&& 	=- 	=*MMG,,^<<M\"" 	C##$:;;;##O444##$D]$D$DEEE##EK,A$ABBB##EK,A$ABBB<!111r!   vec_isac                 :   g }g }| t           k    r|                    d |                                 D                        |                                 g}t	          j                    r0t          |                                           }d| d| d| dg}||fS )Nc              3   >   K   | ]}t          j        |          V  d S r   r  )r   xs     r   r  z0_get_build_args_of_chosen_isa.<locals>.<genexpr>-  s,      FF1dmA&&FFFFFFr!   zCPU_CAPABILITY=CPU_CAPABILITY_HAVE__CPU_DEFINITION)r   r  build_macrobuild_arch_flagsr   r   r   upper)r  macrosbuild_flagscaps       r   _get_build_args_of_chosen_isar  (  s    FK/!!FF0C0C0E0EFFFFFF//112 	g,,$$&&C'#'''#'',,,,F ;r!   include_pytorchc                     ddl m}m}  |            }|g}g }t          j        dk    r.t          j                    sddg}|s|                    d           t          r|                    d           |||fS )Nr   )include_pathsTORCH_LIB_PATHr'   torch	torch_cputorch_pythonsleef)	torch.utils.cpp_extensionr  r  r4   r5   r   r   r   r   )r  rT  r  r  rN  rQ  rR  s          r   _get_torch_related_argsr  <  s     HGGGGGGG =??L$%NI
|x(8(:(:k*	 	-^,,, "!!!22r!   c                     t          t          j        d                    } |                                 sYt	          j                    dk    rBt          t          j        d                    }|j        j        dz                                  } | dz                                  s$t          j	        dt          |                       t          |           gS )Nr  r  stdlibHeaderszPython.hzCan't find Python.h in )r   	sysconfigget_pathrN   r5   r  parentabsolutewarningswarnr   )include_dirstd_libs     r   _get_python_include_dirsr)  O  s    y))4455K  EHO$5$5$A$Ay)(3344~,y8BBDD*$,,.. DBK0@0@BBCCCr!   c                     t                      } t          j        dt          rdnd          }||                     |           t          rLt          t          t          j        dd                    j        dz                                            g}nt          j	        d          g}t          j                    r|                     t          j                   | |fS )Nr  ntposix_prefix)schemelibsLIBDIR)r)  r!  r"  r   r   r   r   r#  r$  get_config_varr   r   r   r  )python_include_dirspython_include_pathpython_lib_paths      r   _get_python_related_argsr4  \  s    244#,+A$$>   &""#6777 	?+IdCCCDDKfT(** 
 %3H==> ?"";#=>>>//r!   c                      	 d} t          j        |                                                               d          }t	          t          j        |                    dk    S # t           j        t          f$ r Y dS w xY w)Nzconda list llvm-openmp --jsonr   r   F)	r<   r=   r   r   lenr  loadsr>   r?   )commandr@  s     r   is_conda_llvm_openmp_installedr9  u  sz    1(99@@HH4:f%%&&**&(9:   uus   AA" "A<;A<c                     	 t          j        d          dS t          j        g d                              d                                          } t          j                            |           }|| fS # t          j	        $ r Y dS w xY w)Nbrewr   )r;  z--prefixr<  r   )
rS   rT   r<   r=   r   r   r6   r9   rN   r>   )libomp_pathomp_availables     r   homebrew_libompr>    s    <'9
 #$B$B$BCCVF^^UWW 	 {33k))%   yys   A6 AA6 6B	B	omp_namec                 r   	 t          j        | dg                              d          }t          j                            |                                |          }t          j                            |          r%dt          j        d<   t          j
        |           d S d S # t           j        $ r Y d S w xY w)Nz-print-file-name=binr   TRUEKMP_DUPLICATE_LIB_OK)r<   r=   r   r6   r9   r:   rstripisfilerQ   r   LoadLibraryr>   )r   r?  r@  omp_paths       r   perload_clang_libomp_winrG    s    	(,8N)OPPWW
 
 7<<::7>>(## 	'17BJ-.X&&&&&	' 	' %   s   BB# #B65B6c                 d    dt           dt           dt          fd}	 g d}|D ]} || |           d S )Nr   lib_namer   c                 H   	  t          j        | d| gt           j                  j        t           }|                                }t          j                            |          r%dt          j	        d<   t          j        |           dS n# t           j        $ r Y nw xY wdS )Nz-print-file-name=r\   rA  rB  TF)r<   r=   r   r   r   rC  r6   r9   rD  rQ   r   rE  r>   )r   rI  r@  rF  s       r   _load_icx_built_in_lib_by_namez>perload_icx_libomp_win.<locals>._load_icx_built_in_lib_by_name  s    	Z,=8==>!)   ,.F }}Hw~~h'' 5;
12 ***t ) 	 	 	D	us   BB BB)zlibiomp5md.dllzsvml_dispmd.dllz
libmmd.dll)r   r   )r   rK  preload_listrI  s       r   perload_icx_libomp_winrM    sr    S C D      L ! ? ?&&|X>>>>? ?r!   c                    g }g }g }g }g }g }t           r|                    d           |                    d           t          |            }t          j        d          }|t          j                            |dd          }	t          j                            |	          }
|
rg|                    t          j                            |d                     |                    t          j                            |d                     nt          j	        d           |p|
}|s|                    d           t          j        d	          }|s|t                      }|rt          j                            |d          }|                    t          j                            |d                     |                    |           t          j                    j        d
k    rRt          j                            t          j                            |d                    r|                    d           |syt                      \  }}|rf|                    t          j                            |d                     |                    t          j                            |d                     nt          r	 t          |           r<|                    d           |                    d           t!          | d           nlt#          |           r;|                    d           |                    d           t%          |            n"|                    d           |                    d           nt'          j                    r[|                    t*          j                   t*          j        }d| }|                    |           |                    d           nt          |           r+|                    d           |                    d           nOt#          |           r|                    d           n*|                    d           |                    d           ||||||fS )NXclangfopenmp
OMP_PREFIXr  zomp.hlibz-environment variable `OMP_PREFIX` is invalid.ompCONDA_PREFIXx86_64zlibiomp5.dylibiomp5openmpr<  z
libomp.dllQiopenmp
libiomp5mdzopenmp:experimentalz-Wp,-fopenmp gompfiopenmp)	_IS_MACOSr   r   r6   r7   r9   r:   rN   r%  r&  r9  unamer  r>  r   r   rG  r  rM  r   r   r   r  openmp_lib_so)r   rO  rP  include_dir_pathslib_dir_pathsr.  rS  r=  
omp_prefixheader_path	valid_envconda_prefixconda_lib_pathr<  
openmp_libfb_openmp_extra_flagss                   r   _get_openmp_argsrh    s-    FG#%!MD"$ ]$hi    ,L999 Y|,,
!',,z9gFFK{33I O!((j))L)LMMM$$RW\\*e%D%DEEEEMNNN)6YM 	KK y00 
	)!9:<<M )!#lE!B!B!((lI)N)NOOO$$^4448::%11bgnnGLL1ABB7 71 KK(((  	G)8):):&M; G!((k9)M)MNNN$$RW\\+u%E%EFFF 
 /$	 \"" 	1MM(###KK!!!$\<@@@@-- 		1MM*%%%KK%%%"<0000
 MM(###MM/0000 	$$$[%?@@@$2J$@J$@$@!##$9:::KK&& $i(((F#####L11 $j))))i(((F###7-}dDTTTr!   c                      g } g }t          j                    r*t          j        d          g} |                    d           | |fS )z
    For fbcode cpu case, we should link stdc++ instead assuming the binary where dlopen is executed is built with dynamic stdc++.
    r/  zstdc++)r   r   r!  r0  r   )r`  r.  s     r   _get_libstdcxx_argsrj  ,  sO      "MD "1(;;<H$r!   use_mmap_weightsc                 8    g }| r|                     d           |S )Nz USE_MMAP_SELFr"  )rk  r  s     r   get_mmap_self_macrorm  9  s'    F (&'''Mr!   c                    g }g }g }g }	g }
g }g }t                      }t                      }t          | ||          \  }}}t          |          \  }}t	          ||          \  }}}t                      \  }}t          |           \  }}}}}}t                      }t          |          } ||z   |z   |z   | z   }||z   |z   |z   }||z   }|}	||z   |z   }
||z   }||z   |z   }||||	|
||fS )a3  
    This function is used to get the build args of torch related build options.
    1. Torch include_directories, libraries, libraries_directories.
    2. Python include_directories, libraries, libraries_directories.
    3. OpenMP related.
    4. Torch MACROs.
    5. MISC
    6. Return the build args
    )r  rT  )	r  r  r  r  r  r4  rh  r  rm  )!r   r  r  rT  r   rk  rM  rN  rO  rP  rQ  rR  rS  torch_cpp_wrapper_definitions'use_custom_generated_macros_definitionssys_libs_cflagssys_libs_include_dirssys_libs_passthrough_args
isa_macrosisa_ps_args_build_flagstorch_include_dirstorch_libraries_dirstorch_librariesr1  python_libraries_dirs
omp_cflagsomp_ldflagsomp_include_dir_pathsomp_lib_dir_pathsomp_libomp_passthrough_argsfb_macro_passthrough_argsmmap_self_macross!                                    r   get_cpp_torch_optionsr  @  s   "  K LFG "NI"$$E$G$G!.J.L.L+ 	!x9JKK	! +H*P*P'J' 	 (SSS	 2J1K1K.. 	&& !8 9 9*+;<< 	&
1	2
	 $	$ 		  	
	
	  	   z)FG*-AADUUN')I!$;;>RR 
 	 r!   c                        e Zd ZdZeddddddddddddfdededed	ed
ededededee         dededededdf fdZ	 xZ
S )CppTorchOptionsaf  
    This class is inherited from CppTorchOptions, which automatic contains
    base cxx build options. And then it will maintains torch related build
    args.
    1. Torch include_directories, libraries, libraries_directories.
    2. Python include_directories, libraries, libraries_directories.
    3. OpenMP related.
    4. Torch MACROs.
    5. MISC
    FTr   r   r  r  r  rT  rU  r   rk  r  r  rY   r  rV  rW  r   Nc           
         t                                          |||	||
|||           || _        t          | j        |||||          \  }}}}}}}t          | j        |           t          | j        |           t          | j        |           t          | j	        |           t          | j
        |           t          | j        |           t          | j        |           |                                  d S )N)rU  r  r  r   rY   r  rV  rW  )r   r  r  rT  r   rk  )r  rk   rb  r  rY  r  rZ  r[  r\  r]  r^  r_  r`  rl  )rj   r  r  r  rT  rU  r   rk  r  r  rY   r  rV  rW  torch_definitionsrv  torch_cflagstorch_ldflagsrw  rx  torch_passthrough_argsr  s                        r   rk   zCppTorchOptions.__init__  s)     	%##/%%' 	 		
 		
 		
 " "+/-
 
 
	
 " 	T&(9:::T');<<<T\<000T]M222T)+?@@@T_o666T+-CDDD     r!   )r   r   r   r  r   r   r   r   r   rk   r  r  s   @r   r  r    s       	 	 * % ""'!&%'""#5! 5!5! 5! 	5!
 5! 5!  5! 5! 5! c]5! 5! 5! 5! 5! 
5! 5! 5! 5! 5! 5! 5! 5! 5! 5!r!   r  c                      t          j                    rHt          j        j        9dt
          j        vr-dt
          j        vr!t          j        t
          j        d<   d S d S d S d S d S )N	CUDA_HOME	CUDA_PATH)	r   r   r  versionhipr6   rQ   r   sdk_homer   r!   r   _set_gpu_runtime_envr    si    7M%rz))rz))"-"6
;7 7%%))))r!      r9   c                     t          t          |                               d                    }|r|d                                         j        S d|  }t
                              |           d S )Nzlibcudart_static.ar   z%"libcudart_static.a" not found under )r   r   rglobresolver#  rO   rP   )r9   lib_dirslog_msgs      r   _find_libcudart_staticr    si    DJJ$$%9::;;H ,{""$$++<d<<GHHW4r!   lpathsc                 T   t          |           D ]\  }}dt          j        v r|                    t          j        d                   r_t	          |          }|Jt          |          | |<   |dz  }|                                r"|                     t          |                     d S )Nr  stubs)	enumerater6   rQ   
startswithr  r   rN   r   )r  r   r9   lib_dirstub_dirs        r   _transform_cuda_pathsr    s     V$$ - -4"*$$K9P)Q)Q$&<T&B&BGGF1I(H   -c(mm,,,- -r!   device_typerU  c                    g }g }g }g }g }g }g }	t          j                    r5dt          j        vr'dt          j        vrt          j        t          j        d<   t                       ddlm}
 |
	                    |           }|

                    |           }t          j                    s|dgz  }| dk    r|                    t          j        j        rdnd           t          j        j        7t          j                    r|d
gz  }n|ddgz  }|                    d           n0t          j                    r|dgz  }n|g dz  }t          |           | dk    r|                    d           d}t           rut          j        d          }|t%          |          |t          j                            |d          gz  }|t          j                            |d          gz  }|g dz  }n+|dgz  }|g dz  }t+          d          st%          |          | dk    r|                    d           t          j                    r^|                    t          j                   |r| dk    rt          j        j        |sdg}	| dk    rt/                      \  }}||z  }||z  }t           j        j        r|t           j        j        z  }|||||||	fS )z
    This function is used to get the build args of device related build options.
    1. Device include_directories, libraries, libraries_directories.
    2. Device MACROs.
    3. MISC
    4. Return the build args
    r  r  r   )cpp_extensionc10cudaz	 USE_ROCMz	 USE_CUDANamdhip64c10_hip	torch_hipz __HIP_PLATFORM_AMD__)c10_cudar  
torch_cudaxpuz USE_XPUzIntel GPU driver is not properly installed, please follow the instruction in https://github.com/pytorch/pytorch?tab=readme-ov-file#intel-gpu-support.LEVEL_ZERO_V1_SDK_PATHr  rR  )c10_xpusycl	ze_loader	torch_xpuzWno-commentr  mpsz USE_MPSz*-Wl,-Bstatic -lcudart_static -Wl,-Bdynamiccpu)r   r   r6   rQ   r   r  r  torch.utilsr  r  library_pathsr   r  r  r  r  r   r7   r*  r9   r:   r   sdk_includerj  r  custom_op_libs)r  rT  rU  rM  rN  rO  rP  rQ  rR  rS  r  xpu_error_stringze_rootstdcxx_lib_dir_pathsstdcxx_libss                  r   get_cpp_torch_device_optionsr     sO     K LFG "NI"$7rz))rz))"-"6
;)))))) ..{;;L"00==N eW	f%-*;L;;MMM=(!! 6j\)		i55	67777!! @fX%		????	!.111e:&&&Z 	  	0i 899G.///RW\\'9==>>Lrw||GU;;<<NFFFFII }o%FFFFFI,, 0.///e:&&& %K3444 	Vv--} (# V(T'U$% $%%$22N$I) 8V(77	 	 r!   c                        e Zd ZdZedddddddddddfdededed	ed
ededededee         dedededdf fdZ	d fdZ
 xZS )CppTorchDeviceOptionsz
    This class is inherited from CppTorchOptions, which automatic contains
    base cxx build options and torch common build options. And then it will
    maintains cuda/xpu device related build args.
    Fr  Tr   r  r  r  rT  rU  r   rk  r  r  r  rV  rW  r   Nc                    t                                          |||||||	|
||
  
         g }g }g }g }g }g }g }t          |||          \  }}}}}}}t          | j        |           t          | j        |           t          | j        |           t          | j        |           t          | j        |           t          | j	        |           t          | j
        |           |                                  d S )N)
r  r  rT  rU  r   rk  r  r  rV  rW  )r  rT  rU  )r  rk   r  r  rZ  r[  r\  r]  r^  r_  r`  rl  )rj   r  r  r  rT  rU  r   rk  r  r  r  rV  rW  device_definitionsdevice_include_dirsdevice_cflagsdevice_ldflagsdevice_libraries_dirsdevice_librariesdevice_passthrough_argsr  s                       r   rk   zCppTorchDeviceOptions.__init__o  sD    	+%/-#%%' 	 	
 	
 	
 )+)+#%$&+-&(-/ )#h\
 
 
	
!# 	T&(:;;;T')<===T\=111T]N333T)+@AAAT_&6777T+-DEEE     r!   c                 v   t                                                       t          j                    rt	                      \  }}t          |          dk    sJ d|             |d         | j        v rD| j                            |d                    | j                            |d                    d S d S d S )Nr*   zPython lib dirs: r   )	r  rl  r   r   r4  r6  r^  r1  r   )rj   r   python_lib_dirsr  s      r   rl  z'CppTorchDeviceOptions._finalize_options  s    !!### 	@ ":!;!;A''1,,,.S/.S.S,,,q!T%999$++OA,>???$++OA,>?????	@ 	@
 :9r!   r   )r   r   r   r  r   r   r   r   r   rk   rl  r  r  s   @r   r  r  h  s         * %!""'!&%'""#6! 6!6! 6! 	6!
 6! 6!  6! 6! 6! c]6! 6! 6! 6! 
6! 6! 6! 6! 6! 6!p	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@r!   r  rc   c                     t           j                            |           }t           j                            |          \  }}t           j                            |           }||fS )a  
    This function help prepare parameters to new cpp_builder.
    Example:
        input_code: /tmp/tmpof1n5g7t/5c/c5crkkcdvhdxpktrmjxbqkqyq5hmxpqsfza4pxcf3mwk42lphygc.cpp
        name, dir = get_name_and_dir_from_output_file_path(input_code)
    Run result:
        name = c5crkkcdvhdxpktrmjxbqkqyq5hmxpqsfza4pxcf3mwk42lphygc
        dir = /tmp/tmpof1n5g7t/5c/

    put 'name' and 'dir' to CppBuilder's 'name' and 'output_dir'.
    CppBuilder --> get_target_file_path will format output path according OS:
    Linux: /tmp/tmppu87g3mm/zh/czhwiz4z7ca7ep3qkxenxerfjxy42kehw6h5cjk6ven4qu4hql4i.so
    Windows: [Windows temp path]/tmppu87g3mm/zh/czhwiz4z7ca7ep3qkxenxerfjxy42kehw6h5cjk6ven4qu4hql4i.dll
    )r6   r9   r  splitextdirname)rc   name_and_extr6  _extdirs        r   &get_name_and_dir_from_output_file_pathr    sO    " 7##I..L!!,//JD$
'//)
$
$C9r!   c                      e Zd ZdZedeeef         fd            Zedeeef         fd            Zedeeef         fd            Z	edeeef         fd            Z
	 dded	eeee         f         d
ededdf
dZdefdZdefdZ	 	 ddZddZdededdfdZdededdfdZdedee         ddfdZdeddfdZdS )
CppBuildera  
    CppBuilder is a cpp jit builder, and it supports both Windows, Linux and MacOS.
    Args:
        name:
            1. Build target name, the final target file will append extension type automatically.
            2. Due to the CppBuilder is supports multiple OS, it will maintains ext for OS difference.
        sources:
            Source code file list to be built.
        BuildOption:
            Build options to the builder.
        output_dir:
            1. The output_dir the target file will output to.
            2. The default value is empty string, and then the use current dir as output dir.
            3. Final target file: output_dir/name.ext
    r   c                  6    t           rdnd} t           rdnd}| |fS )Nz.pyd.soz/Fe-or  	extensionoutput_flagss     r   __get_python_module_flagsz$CppBuilder.__get_python_module_flags  s)    )4FFu	 +5uu,&&r!   c                  6    t           rdnd} t           rdnd}| |fS )Nz.objr   z/c /Foz-c -or  r  s     r   __get_object_flagszCppBuilder.__get_object_flags  s)    )3FFt	#.;xxG,&&r!   c                  R    t           st                      sdnd} t           rdnd}| |fS )Nz.pchz.gchz/Fpr  )r   r  r  s     r   __get_precompiled_header_flagsz)CppBuilder.__get_precompiled_header_flags  s2    )EEFFv	 +5uu,&&r!   c                  $    d} t           rdnd}| |fS )Nz.iz/EP /Pz-E -P -or  r  s     r   __get_preprocessor_output_flagsz*CppBuilder.__get_preprocessor_output_flags  s     	#.>xxJ,&&r!   r   r6  sourcesBuildOption
output_dirNc                 p
   d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        g | _        d| _	        d| _
        d| _        d| _        || _        t          j        j        pd| _        || _        |                                | _         |                                | _        |                                | _        || _	        |                                | _        |                                | _        |                                | _        t9          | j        | j        | j        f          dk    sJ | j        p| j        p| j         | _        t<          r| j        r
J d            | j        r|                                 \  }}nU| j        r|                                  \  }}n6| j        r| !                                \  }}n| "                                \  }}tF          j$        %                    | j	        | j         |           | _
        | j        r$tF          j$        &                    | j
                  n| j
        }t<          r| j        r|| _'        n| | | _'        n| d| | _'        tQ          |tR                    r|g}t          j*                    r'| j        r tW          |          | _        d |D             }| j        r&tY          |          dk    sJ d|d	          | _-        nd%                    |          | _-        |.                                D ]2}t<          r| xj        d
| dz  c_        | xj        d| dz  c_        3|/                                D ]2}	t<          r| xj        d|	 dz  c_        | xj        d|	 dz  c_        3|j0        x}
r.t<          rtb          2                    d|
           nd|
 d| _        |3                                D ]D}t<          r| xj        d| dz  c_        | xj        dti          j5        |           dz  c_        E|6                                D ]2}t<          r| xj        d
| dz  c_        | xj        d| dz  c_        3|7                                D ]2}t<          r| xj        d| dz  c_        | xj        d| dz  c_        3|8                                D ]2}t<          r| xj        d| dz  c_        | xj        d| dz  c_        3|9                                D ]}| xj        | dz  c_        d S )Nr   F
aoti_modelr*   z/Cannot currently precompile headers on Windows!r   c                 L    g | ]!}t           j                            |          "S r   )r6   r9   r  )r   r   s     r   r   z'CppBuilder.__init__.<locals>.<listcomp>I  s(    <<<qrw''**<<<r!   z-x c++-header r   rI  -z/D z-D zIPrecompiled header support for MSVC is currently unavailable; ignoring %sz	-include z/I "z" z-Iz
/LIBPATH:"z-L"z.lib" z-l):rY  _cflags_args_definitions_args_include_dirs_args_ldflags_args_libraries_dirs_args_libraries_args_passthrough_parameters_args_orig_source_paths_output_dir_target_filerc  rb  _namer   r  model_name_for_generated_files_target_name_build_optionrn  r  r  r  rd  r  re  r  rf  sum_do_linkr   _CppBuilder__get_object_flags)_CppBuilder__get_precompiled_header_flags*_CppBuilder__get_preprocessor_output_flags$_CppBuilder__get_python_module_flagsr6   r9   r:   r  _outputr   r   r   r   r6  _sources_argsrv  rq  ra  rO   warningrs  r=  quoterx  rz  r|  r~  )rj   r6  r  r  r  file_extr  relative_target_filecflag
definitionra  inc_dirldflagr  rR  passthrough_args                   r   rk   zCppBuilder.__init__  sS    !#"$$&!!,.) #%(-$
>N, 	
 )$1133"-"C"C"E"E$1133%(99;;(99;;);;==D&(:D<OPQQUVVVVVK$"4K8K
  	
d&8 	
 	
=	
 	
8  	F%)%<%<%>%>"Hll 	F%)%H%H%J%J"Hll  	F%)%I%I%K%K"Hll%)%C%C%E%E"HlGLL)9dj;T(;T;TUU &#BGT.///" 	
  	D" G+".F0DFF*CC-ACCDLgs## 	 iG  	=$"9 	= '+7mmD#<<G<<<G 	3w<<1$$$$!>'!*!>!>D!$'!2!2D ++-- 	2 	2E 2!!\\\\1!!!!!\\\\1!!!%5577 	> 	>J >&&*=
*=*=*==&&&&&*=
*=*=*==&&&!,!?? 	L L_&   
 +L6H*K*K*K'"3355 	H 	HG H''+='+=+=+=='''''+GG0D0D+G+G+GG'''!--// 	4 	4F 4""m&mmm3"""""m&mmm3""""5577 	= 	=G =))-E'-E-E-EE)))))_'___<))),,.. 	4 	4C 4$$C7$$$$$S3$$$*??AA 	G 	GO--O1F1F1FF---	G 	Gr!   c                 <    dt           dt           dt           dt           dt           dt           dt           dt           d	t           d
t           dt           f fd} | j         j         j         j         j         j         j         j         j	         j
        
  
        }|S )NrY   r  include_dirs_argsdefinitions_argscflags_argsldflags_argslibraries_argslibraries_dirs_argsrS  r@  r   c
                     t           r;|  d| d| d| d| d| d|	 }
j        r|
d| d| d| z  }
t          |
          }
n+|  d| d| d| d| d| d|	 }
j        r|
d| d| d| z  }
|
S )Nr   z /LD /link )r   r  r   )rY   r  r  r  r  r  r	  r
  rS  r@  r   rj   s              r   format_build_commandz9CppBuilder.get_command_line.<locals>.format_build_command  sT     U   = ="3 = =6F = = = == =!1= =4:= =  = _^)<^^~^^P\^^^C.s33   G G' G G,< G G{ G G(G G+;G G>DG G  = UT|TTnTT?RTTTCJr!   )
rY   r  r  r  r  r  r	  r
  rS  r@  )r   rY  r  r  r  r  r  r  r  r  r  )rj   r  command_lines   `  r   get_command_linezCppBuilder.get_command_line  s    			  #	 "		
 	 	  	 "%	 "	 	 	 	 	 	 	 	> ,+^&"5!3)+/ $ 9!><
 
 
 r!   c                 *    t          | j                  S r   )r   r  r{   s    r   get_target_file_pathzCppBuilder.get_target_file_path  s    '(9:::r!   c                    t          d          5  |                                                                 }	 | j        }t          j                            t          d          }t          j	                    5 }t          j        t          t          j                            |d                     | j        D ]R}t          j        |t          j                            |t          j                            |                               St          j                            |d          }t          j        ||           t!          ||t          j                            |                    }t          j                            |          rt	          j        |           t          j        ||           |                    d          rt	          j        |d           n*|                    d          rt	          j        |d           d d d            n# 1 swxY w Y   nG# t*          j        $ r5}|j                            d          }	t3          j        ||	          |d }~ww xY wd d d            d S # 1 swxY w Y   d S )	NrE  r  z	script.ldr   i  r  i  r)   )r   r  r   r  r6   r9   r:   _TORCH_PATHtempfileTemporaryDirectoryrS   r  r  r  r  copytreer   rN   r1  endswithchmodr<   r   r@  r   r   r>  )
rj   r8  output_pathtorch_includes_pathtmp_dirsrcdest_include_pathtmp_output_pathr?  r@  s
             r   build_fbcode_rezCppBuilder.build_fbcode_re  s    .)) 	B 	B++--3355GB"/ ')gll;	&J&J#022 5gKWk0R0RSSS#6 W WCgrw?O?OPS?T?T)U)UVVVV(*Wi(H(H%O$79JKKK&8"'*:*:;*G*G' 'O w~~k22 /	+...K==="++D11 5e4444$--e44 5e444%5 5 5 5 5 5 5 5 5 5 5 5 5 5 5& 0 B B B11)'6::AB7	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	BsY   'I6?H"7FH
H"H	H"H	H"!I6"I&10I!!I&&I66I:=I:c                 R   | j         r|                                 S t          | j                   t          j                            | j        | j         dt                     }t          |           | 	                                }t          ||           t          |           dS )z
        It is must need a temporary directory to store object files in Windows.
        After build completed, delete the temporary directory to save disk space.
        r   r:  N)rc  r  r-  r  r6   r9   r:   r  _BUILD_TEMP_DIRr  rF  r8  )rj   _build_tmp_dir	build_cmds      r   buildzCppBuilder.build  s    
 " 	*''))) !1222??o??
 
 	!000))++		~6666N#####r!   
cmake_pathr  c                 d   d                     | j                                                  }t          j        j        rdnd}t          j        d| j         d| j         d| d          }t          j        j        rt          j	        j
        r[|t          j        d          z  }|t          j        d| j         d	| d
| j         d	| j         d| j         d	| j         d          z  }n(|t          j        d| j         d| j         d          z  }|dk    r]t          j        j        Lddlm}  |            }|t          j        d| j         d| j         d| j         d| d| d| d| d          z  }t%          |d          5 }|                    |           ddd           dS # 1 swxY w Y   dS )z
        Save global cmake settings here, e.g. compiler options.
        If targeting CUDA, also emit a custom function to embed CUDA kernels.
        r   STATICSHAREDzR
            cmake_minimum_required(VERSION 3.27 FATAL_ERROR)
            project(zs LANGUAGES CXX)
            set(CMAKE_CXX_STANDARD 17)

            # Set a library target
            add_library(z)

            z
                # May need to point CMAKE_PREFIX_PATH to the right torch location
                find_package(Torch REQUIRED)

                zT
                # Add macro definitions
                target_compile_definitions(	 PRIVATE zN)

                # Add compile flags
                target_compile_options(zS)

                # Backend-specific flags
                target_compile_options(z -c)

                z
                find_package(TorchStandalone REQUIRED)
                # Set up include directories to find headers at the correct paths
                target_include_directories(zU PRIVATE ${TorchStandalone_INCLUDE_DIRS})
                target_include_directories(zF PRIVATE ${TorchStandalone_INCLUDE_DIRS}/standalone)

                r  Nr   )_nvcc_arch_as_compile_optionz
                enable_language(CUDA)
                set(CMAKE_CUDA_STANDARD 17)
                find_package(CUDAToolkit REQUIRED)
                target_include_directories(zQ PRIVATE ${CUDAToolkit_INCLUDE_DIRS})
                target_compile_definitions(z9 PRIVATE USE_CUDA)
                target_link_libraries(ab   PRIVATE cuda CUDA::cudart_static)

                find_program(OBJCOPY_EXECUTABLE objcopy)
                if(NOT OBJCOPY_EXECUTABLE)
                    message(FATAL_ERROR "objcopy not found. Cannot embed fatbin as object file")
                endif()

                set(KERNEL_TARGETS "")
                set(KERNEL_OBJECT_FILES "")
                # Function to embed a single kernel
                function(embed_gpu_kernel KERNEL_NAME PTX_FILE)
                    set(FATBIN_BASENAME ${KERNEL_NAME}.fatbin)
                    set(FATBIN_FILE ${CMAKE_CURRENT_BINARY_DIR}/${FATBIN_BASENAME})
                    set(OBJECT_BASENAME ${KERNEL_NAME}.fatbin.o)
                    set(OBJECT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_BASENAME})

                    # --- Define UNIQUE C symbol names ---
                    set(SYMBOL_START __${KERNEL_NAME}_start)
                    set(SYMBOL_END __${KERNEL_NAME}_end)
                    set(SYMBOL_SIZE __${KERNEL_NAME}_size)
                    string(REGEX REPLACE "[^a-zA-Z0-9]" "_" MANGLED_BASENAME ${FATBIN_FILE})
                    set(OBJCOPY_START_SYM _binary_${MANGLED_BASENAME}_start)
                    set(OBJCOPY_END_SYM _binary_${MANGLED_BASENAME}_end)
                    set(OBJCOPY_SIZE_SYM _binary_${MANGLED_BASENAME}_size)

                    # --- PTX to FATBIN Command & Target ---
                    add_custom_command(
                        OUTPUT ${FATBIN_FILE}
                        COMMAND ${CUDAToolkit_NVCC_EXECUTABLE} --fatbin ${PTX_FILE} -o ${FATBIN_FILE} ${NVCC_GENCODE_FLAGS}
                                -gencode arch=compute_z,code=compute_z7
                                -gencode arch=compute_z	,code=sm_a'  
                        DEPENDS ${PTX_FILE}
                    )

                    # --- FATBIN to Object File (.o) Command ---
                    add_custom_command(
                        OUTPUT ${OBJECT_FILE}
                        COMMAND ${CMAKE_LINKER} -r -b binary -z noexecstack -o ${OBJECT_FILE} ${FATBIN_FILE}
                        COMMAND ${OBJCOPY_EXECUTABLE} --rename-section .data=.rodata,alloc,load,readonly,data,contents
                                ${OBJECT_FILE}
                        COMMAND ${OBJCOPY_EXECUTABLE}
                                --redefine-sym ${OBJCOPY_START_SYM}=${SYMBOL_START}
                                --redefine-sym ${OBJCOPY_END_SYM}=${SYMBOL_END}
                                --redefine-sym ${OBJCOPY_SIZE_SYM}=${SYMBOL_SIZE}
                                ${OBJECT_FILE}
                        DEPENDS ${FATBIN_FILE}
                    )
                    add_custom_target(build_kernel_object_${KERNEL_NAME} DEPENDS ${OBJECT_FILE})

                    # --- Add to a list for linking later ---
                    set(KERNEL_TARGETS ${KERNEL_TARGETS} build_kernel_object_${KERNEL_NAME} PARENT_SCOPE)
                    set(KERNEL_OBJECT_FILES ${KERNEL_OBJECT_FILES} ${OBJECT_FILE} PARENT_SCOPE)
                endfunction()

                r  )r:   r  rq  r   r  compile_standalonetextwrapdedentr  test_configsuse_libtorchr  r  r  r  r  r3   r*  r  write)	rj   r%  r  rM  target_library_typecontentsr*  current_archr  s	            r   save_compile_cmd_to_cmakez$CppBuilder.save_compile_cmd_to_cmake  s    hht1AACCDD+>LHHH 	 ?&  *  .A  

 

 #6(	"/(	   H 
,0,=
 
HS
 

 )-(9
 

 EIDU
 
 )-(9
 
 EIDe
 
 
  HH  -1,=  -1,=	    H &  U]%6%>NNNNNN7799L< -1,=	< <
 -1,=< < (,'8< <F 8DG< <F T`G< <H 8DI< <H O[I< < <> > >H@ *c"" 	aGGH	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   F%%F),F)src_pathc                     dt          |          j        z   }t          |d          5 }|                    d| j         d| d           d d d            d S # 1 swxY w Y   d S )N${CMAKE_CURRENT_SOURCE_DIR}/aztarget_sources(r)  z)
)r   r6  r  r0  r  )rj   r%  r5  r  s       r   save_src_to_cmakezCppBuilder.save_src_to_cmakes  s    1DNN4GG*c"" 	QaGGOd&7OO(OOOPPP	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Qs   "AAA	asm_filesc           	         t          |d          5 }|D ]v}t          |          j                            d          d         }dt          |          j         }t	          j        d| d| d          }|                    |           w|r<|                    d| j         d	           |                    d
| j         d           d d d            d S # 1 swxY w Y   d S )Nr8  r}   r   r7  z&
                    embed_gpu_kernel(r   z)
                    zadd_dependencies(z ${KERNEL_TARGETS})
ztarget_link_libraries(z! PRIVATE ${KERNEL_OBJECT_FILES})
)r  r   r6  r   r,  r-  r0  r  )rj   r%  r:  r  asm_filer   r2  s          r   save_kernel_asm_to_cmakez#CppBuilder.save_kernel_asm_to_cmakey  sU   *c"" 	a% " ""8nn177<<Q?QDNN<OQQ#?&1 4<   
 !!!! VD,=VVVWWWdT->ddd  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   B8CCCc                 *   t           j        j        rt           j        j        sd S d                    | j                                                  }d                    | j                                                  }t          j
        d| j         d| d| j         d| d	          }t          j                            |          sJ d| d            t          |d          5 }|                    |           d d d            d S # 1 swxY w Y   d S )	Nr   z@
            # Add linker flags
            target_link_options(r)  zA)

            # Add libraries
            target_link_libraries(z)
         z#save_link_cmd_to_cmakefile expects z to already existr8  )r   r  r+  r.  r/  r:   r  rx  r|  r,  r-  r  r6   r9   rN   r  r0  )rj   r%  lflagsr.  r2  r  s         r   save_link_cmd_to_cmakez!CppBuilder.save_link_cmd_to_cmake  s}   2	'4	
 F$,88::;;xx*88::;;?!%!2 =C 
 $(#4 
 @D  
 
 w~~j)) 	
 	
O*OOO	
 	
) *c"" 	aGGH	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	r  )r   r   )r   r   r   r  staticmethodr   r   r  r  r  r  r
   r   rL  rk   r  r  r  r$  r4  r9  r=  r@  r   r!   r   r  r    so          'uS#X ' ' ' \'
 'c3h ' ' ' \'
 'E#s(O ' ' ' \'
 'U38_ ' ' ' \' LG LGLG sDI~&LG &	LG
 LG 
LG LG LG LG\,# , , , ,\;c ; ; ; ; B	 B  B  B  BD$ $ $ $$JJ J 
	J J J JXQC Q3 Q4 Q Q Q Q3 49 QU    $       r!   r  r  targetc                     dt           fd}dt           dt           dt           dt           fd} |            } ||t          |           t          |                    }t          |t          |                     d S )	Nr   c                  X    t           rd} nt                      } t          |           rd} | S )Nml64rG   )r   r   r  )ASM_CCs    r   get_asm_compilerz.run_asm_build_object.<locals>.get_asm_compiler  s6     	FF%''F!&)) r!   asm_ccr  rB  c                 >    t           r|  d| d| }n
|  d| d| }|S )Nr   z /c /Fo z -c z -o r  )rH  r  rB  r   s       r   r  z.run_asm_build_object.<locals>.get_command_line  sI     	3 33c33633CC2222&22C
r!   )rH  r  rB  r   )r   r   rF  )r  rB  r:  rG  r  rH  r   s          r   run_asm_build_objectrJ    s    c     3       F

$S))'//  C
 C5c::;;;;;;r!   )T)r  )F)Tr   Fr   )FF)r  re   r+  	functoolsr  loggingr6   r5   r   r=  rS   r<   r4   r!  r  r,  r%  collections.abcr   r   r   ctypes.utilr   pathlibr   typingr   r	   r
   r  torch._dynamo.utilsr   torch._inductorr   r   torch._inductor.cpu_vec_isar   r   %torch._inductor.runtime.runtime_utilsr   torch.torch_versionr   r   triton.fb.buildr   r   torch._inductor.fb.utilsr   r   r   r   r   r!  r9   abspath__file___HEREr  r  r:   r  r  	_IS_LINUXr\  r   r   	getLoggerr   rO   	lru_cacher   rE   r;   cacher`   rb   r   r   r   r   r   r   r   r   r   r  r  r  r   r	  r  r  r   r  r$  r-  r8  rC  rF  r   rL  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r)  r4  r9  r>  rG  rM  rh  rj  rm  r  r  r  r  r  r  r  r  r  rJ  r   r!   r   <module>r_     su            				  				       



        $ $ $ $ $ $ ! ! ! ! ! ! ! ! $ $ $ $ $ $       ' ' ' ' ' ' ' ' ' '  , , , , , , ' ' ' ' ' ' ' ' ? ? ? ? ? ? ? ? ; ; ; ; ; ; , , , , , , 6 ????????            s c d    c S T    S C D    d    
 
!!goobgooe4455k+@AA L##G,,	L##H--	lg%'2: g!! Q! ! ! ! ! !8s    4 
3 
4 
 
 
 
J J J J J J J JZ l
 l
 l
 l
 l
 l
^#    "$ 5c?    " 	 	
 	   6 5# 5$ 5 5 5 5
 ?C ?D ? ? ? ? C# C$ C C C C c d    " (S (T ( ( ( (V ' ' ' ' ' )$ ) ) ) ) 24 2 2 2 2 / / / / / +D + + + +      *?DI ?c ?t ? ? ? ?49 c    s t    	# 	$ 	 	 	 	6s 6 6 6 6 6 6.(c ( ( ( ( ( (
     t  t  t  t  t  t  t  t n  S	    " " "$s) " " " "!S !T#Y ! ! ! !H# $s)    tCy    :5cDI1E+F    & -2, ,,%),
49d3i , , , ,^ c    $ !#) ))) ) #	)
 ) 49d3icDItCy$s)TRUYVW) ) ) )X5! 5! 5! 5! 5!! 5! 5! 5!pE49 E E E E2d3i 2 2 2 2c    '2'2'2 '2 49d3ic*+	'2 '2 '2 '2T6 eDItCy<P6Q    (33%)3
49d3ic*+3 3 3 3&
$s) 
 
 
 
0%S	49(<"= 0 0 0 02      tSy)    ( 
3 
# 
$ 
 
 
 
 ? ? ? ? ? ?<hUhU
49d3icDItCy$s)KLhU hU hU hUV
U49d3i#78 
 
 
 
$ 49    VVV V 	V
 V V 49d3icDItCy$s)TRUYVWV V V VrA! A! A! A! A!j A! A! A!H7 7 7 7 Q $    -$s) - - - - -" e eee e 49d3icDItCy$s)TRUYVW	e e e ePH@ H@ H@ H@ H@O H@ H@ H@V
38_   0X X X X X X X Xv<c <3 <S <T < < < < < <r!   