0 && ($i%$size)==0) { $j++; } $retval[$j][$i%$size] = (empty($array[$i])) ? $fill : $array[$i]; } } return $retval; } // }}} function authorized() { // {{{ global $config; $r=$u=$p=$a=false; $remember = ( linkex::get( 'remember', $_REQUEST, 0 ) == 1 ); if ( ( $u = linkex::get( 'username', $_POST, false ) ) && ( $p = linkex::get( 'password', $_POST, false ) ) ) { $r=true; } else if ( $a = linkex::get( '_authcookie', $_SESSION, false ) ) { $r=false; } else if ( $a = linkex::get( '_authcookie', $_COOKIE, false ) ) { $remember=true; $r=false; } $path = dirname( linkex::get( 'SCRIPT_NAME', $_SERVER, '/' ) ); if ( ( $u !== false && $p !== false ) || ( $a !== false ) ) { if ( md5( $u .'---'. $p ) == $config->password || $a == $config->password ) { $_SESSION['_authcookie'] = $config->password; if ( $remember ) { setcookie( '_authcookie', $config->password, time()+60*60*24*30, $path ); } if ( $r ) { linkex::redirect( $_SERVER['REQUEST_URI'] ); } return true; } else { setcookie( '_authcookie', '', time() - 3600, $path ); unset( $_SESSION['_authcookie'] ); return false; } } else { setcookie( '_authcookie', '', time() - 3600, $path ); unset( $_SESSION['_authcookie'] ); return false; } } // }}} function buildquery( $array ) { // {{{ $retval = array(); foreach( $array AS $k=>$v ) { $retval[] = urlencode( $k ).'='.urlencode( $v ); } return join( '&', $retval ); } // }}} function categories( $all = false, $checkslots=false ) { // {{{ $categories = array(); $cids = linkex::listfiles( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'categories' . DIRECTORY_SEPARATOR ); foreach( $cids AS $cid ) { $c = new category( $cid ); if ( ( $all || $c->public == 1 ) && ( !$checkslots || ( $checkslots && $c->slots > 0 && $c->links() < $c->slots ) ) ) { $categories{ $cid } = $c->name; } unset( $c ); } return $categories; } // }}} function compareIPs( $a, $b ) { // {{{ a can be 127., 127.0, 127.0.0, 127.0.0.1, or a hostname if ( !preg_match( '/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/', $a ) ) { $a = linkex::gethostbyname( $a ); } if ( !preg_match( '/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/', $b ) ) { $b = linkex::gethostbyname( $b ); } $a = explode( '.', $a ); $b = explode( '.', $b ); for( $i=0; $ilinkbotdisregardwww == 1 ) { $a = str_replace( 'www.', '', $a ); $b = str_replace( 'www.', '', $b ); } if ( $config->linkbotignoretrailingslash == 1 ) { $a = rtrim( $a, '/' ); $b = rtrim( $b, '/' ); } return strcmp( $a, $b ); } // }}} function checkbox( $val ) { // {{{ return ( intval( $val ) != 0 ) ? 'checked="checked"':''; } // }}} function du( $dir ) { // {{{ $s = @stat( $dir ); $space = linkex::get( 'size', $s, 0 ); if ( is_dir( $dir ) ) { $dh = opendir( $dir ); while ( ( $file = readdir( $dh ) ) !== false ) { if ( !in_array( $file, array( '.', '..' ) ) ) { $space += linkex::du( rtrim( $dir, '/' ) .'/'. $file ); } } closedir( $dh ); } return $space; } // }}} function elapsed( $seconds ) { // {{{ $retval = array( 'Y' => 0, 'm' => 0, 'd' => 0, 'H' => 0, 'i' => 0, 's' => 0, 'nice' => '' ); // Years ( 60*60*24*365 ) = 31536000 seconds if ( $seconds > 31536000 ) { $retval{'Y'} = floor( $seconds / 31536000 ); $seconds = $seconds - ( $retval{'Y'} * 31536000 ); $retval{'nice'} = $retval{'Y'} . ' year' . ( $retval{'Y'}>1?'s':'' ); } // Months ( 60*60*24*30 ) = 2592000 if ( $seconds > 2592000 ) { $retval{'m'} = floor( $seconds / 2592000 ); $seconds = $seconds - ( $retval{'m'} * 2592000 ); $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'m'} . ' month' . ( $retval{'m'}>1?'s':'' ); } // Days ( 60*60*24 ) = 86400 if ( $seconds > 86400 ) { $retval{'d'} = floor( $seconds / 86400 ); $seconds = $seconds - ( $retval{'d'} * 86400 ); $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'d'} . ' day' . ( $retval{'d'}>1?'s':'' ); } // Hours ( 60*60 ) = 3600 if ( $seconds > 3600 ) { $retval{'H'} = floor( $seconds / 3600 ); $seconds = $seconds - ( $retval{'H'} * 3600 ); $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'H'} . ' hour' . ( $retval{'H'}>1?'s':'' ); } // Minutes ( 60 ) = 60 if ( $seconds > 60 ) { $retval{'i'} = floor( $seconds / 60 ); $seconds = $seconds - ( $retval{'i'} * 60 ); $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'i'} . ' minute' . ( $retval{'i'} > 1 ? 's':'' ); } // Seconds 0 if ( $seconds >= 0 ) { $retval{'s'} = $seconds; $retval{'nice'} .= ( strlen( $retval{'nice'} ) > 0 ? ', ':'' ) . $retval{'s'} . ' second' . ( $retval{'s'}>1?'s':'' ); } return $retval; } // }}} function expandlink( $link, $baseurl ) { // {{{ preg_match( "'^[^\?]+'", $baseurl.'/', $res ); $res = preg_replace( "|/[^\/\.]+\.[^\/\.]+$|", '', $res[0] ); $res = rtrim( $res, '/' ); if ( ( $root = @parse_url( $res ) ) ) { $root = $root['scheme'] .'://'. $root['host']; } else { // fixme // die( 'Unable to parse: '.$res ); $root = 'http://'; } $search = array( "|^(\/)|i", "|^(?!http://)(?!mailto:)|i", "|/\./|", "|/[^\/]+/\.\./|" ); $replace = array( $root .'/', $res . '/', '/', '/' ); return preg_replace( $search, $replace, $link ); } // }}} function fetch( $url, $params=array() ) { // {{{ global $config; if ( ( $host = @parse_url( $url ) ) && linkex::get( 'host', $host, false ) !== false ) { $po = linkex::get( 'port', $host, '80' ); $ho = linkex::get( 'host', $host, '' ); $pa = linkex::get( 'path', $host ); $pa = ( strlen( $pa ) == 0 ) ? '/':$pa; $qu = linkex::get( 'query', $host, '' ); $pa.= ( strlen( $qu ) == 0 ) ? '':'?'.$qu; $ua = linkex::get( 'agent', $params, $config->linkbotagent ); $h = array(); $h[]= linkex::get( 'method', $params, 'GET' ).' '.$pa.' HTTP/1.0'; $h[]= 'Host: '.$ho; $h[]= 'User-Agent: '.$ua; $h[]= 'Connection: close'; if ( linkex::get( 'method', $params, 'GET' ) == 'POST' && strlen( linkex::get( 'data', $params, '' ) ) > 0 ) { $h[]= 'Content-Length: '.strlen( linkex::get( 'data', $params, '' ) ); $h[] = 'Content-Type: application/x-www-form-urlencoded'; } $header = join( "\r\n", $h ) . "\r\n\r\n"; if ( ( $data = linkex::get( 'data', $params, false ) ) !== false ) { $header .= $data; } $buffer = ''; $fp = @fsockopen ( $ho, $po, $errno, $error, linkex::get( 'timeout', $params, 3 ) ); if ( !$fp ) { return array( 'URL' => $url, 'error' => 'Socket error: '.$error.' ['.$errno.']' ); } else { fputs( $fp, $header ); while( !feof( $fp ) ) { $buffer .= fgets( $fp, 1024 ); } fclose( $fp ); /// buffer holder nu hele resultatet, incl headers etc if ( preg_match( '/^HTTP\/(\d+\.\d+)\s+(\d{3})\s+(.*)/i', $buffer, $res ) === false ) { return array( 'URL' => $url, 'error' => 'Invalid HTTP response ('.substr( $buffer,0,30).')' ); } else { switch ( $res[2] ) { case 200: /// ok /// strip off the headers $res = explode( "\n\n", str_replace( chr( 13 ), '', $buffer ) ); if ( sizeof( $res ) >= 2 ) { $headers = array_shift( $res ); if ( function_exists( 'utf8_encode' ) ) { $contents = utf8_encode( join( "\n\n", $res ) ); } else { $contents = join( "\n\n", $res ); } return array( 'URL' => $url, 'headers' => $headers, 'contents' => $contents ); } else { return array( 'URL' => $url, 'contents' => utf8_encode( $buffer ) ); } break; case 301: case 302: /// maybe redirect? if ( !preg_match( '/location\:\s+(.*)/i', $buffer, $redir ) ) { return array( 'URL' => $url, 'error' => $res[2].' but no redirect' ); } else { $url = $redir[1]; if ( !preg_match( '"^http"i', $url ) ) { $url = 'http://'.$ho.'/'.ltrim( $url, '/' ); } if ( ( $h = @parse_url( $url ) ) === false ) { return array( 'URL' => $url, 'error' => $res[2].' but unparsable URL' ); } else { if ( str_replace( 'www.', '', strtolower( linkex::get( 'host', $h, '' ) ) ) != str_replace( 'www.','', strtolower( $ho ) ) ) { return array( 'URL' => $url, 'error' => $res[2].' but to external site ('.$h{'host'}.')' ); } else { return linkex::fetch( trim( $url ) ); } } } break; default: /// not good return array( 'URL' => $url, 'error' => $res[2].' '.trim( $res[3] ) ); break; } } } } else { return array( 'URL' => $url, 'error' => 'Unparsable URL' ); } } // }}} function fileget( $file, $default=null ) { // {{{ if ( file_exists( $file ) ) { if ( $fp = @fopen( $file, 'r' ) ) { $locked = ( @flock( $fp, LOCK_EX ) ) ? true:false; // $default = fread( $fp, filesize( $file ) ); $default = ''; while ( !feof( $fp ) ) { $default .= fread( $fp, 1024*1024 ); } if ( $locked ) { @flock( $fp, LOCK_UN ); } fclose( $fp ); } } return $default; } // }}} function fileput( $file, $con ) { // {{{ if ( $fp = @fopen( $file, 'w' ) ) { $locked = ( @flock( $fp, LOCK_EX ) ) ? true:false; $default = fwrite( $fp, $con ); //, strlen( $con ) ); if ( $locked ) { @flock( $fp, LOCK_UN ); } @fclose( $fp ); return ( intval( $default ) > 0 ); } else { return false; } } // }}} function flush() { // {{{ echo str_pad('',4096)."\n"; flush(); usleep( 500000 ); } // }}} function genID() { // {{{ $id = linkex::fileget( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR .'uid' ); $id++; linkex::fileput( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR .'uid', $id ) or die( "[Fatal Error: Unable to write to UID file]" ); return $id; } // }}} function get( $key, $array, $default=null ) { // {{{ if ( is_array( $array ) && in_array( $key, array_keys( $array ) ) ) { $default = $array{ $key }; } return $default; } // }}} function getDomain( $var ) { // {{{ $var = strtolower( $var ); if ( ( $pos = strpos( $var, '@' ) ) !== false ) { // Email $domain = substr( $var, $pos + 1 ); } else { // URL $domain = @parse_url( $var ); $domain = linkex::get( 'host', $domain, 'unparseable' ); } return $domain; } // }}} function gethostbyname( $dom, $force=false ) { // {{{ $dom = strtolower( trim( $dom ) ); $data = array(); if ( file_exists( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . 'ips' ) && ( $data = linkex::fileget( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . 'ips' ) ) && ( $data = linkex::unserialize( $data ) ) ) { if ( ( $force === false ) && ( $ipinfo = linkex::get( $dom, $data, false ) ) !== false && ( time() - linkex::get( 'date', $ipinfo, 0 ) ) < 604800 && ( $ip = linkex::get( 'ip', $ipinfo, false ) ) !== false ) { unset( $data ); return $ip; } } $ip = gethostbyname( $dom ); $data{ $dom } = array( 'date' => time(), 'ip' => $ip ); linkex::fileput( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'cache' . DIRECTORY_SEPARATOR . 'ips', trim( serialize( $data ) ) ); unset( $data ); return $ip; } // }}} function getLinks( $str, $baseurl ) { // {{{ $thisdom = linkex::getDomain( $baseurl ); preg_match_all( "'<\s*a.*>(.*)<\s*/\s*a\s*>'Umis", $str, $res ); $links = array(); for( $i=0; $i' ); } $retval = ''; for($i=$pos+$d;$i0 && $haystack{$i-1} == '\\' ) );$retval.=$haystack{$i}, $i++ ) {} foreach( $end AS $c ) { $retval = str_replace( '\\'.$c, $c, $retval ); } return $retval; } else { return $default; } } /// }}} function glob( $dir, $regex ) { // {{{ $files = array(); if ( $d = @opendir( $dir ) ) { while ( false !== ( $file = readdir( $d ) ) ) { if ( preg_match( '|' . $regex . '|i', $file ) ) { $files[] = $file; } } } return $files; } // }}} function installed() { // {{{ return ( is_dir( BASEDIR . DIRECTORY_SEPARATOR .'data' ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'backup' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'categories' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'blacklist' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'links' . DIRECTORY_SEPARATOR ) && is_dir( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'output' . DIRECTORY_SEPARATOR ) ); } // }}} function listfiles( $dir, $ext=array() ) { // {{{ $retval = array(); if ( is_dir( $dir ) ) { if ( $dh = opendir( $dir ) ) { while ( ( $file = readdir( $dh ) ) !== false ) { if ( filetype( rtrim( $dir, DIRECTORY_SEPARATOR ) .DIRECTORY_SEPARATOR. $file ) == 'file' ) { $retval[] = $file; } } } } return $retval; } // }}} function log( $level, $type, $str ) { // {{{ $file = 'linkex.log'; $log = sprintf( "[%s] [level=%d] [%s] %s\n", date( 'Y-m-d H:i:s' ), $level, $type, $str ); $fp = fopen( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'logs' . DIRECTORY_SEPARATOR . $file, 'a' ); flock( $fp, LOCK_EX ); fwrite( $fp, $log ); fclose( $fp ); } // }}} function map( $fun, $arr ) { // {{{ $retval = array(); foreach( $arr AS $k=>$v ) { $retval[ $k ] = $fun( $v ); } return $retval; } // }}} function mail( $to, $sub, $body ) { // {{{ global $config; $headers = array(); $headers[] = 'X-Mailer: LinkEX/20071229'; if ( strlen( $config->email ) > 0 ) { $headers[] = sprintf( 'From: LinkEX @ %s <%s>', linkex::get( 'HTTP_HOST', $_SERVER, linkex::getdomain( $config->url ) ), $config->email ); $headers[] = sprintf( 'Reply-To: %s', $config->email ); } return mail( $to, $sub, $body, join( "\r\n", $headers ) ); } // }}} function redirect( $url, $code=301 ) { // {{{ $resp = array( 301 => 'HTTP/1.1 301 Moved Permanently', 404 => 'HTTP/1.1 404 Not Found' ); if ( ( $resp = linkex::get( $code, $resp, false ) ) !== false ) { header( $resp ); } header( 'location: '.$url ); exit; } // }}} function selector( $name, $list, $selected=null, $multiple=true, $forcetype=null, $extra=null, $sep='
' ) { /// {{{ $type = ( $multiple ) ? 'checkbox':'radio'; $type = ( sizeof( $list ) > 5 ) ? 'select':$type; if ( $forcetype && in_array( $forcetype, array( 'checkbox', 'radio', 'select' ) ) ) { $type = $forcetype; } $extra['class'] = $type.' '.linkex::get( 'class', $extra, '' ); if ( $extra ) { $buffer=array(); foreach( $extra AS $k=>$v ) { $buffer[] = sprintf( '%s="%s"', $k, $v ); } $extra=' '.join( ' ', $buffer ); } else { $extra=''; } $formname = ( $multiple ) ? $name.'[]' : $name; $buffer = ''; if ( $type == 'select' ) { $buffer .= sprintf( ' %s%s', $formname, $id, ($ck)?' checked="checked"':'', $extra, $txt, $sep ); } elseif ( $type == 'radio' ) { $buffer .= sprintf( '%s', $formname, $id, ($ck)?' checked="checked"':'', $extra, $txt, $sep ); } } if ( $type == 'select' ) { $buffer .= ''; } return $buffer; } /// }}} function serialize( $val ) { // {{{ return serialize( $val ); } // }}} function sort( &$array, $field, $order='desc' ) { // {{{ if ( $field == 'random' ) { shuffle( $array ); } else { $GLOBALS['sortby'] = $field; usort( $array, array( 'linkex', 'usort' ) ); if ( $order == 'desc' ) { $array = array_reverse( $array ); } } } // }}} function stripcomments( $con ) { // {{{ $con = preg_replace( '||Umis', '', $con ); $con = preg_replace( '||Umis', '', $con ); $con = preg_replace( '||Umis', '', $con ); return $con; } // }}} function substr( $str, $len, $pad='..' ) { // {{{ if ( strlen( $str ) > $len ) { return substr( $str, 0, $len - strlen( $pad ) ) . $pad; } else { return $str; } } // }}} function truncate( $str, $len, $txt='..' ) { // {{{ if ( strlen( $str ) > ( $len-strlen( $txt ) ) ) { return substr( $str, 0, $len-strlen( $txt ) ).$txt; } else { return $str; } } // }}} function unserialize( $str ) { // {{{ $retval = @unserialize( $str ); if ( $retval !== false ) { return $retval; } else { // Attempt to fix it $str = preg_replace('!s:(\d+):"(.*?)";!e', "'s:'.strlen('$2').':\"$2\";'", trim( $str ) ); $retval = @unserialize( $str ); if ( $retval !== false ) { return $retval; } else { echo '[Fatal error in linkex::unserialize( "'. $str .'" )]'; } } } // }}} function usort( $a, $b ) { // {{{ if ( isset( $GLOBALS['sortby'] ) && strlen( $GLOBALS['sortby'] ) > 0 ) { $f = $GLOBALS['sortby']; if ( is_object( $a ) && isset( $a->$f ) ) { $aa = $a->$f; } else if ( is_array( $a ) && isset( $a[$f] ) ) { $aa = $a[$f]; } else { $aa = $a; } if ( is_object( $b ) && isset( $b->$f ) ) { $bb = $b->$f; } else if ( is_array( $b ) && isset( $b[$f] ) ) { $bb = $b[$f]; } else { $bb = $b; } switch( $f ) { case 'rdomip': $aa = sprintf( '%u', ip2long( $aa ) ); $bb = sprintf( '%u', ip2long( $bb ) ); break; case 'rdom': $aa = str_replace( 'www.', '', strtolower( $aa ) ); $bb = str_replace( 'www.', '', strtolower( $bb ) ); break; case 'anchor': $aa = strtolower( $aa ); $bb = strtolower( $bb ); break; } if ($aa == $bb) { return 0; } return ($aa < $bb) ? -1 : 1; } else { return 0; } } // }}} function verifybacklinks( $ids=array(), $callback=null ) { // {{{ global $config; $retval = array( 'starttime' => time(), 'links' => array(), 'categories' => array() ); foreach( $ids AS $id ) { $l = new link( $id ); $l->updateIPs(); $buffer = array( 'action' => 'link', 'id' => $l->id, 'rdom' => $l->rdom, 'rdomip' => $l->rdomip, 'rurl' => $l->rurl, 'skipcheck' => $l->skipcheck, 'skippagerank' => $l->skippagerank, 'minpagerank' => ( $l->minpagerank != -1 ) ? $l->minpagerank : $config->minpagerank, 'oldstatus' => $l->status, 'oldpagerank' => $l->pagerank ); if ( $l->skipcheck == 0 ) { $pr = $l->getPageRank(); $buffer{'res'} = $l->hasBacklink(); $buffer{'code'} = ( !is_string( linkex::get( 'reason', $buffer{'res'}, null ) ) ) ? '200 OK' : $l->laststatus; if ( $l->status != 4 ) { $l->status = ( ( $pr >= ( ( $l->minpagerank != -1 ) ? $l->minpagerank : $config->minpagerank ) ) && ( linkex::get( 'res', $buffer{'res'}, -1 ) == 0 ) ) ? 1:2; } $l->save( false ); } $buffer{'status'} = $l->status; $buffer{'pagerank'} = $l->pagerank; $retval{'links'}[] = $buffer; unset( $l ); if ( $callback != null && function_exists( $callback ) ) { call_user_func( $callback, $buffer ); } unset( $buffer ); } // Rebuild categories $categories = linkex::listfiles( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'categories' . DIRECTORY_SEPARATOR ); foreach( $categories AS $cid ) { $c = new category( $cid ); $c->generate(); $buffer = array( 'action' => 'category', 'id' => $cid, 'name' => $c->name ); $retval{'categories'}[] = $buffer; unset( $c ); if ( $callback != null && function_exists( $callback ) ) { call_user_func( $callback, $buffer ); } unset( $buffer ); } $retval{'endtime'} = time(); return $retval; } // }}} function sum( $array = array() ) { // {{{ $retval = 0; foreach( $array AS $a ) { $retval += $a; } return $retval; } // }}} function yesno( $val ) { // {{{ return ( $val ) ? 'Yes':'No'; } // }}} } class template { function about() { // {{{ global $config; if ( LOGGEDIN ) { $phpver = phpversion(); $zendver = zend_version(); $uname = php_uname( 's r' ); $du = round( linkex::du( BASEDIR . DIRECTORY_SEPARATOR . 'data' ) / 1024, 2 ).'KB'; $links = sizeof( linkex::listfiles( BASEDIR . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'links' . DIRECTORY_SEPARATOR ) ); $installdate = date( $config->dateformat, $config->installdate ); if ( function_exists( 'gd_info' ) ) { $gd = gd_info(); $gd = sprintf( '%s - GIF Support: %s', $gd{'GD Version'}, ( ( $gd{'GIF Create Support'} ) ? 'enabled':'unsupported, using plain text for CAPTCHA if used' ) ); } else { $gd = 'Not installed, using plain text for CAPTCHA if used.'; } echo "
\n\t
\n\t\tServer info\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
PHP version:{$phpver}
Zend version:{$zendver}
GD Info:{$gd}
Server OS:{$uname}
\n\t
\n
\n\n
\n\t
\n\t\tLinkEX info\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
LinkEX version:20071229
Current version: (Force upgrade)
Database size:{$du}
Links:{$links}
Install date:{$installdate}
\n\t
\n
\n\n\n\n"; } else { echo "
\n\tPowered by LinkEX\n\t
\n\t\tThis site is powered by LinkEX, a free script that will take care of accepting link exchange requests, \n\t\tand, if needed, making sure a link back is present.
\n\t\t
\n\t\tIf you run a website, you can have this script also. Head over to linkex.dk, \n\t\tand get your free copy.
\n\t\t
\n\t\t
Features
\n\t\t
    \n\t\t\t
  • Free! This script is free. No hidden fees, no nothing.
  • \n\t\t\t
  • Easy to install - upload 1 (one) file, fill out the basic settings, and you are good to go.
  • \n\t\t\t
  • One click updates. Update the script, just by a single click. The script will fetch the latest release, install it, making sure you are up to date at all times.
  • \n\t\t\t
  • Advancend link robot. You choose what sites to check for backlinks, and the bot will make sure the link is present.
  • \n\t\t\t
  • Google PageRank™ check. The script will show you the PageRank™ of all your link partners.
  • \n\t\t\t
  • And much much more..
  • \n\t\t
