Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php $_F=__FILE__;$_X='P2lCP1ouWj4+c0E+KD4hPjlNQXNITTkoJ29GcEttRlR0JykpPk1Scz0oJ0VPPjlzek..

Decoded Output download

$_X=base64_decode($_X);$_X=strtr($_X,'SgPO9YZWFKmqyfxcjLJRzuM5vNts1b.{B4nC]i/2Dl0EheA
[d8=Qp>VXo H}6GIw7ka3TrU<','=R9odmplAEPyk8gv[53xrMezqZHi7YhW<DsG{>CcX}1N/afj6]JtuS 
.BUnwVKLQO20ITF4b');$_R=str_replace('__FILE__',"'".$_F."'",$_X);eval($_R);$_R=0;$_X=0;?><?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* Name:  Ion Auth Model
*
* Version: 2.5.2
*
* Author:  Ben Edmunds
* 		   [email protected]
*	  	   @benedmunds
*
* Added Awesomeness: Phil Sturgeon
*
* Location: http://github.com/benedmunds/CodeIgniter-Ion-Auth
*
* Created:  10.01.2009
*
* Last Change: 3.22.13
*
* Changelog:
* * 3-22-13 - Additional entropy added - 52aa456eef8b60ad6754b31fbdcc77bb
*
* Description:  Modified auth system based on redux_auth with extensive customization.  This is basically what Redux Auth 2 should be.
* Original Author name has been kept but that does not mean that the method has not been modified.
*
* Requirements: PHP5 or above
*
*/

class Ion_auth_model extends CI_Model
{
	/**
	 * Holds an array of tables used
	 *
	 * @var array
	 **/
	public $tables = array();

	/**
	 * activation code
	 *
	 * @var string
	 **/
	public $activation_code;

	/**
	 * forgotten password key
	 *
	 * @var string
	 **/
	public $forgotten_password_code;

	/**
	 * new password
	 *
	 * @var string
	 **/
	public $new_password;

	/**
	 * Identity
	 *
	 * @var string
	 **/
	public $identity;

	/**
	 * Where
	 *
	 * @var array
	 **/
	public $_ion_where = array();

	/**
	 * Select
	 *
	 * @var array
	 **/
	public $_ion_select = array();

	/**
	 * Like
	 *
	 * @var array
	 **/
	public $_ion_like = array();

	/**
	 * Limit
	 *
	 * @var string
	 **/
	public $_ion_limit = NULL;

	/**
	 * Offset
	 *
	 * @var string
	 **/
	public $_ion_offset = NULL;

	/**
	 * Order By
	 *
	 * @var string
	 **/
	public $_ion_order_by = NULL;

	/**
	 * Order
	 *
	 * @var string
	 **/
	public $_ion_order = NULL;

	/**
	 * Hooks
	 *
	 * @var object
	 **/
	protected $_ion_hooks;

	/**
	 * Response
	 *
	 * @var string
	 **/
	protected $response = NULL;

	/**
	 * message (uses lang file)
	 *
	 * @var string
	 **/
	protected $messages;

	/**
	 * error message (uses lang file)
	 *
	 * @var string
	 **/
	protected $errors;

	/**
	 * error start delimiter
	 *
	 * @var string
	 **/
	protected $error_start_delimiter;

	/**
	 * error end delimiter
	 *
	 * @var string
	 **/
	protected $error_end_delimiter;

	/**
	 * caching of users and their groups
	 *
	 * @var array
	 **/
	public $_cache_user_in_group = array();

	/**
	 * caching of groups
	 *
	 * @var array
	 **/
	protected $_cache_groups = array();

	public function __construct()
	{
		parent::__construct();
		$this->load->database();
		$this->load->config('ion_auth', TRUE);
		$this->load->helper('cookie');
		$this->load->helper('date');
		$this->lang->load('ion_auth');

		//initialize db tables data
		$this->tables  = $this->config->item('tables', 'ion_auth');

		//initialize data
		$this->identity_column = $this->config->item('identity', 'ion_auth');
		$this->store_salt      = $this->config->item('store_salt', 'ion_auth');
		$this->salt_length     = $this->config->item('salt_length', 'ion_auth');
		$this->join			   = $this->config->item('join', 'ion_auth');


		//initialize hash method options (Bcrypt)
		$this->hash_method = $this->config->item('hash_method', 'ion_auth');
		$this->default_rounds = $this->config->item('default_rounds', 'ion_auth');
		$this->random_rounds = $this->config->item('random_rounds', 'ion_auth');
		$this->min_rounds = $this->config->item('min_rounds', 'ion_auth');
		$this->max_rounds = $this->config->item('max_rounds', 'ion_auth');


		//initialize messages and error
		$this->messages    = array();
		$this->errors      = array();
		$delimiters_source = $this->config->item('delimiters_source', 'ion_auth');

		//load the error delimeters either from the config file or use what's been supplied to form validation
		if ($delimiters_source === 'form_validation')
		{
			//load in delimiters from form_validation
			//to keep this simple we'll load the value using reflection since these properties are protected
			$this->load->library('form_validation');
			$form_validation_class = new ReflectionClass("CI_Form_validation");

			$error_prefix = $form_validation_class->getProperty("_error_prefix");
			$error_prefix->setAccessible(TRUE);
			$this->error_start_delimiter = $error_prefix->getValue($this->form_validation);
			$this->message_start_delimiter = $this->error_start_delimiter;

			$error_suffix = $form_validation_class->getProperty("_error_suffix");
			$error_suffix->setAccessible(TRUE);
			$this->error_end_delimiter = $error_suffix->getValue($this->form_validation);
			$this->message_end_delimiter = $this->error_end_delimiter;
		}
		else
		{
			//use delimiters from config
			$this->message_start_delimiter = $this->config->item('message_start_delimiter', 'ion_auth');
			$this->message_end_delimiter   = $this->config->item('message_end_delimiter', 'ion_auth');
			$this->error_start_delimiter   = $this->config->item('error_start_delimiter', 'ion_auth');
			$this->error_end_delimiter     = $this->config->item('error_end_delimiter', 'ion_auth');
		}


		//initialize our hooks object
		$this->_ion_hooks = new stdClass;

		//load the bcrypt class if needed
		if ($this->hash_method == 'bcrypt') {
			if ($this->random_rounds)
			{
				$rand = rand($this->min_rounds,$this->max_rounds);
				$rounds = array('rounds' => $rand);
			}
			else
			{
				$rounds = array('rounds' => $this->default_rounds);
			}

			$this->load->library('bcrypt',$rounds);
		}

		$this->trigger_events('model_constructor');
	}

	/**
	 * Misc functions
	 *
	 * Hash password : Hashes the password to be stored in the database.
	 * Hash password db : This function takes a password and validates it
	 * against an entry in the users table.
	 * Salt : Generates a random salt value.
	 *
	 * @author Mathew
	 */

	/**
	 * Hashes the password to be stored in the database.
	 *
	 * @return void
	 * @author Mathew
	 **/
	public function hash_password($password, $salt=false, $use_sha1_override=FALSE)
	{
		if (empty($password))
		{
			return FALSE;
		}

		//bcrypt
		if ($use_sha1_override === FALSE && $this->hash_method == 'bcrypt')
		{
			return $this->bcrypt->hash($password);
		}


		if ($this->store_salt && $salt)
		{
			return  sha1($password . $salt);
		}
		else
		{
			$salt = $this->salt();
			return  $salt . substr(sha1($salt . $password), 0, -$this->salt_length);
		}
	}

	/**
	 * This function takes a password and validates it
	 * against an entry in the users table.
	 *
	 * @return void
	 * @author Mathew
	 **/
	public function hash_password_db($id, $password, $use_sha1_override=FALSE)
	{
		if (empty($id) || empty($password))
		{
			return FALSE;
		}

		$this->trigger_events('extra_where');

		$query = $this->db->select('password, salt')
		                  ->where('id', $id)
		                  ->limit(1)
		                  ->get($this->tables['users']);

		$hash_password_db = $query->row();

		if ($query->num_rows() !== 1)
		{
			return FALSE;
		}

		// bcrypt
		if ($use_sha1_override === FALSE && $this->hash_method == 'bcrypt')
		{
			if ($this->bcrypt->verify($password,$hash_password_db->password))
			{
				return TRUE;
			}

			return FALSE;
		}

		// sha1
		if ($this->store_salt)
		{
			$db_password = sha1($password . $hash_password_db->salt);
		}
		else
		{
			$salt = substr($hash_password_db->password, 0, $this->salt_length);

			$db_password =  $salt . substr(sha1($salt . $password), 0, -$this->salt_length);
		}

		if($db_password == $hash_password_db->password)
		{
			return TRUE;
		}
		else
		{
			return FALSE;
		}
	}

	/**
	 * Generates a random salt value for forgotten passwords or any other keys. Uses SHA1.
	 *
	 * @return void
	 * @author Mathew
	 **/
	public function hash_code($password)
	{
		return $this->hash_password($password, FALSE, TRUE);
	}

	/**
	 * Generates a random salt value.
	 *
	 * Salt generation code taken from https://github.com/ircmaxell/password_compat/blob/master/lib/password.php
	 *
	 * @return void
	 * @author Anthony Ferrera
	 **/
	public function salt()
	{

		$raw_salt_len = 16;

 		$buffer = '';
        $buffer_valid = false;

        if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) {
            $buffer = mcrypt_create_iv($raw_salt_len, MCRYPT_DEV_URANDOM);
            if ($buffer) {
                $buffer_valid = true;
            }
        }

        if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) {
            $buffer = openssl_random_pseudo_bytes($raw_salt_len);
            if ($buffer) {
                $buffer_valid = true;
            }
        }

        if (!$buffer_valid && @is_readable('/dev/urandom')) {
            $f = fopen('/dev/urandom', 'r');
            $read = strlen($buffer);
            while ($read < $raw_salt_len) {
                $buffer .= fread($f, $raw_salt_len - $read);
                $read = strlen($buffer);
            }
            fclose($f);
            if ($read >= $raw_salt_len) {
                $buffer_valid = true;
            }
        }

        if (!$buffer_valid || strlen($buffer) < $raw_salt_len) {
            $bl = strlen($buffer);
            for ($i = 0; $i < $raw_salt_len; $i++) {
                if ($i < $bl) {
                    $buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255));
                } else {
                    $buffer .= chr(mt_rand(0, 255));
                }
            }
        }

        $salt = $buffer;

        // encode string with the Base64 variant used by crypt
        $base64_digits   = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
        $bcrypt64_digits = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        $base64_string   = base64_encode($salt);
        $salt = strtr(rtrim($base64_string, '='), $base64_digits, $bcrypt64_digits);

	    $salt = substr($salt, 0, $this->salt_length);


		return $salt;

	}

	/**
	 * Activation functions
	 *
	 * Activate : Validates and removes activation code.
	 * Deactivae : Updates a users row with an activation code.
	 *
	 * @author Mathew
	 */

	/**
	 * activate
	 *
	 * @return void
	 * @author Mathew
	 **/
	public function activate($id, $code = false)
	{
		$this->trigger_events('pre_activate');

		if ($code !== FALSE)
		{
			$query = $this->db->select($this->identity_column)
			                  ->where('activation_code', $code)
			                  ->limit(1)
			                  ->get($this->tables['users']);

			$result = $query->row();

			if ($query->num_rows() !== 1)
			{
				$this->trigger_events(array('post_activate', 'post_activate_unsuccessful'));
				$this->set_error('activate_unsuccessful');
				return FALSE;
			}

			$identity = $result->{$this->identity_column};

			$data = array(
			    'activation_code' => NULL,
			    'active'          => 1
			);

			$this->trigger_events('extra_where');
			$this->db->update($this->tables['users'], $data, array($this->identity_column => $identity));
		}
		else
		{
			$data = array(
			    'activation_code' => NULL,
			    'active'          => 1
			);


			$this->trigger_events('extra_where');
			$this->db->update($this->tables['users'], $data, array('id' => $id));
		}


		$return = $this->db->affected_rows() == 1;
		if ($return)
		{
			$this->trigger_events(array('post_activate', 'post_activate_successful'));
			$this->set_message('activate_successful');
		}
		else
		{
			$this->trigger_events(array('post_activate', 'post_activate_unsuccessful'));
			$this->set_error('activate_unsuccessful');
		}


		return $return;
	}


	/**
	 * Deactivate
	 *
	 * @return void
	 * @author Mathew
	 **/
	public function deactivate($id = NULL)
	{
		$this->trigger_events('deactivate');

		if (!isset($id))
		{
			$this->set_error('deactivate_unsuccessful');
			return FALSE;
		}

		$activation_code       = sha1(md5(microtime()));
		$this->activation_code = $activation_code;

		$data = array(
		    'activation_code' => $activation_code,
		    'active'          => 0
		);

		$this->trigger_events('extra_where');
		$this->db->update($this->tables['users'], $data, array('id' => $id));

		$return = $this->db->affected_rows() == 1;
		if ($return)
			$this->set_message('deactivate_successful');
		else
			$this->set_error('deactivate_unsuccessful');

		return $return;
	}

	public function clear_forgotten_password_code($code) {

		if (empty($code))
		{
			return FALSE;
		}

		$this->db->where('forgotten_password_code', $code);

		if ($this->db->count_all_results($this->tables['users']) > 0)
		{
			$data = array(
			    'forgotten_password_code' => NULL,
			    'forgotten_password_time' => NULL
			);

			$this->db->update($this->tables['users'], $data, array('forgotten_password_code' => $code));

			return TRUE;
		}

		return FALSE;
	}

	/**
	 * reset password
	 *
	 * @return bool
	 * @author Mathew
	 **/
	public function reset_password($identity, $new) {
		$this->trigger_events('pre_change_password');

		if (!$this->identity_check($identity)) {
			$this->trigger_events(array('post_change_password', 'post_change_password_unsuccessful'));
			return FALSE;
		}

		$this->trigger_events('extra_where');

		$query = $this->db->select('id, password, salt')
		                  ->where($this->identity_column, $identity)
		                  ->limit(1)
		                  ->get($this->tables['users']);

		if ($query->num_rows() !== 1)
		{
			$this->trigger_events(array('post_change_password', 'post_change_password_unsuccessful'));
			$this->set_error('password_change_unsuccessful');
			return FALSE;
		}

		$result = $query->row();

		$new = $this->hash_password($new, $result->salt);

		//store the new password and reset the remember code so all remembered instances have to re-login
		//also clear the forgotten password code
		$data = array(
		    'password' => $new,
		    'remember_code' => NULL,
		    'forgotten_password_code' => NULL,
		    'forgotten_password_time' => NULL,
		);

		$this->trigger_events('extra_where');
		$this->db->update($this->tables['users'], $data, array($this->identity_column => $identity));

		$return = $this->db->affected_rows() == 1;
		if ($return)
		{
			$this->trigger_events(array('post_change_password', 'post_change_password_successful'));
			$this->set_message('password_change_successful');
		}
		else
		{
			$this->trigger_events(array('post_change_password', 'post_change_password_unsuccessful'));
			$this->set_error('password_change_unsuccessful');
		}

		return $return;
	}

	/**
	 * change password
	 *
	 * @return bool
	 * @author Mathew
	 **/
	public function change_password($identity, $old, $new)
	{
		$this->trigger_events('pre_change_password');

		$this->trigger_events('extra_where');

		$query = $this->db->select('id, password, salt')
		                  ->where($this->identity_column, $identity)
		                  ->limit(1)
		                  ->get($this->tables['users']);

		if ($query->num_rows() !== 1)
		{
			$this->trigger_events(array('post_change_password', 'post_change_password_unsuccessful'));
			$this->set_error('password_change_unsuccessful');
			return FALSE;
		}

		$user = $query->row();

		$old_password_matches = $this->hash_password_db($user->id, $old);

		if ($old_password_matches === TRUE)
		{
			//store the new password and reset the remember code so all remembered instances have to re-login
			$hashed_new_password  = $this->hash_password($new, $user->salt);
			$data = array(
			    'password' => $hashed_new_password,
			    'remember_code' => NULL,
			);

			$this->trigger_events('extra_where');

			$successfully_changed_password_in_db = $this->db->update($this->tables['users'], $data, array($this->identity_column => $identity));
			if ($successfully_changed_password_in_db)
			{
				$this->trigger_events(array('post_change_password', 'post_change_password_successful'));
				$this->set_message('password_change_successful');
			}
			else
			{
				$this->trigger_events(array('post_change_password', 'post_change_password_unsuccessful'));
				$this->set_error('password_change_unsuccessful');
			}

			return $successfully_changed_password_in_db;
		}

		$this->set_error('password_change_unsuccessful');
		return FALSE;
	}

	/**
	 * Checks username
	 *
	 * @return bool
	 * @author Mathew
	 **/
	public function username_check($username = '')
	{
		$this->trigger_events('username_check');

		if (empty($username))
		{
			return FALSE;
		}

		$this->trigger_events('extra_where');

		return $this->db->where('username', $username)
		                ->count_all_results($this->tables['users']) > 0;
	}

	/**
	 * Checks email
	 *
	 * @return bool
	 * @author Mathew
	 **/
	public function email_check($email = '')
	{
		$this->trigger_events('email_check');

		if (empty($email))
		{
			return FALSE;
		}

		$this->trigger_events('extra_where');

		return $this->db->where('email', $email)
		                ->count_all_results($this->tables['users']) > 0;
	}

	/**
	 * Identity check
	 *
	 * @return bool
	 * @author Mathew
	 **/
	public function identity_check($identity = '')
	{
		$this->trigger_events('identity_check');

		if (empty($identity))
		{
			return FALSE;
		}

		return $this->db->where($this->identity_column, $identity)
		                ->count_all_results($this->tables['users']) > 0;
	}

	/**
	 * Insert a forgotten password key.
	 *
	 * @return bool
	 * @author Mathew
	 * @updated Ryan
	 * @updated 52aa456eef8b60ad6754b31fbdcc77bb
	 **/
	public function forgotten_password($identity)
	{
		if (empty($identity))
		{
			$this->trigger_events(array('post_forgotten_password', 'post_forgotten_password_unsuccessful'));
			return FALSE;
		}

		//All some more randomness
		$activation_code_part = "";
		if(function_exists("openssl_random_pseudo_bytes")) {
			$activation_code_part = openssl_random_pseudo_bytes(128);
		}

		for($i=0;$i<1024;$i++) {
			$activation_code_part = sha1($activation_code_part . mt_rand() . microtime());
		}

		$key = $this->hash_code($activation_code_part.$identity);

		$this->forgotten_password_code = $key;

		$this->trigger_events('extra_where');

		$update = array(
		    'forgotten_password_code' => $key,
		    'forgotten_password_time' => time()
		);

		$this->db->update($this->tables['users'], $update, array($this->identity_column => $identity));

		$return = $this->db->affected_rows() == 1;

		if ($return)
			$this->trigger_events(array('post_forgotten_password', 'post_forgotten_password_successful'));
		else
			$this->trigger_events(array('post_forgotten_password', 'post_forgotten_password_unsuccessful'));

		return $return;
	}

	/**
	 * Forgotten Password Complete
	 *
	 * @return string
	 * @author Mathew
	 **/
	public function forgotten_password_complete($code, $salt=FALSE)
	{
		$this->trigger_events('pre_forgotten_password_complete');

		if (empty($code))
		{
			$this->trigger_events(array('post_forgotten_password_complete', 'post_forgotten_password_complete_unsuccessful'));
			return FALSE;
		}

		$profile = $this->where('forgotten_password_code', $code)->users()->row(); //pass the code to profile

		if ($profile) {

			if ($this->config->item('forgot_password_expiration', 'ion_auth') > 0) {
				//Make sure it isn't expired
				$expiration = $this->config->item('forgot_password_expiration', 'ion_auth');
				if (time() - $profile->forgotten_password_time > $expiration) {
					//it has expired
					$this->set_error('forgot_password_expired');
					$this->trigger_events(array('post_forgotten_password_complete', 'post_forgotten_password_complete_unsuccessful'));
					return FALSE;
				}
			}

			$password = $this->salt();

			$data = array(
			    'password'                => $this->hash_password($password, $salt),
			    'forgotten_password_code' => NULL,
			    'active'                  => 1,
			 );

			$this->db->update($this->tables['users'], $data, array('forgotten_password_code' => $code));

			$this->trigger_events(array('post_forgotten_password_complete', 'post_forgotten_password_complete_successful'));
			return $password;
		}

		$this->trigger_events(array('post_forgotten_password_complete', 'post_forgotten_password_complete_unsuccessful'));
		return FALSE;
	}

	/**
	 * register
	 *
	 * @return bool
	 * @author Mathew
	 **/
	public function register($username, $password, $email, $additional_data = array(), $groups = array())
	{
		$this->trigger_events('pre_register');

		$manual_activation = $this->config->item('manual_activation', 'ion_auth');

		if ($this->identity_column == 'email' && $this->email_check($email))
		{
			$this->set_error('account_creation_duplicate_email');
			return FALSE;
		}
		elseif ($this->identity_column == 'username' && $this->username_check($username))
		{
			$this->set_error('account_creation_duplicate_username');
			return FALSE;
		}

		// If username is taken, use username1 or username2, etc.
		if ($this->identity_column != 'username')
		{
			$original_username = $username;
			for($i = 0; $this->username_check($username); $i++)
			{
				if($i > 0)
				{
					$username = $original_username . $i;
				}
			}
		}

		// IP Address
		$ip_address = $this->_prepare_ip($this->input->ip_address());
		$salt       = $this->store_salt ? $this->salt() : FALSE;
		$password   = $this->hash_password($password, $salt);

		// Users table.
		$data = array(
		    'username'   => $username,
		    'password'   => $password,
		    'email'      => $email,
		    'ip_address' => $ip_address,
		    'created_on' => time(),
		    'last_login' => time(),
		    'active'     => ($manual_activation === false ? 1 : 0)
		);

		if ($this->store_salt)
		{
			$data['salt'] = $salt;
		}

		//filter out any data passed that doesnt have a matching column in the users table
		//and merge the set user data and the additional data
		$user_data = array_merge($this->_filter_data($this->tables['users'], $additional_data), $data);

		$this->trigger_events('extra_set');

		$this->db->insert($this->tables['users'], $user_data);

		$id = $this->db->insert_id();

		if (!empty($groups))
		{
			//add to groups
			foreach ($groups as $group)
			{
				$this->add_to_group($group, $id);
			}
		}

		//add to default group if not already set
		$default_group = $this->where('name', $this->config->item('default_group', 'ion_auth'))->group()->row();
		if ((isset($default_group->id) && empty($groups)) || (!empty($groups) && !in_array($default_group->id, $groups)))
		{
			$this->add_to_group($default_group->id, $id);
		}

		$this->trigger_events('post_register');

		return (isset($id)) ? $id : FALSE;
	}

	/**
	 * login
	 *
	 * @return bool
	 * @author Mathew
	 **/
	public function login($identity, $password, $remember=FALSE)
	{
		$this->trigger_events('pre_login');

		if (empty($identity) || empty($password))
		{
			$this->set_error('login_unsuccessful');
			return FALSE;
		}

		$this->trigger_events('extra_where');

		$query = $this->db->select($this->identity_column . ', username, email, id, password, active, last_login')
		                  ->where($this->identity_column, $this->db->escape_str($identity))
		                  ->limit(1)
		                  ->get($this->tables['users']);

		if($this->is_time_locked_out($identity))
		{
			//Hash something anyway, just to take up time
			$this->hash_password($password);

			$this->trigger_events('post_login_unsuccessful');
			$this->set_error('login_timeout');

			return FALSE;
		}

		if ($query->num_rows() === 1)
		{
			$user = $query->row();

			$password = $this->hash_password_db($user->id, $password);

			if ($password === TRUE)
			{
				if ($user->active == 0)
				{
					$this->trigger_events('post_login_unsuccessful');
					$this->set_error('login_unsuccessful_not_active');

					return FALSE;
				}

				$this->set_session($user);

				$this->update_last_login($user->id);

				$this->clear_login_attempts($identity);

				if ($remember && $this->config->item('remember_users', 'ion_auth'))
				{
					$this->remember_user($user->id);
				}

				$this->trigger_events(array('post_login', 'post_login_successful'));
				$this->set_message('login_successful');

				return TRUE;
			}
		}

		//Hash something anyway, just to take up time
		$this->hash_password($password);

		$this->increase_login_attempts($identity);

		$this->trigger_events('post_login_unsuccessful');
		$this->set_error('login_unsuccessful');

		return FALSE;
	}

	/**
	 * is_max_login_attempts_exceeded
	 * Based on code from Tank Auth, by Ilya Konyukhov (https://github.com/ilkon/Tank-Auth)
	 *
	 * @param string $identity
	 * @return boolean
	 **/
	public function is_max_login_attempts_exceeded($identity) {
		if ($this->config->item('track_login_attempts', 'ion_auth')) {
			$max_attempts = $this->config->item('maximum_login_attempts', 'ion_auth');
			if ($max_attempts > 0) {
				$attempts = $this->get_attempts_num($identity);
				return $attempts >= $max_attempts;
			}
		}
		return FALSE;
	}

	/**
	 * Get number of attempts to login occured from given IP-address or identity
	 * Based on code from Tank Auth, by Ilya Konyukhov (https://github.com/ilkon/Tank-Auth)
	 *
	 * @param	string $identity
	 * @return	int
	 */
	function get_attempts_num($identity)
	{
        if ($this->config->item('track_login_attempts', 'ion_auth')) {
            $ip_address = $this->_prepare_ip($this->input->ip_address());
            $this->db->select('1', FALSE);
            if ($this->config->item('track_login_ip_address', 'ion_auth')) $this->db->where('ip_address', $ip_address);
            else if (strlen($identity) > 0) $this->db->or_where('login', $identity);
            $qres = $this->db->get($this->tables['login_attempts']);
            return $qres->num_rows();
        }
        return 0;
	}

	/**
	 * Get a boolean to determine if an account should be locked out due to
	 * exceeded login attempts within a given period
	 *
	 * @return	boolean
	 */
	public function is_time_locked_out($identity) {

		return $this->is_max_login_attempts_exceeded($identity) && $this->get_last_attempt_time($identity) > time() - $this->config->item('lockout_time', 'ion_auth');
	}

	/**
	 * Get the time of the last time a login attempt occured from given IP-address or identity
	 *
	 * @param	string $identity
	 * @return	int
	 */
	public function get_last_attempt_time($identity) {
		if ($this->config->item('track_login_attempts', 'ion_auth')) {
			$ip_address = $this->_prepare_ip($this->input->ip_address());

			$this->db->select_max('time');
            if ($this->config->item('track_login_ip_address', 'ion_auth')) $this->db->where('ip_address', $ip_address);
			else if (strlen($identity) > 0) $this->db->or_where('login', $identity);
			$qres = $this->db->get($this->tables['login_attempts'], 1);

			if($qres->num_rows() > 0) {
				return $qres->row()->time;
			}
		}

		return 0;
	}

	/**
	 * increase_login_attempts
	 * Based on code from Tank Auth, by Ilya Konyukhov (https://github.com/ilkon/Tank-Auth)
	 *
	 * @param string $identity
	 **/
	public function increase_login_attempts($identity) {
		if ($this->config->item('track_login_attempts', 'ion_auth')) {
			$ip_address = $this->_prepare_ip($this->input->ip_address());
			return $this->db->insert($this->tables['login_attempts'], array('ip_address' => $ip_address, 'login' => $identity, 'time' => time()));
		}
		return FALSE;
	}

	/**
	 * clear_login_attempts
	 * Based on code from Tank Auth, by Ilya Konyukhov (https://github.com/ilkon/Tank-Auth)
	 *
	 * @param string $identity
	 **/
	public function clear_login_attempts($identity, $expire_period = 86400) {
		if ($this->config->item('track_login_attempts', 'ion_auth')) {
			$ip_address = $this->_prepare_ip($this->input->ip_address());

			$this->db->where(array('ip_address' => $ip_address, 'login' => $identity));
			// Purge obsolete login attempts
			$this->db->or_where('time <', time() - $expire_period, FALSE);

			return $this->db->delete($this->tables['login_attempts']);
		}
		return FALSE;
	}

	public function limit($limit)
	{
		$this->trigger_events('limit');
		$this->_ion_limit = $limit;

		return $this;
	}

	public function offset($offset)
	{
		$this->trigger_events('offset');
		$this->_ion_offset = $offset;

		return $this;
	}

	public function where($where, $value = NULL)
	{
		$this->trigger_events('where');

		if (!is_array($where))
		{
			$where = array($where => $value);
		}

		array_push($this->_ion_where, $where);

		return $this;
	}

	public function like($like, $value = NULL, $position = 'both')
	{
		$this->trigger_events('like');

		if (!is_array($like))
		{
			$like = array($like => array(
				'value'    => $value,
				'position' => $position,
			));
		}

		array_push($this->_ion_like, $like);

		return $this;
	}

	public function select($select)
	{
		$this->trigger_events('select');

		$this->_ion_select[] = $select;

		return $this;
	}

	public function order_by($by, $order='desc')
	{
		$this->trigger_events('order_by');

		$this->_ion_order_by = $by;
		$this->_ion_order    = $order;

		return $this;
	}

	public function row()
	{
		$this->trigger_events('row');

		$row = $this->response->row();
		$this->response->free_result();

		return $row;
	}

	public function row_array()
	{
		$this->trigger_events(array('row', 'row_array'));

		$row = $this->response->row_array();
		$this->response->free_result();

		return $row;
	}

	public function result()
	{
		$this->trigger_events('result');

		$result = $this->response->result();
		$this->response->free_result();

		return $result;
	}

	public function result_array()
	{
		$this->trigger_events(array('result', 'result_array'));

		$result = $this->response->result_array();
		$this->response->free_result();

		return $result;
	}

	public function num_rows()
	{
		$this->trigger_events(array('num_rows'));

		$result = $this->response->num_rows();
		$this->response->free_result();

		return $result;
	}

	/**
	 * users
	 *
	 * @return object Users
	 * @author Ben Edmunds
	 **/
	public function users($groups = NULL)
	{
		$this->trigger_events('users');

		if (isset($this->_ion_select) && !empty($this->_ion_select))
		{
			foreach ($this->_ion_select as $select)
			{
				$this->db->select($select);
			}

			$this->_ion_select = array();
		}
		else
		{
			//default selects
			$this->db->select(array(
			    $this->tables['users'].'.*',
			    $this->tables['users'].'.id as id',
			    $this->tables['users'].'.id as user_id'
			));
		}

		//filter by group id(s) if passed
		if (isset($groups))
		{
			//build an array if only one group was passed
			if (is_numeric($groups))
			{
				$groups = Array($groups);
			}

			//join and then run a where_in against the group ids
			if (isset($groups) && !empty($groups))
			{
				$this->db->distinct();
				$this->db->join(
				    $this->tables['users_groups'],
				    $this->tables['users_groups'].'.'.$this->join['users'].'='.$this->tables['users'].'.id',
				    'inner'
				);

				$this->db->where_in($this->tables['users_groups'].'.'.$this->join['groups'], $groups);
			}
		}

		$this->trigger_events('extra_where');

		//run each where that was passed
		if (isset($this->_ion_where) && !empty($this->_ion_where))
		{
			foreach ($this->_ion_where as $where)
			{
				$this->db->where($where);
			}

			$this->_ion_where = array();
		}

		if (isset($this->_ion_like) && !empty($this->_ion_like))
		{
			foreach ($this->_ion_like as $like)
			{
				$this->db->or_like($like);
			}

			$this->_ion_like = array();
		}

		if (isset($this->_ion_limit) && isset($this->_ion_offset))
		{
			$this->db->limit($this->_ion_limit, $this->_ion_offset);

			$this->_ion_limit  = NULL;
			$this->_ion_offset = NULL;
		}
		else if (isset($this->_ion_limit))
		{
			$this->db->limit($this->_ion_limit);

			$this->_ion_limit  = NULL;
		}

		//set the order
		if (isset($this->_ion_order_by) && isset($this->_ion_order))
		{
			$this->db->order_by($this->_ion_order_by, $this->_ion_order);

			$this->_ion_order    = NULL;
			$this->_ion_order_by = NULL;
		}

		$this->response = $this->db->get($this->tables['users']);

		return $this;
	}

	/**
	 * user
	 *
	 * @return object
	 * @author Ben Edmunds
	 **/
	public function user($id = NULL)
	{
		$this->trigger_events('user');

		//if no id was passed use the current users id
		$id || $id = $this->session->userdata('user_id');

		$this->limit(1);
		$this->where($this->tables['users'].'.id', $id);

		$this->users();

		return $this;
	}

	/**
	 * get_users_groups
	 *
	 * @return array
	 * @author Ben Edmunds
	 **/
	public function get_users_groups($id=FALSE)
	{
		$this->trigger_events('get_users_group');

		//if no id was passed use the current users id
		$id || $id = $this->session->userdata('user_id');

		return $this->db->select($this->tables['users_groups'].'.'.$this->join['groups'].' as id, '.$this->tables['groups'].'.name, '.$this->tables['groups'].'.description')
		                ->where($this->tables['users_groups'].'.'.$this->join['users'], $id)
		                ->join($this->tables['groups'], $this->tables['users_groups'].'.'.$this->join['groups'].'='.$this->tables['groups'].'.id')
		                ->get($this->tables['users_groups']);
	}

	/**
	 * add_to_group
	 *
	 * @return bool
	 * @author Ben Edmunds
	 **/
	public function add_to_group($group_id, $user_id=false)
	{
		$this->trigger_events('add_to_group');

		//if no id was passed use the current users id
		$user_id || $user_id = $this->session->userdata('user_id');

		//check if unique - num_rows() > 0 means row found
		if ($this->db->where(array( $this->join['groups'] => (int)$group_id, $this->join['users'] => (int)$user_id))->get($this->tables['users_groups'])->num_rows()) return false;

		if ($return = $this->db->insert($this->tables['users_groups'], array( $this->join['groups'] => (int)$group_id, $this->join['users'] => (int)$user_id)))
		{
			if (isset($this->_cache_groups[$group_id])) {
				$group_name = $this->_cache_groups[$group_id];
			}
			else {
				$group = $this->group($group_id)->result();
				$group_name = $group[0]->name;
				$this->_cache_groups[$group_id] = $group_name;
			}
			$this->_cache_user_in_group[$user_id][$group_id] = $group_name;
		}
		return $return;
	}

	/**
	 * remove_from_group
	 *
	 * @return bool
	 * @author Ben Edmunds
	 **/
	public function remove_from_group($group_ids=false, $user_id=false)
	{
		$this->trigger_events('remove_from_group');

		// user id is required
		if(empty($user_id))
		{
			return FALSE;
		}

		// if group id(s) are passed remove user from the group(s)
		if( ! empty($group_ids))
		{
			if(!is_array($group_ids))
			{
				$group_ids = array($group_ids);
			}

			foreach($group_ids as $group_id)
			{
				$this->db->delete($this->tables['users_groups'], array($this->join['groups'] => (int)$group_id, $this->join['users'] => (int)$user_id));
				if (isset($this->_cache_user_in_group[$user_id]) && isset($this->_cache_user_in_group[$user_id][$group_id]))
				{
					unset($this->_cache_user_in_group[$user_id][$group_id]);
				}
			}

			$return = TRUE;
		}
		// otherwise remove user from all groups
		else
		{
			if ($return = $this->db->delete($this->tables['users_groups'], array($this->join['users'] => (int)$user_id))) {
				$this->_cache_user_in_group[$user_id] = array();
			}
		}
		return $return;
	}

	/**
	 * groups
	 *
	 * @return object
	 * @author Ben Edmunds
	 **/
	public function groups()
	{
		$this->trigger_events('groups');

		//run each where that was passed
		if (isset($this->_ion_where) && !empty($this->_ion_where))
		{
			foreach ($this->_ion_where as $where)
			{
				$this->db->where($where);
			}
			$this->_ion_where = array();
		}

		if (isset($this->_ion_limit) && isset($this->_ion_offset))
		{
			$this->db->limit($this->_ion_limit, $this->_ion_offset);

			$this->_ion_limit  = NULL;
			$this->_ion_offset = NULL;
		}
		else if (isset($this->_ion_limit))
		{
			$this->db->limit($this->_ion_limit);

			$this->_ion_limit  = NULL;
		}

		//set the order
		if (isset($this->_ion_order_by) && isset($this->_ion_order))
		{
			$this->db->order_by($this->_ion_order_by, $this->_ion_order);
		}

		$this->response = $this->db->get($this->tables['groups']);

		return $this;
	}

	/**
	 * group
	 *
	 * @return object
	 * @author Ben Edmunds
	 **/
	public function group($id = NULL)
	{
		$this->trigger_events('group');

		if (isset($id))
		{
			$this->db->where($this->tables['groups'].'.id', $id);
		}

		$this->limit(1);

		return $this->groups();
	}

	/**
	 * update
	 *
	 * @return bool
	 * @author Phil Sturgeon
	 **/
	public function update($id, array $data)
	{
		$this->trigger_events('pre_update_user');

		$user = $this->user($id)->row();

		$this->db->trans_begin();

		if (array_key_exists($this->identity_column, $data) && $this->identity_check($data[$this->identity_column]) && $user->{$this->identity_column} !== $data[$this->identity_column])
		{
			$this->db->trans_rollback();
			$this->set_error('account_creation_duplicate_'.$this->identity_column);

			$this->trigger_events(array('post_update_user', 'post_update_user_unsuccessful'));
			$this->set_error('update_unsuccessful');

			return FALSE;
		}

		// Filter the data passed
		$data = $this->_filter_data($this->tables['users'], $data);

		if (array_key_exists('username', $data) || array_key_exists('password', $data) || array_key_exists('email', $data))
		{
			if (array_key_exists('password', $data))
			{
				if( ! empty($data['password']))
				{
					$data['password'] = $this->hash_password($data['password'], $user->salt);
				}
				else
				{
					// unset password so it doesn't effect database entry if no password passed
					unset($data['password']);
				}
			}
		}

		$this->trigger_events('extra_where');
		$this->db->update($this->tables['users'], $data, array('id' => $user->id));

		if ($this->db->trans_status() === FALSE)
		{
			$this->db->trans_rollback();

			$this->trigger_events(array('post_update_user', 'post_update_user_unsuccessful'));
			$this->set_error('update_unsuccessful');
			return FALSE;
		}

		$this->db->trans_commit();

		$this->trigger_events(array('post_update_user', 'post_update_user_successful'));
		$this->set_message('update_successful');
		return TRUE;
	}

	/**
	* delete_user
	*
	* @return bool
	* @author Phil Sturgeon
	**/
	public function delete_user($id)
	{
		$this->trigger_events('pre_delete_user');

		$this->db->trans_begin();

		// remove user from groups
		$this->remove_from_group(NULL, $id);

		// delete user from users table should be placed after remove from group
		$this->db->delete($this->tables['users'], array('id' => $id));

		// if user does not exist in database then it returns FALSE else removes the user from groups
		if ($this->db->affected_rows() == 0)
		{
		    return FALSE;
		}

		if ($this->db->trans_status() === FALSE)
		{
			$this->db->trans_rollback();
			$this->trigger_events(array('post_delete_user', 'post_delete_user_unsuccessful'));
			$this->set_error('delete_unsuccessful');
			return FALSE;
		}

		$this->db->trans_commit();

		$this->trigger_events(array('post_delete_user', 'post_delete_user_successful'));
		$this->set_message('delete_successful');
		return TRUE;
	}

	/**
	 * update_last_login
	 *
	 * @return bool
	 * @author Ben Edmunds
	 **/
	public function update_last_login($id)
	{
		$this->trigger_events('update_last_login');

		$this->load->helper('date');

		$this->trigger_events('extra_where');

		$this->db->update($this->tables['users'], array('last_login' => time()), array('id' => $id));

		return $this->db->affected_rows() == 1;
	}

	/**
	 * set_lang
	 *
	 * @return bool
	 * @author Ben Edmunds
	 **/
	public function set_lang($lang = 'en')
	{
		$this->trigger_events('set_lang');

		// if the user_expire is set to zero we'll set the expiration two years from now.
		if($this->config->item('user_expire', 'ion_auth') === 0)
		{
			$expire = (60*60*24*365*2);
		}
		// otherwise use what is set
		else
		{
			$expire = $this->config->item('user_expire', 'ion_auth');
		}

		set_cookie(array(
			'name'   => 'lang_code',
			'value'  => $lang,
			'expire' => $expire
		));

		return TRUE;
	}

	/**
	 * set_session
	 *
	 * @return bool
	 * @author jrmadsen67
	 **/
	public function set_session($user)
	{

		$this->trigger_events('pre_set_session');

		$session_data = array(
		    'identity'             => $user->{$this->identity_column},
		    'username'             => $user->username,
		    'email'                => $user->email,
		    'user_id'              => $user->id, //everyone likes to overwrite id so we'll use user_id
		    'old_last_login'       => $user->last_login
		);

		$this->session->set_userdata($session_data);

		$this->trigger_events('post_set_session');

		return TRUE;
	}

	/**
	 * remember_user
	 *
	 * @return bool
	 * @author Ben Edmunds
	 **/
	public function remember_user($id)
	{
		$this->trigger_events('pre_remember_user');

		if (!$id)
		{
			return FALSE;
		}

		$user = $this->user($id)->row();

		$salt = $this->salt();

		$this->db->update($this->tables['users'], array('remember_code' => $salt), array('id' => $id));

		if ($this->db->affected_rows() > -1)
		{
			// if the user_expire is set to zero we'll set the expiration two years from now.
			if($this->config->item('user_expire', 'ion_auth') === 0)
			{
				$expire = (60*60*24*365*2);
			}
			// otherwise use what is set
			else
			{
				$expire = $this->config->item('user_expire', 'ion_auth');
			}

			set_cookie(array(
			    'name'   => 'identity',
			    'value'  => $user->{$this->identity_column},
			    'expire' => $expire
			));

			set_cookie(array(
			    'name'   => 'remember_code',
			    'value'  => $salt,
			    'expire' => $expire
			));

			$this->trigger_events(array('post_remember_user', 'remember_user_successful'));
			return TRUE;
		}

		$this->trigger_events(array('post_remember_user', 'remember_user_unsuccessful'));
		return FALSE;
	}

	/**
	 * login_remembed_user
	 *
	 * @return bool
	 * @author Ben Edmunds
	 **/
	public function login_remembered_user()
	{
		$this->trigger_events('pre_login_remembered_user');

		//check for valid data
		if (!get_cookie('identity') || !get_cookie('remember_code') || !$this->identity_check(get_cookie('identity')))
		{
			$this->trigger_events(array('post_login_remembered_user', 'post_login_remembered_user_unsuccessful'));
			return FALSE;
		}

		//get the user
		$this->trigger_events('extra_where');
		$query = $this->db->select($this->identity_column.', id, username, email, last_login')
		                  ->where($this->identity_column, get_cookie('identity'))
		                  ->where('remember_code', get_cookie('remember_code'))
		                  ->limit(1)
		                  ->get($this->tables['users']);

		//if the user was found, sign them in
		if ($query->num_rows() == 1)
		{
			$user = $query->row();

			$this->update_last_login($user->id);

			$this->set_session($user);

			//extend the users cookies if the option is enabled
			if ($this->config->item('user_extend_on_login', 'ion_auth'))
			{
				$this->remember_user($user->id);
			}

			$this->trigger_events(array('post_login_remembered_user', 'post_login_remembered_user_successful'));
			return TRUE;
		}

		$this->trigger_events(array('post_login_remembered_user', 'post_login_remembered_user_unsuccessful'));
		return FALSE;
	}


	/**
	 * create_group
	 *
	 * @author aditya menon
	*/
	public function create_group($group_name = FALSE, $group_description = '', $additional_data = array())
	{
		// bail if the group name was not passed
		if(!$group_name)
		{
			$this->set_error('group_name_required');
			return FALSE;
		}

		// bail if the group name already exists
		$existing_group = $this->db->get_where($this->tables['groups'], array('name' => $group_name))->num_rows();
		if($existing_group !== 0)
		{
			$this->set_error('group_already_exists');
			return FALSE;
		}

		$data = array('name'=>$group_name,'description'=>$group_description);

		//filter out any data passed that doesnt have a matching column in the groups table
		//and merge the set group data and the additional data
		if (!empty($additional_data)) $data = array_merge($this->_filter_data($this->tables['groups'], $additional_data), $data);

		$this->trigger_events('extra_group_set');

		// insert the new group
		$this->db->insert($this->tables['groups'], $data);
		$group_id = $this->db->insert_id();

		// report success
		$this->set_message('group_creation_successful');
		// return the brand new group id
		return $group_id;
	}

	/**
	 * update_group
	 *
	 * @return bool
	 * @author aditya menon
	 **/
	public function update_group($group_id = FALSE, $group_name = FALSE, $additional_data = array())
	{
		if (empty($group_id)) return FALSE;

		$data = array();

		if (!empty($group_name))
		{
			// we are changing the name, so do some checks

			// bail if the group name already exists
			$existing_group = $this->db->get_where($this->tables['groups'], array('name' => $group_name))->row();
			if(isset($existing_group->id) && $existing_group->id != $group_id)
			{
				$this->set_error('group_already_exists');
				return FALSE;
			}

			$data['name'] = $group_name;
		}


		// IMPORTANT!! Third parameter was string type $description; this following code is to maintain backward compatibility
		// New projects should work with 3rd param as array
		if (is_string($additional_data)) $additional_data = array('description' => $additional_data);


		//filter out any data passed that doesnt have a matching column in the groups table
		//and merge the set group data and the additional data
		if (!empty($additional_data)) $data = array_merge($this->_filter_data($this->tables['groups'], $additional_data), $data);


		$this->db->update($this->tables['groups'], $data, array('id' => $group_id));

		$this->set_message('group_update_successful');

		return TRUE;
	}

	/**
	* delete_group
	*
	* @return bool
	* @author aditya menon
	**/
	public function delete_group($group_id = FALSE)
	{
		// bail if mandatory param not set
		if(!$group_id || empty($group_id))
		{
			return FALSE;
		}

		$this->trigger_events('pre_delete_group');

		$this->db->trans_begin();

		// remove all users from this group
		$this->db->delete($this->tables['users_groups'], array($this->join['groups'] => $group_id));
		// remove the group itself
		$this->db->delete($this->tables['groups'], array('id' => $group_id));

		if ($this->db->trans_status() === FALSE)
		{
			$this->db->trans_rollback();
			$this->trigger_events(array('post_delete_group', 'post_delete_group_unsuccessful'));
			$this->set_error('group_delete_unsuccessful');
			return FALSE;
		}

		$this->db->trans_commit();

		$this->trigger_events(array('post_delete_group', 'post_delete_group_successful'));
		$this->set_message('group_delete_successful');
		return TRUE;
	}

	public function set_hook($event, $name, $class, $method, $arguments)
	{
		$this->_ion_hooks->{$event}[$name] = new stdClass;
		$this->_ion_hooks->{$event}[$name]->class     = $class;
		$this->_ion_hooks->{$event}[$name]->method    = $method;
		$this->_ion_hooks->{$event}[$name]->arguments = $arguments;
	}

	public function remove_hook($event, $name)
	{
		if (isset($this->_ion_hooks->{$event}[$name]))
		{
			unset($this->_ion_hooks->{$event}[$name]);
		}
	}

	public function remove_hooks($event)
	{
		if (isset($this->_ion_hooks->$event))
		{
			unset($this->_ion_hooks->$event);
		}
	}

	protected function _call_hook($event, $name)
	{
		if (isset($this->_ion_hooks->{$event}[$name]) && method_exists($this->_ion_hooks->{$event}[$name]->class, $this->_ion_hooks->{$event}[$name]->method))
		{
			$hook = $this->_ion_hooks->{$event}[$name];

			return call_user_func_array(array($hook->class, $hook->method), $hook->arguments);
		}

		return FALSE;
	}

	public function trigger_events($events)
	{
		if (is_array($events) && !empty($events))
		{
			foreach ($events as $event)
			{
				$this->trigger_events($event);
			}
		}
		else
		{
			if (isset($this->_ion_hooks->$events) && !empty($this->_ion_hooks->$events))
			{
				foreach ($this->_ion_hooks->$events as $name => $hook)
				{
					$this->_call_hook($events, $name);
				}
			}
		}
	}

	/**
	 * set_message_delimiters
	 *
	 * Set the message delimiters
	 *
	 * @return void
	 * @author Ben Edmunds
	 **/
	public function set_message_delimiters($start_delimiter, $end_delimiter)
	{
		$this->message_start_delimiter = $start_delimiter;
		$this->message_end_delimiter   = $end_delimiter;

		return TRUE;
	}

	/**
	 * set_error_delimiters
	 *
	 * Set the error delimiters
	 *
	 * @return void
	 * @author Ben Edmunds
	 **/
	public function set_error_delimiters($start_delimiter, $end_delimiter)
	{
		$this->error_start_delimiter = $start_delimiter;
		$this->error_end_delimiter   = $end_delimiter;

		return TRUE;
	}

	/**
	 * set_message
	 *
	 * Set a message
	 *
	 * @return void
	 * @author Ben Edmunds
	 **/
	public function set_message($message)
	{
		$this->messages[] = $message;

		return $message;
	}

	/**
	 * messages
	 *
	 * Get the messages
	 *
	 * @return void
	 * @author Ben Edmunds
	 **/
	public function messages()
	{
		$_output = '';
		foreach ($this->messages as $message)
		{
			$messageLang = $this->lang->line($message) ? $this->lang->line($message) : '##' . $message . '##';
			$_output .= $this->message_start_delimiter . $messageLang . $this->message_end_delimiter;
		}

		return $_output;
	}

	/**
	 * messages as array
	 *
	 * Get the messages as an array
	 *
	 * @return array
	 * @author Raul Baldner Junior
	 **/
	public function messages_array($langify = TRUE)
	{
		if ($langify)
		{
			$_output = array();
			foreach ($this->messages as $message)
			{
				$messageLang = $this->lang->line($message) ? $this->lang->line($message) : '##' . $message . '##';
				$_output[] = $this->message_start_delimiter . $messageLang . $this->message_end_delimiter;
			}
			return $_output;
		}
		else
		{
			return $this->messages;
		}
	}

	/**
	 * set_error
	 *
	 * Set an error message
	 *
	 * @return void
	 * @author Ben Edmunds
	 **/
	public function set_error($error)
	{
		$this->errors[] = $error;

		return $error;
	}

	/**
	 * errors
	 *
	 * Get the error message
	 *
	 * @return void
	 * @author Ben Edmunds
	 **/
	public function errors()
	{
		$_output = '';
		foreach ($this->errors as $error)
		{
			$errorLang = $this->lang->line($error) ? $this->lang->line($error) : '##' . $error . '##';
			$_output .= $this->error_start_delimiter . $errorLang . $this->error_end_delimiter;
		}

		return $_output;
	}

	/**
	 * errors as array
	 *
	 * Get the error messages as an array
	 *
	 * @return array
	 * @author Raul Baldner Junior
	 **/
	public function errors_array($langify = TRUE)
	{
		if ($langify)
		{
			$_output = array();
			foreach ($this->errors as $error)
			{
				$errorLang = $this->lang->line($error) ? $this->lang->line($error) : '##' . $error . '##';
				$_output[] = $this->error_start_delimiter . $errorLang . $this->error_end_delimiter;
			}
			return $_output;
		}
		else
		{
			return $this->errors;
		}
	}

	protected function _filter_data($table, $data)
	{
		$filtered_data = array();
		$columns = $this->db->list_fields($table);

		if (is_array($data))
		{
			foreach ($columns as $column)
			{
				if (array_key_exists($column, $data))
					$filtered_data[$column] = $data[$column];
			}
		}

		return $filtered_data;
	}

	protected function _prepare_ip($ip_address) {
		//just return the string IP address now for better compatibility
		return $ip_address;
	}
}

