﻿##############################################################
## MOD Title: TorrentTube
## MOD Author: lEx0 <lEx0.kz@gmail.com> http://me.yaonline.kz
##
## MOD Version: 1.0 rev. 5 Free
##
## Installation Level: Easy
## Installation Time: ~15 Minutes
## Files To Edit: 
##				admin/admin_forums.php
##				ajax.php
##				viewtopic.php
##				attach_mod/displaying_torrent.php
##				includes/functions_torrent.php
##				templates/admin/admin_forums.tpl
##				templates/default/page_header.tpl
##				templates/default/viewtopic_attach.tpl
## Included Files: 
##				admin/admin_torrenttube.php
##				fancybox/blank.gif
##				fancybox/fancy_close.png
##				fancybox/fancy_loading.png
##				fancybox/fancy_nav_left.png
##				fancybox/fancy_nav_right.png
##				fancybox/fancy_shadow_e.png
##				fancybox/fancy_shadow_n.png
##				fancybox/fancy_shadow_ne.png
##				fancybox/fancy_shadow_nw.png
##				fancybox/fancy_shadow_s.png
##				fancybox/fancy_shadow_se.png
##				fancybox/fancy_shadow_sw.png
##				fancybox/fancy_shadow_w.png
##				fancybox/fancy_title_left.png
##				fancybox/fancy_title_main.png
##				fancybox/fancy_title_over.png
##				fancybox/fancy_title_right.png
##				fancybox/fancybox/fancy_close.html
##				fancybox/fancybox/fancy_loading.html
##				fancybox/fancybox/fancy_nav_left.html
##				fancybox/fancybox/fancy_nav_right.html
##				fancybox/fancybox/fancy_shadow_e.html
##				fancybox/fancybox/fancy_shadow_n.html
##				fancybox/fancybox/fancy_shadow_ne.html
##				fancybox/fancybox/fancy_shadow_nw.html
##				fancybox/fancybox/fancy_shadow_s.html
##				fancybox/fancybox/fancy_shadow_se.html
##				fancybox/fancybox/fancy_shadow_sw.html
##				fancybox/fancybox/fancy_shadow_w.html
##				fancybox/fancybox/fancy_title_left.html
##				fancybox/fancybox/fancy_title_main.html
##				fancybox/fancybox/fancy_title_over.html
##				fancybox/fancybox/fancy_title_right.html
##				fancybox/fancybox-x.png
##				fancybox/fancybox-y.png
##				fancybox/fancybox.png
##				fancybox/jquery.fancybox-1.3.1.css
##				fancybox/jquery.fancybox-1.3.1.js
##				fancybox/jquery.fancybox-1.3.1.pack.js
##				fancybox/jquery.mousewheel-3.0.2.pack.js
##				images/Video.png
##				images/bg_player.png
##				includes/class_torrentstreem.php
##				misc/js/jquery.pack.js
##				templates/admin/admin_torrenttube.tpl
##				view_online.php
##############################################################
## MOD History:
##
##	2010-04-21 - Version 1.0 rev. 4
##  	- Initial Release
##	2010-04-22 - Version 1.0 rev. 5 Free
##		- Исправлена ошибка с javascript
##		- Исправлена ошибка в SQL
##		- Исправлена ошибка при установке в admin_forums.php
##		- Отключаем просмотр при отсутствии API и (или) ID зоны
##		- Формат плеера 21:9 (В расширенной версии, можно также указать самому, в админке)
##		- Удален параметр View_type в Расширенную версию
##
##############################################################
##
##   ВАЖНО!!!
##
## Для работы системы, нужен CURL!
##
## В данной ревизии заменяется стандартный jquery.pack.js, 
## на более новый. Если вы вносили изменения в jquery.pack.js.
## То лучше сообщите мне, будет меньше проблем. Иначе попробуйте 
##
## Для работы с данной системой вам надо зарегистрироватся 
## на сайте http://torrentstream.net. Потом создать Площадку.
## Из площадки, берете его ID. Также Вам надо взять свой 
## Код партнера, в разделе Мой профиль. Вводите эти данные
## в админке. И все, наслаждайтесь просмотром фильмов, онлайн!
##
## Поддержка по моду и по самому АПИ и клиенту будет также
## осуществляется тут: http://forum.torrentstream.org
## 
##############################################################