\n\t\tHead over to linkex.dk to read more\n\t
\n
\n"; } } // }}} function footer() { // {{{ return "\t\t\t\n\t\t\t
\n\t\t\t\tv.20071229 © linkex.dk 2006-2007\n\t\t\t
\n\t\t\n\t
Download Mp3/Mp3 MusicTop Chartsdownload R.E.M. music lyricdownload Leona Lewis music lyricdownload Portishead music lyricdownload Iron Maiden music lyricdownload Led Zeppelin music lyricdownload Beth Rowley music lyricdownload Mariah Carey music lyricdownload Bruce Springsteen music lyricdownload AC/DC music lyricdownload Linkin Park music lyricdownload OneRepublic music lyricdownload Bob Dylan music lyricdownload Metallica music lyricdownload The Who music lyricdownload Rihanna music lyricdownload Al Green music lyricdownload The Kooks music lyricdownload U2 music lyricdownload David Bowie music lyricdownload Prince music lyricdownload Alanis Morissette music lyricdownload Putumayo music lyricdownload Elvis Presley music lyricdownload Willie Nelson music lyricdownload Jon Bon Jovi music lyriclist of trucking companie

list of trucking companie

watch loosing binding and loosing

loosing binding and loosing

require lithium orotate withdrawl

lithium orotate withdrawl

