TestCase.php000064400000003461147207151430007000 0ustar00buffer = Loco_output_Buffer::start(); } public function tear_down(){ $this->buffer->close(); parent::tear_down(); Loco_error_AdminNotices::destroy(); } protected function normalizeHtml( $src ){ $dom = new DOMDocument('1.0','UTF-8'); $dom->preserveWhiteSpace = false; $dom->formatOutput = false; $dom->loadXML( ''.$src.'' ); $dom->normalizeDocument(); $src = $dom->saveXML(); return trim( preg_replace( '/>\\s+<', $src ) ); } public function assertSameHtml( $expect, $actual, $message = '' ){ $this->assertSame( $this->normalizeHtml($expect), $this->normalizeHtml($actual), $message ); } /** * @deprecated */ public function setExpectedException( $exception, $message = '', $code = null ) { //trigger_error('Use expectException('.var_export($exception,true).')', E_USER_DEPRECATED ); $this->expectException( $exception ); if ( '' !== $message ) { //trigger_error('Use expectExceptionMessage('.var_export($message,true).')', E_USER_DEPRECATED ); $this->expectExceptionMessage( $message ); } if ( null !== $code ) { //trigger_error('Use expectExceptionCode('.var_export($code,true).')', E_USER_DEPRECATED ); $this->expectExceptionCode( $code ); } } }TestFilters.php000064400000001015147207151430007526 0ustar00getWriteContext()->connect( new WP_Filesystem_Debug($creds) )` */ class Loco_test_DummyFtpConnect extends Loco_hooks_Hookable { public function filter_filesystem_method(){ return 'debug'; } } /** * Dummy FTP file system. * WARNING: this actually modifies files - it just does it while simulating a remote connection * - All operations performed "direct" when authorized, else they fail. */ class WP_Filesystem_Debug extends WP_Filesystem_Base { private $authed; /** * @var WP_Error */ public $errors; public function __construct( array $opt ) { $this->options = $opt; $this->method = 'ftp'; } /** * Dummy FTP connect: requires username=foo password=xxx */ public function connect() { $this->authed = false; $this->errors = new WP_Error; // @codeCoverageIgnoreStart if( empty($this->options['hostname']) ){ $this->errors->add( 'bad_hostname', 'Debug: empty hostname'); return false; } if( empty($this->options['username']) ){ $this->errors->add( 'bad_username', 'Debug: empty username'); return false; } if( $this->options['username'] !== 'foo' ) { $this->errors->add( 'bad_username', 'Debug: username expected to be "foo"'); return false; } if( empty($this->options['password']) ){ $this->errors->add( 'bad_username', 'Debug: empty password'); return false; } if( $this->options['password'] !== 'xxx' ) { $this->errors->add( 'bad_password', 'Debug: password expected to be "xxx"' ); return false; } // @codeCoverageIgnoreEnd $this->authed = true; return true; } /** * @return WP_Filesystem_Debug */ public function disconnect(){ $this->authed = false; $this->options = []; return $this; } /** * {@inheritdoc} * Dummy function allows exact path to be returned, subject to debugging filters */ public function find_folder( $path ){ if( WP_CONTENT_DIR === $path ){ return loco_constant('WP_CONTENT_DIR'); } return false; } /** * @internal * Proxies supposed remote call to *real* direct call, as long as instance is authorized. * Deliberately not extending WP_Filesystem_Direct for safety. */ private function _call( $method, array $args ){ if( $this->authed ){ $real = Loco_api_WordPressFileSystem::direct(); return call_user_func_array( [$real,$method], $args ); } return false; } /** * {@inheritdoc} */ public function is_writable( $file ){ return $this->_call( __FUNCTION__, func_get_args() ); } /** * {@inheritdoc} */ public function chmod( $file, $mode = false, $recursive = false ){ return $this->_call( __FUNCTION__, func_get_args() ); } /** * {@inheritdoc} */ public function copy( $source, $destination, $overwrite = false, $mode = false ){ return $this->_call( __FUNCTION__, func_get_args() ); } /** * {@inheritdoc} */ public function put_contents( $path, $data, $mode = false ){ return $this->_call( __FUNCTION__, func_get_args() ); } /** * {@inheritdoc} */ public function delete( $file, $recursive = false, $type = false ){ return $this->_call( __FUNCTION__, func_get_args() ); } /** * {@inheritdoc} */ public function mkdir( $path, $chmod = false, $chown = false, $chgrp = false ){ return $this->_call( __FUNCTION__, func_get_args() ); } } WordPressTestCase.php000064400000037266147207151430010663 0ustar00prepare( "SELECT option_name FROM $wpdb->options WHERE option_name LIKE '%s' OR option_name LIKE '%s' OR option_name LIKE '%s';", $args ); if( $results = $wpdb->get_results($query,ARRAY_N) ){ foreach( $results as $row ){ list( $option_name ) = $row; delete_option( $option_name ); } } } /** * @internal */ public static function set_up_before_class(){ parent::set_up_before_class(); Loco_data_Settings::clear(); Loco_data_Session::destroy(); Loco_data_RecentItems::destroy(); Loco_data_Preferences::clear(); self::dropOptions(); // start with default permissions as if fresh install remove_role('translator'); Loco_data_Permissions::init(); } /** * @internal */ public static function tear_down_after_class(){ parent::tear_down_after_class(); Loco_data_Settings::clear(); Loco_data_Session::destroy(); Loco_data_RecentItems::destroy(); Loco_data_Preferences::clear(); wp_cache_flush(); self::dropOptions(); } /** * {@inheritdoc} */ public function set_up(){ parent::set_up(); Loco_mvc_PostParams::destroy(); Loco_error_AdminNotices::destroy(); Loco_package_Listener::destroy(); wp_cache_flush(); // text domains should be unloaded at start of all tests, and locale reset unset( $GLOBALS['locale'] ); $GLOBALS['l10n'] = []; $this->enable_locale('en_US'); $this->assertSame( 'en_US', get_locale(), 'Ensure test site is English to start'); $this->assertSame( 'en_US', get_user_locale(),'Ensure test site is English to start'); // Any enqueued scripts should be destroyed unset($GLOBALS['wp_scripts']); // ensure test themes are registered and WordPress's cache is valid register_theme_directory( LOCO_TEST_DATA_ROOT.'/themes' ); $sniff = get_theme_roots(); if( ! isset($sniff['empty-theme']) ){ delete_site_transient( 'theme_roots' ); } // test plugins require a filter as multiple roots not supported in wp remove_all_filters('loco_missing_plugin'); add_filter( 'loco_missing_plugin', [__CLASS__,'filter_allows_fake_plugins_to_exist'], 10, 2 ); // avoid WordPress missing index notices $GLOBALS['_SERVER'] += [ 'HTTP_HOST' => 'localhost', 'SERVER_PROTOCOL' => 'HTTP/1.0', 'HTTP_USER_AGENT' => 'Loco/'.get_class($this), ]; // remove all filters before adding remove_all_filters('filesystem_method'); remove_all_filters('loco_constant_DISALLOW_FILE_MODS'); remove_all_filters('file_mod_allowed'); remove_all_filters('loco_file_mod_allowed_context'); remove_all_filters('loco_setcookie'); // tests should always dictate the file system method, which defaults to direct add_filter('filesystem_method', [$this,'filter_fs_method'] ); add_filter('loco_constant_DISALLOW_FILE_MODS', [$this,'filter_fs_disallow'] ); add_filter('file_mod_allowed', [$this,'filter_fs_allow'], 10, 2 ); // <- wp 4.8 add_filter('loco_file_mod_allowed_context', [$this,'filter_fs_allow_context'],10,2); // <- used with file_mod_allowed // capture cookies so we can test what is set add_filter('loco_setcookie', [$this,'captureCookie'], 10, 1 ); $this->cookies_set = []; $this->enable_network(); // if( Loco_error_AdminNotices::destroy() ){ throw new Exception('Refusing to start test with errors in buffer'); } } public function tear_down(){ if( $this->buffer ){ $this->buffer->close(); $this->buffer = null; } // ignore all but real error messages after test $errors = Loco_error_AdminNotices::get()->filter( Loco_error_Exception::LEVEL_WARNING ); if( $errors ) { Loco_error_AdminNotices::destroy(); fwrite( STDERR, json_encode($errors,JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE) ); throw new Exception( 'Unflushed admin notices after test' ); } parent::tear_down(); } protected function enable_buffer(){ if( $this->buffer ){ $this->buffer->discard(); } $this->buffer = Loco_output_Buffer::start(); } /** * {@inheritdoc} */ public function clean_up_global_scope(){ parent::clean_up_global_scope(); $_COOKIE = []; $_REQUEST = []; } /** * Capture cookie and prevent actual http sending */ public function captureCookie( Loco_data_Cookie $cookie ){ $this->cookies_set[ $cookie->getName() ] = $cookie; return false; } /** * @return Loco_data_Cookie */ public function assertCookieSet( $name, $message = '' ){ $this->assertArrayHasKey( $name, $this->cookies_set, $message ); $cookie = $this->cookies_set[ $name ]; $this->assertInstanceOf( 'Loco_data_Cookie', $cookie, $message ); return $cookie; } /** * Invoke admin page controller without full hook set up * @return string HTML */ public static function renderPage(){ $router = new Loco_mvc_AdminRouter; $router->on_admin_menu(); $screen = get_current_screen(); $action = isset($_GET['action']) ? $_GET['action'] : null; $router->initPage( $screen, $action ); $html = get_echo( [$router,'renderPage'] ); // ensure further hooks fired as WordPress continues to render admin footer do_action('in_admin_footer'); do_action('admin_footer',''); get_echo( 'do_action', ['admin_print_footer_scripts'] ); // Capture late errors flushed on destruct // $data = Loco_error_AdminNotices::destroyAjax(); $html .= get_echo( [Loco_error_AdminNotices::get(),'on_loco_admin_notices'] ); return $html; } /** * Invoke Ajax controller without full hook set up. * @return string JSON */ protected function renderAjax(){ wp_magic_quotes(); // <- I hate this, but it's what WP does! $router = new Loco_mvc_AjaxRouter; $router->on_init(); return $router->renderAjax(); } /** * @internal */ public function filter_fs_method( $method = '' ){ return is_null($this->fs_method) ? $method : $this->fs_method; } /** * @return Loco_test_WordPressTestCase */ public function set_fs_method( $method ){ $GLOBALS['wp_filesystem'] = null; $this->fs_method = $method; $ping = class_exists('Loco_test_DummyFtpConnect'); return $this; } /** * @return Loco_test_WordPressTestCase */ public function disable_file_mods(){ $this->fs_allow = false; return $this; } /** * Filters wp_is_file_mod_allowed for WP >= 4.8 * @internal */ public function filter_fs_allow( $bool, $context = '' ){ if( 'loco_test' === $context ){ $bool = $this->fs_allow; } return $bool; } /** * Filters DISALLOW_FILE_MODS for WP < 4.8 * @internal */ public function filter_fs_disallow(){ return ! $this->fs_allow; } /** * Filters context passed to filter_fs_allow * @internal */ public function filter_fs_allow_context( $context, Loco_fs_File $file = null ){ return 'loco_test'; } /** * Remove files created under tmp * @return void */ protected function clearTmp(){ $root = new Loco_fs_Directory( LOCO_TEST_DATA_ROOT.'/tmp' ); $dir = new Loco_fs_FileFinder( $root ); $dir->setRecursive( true ); $dirs = []; /* @var $file Loco_fs_File */ foreach( $dir as $file ){ $dirs[ $file->dirname() ] = true; $file->unlink(); } // Be warned only directories found above will be removed foreach( array_keys($dirs) as $path ){ $dir = new Loco_fs_Directory($path); while( $dir->exists() && ! $dir->equal($root) ){ $dir->unlink(); $dir = $dir->getParent(); } } } /** * Log a mock user into WordPress * @return void */ protected function login( $role = 'administrator' ){ $wpRole = get_role($role); if( ! $wpRole ){ throw new Exception('No such role, '.$role ); } else if( ! $wpRole->capabilities ){ throw new Exception( $role.' role has no capabilities' ); } $user = self::factory()->user->create( [ 'role' => $role ] ); if( $user instanceof WP_Error ){ foreach( $user->get_error_messages() as $message ){ trigger_error( $message ); } throw new Exception('Failed to login'); } // setting user required to have proper user object $user = wp_set_current_user( $user ); // simulate default permissions used in admin menu hook if( $user->has_cap('manage_options') ){ $user->add_cap('loco_admin'); } // simulate wp_set_auth_cookie. Can't actually set cookie cos headers $_COOKIE[LOGGED_IN_COOKIE] = wp_generate_auth_cookie( $user->ID, time()+60, 'logged_in' ); // $debug = array( 'name' => $this->getName(), 'token' => wp_get_session_token() ,'uid' => $user->ID ); // forcing new session instance new Loco_data_Session; } /** * Log out current WordPress user * @return void */ protected function logout(){ Loco_data_Session::destroy(); wp_destroy_current_session(); unset( $_COOKIE[LOGGED_IN_COOKIE] ); wp_set_current_user( 0 ); $GLOBALS['current_user'] = null; } /** * Disallow network access * @return void */ protected function disable_network(){ remove_all_filters('loco_allow_remote'); add_filter('loco_allow_remote', '__return_false' ); } /** * Enable network access * @return void */ protected function enable_network(){ remove_all_filters('loco_allow_remote'); } /** * Switch loco_debugging on * @return void */ protected function enable_debug(){ remove_all_filters('loco_debug'); add_filter('loco_debug', '__return_true' ); } /** * Switch loco_debugging off * @return void */ protected function disable_debug(){ remove_all_filters('loco_debug'); add_filter('loco_debug', '__return_false' ); } /** * Temporarily enable the "en_GB_debug" test locale * @return void */ protected function enable_debug_locale(){ return $this->enable_locale('en_GB_debug'); } /** * Temporarily enable a specific locale * @return void */ protected function enable_locale( $tag ){ $locale = Loco_Locale::parse($tag); $this->locale = (string) $locale; remove_all_filters('locale'); add_filter('locale', [$this,'_filter_locale'] ); } /** * @internal */ public function _filter_locale(){ return $this->locale; } /** * Temporarily set test data root to content directory * @return void */ public function enable_test_content_dir(){ remove_all_filters('loco_constant_WP_CONTENT_DIR'); add_filter('loco_constant_WP_CONTENT_DIR', [$this,'_filter_wp_content_dir'], 10, 0 ); } /** * @internal */ public function _filter_wp_content_dir(){ return LOCO_TEST_DATA_ROOT; } /** * @internal */ public function capture_redirects(){ remove_all_filters('wp_redirect'); add_filter('wp_redirect', [$this,'filter_wp_redirect'], 10, 2 ); } /** * @internal */ public function filter_wp_redirect( $location, $status ){ $this->redirect = func_get_args(); return false; } public static function filter_allows_fake_plugins_to_exist( array $data, $handle ){ $file = LOCO_TEST_DATA_ROOT.'/plugins/'.$handle; if( file_exists($file) && is_file($file) ) { $data = get_plugin_data($file); $snip = -strlen($handle); $data['basedir'] = substr($file,0,--$snip); } return $data; } /** * @param int * @param string * @return string location */ public function assertRedirected( $status = 302, $message = 'Failed to redirect' ){ $raw = $this->redirect; $this->assertIsArray( $raw, $message ); $this->assertSame( $status, $raw[1], $message ); return $raw[0]; } /** * Set $_POST * @param string[] * @return void */ public function setPostArray( array $post ){ $_POST = $post; $_REQUEST = array_merge( $_GET, $_POST, $_COOKIE ); $_SERVER['REQUEST_METHOD'] = 'POST'; $_FILES = []; Loco_mvc_PostParams::destroy(); } /** * Augment $_POST * @param string[] * @return void */ public function addPostArray( array $post ){ $this->setPostArray( $post + $_POST ); } /** * Set $_GET * @param string[] * @return void */ public function setGetArray( array $get ){ $_GET = $get; $_REQUEST = array_merge( $_GET, $_POST, $_COOKIE ); $_SERVER['REQUEST_METHOD'] = 'GET'; $_FILES = []; } /** * Augment $_GET * @param string[] * @return void */ public function addGetArray( array $get ){ $this->setGetArray( $get + $_GET ); } /** * @param string _FILES key * @param string real file on local system that would be uploaded */ public function addFileUpload( $key, $path ){ if( 'POST' !== $_SERVER['REQUEST_METHOD'] ){ throw new LogicException('Set POST method before adding to files collection'); } $src = file_get_contents($path); $tmp = tempnam(LOCO_TEST_DATA_ROOT.'/tmp','phpunit'); $len = file_put_contents( $tmp, $src); if( $len !== strlen($src) ){ throw new Exception('Bad file params'); } $_FILES[$key] = [ 'error' => 0, 'tmp_name' => $tmp, 'name' => basename($path), ]; } /* * {@inheritDoc} * public static function assertContains( $needle, $haystack, $message = '' ):void { if( is_string($haystack) ){ trigger_error('Use assertStringContainsString', E_USER_DEPRECATED ); parent::assertStringContainsString($needle,$haystack,$message); } else { parent::assertContains( $needle, $haystack, $message ); } }*/ }usr/bin/test000075500000110730147207272410007042 0ustar00ELF>@@X@8 @@@@@@88@8@@@|u|u }}`}`X ~~`~`TT@T@DDPtdff@f@QtdRtd}}`}`XX/lib64/ld-linux-x86-64.so.2GNU GNUNT_/wDef8Su9482Xyh0@%3 %a +D [|&bD9THKglibc.so.6fflushstrcpy__printf_chksetlocalembrtowcstrncmpstrrchrfflush_unlockeddcgettexterror__stack_chk_fail__lxstatiswprintreallocabort_exitprogram_invocation_name__ctype_get_mb_cur_maxstrtolisattycallocstrlenungetcmemset__errno_locationmemcmp__fprintf_chkstdoutlseekmemcpyfcloseeuidaccessmallocmbsinit__uflownl_langinfo__ctype_b_locgetenv__freadingstderrfscanfgetegidfilenofwritegeteuid__fpendingprogram_invocation_short_namefdopen__xstatbindtextdomainstrcmp__libc_start_mainfseeko__overflowfputs_unlockedfree__progname__progname_full__cxa_atexit__gmon_start__GLIBC_2.3GLIBC_2.3.4GLIBC_2.14GLIBC_2.4GLIBC_2.2.5ii pti zii ui ``"`%`=`@` `(`0`8`@`H` P` X` `` h` p`x``````````Ȁ`Ѐ`؀`````` `!`"`# `$(`&0`'8`(@`)H`*P`+X`,``-h`.p`/x`0`1`2`4`5`6`7`8`9`:ȁ`;Ё`<؁`>`?HHm HtH5m %m @%m h%m h%m h%zm h%rm h%jm h%bm h%Zm hp%Rm h`%Jm h P%Bm h @%:m h 0%2m h %*m h %"m h%m h%m h% m h%m h%l h%l h%l h%l h%l hp%l h`%l hP%l h@%l h0%l h %l h%l h%l h%l h %l h!%l h"%zl h#%rl h$%jl h%%bl h&%Zl h'p%Rl h(`%Jl h)P%Bl h*@%:l h+0%2l h, %*l h-%"l h.%l h/%l h0% l h1%l h2%k h3%k h4%k h5%k h6%k h7p%k h8`%k h9PUHSHH>H5?H5?H=?H=?Hk H=/$>H-l l k ~U{ Hck ;k t1Hk H<2H5_?H1{HH1@1I^HHPTIT@H T@H @f.D`UH-`HHw]øHt]``UH-`HHHH?HHu]úHt]Hƿ`=j uUH~]j @H=e tHtU}`H]{sу=uu f!u=u tu=uuf-u[Wnt"oubtu.u#f.tu t%et!guWeu WÀuÀeu(Gg @2g t;&g }Pff.USHHcg dH%(H$1Hf H@G<3wHx:HcH@1fDH$dH3%(HĨ[]DFf Hqf tf HHD8멐Tf HAf ?f HH|/mDf Hf e HH|-De H e He HHt1҅T$ Fe Hqe te HH|H H1H41҃;"H=ud@ e H d Hd HHt1҅"H|$0@~d Hd d HH|D>|d H id Hdd HHtt1҅D$%=|@$d Hd d HHD8FfDc H c Hc HHt1҅T$ ^c H c Hc HHt1҅T$ Lc H 9c H4c HHtD1҅bD$%=L@b H b Hb HHt1҅ D$%=@@^b H b Hb HHt1҅D$%= @Db H 1b H,b HHt<1҅ZD$%=`D@a H a Ha HHtf.fa H a Ha HHt1҅D$%=@La H 9a H4a HHtD\GHi;D$<@` H ` H` HHt1҅D$%=@N` H y` Ht` HHtHt;D$ 31҅t' 1҅c@AWAVAUAATUSHdH%(H$x1@_ H_ D`_ A9Mc}JD8-E1J,N<U-=#!&}=}-l_ HcHH4H|#AŃ-H_ H$xdH3 %(DHĈ[]A\A]A^A_xlVxL1AH^ 61@E^ HcHH4H|AŃ-^ Ue}EJ|;(HEH] @J|8H$`H&HH$H] J:zeR] l g8A(@UqYf}C] EJt;HT$ BJtH$#H$H9D$ H$H9D$(Af}t<}2\ EJ|;HOJ|Ht$>B@H $H9L$HT$HD$AA)A :)uszum1w1D$ D$ )u A~H5`(1LH4@Ox1b)։tH1xN1w#CH5'1UHHH5'171Hf.ATUSt@HgT H5(1HHHQ HH81]6HWQ H5(1L#HLL#H5(1LH}L#H5(1wLH\L#H5)1VLH;L#H5)15LHL#H5p)1LHL#H5O*1LHL#H5.+1LHL#H5,1LHL#H5$-1LHuL#H5-1oLHTL#H5.1NLH3L#H5/1-LHL#H501 LHHH5w11HHH5e%1H511HúHHƿ1H58%1H S2H5%Hƿ1u1YHH5%HHQ t0H;IH5"2Iĺ1#LHƿ1H;H5:2H1HHƿ1H-Q H=Q @=Q USHH+N H8{t=P t$8 uH%N H8UuNH[]H511WH=P HHt3#H0H1IH113HO 80H1H11 fH/uDH/t1H„t@fH t/t @tHH 1ufSHHv |/HPt[@HHu[DHNFHfDHHHHHHH)ǃ0H@9HuHf.@HSHtw/]HtRHPHH)H~BHpH=0u.H=0HH@@8uHXH9L HHN HHL H[H!L H=07Hf.HHHdH%(HD$81HHt]4$H$HL$8dH3 %(HHD$HBHD$HBHD$HBHD$ HB HD$(HB(HD$0HB0HuHH 'AUATAHUH1SHH9HtHH[]A\A]߀UuhP߀Tu<P߀Fu0x-u*x8u$xu;`H'/H/HDH/H.AHE|DGuP߀Buπx1uɀx8uÀx0ux3ux0uxuIH.H.A}`HE#ff.AWIAVEAUIATUSDHH$H|$(HL$ DD$4D$HD$XH$H$H$ HD$xdH%(H$1JH$AD$3 HF.DL\$ HcHDD$3D$ E1HD$h1D$3M1MMރD$8D$ $H$HD$`H$HD$pL9IzMAt |$ M)E1E A~H-AHcHD$4$HEI9A|)?uA4N߀wrHQ8tb|$3L9s H|$(?HSI9v H|$(D"HSI9v H|$(D"HSI9v H|$(D?HAHfD|$8t $u!Ht$XHtDDҋrEt|$3L9s HD$(\HHL9s HD$(D$HL9IA<)~HMMu|$4u |$3|$3u6H|$ht.HT$ht"HL$(H)fDI9vHuL9HH|$(fIIH|$4|$3DMMHD$xD$LDD$4H|$(LH$LHD$H$AHD$WH$dH3<%(H[]A\A]A^A_fDr|$4{|$ -A\Dbfffvfnftfaf|$ }|$3L9s HD$(\HUHCI9v/A|)WЀ w!I9HCI9v HD$(D0HCHA0cf|$ t|$3t ED|$4%|$3ZL9s HD$('HCI9v HD$(D\HCI9v HD$(D'HDH$LL$PLT$HD\$@HAD\$@LT$HLL$PPf"T$ H|$3HL$(s@L9s\HsI9vD@0@tHsI9vD@0@tAHA0HH9jL9sD$E$)HuEtL9s\HE1D|$34MtHD$('H,(D$ AHD$hW|$3MtHD$("H'D$ AHD$hD$3D$ E1HD$h1H'D$3D$ A1D$4HD$hDHv'D$3D$ A1D$4HD$hD\$4t3H=G'L\$ H=('H$~L\$ HD$x1ۀ|$3u/H$t HL$(L9sHuHl$xL\$8H Hl$hID$ L\$8INdu%IvLLT$HLL$@LT$HLL$@IM9M)rOHt$hLLLL$PLT$HLD$@XLD$@LT$HLL$Pu|$3 AE1HD$`IH1H$D$Hl$HHL$D$ALl$PMLt$@L$HD$HHT$@HL$`H|$pL,O4/L)L HHHH|$3tL|$4uEHt?fDA<O!wHH+HHHH9uы$H|$`DDH:DD$D$HHl$HL$H$Ll$PLt$@MH"T$ $*HLl$PL\$@WAyLL$LD$PD\$HLL$@L$ILD$PD\$HLL$@#|$3zDH|$(0"DHHl$HL$D$MH$D$Ll$PLt$@ HHl$HL$D$D$MH$Ll$PLt$@MMLt$@LHHl$HL$D$I9D$H$Ll$PL$v"A?uDA<tHHTI9wSH#D$ A1HD$h3NH"D$ A1HD$hAWLcAVAUATUSHHHHt$ HT$(=IŋEL%@ D$4kD;=@ rhAoH@ ALHI9-1f H5@ H=@ IH~@ H0Hx=i@ L1H)HHL-K@ HC0IkMDL{M$Mt$HD$HC(HL$(HT$ ALL<$LHD$L\$8CL\$8I9wnHpHN@ I9I4$tLHt$8Ht$8HHt$8F ID$IHC0DHL$(AHT$ Ht$8LHD$HC(L<$HD$D$4AEHHL[]A\A]A^A_ÐL8 IH^? @ATUHSH=@ D HHþ8HEf D#[]A\@f.Hi@ HHENjDf.HI@ HHElj0Df.H)@ HHE@@H4~1ƒ1Vf.H? HHDGwÐf.H? HHHDHtHt Hw(HW0Hff.AWH? IAVIAUIATUSLH(MHDH|$^D HHC0DKH|$LLLHD$HC(HD$HCH$DDeH([]A\A]A^A_ÐAWH? AVIAUIATIUSHHHHHD1INjM@ kLSLL1D$HC01LT$0AHD$HC(L$HD$DzHpHD$8HHt$(HHD$ HC0LT$0Ht$(ALLHD$HC(L$HD$D+D$MAt L\$8M$HD$ HH[]A\A]A^A_fH1fDAT< L%< USv$LHIlH{HH9uI|$H< H9tHe< Hf< HW< I9tLzH3< []< A\@H y= H f.H Y= @H1fDHH1ATIUSH@HdH%(HD$81KHHLHL$8dH3 %(u H@[]A\fAUIATIUSHHHdH%(HD$81LHL6HT$8dH3%(u HH[]A\A]FfDH14@HH1ATIUHSH@dH%(HD$81H#< HH$H< HD$H< HD$H< HD$H< HD$ H < HD$(H < HD$0H1LH_HL$8dH3 %(u H@[]A\q@H@:fD:&fDAUMATIUSHHdH%(HD$81HG; HH$HA; HD$H=; HD$H9; HD$H5; HD$ H1; HD$(H-; HD$0#HLLHL$8dH3 %(u HH[]A\A]ID@HHH1IHHH1f.H 8 @HH1H@H1fD-t]<-D0<08'PЃ HH80 vjDH0t<-t`0 L@<00 ÐH<0tHи 001 H<0t8f0 HH8tȉDB)ȃ0H@H@H4@J)ƒ wvE1BLI0 v0 w%1@DH0 vL9t(I9MtHHu1ø1҃0E1 vDJDA0)1҃ wR@LH0 vA w+1|H0 vH9tH9HҸtA vtSHHt[HtfD1HHH9r HPf.HSHtHHt[HtF1[HtHH1HH9r HP]f.HIHt51HIH9s=HAHHHIHXHu1Ҹ1IHHP@f.HHt(HH9w0HPHHHH@HHDHHPSHwH1H[ifHHtHXUHHSHH,HHH[]HSHHHp[f.H5H1IH3 H11:H=ATUHS]HI …ut Mt,[]A\DһuB[]A\D+1ۃ8 ۉ[]A\f.AWAVAUATUSHdH%(H$1L55 HHHHDMuLhIlH[LtA.@t)LH2t @*uA~uL)I\;HHDH$dH3 %(H?HĨ[]A\A]A^A_H=UHIt 8gL=' A A</A$.MI}HHLLH$tBD%/IHcharset.IEsAEaliafAE H1>AH5HIHD$`Ld$ H$HD$fIGI;G?HPIW8 tGvڃ#LIHL$H5?1LL@L H!%tLT$DHJHDHL)A I!%tDIJLDIL+T$H<$I&HHHxHT$LT$H $XLT$HT$IM:L4$HLH)M)LLSHt$K|5MAIGI;GLD0L5HL52 E1$H^HItH@DtIGI;GHPIW u݃LH$HwAtH$LLT$HT$HHHpH $LT$IHT$L5RٿL!L褿@af.ATUSHHx\u4H\tD裿D HHEt De[]A\fHX1zHuH[]A\ȿHSHt uH[EDtHߺ1 H[ SHHHGH9GtHH[HG H9G(uHHuT$ H4$T$ H4$ӿHt #H1H[f.AWAAVIAUIATL%p) UH-p) SL)1HHHtLLDAHH9uH[]A\A]A^A_Ðf.f.@HAHt H11HH%s: invalid integer %smissing argument after %s-nt does not accept -l-ef does not accept -l-ot does not accept -lunknown binary operator%s: unary operator expected%s: binary operator expected')' expected')' expected, found %stest and/or [ %s online help: <%s> GNU coreutilsen_/usr/share/localeextra argument %sh`X`h`(@x8Try '%s --help' for more information. Usage: test EXPRESSION or: test or: [ EXPRESSION ] or: [ ] or: [ OPTION Exit with the status determined by EXPRESSION. --help display this help and exit --version output version information and exit An omitted EXPRESSION defaults to false. Otherwise, EXPRESSION is true or false and sets exit status. It is one of: ( EXPRESSION ) EXPRESSION is true ! EXPRESSION EXPRESSION is false EXPRESSION1 -a EXPRESSION2 both EXPRESSION1 and EXPRESSION2 are true EXPRESSION1 -o EXPRESSION2 either EXPRESSION1 or EXPRESSION2 is true -n STRING the length of STRING is nonzero STRING equivalent to -n STRING -z STRING the length of STRING is zero STRING1 = STRING2 the strings are equal STRING1 != STRING2 the strings are not equal INTEGER1 -eq INTEGER2 INTEGER1 is equal to INTEGER2 INTEGER1 -ge INTEGER2 INTEGER1 is greater than or equal to INTEGER2 INTEGER1 -gt INTEGER2 INTEGER1 is greater than INTEGER2 INTEGER1 -le INTEGER2 INTEGER1 is less than or equal to INTEGER2 INTEGER1 -lt INTEGER2 INTEGER1 is less than INTEGER2 INTEGER1 -ne INTEGER2 INTEGER1 is not equal to INTEGER2 FILE1 -ef FILE2 FILE1 and FILE2 have the same device and inode numbers FILE1 -nt FILE2 FILE1 is newer (modification date) than FILE2 FILE1 -ot FILE2 FILE1 is older than FILE2 -b FILE FILE exists and is block special -c FILE FILE exists and is character special -d FILE FILE exists and is a directory -e FILE FILE exists -f FILE FILE exists and is a regular file -g FILE FILE exists and is set-group-ID -G FILE FILE exists and is owned by the effective group ID -h FILE FILE exists and is a symbolic link (same as -L) -k FILE FILE exists and has its sticky bit set -L FILE FILE exists and is a symbolic link (same as -h) -O FILE FILE exists and is owned by the effective user ID -p FILE FILE exists and is a named pipe -r FILE FILE exists and read permission is granted -s FILE FILE exists and has a size greater than zero -S FILE FILE exists and is a socket -t FD file descriptor FD is opened on a terminal -u FILE FILE exists and its set-user-ID bit is set -w FILE FILE exists and write permission is granted -x FILE FILE exists and execute (or search) permission is granted Except for -h and -L, all FILE-related tests dereference symbolic links. Beware that parentheses need to be escaped (e.g., by backslashes) for shells. INTEGER may also be -l STRING, which evaluates to the length of STRING. NOTE: [ honors the --help and --version options, but test does not. test treats each of those as it treats any other nonempty STRING. NOTE: your shell may have its own version of %s, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supports. http://www.gnu.org/software/coreutils/Report %s translation bugs to For complete documentation, run: info coreutils '%s invocation' write error%s: %sA NULL argv[0] was passed through an exec system call. /.libs/lt-’'"e‘`literalshellshell-alwayscc-maybeescapeclocale`0```\DDDDDDL<, DDDDDDDDDDDDDDDDDD>>>5>>>>>>>>>dD>>>>5memory exhausted/usr/lib64ASCIICHARSETALIASDIR%50s %50s;Ot$|D 44TtT$<Td 4\d4TLldlTt4dDd t, D \ T d t $< 4T Dl T   $ D T$ d< tT l  $ 4 t  , dD d 4 , | t $LdzRx W*zRx $FJ w?;*3$"DP$\0gARM AA x|BWD دA K :O$_,ذAAGo AAF L$BBB E(A0A8G 8A0A(B BBBI tX($pOv K O [ tbBBA A(D@ (A ABBD g (A ABBK D (C ABBL c (D ABBA ,,%D  L j F V J D L L\3BBB E(A0A8DP# 8D0A(B BBBG MBCC ADF ,AAD } AAA L`id+AZ E JBD{ A DPz A <BGG F(D0Q (D ABBD L BEE E(A0A8J 8A0A(B BBBG Ll@BEB B(A0A8Gm 8D0A(B BBBB ,2BAD gAB64L4Kc A DlBLE E(A0A8G`S8A0A(B BBBLHBIE E(D0A8G8A0A(B BBB ,BND jALL@dH |@ 8 40WBDC D`@  AABA <XZBED C(Dp| (A ABBA $x <p4ThBLD D`  AABA   <BED C(Dp (A ABBA 8 ,0D(\0 t(   YXAN A X [ `$$ X8DS I M A L p#^d b]| MH AQ DN A $ (AGG IGA AP 8KD4 HvBAD p ABF W ABF RABL| 5BGB B(A0A8G 8A0A(B BBBA 4 pxBAA F ABC `AB @DR J [,$ eAG N DF CADT eBEE E(H0H8M@l8A0A(B BBB @ 8@@9d@Ad@Gd@Td@Vd@^d@V@ed@ H@ T@}`}`o@@@  `p @` @x o @oox @~`@@@@@@@@@@&@6@F@V@f@v@@@@@@@@@@@&@6@F@V@f@v@@@@@@@@@@@&@6@F@V@f@v@@@@@@@@@@@p``test.debug|7zXZִF!t/f]?Eh=ڊ̓N DvΚ!$5L.$?%U9k .M=!Tgjg,Հ2)z{%3*OKUIZVYb%C/y/c ;^PcT'FPBj&Cۺ>_/!{ q;lzpsݛBoA.| [n_廵˖ͮDK!+bkF|qzBPPCjnU\pOn˘)"aִ}E8RܶPs7C<uaƌx@v']fp8 %mb͂iVl8M dʤR7.5/YaM)?();yZ@7g:B/Gt䦤LiV'[E[XY;,2?hsW$*NV`Ks,Pkb j'P! KYLH)h9?\YP& zp " lCjy>eۡeJҦ7ζufM#SN`)BuV^> f >;{-qu>{22Ոך r1=^(HN?kǡys /Ck9S- iVHP>r'6)ݮ1nAIb/ +2vvW-E]3m;i 5j<.lv@@?a7+.Ґ;wf LA9o|!`[;Y>[?&568ڽԯZ~. D¾s}?zȖXvhj & t ŽVJB'C%ahnjq[hE^fN#`)gß?×eʹv-Q210v?\=JPk3g0.R޶Zk_/qL91 Ghmw{Qbar\)i4)7h_OH<o_?ձ/[ (`x@2Yᶧ('ϳ.=jh49F5R4lxg:t>3|kjX֝=- RǪ;K̿ MWyo:0~gV/Gӝ  F;|B{[]F%eT[f_yK"0,rs? @F@Nox @x [o @ `j` @` xtB @ p~H@Hyp@p @ >T@T T@T f@fi@i }`}}`}}`}}`}H ~`~`(`` `  8