;iddZddlZddlZddlZddlZddlmZddlmZddl m Z m Z ddl m Z ddlmZddlmZmZmZmZmZmZmZmZdd lmZdd lmZmZdd lmZm Z dd l!m"Z"dd l#m$Z$m%Z%m&Z&m'Z'ddl(m)Z)m*Z*m+Z+ddl,m-Z-m.Z.e j/e0Z1dZ2dZ3dZ4dZ5Gdde$Z6da7ddZ8dZ9dS)at Define a modified ModuleGraph that can return its contents as a TOC and in other ways act like the old ImpTracker. TODO: This class, along with TOC and Tree, should be in a separate module. For reference, the ModuleGraph node types and their contents: nodetype identifier filename Script full path to .py full path to .py SourceModule basename full path to .py BuiltinModule basename None CompiledModule basename full path to .pyc Extension basename full path to .so MissingModule basename None Package basename full path to __init__.py packagepath is ['path to package'] globalnames is set of global names __init__.py defines ExtensionPackage basename full path to __init__.{so,dll} packagepath is ['path to package'] The main extension here over ModuleGraph is a method to extract nodes from the flattened graph and return them as a TOC, or added to a TOC. Other added methods look up nodes by identifier and return facts about them, replacing what the old ImpTracker list could do. N) defaultdict)deepcopy)HOMEPATH PACKAGEPATH)log)add_suffix_to_extension)BAD_MODULE_TYPESBINARY_MODULE_TYPESMODULE_TYPES_TO_TOC_DICTPURE_PYTHON_MODULE_TYPESPY3_BASE_MODULESVALID_MODULE_TYPESimportlib_load_sourceis_win)bytecode)AdditionalFilesCacheModuleHookCache)PreFindModulePathAPIPreSafeImportModuleAPI) get_implies) ModuleGraphDEFAULT_IMPORT_LEVELABSOLUTE_IMPORT_LEVELPackage)DEBUGINFOTRACE)collect_submodules is_packagei0iicPeZdZdZeeeeedZd%fd ZdZ dZ e dZ dZ e Ze Zd Zd Zd&fd Zd ZdZed ffd ZfdZfdZdZd&dZdZdZdZe d&dZdZdZ dZ!dZ"dZ#de$de%fdZ&de'fd Z(d%de'fd!Z)de*fd"Z+de*fd#Z,de*fd$Z-xZ.S)'PyiModuleGrapha Directed graph whose nodes represent modules and edges represent dependencies between these modules. This high-level subclass wraps the lower-level `ModuleGraph` class with support for graph and runtime hooks. While each instance of `ModuleGraph` represents a set of disconnected trees, each instance of this class *only* represents a single connected tree whose root node is the Python script originally passed by the user on the command line. For that reason, while there may (and typically do) exist more than one `ModuleGraph` instance, there typically exists only a singleton instance of this class. Attributes ---------- _hooks : ModuleHookCache Dictionary mapping the fully-qualified names of all modules with normal (post-graph) hooks to the absolute paths of such hooks. See the the `_find_module_path()` method for details. _hooks_pre_find_module_path : ModuleHookCache Dictionary mapping the fully-qualified names of all modules with pre-find module path hooks to the absolute paths of such hooks. See the the `_find_module_path()` method for details. _hooks_pre_safe_import_module : ModuleHookCache Dictionary mapping the fully-qualified names of all modules with pre-safe import module hooks to the absolute paths of such hooks. See the `_safe_import_module()` method for details. _user_hook_dirs : list List of the absolute paths of all directories containing user-defined hooks for the current application. _excludes : list List of module names to be excluded when searching for dependencies. _additional_files_cache : AdditionalFilesCache Cache of all external dependencies (e.g., binaries, datas) listed in hook scripts for imported modules. _module_collection_mode : dict A dictionary of module/package collection mode settings set by hook scripts for their modules. _bindepend_symlink_suppression : set A set of paths or path patterns corresponding to shared libraries for which binary dependency analysis should not create symbolic links into top-level application directory. _base_modules: list Dependencies for `base_library.zip` (which remain the same for every executable). )rc tjdd|i|||_d|_||_|||dS)Nexcludesr&)super__init__ _homepath_top_script_node _excludes_reset_analyze_base_modules)self pyi_homepathuser_hook_dirsr(kwargs __class__s OC:\PYTHON\MyICR_Workspace\venv\Lib\site-packages\PyInstaller/depend/analysis.pyr*zPyiModuleGraph.__init__jsg55(5f555% $" N### ""$$$$$cd|_t|_t|_t |_g|tj tdtf|_ td|d|_|d|_|d|_t't(|_|j D]\}}tjtj |d} t/|dd 5}t1j|}dddn #1swxYwYnB#t6$rYt8$r*}td |d |Yd}~d}~wwxYw||||t|j|_dS) zh Reset for another set of scripts. This is primary required for running the test-suite. Nhooksz(Initializing module graph hook caches...pre_safe_import_modulepre_find_module_pathz rthooks.datrzutf-8)encodingz#Unable to read run-time hooks from z: )r,r_additional_files_cachedict_module_collection_modeset_bindepend_symlink_suppressionospathjoinrHOOK_PRIORITY_BUILTIN_HOOKS_user_hook_dirsloggerinfo _cache_hooks_hooks_hooks_pre_safe_import_module_hooks_pre_find_module_pathrlist_available_rthooksabspathopenast literal_evalreadFileNotFoundError Exceptionerror_merge_rthooks)r0r2uhd_uhd_pathfrthookses r5r.zPyiModuleGraph._resetvs$!%';'='=$'+vv$.1ee+  W\\+w / /1L M   >???''++ -1->->?W-X-X*+/+<+<=S+T+T(#.d"3"3* 8 8FCwrw||C'G'GHHH (C':::9a!.qvvxx88G999999999999999$       HHHVWVWXYYY    h 7 7 7 7#'t'>"?"?sBF'F: FF F F F G G' G  Gc t|ts Jd|z|D]:\}}t|tsJ|d|dt|tsJd|d|d||jvrFhh UeUeUefgg87<<Y8HIIw~~h//HHHXX{{{,<,<, [2] msg (here) -> [1] _findCaller -> [0] logger.findCaller 4. Create a logRecord with the caller's information. 5. Handle the logRecord. N )z(unknown file)rz(unknown function)N) LOG_LEVEL_MAPPINGKeyErrorrH isEnabledForrEmapreprrn ValueError makeRecordnamehandle) r0levelsrmmsgfnlnofuncsinforecords r5r|zPyiModuleGraph.msgs  *51EE    FF ""5))  FCHHSt__5556 S#'#3#3#5#5 BT55 S S S#R BT555 S""6;r3RtUY[`aa fs  +BBBcg}|jD][\}}tj||}tj|r|||f\t ||S)ac Create a cache of all hooks of the specified type. The cache will include all official hooks defined by the PyInstaller codebase _and_ all unofficial hooks defined for the current application. Parameters ---------- hook_type : str Type of hooks to be cached, equivalent to the basename of the subpackage of the `PyInstaller.hooks` package containing such hooks (e.g., empty string for standard hooks, `pre_safe_import_module` for pre-safe-import-module hooks, `pre_find_module_path` for pre-find-module-path hooks). )rGrCrDrEisdirrer)r0 hook_type hook_dirs user_hook_dirpriorityuser_hook_type_dirs r5rJzPyiModuleGraph._cache_hookss} '+'; A A #M8"$mY!G!G w}}/00 A  "4h!?@@@tY///r6ctdg}tD]9}t|r|t |z }$||:fd|D_dS)zN Analyze dependencies of the the modules in base_library.zip. z*Analyzing modules for base_library.zip ...cDg|]}|D]}|Sr&) import_hook).0reqmodr0s r5 z8PyiModuleGraph._analyze_base_modules..s5\\\cdFVFVWZF[F[\\sc\\\\r6N)rHrIr rrre _base_modules)r0 required_modsms` r5r/z$PyiModuleGraph._analyze_base_moduless  @AAA ! ( (A!}} (!3A!6!66 $$Q''''\\\\]\\\r6Nc|j t||_n#t$rwt d|t jtj d}t |dddt jit j dYnwxYw|j D]}| |j||jS|s|j}t||S) a Wrap the parent's 'run_script' method and create graph from the first script in the analysis, and save its node to use as the "caller" node for all others. This gives a connected graph rather than a collection of unrelated trees. Nz Syntax error in)fileTrr")caller) r,r) add_script SyntaxErrorprintsysstderr traceback format_exc splitlinesexitradd_edge)r0pathnamerformatted_linesnoder4s r5rzPyiModuleGraph.add_scripts  ( (-(:(:8(D(D%%   )8#*EEEE"+"6"8"8"C"CD"I"Irss+=#*===   * ; ; d3T::::( ( /.77%%hv%>> >s&1A>B21B2cntd t}|jD]\}}||d}|t |jtvr| |P| ||j ||j |j |j|j|j|j| ||jj||sdS)z For each imported module, run this module's post-graph hooks if any. Parameters ---------- analysis: build_main.Analysis The Analysis that calls the hooks z-Processing module hooks (post-graph stage)...TF) create_nspkgN)rHrIrArKra find_nodetype__name__radd post_graphr>binariesdatasr@updatemodule_collection_moderBbindepend_symlink_suppressionremove_modules)r0analysishooked_module_namesrf module_hook module_nodes r5process_post_graph_hooksz'PyiModuleGraph.process_post_graph_hooks,sQ&  CDDD* #&%% -1K,=,=,?,? 5 5( ["nn[unMM & $$-5GGG'++K888&&x000,00k>RT_Tefff,33K4VWWW3::;;deee$'' 4444 'DK &(; < <' U* r6ct}|rT|j|d}|r||j|dd}|T|S)ze Collect excludedimports from the hooks of the specified module and all its parents. N.r)rArKgetrexcludedimports rpartition)r0rfexcluded_importsrs r5_find_all_excluded_importsz)PyiModuleGraph._find_all_excluded_importslsu55 9+//+t<._exclude_modulesx )4(9(9#(>(>%+;330?0E0Ec0J0J- 12M37L3M3M2M NRg g 3#222234r6zxSuppressing import of %r from module %r due to excluded import %r specified in a hook for %r (or its parent package(s)).)r identifierrr`rrErrHdebugrer)_safe_import_hookrrr)r0target_module_partname source_moduletarget_attr_namesrz edge_attrrbase_module_namerexcluded_import_rulefiltered_target_attr_namestarget_attr_namesubmodule_name ret_modules ret_moduler4s r5rz PyiModuleGraph._safe_import_hookzsn  $ $>>}?WXX  @ K000!-99^+8+C((,/88M4L4R4RSV4W4WX[Y[X[4\+]+](-I(C2H,HH(qyy+.884D4J4J34O4OP]SX[\S\Q]P]4^+_+_('=$    (77GIY'Z'Z$'LL67GIacw%0 I%K13.,= P P()9C)?BR)R/>~O_/`/`,/P"LL!EFTVcVn 4m6N 7==>NOOOO)C(Jd%gg// "M3DeY  & C CJJ(0BBB  + +J,A B B B Br6c|j|d}|tj|j\}}t d||d|ddz}t||j}t||||} t|dstd|z| | | j}| j}t!|||S) a Create a new graph node for the module with the passed name under the parent package signified by the passed graph node. This method wraps the superclass method with support for pre-import module hooks. If such a hook exists for this module (e.g., a script `PyInstaller.hooks.hook-{module_name}` containing a function `pre_safe_import_module()`), that hook will be run _before_ the superclass method is called. Pre-Safe-Import-Hooks are performed just *prior* to importing the module. When running the hook, the modules parent package has already been imported and ti's `__path__` is set up. But the module is just about to be imported. See the superclass method for description of parameters and return value. Nz1Processing pre-safe-import-module hook %r from %r)PyInstaller_hooks_pre_safe_import_module_rrZ) module_graphmodule_basenamerfparent_packager:z9pre_safe_import_module() function not defined by hook %r.)rLpoprCrDr hook_filenamerHrIreplacerrhasattr NameErrorr:rrfr)_safe_import_module) r0rrfrhook hook_path hook_basenamehook_module_name hook_modulehook_apir4s r5rz"PyiModuleGraph._safe_import_modules"155k4HH  ')w}}T5G'H'H $I} KKK]\e f f fJ[M`M`adfiMjMjj /0@$BTUUK.! /'- H;(@AA k [^i ijjj  . .x 8 8 8'6O".Kww**?KXXXr6c|j|d}|tj|j\}}t d||d|ddz}t||j}t|||} t|dstd|z| | | j}t|||S) a, Get a 3-tuple detailing the physical location of the module with the passed name if that module exists _or_ raise `ImportError` otherwise. This method wraps the superclass method with support for pre-find module path hooks. If such a hook exists for this module (e.g., a script `PyInstaller.hooks.hook-{module_name}` containing a function `pre_find_module_path()`), that hook will be run _before_ the superclass method is called. See superclass method for parameter and return value descriptions. Nz/Processing pre-find-module-path hook %r from %r'PyInstaller_hooks_pre_find_module_path_rrZ)rrf search_dirsr;z7pre_find_module_path() function not defined by hook %r.)rMrrCrDrrrHrIrrrrrr;rr)_find_module_path) r0fullnamerfrrrr hook_fullnamerrr4s r5rz PyiModuleGraph._find_module_paths /33HdCC  ')w}}T5G'H'H $I} KKI=Zc d d dEHXHXY\^aHbHbbM/ t?QRRK,!$'H;(>?? i Y\g ghhh  , ,X 6 6 6#.Kww((; LLLr6ci}t}||jD]0}t|j}||vr|jr|j||j<1|S)z Get code objects from ModuleGraph for pure Python modules. This allows to avoid writing .pyc/pyo files to hdd at later stage. :return: Dict with module name and code object. start)r iter_graphr,rrcoder)r0 code_dict mod_typesrmg_types r5get_code_objectszPyiModuleGraph.get_code_objects-sh , OO$*?O@@ ; ;D 4jj)G)##9;15Ido.r6ct}||jD]/}|||}|||0|S)ai Return the name, path and type of selected nodes as a TOC. The selection is determined by the given list of PyInstaller TOC typecodes. If that list is empty we return the complete flattened graph as a TOC with the ModuleGraph note types in place of typecodes -- meant for debugging only. Normally we return ModuleGraph nodes whose types map to the requested PyInstaller typecode(s) as indicated in the MODULE_TYPES_TO_TOC_DICT. We use the ModuleGraph (really, ObjectGraph) flatten() method to scan all the nodes. This is patterned after ModuleGraph.report(). r)rNrr, _node_to_tocre)r0typecodetocrentrys r5 _make_toczPyiModuleGraph._make_tocBsbffOO$*?O@@ " "D%%dH55E  5!!! r6c6|tS)zB Return all pure Python modules formatted as TOC. )rr r0s r5 make_pure_toczPyiModuleGraph.make_pure_tocUs ~~6777r6c6|tS)zD Return all binary Python modules formatted as TOC. )rr rs r5make_binaries_tocz PyiModuleGraph.make_binaries_toc\s~~1222r6c6|tS)zE Return all MISSING Python modules formatted as TOC. )rr rs r5make_missing_toczPyiModuleGraph.make_missing_tocbs~~.///r6cnt|j}|J|r||vrdS|dkrGtj|j\}}tj|}n|dkr |jdz}n|j}|j|jnd}t|}t|}|||fS)NScriptExtensionPackagez .__init__r9) rrrCrDsplitextfilenamebasenamerrbr )rrrrxextrDtoc_types r5rzPyiModuleGraph._node_to_tochst**%"""  x//4 h  '**4=99KT37##D))DD * * *?[0DD?D $ 9t}}r 4yy+G4T8##r6c fd|DS)a+ Given a list of nodes, create a TOC representing those nodes. This is mainly used to initialize a TOC of scripts with the ones that are runtime hooks. The process is almost the same as _make_toc(), but the caller guarantees the nodes are valid, so minimal checking. c:g|]}|Sr&)r)rrr0s r5rz/PyiModuleGraph.nodes_to_toc..s':::D!!$'':::r6r&)r0nodess` r5 nodes_to_toczPyiModuleGraph.nodes_to_tocs ;:::E::::r6cd||}|dSt|jdkS)NF BuiltinModule)rrr)r0rxrs r5 is_a_builtinzPyiModuleGraph.is_a_builtins1~~d## <5Dzz"o55r6cfd}|gS|\}}d|D}fd|DS)a- List all modules importing the module with the passed name. Returns a list of (identifier, DependencyIinfo)-tuples. If the names module has not yet been imported, this method returns an empty list. Parameters ---------- name : str Fully-qualified name of the module to be examined. Returns ---------- list List of (fully-qualified names, DependencyIinfo)-tuples of all modules importing the module with the passed fully-qualified name. cvj|}|j|SdSrk)graph edge_by_node edge_data)importeredgerxr0s r5get_importer_edge_dataz.get_importer_edge_datas>:**8T::Dz++D111 r6Nc3(K|] }||jVdSrk)r)rrs r5 z/PyiModuleGraph.get_importers..s*[[XhFZX(FZFZFZFZ[[r6c*g|]}||fSr&r&)rrrs r5rz0PyiModuleGraph.get_importers..s*WWW11(;;<WWWr6)r get_edges)r0rxrrZ importersrs`` @r5 get_importerszPyiModuleGraph.get_importerss& 2 2 2 2 2 2 ~~d## <I~~d++ 9[[[[[ WWWWYWWWWr6cTg}td|rg|D]d}td|tj|}|||e|t}|D]\}}}||j vrv|j |D]h}tj |\} } td| | |||i|S)z Analyze custom run-time hooks and run-time hooks implied by found modules. :return : list of Graph nodes. zAnalyzing run-time hooks ...z!Including custom run-time hook %rz"Including run-time hook %r from %r) rHrIrCrDrPrerrrrOr) r0custom_runhooks rthooks_nodes hook_filetemp_tocmod_namerDrrirrs r5analyze_runtime_hooksz$PyiModuleGraph.analyze_runtime_hookss2   2333  A, A A  ?KKKGOOI66 $$T__Y%?%?@@@@>>"455*2 D D &XtX4222 $ 7 ADDH/1w}}X/F/F,I}KK DmU^___!(()B)BCCCCr6c|jJ|D]}||}|td|nztd| ||}t |dksJ|d}n+#t$rtd|YwxYw| |j|dS)z Add hidden imports that are either supplied as CLI option --hidden-import=MODULENAME or as dependencies from some PyInstaller features when enabled (e.g., crypto feature). NzHidden import %r already foundzAnalyzing hidden import %rr"rzHidden import %r not found) r,rrHrrIrr ImportErrorrWr)r0 module_listmodnmrr s r5add_hiddenimportsz PyiModuleGraph.add_hiddenimportss $000  7 7E>>%((D =uEEEE 8%@@@ ,,U33Eu::???? 8DD"LL!=uEEEH MM$/ 6 6 6 6! 7 7s2B%B87B8modulereturnc0i}tdhz}||}|rq||}|D]Y}|t|j|vr|j}||ks||dzrB|jJ|j||j<Z|S)z> Find modules that import a given **module**. rNr)r rincomingrrr startswithr)r0r+co_dictpure_python_module_typesr referrersr<rs r5get_code_usingzPyiModuleGraph.get_code_usings#; ? $  ~~f%%  / d++I / /977#+CCC\ '':+@+@#+N+N'6>() %%r6ct}||ddgdgz}dD]}|||gdgz}|S)zK Collect metadata for all packages that appear to need it. pkg_resourcesget_distributionrequire)zimportlib.metadataimportlib_metadata)metadata distributionversionfilesrequires)rA_metadata_from)r0outr8s r5metadata_requiredz PyiModuleGraph.metadata_requireds~ ee t""   K   #O    4&&"LLL CC  r6c ddlm}ddlm}t }t }|D]/}|t j|dz|z0|D]/}|t j|dz|z0t } || D]\} } t j |  D]~} | D]y\} }t|dkr|d} | |vr| ||n$| |vr | ||dj#|j $rYvwxYw| S)a Collect metadata whose requirements are implied by given function names. Args: package: The module name that must be imported in a source file to trigger the search. methods: Function names from **package** which take a distribution name as an argument and imply that metadata is required for that distribution. recursive_methods: Like **methods** but also implies that a distribution's dependencies' metadata must be collected too. Returns: Required metadata in hook data ``(source, dest)`` format as returned by :func:`PyInstaller.utils.hooks.copy_metadata()`. Scan all source code to be included for usage of particular *key* functions which imply that that code will require metadata for some distribution (which may not be its own) at runtime. In the case of a match, collect the required metadata. r) copy_metadata)r8rr"T) recursive)PyInstaller.utils.hooksrBPyInstaller.compatr8rArr any_aliasr3rarecursive_function_callsvaluesrPackageNotFoundError)r0packagemethodsrecursive_methodsrBr8 need_metadataneed_recursive_metadatamethodr?rxrcalls function_namerms r5r>zPyiModuleGraph._metadata_from,s( :99999999999 "%%% M MF  !3GcMF4J!K!K L L L L' W WF # * *8+=gmf>T+U+U V V V Vee--g66<<>> ! !JD$!:4@@GGII ! !+0 ! !'M44yyA~~ "1gG!(M99JJ}}W'='=>>>>*.EEEJJ}}W'M'M'MNNN-B!!! ! ! !  sAE E( 'E( cLd||jDS)z? Return the list of collected python packages. cfg|].}t|jdkt|j/S)r)rrrbr)rrs r5rz9PyiModuleGraph.get_collected_packages..es@   %)Dzz"i//  ///r6r)rr,rs r5get_collected_packagesz%PyiModuleGraph.get_collected_packages`s4   -1__4CX_-Y-Y    r6cg}||jD]N}t|j}|j|D]\}}|||dfO|S)zF Return the TOC list of binaries collected by hooks." rBINARY)rr,rbrr>rrer0rrrf dest_namesrc_names r5make_hook_binaries_tocz%PyiModuleGraph.make_hook_binaries_tocjsOO$*?O@@ < rrerWs r5make_hook_datas_tocz"PyiModuleGraph.make_hook_datas_tocvsOO$*?O@@ : :Ddo..K'+'C'I'I+'V'V : :# 8 Ix89999 : r6r&r&rk)/r __module__ __qualname____doc__rrrrqr*r.rX staticmethodrnr|msginmsgoutrJr/rrrrrrrrrrrrrr rrr%r*rbr?r3rAr@r>rNrTrZr] __classcell__)r4s@r5r!r!Cs!!H!Uu5II % % % % % %'@'@'@R#F#F#FJ22\2 : E F0002 ] ] ]??????4>>>@    Ocnr]]]]]]~+Y+Y+Y+Y+YZ%M%M%M%M%MN*&888333 000  $ $ $\ $D;;;666 XXXBB7772ST<322232222h           T        r6r!r&c|pd}|pd}d|vr|dz }trUtj|krEtdt t}|||Stdt t|t|}tsMtdt |adt_ dt_ dt_ |S) a Create the cached module graph. This function might appear weird but is necessary for speeding up test runtime because it allows caching basic ModuleGraph object that gets created for 'base_library.zip'. Parameters ---------- excludes : list List of the fully-qualified names of all modules to be "excluded" and hence _not_ frozen into the executable. user_hook_dirs : list List of the absolute paths of all directories containing user-defined hooks for the current application or `None` if no such directories were specified. Returns ---------- PyiModuleGraph Module graph with core dependencies. r&__main__)rgz)Reusing cached module dependency graph...z'Initializing module dependency graph...)r(impliesr2z"Caching module dependency graph...N) _cached_module_graph_r-rHrIrr.r!rrrKrLrM)r(r2rs r5initialize_modgraphrjs*$)rN~2H!!M! !6!@H!L!L ?@@@.// ^$$$  KK9:::  %    E ! A 8999 ((,$>B;<@9 Lr6cTtd}t}tjt dd}dD]}t|}t |drtj|j}tj tj |dkr tjd|}| t||d| dtj|jdf|d tj|d dfd tj|d dfd tj|ddfgz }tr6| dtj|ddf| dtj|ddf|S)zf Get TOC with the bootstrapping modules and their dependencies. :return: TOC with modules struct PyInstallerloader)_structzlib__file__z lib-dynload EXTENSIONPYMODULEpyimod01_archivezpyimod01_archive.pypyimod02_importerszpyimod02_importers.pypyimod03_ctypeszpyimod03_ctypes.pypyimod04_pywin32zpyimod04_pywin32.pypyiboot01_bootstrapzpyiboot01_bootstrap.pyPYSOURCE) __import__rNrCrDrErrrPrqrdirnamererr) mod_struct loader_mods loaderpathr$rmod_files r5get_bootstrap_modulesrs H%%J&&Kh x@@J(YY"" 3 # # Yws|44Hw 9 9::mKK7<< x@@   6x;WW X X X"'//*2E"F"F STTT RW\\*6KLLjY rw||J8OPPR\] BGLL5IJJJWK n. ZI^0_0_aklmmm-rw||JH`/a/acmnooo r6r^):rarRrCrr collectionsrcopyrrmrrrloggingPyInstaller.building.utilsrrEr r r r r rrrPyInstaller.dependrPyInstaller.depend.imphookrrPyInstaller.depend.imphookapirr(PyInstaller.lib.modulegraph.find_modulesr'PyInstaller.lib.modulegraph.modulegraphrrrrPyInstaller.logrrrrDrr getLoggerrrHrFHOOK_PRIORITY_CONTRIBUTED_HOOKSHOOK_PRIORITY_UPSTREAM_HOOKSHOOK_PRIORITY_USER_HOOKSr!rirjrr&r6r5rsE2 ######--------&&&&&&>>>>>>('''''LLLLLLLLXXXXXXXX@@@@@@uuuuuuuuuuuu..........BBBBBBBB  8 $ $$"' } } } } } [} } } @@@@@F!!!!!r6