KGRKJGETMRETU895U-589TY5MIGM5JGB5SDFESFREWTGR54TY
Server : Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8e-fips-rhel5 DAV/2 PHP/5.2.17
System : Linux localhost 2.6.18-419.el5 #1 SMP Fri Feb 24 22:47:42 UTC 2017 x86_64
User : nobody ( 99)
PHP Version : 5.2.17
Disable Function : NONE
Directory :  /proc/21572/root/usr/lib64/python2.4/site-packages/sabayon/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //proc/21572/root/usr/lib64/python2.4/site-packages/sabayon/storage.pyc
mò
»fEOc@sÓdkZdkZdkZdkZdkZdkZdkZdkZdk	Z	dk
Z
dkZdkZdk
Td„Zd„Zeed„Zd„Zdefd„ƒYZdfd	„ƒYZd
„ZdS(N(t*cGstiti||ƒdS(N(tutiltdebug_printt
DEBUG_STORAGEtfmttargs(RR((t5/usr/lib64/python2.4/site-packages/sabayon/storage.pytdprint!scCs‰tii|ƒpdSntii|ƒoJx6ti|ƒD]%}tii||ƒ}t|ƒq>Wti	|ƒnti
|ƒdS(N(tostpathtexiststisdirtlistdirtfiletjointsubpatht
recursive_deltrmdirtremove(R	R
R((RR$sc	Cs\|djo
|}ny<tdtii||ƒƒtitii||ƒƒWn2t	j
o&}|itijo
|‚qˆnXxÍti
tii||ƒƒD]­}tii|||ƒ}tii|ƒo5t||tii||ƒtii||ƒƒq§tii|||ƒ}|ptii|ƒoti||ƒq§q§WdS(Ns
Making dir %s(tsrc_nametNonetdst_nameRRR	Rtdst_basetmakedirstOSErrorterrterrnotEEXISTRtsrc_basetftsrc_pathRt	copy_treetdst_patht	overwriteR
tshutiltcopy2(	RRRRR!R RRR((RR0s&

 cCs?|i}x/|o'|}|i}|iƒ|iƒqWdS(N(tnodetchildrenttmptnextt
unlinkNodetfreeNode(R$R&R%((Rtunlink_childrenHs		
tProfileStorageExceptioncBstZRS(N(t__name__t
__module__(((RR+PstProfileStoragecBs"tZdZd„Zd„Zd„Zd„Zd„Zd„Zd„Z	e
d„Ze
d	„Zd
„Z
d„Zd„Ze
e
d
„Zd„Ze
d„Ze
d„Ze
d„Zd„Zd„Zd„Zed„Ze
d„Zd„Ze
e
d„Zd„Zd„Zd„ZRS(s¯An encapsulation of all the files which make up the
    contents of a profile.

    The files are stored in a ZIP file with metadata. In
    order to add/extract files to the profile, they are first
    copied to/from a temporary directory which is then zipped.
    Note, though, that the fact that its a ZIP file and the
    fact that there is a temporary directory are both
    implementation details and not exposed in the API.

    Profile files are stored in /etc/desktop-profiles.

    Each file or directory in the profile has metadata
    associated with it - the "source" of the file/directory
    and a set of arbitrary key value pairs which that source
    may interpret.
    cCs4||_d|_tii|iƒpÅy˜ti|iƒd}|djo#tiit	|idƒ|_nO|idjt
iƒ}|i
|iƒ|_|idjo|i|_nWqötiit	|idƒ|_qöXn
||_d|_d|_d|_t|_td|i|iƒdS(s„Create a ProfileStorage.

        @name: the name of the profile - translates to
        /etc/desktop-profiles/$(name).zip.
        its.zipisCreating profile '%s' from '%s'N(tnametselftreadonlyRR	tisabsturlparsetprotocolRtPROFILESDIRtcachetget_default_cachetcachoutget_resourceRtmetadatatzipt	temp_pathtFalsetneeds_savingR(R1R0R5R9((Rt__init__fs*		
#
'					cCss|ioti|iƒnd|_|io|iiƒnd|_|io|iiƒnd|_dS(N(	R1R=R"trmtreeRR;tfreeDocR<tclose(R1((Rt__del__ˆs
	
	
cCsNtidƒ}|idddƒ}|idddƒ|idddƒ|S(Ns1.0R;tdirectoriestfiles(tlibxml2tnewDocR;tnewChildRtroot(R1RJR;((Rt__create_empty_metadata_doc•s
cCsø|idj	odSntii|iƒp0td|iƒ|iƒ|_t|_	dSntd|iƒyt
i|idƒ|_Wn0t
tdƒ|itiƒdfƒ‚nXy:|iidƒ}ti|t|ƒddtiƒ}Wn0t
tdƒ|itiƒdfƒ‚nX|iƒ}|p|idjo7|iƒt
tdƒ|itiƒdfƒ‚n||_t|id	ƒƒd
jo|idd	dƒnt|idƒƒd
jo|idddƒndS(NsProfile file '%s' doesn't existsReading metadata from '%s'trsFailed to read file '%s': %siR;s%Failed to read metadata from '%s': %ss$Invalid metadata section in '%s': %sREiRF(R1R;RRR	R
Rt*_ProfileStorage__create_empty_metadata_doctTrueR?tzipfiletZipFileR<R+t_tsystexc_infotreadtblobRGt
readMemorytlentXML_PARSE_NOBLANKStdoctgetRootElementRJR0RBt	xpathEvalRI(R1RURYRJ((Rt__read_metadataœs:	--
-	cCs
|idƒS(Nsstring (source)(R$R[(R1R$((Rt__get_node_sourceÅscCs@h}x3|idƒD]"}|idƒ||idƒ<qW|S(Nsattributes/attributetvalueR0(t
attributesR$R[tattrnodetprop(R1R$R_R`((Rt__get_node_attributesÈs
 cCsåt|ƒ|idtttiƒƒƒƒ|idtiƒƒ|idti	ƒƒ|i
dd|ƒ|i
dddƒ}|oZxW|D]K}|i
dddƒ}|idt|ƒƒ|idt||ƒƒqŽWndS(	Nt	timestamptuserthosttsourceR_t	attributeR0R^(R*tfile_or_dir_nodetsetProptstrtintttimeRt
get_user_nametsockettgethostnameRIRRftattributes_nodeR_R0tattribute_node(R1RhRfR_R;RqR0Rp((Rt__update_file_or_dir_nodeÎs
"cCs±|djo
|i}n|pt‚|idƒd}|id|i|ƒƒ}t	|ƒo|d}n&|idddƒ}|id|ƒ|i
||||ƒdS(Ns/metadata/filesisfile[@path=%s]R
R	(R;RR1tAssertionErrorR[t
files_nodet _ProfileStorage__quote_xpath_argR	tnodesRWt	file_nodeRIRit(_ProfileStorage__update_file_or_dir_nodeRfR_(R1R	RfR_R;RwRvRt((Rt__update_file_nodeás


cCs±|djo
|i}n|pt‚|idƒd}|id|i|ƒƒ}t	|ƒo|d}n&|idddƒ}|id|ƒ|i
||||ƒdS(Ns/metadata/directoriesisdirectory[@path=%s]t	directoryR	(R;RR1RsR[RtRuR	RvRWtdirectory_nodeRIRiRxRfR_(R1R	RfR_R;R{RvRt((Rt__update_directory_nodeòs


csŽ|iƒ|iodSntiddƒ|_td|i|iƒ|ipdSnd„‰‡d†}|i
||i|ifƒdS(Ntprefixssabayon-profile-storage-sUnpacking '%s' in '%s'cCsÞtiitii||ƒƒp titii||ƒƒnx•|iƒD]‡}|i
|ƒpqOntii||ƒ}tii|ƒ}tii|ƒpti|ƒnt|dƒi|i|ƒƒqOWdS(Ntw(RR	R
RtdirR0RR<tnamelistRt
startswitht	dest_pathtdirnametdest_dirR
twriteRT(R<RR0RR‚R„((Rtunzip_directorys" 
cs´|\}}td||ƒtii||ƒ}|oˆ|||ƒnetii|tii
|ƒƒ}tii|ƒpti
|ƒnt|dƒi|i|ƒƒdS(Ns#Unzip: path = %s, is_directory = %sR~(tdataR<R=RR	tis_directoryRRtabs_pathR†RƒR„R
RR
R…RT(R	RˆR‡R‰R<R=R„(R†(Rt
unzip_foreach s
!(R1t_ProfileStorage__read_metadataR=ttempfiletmkdtempRR	R<R†RŠt_ProfileStorage__foreach_all(R1RŠR†((R†Rt__unpacks


	cCs|x9|iidƒD]%}|idƒ}||t|ƒqWx9|iidƒD]%}|idƒ}||t
|ƒqOWdS(Ns/metadata/files/fileR	s/metadata/directories/directory(R1R;R[RwRaR	tcallbackR>t	user_dataR{RN(R1RR‘R{RwR	((Rt
__foreach_all4scCs¡tii|iƒoqti|iƒo^tiit|dƒ}yt
i|i|ƒWq‡td|i|t
iƒdƒq‡Xnt|ƒ}|iƒ|S(sËCreate a new ProfileStorage object, copying the
        contents of this profile to the new profile.

        @name: the name of the new profile.

        Return value: a #ProfileStorage object.
        s.zips,Failed to copy profile from '%s' to '%s': %siN(RR	tisfileR1ROt
is_zipfileRR6R0tnew_pathR"tcopyfileRRRRSR.tretvaltsave(R1R0R•R—((Rtcopy=s)"
c	Csitd|||ƒ|iƒ|djo
|}ntii	||ƒ}tii	|i
|ƒ}tii|ƒpt
tdƒ|ƒ‚n|i|ƒ}|o|iƒ|iƒnt|ƒtii|ƒo*|i|||ƒt|i
||ƒnZ|i|||ƒtii|ƒ}tii|ƒpti|ƒnti||ƒt|_dS(svAdd a new - or update an existing - file or directory
        to the profile. If @path is a directory, then the contents
        of the directory will be recursively saved in the profile.

        @path: the relative path of the file or directory.
        @src_dir: the directory (which @path is relative to) from
        which the file or directory contents should be copied to
        the profile.
        @source: the name of the #ProfileSource with which the file
        or directory is associated.
        @attributes: a varargs list of arbitrary key/value pairs
        (specific to @source) which should be saved.
        sAdding '%s' from %s:%ss!Cannot add non-existent file '%s'N(RR	Rftsrc_dirR1t_ProfileStorage__unpackRRRRR=R R
R+RQt_ProfileStorage__get_nodeR$R(R)RRt&_ProfileStorage__update_directory_nodeR_Rt!_ProfileStorage__update_file_nodeRƒRR"R#RNR?(	R1R	RšRfR_RR$RƒR ((RtaddQs.





cCs|d|jod|jod|Sn|iddƒ}|iddƒ}|iddƒ}|iddƒ}d|}|S(	Nt"t's'%s'sss	', "'", 's	', '"', 'sconcat('%s')(R	treplacetx(R1R	R£((Rt__quote_xpath_arg~s
cCsg|djo
|i}n|pt‚|id|i|ƒƒ}t|ƒdjo|dSndS(Ns)/metadata/directories/directory[@path=%s]i(	R;RR1RsR[RuR	t	dir_nodesRW(R1R	R;R¥((Rt__get_dir_nodeŒs

cCsg|djo
|i}n|pt‚|id|i|ƒƒ}t|ƒdjo|dSndS(Ns/metadata/files/file[@path=%s]i(	R;RR1RsR[RuR	t
file_nodesRW(R1R	R;R§((Rt__get_file_node•s

cCsP|iƒ|i||ƒ}|o|Sn|i||ƒ}|o|SndS(N(R1R‹t_ProfileStorage__get_dir_nodeR	R;R$t_ProfileStorage__get_file_nodeR(R1R	R;R$((Rt
__get_nodežs
cCsxtd||iƒ|iƒ|i|ƒ}|pdSn|iƒ|iƒt	t
ii|i|ƒƒt
|_dS(s°Remove a file or directory from the profile.

        @path: the relative path of the file or directory. This is
        the same path used with ProfileStorage::add().
        s%Removing '%s' profile from profile %sN(RR	R1R0R›Rœt	item_nodeR(R)RRRR=RNR?(R1R	R¬((RR©s


cCsJ|iƒ|i|ƒ}|odSn|i|ƒ}|odSndS(NRzR
(R1R‹R©R	R$RªR(R1R	R$((Rt__get_item_type¾s
cCs8tii|i|ƒ}td||ƒtii|ƒS(sÚReturn the src path of a file or directory for extraction from the profile.

        @path: the relative path of the file or directory to extract.
        This is the same path used with ProfileStorage::add().
        s"Extract src path for '%s'  is '%s'N(RR	RR1R=textract_src_pathRtnormpath(R1R	R®((Rtget_extract_src_pathÉscCséd„}td||ƒ|iƒ|i|ƒ}|djot||i	|d|ƒnŠtii
||ƒ}|ptii|ƒoYtii|ƒ}tii|ƒpti|ƒn|tii
|i	|ƒ|ƒndS(svExtract a file or directory from the profile.

        @path: the relative path of the file or directory to extract.
        This is the same path used with ProfileStorage::add().
        @dst_dir: the directory to which the file or directory specified
        by @path should be extracted. Any subdirectories of @dst_dir
        specified by @path will be created.
        cCsžt}yti|ƒ}t}Wn2tj
o&}|i	t	i
jo
|‚qTnX|oti|ƒnti
||ƒ|oti||iƒndS(N(R>tgot_statRtstattdesttbufRNRRRtENOENTtunlinkR"R#tsrctchmodtst_mode(R·R³RR±R´((Rtcopy_preserving_permissionsßs	
sExtracting '%s' to '%s'RzN(RºRR	tdst_dirR1R›t_ProfileStorage__get_item_typet	item_typeRR=RR!RRR R
RƒR(R1R	R»R!R RºR½Rƒ((RtextractÕs	

cCs&d„}g}|i|||ƒ|S(sList the current contents of the profile.

        @source: an (optional) identifier of the source whose
        files should be listed. This is identifier as @source
        passed to ProfileStorage::add().

        Return value: a list of (@source, @path) tuples.
        cCs|i||fƒdS(N(R—tappendRfR	(RfR	R—((RtlistifysN(RÀR—R1tforeachRf(R1RfR—RÀ((Rtlists
	cCsˆ|idƒ}|i|ƒ}|ptd|ƒdSn|o||jodSn|dj	o||||ƒn|||ƒdS(NR	s#No source associated with item '%s'(R$Rat	item_pathR1t _ProfileStorage__get_node_sourcetitem_sourceRRfR‘RR(R1R$RR‘RfRÃRÅ((Rt__foreach_nodes

cCst|iƒx0|iidƒD]}|i||||ƒqWx0|iidƒD]}|i||||ƒqPWdS(sIterate over the contents of the profile:

        @callback: an function or method of which takes 
        at least two arguments - @source and @path. If @callback
        is a method, the object which the method is associated
        will be the first parameter. If @user_data is passed,
        then it will be the final parameter to the callback.
        @user_data: an (optional) parameter to pass to @callback.
        @source: an (optional) identifier of the source whose
        files should be listed.
        s/metadata/files/files/metadata/directories/directoryN(	R1R‹R;R[R$t_ProfileStorage__foreach_nodeRR‘Rf(R1RR‘RfR$((RRÁ,s
cs¨|iottdƒ|iƒ‚n|iƒ|iptd|iƒdSnd„}t	i
i|i
ƒo!|i
d}||i
|ƒnd}td|i
ƒysti|i
dƒ}|id|iid	d
ƒƒ‡d†‰‡d†}|i|||ifƒ|iƒWn%|o|||i
ƒn‚nX|ot	i|ƒn|ioti|iƒd|_nt|_ti|i
d
ƒ|_dS(sWSave the contents of the profile to
        /etc/desktop-profiles/$(name).zip.
        sProfile is read-only %ss&No changes to profile '%s' need savingNcCs"yti||ƒWnnXdS(N(RtrenameR·tdst(R·RÉ((Rtfailsafe_renameLss.baks#Writing contents of profile to '%s'R~R;tformatic	s“|iƒ}tiƒ}xtti|ƒD]c}ti
i||ƒ}ti
i|ƒo\ti
|tti
i|||ƒƒotd|ƒq‹ˆ||ti
i||ƒƒq(ti
i|ƒoÆti
i||ƒ|jo tdti
i||ƒƒq‹ti|ttti
i|||ƒƒo tdti
i||ƒƒq‹|iti
i||ƒƒ|i|ti
i||ƒƒq(q(WdS(Ns2Not going inside %s as it is an ignored directory.s8Not adding %s to zipfile since it is already in the files3Not adding %s to zipfile since it is a ignored file(tsave_zipR€tzip_filelistRtget_home_dirthomedirRRRRR	RRtshould_ignore_dirtDIRECTORIES_TO_IGNORE_PROFILER0Rt
zip_directoryR“tshould_ignore_filetFILES_TO_IGNORER¿R…(RÌRR0RÏRR	RÍ(RÒ(RRÒ_s(	 	" csP|\}}tii||ƒ}|oˆ|||ƒn|i	||ƒdS(N(
R‡RÌR=RR	RR‰RˆRÒR…(R	RˆR‡R‰R=RÌ(RÒ(Rtzip_foreach{s
RL(R1R2R+RQR0R‹R?RRÊRR	R
tbackupRRORPRÌtwritestrR;t	serializeRÒRÕRŽR=RCRR"RAR>R<(R1RÖRÊRÕRÒRÌ((RÒRR˜@s>


	



	cCs1|i|ƒ}|djohSn|i|ƒS(sNReturn the attributes associated with a file or directory
        from the profile.

        @path: the relative path of the file or directory to look up.
        This is the same path used with ProfileStorage::add().

        Return value: a dictionary containing the key/value pairs
        passed to ProfileStorage::add().
        N(R1RœR	R$Rt$_ProfileStorage__get_node_attributes(R1R	R$((Rtget_attributes˜s
	
cCs1|i|ƒ}|djodSn|i|ƒS(s
Return the source associated with a file or directory
        from the profile.

        @path: the relative path of the file or directory to look up.
        This is the same path used with ProfileStorage::add().

        Return value: a source identifier.
        N(R1RœR	R$RRÄ(R1R	R$((Rt
get_source§s

( R,R-t__doc__R@RDRMR‹RÄRÙRxRRžRR›RŽR™RŸRuR©RªRœRR¼R°R>R¾RÂRÇRÁR˜RÚRÛ(((RR.Ss8	"	
		)				1			-						6		X	c	Cs˜tiitiƒdƒ}tii|ƒoti|ƒntiddƒ}t
|ƒ}|iƒtii|ƒpt
‚titii|dƒƒttii|dƒdƒidƒttii|dƒdƒid	ƒ|id|d
hdd<d
d<ƒ|id|dhdd<dd<ƒtitii|dƒƒttii|dƒdƒidƒttii|dƒdƒidƒttii|dƒdƒidƒttii|dƒdƒidƒ|id|dhdd<dd <ƒ|iƒtii|ƒpt
‚t
|ƒ}|iƒ}t|ƒd jpt
‚|d!\}}|d
jpt
‚|djpt
‚|i|ƒd
jpt
‚|i|ƒ}t|ƒdjpt
‚|idƒpt
‚|ddjpt
‚|id
ƒpt
‚|d
d"jpt
‚|d\}}|djpt
‚|djpt
‚|i|ƒdjpt
‚|i|ƒ}t|ƒdjpt
‚|idƒpt
‚|ddjpt
‚|idƒpt
‚|dd#jpt
‚|d\}}|djpt
‚|djpt
‚|i|ƒdjpt
‚|i|ƒ}t|ƒdjpt
‚|idƒpt
‚|ddjpt
‚|idƒpt
‚|dd$jpt
‚tiddƒ}x$|D]\}}|i||ƒqWtiitii|dƒƒpt
‚ttii|dƒƒi ƒdjpt
‚tiitii|dƒƒpt
‚ttii|dƒƒi ƒd	jpt
‚tiitii|dƒƒpt
‚ttii|dƒƒi ƒdjpt
‚tiitii|dƒƒpt
‚ttii|dƒƒi ƒdjpt
‚tiitii|dƒƒpt
‚ttii|dƒƒi ƒdjpt
‚tiitii|dƒƒpt
‚ttii|dƒƒi ƒdjpt
‚t!i"|ƒttii|dƒdƒid%ƒ|id|d&hd'd<d(d)<ƒ|idƒttii|dƒdƒid*ƒttii|dƒdƒid*ƒttii|dƒdƒid*ƒttii|dƒdƒid*ƒ|id|d+hd,d<d-d.<ƒtitii|d/ƒƒttii|d0ƒdƒid1ƒ|id2|d3hd4t#<d5d6<ƒt!i"|ƒti|ƒ|iƒtii|ƒpt
‚t
|ƒ}|iƒ}t|ƒd jpt
‚|d!\}}|d&jpt
‚|djpt
‚|i|ƒd&jpt
‚|i|ƒ}t|ƒdjpt
‚|id'ƒpt
‚|d'djpt
‚|id(ƒpt
‚|d(d7jpt
‚|d\}}|d+jpt
‚|djpt
‚|i|ƒd+jpt
‚|i|ƒ}t|ƒdjpt
‚|id,ƒpt
‚|d,djpt
‚|id-ƒpt
‚|d-d8jpt
‚|d\}}|d3jpt
‚|d2jpt
‚|i|ƒd3jpt
‚|i|ƒ}t|ƒdjpt
‚|id5ƒpt
‚|d5d6jpt
‚|id4ƒpt
‚|d4d9jpt
‚tiddƒ}x$|D]\}}|i||ƒqëWtiitii|dƒƒpt
‚ttii|dƒƒi ƒd%jpt
‚tiitii|dƒƒpt
‚ttii|dƒƒi ƒd*jpt
‚tiitii|dƒƒpt
‚ttii|dƒƒi ƒd*jpt
‚tiitii|dƒƒpt
‚ttii|dƒƒi ƒd*jpt
‚tiitii|dƒƒpt
‚ttii|dƒƒi ƒd*jpt
‚tiitii|d0ƒƒpt
‚ttii|d0ƒƒi ƒd1jpt
‚t!i"|ƒtiddƒ}t
|ƒ}|id2ƒttii|dƒdƒid:ƒ|id|dƒti|ƒ|iƒtii|ƒpt
‚t!i"|ƒt
|ƒ}|iƒ}t|ƒd jpt
‚|d!\}}|d&jpt
‚|djpt
‚|i|ƒd&jpt
‚|i|ƒ}t|ƒdjpt
‚|id'ƒpt
‚|d'djpt
‚|id(ƒpt
‚|d(d7jpt
‚|d\}}|djpt
‚|djpt
‚|i|ƒdjpt
‚|i|ƒ}t|ƒd!jpt
‚|d\}}|d+jpt
‚|djpt
‚|i|ƒd+jpt
‚|i|ƒ}t|ƒdjpt
‚|id,ƒpt
‚|d,djpt
‚|id-ƒpt
‚|d-d8jpt
‚tiddƒ}x$|D]\}}|i||ƒqJWtiitii|dƒƒpt
‚ttii|dƒƒi ƒd%jpt
‚tiitii|dƒƒpt
‚ttii|dƒƒi ƒd:jpt
‚tiitii|dƒƒpt
‚ttii|dƒƒi ƒd*jpt
‚tiitii|dƒƒpt
‚ttii|dƒƒi ƒd*jpt
‚tiitii|dƒƒpt
‚ttii|dƒƒi ƒd*jpt
‚tiitii|dƒƒpt
‚ttii|dƒƒi ƒd*jpt
‚t!i"|ƒti|ƒdS(;Nsstorage-test.zipR}s
storage-test-ttst/config1.testR~snew test file 1sconfig2.testsnew test file 2tTestSource1s	foo-attr1tfoos	bar-attr1itTestSource2s	foo-attr2s	bar-attr2isfoobar/foo/bar/foo/bars!foobar/foo/bar/foo/bar/%gconf.xmlsnew test file 3sfoobar/foo/bar/foo.txtsnew test file 4sfoobar/foo/bar.txtsnew test file 5sfoobar/foo.txtsnew test file 6tfoobartTestSource3s	foo-attr3s	bar-attr3iit1t2t3snew test file 99tTestSource99s
foo-attr99s
bar-attr99icsnew test file 2005tTestSource2005sfoo-attr2005sbar-attr2005iÕsblaas/are/nicesblaas/are/nice/foo.txtsblaas are nicetblaast	Waterfordtniceswith-butters
but of courset99t2005RNsI'm back, yes its me!($RR	Rtgetcwdtprofile_pathR
RRŒRttemp_dirR.tprofileR˜RstmkdirtopenR…RŸRttest_profileRÂtlRWRfRÛRÚR_thas_keyt	temp_dir2R¾R“R
RTR"RARN(	RðRöRóRôRfRïR_R	Rî((Rtrun_unit_tests¸s~
%%((%%%%(
)/)/)/)/)/)/
%(
%%%%(%(


)/)/)/)/)/)/

%


)/)/)/)/)/)/
(RRtos.pathRRRlRnR"RŒRORGR4R7RtconfigRRRR>RR*t	ExceptionR+R.R÷(RGRR"R+RŒRR7R*RRORRRRRnR.R4R÷RlR((Rt?s*															ÿÿg

Anon7 - 2021