note lombard lounge spirits

lombard lounge spirits

hit listerene on dogs

listerene on dogs

better loving wisdom by paul copan

loving wisdom by paul copan

cent low carb chiffon cake cooking

low carb chiffon cake cooking

remember lletz

lletz

house long island ferry to foxwoods

long island ferry to foxwoods

did lowering a roadking

lowering a roadking

give loriann pierce

loriann pierce

play lipids lipoproteins bishop answer

lipids lipoproteins bishop answer

least loreal hair relaxer west palm beach

loreal hair relaxer west palm beach

water liposuction near lake orion mi

liposuction near lake orion mi

pattern lords lodge backpackers

lords lodge backpackers

twenty littleton fuses

littleton fuses

sing lisa gammeltoft tn

lisa gammeltoft tn

men lori solie

lori solie

ago liteon sohr 5238s cd rw

liteon sohr 5238s cd rw

hot lofty fig abaco

lofty fig abaco

can louis livingstone home again lyrics

louis livingstone home again lyrics

air loffler bike new york

loffler bike new york

been liquor stores in medford nj

liquor stores in medford nj

him louis vuitton mini lin wallet

louis vuitton mini lin wallet

other louvaine error tagging manual

louvaine error tagging manual

century list of wicker baby bassinette manufacturers