# 
#-----[ SQL ]------------------------------ 
#
ALTER TABLE `bb_bt_torrents` ADD `view_online` TINYINT( 1 ) NOT NULL DEFAULT '1';
ALTER TABLE `bb_forums` ADD `view_online` TINYINT( 1 ) NOT NULL DEFAULT '0';

INSERT INTO `bb_config` ( `config_name` , `config_value` )
VALUES ('torrenttube_api', ''), ('torrenttube_zone', '');

# 
#-----[ OPEN ]-[ Открыть ]------------------------------ 
# 
admin/admin_forums.php

# 
#-----[ FIND ]-[ Найти ]-------------------------------- 
#
			$forum_display_order = intval($HTTP_POST_VARS['forum_display_order']);
			
# 
#-----[ AFTER, ADD ]-[ После добавить ]----------------- 
#
			
			/*
			 * TorrentTube Mod
			 */
			$onlv	= (int) ($HTTP_POST_VARS['forum_online_view']);
			/*
			 * END TorrentTube Mod
			 */
			
# 
#-----[ FIND ]-[ Найти ]-------------------------------- 
#
			$columns = ' forum_name,   cat_id,   forum_desc,   forum_order,  forum_status,  prune_days,  forum_parent,  show_on_index,  forum_display_sort,  forum_display_order'. $field_sql;
			$values = "'$forum_name', $cat_id, '$forum_desc', $forum_order, $forum_status, $prune_days, $forum_parent, $show_on_index, $forum_display_sort, $forum_display_order". $value_sql;
			
# 
#-----[ REPLACE ]-[ Заменить ]----------------- 
#
			$columns = ' forum_name,   cat_id,   forum_desc,   forum_order,  forum_status,  prune_days,  forum_parent,  show_on_index,  forum_display_sort,  forum_display_order, view_online'. $field_sql;
			$values = "'$forum_name', $cat_id, '$forum_desc', $forum_order, $forum_status, $prune_days, $forum_parent, $show_on_index, $forum_display_sort, $forum_display_order, ".$onlv . $value_sql;
			
# 
#-----[ FIND ]-[ Найти ]-------------------------------- 
#
			$forum_order = $forum_data['forum_order'];
			
# 
#-----[ AFTER, ADD ]-[ После добавить ]----------------- 
#			
			/*
			 * TorrentTube Mod
			 */
			$onlv	= (int) ($HTTP_POST_VARS['forum_online_view']);
			/*
			 * END TorrentTube Mod
			 */

# 
#-----[ FIND ]-[ Найти ]-------------------------------- 
#
					forum_display_sort  = $forum_display_sort

# 
#-----[ BEFORE, ADD ]-[ До добавить ]----------------- 
#
					view_online   = $onlv,

# 
#-----[ OPEN ]-[ Открыть ]------------------------------ 
# 
		ajax.php
		
# 
#-----[ FIND ]-[ Найти ]-------------------------------- 
#		
		'view_post'         => array('guest'),

# 
#-----[ AFTER, ADD ]-[ После добавить ]----------------- 
#
		/*
		 * TorrentTube Mod
		 */
		'ts_close_view'		=> array('mod'),
		/*
		 * END TorrentTube Mod
		 */
		
# 
#-----[ FIND ]-[ Найти ]-------------------------------- 
#		
		$this->response['post_html'] = get_parsed_post($post_data);
	}