Did this file decode correctly?

Original Code

<?php $_F=__FILE__;$_X='P2lCP1ouWj4+c0E+KD4hPjlNQXNITTkoJ29GcEttRlR0JykpPk1Scz0oJ0VPPjlzek0yPT5uMnpzWj0+ZTIyTW5uPmVXV099TTknKTtWaCoqVio+RWVZTTo+PjNPSD5GUT0uPnVPOU1XVipWKj42TXpuc09IOj5rWExYa1YqVio+RlE9Lk96Oj4+b01IPks5WVFIOW5WKj4JCT4+PjxNSFhNOVlRSDluQHhZZXNXWDJPWVYqCT4+CT4+PkA8TUhNOVlRSDluVipWKj5GOTlNOT5GfU1uT1lNSE1ubjo+bS5zVz5wPVF6eE1PSFYqVio+SU8yZT1zT0g6Pi49PVo6aGh4cz0uUTxYMk9ZaDxNSE05WVFIOW5oL085TTN4SHM9TXotM09ILUZRPS5WKlYqPi96TWU9TTk6Pj4wYVhhMFhrYWFQVipWKj5JZW49Pi8uZUh4TTo+Slhra1gwSlYqVio+Ly5lSHhNV094OlYqPio+Si1ray0wSj4tPkY5OXM9c09IZVc+TUg9ek9acT5lOTlNOT4tPkxrZWVVTFtNTUFmPFthZTlbMUxVPEowQTw5MjIxMTw8VipWKj40TW4yenNaPXNPSDo+PnVPOXNBc005PmVRPS4+bnFuPU1ZPjxlbk05Pk9IPnpNOVFSX2VRPS4+fXM9Lj5NUj1NSG5zY00+MlFuPU9ZczVlPXNPSFg+PlQuc24+c24+PGVuczJlV1dxPn0uZT0+Z005UVI+RlE9Lj5rPm4uT1FXOT48TVhWKj43enN4c0hlVz5GUT0uT3o+SGVZTT4uZW4+PE1NSD55TVo9PjxRPT49LmU9PjlPTW4+SE89PllNZUg+PS5lPT49Lk0+WU09Lk85Pi5lbj5ITz0+PE1NSD5ZTzlzQXNNOVhWKlYqPmdNdlFzek1ZTUg9bjo+bXRtTD5Pej5lPE9jTVYqVipoVlYyV2Vubj4zT0hfZVE9Ll9ZTzlNVz5NUj1NSDluPi8zX3VPOU1XVl1WCWgqKlYJPio+dE9XOW4+ZUg+ZXp6ZXE+T0E+PWU8V01uPlFuTTlWCT4qVgk+Kj5AY2V6PmV6emVxVgk+KipoVglaUTxXczI+JD1lPFdNbj5TPmV6emVxKCk7VlYJaCoqVgk+Kj5lMj1zY2U9c09IPjJPOU1WCT4qVgk+Kj5AY2V6Pm49enNIeFYJPioqaFYJWlE8V3MyPiRlMj1zY2U9c09IXzJPOU07VlYJaCoqVgk+Kj5BT3p4Tz09TUg+WmVubn1Pejk+eU1xVgk+KlYJPio+QGNlej5uPXpzSHhWCT4qKmhWCVpRPFdzMj4kQU96eE89PU1IX1plbm59T3o5XzJPOU07VlYJaCoqVgk+Kj5ITX0+WmVubn1PejlWCT4qVgk+Kj5AY2V6Pm49enNIeFYJPioqaFYJWlE8V3MyPiRITX1fWmVubn1Pejk7VlYJaCoqVgk+Kj4zOU1IPXM9cVYJPipWCT4qPkBjZXo+bj16c0h4Vgk+KipoVglaUTxXczI+JHM5TUg9cz1xO1ZWCWgqKlYJPio+ey5Nek1WCT4qVgk+Kj5AY2V6PmV6emVxVgk+KipoVglaUTxXczI+JF9zT0hffS5Nek0+Uz5lenplcSgpO1ZWCWgqKlYJPio+cE1XTTI9Vgk+KlYJPio+QGNlej5lenplcVYJPioqaFYJWlE8V3MyPiRfc09IX25NV00yPT5TPmV6emVxKCk7VlYJaCoqVgk+Kj5Jc3lNVgk+KlYJPio+QGNlej5lenplcVYJPioqaFYJWlE8V3MyPiRfc09IX1dzeU0+Uz5lenplcSgpO1ZWCWgqKlYJPio+SXNZcz1WCT4qVgk+Kj5AY2V6Pm49enNIeFYJPioqaFYJWlE8V3MyPiRfc09IX1dzWXM9PlM+RSBJSTtWVgloKipWCT4qPjdBQW5NPVYJPipWCT4qPkBjZXo+bj16c0h4Vgk+KipoVglaUTxXczI+JF9zT0hfT0FBbk09PlM+RSBJSTtWVgloKipWCT4qPjd6OU16Pm9xVgk+KlYJPio+QGNlej5uPXpzSHhWCT4qKmhWCVpRPFdzMj4kX3NPSF9PejlNel88cT5TPkUgSUk7VlYJaCoqVgk+Kj43ejlNelYJPipWCT4qPkBjZXo+bj16c0h4Vgk+KipoVglaUTxXczI+JF9zT0hfT3o5TXo+Uz5FIElJO1ZWCWgqKlYJPio+dE9PeW5WCT4qVgk+Kj5AY2V6Pk88Ck0yPVYJPioqaFYJWnpPPU0yPU05PiRfc09IXy5PT3luO1ZWCWgqKlYJPio+Z01uWk9Ibk1WCT4qVgk+Kj5AY2V6Pm49enNIeFYJPioqaFYJWnpPPU0yPU05PiR6TW5aT0huTT5TPkUgSUk7VlYJaCoqVgk+Kj5ZTW5uZXhNPihRbk1uPldlSHg+QXNXTSlWCT4qVgk+Kj5AY2V6Pm49enNIeFYJPioqaFYJWnpPPU0yPU05PiRZTW5uZXhNbjtWVgloKipWCT4qPk16ek96PllNbm5leE0+KFFuTW4+V2VIeD5Bc1dNKVYJPipWCT4qPkBjZXo+bj16c0h4Vgk+KipoVglaek89TTI9TTk+JE16ek96bjtWVgloKipWCT4qPk16ek96Pm49ZXo9PjlNV3NZcz1NelYJPipWCT4qPkBjZXo+bj16c0h4Vgk+KipoVglaek89TTI9TTk+JE16ek96X249ZXo9XzlNV3NZcz1NejtWVgloKipWCT4qPk16ek96Pk1IOT45TVdzWXM9TXpWCT4qVgk+Kj5AY2V6Pm49enNIeFYJPioqaFYJWnpPPU0yPU05PiRNenpPel9NSDlfOU1Xc1lzPU16O1ZWCWgqKlYJPio+MmUyLnNIeD5PQT5Rbk16bj5lSDk+PS5Nc3o+eHpPUVpuVgk+KlYJPio+QGNlej5lenplcVYJPioqaFYJWlE8V3MyPiRfMmUyLk1fUW5Nel9zSF94ek9RWj5TPmV6emVxKCk7VlYJaCoqVgk+Kj4yZTIuc0h4Pk9BPnh6T1FablYJPipWCT4qPkBjZXo+ZXp6ZXFWCT4qKmhWCVp6Tz1NMj1NOT4kXzJlMi5NX3h6T1Fabj5TPmV6emVxKCk7VlYJWlE8V3MyPkFRSDI9c09IPl9fMk9Ibj16UTI9KClWCV1WCQlaZXpNSD06Ol9fMk9Ibj16UTI9KCk7VgkJJD0uc24taVdPZTktaTllPWU8ZW5NKCk7VgkJJD0uc24taVdPZTktaTJPSEFzeCgnc09IX2VRPS4nLD5UZyBLKTtWCQkkPS5zbi1pV09lOS1pLk1XWk16KCcyT095c00nKTtWCQkkPS5zbi1pV09lOS1pLk1XWk16KCc5ZT1NJyk7VgkJJD0uc24taVdlSHgtaVdPZTkoJ3NPSF9lUT0uJyk7VlYJCWhoc0hzPXNlV3M1TT45PD49ZTxXTW4+OWU9ZVYJCSQ9LnNuLWk9ZTxXTW4+PlM+JD0uc24taTJPSEFzeC1pcz1NWSgnPWU8V01uJyw+J3NPSF9lUT0uJyk7VlYJCWhoc0hzPXNlV3M1TT45ZT1lVgkJJD0uc24taXM5TUg9cz1xXzJPV1FZSD5TPiQ9LnNuLWkyT0hBc3gtaXM9TVkoJ3M5TUg9cz1xJyw+J3NPSF9lUT0uJyk7VgkJJD0uc24taW49T3pNX25lVz0+Pj4+Pj5TPiQ9LnNuLWkyT0hBc3gtaXM9TVkoJ249T3pNX25lVz0nLD4nc09IX2VRPS4nKTtWCQkkPS5zbi1pbmVXPV9XTUh4PS4+Pj4+PlM+JD0uc24taTJPSEFzeC1pcz1NWSgnbmVXPV9XTUh4PS4nLD4nc09IX2VRPS4nKTtWCQkkPS5zbi1pCk9zSAkJCT4+PlM+JD0uc24taTJPSEFzeC1pcz1NWSgnCk9zSCcsPidzT0hfZVE9LicpO1ZWVgkJaGhzSHM9c2VXczVNPi5lbi4+WU09Lk85Pk9aPXNPSG4+KG8yenFaPSlWCQkkPS5zbi1pLmVuLl9ZTT0uTzk+Uz4kPS5zbi1pMk9IQXN4LWlzPU1ZKCcuZW4uX1lNPS5POScsPidzT0hfZVE9LicpO1YJCSQ9LnNuLWk5TUFlUVc9X3pPUUg5bj5TPiQ9LnNuLWkyT0hBc3gtaXM9TVkoJzlNQWVRVz1fek9RSDluJyw+J3NPSF9lUT0uJyk7VgkJJD0uc24taXplSDlPWV96T1FIOW4+Uz4kPS5zbi1pMk9IQXN4LWlzPU1ZKCd6ZUg5T1lfek9RSDluJyw+J3NPSF9lUT0uJyk7VgkJJD0uc24taVlzSF96T1FIOW4+Uz4kPS5zbi1pMk9IQXN4LWlzPU1ZKCdZc0hfek9RSDluJyw+J3NPSF9lUT0uJyk7VgkJJD0uc24taVllUl96T1FIOW4+Uz4kPS5zbi1pMk9IQXN4LWlzPU1ZKCdZZVJfek9RSDluJyw+J3NPSF9lUT0uJyk7VlZWCQloaHNIcz1zZVdzNU0+WU1ubmV4TW4+ZUg5Pk16ek96VgkJJD0uc24taVlNbm5leE1uPj4+PlM+ZXp6ZXEoKTtWCQkkPS5zbi1pTXp6T3puPj4+Pj4+Uz5lenplcSgpO1YJCSQ5TVdzWXM9TXpuX25PUXoyTT5TPiQ9LnNuLWkyT0hBc3gtaXM9TVkoJzlNV3NZcz1Nem5fbk9RejJNJyw+J3NPSF9lUT0uJyk7VlYJCWhoV09lOT49Lk0+TXp6T3o+OU1Xc1lNPU16bj5Ncz0uTXo+QXpPWT49Lk0+Mk9IQXN4PkFzV00+T3o+UW5NPn0uZT0nbj48TU1IPm5RWlpXc005Pj1PPkFPelk+Y2VXczllPXNPSFYJCXNBPigkOU1Xc1lzPU16bl9uT1F6Mk0+U1NTPidBT3pZX2NlV3M5ZT1zT0gnKVYJCV1WCQkJaGhXT2U5PnNIPjlNV3NZcz1Nem4+QXpPWT5BT3pZX2NlV3M5ZT1zT0hWCQkJaGg9Tz55TU1aPj0uc24+bnNZWldNPn1NJ1dXPldPZTk+PS5NPmNlV1FNPlFuc0h4PnpNQVdNMj1zT0g+bnNIMk0+PS5Nbk0+WnpPWk16PXNNbj5lek0+WnpPPU0yPU05VgkJCSQ9LnNuLWlXT2U5LWlXczx6ZXpxKCdBT3pZX2NlV3M5ZT1zT0gnKTtWCQkJJEFPellfY2VXczllPXNPSF8yV2Vubj5TPkhNfT5nTUFXTTI9c09IL1dlbm4oIi8zX3JPellfY2VXczllPXNPSCIpO1ZWCQkJJE16ek96X1p6TUFzUj5TPiRBT3pZX2NlV3M5ZT1zT0hfMldlbm4taXhNPW16T1pNej1xKCJfTXp6T3pfWnpNQXNSIik7VgkJCSRNenpPel9aek1Bc1ItaW5NPUYyMk1ubnM8V00oVGcgSyk7VgkJCSQ9LnNuLWlNenpPel9uPWV6PV85TVdzWXM9TXo+Uz4kTXp6T3pfWnpNQXNSLWl4TT02ZVdRTSgkPS5zbi1pQU96WV9jZVdzOWU9c09IKTtWCQkJJD0uc24taVlNbm5leE1fbj1lej1fOU1Xc1lzPU16PlM+JD0uc24taU16ek96X249ZXo9XzlNV3NZcz1NejtWVgkJCSRNenpPel9uUUFBc1I+Uz4kQU96WV9jZVdzOWU9c09IXzJXZW5uLWl4TT1tek9aTXo9cSgiX016ek96X25RQUFzUiIpO1YJCQkkTXp6T3pfblFBQXNSLWluTT1GMjJNbm5zPFdNKFRnIEspO1YJCQkkPS5zbi1pTXp6T3pfTUg5XzlNV3NZcz1Nej5TPiRNenpPel9uUUFBc1ItaXhNPTZlV1FNKCQ9LnNuLWlBT3pZX2NlV3M5ZT1zT0gpO1YJCQkkPS5zbi1pWU1ubmV4TV9NSDlfOU1Xc1lzPU16PlM+JD0uc24taU16ek96X01IOV85TVdzWXM9TXo7VgkJbFYJCU1Xbk1WCQldVgkJCWhoUW5NPjlNV3NZcz1Nem4+QXpPWT4yT0hBc3hWCQkJJD0uc24taVlNbm5leE1fbj1lej1fOU1Xc1lzPU16PlM+JD0uc24taTJPSEFzeC1pcz1NWSgnWU1ubmV4TV9uPWV6PV85TVdzWXM9TXonLD4nc09IX2VRPS4nKTtWCQkJJD0uc24taVlNbm5leE1fTUg5XzlNV3NZcz1Nej4+PlM+JD0uc24taTJPSEFzeC1pcz1NWSgnWU1ubmV4TV9NSDlfOU1Xc1lzPU16Jyw+J3NPSF9lUT0uJyk7VgkJCSQ9LnNuLWlNenpPel9uPWV6PV85TVdzWXM9TXo+Pj5TPiQ9LnNuLWkyT0hBc3gtaXM9TVkoJ016ek96X249ZXo9XzlNV3NZcz1NeicsPidzT0hfZVE9LicpO1YJCQkkPS5zbi1pTXp6T3pfTUg5XzlNV3NZcz1Nej4+Pj4+Uz4kPS5zbi1pMk9IQXN4LWlzPU1ZKCdNenpPel9NSDlfOU1Xc1lzPU16Jyw+J3NPSF9lUT0uJyk7VgkJbFZWVgkJaGhzSHM9c2VXczVNPk9Rej4uT095bj5PPApNMj1WCQkkPS5zbi1pX3NPSF8uT095bj5TPkhNfT5uPTkvV2VubjtWVgkJaGhXT2U5Pj0uTT48MnpxWj0+Mldlbm4+c0E+SE1NOU05VgkJc0E+KCQ9LnNuLWkuZW4uX1lNPS5POT5TUz4nPDJ6cVo9Jyk+XVYJCQlzQT4oJD0uc24taXplSDlPWV96T1FIOW4pVgkJCV1WCQkJCSR6ZUg5PlM+emVIOSgkPS5zbi1pWXNIX3pPUUg5biwkPS5zbi1pWWVSX3pPUUg5bik7VgkJCQkkek9RSDluPlM+ZXp6ZXEoJ3pPUUg5bic+U2k+JHplSDkpO1YJCQlsVgkJCU1Xbk1WCQkJXVYJCQkJJHpPUUg5bj5TPmV6emVxKCd6T1FIOW4nPlNpPiQ9LnNuLWk5TUFlUVc9X3pPUUg5bik7VgkJCWxWVgkJCSQ9LnNuLWlXT2U5LWlXczx6ZXpxKCc8MnpxWj0nLCR6T1FIOW4pO1YJCWxWVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdZTzlNV18yT0huPXpRMj1PeicpO1YJbFZWCWgqKlYJPio+dXNuMj5BUUgyPXNPSG5WCT4qVgk+Kj50ZW4uPlplbm59T3o5Pjo+dGVuLk1uPj0uTT5aZW5ufU96OT49Tz48TT5uPU96TTk+c0g+PS5NPjllPWU8ZW5NWFYJPio+dGVuLj5aZW5ufU96OT45PD46PlQuc24+QVFIMj1zT0g+PWV5TW4+ZT5aZW5ufU96OT5lSDk+Y2VXczllPU1uPnM9Vgk+Kj5leGVzSG49PmVIPk1IPXpxPnNIPj0uTT5Rbk16bj49ZTxXTVhWCT4qPnBlVz0+Oj5DTUhNemU9TW4+ZT56ZUg5T1k+bmVXPT5jZVdRTVhWCT4qVgk+Kj5AZVE9Lk96PnVlPS5NfVYJPipoVlYJaCoqVgk+Kj50ZW4uTW4+PS5NPlplbm59T3o5Pj1PPjxNPm49T3pNOT5zSD49Lk0+OWU9ZTxlbk1YVgk+KlYJPio+QHpNPVF6SD5jT3M5Vgk+Kj5AZVE9Lk96PnVlPS5NfVYJPioqaFYJWlE8V3MyPkFRSDI9c09IPi5lbi5fWmVubn1PejkoJFplbm59T3o5LD4kbmVXPVNBZVduTSw+JFFuTV9uLmUwX09jTXp6czlNU3JGSXBLKVYJXVYJCXNBPihNWVo9cSgkWmVubn1PejkpKVYJCV1WCQkJek09UXpIPnJGSXBLO1YJCWxWVgkJaGg8MnpxWj1WCQlzQT4oJFFuTV9uLmUwX09jTXp6czlNPlNTUz5yRklwSz4mJj4kPS5zbi1pLmVuLl9ZTT0uTzk+U1M+JzwyenFaPScpVgkJXVYJCQl6TT1Rekg+JD0uc24taTwyenFaPS1pLmVuLigkWmVubn1PejkpO1YJCWxWVlYJCXNBPigkPS5zbi1pbj1Pek1fbmVXPT4mJj4kbmVXPSlWCQldVgkJCXpNPVF6SD4+bi5lMCgkWmVubn1Pejk+WD4kbmVXPSk7VgkJbFYJCU1Xbk1WCQldVgkJCSRuZVc9PlM+JD0uc24taW5lVz0oKTtWCQkJek09UXpIPj4kbmVXPT5YPm5RPG49eihuLmUwKCRuZVc9Plg+JFplbm59T3o5KSw+YSw+LSQ9LnNuLWluZVc9X1dNSHg9Lik7VgkJbFYJbFZWCWgqKlYJPio+VC5zbj5BUUgyPXNPSD49ZXlNbj5lPlplbm59T3o5PmVIOT5jZVdzOWU9TW4+cz1WCT4qPmV4ZXNIbj0+ZUg+TUg9enE+c0g+PS5NPlFuTXpuPj1lPFdNWFYJPipWCT4qPkB6TT1Rekg+Y09zOVYJPio+QGVRPS5Pej51ZT0uTX1WCT4qKmhWCVpRPFdzMj5BUUgyPXNPSD4uZW4uX1plbm59T3o5Xzk8KCRzOSw+JFplbm59T3o5LD4kUW5NX24uZTBfT2NNenpzOU1TckZJcEspVgldVgkJc0E+KE1ZWj1xKCRzOSk+fHw+TVlaPXEoJFplbm59T3o5KSlWCQldVgkJCXpNPVF6SD5yRklwSztWCQlsVlYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignTVI9emVffS5Nek0nKTtWVgkJJHZRTXpxPlM+JD0uc24taTk8LWluTVdNMj0oJ1plbm59T3o5LD5uZVc9JylWCQk+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4taX0uTXpNKCdzOScsPiRzOSlWCQk+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4taVdzWXM9KDApVgkJPj4+Pj4+Pj4+Pj4+Pj4+Pj4+LWl4TT0oJD0uc24taT1lPFdNbmonUW5Nem4nZCk7VlYJCSQuZW4uX1plbm59T3o5Xzk8PlM+JHZRTXpxLWl6T30oKTtWVgkJc0E+KCR2UU16cS1pSFFZX3pPfW4oKT4hU1M+MClWCQldVgkJCXpNPVF6SD5yRklwSztWCQlsVlYJCWhoPjwyenFaPVYJCXNBPigkUW5NX24uZTBfT2NNenpzOU0+U1NTPnJGSXBLPiYmPiQ9LnNuLWkuZW4uX1lNPS5POT5TUz4nPDJ6cVo9JylWCQldVgkJCXNBPigkPS5zbi1pPDJ6cVo9LWljTXpzQXEoJFplbm59T3o5LCQuZW4uX1plbm59T3o5Xzk8LWlaZW5ufU96OSkpVgkJCV1WCQkJCXpNPVF6SD5UZyBLO1YJCQlsVlYJCQl6TT1Rekg+ckZJcEs7VgkJbFZWCQloaD5uLmUwVgkJc0E+KCQ9LnNuLWluPU96TV9uZVc9KVYJCV1WCQkJJDk8X1plbm59T3o5PlM+bi5lMCgkWmVubn1Pejk+WD4kLmVuLl9aZW5ufU96OV85PC1pbmVXPSk7VgkJbFYJCU1Xbk1WCQldVgkJCSRuZVc9PlM+blE8bj16KCQuZW4uX1plbm59T3o5Xzk8LWlaZW5ufU96OSw+YSw+JD0uc24taW5lVz1fV01IeD0uKTtWVgkJCSQ5PF9aZW5ufU96OT5TPj4kbmVXPT5YPm5RPG49eihuLmUwKCRuZVc9Plg+JFplbm59T3o5KSw+YSw+LSQ9LnNuLWluZVc9X1dNSHg9Lik7VgkJbFZWCQlzQSgkOTxfWmVubn1Pejk+U1M+JC5lbi5fWmVubn1PejlfOTwtaVplbm59T3o5KVYJCV1WCQkJek09UXpIPlRnIEs7VgkJbFYJCU1Xbk1WCQldVgkJCXpNPVF6SD5yRklwSztWCQlsVglsVlYJaCoqVgk+Kj5DTUhNemU9TW4+ZT56ZUg5T1k+bmVXPT5jZVdRTT5BT3o+QU96eE89PU1IPlplbm59T3o5bj5Pej5lSHE+Tz0uTXo+eU1xblg+IG5Nbj5wdEYwWFYJPipWCT4qPkB6TT1Rekg+Y09zOVYJPio+QGVRPS5Pej51ZT0uTX1WCT4qKmhWCVpRPFdzMj5BUUgyPXNPSD4uZW4uXzJPOU0oJFplbm59T3o5KVYJXVYJCXpNPVF6SD4kPS5zbi1pLmVuLl9aZW5ufU96OSgkWmVubn1PejksPnJGSXBLLD5UZyBLKTtWCWxWVgloKipWCT4qPkNNSE16ZT1Nbj5lPnplSDlPWT5uZVc9PmNlV1FNWFYJPipWCT4qPnBlVz0+eE1ITXplPXNPSD4yTzlNPj1leU1IPkF6T1k+Lj09Wm46aGh4cz0uUTxYMk9ZaHN6MlllUk1XV2haZW5ufU96OV8yT1laZT1oPFdPPGhZZW49TXpoV3M8aFplbm59T3o5WFouWlYJPipWCT4qPkB6TT1Rekg+Y09zOVYJPio+QGVRPS5Pej5GSD0uT0hxPnJNenpNemVWCT4qKmhWCVpRPFdzMj5BUUgyPXNPSD5uZVc9KClWCV1WVgkJJHplfV9uZVc9X1dNSD5TPjBbO1ZWPgkJJDxRQUFNej5TPicnO1Y+Pj4+Pj4+PiQ8UUFBTXpfY2VXczk+Uz5BZVduTTtWVj4+Pj4+Pj4+c0E+KEFRSDI9c09IX01Sc249bignWTJ6cVo9XzJ6TWU9TV9zYycpPiYmPiE5TUFzSE05KCdtdEZJRkVDS2cnKSk+XVY+Pj4+Pj4+Pj4+Pj4kPFFBQU16PlM+WTJ6cVo9XzJ6TWU9TV9zYygkemV9X25lVz1fV01ILD51L2dibVRfNEs2XyBnRkU0N3UpO1Y+Pj4+Pj4+Pj4+Pj5zQT4oJDxRQUFNeik+XVY+Pj4+Pj4+Pj4+Pj4+Pj4+JDxRQUFNel9jZVdzOT5TPj16UU07Vj4+Pj4+Pj4+Pj4+PmxWPj4+Pj4+Pj5sVlY+Pj4+Pj4+PnNBPighJDxRQUFNel9jZVdzOT4mJj5BUUgyPXNPSF9NUnNuPW4oJ09aTUhubldfemVIOU9ZX1puTVE5T188cT1NbicpKT5dVj4+Pj4+Pj4+Pj4+PiQ8UUFBTXo+Uz5PWk1Ibm5XX3plSDlPWV9abk1ROU9fPHE9TW4oJHplfV9uZVc9X1dNSCk7Vj4+Pj4+Pj4+Pj4+PnNBPigkPFFBQU16KT5dVj4+Pj4+Pj4+Pj4+Pj4+Pj4kPFFBQU16X2NlV3M5PlM+PXpRTTtWPj4+Pj4+Pj4+Pj4+bFY+Pj4+Pj4+PmxWVj4+Pj4+Pj4+c0E+KCEkPFFBQU16X2NlV3M5PiYmPkBzbl96TWU5ZTxXTSgnaDlNY2hRemVIOU9ZJykpPl1WPj4+Pj4+Pj4+Pj4+JEE+Uz5BT1pNSCgnaDlNY2hRemVIOU9ZJyw+J3onKTtWPj4+Pj4+Pj4+Pj4+JHpNZTk+Uz5uPXpXTUgoJDxRQUFNeik7Vj4+Pj4+Pj4+Pj4+Pn0uc1dNPigkek1lOT5CPiR6ZX1fbmVXPV9XTUgpPl1WPj4+Pj4+Pj4+Pj4+Pj4+PiQ8UUFBTXo+WFM+QXpNZTkoJEEsPiR6ZX1fbmVXPV9XTUg+LT4kek1lOSk7Vj4+Pj4+Pj4+Pj4+Pj4+Pj4kek1lOT5TPm49eldNSCgkPFFBQU16KTtWPj4+Pj4+Pj4+Pj4+bFY+Pj4+Pj4+Pj4+Pj5BMldPbk0oJEEpO1Y+Pj4+Pj4+Pj4+Pj5zQT4oJHpNZTk+aVM+JHplfV9uZVc9X1dNSCk+XVY+Pj4+Pj4+Pj4+Pj4+Pj4+JDxRQUFNel9jZVdzOT5TPj16UU07Vj4+Pj4+Pj4+Pj4+PmxWPj4+Pj4+Pj5sVlY+Pj4+Pj4+PnNBPighJDxRQUFNel9jZVdzOT58fD5uPXpXTUgoJDxRQUFNeik+Qj4kemV9X25lVz1fV01IKT5dVj4+Pj4+Pj4+Pj4+PiQ8Vz5TPm49eldNSCgkPFFBQU16KTtWPj4+Pj4+Pj4+Pj4+QU96Pigkcz5TPmE7PiRzPkI+JHplfV9uZVc9X1dNSDs+JHMrKyk+XVY+Pj4+Pj4+Pj4+Pj4+Pj4+c0E+KCRzPkI+JDxXKT5dVj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+JDxRQUFNemokc2Q+Uz4kPFFBQU16aiRzZD5ePjIueihZPV96ZUg5KGEsPmtMTCkpO1Y+Pj4+Pj4+Pj4+Pj4+Pj4+bD5NV25NPl1WPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4kPFFBQU16PlhTPjIueihZPV96ZUg5KGEsPmtMTCkpO1Y+Pj4+Pj4+Pj4+Pj4+Pj4+bFY+Pj4+Pj4+Pj4+Pj5sVj4+Pj4+Pj4+bFZWPj4+Pj4+Pj4kbmVXPT5TPiQ8UUFBTXo7VlY+Pj4+Pj4+PmhoPk1IMk85TT5uPXpzSHg+fXM9Lj49Lk0+b2VuTVtVPmNlenNlSD0+UW5NOT48cT4yenFaPVY+Pj4+Pj4+PiQ8ZW5NW1VfOXN4cz1uPj4+Uz4nRm8vNEtyQ3QzOEdJdUU3bXdncFQgNntEYk5lPDI5TUF4LnMKeVdZSE9adnpuPVFjfVJxNWEwa0pVTFsxZlAraCc7Vj4+Pj4+Pj4+JDwyenFaPVtVXzlzeHM9bj5TPidYaEZvLzRLckN0MzhHSXVFN213Z3BUIDZ7RGJOZTwyOU1BeC5zCnlXWUhPWnZ6bj1RY31ScTVhMGtKVUxbMWZQJztWPj4+Pj4+Pj4kPGVuTVtVX249enNIeD4+PlM+PGVuTVtVX01IMk85TSgkbmVXPSk7Vj4+Pj4+Pj4+JG5lVz0+Uz5uPXo9eih6PXpzWSgkPGVuTVtVX249enNIeCw+J1MnKSw+JDxlbk1bVV85c3hzPW4sPiQ8MnpxWj1bVV85c3hzPW4pO1ZWCT4+Pj4kbmVXPT5TPm5RPG49eigkbmVXPSw+YSw+JD0uc24taW5lVz1fV01IeD0uKTtWVlYJCXpNPVF6SD4kbmVXPTtWVglsVlYJaCoqVgk+Kj5GMj1zY2U9c09IPkFRSDI9c09IblYJPipWCT4qPkYyPXNjZT1NPjo+NmVXczllPU1uPmVIOT56TVlPY01uPmUyPXNjZT1zT0g+Mk85TVhWCT4qPjRNZTI9c2NlTT46PiBaOWU9TW4+ZT5Rbk16bj56T30+fXM9Lj5lSD5lMj1zY2U9c09IPjJPOU1YVgk+KlYJPio+QGVRPS5Pej51ZT0uTX1WCT4qaFZWCWgqKlYJPio+ZTI9c2NlPU1WCT4qVgk+Kj5Aek09UXpIPmNPczlWCT4qPkBlUT0uT3o+dWU9Lk19Vgk+KipoVglaUTxXczI+QVFIMj1zT0g+ZTI9c2NlPU0oJHM5LD4kMk85TT5TPkFlV25NKVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignWnpNX2UyPXNjZT1NJyk7VlYJCXNBPigkMk85TT4hU1M+ckZJcEspVgkJXVYJCQkkdlFNenE+Uz4kPS5zbi1pOTwtaW5NV00yPSgkPS5zbi1pczlNSD1zPXFfMk9XUVlIKVYJCQk+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4taX0uTXpNKCdlMj1zY2U9c09IXzJPOU0nLD4kMk85TSlWCQkJPj4+Pj4+Pj4+Pj4+Pj4+Pj4+LWlXc1lzPSgwKVYJCQk+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4taXhNPSgkPS5zbi1pPWU8V01uaidRbk16bidkKTtWVgkJCSR6TW5RVz0+Uz4kdlFNenEtaXpPfSgpO1ZWCQkJc0E+KCR2UU16cS1pSFFZX3pPfW4oKT4hU1M+MClWCQkJXVYJCQkJJD0uc24taT16c3h4TXpfTWNNSD1uKGV6emVxKCdaT249X2UyPXNjZT1NJyw+J1pPbj1fZTI9c2NlPU1fUUhuUTIyTW5uQVFXJykpO1YJCQkJJD0uc24taW5NPV9NenpPeignZTI9c2NlPU1fUUhuUTIyTW5uQVFXJyk7VgkJCQl6TT1Rekg+ckZJcEs7VgkJCWxWVgkJCSRzOU1IPXM9cT5TPiR6TW5RVz0taV0kPS5zbi1pczlNSD1zPXFfMk9XUVlIbDtWVgkJCSQ5ZT1lPlM+ZXp6ZXEoVgkJCT4+Pj4nZTI9c2NlPXNPSF8yTzlNJz5TaT5FIElJLFYJCQk+Pj4+J2UyPXNjTSc+Pj4+Pj4+Pj4+U2k+MFYJCQkpO1ZWCQkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdNUj16ZV99Lk16TScpO1YJCQkkPS5zbi1pOTwtaVFaOWU9TSgkPS5zbi1pPWU8V01uaidRbk16bidkLD4kOWU9ZSw+ZXp6ZXEoJD0uc24taXM5TUg9cz1xXzJPV1FZSD5TaT4kczlNSD1zPXEpKTtWCQlsVgkJTVduTVYJCV1WCQkJJDllPWU+Uz5lenplcShWCQkJPj4+PidlMj1zY2U9c09IXzJPOU0nPlNpPkUgSUksVgkJCT4+Pj4nZTI9c2NNJz4+Pj4+Pj4+Pj5TaT4wVgkJCSk7VlZWCQkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdNUj16ZV99Lk16TScpO1YJCQkkPS5zbi1pOTwtaVFaOWU9TSgkPS5zbi1pPWU8V01uaidRbk16bidkLD4kOWU9ZSw+ZXp6ZXEoJ3M5Jz5TaT4kczkpKTtWCQlsVlZWCQkkek09UXpIPlM+JD0uc24taTk8LWllQUFNMj1NOV96T31uKCk+U1M+MDtWCQlzQT4oJHpNPVF6SClWCQldVgkJCSQ9LnNuLWk9enN4eE16X01jTUg9bihlenplcSgnWk9uPV9lMj1zY2U9TScsPidaT249X2UyPXNjZT1NX25RMjJNbm5BUVcnKSk7VgkJCSQ9LnNuLWluTT1fWU1ubmV4TSgnZTI9c2NlPU1fblEyMk1ubkFRVycpO1YJCWxWCQlNV25NVgkJXVYJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oZXp6ZXEoJ1pPbj1fZTI9c2NlPU0nLD4nWk9uPV9lMj1zY2U9TV9RSG5RMjJNbm5BUVcnKSk7VgkJCSQ9LnNuLWluTT1fTXp6T3ooJ2UyPXNjZT1NX1FIblEyMk1ubkFRVycpO1YJCWxWVlYJCXpNPVF6SD4kek09UXpIO1YJbFZWVgloKipWCT4qPjRNZTI9c2NlPU1WCT4qVgk+Kj5Aek09UXpIPmNPczlWCT4qPkBlUT0uT3o+dWU9Lk19Vgk+KipoVglaUTxXczI+QVFIMj1zT0g+OU1lMj1zY2U9TSgkczk+Uz5FIElJKVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignOU1lMj1zY2U9TScpO1ZWCQlzQT4oIXNubk09KCRzOSkpVgkJXVYJCQkkPS5zbi1pbk09X016ek96KCc5TWUyPXNjZT1NX1FIblEyMk1ubkFRVycpO1YJCQl6TT1Rekg+ckZJcEs7VgkJbFZWCQkkZTI9c2NlPXNPSF8yTzlNPj4+Pj4+PlM+bi5lMChZOUwoWXMyek89c1lNKCkpKTtWCQkkPS5zbi1pZTI9c2NlPXNPSF8yTzlNPlM+JGUyPXNjZT1zT0hfMk85TTtWVgkJJDllPWU+Uz5lenplcShWCQk+Pj4+J2UyPXNjZT1zT0hfMk85TSc+U2k+JGUyPXNjZT1zT0hfMk85TSxWCQk+Pj4+J2UyPXNjTSc+Pj4+Pj4+Pj4+U2k+YVYJCSk7VlYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignTVI9emVffS5Nek0nKTtWCQkkPS5zbi1pOTwtaVFaOWU9TSgkPS5zbi1pPWU8V01uaidRbk16bidkLD4kOWU9ZSw+ZXp6ZXEoJ3M5Jz5TaT4kczkpKTtWVgkJJHpNPVF6SD5TPiQ9LnNuLWk5PC1pZUFBTTI9TTlfek99bigpPlNTPjA7VgkJc0E+KCR6TT1RekgpVgkJCSQ9LnNuLWluTT1fWU1ubmV4TSgnOU1lMj1zY2U9TV9uUTIyTW5uQVFXJyk7VgkJTVduTVYJCQkkPS5zbi1pbk09X016ek96KCc5TWUyPXNjZT1NX1FIblEyMk1ubkFRVycpO1ZWCQl6TT1Rekg+JHpNPVF6SDtWCWxWVglaUTxXczI+QVFIMj1zT0g+MldNZXpfQU96eE89PU1IX1plbm59T3o5XzJPOU0oJDJPOU0pPl1WVgkJc0E+KE1ZWj1xKCQyTzlNKSlWCQldVgkJCXpNPVF6SD5yRklwSztWCQlsVlYJCSQ9LnNuLWk5PC1pfS5Nek0oJ0FPenhPPT1NSF9aZW5ufU96OV8yTzlNJyw+JDJPOU0pO1ZWCQlzQT4oJD0uc24taTk8LWkyT1FIPV9lV1dfek1uUVc9bigkPS5zbi1pPWU8V01uaidRbk16bidkKT5pPmEpVgkJXVYJCQkkOWU9ZT5TPmV6emVxKFYJCQk+Pj4+J0FPenhPPT1NSF9aZW5ufU96OV8yTzlNJz5TaT5FIElJLFYJCQk+Pj4+J0FPenhPPT1NSF9aZW5ufU96OV89c1lNJz5TaT5FIElJVgkJCSk7VlYJCQkkPS5zbi1pOTwtaVFaOWU9TSgkPS5zbi1pPWU8V01uaidRbk16bidkLD4kOWU9ZSw+ZXp6ZXEoJ0FPenhPPT1NSF9aZW5ufU96OV8yTzlNJz5TaT4kMk85TSkpO1ZWCQkJek09UXpIPlRnIEs7VgkJbFZWCQl6TT1Rekg+ckZJcEs7VglsVlYJaCoqVgk+Kj56TW5NPT5aZW5ufU96OVYJPipWCT4qPkB6TT1Rekg+PE9PV1YJPio+QGVRPS5Pej51ZT0uTX1WCT4qKmhWCVpRPFdzMj5BUUgyPXNPSD56TW5NPV9aZW5ufU96OSgkczlNSD1zPXEsPiRITX0pPl1WCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ1p6TV8yLmVIeE1fWmVubn1PejknKTtWVgkJc0E+KCEkPS5zbi1pczlNSD1zPXFfMi5NMnkoJHM5TUg9cz1xKSk+XVYJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oZXp6ZXEoJ1pPbj1fMi5lSHhNX1plbm59T3o5Jyw+J1pPbj1fMi5lSHhNX1plbm59T3o5X1FIblEyMk1ubkFRVycpKTtWCQkJek09UXpIPnJGSXBLO1YJCWxWVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdNUj16ZV99Lk16TScpO1ZWCQkkdlFNenE+Uz4kPS5zbi1pOTwtaW5NV00yPSgnczksPlplbm59T3o5LD5uZVc9JylWCQk+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4taX0uTXpNKCQ9LnNuLWlzOU1IPXM9cV8yT1dRWUgsPiRzOU1IPXM9cSlWCQk+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4taVdzWXM9KDApVgkJPj4+Pj4+Pj4+Pj4+Pj4+Pj4+LWl4TT0oJD0uc24taT1lPFdNbmonUW5Nem4nZCk7VlYJCXNBPigkdlFNenEtaUhRWV96T31uKCk+IVNTPjApVgkJXVYJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oZXp6ZXEoJ1pPbj1fMi5lSHhNX1plbm59T3o5Jyw+J1pPbj1fMi5lSHhNX1plbm59T3o5X1FIblEyMk1ubkFRVycpKTtWCQkJJD0uc24taW5NPV9NenpPeignWmVubn1PejlfMi5lSHhNX1FIblEyMk1ubkFRVycpO1YJCQl6TT1Rekg+ckZJcEs7VgkJbFZWCQkkek1uUVc9PlM+JHZRTXpxLWl6T30oKTtWVgkJJEhNfT5TPiQ9LnNuLWkuZW4uX1plbm59T3o5KCRITX0sPiR6TW5RVz0taW5lVz0pO1ZWCQloaG49T3pNPj0uTT5ITX0+WmVubn1Pejk+ZUg5PnpNbk09Pj0uTT56TVlNWTxNej4yTzlNPm5PPmVXVz56TVlNWTxNek05PnNIbj1lSDJNbj4uZWNNPj1PPnpNLVdPeHNIVgkJaGhlV25PPjJXTWV6Pj0uTT5BT3p4Tz09TUg+WmVubn1Pejk+Mk85TVYJCSQ5ZT1lPlM+ZXp6ZXEoVgkJPj4+PidaZW5ufU96OSc+U2k+JEhNfSxWCQk+Pj4+J3pNWU1ZPE16XzJPOU0nPlNpPkUgSUksVgkJPj4+PidBT3p4Tz09TUhfWmVubn1PejlfMk85TSc+U2k+RSBJSSxWCQk+Pj4+J0FPenhPPT1NSF9aZW5ufU96OV89c1lNJz5TaT5FIElJLFYJCSk7VlYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignTVI9emVffS5Nek0nKTtWCQkkPS5zbi1pOTwtaVFaOWU9TSgkPS5zbi1pPWU8V01uaidRbk16bidkLD4kOWU9ZSw+ZXp6ZXEoJD0uc24taXM5TUg9cz1xXzJPV1FZSD5TaT4kczlNSD1zPXEpKTtWVgkJJHpNPVF6SD5TPiQ9LnNuLWk5PC1pZUFBTTI9TTlfek99bigpPlNTPjA7VgkJc0E+KCR6TT1RekgpVgkJXVYJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oZXp6ZXEoJ1pPbj1fMi5lSHhNX1plbm59T3o5Jyw+J1pPbj1fMi5lSHhNX1plbm59T3o5X25RMjJNbm5BUVcnKSk7VgkJCSQ9LnNuLWluTT1fWU1ubmV4TSgnWmVubn1PejlfMi5lSHhNX25RMjJNbm5BUVcnKTtWCQlsVgkJTVduTVYJCV1WCQkJJD0uc24taT16c3h4TXpfTWNNSD1uKGV6emVxKCdaT249XzIuZUh4TV9aZW5ufU96OScsPidaT249XzIuZUh4TV9aZW5ufU96OV9RSG5RMjJNbm5BUVcnKSk7VgkJCSQ9LnNuLWluTT1fTXp6T3ooJ1plbm59T3o5XzIuZUh4TV9RSG5RMjJNbm5BUVcnKTtWCQlsVlYJCXpNPVF6SD4kek09UXpIO1YJbFZWCWgqKlYJPio+Mi5lSHhNPlplbm59T3o5Vgk+KlYJPio+QHpNPVF6SD48T09XVgk+Kj5AZVE9Lk96PnVlPS5NfVYJPioqaFYJWlE8V3MyPkFRSDI9c09IPjIuZUh4TV9aZW5ufU96OSgkczlNSD1zPXEsPiRPVzksPiRITX0pVgldVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdaek1fMi5lSHhNX1plbm59T3o5Jyk7VlYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignTVI9emVffS5Nek0nKTtWVgkJJHZRTXpxPlM+JD0uc24taTk8LWluTVdNMj0oJ3M5LD5aZW5ufU96OSw+bmVXPScpVgkJPj4+Pj4+Pj4+Pj4+Pj4+Pj4+LWl9Lk16TSgkPS5zbi1pczlNSD1zPXFfMk9XUVlILD4kczlNSD1zPXEpVgkJPj4+Pj4+Pj4+Pj4+Pj4+Pj4+LWlXc1lzPSgwKVYJCT4+Pj4+Pj4+Pj4+Pj4+Pj4+Pi1peE09KCQ9LnNuLWk9ZTxXTW5qJ1FuTXpuJ2QpO1ZWCQlzQT4oJHZRTXpxLWlIUVlfek99bigpPiFTUz4wKVYJCV1WCQkJJD0uc24taT16c3h4TXpfTWNNSD1uKGV6emVxKCdaT249XzIuZUh4TV9aZW5ufU96OScsPidaT249XzIuZUh4TV9aZW5ufU96OV9RSG5RMjJNbm5BUVcnKSk7VgkJCSQ9LnNuLWluTT1fTXp6T3ooJ1plbm59T3o5XzIuZUh4TV9RSG5RMjJNbm5BUVcnKTtWCQkJek09UXpIPnJGSXBLO1YJCWxWVgkJJFFuTXo+Uz4kdlFNenEtaXpPfSgpO1ZWCQkkT1c5X1plbm59T3o5X1llPTIuTW4+Uz4kPS5zbi1pLmVuLl9aZW5ufU96OV85PCgkUW5Nei1pczksPiRPVzkpO1ZWCQlzQT4oJE9XOV9aZW5ufU96OV9ZZT0yLk1uPlNTUz5UZyBLKVYJCV1WCQkJaGhuPU96TT49Lk0+SE19Plplbm59T3o5PmVIOT56TW5NPT49Lk0+ek1ZTVk8TXo+Mk85TT5uTz5lV1c+ek1ZTVk8TXpNOT5zSG49ZUgyTW4+LmVjTT49Tz56TS1XT3hzSFYJCQkkLmVuLk05X0hNfV9aZW5ufU96OT4+Uz4kPS5zbi1pLmVuLl9aZW5ufU96OSgkSE19LD4kUW5Nei1pbmVXPSk7VgkJCSQ5ZT1lPlM+ZXp6ZXEoVgkJCT4+Pj4nWmVubn1PejknPlNpPiQuZW4uTTlfSE19X1plbm59T3o5LFYJCQk+Pj4+J3pNWU1ZPE16XzJPOU0nPlNpPkUgSUksVgkJCSk7VlYJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ01SPXplX30uTXpNJyk7VlYJCQkkblEyMk1ubkFRV1dxXzIuZUh4TTlfWmVubn1Pejlfc0hfOTw+Uz4kPS5zbi1pOTwtaVFaOWU9TSgkPS5zbi1pPWU8V01uaidRbk16bidkLD4kOWU9ZSw+ZXp6ZXEoJD0uc24taXM5TUg9cz1xXzJPV1FZSD5TaT4kczlNSD1zPXEpKTtWCQkJc0E+KCRuUTIyTW5uQVFXV3FfMi5lSHhNOV9aZW5ufU96OV9zSF85PClWCQkJXVYJCQkJJD0uc24taT16c3h4TXpfTWNNSD1uKGV6emVxKCdaT249XzIuZUh4TV9aZW5ufU96OScsPidaT249XzIuZUh4TV9aZW5ufU96OV9uUTIyTW5uQVFXJykpO1YJCQkJJD0uc24taW5NPV9ZTW5uZXhNKCdaZW5ufU96OV8yLmVIeE1fblEyMk1ubkFRVycpO1YJCQlsVgkJCU1Xbk1WCQkJXVYJCQkJJD0uc24taT16c3h4TXpfTWNNSD1uKGV6emVxKCdaT249XzIuZUh4TV9aZW5ufU96OScsPidaT249XzIuZUh4TV9aZW5ufU96OV9RSG5RMjJNbm5BUVcnKSk7VgkJCQkkPS5zbi1pbk09X016ek96KCdaZW5ufU96OV8yLmVIeE1fUUhuUTIyTW5uQVFXJyk7VgkJCWxWVgkJCXpNPVF6SD4kblEyMk1ubkFRV1dxXzIuZUh4TTlfWmVubn1Pejlfc0hfOTw7VgkJbFZWCQkkPS5zbi1pbk09X016ek96KCdaZW5ufU96OV8yLmVIeE1fUUhuUTIyTW5uQVFXJyk7VgkJek09UXpIPnJGSXBLO1YJbFZWCWgqKlYJPio+Ly5NMnluPlFuTXpIZVlNVgk+KlYJPio+QHpNPVF6SD48T09XVgk+Kj5AZVE9Lk96PnVlPS5NfVYJPioqaFYJWlE8V3MyPkFRSDI9c09IPlFuTXpIZVlNXzIuTTJ5KCRRbk16SGVZTT5TPicnKVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignUW5NekhlWU1fMi5NMnknKTtWVgkJc0E+KE1ZWj1xKCRRbk16SGVZTSkpVgkJXVYJCQl6TT1Rekg+ckZJcEs7VgkJbFZWCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ01SPXplX30uTXpNJyk7VlYJCXpNPVF6SD4kPS5zbi1pOTwtaX0uTXpNKCdRbk16SGVZTScsPiRRbk16SGVZTSlWCQk+Pj4+Pj4+Pj4+Pj4+Pj4+LWkyT1FIPV9lV1dfek1uUVc9bigkPS5zbi1pPWU8V01uaidRbk16bidkKT5pPmE7VglsVlYJaCoqVgk+Kj4vLk0yeW4+TVllc1dWCT4qVgk+Kj5Aek09UXpIPjxPT1dWCT4qPkBlUT0uT3o+dWU9Lk19Vgk+KipoVglaUTxXczI+QVFIMj1zT0g+TVllc1dfMi5NMnkoJE1ZZXNXPlM+JycpVgldVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdNWWVzV18yLk0yeScpO1ZWCQlzQT4oTVlaPXEoJE1ZZXNXKSlWCQldVgkJCXpNPVF6SD5yRklwSztWCQlsVlYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignTVI9emVffS5Nek0nKTtWVgkJek09UXpIPiQ9LnNuLWk5PC1pfS5Nek0oJ01ZZXNXJyw+JE1ZZXNXKVYJCT4+Pj4+Pj4+Pj4+Pj4+Pj4taTJPUUg9X2VXV196TW5RVz1uKCQ9LnNuLWk9ZTxXTW5qJ1FuTXpuJ2QpPmk+YTtWCWxWVgloKipWCT4qPjM5TUg9cz1xPjIuTTJ5Vgk+KlYJPio+QHpNPVF6SD48T09XVgk+Kj5AZVE9Lk96PnVlPS5NfVYJPioqaFYJWlE8V3MyPkFRSDI9c09IPnM5TUg9cz1xXzIuTTJ5KCRzOU1IPXM9cT5TPicnKVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignczlNSD1zPXFfMi5NMnknKTtWVgkJc0E+KE1ZWj1xKCRzOU1IPXM9cSkpVgkJXVYJCQl6TT1Rekg+ckZJcEs7VgkJbFZWCQl6TT1Rekg+JD0uc24taTk8LWl9Lk16TSgkPS5zbi1pczlNSD1zPXFfMk9XUVlILD4kczlNSD1zPXEpVgkJPj4+Pj4+Pj4+Pj4+Pj4+Pi1pMk9RSD1fZVdXX3pNblFXPW4oJD0uc24taT1lPFdNbmonUW5Nem4nZCk+aT5hO1YJbFZWCWgqKlYJPio+M0huTXo9PmU+QU96eE89PU1IPlplbm59T3o5PnlNcVhWCT4qVgk+Kj5Aek09UXpIPjxPT1dWCT4qPkBlUT0uT3o+dWU9Lk19Vgk+Kj5AUVo5ZT1NOT5ncWVIVgk+Kj5AUVo5ZT1NOT5Ma2VlVUxbTU1BZjxbYWU5WzFMVTxKMEE8OTIyMTE8PFYJPioqaFYJWlE8V3MyPkFRSDI9c09IPkFPenhPPT1NSF9aZW5ufU96OSgkczlNSD1zPXEpVgldVgkJc0E+KE1ZWj1xKCRzOU1IPXM9cSkpVgkJXVYJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oZXp6ZXEoJ1pPbj1fQU96eE89PU1IX1plbm59T3o5Jyw+J1pPbj1fQU96eE89PU1IX1plbm59T3o5X1FIblEyMk1ubkFRVycpKTtWCQkJek09UXpIPnJGSXBLO1YJCWxWVgkJaGhGV1c+bk9ZTT5ZT3pNPnplSDlPWUhNbm5WCQkkZTI9c2NlPXNPSF8yTzlNX1plej0+Uz4iIjtWCQlzQShBUUgyPXNPSF9NUnNuPW4oIk9aTUhubldfemVIOU9ZX1puTVE5T188cT1NbiIpKT5dVgkJCSRlMj1zY2U9c09IXzJPOU1fWmV6PT5TPk9aTUhubldfemVIOU9ZX1puTVE5T188cT1Nbigwa2YpO1YJCWxWVgkJQU96KCRzU2E7JHNCMGFrVTskcysrKT5dVgkJCSRlMj1zY2U9c09IXzJPOU1fWmV6PT5TPm4uZTAoJGUyPXNjZT1zT0hfMk85TV9aZXo9Plg+WT1femVIOSgpPlg+WXMyek89c1lNKCkpO1YJCWxWVgkJJHlNcT5TPiQ9LnNuLWkuZW4uXzJPOU0oJGUyPXNjZT1zT0hfMk85TV9aZXo9WCRzOU1IPXM9cSk7VlYJCSQ9LnNuLWlBT3p4Tz09TUhfWmVubn1PejlfMk85TT5TPiR5TXE7VlYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignTVI9emVffS5Nek0nKTtWVgkJJFFaOWU9TT5TPmV6emVxKFYJCT4+Pj4nQU96eE89PU1IX1plbm59T3o5XzJPOU0nPlNpPiR5TXEsVgkJPj4+PidBT3p4Tz09TUhfWmVubn1PejlfPXNZTSc+U2k+PXNZTSgpVgkJKTtWVgkJJD0uc24taTk8LWlRWjllPU0oJD0uc24taT1lPFdNbmonUW5Nem4nZCw+JFFaOWU9TSw+ZXp6ZXEoJD0uc24taXM5TUg9cz1xXzJPV1FZSD5TaT4kczlNSD1zPXEpKTtWVgkJJHpNPVF6SD5TPiQ9LnNuLWk5PC1pZUFBTTI9TTlfek99bigpPlNTPjA7VlYJCXNBPigkek09UXpIKVYJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oZXp6ZXEoJ1pPbj1fQU96eE89PU1IX1plbm59T3o5Jyw+J1pPbj1fQU96eE89PU1IX1plbm59T3o5X25RMjJNbm5BUVcnKSk7VgkJTVduTVYJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oZXp6ZXEoJ1pPbj1fQU96eE89PU1IX1plbm59T3o5Jyw+J1pPbj1fQU96eE89PU1IX1plbm59T3o5X1FIblEyMk1ubkFRVycpKTtWVgkJek09UXpIPiR6TT1Rekg7VglsVlYJaCoqVgk+Kj5yT3p4Tz09TUg+bWVubn1Pejk+L09ZWldNPU1WCT4qVgk+Kj5Aek09UXpIPm49enNIeFYJPio+QGVRPS5Pej51ZT0uTX1WCT4qKmhWCVpRPFdzMj5BUUgyPXNPSD5BT3p4Tz09TUhfWmVubn1PejlfMk9ZWldNPU0oJDJPOU0sPiRuZVc9U3JGSXBLKVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignWnpNX0FPenhPPT1NSF9aZW5ufU96OV8yT1laV009TScpO1ZWCQlzQT4oTVlaPXEoJDJPOU0pKVYJCV1WCQkJJD0uc24taT16c3h4TXpfTWNNSD1uKGV6emVxKCdaT249X0FPenhPPT1NSF9aZW5ufU96OV8yT1laV009TScsPidaT249X0FPenhPPT1NSF9aZW5ufU96OV8yT1laV009TV9RSG5RMjJNbm5BUVcnKSk7VgkJCXpNPVF6SD5yRklwSztWCQlsVlYJCSRaek9Bc1dNPlM+JD0uc24taX0uTXpNKCdBT3p4Tz09TUhfWmVubn1PejlfMk85TScsPiQyTzlNKS1pUW5Nem4oKS1pek99KCk7PmhoWmVubj49Lk0+Mk85TT49Tz5aek9Bc1dNVlYJCXNBPigkWnpPQXNXTSk+XVZWCQkJc0E+KCQ9LnNuLWkyT0hBc3gtaXM9TVkoJ0FPenhPPV9aZW5ufU96OV9NUlpzemU9c09IJyw+J3NPSF9lUT0uJyk+aT5hKT5dVgkJCQloaHVleU0+blF6TT5zPT5zbkgnPT5NUlpzek05VgkJCQkkTVJac3plPXNPSD5TPiQ9LnNuLWkyT0hBc3gtaXM9TVkoJ0FPenhPPV9aZW5ufU96OV9NUlpzemU9c09IJyw+J3NPSF9lUT0uJyk7VgkJCQlzQT4oPXNZTSgpPi0+JFp6T0FzV00taUFPenhPPT1NSF9aZW5ufU96OV89c1lNPmk+JE1SWnN6ZT1zT0gpPl1WCQkJCQloaHM9Pi5lbj5NUlpzek05VgkJCQkJJD0uc24taW5NPV9NenpPeignQU96eE89X1plbm59T3o5X01SWnN6TTknKTtWCQkJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oZXp6ZXEoJ1pPbj1fQU96eE89PU1IX1plbm59T3o5XzJPWVpXTT1NJyw+J1pPbj1fQU96eE89PU1IX1plbm59T3o5XzJPWVpXTT1NX1FIblEyMk1ubkFRVycpKTtWCQkJCQl6TT1Rekg+ckZJcEs7VgkJCQlsVgkJCWxWVgkJCSRaZW5ufU96OT5TPiQ9LnNuLWluZVc9KCk7VlYJCQkkOWU9ZT5TPmV6emVxKFYJCQk+Pj4+J1plbm59T3o5Jz4+Pj4+Pj4+Pj4+Pj4+Pj5TaT4kPS5zbi1pLmVuLl9aZW5ufU96OSgkWmVubn1PejksPiRuZVc9KSxWCQkJPj4+PidBT3p4Tz09TUhfWmVubn1PejlfMk85TSc+U2k+RSBJSSxWCQkJPj4+PidlMj1zY00nPj4+Pj4+Pj4+Pj4+Pj4+Pj4+U2k+MCxWCQkJPik7VlYJCQkkPS5zbi1pOTwtaVFaOWU9TSgkPS5zbi1pPWU8V01uaidRbk16bidkLD4kOWU9ZSw+ZXp6ZXEoJ0FPenhPPT1NSF9aZW5ufU96OV8yTzlNJz5TaT4kMk85TSkpO1ZWCQkJJD0uc24taT16c3h4TXpfTWNNSD1uKGV6emVxKCdaT249X0FPenhPPT1NSF9aZW5ufU96OV8yT1laV009TScsPidaT249X0FPenhPPT1NSF9aZW5ufU96OV8yT1laV009TV9uUTIyTW5uQVFXJykpO1YJCQl6TT1Rekg+JFplbm59T3o5O1YJCWxWVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKGV6emVxKCdaT249X0FPenhPPT1NSF9aZW5ufU96OV8yT1laV009TScsPidaT249X0FPenhPPT1NSF9aZW5ufU96OV8yT1laV009TV9RSG5RMjJNbm5BUVcnKSk7VgkJek09UXpIPnJGSXBLO1YJbFZWCWgqKlYJPio+ek14c249TXpWCT4qVgk+Kj5Aek09UXpIPjxPT1dWCT4qPkBlUT0uT3o+dWU9Lk19Vgk+KipoVglaUTxXczI+QVFIMj1zT0g+ek14c249TXooJFFuTXpIZVlNLD4kWmVubn1PejksPiRNWWVzVyw+JGU5OXM9c09IZVdfOWU9ZT5TPmV6emVxKCksPiR4ek9RWm4+Uz5lenplcSgpKVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignWnpNX3pNeHNuPU16Jyk7VlYJCSRZZUhRZVdfZTI9c2NlPXNPSD5TPiQ9LnNuLWkyT0hBc3gtaXM9TVkoJ1llSFFlV19lMj1zY2U9c09IJyw+J3NPSF9lUT0uJyk7VlYJCXNBPigkPS5zbi1pczlNSD1zPXFfMk9XUVlIPlNTPidNWWVzVyc+JiY+JD0uc24taU1ZZXNXXzIuTTJ5KCRNWWVzVykpVgkJXVYJCQkkPS5zbi1pbk09X016ek96KCdlMjJPUUg9XzJ6TWU9c09IXzlRWldzMmU9TV9NWWVzVycpO1YJCQl6TT1Rekg+ckZJcEs7VgkJbFYJCU1Xbk1zQT4oJD0uc24taXM5TUg9cz1xXzJPV1FZSD5TUz4nUW5NekhlWU0nPiYmPiQ9LnNuLWlRbk16SGVZTV8yLk0yeSgkUW5NekhlWU0pKVYJCV1WCQkJJD0uc24taW5NPV9NenpPeignZTIyT1FIPV8yek1lPXNPSF85UVpXczJlPU1fUW5NekhlWU0nKTtWCQkJek09UXpIPnJGSXBLO1YJCWxWVgkJaGg+M0E+UW5NekhlWU0+c24+PWV5TUgsPlFuTT5Rbk16SGVZTTA+T3o+UW5NekhlWU1rLD5NPTJYVgkJc0E+KCQ9LnNuLWlzOU1IPXM9cV8yT1dRWUg+IVM+J1FuTXpIZVlNJylWCQldVgkJCSRPenN4c0hlV19Rbk16SGVZTT5TPiRRbk16SGVZTTtWCQkJQU96KCRzPlM+YTs+JD0uc24taVFuTXpIZVlNXzIuTTJ5KCRRbk16SGVZTSk7PiRzKyspVgkJCV1WCQkJCXNBKCRzPmk+YSlWCQkJCV1WCQkJCQkkUW5NekhlWU0+Uz4kT3pzeHNIZVdfUW5NekhlWU0+WD4kcztWCQkJCWxWCQkJbFYJCWxWVgkJaGg+M20+Rjk5ek1ublYJCSRzWl9lOTl6TW5uPlM+JD0uc24taV9aek1aZXpNX3NaKCQ9LnNuLWlzSFpRPS1pc1pfZTk5ek1ubigpKTtWCQkkbmVXPT4+Pj4+Pj5TPiQ9LnNuLWluPU96TV9uZVc9Pj8+JD0uc24taW5lVz0oKT46PnJGSXBLO1YJCSRaZW5ufU96OT4+PlM+JD0uc24taS5lbi5fWmVubn1PejkoJFplbm59T3o5LD4kbmVXPSk7VlYJCWhoPiBuTXpuPj1lPFdNWFYJCSQ5ZT1lPlM+ZXp6ZXEoVgkJPj4+PidRbk16SGVZTSc+Pj5TaT4kUW5NekhlWU0sVgkJPj4+PidaZW5ufU96OSc+Pj5TaT4kWmVubn1PejksVgkJPj4+PidNWWVzVyc+Pj4+Pj5TaT4kTVllc1csVgkJPj4+PidzWl9lOTl6TW5uJz5TaT4kc1pfZTk5ek1ubixWCQk+Pj4+JzJ6TWU9TTlfT0gnPlNpPj1zWU0oKSxWCQk+Pj4+J1dlbj1fV094c0gnPlNpPj1zWU0oKSxWCQk+Pj4+J2UyPXNjTSc+Pj4+PlNpPigkWWVIUWVXX2UyPXNjZT1zT0g+U1NTPkFlV25NPj8+MD46PmEpVgkJKTtWVgkJc0E+KCQ9LnNuLWluPU96TV9uZVc9KVYJCV1WCQkJJDllPWVqJ25lVz0nZD5TPiRuZVc9O1YJCWxWVgkJaGhBc1c9TXo+T1E9PmVIcT45ZT1lPlplbm5NOT49LmU9PjlPTW5IPT4uZWNNPmU+WWU9Mi5zSHg+Mk9XUVlIPnNIPj0uTT5Rbk16bj49ZTxXTVYJCWhoZUg5PllNenhNPj0uTT5uTT0+UW5Nej45ZT1lPmVIOT49Lk0+ZTk5cz1zT0hlVz45ZT1lVgkJJFFuTXpfOWU9ZT5TPmV6emVxX1lNenhNKCQ9LnNuLWlfQXNXPU16XzllPWUoJD0uc24taT1lPFdNbmonUW5Nem4nZCw+JGU5OXM9c09IZVdfOWU9ZSksPiQ5ZT1lKTtWVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdNUj16ZV9uTT0nKTtWVgkJJD0uc24taTk8LWlzSG5Nej0oJD0uc24taT1lPFdNbmonUW5Nem4nZCw+JFFuTXpfOWU9ZSk7VlYJCSRzOT5TPiQ9LnNuLWk5PC1pc0huTXo9X3M5KCk7VlYJCXNBPighTVlaPXEoJHh6T1FabikpVgkJXVYJCQloaGU5OT49Tz54ek9RWm5WCQkJQU96TWUyLj4oJHh6T1Fabj5lbj4keHpPUVopVgkJCV1WCQkJCSQ9LnNuLWllOTlfPU9feHpPUVooJHh6T1FaLD4kczkpO1YJCQlsVgkJbFZWCQloaGU5OT49Tz45TUFlUVc9Pnh6T1FaPnNBPkhPPT5lV3pNZTlxPm5NPVYJCSQ5TUFlUVc9X3h6T1FaPlM+JD0uc24taX0uTXpNKCdIZVlNJyw+JD0uc24taTJPSEFzeC1pcz1NWSgnOU1BZVFXPV94ek9RWicsPidzT0hfZVE9LicpKS1peHpPUVooKS1pek99KCk7VgkJc0E+KChzbm5NPSgkOU1BZVFXPV94ek9RWi1pczkpPiYmPk1ZWj1xKCR4ek9RWm4pKT58fD4oIU1ZWj1xKCR4ek9RWm4pPiYmPiFzSF9lenplcSgkOU1BZVFXPV94ek9RWi1pczksPiR4ek9RWm4pKSlWCQldVgkJCSQ9LnNuLWllOTlfPU9feHpPUVooJDlNQWVRVz1feHpPUVotaXM5LD4kczkpO1YJCWxWVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdaT249X3pNeHNuPU16Jyk7VlYJCXpNPVF6SD4oc25uTT0oJHM5KSk+Pz4kczk+Oj5yRklwSztWCWxWVgloKipWCT4qPldPeHNIVgk+KlYJPio+QHpNPVF6SD48T09XVgk+Kj5AZVE9Lk96PnVlPS5NfVYJPioqaFYJWlE8V3MyPkFRSDI9c09IPldPeHNIKCRzOU1IPXM9cSw+JFplbm59T3o5LD4kek1ZTVk8TXpTckZJcEspVgldVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdaek1fV094c0gnKTtWVgkJc0E+KE1ZWj1xKCRzOU1IPXM9cSk+fHw+TVlaPXEoJFplbm59T3o5KSlWCQldVgkJCSQ9LnNuLWluTT1fTXp6T3ooJ1dPeHNIX1FIblEyMk1ubkFRVycpO1YJCQl6TT1Rekg+ckZJcEs7VgkJbFZWCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ01SPXplX30uTXpNJyk7VlYJCSR2UU16cT5TPiQ9LnNuLWk5PC1pbk1XTTI9KCQ9LnNuLWlzOU1IPXM9cV8yT1dRWUg+WD4nLD5Rbk16SGVZTSw+TVllc1csPnM5LD5aZW5ufU96OSw+ZTI9c2NNLD5XZW49X1dPeHNIJylWCQk+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4taX0uTXpNKCQ9LnNuLWlzOU1IPXM9cV8yT1dRWUgsPiQ9LnNuLWk5PC1pTW4yZVpNX249eigkczlNSD1zPXEpKVYJCT4+Pj4+Pj4+Pj4+Pj4+Pj4+Pi1pV3NZcz0oMClWCQk+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4taXhNPSgkPS5zbi1pPWU8V01uaidRbk16bidkKTtWVgkJc0EoJD0uc24taXNuXz1zWU1fV08yeU05X09RPSgkczlNSD1zPXEpKVYJCV1WCQkJaGh0ZW4uPm5PWU09LnNIeD5lSHF9ZXEsPgpRbj0+PU8+PWV5TT5RWj49c1lNVgkJCSQ9LnNuLWkuZW4uX1plbm59T3o5KCRaZW5ufU96OSk7VlYJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ1pPbj1fV094c0hfUUhuUTIyTW5uQVFXJyk7VgkJCSQ9LnNuLWluTT1fTXp6T3ooJ1dPeHNIXz1zWU1PUT0nKTtWVgkJCXpNPVF6SD5yRklwSztWCQlsVlYJCXNBPigkdlFNenEtaUhRWV96T31uKCk+U1NTPjApVgkJXVYJCQkkUW5Nej5TPiR2UU16cS1pek99KCk7VlYJCQkkWmVubn1Pejk+Uz4kPS5zbi1pLmVuLl9aZW5ufU96OV85PCgkUW5Nei1pczksPiRaZW5ufU96OSk7VlYJCQlzQT4oJFplbm59T3o5PlNTUz5UZyBLKVYJCQldVgkJCQlzQT4oJFFuTXotaWUyPXNjTT5TUz5hKVYJCQkJXVYJCQkJCSQ9LnNuLWk9enN4eE16X01jTUg9bignWk9uPV9XT3hzSF9RSG5RMjJNbm5BUVcnKTtWCQkJCQkkPS5zbi1pbk09X016ek96KCdXT3hzSF9RSG5RMjJNbm5BUVdfSE89X2UyPXNjTScpO1ZWCQkJCQl6TT1Rekg+ckZJcEs7VgkJCQlsVlYJCQkJJD0uc24taW5NPV9uTW5uc09IKCRRbk16KTtWVgkJCQkkPS5zbi1pUVo5ZT1NX1dlbj1fV094c0goJFFuTXotaXM5KTtWVgkJCQkkPS5zbi1pMldNZXpfV094c0hfZT09TVlaPW4oJHM5TUg9cz1xKTtWVgkJCQlzQT4oJHpNWU1ZPE16PiYmPiQ9LnNuLWkyT0hBc3gtaXM9TVkoJ3pNWU1ZPE16X1FuTXpuJyw+J3NPSF9lUT0uJykpVgkJCQldVgkJCQkJJD0uc24taXpNWU1ZPE16X1FuTXooJFFuTXotaXM5KTtWCQkJCWxWVgkJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oZXp6ZXEoJ1pPbj1fV094c0gnLD4nWk9uPV9XT3hzSF9uUTIyTW5uQVFXJykpO1YJCQkJJD0uc24taW5NPV9ZTW5uZXhNKCdXT3hzSF9uUTIyTW5uQVFXJyk7VlYJCQkJek09UXpIPlRnIEs7VgkJCWxWCQlsVlYJCWhodGVuLj5uT1lNPS5zSHg+ZUhxfWVxLD4KUW49Pj1PPj1leU0+UVo+PXNZTVYJCSQ9LnNuLWkuZW4uX1plbm59T3o5KCRaZW5ufU96OSk7VlYJCSQ9LnNuLWlzSDJ6TWVuTV9XT3hzSF9lPT1NWVo9bigkczlNSD1zPXEpO1ZWCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ1pPbj1fV094c0hfUUhuUTIyTW5uQVFXJyk7VgkJJD0uc24taW5NPV9NenpPeignV094c0hfUUhuUTIyTW5uQVFXJyk7VlYJCXpNPVF6SD5yRklwSztWCWxWVgloKipWCT4qPnNuX1llUl9XT3hzSF9lPT1NWVo9bl9NUjJNTTlNOVYJPio+b2VuTTk+T0g+Mk85TT5Bek9ZPlRlSHk+RlE9Liw+PHE+M1dxZT5HT0hxUXkuT2M+KC49PVpuOmhoeHM9LlE8WDJPWWhzV3lPSGhUZUh5LUZRPS4pVgk+KlYJPio+QFplemVZPm49enNIeD4kczlNSD1zPXFWCT4qPkB6TT1Rekg+PE9PV01lSFYJPioqaFYJWlE8V3MyPkFRSDI9c09IPnNuX1llUl9XT3hzSF9lPT1NWVo9bl9NUjJNTTlNOSgkczlNSD1zPXEpPl1WCQlzQT4oJD0uc24taTJPSEFzeC1pcz1NWSgnPXplMnlfV094c0hfZT09TVlaPW4nLD4nc09IX2VRPS4nKSk+XVYJCQkkWWVSX2U9PU1ZWj1uPlM+JD0uc24taTJPSEFzeC1pcz1NWSgnWWVSc1lRWV9XT3hzSF9lPT1NWVo9bicsPidzT0hfZVE9LicpO1YJCQlzQT4oJFllUl9lPT1NWVo9bj5pPmEpPl1WCQkJCSRlPT1NWVo9bj5TPiQ9LnNuLWl4TT1fZT09TVlaPW5fSFFZKCRzOU1IPXM9cSk7VgkJCQl6TT1Rekg+JGU9PU1ZWj1uPmlTPiRZZVJfZT09TVlaPW47VgkJCWxWCQlsVgkJek09UXpIPnJGSXBLO1YJbFZWCWgqKlYJPio+Q009PkhRWTxNej5PQT5lPT1NWVo9bj49Tz5XT3hzSD5PMjJRek05PkF6T1k+eHNjTUg+M20tZTk5ek1ubj5Pej5zOU1IPXM9cVYJPio+b2VuTTk+T0g+Mk85TT5Bek9ZPlRlSHk+RlE9Liw+PHE+M1dxZT5HT0hxUXkuT2M+KC49PVpuOmhoeHM9LlE8WDJPWWhzV3lPSGhUZUh5LUZRPS4pVgk+KlYJPio+QFplemVZCW49enNIeD4kczlNSD1zPXFWCT4qPkB6TT1RekgJc0g9Vgk+KmhWCUFRSDI9c09IPnhNPV9lPT1NWVo9bl9IUVkoJHM5TUg9cz1xKVYJXVY+Pj4+Pj4+PnNBPigkPS5zbi1pMk9IQXN4LWlzPU1ZKCc9emUyeV9XT3hzSF9lPT1NWVo9bicsPidzT0hfZVE9LicpKT5dVj4+Pj4+Pj4+Pj4+PiRzWl9lOTl6TW5uPlM+JD0uc24taV9aek1aZXpNX3NaKCQ9LnNuLWlzSFpRPS1pc1pfZTk5ek1ubigpKTtWPj4+Pj4+Pj4+Pj4+JD0uc24taTk8LWluTVdNMj0oJzAnLD5yRklwSyk7Vj4+Pj4+Pj4+Pj4+PnNBPigkPS5zbi1pMk9IQXN4LWlzPU1ZKCc9emUyeV9XT3hzSF9zWl9lOTl6TW5uJyw+J3NPSF9lUT0uJykpPiQ9LnNuLWk5PC1pfS5Nek0oJ3NaX2U5OXpNbm4nLD4kc1pfZTk5ek1ubik7Vj4+Pj4+Pj4+Pj4+Pk1Xbk0+c0E+KG49eldNSCgkczlNSD1zPXEpPmk+YSk+JD0uc24taTk8LWlPel99Lk16TSgnV094c0gnLD4kczlNSD1zPXEpO1Y+Pj4+Pj4+Pj4+Pj4kdnpNbj5TPiQ9LnNuLWk5PC1peE09KCQ9LnNuLWk9ZTxXTW5qJ1dPeHNIX2U9PU1ZWj1uJ2QpO1Y+Pj4+Pj4+Pj4+Pj56TT1Rekg+JHZ6TW4taUhRWV96T31uKCk7Vj4+Pj4+Pj4+bFY+Pj4+Pj4+PnpNPVF6SD5hO1YJbFZWCWgqKlYJPio+Q009PmU+PE9PV01lSD49Tz45TT1NellzSE0+c0E+ZUg+ZTIyT1FIPT5uLk9RVzk+PE0+V08yeU05Pk9RPT45UU0+PU9WCT4qPk1SMk1NOU05PldPeHNIPmU9PU1ZWj1uPn1zPS5zSD5lPnhzY01IPlpNenNPOVYJPipWCT4qPkB6TT1RekgJPE9PV01lSFYJPipoVglaUTxXczI+QVFIMj1zT0g+c25fPXNZTV9XTzJ5TTlfT1E9KCRzOU1IPXM9cSk+XVZWCQl6TT1Rekg+JD0uc24taXNuX1llUl9XT3hzSF9lPT1NWVo9bl9NUjJNTTlNOSgkczlNSD1zPXEpPiYmPiQ9LnNuLWl4TT1fV2VuPV9lPT1NWVo9Xz1zWU0oJHM5TUg9cz1xKT5pPj1zWU0oKT4tPiQ9LnNuLWkyT0hBc3gtaXM9TVkoJ1dPMnlPUT1fPXNZTScsPidzT0hfZVE9LicpO1YJbFZWCWgqKlYJPio+Q009Pj0uTT49c1lNPk9BPj0uTT5XZW49Pj1zWU0+ZT5XT3hzSD5lPT1NWVo9Pk8yMlF6TTk+QXpPWT54c2NNSD4zbS1lOTl6TW5uPk96PnM5TUg9cz1xVgk+KlYJPio+QFplemVZCW49enNIeD4kczlNSD1zPXFWCT4qPkB6TT1RekgJc0g9Vgk+KmhWCVpRPFdzMj5BUUgyPXNPSD54TT1fV2VuPV9lPT1NWVo9Xz1zWU0oJHM5TUg9cz1xKT5dVgkJc0E+KCQ9LnNuLWkyT0hBc3gtaXM9TVkoJz16ZTJ5X1dPeHNIX2U9PU1ZWj1uJyw+J3NPSF9lUT0uJykpPl1WCQkJJHNaX2U5OXpNbm4+Uz4kPS5zbi1pX1p6TVplek1fc1ooJD0uc24taXNIWlE9LWlzWl9lOTl6TW5uKCkpO1ZWCQkJJD0uc24taTk8LWluTVdNMj1fWWVSKCc9c1lNJyk7Vj4+Pj4+Pj4+Pj4+PnNBPigkPS5zbi1pMk9IQXN4LWlzPU1ZKCc9emUyeV9XT3hzSF9zWl9lOTl6TW5uJyw+J3NPSF9lUT0uJykpPiQ9LnNuLWk5PC1pfS5Nek0oJ3NaX2U5OXpNbm4nLD4kc1pfZTk5ek1ubik7VgkJCU1Xbk0+c0E+KG49eldNSCgkczlNSD1zPXEpPmk+YSk+JD0uc24taTk8LWlPel99Lk16TSgnV094c0gnLD4kczlNSD1zPXEpO1YJCQkkdnpNbj5TPiQ9LnNuLWk5PC1peE09KCQ9LnNuLWk9ZTxXTW5qJ1dPeHNIX2U9PU1ZWj1uJ2QsPjApO1ZWCQkJc0EoJHZ6TW4taUhRWV96T31uKCk+aT5hKT5dVgkJCQl6TT1Rekg+JHZ6TW4taXpPfSgpLWk9c1lNO1YJCQlsVgkJbFZWCQl6TT1Rekg+YTtWCWxWVgloKipWCT4qPnNIMnpNZW5NX1dPeHNIX2U9PU1ZWj1uVgk+Kj5vZW5NOT5PSD4yTzlNPkF6T1k+VGVIeT5GUT0uLD48cT4zV3FlPkdPSHFReS5PYz4oLj09Wm46aGh4cz0uUTxYMk9ZaHNXeU9IaFRlSHktRlE9LilWCT4qVgk+Kj5AWmV6ZVk+bj16c0h4PiRzOU1IPXM9cVYJPioqaFYJWlE8V3MyPkFRSDI9c09IPnNIMnpNZW5NX1dPeHNIX2U9PU1ZWj1uKCRzOU1IPXM9cSk+XVYJCXNBPigkPS5zbi1pMk9IQXN4LWlzPU1ZKCc9emUyeV9XT3hzSF9lPT1NWVo9bicsPidzT0hfZVE9LicpKT5dVgkJCSRzWl9lOTl6TW5uPlM+JD0uc24taV9aek1aZXpNX3NaKCQ9LnNuLWlzSFpRPS1pc1pfZTk5ek1ubigpKTtWCQkJek09UXpIPiQ9LnNuLWk5PC1pc0huTXo9KCQ9LnNuLWk9ZTxXTW5qJ1dPeHNIX2U9PU1ZWj1uJ2QsPmV6emVxKCdzWl9lOTl6TW5uJz5TaT4kc1pfZTk5ek1ubiw+J1dPeHNIJz5TaT4kczlNSD1zPXEsPic9c1lNJz5TaT49c1lNKCkpKTtWCQlsVgkJek09UXpIPnJGSXBLO1YJbFZWCWgqKlYJPio+MldNZXpfV094c0hfZT09TVlaPW5WCT4qPm9lbk05Pk9IPjJPOU0+QXpPWT5UZUh5PkZRPS4sPjxxPjNXcWU+R09IcVF5Lk9jPiguPT1abjpoaHhzPS5RPFgyT1loc1d5T0hoVGVIeS1GUT0uKVYJPipWCT4qPkBaZXplWT5uPXpzSHg+JHM5TUg9cz1xVgk+KipoVglaUTxXczI+QVFIMj1zT0g+MldNZXpfV094c0hfZT09TVlaPW4oJHM5TUg9cz1xLD4kTVJac3pNX1pNenNPOT5TPmZbVWFhKT5dVgkJc0E+KCQ9LnNuLWkyT0hBc3gtaXM9TVkoJz16ZTJ5X1dPeHNIX2U9PU1ZWj1uJyw+J3NPSF9lUT0uJykpPl1WCQkJJHNaX2U5OXpNbm4+Uz4kPS5zbi1pX1p6TVplek1fc1ooJD0uc24taXNIWlE9LWlzWl9lOTl6TW5uKCkpO1ZWCQkJJD0uc24taTk8LWl9Lk16TShlenplcSgnc1pfZTk5ek1ubic+U2k+JHNaX2U5OXpNbm4sPidXT3hzSCc+U2k+JHM5TUg9cz1xKSk7VgkJCWhoPm1RenhNPk88bk9XTT1NPldPeHNIPmU9PU1ZWj1uVgkJCSQ9LnNuLWk5PC1pT3pffS5Nek0oJz1zWU0+QicsPj1zWU0oKT4tPiRNUlpzek1fWk16c085LD5yRklwSyk7VlYJCQl6TT1Rekg+JD0uc24taTk8LWk5TVdNPU0oJD0uc24taT1lPFdNbmonV094c0hfZT09TVlaPW4nZCk7VgkJbFYJCXpNPVF6SD5yRklwSztWCWxWVglaUTxXczI+QVFIMj1zT0g+V3NZcz0oJFdzWXM9KVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignV3NZcz0nKTtWCQkkPS5zbi1pX3NPSF9Xc1lzPT5TPiRXc1lzPTtWVgkJek09UXpIPiQ9LnNuO1YJbFZWCVpRPFdzMj5BUUgyPXNPSD5PQUFuTT0oJE9BQW5NPSlWCV1WCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ09BQW5NPScpO1YJCSQ9LnNuLWlfc09IX09BQW5NPT5TPiRPQUFuTT07VlYJCXpNPVF6SD4kPS5zbjtWCWxWVglaUTxXczI+QVFIMj1zT0g+fS5Nek0oJH0uTXpNLD4kY2VXUU0+Uz5FIElJKVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignfS5Nek0nKTtWVgkJc0E+KCFzbl9lenplcSgkfS5Nek0pKVYJCV1WCQkJJH0uTXpNPlM+ZXp6ZXEoJH0uTXpNPlNpPiRjZVdRTSk7VgkJbFZWCQllenplcV9aUW4uKCQ9LnNuLWlfc09IX30uTXpNLD4kfS5Nek0pO1ZWCQl6TT1Rekg+JD0uc247VglsVlYJWlE8V3MyPkFRSDI9c09IPldzeU0oJFdzeU0sPiRjZVdRTT5TPkUgSUksPiRaT25zPXNPSD5TPic8Tz0uJylWCV1WCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ1dzeU0nKTtWVgkJc0E+KCFzbl9lenplcSgkV3N5TSkpVgkJXVYJCQkkV3N5TT5TPmV6emVxKCRXc3lNPlNpPmV6emVxKFYJCQkJJ2NlV1FNJz4+Pj5TaT4kY2VXUU0sVgkJCQknWk9ucz1zT0gnPlNpPiRaT25zPXNPSCxWCQkJKSk7VgkJbFZWCQllenplcV9aUW4uKCQ9LnNuLWlfc09IX1dzeU0sPiRXc3lNKTtWVgkJek09UXpIPiQ9LnNuO1YJbFZWCVpRPFdzMj5BUUgyPXNPSD5uTVdNMj0oJG5NV00yPSlWCV1WCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ25NV00yPScpO1ZWCQkkPS5zbi1pX3NPSF9uTVdNMj1qZD5TPiRuTVdNMj07VlYJCXpNPVF6SD4kPS5zbjtWCWxWVglaUTxXczI+QVFIMj1zT0g+T3o5TXpfPHEoJDxxLD4kT3o5TXpTJzlNbjInKVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignT3o5TXpfPHEnKTtWVgkJJD0uc24taV9zT0hfT3o5TXpfPHE+Uz4kPHE7VgkJJD0uc24taV9zT0hfT3o5TXo+Pj4+Uz4kT3o5TXo7VlYJCXpNPVF6SD4kPS5zbjtWCWxWVglaUTxXczI+QVFIMj1zT0g+ek99KClWCV1WCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ3pPfScpO1ZWCQkkek99PlM+JD0uc24taXpNblpPSG5NLWl6T30oKTtWCQkkPS5zbi1pek1uWk9Ibk0taUF6TU1fek1uUVc9KCk7VlYJCXpNPVF6SD4kek99O1YJbFZWCVpRPFdzMj5BUUgyPXNPSD56T31fZXp6ZXEoKVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bihlenplcSgnek99Jyw+J3pPfV9lenplcScpKTtWVgkJJHpPfT5TPiQ9LnNuLWl6TW5aT0huTS1pek99X2V6emVxKCk7VgkJJD0uc24taXpNblpPSG5NLWlBek1NX3pNblFXPSgpO1ZWCQl6TT1Rekg+JHpPfTtWCWxWVglaUTxXczI+QVFIMj1zT0g+ek1uUVc9KClWCV1WCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ3pNblFXPScpO1ZWCQkkek1uUVc9PlM+JD0uc24taXpNblpPSG5NLWl6TW5RVz0oKTtWCQkkPS5zbi1pek1uWk9Ibk0taUF6TU1fek1uUVc9KCk7VlYJCXpNPVF6SD4kek1uUVc9O1YJbFZWCVpRPFdzMj5BUUgyPXNPSD56TW5RVz1fZXp6ZXEoKVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bihlenplcSgnek1uUVc9Jyw+J3pNblFXPV9lenplcScpKTtWVgkJJHpNblFXPT5TPiQ9LnNuLWl6TW5aT0huTS1pek1uUVc9X2V6emVxKCk7VgkJJD0uc24taXpNblpPSG5NLWlBek1NX3pNblFXPSgpO1ZWCQl6TT1Rekg+JHpNblFXPTtWCWxWVglaUTxXczI+QVFIMj1zT0g+SFFZX3pPfW4oKVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bihlenplcSgnSFFZX3pPfW4nKSk7VlYJCSR6TW5RVz0+Uz4kPS5zbi1pek1uWk9Ibk0taUhRWV96T31uKCk7VgkJJD0uc24taXpNblpPSG5NLWlBek1NX3pNblFXPSgpO1ZWCQl6TT1Rekg+JHpNblFXPTtWCWxWVgloKipWCT4qPlFuTXpuVgk+KlYJPio+QHpNPVF6SD5PPApNMj0+IG5Nem5WCT4qPkBlUT0uT3o+b01IPks5WVFIOW5WCT4qKmhWCVpRPFdzMj5BUUgyPXNPSD5Rbk16bigkeHpPUVpuPlM+RSBJSSlWCV1WCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ1FuTXpuJyk7VlYJCXNBPihzbm5NPSgkPS5zbi1pX3NPSF9uTVdNMj0pPiYmPiFNWVo9cSgkPS5zbi1pX3NPSF9uTVdNMj0pKVYJCV1WCQkJQU96TWUyLj4oJD0uc24taV9zT0hfbk1XTTI9PmVuPiRuTVdNMj0pVgkJCV1WCQkJCSQ9LnNuLWk5PC1pbk1XTTI9KCRuTVdNMj0pO1YJCQlsVlYJCQkkPS5zbi1pX3NPSF9uTVdNMj0+Uz5lenplcSgpO1YJCWxWCQlNV25NVgkJXVYJCQloaDlNQWVRVz0+bk1XTTI9blYJCQkkPS5zbi1pOTwtaW5NV00yPShlenplcShWCQkJPj4+PiQ9LnNuLWk9ZTxXTW5qJ1FuTXpuJ2RYJ1gqJyxWCQkJPj4+PiQ9LnNuLWk9ZTxXTW5qJ1FuTXpuJ2RYJ1hzOT5lbj5zOScsVgkJCT4+Pj4kPS5zbi1pPWU8V01uaidRbk16bidkWCdYczk+ZW4+UW5Nel9zOSdWCQkJKSk7VgkJbFZWCQloaEFzVz1Nej48cT54ek9RWj5zOShuKT5zQT5aZW5uTTlWCQlzQT4oc25uTT0oJHh6T1FabikpVgkJXVYJCQloaDxRc1c5PmVIPmV6emVxPnNBPk9IV3E+T0hNPnh6T1FaPn1lbj5aZW5uTTlWCQkJc0E+KHNuX0hRWU16czIoJHh6T1FabikpVgkJCV1WCQkJCSR4ek9RWm4+Uz5GenplcSgkeHpPUVpuKTtWCQkJbFZWCQkJaGgKT3NIPmVIOT49Lk1IPnpRSD5lPn0uTXpNX3NIPmV4ZXNIbj0+PS5NPnh6T1FaPnM5blYJCQlzQT4oc25uTT0oJHh6T1Fabik+JiY+IU1ZWj1xKCR4ek9RWm4pKVYJCQldVgkJCQkkPS5zbi1pOTwtaTlzbj1zSDI9KCk7VgkJCQkkPS5zbi1pOTwtaQpPc0goVgkJCQk+Pj4+JD0uc24taT1lPFdNbmonUW5Nem5feHpPUVpuJ2QsVgkJCQk+Pj4+JD0uc24taT1lPFdNbmonUW5Nem5feHpPUVpuJ2RYJ1gnWCQ9LnNuLWkKT3NIaidRbk16bidkWCdTJ1gkPS5zbi1pPWU8V01uaidRbk16bidkWCdYczknLFYJCQkJPj4+PidzSEhNeidWCQkJCSk7VlYJCQkJJD0uc24taTk8LWl9Lk16TV9zSCgkPS5zbi1pPWU8V01uaidRbk16bl94ek9RWm4nZFgnWCdYJD0uc24taQpPc0hqJ3h6T1FabidkLD4keHpPUVpuKTtWCQkJbFYJCWxWVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdNUj16ZV99Lk16TScpO1ZWCQloaHpRSD5NZTIuPn0uTXpNPj0uZT0+fWVuPlplbm5NOVYJCXNBPihzbm5NPSgkPS5zbi1pX3NPSF99Lk16TSk+JiY+IU1ZWj1xKCQ9LnNuLWlfc09IX30uTXpNKSlWCQldVgkJCUFPek1lMi4+KCQ9LnNuLWlfc09IX30uTXpNPmVuPiR9Lk16TSlWCQkJXVYJCQkJJD0uc24taTk8LWl9Lk16TSgkfS5Nek0pO1YJCQlsVlYJCQkkPS5zbi1pX3NPSF99Lk16TT5TPmV6emVxKCk7VgkJbFZWCQlzQT4oc25uTT0oJD0uc24taV9zT0hfV3N5TSk+JiY+IU1ZWj1xKCQ9LnNuLWlfc09IX1dzeU0pKVYJCV1WCQkJQU96TWUyLj4oJD0uc24taV9zT0hfV3N5TT5lbj4kV3N5TSlWCQkJXVYJCQkJJD0uc24taTk8LWlPel9Xc3lNKCRXc3lNKTtWCQkJbFZWCQkJJD0uc24taV9zT0hfV3N5TT5TPmV6emVxKCk7VgkJbFZWCQlzQT4oc25uTT0oJD0uc24taV9zT0hfV3NZcz0pPiYmPnNubk09KCQ9LnNuLWlfc09IX09BQW5NPSkpVgkJXVYJCQkkPS5zbi1pOTwtaVdzWXM9KCQ9LnNuLWlfc09IX1dzWXM9LD4kPS5zbi1pX3NPSF9PQUFuTT0pO1ZWCQkJJD0uc24taV9zT0hfV3NZcz0+PlM+RSBJSTtWCQkJJD0uc24taV9zT0hfT0FBbk09PlM+RSBJSTtWCQlsVgkJTVduTT5zQT4oc25uTT0oJD0uc24taV9zT0hfV3NZcz0pKVYJCV1WCQkJJD0uc24taTk8LWlXc1lzPSgkPS5zbi1pX3NPSF9Xc1lzPSk7VlYJCQkkPS5zbi1pX3NPSF9Xc1lzPT4+Uz5FIElJO1YJCWxWVgkJaGhuTT0+PS5NPk96OU16VgkJc0E+KHNubk09KCQ9LnNuLWlfc09IX096OU16XzxxKT4mJj5zbm5NPSgkPS5zbi1pX3NPSF9PejlNeikpVgkJXVYJCQkkPS5zbi1pOTwtaU96OU16XzxxKCQ9LnNuLWlfc09IX096OU16XzxxLD4kPS5zbi1pX3NPSF9PejlNeik7VlYJCQkkPS5zbi1pX3NPSF9PejlNej4+Pj5TPkUgSUk7VgkJCSQ9LnNuLWlfc09IX096OU16XzxxPlM+RSBJSTtWCQlsVlYJCSQ9LnNuLWl6TW5aT0huTT5TPiQ9LnNuLWk5PC1peE09KCQ9LnNuLWk9ZTxXTW5qJ1FuTXpuJ2QpO1ZWCQl6TT1Rekg+JD0uc247VglsVlYJaCoqVgk+Kj5Rbk16Vgk+KlYJPio+QHpNPVF6SD5PPApNMj1WCT4qPkBlUT0uT3o+b01IPks5WVFIOW5WCT4qKmhWCVpRPFdzMj5BUUgyPXNPSD5Rbk16KCRzOT5TPkUgSUkpVgldVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdRbk16Jyk7VlYJCWhoc0E+SE8+czk+fWVuPlplbm5NOT5Rbk0+PS5NPjJRenpNSD0+UW5Nem4+czlWCQkkczk+fHw+JHM5PlM+JD0uc24taW5Nbm5zT0gtaVFuTXo5ZT1lKCdRbk16X3M5Jyk7VlYJCSQ9LnNuLWlXc1lzPSgwKTtWCQkkPS5zbi1pfS5Nek0oJD0uc24taT1lPFdNbmonUW5Nem4nZFgnWHM5Jyw+JHM5KTtWVgkJJD0uc24taVFuTXpuKCk7VlYJCXpNPVF6SD4kPS5zbjtWCWxWVgloKipWCT4qPnhNPV9Rbk16bl94ek9RWm5WCT4qVgk+Kj5Aek09UXpIPmV6emVxVgk+Kj5AZVE9Lk96Pm9NSD5LOVlRSDluVgk+KipoVglaUTxXczI+QVFIMj1zT0g+eE09X1FuTXpuX3h6T1FabigkczlTckZJcEspVgldVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCd4TT1fUW5Nem5feHpPUVonKTtWVgkJaGhzQT5ITz5zOT59ZW4+WmVubk05PlFuTT49Lk0+MlF6ek1IPT5Rbk16bj5zOVYJCSRzOT58fD4kczk+Uz4kPS5zbi1pbk1ubnNPSC1pUW5NejllPWUoJ1FuTXpfczknKTtWVgkJek09UXpIPiQ9LnNuLWk5PC1pbk1XTTI9KCQ9LnNuLWk9ZTxXTW5qJ1FuTXpuX3h6T1FabidkWCdYJ1gkPS5zbi1pCk9zSGoneHpPUVpuJ2RYJz5lbj5zOSw+J1gkPS5zbi1pPWU8V01uaid4ek9RWm4nZFgnWEhlWU0sPidYJD0uc24taT1lPFdNbmoneHpPUVpuJ2RYJ1g5TW4yenNaPXNPSCcpVgkJPj4+Pj4+Pj4+Pj4+Pj4+Pi1pfS5Nek0oJD0uc24taT1lPFdNbmonUW5Nem5feHpPUVpuJ2RYJ1gnWCQ9LnNuLWkKT3NIaidRbk16bidkLD4kczkpVgkJPj4+Pj4+Pj4+Pj4+Pj4+Pi1pCk9zSCgkPS5zbi1pPWU8V01uaid4ek9RWm4nZCw+JD0uc24taT1lPFdNbmonUW5Nem5feHpPUVpuJ2RYJ1gnWCQ9LnNuLWkKT3NIaid4ek9RWm4nZFgnUydYJD0uc24taT1lPFdNbmoneHpPUVpuJ2RYJ1hzOScpVgkJPj4+Pj4+Pj4+Pj4+Pj4+Pi1peE09KCQ9LnNuLWk9ZTxXTW5qJ1FuTXpuX3h6T1FabidkKTtWCWxWVgloKipWCT4qPmU5OV89T194ek9RWlYJPipWCT4qPkB6TT1Rekg+PE9PV1YJPio+QGVRPS5Pej5vTUg+SzlZUUg5blYJPioqaFYJWlE8V3MyPkFRSDI9c09IPmU5OV89T194ek9RWigkeHpPUVpfczksPiRRbk16X3M5U0FlV25NKVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignZTk5Xz1PX3h6T1FaJyk7VlYJCWhoc0E+SE8+czk+fWVuPlplbm5NOT5Rbk0+PS5NPjJRenpNSD0+UW5Nem4+czlWCQkkUW5Nel9zOT58fD4kUW5Nel9zOT5TPiQ9LnNuLWluTW5uc09ILWlRbk16OWU9ZSgnUW5Nel9zOScpO1ZWCQloaDIuTTJ5PnNBPlFIc3ZRTT4tPkhRWV96T31uKCk+aT5hPllNZUhuPnpPfT5BT1FIOVYJCXNBPigkPS5zbi1pOTwtaX0uTXpNKGV6emVxKD4kPS5zbi1pCk9zSGoneHpPUVpuJ2Q+U2k+KHNIPSkkeHpPUVpfczksPiQ9LnNuLWkKT3NIaidRbk16bidkPlNpPihzSD0pJFFuTXpfczkpKS1peE09KCQ9LnNuLWk9ZTxXTW5qJ1FuTXpuX3h6T1FabidkKS1pSFFZX3pPfW4oKSk+ek09UXpIPkFlV25NO1ZWCQlzQT4oJHpNPVF6SD5TPiQ9LnNuLWk5PC1pc0huTXo9KCQ9LnNuLWk9ZTxXTW5qJ1FuTXpuX3h6T1FabidkLD5lenplcSg+JD0uc24taQpPc0hqJ3h6T1FabidkPlNpPihzSD0pJHh6T1FaX3M5LD4kPS5zbi1pCk9zSGonUW5Nem4nZD5TaT4oc0g9KSRRbk16X3M5KSkpVgkJXVYJCQlzQT4oc25uTT0oJD0uc24taV8yZTIuTV94ek9RWm5qJHh6T1FaX3M5ZCkpPl1WCQkJCSR4ek9RWl9IZVlNPlM+JD0uc24taV8yZTIuTV94ek9RWm5qJHh6T1FaX3M5ZDtWCQkJbFYJCQlNV25NPl1WCQkJCSR4ek9RWj5TPiQ9LnNuLWl4ek9RWigkeHpPUVpfczkpLWl6TW5RVz0oKTtWCQkJCSR4ek9RWl9IZVlNPlM+JHh6T1FaamFkLWlIZVlNO1YJCQkJJD0uc24taV8yZTIuTV94ek9RWm5qJHh6T1FaX3M5ZD5TPiR4ek9RWl9IZVlNO1YJCQlsVgkJCSQ9LnNuLWlfMmUyLk1fUW5Nel9zSF94ek9RWmokUW5Nel9zOWRqJHh6T1FaX3M5ZD5TPiR4ek9RWl9IZVlNO1YJCWxWCQl6TT1Rekg+JHpNPVF6SDtWCWxWVgloKipWCT4qPnpNWU9jTV9Bek9ZX3h6T1FaVgk+KlYJPio+QHpNPVF6SD48T09XVgk+Kj5AZVE9Lk96Pm9NSD5LOVlRSDluVgk+KipoVglaUTxXczI+QVFIMj1zT0g+ek1ZT2NNX0F6T1lfeHpPUVooJHh6T1FaX3M5blNBZVduTSw+JFFuTXpfczlTQWVXbk0pVgldVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCd6TVlPY01fQXpPWV94ek9RWicpO1ZWCQloaD5Rbk16PnM5PnNuPnpNdlFzek05VgkJc0EoTVlaPXEoJFFuTXpfczkpKVYJCV1WCQkJek09UXpIPnJGSXBLO1YJCWxWVgkJaGg+c0E+eHpPUVo+czkobik+ZXpNPlplbm5NOT56TVlPY00+UW5Nej5Bek9ZPj0uTT54ek9RWihuKVYJCXNBKD4hPk1ZWj1xKCR4ek9RWl9zOW4pKVYJCV1WCQkJc0EoIXNuX2V6emVxKCR4ek9RWl9zOW4pKVYJCQldVgkJCQkkeHpPUVpfczluPlM+ZXp6ZXEoJHh6T1FaX3M5bik7VgkJCWxWVgkJCUFPek1lMi4oJHh6T1FaX3M5bj5lbj4keHpPUVpfczkpVgkJCV1WCQkJCSQ9LnNuLWk5PC1pOU1XTT1NKCQ9LnNuLWk9ZTxXTW5qJ1FuTXpuX3h6T1FabidkLD5lenplcSgkPS5zbi1pCk9zSGoneHpPUVpuJ2Q+U2k+KHNIPSkkeHpPUVpfczksPiQ9LnNuLWkKT3NIaidRbk16bidkPlNpPihzSD0pJFFuTXpfczkpKTtWCQkJCXNBPihzbm5NPSgkPS5zbi1pXzJlMi5NX1FuTXpfc0hfeHpPUVpqJFFuTXpfczlkKT4mJj5zbm5NPSgkPS5zbi1pXzJlMi5NX1FuTXpfc0hfeHpPUVpqJFFuTXpfczlkaiR4ek9RWl9zOWQpKVYJCQkJXVYJCQkJCVFIbk09KCQ9LnNuLWlfMmUyLk1fUW5Nel9zSF94ek9RWmokUW5Nel9zOWRqJHh6T1FaX3M5ZCk7VgkJCQlsVgkJCWxWVgkJCSR6TT1Rekg+Uz5UZyBLO1YJCWxWCQloaD5PPS5Nen1zbk0+ek1ZT2NNPlFuTXo+QXpPWT5lV1c+eHpPUVpuVgkJTVduTVYJCV1WCQkJc0E+KCR6TT1Rekg+Uz4kPS5zbi1pOTwtaTlNV009TSgkPS5zbi1pPWU8V01uaidRbk16bl94ek9RWm4nZCw+ZXp6ZXEoJD0uc24taQpPc0hqJ1FuTXpuJ2Q+U2k+KHNIPSkkUW5Nel9zOSkpKT5dVgkJCQkkPS5zbi1pXzJlMi5NX1FuTXpfc0hfeHpPUVpqJFFuTXpfczlkPlM+ZXp6ZXEoKTtWCQkJbFYJCWxWCQl6TT1Rekg+JHpNPVF6SDtWCWxWVgloKipWCT4qPnh6T1FablYJPipWCT4qPkB6TT1Rekg+TzwKTTI9Vgk+Kj5AZVE9Lk96Pm9NSD5LOVlRSDluVgk+KipoVglaUTxXczI+QVFIMj1zT0g+eHpPUVpuKClWCV1WCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ3h6T1FabicpO1ZWCQloaHpRSD5NZTIuPn0uTXpNPj0uZT0+fWVuPlplbm5NOVYJCXNBPihzbm5NPSgkPS5zbi1pX3NPSF99Lk16TSk+JiY+IU1ZWj1xKCQ9LnNuLWlfc09IX30uTXpNKSlWCQldVgkJCUFPek1lMi4+KCQ9LnNuLWlfc09IX30uTXpNPmVuPiR9Lk16TSlWCQkJXVYJCQkJJD0uc24taTk8LWl9Lk16TSgkfS5Nek0pO1YJCQlsVgkJCSQ9LnNuLWlfc09IX30uTXpNPlM+ZXp6ZXEoKTtWCQlsVlYJCXNBPihzbm5NPSgkPS5zbi1pX3NPSF9Xc1lzPSk+JiY+c25uTT0oJD0uc24taV9zT0hfT0FBbk09KSlWCQldVgkJCSQ9LnNuLWk5PC1pV3NZcz0oJD0uc24taV9zT0hfV3NZcz0sPiQ9LnNuLWlfc09IX09BQW5NPSk7VlYJCQkkPS5zbi1pX3NPSF9Xc1lzPT4+Uz5FIElJO1YJCQkkPS5zbi1pX3NPSF9PQUFuTT0+Uz5FIElJO1YJCWxWCQlNV25NPnNBPihzbm5NPSgkPS5zbi1pX3NPSF9Xc1lzPSkpVgkJXVYJCQkkPS5zbi1pOTwtaVdzWXM9KCQ9LnNuLWlfc09IX1dzWXM9KTtWVgkJCSQ9LnNuLWlfc09IX1dzWXM9Pj5TPkUgSUk7VgkJbFZWCQloaG5NPT49Lk0+T3o5TXpWCQlzQT4oc25uTT0oJD0uc24taV9zT0hfT3o5TXpfPHEpPiYmPnNubk09KCQ9LnNuLWlfc09IX096OU16KSlWCQldVgkJCSQ9LnNuLWk5PC1pT3o5TXpfPHEoJD0uc24taV9zT0hfT3o5TXpfPHEsPiQ9LnNuLWlfc09IX096OU16KTtWCQlsVlYJCSQ9LnNuLWl6TW5aT0huTT5TPiQ9LnNuLWk5PC1peE09KCQ9LnNuLWk9ZTxXTW5qJ3h6T1FabidkKTtWVgkJek09UXpIPiQ9LnNuO1YJbFZWCWgqKlYJPio+eHpPUVpWCT4qVgk+Kj5Aek09UXpIPk88Ck0yPVYJPio+QGVRPS5Pej5vTUg+SzlZUUg5blYJPioqaFYJWlE8V3MyPkFRSDI9c09IPnh6T1FaKCRzOT5TPkUgSUkpVgldVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCd4ek9RWicpO1ZWCQlzQT4oc25uTT0oJHM5KSlWCQldVgkJCSQ9LnNuLWk5PC1pfS5Nek0oJD0uc24taT1lPFdNbmoneHpPUVpuJ2RYJ1hzOScsPiRzOSk7VgkJbFZWCQkkPS5zbi1pV3NZcz0oMCk7VlYJCXpNPVF6SD4kPS5zbi1peHpPUVpuKCk7VglsVlYJaCoqVgk+Kj5RWjllPU1WCT4qVgk+Kj5Aek09UXpIPjxPT1dWCT4qPkBlUT0uT3o+bS5zVz5wPVF6eE1PSFYJPioqaFYJWlE8V3MyPkFRSDI9c09IPlFaOWU9TSgkczksPmV6emVxPiQ5ZT1lKVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignWnpNX1FaOWU9TV9Rbk16Jyk7VlYJCSRRbk16PlM+JD0uc24taVFuTXooJHM5KS1pek99KCk7VlYJCSQ9LnNuLWk5PC1pPXplSG5fPE14c0goKTtWVgkJc0E+KGV6emVxX3lNcV9NUnNuPW4oJD0uc24taXM5TUg9cz1xXzJPV1FZSCw+JDllPWUpPiYmPiQ9LnNuLWlzOU1IPXM9cV8yLk0yeSgkOWU9ZWokPS5zbi1pczlNSD1zPXFfMk9XUVlIZCk+JiY+JFFuTXotaV0kPS5zbi1pczlNSD1zPXFfMk9XUVlIbD4hU1M+JDllPWVqJD0uc24taXM5TUg9cz1xXzJPV1FZSGQpVgkJXVYJCQkkPS5zbi1pOTwtaT16ZUhuX3pPV1c8ZTJ5KCk7VgkJCSQ9LnNuLWluTT1fTXp6T3ooJ2UyMk9RSD1fMnpNZT1zT0hfOVFaV3MyZT1NXydYJD0uc24taXM5TUg9cz1xXzJPV1FZSCk7VlYJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oZXp6ZXEoJ1pPbj1fUVo5ZT1NX1FuTXonLD4nWk9uPV9RWjllPU1fUW5Nel9RSG5RMjJNbm5BUVcnKSk7VgkJCSQ9LnNuLWluTT1fTXp6T3ooJ1FaOWU9TV9RSG5RMjJNbm5BUVcnKTtWVgkJCXpNPVF6SD5yRklwSztWCQlsVlYJCWhoPnJzVz1Nej49Lk0+OWU9ZT5aZW5uTTlWCQkkOWU9ZT5TPiQ9LnNuLWlfQXNXPU16XzllPWUoJD0uc24taT1lPFdNbmonUW5Nem4nZCw+JDllPWUpO1ZWCQlzQT4oZXp6ZXFfeU1xX01Sc249bignUW5NekhlWU0nLD4kOWU9ZSk+fHw+ZXp6ZXFfeU1xX01Sc249bignWmVubn1PejknLD4kOWU9ZSk+fHw+ZXp6ZXFfeU1xX01Sc249bignTVllc1cnLD4kOWU9ZSkpVgkJXVYJCQlzQT4oZXp6ZXFfeU1xX01Sc249bignWmVubn1PejknLD4kOWU9ZSkpVgkJCV1WCQkJCXNBKD4hPk1ZWj1xKCQ5ZT1laidaZW5ufU96OSdkKSlWCQkJCV1WCQkJCQkkOWU9ZWonWmVubn1PejknZD5TPiQ9LnNuLWkuZW4uX1plbm59T3o5KCQ5ZT1laidaZW5ufU96OSdkLD4kUW5Nei1pbmVXPSk7VgkJCQlsVgkJCQlNV25NVgkJCQldVgkJCQkJaGg+UUhuTT0+WmVubn1Pejk+bk8+cz0+OU9NbkgnPT5NQUFNMj0+OWU9ZTxlbk0+TUg9enE+c0E+SE8+WmVubn1Pejk+WmVubk05VgkJCQkJUUhuTT0oJDllPWVqJ1plbm59T3o5J2QpO1YJCQkJbFYJCQlsVgkJbFZWCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ01SPXplX30uTXpNJyk7VgkJJD0uc24taTk8LWlRWjllPU0oJD0uc24taT1lPFdNbmonUW5Nem4nZCw+JDllPWUsPmV6emVxKCdzOSc+U2k+JFFuTXotaXM5KSk7VlYJCXNBPigkPS5zbi1pOTwtaT16ZUhuX249ZT1RbigpPlNTUz5yRklwSylWCQldVgkJCSQ9LnNuLWk5PC1pPXplSG5fek9XVzxlMnkoKTtWVgkJCSQ9LnNuLWk9enN4eE16X01jTUg9bihlenplcSgnWk9uPV9RWjllPU1fUW5NeicsPidaT249X1FaOWU9TV9Rbk16X1FIblEyMk1ubkFRVycpKTtWCQkJJD0uc24taW5NPV9NenpPeignUVo5ZT1NX1FIblEyMk1ubkFRVycpO1YJCQl6TT1Rekg+ckZJcEs7VgkJbFZWCQkkPS5zbi1pOTwtaT16ZUhuXzJPWVlzPSgpO1ZWCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oZXp6ZXEoJ1pPbj1fUVo5ZT1NX1FuTXonLD4nWk9uPV9RWjllPU1fUW5Nel9uUTIyTW5uQVFXJykpO1YJCSQ9LnNuLWluTT1fWU1ubmV4TSgnUVo5ZT1NX25RMjJNbm5BUVcnKTtWCQl6TT1Rekg+VGcgSztWCWxWVgloKipWCSo+OU1XTT1NX1FuTXpWCSpWCSo+QHpNPVF6SD48T09XVgkqPkBlUT0uT3o+bS5zVz5wPVF6eE1PSFYJKipoVglaUTxXczI+QVFIMj1zT0g+OU1XTT1NX1FuTXooJHM5KVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignWnpNXzlNV009TV9Rbk16Jyk7VlYJCSQ9LnNuLWk5PC1pPXplSG5fPE14c0goKTtWVgkJaGg+ek1ZT2NNPlFuTXo+QXpPWT54ek9RWm5WCQkkPS5zbi1pek1ZT2NNX0F6T1lfeHpPUVooRSBJSSw+JHM5KTtWVgkJaGg+OU1XTT1NPlFuTXo+QXpPWT5Rbk16bj49ZTxXTT5uLk9RVzk+PE0+WldlMk05PmVBPU16PnpNWU9jTT5Bek9ZPnh6T1FaVgkJJD0uc24taTk8LWk5TVdNPU0oJD0uc24taT1lPFdNbmonUW5Nem4nZCw+ZXp6ZXEoJ3M5Jz5TaT4kczkpKTtWVgkJaGg+c0E+UW5Nej45T01uPkhPPT5NUnNuPT5zSD45ZT1lPGVuTT49Lk1IPnM9PnpNPVF6SG4+ckZJcEs+TVduTT56TVlPY01uPj0uTT5Rbk16PkF6T1k+eHpPUVpuVgkJc0E+KCQ9LnNuLWk5PC1pZUFBTTI9TTlfek99bigpPlNTPmEpVgkJXVYJCT4+Pj56TT1Rekg+ckZJcEs7VgkJbFZWCQlzQT4oJD0uc24taTk8LWk9emVIbl9uPWU9UW4oKT5TU1M+ckZJcEspVgkJXVYJCQkkPS5zbi1pOTwtaT16ZUhuX3pPV1c8ZTJ5KCk7VgkJCSQ9LnNuLWk9enN4eE16X01jTUg9bihlenplcSgnWk9uPV85TVdNPU1fUW5NeicsPidaT249XzlNV009TV9Rbk16X1FIblEyMk1ubkFRVycpKTtWCQkJJD0uc24taW5NPV9NenpPeignOU1XTT1NX1FIblEyMk1ubkFRVycpO1YJCQl6TT1Rekg+ckZJcEs7VgkJbFZWCQkkPS5zbi1pOTwtaT16ZUhuXzJPWVlzPSgpO1ZWCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oZXp6ZXEoJ1pPbj1fOU1XTT1NX1FuTXonLD4nWk9uPV85TVdNPU1fUW5Nel9uUTIyTW5uQVFXJykpO1YJCSQ9LnNuLWluTT1fWU1ubmV4TSgnOU1XTT1NX25RMjJNbm5BUVcnKTtWCQl6TT1Rekg+VGcgSztWCWxWVgloKipWCT4qPlFaOWU9TV9XZW49X1dPeHNIVgk+KlYJPio+QHpNPVF6SD48T09XVgk+Kj5AZVE9Lk96Pm9NSD5LOVlRSDluVgk+KipoVglaUTxXczI+QVFIMj1zT0g+UVo5ZT1NX1dlbj1fV094c0goJHM5KVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignUVo5ZT1NX1dlbj1fV094c0gnKTtWVgkJJD0uc24taVdPZTktaS5NV1pNeignOWU9TScpO1ZWCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJ01SPXplX30uTXpNJyk7VlYJCSQ9LnNuLWk5PC1pUVo5ZT1NKCQ9LnNuLWk9ZTxXTW5qJ1FuTXpuJ2QsPmV6emVxKCdXZW49X1dPeHNIJz5TaT49c1lNKCkpLD5lenplcSgnczknPlNpPiRzOSkpO1ZWCQl6TT1Rekg+JD0uc24taTk8LWllQUFNMj1NOV96T31uKCk+U1M+MDtWCWxWVgloKipWCT4qPm5NPV9XZUh4Vgk+KlYJPio+QHpNPVF6SD48T09XVgk+Kj5AZVE9Lk96Pm9NSD5LOVlRSDluVgk+KipoVglaUTxXczI+QVFIMj1zT0g+bk09X1dlSHgoJFdlSHg+Uz4nTUgnKVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignbk09X1dlSHgnKTtWVgkJaGg+c0E+PS5NPlFuTXpfTVJac3pNPnNuPm5NPT49Tz41TXpPPn1NJ1dXPm5NPT49Lk0+TVJac3plPXNPSD49fU8+cU1lem4+QXpPWT5IT31YVgkJc0EoJD0uc24taTJPSEFzeC1pcz1NWSgnUW5Nel9NUlpzek0nLD4nc09IX2VRPS4nKT5TU1M+YSlWCQldVgkJCSRNUlpzek0+Uz4oW2EqW2Eqa1UqSltMKmspO1YJCWxWCQloaD5PPS5Nen1zbk0+UW5NPn0uZT0+c24+bk09VgkJTVduTVYJCV1WCQkJJE1SWnN6TT5TPiQ9LnNuLWkyT0hBc3gtaXM9TVkoJ1FuTXpfTVJac3pNJyw+J3NPSF9lUT0uJyk7VgkJbFZWCQluTT1fMk9PeXNNKGV6emVxKFYJCQknSGVZTSc+Pj5TaT4nV2VIeF8yTzlNJyxWCQkJJ2NlV1FNJz4+U2k+JFdlSHgsVgkJCSdNUlpzek0nPlNpPiRNUlpzek1WCQkpKTtWVgkJek09UXpIPlRnIEs7VglsVlYJaCoqVgk+Kj5uTT1fbk1ubnNPSFYJPipWCT4qPkB6TT1Rekg+PE9PV1YJPio+QGVRPS5Pej4KelllOW5NSFsxVgk+KipoVglaUTxXczI+QVFIMj1zT0g+bk09X25Nbm5zT0goJFFuTXopVgldVlYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignWnpNX25NPV9uTW5uc09IJyk7VlYJCSRuTW5uc09IXzllPWU+Uz5lenplcShWCQk+Pj4+J3M5TUg9cz1xJz4+Pj4+Pj4+Pj4+Pj5TaT4kUW5Nei1pXSQ9LnNuLWlzOU1IPXM9cV8yT1dRWUhsLFYJCT4+Pj4nUW5NekhlWU0nPj4+Pj4+Pj4+Pj4+PlNpPiRRbk16LWlRbk16SGVZTSxWCQk+Pj4+J01ZZXNXJz4+Pj4+Pj4+Pj4+Pj4+Pj5TaT4kUW5Nei1pTVllc1csVgkJPj4+PidRbk16X3M5Jz4+Pj4+Pj4+Pj4+Pj4+U2k+JFFuTXotaXM5LD5oaE1jTXpxT0hNPldzeU1uPj1PPk9jTXp9enM9TT5zOT5uTz59TSdXVz5Rbk0+UW5Nel9zOVYJCT4+Pj4nT1c5X1dlbj1fV094c0gnPj4+Pj4+PlNpPiRRbk16LWlXZW49X1dPeHNIVgkJKTtWVgkJJD0uc24taW5Nbm5zT0gtaW5NPV9Rbk16OWU9ZSgkbk1ubnNPSF85ZT1lKTtWVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdaT249X25NPV9uTW5uc09IJyk7VlYJCXpNPVF6SD5UZyBLO1YJbFZWCWgqKlYJPio+ek1ZTVk8TXpfUW5NelYJPipWCT4qPkB6TT1Rekg+PE9PV1YJPio+QGVRPS5Pej5vTUg+SzlZUUg5blYJPioqaFYJWlE8V3MyPkFRSDI9c09IPnpNWU1ZPE16X1FuTXooJHM5KVYJXVYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignWnpNX3pNWU1ZPE16X1FuTXonKTtWVgkJc0E+KCEkczkpVgkJXVYJCQl6TT1Rekg+ckZJcEs7VgkJbFZWCQkkUW5Nej5TPiQ9LnNuLWlRbk16KCRzOSktaXpPfSgpO1ZWCQkkbmVXPT5TPiQ9LnNuLWluZVc9KCk7VlYJCSQ9LnNuLWk5PC1pUVo5ZT1NKCQ9LnNuLWk9ZTxXTW5qJ1FuTXpuJ2QsPmV6emVxKCd6TVlNWTxNel8yTzlNJz5TaT4kbmVXPSksPmV6emVxKCdzOSc+U2k+JHM5KSk7VlYJCXNBPigkPS5zbi1pOTwtaWVBQU0yPU05X3pPfW4oKT5pPi0wKVYJCV1WCQkJaGg+c0E+PS5NPlFuTXpfTVJac3pNPnNuPm5NPT49Tz41TXpPPn1NJ1dXPm5NPT49Lk0+TVJac3plPXNPSD49fU8+cU1lem4+QXpPWT5IT31YVgkJCXNBKCQ9LnNuLWkyT0hBc3gtaXM9TVkoJ1FuTXpfTVJac3pNJyw+J3NPSF9lUT0uJyk+U1NTPmEpVgkJCV1WCQkJCSRNUlpzek0+Uz4oW2EqW2Eqa1UqSltMKmspO1YJCQlsVgkJCWhoPk89Lk16fXNuTT5Rbk0+fS5lPT5zbj5uTT1WCQkJTVduTVYJCQldVgkJCQkkTVJac3pNPlM+JD0uc24taTJPSEFzeC1pcz1NWSgnUW5Nel9NUlpzek0nLD4nc09IX2VRPS4nKTtWCQkJbFZWCQkJbk09XzJPT3lzTShlenplcShWCQkJPj4+PidIZVlNJz4+PlNpPidzOU1IPXM9cScsVgkJCT4+Pj4nY2VXUU0nPj5TaT4kUW5Nei1pXSQ9LnNuLWlzOU1IPXM9cV8yT1dRWUhsLFYJCQk+Pj4+J01SWnN6TSc+U2k+JE1SWnN6TVYJCQkpKTtWVgkJCW5NPV8yT095c00oZXp6ZXEoVgkJCT4+Pj4nSGVZTSc+Pj5TaT4nek1ZTVk8TXpfMk85TScsVgkJCT4+Pj4nY2VXUU0nPj5TaT4kbmVXPSxWCQkJPj4+PidNUlpzek0nPlNpPiRNUlpzek1WCQkJKSk7VlYJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oZXp6ZXEoJ1pPbj1fek1ZTVk8TXpfUW5NeicsPid6TVlNWTxNel9Rbk16X25RMjJNbm5BUVcnKSk7VgkJCXpNPVF6SD5UZyBLO1YJCWxWVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKGV6emVxKCdaT249X3pNWU1ZPE16X1FuTXonLD4nek1ZTVk8TXpfUW5Nel9RSG5RMjJNbm5BUVcnKSk7VgkJek09UXpIPnJGSXBLO1YJbFZWCWgqKlYJPio+V094c0hfek1ZTVk8TTlfUW5NelYJPipWCT4qPkB6TT1Rekg+PE9PV1YJPio+QGVRPS5Pej5vTUg+SzlZUUg5blYJPioqaFYJWlE8V3MyPkFRSDI9c09IPldPeHNIX3pNWU1ZPE16TTlfUW5NeigpVgldVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdaek1fV094c0hfek1ZTVk8TXpNOV9Rbk16Jyk7VlYJCWhoMi5NMnk+QU96PmNlV3M5PjllPWVWCQlzQT4oIXhNPV8yT095c00oJ3M5TUg9cz1xJyk+fHw+IXhNPV8yT095c00oJ3pNWU1ZPE16XzJPOU0nKT58fD4hJD0uc24taXM5TUg9cz1xXzIuTTJ5KHhNPV8yT095c00oJ3M5TUg9cz1xJykpKVYJCV1WCQkJJD0uc24taT16c3h4TXpfTWNNSD1uKGV6emVxKCdaT249X1dPeHNIX3pNWU1ZPE16TTlfUW5NeicsPidaT249X1dPeHNIX3pNWU1ZPE16TTlfUW5Nel9RSG5RMjJNbm5BUVcnKSk7VgkJCXpNPVF6SD5yRklwSztWCQlsVlYJCWhoeE09Pj0uTT5Rbk16VgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdNUj16ZV99Lk16TScpO1YJCSR2UU16cT5TPiQ9LnNuLWk5PC1pbk1XTTI9KCQ9LnNuLWlzOU1IPXM9cV8yT1dRWUhYJyw+czksPlFuTXpIZVlNLD5NWWVzVyw+V2VuPV9XT3hzSCcpVgkJPj4+Pj4+Pj4+Pj4+Pj4+Pj4+LWl9Lk16TSgkPS5zbi1pczlNSD1zPXFfMk9XUVlILD54TT1fMk9PeXNNKCdzOU1IPXM9cScpKVYJCT4+Pj4+Pj4+Pj4+Pj4+Pj4+Pi1pfS5Nek0oJ3pNWU1ZPE16XzJPOU0nLD54TT1fMk9PeXNNKCd6TVlNWTxNel8yTzlNJykpVgkJPj4+Pj4+Pj4+Pj4+Pj4+Pj4+LWlXc1lzPSgwKVYJCT4+Pj4+Pj4+Pj4+Pj4+Pj4+Pi1peE09KCQ9LnNuLWk9ZTxXTW5qJ1FuTXpuJ2QpO1ZWCQloaHNBPj0uTT5Rbk16Pn1lbj5BT1FIOSw+bnN4SD49Lk1ZPnNIVgkJc0E+KCR2UU16cS1pSFFZX3pPfW4oKT5TUz4wKVYJCV1WCQkJJFFuTXo+Uz4kdlFNenEtaXpPfSgpO1ZWCQkJJD0uc24taVFaOWU9TV9XZW49X1dPeHNIKCRRbk16LWlzOSk7VlYJCQkkPS5zbi1pbk09X25Nbm5zT0goJFFuTXopO1ZWCQkJaGhNUj1NSDk+PS5NPlFuTXpuPjJPT3lzTW4+c0E+PS5NPk9aPXNPSD5zbj5NSGU8V005VgkJCXNBPigkPS5zbi1pMk9IQXN4LWlzPU1ZKCdRbk16X01SPU1IOV9PSF9XT3hzSCcsPidzT0hfZVE9LicpKVYJCQldVgkJCQkkPS5zbi1pek1ZTVk8TXpfUW5NeigkUW5Nei1pczkpO1YJCQlsVlYJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oZXp6ZXEoJ1pPbj1fV094c0hfek1ZTVk8TXpNOV9Rbk16Jyw+J1pPbj1fV094c0hfek1ZTVk8TXpNOV9Rbk16X25RMjJNbm5BUVcnKSk7VgkJCXpNPVF6SD5UZyBLO1YJCWxWVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKGV6emVxKCdaT249X1dPeHNIX3pNWU1ZPE16TTlfUW5NeicsPidaT249X1dPeHNIX3pNWU1ZPE16TTlfUW5Nel9RSG5RMjJNbm5BUVcnKSk7VgkJek09UXpIPnJGSXBLO1YJbFZWVgloKipWCT4qPjJ6TWU9TV94ek9RWlYJPipWCT4qPkBlUT0uT3o+ZTlzPXFlPllNSE9IVgkqaFYJWlE8V3MyPkFRSDI9c09IPjJ6TWU9TV94ek9RWigkeHpPUVpfSGVZTT5TPnJGSXBLLD4keHpPUVpfOU1uMnpzWj1zT0g+Uz4nJyw+JGU5OXM9c09IZVdfOWU9ZT5TPmV6emVxKCkpVgldVgkJaGg+PGVzVz5zQT49Lk0+eHpPUVo+SGVZTT59ZW4+SE89Plplbm5NOVYJCXNBKCEkeHpPUVpfSGVZTSlWCQldVgkJCSQ9LnNuLWluTT1fTXp6T3ooJ3h6T1FaX0hlWU1fek12UXN6TTknKTtWCQkJek09UXpIPnJGSXBLO1YJCWxWVgkJaGg+PGVzVz5zQT49Lk0+eHpPUVo+SGVZTT5lV3pNZTlxPk1Sc249blYJCSRNUnNuPXNIeF94ek9RWj5TPiQ9LnNuLWk5PC1peE09X30uTXpNKCQ9LnNuLWk9ZTxXTW5qJ3h6T1FabidkLD5lenplcSgnSGVZTSc+U2k+JHh6T1FaX0hlWU0pKS1pSFFZX3pPfW4oKTtWCQlzQSgkTVJzbj1zSHhfeHpPUVo+IVNTPmEpVgkJXVYJCQkkPS5zbi1pbk09X016ek96KCd4ek9RWl9lV3pNZTlxX01Sc249bicpO1YJCQl6TT1Rekg+ckZJcEs7VgkJbFZWCQkkOWU9ZT5TPmV6emVxKCdIZVlNJ1NpJHh6T1FaX0hlWU0sJzlNbjJ6c1o9c09IJ1NpJHh6T1FaXzlNbjJ6c1o9c09IKTtWVgkJaGhBc1c9TXo+T1E9PmVIcT45ZT1lPlplbm5NOT49LmU9PjlPTW5IPT4uZWNNPmU+WWU9Mi5zSHg+Mk9XUVlIPnNIPj0uTT54ek9RWm4+PWU8V01WCQloaGVIOT5ZTXp4TT49Lk0+bk09Pnh6T1FaPjllPWU+ZUg5Pj0uTT5lOTlzPXNPSGVXPjllPWVWCQlzQT4oIU1ZWj1xKCRlOTlzPXNPSGVXXzllPWUpKT4kOWU9ZT5TPmV6emVxX1lNenhNKCQ9LnNuLWlfQXNXPU16XzllPWUoJD0uc24taT1lPFdNbmoneHpPUVpuJ2QsPiRlOTlzPXNPSGVXXzllPWUpLD4kOWU9ZSk7VlYJCSQ9LnNuLWk9enN4eE16X01jTUg9bignTVI9emVfeHpPUVpfbk09Jyk7VlYJCWhoPnNIbk16PT49Lk0+SE19Pnh6T1FaVgkJJD0uc24taTk8LWlzSG5Nej0oJD0uc24taT1lPFdNbmoneHpPUVpuJ2QsPiQ5ZT1lKTtWCQkkeHpPUVpfczk+Uz4kPS5zbi1pOTwtaXNIbk16PV9zOSgpO1ZWCQloaD56TVpPej0+blEyMk1ublYJCSQ9LnNuLWluTT1fWU1ubmV4TSgneHpPUVpfMnpNZT1zT0hfblEyMk1ubkFRVycpO1YJCWhoPnpNPVF6SD49Lk0+PHplSDk+SE19Pnh6T1FaPnM5VgkJek09UXpIPiR4ek9RWl9zOTtWCWxWVgloKipWCT4qPlFaOWU9TV94ek9RWlYJPipWCT4qPkB6TT1Rekg+PE9PV1YJPio+QGVRPS5Pej5lOXM9cWU+WU1IT0hWCT4qKmhWCVpRPFdzMj5BUUgyPXNPSD5RWjllPU1feHpPUVooJHh6T1FaX3M5PlM+ckZJcEssPiR4ek9RWl9IZVlNPlM+ckZJcEssPiRlOTlzPXNPSGVXXzllPWU+Uz5lenplcSgpKVYJXVYJCXNBPihNWVo9cSgkeHpPUVpfczkpKT56TT1Rekg+ckZJcEs7VlYJCSQ5ZT1lPlM+ZXp6ZXEoKTtWVgkJc0E+KCFNWVo9cSgkeHpPUVpfSGVZTSkpVgkJXVYJCQloaD59TT5lek0+Mi5lSHhzSHg+PS5NPkhlWU0sPm5PPjlPPm5PWU0+Mi5NMnluVlYJCQloaD48ZXNXPnNBPj0uTT54ek9RWj5IZVlNPmVXek1lOXE+TVJzbj1uVgkJCSRNUnNuPXNIeF94ek9RWj5TPiQ9LnNuLWk5PC1peE09X30uTXpNKCQ9LnNuLWk9ZTxXTW5qJ3h6T1FabidkLD5lenplcSgnSGVZTSc+U2k+JHh6T1FaX0hlWU0pKS1pek99KCk7VgkJCXNBKHNubk09KCRNUnNuPXNIeF94ek9RWi1pczkpPiYmPiRNUnNuPXNIeF94ek9RWi1pczk+IVM+JHh6T1FaX3M5KVYJCQldVgkJCQkkPS5zbi1pbk09X016ek96KCd4ek9RWl9lV3pNZTlxX01Sc249bicpO1YJCQkJek09UXpIPnJGSXBLO1YJCQlsVlYJCQkkOWU9ZWonSGVZTSdkPlM+JHh6T1FaX0hlWU07VgkJbFZWVgkJaGg+M3VtN2dURkVUISE+VC5zejk+WmV6ZVlNPU16Pn1lbj5uPXpzSHg+PXFaTT4kOU1uMnpzWj1zT0g7Pj0uc24+QU9XV099c0h4PjJPOU0+c24+PU8+WWVzSD1lc0g+PGUyeX1lejk+Mk9ZWmU9czxzV3M9cVYJCWhoPkVNfT5aek8KTTI9bj5uLk9RVzk+fU96eT59cz0uPkp6OT5aZXplWT5lbj5lenplcVYJCXNBPihzbl9uPXpzSHgoJGU5OXM9c09IZVdfOWU9ZSkpPiRlOTlzPXNPSGVXXzllPWU+Uz5lenplcSgnOU1uMnpzWj1zT0gnPlNpPiRlOTlzPXNPSGVXXzllPWUpO1ZWVgkJaGhBc1c9TXo+T1E9PmVIcT45ZT1lPlplbm5NOT49LmU9PjlPTW5IPT4uZWNNPmU+WWU9Mi5zSHg+Mk9XUVlIPnNIPj0uTT54ek9RWm4+PWU8V01WCQloaGVIOT5ZTXp4TT49Lk0+bk09Pnh6T1FaPjllPWU+ZUg5Pj0uTT5lOTlzPXNPSGVXPjllPWVWCQlzQT4oIU1ZWj1xKCRlOTlzPXNPSGVXXzllPWUpKT4kOWU9ZT5TPmV6emVxX1lNenhNKCQ9LnNuLWlfQXNXPU16XzllPWUoJD0uc24taT1lPFdNbmoneHpPUVpuJ2QsPiRlOTlzPXNPSGVXXzllPWUpLD4kOWU9ZSk7VlZWCQkkPS5zbi1pOTwtaVFaOWU9TSgkPS5zbi1pPWU8V01uaid4ek9RWm4nZCw+JDllPWUsPmV6emVxKCdzOSc+U2k+JHh6T1FaX3M5KSk7VlYJCSQ9LnNuLWluTT1fWU1ubmV4TSgneHpPUVpfUVo5ZT1NX25RMjJNbm5BUVcnKTtWVgkJek09UXpIPlRnIEs7VglsVlYJaCoqVgkqPjlNV009TV94ek9RWlYJKlYJKj5Aek09UXpIPjxPT1dWCSo+QGVRPS5Pej5lOXM9cWU+WU1IT0hWCSoqaFYJWlE8V3MyPkFRSDI9c09IPjlNV009TV94ek9RWigkeHpPUVpfczk+Uz5yRklwSylWCV1WCQloaD48ZXNXPnNBPlllSDllPU96cT5aZXplWT5ITz0+bk09VgkJc0EoISR4ek9RWl9zOT58fD5NWVo9cSgkeHpPUVpfczkpKVYJCV1WCQkJek09UXpIPnJGSXBLO1YJCWxWVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKCdaek1fOU1XTT1NX3h6T1FaJyk7VlYJCSQ9LnNuLWk5PC1pPXplSG5fPE14c0goKTtWVgkJaGg+ek1ZT2NNPmVXVz5Rbk16bj5Bek9ZPj0uc24+eHpPUVpWCQkkPS5zbi1pOTwtaTlNV009TSgkPS5zbi1pPWU8V01uaidRbk16bl94ek9RWm4nZCw+ZXp6ZXEoJD0uc24taQpPc0hqJ3h6T1FabidkPlNpPiR4ek9RWl9zOSkpO1YJCWhoPnpNWU9jTT49Lk0+eHpPUVo+cz1uTVdBVgkJJD0uc24taTk8LWk5TVdNPU0oJD0uc24taT1lPFdNbmoneHpPUVpuJ2QsPmV6emVxKCdzOSc+U2k+JHh6T1FaX3M5KSk7VlYJCXNBPigkPS5zbi1pOTwtaT16ZUhuX249ZT1RbigpPlNTUz5yRklwSylWCQldVgkJCSQ9LnNuLWk5PC1pPXplSG5fek9XVzxlMnkoKTtWCQkJJD0uc24taT16c3h4TXpfTWNNSD1uKGV6emVxKCdaT249XzlNV009TV94ek9RWicsPidaT249XzlNV009TV94ek9RWl9RSG5RMjJNbm5BUVcnKSk7VgkJCSQ9LnNuLWluTT1fTXp6T3ooJ3h6T1FaXzlNV009TV9RSG5RMjJNbm5BUVcnKTtWCQkJek09UXpIPnJGSXBLO1YJCWxWVgkJJD0uc24taTk8LWk9emVIbl8yT1lZcz0oKTtWVgkJJD0uc24taT16c3h4TXpfTWNNSD1uKGV6emVxKCdaT249XzlNV009TV94ek9RWicsPidaT249XzlNV009TV94ek9RWl9uUTIyTW5uQVFXJykpO1YJCSQ9LnNuLWluTT1fWU1ubmV4TSgneHpPUVpfOU1XTT1NX25RMjJNbm5BUVcnKTtWCQl6TT1Rekg+VGcgSztWCWxWVglaUTxXczI+QVFIMj1zT0g+bk09Xy5PT3koJE1jTUg9LD4kSGVZTSw+JDJXZW5uLD4kWU09Lk85LD4kZXp4UVlNSD1uKVYJXVYJCSQ9LnNuLWlfc09IXy5PT3luLWldJE1jTUg9bGokSGVZTWQ+Uz5ITX0+bj05L1dlbm47VgkJJD0uc24taV9zT0hfLk9PeW4taV0kTWNNSD1saiRIZVlNZC1pMldlbm4+Pj4+PlM+JDJXZW5uO1YJCSQ9LnNuLWlfc09IXy5PT3luLWldJE1jTUg9bGokSGVZTWQtaVlNPS5POT4+Pj5TPiRZTT0uTzk7VgkJJD0uc24taV9zT0hfLk9PeW4taV0kTWNNSD1saiRIZVlNZC1pZXp4UVlNSD1uPlM+JGV6eFFZTUg9bjtWCWxWVglaUTxXczI+QVFIMj1zT0g+ek1ZT2NNXy5PT3koJE1jTUg9LD4kSGVZTSlWCV1WCQlzQT4oc25uTT0oJD0uc24taV9zT0hfLk9PeW4taV0kTWNNSD1saiRIZVlNZCkpVgkJXVYJCQlRSG5NPSgkPS5zbi1pX3NPSF8uT095bi1pXSRNY01IPWxqJEhlWU1kKTtWCQlsVglsVlYJWlE8V3MyPkFRSDI9c09IPnpNWU9jTV8uT095bigkTWNNSD0pVgldVgkJc0E+KHNubk09KCQ9LnNuLWlfc09IXy5PT3luLWkkTWNNSD0pKVYJCV1WCQkJUUhuTT0oJD0uc24taV9zT0hfLk9PeW4taSRNY01IPSk7VgkJbFYJbFZWCVp6Tz1NMj1NOT5BUUgyPXNPSD5fMmVXV18uT095KCRNY01IPSw+JEhlWU0pVgldVgkJc0E+KHNubk09KCQ9LnNuLWlfc09IXy5PT3luLWldJE1jTUg9bGokSGVZTWQpPiYmPllNPS5POV9NUnNuPW4oJD0uc24taV9zT0hfLk9PeW4taV0kTWNNSD1saiRIZVlNZC1pMldlbm4sPiQ9LnNuLWlfc09IXy5PT3luLWldJE1jTUg9bGokSGVZTWQtaVlNPS5POSkpVgkJXVYJCQkkLk9PeT5TPiQ9LnNuLWlfc09IXy5PT3luLWldJE1jTUg9bGokSGVZTWQ7VlYJCQl6TT1Rekg+MmVXV19Rbk16X0FRSDJfZXp6ZXEoZXp6ZXEoJC5PT3ktaTJXZW5uLD4kLk9PeS1pWU09Lk85KSw+JC5PT3ktaWV6eFFZTUg9bik7VgkJbFZWCQl6TT1Rekg+ckZJcEs7VglsVlYJWlE8V3MyPkFRSDI9c09IPj16c3h4TXpfTWNNSD1uKCRNY01IPW4pVgldVgkJc0E+KHNuX2V6emVxKCRNY01IPW4pPiYmPiFNWVo9cSgkTWNNSD1uKSlWCQldVgkJCUFPek1lMi4+KCRNY01IPW4+ZW4+JE1jTUg9KVYJCQldVgkJCQkkPS5zbi1pPXpzeHhNel9NY01IPW4oJE1jTUg9KTtWCQkJbFYJCWxWCQlNV25NVgkJXVYJCQlzQT4oc25uTT0oJD0uc24taV9zT0hfLk9PeW4taSRNY01IPW4pPiYmPiFNWVo9cSgkPS5zbi1pX3NPSF8uT095bi1pJE1jTUg9bikpVgkJCV1WCQkJCUFPek1lMi4+KCQ9LnNuLWlfc09IXy5PT3luLWkkTWNNSD1uPmVuPiRIZVlNPlNpPiQuT095KVYJCQkJXVYJCQkJCSQ9LnNuLWlfMmVXV18uT095KCRNY01IPW4sPiRIZVlNKTtWCQkJCWxWCQkJbFYJCWxWCWxWVgloKipWCT4qPm5NPV9ZTW5uZXhNXzlNV3NZcz1Nem5WCT4qVgk+Kj5wTT0+PS5NPllNbm5leE0+OU1Xc1lzPU16blYJPipWCT4qPkB6TT1Rekg+Y09zOVYJPio+QGVRPS5Pej5vTUg+SzlZUUg5blYJPioqaFYJWlE8V3MyPkFRSDI9c09IPm5NPV9ZTW5uZXhNXzlNV3NZcz1Nem4oJG49ZXo9XzlNV3NZcz1Neiw+JE1IOV85TVdzWXM9TXopVgldVgkJJD0uc24taVlNbm5leE1fbj1lej1fOU1Xc1lzPU16PlM+JG49ZXo9XzlNV3NZcz1NejtWCQkkPS5zbi1pWU1ubmV4TV9NSDlfOU1Xc1lzPU16Pj4+Uz4kTUg5XzlNV3NZcz1NejtWVgkJek09UXpIPlRnIEs7VglsVlYJaCoqVgk+Kj5uTT1fTXp6T3pfOU1Xc1lzPU16blYJPipWCT4qPnBNPT49Lk0+TXp6T3o+OU1Xc1lzPU16blYJPipWCT4qPkB6TT1Rekg+Y09zOVYJPio+QGVRPS5Pej5vTUg+SzlZUUg5blYJPioqaFYJWlE8V3MyPkFRSDI9c09IPm5NPV9NenpPel85TVdzWXM9TXpuKCRuPWV6PV85TVdzWXM9TXosPiRNSDlfOU1Xc1lzPU16KVYJXVYJCSQ9LnNuLWlNenpPel9uPWV6PV85TVdzWXM9TXo+Uz4kbj1lej1fOU1Xc1lzPU16O1YJCSQ9LnNuLWlNenpPel9NSDlfOU1Xc1lzPU16Pj4+Uz4kTUg5XzlNV3NZcz1NejtWVgkJek09UXpIPlRnIEs7VglsVlYJaCoqVgk+Kj5uTT1fWU1ubmV4TVYJPipWCT4qPnBNPT5lPllNbm5leE1WCT4qVgk+Kj5Aek09UXpIPmNPczlWCT4qPkBlUT0uT3o+b01IPks5WVFIOW5WCT4qKmhWCVpRPFdzMj5BUUgyPXNPSD5uTT1fWU1ubmV4TSgkWU1ubmV4TSlWCV1WCQkkPS5zbi1pWU1ubmV4TW5qZD5TPiRZTW5uZXhNO1ZWCQl6TT1Rekg+JFlNbm5leE07VglsVlYJaCoqVgk+Kj5ZTW5uZXhNblYJPipWCT4qPkNNPT49Lk0+WU1ubmV4TW5WCT4qVgk+Kj5Aek09UXpIPmNPczlWCT4qPkBlUT0uT3o+b01IPks5WVFIOW5WCT4qKmhWCVpRPFdzMj5BUUgyPXNPSD5ZTW5uZXhNbigpVgldVgkJJF9PUT1aUT0+Uz4nJztWCQlBT3pNZTIuPigkPS5zbi1pWU1ubmV4TW4+ZW4+JFlNbm5leE0pVgkJXVYJCQkkWU1ubmV4TUllSHg+Uz4kPS5zbi1pV2VIeC1pV3NITSgkWU1ubmV4TSk+Pz4kPS5zbi1pV2VIeC1pV3NITSgkWU1ubmV4TSk+Oj4nIyMnPlg+JFlNbm5leE0+WD4nIyMnO1YJCQkkX09RPVpRPT5YUz4kPS5zbi1pWU1ubmV4TV9uPWV6PV85TVdzWXM9TXo+WD4kWU1ubmV4TUllSHg+WD4kPS5zbi1pWU1ubmV4TV9NSDlfOU1Xc1lzPU16O1YJCWxWVgkJek09UXpIPiRfT1E9WlE9O1YJbFZWCWgqKlYJPio+WU1ubmV4TW4+ZW4+ZXp6ZXFWCT4qVgk+Kj5DTT0+PS5NPllNbm5leE1uPmVuPmVIPmV6emVxVgk+KlYJPio+QHpNPVF6SD5lenplcVYJPio+QGVRPS5Pej5nZVFXPm9lVzlITXo+OFFIc096Vgk+KipoVglaUTxXczI+QVFIMj1zT0g+WU1ubmV4TW5fZXp6ZXEoJFdlSHhzQXE+Uz5UZyBLKVYJXVYJCXNBPigkV2VIeHNBcSlWCQldVgkJCSRfT1E9WlE9PlM+ZXp6ZXEoKTtWCQkJQU96TWUyLj4oJD0uc24taVlNbm5leE1uPmVuPiRZTW5uZXhNKVYJCQldVgkJCQkkWU1ubmV4TUllSHg+Uz4kPS5zbi1pV2VIeC1pV3NITSgkWU1ubmV4TSk+Pz4kPS5zbi1pV2VIeC1pV3NITSgkWU1ubmV4TSk+Oj4nIyMnPlg+JFlNbm5leE0+WD4nIyMnO1YJCQkJJF9PUT1aUT1qZD5TPiQ9LnNuLWlZTW5uZXhNX249ZXo9XzlNV3NZcz1Nej5YPiRZTW5uZXhNSWVIeD5YPiQ9LnNuLWlZTW5uZXhNX01IOV85TVdzWXM9TXo7VgkJCWxWCQkJek09UXpIPiRfT1E9WlE9O1YJCWxWCQlNV25NVgkJXVYJCQl6TT1Rekg+JD0uc24taVlNbm5leE1uO1YJCWxWCWxWVgloKipWCT4qPm5NPV9NenpPelYJPipWCT4qPnBNPT5lSD5NenpPej5ZTW5uZXhNVgk+KlYJPio+QHpNPVF6SD5jT3M5Vgk+Kj5AZVE9Lk96Pm9NSD5LOVlRSDluVgk+KipoVglaUTxXczI+QVFIMj1zT0g+bk09X016ek96KCRNenpPeilWCV1WCQkkPS5zbi1pTXp6T3puamQ+Uz4kTXp6T3o7VlYJCXpNPVF6SD4kTXp6T3o7VglsVlYJaCoqVgk+Kj5NenpPem5WCT4qVgk+Kj5DTT0+PS5NPk16ek96PllNbm5leE1WCT4qVgk+Kj5Aek09UXpIPmNPczlWCT4qPkBlUT0uT3o+b01IPks5WVFIOW5WCT4qKmhWCVpRPFdzMj5BUUgyPXNPSD5NenpPem4oKVYJXVYJCSRfT1E9WlE9PlM+Jyc7VgkJQU96TWUyLj4oJD0uc24taU16ek96bj5lbj4kTXp6T3opVgkJXVYJCQkkTXp6T3pJZUh4PlM+JD0uc24taVdlSHgtaVdzSE0oJE16ek96KT4/PiQ9LnNuLWlXZUh4LWlXc0hNKCRNenpPeik+Oj4nIyMnPlg+JE16ek96Plg+JyMjJztWCQkJJF9PUT1aUT0+WFM+JD0uc24taU16ek96X249ZXo9XzlNV3NZcz1Nej5YPiRNenpPekllSHg+WD4kPS5zbi1pTXp6T3pfTUg5XzlNV3NZcz1NejtWCQlsVlYJCXpNPVF6SD4kX09RPVpRPTtWCWxWVgloKipWCT4qPk16ek96bj5lbj5lenplcVYJPipWCT4qPkNNPT49Lk0+TXp6T3o+WU1ubmV4TW4+ZW4+ZUg+ZXp6ZXFWCT4qVgk+Kj5Aek09UXpIPmV6emVxVgk+Kj5AZVE9Lk96PmdlUVc+b2VXOUhNej44UUhzT3pWCT4qKmhWCVpRPFdzMj5BUUgyPXNPSD5NenpPem5fZXp6ZXEoJFdlSHhzQXE+Uz5UZyBLKVYJXVYJCXNBPigkV2VIeHNBcSlWCQldVgkJCSRfT1E9WlE9PlM+ZXp6ZXEoKTtWCQkJQU96TWUyLj4oJD0uc24taU16ek96bj5lbj4kTXp6T3opVgkJCV1WCQkJCSRNenpPekllSHg+Uz4kPS5zbi1pV2VIeC1pV3NITSgkTXp6T3opPj8+JD0uc24taVdlSHgtaVdzSE0oJE16ek96KT46PicjIyc+WD4kTXp6T3o+WD4nIyMnO1YJCQkJJF9PUT1aUT1qZD5TPiQ9LnNuLWlNenpPel9uPWV6PV85TVdzWXM9TXo+WD4kTXp6T3pJZUh4Plg+JD0uc24taU16ek96X01IOV85TVdzWXM9TXo7VgkJCWxWCQkJek09UXpIPiRfT1E9WlE9O1YJCWxWCQlNV25NVgkJXVYJCQl6TT1Rekg+JD0uc24taU16ek96bjtWCQlsVglsVlYJWnpPPU0yPU05PkFRSDI9c09IPl9Bc1c9TXpfOWU9ZSgkPWU8V00sPiQ5ZT1lKVYJXVYJCSRBc1c9TXpNOV85ZT1lPlM+ZXp6ZXEoKTtWCQkkMk9XUVlIbj5TPiQ9LnNuLWk5PC1pV3NuPV9Bc01XOW4oJD1lPFdNKTtWVgkJc0E+KHNuX2V6emVxKCQ5ZT1lKSlWCQldVgkJCUFPek1lMi4+KCQyT1dRWUhuPmVuPiQyT1dRWUgpVgkJCV1WCQkJCXNBPihlenplcV95TXFfTVJzbj1uKCQyT1dRWUgsPiQ5ZT1lKSlWCQkJCQkkQXNXPU16TTlfOWU9ZWokMk9XUVlIZD5TPiQ5ZT1laiQyT1dRWUhkO1YJCQlsVgkJbFZWCQl6TT1Rekg+JEFzVz1Nek05XzllPWU7VglsVlYJWnpPPU0yPU05PkFRSDI9c09IPl9aek1aZXpNX3NaKCRzWl9lOTl6TW5uKT5dVgkJaGgKUW49PnpNPVF6SD49Lk0+bj16c0h4PjNtPmU5OXpNbm4+SE99PkFPej48TT09TXo+Mk9ZWmU9czxzV3M9cVYJCXpNPVF6SD4kc1pfZTk5ek1ubjtWCWxWbFY=';$_D=strrev('edoced_46esab');eval($_D('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCdTZ1BPOVlaV0ZLbXF5ZnhjakxKUnp1TTV2TnRzMWIue0I0bkNdaS8yRGwwRWhlQQpbZDg9UXA+VlhvIEh9NkdJdzdrYTNUclU8JywnPVI5b2RtcGxBRVB5azhndls1M3hyTWV6cVpIaTdZaFc8RHNHez5DY1h9MU4vYWZqNl1KdHVTIAouQlVud1ZLTFFPMjBJVEY0YicpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw='));?>

Function Calls

strtr 1
strrev 1
str_replace 1
base64_decode 2

Variables

$_D base64_decode
$_F index.php
$_R ?><?php if ( ! defined('BASEPATH')) exit('No direct script ..
$_X ?><?php if ( ! defined('BASEPATH')) exit('No direct script ..

Stats

MD5 42b963b06d9a2ca2cb85136d0575aae1
Eval Count 2
Decode Time 295 ms