list of wicker baby bassinette manufacturers

see loja ecomarine

loja ecomarine

pretty logger pro 3 4 5

logger pro 3 4 5

course llanes surname

llanes surname

soil low vision audiology scotland

low vision audiology scotland

joy lovenox and fresh frozen plasma

lovenox and fresh frozen plasma

map lindora weight loss program

lindora weight loss program

govern linksys wrtp54g default password

linksys wrtp54g default password

kill line 6 variax 705 lowest price

line 6 variax 705 lowest price

able litl scholar academy

litl scholar academy

boat lisa primeaux

lisa primeaux

build loundon tn

loundon tn

down loban diesel

loban diesel

select lorna timms

lorna timms

result long island dart assoc

long island dart assoc

garden lindsey buckingham priest

lindsey buckingham priest

if lophtcrack 3 0 download

lophtcrack 3 0 download

rise local radar 36081

local radar 36081

case loll realty

loll realty

present logo of arsenalfc

logo of arsenalfc

touch london fog raincoats in norman oklahoma

london fog raincoats in norman oklahoma

grass little hercules richard sandrak

little hercules richard sandrak

morning long island judo

long island judo

receive louisa c moats ed d syllable

louisa c moats ed d syllable

some list of urinary antiseptics

list of urinary antiseptics