# 
#-----[ AFTER, ADD ]-[ После добавить ]----------------- 
#
	
	/*
	 * This function performs the closure of public online viewing
	 */
	function ts_close_view()
	{
		global $db, $lang, $userdata, $attach_config;
		require(BB_ROOT . 'includes/functions_torrent.php');
		$attach_id	= (string) $this->request['aid'];
		$status		= (int) $this->request['sts'];
		
		if(!IS_ADMIN && !IS_MOD)
		{
			$this->response['html'] = 'ERROR';
			$this->response['erds'] = 'ACCESS DENIED!';
		}
		else
		{			
			if(!$attach_id)
			{
				$this->response['html'] = 'ERROR';
				$this->response['erds'] = 'Torrent Id is missing!';
			}
			else 
			{
				if (!$torrent = get_torrent_info($attach_id))
				{
					$this->response['html'] = 'ERROR';
					$this->response['erds'] = 'Torrent Not Found!';
				}
				else
				{
					if(!torrent_auth_check_returned($torrent['forum_id'], $torrent['poster_id']))
					{
						$this->response['html'] = 'ERROR';
						$this->response['erds'] = 'You can not change the status!';
					}
					else
					{
						echo $status;
						if($status)
						{
							if($db->query('UPDATE '.BT_TORRENTS_TABLE.' SET view_online = \'0\''))
							{
								$this->response['html'] = "Update Succufull\nAccess denied";
								$this->response['js'] = "v_sts = 0;";
							}
							else
							{
								$this->response['html'] = 'ERROR';
								$this->response['erds'] = 'Query ERROR!';
							}
						}
						else
						{
							if($db->query('UPDATE '.BT_TORRENTS_TABLE.' SET view_online = \'1\''))
							{
								$this->response['html'] = "Update Succufull\nPublic Online View Opened";
								$this->response['js'] 	= "v_sts = 1;";
							}
							else
							{
								$this->response['html'] = 'ERROR';
								$this->response['erds'] = 'Query ERROR!';
							}							
						}
					}
				}
			}
		}
		 
	}
	
# 
#-----[ OPEN ]-[ Открыть ]------------------------------ 
# 
attach_mod/displaying_torrent.php

# 
#-----[ FIND ]-[ Найти ]-------------------------------- 
#	
			'S_UPLOAD_IMAGE'  => $upload_image,

# 
#-----[ BEFORE, ADD ]-[ До добавить ]----------------- 
#
			/*
			 * TorrentTube Mod
			 */
			'TOR_VIEW_ON'		=>	$tor_info['view_online'] ? TRUE : FALSE,
			/*
			 * END TorrentTube Mod
			 */

# 
#-----[ OPEN ]-[ Открыть ]------------------------------ 
# 
includes/functions_torrent.php

# 
#-----[ FIND ]-[ Найти ]-------------------------------- 
#
function tracker_unregister ($attach_id, $mode = '')

# 
#-----[ BEFORE, ADD ]-[ До добавить ]----------------- 
#
/*
 * Function for Check User to access Ttube moderation function
 */
function torrent_auth_check_returned ($forum_id, $poster_id)
{
	global $userdata, $lang, $attach_config;

	if (IS_ADMIN) return true;
	
	$is_auth = auth(AUTH_ALL, $forum_id, $userdata);

	if ($poster_id != $userdata['user_id'] && !$is_auth['auth_mod'])
	{
		return false;
	}
	else if (!$is_auth['auth_view'] || !$is_auth['auth_attachments'] || $attach_config['disable_mod'])
	{
		return false;
	}
	return true;
}


# 
#-----[ FIND ]-[ Найти ]-------------------------------- 
#
function generate_passkey ($user_id, $force_generate = false)

# 
#-----[ BEFORE, ADD ]-[ До добавить ]----------------- 
#
/*
 * Function Generate torrent file for this user and return torrent 
 */
