Your IP : 216.73.216.213


Current Path : /opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/
Upload File :
Current File : //opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyc

�
��\c@s�dZddlZddlZddlmZddlmZedd�Zdefd��YZd	efd
��YZ	de	fd��YZ
d
efd��YZdefd��YZdefd��YZ
de
fd��YZdefd��YZdefd��YZdefd��YZdefd��YZdefd��YZdefd ��YZed!kr�ej�ndS("s&Unit tests for file timestamp updates.i����N(t
namedtuple(tRealFsTestCasetFileTimesst_ctime, st_atime, st_mtimetFakeStatTestBasecBs�eZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(cCsTtt|�j�|j�|jd�|_|jr>dnd|_d|_dS(Nt	some_fileg�������?g{�G�z�?t(	tsuperRtsetUptcheck_linux_and_windowst	make_patht	file_pathtis_macost
sleep_timetmode(tself((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRs

cCsD|jj|�}tj|j�td|jd|jd|j�S(Ntst_ctimetst_atimetst_mtime(	toststatttimetsleepRRRRR(RtpathR((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyt	stat_time$s
	cCs0|jr|j||�n|j||�dS(N(t
is_windows_fstassertEqualt
assertLess(Rttime1ttime2((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytassertLessExceptWindows,s	cCs0|jr|j||�n|j||�dS(N(RRR(RRR((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytassertLessExceptPosix2s	cCsM|j|j|j��|j|j�}WdQX|j|j�}||fS(N(topenR
R
R(Rtcreatedtclosed((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytopen_close_new_file8scCsq|j|j|j��8}|j|j�}|jd�|j|j�}WdQX|j|j�}|||fS(Ntfoo(RR
R
Rtwrite(RtfR twrittenR!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytopen_write_close_new_file?s
cCsr|j|j�|j|j�}|j|j|j��|j|j�}WdQX|j|j�}|||fS(N(tcreate_fileR
RRR
(RtbeforetopenedR!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyt
open_closeHscCs�|j|j�|j|j�}|j|j|j��8}|j|j�}|jd�|j|j�}WdQX|j|j�}||||fS(NR#(R(R
RRR
R$(RR)R%R*R&R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytopen_write_closeRs
cCs�|j|j�|j|j�}|j|j|j��5}|j|j�}|j�|j|j�}WdQX|j|j�}||||fS(N(R(R
RRR
tflush(RR)R%R*tflushedR!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytopen_flush_close^s
cCs�|j|j�|j|j�}|j|j|j��T}|j|j�}|jd�|j|j�}|j�|j|j�}WdQX|j|j�}|||||fS(NR#(R(R
RRR
R$R-(RR)R%R*R&R.R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytopen_write_flushjs

cCs�|j|j�|j|j�}|j|jd��Q}|j|j�}|j�|j|j�}|j�|j|j�}WdQX|j|j�}|||||fS(Ntr(R(R
RRtreadR-(RR)R%R*R2R.R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytopen_read_flushxs

cCsn|j|j|j��5}|j|j�}|j�|j|j�}WdQX|j|j�}|||fS(N(RR
R
RR2(RR%R R2R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytopen_read_close_new_file�s
cCs�|j|j�|j|j�}|j|j|j��5}|j|j�}|j�|j|j�}WdQX|j|j�}||||fS(N(R(R
RRR
R2(RR)R%R*R2R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytopen_read_close�s
cCsX|j�\}}|j|j|j�|j|j|j�|j|j|j�dS(sq
        When a file is created on opening and closed again,
        no timestamps are updated on close.
        N(R"RRRR(RR R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytcheck_open_close_new_file�scCs�|j�\}}}|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�dS(s
        When a file is created on opening, st_ctime is updated under Posix,
        and st_mtime is updated on close.
        N(R'RRRRRR(RR R&R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytcheck_open_write_close_new_file�scCs�|j�\}}}|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�dS(s�
        When an existing file is opened with 'w' or 'w+' mode, st_ctime (Posix
        only) and st_mtime are updated on open (truncating), but not on close.
        N(R+RRRRRR(RR)R*R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytcheck_open_close_w_mode�scCs�|j�\}}}|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�dS(sz
        When an existing file is opened with any mode other than 'w' or 'w+',
        no timestamps are updated.
        N(R+RRRR(RR)R*R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytcheck_open_close_non_w_mode�scCs�|j�\}}}}|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�dS(s�
        When an existing file is opened with 'w' or 'w+' mode and is then
        written to, st_ctime (Posix only) and st_mtime are updated on open
        (truncating) and again on close (flush), but not when written to.
        N(R,RRRRRR(RR)R*R&R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytcheck_open_write_close_w_mode�scCs�|j�\}}}}|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�dS(s�
        When an existing file is opened with 'w' or 'w+' mode (truncating),
        st_ctime (Posix only) and st_mtime are updated. No updates are done
        on flush or close.
        N(R/RRRRRR(RR)R*R.R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytcheck_open_flush_close_w_mode�scCs�|j�\}}}}|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�dS(s�
        When an existing file is opened with any mode other than 'w' or 'w+',
        flushed and closed, no timestamps are updated.
        N(R/RRRR(RR)R*R.R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyt!check_open_flush_close_non_w_mode�scCs�|j�\}}}}|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�dS(so
        Reading from a file opened with 'r', 'r+', or 'a+' mode updates
        st_atime under Posix.
        N(R5RRRtassertLessEqualR(RR)R*R2R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyt check_open_read_close_non_w_modescCs�|j�\}}}|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�dS(s|
        When a file is created with 'w+' or 'a+' mode and then read from,
        st_atime is updated under Posix.
        N(R4RRR=RR(RR R2R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytcheck_open_read_close_new_file$scCs�|j�\}}}}|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�dS(s�
        When an existing file is opened with 'a', 'a+' or 'r+' mode
        and is then written to, st_ctime (Posix only) and st_mtime are
        updated close (flush), but not on opening or when written to.
        N(R,RRRRRR(RR)R*R&R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyt!check_open_write_close_non_w_mode4scCs'|j�\}}}}}|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�dS(s
        When an existing file is opened with 'w' or 'w+' mode
        and is then written to, st_ctime (Posix only) and st_mtime are
        updated on open (truncating). Under Posix, st_mtime is updated on
        flush, under Windows, on close instead.
        N(R0RRRRRRR(RR)R*R&R.R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyt#check_open_write_flush_close_w_modeHscCs'|j�\}}}}}|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�dS(s�
        When an existing file is opened with 'a', 'a+' or 'r+' mode
        and is then written to, st_ctime and st_mtime are updated on flush
        under Posix. Under Windows, only st_mtime is updated on close instead.
        N(R0RRRRRR(RR)R*R&R.R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyt'check_open_write_flush_close_non_w_mode`s(t__name__t
__module__RRRRR"R'R+R,R/R0R3R4R5R6R7R8R9R:R;R<R>R?R@RARB(((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRs2								
																		t
TestFakeModeWcBsPeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	RS(cCs tt|�j�d|_dS(Ntw(RRERR
(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRyscCs|j�dS(N(R6(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyttest_open_close_new_file}scCs|j�dS(N(R7(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyttest_open_write_close_new_file�scCs|j�dS(N(R8(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyttest_open_close�scCs|j�dS(N(R:(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyttest_open_write_close�scCs|j�dS(N(R;(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyttest_open_flush_close�scCs|j�dS(N(RA(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyttest_open_write_flush_close�sc	CsB|j|jd��'}|jt��|j�WdQXWdQXdS(NRF(RR
tassertRaisestIOErrorR2(RR%((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyttest_read_raises�s(
RCRDRRGRHRIRJRKRLRO(((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRExs							t
TestRealModeWcBseZd�ZRS(cCstS(N(tTrue(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pytuse_real_fs�s(RCRDRR(((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRP�stTestFakeModeWPluscBsYeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
RS(	cCs tt|�j�d|_dS(Nsw+(RRSRR
(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyR�scCs|j�dS(N(R6(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRG�scCs|j�dS(N(R7(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRH�scCs|j�dS(N(R?(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyttest_open_read_close_new_file�scCs|j�dS(N(R8(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRI�scCs|j�dS(N(R:(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRJ�scCs�|j�\}}}}|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�dS(s�
        When an existing file is opened with 'w+' mode and is then written to,
        st_ctime (Posix only) and st_mtime are updated on open
        (truncating) and again on close (flush). Under Posix, st_atime is
        updated on read.
        N(R5RRRRR=RR(RR)R*R2R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyttest_open_read_close�scCs|j�dS(N(R;(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRK�scCs|j�dS(N(RA(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRL�s(RCRDRRGRHRTRIRJRURKRL(((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRS�s								tTestRealModeWPluscBseZd�ZRS(cCstS(N(RQ(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRR�s(RCRDRR(((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRV�st
TestFakeModeAcBsPeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	RS(cCs tt|�j�d|_dS(Nta(RRWRR
(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyR�scCs|j�dS(N(R6(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRG�scCs|j�dS(N(R7(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRH�scCs|j�dS(N(R9(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRI�scCs|j�dS(N(R@(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRJ�scCs|j�dS(N(R<(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRK�scCs|j�dS(N(RB(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRL�sc	CsB|j|jd��'}|jt��|j�WdQXWdQXdS(NRX(RR
RMRNR2(RR%((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRO�s(
RCRDRRGRHRIRJRKRLRO(((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRW�s							t
TestRealModeAcBseZd�ZRS(cCstS(N(RQ(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRR�s(RCRDRR(((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRY�stTestFakeModeAPluscBsYeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
RS(	cCs tt|�j�d|_dS(Nsa+(RRZRR
(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyR�scCs|j�dS(N(R6(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRG�scCs|j�dS(N(R7(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRH�scCs|j�dS(N(R?(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRT�scCs|j�dS(N(R9(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRI�scCs|j�dS(N(R@(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRJscCs|j�dS(N(R>(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRUscCs|j�dS(N(R<(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRKscCs|j�dS(N(RB(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRLs(RCRDRRGRHRTRIRJRURKRL(((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRZ�s								tTestRealModeAPluscBseZd�ZRS(cCstS(N(RQ(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRRs(RCRDRR(((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyR[st
TestFakeModeRcBs>eZd�Zd�Zd�Zd�Zd�Zd�ZRS(cCs tt|�j�d|_dS(NR1(RR\RR
(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRscCs|j�dS(N(R9(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRIscCs|j�dS(N(R>(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRUscCs|j�dS(N(R<(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRKscCs'|j�\}}}}}|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�|j|j|j�dS(s�
        When an existing file is opened with 'r' mode, read, flushed and
        closed, st_atime is updated after reading under Posix.
        N(R3RRRR=R(RR)R*R2R.R!((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyttest_open_read_flush_close"sc	Cs6|jt��!|j|jd��WdQXWdQXdS(NR1(RMRNRR
(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyttest_open_not_existing_raises8s(RCRDRRIRURKR]R^(((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyR\s					t
TestRealModeRcBseZd�ZRS(cCstS(N(RQ(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRR?s(RCRDRR(((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyR_>stTestFakeModeRPluscBsGeZd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(cCs tt|�j�d|_dS(Nsr+(RR`RR
(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRDscCs|j�dS(N(R9(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRIHscCs|j�dS(N(R@(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRJKscCs|j�dS(N(R>(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRUNscCs|j�dS(N(R<(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRKQscCs|j�dS(N(RB(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRLTsc	Cs6|jt��!|j|jd��WdQXWdQXdS(Nsr+(RMRNRR
(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyR^Ws(	RCRDRRIRJRURKRLR^(((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyR`Cs						tTestRealModeRPluscBseZd�ZRS(cCstS(N(RQ(R((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRR^s(RCRDRR(((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyRa]st__main__(t__doc__RtunittesttcollectionsRtpyfakefs.tests.test_utilsRRRRERPRSRVRWRYRZR[R\R_R`RaRCtmain(((sS/opt/alt/python27/lib/python2.7/site-packages/pyfakefs/tests/fake_stat_time_test.pyt<module>
s*�b0*