soon lonnie sizer

lonnie sizer

held linux compaq presario c500

linux compaq presario c500

produce louis brule genealogy

louis brule genealogy

moon line 6 spider ii hd75

line 6 spider ii hd75

during lois vatton

lois vatton

lift lirik tidurlah wahai permaisuri

lirik tidurlah wahai permaisuri

his liposuction trichinosis

liposuction trichinosis

try louisville homerama

louisville homerama

cut louis xvi 1787 royal reform proposal

louis xvi 1787 royal reform proposal

oxygen little tikes slide and climb cube

little tikes slide and climb cube

deal longhorn steer paintings

longhorn steer paintings

noon longboard truck bushings

longboard truck bushings

or little learue

little learue

mix liver cirhosis

liver cirhosis

score littman master cardiology parts

littman master cardiology parts

team louisville guitar slugger

louisville guitar slugger

show logansport missing person

logansport missing person

bank list of welsh pony prefixes

list of welsh pony prefixes

atom list of stewie griffins weapons

list of stewie griffins weapons

laugh lon twin mattresses

lon twin mattresses

event london meed

london meed

product lost world s hitlers supercity

lost world s hitlers supercity

nothing linksys wireless g range expander wre54g reviews

linksys wireless g range expander wre54g reviews

nature lois storozuk