function return_torrent_with_passkey ($filename)
{
	global $attachment, $auth_pages, $db, $userdata, $bb_cfg, $phpEx, $lang;

	if (!$bb_cfg['bt_add_auth_key'] || $attachment['extension'] !== TORRENT_EXT || !$size = @filesize($filename))
	{
		message_die(GENERAL_ERROR,'This file is\'n by viewed','ERROR VIEW');
	}

	$post_id = $poster_id = $passkey_val = '';
	$user_id = $userdata['user_id'];
	$attach_id = $attachment['attach_id'];

	if (!$passkey_key = $bb_cfg['passkey_key'])
	{
		message_die(GENERAL_ERROR, 'Could not add passkey (wrong config $bb_cfg[\'passkey_key\'])');
	}

	// Get $post_id & $poster_id
	foreach ($auth_pages as $rid => $row)
	{
		if ($row['attach_id'] == $attach_id)
		{
			$post_id = $row['post_id'];
			$poster_id = $row['user_id_1'];
			break;
		}
	}

	// Redirect guests to login page
	if (IS_GUEST)
	{
		$redirect_url = ($post_id) ? POST_URL . $post_id : 'index.'. PHP_EXT;
		redirect(LOGIN_URL . $redirect_url);
	}

	if (!$attachment['tracker_status'])
	{
		message_die(GENERAL_ERROR, $lang['Passkey_err_tor_not_reg']);
	}

	if ($userdata['session_logged_in'] && !$userdata['user_allow_passkey'])
	{
		message_die(GENERAL_ERROR, 'Could not add passkey<br /><br />You are not authorized to use passkey');
	}

	if ($bt_userdata = get_bt_userdata($user_id))
	{
		$passkey_val = $bt_userdata['auth_key'];
	}

	if (!$passkey_val && $userdata['session_logged_in'])
	{
		if ($bb_cfg['bt_gen_passkey_on_reg'])
		{
			if (!$passkey_val = generate_passkey($user_id))
			{
				message_die(GENERAL_ERROR, 'Could not insert passkey', '', __LINE__, __FILE__, $sql);
			}
		}
		else
		{
			$mess = sprintf($lang['Passkey_err_empty'], append_sid("profile.$phpEx?mode=editprofile#bittorrent"));
			message_die(GENERAL_ERROR, $mess);
		}
	}

	// Ratio limits
	$min_ratio = $bb_cfg['bt_min_ratio_allow_dl_tor'];

	if ($min_ratio && $user_id != $poster_id && ($user_ratio = get_bt_ratio($bt_userdata)) !== null)
	{
		if ($user_ratio < $min_ratio && $post_id)
		{
			$dl = $db->fetch_row("
				SELECT dl.user_status
				FROM ". POSTS_TABLE ." p
				LEFT JOIN ". BT_DLSTATUS_TABLE ." dl ON dl.topic_id = p.topic_id AND dl.user_id = $user_id
				WHERE p.post_id = $post_id
				LIMIT 1
			");

			if (!isset($dl['user_status']) || $dl['user_status'] != DL_STATUS_COMPLETE)
			{
				$mess = sprintf($lang['Bt_Low_ratio_for_dl'], round($user_ratio, 2), "search.$phpEx?dlu=$user_id&amp;dlc=1");
				message_die(GENERAL_ERROR, $mess);
			}
		}
	}

	// Seeding torrents limit
	if ($bb_cfg['max_seeding_torrents'] && IS_USER)
	{
		$seeding = $db->fetch_row("
			SELECT COUNT(DISTINCT topic_id) AS torrents, SUM(speed_up) AS sum_up
			FROM ". BT_TRACKER_TABLE ."
			WHERE user_id = $user_id
				AND seeder = 1
		");

		if ($seeding && $seeding['torrents'] > $bb_cfg['max_seeding_torrents'] && $bt_userdata['u_up_total'] < 200*1024*1024*1024)
		{
			if ($seeding['sum_up'] < ($seeding['torrents'] * $bb_cfg['min_up_speed_per_torrent']))
			{
				$msg = array();
				$msg[] = date('m-d H:i:s');
				$msg[] = sprintf('%-30s', html_entity_decode($userdata['username'])." ($user_id)");
				$msg[] = sprintf('%-3s', $seeding['torrents']);
				$msg[] = sprintf('%.2f', @$user_ratio);
				$msg[] = sprintf('%-9s', humn_size($bt_userdata['u_up_total'], '', '', ' '));
				$msg[] = humn_size($seeding['sum_up'], '', '', ' ');
				$msg = join(LOG_SEPR, $msg) . LOG_LF;
				bb_log($msg, 'overseed/current');

				redirect($bb_cfg['too_many_seeding_redirect_url']);
			}
		}
	}

	// Announce URL
	$ann_url = $bb_cfg['bt_announce_url'];

	if (!$tor = bdecode_file($filename))
	{
		message_die(GENERAL_ERROR, 'This is not a bencoded file');
	}

	$passkey_url = (!$userdata['session_logged_in'] || isset($_GET['no_passkey'])) ? '' : "?$passkey_key=$passkey_val&";

	// Replace original announce url with tracker default
	if ($bb_cfg['bt_replace_ann_url'] || !@$tor['announce'])
	{
		$tor['announce'] = strval($ann_url . $passkey_url);
	}

	// Delete all additional urls
	if ($bb_cfg['bt_del_addit_ann_urls'])
	{
		unset($tor['announce-list']);
	}
#	$tor['announce-list'] = array(array(
#		'url1' . $passkey_url,
#		'url2' . $passkey_url,
#	));

	// Add publisher & topic url
	$publisher = $bb_cfg['bt_add_publisher'];
	$publisher_url = ($post_id) ? make_url(POST_URL . $post_id) : '';

	if ($publisher)
	{
		$tor['publisher'] = strval($publisher);
		unset($tor['publisher.utf-8']);

		if ($publisher_url)
		{
			$tor['publisher-url'] = strval($publisher_url);
			unset($tor['publisher-url.utf-8']);
		}
	}

	// Add comment
	$comment = '';

	$orig_com = (@$tor['comment']) ? $tor['comment'] : '';

	if ($bb_cfg['bt_add_comment'])
	{
		$comment = $bb_cfg['bt_add_comment'];
	}
	else
	{
		$comment = ($publisher_url) ? $publisher_url : '';
	}

	if ($comment = trim($comment))
	{
		$tor['comment'] = strval($comment);
		unset($tor['comment.utf-8']);
	}

	//Azureus DHT disable
	$tor['azureus_properties'] = array('dht_backup_enable' => intval(0));

	// Send torrent
	$output   = bencode($tor);
	$filename = clean_filename(basename($attachment['real_filename']));
	$mimetype = 'application/x-bittorrent;';
	$charset  = (strpos(USER_AGENT, 'pera') && @$lang['CONTENT_ENCODING']) ? "charset={$lang['CONTENT_ENCODING']};" : '';

#	header("Content-length: ". strlen($output));
#	header("Content-Type: $mimetype $charset name=\"$filename\"");
#	header("Content-Disposition: attachment; filename=\"$filename\"");

	##### LOG #####
	global $log_ip_resp;

	if (isset($log_ip_resp[USER_IP]) || isset($log_ip_resp[CLIENT_IP]))
	{
		$str = date('H:i:s') . LOG_SEPR . str_compact(ob_get_contents()) . LOG_LF;
		$file = 'sessions/'. date('m-d') .'_{'. USER_IP .'}_'. CLIENT_IP .'_resp';
		bb_log($str, $file);
	}
	### LOG END ###

	return $output;
}

# 
#-----[ OPEN ]-[ Открыть ]------------------------------ 
# 
templates/admin/admin_forums.tpl

# 
#-----[ FIND ]-[ Найти ]------------------------------ 
#
			<select name="forum_display_order">{S_FORUM_DISPLAY_ORDER_LIST}</select>&nbsp;
		</td>
	</tr>
	<tr>
	
# 
#-----[ AFTER, ADD ]-[ После добавить ]------------------------------ 
#
		<td class="row1">Enable TorrentTube Function</td>
		<td class="row2">
			<select name="forum_online_view">
            	<option value="1">Enable</option>
            	<option value="0" selected="selected">Disable</option>
			</select>&nbsp;
		</td>
	</tr>
	<tr>
	
# 
#-----[ OPEN ]-[ Открыть ]------------------------------ 
#
templates/default/page_header.tpl

# 
#-----[ FIND ]-[ Найти ]------------------------------ 
#
</head>

# 
#-----[ BEFORE, ADD ]-[ До добавить ]------------------------------ 
#
<script type="text/javascript" src="/fancybox/jquery.mousewheel-3.0.2.pack.js"></script>
<script type="text/javascript" src="/fancybox/jquery.fancybox-1.3.1.js"></script>
<link rel="stylesheet" type="text/css" href="./fancybox/jquery.fancybox-1.3.1.css" media="screen" />
<script type="text/javascript">
$(document).ready(function() {
	$("#online_view").fancybox({
		'width'				: '65%',
		'height'			: '52%',
		'autoScale'			: false,
		'transitionIn'		: 'none',
		'transitionOut'		: 'none',
		'type'				: 'iframe'
	});
});
</script>

# 
#-----[ OPEN ]-[ Открыть ]------------------------------ 
#
templates/default/viewtopic_attach.tpl

# 
#-----[ FIND ]-[ Найти ]------------------------------ 
#
		<td width="15%" rowspan="4" class="tCenter pad_6">
		
# 
#-----[ AFTER, ADD ]-[ После добавить ]------------------------------ 
#
            <!-- IF postrow.attach.tor_reged.TOR_FROZEN -->
            <!-- ELSE -->
            <!-- IF ENABLE_FORUM_ONV -->
            <!-- IF AUTH_MOD -->
			<a class="{postrow.attach.tor_reged.DL_LINK_CLASS}" href="view_online.php?id={postrow.attach.tor_reged.ATTACH_ID}" id="online_view"><img src="images/Video.png" title="View Online" width="32px" /><br />View Online</a><br /><hr /><!-- ELSE -->
            <!-- IF postrow.attach.tor_reged.TOR_VIEW_ON --><a class="{postrow.attach.tor_reged.DL_LINK_CLASS}" href="view_online.php?id={postrow.attach.tor_reged.ATTACH_ID}" id="online_view"><img src="images/Video.png" title="View Online" width="32px" /><br />View Online</a><br /><hr /><!-- ENDIF -->
            <!-- ENDIF -->
            <!-- ENDIF -->
            <!-- ENDIF -->

# 
#-----[ FIND ]-[ Найти ]-[ Line 291 ]------------------------------ 
#

		</form><!-- ENDIF -->

# 
#-----[ AFTER, ADD ]-[ После добавить ]------------------------------ 
#
<br />
        <!-- IF ENABLE_FORUM_ONV -->
        <!-- IF AUTH_MOD -->
		<script type="text/javascript">
			v_sts = <!-- IF postrow.attach.tor_reged.TOR_VIEW_ON -->1<!-- ELSE -->0<!-- ENDIF -->;
            ajax.callback.ts_close_view = function(data){
                if(data['html']=='ERROR')
                {
                    alert(data['erds']);
                }
                else
                {
                    eval(data['js']);
					alert(data['html']);
                }
            };
        </script>
        <a href="javascript:void(0);" id="closed_view" onclick="ajax.exec({action	: 'ts_close_view',aid:{postrow.attach.tor_reged.ATTACH_ID},sts:v_sts});">Open/Close View</a>
        <!-- ENDIF -->
        <!-- ENDIF -->

# 
#-----[ OPEN ]-[ Открыть ]------------------------------ 
#
viewtopic.php

# 
#-----[ FIND ]-[ Найти ]------------------------------ 
#
	'SPOILER_OPENED'      => $user->opt_js['sp_op'],
	
# 
#-----[ AFTER, ADD ]-[ После добавить ]------------------------------ 
#	

	/*
	 * TorrentTube Mod
	 */
	'ENABLE_FORUM_ONV'	 => (!$bb_cfg['torrenttube_api'] || !$bb_cfg['torrenttube_zone']) ? false : ($forum_topic_data['view_online'] ? true : false),
	/*
	 * END TorrentTube Mod
	 */

# 
#-----[ SAVE AND CLOSE ]-[ Сохранить и выйти ]------------------------------ 
#

                                                                        :irrrrrrrrrrrrrrrrrrrrrrrr;iiiii::::,...        
                                                                     .UE8ZEEEZZZEEENqPPPPPPPPPPq0Z0XSF2UJYL7ri::..      
:BBBMBBZMMBi                                                        rBO2           XSFFFFFFFFFFj :NkS112UjYLLv7rii::... 
     BB                                                       B.    BEkSU225  vk1UU51122UUU2121Y  qS5F12UuJYYYYYv7ri::: 
     BB         .::      .   :.  .  .:    :::      .  :i.   .YBF,.  MS1FkXPE, 2ZPS12ju52UUUJU5Fu .0YvJkk5UU1SJrrLUJ7rrr.
     BB       NBEUSBB.   BBFBBU ZBuBBB  8BjL1BN   UBXX22BB, :FBELr  852111F0. Jq52U1  X1UUY  kkU       :P5Sv      72LvL:
     BB      BB     1B   BB     UB.    BB    iB1  7B     BB   B     G5UUUU1q. Yk2UUS  N5U2u  qX2  NENk  :XJ  5NXU  YuLu:
     BB      Bi      B1  BJ     JB     BBiJUuLv,  iB     BB   B.    G5UUUU1q. LS2U1q  EFU55  NP2 ,8NPNG  0:        7Fj1i
     BB      BB     .B,  B5     LB     BB         iB     BB   B.    85UUUU1q. LSUU50  ES5kE .NP2 ,EXkqS  Gr rBMMMMMP22kr
     BB       BBr.:FBr   BM     FB      BB: .UB:  7B     BB   BB.:  Mk1UUU1q. 7SUU50  ijY7,  qXU  UjL:  2ZZ  :1SJ  u52q;
     :L        :1PSr     v:     .u       ,1kS7     U     ir    UkF  :OP1UU1X: L1UU5PP.    : .kS1      ,qqPNE:     ;F5X0 
                                                                      iLjUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUjv:  
																	  