/opt/alt/python37/lib/python3.7/site-packages/distlib/__pycache__
NameSizeModeActions
compat.cpython-37.opt-1.pyc315290644editdlrm
compat.cpython-37.pyc315680644editdlrm
database.cpython-37.opt-1.pyc427950644editdlrm
database.cpython-37.pyc427950644editdlrm
index.cpython-37.opt-1.pyc170790644editdlrm
index.cpython-37.pyc170790644editdlrm
locators.cpython-37.opt-1.pyc384860644editdlrm
locators.cpython-37.pyc385280644editdlrm
manifest.cpython-37.opt-1.pyc101380644editdlrm
manifest.cpython-37.pyc102500644editdlrm
markers.cpython-37.opt-1.pyc49640644editdlrm
markers.cpython-37.pyc50050644editdlrm
metadata.cpython-37.opt-1.pyc272700644editdlrm
metadata.cpython-37.pyc273370644editdlrm
resources.cpython-37.opt-1.pyc108340644editdlrm
resources.cpython-37.pyc108340644editdlrm
scripts.cpython-37.opt-1.pyc110740644editdlrm
scripts.cpython-37.pyc110740644editdlrm
util.cpython-37.opt-1.pyc509710644editdlrm
util.cpython-37.pyc513520644editdlrm
version.cpython-37.opt-1.pyc203660644editdlrm
version.cpython-37.pyc204340644editdlrm
wheel.cpython-37.opt-1.pyc265000644editdlrm
wheel.cpython-37.pyc265740644editdlrm
__init__.cpython-37.opt-1.pyc10020644editdlrm
__init__.cpython-37.pyc10020644editdlrm
Edit: /opt/alt/python37/lib/python3.7/site-packages/distlib/__pycache__/compat.cpython-37.pyc (31568B)
B :a+ @sddlmZddlZddlZddlZy ddlZWnek rHdZYnXejddkrfddlmZe fZ e Z ddl mZddlZddlZddlmZmZmZmZmZddlmZmZmZmZmZm Z m!Z!dd Zddl"Z"dd l"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+erdd l"m,Z,ddl-Z-ddl.Z.ddl/Z0dd l1m1Z1ddl2Z2e3Z3dd l4m5Z6ddl4m7Z8nddl9mZe:fZ e:Z ddl9m;ZddlZddlZddlm$Z$mZm#Z#mZmZm'Z'm(Z(m)Z)m*Z*m+Z+er dd l>m,Z,ddl?m&Z&m%Z%m Z ddl@mAZ-ddl>mBZ"ddlCmAZ.ddl0Z0dd lDm1Z1ddlEmFZ2eGZ3ddl4m8Z8e6Z6yddlmHZHmIZIWn8ek rGdddeJZId`ddZKddZHYnXyddl mLZMWn&ek rGdddeNZMYnXyddllmmnZnWn"ek rdd>lomnZnYnXejdd?d@kre1jpZpn ddAlmmpZpyddBlqmrZrWndek r~ddClqmsZsyddDltmuZvWn ek rhdadFdGZvYnXGdHdIdIesZrYnXyddJlwmxZxWn ek rdbdKdLZxYnXyddMlqmyZyWnek rLyddNlzm{Z|Wn"ek rddNl}m{Z|YnXyddOl~mZmZmZWnek r6YnXGdPdQdQeZyYnXyddRlmZmZWnvek rejdSejZdTdUZGdVdWdWeZdcdXdYZGdZd[d[eZGd\d]d]eZGd^d_d_eNZYnXdS)d)absolute_importN)StringIO)FileType)urlparse urlunparseurljoinurlsplit urlunsplit) urlretrievequoteunquote url2pathname pathname2urlContentTooShortError splittypecCst|tr|d}t|S)Nzutf-8) isinstanceunicodeencode_quote)sr?/opt/alt/python37/lib/python3.7/site-packages/distlib/compat.pyr s  r ) RequesturlopenURLError HTTPErrorHTTPBasicAuthHandlerHTTPPasswordMgr HTTPHandlerHTTPRedirectHandler build_opener) HTTPSHandler) HTMLParser)ifilter) ifilterfalse) TextIOWrapper)rrrr r r r r) rr rrrrrrr r!)rrr) filterfalse)match_hostnameCertificateErrorc@s eZdZdS)r)N)__name__ __module__ __qualname__rrrrr)_sr)c Csg}|s dS|d}|d|dd}}|d}||krNtdt||sb||kS|dkrv|dn>|d s|d r|t|n|t| d d x|D]}|t|qWt d d |dtj } | |S)zpMatching according to RFC 6125, section 6.4.3 http://tools.ietf.org/html/rfc6125#section-6.4.3 F.rr-N*z,too many wildcards in certificate DNS name: z[^.]+zxn--z\*z[^.]*z\Az\.z\Z)splitcountr)reprlowerappend startswithreescapereplacecompilejoin IGNORECASEmatch) ZdnhostnameZ max_wildcardsZpatspartsZleftmostZ remainderZ wildcardsfragZpatrrr_dnsname_matchcs(    r@cCs|s tdg}|dd}x0|D](\}}|dkr"t||r@dS||q"W|sxF|ddD]6}x0|D](\}}|dkrjt||rdS||qjWq`Wt|dkrtd |d tt|fn*t|dkrtd ||d fntd dS)a=Verify that *cert* (in decoded format as returned by SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 rules are followed, but IP addresses are not accepted for *hostname*. CertificateError is raised on failure. On success, the function returns nothing. ztempty or no certificate, match_hostname needs a SSL socket or SSL context with either CERT_OPTIONAL or CERT_REQUIREDZsubjectAltNamerZDNSNZsubjectZ commonNamer-z&hostname %r doesn't match either of %sz, zhostname %r doesn't match %rrz=no appropriate commonName or subjectAltName fields were found) ValueErrorgetr@r4lenr)r:mapr2)Zcertr=ZdnsnamesZsankeyvaluesubrrrr(s.     r()SimpleNamespacec@seZdZdZddZdS) ContainerzR A generic container for when multiple values need to be returned cKs|j|dS)N)__dict__update)selfkwargsrrr__init__szContainer.__init__N)r*r+r,__doc__rNrrrrrIsrI)whichc s"dd}tjr&||r"SdS|dkr>tjdtj}|sFdS|tj}tj dkrtj |krt| dtj tjddtj}t fd d |Drg}q‡fd d |D}ng}t }xT|D]L}tj|}||kr||x(|D] } tj|| } || |r| SqWqWdS) aKGiven a command, mode, and a PATH string, return the path which conforms to the given mode on the PATH, or None if there is no such file. `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result of os.environ.get("PATH"), or can be overridden with a custom search path. cSs&tj|o$t||o$tj| S)N)ospathexistsaccessisdir)fnmoderrr _access_checkszwhich.._access_checkNPATHZwin32rZPATHEXTc3s |]}|VqdS)N)r3endswith).0ext)cmdrr szwhich..csg|] }|qSrr)r\r])r^rr szwhich..)rQrRdirnameenvironrBdefpathr0pathsepsysplatformcurdirinsertanysetnormcaseaddr:) r^rWrRrXZpathextfilesseendirZnormdirZthefilenamer)r^rrPs8            rP)ZipFile __enter__) ZipExtFilec@s$eZdZddZddZddZdS)rscCs|j|jdS)N)rJrK)rLbaserrrrNszZipExtFile.__init__cCs|S)Nr)rLrrrrrszZipExtFile.__enter__cGs |dS)N)close)rLexc_inforrr__exit__szZipExtFile.__exit__N)r*r+r,rNrrrwrrrrrssrsc@s$eZdZddZddZddZdS)rqcCs|S)Nr)rLrrrrr#szZipFile.__enter__cGs |dS)N)ru)rLrvrrrrw&szZipFile.__exit__cOstj|f||}t|S)N) BaseZipFileopenrs)rLargsrMrtrrrry*sz ZipFile.openN)r*r+r,rrrwryrrrrrq"srq)python_implementationcCs0dtjkrdStjdkrdStjdr,dSdS)z6Return a string identifying the Python implementation.ZPyPyjavaZJythonZ IronPythonZCPython)reversionrQrpr5rrrrr{1s   r{)CallablecCs t|tS)N)rr~)objrrrcallableCsrzutf-8mbcsstrictsurrogateescapecCs:t|tr|St|tr$|ttStdt|jdS)Nzexpect bytes or str, not %s) rbytes text_typer _fsencoding _fserrors TypeErrortyper*)filenamerrrfsencodeWs    rcCs:t|tr|St|tr$|ttStdt|jdS)Nzexpect bytes or str, not %s) rrrdecoderrrrr*)rrrrfsdecode`s    r)detect_encoding)BOM_UTF8lookupzcoding[:=]\s*([-\w.]+)cCsH|dddd}|dks*|dr.dS|dks@|drDd S|S) z(Imitates get_normal_name in tokenizer.c.N _-zutf-8zutf-8-)zlatin-1z iso-8859-1z iso-latin-1)zlatin-1-z iso-8859-1-z iso-latin-1-z iso-8859-1)r3r8r5)orig_encencrrr_get_normal_nameqs rcsy jjWntk r$dYnXdd}d}fdd}fdd}|}|trpd|d d}d }|s||gfS||}|r||gfS|}|s||gfS||}|r|||gfS|||gfS) a? The detect_encoding() function is used to detect the encoding that should be used to decode a Python source file. It requires one argument, readline, in the same way as the tokenize() generator. It will call readline a maximum of twice, and return the encoding used (as a string) and a list of any lines (left as bytes) it has read in. It detects the encoding from the presence of a utf-8 bom or an encoding cookie as specified in pep-0263. If both a bom and a cookie are present, but disagree, a SyntaxError will be raised. If the encoding cookie is an invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, 'utf-8-sig' is returned. If no encoding is specified, then the default of 'utf-8' will be returned. NFzutf-8cs yStk rdSXdS)N) StopIterationr)readlinerr read_or_stopsz%detect_encoding..read_or_stopcsy|d}Wn4tk rBd}dk r6d|}t|YnXt|}|sVdSt|d}y t|}Wn:tk rdkrd|}n d|}t|YnXr|j dkr؈dkrd}n d}t||d 7}|S) Nzutf-8z'invalid or missing encoding declarationz {} for {!r}rzunknown encoding: zunknown encoding for {!r}: {}zencoding problem: utf-8z encoding problem for {!r}: utf-8z-sig) rUnicodeDecodeErrorformat SyntaxError cookie_refindallrr LookupErrorrp)line line_stringmsgZmatchesencodingcodec) bom_foundrrr find_cookies6       z$detect_encoding..find_cookieTrz utf-8-sig)__self__rpAttributeErrorr5r)rrdefaultrrfirstsecondr)rrrrr|s4   &     r)r7)r)unescape)ChainMap)MutableMapping)recursive_repr...csfdd}|S)zm Decorator to make a repr function return fillvalue for a recursive call csLtfdd}td|_td|_td|_tdi|_|S)Nc sBt|tf}|krS|z |}Wd|X|S)N)id get_identrldiscard)rLrEresult) fillvalue repr_running user_functionrrwrappers   z=_recursive_repr..decorating_function..wrapperr+rOr*__annotations__)rjgetattrr+rOr*r)rr)r)rrrdecorating_functions   z,_recursive_repr..decorating_functionr)rrr)rr_recursive_reprs rc@seZdZdZddZddZddZd'd d Zd d Zd dZ ddZ ddZ e ddZ eddZddZeZddZeddZddZdd Zd!d"Zd#d$Zd%d&ZdS)(ra A ChainMap groups multiple dicts (or other mappings) together to create a single, updateable view. The underlying mappings are stored in a list. That list is public and can accessed or updated using the *maps* attribute. There is no other state. Lookups search the underlying mappings successively until a key is found. In contrast, writes, updates, and deletions only operate on the first mapping. cGst|p ig|_dS)zInitialize a ChainMap by setting *maps* to the given mappings. If no mappings are provided, a single empty dictionary is used. N)listmaps)rLrrrrrNszChainMap.__init__cCs t|dS)N)KeyError)rLrErrr __missing__szChainMap.__missing__c Cs8x,|jD]"}y||Stk r(YqXqW||S)N)rrr)rLrEmappingrrr __getitem__s   zChainMap.__getitem__NcCs||kr||S|S)Nr)rLrErrrrrB$sz ChainMap.getcCsttj|jS)N)rCrjunionr)rLrrr__len__'szChainMap.__len__cCsttj|jS)N)iterrjrr)rLrrr__iter__*szChainMap.__iter__cstfdd|jDS)Nc3s|]}|kVqdS)Nr)r\m)rErrr_.sz(ChainMap.__contains__..)rir)rLrEr)rEr __contains__-szChainMap.__contains__cCs t|jS)N)rir)rLrrr__bool__0szChainMap.__bool__cCsd|dtt|jS)Nz{0.__class__.__name__}({1})z, )rr:rDr2r)rLrrr__repr__3szChainMap.__repr__cGs|tj|f|S)z?Create a ChainMap with a single dict created from the iterable.)dictfromkeys)clsiterablerzrrrr8szChainMap.fromkeyscCs$|j|jdf|jddS)zHNew ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]rr-N) __class__rcopy)rLrrrr=sz ChainMap.copycCs|jif|jS)z;New ChainMap with a new dict followed by all previous maps.)rr)rLrrr new_childCszChainMap.new_childcCs|j|jddS)zNew ChainMap from maps[1:].r-N)rr)rLrrrparentsGszChainMap.parentscCs||jd|<dS)Nr)r)rLrErFrrr __setitem__LszChainMap.__setitem__cCs8y|jd|=Wn"tk r2td|YnXdS)Nrz(Key not found in the first mapping: {!r})rrr)rLrErrr __delitem__OszChainMap.__delitem__cCs0y|jdStk r*tdYnXdS)zPRemove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.rz#No keys found in the first mapping.N)rpopitemr)rLrrrrUszChainMap.popitemcGs>y|jdj|f|Stk r8td|YnXdS)zWRemove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].rz(Key not found in the first mapping: {!r}N)rpoprr)rLrErzrrrr\sz ChainMap.popcCs|jddS)z'Clear maps[0], leaving maps[1:] intact.rN)rclear)rLrrrrcszChainMap.clear)N)r*r+r,rOrNrrrBrrrrrr classmethodrr__copy__rpropertyrrrrrrrrrrrs(    r)cache_from_sourcecCs0|dst|dkrd}|r$d}nd}||S)Nz.pyTco)r[AssertionError)rRdebug_overridesuffixrrrrjsr) OrderedDict)r)KeysView ValuesView ItemsViewc@seZdZdZddZejfddZejfddZdd Zd d Z d d Z d6ddZ ddZ ddZ ddZddZddZddZddZeZeZefdd Zd7d"d#Zd8d$d%Zd&d'Zd(d)Zed9d*d+Zd,d-Zd.d/Zd0d1Zd2d3Z d4d5Z!d!S):rz)Dictionary that remembers insertion ordercOsnt|dkrtdt|y |jWn6tk r\g|_}||dg|dd<i|_YnX|j||dS)zInitialize an ordered dictionary. Signature is the same as for regular dictionaries, but keyword arguments are not recommended because their insertion order is arbitrary. r-z$expected at most 1 arguments, got %dN)rCr_OrderedDict__rootr_OrderedDict__map_OrderedDict__update)rLrzkwdsrootrrrrNs    zOrderedDict.__init__cCsF||kr6|j}|d}|||g|d<|d<|j|<||||dS)z!od.__setitem__(i, y) <==> od[i]=yrr-N)rr)rLrErFZ dict_setitemrlastrrrrs  zOrderedDict.__setitem__cCs0||||j|\}}}||d<||d<dS)z od.__delitem__(y) <==> del od[y]r-rN)rr)rLrEZ dict_delitem link_prev link_nextrrrrs zOrderedDict.__delitem__ccs2|j}|d}x||k r,|dV|d}qWdS)zod.__iter__() <==> iter(od)r-rN)r)rLrcurrrrrrs   zOrderedDict.__iter__ccs2|j}|d}x||k r,|dV|d}qWdS)z#od.__reversed__() <==> reversed(od)rrN)r)rLrrrrr __reversed__s   zOrderedDict.__reversed__cCshyDx|jD]}|dd=qW|j}||dg|dd<|jWntk rXYnXt|dS)z.od.clear() -> None. Remove all items from od.N)r itervaluesrrrr)rLZnoderrrrrszOrderedDict.clearTcCs||s td|j}|r8|d}|d}||d<||d<n |d}|d}||d<||d<|d}|j|=t||}||fS)zod.popitem() -> (k, v), return and remove a (key, value) pair. Pairs are returned in LIFO order if last is true or FIFO order if false. zdictionary is emptyrr-r)rrrrr)rLrrlinkrrrErFrrrrs   zOrderedDict.popitemcCst|S)zod.keys() -> list of keys in od)r)rLrrrkeysszOrderedDict.keyscsfddDS)z#od.values() -> list of values in odcsg|] }|qSrr)r\rE)rLrrr`sz&OrderedDict.values..r)rLr)rLrvaluesszOrderedDict.valuescsfddDS)z.od.items() -> list of (key, value) pairs in odcsg|]}||fqSrr)r\rE)rLrrr`sz%OrderedDict.items..r)rLr)rLritemsszOrderedDict.itemscCst|S)z0od.iterkeys() -> an iterator over the keys in od)r)rLrrriterkeysszOrderedDict.iterkeysccsx|D]}||VqWdS)z2od.itervalues -> an iterator over the values in odNr)rLkrrrrs zOrderedDict.itervaluesccs x|D]}|||fVqWdS)z=od.iteritems -> an iterator over the (key, value) items in odNr)rLrrrr iteritemss zOrderedDict.iteritemscOst|dkr tdt|fn |s,td|d}d}t|dkrL|d}t|trrx^|D]}||||<q\WnDt|drx8|D]}||||<qWnx|D]\}}|||<qWx|D]\}}|||<qWdS) aod.update(E, **F) -> None. Update od from dict/iterable E and F. If E is a dict instance, does: for k in E: od[k] = E[k] If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] Or if E is an iterable of items, does: for k, v in E: od[k] = v In either case, this is followed by: for k, v in F.items(): od[k] = v rz8update() takes at most 2 positional arguments (%d given)z,update() takes at least 1 argument (0 given)rrr-rN)rCrrrhasattrrr)rzrrLotherrErFrrrrKs&      zOrderedDict.updatecCs0||kr||}||=|S||jkr,t||S)zod.pop(k[,d]) -> v, remove specified key and return the corresponding value. If key is not found, d is returned if given, otherwise KeyError is raised. )_OrderedDict__markerr)rLrErrrrrr&s zOrderedDict.popNcCs||kr||S|||<|S)zDod.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in odr)rLrErrrr setdefault3szOrderedDict.setdefaultcCs^|si}t|tf}||kr"dSd||<z&|s>d|jjfSd|jj|fS||=XdS)zod.__repr__() <==> repr(od)z...r-z%s()z%s(%r)N)r _get_identrr*r)rLZ _repr_runningZcall_keyrrrr:szOrderedDict.__repr__cs\fddD}t}xttD]}||dq*W|rPj|f|fSj|ffS)z%Return state information for picklingcsg|]}||gqSrr)r\r)rLrrr`Jsz*OrderedDict.__reduce__..N)varsrrrr)rLrZ inst_dictrr)rLr __reduce__Hs zOrderedDict.__reduce__cCs ||S)z!od.copy() -> a shallow copy of od)r)rLrrrrRszOrderedDict.copycCs |}x|D] }|||<q W|S)zOD.fromkeys(S[, v]) -> New ordered dictionary with keys from S and values equal to v (which defaults to None). r)rrrFdrErrrrVs  zOrderedDict.fromkeyscCs6t|tr*t|t|ko(||kSt||S)zod.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive while comparison to a regular mapping is order-insensitive. )rrrCrr__eq__)rLrrrrras  zOrderedDict.__eq__cCs ||k S)Nr)rLrrrr__ne__jszOrderedDict.__ne__cCst|S)z@od.viewkeys() -> a set-like object providing a view on od's keys)r)rLrrrviewkeysoszOrderedDict.viewkeyscCst|S)z an object providing a view on od's values)r)rLrrr viewvaluessszOrderedDict.viewvaluescCst|S)zBod.viewitems() -> a set-like object providing a view on od's items)r)rLrrr viewitemswszOrderedDict.viewitems)T)N)N)N)"r*r+r,rOrNrrrrrrrrrrrrrrKrobjectrrrrrrrrrrrrrrrrrrs:         r)BaseConfigurator valid_identz^[a-z_][a-z0-9_]*$cCst|}|std|dS)Nz!Not a valid Python identifier: %rT) IDENTIFIERr<rA)rrrrrr s  r c@s"eZdZdZddZdddZdS)ConvertingDictz A converting dictionary wrapper.cCsJt||}|j|}||k rF|||<t|tttfkrF||_||_ |S)N) rr configuratorconvertrr ConvertingListConvertingTupleparentrE)rLrErFrrrrrs   zConvertingDict.__getitem__NcCsLt|||}|j|}||k rH|||<t|tttfkrH||_||_ |S)N) rrBr r rr rrrrE)rLrErrFrrrrrBs  zConvertingDict.get)N)r*r+r,rOrrBrrrrr s r cCsDt|||}|j|}||k r@t|tttfkr@||_||_ |S)N) rrr r rr rrrrE)rLrErrFrrrrrs  rc@s"eZdZdZddZdddZdS) rzA converting list wrapper.cCsJt||}|j|}||k rF|||<t|tttfkrF||_||_ |S)N) rrr r rr rrrrE)rLrErFrrrrrs   zConvertingList.__getitem__cCs<t||}|j|}||k r8t|tttfkr8||_|S)N) rrr r rr rrr)rLidxrFrrrrrs   zConvertingList.popN)r)r*r+r,rOrrrrrrrs rc@seZdZdZddZdS)rzA converting tuple wrapper.cCsBt||}|j|}||k r>t|tttfkr>||_||_ |S)N) tuplerr r rr rrrrE)rLrErFrrrrrs   zConvertingTuple.__getitem__N)r*r+r,rOrrrrrrsrc@seZdZdZedZedZedZedZ edZ ddd Z e e Zd d Zd d ZddZddZddZddZddZdS)rzQ The configurator base class which defines some useful defaults. z%^(?P[a-z]+)://(?P.*)$z ^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$ ext_convert cfg_convert)r]ZcfgcCst||_||j_dS)N)r configr )rLrrrrrNs zBaseConfigurator.__init__c Cs|d}|d}y`||}xP|D]H}|d|7}yt||}Wq&tk rl||t||}Yq&Xq&W|Stk rtdd\}}td||f}|||_ |_ |YnXdS)zl Resolve strings to objects using standard import and attribute syntax. r.rr-NzCannot resolve %r: %s) r0rimporterrr ImportErrorrervrA __cause__ __traceback__) rLrrpZusedfoundr?etbvrrrresolves"      zBaseConfigurator.resolvecCs ||S)z*Default converter for the ext:// protocol.)r)rLrFrrrrszBaseConfigurator.ext_convertcCs|}|j|}|dkr&td|n||d}|j|d}x|r|j|}|rp||d}nd|j|}|r|d}|j|s||}n2yt |}||}Wnt k r||}YnX|r||d}qJtd||fqJW|S)z*Default converter for the cfg:// protocol.NzUnable to convert %rrzUnable to convert %r at %r) WORD_PATTERNr<rAendrgroups DOT_PATTERN INDEX_PATTERN DIGIT_PATTERNintr)rLrFrestrrrnrrrr s2       zBaseConfigurator.cfg_convertcCst|ts$t|tr$t|}||_nt|tsHt|trHt|}||_nzt|tslt|trlt|}||_nVt|tr|j |}|r| }|d}|j |d}|r|d}t||}||}|S)z Convert values to an appropriate type. dicts, lists and tuples are replaced by their converting alternatives. Strings are checked to see if they have a conversion format and are converted if they do. prefixNr)rr rr rrrr string_typesCONVERT_PATTERNr< groupdictvalue_convertersrBr)rLrFrrr)Z converterrrrrr .s*     zBaseConfigurator.convertcsrd}t|s||}dd}tfddD}|f|}|rnx |D]\}}t|||qVW|S)z1Configure an object with a user-supplied factory.z()r.Ncs g|]}t|r||fqSr)r )r\r)rrrr`Qsz5BaseConfigurator.configure_custom..)rrrrrsetattr)rLrrZpropsrMrrprFr)rrconfigure_customJs    z!BaseConfigurator.configure_customcCst|trt|}|S)z0Utility function which converts lists to tuples.)rrr)rLrFrrras_tupleXs zBaseConfigurator.as_tupleN)r*r+r,rOr6r9r+r r#r$r%r- staticmethod __import__rrNrrrr r/r0rrrrrs      "r)r-)r)N)N)Z __future__rrQr6reZsslr version_inforZ basestringr*rrtypesrZ file_typeZ __builtin__builtinsZ ConfigParserZ configparserrrrr r Zurllibr r rr rrrrZurllib2rrrrrrrr r!r"ZhttplibZ xmlrpclibZQueueZqueuer#ZhtmlentitydefsZ raw_input itertoolsr$filterr%r'iostrr&ZshutilZ urllib.parseZurllib.requestZ urllib.errorZ http.clientZclientZrequestZ xmlrpc.clientZ html.parserZ html.entitiesZentitiesinputr(r)rAr@rHrIrrPF_OKX_OKZzipfilerqrxrrsZBaseZipExtFilerfr{Z sysconfigr NameErrorZcollections.abcr~rrrgetfilesystemencodingrrtokenizercodecsrrr9rrZhtmlr7Zcgir collectionsrrreprlibrrimportlib.utilrrZthreadrrZ dummy_threadZ_abcollrrrrZlogging.configrr Ir r rrrrrrrrrs     $,     (0        2+A             [   b w