lois storozuk

differ linens n things west bend

linens n things west bend

cold lipotropic pills

lipotropic pills

country loughren doyle

loughren doyle

ball list of unreachable county seats

list of unreachable county seats

again lladro st nicholas

lladro st nicholas

grand lindsey joann lucio university police

lindsey joann lucio university police

power lottery pam webb

lottery pam webb

side liquer stores atco new jersey

liquer stores atco new jersey

from lindner tyree

lindner tyree

result list of the pyrimids of egypt

list of the pyrimids of egypt

war louis vuitoon

louis vuitoon

soft loren goedeken

loren goedeken

have lithotripter table top prices

lithotripter table top prices

among lolly personalized candy

lolly personalized candy

machine listen to selena dreaming of you

listen to selena dreaming of you

basic lissencephaly pictures of children

lissencephaly pictures of children

thought lois sakany

lois sakany

again longleat safari hotel offer

longleat safari hotel offer

wonder lindsey baume missouri

lindsey baume missouri

winter lloyd godson

lloyd godson

student lise charmel bras

lise charmel bras

enter lord gore buffalo hunter

lord gore buffalo hunter

separate louden nascar appearance

louden nascar appearance

pay literaryanalysis

literaryanalysis

consider loren greenough

loren greenough

room low fuel mileage powerstroke 7 3

low fuel mileage powerstroke 7 3

create linganore farms wine

linganore farms wine

example lindsay mckenzie danni ashe

lindsay mckenzie danni ashe

dance lisa cunniffe

lisa cunniffe

milk lisa jakub pics

lisa jakub pics

strange lisa kite evansville

lisa kite evansville

force low cost spay bay city tx

low cost spay bay city tx

nine lowenstein sandler associates

lowenstein sandler associates

big lisa shearin

lisa shearin

experience little panda webkinz

little panda webkinz

year lofts inlynchburg virginia

lofts inlynchburg virginia

feel loping hackamore

loping hackamore

four louisiana philharmonic audition

louisiana philharmonic audition

seem linksys wrt54g specifications

linksys wrt54g specifications

success lipa new residential customer

lipa new residential customer

gather llf lighting

llf lighting

ball lombardy country villa

lombardy country villa

plane lm7812

lm7812

art linksys cgn9

linksys cgn9

plural linksys wireless router 9ghz

linksys wireless router 9ghz

represent literar society

literar society

temperature linux thumprint scanning

linux thumprint scanning

student live with jesus wynonna judd

live with jesus wynonna judd

war long point state park brevard county

long point state park brevard county

cost lonson

lonson

crop lori bonn used buy

lori bonn used buy

window lovecat tim

lovecat tim

fair loreal preference dye

loreal preference dye

me lovejoy coupling insert materials

lovejoy coupling insert materials

egg lipodissolve oregon

lipodissolve oregon

be lodges on acklins

lodges on acklins

solve linea pelle shopper bag

linea pelle shopper bag

day los desperados recruit problem san andreas

los desperados recruit problem san andreas

or lori fulkerson

lori fulkerson

break listen to superchick

listen to superchick

exercise listen so lil wanyes promise

listen so lil wanyes promise

true . louisville gfe backpage

louisville gfe backpage

mind liquid light projector disks

liquid light projector disks

city louis gayteenstudio

louis gayteenstudio

figure log homes on otsego lake

log homes on otsego lake

plain loc cassiopeia

loc cassiopeia

expect littlestown fish and game pa

littlestown fish and game pa

wait louisiana and coastal wetlands management laws

louisiana and coastal wetlands management laws

knew lovie howell

lovie howell

surprise logan weis basketball

logan weis basketball

beat loudoun county sanitation

loudoun county sanitation

hope listen to wror

listen to wror

visit little orphan annie set

little orphan annie set

war lodging shoreline wa

lodging shoreline wa

crease lindsey chambers eventing

lindsey chambers eventing

smell lord howe island phasmid

lord howe island phasmid

visit london plague pit

london plague pit

company lopresti contemporaries

lopresti contemporaries

watch louis laplant sioux

louis laplant sioux

seed little laundry longaberger basket

little laundry longaberger basket

song louis jean girod said

louis jean girod said

bell literacy program of brevard

literacy program of brevard

work lirr schedule babylon

lirr schedule babylon

excite lobster chower

lobster chower

arrive louis joseph papineau family tree

louis joseph papineau family tree

walk lithospheric hot spot definition

lithospheric hot spot definition

school locost bodywork

locost bodywork

value lm741 audio circuits

lm741 audio circuits

road loar guitar

loar guitar

gun listen to katt williams

listen to katt williams

snow lolly trolley

lolly trolley

bit lower left eyelid twitches

lower left eyelid twitches

proper lior behar

lior behar

ball lingo communication device

lingo communication device

feed loretty lynn

loretty lynn

claim loretta lynn s sweet potato casserole

loretta lynn s sweet potato casserole

smile loretta johnson obituary

loretta johnson obituary

mind louis p rago

louis p rago

drop llast minute vacations

llast minute vacations

populate lompoc rigel

lompoc rigel

may lowden business solutions

lowden business solutions

would louise ogborn unedited

louise ogborn unedited

present long term effects of laminitis founder

long term effects of laminitis founder

season longfellow thanksgiving

longfellow thanksgiving

result los gelida and bereber

los gelida and bereber

took little whale cay places

little whale cay places

in lisa robertson airline stewardess

lisa robertson airline stewardess

total lois crighton

lois crighton

lift louis dryfus citrus

louis dryfus citrus

noon lokk latch pro

lokk latch pro

my literature book mcdougal littell answers

literature book mcdougal littell answers

power lofts in near csuf

lofts in near csuf

truck lisa convey ccsd

lisa convey ccsd

