472 lines
16 KiB
PHP
472 lines
16 KiB
PHP
|
<?php
|
||
|
|
||
|
/**
|
||
|
* [Discuz!] (C)2001-2099 Comsenz Inc.
|
||
|
* This is NOT a freeware, use is subject to license terms
|
||
|
*
|
||
|
* $Id: misc_ranklist.php 32807 2013-03-13 08:49:49Z zhengqingpeng $
|
||
|
*/
|
||
|
if(!defined('IN_DISCUZ')) {
|
||
|
exit('Access Denied');
|
||
|
}
|
||
|
|
||
|
$page = $_G['page'];
|
||
|
$type = $_GET['type'];
|
||
|
|
||
|
$_G['disabledwidthauto'] = 1;
|
||
|
|
||
|
if(!in_array($type, array('index', 'member', 'thread', 'blog', 'poll', 'picture', 'activity', 'forum', 'group'))) {
|
||
|
$type = 'index';
|
||
|
}
|
||
|
|
||
|
$ranklist_setting = $_G['setting']['ranklist'];
|
||
|
if(!$ranklist_setting['status']) {
|
||
|
showmessage('ranklist_status_off');
|
||
|
}
|
||
|
|
||
|
$navtitle = lang('core', 'title_ranklist_'.$type);
|
||
|
|
||
|
if($type != 'index') {
|
||
|
if(!$ranklist_setting[$type]['available']) {
|
||
|
showmessage('ranklist_this_status_off');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
include libfile('misc/ranklist_'.$type, 'include');
|
||
|
function getranklist_thread($num = 20, $view = 'replies', $orderby = 'all') {
|
||
|
global $_G;
|
||
|
$dateline = '';
|
||
|
$timestamp = 0;
|
||
|
if($orderby == 'today') {
|
||
|
$timestamp = TIMESTAMP - 86400;
|
||
|
} elseif($orderby == 'thisweek') {
|
||
|
$timestamp = TIMESTAMP - 604800;
|
||
|
} elseif($orderby == 'thismonth') {
|
||
|
$timestamp = TIMESTAMP - 2592000;
|
||
|
}
|
||
|
$data = array();
|
||
|
$rank = 0;
|
||
|
$notfid = $_G['setting']['ranklist']['ignorefid'] ? explode(',', $_G['setting']['ranklist']['ignorefid']) : array();
|
||
|
foreach(C::t('forum_thread')->fetch_all_rank_thread($timestamp, $notfid, $view, $num) as $thread) {
|
||
|
++$rank;
|
||
|
$thread['rank'] = $rank;
|
||
|
$thread['dateline'] = dgmdate($thread['dateline']);
|
||
|
$data[] = $thread;
|
||
|
}
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
function getranklist_poll($num = 20, $view = 'heats', $orderby = 'all') {
|
||
|
global $_G;
|
||
|
$dateline = '';
|
||
|
$timestamp = 0;
|
||
|
if($orderby == 'today') {
|
||
|
$timestamp = TIMESTAMP - 86400;
|
||
|
} elseif($orderby == 'thisweek') {
|
||
|
$timestamp = TIMESTAMP - 604800;
|
||
|
} elseif($orderby == 'thismonth') {
|
||
|
$timestamp = TIMESTAMP - 2592000;
|
||
|
}
|
||
|
$data = array();
|
||
|
require_once libfile('function/forum');
|
||
|
$rank = 0;
|
||
|
$notfid = $_G['setting']['ranklist']['ignorefid'] ? explode(',', $_G['setting']['ranklist']['ignorefid']) : array();
|
||
|
foreach(C::t('forum_thread')->fetch_all_rank_poll($timestamp, $notfid, $view, $num) as $poll) {
|
||
|
++$rank;
|
||
|
$poll['rank'] = $rank;
|
||
|
$poll['avatar'] = avatar($poll['authorid'], 'small');
|
||
|
$poll['dateline'] = dgmdate($poll['dateline']);
|
||
|
$poll['pollpreview'] = explode("\t", trim($poll['pollpreview']));
|
||
|
$data[] = $poll;
|
||
|
}
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
function getranklist_activity($num = 20, $view = 'heats', $orderby = 'all') {
|
||
|
global $_G;
|
||
|
$dateline = '';
|
||
|
$timestamp = 0;
|
||
|
if($orderby == 'today') {
|
||
|
$timestamp = TIMESTAMP - 86400;
|
||
|
} elseif($orderby == 'thisweek') {
|
||
|
$timestamp = TIMESTAMP - 604800;
|
||
|
} elseif($orderby == 'thismonth') {
|
||
|
$timestamp = TIMESTAMP - 2592000;
|
||
|
}
|
||
|
$data = array();
|
||
|
$rank = 0;$attachtables = array();
|
||
|
$notfid = $_G['setting']['ranklist']['ignorefid'] ? explode(',', $_G['setting']['ranklist']['ignorefid']) : array();
|
||
|
foreach(C::t('forum_thread')->fetch_all_rank_activity($timestamp, $notfid, $view, $num) as $thread) {
|
||
|
++$rank;
|
||
|
$thread['rank'] = $rank;
|
||
|
$thread['starttimefrom'] = dgmdate($thread['starttimefrom']);
|
||
|
if($thread['starttimeto']) {
|
||
|
$thread['starttimeto'] = dgmdate($thread['starttimeto']);
|
||
|
} else {
|
||
|
$thread['starttimeto'] = '';
|
||
|
}
|
||
|
if($thread['expiration'] && TIMESTAMP > $thread['expiration']) {
|
||
|
$thread['has_expiration'] = true;
|
||
|
} else {
|
||
|
$thread['has_expiration'] = false;
|
||
|
}
|
||
|
$data[$thread['tid']] = $thread;
|
||
|
$attachtables[getattachtableid($thread['tid'])][] = $thread['aid'];
|
||
|
}
|
||
|
foreach($attachtables as $attachtable => $aids) {
|
||
|
$attachs = C::t('forum_attachment_n')->fetch_all($attachtable, $aids);
|
||
|
foreach($attachs as $attach) {
|
||
|
$attach['attachurl'] = ($attach['remote'] ? $_G['setting']['ftp']['attachurl'] : $_G['setting']['attachurl']).'forum/'.$attach['attachment'];
|
||
|
$data[$attach['tid']] = array_merge($data[$attach['tid']], $attach);
|
||
|
}
|
||
|
}
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
function getranklist_picture($num = 20, $view = 'hot', $orderby = 'all') {
|
||
|
$timestamp = TIMESTAMP - 86400;
|
||
|
$dateline = 'p.'.DB::field('dateline', $timestamp, '>=');
|
||
|
|
||
|
if($orderby == 'thisweek') {
|
||
|
$timestamp = TIMESTAMP - 604800;
|
||
|
$dateline = 'p.'.DB::field('dateline', $timestamp, '>=');
|
||
|
} elseif($orderby == 'thismonth') {
|
||
|
$timestamp = TIMESTAMP - 2592000;
|
||
|
$dateline = 'p.'.DB::field('dateline', $timestamp, '>=');
|
||
|
}
|
||
|
|
||
|
$data = array();
|
||
|
$query = C::t('home_pic')->fetch_all_by_sql($dateline, 'p.'.DB::order($view, 'DESC'), 0, $num);
|
||
|
|
||
|
require_once libfile('function/home');
|
||
|
$rank = 0;
|
||
|
foreach($query as $value) {
|
||
|
++$rank;
|
||
|
$picture = array('picid' => $value['picid'], 'uid' => $value['uid'], 'username' => $value['username'], 'title' => $value['title'], 'filepath' => $value['filepath'], 'thumb' => $value['thumb'], 'remote' => $value['remote'], 'hot' => $value['hot'], 'sharetimes' => $value['sharetimes'], 'click1' => $value['click1'], 'click2' => $value['click2'], 'click3' => $value['click3'], 'click4' => $value['click4'], 'click5' => $value['click5'], 'click6' => $value['click6'], 'click7' => $value['click7'], 'click8' => $value['click8'], 'albumid' => $value['albumid'], 'albumname' => $value['albumname'], 'friend' => $value['friend']);
|
||
|
$picture['rank'] = $rank;
|
||
|
$picture['url'] = $picture['friend'] == 0 ? pic_get($picture['filepath'], 'album', $picture['thumb'], $picture['remote']) : STATICURL.'image/common/nopublish.gif';;
|
||
|
$picture['origurl'] = pic_get($picture['filepath'], 'album', 0, $picture['remote']);
|
||
|
$data[] = $picture;
|
||
|
}
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
function getranklist_pictures_index($num = 20, $dateline = 0, $orderby = 'hot DESC') {
|
||
|
$picturelist = array();
|
||
|
$query = C::t('home_pic')->fetch_all_by_sql('p.hot>3', 'p.dateline DESC', 0, $num);
|
||
|
require_once libfile('function/home');
|
||
|
foreach($query as $value) {
|
||
|
$picture = array('picid' => $value['picid'], 'uid' => $value['uid'], 'username' => $value['username'], 'title' => $value['title'], 'filepath' => $value['filepath'], 'thumb' => $value['thumb'], 'remote' => $value['remote'], 'albumid' => $value['albumid'], 'albumname' => $value['albumname'], 'friend' => $value['friend']);
|
||
|
$picture['url'] = $picture['friend'] == 0 ? pic_get($picture['filepath'], 'album', $picture['thumb'], $picture['remote']) : STATICURL.'image/common/nopublish.gif';;
|
||
|
$picture['origurl'] = $picture['friend'] == 0 ? pic_get($picture['filepath'], 'album', 0, $picture['remote']) : STATICURL.'image/common/nopublish.gif';
|
||
|
$picturelist[] = $picture;
|
||
|
}
|
||
|
return $picturelist;
|
||
|
}
|
||
|
|
||
|
function getranklist_members($offset = 0, $limit = 20) {
|
||
|
require_once libfile('function/forum');
|
||
|
$members = array();
|
||
|
$topusers = C::t('home_show')->fetch_all_by_unitprice($offset, $limit, true);
|
||
|
foreach($topusers as $member) {
|
||
|
$member['avatar'] = avatar($member['uid'], 'small');
|
||
|
$member['note'] = dhtmlspecialchars($member['note']);
|
||
|
$members[] = $member;
|
||
|
}
|
||
|
return $members;
|
||
|
}
|
||
|
|
||
|
function getranklist_girls($offset = 0, $limit = 20, $orderby = 'ORDER BY s.unitprice DESC, s.credit DESC') {
|
||
|
return C::t('common_member')->fetch_all_girls_for_ranklist($offset, $limit, $orderby);
|
||
|
}
|
||
|
|
||
|
function getranklist_blog($num = 20, $view = 'hot', $orderby = 'all') {
|
||
|
$dateline = $timestamp = '';
|
||
|
if($orderby == 'today') {
|
||
|
$timestamp = TIMESTAMP - 86400;
|
||
|
} elseif($orderby == 'thisweek') {
|
||
|
$timestamp = TIMESTAMP - 604800;
|
||
|
} elseif($orderby == 'thismonth') {
|
||
|
$timestamp = TIMESTAMP - 2592000;
|
||
|
}
|
||
|
|
||
|
$data = array();
|
||
|
$data_blog = C::t('home_blog')->range(0, $num, 'DESC', $view, 0, 0, null, $timestamp);
|
||
|
$blogids = array_keys($data_blog);
|
||
|
$data_blogfield = C::t('home_blogfield')->fetch_all($blogids);
|
||
|
|
||
|
require_once libfile('function/forum');
|
||
|
require_once libfile('function/post');
|
||
|
$rank = 0;
|
||
|
foreach($data_blog as $curblogid => $blog) {
|
||
|
$blog = array_merge($blog, (array)$data_blogfield[$curblogid]);
|
||
|
++$rank;
|
||
|
$blog['rank'] = $rank;
|
||
|
$blog['dateline'] = dgmdate($blog['dateline']);
|
||
|
$blog['avatar'] = avatar($blog['uid'], 'small');
|
||
|
$blog['message'] = preg_replace('/<([^>]*?)>/', '', $blog['message']);
|
||
|
$blog['message'] = messagecutstr($blog['message'], 140);
|
||
|
$data[] = $blog;
|
||
|
}
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
function getranklist_forum($num = 20, $view = 'threads') {
|
||
|
global $_G;
|
||
|
|
||
|
$data = array();
|
||
|
$timelimit = 0;
|
||
|
if($view == 'posts') {
|
||
|
$key = 'posts';
|
||
|
} elseif($view == 'today') {
|
||
|
$key = 'todayposts';
|
||
|
} else {
|
||
|
$key = 'threads';
|
||
|
}
|
||
|
$query = C::t('forum_forum')->fetch_all_for_ranklist(1, 0, $key, 0, $num, explode(',', $_G['setting']['ranklist']['ignorefid']));
|
||
|
$i = 1;
|
||
|
foreach($query as $row) {
|
||
|
$result = array('fid' => $row['fid'], 'name' => $row['name']);
|
||
|
$result['posts'] = $row[$key];
|
||
|
$result['rank'] = $i;
|
||
|
$data[] = $result;
|
||
|
$i++;
|
||
|
}
|
||
|
|
||
|
return $data;
|
||
|
|
||
|
}
|
||
|
|
||
|
function getranklist_group($num = 20, $view = 'threads') {
|
||
|
global $_G;
|
||
|
|
||
|
$timestamp = TIMESTAMP;
|
||
|
$data = array();
|
||
|
$timelimit = 0;
|
||
|
|
||
|
if($view == 'posts') {
|
||
|
$key = 'posts';
|
||
|
} elseif($view == 'today'){
|
||
|
$key = 'todayposts';
|
||
|
} elseif($view == 'credit'){
|
||
|
$key = 'commoncredits';
|
||
|
} elseif($view == 'member'){
|
||
|
$key = 'membernum';
|
||
|
} else {
|
||
|
$key = 'threads';
|
||
|
}
|
||
|
$query = C::t('forum_forum')->fetch_all_for_ranklist(3, 'sub', $key, 0, $num, explode(',', $_G['setting']['ranklist']['ignorefid']));
|
||
|
$i = 1;
|
||
|
foreach($query as $row) {
|
||
|
$result = array('fid' => $row['fid'], 'name' => $row['name']);
|
||
|
$result[$key] = $result['posts'] = $row[$key];
|
||
|
$result['rank'] = $i;
|
||
|
$data[] = $result;
|
||
|
$i++;
|
||
|
}
|
||
|
|
||
|
return $data;
|
||
|
|
||
|
}
|
||
|
|
||
|
function getranklist_member($num = 20, $view = 'credit', $orderby = 'all') {
|
||
|
$data = array();
|
||
|
$functionname = 'getranklist_member_'.$view;
|
||
|
$data = $functionname($num, $orderby);
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
function getranklist_member_credit($num, $orderby) {
|
||
|
return C::t('common_member')->fetch_all_order_by_credit_for_ranklist($num, $orderby);
|
||
|
}
|
||
|
|
||
|
function getranklist_member_friendnum($num) {
|
||
|
return C::t('common_member')->fetch_all_order_by_friendnum_for_ranklist($num);
|
||
|
|
||
|
}
|
||
|
|
||
|
function getranklist_member_invite($num, $orderby) {
|
||
|
global $_G;
|
||
|
|
||
|
if($orderby == 'thisweek') {
|
||
|
$dateline = TIMESTAMP - 604800;
|
||
|
} elseif($orderby == 'thismonth') {
|
||
|
$dateline = TIMESTAMP - 2592000;
|
||
|
} elseif($orderby == 'today') {
|
||
|
$dateline = TIMESTAMP - 86400;
|
||
|
}
|
||
|
|
||
|
$invite = $invitearray = $inviteuidarray = $invitefieldarray = array();
|
||
|
foreach(C::t('common_invite')->fetch_all_invitenum_group_by_uid($dateline) as $result) {
|
||
|
$invitearray[] = $result;
|
||
|
$inviteuidarray[] = $result['uid'];
|
||
|
}
|
||
|
|
||
|
$invitememberfield = C::t('common_member')->fetch_all($inviteuidarray, false, 0);
|
||
|
if($invitearray) {
|
||
|
foreach($invitearray as $key => $var) {
|
||
|
$invite[] = $var;
|
||
|
$invite[$key]['username'] = $invitememberfield[$var['uid']]['username'];
|
||
|
$invite[$key]['videophotostatus'] = $invitememberfield[$var['uid']]['videophotostatus'];
|
||
|
$invite[$key]['groupid'] = $invitememberfield[$var['uid']]['groupid'];
|
||
|
}
|
||
|
}
|
||
|
return $invite;
|
||
|
|
||
|
}
|
||
|
|
||
|
function getranklist_member_onlinetime($num, $orderby) {
|
||
|
global $_G;
|
||
|
|
||
|
if($orderby == 'thismonth') {
|
||
|
$orderby = 'thismonth';
|
||
|
$online = 'thismonth AS onlinetime';
|
||
|
} elseif($orderby == 'all') {
|
||
|
$orderby = 'total';
|
||
|
$online = 'total AS onlinetime';
|
||
|
}
|
||
|
|
||
|
$onlinetime = $onlinetimearray = $onlinetimeuidarray = $onlinetimefieldarray = array();
|
||
|
|
||
|
$onlinetimearray = C::t('common_onlinetime')->range_by_field(0, $num, $orderby, 'DESC');
|
||
|
$onlinetimeuidarray = array_keys($onlinetimearray);
|
||
|
$onlinetimefieldarray = C::t('common_member')->fetch_all($onlinetimeuidarray, false, 0);
|
||
|
if($onlinetimearray) {
|
||
|
foreach($onlinetimearray as $key => $var) {
|
||
|
$var['onlinetime'] = $var[$orderby];
|
||
|
$var['username'] = $onlinetimefieldarray[$var['uid']]['username'];
|
||
|
$var['videophotostatus'] = $onlinetimefieldarray[$var['uid']]['videophotostatus'];
|
||
|
$var['groupid'] = $onlinetimefieldarray[$var['uid']]['groupid'];
|
||
|
$onlinetime[$key] = $var;
|
||
|
}
|
||
|
}
|
||
|
return $onlinetime;
|
||
|
|
||
|
}
|
||
|
|
||
|
function getranklist_member_blog($num) {
|
||
|
global $_G;
|
||
|
|
||
|
$blogs = array();
|
||
|
$sql = "SELECT m.uid,m.username,m.videophotostatus,m.groupid,c.blogs FROM ".DB::table('common_member').
|
||
|
" m LEFT JOIN ".DB::table('common_member_count')." c ON m.uid=c.uid WHERE c.blogs>0 ORDER BY blogs DESC LIMIT 0, $num";
|
||
|
|
||
|
$query = DB::query($sql);
|
||
|
while($result = DB::fetch($query)) {
|
||
|
$blogs[] = $result;
|
||
|
}
|
||
|
|
||
|
return $blogs;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
function getranklist_member_gender($gender, $num = 20) {
|
||
|
global $_G;
|
||
|
|
||
|
$num = intval($num);
|
||
|
$num = $num ? $num : 20;
|
||
|
$users = array();
|
||
|
$query = DB::query("SELECT c.uid, c.views FROM ".DB::table('common_member_count')." c
|
||
|
LEFT JOIN ".DB::table('common_member_profile')." p ON c.uid=p.uid
|
||
|
WHERE c.views>0 AND p.gender = '$gender' ORDER BY c.views DESC LIMIT 0, $num");
|
||
|
while($user = DB::fetch($query)) {
|
||
|
$users[$user['uid']] = $user;
|
||
|
}
|
||
|
$uids = array_keys($users);
|
||
|
if($uids) {
|
||
|
foreach(C::t('common_member')->fetch_all($uids, false, 0) as $uid => $value) {
|
||
|
$users[$uid] = array_merge($users[$uid], $value);
|
||
|
}
|
||
|
}
|
||
|
return $users;
|
||
|
|
||
|
}
|
||
|
|
||
|
function getranklist_member_beauty($num = 20) {
|
||
|
return getranklist_member_gender(2, $num);
|
||
|
}
|
||
|
|
||
|
function getranklist_member_handsome($num = 20) {
|
||
|
return getranklist_member_gender(1, $num);
|
||
|
}
|
||
|
|
||
|
function getranklist_member_post($num, $orderby) {
|
||
|
global $_G;
|
||
|
|
||
|
$timestamp = TIMESTAMP;
|
||
|
$posts = array();
|
||
|
$timelimit = 0;
|
||
|
if($orderby == 'digestposts') {
|
||
|
$sql = "SELECT m.username, m.uid, mc.digestposts AS posts
|
||
|
FROM ".DB::table('common_member')." m
|
||
|
LEFT JOIN ".DB::table('common_member_count')." mc ON mc.uid=m.uid WHERE mc.digestposts>0
|
||
|
ORDER BY mc.digestposts DESC LIMIT 0, $num";
|
||
|
} elseif($orderby == 'thismonth') {
|
||
|
$timelimit = $timestamp-86400*30;
|
||
|
} elseif($orderby == 'today') {
|
||
|
$timelimit = $timestamp-86400;
|
||
|
} else {
|
||
|
$sql = "SELECT m.username, m.uid, mc.posts
|
||
|
FROM ".DB::table('common_member')." m
|
||
|
LEFT JOIN ".DB::table('common_member_count')." mc ON mc.uid=m.uid WHERE mc.posts>0
|
||
|
ORDER BY mc.posts DESC LIMIT 0, $num";
|
||
|
}
|
||
|
if($timelimit) {
|
||
|
$posts = C::t('forum_post')->fetch_all_top_post_author(0, $timelimit, $num);
|
||
|
|
||
|
} else {
|
||
|
$query = DB::query($sql);
|
||
|
while($result = DB::fetch($query)) {
|
||
|
$posts[] = $result;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $posts;
|
||
|
|
||
|
}
|
||
|
|
||
|
function getranklistdata($type, $view = '', $orderby = 'all') {
|
||
|
global $_G;
|
||
|
$cache_time = $_G['setting']['ranklist'][$type]['cache_time'];
|
||
|
$cache_num = $_G['setting']['ranklist'][$type]['show_num'];
|
||
|
if($cache_time <= 0 ) {
|
||
|
$cache_time = 5;
|
||
|
}
|
||
|
$cache_time = $cache_time * 3600;
|
||
|
if($cache_num <= 0 ) {
|
||
|
$cache_num = 20;
|
||
|
}
|
||
|
|
||
|
$ranklistvars = array();
|
||
|
loadcache('ranklist_'.$type);
|
||
|
$ranklistvars = & $_G['cache']['ranklist_'.$type][$view][$orderby];
|
||
|
|
||
|
if(empty($ranklistvars['lastupdated']) || (TIMESTAMP - $ranklistvars['lastupdated'] > $cache_time)) {
|
||
|
$functionname = 'getranklist_'.$type;
|
||
|
|
||
|
if(!discuz_process::islocked('ranklist_update', 600)) {
|
||
|
$ranklistvars = $functionname($cache_num, $view, $orderby);
|
||
|
$ranklistvars['lastupdated'] = TIMESTAMP;
|
||
|
$ranklistvars['lastupdate'] = dgmdate(TIMESTAMP);
|
||
|
$ranklistvars['nextupdate'] = dgmdate(TIMESTAMP + $cache_time);
|
||
|
$_G['cache']['ranklist_'.$type][$view][$orderby] = $ranklistvars;
|
||
|
savecache('ranklist_'.$type, $_G['cache']['ranklist_'.$type]);
|
||
|
}
|
||
|
discuz_process::unlock('ranklist_update');
|
||
|
}
|
||
|
$_G['lastupdate'] = $ranklistvars['lastupdate'];
|
||
|
$_G['nextupdate'] = $ranklistvars['nextupdate'];
|
||
|
unset($ranklistvars['lastupdated'], $ranklistvars['lastupdate'], $ranklistvars['nextupdate']);
|
||
|
return $ranklistvars;
|
||
|
}
|
||
|
|
||
|
function getignorefid($pre = '') {
|
||
|
global $_G;
|
||
|
$fidsql = '';
|
||
|
if($_G['setting']['ranklist']['ignorefid']) {
|
||
|
$fidsql = ' AND '.($pre ? $pre.'.' : '').'fid NOT IN('.dimplode(explode(',', $_G['setting']['ranklist']['ignorefid'])).')';
|
||
|
}
|
||
|
return $fidsql;
|
||
|
}
|
||
|
?>
|