been lora patterson raleigh

lora patterson raleigh

type linn s auto salvage

linn s auto salvage

name log cabins by hilltop

log cabins by hilltop

spring lothal beads

lothal beads

number listen to molly sponge

listen to molly sponge

milk lite 104 des moines ia

lite 104 des moines ia

green loading cap and ball revolver

loading cap and ball revolver

me longchamps electric

longchamps electric

color litchfield plantation pawley s island

litchfield plantation pawley s island

little louisiana driskill mountain 535 ft directions

louisiana driskill mountain 535 ft directions

human lovettsville va fair

lovettsville va fair

ship los osos ca apartment rentals

los osos ca apartment rentals

town loi dcra

loi dcra

people lomg division made simple

lomg division made simple

bought lindsey tire and retreading

lindsey tire and retreading

earth lodging taylors sc

lodging taylors sc

syllable live shearch

live shearch

stretch lord justice sheen case zeebrugge

lord justice sheen case zeebrugge

shore loudoun valley estates swimming pool

loudoun valley estates swimming pool

some lisa mancini labor

lisa mancini labor

which low cost fares lax array accra

low cost fares lax array accra

but longxi machinery report

longxi machinery report

why lip fillers tacoma

lip fillers tacoma

dog lowered 04 blue srt4 pictures

lowered 04 blue srt4 pictures

work lisa lawer male

lisa lawer male

invent lorazepam use in veterinary medicine

lorazepam use in veterinary medicine

led longshore golf lessons in westport ct

longshore golf lessons in westport ct

saw list beep error codes photon

list beep error codes photon

has litany of humility prayer

litany of humility prayer

fell loretta keesling

loretta keesling

car llm trafik

llm trafik

answer lindsay perry and james mcgill wedding

lindsay perry and james mcgill wedding

him linseis inc

linseis inc

body local rent houses in okc

local rent houses in okc

tool lindsay horrocks elite soccer

lindsay horrocks elite soccer

death loveland co altitude

loveland co altitude

life lipchic lip essentials

lipchic lip essentials

except litterworks

litterworks

might low power readers eyeglasses

low power readers eyeglasses

swim lois hartman meditation

lois hartman meditation

distant los lirios tulum

los lirios tulum

happen lord of sabbaoth

lord of sabbaoth

grand lollipop fundraising ideas

lollipop fundraising ideas

sell looj ceeb

looj ceeb

buy lindy fralin amps

lindy fralin amps

laugh linton indiana exhibitions

linton indiana exhibitions

paint linsey ohan

linsey ohan

came louis potter bookends

louis potter bookends

fire lovex lyrics

lovex lyrics

hour lotro spoiler raid quest

lotro spoiler raid quest

distant lisa bonet in playboy

lisa bonet in playboy

school lori naill

lori naill

ease lisa roberts il willmette

lisa roberts il willmette

fair ling tan emporio armani fragrance

ling tan emporio armani fragrance

glass little house craft sewing songbook

little house craft sewing songbook

place lori nelson spokane wa

lori nelson spokane wa

anger loesterin 24 fe

loesterin 24 fe

near lisu hill tribe

lisu hill tribe

bright lisa simsons

lisa simsons

record lobelia to induce labor

lobelia to induce labor

thin llamas phoenix suns

llamas phoenix suns

since liter equals ounces

liter equals ounces

bone lithonia elm4

lithonia elm4

start listen to 95 7 music videos

listen to 95 7 music videos

govern lowell correctional institution

lowell correctional institution

six little miss muffet cookie jar

little miss muffet cookie jar

post lisa dergan center

lisa dergan center

noise live nativity atlanta

live nativity atlanta

go lowell liebermann gargoyles print

lowell liebermann gargoyles print

several louisiana income tax efile

louisiana income tax efile

brought lord of the rings rune translator

lord of the rings rune translator

add little wonders preschool wonder lake il

little wonders preschool wonder lake il

temperature loesje cc home page

loesje cc home page

voice listerine lice

listerine lice

arrange lollitots

lollitots

measure louvered cafe doors

louvered cafe doors

major louisa berman genealogy

louisa berman genealogy

sky loud trilling call

loud trilling call

difficult louise driscoll biography

louise driscoll biography

before liquid therepy bar avon ohio

liquid therepy bar avon ohio

run lodge broughty castle 486

lodge broughty castle 486

oh line vautrin

line vautrin

drive loman distributor

loman distributor

feel local food caterer 21014

local food caterer 21014

great low cost veterinary care miami florida

low cost veterinary care miami florida

simple liscensed plumbers in broward county

liscensed plumbers in broward county

be little cinderella audition torrent

little cinderella audition torrent

window logd liquid chromatography

logd liquid chromatography

wrong los lomas medical center santa barbara

los lomas medical center santa barbara

show longevity of supercharged mgb

longevity of supercharged mgb

tone linoleum krommenie

linoleum krommenie

well liquid nightclub hanley

liquid nightclub hanley

with logers

logers

century louis cirrincione

louis cirrincione

group lip enhancing in washington state

lip enhancing in washington state

noise louise penney breakaway cbc

louise penney breakaway cbc

copy locomtive diesel

locomtive diesel

tone lm2576t voltage converter

lm2576t voltage converter

law llardo prices

llardo prices

tube lisa temaat

lisa temaat

me lip gloss lip smackers

lip gloss lip smackers

ocean louisville ky hostel

louisville ky hostel

large lori berquam

lori berquam

kill louis silvestro middle township

louis silvestro middle township

total lopi blower motor

lopi blower motor

necessary livable houston magazine

livable houston magazine

chair lois riffe

lois riffe

finger linear system lathi california

linear system lathi california

might longuyon places

longuyon places

who louis lasarte

louis lasarte

huge lm7 vats removal

lm7 vats removal

rock loctite 518

loctite 518

store liquid argon dewar wikipedia

liquid argon dewar wikipedia

simple linuo paradigma

linuo paradigma

leg lorianne crook legs

lorianne crook legs

pound low maintenance puppie

low maintenance puppie

hit lord fairfax community college middletown va

lord fairfax community college middletown va

do lipizzan breeders

lipizzan breeders

sand loctite thermally conductive silicone grease

loctite thermally conductive silicone grease

winter littlesummer

littlesummer

radio log purlins interior

log purlins interior

large lm501314

lm501314

verb live chay cebu

live chay cebu

few liquidnet h2o

liquidnet h2o

duck lonley planet scotland

lonley planet scotland

section lisa andrade acupuncture

lisa andrade acupuncture

wrong loguestbook gateway

loguestbook gateway

smile little april blog askjolene

little april blog askjolene

select lori carroll scituate ma

lori carroll scituate ma

connect lipazzan

lipazzan

finish los angelestraffic schools

los angelestraffic schools

fit longhorn bob wheeler

longhorn bob wheeler

season liver disease tyrosinemia

liver disease tyrosinemia

stood lisa rafaniello

lisa rafaniello

simple line elementary school limerick maine

line elementary school limerick maine

I littleton fuses

littleton fuses

meant lithium orotate supplements

lithium orotate supplements

young literary agents for short story anthologies

literary agents for short story anthologies

hit lonicera growth and care

lonicera growth and care

toward linen cabby caps

linen cabby caps

clear loestrin and klonopin

loestrin and klonopin

sun lowering a dog triglycerides

lowering a dog triglycerides

team ll bean solitude

ll bean solitude

village little people doodle pro

little people doodle pro

two louis icot

louis icot

catch lindsay lohan marlyn monroe

lindsay lohan marlyn monroe

grow loudspeaker rigging

loudspeaker rigging

anger loffler bronze

loffler bronze

sure live satellite imaging weather argentina

live satellite imaging weather argentina

face lodging 98424

lodging 98424

grow liquior barn

liquior barn

verb litterotica icest

litterotica icest

atom loan pawn shop anchorage ak

loan pawn shop anchorage ak

family loius vi

loius vi

student lisa baechle

lisa baechle

sight little tykes ball pit

little tykes ball pit

fruit little devil cartoon tattoo

little devil cartoon tattoo

metal lockheed scif

lockheed scif

car lorain county clerk ohio

lorain county clerk ohio

numeral lorene ligouri

lorene ligouri

planet loh dorki

loh dorki

early lindys cupboard

lindys cupboard

hole lisa williams cklw

lisa williams cklw

meet loudspeaker orientation problems

loudspeaker orientation problems

able lindy dancing columbus ohio

lindy dancing columbus ohio

decimal long foster realators

long foster realators

letter loren danhauer

loren danhauer

as linksys wusb54gp

linksys wusb54gp

small louise ellen joye

louise ellen joye

help loraine day cancer

loraine day cancer

flat lockkeepers

lockkeepers

cotton litco

litco

we little toe red swollen pain

little toe red swollen pain

spot logan echolls wallpaper

logan echolls wallpaper

compare lindsay doto

lindsay doto

next linsan

linsan

plant llanwenarth arms brecon

llanwenarth arms brecon

house loranka cavalier king charles spaniels

loranka cavalier king charles spaniels

south louis xiv andnot ringtones

louis xiv andnot ringtones

bought longo bags endless bags

longo bags endless bags

and lisa gerrard greasy dies

lisa gerrard greasy dies

verb lisa st aubin de teran

lisa st aubin de teran

back lorand meray

lorand meray

century louis vuittion

louis vuittion

you lip piercing aftercare

lip piercing aftercare

front lodine 400mg

lodine 400mg

push listen zoegirl forevermore

listen zoegirl forevermore

floor lingo dib

lingo dib

order louisiana technical college abbeville

louisiana technical college abbeville

surprise lm 340t

lm 340t

hand lodging in moclips washington

lodging in moclips washington

face littermaid model lme9250

littermaid model lme9250

village linmark byford

linmark byford

direct llorente navarrette

llorente navarrette

chord litchfield country cellular

litchfield country cellular

travel london fog fleece lined jacket

london fog fleece lined jacket

agree lou s marine gulf breeze

lou s marine gulf breeze

whole lolicon top100

lolicon top100

sand liquid ivermectin for dogs

liquid ivermectin for dogs

charge loggins and messina so fine

loggins and messina so fine

boat lomond airport hotel paisley

lomond airport hotel paisley

bone lord reign in me delirious lyrics

lord reign in me delirious lyrics

could london fog men s jackets

london fog men s jackets

area look alike baronet java furniture

look alike baronet java furniture

break linux hypercam help

linux hypercam help

sand lise anne couture biography

lise anne couture biography

measure lloyd flanders charlottesville

lloyd flanders charlottesville

off lisburn fone numbers

lisburn fone numbers

south lisa sparkxxx aids

lisa sparkxxx aids

view lm3915 project

lm3915 project

slip lourdes water properties

lourdes water properties

north loganberry books solved mysteries w

loganberry books solved mysteries w

animal
\n\n"; } // }}} function header( $params = array() ) { // {{{ global $errors, $config; $params = array_merge( array( 'menu' => Template::menu(), 'title' => '', 'onload' => '' ), $params ); $error = ''; $cookieIds = "'".join( '\',\'', array_unique( explode( ',', linkex::get( 'fscookie', $_COOKIE, '' ) ) ) )."'"; $charset = isset( $config->charset ) ? $config->charset : 'utf8'; if ( linkex::get( 'noerrors', $params, true ) && sizeof( $errors ) > 0 ) { $error = join( '
', $errors ); $error = "
\n\t
\n\t\tError\n\t\t
\n\t\t\t{$error}\n\t\t
\n\t
\n
\n"; } return "\n\n\t\n\t\t\n\t\tLinkEX » {$params{'title'}}\n\t\t\n\t\t